@decidables/discountable-elements 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,20 +10,20 @@
10
10
  * SPDX-License-Identifier: BSD-3-Clause
11
11
  */
12
12
  const t$2 = globalThis,
13
- e$3 = t$2.ShadowRoot && (undefined === t$2.ShadyCSS || t$2.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype,
14
- s$3 = Symbol(),
15
- o$5 = new WeakMap();
13
+ e$3 = t$2.ShadowRoot && (void 0 === t$2.ShadyCSS || t$2.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype,
14
+ s$4 = Symbol(),
15
+ o$6 = new WeakMap();
16
16
  let n$4 = class n {
17
17
  constructor(t, e, o) {
18
- if (this._$cssResult$ = true, o !== s$3) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");
18
+ if (this._$cssResult$ = true, o !== s$4) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");
19
19
  this.cssText = t, this.t = e;
20
20
  }
21
21
  get styleSheet() {
22
22
  let t = this.o;
23
23
  const s = this.t;
24
- if (e$3 && undefined === t) {
25
- const e = undefined !== s && 1 === s.length;
26
- e && (t = o$5.get(s)), undefined === t && ((this.o = t = new CSSStyleSheet()).replaceSync(this.cssText), e && o$5.set(s, t));
24
+ if (e$3 && void 0 === t) {
25
+ const e = void 0 !== s && 1 === s.length;
26
+ e && (t = o$6.get(s)), void 0 === t && ((this.o = t = new CSSStyleSheet()).replaceSync(this.cssText), e && o$6.set(s, t));
27
27
  }
28
28
  return t;
29
29
  }
@@ -31,26 +31,26 @@
31
31
  return this.cssText;
32
32
  }
33
33
  };
34
- const r$5 = t => new n$4("string" == typeof t ? t : t + "", undefined, s$3),
34
+ const r$4 = t => new n$4("string" == typeof t ? t : t + "", void 0, s$4),
35
35
  i$5 = (t, ...e) => {
36
36
  const o = 1 === t.length ? t[0] : e.reduce((e, s, o) => e + (t => {
37
37
  if (true === t._$cssResult$) return t.cssText;
38
38
  if ("number" == typeof t) return t;
39
39
  throw Error("Value passed to 'css' function must be a 'css' function result: " + t + ". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.");
40
40
  })(s) + t[o + 1], t[0]);
41
- return new n$4(o, t, s$3);
41
+ return new n$4(o, t, s$4);
42
42
  },
43
43
  S$1 = (s, o) => {
44
44
  if (e$3) s.adoptedStyleSheets = o.map(t => t instanceof CSSStyleSheet ? t : t.styleSheet);else for (const e of o) {
45
45
  const o = document.createElement("style"),
46
46
  n = t$2.litNonce;
47
- undefined !== n && o.setAttribute("nonce", n), o.textContent = e.cssText, s.appendChild(o);
47
+ void 0 !== n && o.setAttribute("nonce", n), o.textContent = e.cssText, s.appendChild(o);
48
48
  }
49
49
  },
50
50
  c$6 = e$3 ? t => t : t => t instanceof CSSStyleSheet ? (t => {
51
51
  let e = "";
52
52
  for (const s of t.cssRules) e += s.cssText;
53
- return r$5(e);
53
+ return r$4(e);
54
54
  })(t) : t;
55
55
 
56
56
  /**
@@ -61,9 +61,9 @@
61
61
  const {
62
62
  is: i$4,
63
63
  defineProperty: e$2,
64
- getOwnPropertyDescriptor: r$4,
65
- getOwnPropertyNames: h$2,
66
- getOwnPropertySymbols: o$4,
64
+ getOwnPropertyDescriptor: h$2,
65
+ getOwnPropertyNames: r$3,
66
+ getOwnPropertySymbols: o$5,
67
67
  getPrototypeOf: n$3
68
68
  } = Object,
69
69
  a$3 = globalThis,
@@ -104,33 +104,34 @@
104
104
  }
105
105
  },
106
106
  f$3 = (t, s) => !i$4(t, s),
107
- y$2 = {
107
+ b$2 = {
108
108
  attribute: true,
109
109
  type: String,
110
110
  converter: u$1,
111
111
  reflect: false,
112
+ useDefault: false,
112
113
  hasChanged: f$3
113
114
  };
114
115
  Symbol.metadata ??= Symbol("metadata"), a$3.litPropertyMetadata ??= new WeakMap();
115
- let b$2 = class b extends HTMLElement {
116
+ let y$2 = class y extends HTMLElement {
116
117
  static addInitializer(t) {
117
118
  this._$Ei(), (this.l ??= []).push(t);
118
119
  }
119
120
  static get observedAttributes() {
120
121
  return this.finalize(), this._$Eh && [...this._$Eh.keys()];
121
122
  }
122
- static createProperty(t, s = y$2) {
123
- if (s.state && (s.attribute = false), this._$Ei(), this.elementProperties.set(t, s), !s.noAccessor) {
123
+ static createProperty(t, s = b$2) {
124
+ if (s.state && (s.attribute = false), this._$Ei(), this.prototype.hasOwnProperty(t) && ((s = Object.create(s)).wrapped = true), this.elementProperties.set(t, s), !s.noAccessor) {
124
125
  const i = Symbol(),
125
- r = this.getPropertyDescriptor(t, i, s);
126
- undefined !== r && e$2(this.prototype, t, r);
126
+ h = this.getPropertyDescriptor(t, i, s);
127
+ void 0 !== h && e$2(this.prototype, t, h);
127
128
  }
128
129
  }
129
130
  static getPropertyDescriptor(t, s, i) {
130
131
  const {
131
132
  get: e,
132
- set: h
133
- } = r$4(this.prototype, t) ?? {
133
+ set: r
134
+ } = h$2(this.prototype, t) ?? {
134
135
  get() {
135
136
  return this[s];
136
137
  },
@@ -139,41 +140,39 @@
139
140
  }
140
141
  };
141
142
  return {
142
- get() {
143
- return e?.call(this);
144
- },
143
+ get: e,
145
144
  set(s) {
146
- const r = e?.call(this);
147
- h.call(this, s), this.requestUpdate(t, r, i);
145
+ const h = e?.call(this);
146
+ r?.call(this, s), this.requestUpdate(t, h, i);
148
147
  },
149
148
  configurable: true,
150
149
  enumerable: true
151
150
  };
152
151
  }
153
152
  static getPropertyOptions(t) {
154
- return this.elementProperties.get(t) ?? y$2;
153
+ return this.elementProperties.get(t) ?? b$2;
155
154
  }
156
155
  static _$Ei() {
157
156
  if (this.hasOwnProperty(d$1("elementProperties"))) return;
158
157
  const t = n$3(this);
159
- t.finalize(), undefined !== t.l && (this.l = [...t.l]), this.elementProperties = new Map(t.elementProperties);
158
+ t.finalize(), void 0 !== t.l && (this.l = [...t.l]), this.elementProperties = new Map(t.elementProperties);
160
159
  }
161
160
  static finalize() {
162
161
  if (this.hasOwnProperty(d$1("finalized"))) return;
163
162
  if (this.finalized = true, this._$Ei(), this.hasOwnProperty(d$1("properties"))) {
164
163
  const t = this.properties,
165
- s = [...h$2(t), ...o$4(t)];
164
+ s = [...r$3(t), ...o$5(t)];
166
165
  for (const i of s) this.createProperty(i, t[i]);
167
166
  }
168
167
  const t = this[Symbol.metadata];
169
168
  if (null !== t) {
170
169
  const s = litPropertyMetadata.get(t);
171
- if (undefined !== s) for (const [t, i] of s) this.elementProperties.set(t, i);
170
+ if (void 0 !== s) for (const [t, i] of s) this.elementProperties.set(t, i);
172
171
  }
173
172
  this._$Eh = new Map();
174
173
  for (const [t, s] of this.elementProperties) {
175
174
  const i = this._$Eu(t, s);
176
- undefined !== i && this._$Eh.set(i, t);
175
+ void 0 !== i && this._$Eh.set(i, t);
177
176
  }
178
177
  this.elementStyles = this.finalizeStyles(this.styles);
179
178
  }
@@ -182,21 +181,21 @@
182
181
  if (Array.isArray(s)) {
183
182
  const e = new Set(s.flat(1 / 0).reverse());
184
183
  for (const s of e) i.unshift(c$6(s));
185
- } else undefined !== s && i.push(c$6(s));
184
+ } else void 0 !== s && i.push(c$6(s));
186
185
  return i;
187
186
  }
188
187
  static _$Eu(t, s) {
189
188
  const i = s.attribute;
190
- return false === i ? undefined : "string" == typeof i ? i : "string" == typeof t ? t.toLowerCase() : undefined;
189
+ return false === i ? void 0 : "string" == typeof i ? i : "string" == typeof t ? t.toLowerCase() : void 0;
191
190
  }
192
191
  constructor() {
193
- super(), this._$Ep = undefined, this.isUpdatePending = false, this.hasUpdated = false, this._$Em = null, this._$Ev();
192
+ super(), this._$Ep = void 0, this.isUpdatePending = false, this.hasUpdated = false, this._$Em = null, this._$Ev();
194
193
  }
195
194
  _$Ev() {
196
195
  this._$ES = new Promise(t => this.enableUpdating = t), this._$AL = new Map(), this._$E_(), this.requestUpdate(), this.constructor.l?.forEach(t => t(this));
197
196
  }
198
197
  addController(t) {
199
- (this._$EO ??= new Set()).add(t), undefined !== this.renderRoot && this.isConnected && t.hostConnected?.();
198
+ (this._$EO ??= new Set()).add(t), void 0 !== this.renderRoot && this.isConnected && t.hostConnected?.();
200
199
  }
201
200
  removeController(t) {
202
201
  this._$EO?.delete(t);
@@ -221,36 +220,44 @@
221
220
  attributeChangedCallback(t, s, i) {
222
221
  this._$AK(t, i);
223
222
  }
224
- _$EC(t, s) {
223
+ _$ET(t, s) {
225
224
  const i = this.constructor.elementProperties.get(t),
226
225
  e = this.constructor._$Eu(t, i);
227
- if (undefined !== e && true === i.reflect) {
228
- const r = (undefined !== i.converter?.toAttribute ? i.converter : u$1).toAttribute(s, i.type);
229
- this._$Em = t, null == r ? this.removeAttribute(e) : this.setAttribute(e, r), this._$Em = null;
226
+ if (void 0 !== e && true === i.reflect) {
227
+ const h = (void 0 !== i.converter?.toAttribute ? i.converter : u$1).toAttribute(s, i.type);
228
+ this._$Em = t, null == h ? this.removeAttribute(e) : this.setAttribute(e, h), this._$Em = null;
230
229
  }
231
230
  }
232
231
  _$AK(t, s) {
233
232
  const i = this.constructor,
234
233
  e = i._$Eh.get(t);
235
- if (undefined !== e && this._$Em !== e) {
234
+ if (void 0 !== e && this._$Em !== e) {
236
235
  const t = i.getPropertyOptions(e),
237
- r = "function" == typeof t.converter ? {
236
+ h = "function" == typeof t.converter ? {
238
237
  fromAttribute: t.converter
239
- } : undefined !== t.converter?.fromAttribute ? t.converter : u$1;
240
- this._$Em = e, this[e] = r.fromAttribute(s, t.type), this._$Em = null;
238
+ } : void 0 !== t.converter?.fromAttribute ? t.converter : u$1;
239
+ this._$Em = e;
240
+ const r = h.fromAttribute(s, t.type);
241
+ this[e] = r ?? this._$Ej?.get(e) ?? r, this._$Em = null;
241
242
  }
242
243
  }
243
244
  requestUpdate(t, s, i) {
244
- if (undefined !== t) {
245
- if (i ??= this.constructor.getPropertyOptions(t), !(i.hasChanged ?? f$3)(this[t], s)) return;
246
- this.P(t, s, i);
247
- }
248
- false === this.isUpdatePending && (this._$ES = this._$ET());
249
- }
250
- P(t, s, i) {
251
- this._$AL.has(t) || this._$AL.set(t, s), true === i.reflect && this._$Em !== t && (this._$Ej ??= new Set()).add(t);
252
- }
253
- async _$ET() {
245
+ if (void 0 !== t) {
246
+ const e = this.constructor,
247
+ h = this[t];
248
+ if (i ??= e.getPropertyOptions(t), !((i.hasChanged ?? f$3)(h, s) || i.useDefault && i.reflect && h === this._$Ej?.get(t) && !this.hasAttribute(e._$Eu(t, i)))) return;
249
+ this.C(t, s, i);
250
+ }
251
+ false === this.isUpdatePending && (this._$ES = this._$EP());
252
+ }
253
+ C(t, s, {
254
+ useDefault: i,
255
+ reflect: e,
256
+ wrapped: h
257
+ }, r) {
258
+ i && !(this._$Ej ??= new Map()).has(t) && (this._$Ej.set(t, r ?? s ?? this[t]), true !== h || void 0 !== r) || (this._$AL.has(t) || (this.hasUpdated || i || (s = void 0), this._$AL.set(t, s)), true === e && this._$Em !== t && (this._$Eq ??= new Set()).add(t));
259
+ }
260
+ async _$EP() {
254
261
  this.isUpdatePending = true;
255
262
  try {
256
263
  await this._$ES;
@@ -268,17 +275,23 @@
268
275
  if (!this.hasUpdated) {
269
276
  if (this.renderRoot ??= this.createRenderRoot(), this._$Ep) {
270
277
  for (const [t, s] of this._$Ep) this[t] = s;
271
- this._$Ep = undefined;
278
+ this._$Ep = void 0;
272
279
  }
273
280
  const t = this.constructor.elementProperties;
274
- if (t.size > 0) for (const [s, i] of t) true !== i.wrapped || this._$AL.has(s) || undefined === this[s] || this.P(s, this[s], i);
281
+ if (t.size > 0) for (const [s, i] of t) {
282
+ const {
283
+ wrapped: t
284
+ } = i,
285
+ e = this[s];
286
+ true !== t || this._$AL.has(s) || void 0 === e || this.C(s, void 0, i, e);
287
+ }
275
288
  }
276
289
  let t = false;
277
290
  const s = this._$AL;
278
291
  try {
279
- t = this.shouldUpdate(s), t ? (this.willUpdate(s), this._$EO?.forEach(t => t.hostUpdate?.()), this.update(s)) : this._$EU();
292
+ t = this.shouldUpdate(s), t ? (this.willUpdate(s), this._$EO?.forEach(t => t.hostUpdate?.()), this.update(s)) : this._$EM();
280
293
  } catch (s) {
281
- throw t = false, this._$EU(), s;
294
+ throw t = false, this._$EM(), s;
282
295
  }
283
296
  t && this._$AE(s);
284
297
  }
@@ -286,7 +299,7 @@
286
299
  _$AE(t) {
287
300
  this._$EO?.forEach(t => t.hostUpdated?.()), this.hasUpdated || (this.hasUpdated = true, this.firstUpdated(t)), this.updated(t);
288
301
  }
289
- _$EU() {
302
+ _$EM() {
290
303
  this._$AL = new Map(), this.isUpdatePending = false;
291
304
  }
292
305
  get updateComplete() {
@@ -299,16 +312,16 @@
299
312
  return true;
300
313
  }
301
314
  update(t) {
302
- this._$Ej &&= this._$Ej.forEach(t => this._$EC(t, this[t])), this._$EU();
315
+ this._$Eq &&= this._$Eq.forEach(t => this._$ET(t, this[t])), this._$EM();
303
316
  }
304
317
  updated(t) {}
305
318
  firstUpdated(t) {}
306
319
  };
307
- b$2.elementStyles = [], b$2.shadowRootOptions = {
320
+ y$2.elementStyles = [], y$2.shadowRootOptions = {
308
321
  mode: "open"
309
- }, b$2[d$1("elementProperties")] = new Map(), b$2[d$1("finalized")] = new Map(), p$1?.({
310
- ReactiveElement: b$2
311
- }), (a$3.reactiveElementVersions ??= []).push("2.0.4");
322
+ }, y$2[d$1("elementProperties")] = new Map(), y$2[d$1("finalized")] = new Map(), p$1?.({
323
+ ReactiveElement: y$2
324
+ }), (a$3.reactiveElementVersions ??= []).push("2.1.1");
312
325
 
313
326
  /**
314
327
  * @license
@@ -317,15 +330,15 @@
317
330
  */
318
331
  const t$1 = globalThis,
319
332
  i$3 = t$1.trustedTypes,
320
- s$2 = i$3 ? i$3.createPolicy("lit-html", {
333
+ s$3 = i$3 ? i$3.createPolicy("lit-html", {
321
334
  createHTML: t => t
322
- }) : undefined,
335
+ }) : void 0,
323
336
  e$1 = "$lit$",
324
337
  h$1 = `lit$${Math.random().toFixed(9).slice(2)}$`,
325
- o$3 = "?" + h$1,
326
- n$2 = `<${o$3}>`,
327
- r$3 = document,
328
- l = () => r$3.createComment(""),
338
+ o$4 = "?" + h$1,
339
+ n$2 = `<${o$4}>`,
340
+ r$2 = document,
341
+ l = () => r$2.createComment(""),
329
342
  c$4 = t => null === t || "object" != typeof t && "function" != typeof t,
330
343
  a$2 = Array.isArray,
331
344
  u = t => a$2(t) || "function" == typeof t?.[Symbol.iterator],
@@ -347,10 +360,10 @@
347
360
  T = Symbol.for("lit-noChange"),
348
361
  E$1 = Symbol.for("lit-nothing"),
349
362
  A$2 = new WeakMap(),
350
- C$1 = r$3.createTreeWalker(r$3, 129);
363
+ C$1 = r$2.createTreeWalker(r$2, 129);
351
364
  function P(t, i) {
352
365
  if (!a$2(t) || !t.hasOwnProperty("raw")) throw Error("invalid template strings array");
353
- return undefined !== s$2 ? s$2.createHTML(i) : i;
366
+ return void 0 !== s$3 ? s$3.createHTML(i) : i;
354
367
  }
355
368
  const V = (t, i) => {
356
369
  const s = t.length - 1,
@@ -364,7 +377,7 @@
364
377
  u,
365
378
  d = -1,
366
379
  y = 0;
367
- for (; y < s.length && (c.lastIndex = y, u = c.exec(s), null !== u);) y = c.lastIndex, c === f$2 ? "!--" === u[1] ? c = v$1 : undefined !== u[1] ? c = _ : undefined !== u[2] ? ($.test(u[2]) && (r = RegExp("</" + u[2], "g")), c = m) : undefined !== u[3] && (c = m) : c === m ? ">" === u[0] ? (c = r ?? f$2, d = -1) : undefined === u[1] ? d = -2 : (d = c.lastIndex - u[2].length, a = u[1], c = undefined === u[3] ? m : '"' === u[3] ? g$1 : p) : c === g$1 || c === p ? c = m : c === v$1 || c === _ ? c = f$2 : (c = m, r = undefined);
380
+ for (; y < s.length && (c.lastIndex = y, u = c.exec(s), null !== u);) y = c.lastIndex, c === f$2 ? "!--" === u[1] ? c = v$1 : void 0 !== u[1] ? c = _ : void 0 !== u[2] ? ($.test(u[2]) && (r = RegExp("</" + u[2], "g")), c = m) : void 0 !== u[3] && (c = m) : c === m ? ">" === u[0] ? (c = r ?? f$2, d = -1) : void 0 === u[1] ? d = -2 : (d = c.lastIndex - u[2].length, a = u[1], c = void 0 === u[3] ? m : '"' === u[3] ? g$1 : p) : c === g$1 || c === p ? c = m : c === v$1 || c === _ ? c = f$2 : (c = m, r = void 0);
368
381
  const x = c === m && t[i + 1].startsWith("/>") ? " " : "";
369
382
  l += c === f$2 ? s + n$2 : d >= 0 ? (o.push(a), s.slice(0, d) + e$1 + s.slice(d) + h$1 + x) : s + h$1 + (-2 === d ? i : x);
370
383
  }
@@ -415,7 +428,7 @@
415
428
  r.append(t[s], l());
416
429
  }
417
430
  }
418
- } else if (8 === r.nodeType) if (r.data === o$3) d.push({
431
+ } else if (8 === r.nodeType) if (r.data === o$4) d.push({
419
432
  type: 2,
420
433
  index: c
421
434
  });else {
@@ -429,19 +442,19 @@
429
442
  }
430
443
  }
431
444
  static createElement(t, i) {
432
- const s = r$3.createElement("template");
445
+ const s = r$2.createElement("template");
433
446
  return s.innerHTML = t, s;
434
447
  }
435
448
  };
436
449
  function S(t, i, s = t, e) {
437
450
  if (i === T) return i;
438
- let h = undefined !== e ? s._$Co?.[e] : s._$Cl;
439
- const o = c$4(i) ? undefined : i._$litDirective$;
440
- return h?.constructor !== o && (h?._$AO?.(false), undefined === o ? h = undefined : (h = new o(t), h._$AT(t, s, e)), undefined !== e ? (s._$Co ??= [])[e] = h : s._$Cl = h), undefined !== h && (i = S(t, h._$AS(t, i.values), h, e)), i;
451
+ let h = void 0 !== e ? s._$Co?.[e] : s._$Cl;
452
+ const o = c$4(i) ? void 0 : i._$litDirective$;
453
+ return h?.constructor !== o && (h?._$AO?.(false), void 0 === o ? h = void 0 : (h = new o(t), h._$AT(t, s, e)), void 0 !== e ? (s._$Co ??= [])[e] = h : s._$Cl = h), void 0 !== h && (i = S(t, h._$AS(t, i.values), h, e)), i;
441
454
  }
442
455
  let M$1 = class M {
443
456
  constructor(t, i) {
444
- this._$AV = [], this._$AN = undefined, this._$AD = t, this._$AM = i;
457
+ this._$AV = [], this._$AN = void 0, this._$AD = t, this._$AM = i;
445
458
  }
446
459
  get parentNode() {
447
460
  return this._$AM.parentNode;
@@ -456,24 +469,24 @@
456
469
  },
457
470
  parts: s
458
471
  } = this._$AD,
459
- e = (t?.creationScope ?? r$3).importNode(i, true);
472
+ e = (t?.creationScope ?? r$2).importNode(i, true);
460
473
  C$1.currentNode = e;
461
474
  let h = C$1.nextNode(),
462
475
  o = 0,
463
476
  n = 0,
464
477
  l = s[0];
465
- for (; undefined !== l;) {
478
+ for (; void 0 !== l;) {
466
479
  if (o === l.index) {
467
480
  let i;
468
481
  2 === l.type ? i = new R(h, h.nextSibling, this, t) : 1 === l.type ? i = new l.ctor(h, l.name, l.strings, this, t) : 6 === l.type && (i = new z(h, this, t)), this._$AV.push(i), l = s[++n];
469
482
  }
470
483
  o !== l?.index && (h = C$1.nextNode(), o++);
471
484
  }
472
- return C$1.currentNode = r$3, e;
485
+ return C$1.currentNode = r$2, e;
473
486
  }
474
487
  p(t) {
475
488
  let i = 0;
476
- for (const s of this._$AV) undefined !== s && (undefined !== s.strings ? (s._$AI(t, s, i), i += s.strings.length - 2) : s._$AI(t[i])), i++;
489
+ for (const s of this._$AV) void 0 !== s && (void 0 !== s.strings ? (s._$AI(t, s, i), i += s.strings.length - 2) : s._$AI(t[i])), i++;
477
490
  }
478
491
  };
479
492
  class R {
@@ -481,12 +494,12 @@
481
494
  return this._$AM?._$AU ?? this._$Cv;
482
495
  }
483
496
  constructor(t, i, s, e) {
484
- this.type = 2, this._$AH = E$1, this._$AN = undefined, this._$AA = t, this._$AB = i, this._$AM = s, this.options = e, this._$Cv = e?.isConnected ?? true;
497
+ this.type = 2, this._$AH = E$1, this._$AN = void 0, this._$AA = t, this._$AB = i, this._$AM = s, this.options = e, this._$Cv = e?.isConnected ?? true;
485
498
  }
486
499
  get parentNode() {
487
500
  let t = this._$AA.parentNode;
488
501
  const i = this._$AM;
489
- return undefined !== i && 11 === t?.nodeType && (t = i.parentNode), t;
502
+ return void 0 !== i && 11 === t?.nodeType && (t = i.parentNode), t;
490
503
  }
491
504
  get startNode() {
492
505
  return this._$AA;
@@ -495,7 +508,7 @@
495
508
  return this._$AB;
496
509
  }
497
510
  _$AI(t, i = this) {
498
- t = S(this, t, i), c$4(t) ? t === E$1 || null == t || "" === t ? (this._$AH !== E$1 && this._$AR(), this._$AH = E$1) : t !== this._$AH && t !== T && this._(t) : undefined !== t._$litType$ ? this.$(t) : undefined !== t.nodeType ? this.T(t) : u(t) ? this.k(t) : this._(t);
511
+ t = S(this, t, i), c$4(t) ? t === E$1 || null == t || "" === t ? (this._$AH !== E$1 && this._$AR(), this._$AH = E$1) : t !== this._$AH && t !== T && this._(t) : void 0 !== t._$litType$ ? this.$(t) : void 0 !== t.nodeType ? this.T(t) : u(t) ? this.k(t) : this._(t);
499
512
  }
500
513
  O(t) {
501
514
  return this._$AA.parentNode.insertBefore(t, this._$AB);
@@ -504,14 +517,14 @@
504
517
  this._$AH !== t && (this._$AR(), this._$AH = this.O(t));
505
518
  }
506
519
  _(t) {
507
- this._$AH !== E$1 && c$4(this._$AH) ? this._$AA.nextSibling.data = t : this.T(r$3.createTextNode(t)), this._$AH = t;
520
+ this._$AH !== E$1 && c$4(this._$AH) ? this._$AA.nextSibling.data = t : this.T(r$2.createTextNode(t)), this._$AH = t;
508
521
  }
509
522
  $(t) {
510
523
  const {
511
524
  values: i,
512
525
  _$litType$: s
513
526
  } = t,
514
- e = "number" == typeof s ? this._$AC(t) : (undefined === s.el && (s.el = N$1.createElement(P(s.h, s.h[0]), this.options)), s);
527
+ e = "number" == typeof s ? this._$AC(t) : (void 0 === s.el && (s.el = N$1.createElement(P(s.h, s.h[0]), this.options)), s);
515
528
  if (this._$AH?._$AD === e) this._$AH.p(i);else {
516
529
  const t = new M$1(e, this),
517
530
  s = t.u(this.options);
@@ -520,7 +533,7 @@
520
533
  }
521
534
  _$AC(t) {
522
535
  let i = A$2.get(t.strings);
523
- return undefined === i && A$2.set(t.strings, i = new N$1(t)), i;
536
+ return void 0 === i && A$2.set(t.strings, i = new N$1(t)), i;
524
537
  }
525
538
  k(t) {
526
539
  a$2(this._$AH) || (this._$AH = [], this._$AR());
@@ -531,13 +544,13 @@
531
544
  e < i.length && (this._$AR(s && s._$AB.nextSibling, e), i.length = e);
532
545
  }
533
546
  _$AR(t = this._$AA.nextSibling, i) {
534
- for (this._$AP?.(false, true, i); t && t !== this._$AB;) {
547
+ for (this._$AP?.(false, true, i); t !== this._$AB;) {
535
548
  const i = t.nextSibling;
536
549
  t.remove(), t = i;
537
550
  }
538
551
  }
539
552
  setConnected(t) {
540
- undefined === this._$AM && (this._$Cv = t, this._$AP?.(t));
553
+ void 0 === this._$AM && (this._$Cv = t, this._$AP?.(t));
541
554
  }
542
555
  }
543
556
  let k$1 = class k {
@@ -548,12 +561,12 @@
548
561
  return this._$AM._$AU;
549
562
  }
550
563
  constructor(t, i, s, e, h) {
551
- this.type = 1, this._$AH = E$1, this._$AN = undefined, this.element = t, this.name = i, this._$AM = e, this.options = h, s.length > 2 || "" !== s[0] || "" !== s[1] ? (this._$AH = Array(s.length - 1).fill(new String()), this.strings = s) : this._$AH = E$1;
564
+ this.type = 1, this._$AH = E$1, this._$AN = void 0, this.element = t, this.name = i, this._$AM = e, this.options = h, s.length > 2 || "" !== s[0] || "" !== s[1] ? (this._$AH = Array(s.length - 1).fill(new String()), this.strings = s) : this._$AH = E$1;
552
565
  }
553
566
  _$AI(t, i = this, s, e) {
554
567
  const h = this.strings;
555
568
  let o = false;
556
- if (undefined === h) t = S(this, t, i, 0), o = !c$4(t) || t !== this._$AH && t !== T, o && (this._$AH = t);else {
569
+ if (void 0 === h) t = S(this, t, i, 0), o = !c$4(t) || t !== this._$AH && t !== T, o && (this._$AH = t);else {
557
570
  const e = t;
558
571
  let n, r;
559
572
  for (t = h[0], n = 0; n < h.length - 1; n++) r = S(this, e[s + n], i, n), r === T && (r = this._$AH[n]), o ||= !c$4(r) || r !== this._$AH[n], r === E$1 ? t = E$1 : t !== E$1 && (t += (r ?? "") + h[n + 1]), this._$AH[n] = r;
@@ -569,7 +582,7 @@
569
582
  super(...arguments), this.type = 3;
570
583
  }
571
584
  j(t) {
572
- this.element[this.name] = t === E$1 ? undefined : t;
585
+ this.element[this.name] = t === E$1 ? void 0 : t;
573
586
  }
574
587
  }
575
588
  class I extends k$1 {
@@ -597,7 +610,7 @@
597
610
  }
598
611
  class z {
599
612
  constructor(t, i, s) {
600
- this.element = t, this.type = 6, this._$AN = undefined, this._$AM = i, this.options = s;
613
+ this.element = t, this.type = 6, this._$AN = void 0, this._$AM = i, this.options = s;
601
614
  }
602
615
  get _$AU() {
603
616
  return this._$AM._$AU;
@@ -607,13 +620,13 @@
607
620
  }
608
621
  }
609
622
  const j$1 = t$1.litHtmlPolyfillSupport;
610
- j$1?.(N$1, R), (t$1.litHtmlVersions ??= []).push("3.2.1");
623
+ j$1?.(N$1, R), (t$1.litHtmlVersions ??= []).push("3.3.1");
611
624
  const B$1 = (t, i, s) => {
612
625
  const e = s?.renderBefore ?? i;
613
626
  let h = e._$litPart$;
614
- if (undefined === h) {
627
+ if (void 0 === h) {
615
628
  const t = s?.renderBefore ?? null;
616
- e._$litPart$ = h = new R(i.insertBefore(l(), t), t, undefined, s ?? {});
629
+ e._$litPart$ = h = new R(i.insertBefore(l(), t), t, void 0, s ?? {});
617
630
  }
618
631
  return h._$AI(t), h;
619
632
  };
@@ -623,19 +636,20 @@
623
636
  * Copyright 2017 Google LLC
624
637
  * SPDX-License-Identifier: BSD-3-Clause
625
638
  */
626
- let r$2 = class r extends b$2 {
639
+ const s$2 = globalThis;
640
+ let i$2 = class i extends y$2 {
627
641
  constructor() {
628
642
  super(...arguments), this.renderOptions = {
629
643
  host: this
630
- }, this._$Do = undefined;
644
+ }, this._$Do = void 0;
631
645
  }
632
646
  createRenderRoot() {
633
647
  const t = super.createRenderRoot();
634
648
  return this.renderOptions.renderBefore ??= t.firstChild, t;
635
649
  }
636
650
  update(t) {
637
- const s = this.render();
638
- this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t), this._$Do = B$1(s, this.renderRoot, this.renderOptions);
651
+ const r = this.render();
652
+ this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t), this._$Do = B$1(r, this.renderRoot, this.renderOptions);
639
653
  }
640
654
  connectedCallback() {
641
655
  super.connectedCallback(), this._$Do?.setConnected(true);
@@ -647,14 +661,14 @@
647
661
  return T;
648
662
  }
649
663
  };
650
- r$2._$litElement$ = true, r$2["finalized"] = true, globalThis.litElementHydrateSupport?.({
651
- LitElement: r$2
664
+ i$2._$litElement$ = true, i$2["finalized"] = true, s$2.litElementHydrateSupport?.({
665
+ LitElement: i$2
652
666
  });
653
- const i$2 = globalThis.litElementPolyfillSupport;
654
- i$2?.({
655
- LitElement: r$2
667
+ const o$3 = s$2.litElementPolyfillSupport;
668
+ o$3?.({
669
+ LitElement: i$2
656
670
  });
657
- (globalThis.litElementVersions ??= []).push("4.1.1");
671
+ (s$2.litElementVersions ??= []).push("4.2.1");
658
672
 
659
673
  function ascending$1(a, b) {
660
674
  return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
@@ -5440,7 +5454,7 @@
5440
5454
  // from the point to the South pole. If it is zero, then the point is the
5441
5455
  // same side as the South pole.
5442
5456
 
5443
- return (angle < -1e-6 || angle < epsilon$1 && sum < -1e-12) ^ winding & 1;
5457
+ return (angle < -epsilon$1 || angle < epsilon$1 && sum < -epsilon2) ^ winding & 1;
5444
5458
  }
5445
5459
 
5446
5460
  function clip (pointVisible, clipLine, interpolate, start) {
@@ -5857,7 +5871,7 @@
5857
5871
  }
5858
5872
 
5859
5873
  var clipMax = 1e9,
5860
- clipMin = -1e9;
5874
+ clipMin = -clipMax;
5861
5875
 
5862
5876
  // TODO Use d3-polygon’s polygonContains here for the ring check?
5863
5877
  // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
@@ -8754,7 +8768,7 @@
8754
8768
  return initInterpolator.apply(scale, arguments);
8755
8769
  }
8756
8770
 
8757
- function colors (specifier) {
8771
+ function colors$1 (specifier) {
8758
8772
  var n = specifier.length / 6 | 0,
8759
8773
  colors = new Array(n),
8760
8774
  i = 0;
@@ -8762,109 +8776,109 @@
8762
8776
  return colors;
8763
8777
  }
8764
8778
 
8765
- var schemeCategory10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
8779
+ var schemeCategory10 = colors$1("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
8766
8780
 
8767
- var schemeAccent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666");
8781
+ var schemeAccent = colors$1("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666");
8768
8782
 
8769
- var schemeDark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666");
8783
+ var schemeDark2 = colors$1("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666");
8770
8784
 
8771
- var schemeObservable10 = colors("4269d0efb118ff725c6cc5b03ca951ff8ab7a463f297bbf59c6b4e9498a0");
8785
+ var schemeObservable10 = colors$1("4269d0efb118ff725c6cc5b03ca951ff8ab7a463f297bbf59c6b4e9498a0");
8772
8786
 
8773
- var schemePaired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928");
8787
+ var schemePaired = colors$1("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928");
8774
8788
 
8775
- var schemePastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2");
8789
+ var schemePastel1 = colors$1("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2");
8776
8790
 
8777
- var schemePastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc");
8791
+ var schemePastel2 = colors$1("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc");
8778
8792
 
8779
- var schemeSet1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999");
8793
+ var schemeSet1 = colors$1("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999");
8780
8794
 
8781
- var schemeSet2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3");
8795
+ var schemeSet2 = colors$1("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3");
8782
8796
 
8783
- var schemeSet3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f");
8797
+ var schemeSet3 = colors$1("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f");
8784
8798
 
8785
- var schemeTableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab");
8799
+ var schemeTableau10 = colors$1("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab");
8786
8800
 
8787
8801
  var ramp$1 = scheme => rgbBasis(scheme[scheme.length - 1]);
8788
8802
 
8789
- var scheme$q = new Array(3).concat("d8b365f5f5f55ab4ac", "a6611adfc27d80cdc1018571", "a6611adfc27df5f5f580cdc1018571", "8c510ad8b365f6e8c3c7eae55ab4ac01665e", "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30").map(colors);
8803
+ var scheme$q = new Array(3).concat("d8b365f5f5f55ab4ac", "a6611adfc27d80cdc1018571", "a6611adfc27df5f5f580cdc1018571", "8c510ad8b365f6e8c3c7eae55ab4ac01665e", "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30").map(colors$1);
8790
8804
  var interpolateBrBG = ramp$1(scheme$q);
8791
8805
 
8792
- var scheme$p = new Array(3).concat("af8dc3f7f7f77fbf7b", "7b3294c2a5cfa6dba0008837", "7b3294c2a5cff7f7f7a6dba0008837", "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b").map(colors);
8806
+ var scheme$p = new Array(3).concat("af8dc3f7f7f77fbf7b", "7b3294c2a5cfa6dba0008837", "7b3294c2a5cff7f7f7a6dba0008837", "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b").map(colors$1);
8793
8807
  var interpolatePRGn = ramp$1(scheme$p);
8794
8808
 
8795
- var scheme$o = new Array(3).concat("e9a3c9f7f7f7a1d76a", "d01c8bf1b6dab8e1864dac26", "d01c8bf1b6daf7f7f7b8e1864dac26", "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419").map(colors);
8809
+ var scheme$o = new Array(3).concat("e9a3c9f7f7f7a1d76a", "d01c8bf1b6dab8e1864dac26", "d01c8bf1b6daf7f7f7b8e1864dac26", "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419").map(colors$1);
8796
8810
  var interpolatePiYG = ramp$1(scheme$o);
8797
8811
 
8798
- var scheme$n = new Array(3).concat("998ec3f7f7f7f1a340", "5e3c99b2abd2fdb863e66101", "5e3c99b2abd2f7f7f7fdb863e66101", "542788998ec3d8daebfee0b6f1a340b35806", "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08").map(colors);
8812
+ var scheme$n = new Array(3).concat("998ec3f7f7f7f1a340", "5e3c99b2abd2fdb863e66101", "5e3c99b2abd2f7f7f7fdb863e66101", "542788998ec3d8daebfee0b6f1a340b35806", "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08").map(colors$1);
8799
8813
  var interpolatePuOr = ramp$1(scheme$n);
8800
8814
 
8801
- var scheme$m = new Array(3).concat("ef8a62f7f7f767a9cf", "ca0020f4a58292c5de0571b0", "ca0020f4a582f7f7f792c5de0571b0", "b2182bef8a62fddbc7d1e5f067a9cf2166ac", "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061").map(colors);
8815
+ var scheme$m = new Array(3).concat("ef8a62f7f7f767a9cf", "ca0020f4a58292c5de0571b0", "ca0020f4a582f7f7f792c5de0571b0", "b2182bef8a62fddbc7d1e5f067a9cf2166ac", "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061").map(colors$1);
8802
8816
  var interpolateRdBu = ramp$1(scheme$m);
8803
8817
 
8804
- var scheme$l = new Array(3).concat("ef8a62ffffff999999", "ca0020f4a582bababa404040", "ca0020f4a582ffffffbababa404040", "b2182bef8a62fddbc7e0e0e09999994d4d4d", "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a").map(colors);
8818
+ var scheme$l = new Array(3).concat("ef8a62ffffff999999", "ca0020f4a582bababa404040", "ca0020f4a582ffffffbababa404040", "b2182bef8a62fddbc7e0e0e09999994d4d4d", "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a").map(colors$1);
8805
8819
  var interpolateRdGy = ramp$1(scheme$l);
8806
8820
 
8807
- var scheme$k = new Array(3).concat("fc8d59ffffbf91bfdb", "d7191cfdae61abd9e92c7bb6", "d7191cfdae61ffffbfabd9e92c7bb6", "d73027fc8d59fee090e0f3f891bfdb4575b4", "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695").map(colors);
8821
+ var scheme$k = new Array(3).concat("fc8d59ffffbf91bfdb", "d7191cfdae61abd9e92c7bb6", "d7191cfdae61ffffbfabd9e92c7bb6", "d73027fc8d59fee090e0f3f891bfdb4575b4", "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695").map(colors$1);
8808
8822
  var interpolateRdYlBu = ramp$1(scheme$k);
8809
8823
 
8810
- var scheme$j = new Array(3).concat("fc8d59ffffbf91cf60", "d7191cfdae61a6d96a1a9641", "d7191cfdae61ffffbfa6d96a1a9641", "d73027fc8d59fee08bd9ef8b91cf601a9850", "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837").map(colors);
8824
+ var scheme$j = new Array(3).concat("fc8d59ffffbf91cf60", "d7191cfdae61a6d96a1a9641", "d7191cfdae61ffffbfa6d96a1a9641", "d73027fc8d59fee08bd9ef8b91cf601a9850", "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837").map(colors$1);
8811
8825
  var interpolateRdYlGn = ramp$1(scheme$j);
8812
8826
 
8813
- var scheme$i = new Array(3).concat("fc8d59ffffbf99d594", "d7191cfdae61abdda42b83ba", "d7191cfdae61ffffbfabdda42b83ba", "d53e4ffc8d59fee08be6f59899d5943288bd", "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2").map(colors);
8827
+ var scheme$i = new Array(3).concat("fc8d59ffffbf99d594", "d7191cfdae61abdda42b83ba", "d7191cfdae61ffffbfabdda42b83ba", "d53e4ffc8d59fee08be6f59899d5943288bd", "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2").map(colors$1);
8814
8828
  var interpolateSpectral = ramp$1(scheme$i);
8815
8829
 
8816
- var scheme$h = new Array(3).concat("e5f5f999d8c92ca25f", "edf8fbb2e2e266c2a4238b45", "edf8fbb2e2e266c2a42ca25f006d2c", "edf8fbccece699d8c966c2a42ca25f006d2c", "edf8fbccece699d8c966c2a441ae76238b45005824", "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b").map(colors);
8830
+ var scheme$h = new Array(3).concat("e5f5f999d8c92ca25f", "edf8fbb2e2e266c2a4238b45", "edf8fbb2e2e266c2a42ca25f006d2c", "edf8fbccece699d8c966c2a42ca25f006d2c", "edf8fbccece699d8c966c2a441ae76238b45005824", "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b").map(colors$1);
8817
8831
  var interpolateBuGn = ramp$1(scheme$h);
8818
8832
 
8819
- var scheme$g = new Array(3).concat("e0ecf49ebcda8856a7", "edf8fbb3cde38c96c688419d", "edf8fbb3cde38c96c68856a7810f7c", "edf8fbbfd3e69ebcda8c96c68856a7810f7c", "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b").map(colors);
8833
+ var scheme$g = new Array(3).concat("e0ecf49ebcda8856a7", "edf8fbb3cde38c96c688419d", "edf8fbb3cde38c96c68856a7810f7c", "edf8fbbfd3e69ebcda8c96c68856a7810f7c", "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b").map(colors$1);
8820
8834
  var interpolateBuPu = ramp$1(scheme$g);
8821
8835
 
8822
- var scheme$f = new Array(3).concat("e0f3dba8ddb543a2ca", "f0f9e8bae4bc7bccc42b8cbe", "f0f9e8bae4bc7bccc443a2ca0868ac", "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081").map(colors);
8836
+ var scheme$f = new Array(3).concat("e0f3dba8ddb543a2ca", "f0f9e8bae4bc7bccc42b8cbe", "f0f9e8bae4bc7bccc443a2ca0868ac", "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081").map(colors$1);
8823
8837
  var interpolateGnBu = ramp$1(scheme$f);
8824
8838
 
8825
- var scheme$e = new Array(3).concat("fee8c8fdbb84e34a33", "fef0d9fdcc8afc8d59d7301f", "fef0d9fdcc8afc8d59e34a33b30000", "fef0d9fdd49efdbb84fc8d59e34a33b30000", "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000").map(colors);
8839
+ var scheme$e = new Array(3).concat("fee8c8fdbb84e34a33", "fef0d9fdcc8afc8d59d7301f", "fef0d9fdcc8afc8d59e34a33b30000", "fef0d9fdd49efdbb84fc8d59e34a33b30000", "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000").map(colors$1);
8826
8840
  var interpolateOrRd = ramp$1(scheme$e);
8827
8841
 
8828
- var scheme$d = new Array(3).concat("ece2f0a6bddb1c9099", "f6eff7bdc9e167a9cf02818a", "f6eff7bdc9e167a9cf1c9099016c59", "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636").map(colors);
8842
+ var scheme$d = new Array(3).concat("ece2f0a6bddb1c9099", "f6eff7bdc9e167a9cf02818a", "f6eff7bdc9e167a9cf1c9099016c59", "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636").map(colors$1);
8829
8843
  var interpolatePuBuGn = ramp$1(scheme$d);
8830
8844
 
8831
- var scheme$c = new Array(3).concat("ece7f2a6bddb2b8cbe", "f1eef6bdc9e174a9cf0570b0", "f1eef6bdc9e174a9cf2b8cbe045a8d", "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858").map(colors);
8845
+ var scheme$c = new Array(3).concat("ece7f2a6bddb2b8cbe", "f1eef6bdc9e174a9cf0570b0", "f1eef6bdc9e174a9cf2b8cbe045a8d", "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858").map(colors$1);
8832
8846
  var interpolatePuBu = ramp$1(scheme$c);
8833
8847
 
8834
- var scheme$b = new Array(3).concat("e7e1efc994c7dd1c77", "f1eef6d7b5d8df65b0ce1256", "f1eef6d7b5d8df65b0dd1c77980043", "f1eef6d4b9dac994c7df65b0dd1c77980043", "f1eef6d4b9dac994c7df65b0e7298ace125691003f", "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f").map(colors);
8848
+ var scheme$b = new Array(3).concat("e7e1efc994c7dd1c77", "f1eef6d7b5d8df65b0ce1256", "f1eef6d7b5d8df65b0dd1c77980043", "f1eef6d4b9dac994c7df65b0dd1c77980043", "f1eef6d4b9dac994c7df65b0e7298ace125691003f", "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f").map(colors$1);
8835
8849
  var interpolatePuRd = ramp$1(scheme$b);
8836
8850
 
8837
- var scheme$a = new Array(3).concat("fde0ddfa9fb5c51b8a", "feebe2fbb4b9f768a1ae017e", "feebe2fbb4b9f768a1c51b8a7a0177", "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a").map(colors);
8851
+ var scheme$a = new Array(3).concat("fde0ddfa9fb5c51b8a", "feebe2fbb4b9f768a1ae017e", "feebe2fbb4b9f768a1c51b8a7a0177", "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a").map(colors$1);
8838
8852
  var interpolateRdPu = ramp$1(scheme$a);
8839
8853
 
8840
- var scheme$9 = new Array(3).concat("edf8b17fcdbb2c7fb8", "ffffcca1dab441b6c4225ea8", "ffffcca1dab441b6c42c7fb8253494", "ffffccc7e9b47fcdbb41b6c42c7fb8253494", "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58").map(colors);
8854
+ var scheme$9 = new Array(3).concat("edf8b17fcdbb2c7fb8", "ffffcca1dab441b6c4225ea8", "ffffcca1dab441b6c42c7fb8253494", "ffffccc7e9b47fcdbb41b6c42c7fb8253494", "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58").map(colors$1);
8841
8855
  var interpolateYlGnBu = ramp$1(scheme$9);
8842
8856
 
8843
- var scheme$8 = new Array(3).concat("f7fcb9addd8e31a354", "ffffccc2e69978c679238443", "ffffccc2e69978c67931a354006837", "ffffccd9f0a3addd8e78c67931a354006837", "ffffccd9f0a3addd8e78c67941ab5d238443005a32", "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529").map(colors);
8857
+ var scheme$8 = new Array(3).concat("f7fcb9addd8e31a354", "ffffccc2e69978c679238443", "ffffccc2e69978c67931a354006837", "ffffccd9f0a3addd8e78c67931a354006837", "ffffccd9f0a3addd8e78c67941ab5d238443005a32", "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529").map(colors$1);
8844
8858
  var interpolateYlGn = ramp$1(scheme$8);
8845
8859
 
8846
- var scheme$7 = new Array(3).concat("fff7bcfec44fd95f0e", "ffffd4fed98efe9929cc4c02", "ffffd4fed98efe9929d95f0e993404", "ffffd4fee391fec44ffe9929d95f0e993404", "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506").map(colors);
8860
+ var scheme$7 = new Array(3).concat("fff7bcfec44fd95f0e", "ffffd4fed98efe9929cc4c02", "ffffd4fed98efe9929d95f0e993404", "ffffd4fee391fec44ffe9929d95f0e993404", "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506").map(colors$1);
8847
8861
  var interpolateYlOrBr = ramp$1(scheme$7);
8848
8862
 
8849
- var scheme$6 = new Array(3).concat("ffeda0feb24cf03b20", "ffffb2fecc5cfd8d3ce31a1c", "ffffb2fecc5cfd8d3cf03b20bd0026", "ffffb2fed976feb24cfd8d3cf03b20bd0026", "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026").map(colors);
8863
+ var scheme$6 = new Array(3).concat("ffeda0feb24cf03b20", "ffffb2fecc5cfd8d3ce31a1c", "ffffb2fecc5cfd8d3cf03b20bd0026", "ffffb2fed976feb24cfd8d3cf03b20bd0026", "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026").map(colors$1);
8850
8864
  var interpolateYlOrRd = ramp$1(scheme$6);
8851
8865
 
8852
- var scheme$5 = new Array(3).concat("deebf79ecae13182bd", "eff3ffbdd7e76baed62171b5", "eff3ffbdd7e76baed63182bd08519c", "eff3ffc6dbef9ecae16baed63182bd08519c", "eff3ffc6dbef9ecae16baed64292c62171b5084594", "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b").map(colors);
8866
+ var scheme$5 = new Array(3).concat("deebf79ecae13182bd", "eff3ffbdd7e76baed62171b5", "eff3ffbdd7e76baed63182bd08519c", "eff3ffc6dbef9ecae16baed63182bd08519c", "eff3ffc6dbef9ecae16baed64292c62171b5084594", "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b").map(colors$1);
8853
8867
  var interpolateBlues = ramp$1(scheme$5);
8854
8868
 
8855
- var scheme$4 = new Array(3).concat("e5f5e0a1d99b31a354", "edf8e9bae4b374c476238b45", "edf8e9bae4b374c47631a354006d2c", "edf8e9c7e9c0a1d99b74c47631a354006d2c", "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b").map(colors);
8869
+ var scheme$4 = new Array(3).concat("e5f5e0a1d99b31a354", "edf8e9bae4b374c476238b45", "edf8e9bae4b374c47631a354006d2c", "edf8e9c7e9c0a1d99b74c47631a354006d2c", "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b").map(colors$1);
8856
8870
  var interpolateGreens = ramp$1(scheme$4);
8857
8871
 
8858
- var scheme$3 = new Array(3).concat("f0f0f0bdbdbd636363", "f7f7f7cccccc969696525252", "f7f7f7cccccc969696636363252525", "f7f7f7d9d9d9bdbdbd969696636363252525", "f7f7f7d9d9d9bdbdbd969696737373525252252525", "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000").map(colors);
8872
+ var scheme$3 = new Array(3).concat("f0f0f0bdbdbd636363", "f7f7f7cccccc969696525252", "f7f7f7cccccc969696636363252525", "f7f7f7d9d9d9bdbdbd969696636363252525", "f7f7f7d9d9d9bdbdbd969696737373525252252525", "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000").map(colors$1);
8859
8873
  var interpolateGreys = ramp$1(scheme$3);
8860
8874
 
8861
- var scheme$2 = new Array(3).concat("efedf5bcbddc756bb1", "f2f0f7cbc9e29e9ac86a51a3", "f2f0f7cbc9e29e9ac8756bb154278f", "f2f0f7dadaebbcbddc9e9ac8756bb154278f", "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d").map(colors);
8875
+ var scheme$2 = new Array(3).concat("efedf5bcbddc756bb1", "f2f0f7cbc9e29e9ac86a51a3", "f2f0f7cbc9e29e9ac8756bb154278f", "f2f0f7dadaebbcbddc9e9ac8756bb154278f", "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d").map(colors$1);
8862
8876
  var interpolatePurples = ramp$1(scheme$2);
8863
8877
 
8864
- var scheme$1 = new Array(3).concat("fee0d2fc9272de2d26", "fee5d9fcae91fb6a4acb181d", "fee5d9fcae91fb6a4ade2d26a50f15", "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d").map(colors);
8878
+ var scheme$1 = new Array(3).concat("fee0d2fc9272de2d26", "fee5d9fcae91fb6a4acb181d", "fee5d9fcae91fb6a4ade2d26a50f15", "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d").map(colors$1);
8865
8879
  var interpolateReds = ramp$1(scheme$1);
8866
8880
 
8867
- var scheme = new Array(3).concat("fee6cefdae6be6550d", "feeddefdbe85fd8d3cd94701", "feeddefdbe85fd8d3ce6550da63603", "feeddefdd0a2fdae6bfd8d3ce6550da63603", "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704").map(colors);
8881
+ var scheme = new Array(3).concat("fee6cefdae6be6550d", "feeddefdbe85fd8d3cd94701", "feeddefdbe85fd8d3ce6550da63603", "feeddefdd0a2fdae6bfd8d3ce6550da63603", "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704").map(colors$1);
8868
8882
  var interpolateOranges = ramp$1(scheme);
8869
8883
 
8870
8884
  function interpolateCividis (t) {
@@ -8909,10 +8923,10 @@
8909
8923
  return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
8910
8924
  };
8911
8925
  }
8912
- var interpolateViridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
8913
- var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
8914
- var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
8915
- var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
8926
+ var interpolateViridis = ramp(colors$1("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
8927
+ var magma = ramp(colors$1("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
8928
+ var inferno = ramp(colors$1("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
8929
+ var plasma = ramp(colors$1("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
8916
8930
 
8917
8931
  function constant$1 (x) {
8918
8932
  return function constant() {
@@ -10176,7 +10190,7 @@
10176
10190
  DecidablesElement Base Class - Not intended for instantiation!
10177
10191
  <decidables-element>
10178
10192
  */
10179
- class DecidablesElement extends r$2 {
10193
+ class DecidablesElement extends i$2 {
10180
10194
  getComputedStyleValue(property) {
10181
10195
  return getComputedStyle(this).getPropertyValue(property).trim();
10182
10196
  }
@@ -10431,22 +10445,22 @@
10431
10445
  static get styles() {
10432
10446
  return i$5`
10433
10447
  :host {
10434
- ---shadow-0: var(--shadow-0, ${r$5(this.cssBoxShadow(0))});
10435
- ---shadow-2: var(--shadow-2, ${r$5(this.cssBoxShadow(2))});
10436
- ---shadow-4: var(--shadow-4, ${r$5(this.cssBoxShadow(4))});
10437
- ---shadow-8: var(--shadow-8, ${r$5(this.cssBoxShadow(8))});
10438
-
10439
- ---color-background: var(--color-background, ${r$5(this.greys.white)});
10440
- ---color-border: var(--color-border, ${r$5(this.greys.light75)});
10441
- ---color-text: var(--color-text, ${r$5(this.greys.dark75)});
10442
- ---color-text-inverse: var(--color-text-inverse, ${r$5(this.greys.white)});
10443
- ---color-link: var(--color-link, ${r$5(this.greys.dark25)});
10444
- ---color-element-background: var(--color-element-background, ${r$5(this.greys.light75)});
10445
- ---color-element-disabled: var(--color-element-disabled, ${r$5(this.greys.light50)});
10446
- ---color-element-enabled: var(--color-element-enabled, ${r$5(this.greys.dark25)});
10447
- ---color-element-selected: var(--color-element-selected, ${r$5(this.greys.grey)});
10448
- ---color-element-border: var(--color-element-border, ${r$5(this.greys.dark50)});
10449
- ---color-element-emphasis: var(--color-element-emphasis, ${r$5(this.greys.dark75)});
10448
+ ---shadow-0: var(--shadow-0, ${r$4(this.cssBoxShadow(0))});
10449
+ ---shadow-2: var(--shadow-2, ${r$4(this.cssBoxShadow(2))});
10450
+ ---shadow-4: var(--shadow-4, ${r$4(this.cssBoxShadow(4))});
10451
+ ---shadow-8: var(--shadow-8, ${r$4(this.cssBoxShadow(8))});
10452
+
10453
+ ---color-background: var(--color-background, ${r$4(this.greys.white)});
10454
+ ---color-border: var(--color-border, ${r$4(this.greys.light75)});
10455
+ ---color-text: var(--color-text, ${r$4(this.greys.dark75)});
10456
+ ---color-text-inverse: var(--color-text-inverse, ${r$4(this.greys.white)});
10457
+ ---color-link: var(--color-link, ${r$4(this.greys.dark25)});
10458
+ ---color-element-background: var(--color-element-background, ${r$4(this.greys.light75)});
10459
+ ---color-element-disabled: var(--color-element-disabled, ${r$4(this.greys.light50)});
10460
+ ---color-element-enabled: var(--color-element-enabled, ${r$4(this.greys.dark25)});
10461
+ ---color-element-selected: var(--color-element-selected, ${r$4(this.greys.grey)});
10462
+ ---color-element-border: var(--color-element-border, ${r$4(this.greys.dark50)});
10463
+ ---color-element-emphasis: var(--color-element-emphasis, ${r$4(this.greys.dark75)});
10450
10464
 
10451
10465
  ---font-family-base: var(--font-family-base, "Source Sans", sans-serif);
10452
10466
  ---font-family-math: var(--font-family-math, "Source Serif", serif);
@@ -10456,6 +10470,7 @@
10456
10470
  ---transition-duration: var(--transition-duration, 500ms);
10457
10471
 
10458
10472
  font-family: var(---font-family-base);
10473
+ font-weight: normal;
10459
10474
  }
10460
10475
 
10461
10476
  :host,
@@ -10677,9 +10692,9 @@
10677
10692
  ---decidables-slider-color: var(--decidables-slider-color, var(---color-element-enabled));
10678
10693
  ---decidables-spinner-background-color: var(--decidables-slider-background-color, none);
10679
10694
 
10680
- ---shadow-2-rotate: var(--shadow-2-rotate, ${r$5(this.cssBoxShadow(2, true, false))});
10681
- ---shadow-4-rotate: var(--shadow-4-rotate, ${r$5(this.cssBoxShadow(4, true, false))});
10682
- ---shadow-8-rotate: var(--shadow-8-rotate, ${r$5(this.cssBoxShadow(8, true, false))});
10695
+ ---shadow-2-rotate: var(--shadow-2-rotate, ${r$4(this.cssBoxShadow(2, true, false))});
10696
+ ---shadow-4-rotate: var(--shadow-4-rotate, ${r$4(this.cssBoxShadow(4, true, false))});
10697
+ ---shadow-8-rotate: var(--shadow-8-rotate, ${r$4(this.cssBoxShadow(8, true, false))});
10683
10698
 
10684
10699
  display: flex;
10685
10700
 
@@ -11182,7 +11197,6 @@
11182
11197
  padding: 0;
11183
11198
  margin: -1px;
11184
11199
  overflow: hidden;
11185
- clip: rect(0 0 0 0);
11186
11200
 
11187
11201
  white-space: nowrap;
11188
11202
 
@@ -11404,7 +11418,6 @@
11404
11418
  padding: 0;
11405
11419
  margin: -1px;
11406
11420
  overflow: hidden;
11407
- clip: rect(0 0 0 0);
11408
11421
 
11409
11422
  white-space: nowrap;
11410
11423
 
@@ -11540,6 +11553,18 @@
11540
11553
  };
11541
11554
  }
11542
11555
 
11556
+ var data = { colors:{ a:"#e41a1c",
11557
+ d:"#377eb8",
11558
+ k:"#4daf4a",
11559
+ v:"#984ea3",
11560
+ sooner:"#ff7f00",
11561
+ later:"#f781bf",
11562
+ larger:"#4545d0",
11563
+ smaller:"#f032e6",
11564
+ equal:"#10dbc9",
11565
+ nr:"#cccccc" } };
11566
+ var colors = data.colors;
11567
+
11543
11568
  /*
11544
11569
  DiscountableElement Base Class - Not intended for instantiation!
11545
11570
  <sdt-element>
@@ -11559,18 +11584,7 @@
11559
11584
  this.interactive = false;
11560
11585
  }
11561
11586
  static get colors() {
11562
- return {
11563
- a: schemeSet1[0],
11564
- d: schemeSet1[1],
11565
- k: schemeSet1[2],
11566
- v: schemeSet1[3],
11567
- sooner: schemeSet1[5],
11568
- later: schemeSet1[7],
11569
- larger: '#4545d0',
11570
- smaller: '#f032e6',
11571
- equal: '#10dbc9',
11572
- nr: '#cccccc'
11573
- };
11587
+ return colors;
11574
11588
  }
11575
11589
  static get lights() {
11576
11590
  return Object.keys(DiscountableElement.colors).reduce((acc, cur) => {
@@ -11587,38 +11601,38 @@
11587
11601
  static get styles() {
11588
11602
  return [super.styles, i$5`
11589
11603
  :host {
11590
- ---color-a: var(--color-a, ${r$5(this.colors.a)});
11591
- ---color-d: var(--color-d, ${r$5(this.colors.d)});
11592
- ---color-k: var(--color-k, ${r$5(this.colors.k)});
11593
- ---color-v: var(--color-v, ${r$5(this.colors.v)});
11594
- ---color-sooner: var(--color-sooner, ${r$5(this.colors.sooner)});
11595
- ---color-later: var(--color-later, ${r$5(this.colors.later)});
11596
- ---color-larger: var(--color-larger, ${r$5(this.colors.larger)});
11597
- ---color-smaller: var(--color-smaller, ${r$5(this.colors.smaller)});
11598
- ---color-equal: var(--color-equal, ${r$5(this.colors.equal)});
11599
- ---color-nr: var(--color-nr, ${r$5(this.colors.nr)});
11600
-
11601
- ---color-a-light: var(--color-a-light, ${r$5(this.lights.a)});
11602
- ---color-d-light: var(--color-d-light, ${r$5(this.lights.d)});
11603
- ---color-k-light: var(--color-k-light, ${r$5(this.lights.k)});
11604
- ---color-v-light: var(--color-v-light, ${r$5(this.lights.v)});
11605
- ---color-sooner-light: var(--color-sooner-light, ${r$5(this.lights.sooner)});
11606
- ---color-later-light: var(--color-later-light, ${r$5(this.lights.later)});
11607
- ---color-larger-light: var(--color-larger-light, ${r$5(this.lights.larger)});
11608
- ---color-smaller-light: var(--color-smaller-light, ${r$5(this.lights.smaller)});
11609
- ---color-equal-light: var(--color-equal-light, ${r$5(this.lights.equal)});
11610
- ---color-nr-light: var(--color-nr-light, ${r$5(this.lights.nr)});
11611
-
11612
- ---color-a-dark: var(--color-a-dark, ${r$5(this.darks.a)});
11613
- ---color-d-dark: var(--color-d-dark, ${r$5(this.darks.d)});
11614
- ---color-k-dark: var(--color-k-dark, ${r$5(this.darks.k)});
11615
- ---color-v-dark: var(--color-v-dark, ${r$5(this.darks.v)});
11616
- ---color-sooner-dark: var(--color-sooner-dark, ${r$5(this.darks.sooner)});
11617
- ---color-later-dark: var(--color-later-dark, ${r$5(this.darks.later)});
11618
- ---color-larger-dark: var(--color-larger-dark, ${r$5(this.darks.larger)});
11619
- ---color-smaller-dark: var(--color-smaller-dark, ${r$5(this.darks.smaller)});
11620
- ---color-equal-dark: var(--color-equal-dark, ${r$5(this.darks.equal)});
11621
- ---color-nr-dark: var(--color-nr-dark, ${r$5(this.darks.nr)});
11604
+ ---color-a: var(--color-a, ${r$4(this.colors.a)});
11605
+ ---color-d: var(--color-d, ${r$4(this.colors.d)});
11606
+ ---color-k: var(--color-k, ${r$4(this.colors.k)});
11607
+ ---color-v: var(--color-v, ${r$4(this.colors.v)});
11608
+ ---color-sooner: var(--color-sooner, ${r$4(this.colors.sooner)});
11609
+ ---color-later: var(--color-later, ${r$4(this.colors.later)});
11610
+ ---color-larger: var(--color-larger, ${r$4(this.colors.larger)});
11611
+ ---color-smaller: var(--color-smaller, ${r$4(this.colors.smaller)});
11612
+ ---color-equal: var(--color-equal, ${r$4(this.colors.equal)});
11613
+ ---color-nr: var(--color-nr, ${r$4(this.colors.nr)});
11614
+
11615
+ ---color-a-light: var(--color-a-light, ${r$4(this.lights.a)});
11616
+ ---color-d-light: var(--color-d-light, ${r$4(this.lights.d)});
11617
+ ---color-k-light: var(--color-k-light, ${r$4(this.lights.k)});
11618
+ ---color-v-light: var(--color-v-light, ${r$4(this.lights.v)});
11619
+ ---color-sooner-light: var(--color-sooner-light, ${r$4(this.lights.sooner)});
11620
+ ---color-later-light: var(--color-later-light, ${r$4(this.lights.later)});
11621
+ ---color-larger-light: var(--color-larger-light, ${r$4(this.lights.larger)});
11622
+ ---color-smaller-light: var(--color-smaller-light, ${r$4(this.lights.smaller)});
11623
+ ---color-equal-light: var(--color-equal-light, ${r$4(this.lights.equal)});
11624
+ ---color-nr-light: var(--color-nr-light, ${r$4(this.lights.nr)});
11625
+
11626
+ ---color-a-dark: var(--color-a-dark, ${r$4(this.darks.a)});
11627
+ ---color-d-dark: var(--color-d-dark, ${r$4(this.darks.d)});
11628
+ ---color-k-dark: var(--color-k-dark, ${r$4(this.darks.k)});
11629
+ ---color-v-dark: var(--color-v-dark, ${r$4(this.darks.v)});
11630
+ ---color-sooner-dark: var(--color-sooner-dark, ${r$4(this.darks.sooner)});
11631
+ ---color-later-dark: var(--color-later-dark, ${r$4(this.darks.later)});
11632
+ ---color-larger-dark: var(--color-larger-dark, ${r$4(this.darks.larger)});
11633
+ ---color-smaller-dark: var(--color-smaller-dark, ${r$4(this.darks.smaller)});
11634
+ ---color-equal-dark: var(--color-equal-dark, ${r$4(this.darks.equal)});
11635
+ ---color-nr-dark: var(--color-nr-dark, ${r$4(this.darks.nr)});
11622
11636
  }
11623
11637
  `];
11624
11638
  }
@@ -12051,7 +12065,7 @@
12051
12065
  * Copyright 2020 Google LLC
12052
12066
  * SPDX-License-Identifier: BSD-3-Clause
12053
12067
  */
12054
- const f$1 = o => undefined === o.strings;
12068
+ const f$1 = o => void 0 === o.strings;
12055
12069
 
12056
12070
  /**
12057
12071
  * @license
@@ -12060,31 +12074,31 @@
12060
12074
  */
12061
12075
  const s = (i, t) => {
12062
12076
  const e = i._$AN;
12063
- if (undefined === e) return false;
12077
+ if (void 0 === e) return false;
12064
12078
  for (const i of e) i._$AO?.(t, false), s(i, t);
12065
12079
  return true;
12066
12080
  },
12067
12081
  o$1 = i => {
12068
12082
  let t, e;
12069
12083
  do {
12070
- if (undefined === (t = i._$AM)) break;
12084
+ if (void 0 === (t = i._$AM)) break;
12071
12085
  e = t._$AN, e.delete(i), i = t;
12072
12086
  } while (0 === e?.size);
12073
12087
  },
12074
12088
  r$1 = i => {
12075
12089
  for (let t; t = i._$AM; i = t) {
12076
12090
  let e = t._$AN;
12077
- if (undefined === e) t._$AN = e = new Set();else if (e.has(i)) break;
12091
+ if (void 0 === e) t._$AN = e = new Set();else if (e.has(i)) break;
12078
12092
  e.add(i), c(t);
12079
12093
  }
12080
12094
  };
12081
12095
  function h(i) {
12082
- undefined !== this._$AN ? (o$1(this), this._$AM = i, r$1(this)) : this._$AM = i;
12096
+ void 0 !== this._$AN ? (o$1(this), this._$AM = i, r$1(this)) : this._$AM = i;
12083
12097
  }
12084
12098
  function n$1(i, t = false, e = 0) {
12085
12099
  const r = this._$AH,
12086
12100
  h = this._$AN;
12087
- if (undefined !== h && 0 !== h.size) if (t) {
12101
+ if (void 0 !== h && 0 !== h.size) if (t) {
12088
12102
  if (Array.isArray(r)) for (let i = e; i < r.length; i++) s(r[i], false), o$1(r[i]);else null != r && (s(r, false), o$1(r));
12089
12103
  } else s(this, i);
12090
12104
  }
@@ -12093,7 +12107,7 @@
12093
12107
  };
12094
12108
  class f extends i$1 {
12095
12109
  constructor() {
12096
- super(...arguments), this._$AN = undefined;
12110
+ super(...arguments), this._$AN = void 0;
12097
12111
  }
12098
12112
  _$AT(i, t, e) {
12099
12113
  super._$AT(i, t, e), r$1(this), this.isConnected = i._$AU;
@@ -12124,25 +12138,25 @@
12124
12138
  }],
12125
12139
  g = (t, i) => {
12126
12140
  const s = t - i;
12127
- return 0 === s ? undefined : s;
12141
+ return 0 === s ? void 0 : s;
12128
12142
  },
12129
12143
  w = (t, i) => {
12130
12144
  const s = t / i;
12131
- return 1 === s ? undefined : s;
12145
+ return 1 === s ? void 0 : s;
12132
12146
  },
12133
12147
  N = {
12134
12148
  left: (t, i) => {
12135
12149
  const s = g(t, i);
12136
12150
  return {
12137
12151
  value: s,
12138
- transform: null == s || isNaN(s) ? undefined : `translateX(${s}px)`
12152
+ transform: null == s || isNaN(s) ? void 0 : `translateX(${s}px)`
12139
12153
  };
12140
12154
  },
12141
12155
  top: (t, i) => {
12142
12156
  const s = g(t, i);
12143
12157
  return {
12144
12158
  value: s,
12145
- transform: null == s || isNaN(s) ? undefined : `translateY(${s}px)`
12159
+ transform: null == s || isNaN(s) ? void 0 : `translateY(${s}px)`
12146
12160
  };
12147
12161
  },
12148
12162
  width: (t, i) => {
@@ -12154,7 +12168,7 @@
12154
12168
  return {
12155
12169
  value: e,
12156
12170
  overrideFrom: s,
12157
- transform: null == e || isNaN(e) ? undefined : `scaleX(${e})`
12171
+ transform: null == e || isNaN(e) ? void 0 : `scaleX(${e})`
12158
12172
  };
12159
12173
  },
12160
12174
  height: (t, i) => {
@@ -12166,7 +12180,7 @@
12166
12180
  return {
12167
12181
  value: e,
12168
12182
  overrideFrom: s,
12169
- transform: null == e || isNaN(e) ? undefined : `scaleY(${e})`
12183
+ transform: null == e || isNaN(e) ? void 0 : `scaleY(${e})`
12170
12184
  };
12171
12185
  }
12172
12186
  },
@@ -12187,7 +12201,7 @@
12187
12201
  });
12188
12202
  }
12189
12203
  async resolveFinished() {
12190
- this.l?.(), this.l = undefined;
12204
+ this.l?.(), this.l = void 0;
12191
12205
  }
12192
12206
  render(i) {
12193
12207
  return E$1;
@@ -12199,13 +12213,13 @@
12199
12213
  return this.options.disabled || this.getController()?.disabled;
12200
12214
  }
12201
12215
  update(t, [i]) {
12202
- const s = undefined === this.u;
12216
+ const s = void 0 === this.u;
12203
12217
  return s && (this.u = t.options?.host, this.u.addController(this), this.u.updateComplete.then(t => this.t = true), this.element = t.element, j.set(this.element, this)), this.optionsOrCallback = i, (s || "function" != typeof i) && this.p(i), this.render(i);
12204
12218
  }
12205
12219
  p(t) {
12206
12220
  t = t ?? {};
12207
12221
  const i = this.getController();
12208
- undefined !== i && ((t = {
12222
+ void 0 !== i && ((t = {
12209
12223
  ...i.defaultOptions,
12210
12224
  ...t
12211
12225
  }).keyframeOptions = {
@@ -12218,7 +12232,7 @@
12218
12232
  i = this.element.getBoundingClientRect(),
12219
12233
  s = getComputedStyle(this.element);
12220
12234
  return this.options.properties.forEach(e => {
12221
- const h = i[e] ?? (N[e] ? undefined : s[e]),
12235
+ const h = i[e] ?? (N[e] ? void 0 : s[e]),
12222
12236
  o = Number(h);
12223
12237
  t[e] = isNaN(o) ? h + "" : o;
12224
12238
  }), t;
@@ -12243,7 +12257,7 @@
12243
12257
  const i = this.O(),
12244
12258
  s = this.j(this.options.keyframeOptions, i),
12245
12259
  e = this.m();
12246
- if (undefined !== this.A) {
12260
+ if (void 0 !== this.A) {
12247
12261
  const {
12248
12262
  from: s,
12249
12263
  to: h
@@ -12266,7 +12280,7 @@
12266
12280
  this.animate(t, s);
12267
12281
  }
12268
12282
  resetStyles() {
12269
- undefined !== this.P && (this.element.setAttribute("style", this.P ?? ""), this.P = undefined);
12283
+ void 0 !== this.P && (this.element.setAttribute("style", this.P ?? ""), this.P = void 0);
12270
12284
  }
12271
12285
  commitStyles() {
12272
12286
  this.P = this.element.getAttribute("style"), this.webAnimation?.commitStyles(), this.webAnimation?.cancel();
@@ -12274,7 +12288,7 @@
12274
12288
  reconnected() {}
12275
12289
  async disconnected() {
12276
12290
  if (!this.h) return;
12277
- if (undefined !== this.options.id && r.set(this.options.id, this.A), undefined === this.options.out) return;
12291
+ if (void 0 !== this.options.id && r.set(this.options.id, this.A), void 0 === this.options.out) return;
12278
12292
  if (this.prepare(), await a(), this.i?.isConnected) {
12279
12293
  const t = this.o && this.o.parentNode === this.i ? this.o : null;
12280
12294
  if (this.i.insertBefore(this.element, t), this.options.stabilizeOut) {
@@ -12295,7 +12309,7 @@
12295
12309
  this.options.onStart?.(this);
12296
12310
  }
12297
12311
  didFinish(t) {
12298
- t && this.options.onComplete?.(this), this.A = undefined, this.animatingProperties = undefined, this.frames = undefined, this.resolveFinished();
12312
+ t && this.options.onComplete?.(this), this.A = void 0, this.animatingProperties = void 0, this.frames = void 0, this.resolveFinished();
12299
12313
  }
12300
12314
  O() {
12301
12315
  const t = [];
@@ -12323,12 +12337,12 @@
12323
12337
  }, i = {
12324
12338
  ...i
12325
12339
  };
12326
- const e = s.map(t => t.animatingProperties).filter(t => undefined !== t);
12340
+ const e = s.map(t => t.animatingProperties).filter(t => void 0 !== t);
12327
12341
  let h = 1,
12328
12342
  o = 1;
12329
12343
  return e.length > 0 && (e.forEach(t => {
12330
12344
  t.width && (h /= t.width), t.height && (o /= t.height);
12331
- }), undefined !== t.left && undefined !== i.left && (t.left = h * t.left, i.left = h * i.left), undefined !== t.top && undefined !== i.top && (t.top = o * t.top, i.top = o * i.top)), {
12345
+ }), void 0 !== t.left && void 0 !== i.left && (t.left = h * t.left, i.left = h * i.left), void 0 !== t.top && void 0 !== i.top && (t.top = o * t.top, i.top = o * i.top)), {
12332
12346
  from: t,
12333
12347
  to: i
12334
12348
  };
@@ -12343,17 +12357,17 @@
12343
12357
  a = i[s];
12344
12358
  if (s in N) {
12345
12359
  const t = N[s];
12346
- if (undefined === n || undefined === a) continue;
12360
+ if (void 0 === n || void 0 === a) continue;
12347
12361
  const i = t(n, a);
12348
- undefined !== i.transform && (r[s] = i.value, o = true, e.transform = `${e.transform ?? ""} ${i.transform}`, undefined !== i.overrideFrom && Object.assign(e, i.overrideFrom));
12349
- } else n !== a && undefined !== n && undefined !== a && (o = true, e[s] = n, h[s] = a);
12362
+ void 0 !== i.transform && (r[s] = i.value, o = true, e.transform = `${e.transform ?? ""} ${i.transform}`, void 0 !== i.overrideFrom && Object.assign(e, i.overrideFrom));
12363
+ } else n !== a && void 0 !== n && void 0 !== a && (o = true, e[s] = n, h[s] = a);
12350
12364
  }
12351
- return e.transformOrigin = h.transformOrigin = s ? "center center" : "top left", this.animatingProperties = r, o ? [e, h] : undefined;
12365
+ return e.transformOrigin = h.transformOrigin = s ? "center center" : "top left", this.animatingProperties = r, o ? [e, h] : void 0;
12352
12366
  }
12353
12367
  async animate(t, i = this.options.keyframeOptions) {
12354
12368
  this.start(), this.frames = t;
12355
12369
  let s = false;
12356
- if (!this.isAnimating() && !this.isDisabled() && (this.options.onFrames && (this.frames = t = this.options.onFrames(this), this.log("modified frames", t)), undefined !== t)) {
12370
+ if (!this.isAnimating() && !this.isDisabled() && (this.options.onFrames && (this.frames = t = this.options.onFrames(this), this.log("modified frames", t)), void 0 !== t)) {
12357
12371
  this.log("animate", [t, i]), s = true, this.webAnimation = this.element.animate(t, i);
12358
12372
  const e = this.getController();
12359
12373
  e?.add(this);
@@ -13776,7 +13790,7 @@
13776
13790
 
13777
13791
  function format(date, fallback) {
13778
13792
  if (!(date instanceof Date)) date = new Date(+date);
13779
- if (isNaN(date)) return "string" === "function" ? fallback(date) : fallback;
13793
+ if (isNaN(date)) return typeof fallback === "function" ? fallback(date) : fallback;
13780
13794
  const hours = date.getUTCHours();
13781
13795
  const minutes = date.getUTCMinutes();
13782
13796
  const seconds = date.getUTCSeconds();
@@ -13792,7 +13806,7 @@
13792
13806
 
13793
13807
  const re = /^(?:[-+]\d{2})?\d{4}(?:-\d{2}(?:-\d{2})?)?(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d{3})?)?(?:Z|[-+]\d{2}:?\d{2})?)?$/;
13794
13808
  function parse(string, fallback) {
13795
- if (!re.test(string += "")) return "undefined" === "function" ? fallback(string) : fallback;
13809
+ if (!re.test(string += "")) return typeof fallback === "function" ? fallback(string) : fallback;
13796
13810
  return new Date(string);
13797
13811
  }
13798
13812
 
@@ -14000,7 +14014,10 @@
14000
14014
  : isArrowVector(data) ? maybeTypedArrowify(data, type) : data instanceof type ? data : type.from(data, isNumberType(type) && !isNumberArray(data) ? coerceNumber : undefined);
14001
14015
  }
14002
14016
  function maybeTypedArrowify(vector, type) {
14003
- return vector == null ? vector : (type === undefined || type === Array) && isArrowDateType(vector.type) ? coerceDates(vector.toArray()) : maybeTypedArrayify(vector.toArray(), type);
14017
+ return vector == null ? vector : (type === undefined || type === Array) && isArrowDateType(vector.type) ? coerceDates(vectorToArray(vector)) : maybeTypedArrayify(vectorToArray(vector), type);
14018
+ }
14019
+ function vectorToArray(vector) {
14020
+ return vector.nullCount ? vector.toJSON() : vector.toArray();
14004
14021
  }
14005
14022
  const singleton = [null]; // for data-less decoration marks, e.g. frame
14006
14023
  const field = name => d => {
@@ -14093,11 +14110,24 @@
14093
14110
  function arrayify(values) {
14094
14111
  if (values == null || isArray(values)) return values;
14095
14112
  if (isArrowVector(values)) return maybeTypedArrowify(values);
14096
- switch (values.type) {
14113
+ if (isGeoJSON(values)) {
14114
+ switch (values.type) {
14115
+ case "FeatureCollection":
14116
+ return values.features;
14117
+ case "GeometryCollection":
14118
+ return values.geometries;
14119
+ default:
14120
+ return [values];
14121
+ }
14122
+ }
14123
+ return Array.from(values);
14124
+ }
14125
+
14126
+ // Duck typing test for GeoJSON
14127
+ function isGeoJSON(x) {
14128
+ switch (x?.type) {
14097
14129
  case "FeatureCollection":
14098
- return values.features;
14099
14130
  case "GeometryCollection":
14100
- return values.geometries;
14101
14131
  case "Feature":
14102
14132
  case "LineString":
14103
14133
  case "MultiLineString":
@@ -14106,9 +14136,10 @@
14106
14136
  case "Point":
14107
14137
  case "Polygon":
14108
14138
  case "Sphere":
14109
- return [values];
14139
+ return true;
14140
+ default:
14141
+ return false;
14110
14142
  }
14111
- return Array.from(values);
14112
14143
  }
14113
14144
 
14114
14145
  // An optimization of type.from(values, f): if the given values are already an
@@ -14490,11 +14521,13 @@
14490
14521
  function maybeNamed(things) {
14491
14522
  return isIterable(things) ? named(things) : things;
14492
14523
  }
14493
-
14494
- // TODO Accept other types of clips (paths, urls, x, y, other marks…)?
14495
- // https://github.com/observablehq/plot/issues/181
14496
14524
  function maybeClip(clip) {
14497
- if (clip === true) clip = "frame";else if (clip === false) clip = null;else if (clip != null) clip = keyword(clip, "clip", ["frame", "sphere"]);
14525
+ if (clip === true) clip = "frame";else if (clip === false) clip = null;else if (!isGeoJSON(clip) && clip != null) {
14526
+ clip = keyword(clip, "clip", ["frame", "sphere"]);
14527
+ if (clip === "sphere") clip = {
14528
+ type: "Sphere"
14529
+ };
14530
+ }
14498
14531
  return clip;
14499
14532
  }
14500
14533
 
@@ -14947,7 +14980,7 @@
14947
14980
  reduceIndex(I, X) {
14948
14981
  const n = 5;
14949
14982
  const groups = sort$1(rollup(I, V => V.length, i => X[i]), second);
14950
- const top = groups.slice(-5).reverse();
14983
+ const top = groups.slice(-n).reverse();
14951
14984
  if (top.length < groups.length) {
14952
14985
  const bottom = groups.slice(0, 1 - n);
14953
14986
  top[n - 1] = [`… ${bottom.length.toLocaleString("en-US")} more`, sum(bottom, second)];
@@ -15300,6 +15333,7 @@
15300
15333
  interpolate = registry.get(key) === color ? scheme == null && range !== undefined ? interpolateRgb : quantitativeScheme(scheme !== undefined ? scheme : type === "cyclical" ? "rainbow" : "turbo") : round ? interpolateRound : interpolateNumber,
15301
15334
  reverse: reverse$1
15302
15335
  }) {
15336
+ domain = maybeRepeat(domain);
15303
15337
  interval = maybeRangeInterval(interval, type);
15304
15338
  if (type === "cyclical" || type === "sequential") type = "linear"; // shorthand for color schemes
15305
15339
  if (typeof interpolate !== "function") interpolate = maybeInterpolator(interpolate); // named interpolator
@@ -15308,8 +15342,8 @@
15308
15342
  // If an explicit range is specified, and it has a different length than the
15309
15343
  // domain, then redistribute the range using a piecewise interpolator.
15310
15344
  if (range !== undefined) {
15311
- const n = (domain = arrayify(domain)).length;
15312
- const m = (range = arrayify(range)).length;
15345
+ const n = domain.length;
15346
+ const m = (range = maybeRepeat(range)).length;
15313
15347
  if (n !== m) {
15314
15348
  if (interpolate.length === 1) throw new Error("invalid piecewise interpolator"); // e.g., turbo
15315
15349
  interpolate = piecewise(interpolate, range);
@@ -15362,6 +15396,10 @@
15362
15396
  interval
15363
15397
  };
15364
15398
  }
15399
+ function maybeRepeat(values) {
15400
+ values = arrayify(values);
15401
+ return values.length >= 2 ? values : [values[0], values[0]];
15402
+ }
15365
15403
  function maybeNice(nice, type) {
15366
15404
  return nice === true ? undefined : typeof nice === "number" ? nice : maybeNiceInterval(nice, type);
15367
15405
  }
@@ -16273,10 +16311,11 @@
16273
16311
  if (kind === opacity || kind === length) return "linear";
16274
16312
  if (kind === symbol) return "ordinal";
16275
16313
 
16276
- // If the domain or range has more than two values, assume it’s ordinal. You
16277
- // can still use a “piecewise” (or “polylinear”) scale, but you must set the
16278
- // type explicitly.
16279
- if ((domain || range || []).length > 2) return asOrdinalType(kind);
16314
+ // If a domain or range is explicitly specified and doesn’t have two values,
16315
+ // assume it’s ordinal. You can still use a “piecewise” (or “polylinear”)
16316
+ // scale, but you must set the type explicitly.
16317
+ const n = (domain ?? range)?.length;
16318
+ if (n < 2 || n > 2) return asOrdinalType(kind);
16280
16319
 
16281
16320
  // Otherwise, infer the scale type from the data! Prefer the domain, if
16282
16321
  // present, over channels. (The domain and channels should be consistently
@@ -16504,14 +16543,20 @@
16504
16543
  marginTop,
16505
16544
  marginLeft
16506
16545
  }) {
16507
- return fx && fy ? ({
16508
- x,
16509
- y
16510
- }) => `translate(${fx(x) - marginLeft},${fy(y) - marginTop})` : fx ? ({
16546
+ const x = fx ? ({
16511
16547
  x
16512
- }) => `translate(${fx(x) - marginLeft},0)` : ({
16548
+ }) => fx(x) - marginLeft : () => 0;
16549
+ const y = fy ? ({
16513
16550
  y
16514
- }) => `translate(0,${fy(y) - marginTop})`;
16551
+ }) => fy(y) - marginTop : () => 0;
16552
+ return function (d) {
16553
+ if (this.tagName === "svg") {
16554
+ this.setAttribute("x", x(d));
16555
+ this.setAttribute("y", y(d));
16556
+ } else {
16557
+ this.setAttribute("transform", `translate(${x(d)},${y(d)})`);
16558
+ }
16559
+ };
16515
16560
  }
16516
16561
 
16517
16562
  // Returns an index that for each facet lists all the elements present in other
@@ -16962,6 +17007,23 @@
16962
17007
  return [x, y];
16963
17008
  }
16964
17009
 
17010
+ // If no projection is specified, default to a projection that passes points
17011
+ // through the x and y scales, if any.
17012
+ function xyProjection({
17013
+ x: X,
17014
+ y: Y
17015
+ }) {
17016
+ if (X || Y) {
17017
+ X ??= x => x;
17018
+ Y ??= y => y;
17019
+ return geoTransform({
17020
+ point(x, y) {
17021
+ this.stream.point(X(x), Y(y));
17022
+ }
17023
+ });
17024
+ }
17025
+ }
17026
+
16965
17027
  function createContext(options = {}) {
16966
17028
  const {
16967
17029
  document = typeof window !== "undefined" ? window.document : undefined,
@@ -17346,26 +17408,20 @@
17346
17408
  const {
17347
17409
  clip = context.clip
17348
17410
  } = mark;
17349
- switch (clip) {
17350
- case "frame":
17351
- {
17352
- // Wrap the G element with another (untransformed) G element, applying the
17353
- // clip to the parent G element so that the clip path is not affected by
17354
- // the mark’s transform. To simplify the adoption of this fix, mutate the
17355
- // passed-in selection.node to return the parent G element.
17356
- selection = create("svg:g", context).each(function () {
17357
- this.appendChild(selection.node());
17358
- selection.node = () => this; // Note: mutation!
17359
- });
17360
- clipUrl = getFrameClip(context, dimensions);
17361
- break;
17362
- }
17363
- case "sphere":
17364
- {
17365
- clipUrl = getProjectionClip(context);
17366
- break;
17367
- }
17411
+ if (clip === "frame") {
17412
+ // Wrap the G element with another (untransformed) G element, applying the
17413
+ // clip to the parent G element so that the clip path is not affected by
17414
+ // the mark’s transform. To simplify the adoption of this fix, mutate the
17415
+ // passed-in selection.node to return the parent G element.
17416
+ selection = create("svg:g", context).each(function () {
17417
+ this.appendChild(selection.node());
17418
+ selection.node = () => this; // Note: mutation!
17419
+ });
17420
+ clipUrl = getFrameClip(context, dimensions);
17421
+ } else if (clip) {
17422
+ clipUrl = getGeoClip(clip, context);
17368
17423
  }
17424
+
17369
17425
  // Here we’re careful to apply the ARIA attributes to the outer G element when
17370
17426
  // clipping is applied, and to apply the ARIA attributes before any other
17371
17427
  // attributes (for readability).
@@ -17397,15 +17453,21 @@
17397
17453
  } = dimensions;
17398
17454
  clipPath.append("rect").attr("x", marginLeft).attr("y", marginTop).attr("width", width - marginRight - marginLeft).attr("height", height - marginTop - marginBottom);
17399
17455
  });
17400
- const getProjectionClip = memoizeClip((clipPath, context) => {
17401
- const {
17402
- projection
17403
- } = context;
17404
- if (!projection) throw new Error(`the "sphere" clip option requires a projection`);
17405
- clipPath.append("path").attr("d", geoPath(projection)({
17406
- type: "Sphere"
17407
- }));
17408
- });
17456
+ const geoClipCache = new WeakMap();
17457
+ const sphere = {
17458
+ type: "Sphere"
17459
+ };
17460
+ function getGeoClip(geo, context) {
17461
+ let cache, url;
17462
+ if (!(cache = geoClipCache.get(context))) geoClipCache.set(context, cache = new WeakMap());
17463
+ if (geo.type === "Sphere") geo = sphere; // coalesce all spheres
17464
+ if (!(url = cache.get(geo))) {
17465
+ const id = getClipId();
17466
+ select(context.ownerSVGElement).append("clipPath").attr("id", id).append("path").attr("d", context.path()(geo));
17467
+ cache.set(geo, url = `url(#${id})`);
17468
+ }
17469
+ return url;
17470
+ }
17409
17471
 
17410
17472
  // Note: may mutate selection.node!
17411
17473
  function applyIndirectStyles(selection, mark, dimensions, context) {
@@ -17584,7 +17646,7 @@
17584
17646
  this.marginLeft = +marginLeft;
17585
17647
  this.clip = maybeClip(clip);
17586
17648
  this.tip = maybeTip(tip);
17587
- this.className = className ? maybeClassName(className) : null;
17649
+ this.className = string(className);
17588
17650
  // Super-faceting currently disallow position channels; in the future, we
17589
17651
  // could allow position to be specified in fx and fy in addition to (or
17590
17652
  // instead of) x and y.
@@ -19356,6 +19418,7 @@
19356
19418
  labelAnchor,
19357
19419
  labelArrow,
19358
19420
  labelOffset,
19421
+ ariaLabel = `${k}-axis`,
19359
19422
  ...options
19360
19423
  }) {
19361
19424
  tickSize = number(tickSize);
@@ -19371,6 +19434,7 @@
19371
19434
  tickPadding,
19372
19435
  tickRotate,
19373
19436
  x,
19437
+ ariaLabel,
19374
19438
  ...options
19375
19439
  }) : null, !isNoneish(fill) ? axisTextKy(k, anchor, data, {
19376
19440
  fill,
@@ -19387,6 +19451,7 @@
19387
19451
  marginRight,
19388
19452
  marginBottom,
19389
19453
  marginLeft,
19454
+ ariaLabel,
19390
19455
  ...options
19391
19456
  }) : null, !isNoneish(fill) && label !== null ? text([], labelOptions({
19392
19457
  fill,
@@ -19415,7 +19480,7 @@
19415
19480
  }
19416
19481
  this.dy = cla === "top" ? 3 - marginTop : cla === "bottom" ? marginBottom - 3 : 0;
19417
19482
  this.dx = anchor === "right" ? clo : -clo;
19418
- this.ariaLabel = `${k}-axis label`;
19483
+ this.ariaLabel = `${ariaLabel} label`;
19419
19484
  return {
19420
19485
  facets: [[0]],
19421
19486
  channels: {
@@ -19456,6 +19521,7 @@
19456
19521
  labelAnchor,
19457
19522
  labelArrow,
19458
19523
  labelOffset,
19524
+ ariaLabel = `${k}-axis`,
19459
19525
  ...options
19460
19526
  }) {
19461
19527
  tickSize = number(tickSize);
@@ -19471,6 +19537,7 @@
19471
19537
  tickPadding,
19472
19538
  tickRotate,
19473
19539
  y,
19540
+ ariaLabel,
19474
19541
  ...options
19475
19542
  }) : null, !isNoneish(fill) ? axisTextKx(k, anchor, data, {
19476
19543
  fill,
@@ -19487,6 +19554,7 @@
19487
19554
  marginRight,
19488
19555
  marginBottom,
19489
19556
  marginLeft,
19557
+ ariaLabel,
19490
19558
  ...options
19491
19559
  }) : null, !isNoneish(fill) && label !== null ? text([], labelOptions({
19492
19560
  fill,
@@ -19512,7 +19580,7 @@
19512
19580
  this.lineAnchor = anchor;
19513
19581
  this.dy = anchor === "top" ? -clo : clo;
19514
19582
  this.dx = cla === "right" ? marginRight - 3 : cla === "left" ? 3 - marginLeft : 0;
19515
- this.ariaLabel = `${k}-axis label`;
19583
+ this.ariaLabel = `${ariaLabel} label`;
19516
19584
  return {
19517
19585
  facets: [[0]],
19518
19586
  channels: {
@@ -19540,10 +19608,11 @@
19540
19608
  insetRight = inset,
19541
19609
  dx = 0,
19542
19610
  y = k === "y" ? undefined : null,
19611
+ ariaLabel,
19543
19612
  ...options
19544
19613
  }) {
19545
19614
  return axisMark(vectorY, k, data, {
19546
- ariaLabel: `${k}-axis tick`,
19615
+ ariaLabel: `${ariaLabel} tick`,
19547
19616
  ariaHidden: true
19548
19617
  }, {
19549
19618
  strokeWidth,
@@ -19571,10 +19640,11 @@
19571
19640
  insetBottom = inset,
19572
19641
  dy = 0,
19573
19642
  x = k === "x" ? undefined : null,
19643
+ ariaLabel,
19574
19644
  ...options
19575
19645
  }) {
19576
19646
  return axisMark(vectorX, k, data, {
19577
- ariaLabel: `${k}-axis tick`,
19647
+ ariaLabel: `${ariaLabel} tick`,
19578
19648
  ariaHidden: true
19579
19649
  }, {
19580
19650
  strokeWidth,
@@ -19604,11 +19674,12 @@
19604
19674
  insetLeft = inset,
19605
19675
  insetRight = inset,
19606
19676
  dx = 0,
19677
+ ariaLabel,
19607
19678
  y = k === "y" ? undefined : null,
19608
19679
  ...options
19609
19680
  }) {
19610
19681
  return axisMark(textY, k, data, {
19611
- ariaLabel: `${k}-axis tick label`
19682
+ ariaLabel: `${ariaLabel} tick label`
19612
19683
  }, {
19613
19684
  facetAnchor,
19614
19685
  frameAnchor,
@@ -19640,10 +19711,11 @@
19640
19711
  insetBottom = inset,
19641
19712
  dy = 0,
19642
19713
  x = k === "x" ? undefined : null,
19714
+ ariaLabel,
19643
19715
  ...options
19644
19716
  }) {
19645
19717
  return axisMark(textX, k, data, {
19646
- ariaLabel: `${k}-axis tick label`
19718
+ ariaLabel: `${ariaLabel} tick label`
19647
19719
  }, {
19648
19720
  facetAnchor,
19649
19721
  frameAnchor,
@@ -19681,11 +19753,13 @@
19681
19753
  x = null,
19682
19754
  x1 = anchor === "left" ? x : null,
19683
19755
  x2 = anchor === "right" ? x : null,
19756
+ ariaLabel = `${k}-grid`,
19757
+ ariaHidden = true,
19684
19758
  ...options
19685
19759
  }) {
19686
19760
  return axisMark(ruleY, k, data, {
19687
- ariaLabel: `${k}-grid`,
19688
- ariaHidden: true
19761
+ ariaLabel,
19762
+ ariaHidden
19689
19763
  }, {
19690
19764
  y,
19691
19765
  x1,
@@ -19698,11 +19772,13 @@
19698
19772
  y = null,
19699
19773
  y1 = anchor === "top" ? y : null,
19700
19774
  y2 = anchor === "bottom" ? y : null,
19775
+ ariaLabel = `${k}-grid`,
19776
+ ariaHidden = true,
19701
19777
  ...options
19702
19778
  }) {
19703
19779
  return axisMark(ruleX, k, data, {
19704
- ariaLabel: `${k}-grid`,
19705
- ariaHidden: true
19780
+ ariaLabel,
19781
+ ariaHidden
19706
19782
  }, {
19707
19783
  x,
19708
19784
  y1,
@@ -19892,7 +19968,7 @@
19892
19968
  // possible, or the default ISO format (2014-01-26). TODO We need a better way
19893
19969
  // to infer whether the ordinal scale is UTC or local time.
19894
19970
  function inferTickFormat(scale, data, ticks, tickFormat, anchor) {
19895
- return typeof tickFormat === "function" && !(scale.type === "log" && scale.tickFormat) ? tickFormat : tickFormat === undefined && data && isTemporal(data) ? inferTimeFormat(scale.type, data, anchor) ?? formatDefault : scale.tickFormat ? scale.tickFormat(typeof ticks === "number" ? ticks : null, tickFormat) : tickFormat === undefined ? formatDefault : typeof tickFormat === "string" ? (isTemporal(scale.domain()) ? utcFormat : format$1)(tickFormat) : constant(tickFormat);
19971
+ return typeof tickFormat === "function" && !(scale.type === "log" && scale.tickFormat) ? tickFormat : tickFormat === undefined && data && isTemporal(data) ? inferTimeFormat(scale.type, data, anchor) ?? formatDefault : scale.tickFormat ? scale.tickFormat(typeof ticks === "number" ? ticks : null, tickFormat) : typeof tickFormat === "string" && scale.domain().length > 0 ? (isTemporal(scale.domain()) ? utcFormat : format$1)(tickFormat) : tickFormat === undefined ? formatDefault : constant(tickFormat);
19896
19972
  }
19897
19973
  function inclusiveRange(interval, min, max) {
19898
19974
  return interval.range(min, interval.offset(interval.floor(max)));
@@ -20143,10 +20219,10 @@ ${extraStyle}`)).style("margin-left", marginLeft ? `${+marginLeft}px` : null).st
20143
20219
  return legends;
20144
20220
  }
20145
20221
 
20146
- function maybeIdentityY(options = {}) {
20222
+ function maybeIdentityY(options = {}, k = "y") {
20147
20223
  return hasY(options) ? options : {
20148
20224
  ...options,
20149
- y: identity$1
20225
+ [k]: identity$1
20150
20226
  };
20151
20227
  }
20152
20228
 
@@ -21373,6 +21449,11 @@ ${extraStyle}`)).style("margin-left", marginLeft ? `${+marginLeft}px` : null).st
21373
21449
  context.className = className;
21374
21450
  context.projection = createProjection(options, subdimensions);
21375
21451
 
21452
+ // A path generator for marks that want to draw GeoJSON.
21453
+ context.path = function () {
21454
+ return geoPath(this.projection ?? xyProjection(scales));
21455
+ };
21456
+
21376
21457
  // Allows e.g. the axis mark to determine faceting lazily.
21377
21458
  context.filterFacets = (data, channels) => {
21378
21459
  return facetFilter(facets, {
@@ -21398,7 +21479,7 @@ ${extraStyle}`)).style("margin-left", marginLeft ? `${+marginLeft}px` : null).st
21398
21479
  context.dispatchValue = value => {
21399
21480
  if (figure.value === value) return;
21400
21481
  figure.value = value;
21401
- figure.dispatchEvent(new Event("input", {
21482
+ figure.dispatchEvent(new context.document.defaultView.Event("input", {
21402
21483
  bubbles: true
21403
21484
  }));
21404
21485
  };
@@ -21544,7 +21625,7 @@ ${extraStyle}`)).style("margin-left", marginLeft ? `${+marginLeft}px` : null).st
21544
21625
  }
21545
21626
  }
21546
21627
  }
21547
- g?.selectChildren().attr("transform", facetTranslate);
21628
+ g?.selectChildren().each(facetTranslate);
21548
21629
  }
21549
21630
  }
21550
21631
 
@@ -22704,11 +22785,10 @@ ${extraStyle}`)).style("margin-left", marginLeft ? `${+marginLeft}px` : null).st
22704
22785
  const {
22705
22786
  curve
22706
22787
  } = this;
22707
- return create("svg:g", context).call(applyIndirectStyles, this, dimensions, context).call(applyTransform, this, scales).call(g => g.selectAll().data(groupIndex(index, [X, Y], this, channels)).enter().append("path").call(applyDirectStyles, this).call(applyGroupedChannelStyles, this, channels).call(applyGroupedMarkers, this, channels, context).attr("d", curve === curveAuto && context.projection ? sphereLine(context.projection, X, Y) : shapeLine().curve(curve).defined(i => i >= 0).x(i => X[i]).y(i => Y[i]))).node();
22788
+ return create("svg:g", context).call(applyIndirectStyles, this, dimensions, context).call(applyTransform, this, scales).call(g => g.selectAll().data(groupIndex(index, [X, Y], this, channels)).enter().append("path").call(applyDirectStyles, this).call(applyGroupedChannelStyles, this, channels).call(applyGroupedMarkers, this, channels, context).attr("d", curve === curveAuto && context.projection ? sphereLine(context.path(), X, Y) : shapeLine().curve(curve).defined(i => i >= 0).x(i => X[i]).y(i => Y[i]))).node();
22708
22789
  }
22709
22790
  }
22710
- function sphereLine(projection, X, Y) {
22711
- const path = geoPath(projection);
22791
+ function sphereLine(path, X, Y) {
22712
22792
  X = coerceNumbers(X);
22713
22793
  Y = coerceNumbers(Y);
22714
22794
  return I => {
@@ -22774,7 +22854,7 @@ ${extraStyle}`)).style("margin-left", marginLeft ? `${+marginLeft}px` : null).st
22774
22854
  };
22775
22855
  }
22776
22856
 
22777
- var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIGRpc3RyaWJ1dGlvbnMkMSA9IHtleHBvcnRzOiB7fX07CgogIHZhciBkaXN0cmlidXRpb25zID0gZGlzdHJpYnV0aW9ucyQxLmV4cG9ydHM7CiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKCiAgICAvLyBBIG51bWJlciBvZiBsb2cgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbnMgKFBERikuIE5hbWluZyBhbmQgcGFyYW1ldGVyaXphdGlvbgogICAgLy8gc2hvdWxkIG1hdGNoIFIncywgZXhjZXB0IGZvciB0aGF0IGFsbCBmdW5jdGlvbnMgcmVzaWRlIGluIGFuIGxkIG9iamVjdCAoCiAgICAvLyBhcyBpbiAibG9nIGRlbnNpdHkiKSwgc28gdG8gZ2V0IGEgbm9ybWFsIGxvZyBkZW5zaXR5IHlvdSB3b3VsZCB3cml0ZQogICAgLy8gbGQubm9ybSguLi4pLgogICAgLy8gTW9zdCBvZiB0aGUgY29kZSBiZWxvdyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBncmVhdCBKc3RhdCBwcm9qZWN0CiAgICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0Lykgd2hpY2ggaW5jbHVkZXMgUERGIGZvciBtYW55IGNvbW1vbiBwcm9iYWJpbGl0eQogICAgLy8gZGlzdHJpYnV0aW9ucy4gV2hhdCBJIGhhdmUgZG9uZSBpcyBvbmx5IHRvIGNvbnZlcnQgdGhlc2UgdG8gbG9nIFBERnMuCgogICAgLyoKICAgIE9yaWdpbmFsIHdvcmsgQ29weXJpZ2h0IChjKSAyMDEzIGpTdGF0CiAgICBNb2RpZmllZCB3b3JrIENvcHlyaWdodCAoYykgMjAxNSBSYXNtdXMgQsOlw6V0aCAKICAgIAlQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAgICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAogICAgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwogICAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogICAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiAgICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogICAgCVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCiAgICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICAgIAlUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogICAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICAgIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCiAgICBUSEUgU09GVFdBUkUuCiAgICAJKi8KCiAgICAvLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbToKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanMKICAgIC8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLAogICAgLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuCiAgICAvLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWwKICAgIC8vIG9iamVjdCBsZCAuCiAgICAoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHsKICAgICAgaWYgKG1vZHVsZS5leHBvcnRzKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsCiAgICAgICAgLy8gbGlrZSBOb2RlLgogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpCiAgICAgICAgcm9vdC5sZCA9IGZhY3RvcnkoKTsKICAgICAgfQogICAgfSkoZGlzdHJpYnV0aW9ucywgZnVuY3Rpb24gKCkgewogICAgICAvLyBPYmplY3QgdG8gaG9sZCB0aGUgZnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkLgogICAgICB2YXIgbGQgPSB7fTsKCiAgICAgIC8vLy8vLy8vLy8gSGVscGVyIGZ1bmN0aW9ucyAvLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICB2YXIgbGdhbW1hID0gZnVuY3Rpb24gKHgpIHsKICAgICAgICB2YXIgaiA9IDA7CiAgICAgICAgdmFyIGNvZiA9IFs3Ni4xODAwOTE3Mjk0NzE0NiwgLTg2LjUwNTMyMDMyOTQxNjc4LCAyNC4wMTQwOTgyNDA4MzA5MSwgLTEuMjMxNzM5NTcyNDUwMTU1LCAwLjEyMDg2NTA5NzM4NjYxNzllLTIsIC01Mzk1MjM5Mzg0OTUzZS0xOF07CiAgICAgICAgdmFyIHNlciA9IDEuMDAwMDAwMDAwMTkwMDE1OwogICAgICAgIHZhciB4eCwgeSwgdG1wOwogICAgICAgIHRtcCA9ICh5ID0geHggPSB4KSArIDUuNTsKICAgICAgICB0bXAgLT0gKHh4ICsgMC41KSAqIGxvZyh0bXApOwogICAgICAgIGZvciAoOyBqIDwgNjsgaisrKSBzZXIgKz0gY29mW2pdIC8gKyt5OwogICAgICAgIHJldHVybiBsb2coMi41MDY2MjgyNzQ2MzEwMDA1ICogc2VyIC8geHgpIC0gdG1wOwogICAgICB9OwogICAgICBsZC5sZ2FtbWEgPSBsZ2FtbWE7CiAgICAgIHZhciBsZmFjdG9yaWFsID0gZnVuY3Rpb24gKG4pIHsKICAgICAgICByZXR1cm4gbiA8IDAgPyBOYU4gOiBsZ2FtbWEobiArIDEpOwogICAgICB9OwogICAgICBsZC5sZmFjdG9yaWFsID0gbGZhY3RvcmlhbDsKICAgICAgdmFyIGxjaG9vc2UgPSBmdW5jdGlvbiAobiwgaykgewogICAgICAgIHJldHVybiBsZmFjdG9yaWFsKG4pIC0gbGZhY3RvcmlhbChrKSAtIGxmYWN0b3JpYWwobiAtIGspOwogICAgICB9OwogICAgICBsZC5sY2hvb3NlID0gbGNob29zZTsKICAgICAgdmFyIGxiZXRhID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICByZXR1cm4gbGdhbW1hKGEpICsgbGdhbW1hKGIpIC0gbGdhbW1hKGEgKyBiKTsKICAgICAgfTsKICAgICAgbGQubGJldGEgPSBsYmV0YTsKICAgICAgdmFyIGxvZyA9IE1hdGgubG9nOwogICAgICB2YXIgZXhwID0gTWF0aC5leHA7CiAgICAgIHZhciBhYnMgPSBNYXRoLmFiczsKICAgICAgdmFyIHBvdyA9IE1hdGgucG93OwogICAgICB2YXIgc3FydCA9IE1hdGguc3FydDsKICAgICAgdmFyIHBpID0gTWF0aC5QSTsKCiAgICAgIC8vLy8vLy8vLy8gQ29udGlub3VzIGRpc3RyaWJ1dGlvbnMgLy8vLy8vLy8vLwogICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIGxkLmJldGEgPSBmdW5jdGlvbiAoeCwgc2hhcGUxLCBzaGFwZTIpIHsKICAgICAgICBpZiAoeCA+IDEgfHwgeCA8IDApIHsKICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7CiAgICAgICAgfQogICAgICAgIGlmIChzaGFwZTEgPT09IDEgJiYgc2hhcGUyID09PSAxKSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIChzaGFwZTEgLSAxKSAqIGxvZyh4KSArIChzaGFwZTIgLSAxKSAqIGxvZygxIC0geCkgLSBsYmV0YShzaGFwZTEsIHNoYXBlMik7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZC5jYXVjaHkgPSBmdW5jdGlvbiAoeCwgbG9jYXRpb24sIHNjYWxlKSB7CiAgICAgICAgcmV0dXJuIGxvZyhzY2FsZSkgLSBsb2cocG93KHggLSBsb2NhdGlvbiwgMikgKyBwb3coc2NhbGUsIDIpKSAtIGxvZyhwaSk7CiAgICAgIH07CiAgICAgIGxkLm5vcm0gPSBmdW5jdGlvbiAoeCwgbWVhbiwgc2QpIHsKICAgICAgICByZXR1cm4gLTAuNSAqIGxvZygyICogcGkpIC0gbG9nKHNkKSAtIHBvdyh4IC0gbWVhbiwgMikgLyAoMiAqIHNkICogc2QpOwogICAgICB9OwoKICAgICAgLy8gQSBiaXZhcmlhdGUgTm9ybWFsIGRpc3RyaWJ1dGlvbiBwYXJhbWV0ZXJpemVkIGJ5IGFycmF5cyBvZiB0d28gbWVhbnMgYW5kIFNEcywgYW5kIAogICAgICAvLyB0aGUgY29ycmVsYXRpb24uCiAgICAgIGxkLmJpdmFybm9ybSA9IGZ1bmN0aW9uICh4LCBtZWFuLCBzZCwgY29ycikgewogICAgICAgIHZhciB6ID0gcG93KHhbMF0gLSBtZWFuWzBdLCAyKSAvIHBvdyhzZFswXSwgMikgKyBwb3coeFsxXSAtIG1lYW5bMV0sIDIpIC8gcG93KHNkWzFdLCAyKSAtIDIgKiBjb3JyICogKHhbMF0gLSBtZWFuWzBdKSAqICh4WzFdIC0gbWVhblsxXSkgLyAoc2RbMF0gKiBzZFsxXSk7CiAgICAgICAgdmFyIG5vcm1hbGl6aW5nX2ZhY3RvciA9IC0obG9nKDIpICsgbG9nKHBpKSArIGxvZyhzZFswXSkgKyBsb2coc2RbMV0pICsgMC41ICogbG9nKDEgLSBwb3coY29yciwgMikpKTsKICAgICAgICB2YXIgYml2YXJfbG9nX2RlbnMgPSBub3JtYWxpemluZ19mYWN0b3IgLSB6IC8gKDIgKiAoMSAtIHBvdyhjb3JyLCAyKSkpOwogICAgICAgIHJldHVybiBiaXZhcl9sb2dfZGVuczsKICAgICAgfTsKICAgICAgbGQubGFwbGFjZSA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKICAgICAgICByZXR1cm4gLWFicyh4IC0gbG9jYXRpb24pIC8gc2NhbGUgLSBsb2coMiAqIHNjYWxlKTsKICAgICAgfTsKICAgICAgbGQuZGV4cCA9IGxkLmxhcGxhY2U7CiAgICAgIGxkLmdhbW1hID0gZnVuY3Rpb24gKHgsIHNoYXBlLCByYXRlKSB7CiAgICAgICAgdmFyIHNjYWxlID0gMSAvIHJhdGU7CiAgICAgICAgaWYgKHggPCAwKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0KICAgICAgICBpZiAoeCA9PT0gMCAmJiBzaGFwZSA9PT0gMSkgewogICAgICAgICAgcmV0dXJuIC1sb2coc2NhbGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gKHNoYXBlIC0gMSkgKiBsb2coeCkgLSB4IC8gc2NhbGUgLSBsZ2FtbWEoc2hhcGUpIC0gc2hhcGUgKiBsb2coc2NhbGUpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgbGQuaW52Z2FtbWEgPSBmdW5jdGlvbiAoeCwgc2hhcGUsIHNjYWxlKSB7CiAgICAgICAgaWYgKHggPD0gMCkgewogICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIC0oc2hhcGUgKyAxKSAqIGxvZyh4KSAtIHNjYWxlIC8geCAtIGxnYW1tYShzaGFwZSkgKyBzaGFwZSAqIGxvZyhzY2FsZSk7CiAgICAgIH07CiAgICAgIGxkLmxub3JtID0gZnVuY3Rpb24gKHgsIG1lYW5sb2csIHNkbG9nKSB7CiAgICAgICAgaWYgKHggPD0gMCkgewogICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIC1sb2coeCkgLSAwLjUgKiBsb2coMiAqIHBpKSAtIGxvZyhzZGxvZykgLSBwb3cobG9nKHgpIC0gbWVhbmxvZywgMikgLyAoMiAqIHNkbG9nICogc2Rsb2cpOwogICAgICB9OwogICAgICBsZC5wYXJldG8gPSBmdW5jdGlvbiAoeCwgc2NhbGUsIHNoYXBlKSB7CiAgICAgICAgaWYgKHggPCBzY2FsZSkgewogICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxvZyhzaGFwZSkgKyBzaGFwZSAqIGxvZyhzY2FsZSkgLSAoc2hhcGUgKyAxKSAqIGxvZyh4KTsKICAgICAgfTsKICAgICAgbGQudCA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUsIGRmKSB7CiAgICAgICAgZGYgPSBkZiA+IDFlMTAwID8gMWUxMDAgOiBkZjsKICAgICAgICByZXR1cm4gbGdhbW1hKChkZiArIDEpIC8gMikgLSBsZ2FtbWEoZGYgLyAyKSAtIGxvZyhzcXJ0KHBpICogZGYpICogc2NhbGUpICsgbG9nKHBvdygxICsgMSAvIGRmICogcG93KCh4IC0gbG9jYXRpb24pIC8gc2NhbGUsIDIpLCAtKGRmICsgMSkgLyAyKSk7CiAgICAgIH07CgogICAgICAvLyBUaGlzIGlzIGEgZGlyZWN0IGphdmFzY3JpcHQgdHJhbnNsYXRpb24gb2YgdGhlIFIgY29kZSB1c2VkIHRvIGV2YWx1YXRlCiAgICAgIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIHdlaWJ1bGwgZGlzdHJpYnV0aW9uOiAKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2R3ZWlidWxsLmMKICAgICAgbGQud2VpYnVsbCA9IGZ1bmN0aW9uICh4LCBzaGFwZSwgc2NhbGUpIHsKICAgICAgICBpZiAoeCA8IDApIHJldHVybiAtSW5maW5pdHk7CiAgICAgICAgaWYgKHggPT09IDAgJiYgc2hhcGUgPCAxKSByZXR1cm4gSW5maW5pdHk7CiAgICAgICAgdmFyIHRtcDEgPSBwb3coeCAvIHNjYWxlLCBzaGFwZSAtIDEpOwogICAgICAgIHZhciB0bXAyID0gdG1wMSAqICh4IC8gc2NhbGUpOwogICAgICAgIHJldHVybiAtdG1wMiArIGxvZyhzaGFwZSAqIHRtcDEgLyBzY2FsZSk7CiAgICAgIH07CgogICAgICAvLyBUaGlzIGlzIGEgZGlyZWN0IGphdmFzY3JpcHQgdHJhbnNsYXRpb24gb2YgdGhlIFIgY29kZSB1c2VkIHRvIGV2YWx1YXRlCiAgICAgIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIGxvZ2lzdGljIGRpc3RyaWJ1dGlvbjogCiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93Y2gvci1zb3VyY2UvYmxvYi9iMTU2ZTNhNzExOTY3ZjU4MTMxZTIzYzFiMWRjMWVhOTBlMmYwYzQzL3NyYy9ubWF0aC9kbG9naXMuYwogICAgICBsZC5sb2dpcyA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKICAgICAgICB4ID0gYWJzKCh4IC0gbG9jYXRpb24pIC8gc2NhbGUpOwogICAgICAgIHZhciBlID0gZXhwKC14KTsKICAgICAgICB2YXIgZiA9IDEuMCArIGU7CiAgICAgICAgcmV0dXJuIC0oeCArIGxvZyhzY2FsZSAqIGYgKiBmKSk7CiAgICAgIH07CiAgICAgIGxkLmRpcmljaGxldCA9IGZ1bmN0aW9uICh4LCBhbHBoYSkgewogICAgICAgIHZhciBzdW1fYWxwaGEgPSAwOwogICAgICAgIHZhciBzdW1fbGdhbW1hX2FscGhhID0gMDsKICAgICAgICB2YXIgc3VtX2FscGhhX3N1Yl8xX2xvZ194ID0gMDsKICAgICAgICB2YXIgbiA9IGFscGhhLmxlbmd0aDsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgc3VtX2FscGhhICs9IGFscGhhW2ldOwogICAgICAgICAgc3VtX2xnYW1tYV9hbHBoYSArPSBsZ2FtbWEoYWxwaGFbaV0pOwogICAgICAgICAgc3VtX2FscGhhX3N1Yl8xX2xvZ194ICs9IChhbHBoYVtpXSAtIDEpICogbG9nKHhbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGdhbW1hKHN1bV9hbHBoYSkgLSBzdW1fbGdhbW1hX2FscGhhICsgc3VtX2FscGhhX3N1Yl8xX2xvZ194OwogICAgICB9OwogICAgICBsZC5leHAgPSBmdW5jdGlvbiAoeCwgcmF0ZSkgewogICAgICAgIHJldHVybiB4IDwgMCA/IC1JbmZpbml0eSA6IGxvZyhyYXRlKSAtIHJhdGUgKiB4OwogICAgICB9OwogICAgICBsZC51bmlmID0gZnVuY3Rpb24gKHgsIG1pbiwgbWF4KSB7CiAgICAgICAgcmV0dXJuIHggPCBtaW4gfHwgeCA+IG1heCA/IC1JbmZpbml0eSA6IGxvZygxIC8gKG1heCAtIG1pbikpOwogICAgICB9OwoKICAgICAgLy8vLy8vLy8vLyBEaXNjcmV0ZSBkaXN0cmlidXRpb25zIC8vLy8vLy8vLy8KICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIGxkLmJlcm4gPSBmdW5jdGlvbiAoeCwgcHJvYikgewogICAgICAgIHJldHVybiAhKHggPT09IDAgfHwgeCA9PT0gMSkgPyAtSW5maW5pdHkgOiBsb2coeCAqIHByb2IgKyAoMSAtIHgpICogKDEgLSBwcm9iKSk7CiAgICAgIH07CiAgICAgIGxkLmNhdCA9IGZ1bmN0aW9uICh4LCBwcm9icykgewogICAgICAgIGlmICh4IDwgMSB8fCB4ID4gcHJvYnMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbG9nKHByb2JzW3ggLSAxXSk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZC5iaW5vbSA9IGZ1bmN0aW9uICh4LCBzaXplLCBwcm9iKSB7CiAgICAgICAgaWYgKHggPiBzaXplIHx8IHggPCAwKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0KICAgICAgICBpZiAocHJvYiA9PT0gMCB8fCBwcm9iID09PSAxKSB7CiAgICAgICAgICByZXR1cm4gc2l6ZSAqIHByb2IgPT09IHggPyAwIDogLUluZmluaXR5OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGNob29zZShzaXplLCB4KSArIHggKiBsb2cocHJvYikgKyAoc2l6ZSAtIHgpICogbG9nKDEgLSBwcm9iKTsKICAgICAgfTsKICAgICAgbGQubmJpbm9tID0gZnVuY3Rpb24gKHgsIHNpemUsIHByb2IpIHsKICAgICAgICBpZiAoeCA8IDApIHsKICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsY2hvb3NlKHggKyBzaXplIC0gMSwgc2l6ZSAtIDEpICsgeCAqIGxvZygxIC0gcHJvYikgKyBzaXplICogbG9nKHByb2IpOwogICAgICB9OwogICAgICBsZC5oeXBlciA9IGZ1bmN0aW9uICh4LCBtLCBuLCBrKSB7CiAgICAgICAgaWYgKHggPCAwIHx8IHggPiBrKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbGNob29zZShtLCB4KSArIGxjaG9vc2UobiwgayAtIHgpIC0gbGNob29zZShtICsgbiwgayk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZC5wb2lzID0gZnVuY3Rpb24gKHgsIGxhbWJkYSkgewogICAgICAgIHJldHVybiB4IDwgMCA/IC1JbmZpbml0eSA6IGxvZyhsYW1iZGEpICogeCAtIGxhbWJkYSAtIGxmYWN0b3JpYWwoeCk7CiAgICAgIH07CiAgICAgIHJldHVybiBsZDsKICAgIH0pOwogIH0pKGRpc3RyaWJ1dGlvbnMkMSk7CiAgdmFyIGRpc3RyaWJ1dGlvbnNFeHBvcnRzID0gZGlzdHJpYnV0aW9ucyQxLmV4cG9ydHM7CgogIHZhciBtY21jJDEgPSB7ZXhwb3J0czoge319OwoKICB2YXIgbWNtYyA9IG1jbWMkMS5leHBvcnRzOwogIChmdW5jdGlvbiAobW9kdWxlKSB7CgogICAgLy8gVGhpcyBib2lsZXIgcGxhdGUgY29kZSBoZXJlIGlzIHRha2VuIGZyb206CiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzCiAgICAvLyBJdCBzaG91bGQgbWFrZSBzaHVyZSB0aGF0IG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQgYm90aCBpbiB0aGUgYnJvd3NlciwKICAgIC8vIE5vZGUsIGFuZCBieSB1c2luZyB0aGUgQXN5bmNocm9ub3VzIE1vZHVsZSBEZWZpbml0aW9uIHN0YW5kYXJkLgogICAgLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsCiAgICAvLyBvYmplY3QgbWNtYyAuCiAgICAoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHsKICAgICAgaWYgKG1vZHVsZS5leHBvcnRzKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsCiAgICAgICAgLy8gbGlrZSBOb2RlLgogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpCiAgICAgICAgcm9vdC5tY21jID0gZmFjdG9yeSgpOwogICAgICB9CiAgICB9KShtY21jLCBmdW5jdGlvbiAoKSB7CiAgICAgIC8vLyBUaGUgYWN0dWFsIG1vZHVsZSBjb2RlIHN0YXJ0cyBoZXJlIC8vLwogICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gIAoKICAgICAgLy8vLy8vLy8vLyBIZWxwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8KICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGJldHdlZW4gbWluIGFuZCBtYXggKi8KICAgICAgdmFyIHJ1bmlmID0gZnVuY3Rpb24gKG1pbiwgbWF4KSB7CiAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSArIG1pbjsKICAgICAgfTsKCiAgICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAqLwogICAgICB2YXIgcnVuaWZfZGlzY3JldGUgPSBmdW5jdGlvbiAobWluLCBtYXgpIHsKICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjsKICAgICAgfTsKCiAgICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGZyb20gYSBub3JtYWwgZGlzdHJpYmJ1dGlvbiBkZWZpbmVkCiAgICAgICAqICBieSBtZWFuIGFuZCBzZC4gCiAgICAgICAqICBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0L2pzdGF0L2Jsb2IvbWFzdGVyL3NyYy9zcGVjaWFsLmpzICovCiAgICAgIHZhciBybm9ybSA9IGZ1bmN0aW9uIChtZWFuLCBzZCkgewogICAgICAgIHZhciB1LCB2LCB4LCB5LCBxOwogICAgICAgIGRvIHsKICAgICAgICAgIHUgPSBNYXRoLnJhbmRvbSgpOwogICAgICAgICAgdiA9IDEuNzE1NiAqIChNYXRoLnJhbmRvbSgpIC0gMC41KTsKICAgICAgICAgIHggPSB1IC0gMC40NDk4NzE7CiAgICAgICAgICB5ID0gTWF0aC5hYnModikgKyAwLjM4NjU5NTsKICAgICAgICAgIHEgPSB4ICogeCArIHkgKiAoMC4xOTYwMCAqIHkgLSAwLjI1NDcyICogeCk7CiAgICAgICAgfSB3aGlsZSAocSA+IDAuMjc1OTcgJiYgKHEgPiAwLjI3ODQ2IHx8IHYgKiB2ID4gLTQgKiBNYXRoLmxvZyh1KSAqIHUgKiB1KSk7CiAgICAgICAgcmV0dXJuIHYgLyB1ICogc2QgKyBtZWFuOwogICAgICB9OwoKICAgICAgLyoqIFJldHVybnMgYSBkZWVwIGNsb25lIG9mIHNyYywgc29ydCBvZi4uLiBJdCBvbmx5IGNvcGllcyBhIGxpbWl0ZWQKICAgICAgICogbnVtYmVyIG9mIHR5cGVzIGFuZCwgZm9yIGV4YW1wbGUsIGZ1bmN0aW9uIGFyZSBub3QgY29waWVkLiAKICAgICAgICogRnJvbSBodHRwOi8vZGF2aWR3YWxzaC5uYW1lL2phdmFzY3JpcHQtY2xvbmUKICAgICAgICovCiAgICAgIHZhciBkZWVwX2Nsb25lID0gZnVuY3Rpb24gKHNyYykgewogICAgICAgIGZ1bmN0aW9uIG1peGluKGRlc3QsIHNvdXJjZSwgY29weUZ1bmMpIHsKICAgICAgICAgIHZhciBuYW1lLAogICAgICAgICAgICBzLAogICAgICAgICAgICBlbXB0eSA9IHt9OwogICAgICAgICAgZm9yIChuYW1lIGluIHNvdXJjZSkgewogICAgICAgICAgICAvLyB0aGUgKCEobmFtZSBpbiBlbXB0eSkgfHwgZW1wdHlbbmFtZV0gIT09IHMpIGNvbmRpdGlvbiBhdm9pZHMgY29weWluZyBwcm9wZXJ0aWVzIGluICJzb3VyY2UiCiAgICAgICAgICAgIC8vIGluaGVyaXRlZCBmcm9tIE9iamVjdC5wcm90b3R5cGUuCSBGb3IgZXhhbXBsZSwgaWYgZGVzdCBoYXMgYSBjdXN0b20gdG9TdHJpbmcoKSBtZXRob2QsCiAgICAgICAgICAgIC8vIGRvbid0IG92ZXJ3cml0ZSBpdCB3aXRoIHRoZSB0b1N0cmluZygpIG1ldGhvZCB0aGF0IHNvdXJjZSBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG90eXBlCiAgICAgICAgICAgIHMgPSBzb3VyY2VbbmFtZV07CiAgICAgICAgICAgIGlmICghKG5hbWUgaW4gZGVzdCkgfHwgZGVzdFtuYW1lXSAhPT0gcyAmJiAoIShuYW1lIGluIGVtcHR5KSB8fCBlbXB0eVtuYW1lXSAhPT0gcykpIHsKICAgICAgICAgICAgICBkZXN0W25hbWVdID0gY29weUZ1bmMgPyBjb3B5RnVuYyhzKSA6IHM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBkZXN0OwogICAgICAgIH0KICAgICAgICBpZiAoIXNyYyB8fCB0eXBlb2Ygc3JjICE9ICJvYmplY3QiIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzcmMpID09PSAiW29iamVjdCBGdW5jdGlvbl0iKSB7CiAgICAgICAgICAvLyBudWxsLCB1bmRlZmluZWQsIGFueSBub24tb2JqZWN0LCBvciBmdW5jdGlvbgogICAgICAgICAgcmV0dXJuIHNyYzsgLy8gYW55dGhpbmcKICAgICAgICB9CiAgICAgICAgaWYgKHNyYy5ub2RlVHlwZSAmJiAiY2xvbmVOb2RlIiBpbiBzcmMpIHsKICAgICAgICAgIC8vIERPTSBOb2RlCiAgICAgICAgICByZXR1cm4gc3JjLmNsb25lTm9kZSh0cnVlKTsgLy8gTm9kZQogICAgICAgIH0KICAgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgRGF0ZSkgewogICAgICAgICAgLy8gRGF0ZQogICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHNyYy5nZXRUaW1lKCkpOyAvLyBEYXRlCiAgICAgICAgfQogICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgICAgIC8vIFJlZ0V4cAogICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoc3JjKTsgLy8gUmVnRXhwCiAgICAgICAgfQogICAgICAgIHZhciByLCBpLCBsOwogICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgICAgLy8gYXJyYXkKICAgICAgICAgIHIgPSBbXTsKICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBzcmMubGVuZ3RoOyBpIDwgbDsgKytpKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNyYykgewogICAgICAgICAgICAgIHIucHVzaChkZWVwX2Nsb25lKHNyY1tpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIGdlbmVyaWMgb2JqZWN0cwogICAgICAgICAgciA9IHNyYy5jb25zdHJ1Y3RvciA/IG5ldyBzcmMuY29uc3RydWN0b3IoKSA6IHt9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWl4aW4ociwgc3JjLCBkZWVwX2Nsb25lKTsKICAgICAgfTsKCiAgICAgIC8qKiBTcGVjaWFsaXplZCBjbG9uZSBmdW5jdGlvbiB0aGF0IG9ubHkgY2xvbmVzIHNjYWxhcnMgYW5kIG5lc3RlZCBhcnJheXMgd2hlcmUKICAgICAgICogZWFjaCBhcnJheSBlaXRoZXIgY29uc2lzdHMgb2YgYWxsIGFycmF5cyBvciBhbGwgbnVtYmVycy4gVGhpcyBmdW5jdGlvbgogICAgICAgKiBpcyBtZWFudCBhcyBhIGZhc3Qgd2F5IG9mIGNsb25pbmcgcGFyYW1ldGVyIGRyYXdzIHdpdGhpbiB0aGUgbWNtYyBzYW1wbGluZwogICAgICAgKiBsb29wLgogICAgICAgKi8KICAgICAgdmFyIGNsb25lX3BhcmFtX2RyYXcgPSBmdW5jdGlvbiAoeCkgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh4WzBdKSkgewogICAgICAgICAgICAvLyB4IGlzIGFuIGFycmF5IG9mIGFycmF5cyBzbyB3ZSBuZWVkIHRvIGNsb25lIGl0IHJlY3Vyc2l2ZWx5CiAgICAgICAgICAgIHZhciB4X2NvcHkgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICB4X2NvcHkucHVzaChjbG9uZV9wYXJhbV9kcmF3KHhbaV0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geF9jb3B5OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBhcnJheXMgb2Ygc2NhbGFycwogICAgICAgICAgICByZXR1cm4geC5zbGljZSgwKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBzY2FsYXIKICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIGEgbnVtYmVyLgogICAgICAgKi8KICAgICAgdmFyIGlzX251bWJlciA9IGZ1bmN0aW9uIChvYmplY3QpIHsKICAgICAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PSAibnVtYmVyIiB8fCB0eXBlb2Ygb2JqZWN0ID09ICJvYmplY3QiICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgKHBvc3NpYmx5IG11bHRpZGltZW5zaW9uYWwvbmVzdGVkKSBhcnJheS4KICAgICAgICogQHBhcmFtIGRpbSAtIEFuIGFycmF5IGdpdmluZyB0aGUgZGltZW5zaW9uIG9mIHRoZSBhcnJheS4gRm9yIGV4YW1wbGUsCiAgICAgICAqICAgWzVdIHdvdWxkIHlpZWxkIGEgNSBlbGVtZW50IGFycmF5LCBhbmQgWzMsM10gd291bGQgeWllbGQgYSAzIGJ5IDMgbWF0cml4LgogICAgICAgKiBAcGFyYW0gaW5pdCAtIEEgdmFsdWUgb3IgYSBmdW5jdGlvbiB1c2VkIHRvIGZpbGwgaW4gdGhlIGVhY2ggZWxlbWVudCBpbgogICAgICAgKiAgIHRoZSBhcnJheS4gSWYgaXQgaXMgYSBmdW5jdGlvbiBpdCBzaG91bGQgdGFrZSBubyBhcmd1bWVudHMsIGl0IHdpbGwgYmUgCiAgICAgICAqICAgZXZhbHVhdGVkIG9uY2UgZm9yIGVhY2ggZWxlbWVudCwgYW5kIGl0J3MgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZCB0bwogICAgICAgKiAgIGZpbGwgaW4gZWFjaCBlbGVtZW50LgogICAgICAgKiBAZXhhbXBsZSAKICAgICAgICogLy8gVGhlIGZvbGxvd2luZyB3b3VsZCByZXR1cm4gW1sxLDFdLFsxLDFdLFsxLDFdXQogICAgICAgKiBjcmVhdGVfYXJyYXkoWzIsM10sIDEpCiAgICAgICAqLwogICAgICB2YXIgY3JlYXRlX2FycmF5ID0gZnVuY3Rpb24gKGRpbSwgaW5pdCkgewogICAgICAgIHZhciBhcnIgPSBuZXcgQXJyYXkoZGltWzBdKTsKICAgICAgICB2YXIgaTsKICAgICAgICBpZiAoZGltLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAvLyBGaWxsIGl0IHVwIHdpdGggaW5pdAogICAgICAgICAgaWYgKHR5cGVvZiBpbml0ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewogICAgICAgICAgICAgIGFycltpXSA9IGluaXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgYXJyW2ldID0gaW5pdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZGltLmxlbmd0aCA+IDEpIHsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewogICAgICAgICAgICBhcnJbaV0gPSBjcmVhdGVfYXJyYXkoZGltLnNsaWNlKDEpLCBpbml0KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgImNyZWF0ZV9hcnJheSBjYW4ndCBjcmVhdGUgYSBkaW1lbnNpb25sZXNzIGFycmF5IjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycjsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm4gdGhlIGRpbWVuc2lvbnMgb2YgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYXMgYW4gYXJyYXkuIEZvciAKICAgICAgICogZXhhbXBsZSwgYXJyYXlfZGltKCBbWzEsIDJdLCBbMSwgMl1dICkgc2hvdWxkIHJldHVybiBbMiwgMl0KICAgICAgICogQXNzdW1lcyB0aGF0IGFsbCBhcnJheXMgaW5zaWRlIGFub3RoZXIgYXJyYXkgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aC4KICAgICAgICogQGV4YW1wbGUKICAgICAgICogLy8gU2hvdWxkIHJldHVybiBbNCwgMiwgMV0KICAgICAgICogYXJyYXlfZGltKGNyZWF0ZV9hcnJheShbNCwgMiwgMV0sIDApKQogICAgICAgKi8KICAgICAgdmFyIGFycmF5X2RpbSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYVswXSkpIHsKICAgICAgICAgIHJldHVybiBbYS5sZW5ndGhdLmNvbmNhdChhcnJheV9kaW0oYVswXSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gW2EubGVuZ3RoXTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogQ2hlY2tzIGlmIHR3byBhcnJheXMgYXJlIGVxdWFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cwogICAgICAgKiBhcyBqdWRnZWQgYnkgdGhlICI9PSIgb3BlcmF0b3IuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KICAgICAgICogQWRhcHRlZCBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0ODUzOTc0LzEwMDE4NDgKICAgICAgICovCiAgICAgIHZhciBhcnJheV9lcXVhbCA9IGZ1bmN0aW9uIChhMSwgYTIpIHsKICAgICAgICBpZiAoYTEubGVuZ3RoICE9IGEyLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5cwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYTFbaV0pICYmIEFycmF5LmlzQXJyYXkoYTJbaV0pKSB7CiAgICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byB0aGUgbmVzdGVkIGFycmF5cwogICAgICAgICAgICBpZiAoIWFycmF5X2VxdWFsKGExW2ldLCBhMltpXSkpIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0gZWxzZSBpZiAoYTFbaV0gIT0gYTJbaV0pIHsKICAgICAgICAgICAgLy8gV2FybmluZyAtIHR3byBkaWZmZXJlbnQgb2JqZWN0IGluc3RhbmNlcyB3aWxsIG5ldmVyIGJlIGVxdWFsOiB7eDoyMH0gIT0ge3g6MjB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogVHJhdmVyc2VzIGEgcG9zc2libHkgbmVzdGVkIGFycmF5IGEgYW5kIGFwcGxpZXMgZnVuIHRvIGFsbCAibGVhZiBub2RlcyIsIAogICAgICAgKiB0aGF0IGlzLCB2YWx1ZXMgdGhhdCBhcmUgbm90IGFycmF5cy4gUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaXplIGFzCiAgICAgICAqIGEuCiAgICAgICAqLwogICAgICB2YXIgbmVzdGVkX2FycmF5X2FwcGx5ID0gZnVuY3Rpb24gKGEsIGZ1bikgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KGEubGVuZ3RoKTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZXN1bHRbaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVtpXSwgZnVuKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmdW4oYSk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgLyoqIFJhbmRvbWl6aW5nIHRoZSBhcnJheSBlbGVtZW50IG9yZGVyIGluLXBsYWNlLiBVc2luZyBEdXJzdGVuZmVsZAogICAgICAgKiBzaHVmZmxlIGFsZ29yaXRobS4gQWRhcHRlZCBmcm9tIGhlcmU6IAogICAgICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMjY0Njg2NC8xMDAxODQ4CiAgICAgICAqLwogICAgICBmdW5jdGlvbiBzaHVmZmxlX2FycmF5KGFycmF5KSB7CiAgICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHsKICAgICAgICAgIHZhciBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7CiAgICAgICAgICB2YXIgdGVtcCA9IGFycmF5W2ldOwogICAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTsKICAgICAgICAgIGFycmF5W2pdID0gdGVtcDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9CgogICAgICAvKioKICAgICAgICogRG9lcyB0aGUgc2FtZSB0aGluZyBhcyBuZXN0ZWRfYXJyYXlfYXBwbHksIHRoYXQgaXMsIHRyYXZlcnNlcyBhIHBvc3NpYmx5CiAgICAgICAqIG5lc3RlZCBhcnJheSBhIGFuZCBhcHBsaWVzIGZ1biB0byBhbGwgImxlYWYgbm9kZXMiIGFuZCByZXR1cm5zIGFuIGFycmF5IAogICAgICAgKiBvZiB0aGUgc2FtZSBzaXplIGFzIGEuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseQogICAgICAgKiBicmFuY2hlcyByYW5kb21seS4KICAgICAgICovCiAgICAgIHZhciBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5ID0gZnVuY3Rpb24gKGEsIGZ1bikgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CiAgICAgICAgICB2YXIgbGVuID0gYS5sZW5ndGg7CiAgICAgICAgICB2YXIgaTsKICAgICAgICAgIHZhciBhcnJheV9pcyA9IFtdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGFycmF5X2lzW2ldID0gaTsKICAgICAgICAgIH0KICAgICAgICAgIHNodWZmbGVfYXJyYXkoYXJyYXlfaXMpOwogICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIHZhciBhcnJheV9pID0gYXJyYXlfaXNbaV07CiAgICAgICAgICAgIHJlc3VsdFthcnJheV9pXSA9IG5lc3RlZF9hcnJheV9hcHBseShhW2FycmF5X2ldLCBmdW4pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZ1bihhKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogQWxsb3dzIGEgcHJldHR5IHdheSBvZiBzZXR0aW5nIGRlZmF1bHQgb3B0aW9ucyB3aGVyZSB0aGUgZGVmdWx0cyBjYW4gYmUKICAgICAgICogb3ZlcnJpZGRlbiBieSBhbiBvcHRpb25zIG9iamVjdC4KICAgICAgICogIEBwYXJhbSBvcHRpb25fbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gYXMgYSBzdHJpbmcKICAgICAgICogIEBwYXJhbSBteV9vcHRpb25zIC0gYW4gb3B0aW9uIG9iamVjdCB0aGF0IGNvdWxkIGhhdmUgb3B0aW9uX25hbWUgCiAgICAgICAqICAgIGFzIGEgbWVtYmVyLgogICAgICAgKiBAcGFyYW0gZGVmYXVsX3ZhbHVlIC0gZGVmdWx0IHZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgaWYgb3B0aW9uX25hbWUgCiAgICAgICAqICAgaXMgbm90IGRlZmluZWQgaW4gbXlfb3B0aW9ucy4KICAgICAgICogQGV4YW1wbGUKICAgICAgICogdmFyIG15X29wdGlvbnMgPSB7cGk6IDMuMTQxNTl9CiAgICAgICAqIHZhciBwaSA9IGdldF9vcHRpb24oInBpIiwgbXlfb3B0aW9ucywgMy4xNCkKICAgICAgICovCiAgICAgIC8vIFByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuCiAgICAgIC8vIGJ5IGFuIG9wdGlvbnMgb2JqZWN0LiBGb3IgZXhhbXBsZToKICAgICAgLy8gdmFyIHBpID0gZ2V0X29wdGlvbigicGkiLCBteV9vcHRpb25zLCAzLjE0KQogICAgICB2YXIgZ2V0X29wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25fbmFtZSwgb3B0aW9ucywgZGVmYXVsX3ZhbHVlKSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgcmV0dXJuIG9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0aW9uX25hbWUpICYmIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSB1bmRlZmluZWQgJiYgb3B0aW9uc1tvcHRpb25fbmFtZV0gIT09IG51bGwgPyBvcHRpb25zW29wdGlvbl9uYW1lXSA6IGRlZmF1bF92YWx1ZTsKICAgICAgfTsKCiAgICAgIC8qKiBWZXJzaW9uIG9mIGdldF9vcHRpb24gd2hlcmUgdGhlIG9wdGlvbiBzaG91bGQgYmUgYSBvbmUgb3IgbXVsdGktZGltZW5zaW9uYWwKICAgICAgICogYXJyYXkgYW5kIHdoZXJlIHRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGVpdGhlciBieSBhIHNjYWxhciBvciBieSBhbiBhcnJheS4KICAgICAgICogSWYgaXQncyBhIHNjYWxhciB0aGUgdGhhdCBzY2FsYXIgaXMgdXNlZCB0byBpbml0aWFsaXplIGFuIGFycmF5IHdpdGggCiAgICAgICAqIGRpbSBkaW1lbnNpb25zLgogICAgICAgKiAKICAgICAgICovCiAgICAgIHZhciBnZXRfbXVsdGlkaW1fb3B0aW9uID0gZnVuY3Rpb24gKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkaW0sIGRlZmF1bF92YWx1ZSkgewogICAgICAgIHZhciB2YWx1ZSA9IGdldF9vcHRpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSk7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgdmFsdWUgPSBjcmVhdGVfYXJyYXkoZGltLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGlmICghYXJyYXlfZXF1YWwoYXJyYXlfZGltKHZhbHVlKSwgZGltKSkgewogICAgICAgICAgdGhyb3cgIlRoZSBvcHRpb24gIiArIG9wdGlvbl9uYW1lICsgIiBpcyBvZiBkaW1lbnNpb24gWyIgKyBhcnJheV9kaW0odmFsdWUpICsgIl0gYnV0IHNob3VsZCBiZSBbIiArIGRpbSArICJdLiI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfTsKCiAgICAgIC8vLy8vLy8vLy8gRnVuY3Rpb25zIGZvciBoYW5kbGluZyBwYXJhbWV0ZXIgb2JqZWN0cyAvLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGZpeGVkIChzYW1lIGV2ZXJ5IHRpbWUpIG51bWJlciB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZQogICAgICAgKiBhIHBhcmFtZXRlciBvZiBhIGNlcnRhaW4gdHlwZSwgcG9zc2libHkgd2l0aCBsb3dlciBhbmQgdXBwZXIgYm91bmRzLgogICAgICAgKiBUaGUgcG9zc2lsZSB0eXBlcyBhcmUgInJlYWwiLCAiaW50IiwgYW5kICJiaW5hcnkiLgogICAgICAgKi8KICAgICAgdmFyIHBhcmFtX2luaXRfZml4ZWQgPSBmdW5jdGlvbiAodHlwZSwgbG93ZXIsIHVwcGVyKSB7CiAgICAgICAgaWYgKGxvd2VyID4gdXBwZXIpIHsKICAgICAgICAgIHRocm93ICJDYW4gbm90IGluaXRpYWxpemUgcGFyYW1ldGVyIHdoZXJlIGxvd2VyIGJvdW5kID4gdXBwZXIgYm91bmQiOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSA9PT0gInJlYWwiKSB7CiAgICAgICAgICBpZiAobG93ZXIgPT09IC1JbmZpbml0eSAmJiB1cHBlciA9PT0gSW5maW5pdHkpIHsKICAgICAgICAgICAgcmV0dXJuIDAuNTsKICAgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPT09IC1JbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gdXBwZXIgLSAwLjU7CiAgICAgICAgICB9IGVsc2UgaWYgKHVwcGVyID09PSBJbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gbG93ZXIgKyAwLjU7CiAgICAgICAgICB9IGVsc2UgaWYgKGxvd2VyIDw9IHVwcGVyKSB7CiAgICAgICAgICAgIHJldHVybiAobG93ZXIgKyB1cHBlcikgLyAyOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gImludCIpIHsKICAgICAgICAgIGlmIChsb3dlciA9PT0gLUluZmluaXR5ICYmIHVwcGVyID09PSBJbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPT09IC1JbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gdXBwZXIgLSAxOwogICAgICAgICAgfSBlbHNlIGlmICh1cHBlciA9PT0gSW5maW5pdHkpIHsKICAgICAgICAgICAgcmV0dXJuIGxvd2VyICsgMTsKICAgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPD0gdXBwZXIpIHsKICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKGxvd2VyICsgdXBwZXIpIC8gMik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAiYmluYXJ5IikgewogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIHRocm93ICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIgb2YgdHlwZSAiICsgdHlwZSArICJbIiArIGxvd2VyICsgIiwgIiArIHVwcGVyICsgIl0iOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIENvbXBsZXRlcyBwYXJhbXNfdG9fY29tcGxldGUsIGFuIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMsIAogICAgICAgKiBhbmQgaW5pdGlhbGl6ZXMgbm9uLWluaXRpYWxpemVkIHBhcmFtZXRlcnMuIFRoaXMgbW9kaWZpZWQgdmVyc2lvbiBvZgogICAgICAgKiBwYXJhbXNfdG9fY29tcGxldGUgaXMgcmV0dXJuZWQgYXMgYSBkZWVwIGNvcHkgYW5kIG5vdCBtb2RpZmllZCBpbiBwbGFjZS4KICAgICAgICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBieSBzdXBwbHlpbmcgYSBwYXJhbV9pbml0IGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlCiAgICAgICAqIGZ1bmN0aW9uKHR5cGUsIGxvd2VyLCB1cHBlcikgdGhhdCBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIG51bWJlciAKICAgICAgICogKGxpa2UgcGFyYW1faW5pdF9maXhlZCwgZm9yIGV4YW1wbGUpLgogICAgICAgKiBAZXhhbXBsZQogICAgICAgKiB2YXIgcGFyYW1zID0geyAibXUiOiB7InR5cGUiOiAicmVhbCJ9IH0KICAgICAgICogcGFyYW1zID0gY29tcGxldGVfcGFyYW1zKHBhcmFtcyk7CiAgICAgICAqIC8vIHBhcmFtcyBzaG91bGQgbm93IGJlOgogICAgICAgKiAvLyAgeyJtdSI6IHsgInR5cGUiOiAicmVhbCIsICJkaW0iOiBbMV0sICJ1cHBlciI6IEluZmluaXR5LAogICAgICAgKiAvLyAgICAgICAgICAgImxvd2VyIjogLUluZmluaXR5LCAiaW5pdCI6IDAuNSB9fQogICAgICAgKi8KICAgICAgdmFyIGNvbXBsZXRlX3BhcmFtcyA9IGZ1bmN0aW9uIChwYXJhbXNfdG9fY29tcGxldGUsIHBhcmFtX2luaXQpIHsKICAgICAgICB2YXIgcGFyYW1zID0gZGVlcF9jbG9uZShwYXJhbXNfdG9fY29tcGxldGUpOwogICAgICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gcGFyYW1zKSB7CiAgICAgICAgICBpZiAoIXBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbV9uYW1lKSkgY29udGludWU7CiAgICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbcGFyYW1fbmFtZV07CiAgICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJ0eXBlIikpIHsKICAgICAgICAgICAgcGFyYW0udHlwZSA9ICJyZWFsIjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghcGFyYW0uaGFzT3duUHJvcGVydHkoImRpbSIpKSB7CiAgICAgICAgICAgIHBhcmFtLmRpbSA9IFsxXTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc19udW1iZXIocGFyYW0uZGltKSkgewogICAgICAgICAgICBwYXJhbS5kaW0gPSBbcGFyYW0uZGltXTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJhbS50eXBlID09ICJiaW5hcnkiKSB7CiAgICAgICAgICAgIHBhcmFtLnVwcGVyID0gMTsKICAgICAgICAgICAgcGFyYW0ubG93ZXIgPSAwOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eSgidXBwZXIiKSkgewogICAgICAgICAgICBwYXJhbS51cHBlciA9IEluZmluaXR5OwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eSgibG93ZXIiKSkgewogICAgICAgICAgICBwYXJhbS5sb3dlciA9IC1JbmZpbml0eTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJhbS5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpKSB7CiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMganVzdCBhIG51bWJlciBvciBhIG5lc3RlZCBhcnJheSB3ZSBsZWF2ZSBpdCBhbG9uZSwgYnV0IGlmLi4uCiAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgdHlwZW9mIHBhcmFtLmluaXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAvLyBwYXJhbS5pbml0IGlzIGEgZnVuY3Rpb24sIHVzZSB0aGF0IHRvIGluaXRpYWxpemUgdGhlIHBhcmFtZXRlci4KICAgICAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW0uaW5pdCgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0uaW5pdCkpIHsKICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgd2hlcmUgdGhlIHBhcmFtLmluaXQgZXhpc3QgYnV0CiAgICAgICAgICAgICAgLy8gaXMgbm90IGFuIGFycmF5LiBUaGVuIGFzc3VtZSBpdCBpcyBhIG51bWJlciBvciBhIGZ1bmN0aW9uIGFuZCB1c2UKICAgICAgICAgICAgICAvLyBpdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuCiAgICAgICAgICAgICAgcGFyYW0uaW5pdCA9IGNyZWF0ZV9hcnJheShwYXJhbS5kaW0sIHBhcmFtLmluaXQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBXZSB1c2UgdGhlIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCiAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKICAgICAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJhbXM7CiAgICAgIH07CgogICAgICAvLy8vLy8vLy8vIFN0ZXBwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIC8qKgogICAgICAgKiBAaW50ZXJmYWNlCiAgICAgICAqIEEgU3RlcHBlciBpcyBhbiBvYmplY3QgcmVzcG9uc2libGUgZm9yIHB1c2hpbmcgYXJvdW5kIG9uZQogICAgICAgKiBvciBtb3JlIHBhcmFtZXRlciB2YWx1ZXMgaW4gYSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGRpc3RyaWJ1dGlvbgogICAgICAgKiBkZWZpbmVkIGJ5IHRoZSBsb2cgcG9zdGVyaW9yLiBUaGlzIGRlZmluZXMgdGhlIFN0ZXBwZXIgImludGVyZmFjZSIsCiAgICAgICAqIHdoZXJlICJpbnRlcmZhY2UiIG1lYW5zIHRoYXQgU3RlcHBlciBkZWZpbmVzIGEgY2xhc3MgdGhhdCBpcyBuZXZlcgogICAgICAgKiBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBqdXN0IHRvIGJlIHN1YmNsYXNzZWQgYnkgc3BlY2lhbGl6ZWQKICAgICAgICogc3RlcHBlciBmdW5jdGlvbnMuCiAgICAgICAqIEBpbnRlcmZhY2UKICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6CiAgICAgICAqICAgeyJtdSI6IHsgInR5cGUiOiAicmVhbCIsICJkaW0iOiBbMV0sICJ1cHBlciI6IEluZmluaXR5LCAKICAgICAgICogICAibG93ZXIiOiAtSW5maW5pdHksICJpbml0IjogMC41IH19CiAgICAgICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYmUgImNvbXBsZXRlIiwgdGhhdCBpcywKICAgICAgICogICBzcGVjaWZ5aW5nIGFsbCByZWxldmFudCBhdHRyaWJ1dGVzIHN1Y2ggYXMgZGltLCBsb3dlciBhbmQgdXBwZXIuCiAgICAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycyBpbiBwYXJhbXMKICAgICAgICogICAoYW5kIHBvc3NpYmx5IG1vcmUpLiBUaGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBnaXZlbiBhcyBrZXlzIGFuZCB0aGUgc3RhdGVzCiAgICAgICAqICAgYXMgc2NhbGFycyBvciwgcG9zc2libHkgbmVzdGVkLCBhcnJheXMuIEZvciBleGFtcGxlOgogICAgICAgKiAgIHttdTogMTAsIHNpZ21hOiA1LCBiZXRhOiBbMSwgMi41XX0KICAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiAqdGFraW5nIG5vIHBhcmFtZXRlcnMqIHRoYXQgcmV0dXJucyB0aGUKICAgICAgICogICBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBUaGF0IGlzLCB0aGUgdmFsdWUgb2YgbG9nX3Bvc3QKICAgICAgICogICBzaG91bGQgY2hhbmdlIGlmIHRoZSB0aGUgdmFsdWVzIGluIHN0YXRlIGFyZSBjaGFuZ2VkLgogICAgICAKICAgICAgICovCiAgICAgIHZhciBTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KSB7CiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwogICAgICAgIHRoaXMubG9nX3Bvc3QgPSBsb2dfcG9zdDsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBUYWtlcyBhIHN0ZXAgaW4gdGhlIHBhcmFtZXRlciBzcGFjZS4gU2hvdWxkIHJldHVybiB0aGUgbmV3IHN0YXRlLAogICAgICAgKiBidXQgaXMgbWFpbmx5IGNhbGxlZCBmb3IgaXQncyBzaWRlIGVmZmVjdCBvZiBtYWtpbmcgYSBjaGFuZ2UgaW4gdGhlCiAgICAgICAqIHN0YXRlIG9iamVjdC4KICAgICAgICovCiAgICAgIFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhyb3cgIkV2ZXJ5IFN0ZXBwZXIgbmVlZCB0byBpbXBsZW1lbnQgc3RlcCgpIjsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBJZiBpbXBsZW1lbnRlZCwgbWFrZXMgdGhlIHN0ZXBwZXIgYWRhcHQgd2hpbGUgc3RlcHBpbmcuCiAgICAgICAqLwogICAgICBTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gCiAgICAgIH07CgogICAgICAvKioKICAgICAgICogSWYgaW1wbGVtZW50ZWQsIG1ha2VzIHRoZSBzdGVwcGVyIGNlYXNlIGFkYXB0aW5nIHdoaWxlIHN0ZXBwaW5nLgogICAgICAgKi8KICAgICAgU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gCiAgICAgIH07CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmcgaW5mbyByZWdhcmRpbmcgdGhlIHN0ZXBwZXIuCiAgICAgICAqLwogICAgICBTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHN0ZXBwZXIuCiAgICAgICAgcmV0dXJuIHt9OwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KICAgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIG1ldHJvcG9saXMgc3RlcCBpbgogICAgICAgKiB0aGUgQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgogICAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLgogICAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24uCiAgICAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy4KICAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAogICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCiAgICAgICAqIEBwYXJhbSBnZW5lcmF0ZV9wcm9wb3NhbCAtIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgcHJvcG9zYWwgKGFzIGEgbnVtYmVyKQogICAgICAgKiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgbG9nX3NjYWxlKSB3aGVyZSBwYXJhbV9zdGF0ZSBpcyBhCiAgICAgICAqIG51bWJlciBhbmQgbG9nX3NjYWxlIGRlZmluZXMgdGhlIHNjYWxlIG9mIHRoZSBwcm9wb3NhbCBzb21laG93LgogICAgICAqLwogICAgICB2YXIgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGdlbmVyYXRlX3Byb3Bvc2FsKSB7CiAgICAgICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTsKICAgICAgICB2YXIgcGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CiAgICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCAhPSAxKSB7CiAgICAgICAgICB0aHJvdyAiT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgY2FuIG9ubHkgaGFuZGxlIG9uZSBwYXJhbWV0ZXIuIjsKICAgICAgICB9CiAgICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CiAgICAgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lXTsKICAgICAgICBpZiAoIWFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkgewogICAgICAgICAgdGhyb3cgIk9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIGNhbiBvbmx5IGhhbmRsZSBvbmUgb25lLWRpbWVuc2lvbmFsIHBhcmFtZXRlci4iOwogICAgICAgIH0KICAgICAgICB0aGlzLmxvd2VyID0gcGFyYW0ubG93ZXI7CiAgICAgICAgdGhpcy51cHBlciA9IHBhcmFtLnVwcGVyOwogICAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgPSBnZXRfb3B0aW9uKCJwcm9wX2xvZ19zY2FsZSIsIG9wdGlvbnMsIDApOwogICAgICAgIHRoaXMuYmF0Y2hfc2l6ZSA9IGdldF9vcHRpb24oImJhdGNoX3NpemUiLCBvcHRpb25zLCA1MCk7CiAgICAgICAgdGhpcy5tYXhfYWRhcHRhdGlvbiA9IGdldF9vcHRpb24oIm1heF9hZGFwdGF0aW9uIiwgb3B0aW9ucywgMC4zMyk7CiAgICAgICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfb3B0aW9uKCJpbml0aWFsX2FkYXB0YXRpb24iLCBvcHRpb25zLCAxLjApOwogICAgICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X29wdGlvbigidGFyZ2V0X2FjY2VwdF9yYXRlIiwgb3B0aW9ucywgMC40NCk7CiAgICAgICAgdGhpcy5pc19hZGFwdGluZyA9IGdldF9vcHRpb24oImlzX2FkYXB0aW5nIiwgb3B0aW9ucywgdHJ1ZSk7CiAgICAgICAgdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbCA9IGdlbmVyYXRlX3Byb3Bvc2FsOwogICAgICAgIHRoaXMuYWNjZXB0YW5jZV9jb3VudCA9IDA7CiAgICAgICAgdGhpcy5iYXRjaF9jb3VudCA9IDA7CiAgICAgICAgdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uID0gMDsKICAgICAgfTsKICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyOwogICAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgcGFyYW1fc3RhdGUgPSB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07CiAgICAgICAgdmFyIHBhcmFtX3Byb3Bvc2FsID0gdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbChwYXJhbV9zdGF0ZSwgdGhpcy5wcm9wX2xvZ19zY2FsZSk7CiAgICAgICAgaWYgKHBhcmFtX3Byb3Bvc2FsIDwgdGhpcy5sb3dlciB8fCBwYXJhbV9wcm9wb3NhbCA+IHRoaXMudXBwZXIpIDsgZWxzZSB7CiAgICAgICAgICAvLyBtYWtlIGEgTWV0cm9wb2xpcyBzdGVwCiAgICAgICAgICB2YXIgY3Vycl9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTsKICAgICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3Byb3Bvc2FsOwogICAgICAgICAgdmFyIHByb3BfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgICB2YXIgYWNjZXB0X3Byb2IgPSBNYXRoLmV4cChwcm9wX2xvZ19kZW5zIC0gY3Vycl9sb2dfZGVucyk7CiAgICAgICAgICBpZiAoYWNjZXB0X3Byb2IgPiBNYXRoLnJhbmRvbSgpKSB7CiAgICAgICAgICAgIC8vIFdlIGRvIG5vdGhpbmcgYXMgdGhlIHN0YXRlIG9mIHBhcmFtIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCB0byB0aGUgcHJvcG9zYWwKICAgICAgICAgICAgaWYgKHRoaXMuaXNfYWRhcHRpbmcpIHRoaXMuYWNjZXB0YW5jZV9jb3VudCsrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gcmV2ZXJ0IHN0YXRlIGJhY2sgdG8gdGhlIG9sZCBzdGF0ZSBvZiBwYXJhbQogICAgICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSBwYXJhbV9zdGF0ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuaXNfYWRhcHRpbmcpIHsKICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbisrOwogICAgICAgICAgaWYgKHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA+PSB0aGlzLmJhdGNoX3NpemUpIHsKICAgICAgICAgICAgLy8gdGhlbiBhZGFwdAogICAgICAgICAgICB0aGlzLmJhdGNoX2NvdW50Kys7CiAgICAgICAgICAgIHZhciBsb2dfc2RfYWRqdXN0bWVudCA9IE1hdGgubWluKHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uIC8gTWF0aC5zcXJ0KHRoaXMuYmF0Y2hfY291bnQpKTsKICAgICAgICAgICAgaWYgKHRoaXMuYWNjZXB0YW5jZV9jb3VudCAvIHRoaXMuYmF0Y2hfc2l6ZSA+IHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlKSB7CiAgICAgICAgICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSArPSBsb2dfc2RfYWRqdXN0bWVudDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlIC09IGxvZ19zZF9hZGp1c3RtZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuYWNjZXB0YW5jZV9jb3VudCA9IDA7CiAgICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07CiAgICAgIH07CiAgICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSB0cnVlOwogICAgICB9OwogICAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBmYWxzZTsKICAgICAgfTsKICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHByb3BfbG9nX3NjYWxlOiB0aGlzLnByb3BfbG9nX3NjYWxlLAogICAgICAgICAgaXNfYWRhcHRpbmc6IHRoaXMuaXNfYWRhcHRpbmcsCiAgICAgICAgICBhY2NlcHRhbmNlX2NvdW50OiB0aGlzLmFjY2VwdGFuY2VfY291bnQsCiAgICAgICAgICBpdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uOiB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24sCiAgICAgICAgICBiYXRjaF9jb3VudDogdGhpcy5iYXRjaF9jb3VudAogICAgICAgIH07CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGEgTm9ybWFsIHByb3Bvc2FsLgogICAgICAgKi8KICAgICAgdmFyIG5vcm1hbF9wcm9wb3NhbCA9IGZ1bmN0aW9uIChwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHsKICAgICAgICByZXR1cm4gcm5vcm0ocGFyYW1fc3RhdGUsIE1hdGguZXhwKHByb3BfbG9nX3NjYWxlKSk7CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogQGNsYXNzCiAgICAgICAqIEBhdWdtZW50cyB7T25lZGltTWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICAqIEEgInN1YmNsYXNzIiBvZiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuCiAgICAgICAqLwogICAgICB2YXIgUmVhbE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CiAgICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgbm9ybWFsX3Byb3Bvc2FsKTsKICAgICAgfTsKICAgICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsKICAgICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlYWxNZXRyb3BvbGlzU3RlcHBlcjsKCiAgICAgIC8qKgogICAgICAgKiBGdW5jdGlvbiByZXR1cm5pbmcgYSBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWwuCiAgICAgICAqLwogICAgICB2YXIgZGlzY3JldGVfbm9ybWFsX3Byb3Bvc2FsID0gZnVuY3Rpb24gKHBhcmFtX3N0YXRlLCBwcm9wX2xvZ19zY2FsZSkgewogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHJub3JtKHBhcmFtX3N0YXRlLCBNYXRoLmV4cChwcm9wX2xvZ19zY2FsZSkpKTsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAqIEBjbGFzcwogICAgICAqIEBhdWdtZW50cyB7T25lZGltTWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICogQSAic3ViY2xhc3MiIG9mIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLgogICAgICAqLwogICAgICB2YXIgSW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKICAgICAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwpOwogICAgICB9OwogICAgICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIEludE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludE1ldHJvcG9saXNTdGVwcGVyOwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KICAgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIG1ldHJvcG9saXMgc3RlcCBpbgogICAgICAgKiB0aGUgQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgogICAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpIGZvciBwb3NzaWJseSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5cy4gVGhhdAogICAgICAgKiBpcywgaW5zdGVhZCBvZiBqdXN0IHRha2luZyBhIHN0ZXAgZm9yIGEgb25lLWRpbWVuc2lvbmFsIHBhcmFtZXRlciBsaWtlIAogICAgICAgKiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciwgdGhpcyBTdGVwcGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0YWtpbmcgc3RlcHMgCiAgICAgICAqIGZvciBhIG11bHRpZGltZW5zaW9uYWwgYXJyYXkuIEl0J3Mgc3RpbGwgcHJldHR5IGR1bWIgYW5kIGp1c3QgdGFrZXMKICAgICAgICogb25lLWRpbWVuc2lvbmFsIHN0ZXBzIGZvciBlYWNoIHBhcmFtZXRlciBjb21wb25lbnQsIHRob3VnaC4KICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uIGZvciBhIAogICAgICAgKiAgIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyLgogICAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCiAgICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLgogICAgICAgKiBAcGFyYW0gU3ViU3RlcHBlciAtIGEgY29uc3RydWN0b3IgZm9yIHRoZSB0eXBlIG9mIG9uZSBkaW1lbnNpb25hbCBTdGVwcGVyIHRvIGFwcGx5IG9uCiAgICAgICAqICAgYWxsIHRoZSBjb21wb25lbnRzIG9mIHRoZSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci4KICAgICAgKi8KICAgICAgdmFyIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFN1YlN0ZXBwZXIpIHsKICAgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwogICAgICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTsKICAgICAgICBpZiAocGFyYW1fbmFtZXMubGVuZ3RoICE9IDEpIHsKICAgICAgICAgIHRocm93ICJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIGNhbid0IGhhbmRsZSBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4iOwogICAgICAgIH0KICAgICAgICB0aGlzLnBhcmFtX25hbWUgPSBwYXJhbV9uYW1lc1swXTsKICAgICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdOwogICAgICAgIHRoaXMubG93ZXIgPSBwYXJhbS5sb3dlcjsKICAgICAgICB0aGlzLnVwcGVyID0gcGFyYW0udXBwZXI7CiAgICAgICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07CiAgICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oInByb3BfbG9nX3NjYWxlIiwgb3B0aW9ucywgdGhpcy5kaW0sIDApOwogICAgICAgIHRoaXMuYmF0Y2hfc2l6ZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oImJhdGNoX3NpemUiLCBvcHRpb25zLCB0aGlzLmRpbSwgNTApOwogICAgICAgIHRoaXMubWF4X2FkYXB0YXRpb24gPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJtYXhfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIHRoaXMuZGltLCAwLjMzKTsKICAgICAgICB0aGlzLmluaXRpYWxfYWRhcHRhdGlvbiA9IGdldF9tdWx0aWRpbV9vcHRpb24oImluaXRpYWxfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIHRoaXMuZGltLCAxLjApOwogICAgICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X211bHRpZGltX29wdGlvbigidGFyZ2V0X2FjY2VwdF9yYXRlIiwgb3B0aW9ucywgdGhpcy5kaW0sIDAuNDQpOwogICAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJpc19hZGFwdGluZyIsIG9wdGlvbnMsIHRoaXMuZGltLCB0cnVlKTsKCiAgICAgICAgLy8gVGhpcyBoYWNrIGJlbG93IGlzIGEgcmVjdXJzaXZlIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbiBhcnJheSBvZiAKICAgICAgICAvLyBvbmUgZGltZW5zaW9uYWwgc3RlcHBlcnMgYWNjb3JkaW5nIHRvIGRpbS4KICAgICAgICB2YXIgY3JlYXRlX3N1YnN0ZXBwZXJzID0gZnVuY3Rpb24gKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0LCBwcm9wX2xvZ19zY2FsZSwgYmF0Y2hfc2l6ZSwgbWF4X2FkYXB0YXRpb24sIGluaXRpYWxfYWRhcHRhdGlvbiwgdGFyZ2V0X2FjY2VwdF9yYXRlLCBpc19hZGFwdGluZykgewogICAgICAgICAgdmFyIHN1YnN0ZXBwZXJzID0gW107CiAgICAgICAgICBpZiAoZGltLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgdmFyIHN1Ym9wdGlvbnMgPSB7CiAgICAgICAgICAgICAgICBwcm9wX2xvZ19zY2FsZTogcHJvcF9sb2dfc2NhbGVbaV0sCiAgICAgICAgICAgICAgICBiYXRjaF9zaXplOiBiYXRjaF9zaXplW2ldLAogICAgICAgICAgICAgICAgbWF4X2FkYXB0YXRpb246IG1heF9hZGFwdGF0aW9uW2ldLAogICAgICAgICAgICAgICAgaW5pdGlhbF9hZGFwdGF0aW9uOiBpbml0aWFsX2FkYXB0YXRpb25baV0sCiAgICAgICAgICAgICAgICB0YXJnZXRfYWNjZXB0X3JhdGU6IHRhcmdldF9hY2NlcHRfcmF0ZVtpXSwKICAgICAgICAgICAgICAgIGlzX2FkYXB0aW5nOiBpc19hZGFwdGluZ1tpXQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdmFyIHN1YnBhcmFtID0ge307CiAgICAgICAgICAgICAgc3VicGFyYW1baV0gPSBkZWVwX2Nsb25lKHBhcmFtKTsKICAgICAgICAgICAgICBzdWJwYXJhbVtpXS5kaW0gPSBbMV07IC8vIEFzIHRoaXMgc2hvdWxkIG5vdyBiZSBhIG9uZS1kaW0gcGFyYW1ldGVyCiAgICAgICAgICAgICAgZGVsZXRlIHN1YnBhcmFtW2ldLmluaXQ7IC8vIEFzIGl0IHNvdWxkIG5vdCBiZSBuZWVkZWQKICAgICAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBTdWJTdGVwcGVyKHN1YnBhcmFtLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHN1Ym9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QsIHByb3BfbG9nX3NjYWxlW2ldLCBiYXRjaF9zaXplW2ldLCBtYXhfYWRhcHRhdGlvbltpXSwgaW5pdGlhbF9hZGFwdGF0aW9uW2ldLCB0YXJnZXRfYWNjZXB0X3JhdGVbaV0sIGlzX2FkYXB0aW5nW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHN1YnN0ZXBwZXJzOwogICAgICAgIH07CiAgICAgICAgdGhpcy5zdWJzdGVwcGVycyA9IGNyZWF0ZV9zdWJzdGVwcGVycyh0aGlzLmRpbSwgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdLCB0aGlzLmxvZ19wb3N0LCB0aGlzLnByb3BfbG9nX3NjYWxlLCB0aGlzLmJhdGNoX3NpemUsIHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uLCB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSwgdGhpcy5pc19hZGFwdGluZyk7CiAgICAgIH07CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjsKICAgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS4KICAgICAgICByZXR1cm4gbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewogICAgICAgICAgcmV0dXJuIHN1YnN0ZXBwZXIuc3RlcCgpOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewogICAgICAgICAgc3Vic3RlcHBlci5zdGFydF9hZGFwdGF0aW9uKCk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBuZXN0ZWRfYXJyYXlfYXBwbHkodGhpcy5zdWJzdGVwcGVycywgZnVuY3Rpb24gKHN1YnN0ZXBwZXIpIHsKICAgICAgICAgIHN1YnN0ZXBwZXIuc3RvcF9hZGFwdGF0aW9uKCk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewogICAgICAgICAgcmV0dXJuIHN1YnN0ZXBwZXIuaW5mbygpOwogICAgICAgIH0pOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICAqIEEgInN1YmNsYXNzIiBvZiBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBjb250aW5vdXMgTm9ybWFsIHByb3Bvc2Fscy4KICAgICAgICovCiAgICAgIHZhciBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgUmVhbE1ldHJvcG9saXNTdGVwcGVyKTsKICAgICAgfTsKICAgICAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICAqIEEgInN1YmNsYXNzIiBvZiBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLgogICAgICAgKi8KICAgICAgdmFyIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKICAgICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIEludE1ldHJvcG9saXNTdGVwcGVyKTsKICAgICAgfTsKICAgICAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsKICAgICAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KICAgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYSBzdGVwIGZvciBhIGJpbmFyeSBwYXJhbWV0ZXIuCiAgICAgICAqIFRoaXMgaXMgZG9uZSBieSBldmFsdWF0aW5nIHRoZSBsb2cgcG9zdGVyaW9yIGZvciBib3RoIHN0YXRlcyBvZiB0aGUKICAgICAgICogcGFyYW1ldGVyIGFuZCB0aGVuIHNlbGVjdGluZyBhIHN0YXRlIHJhbmRvbWx5IHdpdGggcHJvYmFiaWxpdHkgcmVsYXRpdmUgCiAgICAgICAqIHRvIHRoZSBwb3N0ZXJpb3Igb2YgZWFjaCBzdGF0ZS4KICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uLgogICAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCiAgICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLgogICAgICAqLwogICAgICB2YXIgQmluYXJ5U3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7CiAgICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwogICAgICAgIGlmIChwYXJhbV9uYW1lcy5sZW5ndGggPT0gMSkgewogICAgICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93ICJCaW5hcnlTdGVwcGVyIGNhbid0IGhhbmRsZSBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4iOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsKICAgICAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCaW5hcnlTdGVwcGVyOwogICAgICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IDA7CiAgICAgICAgdmFyIHplcm9fbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMTsKICAgICAgICB2YXIgb25lX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpOwogICAgICAgIHZhciBtYXhfbG9nX2RlbnMgPSBNYXRoLm1heCh6ZXJvX2xvZ19kZW5zLCBvbmVfbG9nX2RlbnMpOwogICAgICAgIHplcm9fbG9nX2RlbnMgLT0gbWF4X2xvZ19kZW5zOwogICAgICAgIG9uZV9sb2dfZGVucyAtPSBtYXhfbG9nX2RlbnM7CiAgICAgICAgdmFyIHplcm9fcHJvYiA9IE1hdGguZXhwKHplcm9fbG9nX2RlbnMgLSBNYXRoLmxvZyhNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zKSArIE1hdGguZXhwKG9uZV9sb2dfZGVucykpKTsKICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8IHplcm9fcHJvYikgewogICAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0gLy8gZWxzZSBrZWVwIHRoZSBwYXJhbSBhdCAxIC4KICAgICAgICByZXR1cm4gMTsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAqIEBjbGFzcwogICAgICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfQogICAgICAqIEp1c3QgbGlrZSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIHRoaXMgU3RlcHBlciB0YWtlcyBhIHN0ZXBzIGZvcgogICAgICAqIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgYnkgdXBkYXRpbmcgZWFjaCBjb21wb25lbnQgaW4gdHVybi4gVGhlIGRpZmZlcmVuY2UKICAgICAgKiBpcyB0aGF0IHRoaXMgc3RlcHBlciB3b3JrcyBvbiBiaW5hcnkgcGFyYW1ldGVycy4KICAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZm9yIGEgCiAgICAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci4KICAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCiAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAogICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KICAgICAgKi8KICAgICAgdmFyIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKICAgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwogICAgICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTsKICAgICAgICBpZiAocGFyYW1fbmFtZXMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdOwogICAgICAgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lXTsKICAgICAgICAgIHRoaXMuZGltID0gcGFyYW0uZGltOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyAiQmluYXJ5Q29tcG9uZW50U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuIjsKICAgICAgICB9CiAgICAgICAgdmFyIGNyZWF0ZV9zdWJzdGVwcGVycyA9IGZ1bmN0aW9uIChkaW0sIHN1YnN0YXRlLCBsb2dfcG9zdCkgewogICAgICAgICAgdmFyIHN1YnN0ZXBwZXJzID0gW107CiAgICAgICAgICB2YXIgaTsKICAgICAgICAgIGlmIChkaW0ubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewogICAgICAgICAgICAgIHZhciBzdWJwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICBzdWJwYXJhbXNbaV0gPSBwYXJhbTsKICAgICAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBCaW5hcnlTdGVwcGVyKHN1YnBhcmFtcywgc3Vic3RhdGUsIGxvZ19wb3N0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3Vic3RlcHBlcnM7CiAgICAgICAgfTsKICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gY3JlYXRlX3N1YnN0ZXBwZXJzKHRoaXMuZGltLCB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0sIHRoaXMubG9nX3Bvc3QpOwogICAgICB9OwogICAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwogICAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI7CiAgICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gR28gdGhyb3VnaCB0aGUgc3Vic3RlcHBlcnMgaW4gYSByYW5kb20gb3JkZXIgYW5kIGNhbGwgc3RlcCgpIG9uIHRoZW0uCiAgICAgICAgcmV0dXJuIG5lc3RlZF9hcnJheV9yYW5kb21fYXBwbHkodGhpcy5zdWJzdGVwcGVycywgZnVuY3Rpb24gKHN1YnN0ZXBwZXIpIHsKICAgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLnN0ZXAoKTsKICAgICAgICB9KTsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBAY2xhc3MKICAgICAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9CiAgICAgICAqIFRoaXMgc3RlcHBlciBjYW4gYmUgcmVzcG9uc2libGUgZm9yIHRha2luZyBhIHN0ZXAgZm9yIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMuCiAgICAgICAqIEZvciByZWFsIGFuZCBpbnQgcGFyYW1ldGVycyBpdCB0YWtlcyBNZXRyb3BvbGlzIHdpdGhpbiBHaWJicyBzdGVwcywgYW5kIGZvciAKICAgICAgICogYmluYXJ5IHBhcmFtZXRlcnMgaXQgZG9lcyBldmFsdWF0ZXMgdGhlIHBvc3RlcmlvciBmb3IgYm90aCBwYXJhbXRlciB2YWx1ZXMgYW5kCiAgICAgICAqIHJhbmRvbWx5IGNoYW5nZXMgdG8gYSBjZXJ0YWluIHZhbHVlIHByb3BvcnRpb25hbGx5IHRvIHRoYXQgdmFsdWUncyBwb3N0ZXJpb3IKICAgICAgICogKHRoaXMgaXMgYWxzbyBkb25lIGZvciBlYWNoIHBhcmFtZXRlciwgc28gYWxzbyBhICogd2l0aGluIEdpYmJzIGFwcHJvYWNoKS4KICAgICAgICogVGhpcyBzdGVwcGVyIGlzIGFsc28gYWRhcHRpdmUgYW5kIGNhbiBiZSBlZmZpY2llbnQgd2hlbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICogYXJlIG5vdCB0b28gaGlnaCBhbmQgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHBhcmFtZXRlcnMgYXJlIGxvdy4KICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgb25lIG9yIG1vcmUgcGFyYW1ldGVyIGRlZmluaXRpb25zCiAgICAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy4KICAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAogICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCiAgICAgICovCiAgICAgIHZhciBBbXdnU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7CiAgICAgICAgdGhpcy5wYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTsKICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbdGhpcy5wYXJhbV9uYW1lc1tpXV07CiAgICAgICAgICB2YXIgU2VsZWN0U3RlcHBlcjsKICAgICAgICAgIHN3aXRjaCAocGFyYW0udHlwZSkgewogICAgICAgICAgICBjYXNlICJyZWFsIjoKICAgICAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CiAgICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gUmVhbE1ldHJvcG9saXNTdGVwcGVyOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJpbnQiOgogICAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKICAgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBJbnRNZXRyb3BvbGlzU3RlcHBlcjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJiaW5hcnkiOgogICAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKICAgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBCaW5hcnlTdGVwcGVyOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gQmluYXJ5Q29tcG9uZW50U3RlcHBlcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgdGhyb3cgIkFtd2dTdGVwcGVyIGNhbid0IGhhbmRsZSBwYXJhbWV0ZXIgIiArIHRoaXMucGFyYW1fbmFtZXNbaV0gKyAiIHdpdGggdHlwZSAiICsgcGFyYW0udHlwZTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBwYXJhbV9vYmplY3Rfd3JhcCA9IHt9OwogICAgICAgICAgcGFyYW1fb2JqZWN0X3dyYXBbdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSBwYXJhbTsKICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgICAgdmFyIHBhcmFtX29wdGlvbnMgPSBvcHRpb25zLnBhcmFtcyAmJiBvcHRpb25zLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVzW2ldXSB8fCB7fTsKICAgICAgICAgIHBhcmFtX29wdGlvbnMucHJvcF9sb2dfc2NhbGUgPSBwYXJhbV9vcHRpb25zLnByb3BfbG9nX3NjYWxlIHx8IG9wdGlvbnMucHJvcF9sb2dfc2NhbGU7CiAgICAgICAgICBwYXJhbV9vcHRpb25zLmJhdGNoX3NpemUgPSBwYXJhbV9vcHRpb25zLmJhdGNoX3NpemUgfHwgb3B0aW9ucy5iYXRjaF9zaXplOwogICAgICAgICAgcGFyYW1fb3B0aW9ucy5tYXhfYWRhcHRhdGlvbiA9IHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gfHwgb3B0aW9ucy5tYXhfYWRhcHRhdGlvbjsKICAgICAgICAgIHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uID0gcGFyYW1fb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb24gfHwgb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb247CiAgICAgICAgICBwYXJhbV9vcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZSA9IHBhcmFtX29wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlIHx8IG9wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlOwogICAgICAgICAgcGFyYW1fb3B0aW9ucy5pc19hZGFwdGluZyA9IHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgfHwgb3B0aW9ucy5pc19hZGFwdGluZzsKICAgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0gPSBuZXcgU2VsZWN0U3RlcHBlcihwYXJhbV9vYmplY3Rfd3JhcCwgc3RhdGUsIGxvZ19wb3N0LCBwYXJhbV9vcHRpb25zKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwogICAgICBBbXdnU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU3RlcHBlcjsKICAgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgc2h1ZmZsZV9hcnJheSh0aGlzLnN1YnN0ZXBwZXJzKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0uc3RlcCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZTsKICAgICAgfTsKICAgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0YXJ0X2FkYXB0YXRpb24oKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdG9wX2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0b3BfYWRhcHRhdGlvbigpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGluZm8gPSB7fTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGluZm9bdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSB0aGlzLnN1YnN0ZXBwZXJzW2ldLmluZm8oKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluZm87CiAgICAgIH07CgogICAgICAvLy8vLy8vLy8vLyBTYW1wbGVyIEZ1bmN0aW9ucyAvLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIC8qKgogICAgICAqIEBpbnRlcmZhY2UKICAgICAgKiBXaGlsZSB5b3UgY291bGQgZml0IGEgbW9kZWwgYnkgcGFzdGluZyB0b2dldGhlciBTdGVwcGVycywgYQogICAgICAvLyBTYW1wbGVyIGlzIGhlcmUgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyB3aGVyZSBhbiBpbnN0YW5jZSBvZiBTYW1wbGVyCiAgICAgIC8vIHNldHMgdXAgdGhlIFN0ZXBwZXJzLCBjaGVja3MgdGhlIHBhcmFtZXRlciBkZWZpbml0aW9uLAogICAgICAvLyBhbmQgbWFuYWdlcyB0aGUgc2FtcGxpbmcuIFRoaXMgaGVyZSBkZWZpbmVzIHRoZSBTYW1wbGVyICJpbnRlcmZhY2UiLgogICAgICAqIEBpbnRlcmZhY2UKICAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggcGFyYW1ldGVyIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZToKICAgICAgKiAgIHsibXUiOiB7InR5cGUiOiAicmVhbCJ9LCAic2lnbWEiOiB7InR5cGUiOiAicmVhbCIsICJsb3dlciIgPSAwfX0KICAgICAgKiAgIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgZG9lc24ndCBoYXZlIHRvIGJlICJjb21wbGV0ZSIgYW5kIHByb3BlcnRpZXMKICAgICAgKiAgIGxlZnQgb3V0IChsaWtlIGxvd2VyIGFuZCB1cHBlcikgd2lsbCBiZSBmaWxsZWQgaW4gYnkgZGVmYXVsdHMuCiAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihzdGF0ZSwgZGF0YSkuIEhlcmUKICAgICAgKiAgIHN0YXRlIHdpbGwgYmUgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3RhdGUgd2l0aCBlYWNoIHBhcmFtZXRlciBhcyBhIAogICAgICAqICAga2V5IGFuZCB0aGUgcGFyYW1ldGVyIHZhbHVlcyBhcyBudW1iZXJzIG9yIGFycmF5cy4gRm9yIGV4YW1wbGU6CiAgICAgICogICB7Im11IjogMywgInNpZ21hIjogMS41fS4gVGhlIGRhdGEgYXJndW1lbnQgd2lsbCBiZSB0aGUgc2FtZSBvYmplY3QgYXMgCiAgICAgICogICB0aGUgZGF0YSBhcmd1bWVudCBnaXZlbiBiZWxvdy4KICAgICAgKiBAcGFyYW0gZGF0YSAtIGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBsb2dfcG9zdCBmdW5jdGlvbgogICAgICAqICAgd2hlbiBzYW1wbGluZy4KICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHNhbXBsZXIuCiAgICAgICovCiAgICAgIHZhciBTYW1wbGVyID0gZnVuY3Rpb24gKHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpIHsKICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgogICAgICAgIC8vIFNldHRpbmcgZGVmYXVsdCBvcHRpb25zIGlmIG5vdCBwYXNzZWQgdGhyb3VnaCB0aGUgb3B0aW9ucyBvYmplY3QKICAgICAgICB0aGlzLnBhcmFtX2luaXRfZnVuID0gZ2V0X29wdGlvbigicGFyYW1faW5pdF9mdW4iLCBvcHRpb25zLCBwYXJhbV9pbml0X2ZpeGVkKTsKICAgICAgICB2YXIgdGhpbm5pbmdfaW50ZXJ2YWwgPSBnZXRfb3B0aW9uKCJ0aGluIiwgb3B0aW9ucywgMSk7CiAgICAgICAgdmFyIHBhcmFtc190b19tb25pdG9yID0gZ2V0X29wdGlvbigibW9uaXRvciIsIG9wdGlvbnMsIG51bGwpOwogICAgICAgIHRoaXMudGhpbih0aGlubmluZ19pbnRlcnZhbCk7CiAgICAgICAgdGhpcy5tb25pdG9yKHBhcmFtc190b19tb25pdG9yKTsKICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgIC8vIENvbXBsZXRpbmcgdGhlIHBhcmFtcyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBzdGF0ZS4KICAgICAgICB0aGlzLnBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyh0aGlzLnBhcmFtcywgdGhpcy5wYXJhbV9pbml0X2Z1bik7CiAgICAgICAgdmFyIHN0YXRlID0ge307CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBzdGF0ZVt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dLmluaXQ7CiAgICAgICAgfQogICAgICAgIHRoaXMubG9nX3Bvc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gbG9nX3Bvc3Qoc3RhdGUsIGRhdGEpOwogICAgICAgIH07CiAgICAgICAgLy8gUnVubmluZyB0aGUgbG9nX3Bvc3QgZnVuY3Rpb24gb25jZSBpbiBjYXNlIGl0IGZ1cnRoZXIgbW9kaWZpZXMgdGhlIHN0YXRlCiAgICAgICAgLy8gZm9yIGV4YW1wbGUgYWRkaW5nIGRlcml2ZWQgcXVhbnRpdGllcy4KICAgICAgICB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwogICAgICAgIHRoaXMuc3RlcHBlcnMgPSB0aGlzLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlKHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlLCB0aGlzLmxvZ19wb3N0LCB0aGlzLm9wdGlvbnMpOwogICAgICB9OwoKICAgICAgLyoqIFNob3VsZCByZXR1cm4gYSB2ZWN0b3Igb2Ygc3RlcHBlcnMgdGhhdCB3aGVuIGNhbGxlZCAKICAgICAgICogc2hvdWxkIHRha2UgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuCiAgICAgICAqLwogICAgICBTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uIChzdGF0ZSwgbG9nX3Bvc3QpIHsKICAgICAgICB0aHJvdyAiRXZlcnkgU2FtcGxlciBuZWVkcyB0byBpbXBsZW1lbnQgY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUoKSI7CiAgICAgIH07CgogICAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBpbmZvIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgU2FtcGxlci4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLAogICAgICAgICAgdGhpbjogdGhpcy50aGluLAogICAgICAgICAgbW9uaXRvcjogdGhpcy5tb25pdG9yLAogICAgICAgICAgc3RlcHBlcnM6IHRoaXMuc3RlcHBlcnMKICAgICAgICB9OwogICAgICB9OwoKICAgICAgLyoqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBSZXR1cm5zIHRoZSBuZXcgc3BhY2UKICAgICAgICogYnV0IGFsc28gbW9kaWZpZXMgdGhlIHN0YXRlIGluIHBsYWNlLgogICAgICAgKi8KICAgICAgU2FtcGxlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBzaHVmZmxlX2FycmF5KHRoaXMuc3RlcHBlcnMpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdGVwcGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGhpcy5zdGVwcGVyc1tpXS5zdGVwKCk7CiAgICAgICAgfQogICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnN0YXRlKS5sZW5ndGggPiBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcykubGVuZ3RoKSB7CiAgICAgICAgICAvLyBUaGUgc3RhdGUgY29udGFpbnMgZGV2aXZlZCBxdWFudGl0aWVzIChub3Qgb25seSBwYXJhbWV0ZXJzKSBhbmQgd2UKICAgICAgICAgIC8vIG5lZWQgdG8gcnVuIHRoZSBsb2dfcG9zdCBvbmNlIG1vcmUgaW4gb3JkZXIgdG8gc2V0IHRoZSBkZXJpdmVkIHF1YW50aXRpZXMKICAgICAgICAgIC8vIGZvciB0aGUgZmluYWwgcGFyYW1ldGVyIHN0YXRlCiAgICAgICAgICB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN0YXRlOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIFRha2VzIG5faXRlcmF0aW9ucyBzdGVwcyBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlIGFuZCByZXR1cm5zIHRoZW0KICAgICAgICogYXMgYW4gb2JqZWN0IG9mIGFycmF5cyB3aXRoIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZToKICAgICAgICoge211OiBbMSwgLTEsIDIsIDMsIC4uLl0sIHNpZ21hOiBbMSwgMiwgMiwgMSwgLi4uXX0uCiAgICAgICAqIElmIHRoaW4gaXMgPiAxIHRoZW4gbl9pdGVyYXRpb25zIC8gdGhpbiBzYW1wbGVzIGFyZSByZXR1cm5lZC4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLnNhbXBsZSA9IGZ1bmN0aW9uIChuX2l0ZXJhdGlvbnMpIHsKICAgICAgICAvLyBJbml0aWFsaXppbmcgY3Vycl9zYW1wbGUgd2hlcmUgdGhlIHNhbXBsZSBpcyBnb2luZyB0byBiZSBzYXZlZAogICAgICAgIC8vIGFzIGFuIG9iamVjdCBjb250YWluaW5nIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyIHRvIGJlIG1vbml0b3JlZC4KICAgICAgICB2YXIgaSwgaiwgbW9uaXRvcmVkX3BhcmFtczsKICAgICAgICBpZiAodGhpcy5tb25pdG9yZWRfcGFyYW1zID09PSBudWxsKSB7CiAgICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gT2JqZWN0LmtleXModGhpcy5zdGF0ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1vbml0b3JlZF9wYXJhbXMgPSB0aGlzLm1vbml0b3JlZF9wYXJhbXM7CiAgICAgICAgfQogICAgICAgIHZhciBjdXJyX3NhbXBsZSA9IHt9OwogICAgICAgIGZvciAoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBjdXJyX3NhbXBsZVttb25pdG9yZWRfcGFyYW1zW2pdXSA9IFtdOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHsKICAgICAgICAgIGlmIChpICUgdGhpcy50aGlubmluZ19pbnRlcnZhbCA9PT0gMCkgewogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbW9uaXRvcmVkX3BhcmFtcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgIHZhciBwYXJhbSA9IG1vbml0b3JlZF9wYXJhbXNbal07CiAgICAgICAgICAgICAgY3Vycl9zYW1wbGVbcGFyYW1dLnB1c2goY2xvbmVfcGFyYW1fZHJhdyh0aGlzLnN0YXRlW3BhcmFtXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnN0ZXAoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGN1cnJfc2FtcGxlOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIFRha2VzIG5faXRlcmF0aW9uIHN0ZXBzIGluIHBhcmFtZXRlciBzcGFjZSBidXQgcmV0dXJucyBub3RoaW5nLgogICAgICAgKi8KICAgICAgU2FtcGxlci5wcm90b3R5cGUuYnVybiA9IGZ1bmN0aW9uIChuX2l0ZXJhdGlvbnMpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5faXRlcmF0aW9uczsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN0ZXAoKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogU2V0cyB3aGF0IHBhcmFtZXRlcnMgc2hvdWxkIGJlIG1vbml0b3JlZCBhbmQgcmV0dXJuZWQgd2hlbiBjYWxsaW5nCiAgICAgICAqIHNhbXBsZS4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLm1vbml0b3IgPSBmdW5jdGlvbiAocGFyYW1zX3RvX21vbml0b3IpIHsKICAgICAgICB0aGlzLm1vbml0b3JlZF9wYXJhbXMgPSBwYXJhbXNfdG9fbW9uaXRvcjsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBTZXRzIHRoZSB0aGlubmluZy4gRm9yIGV4YW1wbGUgdGhpbiA9PSAxMCBtZWFucyB0aGF0IGV2ZXJ5IDEwdGggcG9zdGVyaW9yCiAgICAgICAqIGRyYXcgd2lsbCBiZSBrZXB0LgogICAgICAgKi8KICAgICAgU2FtcGxlci5wcm90b3R5cGUudGhpbiA9IGZ1bmN0aW9uICh0aGlubmluZ19pbnRlcnZhbCkgewogICAgICAgIHRoaXMudGhpbm5pbmdfaW50ZXJ2YWwgPSB0aGlubmluZ19pbnRlcnZhbDsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBTZXRzIGFkYXB0YXRpb24gb24sIGlmIGFwcGxpY2FibGUsIGluIGFsbCBzdGVwcGVycy4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0YXJ0X2FkYXB0YXRpb24oKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgKiBTZXRzIGFkYXB0YXRpb24gb2ZmLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuCiAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgLyoqCiAgICAgICogQGNsYXNzCiAgICAgICogQGltcGxlbWVudHMge1NhbXBsZXJ9CiAgICAgICogVGhpcyBzYW1wbGVyIHVzZXMgdGhlIEFtd2dTdGVwcGVyIGFzIHRoZSBzdGVwcGVyIGZ1bmN0aW9uIHdoaWNoIGltcGxlbWVudHMgdGhlIAogICAgICAqIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiAiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQyIKICAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLiBBbiBhZGl0aW9uIGlzIHRoYXQgaXQgaGFuZGxlcyBpbnQgcGFyYW1ldGVycwogICAgICAqIGJ5IG1ha2luZyBkaXNjcmV0ZSBOb3JtYWwgcHJvcG9zYWxzIGFuZCBiaW5hcnkgcGFyYW1ldGVycyBieSB0YWtpbmcgb24gYSBuZXcgCiAgICAgICogdmFsdWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBwb3N0ZXJpb3Igb2YgdGhlIHR3byBwb3NzaWJsZSBzdGF0ZXMgb2YgdGhlCiAgICAgICogcGFyYW1ldGVyLiBUaGlzIHNhbXBsZXIgY2FuIGJlIGVmZmljaWVudCB3aGVuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwogICAgICAqIGFyZSBub3QgdG9vIGhpZ2ggYW5kIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJhbWV0ZXJzIGFyZSBsb3cuCiAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgb25lIG9yIG1vcmUgcGFyYW1ldGVyIGRlZmluaXRpb25zCiAgICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLgogICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCiAgICAgICovCiAgICAgIHZhciBBbXdnU2FtcGxlciA9IGZ1bmN0aW9uIChwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgU2FtcGxlci5jYWxsKHRoaXMsIHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpOwogICAgICB9OwogICAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNhbXBsZXIucHJvdG90eXBlKTsKICAgICAgQW13Z1NhbXBsZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQW13Z1NhbXBsZXI7CiAgICAgIEFtd2dTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBbbmV3IEFtd2dTdGVwcGVyKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKV07CiAgICAgIH07CgogICAgICAvLyBSZXR1cm5pbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBwdWJsaWNseSBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCiAgICAgIHJldHVybiB7CiAgICAgICAgcnVuaWY6IHJ1bmlmLAogICAgICAgIHJ1bmlmX2Rpc2NyZXRlOiBydW5pZl9kaXNjcmV0ZSwKICAgICAgICBybm9ybTogcm5vcm0sCiAgICAgICAgcGFyYW1faW5pdF9maXhlZDogcGFyYW1faW5pdF9maXhlZCwKICAgICAgICBjb21wbGV0ZV9wYXJhbXM6IGNvbXBsZXRlX3BhcmFtcywKICAgICAgICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI6IFJlYWxNZXRyb3BvbGlzU3RlcHBlciwKICAgICAgICBJbnRNZXRyb3BvbGlzU3RlcHBlcjogSW50TWV0cm9wb2xpc1N0ZXBwZXIsCiAgICAgICAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLAogICAgICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsCiAgICAgICAgQmluYXJ5U3RlcHBlcjogQmluYXJ5U3RlcHBlciwKICAgICAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyOiBCaW5hcnlDb21wb25lbnRTdGVwcGVyLAogICAgICAgIEFtd2dTdGVwcGVyOiBBbXdnU3RlcHBlciwKICAgICAgICBBbXdnU2FtcGxlcjogQW13Z1NhbXBsZXIKICAgICAgfTsKICAgIH0pOwogIH0pKG1jbWMkMSk7CiAgdmFyIG1jbWNFeHBvcnRzID0gbWNtYyQxLmV4cG9ydHM7CgogIGZ1bmN0aW9uIGFzY2VuZGluZyQxKGEsIGIpIHsKICAgIHJldHVybiBhID09IG51bGwgfHwgYiA9PSBudWxsID8gTmFOIDogYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47CiAgfQoKICBmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHsKICAgIHsKICAgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7CiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkgewogICAgICAgICAgeWllbGQgdmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb21wYXJlRGVmaW5lZChjb21wYXJlID0gYXNjZW5kaW5nJDEpIHsKICAgIGlmIChjb21wYXJlID09PSBhc2NlbmRpbmckMSkgcmV0dXJuIGFzY2VuZGluZ0RlZmluZWQ7CiAgICBpZiAodHlwZW9mIGNvbXBhcmUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNvbXBhcmUgaXMgbm90IGEgZnVuY3Rpb24iKTsKICAgIHJldHVybiAoYSwgYikgPT4gewogICAgICBjb25zdCB4ID0gY29tcGFyZShhLCBiKTsKICAgICAgaWYgKHggfHwgeCA9PT0gMCkgcmV0dXJuIHg7CiAgICAgIHJldHVybiAoY29tcGFyZShiLCBiKSA9PT0gMCkgLSAoY29tcGFyZShhLCBhKSA9PT0gMCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhc2NlbmRpbmdEZWZpbmVkKGEsIGIpIHsKICAgIHJldHVybiAoYSA9PSBudWxsIHx8ICEoYSA+PSBhKSkgLSAoYiA9PSBudWxsIHx8ICEoYiA+PSBiKSkgfHwgKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTsKICB9CgogIGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHsKICAgIGxldCBtYXg7CiAgICB7CiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7CiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKG1heCA8IHZhbHVlIHx8IG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkgewogICAgICAgICAgbWF4ID0gdmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbWF4OwogIH0KCiAgZnVuY3Rpb24gbWluKHZhbHVlcywgdmFsdWVvZikgewogICAgbGV0IG1pbjsKICAgIHsKICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHsKICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAobWluID4gdmFsdWUgfHwgbWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSB7CiAgICAgICAgICBtaW4gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtaW47CiAgfQoKICAvLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbW91cm5lci9xdWlja3NlbGVjdAogIC8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uCiAgZnVuY3Rpb24gcXVpY2tzZWxlY3QoYXJyYXksIGssIGxlZnQgPSAwLCByaWdodCA9IEluZmluaXR5LCBjb21wYXJlKSB7CiAgICBrID0gTWF0aC5mbG9vcihrKTsKICAgIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTsKICAgIHJpZ2h0ID0gTWF0aC5mbG9vcihNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCByaWdodCkpOwogICAgaWYgKCEobGVmdCA8PSBrICYmIGsgPD0gcmlnaHQpKSByZXR1cm4gYXJyYXk7CiAgICBjb21wYXJlID0gY29tcGFyZSA9PT0gdW5kZWZpbmVkID8gYXNjZW5kaW5nRGVmaW5lZCA6IGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUpOwogICAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkgewogICAgICBpZiAocmlnaHQgLSBsZWZ0ID4gNjAwKSB7CiAgICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7CiAgICAgICAgY29uc3QgbSA9IGsgLSBsZWZ0ICsgMTsKICAgICAgICBjb25zdCB6ID0gTWF0aC5sb2cobik7CiAgICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7CiAgICAgICAgY29uc3Qgc2QgPSAwLjUgKiBNYXRoLnNxcnQoeiAqIHMgKiAobiAtIHMpIC8gbikgKiAobSAtIG4gLyAyIDwgMCA/IC0xIDogMSk7CiAgICAgICAgY29uc3QgbmV3TGVmdCA9IE1hdGgubWF4KGxlZnQsIE1hdGguZmxvb3IoayAtIG0gKiBzIC8gbiArIHNkKSk7CiAgICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTsKICAgICAgICBxdWlja3NlbGVjdChhcnJheSwgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGNvbXBhcmUpOwogICAgICB9CiAgICAgIGNvbnN0IHQgPSBhcnJheVtrXTsKICAgICAgbGV0IGkgPSBsZWZ0OwogICAgICBsZXQgaiA9IHJpZ2h0OwogICAgICBzd2FwKGFycmF5LCBsZWZ0LCBrKTsKICAgICAgaWYgKGNvbXBhcmUoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyYXksIGxlZnQsIHJpZ2h0KTsKICAgICAgd2hpbGUgKGkgPCBqKSB7CiAgICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qOwogICAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2ldLCB0KSA8IDApICsraTsKICAgICAgICB3aGlsZSAoY29tcGFyZShhcnJheVtqXSwgdCkgPiAwKSAtLWo7CiAgICAgIH0KICAgICAgaWYgKGNvbXBhcmUoYXJyYXlbbGVmdF0sIHQpID09PSAwKSBzd2FwKGFycmF5LCBsZWZ0LCBqKTtlbHNlICsraiwgc3dhcChhcnJheSwgaiwgcmlnaHQpOwogICAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7CiAgICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7CiAgICB9CiAgICByZXR1cm4gYXJyYXk7CiAgfQogIGZ1bmN0aW9uIHN3YXAoYXJyYXksIGksIGopIHsKICAgIGNvbnN0IHQgPSBhcnJheVtpXTsKICAgIGFycmF5W2ldID0gYXJyYXlbal07CiAgICBhcnJheVtqXSA9IHQ7CiAgfQoKICBmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHsKICAgIHZhbHVlcyA9IEZsb2F0NjRBcnJheS5mcm9tKG51bWJlcnModmFsdWVzKSk7CiAgICBpZiAoIShuID0gdmFsdWVzLmxlbmd0aCkgfHwgaXNOYU4ocCA9ICtwKSkgcmV0dXJuOwogICAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpOwogICAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heCh2YWx1ZXMpOwogICAgdmFyIG4sCiAgICAgIGkgPSAobiAtIDEpICogcCwKICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLAogICAgICB2YWx1ZTAgPSBtYXgocXVpY2tzZWxlY3QodmFsdWVzLCBpMCkuc3ViYXJyYXkoMCwgaTAgKyAxKSksCiAgICAgIHZhbHVlMSA9IG1pbih2YWx1ZXMuc3ViYXJyYXkoaTAgKyAxKSk7CiAgICByZXR1cm4gdmFsdWUwICsgKHZhbHVlMSAtIHZhbHVlMCkgKiAoaSAtIGkwKTsKICB9CgogIGZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIHZhbHVlb2YpIHsKICAgIHJldHVybiBxdWFudGlsZSh2YWx1ZXMsIDAuNSk7CiAgfQoKICB2YXIgbm9vcCA9IHsKICAgIHZhbHVlOiAoKSA9PiB7fQogIH07CiAgZnVuY3Rpb24gZGlzcGF0Y2goKSB7CiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF8gPSB7fSwgdDsgaSA8IG47ICsraSkgewogICAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgIiIpIHx8IHQgaW4gXyB8fCAvW1xzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiICsgdCk7CiAgICAgIF9bdF0gPSBbXTsKICAgIH0KICAgIHJldHVybiBuZXcgRGlzcGF0Y2goXyk7CiAgfQogIGZ1bmN0aW9uIERpc3BhdGNoKF8pIHsKICAgIHRoaXMuXyA9IF87CiAgfQogIGZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzJDEodHlwZW5hbWVzLCB0eXBlcykgewogICAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgIHZhciBuYW1lID0gIiIsCiAgICAgICAgaSA9IHQuaW5kZXhPZigiLiIpOwogICAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpOwogICAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdHlwZTogdCwKICAgICAgICBuYW1lOiBuYW1lCiAgICAgIH07CiAgICB9KTsKICB9CiAgRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gucHJvdG90eXBlID0gewogICAgY29uc3RydWN0b3I6IERpc3BhdGNoLAogICAgb246IGZ1bmN0aW9uICh0eXBlbmFtZSwgY2FsbGJhY2spIHsKICAgICAgdmFyIF8gPSB0aGlzLl8sCiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzJDEodHlwZW5hbWUgKyAiIiwgXyksCiAgICAgICAgdCwKICAgICAgICBpID0gLTEsCiAgICAgICAgbiA9IFQubGVuZ3RoOwoKICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4KICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpICYmICh0ID0gZ2V0JDEoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4KICAgICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS4KICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIgKyBjYWxsYmFjayk7CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0JDEoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spO2Vsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0JDEoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgY29weTogZnVuY3Rpb24gKCkgewogICAgICB2YXIgY29weSA9IHt9LAogICAgICAgIF8gPSB0aGlzLl87CiAgICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTsKICAgICAgcmV0dXJuIG5ldyBEaXNwYXRjaChjb3B5KTsKICAgIH0sCiAgICBjYWxsOiBmdW5jdGlvbiAodHlwZSwgdGhhdCkgewogICAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07CiAgICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOwogICAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7CiAgICB9LAogICAgYXBwbHk6IGZ1bmN0aW9uICh0eXBlLCB0aGF0LCBhcmdzKSB7CiAgICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOwogICAgICBmb3IgKHZhciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpOwogICAgfQogIH07CiAgZnVuY3Rpb24gZ2V0JDEodHlwZSwgbmFtZSkgewogICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkgewogICAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgcmV0dXJuIGMudmFsdWU7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gc2V0JDEodHlwZSwgbmFtZSwgY2FsbGJhY2spIHsKICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkgewogICAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHsKICAgICAgbmFtZTogbmFtZSwKICAgICAgdmFsdWU6IGNhbGxiYWNrCiAgICB9KTsKICAgIHJldHVybiB0eXBlOwogIH0KCiAgdmFyIHhodG1sID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOwogIHZhciBuYW1lc3BhY2VzID0gewogICAgc3ZnOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLAogICAgeGh0bWw6IHhodG1sLAogICAgeGxpbms6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwKICAgIHhtbDogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCiAgICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIgogIH07CgogIGZ1bmN0aW9uIG5hbWVzcGFjZSAobmFtZSkgewogICAgdmFyIHByZWZpeCA9IG5hbWUgKz0gIiIsCiAgICAgIGkgPSBwcmVmaXguaW5kZXhPZigiOiIpOwogICAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09ICJ4bWxucyIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTsKICAgIHJldHVybiBuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7CiAgICAgIHNwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sCiAgICAgIGxvY2FsOiBuYW1lCiAgICB9IDogbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMKICB9CgogIGZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCwKICAgICAgICB1cmkgPSB0aGlzLm5hbWVzcGFjZVVSSTsKICAgICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWwgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjcmVhdG9yRml4ZWQoZnVsbG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjcmVhdG9yIChuYW1lKSB7CiAgICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7CiAgICByZXR1cm4gKGZ1bGxuYW1lLmxvY2FsID8gY3JlYXRvckZpeGVkIDogY3JlYXRvckluaGVyaXQpKGZ1bGxuYW1lKTsKICB9CgogIGZ1bmN0aW9uIG5vbmUoKSB7fQogIGZ1bmN0aW9uIHNlbGVjdG9yIChzZWxlY3RvcikgewogICAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBub25lIDogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0IChzZWxlY3QpIHsKICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187CiAgICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQxKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7CiAgfQoKICAvLyBHaXZlbiBzb21ldGhpbmcgYXJyYXkgbGlrZSAob3IgbnVsbCksIHJldHVybnMgc29tZXRoaW5nIHRoYXQgaXMgc3RyaWN0bHkgYW4KICAvLyBhcnJheS4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGFycmF5LWxpa2Ugb2JqZWN0cyBwYXNzZWQgdG8gZDMuc2VsZWN0QWxsCiAgLy8gb3Igc2VsZWN0aW9uLnNlbGVjdEFsbCBhcmUgY29udmVydGVkIGludG8gcHJvcGVyIGFycmF5cyB3aGVuIGNyZWF0aW5nIGEKICAvLyBzZWxlY3Rpb247IHdlIGRvbuKAmXQgZXZlciB3YW50IHRvIGNyZWF0ZSBhIHNlbGVjdGlvbiBiYWNrZWQgYnkgYSBsaXZlCiAgLy8gSFRNTENvbGxlY3Rpb24gb3IgTm9kZUxpc3QuIEhvd2V2ZXIsIG5vdGUgdGhhdCBzZWxlY3Rpb24uc2VsZWN0QWxsIHdpbGwgdXNlIGEKICAvLyBzdGF0aWMgTm9kZUxpc3QgYXMgYSBncm91cCwgc2luY2UgaXQgc2FmZWx5IGRlcml2ZWQgZnJvbSBxdWVyeVNlbGVjdG9yQWxsLgogIGZ1bmN0aW9uIGFycmF5KHgpIHsKICAgIHJldHVybiB4ID09IG51bGwgPyBbXSA6IEFycmF5LmlzQXJyYXkoeCkgPyB4IDogQXJyYXkuZnJvbSh4KTsKICB9CgogIGZ1bmN0aW9uIGVtcHR5KCkgewogICAgcmV0dXJuIFtdOwogIH0KICBmdW5jdGlvbiBzZWxlY3RvckFsbCAoc2VsZWN0b3IpIHsKICAgIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkgOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGFycmF5QWxsKHNlbGVjdCkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGFycmF5KHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3RBbGwgKHNlbGVjdCkgewogICAgaWYgKHR5cGVvZiBzZWxlY3QgPT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IGFycmF5QWxsKHNlbGVjdCk7ZWxzZSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgc3ViZ3JvdXBzLnB1c2goc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKTsKICAgICAgICAgIHBhcmVudHMucHVzaChub2RlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDEoc3ViZ3JvdXBzLCBwYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIG1hdGNoZXIgKHNlbGVjdG9yKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHNlbGVjdG9yKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNoaWxkTWF0Y2hlcihzZWxlY3RvcikgewogICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7CiAgICAgIHJldHVybiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpOwogICAgfTsKICB9CgogIHZhciBmaW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmQ7CiAgZnVuY3Rpb24gY2hpbGRGaW5kKG1hdGNoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gZmluZC5jYWxsKHRoaXMuY2hpbGRyZW4sIG1hdGNoKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNoaWxkRmlyc3QoKSB7CiAgICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZDsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdENoaWxkIChtYXRjaCkgewogICAgcmV0dXJuIHRoaXMuc2VsZWN0KG1hdGNoID09IG51bGwgPyBjaGlsZEZpcnN0IDogY2hpbGRGaW5kKHR5cGVvZiBtYXRjaCA9PT0gImZ1bmN0aW9uIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpOwogIH0KCiAgdmFyIGZpbHRlciA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXI7CiAgZnVuY3Rpb24gY2hpbGRyZW4oKSB7CiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKTsKICB9CiAgZnVuY3Rpb24gY2hpbGRyZW5GaWx0ZXIobWF0Y2gpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0Q2hpbGRyZW4gKG1hdGNoKSB7CiAgICByZXR1cm4gdGhpcy5zZWxlY3RBbGwobWF0Y2ggPT0gbnVsbCA/IGNoaWxkcmVuIDogY2hpbGRyZW5GaWx0ZXIodHlwZW9mIG1hdGNoID09PSAiZnVuY3Rpb24iID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZmlsdGVyIChtYXRjaCkgewogICAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gImZ1bmN0aW9uIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTsKICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7CiAgICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kMShzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpOwogIH0KCiAgZnVuY3Rpb24gc3BhcnNlICh1cGRhdGUpIHsKICAgIHJldHVybiBuZXcgQXJyYXkodXBkYXRlLmxlbmd0aCk7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZW50ZXIgKCkgewogICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kMSh0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpOwogIH0KICBmdW5jdGlvbiBFbnRlck5vZGUocGFyZW50LCBkYXR1bSkgewogICAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7CiAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7CiAgICB0aGlzLl9uZXh0ID0gbnVsbDsKICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDsKICAgIHRoaXMuX19kYXRhX18gPSBkYXR1bTsKICB9CiAgRW50ZXJOb2RlLnByb3RvdHlwZSA9IHsKICAgIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUsCiAgICBhcHBlbmRDaGlsZDogZnVuY3Rpb24gKGNoaWxkKSB7CiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsKICAgIH0sCiAgICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uIChjaGlsZCwgbmV4dCkgewogICAgICByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7CiAgICB9LAogICAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24gKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICB9LAogICAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24gKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gY29uc3RhbnQkMSAoeCkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHg7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHsKICAgIHZhciBpID0gMCwKICAgICAgbm9kZSwKICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsCiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDsKCiAgICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLgogICAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuCiAgICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuCiAgICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkgewogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07CiAgICAgICAgdXBkYXRlW2ldID0gbm9kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTsKICAgICAgfQogICAgfQoKICAgIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBkb27igJl0IGZpdCBpbnRvIGV4aXQuCiAgICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7CiAgICB2YXIgaSwKICAgICAgbm9kZSwKICAgICAgbm9kZUJ5S2V5VmFsdWUgPSBuZXcgTWFwKCksCiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksCiAgICAgIGtleVZhbHVlOwoKICAgIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLgogICAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0LgogICAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApICsgIiI7CiAgICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHsKICAgICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS4KICAgIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuCiAgICAvLyBJZiB0aGVyZSBpcyBub3QgKG9yIHRoZSBrZXkgaXMgYSBkdXBsaWNhdGUpLCBhZGQgaXQgdG8gZW50ZXIuCiAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7CiAgICAgIGtleVZhbHVlID0ga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKSArICIiOwogICAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZSkpIHsKICAgICAgICB1cGRhdGVbaV0gPSBub2RlOwogICAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldOwogICAgICAgIG5vZGVCeUtleVZhbHVlLmRlbGV0ZShrZXlWYWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC4KICAgIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7CiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWVzW2ldKSA9PT0gbm9kZSkgewogICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGRhdHVtKG5vZGUpIHsKICAgIHJldHVybiBub2RlLl9fZGF0YV9fOwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fZGF0YSAodmFsdWUsIGtleSkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLCBkYXR1bSk7CiAgICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsCiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLAogICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB2YWx1ZSA9IGNvbnN0YW50JDEodmFsdWUpOwogICAgZm9yICh2YXIgbSA9IGdyb3Vwcy5sZW5ndGgsIHVwZGF0ZSA9IG5ldyBBcnJheShtKSwgZW50ZXIgPSBuZXcgQXJyYXkobSksIGV4aXQgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLAogICAgICAgIGdyb3VwID0gZ3JvdXBzW2pdLAogICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgIGRhdGEgPSBhcnJheWxpa2UodmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpKSwKICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIHVwZGF0ZUdyb3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpOwogICAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7CgogICAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXQKICAgICAgLy8gYXBwZW5kQ2hpbGQgY2FuIGluc2VydCB0aGUgbWF0ZXJpYWxpemVkIGVudGVyIG5vZGUgYmVmb3JlIHRoaXMgbm9kZSwKICAgICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuCiAgICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7CiAgICAgICAgaWYgKHByZXZpb3VzID0gZW50ZXJHcm91cFtpMF0pIHsKICAgICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7CiAgICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7CiAgICAgICAgICBwcmV2aW91cy5fbmV4dCA9IG5leHQgfHwgbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24kMSh1cGRhdGUsIHBhcmVudHMpOwogICAgdXBkYXRlLl9lbnRlciA9IGVudGVyOwogICAgdXBkYXRlLl9leGl0ID0gZXhpdDsKICAgIHJldHVybiB1cGRhdGU7CiAgfQoKICAvLyBHaXZlbiBzb21lIGRhdGEsIHRoaXMgcmV0dXJucyBhbiBhcnJheS1saWtlIHZpZXcgb2YgaXQ6IGFuIG9iamVjdCB0aGF0CiAgLy8gZXhwb3NlcyBhIGxlbmd0aCBwcm9wZXJ0eSBhbmQgYWxsb3dzIG51bWVyaWMgaW5kZXhpbmcuIE5vdGUgdGhhdCB1bmxpa2UKICAvLyBzZWxlY3RBbGwsIHRoaXMgaXNu4oCZdCB3b3JyaWVkIGFib3V0IOKAnGxpdmXigJ0gY29sbGVjdGlvbnMgYmVjYXVzZSB0aGUgcmVzdWx0aW5nCiAgLy8gYXJyYXkgd2lsbCBvbmx5IGJlIHVzZWQgYnJpZWZseSB3aGlsZSBkYXRhIGlzIGJlaW5nIGJvdW5kLiAoSXQgaXMgcG9zc2libGUgdG8KICAvLyBjYXVzZSB0aGUgZGF0YSB0byBjaGFuZ2Ugd2hpbGUgaXRlcmF0aW5nIGJ5IHVzaW5nIGEga2V5IGZ1bmN0aW9uLCBidXQgcGxlYXNlCiAgLy8gZG9u4oCZdDsgd2XigJlkIHJhdGhlciBhdm9pZCBhIGdyYXR1aXRvdXMgY29weS4pCiAgZnVuY3Rpb24gYXJyYXlsaWtlKGRhdGEpIHsKICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIgJiYgImxlbmd0aCIgaW4gZGF0YSA/IGRhdGEgLy8gQXJyYXksIFR5cGVkQXJyYXksIE5vZGVMaXN0LCBhcnJheS1saWtlCiAgICA6IEFycmF5LmZyb20oZGF0YSk7IC8vIE1hcCwgU2V0LCBpdGVyYWJsZSwgc3RyaW5nLCBvciBhbnl0aGluZyBlbHNlCiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZXhpdCAoKSB7CiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQxKHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9qb2luIChvbmVudGVyLCBvbnVwZGF0ZSwgb25leGl0KSB7CiAgICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksCiAgICAgIHVwZGF0ZSA9IHRoaXMsCiAgICAgIGV4aXQgPSB0aGlzLmV4aXQoKTsKICAgIGlmICh0eXBlb2Ygb25lbnRlciA9PT0gImZ1bmN0aW9uIikgewogICAgICBlbnRlciA9IG9uZW50ZXIoZW50ZXIpOwogICAgICBpZiAoZW50ZXIpIGVudGVyID0gZW50ZXIuc2VsZWN0aW9uKCk7CiAgICB9IGVsc2UgewogICAgICBlbnRlciA9IGVudGVyLmFwcGVuZChvbmVudGVyICsgIiIpOwogICAgfQogICAgaWYgKG9udXBkYXRlICE9IG51bGwpIHsKICAgICAgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTsKICAgICAgaWYgKHVwZGF0ZSkgdXBkYXRlID0gdXBkYXRlLnNlbGVjdGlvbigpOwogICAgfQogICAgaWYgKG9uZXhpdCA9PSBudWxsKSBleGl0LnJlbW92ZSgpO2Vsc2Ugb25leGl0KGV4aXQpOwogICAgcmV0dXJuIGVudGVyICYmIHVwZGF0ZSA/IGVudGVyLm1lcmdlKHVwZGF0ZSkub3JkZXIoKSA6IHVwZGF0ZTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9tZXJnZSAoY29udGV4dCkgewogICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7CiAgICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7CiAgICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICAgIH0KICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDEobWVyZ2VzLCB0aGlzLl9wYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9vcmRlciAoKSB7CiAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAtMSwgbSA9IGdyb3Vwcy5sZW5ndGg7ICsraiA8IG07KSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBpZiAobmV4dCAmJiBub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5leHQpIF4gNCkgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTsKICAgICAgICAgIG5leHQgPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fc29ydCAoY29tcGFyZSkgewogICAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nOwogICAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikgewogICAgICByZXR1cm4gYSAmJiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7CiAgICB9CiAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7CiAgICB9CiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQxKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7CiAgfQogIGZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7CiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fY2FsbCAoKSB7CiAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07CiAgICBhcmd1bWVudHNbMF0gPSB0aGlzOwogICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX25vZGVzICgpIHsKICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMpOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX25vZGUgKCkgewogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTsKICAgICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX3NpemUgKCkgewogICAgbGV0IHNpemUgPSAwOwogICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMpICsrc2l6ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgcmV0dXJuIHNpemU7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZW1wdHkgKCkgewogICAgcmV0dXJuICF0aGlzLm5vZGUoKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9lYWNoIChjYWxsYmFjaykgewogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KCiAgZnVuY3Rpb24gYXR0clJlbW92ZSQxKG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0clJlbW92ZU5TJDEoZnVsbG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGF0dHJDb25zdGFudCQxKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyQ29uc3RhbnROUyQxKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbiQxKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO2Vsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyQxKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7ZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdik7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fYXR0ciAobmFtZSwgdmFsdWUpIHsKICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSgpOwogICAgICByZXR1cm4gZnVsbG5hbWUubG9jYWwgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCkgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsID8gZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMkMSA6IGF0dHJSZW1vdmUkMSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIiA/IGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMkMSA6IGF0dHJGdW5jdGlvbiQxIDogZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyQxIDogYXR0ckNvbnN0YW50JDEpKGZ1bGxuYW1lLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gZGVmYXVsdFZpZXcgKG5vZGUpIHsKICAgIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IC8vIG5vZGUgaXMgYSBOb2RlCiAgICB8fCBub2RlLmRvY3VtZW50ICYmIG5vZGUgLy8gbm9kZSBpcyBhIFdpbmRvdwogICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50CiAgfQoKICBmdW5jdGlvbiBzdHlsZVJlbW92ZSQxKG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZUNvbnN0YW50JDEobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uJDEobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh2ID09IG51bGwpIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7ZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9zdHlsZSAobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyBzdHlsZVJlbW92ZSQxIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gc3R5bGVGdW5jdGlvbiQxIDogc3R5bGVDb25zdGFudCQxKShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/ICIiIDogcHJpb3JpdHkpKSA6IHN0eWxlVmFsdWUodGhpcy5ub2RlKCksIG5hbWUpOwogIH0KICBmdW5jdGlvbiBzdHlsZVZhbHVlKG5vZGUsIG5hbWUpIHsKICAgIHJldHVybiBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkgfHwgZGVmYXVsdFZpZXcobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpOwogIH0KCiAgZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgZGVsZXRlIHRoaXNbbmFtZV07CiAgICB9OwogIH0KICBmdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzW25hbWVdID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO2Vsc2UgdGhpc1tuYW1lXSA9IHY7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fcHJvcGVydHkgKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIiA/IHByb3BlcnR5RnVuY3Rpb24gOiBwcm9wZXJ0eUNvbnN0YW50KShuYW1lLCB2YWx1ZSkpIDogdGhpcy5ub2RlKClbbmFtZV07CiAgfQoKICBmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykgewogICAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XHMrLyk7CiAgfQogIGZ1bmN0aW9uIGNsYXNzTGlzdChub2RlKSB7CiAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTsKICB9CiAgZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHsKICAgIHRoaXMuX25vZGUgPSBub2RlOwogICAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8ICIiKTsKICB9CiAgQ2xhc3NMaXN0LnByb3RvdHlwZSA9IHsKICAgIGFkZDogZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpOwogICAgICBpZiAoaSA8IDApIHsKICAgICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsIHRoaXMuX25hbWVzLmpvaW4oIiAiKSk7CiAgICAgIH0KICAgIH0sCiAgICByZW1vdmU6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsKICAgICAgaWYgKGkgPj0gMCkgewogICAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTsKICAgICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOwogICAgICB9CiAgICB9LAogICAgY29udGFpbnM6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7CiAgICB9CiAgfTsKICBmdW5jdGlvbiBjbGFzc2VkQWRkKG5vZGUsIG5hbWVzKSB7CiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwKICAgICAgaSA9IC0xLAogICAgICBuID0gbmFtZXMubGVuZ3RoOwogICAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTsKICB9CiAgZnVuY3Rpb24gY2xhc3NlZFJlbW92ZShub2RlLCBuYW1lcykgewogICAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksCiAgICAgIGkgPSAtMSwKICAgICAgbiA9IG5hbWVzLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7CiAgfQogIGZ1bmN0aW9uIGNsYXNzZWRUcnVlKG5hbWVzKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICBjbGFzc2VkQWRkKHRoaXMsIG5hbWVzKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQgOiBjbGFzc2VkUmVtb3ZlKSh0aGlzLCBuYW1lcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fY2xhc3NlZCAobmFtZSwgdmFsdWUpIHsKICAgIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArICIiKTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCh0aGlzLm5vZGUoKSksCiAgICAgICAgaSA9IC0xLAogICAgICAgIG4gPSBuYW1lcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gY2xhc3NlZEZ1bmN0aW9uIDogdmFsdWUgPyBjbGFzc2VkVHJ1ZSA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7CiAgfQoKICBmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkgewogICAgdGhpcy50ZXh0Q29udGVudCA9ICIiOwogIH0KICBmdW5jdGlvbiB0ZXh0Q29uc3RhbnQkMSh2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdGV4dEZ1bmN0aW9uJDEodmFsdWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/ICIiIDogdjsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl90ZXh0ICh2YWx1ZSkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbCA/IHRleHRSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gdGV4dEZ1bmN0aW9uJDEgOiB0ZXh0Q29uc3RhbnQkMSkodmFsdWUpKSA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50OwogIH0KCiAgZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHsKICAgIHRoaXMuaW5uZXJIVE1MID0gIiI7CiAgfQogIGZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB0aGlzLmlubmVySFRNTCA9IHYgPT0gbnVsbCA/ICIiIDogdjsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9odG1sICh2YWx1ZSkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbCA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gaHRtbEZ1bmN0aW9uIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpIDogdGhpcy5ub2RlKCkuaW5uZXJIVE1MOwogIH0KCiAgZnVuY3Rpb24gcmFpc2UoKSB7CiAgICBpZiAodGhpcy5uZXh0U2libGluZykgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpOwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fcmFpc2UgKCkgewogICAgcmV0dXJuIHRoaXMuZWFjaChyYWlzZSk7CiAgfQoKICBmdW5jdGlvbiBsb3dlcigpIHsKICAgIGlmICh0aGlzLnByZXZpb3VzU2libGluZykgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLCB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9sb3dlciAoKSB7CiAgICByZXR1cm4gdGhpcy5lYWNoKGxvd2VyKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9hcHBlbmQgKG5hbWUpIHsKICAgIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpOwogICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBjb25zdGFudE51bGwoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX2luc2VydCAobmFtZSwgYmVmb3JlKSB7CiAgICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvcihuYW1lKSwKICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBlb2YgYmVmb3JlID09PSAiZnVuY3Rpb24iID8gYmVmb3JlIDogc2VsZWN0b3IoYmVmb3JlKTsKICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZSgpIHsKICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9yZW1vdmUgKCkgewogICAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdygpIHsKICAgIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwKICAgICAgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZURlZXAoKSB7CiAgICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwKICAgICAgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZSAoZGVlcCkgewogICAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwIDogc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyk7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZGF0dW0gKHZhbHVlKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMucHJvcGVydHkoIl9fZGF0YV9fIiwgdmFsdWUpIDogdGhpcy5ub2RlKCkuX19kYXRhX187CiAgfQoKICBmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCwgdGhpcy5fX2RhdGFfXyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHsKICAgIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbiAodCkgewogICAgICB2YXIgbmFtZSA9ICIiLAogICAgICAgIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB0eXBlOiB0LAogICAgICAgIG5hbWU6IG5hbWUKICAgICAgfTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG9uID0gdGhpcy5fX29uOwogICAgICBpZiAoIW9uKSByZXR1cm47CiAgICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHsKICAgICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHsKICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8ub3B0aW9ucyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9uWysraV0gPSBvOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO2Vsc2UgZGVsZXRlIHRoaXMuX19vbjsKICAgIH07CiAgfQogIGZ1bmN0aW9uIG9uQWRkKHR5cGVuYW1lLCB2YWx1ZSwgb3B0aW9ucykgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG9uID0gdGhpcy5fX29uLAogICAgICAgIG8sCiAgICAgICAgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIodmFsdWUpOwogICAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICAgICAgaWYgKChvID0gb25bal0pLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7CiAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpOwogICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLm9wdGlvbnMgPSBvcHRpb25zKTsKICAgICAgICAgIG8udmFsdWUgPSB2YWx1ZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTsKICAgICAgbyA9IHsKICAgICAgICB0eXBlOiB0eXBlbmFtZS50eXBlLAogICAgICAgIG5hbWU6IHR5cGVuYW1lLm5hbWUsCiAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgIGxpc3RlbmVyOiBsaXN0ZW5lciwKICAgICAgICBvcHRpb25zOiBvcHRpb25zCiAgICAgIH07CiAgICAgIGlmICghb24pIHRoaXMuX19vbiA9IFtvXTtlbHNlIG9uLnB1c2gobyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fb24gKHR5cGVuYW1lLCB2YWx1ZSwgb3B0aW9ucykgewogICAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgIiIpLAogICAgICBpLAogICAgICBuID0gdHlwZW5hbWVzLmxlbmd0aCwKICAgICAgdDsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uOwogICAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkgewogICAgICAgICAgICByZXR1cm4gby52YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgb3B0aW9ucykpOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50KG5vZGUsIHR5cGUsIHBhcmFtcykgewogICAgdmFyIHdpbmRvdyA9IGRlZmF1bHRWaWV3KG5vZGUpLAogICAgICBldmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDsKICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgZXZlbnQgPSBuZXcgZXZlbnQodHlwZSwgcGFyYW1zKTsKICAgIH0gZWxzZSB7CiAgICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpOwogICAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpOwogICAgfQogICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICB9CiAgZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkaXNwYXRjaEZ1bmN0aW9uKHR5cGUsIHBhcmFtcykgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX2Rpc3BhdGNoICh0eXBlLCBwYXJhbXMpIHsKICAgIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiBwYXJhbXMgPT09ICJmdW5jdGlvbiIgPyBkaXNwYXRjaEZ1bmN0aW9uIDogZGlzcGF0Y2hDb25zdGFudCkodHlwZSwgcGFyYW1zKSk7CiAgfQoKICBmdW5jdGlvbiogc2VsZWN0aW9uX2l0ZXJhdG9yICgpIHsKICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHlpZWxkIG5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIHZhciByb290ID0gW251bGxdOwogIGZ1bmN0aW9uIFNlbGVjdGlvbiQxKGdyb3VwcywgcGFyZW50cykgewogICAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzOwogICAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbigpIHsKICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDEoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSwgcm9vdCk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9CiAgU2VsZWN0aW9uJDEucHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZSA9IHsKICAgIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24kMSwKICAgIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCwKICAgIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCwKICAgIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fc2VsZWN0Q2hpbGQsCiAgICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuLAogICAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLAogICAgZGF0YTogc2VsZWN0aW9uX2RhdGEsCiAgICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLAogICAgZXhpdDogc2VsZWN0aW9uX2V4aXQsCiAgICBqb2luOiBzZWxlY3Rpb25fam9pbiwKICAgIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsCiAgICBzZWxlY3Rpb246IHNlbGVjdGlvbl9zZWxlY3Rpb24sCiAgICBvcmRlcjogc2VsZWN0aW9uX29yZGVyLAogICAgc29ydDogc2VsZWN0aW9uX3NvcnQsCiAgICBjYWxsOiBzZWxlY3Rpb25fY2FsbCwKICAgIG5vZGVzOiBzZWxlY3Rpb25fbm9kZXMsCiAgICBub2RlOiBzZWxlY3Rpb25fbm9kZSwKICAgIHNpemU6IHNlbGVjdGlvbl9zaXplLAogICAgZW1wdHk6IHNlbGVjdGlvbl9lbXB0eSwKICAgIGVhY2g6IHNlbGVjdGlvbl9lYWNoLAogICAgYXR0cjogc2VsZWN0aW9uX2F0dHIsCiAgICBzdHlsZTogc2VsZWN0aW9uX3N0eWxlLAogICAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSwKICAgIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLAogICAgdGV4dDogc2VsZWN0aW9uX3RleHQsCiAgICBodG1sOiBzZWxlY3Rpb25faHRtbCwKICAgIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsCiAgICBsb3dlcjogc2VsZWN0aW9uX2xvd2VyLAogICAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLAogICAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LAogICAgcmVtb3ZlOiBzZWxlY3Rpb25fcmVtb3ZlLAogICAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSwKICAgIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sCiAgICBvbjogc2VsZWN0aW9uX29uLAogICAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCwKICAgIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25faXRlcmF0b3IKICB9OwoKICBmdW5jdGlvbiBkZWZpbmUgKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHsKICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlOwogICAgcHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7CiAgfQogIGZ1bmN0aW9uIGV4dGVuZChwYXJlbnQsIGRlZmluaXRpb24pIHsKICAgIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpOwogICAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldOwogICAgcmV0dXJuIHByb3RvdHlwZTsKICB9CgogIGZ1bmN0aW9uIENvbG9yKCkge30KICB2YXIgZGFya2VyID0gMC43OwogIHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7CiAgdmFyIHJlSSA9ICJcXHMqKFsrLV0/XFxkKylcXHMqIiwKICAgIHJlTiA9ICJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIiwKICAgIHJlUCA9ICJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsCiAgICByZUhleCA9IC9eIyhbMC05YS1mXXszLDh9KSQvLAogICAgcmVSZ2JJbnRlZ2VyID0gbmV3IFJlZ0V4cChgXnJnYlxcKCR7cmVJfSwke3JlSX0sJHtyZUl9XFwpJGApLAogICAgcmVSZ2JQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYlxcKCR7cmVQfSwke3JlUH0sJHtyZVB9XFwpJGApLAogICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtyZUl9LCR7cmVJfSwke3JlSX0sJHtyZU59XFwpJGApLAogICAgcmVSZ2JhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtyZVB9LCR7cmVQfSwke3JlUH0sJHtyZU59XFwpJGApLAogICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cChgXmhzbFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9XFwpJGApLAogICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xhXFwoJHtyZU59LCR7cmVQfSwke3JlUH0sJHtyZU59XFwpJGApOwogIHZhciBuYW1lZCA9IHsKICAgIGFsaWNlYmx1ZTogMHhmMGY4ZmYsCiAgICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LAogICAgYXF1YTogMHgwMGZmZmYsCiAgICBhcXVhbWFyaW5lOiAweDdmZmZkNCwKICAgIGF6dXJlOiAweGYwZmZmZiwKICAgIGJlaWdlOiAweGY1ZjVkYywKICAgIGJpc3F1ZTogMHhmZmU0YzQsCiAgICBibGFjazogMHgwMDAwMDAsCiAgICBibGFuY2hlZGFsbW9uZDogMHhmZmViY2QsCiAgICBibHVlOiAweDAwMDBmZiwKICAgIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLAogICAgYnJvd246IDB4YTUyYTJhLAogICAgYnVybHl3b29kOiAweGRlYjg4NywKICAgIGNhZGV0Ymx1ZTogMHg1ZjllYTAsCiAgICBjaGFydHJldXNlOiAweDdmZmYwMCwKICAgIGNob2NvbGF0ZTogMHhkMjY5MWUsCiAgICBjb3JhbDogMHhmZjdmNTAsCiAgICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsCiAgICBjb3Juc2lsazogMHhmZmY4ZGMsCiAgICBjcmltc29uOiAweGRjMTQzYywKICAgIGN5YW46IDB4MDBmZmZmLAogICAgZGFya2JsdWU6IDB4MDAwMDhiLAogICAgZGFya2N5YW46IDB4MDA4YjhiLAogICAgZGFya2dvbGRlbnJvZDogMHhiODg2MGIsCiAgICBkYXJrZ3JheTogMHhhOWE5YTksCiAgICBkYXJrZ3JlZW46IDB4MDA2NDAwLAogICAgZGFya2dyZXk6IDB4YTlhOWE5LAogICAgZGFya2toYWtpOiAweGJkYjc2YiwKICAgIGRhcmttYWdlbnRhOiAweDhiMDA4YiwKICAgIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZiwKICAgIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLAogICAgZGFya29yY2hpZDogMHg5OTMyY2MsCiAgICBkYXJrcmVkOiAweDhiMDAwMCwKICAgIGRhcmtzYWxtb246IDB4ZTk5NjdhLAogICAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZiwKICAgIGRhcmtzbGF0ZWJsdWU6IDB4NDgzZDhiLAogICAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsCiAgICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZiwKICAgIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLAogICAgZGFya3Zpb2xldDogMHg5NDAwZDMsCiAgICBkZWVwcGluazogMHhmZjE0OTMsCiAgICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsCiAgICBkaW1ncmF5OiAweDY5Njk2OSwKICAgIGRpbWdyZXk6IDB4Njk2OTY5LAogICAgZG9kZ2VyYmx1ZTogMHgxZTkwZmYsCiAgICBmaXJlYnJpY2s6IDB4YjIyMjIyLAogICAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLAogICAgZm9yZXN0Z3JlZW46IDB4MjI4YjIyLAogICAgZnVjaHNpYTogMHhmZjAwZmYsCiAgICBnYWluc2Jvcm86IDB4ZGNkY2RjLAogICAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsCiAgICBnb2xkOiAweGZmZDcwMCwKICAgIGdvbGRlbnJvZDogMHhkYWE1MjAsCiAgICBncmF5OiAweDgwODA4MCwKICAgIGdyZWVuOiAweDAwODAwMCwKICAgIGdyZWVueWVsbG93OiAweGFkZmYyZiwKICAgIGdyZXk6IDB4ODA4MDgwLAogICAgaG9uZXlkZXc6IDB4ZjBmZmYwLAogICAgaG90cGluazogMHhmZjY5YjQsCiAgICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLAogICAgaW5kaWdvOiAweDRiMDA4MiwKICAgIGl2b3J5OiAweGZmZmZmMCwKICAgIGtoYWtpOiAweGYwZTY4YywKICAgIGxhdmVuZGVyOiAweGU2ZTZmYSwKICAgIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LAogICAgbGF3bmdyZWVuOiAweDdjZmMwMCwKICAgIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsCiAgICBsaWdodGJsdWU6IDB4YWRkOGU2LAogICAgbGlnaHRjb3JhbDogMHhmMDgwODAsCiAgICBsaWdodGN5YW46IDB4ZTBmZmZmLAogICAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLAogICAgbGlnaHRncmF5OiAweGQzZDNkMywKICAgIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLAogICAgbGlnaHRncmV5OiAweGQzZDNkMywKICAgIGxpZ2h0cGluazogMHhmZmI2YzEsCiAgICBsaWdodHNhbG1vbjogMHhmZmEwN2EsCiAgICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSwKICAgIGxpZ2h0c2t5Ymx1ZTogMHg4N2NlZmEsCiAgICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksCiAgICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksCiAgICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsCiAgICBsaWdodHllbGxvdzogMHhmZmZmZTAsCiAgICBsaW1lOiAweDAwZmYwMCwKICAgIGxpbWVncmVlbjogMHgzMmNkMzIsCiAgICBsaW5lbjogMHhmYWYwZTYsCiAgICBtYWdlbnRhOiAweGZmMDBmZiwKICAgIG1hcm9vbjogMHg4MDAwMDAsCiAgICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSwKICAgIG1lZGl1bWJsdWU6IDB4MDAwMGNkLAogICAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMywKICAgIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsCiAgICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsCiAgICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLAogICAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLAogICAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYywKICAgIG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsCiAgICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLAogICAgbWludGNyZWFtOiAweGY1ZmZmYSwKICAgIG1pc3R5cm9zZTogMHhmZmU0ZTEsCiAgICBtb2NjYXNpbjogMHhmZmU0YjUsCiAgICBuYXZham93aGl0ZTogMHhmZmRlYWQsCiAgICBuYXZ5OiAweDAwMDA4MCwKICAgIG9sZGxhY2U6IDB4ZmRmNWU2LAogICAgb2xpdmU6IDB4ODA4MDAwLAogICAgb2xpdmVkcmFiOiAweDZiOGUyMywKICAgIG9yYW5nZTogMHhmZmE1MDAsCiAgICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLAogICAgb3JjaGlkOiAweGRhNzBkNiwKICAgIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLAogICAgcGFsZWdyZWVuOiAweDk4ZmI5OCwKICAgIHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLAogICAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsCiAgICBwYXBheWF3aGlwOiAweGZmZWZkNSwKICAgIHBlYWNocHVmZjogMHhmZmRhYjksCiAgICBwZXJ1OiAweGNkODUzZiwKICAgIHBpbms6IDB4ZmZjMGNiLAogICAgcGx1bTogMHhkZGEwZGQsCiAgICBwb3dkZXJibHVlOiAweGIwZTBlNiwKICAgIHB1cnBsZTogMHg4MDAwODAsCiAgICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSwKICAgIHJlZDogMHhmZjAwMDAsCiAgICByb3N5YnJvd246IDB4YmM4ZjhmLAogICAgcm95YWxibHVlOiAweDQxNjllMSwKICAgIHNhZGRsZWJyb3duOiAweDhiNDUxMywKICAgIHNhbG1vbjogMHhmYTgwNzIsCiAgICBzYW5keWJyb3duOiAweGY0YTQ2MCwKICAgIHNlYWdyZWVuOiAweDJlOGI1NywKICAgIHNlYXNoZWxsOiAweGZmZjVlZSwKICAgIHNpZW5uYTogMHhhMDUyMmQsCiAgICBzaWx2ZXI6IDB4YzBjMGMwLAogICAgc2t5Ymx1ZTogMHg4N2NlZWIsCiAgICBzbGF0ZWJsdWU6IDB4NmE1YWNkLAogICAgc2xhdGVncmF5OiAweDcwODA5MCwKICAgIHNsYXRlZ3JleTogMHg3MDgwOTAsCiAgICBzbm93OiAweGZmZmFmYSwKICAgIHNwcmluZ2dyZWVuOiAweDAwZmY3ZiwKICAgIHN0ZWVsYmx1ZTogMHg0NjgyYjQsCiAgICB0YW46IDB4ZDJiNDhjLAogICAgdGVhbDogMHgwMDgwODAsCiAgICB0aGlzdGxlOiAweGQ4YmZkOCwKICAgIHRvbWF0bzogMHhmZjYzNDcsCiAgICB0dXJxdW9pc2U6IDB4NDBlMGQwLAogICAgdmlvbGV0OiAweGVlODJlZSwKICAgIHdoZWF0OiAweGY1ZGViMywKICAgIHdoaXRlOiAweGZmZmZmZiwKICAgIHdoaXRlc21va2U6IDB4ZjVmNWY1LAogICAgeWVsbG93OiAweGZmZmYwMCwKICAgIHllbGxvd2dyZWVuOiAweDlhY2QzMgogIH07CiAgZGVmaW5lKENvbG9yLCBjb2xvciwgewogICAgY29weShjaGFubmVscykgewogICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLCB0aGlzLCBjaGFubmVscyk7CiAgICB9LAogICAgZGlzcGxheWFibGUoKSB7CiAgICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7CiAgICB9LAogICAgaGV4OiBjb2xvcl9mb3JtYXRIZXgsCiAgICAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LgogICAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgsCiAgICBmb3JtYXRIZXg4OiBjb2xvcl9mb3JtYXRIZXg4LAogICAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsCiAgICBmb3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYiwKICAgIHRvU3RyaW5nOiBjb2xvcl9mb3JtYXRSZ2IKICB9KTsKICBmdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXgoKSB7CiAgICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTsKICB9CiAgZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4OCgpIHsKICAgIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleDgoKTsKICB9CiAgZnVuY3Rpb24gY29sb3JfZm9ybWF0SHNsKCkgewogICAgcmV0dXJuIGhzbENvbnZlcnQodGhpcykuZm9ybWF0SHNsKCk7CiAgfQogIGZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHsKICAgIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpOwogIH0KICBmdW5jdGlvbiBjb2xvcihmb3JtYXQpIHsKICAgIHZhciBtLCBsOwogICAgZm9ybWF0ID0gKGZvcm1hdCArICIiKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgIHJldHVybiAobSA9IHJlSGV4LmV4ZWMoZm9ybWF0KSkgPyAobCA9IG1bMV0ubGVuZ3RoLCBtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBsID09PSA2ID8gcmdibihtKSAvLyAjZmYwMDAwCiAgICA6IGwgPT09IDMgPyBuZXcgUmdiKG0gPj4gOCAmIDB4ZiB8IG0gPj4gNCAmIDB4ZjAsIG0gPj4gNCAmIDB4ZiB8IG0gJiAweGYwLCAobSAmIDB4ZikgPDwgNCB8IG0gJiAweGYsIDEpIC8vICNmMDAKICAgIDogbCA9PT0gOCA/IHJnYmEobSA+PiAyNCAmIDB4ZmYsIG0gPj4gMTYgJiAweGZmLCBtID4+IDggJiAweGZmLCAobSAmIDB4ZmYpIC8gMHhmZikgLy8gI2ZmMDAwMDAwCiAgICA6IGwgPT09IDQgPyByZ2JhKG0gPj4gMTIgJiAweGYgfCBtID4+IDggJiAweGYwLCBtID4+IDggJiAweGYgfCBtID4+IDQgJiAweGYwLCBtID4+IDQgJiAweGYgfCBtICYgMHhmMCwgKChtICYgMHhmKSA8PCA0IHwgbSAmIDB4ZikgLyAweGZmKSAvLyAjZjAwMAogICAgOiBudWxsIC8vIGludmFsaWQgaGV4CiAgICApIDogKG0gPSByZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMCkKICAgIDogKG0gPSByZVJnYlBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSkKICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKQogICAgOiAobSA9IHJlUmdiYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSkKICAgIDogKG0gPSByZUhzbFBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpCiAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpCiAgICA6IG5hbWVkLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuKG5hbWVkW2Zvcm1hdF0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zCiAgICA6IGZvcm1hdCA9PT0gInRyYW5zcGFyZW50IiA/IG5ldyBSZ2IoTmFOLCBOYU4sIE5hTiwgMCkgOiBudWxsOwogIH0KICBmdW5jdGlvbiByZ2JuKG4pIHsKICAgIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7CiAgfQogIGZ1bmN0aW9uIHJnYmEociwgZywgYiwgYSkgewogICAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOOwogICAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7CiAgfQogIGZ1bmN0aW9uIHJnYkNvbnZlcnQobykgewogICAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pOwogICAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYigpOwogICAgbyA9IG8ucmdiKCk7CiAgICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpOwogIH0KICBmdW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7CiAgfQogIGZ1bmN0aW9uIFJnYihyLCBnLCBiLCBvcGFjaXR5KSB7CiAgICB0aGlzLnIgPSArcjsKICAgIHRoaXMuZyA9ICtnOwogICAgdGhpcy5iID0gK2I7CiAgICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKICB9CiAgZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHsKICAgIGJyaWdodGVyKGspIHsKICAgICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspOwogICAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgfSwKICAgIGRhcmtlcihrKSB7CiAgICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspOwogICAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgfSwKICAgIHJnYigpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgY2xhbXAoKSB7CiAgICAgIHJldHVybiBuZXcgUmdiKGNsYW1waSh0aGlzLnIpLCBjbGFtcGkodGhpcy5nKSwgY2xhbXBpKHRoaXMuYiksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTsKICAgIH0sCiAgICBkaXNwbGF5YWJsZSgpIHsKICAgICAgcmV0dXJuIC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41ICYmIC0wLjUgPD0gdGhpcy5nICYmIHRoaXMuZyA8IDI1NS41ICYmIC0wLjUgPD0gdGhpcy5iICYmIHRoaXMuYiA8IDI1NS41ICYmIDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxOwogICAgfSwKICAgIGhleDogcmdiX2Zvcm1hdEhleCwKICAgIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguCiAgICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsCiAgICBmb3JtYXRIZXg4OiByZ2JfZm9ybWF0SGV4OCwKICAgIGZvcm1hdFJnYjogcmdiX2Zvcm1hdFJnYiwKICAgIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiCiAgfSkpOwogIGZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7CiAgICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX1gOwogIH0KICBmdW5jdGlvbiByZ2JfZm9ybWF0SGV4OCgpIHsKICAgIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfSR7aGV4KChpc05hTih0aGlzLm9wYWNpdHkpID8gMSA6IHRoaXMub3BhY2l0eSkgKiAyNTUpfWA7CiAgfQogIGZ1bmN0aW9uIHJnYl9mb3JtYXRSZ2IoKSB7CiAgICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7CiAgICByZXR1cm4gYCR7YSA9PT0gMSA/ICJyZ2IoIiA6ICJyZ2JhKCJ9JHtjbGFtcGkodGhpcy5yKX0sICR7Y2xhbXBpKHRoaXMuZyl9LCAke2NsYW1waSh0aGlzLmIpfSR7YSA9PT0gMSA/ICIpIiA6IGAsICR7YX0pYH1gOwogIH0KICBmdW5jdGlvbiBjbGFtcGEob3BhY2l0eSkgewogICAgcmV0dXJuIGlzTmFOKG9wYWNpdHkpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG9wYWNpdHkpKTsKICB9CiAgZnVuY3Rpb24gY2xhbXBpKHZhbHVlKSB7CiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7CiAgfQogIGZ1bmN0aW9uIGhleCh2YWx1ZSkgewogICAgdmFsdWUgPSBjbGFtcGkodmFsdWUpOwogICAgcmV0dXJuICh2YWx1ZSA8IDE2ID8gIjAiIDogIiIpICsgdmFsdWUudG9TdHJpbmcoMTYpOwogIH0KICBmdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHsKICAgIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjtlbHNlIGlmIChsIDw9IDAgfHwgbCA+PSAxKSBoID0gcyA9IE5hTjtlbHNlIGlmIChzIDw9IDApIGggPSBOYU47CiAgICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBhKTsKICB9CiAgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7CiAgICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTsKICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTsKICAgIGlmICghbykgcmV0dXJuIG5ldyBIc2woKTsKICAgIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbzsKICAgIG8gPSBvLnJnYigpOwogICAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgIGcgPSBvLmcgLyAyNTUsCiAgICAgIGIgPSBvLmIgLyAyNTUsCiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLAogICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwKICAgICAgaCA9IE5hTiwKICAgICAgcyA9IG1heCAtIG1pbiwKICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjsKICAgIGlmIChzKSB7CiAgICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O2Vsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7CiAgICAgIHMgLz0gbCA8IDAuNSA/IG1heCArIG1pbiA6IDIgLSBtYXggLSBtaW47CiAgICAgIGggKj0gNjA7CiAgICB9IGVsc2UgewogICAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDsKICAgIH0KICAgIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7CiAgfQogIGZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICB9CiAgZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHsKICAgIHRoaXMuaCA9ICtoOwogICAgdGhpcy5zID0gK3M7CiAgICB0aGlzLmwgPSArbDsKICAgIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5OwogIH0KICBkZWZpbmUoSHNsLCBoc2wsIGV4dGVuZChDb2xvciwgewogICAgYnJpZ2h0ZXIoaykgewogICAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7CiAgICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgfSwKICAgIGRhcmtlcihrKSB7CiAgICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspOwogICAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICAgIH0sCiAgICByZ2IoKSB7CiAgICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLAogICAgICAgIHMgPSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucywKICAgICAgICBsID0gdGhpcy5sLAogICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsCiAgICAgICAgbTEgPSAyICogbCAtIG0yOwogICAgICByZXR1cm4gbmV3IFJnYihoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksIGhzbDJyZ2IoaCwgbTEsIG0yKSwgaHNsMnJnYihoIDwgMTIwID8gaCArIDI0MCA6IGggLSAxMjAsIG0xLCBtMiksIHRoaXMub3BhY2l0eSk7CiAgICB9LAogICAgY2xhbXAoKSB7CiAgICAgIHJldHVybiBuZXcgSHNsKGNsYW1waCh0aGlzLmgpLCBjbGFtcHQodGhpcy5zKSwgY2xhbXB0KHRoaXMubCksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTsKICAgIH0sCiAgICBkaXNwbGF5YWJsZSgpIHsKICAgICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKSAmJiAwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSAmJiAwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMTsKICAgIH0sCiAgICBmb3JtYXRIc2woKSB7CiAgICAgIGNvbnN0IGEgPSBjbGFtcGEodGhpcy5vcGFjaXR5KTsKICAgICAgcmV0dXJuIGAke2EgPT09IDEgPyAiaHNsKCIgOiAiaHNsYSgifSR7Y2xhbXBoKHRoaXMuaCl9LCAke2NsYW1wdCh0aGlzLnMpICogMTAwfSUsICR7Y2xhbXB0KHRoaXMubCkgKiAxMDB9JSR7YSA9PT0gMSA/ICIpIiA6IGAsICR7YX0pYH1gOwogICAgfQogIH0pKTsKICBmdW5jdGlvbiBjbGFtcGgodmFsdWUpIHsKICAgIHZhbHVlID0gKHZhbHVlIHx8IDApICUgMzYwOwogICAgcmV0dXJuIHZhbHVlIDwgMCA/IHZhbHVlICsgMzYwIDogdmFsdWU7CiAgfQogIGZ1bmN0aW9uIGNsYW1wdCh2YWx1ZSkgewogICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbHVlIHx8IDApKTsKICB9CgogIC8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi8KICBmdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikgewogICAgcmV0dXJuIChoIDwgNjAgPyBtMSArIChtMiAtIG0xKSAqIGggLyA2MCA6IGggPCAxODAgPyBtMiA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwIDogbTEpICogMjU1OwogIH0KCiAgdmFyIGNvbnN0YW50ID0geCA9PiAoKSA9PiB4OwoKICBmdW5jdGlvbiBsaW5lYXIoYSwgZCkgewogICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgIHJldHVybiBhICsgdCAqIGQ7CiAgICB9OwogIH0KICBmdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7CiAgICByZXR1cm4gYSA9IE1hdGgucG93KGEsIHkpLCBiID0gTWF0aC5wb3coYiwgeSkgLSBhLCB5ID0gMSAvIHksIGZ1bmN0aW9uICh0KSB7CiAgICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZ2FtbWEoeSkgewogICAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHsKICAgIHZhciBkID0gYiAtIGE7CiAgICByZXR1cm4gZCA/IGxpbmVhcihhLCBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpOwogIH0KCiAgdmFyIGludGVycG9sYXRlUmdiID0gKGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHsKICAgIHZhciBjb2xvciA9IGdhbW1hKHkpOwogICAgZnVuY3Rpb24gcmdiJDEoc3RhcnQsIGVuZCkgewogICAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IHJnYihzdGFydCkpLnIsIChlbmQgPSByZ2IoZW5kKSkuciksCiAgICAgICAgZyA9IGNvbG9yKHN0YXJ0LmcsIGVuZC5nKSwKICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLAogICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgc3RhcnQuciA9IHIodCk7CiAgICAgICAgc3RhcnQuZyA9IGcodCk7CiAgICAgICAgc3RhcnQuYiA9IGIodCk7CiAgICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgICAgIH07CiAgICB9CiAgICByZ2IkMS5nYW1tYSA9IHJnYkdhbW1hOwogICAgcmV0dXJuIHJnYiQxOwogIH0pKDEpOwoKICBmdW5jdGlvbiBpbnRlcnBvbGF0ZU51bWJlciAoYSwgYikgewogICAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbiAodCkgewogICAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDsKICAgIH07CiAgfQoKICB2YXIgcmVBID0gL1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLAogICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCAiZyIpOwogIGZ1bmN0aW9uIHplcm8oYikgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGI7CiAgICB9OwogIH0KICBmdW5jdGlvbiBvbmUoYikgewogICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgIHJldHVybiBiKHQpICsgIiI7CiAgICB9OwogIH0KICBmdW5jdGlvbiBpbnRlcnBvbGF0ZVN0cmluZyAoYSwgYikgewogICAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLAogICAgICAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiCiAgICAgIGFtLAogICAgICAvLyBjdXJyZW50IG1hdGNoIGluIGEKICAgICAgYm0sCiAgICAgIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYgogICAgICBicywKICAgICAgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnkKICAgICAgaSA9IC0xLAogICAgICAvLyBpbmRleCBpbiBzCiAgICAgIHMgPSBbXSwKICAgICAgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzCiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKCiAgICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuCiAgICBhID0gYSArICIiLCBiID0gYiArICIiOwoKICAgIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuCiAgICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpICYmIChibSA9IHJlQi5leGVjKGIpKSkgewogICAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsKICAgICAgICAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYgogICAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpOwogICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgICAgIGVsc2Ugc1srK2ldID0gYnM7CiAgICAgIH0KICAgICAgaWYgKChhbSA9IGFtWzBdKSA9PT0gKGJtID0gYm1bMF0pKSB7CiAgICAgICAgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaAogICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJtOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgICAgIGVsc2Ugc1srK2ldID0gYm07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnMKICAgICAgICBzWysraV0gPSBudWxsOwogICAgICAgIHEucHVzaCh7CiAgICAgICAgICBpOiBpLAogICAgICAgICAgeDogaW50ZXJwb2xhdGVOdW1iZXIoYW0sIGJtKQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGJpID0gcmVCLmxhc3RJbmRleDsKICAgIH0KCiAgICAvLyBBZGQgcmVtYWlucyBvZiBiLgogICAgaWYgKGJpIDwgYi5sZW5ndGgpIHsKICAgICAgYnMgPSBiLnNsaWNlKGJpKTsKICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgIGVsc2Ugc1srK2ldID0gYnM7CiAgICB9CgogICAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guCiAgICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLgogICAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/IHFbMF0gPyBvbmUocVswXS54KSA6IHplcm8oYikgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbiAodCkgewogICAgICBmb3IgKHZhciBpID0gMCwgbzsgaSA8IGI7ICsraSkgc1sobyA9IHFbaV0pLmldID0gby54KHQpOwogICAgICByZXR1cm4gcy5qb2luKCIiKTsKICAgIH0pOwogIH0KCiAgdmFyIGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJOwogIHZhciBpZGVudGl0eSA9IHsKICAgIHRyYW5zbGF0ZVg6IDAsCiAgICB0cmFuc2xhdGVZOiAwLAogICAgcm90YXRlOiAwLAogICAgc2tld1g6IDAsCiAgICBzY2FsZVg6IDEsCiAgICBzY2FsZVk6IDEKICB9OwogIGZ1bmN0aW9uIGRlY29tcG9zZSAoYSwgYiwgYywgZCwgZSwgZikgewogICAgdmFyIHNjYWxlWCwgc2NhbGVZLCBza2V3WDsKICAgIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDsKICAgIGlmIChza2V3WCA9IGEgKiBjICsgYiAqIGQpIGMgLT0gYSAqIHNrZXdYLCBkIC09IGIgKiBza2V3WDsKICAgIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMgKyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZOwogICAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDsKICAgIHJldHVybiB7CiAgICAgIHRyYW5zbGF0ZVg6IGUsCiAgICAgIHRyYW5zbGF0ZVk6IGYsCiAgICAgIHJvdGF0ZTogTWF0aC5hdGFuMihiLCBhKSAqIGRlZ3JlZXMsCiAgICAgIHNrZXdYOiBNYXRoLmF0YW4oc2tld1gpICogZGVncmVlcywKICAgICAgc2NhbGVYOiBzY2FsZVgsCiAgICAgIHNjYWxlWTogc2NhbGVZCiAgICB9OwogIH0KCiAgdmFyIHN2Z05vZGU7CgogIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovCiAgZnVuY3Rpb24gcGFyc2VDc3ModmFsdWUpIHsKICAgIGNvbnN0IG0gPSBuZXcgKHR5cGVvZiBET01NYXRyaXggPT09ICJmdW5jdGlvbiIgPyBET01NYXRyaXggOiBXZWJLaXRDU1NNYXRyaXgpKHZhbHVlICsgIiIpOwogICAgcmV0dXJuIG0uaXNJZGVudGl0eSA/IGlkZW50aXR5IDogZGVjb21wb3NlKG0uYSwgbS5iLCBtLmMsIG0uZCwgbS5lLCBtLmYpOwogIH0KICBmdW5jdGlvbiBwYXJzZVN2Zyh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTsKICAgIGlmICghc3ZnTm9kZSkgc3ZnTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCAiZyIpOwogICAgc3ZnTm9kZS5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsIHZhbHVlKTsKICAgIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5OwogICAgdmFsdWUgPSB2YWx1ZS5tYXRyaXg7CiAgICByZXR1cm4gZGVjb21wb3NlKHZhbHVlLmEsIHZhbHVlLmIsIHZhbHVlLmMsIHZhbHVlLmQsIHZhbHVlLmUsIHZhbHVlLmYpOwogIH0KCiAgZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2UsIHB4Q29tbWEsIHB4UGFyZW4sIGRlZ1BhcmVuKSB7CiAgICBmdW5jdGlvbiBwb3AocykgewogICAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgIiAiIDogIiI7CiAgICB9CiAgICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsKICAgICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHsKICAgICAgICB2YXIgaSA9IHMucHVzaCgidHJhbnNsYXRlKCIsIG51bGwsIHB4Q29tbWEsIG51bGwsIHB4UGFyZW4pOwogICAgICAgIHEucHVzaCh7CiAgICAgICAgICBpOiBpIC0gNCwKICAgICAgICAgIHg6IGludGVycG9sYXRlTnVtYmVyKHhhLCB4YikKICAgICAgICB9LCB7CiAgICAgICAgICBpOiBpIC0gMiwKICAgICAgICAgIHg6IGludGVycG9sYXRlTnVtYmVyKHlhLCB5YikKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICh4YiB8fCB5YikgewogICAgICAgIHMucHVzaCgidHJhbnNsYXRlKCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiByb3RhdGUoYSwgYiwgcywgcSkgewogICAgICBpZiAoYSAhPT0gYikgewogICAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7ZWxzZSBpZiAoYiAtIGEgPiAxODApIGEgKz0gMzYwOyAvLyBzaG9ydGVzdCBwYXRoCiAgICAgICAgcS5wdXNoKHsKICAgICAgICAgIGk6IHMucHVzaChwb3AocykgKyAicm90YXRlKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsCiAgICAgICAgICB4OiBpbnRlcnBvbGF0ZU51bWJlcihhLCBiKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGIpIHsKICAgICAgICBzLnB1c2gocG9wKHMpICsgInJvdGF0ZSgiICsgYiArIGRlZ1BhcmVuKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc2tld1goYSwgYiwgcywgcSkgewogICAgICBpZiAoYSAhPT0gYikgewogICAgICAgIHEucHVzaCh7CiAgICAgICAgICBpOiBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsCiAgICAgICAgICB4OiBpbnRlcnBvbGF0ZU51bWJlcihhLCBiKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGIpIHsKICAgICAgICBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIgKyBiICsgZGVnUGFyZW4pOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzY2FsZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkgewogICAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5YikgewogICAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArICJzY2FsZSgiLCBudWxsLCAiLCIsIG51bGwsICIpIik7CiAgICAgICAgcS5wdXNoKHsKICAgICAgICAgIGk6IGkgLSA0LAogICAgICAgICAgeDogaW50ZXJwb2xhdGVOdW1iZXIoeGEsIHhiKQogICAgICAgIH0sIHsKICAgICAgICAgIGk6IGkgLSAyLAogICAgICAgICAgeDogaW50ZXJwb2xhdGVOdW1iZXIoeWEsIHliKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7CiAgICAgICAgcy5wdXNoKHBvcChzKSArICJzY2FsZSgiICsgeGIgKyAiLCIgKyB5YiArICIpIik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiAoYSwgYikgewogICAgICB2YXIgcyA9IFtdLAogICAgICAgIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVycwogICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKICAgICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7CiAgICAgIHRyYW5zbGF0ZShhLnRyYW5zbGF0ZVgsIGEudHJhbnNsYXRlWSwgYi50cmFuc2xhdGVYLCBiLnRyYW5zbGF0ZVksIHMsIHEpOwogICAgICByb3RhdGUoYS5yb3RhdGUsIGIucm90YXRlLCBzLCBxKTsKICAgICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7CiAgICAgIHNjYWxlKGEuc2NhbGVYLCBhLnNjYWxlWSwgYi5zY2FsZVgsIGIuc2NhbGVZLCBzLCBxKTsKICAgICAgYSA9IGIgPSBudWxsOyAvLyBnYwogICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgbiA9IHEubGVuZ3RoLAogICAgICAgICAgbzsKICAgICAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpOwogICAgICAgIHJldHVybiBzLmpvaW4oIiIpOwogICAgICB9OwogICAgfTsKICB9CiAgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VDc3MsICJweCwgIiwgInB4KSIsICJkZWcpIik7CiAgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsICIsICIsICIpIiwgIikiKTsKCiAgdmFyIGZyYW1lID0gMCwKICAgIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nPwogICAgdGltZW91dCQxID0gMCwKICAgIC8vIGlzIGEgdGltZW91dCBwZW5kaW5nPwogICAgaW50ZXJ2YWwgPSAwLAogICAgLy8gYXJlIGFueSB0aW1lcnMgYWN0aXZlPwogICAgcG9rZURlbGF5ID0gMTAwMCwKICAgIC8vIGhvdyBmcmVxdWVudGx5IHdlIGNoZWNrIGZvciBjbG9jayBza2V3CiAgICB0YXNrSGVhZCwKICAgIHRhc2tUYWlsLAogICAgY2xvY2tMYXN0ID0gMCwKICAgIGNsb2NrTm93ID0gMCwKICAgIGNsb2NrU2tldyA9IDAsCiAgICBjbG9jayA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gIm9iamVjdCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLAogICAgc2V0RnJhbWUgPSB0eXBlb2Ygd2luZG93ID09PSAib2JqZWN0IiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBmdW5jdGlvbiAoZikgewogICAgICBzZXRUaW1lb3V0KGYsIDE3KTsKICAgIH07CiAgZnVuY3Rpb24gbm93KCkgewogICAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpOwogIH0KICBmdW5jdGlvbiBjbGVhck5vdygpIHsKICAgIGNsb2NrTm93ID0gMDsKICB9CiAgZnVuY3Rpb24gVGltZXIoKSB7CiAgICB0aGlzLl9jYWxsID0gdGhpcy5fdGltZSA9IHRoaXMuX25leHQgPSBudWxsOwogIH0KICBUaW1lci5wcm90b3R5cGUgPSB0aW1lci5wcm90b3R5cGUgPSB7CiAgICBjb25zdHJ1Y3RvcjogVGltZXIsCiAgICByZXN0YXJ0OiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7CiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7CiAgICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpOwogICAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHsKICAgICAgICBpZiAodGFza1RhaWwpIHRhc2tUYWlsLl9uZXh0ID0gdGhpcztlbHNlIHRhc2tIZWFkID0gdGhpczsKICAgICAgICB0YXNrVGFpbCA9IHRoaXM7CiAgICAgIH0KICAgICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrOwogICAgICB0aGlzLl90aW1lID0gdGltZTsKICAgICAgc2xlZXAoKTsKICAgIH0sCiAgICBzdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICh0aGlzLl9jYWxsKSB7CiAgICAgICAgdGhpcy5fY2FsbCA9IG51bGw7CiAgICAgICAgdGhpcy5fdGltZSA9IEluZmluaXR5OwogICAgICAgIHNsZWVwKCk7CiAgICAgIH0KICAgIH0KICB9OwogIGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgdmFyIHQgPSBuZXcgVGltZXIoKTsKICAgIHQucmVzdGFydChjYWxsYmFjaywgZGVsYXksIHRpbWUpOwogICAgcmV0dXJuIHQ7CiAgfQogIGZ1bmN0aW9uIHRpbWVyRmx1c2goKSB7CiAgICBub3coKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC4KICAgICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LgogICAgdmFyIHQgPSB0YXNrSGVhZCwKICAgICAgZTsKICAgIHdoaWxlICh0KSB7CiAgICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKHVuZGVmaW5lZCwgZSk7CiAgICAgIHQgPSB0Ll9uZXh0OwogICAgfQogICAgLS1mcmFtZTsKICB9CiAgZnVuY3Rpb24gd2FrZSgpIHsKICAgIGNsb2NrTm93ID0gKGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpKSArIGNsb2NrU2tldzsKICAgIGZyYW1lID0gdGltZW91dCQxID0gMDsKICAgIHRyeSB7CiAgICAgIHRpbWVyRmx1c2goKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGZyYW1lID0gMDsKICAgICAgbmFwKCk7CiAgICAgIGNsb2NrTm93ID0gMDsKICAgIH0KICB9CiAgZnVuY3Rpb24gcG9rZSgpIHsKICAgIHZhciBub3cgPSBjbG9jay5ub3coKSwKICAgICAgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7CiAgICBpZiAoZGVsYXkgPiBwb2tlRGVsYXkpIGNsb2NrU2tldyAtPSBkZWxheSwgY2xvY2tMYXN0ID0gbm93OwogIH0KICBmdW5jdGlvbiBuYXAoKSB7CiAgICB2YXIgdDAsCiAgICAgIHQxID0gdGFza0hlYWQsCiAgICAgIHQyLAogICAgICB0aW1lID0gSW5maW5pdHk7CiAgICB3aGlsZSAodDEpIHsKICAgICAgaWYgKHQxLl9jYWxsKSB7CiAgICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lOwogICAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsOwogICAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjsKICAgICAgfQogICAgfQogICAgdGFza1RhaWwgPSB0MDsKICAgIHNsZWVwKHRpbWUpOwogIH0KICBmdW5jdGlvbiBzbGVlcCh0aW1lKSB7CiAgICBpZiAoZnJhbWUpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS4KICAgIGlmICh0aW1lb3V0JDEpIHRpbWVvdXQkMSA9IGNsZWFyVGltZW91dCh0aW1lb3V0JDEpOwogICAgdmFyIGRlbGF5ID0gdGltZSAtIGNsb2NrTm93OyAvLyBTdHJpY3RseSBsZXNzIHRoYW4gaWYgd2UgcmVjb21wdXRlZCBjbG9ja05vdy4KICAgIGlmIChkZWxheSA+IDI0KSB7CiAgICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQkMSA9IHNldFRpbWVvdXQod2FrZSwgdGltZSAtIGNsb2NrLm5vdygpIC0gY2xvY2tTa2V3KTsKICAgICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCFpbnRlcnZhbCkgY2xvY2tMYXN0ID0gY2xvY2subm93KCksIGludGVydmFsID0gc2V0SW50ZXJ2YWwocG9rZSwgcG9rZURlbGF5KTsKICAgICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRpbWVvdXQgKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgdmFyIHQgPSBuZXcgVGltZXIoKTsKICAgIGRlbGF5ID0gZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXk7CiAgICB0LnJlc3RhcnQoZWxhcHNlZCA9PiB7CiAgICAgIHQuc3RvcCgpOwogICAgICBjYWxsYmFjayhlbGFwc2VkICsgZGVsYXkpOwogICAgfSwgZGVsYXksIHRpbWUpOwogICAgcmV0dXJuIHQ7CiAgfQoKICB2YXIgZW1wdHlPbiA9IGRpc3BhdGNoKCJzdGFydCIsICJlbmQiLCAiY2FuY2VsIiwgImludGVycnVwdCIpOwogIHZhciBlbXB0eVR3ZWVuID0gW107CiAgdmFyIENSRUFURUQgPSAwOwogIHZhciBTQ0hFRFVMRUQgPSAxOwogIHZhciBTVEFSVElORyA9IDI7CiAgdmFyIFNUQVJURUQgPSAzOwogIHZhciBSVU5OSU5HID0gNDsKICB2YXIgRU5ESU5HID0gNTsKICB2YXIgRU5ERUQgPSA2OwogIGZ1bmN0aW9uIHNjaGVkdWxlIChub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3VwLCB0aW1pbmcpIHsKICAgIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbjsKICAgIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9O2Vsc2UgaWYgKGlkIGluIHNjaGVkdWxlcykgcmV0dXJuOwogICAgY3JlYXRlKG5vZGUsIGlkLCB7CiAgICAgIG5hbWU6IG5hbWUsCiAgICAgIGluZGV4OiBpbmRleCwKICAgICAgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLgogICAgICBncm91cDogZ3JvdXAsCiAgICAgIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4KICAgICAgb246IGVtcHR5T24sCiAgICAgIHR3ZWVuOiBlbXB0eVR3ZWVuLAogICAgICB0aW1lOiB0aW1pbmcudGltZSwKICAgICAgZGVsYXk6IHRpbWluZy5kZWxheSwKICAgICAgZHVyYXRpb246IHRpbWluZy5kdXJhdGlvbiwKICAgICAgZWFzZTogdGltaW5nLmVhc2UsCiAgICAgIHRpbWVyOiBudWxsLAogICAgICBzdGF0ZTogQ1JFQVRFRAogICAgfSk7CiAgfQogIGZ1bmN0aW9uIGluaXQobm9kZSwgaWQpIHsKICAgIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7CiAgICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBDUkVBVEVEKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpOwogICAgcmV0dXJuIHNjaGVkdWxlOwogIH0KICBmdW5jdGlvbiBzZXQobm9kZSwgaWQpIHsKICAgIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7CiAgICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBTVEFSVEVEKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmciKTsKICAgIHJldHVybiBzY2hlZHVsZTsKICB9CiAgZnVuY3Rpb24gZ2V0KG5vZGUsIGlkKSB7CiAgICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjsKICAgIGlmICghc2NoZWR1bGUgfHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTsKICAgIHJldHVybiBzY2hlZHVsZTsKICB9CiAgZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7CiAgICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sCiAgICAgIHR3ZWVuOwoKICAgIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLgogICAgLy8gTm90ZSB0aGUgYWN0dWFsIGRlbGF5IGlzIG5vdCBrbm93biB1bnRpbCB0aGUgZmlyc3QgY2FsbGJhY2shCiAgICBzY2hlZHVsZXNbaWRdID0gc2VsZjsKICAgIHNlbGYudGltZXIgPSB0aW1lcihzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTsKICAgIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHsKICAgICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRDsKICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHN0YXJ0LCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpOwoKICAgICAgLy8gSWYgdGhlIGVsYXBzZWQgZGVsYXkgaXMgbGVzcyB0aGFuIG91ciBmaXJzdCBzbGVlcCwgc3RhcnQgaW1tZWRpYXRlbHkuCiAgICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHsKICAgICAgdmFyIGksIGosIG4sIG87CgogICAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuCiAgICAgIGlmIChzZWxmLnN0YXRlICE9PSBTQ0hFRFVMRUQpIHJldHVybiBzdG9wKCk7CiAgICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHsKICAgICAgICBvID0gc2NoZWR1bGVzW2ldOwogICAgICAgIGlmIChvLm5hbWUgIT09IHNlbGYubmFtZSkgY29udGludWU7CgogICAgICAgIC8vIFdoaWxlIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIHN0YXJ0aW5nIHRyYW5zaXRpb24gZHVyaW5nIHRoaXMgZnJhbWUsCiAgICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhCiAgICAgICAgLy8gY2hhbmNlIHRvIHRpY2sgKGFuZCBwb3NzaWJseSBlbmQpOyBzZWUgZDMvZDMtdHJhbnNpdGlvbiM1NCEKICAgICAgICBpZiAoby5zdGF0ZSA9PT0gU1RBUlRFRCkgcmV0dXJuIHRpbWVvdXQoc3RhcnQpOwoKICAgICAgICAvLyBJbnRlcnJ1cHQgdGhlIGFjdGl2ZSB0cmFuc2l0aW9uLCBpZiBhbnkuCiAgICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHsKICAgICAgICAgIG8uc3RhdGUgPSBFTkRFRDsKICAgICAgICAgIG8udGltZXIuc3RvcCgpOwogICAgICAgICAgby5vbi5jYWxsKCJpbnRlcnJ1cHQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTsKICAgICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07CiAgICAgICAgfQoKICAgICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuCiAgICAgICAgZWxzZSBpZiAoK2kgPCBpZCkgewogICAgICAgICAgby5zdGF0ZSA9IEVOREVEOwogICAgICAgICAgby50aW1lci5zdG9wKCk7CiAgICAgICAgICBvLm9uLmNhbGwoImNhbmNlbCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApOwogICAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIERlZmVyIHRoZSBmaXJzdCB0aWNrIHRvIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZTsgc2VlIGQzL2QzIzE1NzYuCiAgICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shCiAgICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIHN0YXJ0IGV2ZW50OyBzZWUgZDMvZDMtdHJhbnNpdGlvbiMxNiEKICAgICAgLy8gQXNzdW1pbmcgdGhpcyBpcyBzdWNjZXNzZnVsLCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBnbyBzdHJhaWdodCB0byB0aWNrLgogICAgICB0aW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gU1RBUlRFRCkgewogICAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7CiAgICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2VsZi5kZWxheSwgc2VsZi50aW1lKTsKICAgICAgICAgIHRpY2soZWxhcHNlZCk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC4KICAgICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHR3ZWVuIGFyZSBpbml0aWFsaXplZC4KICAgICAgc2VsZi5zdGF0ZSA9IFNUQVJUSU5HOwogICAgICBzZWxmLm9uLmNhbGwoInN0YXJ0Iiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7CiAgICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZAogICAgICBzZWxmLnN0YXRlID0gU1RBUlRFRDsKCiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHR3ZWVuLCBkZWxldGluZyBudWxsIHR3ZWVuLgogICAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpOwogICAgICBmb3IgKGkgPSAwLCBqID0gLTE7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAobyA9IHNlbGYudHdlZW5baV0udmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKSkgewogICAgICAgICAgdHdlZW5bKytqXSA9IG87CiAgICAgICAgfQogICAgICB9CiAgICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxOwogICAgfQogICAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7CiAgICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSwKICAgICAgICBpID0gLTEsCiAgICAgICAgbiA9IHR3ZWVuLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICB0d2VlbltpXS5jYWxsKG5vZGUsIHQpOwogICAgICB9CgogICAgICAvLyBEaXNwYXRjaCB0aGUgZW5kIGV2ZW50LgogICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7CiAgICAgICAgc2VsZi5vbi5jYWxsKCJlbmQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTsKICAgICAgICBzdG9wKCk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0b3AoKSB7CiAgICAgIHNlbGYuc3RhdGUgPSBFTkRFRDsKICAgICAgc2VsZi50aW1lci5zdG9wKCk7CiAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaWRdOwogICAgICBmb3IgKHZhciBpIGluIHNjaGVkdWxlcykgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGludGVycnVwdCAobm9kZSwgbmFtZSkgewogICAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLAogICAgICBzY2hlZHVsZSwKICAgICAgYWN0aXZlLAogICAgICBlbXB0eSA9IHRydWUsCiAgICAgIGk7CiAgICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuOwogICAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgIiI7CiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7CiAgICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsKICAgICAgICBlbXB0eSA9IGZhbHNlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4gU1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7CiAgICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7CiAgICAgIHNjaGVkdWxlLnRpbWVyLnN0b3AoKTsKICAgICAgc2NoZWR1bGUub24uY2FsbChhY3RpdmUgPyAiaW50ZXJydXB0IiA6ICJjYW5jZWwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApOwogICAgICBkZWxldGUgc2NoZWR1bGVzW2ldOwogICAgfQogICAgaWYgKGVtcHR5KSBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25faW50ZXJydXB0IChuYW1lKSB7CiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgaW50ZXJydXB0KHRoaXMsIG5hbWUpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiB0d2VlblJlbW92ZShpZCwgbmFtZSkgewogICAgdmFyIHR3ZWVuMCwgdHdlZW4xOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSwKICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuOwoKICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLAogICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkgewogICAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpOwogICAgICAgICAgICB0d2VlbjEuc3BsaWNlKGksIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0d2VlbkZ1bmN0aW9uKGlkLCBuYW1lLCB2YWx1ZSkgewogICAgdmFyIHR3ZWVuMCwgdHdlZW4xOwogICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLAogICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47CgogICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIQogICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuCiAgICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7CiAgICAgICAgdHdlZW4xID0gKHR3ZWVuMCA9IHR3ZWVuKS5zbGljZSgpOwogICAgICAgIGZvciAodmFyIHQgPSB7CiAgICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZQogICAgICAgICAgfSwgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgdHdlZW4xW2ldID0gdDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpID09PSBuKSB0d2VlbjEucHVzaCh0KTsKICAgICAgfQogICAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHRyYW5zaXRpb25fdHdlZW4gKG5hbWUsIHZhbHVlKSB7CiAgICB2YXIgaWQgPSB0aGlzLl9pZDsKICAgIG5hbWUgKz0gIiI7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgdmFyIHR3ZWVuID0gZ2V0KHRoaXMubm9kZSgpLCBpZCkudHdlZW47CiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4ubGVuZ3RoLCB0OyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgIHJldHVybiB0LnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSA6IHR3ZWVuRnVuY3Rpb24pKGlkLCBuYW1lLCB2YWx1ZSkpOwogIH0KICBmdW5jdGlvbiB0d2VlblZhbHVlKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7CiAgICB2YXIgaWQgPSB0cmFuc2l0aW9uLl9pZDsKICAgIHRyYW5zaXRpb24uZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCk7CiAgICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0pOwogICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7CiAgICAgIHJldHVybiBnZXQobm9kZSwgaWQpLnZhbHVlW25hbWVdOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGludGVycG9sYXRlIChhLCBiKSB7CiAgICB2YXIgYzsKICAgIHJldHVybiAodHlwZW9mIGIgPT09ICJudW1iZXIiID8gaW50ZXJwb2xhdGVOdW1iZXIgOiBiIGluc3RhbmNlb2YgY29sb3IgPyBpbnRlcnBvbGF0ZVJnYiA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYikgOiBpbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7CiAgfQoKICBmdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkgewogICAgdmFyIHN0cmluZzAwLAogICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiIsCiAgICAgIGludGVycG9sYXRlMDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbCA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHsKICAgIHZhciBzdHJpbmcwMCwKICAgICAgc3RyaW5nMSA9IHZhbHVlMSArICIiLAogICAgICBpbnRlcnBvbGF0ZTA7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7CiAgICB2YXIgc3RyaW5nMDAsIHN0cmluZzEwLCBpbnRlcnBvbGF0ZTA7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc3RyaW5nMCwKICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwKICAgICAgICBzdHJpbmcxOwogICAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogICAgdmFyIHN0cmluZzAwLCBzdHJpbmcxMCwgaW50ZXJwb2xhdGUwOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHN0cmluZzAsCiAgICAgICAgdmFsdWUxID0gdmFsdWUodGhpcyksCiAgICAgICAgc3RyaW5nMTsKICAgICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9hdHRyIChuYW1lLCB2YWx1ZSkgewogICAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpLAogICAgICBpID0gZnVsbG5hbWUgPT09ICJ0cmFuc2Zvcm0iID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgOiBpbnRlcnBvbGF0ZTsKICAgIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbikoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgImF0dHIuIiArIG5hbWUsIHZhbHVlKSkgOiB2YWx1ZSA9PSBudWxsID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkoZnVsbG5hbWUpIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKGZ1bGxuYW1lLCBpLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gYXR0ckludGVycG9sYXRlKG5hbWUsIGkpIHsKICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpLmNhbGwodGhpcywgdCkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpIHsKICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaS5jYWxsKHRoaXMsIHQpKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgdmFyIHQwLCBpMDsKICAgIGZ1bmN0aW9uIHR3ZWVuKCkgewogICAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSk7CiAgICAgIHJldHVybiB0MDsKICAgIH0KICAgIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOwogICAgcmV0dXJuIHR3ZWVuOwogIH0KICBmdW5jdGlvbiBhdHRyVHdlZW4obmFtZSwgdmFsdWUpIHsKICAgIHZhciB0MCwgaTA7CiAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlKG5hbWUsIGkpOwogICAgICByZXR1cm4gdDA7CiAgICB9CiAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiB0d2VlbjsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9hdHRyVHdlZW4gKG5hbWUsIHZhbHVlKSB7CiAgICB2YXIga2V5ID0gImF0dHIuIiArIG5hbWU7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOwogICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTsKICAgIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgKGZ1bGxuYW1lLmxvY2FsID8gYXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pKGZ1bGxuYW1lLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkZWxheUNvbnN0YW50KGlkLCB2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbiAoKSB7CiAgICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX2RlbGF5ICh2YWx1ZSkgewogICAgdmFyIGlkID0gdGhpcy5faWQ7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gZGVsYXlGdW5jdGlvbiA6IGRlbGF5Q29uc3RhbnQpKGlkLCB2YWx1ZSkpIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZGVsYXk7CiAgfQoKICBmdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uKGlkLCB2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwgdmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24gKCkgewogICAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX2R1cmF0aW9uICh2YWx1ZSkgewogICAgdmFyIGlkID0gdGhpcy5faWQ7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gZHVyYXRpb25GdW5jdGlvbiA6IGR1cmF0aW9uQ29uc3RhbnQpKGlkLCB2YWx1ZSkpIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZHVyYXRpb247CiAgfQoKICBmdW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHZhbHVlOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9lYXNlICh2YWx1ZSkgewogICAgdmFyIGlkID0gdGhpcy5faWQ7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSkgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5lYXNlOwogIH0KCiAgZnVuY3Rpb24gZWFzZVZhcnlpbmcoaWQsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh0eXBlb2YgdiAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHY7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nICh2YWx1ZSkgewogICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICByZXR1cm4gdGhpcy5lYWNoKGVhc2VWYXJ5aW5nKHRoaXMuX2lkLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9maWx0ZXIgKG1hdGNoKSB7CiAgICBpZiAodHlwZW9mIG1hdGNoICE9PSAiZnVuY3Rpb24iKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHsKICAgICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7CiAgfQoKICBmdW5jdGlvbiB0cmFuc2l0aW9uX21lcmdlICh0cmFuc2l0aW9uKSB7CiAgICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7CiAgICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICAgIH0KICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHsKICAgIHJldHVybiAobmFtZSArICIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24gKHQpIHsKICAgICAgdmFyIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgICAgaWYgKGkgPj0gMCkgdCA9IHQuc2xpY2UoMCwgaSk7CiAgICAgIHJldHVybiAhdCB8fCB0ID09PSAic3RhcnQiOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSB7CiAgICB2YXIgb24wLAogICAgICBvbjEsCiAgICAgIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksCiAgICAgICAgb24gPSBzY2hlZHVsZS5vbjsKCiAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLAogICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICBpZiAob24gIT09IG9uMCkgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihuYW1lLCBsaXN0ZW5lcik7CiAgICAgIHNjaGVkdWxlLm9uID0gb24xOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9vbiAobmFtZSwgbGlzdGVuZXIpIHsKICAgIHZhciBpZCA9IHRoaXMuX2lkOwogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gZ2V0KHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSkgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGlkKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICBmb3IgKHZhciBpIGluIHRoaXMuX190cmFuc2l0aW9uKSBpZiAoK2kgIT09IGlkKSByZXR1cm47CiAgICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHRyYW5zaXRpb25fcmVtb3ZlICgpIHsKICAgIHJldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTsKICB9CgogIGZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0IChzZWxlY3QpIHsKICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQgPSB0aGlzLl9pZDsKICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187CiAgICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7CiAgICAgICAgICBzY2hlZHVsZShzdWJncm91cFtpXSwgbmFtZSwgaWQsIGksIHN1Ymdyb3VwLCBnZXQobm9kZSwgaWQpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsKICB9CgogIGZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0QWxsIChzZWxlY3QpIHsKICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQgPSB0aGlzLl9pZDsKICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgZm9yICh2YXIgY2hpbGRyZW4gPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCksIGNoaWxkLCBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkKSwgayA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGsgPCBsOyArK2spIHsKICAgICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHsKICAgICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pOwogICAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpOwogIH0KCiAgdmFyIFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9zZWxlY3Rpb24gKCkgewogICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIHN0eWxlTnVsbChuYW1lLCBpbnRlcnBvbGF0ZSkgewogICAgdmFyIHN0cmluZzAwLCBzdHJpbmcxMCwgaW50ZXJwb2xhdGUwOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHN0cmluZzAgPSBzdHlsZVZhbHVlKHRoaXMsIG5hbWUpLAogICAgICAgIHN0cmluZzEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKSk7CiAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbCA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkgewogICAgdmFyIHN0cmluZzAwLAogICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiIsCiAgICAgIGludGVycG9sYXRlMDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzdHJpbmcwID0gc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKTsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogICAgdmFyIHN0cmluZzAwLCBzdHJpbmcxMCwgaW50ZXJwb2xhdGUwOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHN0cmluZzAgPSBzdHlsZVZhbHVlKHRoaXMsIG5hbWUpLAogICAgICAgIHZhbHVlMSA9IHZhbHVlKHRoaXMpLAogICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgaWYgKHZhbHVlMSA9PSBudWxsKSBzdHJpbmcxID0gdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlVmFsdWUodGhpcywgbmFtZSkpOwogICAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMCA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZU1heWJlUmVtb3ZlKGlkLCBuYW1lKSB7CiAgICB2YXIgb24wLAogICAgICBvbjEsCiAgICAgIGxpc3RlbmVyMCwKICAgICAga2V5ID0gInN0eWxlLiIgKyBuYW1lLAogICAgICBldmVudCA9ICJlbmQuIiArIGtleSwKICAgICAgcmVtb3ZlOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSwKICAgICAgICBvbiA9IHNjaGVkdWxlLm9uLAogICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBudWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZShuYW1lKSkgOiB1bmRlZmluZWQ7CgogICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS4KICAgICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpOwogICAgICBzY2hlZHVsZS5vbiA9IG9uMTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHRyYW5zaXRpb25fc3R5bGUgKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgdmFyIGkgPSAobmFtZSArPSAiIikgPT09ICJ0cmFuc2Zvcm0iID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgOiBpbnRlcnBvbGF0ZTsKICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpcy5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlTnVsbChuYW1lLCBpKSkub24oImVuZC5zdHlsZS4iICsgbmFtZSwgc3R5bGVSZW1vdmUobmFtZSkpIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gdGhpcy5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlRnVuY3Rpb24obmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCAic3R5bGUuIiArIG5hbWUsIHZhbHVlKSkpLmVhY2goc3R5bGVNYXliZVJlbW92ZSh0aGlzLl9pZCwgbmFtZSkpIDogdGhpcy5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlQ29uc3RhbnQobmFtZSwgaSwgdmFsdWUpLCBwcmlvcml0eSkub24oImVuZC5zdHlsZS4iICsgbmFtZSwgbnVsbCk7CiAgfQoKICBmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICB2YXIgdCwgaTA7CiAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAoaSAhPT0gaTApIHQgPSAoaTAgPSBpKSAmJiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KTsKICAgICAgcmV0dXJuIHQ7CiAgICB9CiAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiB0d2VlbjsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9zdHlsZVR3ZWVuIChuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgIHZhciBrZXkgPSAic3R5bGUuIiArIChuYW1lICs9ICIiKTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7CiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsKICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcigpOwogICAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gIiIgOiBwcmlvcml0eSkpOwogIH0KCiAgZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gIiIgOiB2YWx1ZTE7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX3RleHQgKHZhbHVlKSB7CiAgICByZXR1cm4gdGhpcy50d2VlbigidGV4dCIsIHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIiA/IHRleHRGdW5jdGlvbih0d2VlblZhbHVlKHRoaXMsICJ0ZXh0IiwgdmFsdWUpKSA6IHRleHRDb25zdGFudCh2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiKSk7CiAgfQoKICBmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGUoaSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgIHRoaXMudGV4dENvbnRlbnQgPSBpLmNhbGwodGhpcywgdCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0ZXh0VHdlZW4odmFsdWUpIHsKICAgIHZhciB0MCwgaTA7CiAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgdGV4dEludGVycG9sYXRlKGkpOwogICAgICByZXR1cm4gdDA7CiAgICB9CiAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiB0d2VlbjsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl90ZXh0VHdlZW4gKHZhbHVlKSB7CiAgICB2YXIga2V5ID0gInRleHQiOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTsKICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpOwogICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICByZXR1cm4gdGhpcy50d2VlbihrZXksIHRleHRUd2Vlbih2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gdHJhbnNpdGlvbl90cmFuc2l0aW9uICgpIHsKICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQwID0gdGhpcy5faWQsCiAgICAgIGlkMSA9IG5ld0lkKCk7CiAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICB2YXIgaW5oZXJpdCA9IGdldChub2RlLCBpZDApOwogICAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQxLCBpLCBncm91cCwgewogICAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbiwKICAgICAgICAgICAgZGVsYXk6IDAsCiAgICAgICAgICAgIGR1cmF0aW9uOiBpbmhlcml0LmR1cmF0aW9uLAogICAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2UKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTsKICB9CgogIGZ1bmN0aW9uIHRyYW5zaXRpb25fZW5kICgpIHsKICAgIHZhciBvbjAsCiAgICAgIG9uMSwKICAgICAgdGhhdCA9IHRoaXMsCiAgICAgIGlkID0gdGhhdC5faWQsCiAgICAgIHNpemUgPSB0aGF0LnNpemUoKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBjYW5jZWwgPSB7CiAgICAgICAgICB2YWx1ZTogcmVqZWN0CiAgICAgICAgfSwKICAgICAgICBlbmQgPSB7CiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoLS1zaXplID09PSAwKSByZXNvbHZlKCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgdGhhdC5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLAogICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjsKCiAgICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICAgIGlmIChvbiAhPT0gb24wKSB7CiAgICAgICAgICBvbjEgPSAob24wID0gb24pLmNvcHkoKTsKICAgICAgICAgIG9uMS5fLmNhbmNlbC5wdXNoKGNhbmNlbCk7CiAgICAgICAgICBvbjEuXy5pbnRlcnJ1cHQucHVzaChjYW5jZWwpOwogICAgICAgICAgb24xLl8uZW5kLnB1c2goZW5kKTsKICAgICAgICB9CiAgICAgICAgc2NoZWR1bGUub24gPSBvbjE7CiAgICAgIH0pOwoKICAgICAgLy8gVGhlIHNlbGVjdGlvbiB3YXMgZW1wdHksIHJlc29sdmUgZW5kIGltbWVkaWF0ZWx5CiAgICAgIGlmIChzaXplID09PSAwKSByZXNvbHZlKCk7CiAgICB9KTsKICB9CgogIHZhciBpZCA9IDA7CiAgZnVuY3Rpb24gVHJhbnNpdGlvbihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7CiAgICB0aGlzLl9ncm91cHMgPSBncm91cHM7CiAgICB0aGlzLl9wYXJlbnRzID0gcGFyZW50czsKICAgIHRoaXMuX25hbWUgPSBuYW1lOwogICAgdGhpcy5faWQgPSBpZDsKICB9CiAgZnVuY3Rpb24gbmV3SWQoKSB7CiAgICByZXR1cm4gKytpZDsKICB9CiAgdmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlOwogIFRyYW5zaXRpb24ucHJvdG90eXBlID0gewogICAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sCiAgICBzZWxlY3Q6IHRyYW5zaXRpb25fc2VsZWN0LAogICAgc2VsZWN0QWxsOiB0cmFuc2l0aW9uX3NlbGVjdEFsbCwKICAgIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkLAogICAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9wcm90b3R5cGUuc2VsZWN0Q2hpbGRyZW4sCiAgICBmaWx0ZXI6IHRyYW5zaXRpb25fZmlsdGVyLAogICAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsCiAgICBzZWxlY3Rpb246IHRyYW5zaXRpb25fc2VsZWN0aW9uLAogICAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbl90cmFuc2l0aW9uLAogICAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLAogICAgbm9kZXM6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZXMsCiAgICBub2RlOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGUsCiAgICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsCiAgICBlbXB0eTogc2VsZWN0aW9uX3Byb3RvdHlwZS5lbXB0eSwKICAgIGVhY2g6IHNlbGVjdGlvbl9wcm90b3R5cGUuZWFjaCwKICAgIG9uOiB0cmFuc2l0aW9uX29uLAogICAgYXR0cjogdHJhbnNpdGlvbl9hdHRyLAogICAgYXR0clR3ZWVuOiB0cmFuc2l0aW9uX2F0dHJUd2VlbiwKICAgIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLAogICAgc3R5bGVUd2VlbjogdHJhbnNpdGlvbl9zdHlsZVR3ZWVuLAogICAgdGV4dDogdHJhbnNpdGlvbl90ZXh0LAogICAgdGV4dFR3ZWVuOiB0cmFuc2l0aW9uX3RleHRUd2VlbiwKICAgIHJlbW92ZTogdHJhbnNpdGlvbl9yZW1vdmUsCiAgICB0d2VlbjogdHJhbnNpdGlvbl90d2VlbiwKICAgIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LAogICAgZHVyYXRpb246IHRyYW5zaXRpb25fZHVyYXRpb24sCiAgICBlYXNlOiB0cmFuc2l0aW9uX2Vhc2UsCiAgICBlYXNlVmFyeWluZzogdHJhbnNpdGlvbl9lYXNlVmFyeWluZywKICAgIGVuZDogdHJhbnNpdGlvbl9lbmQsCiAgICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX3Byb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdCiAgfTsKCiAgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7CiAgICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCAqIHQgOiAodCAtPSAyKSAqIHQgKiB0ICsgMikgLyAyOwogIH0KCiAgdmFyIGRlZmF1bHRUaW1pbmcgPSB7CiAgICB0aW1lOiBudWxsLAogICAgLy8gU2V0IG9uIHVzZS4KICAgIGRlbGF5OiAwLAogICAgZHVyYXRpb246IDI1MCwKICAgIGVhc2U6IGN1YmljSW5PdXQKICB9OwogIGZ1bmN0aW9uIGluaGVyaXQobm9kZSwgaWQpIHsKICAgIHZhciB0aW1pbmc7CiAgICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkgewogICAgICBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgdHJhbnNpdGlvbiAke2lkfSBub3QgZm91bmRgKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRpbWluZzsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX3RyYW5zaXRpb24gKG5hbWUpIHsKICAgIHZhciBpZCwgdGltaW5nOwogICAgaWYgKG5hbWUgaW5zdGFuY2VvZiBUcmFuc2l0aW9uKSB7CiAgICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lOwogICAgfSBlbHNlIHsKICAgICAgaWQgPSBuZXdJZCgpLCAodGltaW5nID0gZGVmYXVsdFRpbWluZykudGltZSA9IG5vdygpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyAiIjsKICAgIH0KICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsKICB9CgogIHNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDsKICBzZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbjsKCiAgZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHsKICAgIHRoaXMuayA9IGs7CiAgICB0aGlzLnggPSB4OwogICAgdGhpcy55ID0geTsKICB9CiAgVHJhbnNmb3JtLnByb3RvdHlwZSA9IHsKICAgIGNvbnN0cnVjdG9yOiBUcmFuc2Zvcm0sCiAgICBzY2FsZTogZnVuY3Rpb24gKGspIHsKICAgICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7CiAgICB9LAogICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAoeCwgeSkgewogICAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpOwogICAgfSwKICAgIGFwcGx5OiBmdW5jdGlvbiAocG9pbnQpIHsKICAgICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldOwogICAgfSwKICAgIGFwcGx5WDogZnVuY3Rpb24gKHgpIHsKICAgICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7CiAgICB9LAogICAgYXBwbHlZOiBmdW5jdGlvbiAoeSkgewogICAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTsKICAgIH0sCiAgICBpbnZlcnQ6IGZ1bmN0aW9uIChsb2NhdGlvbikgewogICAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdOwogICAgfSwKICAgIGludmVydFg6IGZ1bmN0aW9uICh4KSB7CiAgICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7CiAgICB9LAogICAgaW52ZXJ0WTogZnVuY3Rpb24gKHkpIHsKICAgICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuazsKICAgIH0sCiAgICByZXNjYWxlWDogZnVuY3Rpb24gKHgpIHsKICAgICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7CiAgICB9LAogICAgcmVzY2FsZVk6IGZ1bmN0aW9uICh5KSB7CiAgICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpOwogICAgfSwKICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyB0aGlzLnggKyAiLCIgKyB0aGlzLnkgKyAiKSBzY2FsZSgiICsgdGhpcy5rICsgIikiOwogICAgfQogIH07CiAgVHJhbnNmb3JtLnByb3RvdHlwZTsKCiAgLyoKICAgIEhURE1hdGggU3RhdGljIENsYXNzIC0gTm90IGludGVuZGVkIGZvciBpbnN0YW50aWF0aW9uIQoKICAgIE1vZGVsIHBhcmFtZXRlcnM6CiAgICAgIGsgPSBkaXNjb3VudCBmYWN0b3IgKDAsIEluZmluaXR5KQoKICAgIEJlaGF2aW9yYWwgdmFyaWFibGVzOgogICAgICBBID0gYW1vdW50CiAgICAgIEQgPSBkZWxheQogICAgICBWID0gc3ViamVjdGl2ZSB2YWx1ZQoKICAgIEVxdWF0aW9uczoKICAgICAgViA9IEEgLyAoMSArIGtEKQogICAgICBrID0gKEEgLSBWKSAvIChWRCkKICAqLwogIGNsYXNzIEhURE1hdGggewogICAgc3RhdGljIGsgPSB7CiAgICAgIERFRkFVTFQ6IDAuMDUsCiAgICAgIE1JTjogMCwKICAgICAgTUFYOiAxMDAsCiAgICAgIFNURVA6IDAuMDAxLAogICAgICBKVU1QOiAwLjAxCiAgICB9OwogICAgc3RhdGljIGFkazJ2KGEsIGQsIGspIHsKICAgICAgcmV0dXJuIGEgLyAoMSArIGsgKiBkKTsKICAgIH0KICAgIHN0YXRpYyBhZHYyayhhLCBkLCB2KSB7CiAgICAgIHJldHVybiAoYSAtIHYpIC8gKHYgKiBkKTsKICAgIH0KICB9CgogIC8vIEludGVybmFsIGRlcGVuZGVuY2llcwoKICAvKiBlc2xpbnQgbm8tcmVzdHJpY3RlZC1nbG9iYWxzOiBbIm9mZiIsICJzZWxmIl0gKi8KCiAgc2VsZi5vbm1lc3NhZ2UgPSBldmVudCA9PiB7CiAgICBjb25zdCBwYXJhbXMgPSB7CiAgICAgIGs6IHsKICAgICAgICB0eXBlOiAncmVhbCcsCiAgICAgICAgbG93ZXI6IEhURE1hdGguay5NSU4sCiAgICAgICAgdXBwZXI6IEhURE1hdGguay5NQVgKICAgICAgfSwKICAgICAgbHVjZTogewogICAgICAgIHR5cGU6ICdyZWFsJywKICAgICAgICBsb3dlcjogMCwKICAgICAgICB1cHBlcjogMTAwCiAgICAgIH0KICAgIH07CiAgICBjb25zdCBsb2dQb3N0ID0gKHN0YXRlLCBkYXRhKSA9PiB7CiAgICAgIGxldCBscCA9IDA7CgogICAgICAvLyBQcmlvcnMKICAgICAgY29uc3Qga01lYW4gPSAyOwogICAgICBjb25zdCBrU2hhcGUgPSAzOwogICAgICBscCArPSBkaXN0cmlidXRpb25zRXhwb3J0cy5nYW1tYShzdGF0ZS5rLCBrU2hhcGUsIGtTaGFwZSAvIGtNZWFuKTsKICAgICAgLy8gbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLnVuaWYoc3RhdGUuaywgMCwgMTAwKTsKCiAgICAgIGNvbnN0IGx1Y2VNZWFuID0gMjsKICAgICAgY29uc3QgbHVjZVNoYXBlID0gMzsKICAgICAgbHAgKz0gZGlzdHJpYnV0aW9uc0V4cG9ydHMuZ2FtbWEoc3RhdGUubHVjZSwgbHVjZVNoYXBlLCBsdWNlU2hhcGUgLyBsdWNlTWVhbik7CiAgICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7CgogICAgICAvLyBMaWtlbGlob29kCiAgICAgIGRhdGEuZm9yRWFjaChjaG9pY2UgPT4gewogICAgICAgIC8vIFZhbHVlcwogICAgICAgIGNvbnN0IHZzID0gSFRETWF0aC5hZGsydihjaG9pY2UuYXMsIGNob2ljZS5kcywgc3RhdGUuayk7CiAgICAgICAgY29uc3QgdmwgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hbCwgY2hvaWNlLmRsLCBzdGF0ZS5rKTsKCiAgICAgICAgLy8gQ2hvaWNlIG9mIHNvb25lciBvciBsYXRlciBpcyBzYW1wbGVkIGZyb20gYSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uCiAgICAgICAgLy8gTHVjZSBjaG9pY2UgcnVsZSBpcyB1c2VkIHRvIGNvbXB1dGUgcHJvYmFiaWxpdHkgb2Ygd2FpdGluZyEgKDAgPSBzb29uZXIsIDEgPSBsYXRlcikKICAgICAgICBjb25zdCBiaW52YWwgPSAxIC8gKDEgKyBNYXRoLmV4cChzdGF0ZS5sdWNlICogKHZzIC0gdmwpKSk7CgogICAgICAgIC8vIEFjdHVhbCByZXNwb25zZQogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gY2hvaWNlLnJlc3BvbnNlID09PSAnZmlyc3QnID8gMCA6IDE7CiAgICAgICAgbHAgKz0gZGlzdHJpYnV0aW9uc0V4cG9ydHMuYmVybihyZXNwb25zZSwgYmludmFsKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBscDsKICAgIH07CgogICAgLy8gSW5pdGlhbGl6aW5nIHRoZSBzYW1wbGVyCiAgICBjb25zdCBzYW1wbGVyID0gbmV3IG1jbWNFeHBvcnRzLkFtd2dTYW1wbGVyKHBhcmFtcywgbG9nUG9zdCwgZXZlbnQuZGF0YSk7CiAgICAvLyBCdXJuaW5nIHNvbWUgc2FtcGxlcyB0byB0aGUgTUNNQyBnb2RzIGFuZCBzYW1wbGluZyA1MDAwIGRyYXdzCiAgICBzYW1wbGVyLmJ1cm4oMTAwMCk7CiAgICBjb25zdCBzYW1wbGVzID0gc2FtcGxlci5zYW1wbGUoNTAwMCk7CgogICAgLy8gRXh0cmFjdCBzdW1tYXJ5IHN0YXRzCiAgICBjb25zdCByZXN1bHRzID0gewogICAgICBrOiBtZWRpYW4oc2FtcGxlcy5rKSwKICAgICAgbHVjZTogbWVkaWFuKHNhbXBsZXMubHVjZSkKICAgIH07CiAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgcmVzdWx0czogcmVzdWx0cywKICAgICAgc2FtcGxlczogc2FtcGxlcwogICAgfSk7CiAgfTsKCn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0ZC1maXQtd29ya2VyLmpzLm1hcAoK', 'data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRkLWZpdC13b3JrZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9iYXllcy5qcy9kaXN0cmlidXRpb25zLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2JheWVzLmpzL21jbWMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2FzY2VuZGluZy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbnVtYmVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9zb3J0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21pbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVpY2tzZWxlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3F1YW50aWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tZWRpYW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtZGlzcGF0Y2gvc3JjL2Rpc3BhdGNoLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbmFtZXNwYWNlcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NyZWF0b3IuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rvci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9hcnJheS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yQWxsLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdEFsbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL21hdGNoZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGRyZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZmlsdGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NwYXJzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbnRlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NvbnN0YW50LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdGEuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZXhpdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9qb2luLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL21lcmdlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29yZGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NvcnQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2FsbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2Rlcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2RlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NpemUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW1wdHkuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZWFjaC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9hdHRyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvd2luZG93LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3N0eWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3Byb3BlcnR5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2NsYXNzZWQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vdGV4dC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9odG1sLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JhaXNlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2xvd2VyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2FwcGVuZC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbnNlcnQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcmVtb3ZlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Nsb25lLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdHVtLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Rpc3BhdGNoLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2l0ZXJhdG9yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9kZWZpbmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2NvbG9yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb25zdGFudC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29sb3IuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3JnYi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9zdHJpbmcuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9kZWNvbXBvc2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9wYXJzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZW91dC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NjaGVkdWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2ludGVycnVwdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW50ZXJydXB0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHdlZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbnRlcnBvbGF0ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyVHdlZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kZWxheS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2R1cmF0aW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZWFzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2VWYXJ5aW5nLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZmlsdGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9vbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3JlbW92ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdEFsbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdGlvbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGVUd2Vlbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RleHQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0VHdlZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZW5kLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY3ViaWMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL3RyYW5zaXRpb24uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3RyYW5zZm9ybS5qcyIsIi4uL2Rpc2NvdW50YWJsZS1tYXRoL3NyYy9odGQtbWF0aC5qcyIsIi4uL2Rpc2NvdW50YWJsZS1tYXRoL3NyYy9pbmRleC5qcyIsInNyYy9jb21wb25lbnRzL2h0ZC1maXQtd29ya2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5cbi8vIEEgbnVtYmVyIG9mIGxvZyBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9ucyAoUERGKS4gTmFtaW5nIGFuZCBwYXJhbWV0ZXJpemF0aW9uXG4vLyBzaG91bGQgbWF0Y2ggUidzLCBleGNlcHQgZm9yIHRoYXQgYWxsIGZ1bmN0aW9ucyByZXNpZGUgaW4gYW4gbGQgb2JqZWN0IChcbi8vIGFzIGluIFwibG9nIGRlbnNpdHlcIiksIHNvIHRvIGdldCBhIG5vcm1hbCBsb2cgZGVuc2l0eSB5b3Ugd291bGQgd3JpdGVcbi8vIGxkLm5vcm0oLi4uKS5cbi8vIE1vc3Qgb2YgdGhlIGNvZGUgYmVsb3cgaXMgZGlyZWN0bHkgdGFrZW4gZnJvbSB0aGUgZ3JlYXQgSnN0YXQgcHJvamVjdFxuLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9qc3RhdC8pIHdoaWNoIGluY2x1ZGVzIFBERiBmb3IgbWFueSBjb21tb24gcHJvYmFiaWxpdHlcbi8vIGRpc3RyaWJ1dGlvbnMuIFdoYXQgSSBoYXZlIGRvbmUgaXMgb25seSB0byBjb252ZXJ0IHRoZXNlIHRvIGxvZyBQREZzLlxuXG4vKlxuT3JpZ2luYWwgd29yayBDb3B5cmlnaHQgKGMpIDIwMTMgalN0YXRcbk1vZGlmaWVkIHdvcmsgQ29weXJpZ2h0IChjKSAyMDE1IFJhc211cyBCw6XDpXRoIFxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuXG5cbiovXG5cblxuLy8gVGhpcyBib2lsZXIgcGxhdGUgY29kZSBoZXJlIGlzIHRha2VuIGZyb206XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzXG4vLyBJdCBzaG91bGQgbWFrZSBzaHVyZSB0aGF0IG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQgYm90aCBpbiB0aGUgYnJvd3Nlcixcbi8vIE5vZGUsIGFuZCBieSB1c2luZyB0aGUgQXN5bmNocm9ub3VzIE1vZHVsZSBEZWZpbml0aW9uIHN0YW5kYXJkLlxuLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsXG4vLyBvYmplY3QgbGQgLlxuKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuXG4gICAgICAgIGRlZmluZShbXSwgZmFjdG9yeSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXRcbiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsXG4gICAgICAgIC8vIGxpa2UgTm9kZS5cbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzIChyb290IGlzIHdpbmRvdylcbiAgICAgICAgcm9vdC5sZCA9IGZhY3RvcnkoKTtcbiAgfVxufSh0aGlzLCBmdW5jdGlvbigpIHtcbiAgLy8gT2JqZWN0IHRvIGhvbGQgdGhlIGZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZC5cbiAgdmFyIGxkICA9IHt9O1xuICBcbiAgLy8vLy8vLy8vLyBIZWxwZXIgZnVuY3Rpb25zIC8vLy8vLy8vLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIHZhciBsZ2FtbWEgPSBmdW5jdGlvbih4KSB7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBjb2YgPSBbXG4gICAgICA3Ni4xODAwOTE3Mjk0NzE0NiwgLTg2LjUwNTMyMDMyOTQxNjc3LCAyNC4wMTQwOTgyNDA4MzA5MSxcbiAgICAgIC0xLjIzMTczOTU3MjQ1MDE1NSwgMC4xMjA4NjUwOTczODY2MTc5ZS0yLCAtMC41Mzk1MjM5Mzg0OTUzZS01XG4gICAgXTtcbiAgICB2YXIgc2VyID0gMS4wMDAwMDAwMDAxOTAwMTU7XG4gICAgdmFyIHh4LCB5LCB0bXA7XG4gICAgdG1wID0gKHkgPSB4eCA9IHgpICsgNS41O1xuICAgIHRtcCAtPSAoeHggKyAwLjUpICogbG9nKHRtcCk7XG4gICAgZm9yICg7IGogPCA2OyBqKyspXG4gICAgICBzZXIgKz0gY29mW2pdIC8gKyt5O1xuICAgIHJldHVybiBsb2coMi41MDY2MjgyNzQ2MzEwMDA1ICogc2VyIC8geHgpIC0gdG1wO1xuICB9O1xuICBsZC5sZ2FtbWEgPSBsZ2FtbWE7XG4gIFxuICB2YXIgbGZhY3RvcmlhbCA9IGZ1bmN0aW9uKG4pIHtcbiAgICByZXR1cm4gbiA8IDAgPyBOYU4gOiBsZ2FtbWEobiArIDEpO1xuICB9O1xuICBsZC5sZmFjdG9yaWFsID0gbGZhY3RvcmlhbDtcbiAgXG4gIHZhciBsY2hvb3NlID0gZnVuY3Rpb24obiwgayl7XG4gICAgcmV0dXJuIGxmYWN0b3JpYWwobikgLSBsZmFjdG9yaWFsKGspIC0gbGZhY3RvcmlhbChuIC0gayk7XG4gIH07XG4gIGxkLmxjaG9vc2UgPSBsY2hvb3NlO1xuICBcbiAgdmFyIGxiZXRhID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBsZ2FtbWEoYSkgKyBsZ2FtbWEoYikgLSBsZ2FtbWEoYSArIGIpO1xuICB9O1xuICBsZC5sYmV0YSA9IGxiZXRhO1xuICBcbiAgdmFyIGxvZyAgPSBNYXRoLmxvZztcbiAgdmFyIGV4cCAgPSBNYXRoLmV4cDtcbiAgdmFyIGFicyAgPSBNYXRoLmFicztcbiAgdmFyIHBvdyAgPSBNYXRoLnBvdztcbiAgdmFyIHNxcnQgPSBNYXRoLnNxcnQ7XG4gIHZhciBwaSAgID0gTWF0aC5QSTtcbiAgXG4gIC8vLy8vLy8vLy8gQ29udGlub3VzIGRpc3RyaWJ1dGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIGxkLmJldGEgPSBmdW5jdGlvbih4LCBzaGFwZTEsIHNoYXBlMikge1xuICAgIGlmICh4ID4gMSB8fCB4IDwgMCkge1xuICAgICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICBpZihzaGFwZTEgPT09IDEgJiYgc2hhcGUyID09PSAxKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIChzaGFwZTEgLSAxKSAqIGxvZyh4KSArIChzaGFwZTIgLSAxKSAqIGxvZygxIC0geCkgLSBsYmV0YShzaGFwZTEsIHNoYXBlMik7ICBcbiAgICB9XG4gIH07XG4gIFxuICBsZC5jYXVjaHkgPSBmdW5jdGlvbih4LCBsb2NhdGlvbiwgc2NhbGUpIHtcbiAgICByZXR1cm4gbG9nKHNjYWxlKSAtIGxvZyhwb3coeCAtIGxvY2F0aW9uLCAyKSArIHBvdyhzY2FsZSwgMikpICAtIGxvZyhwaSk7XG4gIH07XG4gIFxuICBsZC5ub3JtID0gZnVuY3Rpb24oeCwgbWVhbiwgc2QpIHtcbiAgICAgIHJldHVybiAtMC41ICogbG9nKDIgKiBwaSkgLWxvZyhzZCkgLSBwb3coeCAtIG1lYW4sIDIpIC8gKDIgKiBzZCAqIHNkKTtcbiAgfTtcblxuICAvLyBBIGJpdmFyaWF0ZSBOb3JtYWwgZGlzdHJpYnV0aW9uIHBhcmFtZXRlcml6ZWQgYnkgYXJyYXlzIG9mIHR3byBtZWFucyBhbmQgU0RzLCBhbmQgXG4gIC8vIHRoZSBjb3JyZWxhdGlvbi5cbiAgbGQuYml2YXJub3JtID0gZnVuY3Rpb24oeCwgbWVhbiwgc2QsIGNvcnIpIHtcbiAgICB2YXIgeiA9IHBvdyh4WzBdIC0gbWVhblswXSwgMikgLyBwb3coc2RbMF0sIDIpICtcbiAgICAgICAgICAgIHBvdyh4WzFdIC0gbWVhblsxXSwgMikgLyBwb3coc2RbMV0sIDIpIC0gXG4gICAgICAgICAgICAoMiAqIGNvcnIgKiAoeFswXSAtIG1lYW5bMF0pICogKHhbMV0gLSBtZWFuWzFdKSkgLyAoc2RbMF0gKiBzZFsxXSk7XG4gICAgdmFyIG5vcm1hbGl6aW5nX2ZhY3RvciA9IC0oIGxvZygyKSArIGxvZyhwaSkgKyBsb2coc2RbMF0pICsgbG9nKHNkWzFdKSArIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUgKiBsb2coMSAtIHBvdyhjb3JyLCAyKSkgKTsgXG4gICAgdmFyIGJpdmFyX2xvZ19kZW5zID0gbm9ybWFsaXppbmdfZmFjdG9yIC0geiAvICgyICogKDEgLSBwb3coY29yciwgMikgKSApOyBcbiAgICByZXR1cm4gYml2YXJfbG9nX2RlbnM7XG4gIH07XG4gIFxuXG4gIGxkLmxhcGxhY2UgPSBmdW5jdGlvbih4LCBsb2NhdGlvbiwgc2NhbGUpIHtcbiAgICByZXR1cm4gKC1hYnMoeCAtIGxvY2F0aW9uKS9zY2FsZSkgLSBsb2coMiAqIHNjYWxlKTtcbiAgfTtcbiAgXG4gIGxkLmRleHAgPSBsZC5sYXBsYWNlO1xuICBcbiAgbGQuZ2FtbWEgPSBmdW5jdGlvbih4LCBzaGFwZSwgcmF0ZSkge1xuICAgIHZhciBzY2FsZSA9IDEgLyByYXRlO1xuICAgIGlmICh4IDwgMCkge1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9XG4gICAgaWYoKHggPT09IDAgJiYgc2hhcGUgPT09IDEpICkge1xuICAgICAgcmV0dXJuIC1sb2coc2NhbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKHNoYXBlIC0gMSkgKiBsb2coeCkgLSB4IC8gc2NhbGUgLSBsZ2FtbWEoc2hhcGUpIC0gc2hhcGUgKiBsb2coc2NhbGUpO1xuICAgIH1cbiAgfTtcbiAgXG4gIGxkLmludmdhbW1hID0gZnVuY3Rpb24oeCwgc2hhcGUsIHNjYWxlKSB7XG4gICAgICBpZiAoeCA8PSAwKSB7XG4gICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICB9XG4gICAgICByZXR1cm4gLShzaGFwZSArIDEpICogbG9nKHgpIC0gc2NhbGUgLyB4IC0gbGdhbW1hKHNoYXBlKSArIHNoYXBlICogbG9nKHNjYWxlKTtcbiAgICB9O1xuICBcbiAgbGQubG5vcm0gPSAgZnVuY3Rpb24oeCwgbWVhbmxvZywgc2Rsb2cpIHtcbiAgICBpZiAoeCA8PSAwKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gLWxvZyh4KSAtIDAuNSAqIGxvZygyICogcGkpIC0gbG9nKHNkbG9nKSAtIFxuICAgICAgICAgICAgcG93KGxvZyh4KSAtIG1lYW5sb2csIDIpIC8gKDIgKiBzZGxvZyAqIHNkbG9nKTtcbiAgfTtcbiAgXG4gIGxkLnBhcmV0byA9IGZ1bmN0aW9uKHgsIHNjYWxlLCBzaGFwZSkge1xuICAgIGlmICh4IDwgc2NhbGUpIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiBsb2coc2hhcGUpICsgc2hhcGUgKiBsb2coc2NhbGUpIC0gKHNoYXBlICsgMSkgKiBsb2coeCk7XG4gIH07XG4gIFxuICBsZC50ICA9ICBmdW5jdGlvbih4LCBsb2NhdGlvbiwgc2NhbGUsIGRmKSB7XG4gICAgZGYgPSBkZiA+IDFlMTAwID8gMWUxMDAgOiBkZjtcbiAgICByZXR1cm4gbGdhbW1hKChkZiArIDEpLzIpIC0gbGdhbW1hKGRmLzIpIC0gbG9nKHNxcnQocGkgKiBkZikgKiBzY2FsZSkgK1xuICAgICAgICAgICBsb2cocG93KDEgKyAoMS9kZikgKiBwb3coKHggLSBsb2NhdGlvbikvc2NhbGUsIDIpLCAtKGRmICsgMSkvMikpO1xuICB9O1xuICBcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBqYXZhc2NyaXB0IHRyYW5zbGF0aW9uIG9mIHRoZSBSIGNvZGUgdXNlZCB0byBldmFsdWF0ZVxuICAvLyB0aGUgbG9nIGRlbnNpdHkgb2YgYSB3ZWlidWxsIGRpc3RyaWJ1dGlvbjogXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93Y2gvci1zb3VyY2UvYmxvYi9iMTU2ZTNhNzExOTY3ZjU4MTMxZTIzYzFiMWRjMWVhOTBlMmYwYzQzL3NyYy9ubWF0aC9kd2VpYnVsbC5jXG4gIGxkLndlaWJ1bGwgPSBmdW5jdGlvbih4LCBzaGFwZSwgc2NhbGUpIHtcbiAgICBpZiAoeCA8IDApIHJldHVybiAtSW5maW5pdHk7XG4gICAgaWYoeCA9PT0gMCAmJiBzaGFwZSA8IDEpIHJldHVybiBJbmZpbml0eTtcbiAgICB2YXIgdG1wMSA9IHBvdyh4IC8gc2NhbGUsIHNoYXBlIC0gMSk7XG4gICAgdmFyIHRtcDIgPSB0bXAxICogKHggLyBzY2FsZSk7XG5cdCAgcmV0dXJuIC10bXAyICsgbG9nKHNoYXBlICogdG1wMSAvIHNjYWxlKTtcbiAgfTtcbiAgXG4gIC8vIFRoaXMgaXMgYSBkaXJlY3QgamF2YXNjcmlwdCB0cmFuc2xhdGlvbiBvZiB0aGUgUiBjb2RlIHVzZWQgdG8gZXZhbHVhdGVcbiAgLy8gdGhlIGxvZyBkZW5zaXR5IG9mIGEgbG9naXN0aWMgZGlzdHJpYnV0aW9uOiBcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2Rsb2dpcy5jXG4gIGxkLmxvZ2lzID0gZnVuY3Rpb24oeCwgbG9jYXRpb24sIHNjYWxlKSB7XG4gICAgeCA9IGFicygoeCAtIGxvY2F0aW9uKSAvIHNjYWxlKTtcbiAgICB2YXIgZSA9IGV4cCgteCk7XG4gICAgdmFyIGYgPSAxLjAgKyBlO1xuICAgIHJldHVybiAtKHggKyBsb2coc2NhbGUgKiBmICogZikpOyAgICBcbiAgfTtcblxuICBsZC5kaXJpY2hsZXQgPSBmdW5jdGlvbih4LCBhbHBoYSkge1xuICAgIHZhciBzdW1fYWxwaGEgPSAwO1xuICAgIHZhciBzdW1fbGdhbW1hX2FscGhhID0gMDtcbiAgICB2YXIgc3VtX2FscGhhX3N1Yl8xX2xvZ194ID0gMDtcbiAgICB2YXIgbiA9IGFscGhhLmxlbmd0aDtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzdW1fYWxwaGEgKz0gYWxwaGFbaV07XG4gICAgICBzdW1fbGdhbW1hX2FscGhhICs9IGxnYW1tYShhbHBoYVtpXSk7XG4gICAgICBzdW1fYWxwaGFfc3ViXzFfbG9nX3ggKz0gKGFscGhhW2ldIC0gMSkgKiBsb2coeFtpXSk7XG4gICAgfVxuICAgIHJldHVybiBsZ2FtbWEoc3VtX2FscGhhKSAtIHN1bV9sZ2FtbWFfYWxwaGEgKyBzdW1fYWxwaGFfc3ViXzFfbG9nX3g7XG4gIH07XG4gICBcbiAgICBcbiAgbGQuZXhwID0gZnVuY3Rpb24oeCwgcmF0ZSkge1xuICAgICAgcmV0dXJuIHggPCAwID8gLUluZmluaXR5IDogbG9nKHJhdGUpIC1yYXRlICogeDtcbiAgfTtcbiAgXG4gIGxkLnVuaWYgPSBmdW5jdGlvbih4LCBtaW4sIG1heCkge1xuICAgICAgcmV0dXJuICh4IDwgbWluIHx8IHggPiBtYXgpID8gLUluZmluaXR5IDogbG9nKDEgLyAobWF4IC0gbWluKSk7XG4gIH07XG4gIFxuICAvLy8vLy8vLy8vIERpc2NyZXRlIGRpc3RyaWJ1dGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgbGQuYmVybiA9IGZ1bmN0aW9uKHgsIHByb2IpIHtcbiAgICAgIHJldHVybiAhKHggPT09IDAgfHwgeCA9PT0gMSkgPyAtSW5maW5pdHkgOiBsb2coeCAqIHByb2IgKyAoMSAtIHgpICogKDEgLSBwcm9iKSk7XG4gIH07XG4gIFxuICBsZC5jYXQgPSBmdW5jdGlvbih4LCBwcm9icykge1xuICAgIGlmKHggPCAxIHx8IHggPiBwcm9icy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBsb2coIHByb2JzW3ggLSAxXSApO1xuICAgIH1cbiAgfTtcbiAgXG4gIGxkLmJpbm9tID0gZnVuY3Rpb24oeCwgc2l6ZSwgcHJvYikge1xuICAgIGlmKHggPiBzaXplIHx8IHggPCAwKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICBpZihwcm9iID09PSAwIHx8IHByb2IgPT09IDEpIHtcbiAgICAgIHJldHVybiAoc2l6ZSAqIHByb2IpID09PSB4ID8gMCA6IC1JbmZpbml0eTtcbiAgICB9XG4gICAgcmV0dXJuIGxjaG9vc2Uoc2l6ZSwgeCkgKyB4ICogbG9nKHByb2IpICsgKHNpemUgLSB4KSAqIGxvZygxIC0gcHJvYik7XG4gIH07XG4gIFxuICB2YXIgbXVsdGlub20gPSBmdW5jdGlvbih4LCBwcm9icykge1xuICAgIHZhciBuID0geC5sZW5ndGg7XG4gICAgdmFyIHNpemUgPSAwO1xuICAgIHZhciB0bXBfdGVybSA9IDA7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgaWYocHJvYnNbaV0gPT09IDApIHtcbiAgICAgICAgaWYoeFtpXSAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7ICBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2l6ZSArPSB4W2ldO1xuICAgICAgICB0bXBfdGVybSArPSB4W2ldICogbG9nKHByb2JzW2ldKSAtIGxnYW1tYSh4W2ldICsgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsZ2FtbWEoc2l6ZSArIDEpICsgdG1wX3Rlcm0gO1xuICB9O1xuICBcbiAgbGQubmJpbm9tID0gZnVuY3Rpb24oeCwgc2l6ZSwgcHJvYikge1xuICAgIGlmKHggPCAwKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gbGNob29zZSh4ICsgc2l6ZSAtIDEsIHNpemUgLSAxKSArIHggKiBsb2coMSAtIHByb2IpICsgc2l6ZSAqIGxvZyhwcm9iKTtcbiAgfTtcbiAgXG4gIGxkLmh5cGVyID0gZnVuY3Rpb24oeCwgbSwgbiwgaykge1xuICAgIGlmKHggPCAwIHx8IHggPiBrKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxjaG9vc2UobSwgeCkgKyBsY2hvb3NlKG4sIGsteCkgLSBsY2hvb3NlKG0rbiwgayk7XG4gICAgfVxuICB9O1xuICBcbiAgbGQucG9pcyA9IGZ1bmN0aW9uKHgsIGxhbWJkYSkge1xuICAgICAgcmV0dXJuIHggPCAwID8gLUluZmluaXR5IDogbG9nKGxhbWJkYSkgKiB4IC0gbGFtYmRhIC0gbGZhY3RvcmlhbCh4KTtcbiAgfTtcbiAgXG4gIHJldHVybiBsZDtcbn0pKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gVGhpcyBib2lsZXIgcGxhdGUgY29kZSBoZXJlIGlzIHRha2VuIGZyb206XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzXG4vLyBJdCBzaG91bGQgbWFrZSBzaHVyZSB0aGF0IG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQgYm90aCBpbiB0aGUgYnJvd3Nlcixcbi8vIE5vZGUsIGFuZCBieSB1c2luZyB0aGUgQXN5bmNocm9ub3VzIE1vZHVsZSBEZWZpbml0aW9uIHN0YW5kYXJkLlxuLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsXG4vLyBvYmplY3QgbWNtYyAuXG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICAgICAgZGVmaW5lKFtdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIC8vIE5vZGUuIERvZXMgbm90IHdvcmsgd2l0aCBzdHJpY3QgQ29tbW9uSlMsIGJ1dFxuICAgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cyxcbiAgICAgICAgLy8gbGlrZSBOb2RlLlxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KVxuICAgICAgICByb290Lm1jbWMgPSBmYWN0b3J5KCk7XG4gIH1cbn0odGhpcywgZnVuY3Rpb24oKXtcblxuLy8vIFRoZSBhY3R1YWwgbW9kdWxlIGNvZGUgc3RhcnRzIGhlcmUgLy8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gIFxuICBcbiAgLy8vLy8vLy8vLyBIZWxwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGJldHdlZW4gbWluIGFuZCBtYXggKi9cbiAgdmFyIHJ1bmlmID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICByZXR1cm4gTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pICsgbWluO1xuICB9O1xuICBcbiAgLyoqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciBiZXR3ZWVuIG1pbiBhbmQgbWF4ICovXG4gIHZhciBydW5pZl9kaXNjcmV0ZSA9IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyBhIHJhbmRvbSByZWFsIG51bWJlciBmcm9tIGEgbm9ybWFsIGRpc3RyaWJidXRpb24gZGVmaW5lZFxuICAgKiAgYnkgbWVhbiBhbmQgc2QuIFxuICAgKiAgQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qc3RhdC9qc3RhdC9ibG9iL21hc3Rlci9zcmMvc3BlY2lhbC5qcyAqL1xuICB2YXIgcm5vcm0gPSBmdW5jdGlvbihtZWFuLCBzZCkge1xuICAgIHZhciB1LCB2LCB4LCB5LCBxO1xuICAgIGRvIHtcbiAgICAgIHUgPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgdiA9IDEuNzE1NiAqIChNYXRoLnJhbmRvbSgpIC0gMC41KTtcbiAgICAgIHggPSB1IC0gMC40NDk4NzE7XG4gICAgICB5ID0gTWF0aC5hYnModikgKyAwLjM4NjU5NTtcbiAgICAgIHEgPSB4ICogeCArIHkgKiAoMC4xOTYwMCAqIHkgLSAwLjI1NDcyICogeCk7XG4gICAgfSB3aGlsZSAocSA+IDAuMjc1OTcgJiYgKHEgPiAwLjI3ODQ2IHx8IHYgKiB2ID4gLTQgKiBNYXRoLmxvZyh1KSAqIHUgKiB1KSk7XG4gICAgXG4gICAgcmV0dXJuICh2IC8gdSkgKiBzZCArIG1lYW47XG4gIH07XG4gIFxuICBcbiAgLyoqIFJldHVybnMgYSBkZWVwIGNsb25lIG9mIHNyYywgc29ydCBvZi4uLiBJdCBvbmx5IGNvcGllcyBhIGxpbWl0ZWRcbiAgICogbnVtYmVyIG9mIHR5cGVzIGFuZCwgZm9yIGV4YW1wbGUsIGZ1bmN0aW9uIGFyZSBub3QgY29waWVkLiBcbiAgICogRnJvbSBodHRwOi8vZGF2aWR3YWxzaC5uYW1lL2phdmFzY3JpcHQtY2xvbmVcbiAgICovXG4gIHZhciBkZWVwX2Nsb25lID0gZnVuY3Rpb24oc3JjKSB7XG4gIFx0ZnVuY3Rpb24gbWl4aW4oZGVzdCwgc291cmNlLCBjb3B5RnVuYykge1xuICBcdFx0dmFyIG5hbWUsIHMsIGksIGVtcHR5ID0ge307XG4gIFx0XHRmb3IobmFtZSBpbiBzb3VyY2Upe1xuICBcdFx0XHQvLyB0aGUgKCEobmFtZSBpbiBlbXB0eSkgfHwgZW1wdHlbbmFtZV0gIT09IHMpIGNvbmRpdGlvbiBhdm9pZHMgY29weWluZyBwcm9wZXJ0aWVzIGluIFwic291cmNlXCJcbiAgXHRcdFx0Ly8gaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZS5cdCBGb3IgZXhhbXBsZSwgaWYgZGVzdCBoYXMgYSBjdXN0b20gdG9TdHJpbmcoKSBtZXRob2QsXG4gIFx0XHRcdC8vIGRvbid0IG92ZXJ3cml0ZSBpdCB3aXRoIHRoZSB0b1N0cmluZygpIG1ldGhvZCB0aGF0IHNvdXJjZSBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG90eXBlXG4gIFx0XHRcdHMgPSBzb3VyY2VbbmFtZV07XG4gIFx0XHRcdGlmKCEobmFtZSBpbiBkZXN0KSB8fCAoZGVzdFtuYW1lXSAhPT0gcyAmJiAoIShuYW1lIGluIGVtcHR5KSB8fCBlbXB0eVtuYW1lXSAhPT0gcykpKXtcbiAgXHRcdFx0XHRkZXN0W25hbWVdID0gY29weUZ1bmMgPyBjb3B5RnVuYyhzKSA6IHM7XG4gIFx0XHRcdH1cbiAgXHRcdH1cbiAgXHRcdHJldHVybiBkZXN0O1xuICBcdH1cbiAgXHRpZighc3JjIHx8IHR5cGVvZiBzcmMgIT0gXCJvYmplY3RcIiB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3JjKSA9PT0gXCJbb2JqZWN0IEZ1bmN0aW9uXVwiKXtcbiAgXHRcdC8vIG51bGwsIHVuZGVmaW5lZCwgYW55IG5vbi1vYmplY3QsIG9yIGZ1bmN0aW9uXG4gIFx0XHRyZXR1cm4gc3JjO1x0Ly8gYW55dGhpbmdcbiAgXHR9XG4gIFx0aWYoc3JjLm5vZGVUeXBlICYmIFwiY2xvbmVOb2RlXCIgaW4gc3JjKXtcbiAgXHRcdC8vIERPTSBOb2RlXG4gIFx0XHRyZXR1cm4gc3JjLmNsb25lTm9kZSh0cnVlKTsgLy8gTm9kZVxuICBcdH1cbiAgXHRpZihzcmMgaW5zdGFuY2VvZiBEYXRlKXtcbiAgXHRcdC8vIERhdGVcbiAgXHRcdHJldHVybiBuZXcgRGF0ZShzcmMuZ2V0VGltZSgpKTtcdC8vIERhdGVcbiAgXHR9XG4gIFx0aWYoc3JjIGluc3RhbmNlb2YgUmVnRXhwKXtcbiAgXHRcdC8vIFJlZ0V4cFxuICBcdFx0cmV0dXJuIG5ldyBSZWdFeHAoc3JjKTsgICAvLyBSZWdFeHBcbiAgXHR9XG4gIFx0dmFyIHIsIGksIGw7XG4gIFx0aWYoc3JjIGluc3RhbmNlb2YgQXJyYXkpe1xuICBcdFx0Ly8gYXJyYXlcbiAgXHRcdHIgPSBbXTtcbiAgXHRcdGZvcihpID0gMCwgbCA9IHNyYy5sZW5ndGg7IGkgPCBsOyArK2kpe1xuICBcdFx0XHRpZihpIGluIHNyYyl7XG4gIFx0XHRcdFx0ci5wdXNoKGRlZXBfY2xvbmUoc3JjW2ldKSk7XG4gIFx0XHRcdH1cbiAgXHRcdH1cbiAgXHR9IGVsc2Uge1xuICBcdFx0Ly8gZ2VuZXJpYyBvYmplY3RzXG4gIFx0XHRyID0gc3JjLmNvbnN0cnVjdG9yID8gbmV3IHNyYy5jb25zdHJ1Y3RvcigpIDoge307XG4gIFx0fVxuICBcdHJldHVybiBtaXhpbihyLCBzcmMsIGRlZXBfY2xvbmUpO1xuICB9O1xuICBcbiAgLyoqIFNwZWNpYWxpemVkIGNsb25lIGZ1bmN0aW9uIHRoYXQgb25seSBjbG9uZXMgc2NhbGFycyBhbmQgbmVzdGVkIGFycmF5cyB3aGVyZVxuICAgKiBlYWNoIGFycmF5IGVpdGhlciBjb25zaXN0cyBvZiBhbGwgYXJyYXlzIG9yIGFsbCBudW1iZXJzLiBUaGlzIGZ1bmN0aW9uXG4gICAqIGlzIG1lYW50IGFzIGEgZmFzdCB3YXkgb2YgY2xvbmluZyBwYXJhbWV0ZXIgZHJhd3Mgd2l0aGluIHRoZSBtY21jIHNhbXBsaW5nXG4gICAqIGxvb3AuXG4gICAqL1xuICB2YXIgY2xvbmVfcGFyYW1fZHJhdyA9IGZ1bmN0aW9uKHgpIHtcbiAgICBpZihBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICBpZihBcnJheS5pc0FycmF5KHhbMF0pKSB7XG4gICAgICAgIC8vIHggaXMgYW4gYXJyYXkgb2YgYXJyYXlzIHNvIHdlIG5lZWQgdG8gY2xvbmUgaXQgcmVjdXJzaXZlbHlcbiAgICAgICAgdmFyIHhfY29weSA9IFtdO1xuICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW5ndGggPSB4Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgeF9jb3B5LnB1c2goY2xvbmVfcGFyYW1fZHJhdyh4W2ldKSk7XG4gICAgICAgIH0gXG4gICAgICAgIHJldHVybiB4X2NvcHk7XG4gICAgICB9IGVsc2UgeyAvLyBXZSdsbCBhc3N1bWUgeCBpcyBhIGFycmF5cyBvZiBzY2FsYXJzXG4gICAgICAgIHJldHVybiB4LnNsaWNlKDApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIFdlJ2xsIGFzc3VtZSB4IGlzIGEgc2NhbGFyXG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyB0cnVlIGlmIG9iamVjdCBpcyBhIG51bWJlci5cbiAgICovXG4gIHZhciBpc19udW1iZXIgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09IFwibnVtYmVyXCIgfHwgKHR5cGVvZiBvYmplY3QgPT0gXCJvYmplY3RcIiAmJiBvYmplY3QuY29uc3RydWN0b3IgPT09IE51bWJlcik7XG4gIH07XG4gIFxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSAocG9zc2libHkgbXVsdGlkaW1lbnNpb25hbC9uZXN0ZWQpIGFycmF5LlxuICAgKiBAcGFyYW0gZGltIC0gQW4gYXJyYXkgZ2l2aW5nIHRoZSBkaW1lbnNpb24gb2YgdGhlIGFycmF5LiBGb3IgZXhhbXBsZSxcbiAgICogICBbNV0gd291bGQgeWllbGQgYSA1IGVsZW1lbnQgYXJyYXksIGFuZCBbMywzXSB3b3VsZCB5aWVsZCBhIDMgYnkgMyBtYXRyaXguXG4gICAqIEBwYXJhbSBpbml0IC0gQSB2YWx1ZSBvciBhIGZ1bmN0aW9uIHVzZWQgdG8gZmlsbCBpbiB0aGUgZWFjaCBlbGVtZW50IGluXG4gICAqICAgdGhlIGFycmF5LiBJZiBpdCBpcyBhIGZ1bmN0aW9uIGl0IHNob3VsZCB0YWtlIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBiZSBcbiAgICogICBldmFsdWF0ZWQgb25jZSBmb3IgZWFjaCBlbGVtZW50LCBhbmQgaXQncyByZXR1cm4gdmFsdWUgd2lsbCBiZSB1c2VkIHRvXG4gICAqICAgZmlsbCBpbiBlYWNoIGVsZW1lbnQuXG4gICAqIEBleGFtcGxlIFxuICAgKiAvLyBUaGUgZm9sbG93aW5nIHdvdWxkIHJldHVybiBbWzEsMV0sWzEsMV0sWzEsMV1dXG4gICAqIGNyZWF0ZV9hcnJheShbMiwzXSwgMSlcbiAgICovXG4gIHZhciBjcmVhdGVfYXJyYXkgPSBmdW5jdGlvbihkaW0sIGluaXQpIHtcbiAgICB2YXIgYXJyID0gbmV3IEFycmF5KGRpbVswXSk7XG4gICAgdmFyIGk7XG4gICAgaWYoZGltLmxlbmd0aCA9PSAxKSB7IC8vIEZpbGwgaXQgdXAgd2l0aCBpbml0XG4gICAgICBpZih0eXBlb2YgaW5pdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgYXJyW2ldID0gaW5pdCgpO1xuICAgICAgICB9ICBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgYXJyW2ldID0gaW5pdDtcbiAgICAgICAgfSBcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYoZGltLmxlbmd0aCA+IDEpIHtcbiAgICAgIGZvcihpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgIGFycltpXSA9IGNyZWF0ZV9hcnJheShkaW0uc2xpY2UoMSksIGluaXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBcImNyZWF0ZV9hcnJheSBjYW4ndCBjcmVhdGUgYSBkaW1lbnNpb25sZXNzIGFycmF5XCI7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG4gIH07XG4gIFxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkaW1lbnNpb25zIG9mIGEgcG9zc2libHkgbmVzdGVkIGFycmF5IGFzIGFuIGFycmF5LiBGb3IgXG4gICAqIGV4YW1wbGUsIGFycmF5X2RpbSggW1sxLCAyXSwgWzEsIDJdXSApIHNob3VsZCByZXR1cm4gWzIsIDJdXG4gICAqIEFzc3VtZXMgdGhhdCBhbGwgYXJyYXlzIGluc2lkZSBhbm90aGVyIGFycmF5IGFyZSBvZiB0aGUgc2FtZSBsZW5ndGguXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFNob3VsZCByZXR1cm4gWzQsIDIsIDFdXG4gICAqIGFycmF5X2RpbShjcmVhdGVfYXJyYXkoWzQsIDIsIDFdLCAwKSlcbiAgICovXG4gIHZhciBhcnJheV9kaW0gPSBmdW5jdGlvbihhKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhWzBdKSkge1xuICAgICAgcmV0dXJuIFthLmxlbmd0aF0uY29uY2F0KGFycmF5X2RpbShhWzBdKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbYS5sZW5ndGhdO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdHdvIGFycmF5cyBhcmUgZXF1YWwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzXG4gICAqIGFzIGp1ZGdlZCBieSB0aGUgXCI9PVwiIG9wZXJhdG9yLiBSZXR1cm5zIHRydWUgb3IgZmFsc2UuXG4gICAqIEFkYXB0ZWQgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNDg1Mzk3NC8xMDAxODQ4XG4gICAqLyBcbiAgdmFyIGFycmF5X2VxdWFsID0gZnVuY3Rpb24gKGExLCBhMikge1xuICAgICAgaWYgKGExLmxlbmd0aCAhPSBhMi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIG5lc3RlZCBhcnJheXNcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhMVtpXSkgJiYgQXJyYXkuaXNBcnJheShhMltpXSkpIHtcbiAgICAgICAgICAgICAgLy8gcmVjdXJzZSBpbnRvIHRoZSBuZXN0ZWQgYXJyYXlzXG4gICAgICAgICAgICAgIGlmICghYXJyYXlfZXF1YWwoYTFbaV0sIGEyW2ldKSkgcmV0dXJuIGZhbHNlOyAgICAgICBcbiAgICAgICAgICB9ICAgICAgICAgICBcbiAgICAgICAgICBlbHNlIGlmIChhMVtpXSAhPSBhMltpXSkgeyBcbiAgICAgICAgICAgICAgLy8gV2FybmluZyAtIHR3byBkaWZmZXJlbnQgb2JqZWN0IGluc3RhbmNlcyB3aWxsIG5ldmVyIGJlIGVxdWFsOiB7eDoyMH0gIT0ge3g6MjB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICBcbiAgICAgICAgICB9ICAgICAgICAgICBcbiAgICAgIH0gICAgICAgXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBUcmF2ZXJzZXMgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYSBhbmQgYXBwbGllcyBmdW4gdG8gYWxsIFwibGVhZiBub2Rlc1wiLCBcbiAgICogdGhhdCBpcywgdmFsdWVzIHRoYXQgYXJlIG5vdCBhcnJheXMuIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2l6ZSBhc1xuICAgKiBhLlxuICAgKi9cbiAgdmFyIG5lc3RlZF9hcnJheV9hcHBseSA9IGZ1bmN0aW9uKGEsIGZ1bikge1xuICAgIGlmKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoYS5sZW5ndGgpO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0W2ldID0gbmVzdGVkX2FycmF5X2FwcGx5KGFbaV0sIGZ1bik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZnVuKGEpO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKiBSYW5kb21pemluZyB0aGUgYXJyYXkgZWxlbWVudCBvcmRlciBpbi1wbGFjZS4gVXNpbmcgRHVyc3RlbmZlbGRcbiAgICogc2h1ZmZsZSBhbGdvcml0aG0uIEFkYXB0ZWQgZnJvbSBoZXJlOiBcbiAgICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTI2NDY4NjQvMTAwMTg0OFxuICAgKi9cbiAgZnVuY3Rpb24gc2h1ZmZsZV9hcnJheShhcnJheSkge1xuICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICB2YXIgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgICAgIHZhciB0ZW1wID0gYXJyYXlbaV07XG4gICAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgICAgICAgICBhcnJheVtqXSA9IHRlbXA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEb2VzIHRoZSBzYW1lIHRoaW5nIGFzIG5lc3RlZF9hcnJheV9hcHBseSwgdGhhdCBpcywgdHJhdmVyc2VzIGEgcG9zc2libHlcbiAgICogbmVzdGVkIGFycmF5IGEgYW5kIGFwcGxpZXMgZnVuIHRvIGFsbCBcImxlYWYgbm9kZXNcIiBhbmQgcmV0dXJucyBhbiBhcnJheSBcbiAgICogb2YgdGhlIHNhbWUgc2l6ZSBhcyBhLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG5lc3RlZF9hcnJheV9yYW5kb21fYXBwbHlcbiAgICogYnJhbmNoZXMgcmFuZG9tbHkuXG4gICAqL1xuICB2YXIgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSA9IGZ1bmN0aW9uKGEsIGZ1bikge1xuICAgIGlmKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIHZhciBsZW4gPSBhLmxlbmd0aDtcbiAgICAgIHZhciBpO1xuICAgICAgdmFyIGFycmF5X2lzID0gW107XG4gICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBhcnJheV9pc1tpXSA9IGk7XG4gICAgICB9XG4gICAgICBzaHVmZmxlX2FycmF5KGFycmF5X2lzKTtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIFxuICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGFycmF5X2kgPSBhcnJheV9pc1tpXTtcbiAgICAgICAgcmVzdWx0W2FycmF5X2ldID0gbmVzdGVkX2FycmF5X2FwcGx5KGFbYXJyYXlfaV0sIGZ1bik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZnVuKGEpO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBBbGxvd3MgYSBwcmV0dHkgd2F5IG9mIHNldHRpbmcgZGVmYXVsdCBvcHRpb25zIHdoZXJlIHRoZSBkZWZ1bHRzIGNhbiBiZVxuICAgKiBvdmVycmlkZGVuIGJ5IGFuIG9wdGlvbnMgb2JqZWN0LlxuICAgKiAgQHBhcmFtIG9wdGlvbl9uYW1lIC0gdGhlIG5hbWUgb2YgdGhlIG9wdGlvbiBhcyBhIHN0cmluZ1xuICAgKiAgQHBhcmFtIG15X29wdGlvbnMgLSBhbiBvcHRpb24gb2JqZWN0IHRoYXQgY291bGQgaGF2ZSBvcHRpb25fbmFtZSBcbiAgICogICAgYXMgYSBtZW1iZXIuXG4gICAqIEBwYXJhbSBkZWZhdWxfdmFsdWUgLSBkZWZ1bHQgdmFsdWUgdGhhdCBpcyByZXR1cm5lZCBpZiBvcHRpb25fbmFtZSBcbiAgICogICBpcyBub3QgZGVmaW5lZCBpbiBteV9vcHRpb25zLlxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgbXlfb3B0aW9ucyA9IHtwaTogMy4xNDE1OX1cbiAgICogdmFyIHBpID0gZ2V0X29wdGlvbihcInBpXCIsIG15X29wdGlvbnMsIDMuMTQpXG4gICAqL1xuICAvLyBQcmV0dHkgd2F5IG9mIHNldHRpbmcgZGVmYXVsdCBvcHRpb25zIHdoZXJlIHRoZSBkZWZhdWx0cyBjYW4gYmUgb3ZlcnJpZGRlblxuICAvLyBieSBhbiBvcHRpb25zIG9iamVjdC4gRm9yIGV4YW1wbGU6XG4gIC8vIHZhciBwaSA9IGdldF9vcHRpb24oXCJwaVwiLCBteV9vcHRpb25zLCAzLjE0KVxuICB2YXIgZ2V0X29wdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkZWZhdWxfdmFsdWUpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShvcHRpb25fbmFtZSkgJiYgXG4gICAgICAgICAgIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSB1bmRlZmluZWQgICYmIFxuICAgICAgICAgICBvcHRpb25zW29wdGlvbl9uYW1lXSAhPT0gbnVsbCA/IG9wdGlvbnNbb3B0aW9uX25hbWVdIDogZGVmYXVsX3ZhbHVlO1xuICB9O1xuICBcbiAgLyoqIFZlcnNpb24gb2YgZ2V0X29wdGlvbiB3aGVyZSB0aGUgb3B0aW9uIHNob3VsZCBiZSBhIG9uZSBvciBtdWx0aS1kaW1lbnNpb25hbFxuICAgKiBhcnJheSBhbmQgd2hlcmUgdGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gZWl0aGVyIGJ5IGEgc2NhbGFyIG9yIGJ5IGFuIGFycmF5LlxuICAgKiBJZiBpdCdzIGEgc2NhbGFyIHRoZSB0aGF0IHNjYWxhciBpcyB1c2VkIHRvIGluaXRpYWxpemUgYW4gYXJyYXkgd2l0aCBcbiAgICogZGltIGRpbWVuc2lvbnMuXG4gICAqIFxuICAgKi9cbiAgdmFyIGdldF9tdWx0aWRpbV9vcHRpb24gPSBmdW5jdGlvbihvcHRpb25fbmFtZSwgb3B0aW9ucywgZGltLCBkZWZhdWxfdmFsdWUpIHtcbiAgICB2YXIgdmFsdWUgPSBnZXRfb3B0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkZWZhdWxfdmFsdWUpO1xuICAgICBpZighIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgdmFsdWUgPSBjcmVhdGVfYXJyYXkoZGltLCB2YWx1ZSk7XG4gICAgIH0gXG4gICAgIGlmKCEgYXJyYXlfZXF1YWwoIGFycmF5X2RpbSh2YWx1ZSksIGRpbSkpIHtcbiAgICAgICB0aHJvdyBcIlRoZSBvcHRpb24gXCIgKyBvcHRpb25fbmFtZSArIFwiIGlzIG9mIGRpbWVuc2lvbiBbXCIgKyBcbiAgICAgICAgICAgICBhcnJheV9kaW0odmFsdWUpICsgXCJdIGJ1dCBzaG91bGQgYmUgW1wiICsgZGltICsgXCJdLlwiO1xuICAgIH1cbiAgICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuICBcbiAgLy8vLy8vLy8vLyBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHBhcmFtZXRlciBvYmplY3RzIC8vLy8vLy8vLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZml4ZWQgKHNhbWUgZXZlcnkgdGltZSkgbnVtYmVyIHRoYXQgY291bGQgYmUgdXNlZCB0byBpbml0aWFsaXplXG4gICAqIGEgcGFyYW1ldGVyIG9mIGEgY2VydGFpbiB0eXBlLCBwb3NzaWJseSB3aXRoIGxvd2VyIGFuZCB1cHBlciBib3VuZHMuXG4gICAqIFRoZSBwb3NzaWxlIHR5cGVzIGFyZSBcInJlYWxcIiwgXCJpbnRcIiwgYW5kIFwiYmluYXJ5XCIuXG4gICAqL1xuICB2YXIgcGFyYW1faW5pdF9maXhlZCA9IGZ1bmN0aW9uKHR5cGUsIGxvd2VyLCB1cHBlcikge1xuICAgIGlmKGxvd2VyID4gdXBwZXIpIHtcbiAgICAgIHRocm93IFwiQ2FuIG5vdCBpbml0aWFsaXplIHBhcmFtZXRlciB3aGVyZSBsb3dlciBib3VuZCA+IHVwcGVyIGJvdW5kXCI7XG4gICAgfVxuICAgIGlmKHR5cGUgPT09IFwicmVhbFwiKSB7XG4gICAgICBpZihsb3dlciA9PT0gLUluZmluaXR5ICYmIHVwcGVyID09PSBJbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gMC41O1xuICAgICAgfSBlbHNlIGlmKGxvd2VyID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIHVwcGVyIC0gMC41O1xuICAgICAgfSBlbHNlIGlmKHVwcGVyID09PSBJbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gbG93ZXIgKyAwLjU7XG4gICAgICB9IGVsc2UgaWYobG93ZXIgPD0gdXBwZXIpIHtcbiAgICAgICAgcmV0dXJuIChsb3dlciArIHVwcGVyKSAvIDI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKHR5cGUgPT09IFwiaW50XCIpIHtcbiAgICAgIGlmKGxvd2VyID09PSAtSW5maW5pdHkgJiYgdXBwZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfSBlbHNlIGlmKGxvd2VyID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIHVwcGVyIC0gMTtcbiAgICAgIH0gZWxzZSBpZih1cHBlciA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIGxvd2VyICsgMTtcbiAgICAgIH0gZWxzZSBpZihsb3dlciA8PSB1cHBlcil7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKChsb3dlciArIHVwcGVyKSAvIDIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZih0eXBlID09PSBcImJpbmFyeVwiKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgdGhyb3cgXCJDb3VsZCBub3QgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIgb2YgdHlwZSBcIiArIHR5cGUgKyBcIltcIiArIGxvd2VyICsgXCIsIFwiICsgdXBwZXIgKyBcIl1cIjtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBDb21wbGV0ZXMgcGFyYW1zX3RvX2NvbXBsZXRlLCBhbiBvYmplY3QgY29udGFpbmluZyBwYXJhbWV0ZXIgZGVzY3JpcHRpb25zLCBcbiAgICogYW5kIGluaXRpYWxpemVzIG5vbi1pbml0aWFsaXplZCBwYXJhbWV0ZXJzLiBUaGlzIG1vZGlmaWVkIHZlcnNpb24gb2ZcbiAgICogcGFyYW1zX3RvX2NvbXBsZXRlIGlzIHJldHVybmVkIGFzIGEgZGVlcCBjb3B5IGFuZCBub3QgbW9kaWZpZWQgaW4gcGxhY2UuXG4gICAqIEluaXRpYWxpemF0aW9uIGlzIGRvbmUgYnkgc3VwcGx5aW5nIGEgcGFyYW1faW5pdCBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZVxuICAgKiBmdW5jdGlvbih0eXBlLCBsb3dlciwgdXBwZXIpIHRoYXQgc2hvdWxkIHJldHVybiBhIHNpbmdsZSBudW1iZXIgXG4gICAqIChsaWtlIHBhcmFtX2luaXRfZml4ZWQsIGZvciBleGFtcGxlKS5cbiAgICogQGV4YW1wbGVcbiAgICogdmFyIHBhcmFtcyA9IHsgXCJtdVwiOiB7XCJ0eXBlXCI6IFwicmVhbFwifSB9XG4gICAqIHBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyhwYXJhbXMpO1xuICAgKiAvLyBwYXJhbXMgc2hvdWxkIG5vdyBiZTpcbiAgICogLy8gIHtcIm11XCI6IHsgXCJ0eXBlXCI6IFwicmVhbFwiLCBcImRpbVwiOiBbMV0sIFwidXBwZXJcIjogSW5maW5pdHksXG4gICAqIC8vICAgICAgICAgICBcImxvd2VyXCI6IC1JbmZpbml0eSwgXCJpbml0XCI6IDAuNSB9fVxuICAgKi8gXG4gIHZhciBjb21wbGV0ZV9wYXJhbXMgID0gZnVuY3Rpb24ocGFyYW1zX3RvX2NvbXBsZXRlLCBwYXJhbV9pbml0KSB7XG4gICAgdmFyIHBhcmFtcyA9IGRlZXBfY2xvbmUocGFyYW1zX3RvX2NvbXBsZXRlKTtcbiAgICBmb3IgKHZhciBwYXJhbV9uYW1lIGluIHBhcmFtcykgeyBpZiAoIXBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbV9uYW1lKSkgY29udGludWU7XG4gICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbcGFyYW1fbmFtZV07XG4gICAgICBpZiggIXBhcmFtLmhhc093blByb3BlcnR5KFwidHlwZVwiKSkge1xuICAgICAgICBwYXJhbS50eXBlID0gXCJyZWFsXCI7XG4gICAgICB9XG4gICAgICBpZighcGFyYW0uaGFzT3duUHJvcGVydHkoXCJkaW1cIikpIHtcbiAgICAgICAgcGFyYW0uZGltID0gWzFdO1xuICAgICAgfVxuICAgICAgaWYoaXNfbnVtYmVyKHBhcmFtLmRpbSkpIHtcbiAgICAgICAgcGFyYW0uZGltID0gW3BhcmFtLmRpbV07XG4gICAgICB9XG4gICAgICBpZihwYXJhbS50eXBlID09IFwiYmluYXJ5XCIpIHtcbiAgICAgICAgcGFyYW0udXBwZXIgPSAxO1xuICAgICAgICBwYXJhbS5sb3dlciA9IDA7XG4gICAgICB9XG4gICAgICBpZighcGFyYW0uaGFzT3duUHJvcGVydHkoXCJ1cHBlclwiKSkge1xuICAgICAgICBwYXJhbS51cHBlciA9IEluZmluaXR5O1xuICAgICAgfVxuICAgICAgaWYoIXBhcmFtLmhhc093blByb3BlcnR5KFwibG93ZXJcIikpIHtcbiAgICAgICAgcGFyYW0ubG93ZXIgPSAtSW5maW5pdHk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmKHBhcmFtLmhhc093blByb3BlcnR5KFwiaW5pdFwiKSkge1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGp1c3QgYSBudW1iZXIgb3IgYSBuZXN0ZWQgYXJyYXkgd2UgbGVhdmUgaXQgYWxvbmUsIGJ1dCBpZi4uLlxuICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgdHlwZW9mIHBhcmFtLmluaXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIHBhcmFtLmluaXQgaXMgYSBmdW5jdGlvbiwgdXNlIHRoYXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFyYW1ldGVyLlxuICAgICAgICAgIHBhcmFtLmluaXQgPSBwYXJhbS5pbml0KCk7XG4gICAgICAgIH0gZWxzZSBpZighYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pICYmICFBcnJheS5pc0FycmF5KHBhcmFtLmluaXQpKSB7XG4gICAgICAgIC8vIFdlIGhhdmUgYSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlciB3aGVyZSB0aGUgcGFyYW0uaW5pdCBleGlzdCBidXRcbiAgICAgICAgLy8gaXMgbm90IGFuIGFycmF5LiBUaGVuIGFzc3VtZSBpdCBpcyBhIG51bWJlciBvciBhIGZ1bmN0aW9uIGFuZCB1c2VcbiAgICAgICAgLy8gaXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFyYW1ldGVyLlxuICAgICAgICBwYXJhbS5pbml0ID0gY3JlYXRlX2FycmF5KHBhcmFtLmRpbSwgcGFyYW0uaW5pdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7IC8vIFdlIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi5cbiAgICAgICAgaWYoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7XG4gICAgICAgICAgcGFyYW0uaW5pdCA9IHBhcmFtX2luaXQocGFyYW0udHlwZSwgcGFyYW0ubG93ZXIsIHBhcmFtLnVwcGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJhbS5pbml0ID0gY3JlYXRlX2FycmF5KHBhcmFtLmRpbSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH07XG4gIFxuICBcbiAgLy8vLy8vLy8vLyBTdGVwcGVyIEZ1bmN0aW9ucyAvLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIFxuICBcbiAgLyoqXG4gICAqIEBpbnRlcmZhY2VcbiAgICogQSBTdGVwcGVyIGlzIGFuIG9iamVjdCByZXNwb25zaWJsZSBmb3IgcHVzaGluZyBhcm91bmQgb25lXG4gICAqIG9yIG1vcmUgcGFyYW1ldGVyIHZhbHVlcyBpbiBhIHN0YXRlIGFjY29yZGluZyB0byB0aGUgZGlzdHJpYnV0aW9uXG4gICAqIGRlZmluZWQgYnkgdGhlIGxvZyBwb3N0ZXJpb3IuIFRoaXMgZGVmaW5lcyB0aGUgU3RlcHBlciBcImludGVyZmFjZVwiLFxuICAgKiB3aGVyZSBcImludGVyZmFjZVwiIG1lYW5zIHRoYXQgU3RlcHBlciBkZWZpbmVzIGEgY2xhc3MgdGhhdCBpcyBuZXZlclxuICAgKiBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBqdXN0IHRvIGJlIHN1YmNsYXNzZWQgYnkgc3BlY2lhbGl6ZWRcbiAgICogc3RlcHBlciBmdW5jdGlvbnMuXG4gICAqIEBpbnRlcmZhY2VcbiAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6XG4gICAqICAge1wibXVcIjogeyBcInR5cGVcIjogXCJyZWFsXCIsIFwiZGltXCI6IFsxXSwgXCJ1cHBlclwiOiBJbmZpbml0eSwgXG4gICAqICAgXCJsb3dlclwiOiAtSW5maW5pdHksIFwiaW5pdFwiOiAwLjUgfX1cbiAgICogICBUaGUgcGFyYW1ldGVyIGRlZmluaXRpb25zIGFyZSBleHBlY3RlZCB0byBiZSBcImNvbXBsZXRlXCIsIHRoYXQgaXMsXG4gICAqICAgc3BlY2lmeWluZyBhbGwgcmVsZXZhbnQgYXR0cmlidXRlcyBzdWNoIGFzIGRpbSwgbG93ZXIgYW5kIHVwcGVyLlxuICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMgaW4gcGFyYW1zXG4gICAqICAgKGFuZCBwb3NzaWJseSBtb3JlKS4gVGhlIHBhcmFtZXRlciBuYW1lcyBhcmUgZ2l2ZW4gYXMga2V5cyBhbmQgdGhlIHN0YXRlc1xuICAgKiAgIGFzIHNjYWxhcnMgb3IsIHBvc3NpYmx5IG5lc3RlZCwgYXJyYXlzLiBGb3IgZXhhbXBsZTpcbiAgICogICB7bXU6IDEwLCBzaWdtYTogNSwgYmV0YTogWzEsIDIuNV19XG4gICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gKnRha2luZyBubyBwYXJhbWV0ZXJzKiB0aGF0IHJldHVybnMgdGhlXG4gICAqICAgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gVGhhdCBpcywgdGhlIHZhbHVlIG9mIGxvZ19wb3N0XG4gICAqICAgc2hvdWxkIGNoYW5nZSBpZiB0aGUgdGhlIHZhbHVlcyBpbiBzdGF0ZSBhcmUgY2hhbmdlZC5cbiAgXG4gICAqL1xuICB2YXIgU3RlcHBlciA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KSB7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMubG9nX3Bvc3QgPSBsb2dfcG9zdDtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBUYWtlcyBhIHN0ZXAgaW4gdGhlIHBhcmFtZXRlciBzcGFjZS4gU2hvdWxkIHJldHVybiB0aGUgbmV3IHN0YXRlLFxuICAgKiBidXQgaXMgbWFpbmx5IGNhbGxlZCBmb3IgaXQncyBzaWRlIGVmZmVjdCBvZiBtYWtpbmcgYSBjaGFuZ2UgaW4gdGhlXG4gICAqIHN0YXRlIG9iamVjdC5cbiAgICovXG4gIFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyBcIkV2ZXJ5IFN0ZXBwZXIgbmVlZCB0byBpbXBsZW1lbnQgc3RlcCgpXCI7XG4gIH07XG4gIFxuICAvKipcbiAgICogSWYgaW1wbGVtZW50ZWQsIG1ha2VzIHRoZSBzdGVwcGVyIGFkYXB0IHdoaWxlIHN0ZXBwaW5nLlxuICAgKi8gXG4gIFN0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICAvLyBPcHRpb25hbCwgc29tZSBzdGVwcGVycyBtaWdodCBub3QgYmUgYWRhcHRpdmUuICovIFxuICB9O1xuICBcbiAgLyoqXG4gICAqIElmIGltcGxlbWVudGVkLCBtYWtlcyB0aGUgc3RlcHBlciBjZWFzZSBhZGFwdGluZyB3aGlsZSBzdGVwcGluZy5cbiAgICovIFxuICBTdGVwcGVyLnByb3RvdHlwZS5zdG9wX2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICAvLyBPcHRpb25hbCwgc29tZSBzdGVwcGVycyBtaWdodCBub3QgYmUgYWRhcHRpdmUuICovIFxuICB9O1xuICBcbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5nIGluZm8gcmVnYXJkaW5nIHRoZSBzdGVwcGVyLlxuICAgKi8gXG4gIFN0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbigpIHtcbiAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGluZm8gYWJvdXQgdGhlIHN0YXRlIG9mIHRoZSBzdGVwcGVyLlxuICAgIHJldHVybiB7fTtcbiAgfTtcbiAgXG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfVxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgbWV0cm9wb2xpcyBzdGVwIGluXG4gICAqIHRoZSBBZGFwdGl2ZSBNZXRyb3BvbGlzLVdpdGhpbi1HaWJicyBhbGdvcml0aG0gaW4gXCJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DXCJcbiAgICogYnkgUm9iZXJ0cyBhbmQgUm9zZW50aGFsICgyMDA4KS5cbiAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uLlxuICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLlxuICAgKiBAcGFyYW0gZ2VuZXJhdGVfcHJvcG9zYWwgLSBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHByb3Bvc2FsIChhcyBhIG51bWJlcilcbiAgICogd2l0aCBzaWduYXR1cmUgZnVuY3Rpb24ocGFyYW1fc3RhdGUsIGxvZ19zY2FsZSkgd2hlcmUgcGFyYW1fc3RhdGUgaXMgYVxuICAgKiBudW1iZXIgYW5kIGxvZ19zY2FsZSBkZWZpbmVzIHRoZSBzY2FsZSBvZiB0aGUgcHJvcG9zYWwgc29tZWhvdy5cbiAgKi9cbiAgdmFyIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGdlbmVyYXRlX3Byb3Bvc2FsKSB7XG4gICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTtcbiAgICBcbiAgICB2YXIgcGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7XG4gICAgaWYocGFyYW1fbmFtZXMubGVuZ3RoICAhPSAxKSB7XG4gICAgICB0aHJvdyBcIk9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIGNhbiBvbmx5IGhhbmRsZSBvbmUgcGFyYW1ldGVyLlwiO1xuICAgIH1cbiAgICB0aGlzLnBhcmFtX25hbWUgPSBwYXJhbV9uYW1lc1swXTtcbiAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdO1xuICAgIGlmKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgIHRocm93IFwiT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgY2FuIG9ubHkgaGFuZGxlIG9uZSBvbmUtZGltZW5zaW9uYWwgcGFyYW1ldGVyLlwiO1xuICAgIH1cbiAgICB0aGlzLmxvd2VyID0gcGFyYW0ubG93ZXI7XG4gICAgdGhpcy51cHBlciA9IHBhcmFtLnVwcGVyO1xuICAgIFxuICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgICAgID0gZ2V0X29wdGlvbihcInByb3BfbG9nX3NjYWxlXCIsIG9wdGlvbnMsIDApO1xuICAgIHRoaXMuYmF0Y2hfc2l6ZSAgICAgICAgID0gZ2V0X29wdGlvbihcImJhdGNoX3NpemVcIiwgb3B0aW9ucywgNTApO1xuICAgIHRoaXMubWF4X2FkYXB0YXRpb24gICAgID0gZ2V0X29wdGlvbihcIm1heF9hZGFwdGF0aW9uXCIsIG9wdGlvbnMsIDAuMzMpO1xuICAgIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uID0gZ2V0X29wdGlvbihcImluaXRpYWxfYWRhcHRhdGlvblwiLCBvcHRpb25zLCAxLjApO1xuICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X29wdGlvbihcInRhcmdldF9hY2NlcHRfcmF0ZVwiLCBvcHRpb25zLCAwLjQ0KTtcbiAgICB0aGlzLmlzX2FkYXB0aW5nICAgICAgICA9IGdldF9vcHRpb24oXCJpc19hZGFwdGluZ1wiLCBvcHRpb25zLCB0cnVlKTtcbiAgICBcbiAgICB0aGlzLmdlbmVyYXRlX3Byb3Bvc2FsID0gZ2VuZXJhdGVfcHJvcG9zYWw7XG4gICAgXG4gICAgdGhpcy5hY2NlcHRhbmNlX2NvdW50ID0gMDtcbiAgICB0aGlzLmJhdGNoX2NvdW50ID0gMDtcbiAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24gPSAwOyAgXG4gIH07XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyO1xuICBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwYXJhbV9zdGF0ZSA9IHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXTtcbiAgICAgIHZhciBwYXJhbV9wcm9wb3NhbCA9IHRoaXMuZ2VuZXJhdGVfcHJvcG9zYWwocGFyYW1fc3RhdGUsIHRoaXMucHJvcF9sb2dfc2NhbGUpO1xuICAgICAgaWYocGFyYW1fcHJvcG9zYWwgPCB0aGlzLmxvd2VyIHx8IHBhcmFtX3Byb3Bvc2FsID4gdGhpcy51cHBlcikge1xuICAgICAgICAvLyBPdXRzaWRlIG9mIGxpbWl0cyBvZiB0aGUgcGFyYW1ldGVyLCByZWplY3QgdGhlIHByb3Bvc2FsIFxuICAgICAgICAvLyBhbmQgc3RheSBhdCB0aGUgY3VycmVudCBzdGF0ZS5cbiAgICAgIH0gZWxzZSB7IC8vIG1ha2UgYSBNZXRyb3BvbGlzIHN0ZXBcbiAgICAgICAgdmFyIGN1cnJfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7XG4gICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3Byb3Bvc2FsO1xuICAgICAgICB2YXIgcHJvcF9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICAgICAgdmFyIGFjY2VwdF9wcm9iID0gTWF0aC5leHAocHJvcF9sb2dfZGVucyAtIGN1cnJfbG9nX2RlbnMpO1xuICAgICAgICBpZihhY2NlcHRfcHJvYiA+IE1hdGgucmFuZG9tKCkpIHtcbiAgICAgICAgICAvLyBXZSBkbyBub3RoaW5nIGFzIHRoZSBzdGF0ZSBvZiBwYXJhbSBoYXMgYWxyZWFkeSBiZWVuIGNoYW5nZWQgdG8gdGhlIHByb3Bvc2FsXG4gICAgICAgICAgaWYodGhpcy5pc19hZGFwdGluZykgdGhpcy5hY2NlcHRhbmNlX2NvdW50KysgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHJldmVydCBzdGF0ZSBiYWNrIHRvIHRoZSBvbGQgc3RhdGUgb2YgcGFyYW1cbiAgICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSBwYXJhbV9zdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYodGhpcy5pc19hZGFwdGluZykge1xuICAgICAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24gKys7XG4gICAgICAgIGlmKHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA+PSB0aGlzLmJhdGNoX3NpemUpIHsgLy8gdGhlbiBhZGFwdFxuICAgICAgICAgIHRoaXMuYmF0Y2hfY291bnQgKys7XG4gICAgICAgICAgdmFyIGxvZ19zZF9hZGp1c3RtZW50ID0gXG4gICAgICAgICAgICBNYXRoLm1pbih0aGlzLm1heF9hZGFwdGF0aW9uLCBcbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uIC8gTWF0aC5zcXJ0KHRoaXMuYmF0Y2hfY291bnQpKTtcbiAgICAgICAgICBpZih0aGlzLmFjY2VwdGFuY2VfY291bnQgLyB0aGlzLmJhdGNoX3NpemUgPiB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSArPSBsb2dfc2RfYWRqdXN0bWVudDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSAtPSBsb2dfc2RfYWRqdXN0bWVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hY2NlcHRhbmNlX2NvdW50ID0gMDtcbiAgICAgICAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdO1xuICB9O1xuICBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlzX2FkYXB0aW5nID0gdHJ1ZTtcbiAgfTtcbiAgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdG9wX2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlzX2FkYXB0aW5nID0gZmFsc2U7XG4gIH07XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwcm9wX2xvZ19zY2FsZTogdGhpcy5wcm9wX2xvZ19zY2FsZSxcbiAgICAgIGlzX2FkYXB0aW5nOiB0aGlzLmlzX2FkYXB0aW5nLFxuICAgICAgYWNjZXB0YW5jZV9jb3VudDogdGhpcy5hY2NlcHRhbmNlX2NvdW50LFxuICAgICAgaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbjogdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uLFxuICAgICAgYmF0Y2hfY291bnQ6IHRoaXMuYmF0Y2hfY291bnRcbiAgICB9O1xuICB9O1xuICBcbiAgXG4gIC8qKlxuICAgKiBGdW5jdGlvbiByZXR1cm5pbmcgYSBOb3JtYWwgcHJvcG9zYWwuXG4gICAqL1xuICB2YXIgbm9ybWFsX3Byb3Bvc2FsID0gZnVuY3Rpb24ocGFyYW1fc3RhdGUsIHByb3BfbG9nX3NjYWxlKSB7XG4gICAgcmV0dXJuIHJub3JtKHBhcmFtX3N0YXRlICwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGF1Z21lbnRzIHtPbmVkaW1NZXRyb3BvbGlzU3RlcHBlcn1cbiAgICogQSBcInN1YmNsYXNzXCIgb2YgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGNvbnRpbm91cyBOb3JtYWwgcHJvcG9zYWxzLlxuICAgKi9cbiAgdmFyIFJlYWxNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7XG4gICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgbm9ybWFsX3Byb3Bvc2FsKTtcbiAgfTtcbiAgXG4gIFJlYWxNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVhbE1ldHJvcG9saXNTdGVwcGVyO1xuICBcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbC5cbiAgICovXG4gIHZhciBkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwgPSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChybm9ybShwYXJhbV9zdGF0ZSAsIE1hdGguZXhwKHByb3BfbG9nX3NjYWxlKSkpO1xuICB9O1xuICBcbiAgICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBhdWdtZW50cyB7T25lZGltTWV0cm9wb2xpc1N0ZXBwZXJ9XG4gICAqIEEgXCJzdWJjbGFzc1wiIG9mIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLlxuICAgKi9cbiAgdmFyIEludE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwpO1xuICB9O1xuICBcbiAgSW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgSW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50TWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn1cbiAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIG1ldHJvcG9saXMgc3RlcCBpblxuICAgKiB0aGUgQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluIFwiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQ1wiXG4gICAqIGJ5IFJvYmVydHMgYW5kIFJvc2VudGhhbCAoMjAwOCkgZm9yIHBvc3NpYmx5IG11bHRpZGltZW5zaW9uYWwgYXJyYXlzLiBUaGF0XG4gICAqIGlzLCBpbnN0ZWFkIG9mIGp1c3QgdGFraW5nIGEgc3RlcCBmb3IgYSBvbmUtZGltZW5zaW9uYWwgcGFyYW1ldGVyIGxpa2UgXG4gICAqIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLCB0aGlzIFN0ZXBwZXIgaXMgcmVzcG9uc2libGUgZm9yIHRha2luZyBzdGVwcyBcbiAgICogZm9yIGEgbXVsdGlkaW1lbnNpb25hbCBhcnJheS4gSXQncyBzdGlsbCBwcmV0dHkgZHVtYiBhbmQganVzdCB0YWtlc1xuICAgKiBvbmUtZGltZW5zaW9uYWwgc3RlcHMgZm9yIGVhY2ggcGFyYW1ldGVyIGNvbXBvbmVudCwgdGhvdWdoLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZm9yIGEgXG4gICAqICAgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICAqIEBwYXJhbSBTdWJTdGVwcGVyIC0gYSBjb25zdHJ1Y3RvciBmb3IgdGhlIHR5cGUgb2Ygb25lIGRpbWVuc2lvbmFsIFN0ZXBwZXIgdG8gYXBwbHkgb25cbiAgICogICBhbGwgdGhlIGNvbXBvbmVudHMgb2YgdGhlIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyLlxuICAqL1xuICB2YXIgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBTdWJTdGVwcGVyKSB7XG4gICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTtcbiAgICBcbiAgICB2YXIgcGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7XG4gICAgaWYocGFyYW1fbmFtZXMubGVuZ3RoICAhPSAxKSB7XG4gICAgICB0aHJvdyBcIk11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLlwiO1xuICAgIH1cbiAgICB0aGlzLnBhcmFtX25hbWUgPSBwYXJhbV9uYW1lc1swXTtcbiAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdO1xuICAgIHRoaXMubG93ZXIgPSBwYXJhbS5sb3dlcjtcbiAgICB0aGlzLnVwcGVyID0gcGFyYW0udXBwZXI7XG4gICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07XG4gIFxuICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgICAgID0gZ2V0X211bHRpZGltX29wdGlvbihcInByb3BfbG9nX3NjYWxlXCIsIG9wdGlvbnMsIHRoaXMuZGltLCAwKTtcbiAgICB0aGlzLmJhdGNoX3NpemUgICAgICAgICA9IGdldF9tdWx0aWRpbV9vcHRpb24oXCJiYXRjaF9zaXplXCIsIG9wdGlvbnMsIHRoaXMuZGltLCA1MCk7XG4gICAgdGhpcy5tYXhfYWRhcHRhdGlvbiAgICAgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwibWF4X2FkYXB0YXRpb25cIiwgb3B0aW9ucywgdGhpcy5kaW0sIDAuMzMpO1xuICAgIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uID0gZ2V0X211bHRpZGltX29wdGlvbihcImluaXRpYWxfYWRhcHRhdGlvblwiLCBvcHRpb25zLCB0aGlzLmRpbSwgMS4wKTtcbiAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oXCJ0YXJnZXRfYWNjZXB0X3JhdGVcIiwgb3B0aW9ucywgdGhpcy5kaW0sIDAuNDQpO1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgICAgICAgID0gZ2V0X211bHRpZGltX29wdGlvbihcImlzX2FkYXB0aW5nXCIsIG9wdGlvbnMsIHRoaXMuZGltLCB0cnVlKTtcbiAgICBcbiAgICAvLyBUaGlzIGhhY2sgYmVsb3cgaXMgYSByZWN1cnNpdmUgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFycmF5IG9mIFxuICAgIC8vIG9uZSBkaW1lbnNpb25hbCBzdGVwcGVycyBhY2NvcmRpbmcgdG8gZGltLlxuICAgIHZhciBjcmVhdGVfc3Vic3RlcHBlcnMgPSBcbiAgICAgIGZ1bmN0aW9uKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0LCBwcm9wX2xvZ19zY2FsZSwgYmF0Y2hfc2l6ZSwgbWF4X2FkYXB0YXRpb24sIGluaXRpYWxfYWRhcHRhdGlvbiwgdGFyZ2V0X2FjY2VwdF9yYXRlLCBpc19hZGFwdGluZykge1xuICAgICAgdmFyIHN1YnN0ZXBwZXJzID0gW107XG4gICAgICBpZihkaW0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBkaW1bMF07IGkrKykge1xuICAgICAgICAgIHZhciBzdWJvcHRpb25zID0ge3Byb3BfbG9nX3NjYWxlOiBwcm9wX2xvZ19zY2FsZVtpXSwgYmF0Y2hfc2l6ZTogYmF0Y2hfc2l6ZVtpXSxcbiAgICAgICAgICAgIG1heF9hZGFwdGF0aW9uOiBtYXhfYWRhcHRhdGlvbltpXSwgaW5pdGlhbF9hZGFwdGF0aW9uOiBpbml0aWFsX2FkYXB0YXRpb25baV0sXG4gICAgICAgICAgICB0YXJnZXRfYWNjZXB0X3JhdGU6IHRhcmdldF9hY2NlcHRfcmF0ZVtpXSwgaXNfYWRhcHRpbmc6IGlzX2FkYXB0aW5nW2ldfTtcbiAgICAgICAgICAgIHZhciBzdWJwYXJhbSA9IHt9O1xuICAgICAgICAgICAgc3VicGFyYW1baV0gPSBkZWVwX2Nsb25lKHBhcmFtKTtcbiAgICAgICAgICAgIHN1YnBhcmFtW2ldLmRpbSA9IFsxXTsgLy8gQXMgdGhpcyBzaG91bGQgbm93IGJlIGEgb25lLWRpbSBwYXJhbWV0ZXJcbiAgICAgICAgICAgIGRlbGV0ZSBzdWJwYXJhbVtpXS5pbml0OyAvLyBBcyBpdCBzb3VsZCBub3QgYmUgbmVlZGVkXG4gICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBuZXcgU3ViU3RlcHBlcihzdWJwYXJhbSwgc3Vic3RhdGUsIGxvZ19wb3N0LCBzdWJvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QsIHByb3BfbG9nX3NjYWxlW2ldLCBcbiAgICAgICAgICAgIGJhdGNoX3NpemVbaV0sIG1heF9hZGFwdGF0aW9uW2ldLCBpbml0aWFsX2FkYXB0YXRpb25baV0sIHRhcmdldF9hY2NlcHRfcmF0ZVtpXSwgaXNfYWRhcHRpbmdbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Vic3RlcHBlcnM7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnN1YnN0ZXBwZXJzID0gY3JlYXRlX3N1YnN0ZXBwZXJzKHRoaXMuZGltLCB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0sIHRoaXMubG9nX3Bvc3QsXG4gICAgICB0aGlzLnByb3BfbG9nX3NjYWxlLCB0aGlzLmJhdGNoX3NpemUsIHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uLFxuICAgICAgdGhpcy50YXJnZXRfYWNjZXB0X3JhdGUsIHRoaXMuaXNfYWRhcHRpbmcpO1xuICAgIFxuICB9O1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS5cbiAgICByZXR1cm4gbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7cmV0dXJuIHN1YnN0ZXBwZXIuc3RlcCgpOyB9KTtcbiAgfTtcbiAgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBuZXN0ZWRfYXJyYXlfYXBwbHkodGhpcy5zdWJzdGVwcGVycywgZnVuY3Rpb24oc3Vic3RlcHBlcikge3N1YnN0ZXBwZXIuc3RhcnRfYWRhcHRhdGlvbigpOyB9KTtcbiAgfTtcbiAgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7c3Vic3RlcHBlci5zdG9wX2FkYXB0YXRpb24oKTsgfSk7XG4gIH07XG4gIFxuICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7XG4gICAgICByZXR1cm4gc3Vic3RlcHBlci5pbmZvKCk7IFxuICAgIH0pO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9XG4gICAqIEEgXCJzdWJjbGFzc1wiIG9mIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGNvbnRpbm91cyBOb3JtYWwgcHJvcG9zYWxzLlxuICAgKi9cbiAgdmFyIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFJlYWxNZXRyb3BvbGlzU3RlcHBlcik7XG4gIH07XG4gIFxuICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsgXG4gIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyO1xuXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGF1Z21lbnRzIHtNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyfVxuICAgKiBBIFwic3ViY2xhc3NcIiBvZiBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLlxuICAgKi8gICAgXG4gIHZhciBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIEludE1ldHJvcG9saXNTdGVwcGVyKTtcbiAgfTtcbiAgXG4gIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfVxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBhIHN0ZXAgZm9yIGEgYmluYXJ5IHBhcmFtZXRlci5cbiAgICogVGhpcyBpcyBkb25lIGJ5IGV2YWx1YXRpbmcgdGhlIGxvZyBwb3N0ZXJpb3IgZm9yIGJvdGggc3RhdGVzIG9mIHRoZVxuICAgKiBwYXJhbWV0ZXIgYW5kIHRoZW4gc2VsZWN0aW5nIGEgc3RhdGUgcmFuZG9tbHkgd2l0aCBwcm9iYWJpbGl0eSByZWxhdGl2ZSBcbiAgICogdG8gdGhlIHBvc3RlcmlvciBvZiBlYWNoIHN0YXRlLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICovXG4gIHZhciBCaW5hcnlTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggID09IDEpIHtcbiAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBcIkJpbmFyeVN0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLlwiO1xuICAgIH1cbiAgfTtcbiAgXG4gIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJpbmFyeVN0ZXBwZXI7XG4gIFxuICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDtcbiAgICB2YXIgemVyb19sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSAxO1xuICAgIHZhciBvbmVfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7XG4gICAgdmFyIG1heF9sb2dfZGVucyA9IE1hdGgubWF4KHplcm9fbG9nX2RlbnMsIG9uZV9sb2dfZGVucyk7XG4gICAgemVyb19sb2dfZGVucyAtPSBtYXhfbG9nX2RlbnM7XG4gICAgb25lX2xvZ19kZW5zIC09IG1heF9sb2dfZGVucztcbiAgICB2YXIgemVyb19wcm9iID0gTWF0aC5leHAoemVyb19sb2dfZGVucyAtIE1hdGgubG9nKCBNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zKSArIE1hdGguZXhwKG9uZV9sb2dfZGVucykgKSApO1xuICAgIGlmKE1hdGgucmFuZG9tKCkgPCB6ZXJvX3Byb2IpIHtcbiAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IDA7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IC8vIGVsc2Uga2VlcCB0aGUgcGFyYW0gYXQgMSAuXG4gICAgcmV0dXJuIDE7XG4gIH07XG4gIFxuICAgIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIEp1c3QgbGlrZSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIHRoaXMgU3RlcHBlciB0YWtlcyBhIHN0ZXBzIGZvclxuICAgKiBhIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyIGJ5IHVwZGF0aW5nIGVhY2ggY29tcG9uZW50IGluIHR1cm4uIFRoZSBkaWZmZXJlbmNlXG4gICAqIGlzIHRoYXQgdGhpcyBzdGVwcGVyIHdvcmtzIG9uIGJpbmFyeSBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZm9yIGEgXG4gICAqICAgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICovXG4gIHZhciBCaW5hcnlDb21wb25lbnRTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIFxuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggID09IDEpIHtcbiAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lXTtcbiAgICAgIHRoaXMuZGltID0gcGFyYW0uZGltO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBcIkJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLlwiO1xuICAgIH1cbiAgICBcbiAgICB2YXIgY3JlYXRlX3N1YnN0ZXBwZXJzID0gXG4gICAgICBmdW5jdGlvbihkaW0sIHN1YnN0YXRlLCBsb2dfcG9zdCkge1xuICAgICAgdmFyIHN1YnN0ZXBwZXJzID0gW107XG4gICAgICB2YXIgaTtcbiAgICAgIGlmKGRpbS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICB2YXIgc3VicGFyYW1zID0ge307XG4gICAgICAgICAgc3VicGFyYW1zW2ldID0gcGFyYW07XG4gICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBuZXcgQmluYXJ5U3RlcHBlcihzdWJwYXJhbXMsIHN1YnN0YXRlLCBsb2dfcG9zdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Vic3RlcHBlcnM7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnN1YnN0ZXBwZXJzID0gY3JlYXRlX3N1YnN0ZXBwZXJzKHRoaXMuZGltLCB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0sIHRoaXMubG9nX3Bvc3QpO1xuICB9O1xuICBcbiAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsgXG4gIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmluYXJ5Q29tcG9uZW50U3RlcHBlcjtcbiAgXG4gIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS5cbiAgICByZXR1cm4gbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7cmV0dXJuIHN1YnN0ZXBwZXIuc3RlcCgpOyB9KTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIFRoaXMgc3RlcHBlciBjYW4gYmUgcmVzcG9uc2libGUgZm9yIHRha2luZyBhIHN0ZXAgZm9yIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMuXG4gICAqIEZvciByZWFsIGFuZCBpbnQgcGFyYW1ldGVycyBpdCB0YWtlcyBNZXRyb3BvbGlzIHdpdGhpbiBHaWJicyBzdGVwcywgYW5kIGZvciBcbiAgICogYmluYXJ5IHBhcmFtZXRlcnMgaXQgZG9lcyBldmFsdWF0ZXMgdGhlIHBvc3RlcmlvciBmb3IgYm90aCBwYXJhbXRlciB2YWx1ZXMgYW5kXG4gICAqIHJhbmRvbWx5IGNoYW5nZXMgdG8gYSBjZXJ0YWluIHZhbHVlIHByb3BvcnRpb25hbGx5IHRvIHRoYXQgdmFsdWUncyBwb3N0ZXJpb3JcbiAgICogKHRoaXMgaXMgYWxzbyBkb25lIGZvciBlYWNoIHBhcmFtZXRlciwgc28gYWxzbyBhICogd2l0aGluIEdpYmJzIGFwcHJvYWNoKS5cbiAgICogVGhpcyBzdGVwcGVyIGlzIGFsc28gYWRhcHRpdmUgYW5kIGNhbiBiZSBlZmZpY2llbnQgd2hlbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnNcbiAgICogYXJlIG5vdCB0b28gaGlnaCBhbmQgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHBhcmFtZXRlcnMgYXJlIGxvdy5cbiAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgb25lIG9yIG1vcmUgcGFyYW1ldGVyIGRlZmluaXRpb25zXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICovXG4gIHZhciBBbXdnU3RlcHBlciA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7XG4gICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTtcbiAgICB0aGlzLnBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBbXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJhbV9uYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dO1xuICAgICAgdmFyIFNlbGVjdFN0ZXBwZXI7XG4gICAgICBzd2l0Y2ggKHBhcmFtLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcInJlYWxcIjpcbiAgICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJpbnRcIjpcbiAgICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBJbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYmluYXJ5XCI6XG4gICAgICAgICAgaWYoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7XG4gICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gQmluYXJ5U3RlcHBlcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IFwiQW13Z1N0ZXBwZXIgY2FuJ3QgaGFuZGxlIHBhcmFtZXRlciBcIiArIHRoaXMucGFyYW1fbmFtZXNbaV0gICtcIiB3aXRoIHR5cGUgXCIgKyBwYXJhbS50eXBlOyBcbiAgICAgIH1cbiAgICAgIHZhciBwYXJhbV9vYmplY3Rfd3JhcCA9IHt9O1xuICAgICAgcGFyYW1fb2JqZWN0X3dyYXBbdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSBwYXJhbTtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgdmFyIHBhcmFtX29wdGlvbnMgPSBvcHRpb25zLnBhcmFtcyAmJiBvcHRpb25zLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVzW2ldXSB8fCB7fTtcbiAgICAgIHBhcmFtX29wdGlvbnMucHJvcF9sb2dfc2NhbGUgICAgID0gcGFyYW1fb3B0aW9ucy5wcm9wX2xvZ19zY2FsZSAgICAgfHwgb3B0aW9ucy5wcm9wX2xvZ19zY2FsZTsgXG4gICAgICBwYXJhbV9vcHRpb25zLmJhdGNoX3NpemUgICAgICAgICA9IHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSAgICAgICAgIHx8IG9wdGlvbnMuYmF0Y2hfc2l6ZTsgXG4gICAgICBwYXJhbV9vcHRpb25zLm1heF9hZGFwdGF0aW9uICAgICA9IHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gICAgIHx8IG9wdGlvbnMubWF4X2FkYXB0YXRpb247XG4gICAgICBwYXJhbV9vcHRpb25zLmluaXRpYWxfYWRhcHRhdGlvbiA9IHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uIHx8IG9wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uO1xuICAgICAgcGFyYW1fb3B0aW9ucy50YXJnZXRfYWNjZXB0X3JhdGUgPSBwYXJhbV9vcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZSB8fCBvcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZTsgXG4gICAgICBwYXJhbV9vcHRpb25zLmlzX2FkYXB0aW5nICAgICAgICA9IHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgICAgICAgIHx8IG9wdGlvbnMuaXNfYWRhcHRpbmc7IFxuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXSA9IG5ldyBTZWxlY3RTdGVwcGVyKHBhcmFtX29iamVjdF93cmFwLCBzdGF0ZSwgbG9nX3Bvc3QsIHBhcmFtX29wdGlvbnMpO1xuICAgIH1cbiAgfTtcbiAgXG4gIEFtd2dTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQW13Z1N0ZXBwZXI7XG4gIFxuICBBbXdnU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHNodWZmbGVfYXJyYXkodGhpcy5zdWJzdGVwcGVycyk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0uc3RlcCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgfTtcbiAgXG4gIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0uc3RhcnRfYWRhcHRhdGlvbigpO1xuICAgIH1cbiAgfTtcbiAgXG4gIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdG9wX2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdG9wX2FkYXB0YXRpb24oKTtcbiAgICB9IFxuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaW5mbyA9IHt9O1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpbmZvW3RoaXMucGFyYW1fbmFtZXNbaV1dID0gdGhpcy5zdWJzdGVwcGVyc1tpXS5pbmZvKCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9O1xuICBcbiAgXG4gIFxuICAvLy8vLy8vLy8vLyBTYW1wbGVyIEZ1bmN0aW9ucyAvLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIFxuICAgLyoqXG4gICAqIEBpbnRlcmZhY2VcbiAgICogV2hpbGUgeW91IGNvdWxkIGZpdCBhIG1vZGVsIGJ5IHBhc3RpbmcgdG9nZXRoZXIgU3RlcHBlcnMsIGFcbiAgLy8gU2FtcGxlciBpcyBoZXJlIGlzIGEgY29udmVuaWVuY2UgY2xhc3Mgd2hlcmUgYW4gaW5zdGFuY2Ugb2YgU2FtcGxlclxuICAvLyBzZXRzIHVwIHRoZSBTdGVwcGVycywgY2hlY2tzIHRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbixcbiAgLy8gYW5kIG1hbmFnZXMgdGhlIHNhbXBsaW5nLiBUaGlzIGhlcmUgZGVmaW5lcyB0aGUgU2FtcGxlciBcImludGVyZmFjZVwiLlxuICAgKiBAaW50ZXJmYWNlXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMsIGZvciBleGFtcGxlOlxuICAgKiAgIHtcIm11XCI6IHtcInR5cGVcIjogXCJyZWFsXCJ9LCBcInNpZ21hXCI6IHtcInR5cGVcIjogXCJyZWFsXCIsIFwibG93ZXJcIiA9IDB9fVxuICAgKiAgIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgZG9lc24ndCBoYXZlIHRvIGJlIFwiY29tcGxldGVcIiBhbmQgcHJvcGVydGllc1xuICAgKiAgIGxlZnQgb3V0IChsaWtlIGxvd2VyIGFuZCB1cHBlcikgd2lsbCBiZSBmaWxsZWQgaW4gYnkgZGVmYXVsdHMuXG4gICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gd2l0aCBzaWduYXR1cmUgZnVuY3Rpb24oc3RhdGUsIGRhdGEpLiBIZXJlXG4gICAqICAgc3RhdGUgd2lsbCBiZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSB3aXRoIGVhY2ggcGFyYW1ldGVyIGFzIGEgXG4gICAqICAga2V5IGFuZCB0aGUgcGFyYW1ldGVyIHZhbHVlcyBhcyBudW1iZXJzIG9yIGFycmF5cy4gRm9yIGV4YW1wbGU6XG4gICAqICAge1wibXVcIjogMywgXCJzaWdtYVwiOiAxLjV9LiBUaGUgZGF0YSBhcmd1bWVudCB3aWxsIGJlIHRoZSBzYW1lIG9iamVjdCBhcyBcbiAgICogICB0aGUgZGF0YSBhcmd1bWVudCBnaXZlbiBiZWxvdy5cbiAgICogQHBhcmFtIGRhdGEgLSBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgbG9nX3Bvc3QgZnVuY3Rpb25cbiAgICogICB3aGVuIHNhbXBsaW5nLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHNhbXBsZXIuXG4gICAqL1xuICB2YXIgU2FtcGxlciA9IGZ1bmN0aW9uKHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7XG4gICAgXG4gICAgLy8gU2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgaWYgbm90IHBhc3NlZCB0aHJvdWdoIHRoZSBvcHRpb25zIG9iamVjdFxuICAgIHRoaXMucGFyYW1faW5pdF9mdW4gICA9IGdldF9vcHRpb24oXCJwYXJhbV9pbml0X2Z1blwiLCBvcHRpb25zLCBwYXJhbV9pbml0X2ZpeGVkKTtcbiAgICB2YXIgdGhpbm5pbmdfaW50ZXJ2YWwgPSBnZXRfb3B0aW9uKFwidGhpblwiLCBvcHRpb25zLCAxKTtcbiAgICB2YXIgcGFyYW1zX3RvX21vbml0b3IgPSBnZXRfb3B0aW9uKFwibW9uaXRvclwiLCBvcHRpb25zLCBudWxsKTtcbiAgICB0aGlzLnRoaW4odGhpbm5pbmdfaW50ZXJ2YWwpO1xuICAgIHRoaXMubW9uaXRvcihwYXJhbXNfdG9fbW9uaXRvcik7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAvLyBDb21wbGV0aW5nIHRoZSBwYXJhbXMgYW5kIGluaXRpYWxpemluZyB0aGUgc3RhdGUuXG4gICAgdGhpcy5wYXJhbXMgPSBjb21wbGV0ZV9wYXJhbXModGhpcy5wYXJhbXMsIHRoaXMucGFyYW1faW5pdF9mdW4pO1xuICAgIHZhciBzdGF0ZSA9IHt9O1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrICkge1xuICAgICAgc3RhdGVbdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVzW2ldXS5pbml0O1xuICAgIH1cbiAgICB0aGlzLmxvZ19wb3N0ID0gZnVuY3Rpb24oKSB7IFxuICAgICAgcmV0dXJuIGxvZ19wb3N0KHN0YXRlLCBkYXRhKTtcbiAgICB9O1xuICAgIC8vIFJ1bm5pbmcgdGhlIGxvZ19wb3N0IGZ1bmN0aW9uIG9uY2UgaW4gY2FzZSBpdCBmdXJ0aGVyIG1vZGlmaWVzIHRoZSBzdGF0ZVxuICAgIC8vIGZvciBleGFtcGxlIGFkZGluZyBkZXJpdmVkIHF1YW50aXRpZXMuXG4gICAgdGhpcy5sb2dfcG9zdCgpO1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLnN0ZXBwZXJzID0gdGhpcy5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSh0aGlzLnBhcmFtcywgdGhpcy5zdGF0ZSwgdGhpcy5sb2dfcG9zdCwgdGhpcy5vcHRpb25zKTtcbiAgfTtcbiAgXG4gIC8qKiBTaG91bGQgcmV0dXJuIGEgdmVjdG9yIG9mIHN0ZXBwZXJzIHRoYXQgd2hlbiBjYWxsZWQgXG4gICAqIHNob3VsZCB0YWtlIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLlxuICAgKi9cbiAgU2FtcGxlci5wcm90b3R5cGUuY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUgPSBmdW5jdGlvbihzdGF0ZSwgbG9nX3Bvc3Qpe1xuICAgIHRocm93IFwiRXZlcnkgU2FtcGxlciBuZWVkcyB0byBpbXBsZW1lbnQgY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUoKVwiO1xuICB9O1xuICBcbiAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIFNhbXBsZXIuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7c3RhdGU6IHRoaXMuc3RhdGUsIHRoaW46IHRoaXMudGhpbiwgbW9uaXRvcjogdGhpcy5tb25pdG9yLFxuICAgICAgICAgICAgc3RlcHBlcnM6IHRoaXMuc3RlcHBlcnN9O1xuICB9O1xuICBcbiAgLyoqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBSZXR1cm5zIHRoZSBuZXcgc3BhY2VcbiAgICogYnV0IGFsc28gbW9kaWZpZXMgdGhlIHN0YXRlIGluIHBsYWNlLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICBzaHVmZmxlX2FycmF5KHRoaXMuc3RlcHBlcnMpO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0ZXAoKTtcbiAgICB9XG4gICAgaWYoT2JqZWN0LmtleXModGhpcy5zdGF0ZSkubGVuZ3RoID4gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpLmxlbmd0aCkge1xuICAgICAgLy8gVGhlIHN0YXRlIGNvbnRhaW5zIGRldml2ZWQgcXVhbnRpdGllcyAobm90IG9ubHkgcGFyYW1ldGVycykgYW5kIHdlXG4gICAgICAvLyBuZWVkIHRvIHJ1biB0aGUgbG9nX3Bvc3Qgb25jZSBtb3JlIGluIG9yZGVyIHRvIHNldCB0aGUgZGVyaXZlZCBxdWFudGl0aWVzXG4gICAgICAvLyBmb3IgdGhlIGZpbmFsIHBhcmFtZXRlciBzdGF0ZVxuICAgICAgdGhpcy5sb2dfcG9zdCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBUYWtlcyBuX2l0ZXJhdGlvbnMgc3RlcHMgaW4gdGhlIHBhcmFtZXRlciBzcGFjZSBhbmQgcmV0dXJucyB0aGVtXG4gICAqIGFzIGFuIG9iamVjdCBvZiBhcnJheXMgd2l0aCBvbmUgYXJyYXkgcGVyIHBhcmFtZXRlci4gRm9yIGV4YW1wbGU6XG4gICAqIHttdTogWzEsIC0xLCAyLCAzLCAuLi5dLCBzaWdtYTogWzEsIDIsIDIsIDEsIC4uLl19LlxuICAgKiBJZiB0aGluIGlzID4gMSB0aGVuIG5faXRlcmF0aW9ucyAvIHRoaW4gc2FtcGxlcyBhcmUgcmV0dXJuZWQuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc2FtcGxlID0gZnVuY3Rpb24obl9pdGVyYXRpb25zKSB7XG4gICAgICAvLyBJbml0aWFsaXppbmcgY3Vycl9zYW1wbGUgd2hlcmUgdGhlIHNhbXBsZSBpcyBnb2luZyB0byBiZSBzYXZlZFxuICAgICAgLy8gYXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgb25lIGFycmF5IHBlciBwYXJhbWV0ZXIgdG8gYmUgbW9uaXRvcmVkLlxuICAgICAgdmFyIGksIGosIG1vbml0b3JlZF9wYXJhbXM7XG4gICAgICBpZih0aGlzLm1vbml0b3JlZF9wYXJhbXMgPT09IG51bGwpIHtcbiAgICAgICAgbW9uaXRvcmVkX3BhcmFtcyA9IE9iamVjdC5rZXlzKHRoaXMuc3RhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW9uaXRvcmVkX3BhcmFtcyA9IHRoaXMubW9uaXRvcmVkX3BhcmFtcztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdmFyIGN1cnJfc2FtcGxlID0ge307XG4gICAgICBmb3IoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGN1cnJfc2FtcGxlW21vbml0b3JlZF9wYXJhbXNbal1dID0gW107XG4gICAgICB9XG4gICAgICBcbiAgICAgIGZvcihpID0gMDsgaSA8IG5faXRlcmF0aW9uczsgaSsrKSB7XG4gICAgICAgIGlmKGkgJSB0aGlzLnRoaW5uaW5nX2ludGVydmFsID09PSAwKSB7XG4gICAgICAgICAgZm9yKGogPSAwOyBqIDwgbW9uaXRvcmVkX3BhcmFtcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHBhcmFtID0gbW9uaXRvcmVkX3BhcmFtc1tqXTtcbiAgICAgICAgICAgIGN1cnJfc2FtcGxlW3BhcmFtXS5wdXNoKCBjbG9uZV9wYXJhbV9kcmF3KHRoaXMuc3RhdGVbcGFyYW1dKSApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0ZXAoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyX3NhbXBsZTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBUYWtlcyBuX2l0ZXJhdGlvbiBzdGVwcyBpbiBwYXJhbWV0ZXIgc3BhY2UgYnV0IHJldHVybnMgbm90aGluZy5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5idXJuID0gZnVuY3Rpb24obl9pdGVyYXRpb25zKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IG5faXRlcmF0aW9uczsgaSsrKSB7XG4gICAgICB0aGlzLnN0ZXAoKTtcbiAgICB9XG4gIH07XG4gIFxuICAvKipcbiAgICogU2V0cyB3aGF0IHBhcmFtZXRlcnMgc2hvdWxkIGJlIG1vbml0b3JlZCBhbmQgcmV0dXJuZWQgd2hlbiBjYWxsaW5nXG4gICAqIHNhbXBsZS5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5tb25pdG9yID0gZnVuY3Rpb24ocGFyYW1zX3RvX21vbml0b3IpIHtcbiAgICAgIHRoaXMubW9uaXRvcmVkX3BhcmFtcyA9IHBhcmFtc190b19tb25pdG9yO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFNldHMgdGhlIHRoaW5uaW5nLiBGb3IgZXhhbXBsZSB0aGluID09IDEwIG1lYW5zIHRoYXQgZXZlcnkgMTB0aCBwb3N0ZXJpb3JcbiAgICogZHJhdyB3aWxsIGJlIGtlcHQuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUudGhpbiA9IGZ1bmN0aW9uKHRoaW5uaW5nX2ludGVydmFsKSB7XG4gICAgdGhpcy50aGlubmluZ19pbnRlcnZhbCA9IHRoaW5uaW5nX2ludGVydmFsO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFNldHMgYWRhcHRhdGlvbiBvbiwgaWYgYXBwbGljYWJsZSwgaW4gYWxsIHN0ZXBwZXJzLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdGVwcGVyc1tpXS5zdGFydF9hZGFwdGF0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgICAvKipcbiAgICogU2V0cyBhZGFwdGF0aW9uIG9mZiwgaWYgYXBwbGljYWJsZSwgaW4gYWxsIHN0ZXBwZXJzLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0b3BfYWRhcHRhdGlvbigpO1xuICAgIH1cbiAgfTtcbiAgXG4gICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBpbXBsZW1lbnRzIHtTYW1wbGVyfVxuICAgKiBUaGlzIHNhbXBsZXIgdXNlcyB0aGUgQW13Z1N0ZXBwZXIgYXMgdGhlIHN0ZXBwZXIgZnVuY3Rpb24gd2hpY2ggaW1wbGVtZW50cyB0aGUgXG4gICAqIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiBcIkV4YW1wbGVzIG9mIEFkYXB0aXZlIE1DTUNcIlxuICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLiBBbiBhZGl0aW9uIGlzIHRoYXQgaXQgaGFuZGxlcyBpbnQgcGFyYW1ldGVyc1xuICAgKiBieSBtYWtpbmcgZGlzY3JldGUgTm9ybWFsIHByb3Bvc2FscyBhbmQgYmluYXJ5IHBhcmFtZXRlcnMgYnkgdGFraW5nIG9uIGEgbmV3IFxuICAgKiB2YWx1ZSBwcm9wb3J0aW9uYWwgdG8gdGhlIHBvc3RlcmlvciBvZiB0aGUgdHdvIHBvc3NpYmxlIHN0YXRlcyBvZiB0aGVcbiAgICogcGFyYW1ldGVyLiBUaGlzIHNhbXBsZXIgY2FuIGJlIGVmZmljaWVudCB3aGVuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyc1xuICAgKiBhcmUgbm90IHRvbyBoaWdoIGFuZCB0aGUgY29ycmVsYXRpb25zIGJldHdlZW4gcGFyYW1ldGVycyBhcmUgbG93LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnNcbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEFtd2dTYW1wbGVyID0gZnVuY3Rpb24ocGFyYW1zLCBsb2dfcG9zdCwgZGF0YSwgb3B0aW9ucykge1xuICAgIFNhbXBsZXIuY2FsbCh0aGlzLCBwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKTtcbiAgfTtcbiAgXG4gIEFtd2dTYW1wbGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU2FtcGxlci5wcm90b3R5cGUpOyBcbiAgQW13Z1NhbXBsZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQW13Z1NhbXBsZXI7XG4gIFxuICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucyl7XG4gICAgcmV0dXJuIFsgbmV3IEFtd2dTdGVwcGVyKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSBdO1xuICB9O1xuICBcbiAgXG4gIC8vIFJldHVybmluZyB0aGUgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIHB1YmxpY2x5IGV4cG9zZWQgYnkgdGhpcyBtb2R1bGVcbiAgcmV0dXJuIHtcbiAgICBydW5pZjogcnVuaWYsXG4gICAgcnVuaWZfZGlzY3JldGU6IHJ1bmlmX2Rpc2NyZXRlLFxuICAgIHJub3JtOiBybm9ybSxcbiAgICBwYXJhbV9pbml0X2ZpeGVkOiBwYXJhbV9pbml0X2ZpeGVkLCBcbiAgICBjb21wbGV0ZV9wYXJhbXM6IGNvbXBsZXRlX3BhcmFtcywgXG4gICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyOiBSZWFsTWV0cm9wb2xpc1N0ZXBwZXIsIFxuICAgIEludE1ldHJvcG9saXNTdGVwcGVyOiBJbnRNZXRyb3BvbGlzU3RlcHBlciwgXG4gICAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLCBcbiAgICBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOiBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLCBcbiAgICBCaW5hcnlTdGVwcGVyOiBCaW5hcnlTdGVwcGVyLCBcbiAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyOiBCaW5hcnlDb21wb25lbnRTdGVwcGVyLCBcbiAgICBBbXdnU3RlcHBlcjogQW13Z1N0ZXBwZXIsIFxuICAgIEFtd2dTYW1wbGVyOiBBbXdnU2FtcGxlclxuICB9O1xufSkpO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIGEgPT0gbnVsbCB8fCBiID09IG51bGwgPyBOYU4gOiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG51bWJlcih4KSB7XG4gIHJldHVybiB4ID09PSBudWxsID8gTmFOIDogK3g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkge1xuICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcbmltcG9ydCBwZXJtdXRlIGZyb20gXCIuL3Blcm11dGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydCh2YWx1ZXMsIC4uLkYpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwidmFsdWVzIGlzIG5vdCBpdGVyYWJsZVwiKTtcbiAgdmFsdWVzID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICBsZXQgW2ZdID0gRjtcbiAgaWYgKChmICYmIGYubGVuZ3RoICE9PSAyKSB8fCBGLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBpbmRleCA9IFVpbnQzMkFycmF5LmZyb20odmFsdWVzLCAoZCwgaSkgPT4gaSk7XG4gICAgaWYgKEYubGVuZ3RoID4gMSkge1xuICAgICAgRiA9IEYubWFwKGYgPT4gdmFsdWVzLm1hcChmKSk7XG4gICAgICBpbmRleC5zb3J0KChpLCBqKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBGKSB7XG4gICAgICAgICAgY29uc3QgYyA9IGFzY2VuZGluZ0RlZmluZWQoZltpXSwgZltqXSk7XG4gICAgICAgICAgaWYgKGMpIHJldHVybiBjO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZiA9IHZhbHVlcy5tYXAoZik7XG4gICAgICBpbmRleC5zb3J0KChpLCBqKSA9PiBhc2NlbmRpbmdEZWZpbmVkKGZbaV0sIGZbal0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHBlcm11dGUodmFsdWVzLCBpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlcy5zb3J0KGNvbXBhcmVEZWZpbmVkKGYpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUgPSBhc2NlbmRpbmcpIHtcbiAgaWYgKGNvbXBhcmUgPT09IGFzY2VuZGluZykgcmV0dXJuIGFzY2VuZGluZ0RlZmluZWQ7XG4gIGlmICh0eXBlb2YgY29tcGFyZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY29tcGFyZSBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgcmV0dXJuIChhLCBiKSA9PiB7XG4gICAgY29uc3QgeCA9IGNvbXBhcmUoYSwgYik7XG4gICAgaWYgKHggfHwgeCA9PT0gMCkgcmV0dXJuIHg7XG4gICAgcmV0dXJuIChjb21wYXJlKGIsIGIpID09PSAwKSAtIChjb21wYXJlKGEsIGEpID09PSAwKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzY2VuZGluZ0RlZmluZWQoYSwgYikge1xuICByZXR1cm4gKGEgPT0gbnVsbCB8fCAhKGEgPj0gYSkpIC0gKGIgPT0gbnVsbCB8fCAhKGIgPj0gYikpIHx8IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXgodmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtYXg7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXg7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtaW4odmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtaW47XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtaW47XG59XG4iLCJpbXBvcnQge2FzY2VuZGluZ0RlZmluZWQsIGNvbXBhcmVEZWZpbmVkfSBmcm9tIFwiLi9zb3J0LmpzXCI7XG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3VybmVyL3F1aWNrc2VsZWN0XG4vLyBJU0MgbGljZW5zZSwgQ29weXJpZ2h0IDIwMTggVmxhZGltaXIgQWdhZm9ua2luLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVpY2tzZWxlY3QoYXJyYXksIGssIGxlZnQgPSAwLCByaWdodCA9IEluZmluaXR5LCBjb21wYXJlKSB7XG4gIGsgPSBNYXRoLmZsb29yKGspO1xuICBsZWZ0ID0gTWF0aC5mbG9vcihNYXRoLm1heCgwLCBsZWZ0KSk7XG4gIHJpZ2h0ID0gTWF0aC5mbG9vcihNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCByaWdodCkpO1xuXG4gIGlmICghKGxlZnQgPD0gayAmJiBrIDw9IHJpZ2h0KSkgcmV0dXJuIGFycmF5O1xuXG4gIGNvbXBhcmUgPSBjb21wYXJlID09PSB1bmRlZmluZWQgPyBhc2NlbmRpbmdEZWZpbmVkIDogY29tcGFyZURlZmluZWQoY29tcGFyZSk7XG5cbiAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkge1xuICAgIGlmIChyaWdodCAtIGxlZnQgPiA2MDApIHtcbiAgICAgIGNvbnN0IG4gPSByaWdodCAtIGxlZnQgKyAxO1xuICAgICAgY29uc3QgbSA9IGsgLSBsZWZ0ICsgMTtcbiAgICAgIGNvbnN0IHogPSBNYXRoLmxvZyhuKTtcbiAgICAgIGNvbnN0IHMgPSAwLjUgKiBNYXRoLmV4cCgyICogeiAvIDMpO1xuICAgICAgY29uc3Qgc2QgPSAwLjUgKiBNYXRoLnNxcnQoeiAqIHMgKiAobiAtIHMpIC8gbikgKiAobSAtIG4gLyAyIDwgMCA/IC0xIDogMSk7XG4gICAgICBjb25zdCBuZXdMZWZ0ID0gTWF0aC5tYXgobGVmdCwgTWF0aC5mbG9vcihrIC0gbSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIGNvbnN0IG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gbSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICBxdWlja3NlbGVjdChhcnJheSwgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGNvbXBhcmUpO1xuICAgIH1cblxuICAgIGNvbnN0IHQgPSBhcnJheVtrXTtcbiAgICBsZXQgaSA9IGxlZnQ7XG4gICAgbGV0IGogPSByaWdodDtcblxuICAgIHN3YXAoYXJyYXksIGxlZnQsIGspO1xuICAgIGlmIChjb21wYXJlKGFycmF5W3JpZ2h0XSwgdCkgPiAwKSBzd2FwKGFycmF5LCBsZWZ0LCByaWdodCk7XG5cbiAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgIHN3YXAoYXJyYXksIGksIGopLCArK2ksIC0tajtcbiAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2ldLCB0KSA8IDApICsraTtcbiAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2pdLCB0KSA+IDApIC0tajtcbiAgICB9XG5cbiAgICBpZiAoY29tcGFyZShhcnJheVtsZWZ0XSwgdCkgPT09IDApIHN3YXAoYXJyYXksIGxlZnQsIGopO1xuICAgIGVsc2UgKytqLCBzd2FwKGFycmF5LCBqLCByaWdodCk7XG5cbiAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgaWYgKGsgPD0gaikgcmlnaHQgPSBqIC0gMTtcbiAgfVxuXG4gIHJldHVybiBhcnJheTtcbn1cblxuZnVuY3Rpb24gc3dhcChhcnJheSwgaSwgaikge1xuICBjb25zdCB0ID0gYXJyYXlbaV07XG4gIGFycmF5W2ldID0gYXJyYXlbal07XG4gIGFycmF5W2pdID0gdDtcbn1cbiIsImltcG9ydCBtYXggZnJvbSBcIi4vbWF4LmpzXCI7XG5pbXBvcnQgbWF4SW5kZXggZnJvbSBcIi4vbWF4SW5kZXguanNcIjtcbmltcG9ydCBtaW4gZnJvbSBcIi4vbWluLmpzXCI7XG5pbXBvcnQgbWluSW5kZXggZnJvbSBcIi4vbWluSW5kZXguanNcIjtcbmltcG9ydCBxdWlja3NlbGVjdCBmcm9tIFwiLi9xdWlja3NlbGVjdC5qc1wiO1xuaW1wb3J0IG51bWJlciwge251bWJlcnN9IGZyb20gXCIuL251bWJlci5qc1wiO1xuaW1wb3J0IHthc2NlbmRpbmdEZWZpbmVkfSBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgZ3JlYXRlc3QgZnJvbSBcIi4vZ3JlYXRlc3QuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVhbnRpbGUodmFsdWVzLCBwLCB2YWx1ZW9mKSB7XG4gIHZhbHVlcyA9IEZsb2F0NjRBcnJheS5mcm9tKG51bWJlcnModmFsdWVzLCB2YWx1ZW9mKSk7XG4gIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSB8fCBpc05hTihwID0gK3ApKSByZXR1cm47XG4gIGlmIChwIDw9IDAgfHwgbiA8IDIpIHJldHVybiBtaW4odmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heCh2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9IG1heChxdWlja3NlbGVjdCh2YWx1ZXMsIGkwKS5zdWJhcnJheSgwLCBpMCArIDEpKSxcbiAgICAgIHZhbHVlMSA9IG1pbih2YWx1ZXMuc3ViYXJyYXkoaTAgKyAxKSk7XG4gIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVhbnRpbGVTb3J0ZWQodmFsdWVzLCBwLCB2YWx1ZW9mID0gbnVtYmVyKSB7XG4gIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSB8fCBpc05hTihwID0gK3ApKSByZXR1cm47XG4gIGlmIChwIDw9IDAgfHwgbiA8IDIpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbMF0sIDAsIHZhbHVlcyk7XG4gIGlmIChwID49IDEpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbbiAtIDFdLCBuIC0gMSwgdmFsdWVzKTtcbiAgdmFyIG4sXG4gICAgICBpID0gKG4gLSAxKSAqIHAsXG4gICAgICBpMCA9IE1hdGguZmxvb3IoaSksXG4gICAgICB2YWx1ZTAgPSArdmFsdWVvZih2YWx1ZXNbaTBdLCBpMCwgdmFsdWVzKSxcbiAgICAgIHZhbHVlMSA9ICt2YWx1ZW9mKHZhbHVlc1tpMCArIDFdLCBpMCArIDEsIHZhbHVlcyk7XG4gIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVhbnRpbGVJbmRleCh2YWx1ZXMsIHAsIHZhbHVlb2YgPSBudW1iZXIpIHtcbiAgaWYgKGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgbnVtYmVycyA9IEZsb2F0NjRBcnJheS5mcm9tKHZhbHVlcywgKF8sIGkpID0+IG51bWJlcih2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkpO1xuICBpZiAocCA8PSAwKSByZXR1cm4gbWluSW5kZXgobnVtYmVycyk7XG4gIGlmIChwID49IDEpIHJldHVybiBtYXhJbmRleChudW1iZXJzKTtcbiAgdmFyIG51bWJlcnMsXG4gICAgICBpbmRleCA9IFVpbnQzMkFycmF5LmZyb20odmFsdWVzLCAoXywgaSkgPT4gaSksXG4gICAgICBqID0gbnVtYmVycy5sZW5ndGggLSAxLFxuICAgICAgaSA9IE1hdGguZmxvb3IoaiAqIHApO1xuICBxdWlja3NlbGVjdChpbmRleCwgaSwgMCwgaiwgKGksIGopID0+IGFzY2VuZGluZ0RlZmluZWQobnVtYmVyc1tpXSwgbnVtYmVyc1tqXSkpO1xuICBpID0gZ3JlYXRlc3QoaW5kZXguc3ViYXJyYXkoMCwgaSArIDEpLCAoaSkgPT4gbnVtYmVyc1tpXSk7XG4gIHJldHVybiBpID49IDAgPyBpIDogLTE7XG59XG4iLCJpbXBvcnQgcXVhbnRpbGUsIHtxdWFudGlsZUluZGV4fSBmcm9tIFwiLi9xdWFudGlsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZWRpYW4odmFsdWVzLCB2YWx1ZW9mKSB7XG4gIHJldHVybiBxdWFudGlsZSh2YWx1ZXMsIDAuNSwgdmFsdWVvZik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZWRpYW5JbmRleCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgcmV0dXJuIHF1YW50aWxlSW5kZXgodmFsdWVzLCAwLjUsIHZhbHVlb2YpO1xufVxuIiwidmFyIG5vb3AgPSB7dmFsdWU6ICgpID0+IHt9fTtcblxuZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArIFwiXCIpIHx8ICh0IGluIF8pIHx8IC9bXFxzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgdHlwZTogXCIgKyB0KTtcbiAgICBfW3RdID0gW107XG4gIH1cbiAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTtcbn1cblxuZnVuY3Rpb24gRGlzcGF0Y2goXykge1xuICB0aGlzLl8gPSBfO1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsIHR5cGVzKSB7XG4gIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgIHZhciBuYW1lID0gXCJcIiwgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0KTtcbiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9O1xuICB9KTtcbn1cblxuRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRGlzcGF0Y2gsXG4gIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgXyA9IHRoaXMuXyxcbiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiwgXyksXG4gICAgICAgIHQsXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IFQubGVuZ3RoO1xuXG4gICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdldChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLlxuICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNhbGxiYWNrOiBcIiArIGNhbGxiYWNrKTtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb3B5OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29weSA9IHt9LCBfID0gdGhpcy5fO1xuICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTtcbiAgICByZXR1cm4gbmV3IERpc3BhdGNoKGNvcHkpO1xuICB9LFxuICBjYWxsOiBmdW5jdGlvbih0eXBlLCB0aGF0KSB7XG4gICAgaWYgKChuID0gYXJndW1lbnRzLmxlbmd0aCAtIDIpID4gMCkgZm9yICh2YXIgYXJncyA9IG5ldyBBcnJheShuKSwgaSA9IDAsIG4sIHQ7IGkgPCBuOyArK2kpIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykge1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh2YXIgdCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0KHR5cGUsIG5hbWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkge1xuICAgIGlmICgoYyA9IHR5cGVbaV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHJldHVybiBjLnZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXQodHlwZSwgbmFtZSwgY2FsbGJhY2spIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGlmICh0eXBlW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChjYWxsYmFjayAhPSBudWxsKSB0eXBlLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiBjYWxsYmFja30pO1xuICByZXR1cm4gdHlwZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlzcGF0Y2g7XG4iLCJleHBvcnQgdmFyIHhodG1sID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc3ZnOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIHhodG1sOiB4aHRtbCxcbiAgeGxpbms6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICB4bWw6IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCJcbn07XG4iLCJpbXBvcnQgbmFtZXNwYWNlcyBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIHByZWZpeCA9IG5hbWUgKz0gXCJcIiwgaSA9IHByZWZpeC5pbmRleE9mKFwiOlwiKTtcbiAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09IFwieG1sbnNcIikgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpO1xuICByZXR1cm4gbmFtZXNwYWNlcy5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sIGxvY2FsOiBuYW1lfSA6IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG59XG4iLCJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuL25hbWVzcGFjZS5qc1wiO1xuaW1wb3J0IHt4aHRtbH0gZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5mdW5jdGlvbiBjcmVhdG9ySW5oZXJpdChuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQsXG4gICAgICAgIHVyaSA9IHRoaXMubmFtZXNwYWNlVVJJO1xuICAgIHJldHVybiB1cmkgPT09IHhodG1sICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IHhodG1sXG4gICAgICAgID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKVxuICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdG9yRml4ZWQoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gKGZ1bGxuYW1lLmxvY2FsXG4gICAgICA/IGNyZWF0b3JGaXhlZFxuICAgICAgOiBjcmVhdG9ySW5oZXJpdCkoZnVsbG5hbWUpO1xufVxuIiwiZnVuY3Rpb24gbm9uZSgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiLy8gR2l2ZW4gc29tZXRoaW5nIGFycmF5IGxpa2UgKG9yIG51bGwpLCByZXR1cm5zIHNvbWV0aGluZyB0aGF0IGlzIHN0cmljdGx5IGFuXG4vLyBhcnJheS4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGFycmF5LWxpa2Ugb2JqZWN0cyBwYXNzZWQgdG8gZDMuc2VsZWN0QWxsXG4vLyBvciBzZWxlY3Rpb24uc2VsZWN0QWxsIGFyZSBjb252ZXJ0ZWQgaW50byBwcm9wZXIgYXJyYXlzIHdoZW4gY3JlYXRpbmcgYVxuLy8gc2VsZWN0aW9uOyB3ZSBkb27igJl0IGV2ZXIgd2FudCB0byBjcmVhdGUgYSBzZWxlY3Rpb24gYmFja2VkIGJ5IGEgbGl2ZVxuLy8gSFRNTENvbGxlY3Rpb24gb3IgTm9kZUxpc3QuIEhvd2V2ZXIsIG5vdGUgdGhhdCBzZWxlY3Rpb24uc2VsZWN0QWxsIHdpbGwgdXNlIGFcbi8vIHN0YXRpYyBOb2RlTGlzdCBhcyBhIGdyb3VwLCBzaW5jZSBpdCBzYWZlbHkgZGVyaXZlZCBmcm9tIHF1ZXJ5U2VsZWN0b3JBbGwuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhcnJheSh4KSB7XG4gIHJldHVybiB4ID09IG51bGwgPyBbXSA6IEFycmF5LmlzQXJyYXkoeCkgPyB4IDogQXJyYXkuZnJvbSh4KTtcbn1cbiIsImZ1bmN0aW9uIGVtcHR5KCkge1xuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IGFycmF5IGZyb20gXCIuLi9hcnJheS5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yQWxsIGZyb20gXCIuLi9zZWxlY3RvckFsbC5qc1wiO1xuXG5mdW5jdGlvbiBhcnJheUFsbChzZWxlY3QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBhcnJheShzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCA9PT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBhcnJheUFsbChzZWxlY3QpO1xuICBlbHNlIHNlbGVjdCA9IHNlbGVjdG9yQWxsKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKTtcbiAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgcGFyZW50cyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZE1hdGNoZXIoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuIiwiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmQ7XG5cbmZ1bmN0aW9uIGNoaWxkRmluZChtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbmQuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNoaWxkRmlyc3QoKSB7XG4gIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QobWF0Y2ggPT0gbnVsbCA/IGNoaWxkRmlyc3RcbiAgICAgIDogY2hpbGRGaW5kKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCJpbXBvcnQge2NoaWxkTWF0Y2hlcn0gZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxudmFyIGZpbHRlciA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXI7XG5cbmZ1bmN0aW9uIGNoaWxkcmVuKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKTtcbn1cblxuZnVuY3Rpb24gY2hpbGRyZW5GaWx0ZXIobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdEFsbChtYXRjaCA9PSBudWxsID8gY2hpbGRyZW5cbiAgICAgIDogY2hpbGRyZW5GaWx0ZXIodHlwZW9mIG1hdGNoID09PSBcImZ1bmN0aW9uXCIgPyBtYXRjaCA6IGNoaWxkTWF0Y2hlcihtYXRjaCkpKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IG1hdGNoZXIgZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih1cGRhdGUpIHtcbiAgcmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKTtcbn1cbiIsImltcG9ydCBzcGFyc2UgZnJvbSBcIi4vc3BhcnNlLmpzXCI7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2VudGVyIHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBFbnRlck5vZGUocGFyZW50LCBkYXR1bSkge1xuICB0aGlzLm93bmVyRG9jdW1lbnQgPSBwYXJlbnQub3duZXJEb2N1bWVudDtcbiAgdGhpcy5uYW1lc3BhY2VVUkkgPSBwYXJlbnQubmFtZXNwYWNlVVJJO1xuICB0aGlzLl9uZXh0ID0gbnVsbDtcbiAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICB0aGlzLl9fZGF0YV9fID0gZGF0dW07XG59XG5cbkVudGVyTm9kZS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUsXG4gIGFwcGVuZENoaWxkOiBmdW5jdGlvbihjaGlsZCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgdGhpcy5fbmV4dCk7IH0sXG4gIGluc2VydEJlZm9yZTogZnVuY3Rpb24oY2hpbGQsIG5leHQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIG5leHQpOyB9LFxuICBxdWVyeVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOyB9LFxuICBxdWVyeVNlbGVjdG9yQWxsOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOyB9XG59O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCB7RW50ZXJOb2RlfSBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBiaW5kSW5kZXgocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSkge1xuICB2YXIgaSA9IDAsXG4gICAgICBub2RlLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGZpdCBpbnRvIHVwZGF0ZS5cbiAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuXG4gIC8vIFB1dCBhbnkgcmVtYWluaW5nIGRhdGEgaW50byBlbnRlci5cbiAgZm9yICg7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBkb27igJl0IGZpdCBpbnRvIGV4aXQuXG4gIGZvciAoOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBiaW5kS2V5KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEsIGtleSkge1xuICB2YXIgaSxcbiAgICAgIG5vZGUsXG4gICAgICBub2RlQnlLZXlWYWx1ZSA9IG5ldyBNYXAsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksXG4gICAgICBrZXlWYWx1ZTtcblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggbm9kZS5cbiAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApICsgXCJcIjtcbiAgICAgIGlmIChub2RlQnlLZXlWYWx1ZS5oYXMoa2V5VmFsdWUpKSB7XG4gICAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZUJ5S2V5VmFsdWUuc2V0KGtleVZhbHVlLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggZGF0dW0uXG4gIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuXG4gIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci5cbiAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGtleVZhbHVlID0ga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKSArIFwiXCI7XG4gICAgaWYgKG5vZGUgPSBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWUpKSB7XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICBub2RlQnlLZXlWYWx1ZS5kZWxldGUoa2V5VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZXNbaV0pID09PSBub2RlKSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRhdHVtKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX19kYXRhX187XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLCBkYXR1bSk7XG5cbiAgdmFyIGJpbmQgPSBrZXkgPyBiaW5kS2V5IDogYmluZEluZGV4LFxuICAgICAgcGFyZW50cyA9IHRoaXMuX3BhcmVudHMsXG4gICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB2YWx1ZSA9IGNvbnN0YW50KHZhbHVlKTtcblxuICBmb3IgKHZhciBtID0gZ3JvdXBzLmxlbmd0aCwgdXBkYXRlID0gbmV3IEFycmF5KG0pLCBlbnRlciA9IG5ldyBBcnJheShtKSwgZXhpdCA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tqXSxcbiAgICAgICAgZ3JvdXAgPSBncm91cHNbal0sXG4gICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgICBkYXRhID0gYXJyYXlsaWtlKHZhbHVlLmNhbGwocGFyZW50LCBwYXJlbnQgJiYgcGFyZW50Ll9fZGF0YV9fLCBqLCBwYXJlbnRzKSksXG4gICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICB1cGRhdGVHcm91cCA9IHVwZGF0ZVtqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgZXhpdEdyb3VwID0gZXhpdFtqXSA9IG5ldyBBcnJheShncm91cExlbmd0aCk7XG5cbiAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7XG5cbiAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXRcbiAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLFxuICAgIC8vIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudCBub2RlLlxuICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7XG4gICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkge1xuICAgICAgICBpZiAoaTAgPj0gaTEpIGkxID0gaTAgKyAxO1xuICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7XG4gICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTtcbiAgdXBkYXRlLl9lbnRlciA9IGVudGVyO1xuICB1cGRhdGUuX2V4aXQgPSBleGl0O1xuICByZXR1cm4gdXBkYXRlO1xufVxuXG4vLyBHaXZlbiBzb21lIGRhdGEsIHRoaXMgcmV0dXJucyBhbiBhcnJheS1saWtlIHZpZXcgb2YgaXQ6IGFuIG9iamVjdCB0aGF0XG4vLyBleHBvc2VzIGEgbGVuZ3RoIHByb3BlcnR5IGFuZCBhbGxvd3MgbnVtZXJpYyBpbmRleGluZy4gTm90ZSB0aGF0IHVubGlrZVxuLy8gc2VsZWN0QWxsLCB0aGlzIGlzbuKAmXQgd29ycmllZCBhYm91dCDigJxsaXZl4oCdIGNvbGxlY3Rpb25zIGJlY2F1c2UgdGhlIHJlc3VsdGluZ1xuLy8gYXJyYXkgd2lsbCBvbmx5IGJlIHVzZWQgYnJpZWZseSB3aGlsZSBkYXRhIGlzIGJlaW5nIGJvdW5kLiAoSXQgaXMgcG9zc2libGUgdG9cbi8vIGNhdXNlIHRoZSBkYXRhIHRvIGNoYW5nZSB3aGlsZSBpdGVyYXRpbmcgYnkgdXNpbmcgYSBrZXkgZnVuY3Rpb24sIGJ1dCBwbGVhc2Vcbi8vIGRvbuKAmXQ7IHdl4oCZZCByYXRoZXIgYXZvaWQgYSBncmF0dWl0b3VzIGNvcHkuKVxuZnVuY3Rpb24gYXJyYXlsaWtlKGRhdGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIFwibGVuZ3RoXCIgaW4gZGF0YVxuICAgID8gZGF0YSAvLyBBcnJheSwgVHlwZWRBcnJheSwgTm9kZUxpc3QsIGFycmF5LWxpa2VcbiAgICA6IEFycmF5LmZyb20oZGF0YSk7IC8vIE1hcCwgU2V0LCBpdGVyYWJsZSwgc3RyaW5nLCBvciBhbnl0aGluZyBlbHNlXG59XG4iLCJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9leGl0IHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvbmVudGVyLCBvbnVwZGF0ZSwgb25leGl0KSB7XG4gIHZhciBlbnRlciA9IHRoaXMuZW50ZXIoKSwgdXBkYXRlID0gdGhpcywgZXhpdCA9IHRoaXMuZXhpdCgpO1xuICBpZiAodHlwZW9mIG9uZW50ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGVudGVyID0gb25lbnRlcihlbnRlcik7XG4gICAgaWYgKGVudGVyKSBlbnRlciA9IGVudGVyLnNlbGVjdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIGVudGVyID0gZW50ZXIuYXBwZW5kKG9uZW50ZXIgKyBcIlwiKTtcbiAgfVxuICBpZiAob251cGRhdGUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZSA9IG9udXBkYXRlKHVwZGF0ZSk7XG4gICAgaWYgKHVwZGF0ZSkgdXBkYXRlID0gdXBkYXRlLnNlbGVjdGlvbigpO1xuICB9XG4gIGlmIChvbmV4aXQgPT0gbnVsbCkgZXhpdC5yZW1vdmUoKTsgZWxzZSBvbmV4aXQoZXhpdCk7XG4gIHJldHVybiBlbnRlciAmJiB1cGRhdGUgPyBlbnRlci5tZXJnZSh1cGRhdGUpLm9yZGVyKCkgOiB1cGRhdGU7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICB2YXIgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dDtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAtMSwgbSA9IGdyb3Vwcy5sZW5ndGg7ICsraiA8IG07KSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSBncm91cC5sZW5ndGggLSAxLCBuZXh0ID0gZ3JvdXBbaV0sIG5vZGU7IC0taSA+PSAwOykge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBpZiAobmV4dCAmJiBub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5leHQpIF4gNCkgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTtcbiAgICAgICAgbmV4dCA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcGFyZSkge1xuICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmc7XG5cbiAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikge1xuICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJlKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHNvcnRncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNvcnRncm91cFtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvcnRncm91cC5zb3J0KGNvbXBhcmVOb2RlKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07XG4gIGFyZ3VtZW50c1swXSA9IHRoaXM7XG4gIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRoaXMpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07XG4gICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykgKytzaXplOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiBzaXplO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiAhdGhpcy5ub2RlKCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSBjYWxsYmFjay5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4uL25hbWVzcGFjZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHYpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTtcbiAgICByZXR1cm4gZnVsbG5hbWUubG9jYWxcbiAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbClcbiAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkpKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUpIHtcbiAgcmV0dXJuIChub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSAvLyBub2RlIGlzIGEgTm9kZVxuICAgICAgfHwgKG5vZGUuZG9jdW1lbnQgJiYgbm9kZSkgLy8gbm9kZSBpcyBhIFdpbmRvd1xuICAgICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50XG59XG4iLCJpbXBvcnQgZGVmYXVsdFZpZXcgZnJvbSBcIi4uL3dpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gICAgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICAgID8gc3R5bGVSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyBzdHlsZUZ1bmN0aW9uXG4gICAgICAgICAgICA6IHN0eWxlQ29uc3RhbnQpKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSlcbiAgICAgIDogc3R5bGVWYWx1ZSh0aGlzLm5vZGUoKSwgbmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHlsZVZhbHVlKG5vZGUsIG5hbWUpIHtcbiAgcmV0dXJuIG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKVxuICAgICAgfHwgZGVmYXVsdFZpZXcobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xufVxuIiwiZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgZGVsZXRlIHRoaXNbbmFtZV07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgIGVsc2UgdGhpc1tuYW1lXSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHByb3BlcnR5UmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHByb3BlcnR5RnVuY3Rpb25cbiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07XG59XG4iLCJmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnRyaW0oKS5zcGxpdCgvXnxcXHMrLyk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzTGlzdChub2RlKSB7XG4gIHJldHVybiBub2RlLmNsYXNzTGlzdCB8fCBuZXcgQ2xhc3NMaXN0KG5vZGUpO1xufVxuXG5mdW5jdGlvbiBDbGFzc0xpc3Qobm9kZSkge1xuICB0aGlzLl9ub2RlID0gbm9kZTtcbiAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIik7XG59XG5cbkNsYXNzTGlzdC5wcm90b3R5cGUgPSB7XG4gIGFkZDogZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIHRoaXMuX25hbWVzLnB1c2gobmFtZSk7XG4gICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuX25hbWVzLmpvaW4oXCIgXCIpKTtcbiAgICB9XG4gIH0sXG4gIHJlbW92ZTogZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5zcGxpY2UoaSwgMSk7XG4gICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuX25hbWVzLmpvaW4oXCIgXCIpKTtcbiAgICB9XG4gIH0sXG4gIGNvbnRhaW5zOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSkgPj0gMDtcbiAgfVxufTtcblxuZnVuY3Rpb24gY2xhc3NlZEFkZChub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5hZGQobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkUmVtb3ZlKG5vZGUsIG5hbWVzKSB7XG4gIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRUcnVlKG5hbWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBjbGFzc2VkQWRkKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZEZhbHNlKG5hbWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBjbGFzc2VkUmVtb3ZlKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKG5hbWVzLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgKHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgPyBjbGFzc2VkQWRkIDogY2xhc3NlZFJlbW92ZSkodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgbmFtZXMgPSBjbGFzc0FycmF5KG5hbWUgKyBcIlwiKTtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCh0aGlzLm5vZGUoKSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gY2xhc3NlZEZ1bmN0aW9uIDogdmFsdWVcbiAgICAgID8gY2xhc3NlZFRydWVcbiAgICAgIDogY2xhc3NlZEZhbHNlKShuYW1lcywgdmFsdWUpKTtcbn1cbiIsImZ1bmN0aW9uIHRleHRSZW1vdmUoKSB7XG4gIHRoaXMudGV4dENvbnRlbnQgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/IFwiXCIgOiB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gdGV4dFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdGV4dEZ1bmN0aW9uXG4gICAgICAgICAgOiB0ZXh0Q29uc3RhbnQpKHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7XG59XG4iLCJmdW5jdGlvbiBodG1sUmVtb3ZlKCkge1xuICB0aGlzLmlubmVySFRNTCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGh0bWxGdW5jdGlvblxuICAgICAgICAgIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLmlubmVySFRNTDtcbn1cbiIsImZ1bmN0aW9uIHJhaXNlKCkge1xuICBpZiAodGhpcy5uZXh0U2libGluZykgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyYWlzZSk7XG59XG4iLCJmdW5jdGlvbiBsb3dlcigpIHtcbiAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gobG93ZXIpO1xufVxuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9KTtcbn1cbiIsImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmZ1bmN0aW9uIGNvbnN0YW50TnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGJlZm9yZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpLFxuICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBlb2YgYmVmb3JlID09PSBcImZ1bmN0aW9uXCIgPyBiZWZvcmUgOiBzZWxlY3RvcihiZWZvcmUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBudWxsKTtcbiAgfSk7XG59XG4iLCJmdW5jdGlvbiByZW1vdmUoKSB7XG4gIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmVtb3ZlKTtcbn1cbiIsImZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZVNoYWxsb3coKSB7XG4gIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lRGVlcCgpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUodHJ1ZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGRlZXApIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwIDogc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLnByb3BlcnR5KFwiX19kYXRhX19cIiwgdmFsdWUpXG4gICAgICA6IHRoaXMubm9kZSgpLl9fZGF0YV9fO1xufVxuIiwiZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIHJldHVybiBmdW5jdGlvbihldmVudCkge1xuICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQsIHRoaXMuX19kYXRhX18pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uID0gdGhpcy5fX29uO1xuICAgIGlmICghb24pIHJldHVybjtcbiAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uWysraV0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO1xuICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25BZGQodHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gY29udGV4dExpc3RlbmVyKHZhbHVlKTtcbiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAoKG8gPSBvbltqXSkudHlwZSA9PT0gdHlwZW5hbWUudHlwZSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLm9wdGlvbnMgPSBvcHRpb25zKTtcbiAgICAgICAgby52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlbmFtZS50eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5lciwgb3B0aW9uczogb3B0aW9uc307XG4gICAgaWYgKCFvbikgdGhpcy5fX29uID0gW29dO1xuICAgIGVsc2Ugb24ucHVzaChvKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIpLCBpLCBuID0gdHlwZW5hbWVzLmxlbmd0aCwgdDtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGZvciAoaSA9IDAsIG8gPSBvbltqXTsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkge1xuICAgICAgICAgIHJldHVybiBvLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIG9uID0gdmFsdWUgPyBvbkFkZCA6IG9uUmVtb3ZlO1xuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgb3B0aW9ucykpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSwgdHlwZSwgcGFyYW1zKSB7XG4gIHZhciB3aW5kb3cgPSBkZWZhdWx0Vmlldyhub2RlKSxcbiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50O1xuXG4gIGlmICh0eXBlb2YgZXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGV2ZW50ID0gbmV3IGV2ZW50KHR5cGUsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgICBlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gZGlzcGF0Y2hGdW5jdGlvblxuICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJhbXMpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKigpIHtcbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHlpZWxkIG5vZGU7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgc2VsZWN0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCBmcm9tIFwiLi9zZWxlY3RDaGlsZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbiBmcm9tIFwiLi9zZWxlY3RDaGlsZHJlbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdGEgZnJvbSBcIi4vZGF0YS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbnRlciBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9leGl0IGZyb20gXCIuL2V4aXQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fam9pbiBmcm9tIFwiLi9qb2luLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29yZGVyIGZyb20gXCIuL29yZGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NvcnQgZnJvbSBcIi4vc29ydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jYWxsIGZyb20gXCIuL2NhbGwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZXMgZnJvbSBcIi4vbm9kZXMuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZSBmcm9tIFwiLi9ub2RlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NpemUgZnJvbSBcIi4vc2l6ZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbXB0eSBmcm9tIFwiLi9lbXB0eS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lYWNoIGZyb20gXCIuL2VhY2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3Byb3BlcnR5IGZyb20gXCIuL3Byb3BlcnR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NsYXNzZWQgZnJvbSBcIi4vY2xhc3NlZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faHRtbCBmcm9tIFwiLi9odG1sLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JhaXNlIGZyb20gXCIuL3JhaXNlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2xvd2VyIGZyb20gXCIuL2xvd2VyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2FwcGVuZCBmcm9tIFwiLi9hcHBlbmQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faW5zZXJ0IGZyb20gXCIuL2luc2VydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9yZW1vdmUgZnJvbSBcIi4vcmVtb3ZlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Nsb25lIGZyb20gXCIuL2Nsb25lLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdHVtIGZyb20gXCIuL2RhdHVtLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29uIGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Rpc3BhdGNoIGZyb20gXCIuL2Rpc3BhdGNoLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2l0ZXJhdG9yIGZyb20gXCIuL2l0ZXJhdG9yLmpzXCI7XG5cbmV4cG9ydCB2YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdGlvbihncm91cHMsIHBhcmVudHMpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLCByb290KTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdGlvbigpIHtcbiAgcmV0dXJuIHRoaXM7XG59XG5cblNlbGVjdGlvbi5wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogU2VsZWN0aW9uLFxuICBzZWxlY3Q6IHNlbGVjdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCxcbiAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLFxuICBkYXRhOiBzZWxlY3Rpb25fZGF0YSxcbiAgZW50ZXI6IHNlbGVjdGlvbl9lbnRlcixcbiAgZXhpdDogc2VsZWN0aW9uX2V4aXQsXG4gIGpvaW46IHNlbGVjdGlvbl9qb2luLFxuICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLFxuICBzZWxlY3Rpb246IHNlbGVjdGlvbl9zZWxlY3Rpb24sXG4gIG9yZGVyOiBzZWxlY3Rpb25fb3JkZXIsXG4gIHNvcnQ6IHNlbGVjdGlvbl9zb3J0LFxuICBjYWxsOiBzZWxlY3Rpb25fY2FsbCxcbiAgbm9kZXM6IHNlbGVjdGlvbl9ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX25vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9zaXplLFxuICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fZWFjaCxcbiAgYXR0cjogc2VsZWN0aW9uX2F0dHIsXG4gIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUsXG4gIHByb3BlcnR5OiBzZWxlY3Rpb25fcHJvcGVydHksXG4gIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLFxuICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCxcbiAgaHRtbDogc2VsZWN0aW9uX2h0bWwsXG4gIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsXG4gIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIsXG4gIGFwcGVuZDogc2VsZWN0aW9uX2FwcGVuZCxcbiAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LFxuICByZW1vdmU6IHNlbGVjdGlvbl9yZW1vdmUsXG4gIGNsb25lOiBzZWxlY3Rpb25fY2xvbmUsXG4gIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sXG4gIG9uOiBzZWxlY3Rpb25fb24sXG4gIGRpc3BhdGNoOiBzZWxlY3Rpb25fZGlzcGF0Y2gsXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25faXRlcmF0b3Jcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNlbGVjdGlvbjtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5pdGlvbikge1xuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTtcbiAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldO1xuICByZXR1cm4gcHJvdG90eXBlO1xufVxuIiwiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDb2xvcigpIHt9XG5cbmV4cG9ydCB2YXIgZGFya2VyID0gMC43O1xuZXhwb3J0IHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7XG5cbnZhciByZUkgPSBcIlxcXFxzKihbKy1dP1xcXFxkKylcXFxccypcIixcbiAgICByZU4gPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPylcXFxccypcIixcbiAgICByZVAgPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPyklXFxcXHMqXCIsXG4gICAgcmVIZXggPSAvXiMoWzAtOWEtZl17Myw4fSkkLyxcbiAgICByZVJnYkludGVnZXIgPSBuZXcgUmVnRXhwKGBecmdiXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfVxcXFwpJGApLFxuICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JhXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfSwke3JlTn1cXFxcKSRgKSxcbiAgICByZVJnYmFQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYmFcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9LCR7cmVOfVxcXFwpJGApLFxuICAgIHJlSHNsUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xcXFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xhXFxcXCgke3JlTn0sJHtyZVB9LCR7cmVQfSwke3JlTn1cXFxcKSRgKTtcblxudmFyIG5hbWVkID0ge1xuICBhbGljZWJsdWU6IDB4ZjBmOGZmLFxuICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LFxuICBhcXVhOiAweDAwZmZmZixcbiAgYXF1YW1hcmluZTogMHg3ZmZmZDQsXG4gIGF6dXJlOiAweGYwZmZmZixcbiAgYmVpZ2U6IDB4ZjVmNWRjLFxuICBiaXNxdWU6IDB4ZmZlNGM0LFxuICBibGFjazogMHgwMDAwMDAsXG4gIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCxcbiAgYmx1ZTogMHgwMDAwZmYsXG4gIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLFxuICBicm93bjogMHhhNTJhMmEsXG4gIGJ1cmx5d29vZDogMHhkZWI4ODcsXG4gIGNhZGV0Ymx1ZTogMHg1ZjllYTAsXG4gIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLFxuICBjaG9jb2xhdGU6IDB4ZDI2OTFlLFxuICBjb3JhbDogMHhmZjdmNTAsXG4gIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCxcbiAgY29ybnNpbGs6IDB4ZmZmOGRjLFxuICBjcmltc29uOiAweGRjMTQzYyxcbiAgY3lhbjogMHgwMGZmZmYsXG4gIGRhcmtibHVlOiAweDAwMDA4YixcbiAgZGFya2N5YW46IDB4MDA4YjhiLFxuICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYixcbiAgZGFya2dyYXk6IDB4YTlhOWE5LFxuICBkYXJrZ3JlZW46IDB4MDA2NDAwLFxuICBkYXJrZ3JleTogMHhhOWE5YTksXG4gIGRhcmtraGFraTogMHhiZGI3NmIsXG4gIGRhcmttYWdlbnRhOiAweDhiMDA4YixcbiAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLFxuICBkYXJrb3JhbmdlOiAweGZmOGMwMCxcbiAgZGFya29yY2hpZDogMHg5OTMyY2MsXG4gIGRhcmtyZWQ6IDB4OGIwMDAwLFxuICBkYXJrc2FsbW9uOiAweGU5OTY3YSxcbiAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZixcbiAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsXG4gIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLFxuICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZixcbiAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsXG4gIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLFxuICBkZWVwcGluazogMHhmZjE0OTMsXG4gIGRlZXBza3libHVlOiAweDAwYmZmZixcbiAgZGltZ3JheTogMHg2OTY5NjksXG4gIGRpbWdyZXk6IDB4Njk2OTY5LFxuICBkb2RnZXJibHVlOiAweDFlOTBmZixcbiAgZmlyZWJyaWNrOiAweGIyMjIyMixcbiAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLFxuICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsXG4gIGZ1Y2hzaWE6IDB4ZmYwMGZmLFxuICBnYWluc2Jvcm86IDB4ZGNkY2RjLFxuICBnaG9zdHdoaXRlOiAweGY4ZjhmZixcbiAgZ29sZDogMHhmZmQ3MDAsXG4gIGdvbGRlbnJvZDogMHhkYWE1MjAsXG4gIGdyYXk6IDB4ODA4MDgwLFxuICBncmVlbjogMHgwMDgwMDAsXG4gIGdyZWVueWVsbG93OiAweGFkZmYyZixcbiAgZ3JleTogMHg4MDgwODAsXG4gIGhvbmV5ZGV3OiAweGYwZmZmMCxcbiAgaG90cGluazogMHhmZjY5YjQsXG4gIGluZGlhbnJlZDogMHhjZDVjNWMsXG4gIGluZGlnbzogMHg0YjAwODIsXG4gIGl2b3J5OiAweGZmZmZmMCxcbiAga2hha2k6IDB4ZjBlNjhjLFxuICBsYXZlbmRlcjogMHhlNmU2ZmEsXG4gIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LFxuICBsYXduZ3JlZW46IDB4N2NmYzAwLFxuICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLFxuICBsaWdodGJsdWU6IDB4YWRkOGU2LFxuICBsaWdodGNvcmFsOiAweGYwODA4MCxcbiAgbGlnaHRjeWFuOiAweGUwZmZmZixcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLFxuICBsaWdodGdyYXk6IDB4ZDNkM2QzLFxuICBsaWdodGdyZWVuOiAweDkwZWU5MCxcbiAgbGlnaHRncmV5OiAweGQzZDNkMyxcbiAgbGlnaHRwaW5rOiAweGZmYjZjMSxcbiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLFxuICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSxcbiAgbGlnaHRza3libHVlOiAweDg3Y2VmYSxcbiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LFxuICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksXG4gIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSxcbiAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLFxuICBsaW1lOiAweDAwZmYwMCxcbiAgbGltZWdyZWVuOiAweDMyY2QzMixcbiAgbGluZW46IDB4ZmFmMGU2LFxuICBtYWdlbnRhOiAweGZmMDBmZixcbiAgbWFyb29uOiAweDgwMDAwMCxcbiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsXG4gIG1lZGl1bWJsdWU6IDB4MDAwMGNkLFxuICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLFxuICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLFxuICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsXG4gIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsXG4gIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSxcbiAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYyxcbiAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSxcbiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCxcbiAgbWludGNyZWFtOiAweGY1ZmZmYSxcbiAgbWlzdHlyb3NlOiAweGZmZTRlMSxcbiAgbW9jY2FzaW46IDB4ZmZlNGI1LFxuICBuYXZham93aGl0ZTogMHhmZmRlYWQsXG4gIG5hdnk6IDB4MDAwMDgwLFxuICBvbGRsYWNlOiAweGZkZjVlNixcbiAgb2xpdmU6IDB4ODA4MDAwLFxuICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLFxuICBvcmFuZ2U6IDB4ZmZhNTAwLFxuICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLFxuICBvcmNoaWQ6IDB4ZGE3MGQ2LFxuICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSxcbiAgcGFsZWdyZWVuOiAweDk4ZmI5OCxcbiAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsXG4gIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLFxuICBwYXBheWF3aGlwOiAweGZmZWZkNSxcbiAgcGVhY2hwdWZmOiAweGZmZGFiOSxcbiAgcGVydTogMHhjZDg1M2YsXG4gIHBpbms6IDB4ZmZjMGNiLFxuICBwbHVtOiAweGRkYTBkZCxcbiAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsXG4gIHB1cnBsZTogMHg4MDAwODAsXG4gIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LFxuICByZWQ6IDB4ZmYwMDAwLFxuICByb3N5YnJvd246IDB4YmM4ZjhmLFxuICByb3lhbGJsdWU6IDB4NDE2OWUxLFxuICBzYWRkbGVicm93bjogMHg4YjQ1MTMsXG4gIHNhbG1vbjogMHhmYTgwNzIsXG4gIHNhbmR5YnJvd246IDB4ZjRhNDYwLFxuICBzZWFncmVlbjogMHgyZThiNTcsXG4gIHNlYXNoZWxsOiAweGZmZjVlZSxcbiAgc2llbm5hOiAweGEwNTIyZCxcbiAgc2lsdmVyOiAweGMwYzBjMCxcbiAgc2t5Ymx1ZTogMHg4N2NlZWIsXG4gIHNsYXRlYmx1ZTogMHg2YTVhY2QsXG4gIHNsYXRlZ3JheTogMHg3MDgwOTAsXG4gIHNsYXRlZ3JleTogMHg3MDgwOTAsXG4gIHNub3c6IDB4ZmZmYWZhLFxuICBzcHJpbmdncmVlbjogMHgwMGZmN2YsXG4gIHN0ZWVsYmx1ZTogMHg0NjgyYjQsXG4gIHRhbjogMHhkMmI0OGMsXG4gIHRlYWw6IDB4MDA4MDgwLFxuICB0aGlzdGxlOiAweGQ4YmZkOCxcbiAgdG9tYXRvOiAweGZmNjM0NyxcbiAgdHVycXVvaXNlOiAweDQwZTBkMCxcbiAgdmlvbGV0OiAweGVlODJlZSxcbiAgd2hlYXQ6IDB4ZjVkZWIzLFxuICB3aGl0ZTogMHhmZmZmZmYsXG4gIHdoaXRlc21va2U6IDB4ZjVmNWY1LFxuICB5ZWxsb3c6IDB4ZmZmZjAwLFxuICB5ZWxsb3dncmVlbjogMHg5YWNkMzJcbn07XG5cbmRlZmluZShDb2xvciwgY29sb3IsIHtcbiAgY29weShjaGFubmVscykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLCBjaGFubmVscyk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7XG4gIH0sXG4gIGhleDogY29sb3JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IGNvbG9yX2Zvcm1hdEhleCxcbiAgZm9ybWF0SGV4ODogY29sb3JfZm9ybWF0SGV4OCxcbiAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsXG4gIGZvcm1hdFJnYjogY29sb3JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogY29sb3JfZm9ybWF0UmdiXG59KTtcblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4OCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIc2woKSB7XG4gIHJldHVybiBoc2xDb252ZXJ0KHRoaXMpLmZvcm1hdEhzbCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRSZ2IoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb2xvcihmb3JtYXQpIHtcbiAgdmFyIG0sIGw7XG4gIGZvcm1hdCA9IChmb3JtYXQgKyBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChtID0gcmVIZXguZXhlYyhmb3JtYXQpKSA/IChsID0gbVsxXS5sZW5ndGgsIG0gPSBwYXJzZUludChtWzFdLCAxNiksIGwgPT09IDYgPyByZ2JuKG0pIC8vICNmZjAwMDBcbiAgICAgIDogbCA9PT0gMyA/IG5ldyBSZ2IoKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSwgMSkgLy8gI2YwMFxuICAgICAgOiBsID09PSA4ID8gcmdiYShtID4+IDI0ICYgMHhmZiwgbSA+PiAxNiAmIDB4ZmYsIG0gPj4gOCAmIDB4ZmYsIChtICYgMHhmZikgLyAweGZmKSAvLyAjZmYwMDAwMDBcbiAgICAgIDogbCA9PT0gNCA/IHJnYmEoKG0gPj4gMTIgJiAweGYpIHwgKG0gPj4gOCAmIDB4ZjApLCAobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSkgLyAweGZmKSAvLyAjZjAwMFxuICAgICAgOiBudWxsKSAvLyBpbnZhbGlkIGhleFxuICAgICAgOiAobSA9IHJlUmdiSW50ZWdlci5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAwKVxuICAgICAgOiAobSA9IHJlUmdiUGVyY2VudC5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCAxKSAvLyByZ2IoMTAwJSwgMCUsIDAlKVxuICAgICAgOiAobSA9IHJlUmdiYUludGVnZXIuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSwgbVsyXSwgbVszXSwgbVs0XSkgLy8gcmdiYSgyNTUsIDAsIDAsIDEpXG4gICAgICA6IChtID0gcmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAwJSwgMCUsIDAlLCAxKVxuICAgICAgOiAobSA9IHJlSHNsUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCAxKSAvLyBoc2woMTIwLCA1MCUsIDUwJSlcbiAgICAgIDogKG0gPSByZUhzbGFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIG1bNF0pIC8vIGhzbGEoMTIwLCA1MCUsIDUwJSwgMSlcbiAgICAgIDogbmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4obmFtZWRbZm9ybWF0XSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIDogZm9ybWF0ID09PSBcInRyYW5zcGFyZW50XCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApXG4gICAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJnYm4obikge1xuICByZXR1cm4gbmV3IFJnYihuID4+IDE2ICYgMHhmZiwgbiA+PiA4ICYgMHhmZiwgbiAmIDB4ZmYsIDEpO1xufVxuXG5mdW5jdGlvbiByZ2JhKHIsIGcsIGIsIGEpIHtcbiAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOO1xuICByZXR1cm4gbmV3IFJnYihyLCBnLCBiLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYkNvbnZlcnQobykge1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBSZ2I7XG4gIG8gPSBvLnJnYigpO1xuICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICB0aGlzLnIgPSArcjtcbiAgdGhpcy5nID0gK2c7XG4gIHRoaXMuYiA9ICtiO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY2xhbXAoKSB7XG4gICAgcmV0dXJuIG5ldyBSZ2IoY2xhbXBpKHRoaXMuciksIGNsYW1waSh0aGlzLmcpLCBjbGFtcGkodGhpcy5iKSwgY2xhbXBhKHRoaXMub3BhY2l0eSkpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmcgJiYgdGhpcy5nIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuYiAmJiB0aGlzLmIgPCAyNTUuNSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgaGV4OiByZ2JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhleDg6IHJnYl9mb3JtYXRIZXg4LFxuICBmb3JtYXRSZ2I6IHJnYl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiXG59KSk7XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfWA7XG59XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXg4KCkge1xuICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX0ke2hleCgoaXNOYU4odGhpcy5vcGFjaXR5KSA/IDEgOiB0aGlzLm9wYWNpdHkpICogMjU1KX1gO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0UmdiKCkge1xuICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gIHJldHVybiBgJHthID09PSAxID8gXCJyZ2IoXCIgOiBcInJnYmEoXCJ9JHtjbGFtcGkodGhpcy5yKX0sICR7Y2xhbXBpKHRoaXMuZyl9LCAke2NsYW1waSh0aGlzLmIpfSR7YSA9PT0gMSA/IFwiKVwiIDogYCwgJHthfSlgfWA7XG59XG5cbmZ1bmN0aW9uIGNsYW1wYShvcGFjaXR5KSB7XG4gIHJldHVybiBpc05hTihvcGFjaXR5KSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBvcGFjaXR5KSk7XG59XG5cbmZ1bmN0aW9uIGNsYW1waSh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7XG59XG5cbmZ1bmN0aW9uIGhleCh2YWx1ZSkge1xuICB2YWx1ZSA9IGNsYW1waSh2YWx1ZSk7XG4gIHJldHVybiAodmFsdWUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyB2YWx1ZS50b1N0cmluZygxNik7XG59XG5cbmZ1bmN0aW9uIGhzbGEoaCwgcywgbCwgYSkge1xuICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47XG4gIGVsc2UgaWYgKGwgPD0gMCB8fCBsID49IDEpIGggPSBzID0gTmFOO1xuICBlbHNlIGlmIChzIDw9IDApIGggPSBOYU47XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbmV3IEhzbChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBIc2w7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbztcbiAgbyA9IG8ucmdiKCk7XG4gIHZhciByID0gby5yIC8gMjU1LFxuICAgICAgZyA9IG8uZyAvIDI1NSxcbiAgICAgIGIgPSBvLmIgLyAyNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgaCA9IE5hTixcbiAgICAgIHMgPSBtYXggLSBtaW4sXG4gICAgICBsID0gKG1heCArIG1pbikgLyAyO1xuICBpZiAocykge1xuICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O1xuICAgIGVsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtcbiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7XG4gICAgcyAvPSBsIDwgMC41ID8gbWF4ICsgbWluIDogMiAtIG1heCAtIG1pbjtcbiAgICBoICo9IDYwO1xuICB9IGVsc2Uge1xuICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoO1xuICB9XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMucyA9ICtzO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCxcbiAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLFxuICAgICAgICBsID0gdGhpcy5sLFxuICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLFxuICAgICAgICBtMSA9IDIgKiBsIC0gbTI7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICBoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGgsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH0sXG4gIGNsYW1wKCkge1xuICAgIHJldHVybiBuZXcgSHNsKGNsYW1waCh0aGlzLmgpLCBjbGFtcHQodGhpcy5zKSwgY2xhbXB0KHRoaXMubCksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLmwgJiYgdGhpcy5sIDw9IDEpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGZvcm1hdEhzbCgpIHtcbiAgICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gICAgcmV0dXJuIGAke2EgPT09IDEgPyBcImhzbChcIiA6IFwiaHNsYShcIn0ke2NsYW1waCh0aGlzLmgpfSwgJHtjbGFtcHQodGhpcy5zKSAqIDEwMH0lLCAke2NsYW1wdCh0aGlzLmwpICogMTAwfSUke2EgPT09IDEgPyBcIilcIiA6IGAsICR7YX0pYH1gO1xuICB9XG59KSk7XG5cbmZ1bmN0aW9uIGNsYW1waCh2YWx1ZSkge1xuICB2YWx1ZSA9ICh2YWx1ZSB8fCAwKSAlIDM2MDtcbiAgcmV0dXJuIHZhbHVlIDwgMCA/IHZhbHVlICsgMzYwIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNsYW1wdCh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdmFsdWUgfHwgMCkpO1xufVxuXG4vKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovXG5mdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikge1xuICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwXG4gICAgICA6IGggPCAxODAgPyBtMlxuICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MFxuICAgICAgOiBtMSkgKiAyNTU7XG59XG4iLCJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gbGluZWFyKGEsIGQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSArIHQgKiBkO1xuICB9O1xufVxuXG5mdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7XG4gIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHVlKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdhbW1hKHkpIHtcbiAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbChhLCBiLCB5KSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cbiIsImltcG9ydCB7cmdiIGFzIGNvbG9yUmdifSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCBiYXNpcyBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuaW1wb3J0IGJhc2lzQ2xvc2VkIGZyb20gXCIuL2Jhc2lzQ2xvc2VkLmpzXCI7XG5pbXBvcnQgbm9nYW1tYSwge2dhbW1hfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gcmdiR2FtbWEoeSkge1xuICB2YXIgY29sb3IgPSBnYW1tYSh5KTtcblxuICBmdW5jdGlvbiByZ2Ioc3RhcnQsIGVuZCkge1xuICAgIHZhciByID0gY29sb3IoKHN0YXJ0ID0gY29sb3JSZ2Ioc3RhcnQpKS5yLCAoZW5kID0gY29sb3JSZ2IoZW5kKSkuciksXG4gICAgICAgIGcgPSBjb2xvcihzdGFydC5nLCBlbmQuZyksXG4gICAgICAgIGIgPSBjb2xvcihzdGFydC5iLCBlbmQuYiksXG4gICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgc3RhcnQuciA9IHIodCk7XG4gICAgICBzdGFydC5nID0gZyh0KTtcbiAgICAgIHN0YXJ0LmIgPSBiKHQpO1xuICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgIH07XG4gIH1cblxuICByZ2IuZ2FtbWEgPSByZ2JHYW1tYTtcblxuICByZXR1cm4gcmdiO1xufSkoMSk7XG5cbmZ1bmN0aW9uIHJnYlNwbGluZShzcGxpbmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbG9ycykge1xuICAgIHZhciBuID0gY29sb3JzLmxlbmd0aCxcbiAgICAgICAgciA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgZyA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgYiA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgaSwgY29sb3I7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgY29sb3IgPSBjb2xvclJnYihjb2xvcnNbaV0pO1xuICAgICAgcltpXSA9IGNvbG9yLnIgfHwgMDtcbiAgICAgIGdbaV0gPSBjb2xvci5nIHx8IDA7XG4gICAgICBiW2ldID0gY29sb3IuYiB8fCAwO1xuICAgIH1cbiAgICByID0gc3BsaW5lKHIpO1xuICAgIGcgPSBzcGxpbmUoZyk7XG4gICAgYiA9IHNwbGluZShiKTtcbiAgICBjb2xvci5vcGFjaXR5ID0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgY29sb3IuciA9IHIodCk7XG4gICAgICBjb2xvci5nID0gZyh0KTtcbiAgICAgIGNvbG9yLmIgPSBiKHQpO1xuICAgICAgcmV0dXJuIGNvbG9yICsgXCJcIjtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIHJnYkJhc2lzID0gcmdiU3BsaW5lKGJhc2lzKTtcbmV4cG9ydCB2YXIgcmdiQmFzaXNDbG9zZWQgPSByZ2JTcGxpbmUoYmFzaXNDbG9zZWQpO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDtcbiAgfTtcbn1cbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbnZhciByZUEgPSAvWy0rXT8oPzpcXGQrXFwuP1xcZCp8XFwuP1xcZCspKD86W2VFXVstK10/XFxkKyk/L2csXG4gICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCBcImdcIik7XG5cbmZ1bmN0aW9uIHplcm8oYikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGI7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uZShiKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGIodCkgKyBcIlwiO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYVxuICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYlxuICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55XG4gICAgICBpID0gLTEsIC8vIGluZGV4IGluIHNcbiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG5cbiAgLy8gQ29lcmNlIGlucHV0cyB0byBzdHJpbmdzLlxuICBhID0gYSArIFwiXCIsIGIgPSBiICsgXCJcIjtcblxuICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLlxuICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpXG4gICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHtcbiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpO1xuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJzO1xuICAgIH1cbiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaFxuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJtO1xuICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzXG4gICAgICBzWysraV0gPSBudWxsO1xuICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIoYW0sIGJtKX0pO1xuICAgIH1cbiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7XG4gIH1cblxuICAvLyBBZGQgcmVtYWlucyBvZiBiLlxuICBpZiAoYmkgPCBiLmxlbmd0aCkge1xuICAgIGJzID0gYi5zbGljZShiaSk7XG4gICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgZWxzZSBzWysraV0gPSBicztcbiAgfVxuXG4gIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLlxuICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLlxuICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF1cbiAgICAgID8gb25lKHFbMF0ueClcbiAgICAgIDogemVybyhiKSlcbiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICAgICAgfSk7XG59XG4iLCJ2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSB7XG4gIHRyYW5zbGF0ZVg6IDAsXG4gIHRyYW5zbGF0ZVk6IDAsXG4gIHJvdGF0ZTogMCxcbiAgc2tld1g6IDAsXG4gIHNjYWxlWDogMSxcbiAgc2NhbGVZOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7XG4gIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDtcbiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYO1xuICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTtcbiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGVYOiBlLFxuICAgIHRyYW5zbGF0ZVk6IGYsXG4gICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcyxcbiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsXG4gICAgc2NhbGVYOiBzY2FsZVgsXG4gICAgc2NhbGVZOiBzY2FsZVlcbiAgfTtcbn1cbiIsImltcG9ydCBkZWNvbXBvc2UsIHtpZGVudGl0eX0gZnJvbSBcIi4vZGVjb21wb3NlLmpzXCI7XG5cbnZhciBzdmdOb2RlO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ3NzKHZhbHVlKSB7XG4gIGNvbnN0IG0gPSBuZXcgKHR5cGVvZiBET01NYXRyaXggPT09IFwiZnVuY3Rpb25cIiA/IERPTU1hdHJpeCA6IFdlYktpdENTU01hdHJpeCkodmFsdWUgKyBcIlwiKTtcbiAgcmV0dXJuIG0uaXNJZGVudGl0eSA/IGlkZW50aXR5IDogZGVjb21wb3NlKG0uYSwgbS5iLCBtLmMsIG0uZCwgbS5lLCBtLmYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdmcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTtcbiAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICBzdmdOb2RlLnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCB2YWx1ZSk7XG4gIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5O1xuICB2YWx1ZSA9IHZhbHVlLm1hdHJpeDtcbiAgcmV0dXJuIGRlY29tcG9zZSh2YWx1ZS5hLCB2YWx1ZS5iLCB2YWx1ZS5jLCB2YWx1ZS5kLCB2YWx1ZS5lLCB2YWx1ZS5mKTtcbn1cbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4uL251bWJlci5qc1wiO1xuaW1wb3J0IHtwYXJzZUNzcywgcGFyc2VTdmd9IGZyb20gXCIuL3BhcnNlLmpzXCI7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikge1xuXG4gIGZ1bmN0aW9uIHBvcChzKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArIFwiIFwiIDogXCJcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChcInRyYW5zbGF0ZShcIiwgbnVsbCwgcHhDb21tYSwgbnVsbCwgcHhQYXJlbik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7XG4gICAgICBzLnB1c2goXCJ0cmFuc2xhdGUoXCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aFxuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIsIG51bGwsIFwiLFwiLCBudWxsLCBcIilcIik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiArIHhiICsgXCIsXCIgKyB5YiArIFwiKVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG4gICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7XG4gICAgdHJhbnNsYXRlKGEudHJhbnNsYXRlWCwgYS50cmFuc2xhdGVZLCBiLnRyYW5zbGF0ZVgsIGIudHJhbnNsYXRlWSwgcywgcSk7XG4gICAgcm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7XG4gICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7XG4gICAgc2NhbGUoYS5zY2FsZVgsIGEuc2NhbGVZLCBiLnNjYWxlWCwgYi5zY2FsZVksIHMsIHEpO1xuICAgIGEgPSBiID0gbnVsbDsgLy8gZ2NcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlQ3NzLCBcInB4LCBcIiwgXCJweClcIiwgXCJkZWcpXCIpO1xuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlU3ZnLCBcIiwgXCIsIFwiKVwiLCBcIilcIik7XG4iLCJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKHVuZGVmaW5lZCwgZSk7XG4gICAgdCA9IHQuX25leHQ7XG4gIH1cbiAgLS1mcmFtZTtcbn1cblxuZnVuY3Rpb24gd2FrZSgpIHtcbiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3O1xuICBmcmFtZSA9IHRpbWVvdXQgPSAwO1xuICB0cnkge1xuICAgIHRpbWVyRmx1c2goKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcmFtZSA9IDA7XG4gICAgbmFwKCk7XG4gICAgY2xvY2tOb3cgPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBva2UoKSB7XG4gIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7XG4gIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7XG59XG5cbmZ1bmN0aW9uIG5hcCgpIHtcbiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5O1xuICB3aGlsZSAodDEpIHtcbiAgICBpZiAodDEuX2NhbGwpIHtcbiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTtcbiAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDtcbiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjtcbiAgICB9XG4gIH1cbiAgdGFza1RhaWwgPSB0MDtcbiAgc2xlZXAodGltZSk7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHtcbiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuXG4gIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB2YXIgZGVsYXkgPSB0aW1lIC0gY2xvY2tOb3c7IC8vIFN0cmljdGx5IGxlc3MgdGhhbiBpZiB3ZSByZWNvbXB1dGVkIGNsb2NrTm93LlxuICBpZiAoZGVsYXkgPiAyNCkge1xuICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHdha2UsIHRpbWUgLSBjbG9jay5ub3coKSAtIGNsb2NrU2tldyk7XG4gICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW50ZXJ2YWwpIGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpLCBpbnRlcnZhbCA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7XG4gICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtUaW1lcn0gZnJvbSBcIi4vdGltZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICBkZWxheSA9IGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5O1xuICB0LnJlc3RhcnQoZWxhcHNlZCA9PiB7XG4gICAgdC5zdG9wKCk7XG4gICAgY2FsbGJhY2soZWxhcHNlZCArIGRlbGF5KTtcbiAgfSwgZGVsYXksIHRpbWUpO1xuICByZXR1cm4gdDtcbn1cbiIsImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHt0aW1lciwgdGltZW91dH0gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBlbXB0eU9uID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImVuZFwiLCBcImNhbmNlbFwiLCBcImludGVycnVwdFwiKTtcbnZhciBlbXB0eVR3ZWVuID0gW107XG5cbmV4cG9ydCB2YXIgQ1JFQVRFRCA9IDA7XG5leHBvcnQgdmFyIFNDSEVEVUxFRCA9IDE7XG5leHBvcnQgdmFyIFNUQVJUSU5HID0gMjtcbmV4cG9ydCB2YXIgU1RBUlRFRCA9IDM7XG5leHBvcnQgdmFyIFJVTk5JTkcgPSA0O1xuZXhwb3J0IHZhciBFTkRJTkcgPSA1O1xuZXhwb3J0IHZhciBFTkRFRCA9IDY7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIGlkLCBpbmRleCwgZ3JvdXAsIHRpbWluZykge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9O1xuICBlbHNlIGlmIChpZCBpbiBzY2hlZHVsZXMpIHJldHVybjtcbiAgY3JlYXRlKG5vZGUsIGlkLCB7XG4gICAgbmFtZTogbmFtZSxcbiAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBvbjogZW1wdHlPbixcbiAgICB0d2VlbjogZW1wdHlUd2VlbixcbiAgICB0aW1lOiB0aW1pbmcudGltZSxcbiAgICBkZWxheTogdGltaW5nLmRlbGF5LFxuICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sXG4gICAgZWFzZTogdGltaW5nLmVhc2UsXG4gICAgdGltZXI6IG51bGwsXG4gICAgc3RhdGU6IENSRUFURURcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IENSRUFURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IFNUQVJURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZSB8fCAhKHNjaGVkdWxlID0gc2NoZWR1bGVbaWRdKSkgdGhyb3cgbmV3IEVycm9yKFwidHJhbnNpdGlvbiBub3QgZm91bmRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHR3ZWVuO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLlxuICAvLyBOb3RlIHRoZSBhY3R1YWwgZGVsYXkgaXMgbm90IGtub3duIHVudGlsIHRoZSBmaXJzdCBjYWxsYmFjayFcbiAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7XG4gIHNlbGYudGltZXIgPSB0aW1lcihzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTtcblxuICBmdW5jdGlvbiBzY2hlZHVsZShlbGFwc2VkKSB7XG4gICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRDtcbiAgICBzZWxmLnRpbWVyLnJlc3RhcnQoc3RhcnQsIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG5cbiAgICAvLyBJZiB0aGUgZWxhcHNlZCBkZWxheSBpcyBsZXNzIHRoYW4gb3VyIGZpcnN0IHNsZWVwLCBzdGFydCBpbW1lZGlhdGVseS5cbiAgICBpZiAoc2VsZi5kZWxheSA8PSBlbGFwc2VkKSBzdGFydChlbGFwc2VkIC0gc2VsZi5kZWxheSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7XG4gICAgdmFyIGksIGosIG4sIG87XG5cbiAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNDSEVEVUxFRCkgcmV0dXJuIHN0b3AoKTtcblxuICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICAgIG8gPSBzY2hlZHVsZXNbaV07XG4gICAgICBpZiAoby5uYW1lICE9PSBzZWxmLm5hbWUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBXaGlsZSB0aGlzIGVsZW1lbnQgYWxyZWFkeSBoYXMgYSBzdGFydGluZyB0cmFuc2l0aW9uIGR1cmluZyB0aGlzIGZyYW1lLFxuICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhXG4gICAgICAvLyBjaGFuY2UgdG8gdGljayAoYW5kIHBvc3NpYmx5IGVuZCk7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzU0IVxuICAgICAgaWYgKG8uc3RhdGUgPT09IFNUQVJURUQpIHJldHVybiB0aW1lb3V0KHN0YXJ0KTtcblxuICAgICAgLy8gSW50ZXJydXB0IHRoZSBhY3RpdmUgdHJhbnNpdGlvbiwgaWYgYW55LlxuICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiaW50ZXJydXB0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuXG4gICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuXG4gICAgICBlbHNlIGlmICgraSA8IGlkKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZlciB0aGUgZmlyc3QgdGljayB0byBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWU7IHNlZSBkMy9kMyMxNTc2LlxuICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgc2NoZWR1bGVkIGJlZm9yZSB0aGUgc3RhcnQgZXZlbnQ7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzE2IVxuICAgIC8vIEFzc3VtaW5nIHRoaXMgaXMgc3VjY2Vzc2Z1bCwgc3Vic2VxdWVudCBjYWxsYmFja3MgZ28gc3RyYWlnaHQgdG8gdGljay5cbiAgICB0aW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFNUQVJURUQpIHtcbiAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7XG4gICAgICAgIHNlbGYudGltZXIucmVzdGFydCh0aWNrLCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuICAgICAgICB0aWNrKGVsYXBzZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIHN0YXJ0IGV2ZW50LlxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSB0d2VlbiBhcmUgaW5pdGlhbGl6ZWQuXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJUSU5HO1xuICAgIHNlbGYub24uY2FsbChcInN0YXJ0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZFxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVEVEO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgdHdlZW4sIGRlbGV0aW5nIG51bGwgdHdlZW4uXG4gICAgdHdlZW4gPSBuZXcgQXJyYXkobiA9IHNlbGYudHdlZW4ubGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwLCBqID0gLTE7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChvID0gc2VsZi50d2VlbltpXS52YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApKSB7XG4gICAgICAgIHR3ZWVuWysral0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICB0d2Vlbi5sZW5ndGggPSBqICsgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkge1xuICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gdHdlZW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIHR3ZWVuW2ldLmNhbGwobm9kZSwgdCk7XG4gICAgfVxuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIGVuZCBldmVudC5cbiAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7XG4gICAgICBzZWxmLm9uLmNhbGwoXCJlbmRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgICBzdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICBzZWxmLnN0YXRlID0gRU5ERUQ7XG4gICAgc2VsZi50aW1lci5zdG9wKCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpZF07XG4gICAgZm9yICh2YXIgaSBpbiBzY2hlZHVsZXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHtTVEFSVElORywgRU5ESU5HLCBFTkRFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHNjaGVkdWxlLFxuICAgICAgYWN0aXZlLFxuICAgICAgZW1wdHkgPSB0cnVlLFxuICAgICAgaTtcblxuICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuO1xuXG4gIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG5cbiAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsgZW1wdHkgPSBmYWxzZTsgY29udGludWU7IH1cbiAgICBhY3RpdmUgPSBzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HICYmIHNjaGVkdWxlLnN0YXRlIDwgRU5ESU5HO1xuICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7XG4gICAgc2NoZWR1bGUudGltZXIuc3RvcCgpO1xuICAgIHNjaGVkdWxlLm9uLmNhbGwoYWN0aXZlID8gXCJpbnRlcnJ1cHRcIiA6IFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNjaGVkdWxlLmluZGV4LCBzY2hlZHVsZS5ncm91cCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgfVxuXG4gIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xufVxuIiwiaW1wb3J0IGludGVycnVwdCBmcm9tIFwiLi4vaW50ZXJydXB0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICBpbnRlcnJ1cHQodGhpcywgbmFtZSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gdHdlZW5SZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpO1xuICAgICAgICAgIHR3ZWVuMS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHdlZW5GdW5jdGlvbihpZCwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSAodHdlZW4wID0gdHdlZW4pLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciB0ID0ge25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0sIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjFbaV0gPSB0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA9PT0gbikgdHdlZW4xLnB1c2godCk7XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIG5hbWUgKz0gXCJcIjtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgdHdlZW4gPSBnZXQodGhpcy5ub2RlKCksIGlkKS50d2VlbjtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuLmxlbmd0aCwgdDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbCA/IHR3ZWVuUmVtb3ZlIDogdHdlZW5GdW5jdGlvbikoaWQsIG5hbWUsIHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0d2VlblZhbHVlKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkO1xuXG4gIHRyYW5zaXRpb24uZWFjaChmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpO1xuICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gZ2V0KG5vZGUsIGlkKS52YWx1ZVtuYW1lXTtcbiAgfTtcbn1cbiIsImltcG9ydCB7Y29sb3J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZU51bWJlciwgaW50ZXJwb2xhdGVSZ2IsIGludGVycG9sYXRlU3RyaW5nfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYztcbiAgcmV0dXJuICh0eXBlb2YgYiA9PT0gXCJudW1iZXJcIiA/IGludGVycG9sYXRlTnVtYmVyXG4gICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IGludGVycG9sYXRlUmdiXG4gICAgICA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYilcbiAgICAgIDogaW50ZXJwb2xhdGVTdHJpbmcpKGEsIGIpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge25hbWVzcGFjZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSksIGkgPSBmdWxsbmFtZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbikoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgXCJhdHRyLlwiICsgbmFtZSwgdmFsdWUpKVxuICAgICAgOiB2YWx1ZSA9PSBudWxsID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkoZnVsbG5hbWUpXG4gICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KShmdWxsbmFtZSwgaSwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clR3ZWVuTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW4obmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGUobmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBrZXkgPSBcImF0dHIuXCIgKyBuYW1lO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCAoZnVsbG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2VlbikoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge2dldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlbGF5Q29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZGVsYXlGdW5jdGlvblxuICAgICAgICAgIDogZGVsYXlDb25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZGVsYXk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkdXJhdGlvbkNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZHVyYXRpb25GdW5jdGlvblxuICAgICAgICAgIDogZHVyYXRpb25Db25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZHVyYXRpb247XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZWFzZTtcbn1cbiIsImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlVmFyeWluZyhpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodHlwZW9mIHYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy5lYWNoKGVhc2VWYXJ5aW5nKHRoaXMuX2lkLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHttYXRjaGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHtcbiAgaWYgKHRyYW5zaXRpb24uX2lkICE9PSB0aGlzLl9pZCkgdGhyb3cgbmV3IEVycm9yO1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHtcbiAgcmV0dXJuIChuYW1lICsgXCJcIikudHJpbSgpLnNwbGl0KC9efFxccysvKS5ldmVyeShmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiAhdCB8fCB0ID09PSBcInN0YXJ0XCI7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgb24wLCBvbjEsIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjApIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24obmFtZSwgbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMlxuICAgICAgPyBnZXQodGhpcy5ub2RlKCksIGlkKS5vbi5vbihuYW1lKVxuICAgICAgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fX3RyYW5zaXRpb24pIGlmICgraSAhPT0gaWQpIHJldHVybjtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5vbihcImVuZC5yZW1vdmVcIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0b3J9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICAgIHNjaGVkdWxlKHN1Ymdyb3VwW2ldLCBuYW1lLCBpZCwgaSwgc3ViZ3JvdXAsIGdldChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0b3JBbGx9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBmb3IgKHZhciBjaGlsZHJlbiA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSwgY2hpbGQsIGluaGVyaXQgPSBnZXQobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykge1xuICAgICAgICAgIGlmIChjaGlsZCA9IGNoaWxkcmVuW2tdKSB7XG4gICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxudmFyIFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9ncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3N0eWxlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZU51bGwobmFtZSwgaW50ZXJwb2xhdGUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICBzdHJpbmcxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgc3RyaW5nMTAgPSBzdHJpbmcxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSxcbiAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSBzdHJpbmcxID0gdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlTWF5YmVSZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIG9uMCwgb24xLCBsaXN0ZW5lcjAsIGtleSA9IFwic3R5bGUuXCIgKyBuYW1lLCBldmVudCA9IFwiZW5kLlwiICsga2V5LCByZW1vdmU7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uLFxuICAgICAgICBsaXN0ZW5lciA9IHNjaGVkdWxlLnZhbHVlW2tleV0gPT0gbnVsbCA/IHJlbW92ZSB8fCAocmVtb3ZlID0gc3R5bGVSZW1vdmUobmFtZSkpIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wIHx8IGxpc3RlbmVyMCAhPT0gbGlzdGVuZXIpIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24oZXZlbnQsIGxpc3RlbmVyMCA9IGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGkgPSAobmFtZSArPSBcIlwiKSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVOdWxsKG5hbWUsIGkpKVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgc3R5bGVSZW1vdmUobmFtZSkpXG4gICAgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlRnVuY3Rpb24obmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcInN0eWxlLlwiICsgbmFtZSwgdmFsdWUpKSlcbiAgICAgIC5lYWNoKHN0eWxlTWF5YmVSZW1vdmUodGhpcy5faWQsIG5hbWUpKVxuICAgIDogdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVDb25zdGFudChuYW1lLCBpLCB2YWx1ZSksIHByaW9yaXR5KVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgbnVsbCk7XG59XG4iLCJmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIHQsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0ID0gKGkwID0gaSkgJiYgc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSk7XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBrZXkgPSBcInN0eWxlLlwiICsgKG5hbWUgKz0gXCJcIik7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSk7XG59XG4iLCJpbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWUxID09IG51bGwgPyBcIlwiIDogdmFsdWUxO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdGhpcy50d2VlbihcInRleHRcIiwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gdGV4dEZ1bmN0aW9uKHR3ZWVuVmFsdWUodGhpcywgXCJ0ZXh0XCIsIHZhbHVlKSlcbiAgICAgIDogdGV4dENvbnN0YW50KHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiKSk7XG59XG4iLCJmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGUoaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSBpLmNhbGwodGhpcywgdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRUd2Vlbih2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIHRleHRJbnRlcnBvbGF0ZShpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGtleSA9IFwidGV4dFwiO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgdGV4dFR3ZWVuKHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQwID0gdGhpcy5faWQsXG4gICAgICBpZDEgPSBuZXdJZCgpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHZhciBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkMCk7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkMSwgaSwgZ3JvdXAsIHtcbiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBkZWxheTogMCxcbiAgICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTtcbn1cbiIsImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG9uMCwgb24xLCB0aGF0ID0gdGhpcywgaWQgPSB0aGF0Ll9pZCwgc2l6ZSA9IHRoYXQuc2l6ZSgpO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIGNhbmNlbCA9IHt2YWx1ZTogcmVqZWN0fSxcbiAgICAgICAgZW5kID0ge3ZhbHVlOiBmdW5jdGlvbigpIHsgaWYgKC0tc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpOyB9fTtcblxuICAgIHRoYXQuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjtcblxuICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICAgIGlmIChvbiAhPT0gb24wKSB7XG4gICAgICAgIG9uMSA9IChvbjAgPSBvbikuY29weSgpO1xuICAgICAgICBvbjEuXy5jYW5jZWwucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5pbnRlcnJ1cHQucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5lbmQucHVzaChlbmQpO1xuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBzZWxlY3Rpb24gd2FzIGVtcHR5LCByZXNvbHZlIGVuZCBpbW1lZGlhdGVseVxuICAgIGlmIChzaXplID09PSAwKSByZXNvbHZlKCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHIgZnJvbSBcIi4vYXR0ci5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0clR3ZWVuIGZyb20gXCIuL2F0dHJUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZGVsYXkgZnJvbSBcIi4vZGVsYXkuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2R1cmF0aW9uIGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlIGZyb20gXCIuL2Vhc2UuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nIGZyb20gXCIuL2Vhc2VWYXJ5aW5nLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9tZXJnZSBmcm9tIFwiLi9tZXJnZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdEFsbCBmcm9tIFwiLi9zZWxlY3RBbGwuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdGlvbiBmcm9tIFwiLi9zZWxlY3Rpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zdHlsZVR3ZWVuIGZyb20gXCIuL3N0eWxlVHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dFR3ZWVuIGZyb20gXCIuL3RleHRUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90d2VlbiBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZW5kIGZyb20gXCIuL2VuZC5qc1wiO1xuXG52YXIgaWQgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gVHJhbnNpdGlvbihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7XG4gIHRoaXMuX2dyb3VwcyA9IGdyb3VwcztcbiAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7XG4gIHRoaXMuX25hbWUgPSBuYW1lO1xuICB0aGlzLl9pZCA9IGlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2l0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHNlbGVjdGlvbigpLnRyYW5zaXRpb24obmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdJZCgpIHtcbiAgcmV0dXJuICsraWQ7XG59XG5cbnZhciBzZWxlY3Rpb25fcHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZTtcblxuVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB0cmFuc2l0aW9uLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sXG4gIHNlbGVjdDogdHJhbnNpdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogdHJhbnNpdGlvbl9zZWxlY3RBbGwsXG4gIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3Byb3RvdHlwZS5zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiB0cmFuc2l0aW9uX2ZpbHRlcixcbiAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogdHJhbnNpdGlvbl9zZWxlY3Rpb24sXG4gIHRyYW5zaXRpb246IHRyYW5zaXRpb25fdHJhbnNpdGlvbixcbiAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlLFxuICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fcHJvdG90eXBlLmVtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fcHJvdG90eXBlLmVhY2gsXG4gIG9uOiB0cmFuc2l0aW9uX29uLFxuICBhdHRyOiB0cmFuc2l0aW9uX2F0dHIsXG4gIGF0dHJUd2VlbjogdHJhbnNpdGlvbl9hdHRyVHdlZW4sXG4gIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLFxuICBzdHlsZVR3ZWVuOiB0cmFuc2l0aW9uX3N0eWxlVHdlZW4sXG4gIHRleHQ6IHRyYW5zaXRpb25fdGV4dCxcbiAgdGV4dFR3ZWVuOiB0cmFuc2l0aW9uX3RleHRUd2VlbixcbiAgcmVtb3ZlOiB0cmFuc2l0aW9uX3JlbW92ZSxcbiAgdHdlZW46IHRyYW5zaXRpb25fdHdlZW4sXG4gIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LFxuICBkdXJhdGlvbjogdHJhbnNpdGlvbl9kdXJhdGlvbixcbiAgZWFzZTogdHJhbnNpdGlvbl9lYXNlLFxuICBlYXNlVmFyeWluZzogdHJhbnNpdGlvbl9lYXNlVmFyeWluZyxcbiAgZW5kOiB0cmFuc2l0aW9uX2VuZCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXVxufTtcbiIsImV4cG9ydCBmdW5jdGlvbiBjdWJpY0luKHQpIHtcbiAgcmV0dXJuIHQgKiB0ICogdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljT3V0KHQpIHtcbiAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCAqIHQgOiAodCAtPSAyKSAqIHQgKiB0ICsgMikgLyAyO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4uL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHtlYXNlQ3ViaWNJbk91dH0gZnJvbSBcImQzLWVhc2VcIjtcbmltcG9ydCB7bm93fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGRlZmF1bHRUaW1pbmcgPSB7XG4gIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuXG4gIGRlbGF5OiAwLFxuICBkdXJhdGlvbjogMjUwLFxuICBlYXNlOiBlYXNlQ3ViaWNJbk91dFxufTtcblxuZnVuY3Rpb24gaW5oZXJpdChub2RlLCBpZCkge1xuICB2YXIgdGltaW5nO1xuICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkge1xuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zaXRpb24gJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aW1pbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGlkLFxuICAgICAgdGltaW5nO1xuXG4gIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikge1xuICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lO1xuICB9IGVsc2Uge1xuICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmcpLnRpbWUgPSBub3coKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnRlcnJ1cHQgZnJvbSBcIi4vaW50ZXJydXB0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RyYW5zaXRpb24gZnJvbSBcIi4vdHJhbnNpdGlvbi5qc1wiO1xuXG5zZWxlY3Rpb24ucHJvdG90eXBlLmludGVycnVwdCA9IHNlbGVjdGlvbl9pbnRlcnJ1cHQ7XG5zZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbjtcbiIsImV4cG9ydCBmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkge1xuICB0aGlzLmsgPSBrO1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLFxuICBzY2FsZTogZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBrID09PSAxID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rICogaywgdGhpcy54LCB0aGlzLnkpO1xuICB9LFxuICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICByZXR1cm4gW3BvaW50WzBdICogdGhpcy5rICsgdGhpcy54LCBwb2ludFsxXSAqIHRoaXMuayArIHRoaXMueV07XG4gIH0sXG4gIGFwcGx5WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54O1xuICB9LFxuICBhcHBseVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbihsb2NhdGlvbikge1xuICAgIHJldHVybiBbKGxvY2F0aW9uWzBdIC0gdGhpcy54KSAvIHRoaXMuaywgKGxvY2F0aW9uWzFdIC0gdGhpcy55KSAvIHRoaXMua107XG4gIH0sXG4gIGludmVydFg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gKHggLSB0aGlzLngpIC8gdGhpcy5rO1xuICB9LFxuICBpbnZlcnRZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuaztcbiAgfSxcbiAgcmVzY2FsZVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geC5jb3B5KCkuZG9tYWluKHgucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLCB0aGlzKS5tYXAoeC5pbnZlcnQsIHgpKTtcbiAgfSxcbiAgcmVzY2FsZVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geS5jb3B5KCkuZG9tYWluKHkucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLCB0aGlzKS5tYXAoeS5pbnZlcnQsIHkpKTtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIHRoaXMueCArIFwiLFwiICsgdGhpcy55ICsgXCIpIHNjYWxlKFwiICsgdGhpcy5rICsgXCIpXCI7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSBuZXcgVHJhbnNmb3JtKDEsIDAsIDApO1xuXG50cmFuc2Zvcm0ucHJvdG90eXBlID0gVHJhbnNmb3JtLnByb3RvdHlwZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUpIHtcbiAgd2hpbGUgKCFub2RlLl9fem9vbSkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIG5vZGUuX196b29tO1xufVxuIiwiXG4vKlxuICBIVERNYXRoIFN0YXRpYyBDbGFzcyAtIE5vdCBpbnRlbmRlZCBmb3IgaW5zdGFudGlhdGlvbiFcblxuICBNb2RlbCBwYXJhbWV0ZXJzOlxuICAgIGsgPSBkaXNjb3VudCBmYWN0b3IgKDAsIEluZmluaXR5KVxuXG4gIEJlaGF2aW9yYWwgdmFyaWFibGVzOlxuICAgIEEgPSBhbW91bnRcbiAgICBEID0gZGVsYXlcbiAgICBWID0gc3ViamVjdGl2ZSB2YWx1ZVxuXG4gIEVxdWF0aW9uczpcbiAgICBWID0gQSAvICgxICsga0QpXG4gICAgayA9IChBIC0gVikgLyAoVkQpXG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSFRETWF0aCB7XG4gIHN0YXRpYyBrID0ge1xuICAgIERFRkFVTFQ6IDAuMDUsXG4gICAgTUlOOiAwLFxuICAgIE1BWDogMTAwLFxuICAgIFNURVA6IDAuMDAxLFxuICAgIEpVTVA6IDAuMDEsXG4gIH07XG5cbiAgc3RhdGljIGFkazJ2KGEsIGQsIGspIHtcbiAgICByZXR1cm4gYSAvICgxICsgayAqIGQpO1xuICB9XG5cbiAgc3RhdGljIGFkdjJrKGEsIGQsIHYpIHtcbiAgICByZXR1cm4gKGEgLSB2KSAvICh2ICogZCk7XG4gIH1cbn1cbiIsIlxuLy8gSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG5pbXBvcnQgSFRETWF0aCBmcm9tICcuL2h0ZC1tYXRoJztcblxuZXhwb3J0IGRlZmF1bHQgSFRETWF0aDtcbiIsIi8qIGVzbGludCBuby1yZXN0cmljdGVkLWdsb2JhbHM6IFtcIm9mZlwiLCBcInNlbGZcIl0gKi9cblxuLy8gTmVlZGVkIGZvciBkMyBpbiBXZWJXb3JrZXIhXG5pbXBvcnQgJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZSc7XG5cbmltcG9ydCAqIGFzIEJheWVzRGlzdHJpYnV0aW9ucyBmcm9tICdiYXllcy5qcy9kaXN0cmlidXRpb25zJztcbmltcG9ydCAqIGFzIEJheWVzTWNtYyBmcm9tICdiYXllcy5qcy9tY21jJztcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCBIVERNYXRoIGZyb20gJ0BkZWNpZGFibGVzL2Rpc2NvdW50YWJsZS1tYXRoJztcblxuc2VsZi5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIGs6IHt0eXBlOiAncmVhbCcsIGxvd2VyOiBIVERNYXRoLmsuTUlOLCB1cHBlcjogSFRETWF0aC5rLk1BWH0sXG4gICAgbHVjZToge3R5cGU6ICdyZWFsJywgbG93ZXI6IDAsIHVwcGVyOiAxMDB9LFxuICB9O1xuXG4gIGNvbnN0IGxvZ1Bvc3QgPSAoc3RhdGUsIGRhdGEpID0+IHtcbiAgICBsZXQgbHAgPSAwO1xuXG4gICAgLy8gUHJpb3JzXG4gICAgY29uc3Qga01lYW4gPSAyO1xuICAgIGNvbnN0IGtTaGFwZSA9IDM7XG4gICAgbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLmdhbW1hKFxuICAgICAgc3RhdGUuayxcbiAgICAgIGtTaGFwZSxcbiAgICAgIGtTaGFwZSAvIGtNZWFuLFxuICAgICk7XG4gICAgLy8gbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLnVuaWYoc3RhdGUuaywgMCwgMTAwKTtcblxuICAgIGNvbnN0IGx1Y2VNZWFuID0gMjtcbiAgICBjb25zdCBsdWNlU2hhcGUgPSAzO1xuICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5nYW1tYShcbiAgICAgIHN0YXRlLmx1Y2UsXG4gICAgICBsdWNlU2hhcGUsXG4gICAgICBsdWNlU2hhcGUgLyBsdWNlTWVhbixcbiAgICApO1xuICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7XG5cbiAgICAvLyBMaWtlbGlob29kXG4gICAgZGF0YS5mb3JFYWNoKChjaG9pY2UpID0+IHtcbiAgICAgIC8vIFZhbHVlc1xuICAgICAgY29uc3QgdnMgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hcywgY2hvaWNlLmRzLCBzdGF0ZS5rKTtcbiAgICAgIGNvbnN0IHZsID0gSFRETWF0aC5hZGsydihjaG9pY2UuYWwsIGNob2ljZS5kbCwgc3RhdGUuayk7XG5cbiAgICAgIC8vIENob2ljZSBvZiBzb29uZXIgb3IgbGF0ZXIgaXMgc2FtcGxlZCBmcm9tIGEgQmVybm91bGxpIGRpc3RyaWJ1dGlvblxuICAgICAgLy8gTHVjZSBjaG9pY2UgcnVsZSBpcyB1c2VkIHRvIGNvbXB1dGUgcHJvYmFiaWxpdHkgb2Ygd2FpdGluZyEgKDAgPSBzb29uZXIsIDEgPSBsYXRlcilcbiAgICAgIGNvbnN0IGJpbnZhbCA9IDEgLyAoMSArIE1hdGguZXhwKHN0YXRlLmx1Y2UgKiAodnMgLSB2bCkpKTtcblxuICAgICAgLy8gQWN0dWFsIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZSA9IChjaG9pY2UucmVzcG9uc2UgPT09ICdmaXJzdCcpID8gMCA6IDE7XG5cbiAgICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5iZXJuKHJlc3BvbnNlLCBiaW52YWwpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxwO1xuICB9O1xuXG4gIC8vIEluaXRpYWxpemluZyB0aGUgc2FtcGxlclxuICBjb25zdCBzYW1wbGVyID0gbmV3IEJheWVzTWNtYy5BbXdnU2FtcGxlcihwYXJhbXMsIGxvZ1Bvc3QsIGV2ZW50LmRhdGEpO1xuICAvLyBCdXJuaW5nIHNvbWUgc2FtcGxlcyB0byB0aGUgTUNNQyBnb2RzIGFuZCBzYW1wbGluZyA1MDAwIGRyYXdzXG4gIHNhbXBsZXIuYnVybigxMDAwKTtcbiAgY29uc3Qgc2FtcGxlcyA9IHNhbXBsZXIuc2FtcGxlKDUwMDApO1xuXG4gIC8vIEV4dHJhY3Qgc3VtbWFyeSBzdGF0c1xuICBjb25zdCByZXN1bHRzID0ge1xuICAgIGs6IGQzLm1lZGlhbihzYW1wbGVzLmspLFxuICAgIGx1Y2U6IGQzLm1lZGlhbihzYW1wbGVzLmx1Y2UpLFxuICB9O1xuXG4gIHNlbGYucG9zdE1lc3NhZ2Uoe3Jlc3VsdHM6IHJlc3VsdHMsIHNhbXBsZXM6IHNhbXBsZXN9KTtcbn07XG4iXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJtb2R1bGUiLCJleHBvcnRzIiwibGQiLCJ0aGlzIiwibGdhbW1hIiwieCIsImoiLCJjb2YiLCJzZXIiLCJ4eCIsInkiLCJ0bXAiLCJsb2ciLCJsZmFjdG9yaWFsIiwibiIsIk5hTiIsImxjaG9vc2UiLCJrIiwibGJldGEiLCJhIiwiYiIsIk1hdGgiLCJleHAiLCJhYnMiLCJwb3ciLCJzcXJ0IiwicGkiLCJQSSIsImJldGEiLCJzaGFwZTEiLCJzaGFwZTIiLCJJbmZpbml0eSIsImNhdWNoeSIsImxvY2F0aW9uIiwic2NhbGUiLCJub3JtIiwibWVhbiIsInNkIiwiYml2YXJub3JtIiwiY29yciIsInoiLCJub3JtYWxpemluZ19mYWN0b3IiLCJiaXZhcl9sb2dfZGVucyIsImxhcGxhY2UiLCJkZXhwIiwiZ2FtbWEiLCJzaGFwZSIsInJhdGUiLCJpbnZnYW1tYSIsImxub3JtIiwibWVhbmxvZyIsInNkbG9nIiwicGFyZXRvIiwidCIsImRmIiwid2VpYnVsbCIsInRtcDEiLCJ0bXAyIiwibG9naXMiLCJlIiwiZiIsImRpcmljaGxldCIsImFscGhhIiwic3VtX2FscGhhIiwic3VtX2xnYW1tYV9hbHBoYSIsInN1bV9hbHBoYV9zdWJfMV9sb2dfeCIsImxlbmd0aCIsImkiLCJ1bmlmIiwibWluIiwibWF4IiwiYmVybiIsInByb2IiLCJjYXQiLCJwcm9icyIsImJpbm9tIiwic2l6ZSIsIm5iaW5vbSIsImh5cGVyIiwibSIsInBvaXMiLCJsYW1iZGEiLCJtY21jIiwicnVuaWYiLCJyYW5kb20iLCJydW5pZl9kaXNjcmV0ZSIsImZsb29yIiwicm5vcm0iLCJ1IiwidiIsInEiLCJkZWVwX2Nsb25lIiwic3JjIiwibWl4aW4iLCJkZXN0Iiwic291cmNlIiwiY29weUZ1bmMiLCJuYW1lIiwicyIsImVtcHR5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwibm9kZVR5cGUiLCJjbG9uZU5vZGUiLCJEYXRlIiwiZ2V0VGltZSIsIlJlZ0V4cCIsInIiLCJsIiwiQXJyYXkiLCJwdXNoIiwiY29uc3RydWN0b3IiLCJjbG9uZV9wYXJhbV9kcmF3IiwiaXNBcnJheSIsInhfY29weSIsInNsaWNlIiwiaXNfbnVtYmVyIiwib2JqZWN0IiwiTnVtYmVyIiwiY3JlYXRlX2FycmF5IiwiZGltIiwiaW5pdCIsImFyciIsImFycmF5X2RpbSIsImNvbmNhdCIsImFycmF5X2VxdWFsIiwiYTEiLCJhMiIsIm5lc3RlZF9hcnJheV9hcHBseSIsImZ1biIsInJlc3VsdCIsInNodWZmbGVfYXJyYXkiLCJhcnJheSIsInRlbXAiLCJuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5IiwibGVuIiwiYXJyYXlfaXMiLCJhcnJheV9pIiwiZ2V0X29wdGlvbiIsIm9wdGlvbl9uYW1lIiwib3B0aW9ucyIsImRlZmF1bF92YWx1ZSIsImhhc093blByb3BlcnR5IiwidW5kZWZpbmVkIiwiZ2V0X211bHRpZGltX29wdGlvbiIsInZhbHVlIiwicGFyYW1faW5pdF9maXhlZCIsInR5cGUiLCJsb3dlciIsInVwcGVyIiwicm91bmQiLCJjb21wbGV0ZV9wYXJhbXMiLCJwYXJhbXNfdG9fY29tcGxldGUiLCJwYXJhbV9pbml0IiwicGFyYW1zIiwicGFyYW1fbmFtZSIsInBhcmFtIiwiU3RlcHBlciIsInN0YXRlIiwibG9nX3Bvc3QiLCJzdGVwIiwic3RhcnRfYWRhcHRhdGlvbiIsInN0b3BfYWRhcHRhdGlvbiIsImluZm8iLCJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciIsImdlbmVyYXRlX3Byb3Bvc2FsIiwicGFyYW1fbmFtZXMiLCJrZXlzIiwicHJvcF9sb2dfc2NhbGUiLCJiYXRjaF9zaXplIiwibWF4X2FkYXB0YXRpb24iLCJpbml0aWFsX2FkYXB0YXRpb24iLCJ0YXJnZXRfYWNjZXB0X3JhdGUiLCJpc19hZGFwdGluZyIsImFjY2VwdGFuY2VfY291bnQiLCJiYXRjaF9jb3VudCIsIml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24iLCJjcmVhdGUiLCJwYXJhbV9zdGF0ZSIsInBhcmFtX3Byb3Bvc2FsIiwiY3Vycl9sb2dfZGVucyIsInByb3BfbG9nX2RlbnMiLCJhY2NlcHRfcHJvYiIsImxvZ19zZF9hZGp1c3RtZW50Iiwibm9ybWFsX3Byb3Bvc2FsIiwiUmVhbE1ldHJvcG9saXNTdGVwcGVyIiwiZGlzY3JldGVfbm9ybWFsX3Byb3Bvc2FsIiwiSW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiU3ViU3RlcHBlciIsImNyZWF0ZV9zdWJzdGVwcGVycyIsInN1YnN0YXRlIiwic3Vic3RlcHBlcnMiLCJzdWJvcHRpb25zIiwic3VicGFyYW0iLCJzdWJzdGVwcGVyIiwiTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiQmluYXJ5U3RlcHBlciIsInplcm9fbG9nX2RlbnMiLCJvbmVfbG9nX2RlbnMiLCJtYXhfbG9nX2RlbnMiLCJ6ZXJvX3Byb2IiLCJCaW5hcnlDb21wb25lbnRTdGVwcGVyIiwic3VicGFyYW1zIiwiQW13Z1N0ZXBwZXIiLCJTZWxlY3RTdGVwcGVyIiwicGFyYW1fb2JqZWN0X3dyYXAiLCJwYXJhbV9vcHRpb25zIiwiU2FtcGxlciIsImRhdGEiLCJwYXJhbV9pbml0X2Z1biIsInRoaW5uaW5nX2ludGVydmFsIiwicGFyYW1zX3RvX21vbml0b3IiLCJ0aGluIiwibW9uaXRvciIsInN0ZXBwZXJzIiwiY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUiLCJzYW1wbGUiLCJuX2l0ZXJhdGlvbnMiLCJtb25pdG9yZWRfcGFyYW1zIiwiY3Vycl9zYW1wbGUiLCJidXJuIiwiQW13Z1NhbXBsZXIiLCJhc2NlbmRpbmciLCJudW1iZXJzIiwidmFsdWVzIiwidmFsdWVvZiIsImNvbXBhcmVEZWZpbmVkIiwiY29tcGFyZSIsImFzY2VuZGluZ0RlZmluZWQiLCJUeXBlRXJyb3IiLCJxdWlja3NlbGVjdCIsImxlZnQiLCJyaWdodCIsIm5ld0xlZnQiLCJuZXdSaWdodCIsInN3YXAiLCJxdWFudGlsZSIsInAiLCJGbG9hdDY0QXJyYXkiLCJmcm9tIiwiaXNOYU4iLCJpMCIsInZhbHVlMCIsInN1YmFycmF5IiwidmFsdWUxIiwibWVkaWFuIiwibm9vcCIsImRpc3BhdGNoIiwiYXJndW1lbnRzIiwiXyIsInRlc3QiLCJFcnJvciIsIkRpc3BhdGNoIiwicGFyc2VUeXBlbmFtZXMiLCJ0eXBlbmFtZXMiLCJ0eXBlcyIsInRyaW0iLCJzcGxpdCIsIm1hcCIsImluZGV4T2YiLCJvbiIsInR5cGVuYW1lIiwiY2FsbGJhY2siLCJUIiwiZ2V0Iiwic2V0IiwiY29weSIsInRoYXQiLCJhcmdzIiwiYXBwbHkiLCJjIiwieGh0bWwiLCJzdmciLCJ4bGluayIsInhtbCIsInhtbG5zIiwicHJlZml4IiwibmFtZXNwYWNlcyIsInNwYWNlIiwibG9jYWwiLCJjcmVhdG9ySW5oZXJpdCIsImRvY3VtZW50Iiwib3duZXJEb2N1bWVudCIsInVyaSIsIm5hbWVzcGFjZVVSSSIsImRvY3VtZW50RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjcmVhdGVFbGVtZW50TlMiLCJjcmVhdG9yRml4ZWQiLCJmdWxsbmFtZSIsIm5hbWVzcGFjZSIsIm5vbmUiLCJzZWxlY3RvciIsInF1ZXJ5U2VsZWN0b3IiLCJzZWxlY3QiLCJncm91cHMiLCJfZ3JvdXBzIiwic3ViZ3JvdXBzIiwiZ3JvdXAiLCJzdWJncm91cCIsIm5vZGUiLCJzdWJub2RlIiwiX19kYXRhX18iLCJTZWxlY3Rpb24iLCJfcGFyZW50cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJhcnJheUFsbCIsInNlbGVjdG9yQWxsIiwicGFyZW50cyIsIm1hdGNoZXMiLCJjaGlsZE1hdGNoZXIiLCJmaW5kIiwiY2hpbGRGaW5kIiwibWF0Y2giLCJjaGlsZHJlbiIsImNoaWxkRmlyc3QiLCJmaXJzdEVsZW1lbnRDaGlsZCIsImZpbHRlciIsImNoaWxkcmVuRmlsdGVyIiwic2VsZWN0QWxsIiwibWF0Y2hlciIsInVwZGF0ZSIsIl9lbnRlciIsInNwYXJzZSIsIkVudGVyTm9kZSIsInBhcmVudCIsImRhdHVtIiwiX25leHQiLCJfcGFyZW50IiwiYXBwZW5kQ2hpbGQiLCJjaGlsZCIsImluc2VydEJlZm9yZSIsIm5leHQiLCJiaW5kSW5kZXgiLCJlbnRlciIsImV4aXQiLCJncm91cExlbmd0aCIsImRhdGFMZW5ndGgiLCJiaW5kS2V5Iiwia2V5Iiwibm9kZUJ5S2V5VmFsdWUiLCJNYXAiLCJrZXlWYWx1ZXMiLCJrZXlWYWx1ZSIsImhhcyIsImRlbGV0ZSIsImJpbmQiLCJjb25zdGFudCIsImFycmF5bGlrZSIsImVudGVyR3JvdXAiLCJ1cGRhdGVHcm91cCIsImV4aXRHcm91cCIsImkxIiwicHJldmlvdXMiLCJfZXhpdCIsIm9uZW50ZXIiLCJvbnVwZGF0ZSIsIm9uZXhpdCIsInNlbGVjdGlvbiIsImFwcGVuZCIsInJlbW92ZSIsIm1lcmdlIiwib3JkZXIiLCJjb250ZXh0IiwiZ3JvdXBzMCIsImdyb3VwczEiLCJtMCIsIm0xIiwibWVyZ2VzIiwiZ3JvdXAwIiwiZ3JvdXAxIiwiY29tcGFyZURvY3VtZW50UG9zaXRpb24iLCJwYXJlbnROb2RlIiwiY29tcGFyZU5vZGUiLCJzb3J0Z3JvdXBzIiwic29ydGdyb3VwIiwic29ydCIsImF0dHJSZW1vdmUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJhdHRyUmVtb3ZlTlMiLCJyZW1vdmVBdHRyaWJ1dGVOUyIsImF0dHJDb25zdGFudCIsInNldEF0dHJpYnV0ZSIsImF0dHJDb25zdGFudE5TIiwic2V0QXR0cmlidXRlTlMiLCJhdHRyRnVuY3Rpb24iLCJhdHRyRnVuY3Rpb25OUyIsImdldEF0dHJpYnV0ZU5TIiwiZ2V0QXR0cmlidXRlIiwiZWFjaCIsImRlZmF1bHRWaWV3Iiwic3R5bGVSZW1vdmUiLCJzdHlsZSIsInJlbW92ZVByb3BlcnR5Iiwic3R5bGVDb25zdGFudCIsInByaW9yaXR5Iiwic2V0UHJvcGVydHkiLCJzdHlsZUZ1bmN0aW9uIiwic3R5bGVWYWx1ZSIsImdldFByb3BlcnR5VmFsdWUiLCJnZXRDb21wdXRlZFN0eWxlIiwicHJvcGVydHlSZW1vdmUiLCJwcm9wZXJ0eUNvbnN0YW50IiwicHJvcGVydHlGdW5jdGlvbiIsImNsYXNzQXJyYXkiLCJzdHJpbmciLCJjbGFzc0xpc3QiLCJDbGFzc0xpc3QiLCJfbm9kZSIsIl9uYW1lcyIsImFkZCIsImpvaW4iLCJzcGxpY2UiLCJjb250YWlucyIsImNsYXNzZWRBZGQiLCJuYW1lcyIsImxpc3QiLCJjbGFzc2VkUmVtb3ZlIiwiY2xhc3NlZFRydWUiLCJjbGFzc2VkRmFsc2UiLCJjbGFzc2VkRnVuY3Rpb24iLCJ0ZXh0UmVtb3ZlIiwidGV4dENvbnRlbnQiLCJ0ZXh0Q29uc3RhbnQiLCJ0ZXh0RnVuY3Rpb24iLCJodG1sUmVtb3ZlIiwiaW5uZXJIVE1MIiwiaHRtbENvbnN0YW50IiwiaHRtbEZ1bmN0aW9uIiwicmFpc2UiLCJuZXh0U2libGluZyIsInByZXZpb3VzU2libGluZyIsImZpcnN0Q2hpbGQiLCJjcmVhdG9yIiwiY29uc3RhbnROdWxsIiwiYmVmb3JlIiwicmVtb3ZlQ2hpbGQiLCJzZWxlY3Rpb25fY2xvbmVTaGFsbG93IiwiY2xvbmUiLCJzZWxlY3Rpb25fY2xvbmVEZWVwIiwiZGVlcCIsInByb3BlcnR5IiwiY29udGV4dExpc3RlbmVyIiwibGlzdGVuZXIiLCJldmVudCIsIm9uUmVtb3ZlIiwiX19vbiIsIm8iLCJyZW1vdmVFdmVudExpc3RlbmVyIiwib25BZGQiLCJhZGRFdmVudExpc3RlbmVyIiwiZGlzcGF0Y2hFdmVudCIsIndpbmRvdyIsIkN1c3RvbUV2ZW50IiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJidWJibGVzIiwiY2FuY2VsYWJsZSIsImRldGFpbCIsImRpc3BhdGNoQ29uc3RhbnQiLCJkaXNwYXRjaEZ1bmN0aW9uIiwic2VsZWN0aW9uX3NlbGVjdGlvbiIsInNlbGVjdGlvbl9zZWxlY3QiLCJzZWxlY3Rpb25fc2VsZWN0QWxsIiwic2VsZWN0Q2hpbGQiLCJzZWxlY3Rpb25fc2VsZWN0Q2hpbGQiLCJzZWxlY3RDaGlsZHJlbiIsInNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbiIsInNlbGVjdGlvbl9maWx0ZXIiLCJzZWxlY3Rpb25fZGF0YSIsInNlbGVjdGlvbl9lbnRlciIsInNlbGVjdGlvbl9leGl0Iiwic2VsZWN0aW9uX2pvaW4iLCJzZWxlY3Rpb25fbWVyZ2UiLCJzZWxlY3Rpb25fb3JkZXIiLCJzZWxlY3Rpb25fc29ydCIsInNlbGVjdGlvbl9jYWxsIiwibm9kZXMiLCJzZWxlY3Rpb25fbm9kZXMiLCJzZWxlY3Rpb25fbm9kZSIsInNlbGVjdGlvbl9zaXplIiwic2VsZWN0aW9uX2VtcHR5Iiwic2VsZWN0aW9uX2VhY2giLCJhdHRyIiwic2VsZWN0aW9uX2F0dHIiLCJzZWxlY3Rpb25fc3R5bGUiLCJzZWxlY3Rpb25fcHJvcGVydHkiLCJjbGFzc2VkIiwic2VsZWN0aW9uX2NsYXNzZWQiLCJ0ZXh0Iiwic2VsZWN0aW9uX3RleHQiLCJodG1sIiwic2VsZWN0aW9uX2h0bWwiLCJzZWxlY3Rpb25fcmFpc2UiLCJzZWxlY3Rpb25fbG93ZXIiLCJzZWxlY3Rpb25fYXBwZW5kIiwiaW5zZXJ0Iiwic2VsZWN0aW9uX2luc2VydCIsInNlbGVjdGlvbl9yZW1vdmUiLCJzZWxlY3Rpb25fY2xvbmUiLCJzZWxlY3Rpb25fZGF0dW0iLCJzZWxlY3Rpb25fb24iLCJzZWxlY3Rpb25fZGlzcGF0Y2giLCJTeW1ib2wiLCJpdGVyYXRvciIsInNlbGVjdGlvbl9pdGVyYXRvciIsImV4dGVuZCIsImRlZmluaXRpb24iLCJDb2xvciIsImRhcmtlciIsImJyaWdodGVyIiwicmVJIiwicmVOIiwicmVQIiwicmVIZXgiLCJyZVJnYkludGVnZXIiLCJyZVJnYlBlcmNlbnQiLCJyZVJnYmFJbnRlZ2VyIiwicmVSZ2JhUGVyY2VudCIsInJlSHNsUGVyY2VudCIsInJlSHNsYVBlcmNlbnQiLCJuYW1lZCIsImFsaWNlYmx1ZSIsImFudGlxdWV3aGl0ZSIsImFxdWEiLCJhcXVhbWFyaW5lIiwiYXp1cmUiLCJiZWlnZSIsImJpc3F1ZSIsImJsYWNrIiwiYmxhbmNoZWRhbG1vbmQiLCJibHVlIiwiYmx1ZXZpb2xldCIsImJyb3duIiwiYnVybHl3b29kIiwiY2FkZXRibHVlIiwiY2hhcnRyZXVzZSIsImNob2NvbGF0ZSIsImNvcmFsIiwiY29ybmZsb3dlcmJsdWUiLCJjb3Juc2lsayIsImNyaW1zb24iLCJjeWFuIiwiZGFya2JsdWUiLCJkYXJrY3lhbiIsImRhcmtnb2xkZW5yb2QiLCJkYXJrZ3JheSIsImRhcmtncmVlbiIsImRhcmtncmV5IiwiZGFya2toYWtpIiwiZGFya21hZ2VudGEiLCJkYXJrb2xpdmVncmVlbiIsImRhcmtvcmFuZ2UiLCJkYXJrb3JjaGlkIiwiZGFya3JlZCIsImRhcmtzYWxtb24iLCJkYXJrc2VhZ3JlZW4iLCJkYXJrc2xhdGVibHVlIiwiZGFya3NsYXRlZ3JheSIsImRhcmtzbGF0ZWdyZXkiLCJkYXJrdHVycXVvaXNlIiwiZGFya3Zpb2xldCIsImRlZXBwaW5rIiwiZGVlcHNreWJsdWUiLCJkaW1ncmF5IiwiZGltZ3JleSIsImRvZGdlcmJsdWUiLCJmaXJlYnJpY2siLCJmbG9yYWx3aGl0ZSIsImZvcmVzdGdyZWVuIiwiZnVjaHNpYSIsImdhaW5zYm9ybyIsImdob3N0d2hpdGUiLCJnb2xkIiwiZ29sZGVucm9kIiwiZ3JheSIsImdyZWVuIiwiZ3JlZW55ZWxsb3ciLCJncmV5IiwiaG9uZXlkZXciLCJob3RwaW5rIiwiaW5kaWFucmVkIiwiaW5kaWdvIiwiaXZvcnkiLCJraGFraSIsImxhdmVuZGVyIiwibGF2ZW5kZXJibHVzaCIsImxhd25ncmVlbiIsImxlbW9uY2hpZmZvbiIsImxpZ2h0Ymx1ZSIsImxpZ2h0Y29yYWwiLCJsaWdodGN5YW4iLCJsaWdodGdvbGRlbnJvZHllbGxvdyIsImxpZ2h0Z3JheSIsImxpZ2h0Z3JlZW4iLCJsaWdodGdyZXkiLCJsaWdodHBpbmsiLCJsaWdodHNhbG1vbiIsImxpZ2h0c2VhZ3JlZW4iLCJsaWdodHNreWJsdWUiLCJsaWdodHNsYXRlZ3JheSIsImxpZ2h0c2xhdGVncmV5IiwibGlnaHRzdGVlbGJsdWUiLCJsaWdodHllbGxvdyIsImxpbWUiLCJsaW1lZ3JlZW4iLCJsaW5lbiIsIm1hZ2VudGEiLCJtYXJvb24iLCJtZWRpdW1hcXVhbWFyaW5lIiwibWVkaXVtYmx1ZSIsIm1lZGl1bW9yY2hpZCIsIm1lZGl1bXB1cnBsZSIsIm1lZGl1bXNlYWdyZWVuIiwibWVkaXVtc2xhdGVibHVlIiwibWVkaXVtc3ByaW5nZ3JlZW4iLCJtZWRpdW10dXJxdW9pc2UiLCJtZWRpdW12aW9sZXRyZWQiLCJtaWRuaWdodGJsdWUiLCJtaW50Y3JlYW0iLCJtaXN0eXJvc2UiLCJtb2NjYXNpbiIsIm5hdmFqb3doaXRlIiwibmF2eSIsIm9sZGxhY2UiLCJvbGl2ZSIsIm9saXZlZHJhYiIsIm9yYW5nZSIsIm9yYW5nZXJlZCIsIm9yY2hpZCIsInBhbGVnb2xkZW5yb2QiLCJwYWxlZ3JlZW4iLCJwYWxldHVycXVvaXNlIiwicGFsZXZpb2xldHJlZCIsInBhcGF5YXdoaXAiLCJwZWFjaHB1ZmYiLCJwZXJ1IiwicGluayIsInBsdW0iLCJwb3dkZXJibHVlIiwicHVycGxlIiwicmViZWNjYXB1cnBsZSIsInJlZCIsInJvc3licm93biIsInJveWFsYmx1ZSIsInNhZGRsZWJyb3duIiwic2FsbW9uIiwic2FuZHlicm93biIsInNlYWdyZWVuIiwic2Vhc2hlbGwiLCJzaWVubmEiLCJzaWx2ZXIiLCJza3libHVlIiwic2xhdGVibHVlIiwic2xhdGVncmF5Iiwic2xhdGVncmV5Iiwic25vdyIsInNwcmluZ2dyZWVuIiwic3RlZWxibHVlIiwidGFuIiwidGVhbCIsInRoaXN0bGUiLCJ0b21hdG8iLCJ0dXJxdW9pc2UiLCJ2aW9sZXQiLCJ3aGVhdCIsIndoaXRlIiwid2hpdGVzbW9rZSIsInllbGxvdyIsInllbGxvd2dyZWVuIiwiZGVmaW5lIiwiY29sb3IiLCJjaGFubmVscyIsImFzc2lnbiIsImRpc3BsYXlhYmxlIiwicmdiIiwiaGV4IiwiY29sb3JfZm9ybWF0SGV4IiwiZm9ybWF0SGV4IiwiZm9ybWF0SGV4OCIsImNvbG9yX2Zvcm1hdEhleDgiLCJmb3JtYXRIc2wiLCJjb2xvcl9mb3JtYXRIc2wiLCJmb3JtYXRSZ2IiLCJjb2xvcl9mb3JtYXRSZ2IiLCJoc2xDb252ZXJ0IiwiZm9ybWF0IiwidG9Mb3dlckNhc2UiLCJleGVjIiwicGFyc2VJbnQiLCJyZ2JuIiwiUmdiIiwicmdiYSIsImhzbGEiLCJnIiwicmdiQ29udmVydCIsIm9wYWNpdHkiLCJjbGFtcCIsImNsYW1waSIsImNsYW1wYSIsInJnYl9mb3JtYXRIZXgiLCJyZ2JfZm9ybWF0SGV4OCIsInJnYl9mb3JtYXRSZ2IiLCJoIiwiSHNsIiwiaHNsIiwibTIiLCJoc2wycmdiIiwiY2xhbXBoIiwiY2xhbXB0IiwibGluZWFyIiwiZCIsImV4cG9uZW50aWFsIiwibm9nYW1tYSIsInJnYkdhbW1hIiwic3RhcnQiLCJlbmQiLCJjb2xvclJnYiIsInJlQSIsInJlQiIsInplcm8iLCJvbmUiLCJiaSIsImxhc3RJbmRleCIsImFtIiwiYm0iLCJicyIsImluZGV4IiwibnVtYmVyIiwiZGVncmVlcyIsImlkZW50aXR5IiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJyb3RhdGUiLCJza2V3WCIsInNjYWxlWCIsInNjYWxlWSIsImF0YW4yIiwiYXRhbiIsInN2Z05vZGUiLCJwYXJzZUNzcyIsIkRPTU1hdHJpeCIsIldlYktpdENTU01hdHJpeCIsImlzSWRlbnRpdHkiLCJkZWNvbXBvc2UiLCJwYXJzZVN2ZyIsInRyYW5zZm9ybSIsImJhc2VWYWwiLCJjb25zb2xpZGF0ZSIsIm1hdHJpeCIsImludGVycG9sYXRlVHJhbnNmb3JtIiwicGFyc2UiLCJweENvbW1hIiwicHhQYXJlbiIsImRlZ1BhcmVuIiwicG9wIiwidHJhbnNsYXRlIiwieGEiLCJ5YSIsInhiIiwieWIiLCJpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyIsImludGVycG9sYXRlVHJhbnNmb3JtU3ZnIiwiZnJhbWUiLCJ0aW1lb3V0IiwiaW50ZXJ2YWwiLCJwb2tlRGVsYXkiLCJ0YXNrSGVhZCIsInRhc2tUYWlsIiwiY2xvY2tMYXN0IiwiY2xvY2tOb3ciLCJjbG9ja1NrZXciLCJjbG9jayIsInBlcmZvcm1hbmNlIiwibm93Iiwic2V0RnJhbWUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJzZXRUaW1lb3V0IiwiY2xlYXJOb3ciLCJUaW1lciIsIl9jYWxsIiwiX3RpbWUiLCJ0aW1lciIsInJlc3RhcnQiLCJkZWxheSIsInRpbWUiLCJzbGVlcCIsInN0b3AiLCJ0aW1lckZsdXNoIiwid2FrZSIsIm5hcCIsInBva2UiLCJ0MCIsInQxIiwidDIiLCJjbGVhclRpbWVvdXQiLCJjbGVhckludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJlbGFwc2VkIiwiZW1wdHlPbiIsImVtcHR5VHdlZW4iLCJDUkVBVEVEIiwiU0NIRURVTEVEIiwiU1RBUlRJTkciLCJTVEFSVEVEIiwiUlVOTklORyIsIkVORElORyIsIkVOREVEIiwiaWQiLCJ0aW1pbmciLCJzY2hlZHVsZXMiLCJfX3RyYW5zaXRpb24iLCJ0d2VlbiIsImR1cmF0aW9uIiwiZWFzZSIsInNjaGVkdWxlIiwic2VsZiIsInRpY2siLCJhY3RpdmUiLCJpbnRlcnJ1cHQiLCJ0d2VlblJlbW92ZSIsInR3ZWVuMCIsInR3ZWVuMSIsInR3ZWVuRnVuY3Rpb24iLCJfaWQiLCJ0d2VlblZhbHVlIiwidHJhbnNpdGlvbiIsImludGVycG9sYXRlTnVtYmVyIiwiaW50ZXJwb2xhdGVSZ2IiLCJpbnRlcnBvbGF0ZVN0cmluZyIsImludGVycG9sYXRlIiwic3RyaW5nMDAiLCJzdHJpbmcxIiwiaW50ZXJwb2xhdGUwIiwic3RyaW5nMCIsInN0cmluZzEwIiwiYXR0clR3ZWVuIiwiYXR0ckludGVycG9sYXRlIiwiYXR0ckludGVycG9sYXRlTlMiLCJhdHRyVHdlZW5OUyIsIl92YWx1ZSIsImRlbGF5RnVuY3Rpb24iLCJkZWxheUNvbnN0YW50IiwiZHVyYXRpb25GdW5jdGlvbiIsImR1cmF0aW9uQ29uc3RhbnQiLCJlYXNlQ29uc3RhbnQiLCJlYXNlVmFyeWluZyIsIlRyYW5zaXRpb24iLCJfbmFtZSIsImV2ZXJ5Iiwib25GdW5jdGlvbiIsIm9uMCIsIm9uMSIsInNpdCIsInJlbW92ZUZ1bmN0aW9uIiwiaW5oZXJpdCIsInN0eWxlTnVsbCIsInN0eWxlTWF5YmVSZW1vdmUiLCJsaXN0ZW5lcjAiLCJzdHlsZVR3ZWVuIiwic3R5bGVJbnRlcnBvbGF0ZSIsInRleHRJbnRlcnBvbGF0ZSIsInRleHRUd2VlbiIsImlkMCIsImlkMSIsIm5ld0lkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJjYW5jZWwiLCJzZWxlY3Rpb25fcHJvdG90eXBlIiwidHJhbnNpdGlvbl9zZWxlY3QiLCJ0cmFuc2l0aW9uX3NlbGVjdEFsbCIsInRyYW5zaXRpb25fZmlsdGVyIiwidHJhbnNpdGlvbl9tZXJnZSIsInRyYW5zaXRpb25fc2VsZWN0aW9uIiwidHJhbnNpdGlvbl90cmFuc2l0aW9uIiwidHJhbnNpdGlvbl9vbiIsInRyYW5zaXRpb25fYXR0ciIsInRyYW5zaXRpb25fYXR0clR3ZWVuIiwidHJhbnNpdGlvbl9zdHlsZSIsInRyYW5zaXRpb25fc3R5bGVUd2VlbiIsInRyYW5zaXRpb25fdGV4dCIsInRyYW5zaXRpb25fdGV4dFR3ZWVuIiwidHJhbnNpdGlvbl9yZW1vdmUiLCJ0cmFuc2l0aW9uX3R3ZWVuIiwidHJhbnNpdGlvbl9kZWxheSIsInRyYW5zaXRpb25fZHVyYXRpb24iLCJ0cmFuc2l0aW9uX2Vhc2UiLCJ0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nIiwidHJhbnNpdGlvbl9lbmQiLCJjdWJpY0luT3V0IiwiZGVmYXVsdFRpbWluZyIsImVhc2VDdWJpY0luT3V0Iiwic2VsZWN0aW9uX2ludGVycnVwdCIsInNlbGVjdGlvbl90cmFuc2l0aW9uIiwiVHJhbnNmb3JtIiwicG9pbnQiLCJhcHBseVgiLCJhcHBseVkiLCJpbnZlcnQiLCJpbnZlcnRYIiwiaW52ZXJ0WSIsInJlc2NhbGVYIiwiZG9tYWluIiwicmFuZ2UiLCJyZXNjYWxlWSIsIkhURE1hdGgiLCJERUZBVUxUIiwiTUlOIiwiTUFYIiwiU1RFUCIsIkpVTVAiLCJhZGsydiIsImFkdjJrIiwib25tZXNzYWdlIiwibHVjZSIsImxvZ1Bvc3QiLCJscCIsImtNZWFuIiwia1NoYXBlIiwiQmF5ZXNEaXN0cmlidXRpb25zIiwibHVjZU1lYW4iLCJsdWNlU2hhcGUiLCJmb3JFYWNoIiwiY2hvaWNlIiwidnMiLCJhcyIsImRzIiwidmwiLCJhbCIsImRsIiwiYmludmFsIiwicmVzcG9uc2UiLCJzYW1wbGVyIiwiQmF5ZXNNY21jIiwic2FtcGxlcyIsInJlc3VsdHMiLCJkMyIsInBvc3RNZXNz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Q0FBQ1EsUUFBUSxLQUFLLE9BQU8sR0FBSSxDQUFDLEdBQUcsQ0FBQztRQUV0RGYsRUFBRSxJQUFJRyx5QkFBdUIsQ0FBQ1ksUUFBUSxFQUFFRCxNQUFNLENBQUM7RUFDakQsS0FBQyxDQUFDO0VBRUYsSUFBQSxPQUFPZCxFQUFFO0tBQ1Y7O0VBRUQ7RUFDQSxFQUFBLE1BQU1nQixPQUFPLEdBQUcsSUFBSUMsdUJBQXFCLENBQUMvd0IsTUFBTSxFQUFFNnZCLE9BQU8sRUFBRXpkLEtBQUssQ0FBQzVPLElBQUksQ0FBQztFQUN0RTtFQUNBc3RCLEVBQUFBLE9BQU8sQ0FBQzFzQixJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ2xCLEVBQUEsTUFBTTRzQixPQUFPLEdBQUdGLE9BQU8sQ0FBQzlzQixNQUFNLENBQUMsSUFBSSxDQUFDOztFQUVwQztFQUNBLEVBQUEsTUFBTWl0QixPQUFPLEdBQUc7TUFDZDU1QixDQUFDLEVBQUU2NUIsTUFBUyxDQUFDRixPQUFPLENBQUMzNUIsQ0FBQyxDQUFDO0VBQ3ZCdTRCLElBQUFBLElBQUksRUFBRXNCLE1BQVMsQ0FBQ0YsT0FBTyxDQUFDcEIsSUFBSTtLQUM3QjtJQUVEcEcsSUFBSSxDQUFDMkgsV0FBVyxDQUFDO0VBQUNGLElBQUFBLE9BQU8sRUFBRUEsT0FBTztFQUFFRCxJQUFBQSxPQUFPLEVBQUVBO0VBQU8sR0FBQyxDQUFDO0VBQ3hELENBQUM7Ozs7OzsiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5MSw5Miw5Myw5NCw5NSw5Nl19');
22857
+ var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIGRpc3RyaWJ1dGlvbnMkMSA9IHtleHBvcnRzOiB7fX07CgogIHZhciBkaXN0cmlidXRpb25zID0gZGlzdHJpYnV0aW9ucyQxLmV4cG9ydHM7CiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKCiAgICAvLyBBIG51bWJlciBvZiBsb2cgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbnMgKFBERikuIE5hbWluZyBhbmQgcGFyYW1ldGVyaXphdGlvbgogICAgLy8gc2hvdWxkIG1hdGNoIFIncywgZXhjZXB0IGZvciB0aGF0IGFsbCBmdW5jdGlvbnMgcmVzaWRlIGluIGFuIGxkIG9iamVjdCAoCiAgICAvLyBhcyBpbiAibG9nIGRlbnNpdHkiKSwgc28gdG8gZ2V0IGEgbm9ybWFsIGxvZyBkZW5zaXR5IHlvdSB3b3VsZCB3cml0ZQogICAgLy8gbGQubm9ybSguLi4pLgogICAgLy8gTW9zdCBvZiB0aGUgY29kZSBiZWxvdyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBncmVhdCBKc3RhdCBwcm9qZWN0CiAgICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0Lykgd2hpY2ggaW5jbHVkZXMgUERGIGZvciBtYW55IGNvbW1vbiBwcm9iYWJpbGl0eQogICAgLy8gZGlzdHJpYnV0aW9ucy4gV2hhdCBJIGhhdmUgZG9uZSBpcyBvbmx5IHRvIGNvbnZlcnQgdGhlc2UgdG8gbG9nIFBERnMuCgogICAgLyoKICAgIE9yaWdpbmFsIHdvcmsgQ29weXJpZ2h0IChjKSAyMDEzIGpTdGF0CiAgICBNb2RpZmllZCB3b3JrIENvcHlyaWdodCAoYykgMjAxNSBSYXNtdXMgQsOlw6V0aCAKICAgIAlQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAgICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAogICAgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwogICAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogICAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiAgICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogICAgCVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCiAgICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICAgIAlUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogICAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICAgIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCiAgICBUSEUgU09GVFdBUkUuCiAgICAJKi8KCiAgICAvLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbToKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanMKICAgIC8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLAogICAgLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuCiAgICAvLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWwKICAgIC8vIG9iamVjdCBsZCAuCiAgICAoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHsKICAgICAgaWYgKG1vZHVsZS5leHBvcnRzKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsCiAgICAgICAgLy8gbGlrZSBOb2RlLgogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpCiAgICAgICAgcm9vdC5sZCA9IGZhY3RvcnkoKTsKICAgICAgfQogICAgfSkoZGlzdHJpYnV0aW9ucywgZnVuY3Rpb24gKCkgewogICAgICAvLyBPYmplY3QgdG8gaG9sZCB0aGUgZnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkLgogICAgICB2YXIgbGQgPSB7fTsKCiAgICAgIC8vLy8vLy8vLy8gSGVscGVyIGZ1bmN0aW9ucyAvLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICB2YXIgbGdhbW1hID0gZnVuY3Rpb24gKHgpIHsKICAgICAgICB2YXIgaiA9IDA7CiAgICAgICAgdmFyIGNvZiA9IFs3Ni4xODAwOTE3Mjk0NzE0NiwgLTg2LjUwNTMyMDMyOTQxNjc4LCAyNC4wMTQwOTgyNDA4MzA5MSwgLTEuMjMxNzM5NTcyNDUwMTU1LCAwLjEyMDg2NTA5NzM4NjYxNzllLTIsIC01Mzk1MjM5Mzg0OTUzZS0xOF07CiAgICAgICAgdmFyIHNlciA9IDEuMDAwMDAwMDAwMTkwMDE1OwogICAgICAgIHZhciB4eCwgeSwgdG1wOwogICAgICAgIHRtcCA9ICh5ID0geHggPSB4KSArIDUuNTsKICAgICAgICB0bXAgLT0gKHh4ICsgMC41KSAqIGxvZyh0bXApOwogICAgICAgIGZvciAoOyBqIDwgNjsgaisrKSBzZXIgKz0gY29mW2pdIC8gKyt5OwogICAgICAgIHJldHVybiBsb2coMi41MDY2MjgyNzQ2MzEwMDA1ICogc2VyIC8geHgpIC0gdG1wOwogICAgICB9OwogICAgICBsZC5sZ2FtbWEgPSBsZ2FtbWE7CiAgICAgIHZhciBsZmFjdG9yaWFsID0gZnVuY3Rpb24gKG4pIHsKICAgICAgICByZXR1cm4gbiA8IDAgPyBOYU4gOiBsZ2FtbWEobiArIDEpOwogICAgICB9OwogICAgICBsZC5sZmFjdG9yaWFsID0gbGZhY3RvcmlhbDsKICAgICAgdmFyIGxjaG9vc2UgPSBmdW5jdGlvbiAobiwgaykgewogICAgICAgIHJldHVybiBsZmFjdG9yaWFsKG4pIC0gbGZhY3RvcmlhbChrKSAtIGxmYWN0b3JpYWwobiAtIGspOwogICAgICB9OwogICAgICBsZC5sY2hvb3NlID0gbGNob29zZTsKICAgICAgdmFyIGxiZXRhID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICByZXR1cm4gbGdhbW1hKGEpICsgbGdhbW1hKGIpIC0gbGdhbW1hKGEgKyBiKTsKICAgICAgfTsKICAgICAgbGQubGJldGEgPSBsYmV0YTsKICAgICAgdmFyIGxvZyA9IE1hdGgubG9nOwogICAgICB2YXIgZXhwID0gTWF0aC5leHA7CiAgICAgIHZhciBhYnMgPSBNYXRoLmFiczsKICAgICAgdmFyIHBvdyA9IE1hdGgucG93OwogICAgICB2YXIgc3FydCA9IE1hdGguc3FydDsKICAgICAgdmFyIHBpID0gTWF0aC5QSTsKCiAgICAgIC8vLy8vLy8vLy8gQ29udGlub3VzIGRpc3RyaWJ1dGlvbnMgLy8vLy8vLy8vLwogICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIGxkLmJldGEgPSBmdW5jdGlvbiAoeCwgc2hhcGUxLCBzaGFwZTIpIHsKICAgICAgICBpZiAoeCA+IDEgfHwgeCA8IDApIHsKICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7CiAgICAgICAgfQogICAgICAgIGlmIChzaGFwZTEgPT09IDEgJiYgc2hhcGUyID09PSAxKSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIChzaGFwZTEgLSAxKSAqIGxvZyh4KSArIChzaGFwZTIgLSAxKSAqIGxvZygxIC0geCkgLSBsYmV0YShzaGFwZTEsIHNoYXBlMik7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZC5jYXVjaHkgPSBmdW5jdGlvbiAoeCwgbG9jYXRpb24sIHNjYWxlKSB7CiAgICAgICAgcmV0dXJuIGxvZyhzY2FsZSkgLSBsb2cocG93KHggLSBsb2NhdGlvbiwgMikgKyBwb3coc2NhbGUsIDIpKSAtIGxvZyhwaSk7CiAgICAgIH07CiAgICAgIGxkLm5vcm0gPSBmdW5jdGlvbiAoeCwgbWVhbiwgc2QpIHsKICAgICAgICByZXR1cm4gLTAuNSAqIGxvZygyICogcGkpIC0gbG9nKHNkKSAtIHBvdyh4IC0gbWVhbiwgMikgLyAoMiAqIHNkICogc2QpOwogICAgICB9OwoKICAgICAgLy8gQSBiaXZhcmlhdGUgTm9ybWFsIGRpc3RyaWJ1dGlvbiBwYXJhbWV0ZXJpemVkIGJ5IGFycmF5cyBvZiB0d28gbWVhbnMgYW5kIFNEcywgYW5kIAogICAgICAvLyB0aGUgY29ycmVsYXRpb24uCiAgICAgIGxkLmJpdmFybm9ybSA9IGZ1bmN0aW9uICh4LCBtZWFuLCBzZCwgY29ycikgewogICAgICAgIHZhciB6ID0gcG93KHhbMF0gLSBtZWFuWzBdLCAyKSAvIHBvdyhzZFswXSwgMikgKyBwb3coeFsxXSAtIG1lYW5bMV0sIDIpIC8gcG93KHNkWzFdLCAyKSAtIDIgKiBjb3JyICogKHhbMF0gLSBtZWFuWzBdKSAqICh4WzFdIC0gbWVhblsxXSkgLyAoc2RbMF0gKiBzZFsxXSk7CiAgICAgICAgdmFyIG5vcm1hbGl6aW5nX2ZhY3RvciA9IC0obG9nKDIpICsgbG9nKHBpKSArIGxvZyhzZFswXSkgKyBsb2coc2RbMV0pICsgMC41ICogbG9nKDEgLSBwb3coY29yciwgMikpKTsKICAgICAgICB2YXIgYml2YXJfbG9nX2RlbnMgPSBub3JtYWxpemluZ19mYWN0b3IgLSB6IC8gKDIgKiAoMSAtIHBvdyhjb3JyLCAyKSkpOwogICAgICAgIHJldHVybiBiaXZhcl9sb2dfZGVuczsKICAgICAgfTsKICAgICAgbGQubGFwbGFjZSA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKICAgICAgICByZXR1cm4gLWFicyh4IC0gbG9jYXRpb24pIC8gc2NhbGUgLSBsb2coMiAqIHNjYWxlKTsKICAgICAgfTsKICAgICAgbGQuZGV4cCA9IGxkLmxhcGxhY2U7CiAgICAgIGxkLmdhbW1hID0gZnVuY3Rpb24gKHgsIHNoYXBlLCByYXRlKSB7CiAgICAgICAgdmFyIHNjYWxlID0gMSAvIHJhdGU7CiAgICAgICAgaWYgKHggPCAwKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0KICAgICAgICBpZiAoeCA9PT0gMCAmJiBzaGFwZSA9PT0gMSkgewogICAgICAgICAgcmV0dXJuIC1sb2coc2NhbGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gKHNoYXBlIC0gMSkgKiBsb2coeCkgLSB4IC8gc2NhbGUgLSBsZ2FtbWEoc2hhcGUpIC0gc2hhcGUgKiBsb2coc2NhbGUpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgbGQuaW52Z2FtbWEgPSBmdW5jdGlvbiAoeCwgc2hhcGUsIHNjYWxlKSB7CiAgICAgICAgaWYgKHggPD0gMCkgewogICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIC0oc2hhcGUgKyAxKSAqIGxvZyh4KSAtIHNjYWxlIC8geCAtIGxnYW1tYShzaGFwZSkgKyBzaGFwZSAqIGxvZyhzY2FsZSk7CiAgICAgIH07CiAgICAgIGxkLmxub3JtID0gZnVuY3Rpb24gKHgsIG1lYW5sb2csIHNkbG9nKSB7CiAgICAgICAgaWYgKHggPD0gMCkgewogICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIC1sb2coeCkgLSAwLjUgKiBsb2coMiAqIHBpKSAtIGxvZyhzZGxvZykgLSBwb3cobG9nKHgpIC0gbWVhbmxvZywgMikgLyAoMiAqIHNkbG9nICogc2Rsb2cpOwogICAgICB9OwogICAgICBsZC5wYXJldG8gPSBmdW5jdGlvbiAoeCwgc2NhbGUsIHNoYXBlKSB7CiAgICAgICAgaWYgKHggPCBzY2FsZSkgewogICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxvZyhzaGFwZSkgKyBzaGFwZSAqIGxvZyhzY2FsZSkgLSAoc2hhcGUgKyAxKSAqIGxvZyh4KTsKICAgICAgfTsKICAgICAgbGQudCA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUsIGRmKSB7CiAgICAgICAgZGYgPSBkZiA+IDFlMTAwID8gMWUxMDAgOiBkZjsKICAgICAgICByZXR1cm4gbGdhbW1hKChkZiArIDEpIC8gMikgLSBsZ2FtbWEoZGYgLyAyKSAtIGxvZyhzcXJ0KHBpICogZGYpICogc2NhbGUpICsgbG9nKHBvdygxICsgMSAvIGRmICogcG93KCh4IC0gbG9jYXRpb24pIC8gc2NhbGUsIDIpLCAtKGRmICsgMSkgLyAyKSk7CiAgICAgIH07CgogICAgICAvLyBUaGlzIGlzIGEgZGlyZWN0IGphdmFzY3JpcHQgdHJhbnNsYXRpb24gb2YgdGhlIFIgY29kZSB1c2VkIHRvIGV2YWx1YXRlCiAgICAgIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIHdlaWJ1bGwgZGlzdHJpYnV0aW9uOiAKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2R3ZWlidWxsLmMKICAgICAgbGQud2VpYnVsbCA9IGZ1bmN0aW9uICh4LCBzaGFwZSwgc2NhbGUpIHsKICAgICAgICBpZiAoeCA8IDApIHJldHVybiAtSW5maW5pdHk7CiAgICAgICAgaWYgKHggPT09IDAgJiYgc2hhcGUgPCAxKSByZXR1cm4gSW5maW5pdHk7CiAgICAgICAgdmFyIHRtcDEgPSBwb3coeCAvIHNjYWxlLCBzaGFwZSAtIDEpOwogICAgICAgIHZhciB0bXAyID0gdG1wMSAqICh4IC8gc2NhbGUpOwogICAgICAgIHJldHVybiAtdG1wMiArIGxvZyhzaGFwZSAqIHRtcDEgLyBzY2FsZSk7CiAgICAgIH07CgogICAgICAvLyBUaGlzIGlzIGEgZGlyZWN0IGphdmFzY3JpcHQgdHJhbnNsYXRpb24gb2YgdGhlIFIgY29kZSB1c2VkIHRvIGV2YWx1YXRlCiAgICAgIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIGxvZ2lzdGljIGRpc3RyaWJ1dGlvbjogCiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93Y2gvci1zb3VyY2UvYmxvYi9iMTU2ZTNhNzExOTY3ZjU4MTMxZTIzYzFiMWRjMWVhOTBlMmYwYzQzL3NyYy9ubWF0aC9kbG9naXMuYwogICAgICBsZC5sb2dpcyA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKICAgICAgICB4ID0gYWJzKCh4IC0gbG9jYXRpb24pIC8gc2NhbGUpOwogICAgICAgIHZhciBlID0gZXhwKC14KTsKICAgICAgICB2YXIgZiA9IDEuMCArIGU7CiAgICAgICAgcmV0dXJuIC0oeCArIGxvZyhzY2FsZSAqIGYgKiBmKSk7CiAgICAgIH07CiAgICAgIGxkLmRpcmljaGxldCA9IGZ1bmN0aW9uICh4LCBhbHBoYSkgewogICAgICAgIHZhciBzdW1fYWxwaGEgPSAwOwogICAgICAgIHZhciBzdW1fbGdhbW1hX2FscGhhID0gMDsKICAgICAgICB2YXIgc3VtX2FscGhhX3N1Yl8xX2xvZ194ID0gMDsKICAgICAgICB2YXIgbiA9IGFscGhhLmxlbmd0aDsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgc3VtX2FscGhhICs9IGFscGhhW2ldOwogICAgICAgICAgc3VtX2xnYW1tYV9hbHBoYSArPSBsZ2FtbWEoYWxwaGFbaV0pOwogICAgICAgICAgc3VtX2FscGhhX3N1Yl8xX2xvZ194ICs9IChhbHBoYVtpXSAtIDEpICogbG9nKHhbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGdhbW1hKHN1bV9hbHBoYSkgLSBzdW1fbGdhbW1hX2FscGhhICsgc3VtX2FscGhhX3N1Yl8xX2xvZ194OwogICAgICB9OwogICAgICBsZC5leHAgPSBmdW5jdGlvbiAoeCwgcmF0ZSkgewogICAgICAgIHJldHVybiB4IDwgMCA/IC1JbmZpbml0eSA6IGxvZyhyYXRlKSAtIHJhdGUgKiB4OwogICAgICB9OwogICAgICBsZC51bmlmID0gZnVuY3Rpb24gKHgsIG1pbiwgbWF4KSB7CiAgICAgICAgcmV0dXJuIHggPCBtaW4gfHwgeCA+IG1heCA/IC1JbmZpbml0eSA6IGxvZygxIC8gKG1heCAtIG1pbikpOwogICAgICB9OwoKICAgICAgLy8vLy8vLy8vLyBEaXNjcmV0ZSBkaXN0cmlidXRpb25zIC8vLy8vLy8vLy8KICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIGxkLmJlcm4gPSBmdW5jdGlvbiAoeCwgcHJvYikgewogICAgICAgIHJldHVybiAhKHggPT09IDAgfHwgeCA9PT0gMSkgPyAtSW5maW5pdHkgOiBsb2coeCAqIHByb2IgKyAoMSAtIHgpICogKDEgLSBwcm9iKSk7CiAgICAgIH07CiAgICAgIGxkLmNhdCA9IGZ1bmN0aW9uICh4LCBwcm9icykgewogICAgICAgIGlmICh4IDwgMSB8fCB4ID4gcHJvYnMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbG9nKHByb2JzW3ggLSAxXSk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZC5iaW5vbSA9IGZ1bmN0aW9uICh4LCBzaXplLCBwcm9iKSB7CiAgICAgICAgaWYgKHggPiBzaXplIHx8IHggPCAwKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0KICAgICAgICBpZiAocHJvYiA9PT0gMCB8fCBwcm9iID09PSAxKSB7CiAgICAgICAgICByZXR1cm4gc2l6ZSAqIHByb2IgPT09IHggPyAwIDogLUluZmluaXR5OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGNob29zZShzaXplLCB4KSArIHggKiBsb2cocHJvYikgKyAoc2l6ZSAtIHgpICogbG9nKDEgLSBwcm9iKTsKICAgICAgfTsKICAgICAgbGQubmJpbm9tID0gZnVuY3Rpb24gKHgsIHNpemUsIHByb2IpIHsKICAgICAgICBpZiAoeCA8IDApIHsKICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsY2hvb3NlKHggKyBzaXplIC0gMSwgc2l6ZSAtIDEpICsgeCAqIGxvZygxIC0gcHJvYikgKyBzaXplICogbG9nKHByb2IpOwogICAgICB9OwogICAgICBsZC5oeXBlciA9IGZ1bmN0aW9uICh4LCBtLCBuLCBrKSB7CiAgICAgICAgaWYgKHggPCAwIHx8IHggPiBrKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbGNob29zZShtLCB4KSArIGxjaG9vc2UobiwgayAtIHgpIC0gbGNob29zZShtICsgbiwgayk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZC5wb2lzID0gZnVuY3Rpb24gKHgsIGxhbWJkYSkgewogICAgICAgIHJldHVybiB4IDwgMCA/IC1JbmZpbml0eSA6IGxvZyhsYW1iZGEpICogeCAtIGxhbWJkYSAtIGxmYWN0b3JpYWwoeCk7CiAgICAgIH07CiAgICAgIHJldHVybiBsZDsKICAgIH0pOwogIH0pKGRpc3RyaWJ1dGlvbnMkMSk7CiAgdmFyIGRpc3RyaWJ1dGlvbnNFeHBvcnRzID0gZGlzdHJpYnV0aW9ucyQxLmV4cG9ydHM7CgogIHZhciBtY21jJDEgPSB7ZXhwb3J0czoge319OwoKICB2YXIgbWNtYyA9IG1jbWMkMS5leHBvcnRzOwogIChmdW5jdGlvbiAobW9kdWxlKSB7CgogICAgLy8gVGhpcyBib2lsZXIgcGxhdGUgY29kZSBoZXJlIGlzIHRha2VuIGZyb206CiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzCiAgICAvLyBJdCBzaG91bGQgbWFrZSBzaHVyZSB0aGF0IG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQgYm90aCBpbiB0aGUgYnJvd3NlciwKICAgIC8vIE5vZGUsIGFuZCBieSB1c2luZyB0aGUgQXN5bmNocm9ub3VzIE1vZHVsZSBEZWZpbml0aW9uIHN0YW5kYXJkLgogICAgLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsCiAgICAvLyBvYmplY3QgbWNtYyAuCiAgICAoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHsKICAgICAgaWYgKG1vZHVsZS5leHBvcnRzKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsCiAgICAgICAgLy8gbGlrZSBOb2RlLgogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpCiAgICAgICAgcm9vdC5tY21jID0gZmFjdG9yeSgpOwogICAgICB9CiAgICB9KShtY21jLCBmdW5jdGlvbiAoKSB7CiAgICAgIC8vLyBUaGUgYWN0dWFsIG1vZHVsZSBjb2RlIHN0YXJ0cyBoZXJlIC8vLwogICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gIAoKICAgICAgLy8vLy8vLy8vLyBIZWxwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8KICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGJldHdlZW4gbWluIGFuZCBtYXggKi8KICAgICAgdmFyIHJ1bmlmID0gZnVuY3Rpb24gKG1pbiwgbWF4KSB7CiAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSArIG1pbjsKICAgICAgfTsKCiAgICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAqLwogICAgICB2YXIgcnVuaWZfZGlzY3JldGUgPSBmdW5jdGlvbiAobWluLCBtYXgpIHsKICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjsKICAgICAgfTsKCiAgICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGZyb20gYSBub3JtYWwgZGlzdHJpYmJ1dGlvbiBkZWZpbmVkCiAgICAgICAqICBieSBtZWFuIGFuZCBzZC4gCiAgICAgICAqICBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0L2pzdGF0L2Jsb2IvbWFzdGVyL3NyYy9zcGVjaWFsLmpzICovCiAgICAgIHZhciBybm9ybSA9IGZ1bmN0aW9uIChtZWFuLCBzZCkgewogICAgICAgIHZhciB1LCB2LCB4LCB5LCBxOwogICAgICAgIGRvIHsKICAgICAgICAgIHUgPSBNYXRoLnJhbmRvbSgpOwogICAgICAgICAgdiA9IDEuNzE1NiAqIChNYXRoLnJhbmRvbSgpIC0gMC41KTsKICAgICAgICAgIHggPSB1IC0gMC40NDk4NzE7CiAgICAgICAgICB5ID0gTWF0aC5hYnModikgKyAwLjM4NjU5NTsKICAgICAgICAgIHEgPSB4ICogeCArIHkgKiAoMC4xOTYwMCAqIHkgLSAwLjI1NDcyICogeCk7CiAgICAgICAgfSB3aGlsZSAocSA+IDAuMjc1OTcgJiYgKHEgPiAwLjI3ODQ2IHx8IHYgKiB2ID4gLTQgKiBNYXRoLmxvZyh1KSAqIHUgKiB1KSk7CiAgICAgICAgcmV0dXJuIHYgLyB1ICogc2QgKyBtZWFuOwogICAgICB9OwoKICAgICAgLyoqIFJldHVybnMgYSBkZWVwIGNsb25lIG9mIHNyYywgc29ydCBvZi4uLiBJdCBvbmx5IGNvcGllcyBhIGxpbWl0ZWQKICAgICAgICogbnVtYmVyIG9mIHR5cGVzIGFuZCwgZm9yIGV4YW1wbGUsIGZ1bmN0aW9uIGFyZSBub3QgY29waWVkLiAKICAgICAgICogRnJvbSBodHRwOi8vZGF2aWR3YWxzaC5uYW1lL2phdmFzY3JpcHQtY2xvbmUKICAgICAgICovCiAgICAgIHZhciBkZWVwX2Nsb25lID0gZnVuY3Rpb24gKHNyYykgewogICAgICAgIGZ1bmN0aW9uIG1peGluKGRlc3QsIHNvdXJjZSwgY29weUZ1bmMpIHsKICAgICAgICAgIHZhciBuYW1lLAogICAgICAgICAgICBzLAogICAgICAgICAgICBlbXB0eSA9IHt9OwogICAgICAgICAgZm9yIChuYW1lIGluIHNvdXJjZSkgewogICAgICAgICAgICAvLyB0aGUgKCEobmFtZSBpbiBlbXB0eSkgfHwgZW1wdHlbbmFtZV0gIT09IHMpIGNvbmRpdGlvbiBhdm9pZHMgY29weWluZyBwcm9wZXJ0aWVzIGluICJzb3VyY2UiCiAgICAgICAgICAgIC8vIGluaGVyaXRlZCBmcm9tIE9iamVjdC5wcm90b3R5cGUuCSBGb3IgZXhhbXBsZSwgaWYgZGVzdCBoYXMgYSBjdXN0b20gdG9TdHJpbmcoKSBtZXRob2QsCiAgICAgICAgICAgIC8vIGRvbid0IG92ZXJ3cml0ZSBpdCB3aXRoIHRoZSB0b1N0cmluZygpIG1ldGhvZCB0aGF0IHNvdXJjZSBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG90eXBlCiAgICAgICAgICAgIHMgPSBzb3VyY2VbbmFtZV07CiAgICAgICAgICAgIGlmICghKG5hbWUgaW4gZGVzdCkgfHwgZGVzdFtuYW1lXSAhPT0gcyAmJiAoIShuYW1lIGluIGVtcHR5KSB8fCBlbXB0eVtuYW1lXSAhPT0gcykpIHsKICAgICAgICAgICAgICBkZXN0W25hbWVdID0gY29weUZ1bmMgPyBjb3B5RnVuYyhzKSA6IHM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBkZXN0OwogICAgICAgIH0KICAgICAgICBpZiAoIXNyYyB8fCB0eXBlb2Ygc3JjICE9ICJvYmplY3QiIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzcmMpID09PSAiW29iamVjdCBGdW5jdGlvbl0iKSB7CiAgICAgICAgICAvLyBudWxsLCB1bmRlZmluZWQsIGFueSBub24tb2JqZWN0LCBvciBmdW5jdGlvbgogICAgICAgICAgcmV0dXJuIHNyYzsgLy8gYW55dGhpbmcKICAgICAgICB9CiAgICAgICAgaWYgKHNyYy5ub2RlVHlwZSAmJiAiY2xvbmVOb2RlIiBpbiBzcmMpIHsKICAgICAgICAgIC8vIERPTSBOb2RlCiAgICAgICAgICByZXR1cm4gc3JjLmNsb25lTm9kZSh0cnVlKTsgLy8gTm9kZQogICAgICAgIH0KICAgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgRGF0ZSkgewogICAgICAgICAgLy8gRGF0ZQogICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHNyYy5nZXRUaW1lKCkpOyAvLyBEYXRlCiAgICAgICAgfQogICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgICAgIC8vIFJlZ0V4cAogICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoc3JjKTsgLy8gUmVnRXhwCiAgICAgICAgfQogICAgICAgIHZhciByLCBpLCBsOwogICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgICAgLy8gYXJyYXkKICAgICAgICAgIHIgPSBbXTsKICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBzcmMubGVuZ3RoOyBpIDwgbDsgKytpKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNyYykgewogICAgICAgICAgICAgIHIucHVzaChkZWVwX2Nsb25lKHNyY1tpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIGdlbmVyaWMgb2JqZWN0cwogICAgICAgICAgciA9IHNyYy5jb25zdHJ1Y3RvciA/IG5ldyBzcmMuY29uc3RydWN0b3IoKSA6IHt9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWl4aW4ociwgc3JjLCBkZWVwX2Nsb25lKTsKICAgICAgfTsKCiAgICAgIC8qKiBTcGVjaWFsaXplZCBjbG9uZSBmdW5jdGlvbiB0aGF0IG9ubHkgY2xvbmVzIHNjYWxhcnMgYW5kIG5lc3RlZCBhcnJheXMgd2hlcmUKICAgICAgICogZWFjaCBhcnJheSBlaXRoZXIgY29uc2lzdHMgb2YgYWxsIGFycmF5cyBvciBhbGwgbnVtYmVycy4gVGhpcyBmdW5jdGlvbgogICAgICAgKiBpcyBtZWFudCBhcyBhIGZhc3Qgd2F5IG9mIGNsb25pbmcgcGFyYW1ldGVyIGRyYXdzIHdpdGhpbiB0aGUgbWNtYyBzYW1wbGluZwogICAgICAgKiBsb29wLgogICAgICAgKi8KICAgICAgdmFyIGNsb25lX3BhcmFtX2RyYXcgPSBmdW5jdGlvbiAoeCkgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh4WzBdKSkgewogICAgICAgICAgICAvLyB4IGlzIGFuIGFycmF5IG9mIGFycmF5cyBzbyB3ZSBuZWVkIHRvIGNsb25lIGl0IHJlY3Vyc2l2ZWx5CiAgICAgICAgICAgIHZhciB4X2NvcHkgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICB4X2NvcHkucHVzaChjbG9uZV9wYXJhbV9kcmF3KHhbaV0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geF9jb3B5OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBhcnJheXMgb2Ygc2NhbGFycwogICAgICAgICAgICByZXR1cm4geC5zbGljZSgwKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBzY2FsYXIKICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIGEgbnVtYmVyLgogICAgICAgKi8KICAgICAgdmFyIGlzX251bWJlciA9IGZ1bmN0aW9uIChvYmplY3QpIHsKICAgICAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PSAibnVtYmVyIiB8fCB0eXBlb2Ygb2JqZWN0ID09ICJvYmplY3QiICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgKHBvc3NpYmx5IG11bHRpZGltZW5zaW9uYWwvbmVzdGVkKSBhcnJheS4KICAgICAgICogQHBhcmFtIGRpbSAtIEFuIGFycmF5IGdpdmluZyB0aGUgZGltZW5zaW9uIG9mIHRoZSBhcnJheS4gRm9yIGV4YW1wbGUsCiAgICAgICAqICAgWzVdIHdvdWxkIHlpZWxkIGEgNSBlbGVtZW50IGFycmF5LCBhbmQgWzMsM10gd291bGQgeWllbGQgYSAzIGJ5IDMgbWF0cml4LgogICAgICAgKiBAcGFyYW0gaW5pdCAtIEEgdmFsdWUgb3IgYSBmdW5jdGlvbiB1c2VkIHRvIGZpbGwgaW4gdGhlIGVhY2ggZWxlbWVudCBpbgogICAgICAgKiAgIHRoZSBhcnJheS4gSWYgaXQgaXMgYSBmdW5jdGlvbiBpdCBzaG91bGQgdGFrZSBubyBhcmd1bWVudHMsIGl0IHdpbGwgYmUgCiAgICAgICAqICAgZXZhbHVhdGVkIG9uY2UgZm9yIGVhY2ggZWxlbWVudCwgYW5kIGl0J3MgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZCB0bwogICAgICAgKiAgIGZpbGwgaW4gZWFjaCBlbGVtZW50LgogICAgICAgKiBAZXhhbXBsZSAKICAgICAgICogLy8gVGhlIGZvbGxvd2luZyB3b3VsZCByZXR1cm4gW1sxLDFdLFsxLDFdLFsxLDFdXQogICAgICAgKiBjcmVhdGVfYXJyYXkoWzIsM10sIDEpCiAgICAgICAqLwogICAgICB2YXIgY3JlYXRlX2FycmF5ID0gZnVuY3Rpb24gKGRpbSwgaW5pdCkgewogICAgICAgIHZhciBhcnIgPSBuZXcgQXJyYXkoZGltWzBdKTsKICAgICAgICB2YXIgaTsKICAgICAgICBpZiAoZGltLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAvLyBGaWxsIGl0IHVwIHdpdGggaW5pdAogICAgICAgICAgaWYgKHR5cGVvZiBpbml0ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewogICAgICAgICAgICAgIGFycltpXSA9IGluaXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgYXJyW2ldID0gaW5pdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZGltLmxlbmd0aCA+IDEpIHsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewogICAgICAgICAgICBhcnJbaV0gPSBjcmVhdGVfYXJyYXkoZGltLnNsaWNlKDEpLCBpbml0KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgImNyZWF0ZV9hcnJheSBjYW4ndCBjcmVhdGUgYSBkaW1lbnNpb25sZXNzIGFycmF5IjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycjsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm4gdGhlIGRpbWVuc2lvbnMgb2YgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYXMgYW4gYXJyYXkuIEZvciAKICAgICAgICogZXhhbXBsZSwgYXJyYXlfZGltKCBbWzEsIDJdLCBbMSwgMl1dICkgc2hvdWxkIHJldHVybiBbMiwgMl0KICAgICAgICogQXNzdW1lcyB0aGF0IGFsbCBhcnJheXMgaW5zaWRlIGFub3RoZXIgYXJyYXkgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aC4KICAgICAgICogQGV4YW1wbGUKICAgICAgICogLy8gU2hvdWxkIHJldHVybiBbNCwgMiwgMV0KICAgICAgICogYXJyYXlfZGltKGNyZWF0ZV9hcnJheShbNCwgMiwgMV0sIDApKQogICAgICAgKi8KICAgICAgdmFyIGFycmF5X2RpbSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYVswXSkpIHsKICAgICAgICAgIHJldHVybiBbYS5sZW5ndGhdLmNvbmNhdChhcnJheV9kaW0oYVswXSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gW2EubGVuZ3RoXTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogQ2hlY2tzIGlmIHR3byBhcnJheXMgYXJlIGVxdWFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cwogICAgICAgKiBhcyBqdWRnZWQgYnkgdGhlICI9PSIgb3BlcmF0b3IuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KICAgICAgICogQWRhcHRlZCBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0ODUzOTc0LzEwMDE4NDgKICAgICAgICovCiAgICAgIHZhciBhcnJheV9lcXVhbCA9IGZ1bmN0aW9uIChhMSwgYTIpIHsKICAgICAgICBpZiAoYTEubGVuZ3RoICE9IGEyLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5cwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYTFbaV0pICYmIEFycmF5LmlzQXJyYXkoYTJbaV0pKSB7CiAgICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byB0aGUgbmVzdGVkIGFycmF5cwogICAgICAgICAgICBpZiAoIWFycmF5X2VxdWFsKGExW2ldLCBhMltpXSkpIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0gZWxzZSBpZiAoYTFbaV0gIT0gYTJbaV0pIHsKICAgICAgICAgICAgLy8gV2FybmluZyAtIHR3byBkaWZmZXJlbnQgb2JqZWN0IGluc3RhbmNlcyB3aWxsIG5ldmVyIGJlIGVxdWFsOiB7eDoyMH0gIT0ge3g6MjB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogVHJhdmVyc2VzIGEgcG9zc2libHkgbmVzdGVkIGFycmF5IGEgYW5kIGFwcGxpZXMgZnVuIHRvIGFsbCAibGVhZiBub2RlcyIsIAogICAgICAgKiB0aGF0IGlzLCB2YWx1ZXMgdGhhdCBhcmUgbm90IGFycmF5cy4gUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaXplIGFzCiAgICAgICAqIGEuCiAgICAgICAqLwogICAgICB2YXIgbmVzdGVkX2FycmF5X2FwcGx5ID0gZnVuY3Rpb24gKGEsIGZ1bikgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KGEubGVuZ3RoKTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZXN1bHRbaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVtpXSwgZnVuKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmdW4oYSk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgLyoqIFJhbmRvbWl6aW5nIHRoZSBhcnJheSBlbGVtZW50IG9yZGVyIGluLXBsYWNlLiBVc2luZyBEdXJzdGVuZmVsZAogICAgICAgKiBzaHVmZmxlIGFsZ29yaXRobS4gQWRhcHRlZCBmcm9tIGhlcmU6IAogICAgICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMjY0Njg2NC8xMDAxODQ4CiAgICAgICAqLwogICAgICBmdW5jdGlvbiBzaHVmZmxlX2FycmF5KGFycmF5KSB7CiAgICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHsKICAgICAgICAgIHZhciBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7CiAgICAgICAgICB2YXIgdGVtcCA9IGFycmF5W2ldOwogICAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTsKICAgICAgICAgIGFycmF5W2pdID0gdGVtcDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9CgogICAgICAvKioKICAgICAgICogRG9lcyB0aGUgc2FtZSB0aGluZyBhcyBuZXN0ZWRfYXJyYXlfYXBwbHksIHRoYXQgaXMsIHRyYXZlcnNlcyBhIHBvc3NpYmx5CiAgICAgICAqIG5lc3RlZCBhcnJheSBhIGFuZCBhcHBsaWVzIGZ1biB0byBhbGwgImxlYWYgbm9kZXMiIGFuZCByZXR1cm5zIGFuIGFycmF5IAogICAgICAgKiBvZiB0aGUgc2FtZSBzaXplIGFzIGEuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseQogICAgICAgKiBicmFuY2hlcyByYW5kb21seS4KICAgICAgICovCiAgICAgIHZhciBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5ID0gZnVuY3Rpb24gKGEsIGZ1bikgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CiAgICAgICAgICB2YXIgbGVuID0gYS5sZW5ndGg7CiAgICAgICAgICB2YXIgaTsKICAgICAgICAgIHZhciBhcnJheV9pcyA9IFtdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGFycmF5X2lzW2ldID0gaTsKICAgICAgICAgIH0KICAgICAgICAgIHNodWZmbGVfYXJyYXkoYXJyYXlfaXMpOwogICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIHZhciBhcnJheV9pID0gYXJyYXlfaXNbaV07CiAgICAgICAgICAgIHJlc3VsdFthcnJheV9pXSA9IG5lc3RlZF9hcnJheV9hcHBseShhW2FycmF5X2ldLCBmdW4pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZ1bihhKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogQWxsb3dzIGEgcHJldHR5IHdheSBvZiBzZXR0aW5nIGRlZmF1bHQgb3B0aW9ucyB3aGVyZSB0aGUgZGVmdWx0cyBjYW4gYmUKICAgICAgICogb3ZlcnJpZGRlbiBieSBhbiBvcHRpb25zIG9iamVjdC4KICAgICAgICogIEBwYXJhbSBvcHRpb25fbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gYXMgYSBzdHJpbmcKICAgICAgICogIEBwYXJhbSBteV9vcHRpb25zIC0gYW4gb3B0aW9uIG9iamVjdCB0aGF0IGNvdWxkIGhhdmUgb3B0aW9uX25hbWUgCiAgICAgICAqICAgIGFzIGEgbWVtYmVyLgogICAgICAgKiBAcGFyYW0gZGVmYXVsX3ZhbHVlIC0gZGVmdWx0IHZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgaWYgb3B0aW9uX25hbWUgCiAgICAgICAqICAgaXMgbm90IGRlZmluZWQgaW4gbXlfb3B0aW9ucy4KICAgICAgICogQGV4YW1wbGUKICAgICAgICogdmFyIG15X29wdGlvbnMgPSB7cGk6IDMuMTQxNTl9CiAgICAgICAqIHZhciBwaSA9IGdldF9vcHRpb24oInBpIiwgbXlfb3B0aW9ucywgMy4xNCkKICAgICAgICovCiAgICAgIC8vIFByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuCiAgICAgIC8vIGJ5IGFuIG9wdGlvbnMgb2JqZWN0LiBGb3IgZXhhbXBsZToKICAgICAgLy8gdmFyIHBpID0gZ2V0X29wdGlvbigicGkiLCBteV9vcHRpb25zLCAzLjE0KQogICAgICB2YXIgZ2V0X29wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25fbmFtZSwgb3B0aW9ucywgZGVmYXVsX3ZhbHVlKSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgcmV0dXJuIG9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0aW9uX25hbWUpICYmIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSB1bmRlZmluZWQgJiYgb3B0aW9uc1tvcHRpb25fbmFtZV0gIT09IG51bGwgPyBvcHRpb25zW29wdGlvbl9uYW1lXSA6IGRlZmF1bF92YWx1ZTsKICAgICAgfTsKCiAgICAgIC8qKiBWZXJzaW9uIG9mIGdldF9vcHRpb24gd2hlcmUgdGhlIG9wdGlvbiBzaG91bGQgYmUgYSBvbmUgb3IgbXVsdGktZGltZW5zaW9uYWwKICAgICAgICogYXJyYXkgYW5kIHdoZXJlIHRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGVpdGhlciBieSBhIHNjYWxhciBvciBieSBhbiBhcnJheS4KICAgICAgICogSWYgaXQncyBhIHNjYWxhciB0aGUgdGhhdCBzY2FsYXIgaXMgdXNlZCB0byBpbml0aWFsaXplIGFuIGFycmF5IHdpdGggCiAgICAgICAqIGRpbSBkaW1lbnNpb25zLgogICAgICAgKiAKICAgICAgICovCiAgICAgIHZhciBnZXRfbXVsdGlkaW1fb3B0aW9uID0gZnVuY3Rpb24gKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkaW0sIGRlZmF1bF92YWx1ZSkgewogICAgICAgIHZhciB2YWx1ZSA9IGdldF9vcHRpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSk7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgdmFsdWUgPSBjcmVhdGVfYXJyYXkoZGltLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGlmICghYXJyYXlfZXF1YWwoYXJyYXlfZGltKHZhbHVlKSwgZGltKSkgewogICAgICAgICAgdGhyb3cgIlRoZSBvcHRpb24gIiArIG9wdGlvbl9uYW1lICsgIiBpcyBvZiBkaW1lbnNpb24gWyIgKyBhcnJheV9kaW0odmFsdWUpICsgIl0gYnV0IHNob3VsZCBiZSBbIiArIGRpbSArICJdLiI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfTsKCiAgICAgIC8vLy8vLy8vLy8gRnVuY3Rpb25zIGZvciBoYW5kbGluZyBwYXJhbWV0ZXIgb2JqZWN0cyAvLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGZpeGVkIChzYW1lIGV2ZXJ5IHRpbWUpIG51bWJlciB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZQogICAgICAgKiBhIHBhcmFtZXRlciBvZiBhIGNlcnRhaW4gdHlwZSwgcG9zc2libHkgd2l0aCBsb3dlciBhbmQgdXBwZXIgYm91bmRzLgogICAgICAgKiBUaGUgcG9zc2lsZSB0eXBlcyBhcmUgInJlYWwiLCAiaW50IiwgYW5kICJiaW5hcnkiLgogICAgICAgKi8KICAgICAgdmFyIHBhcmFtX2luaXRfZml4ZWQgPSBmdW5jdGlvbiAodHlwZSwgbG93ZXIsIHVwcGVyKSB7CiAgICAgICAgaWYgKGxvd2VyID4gdXBwZXIpIHsKICAgICAgICAgIHRocm93ICJDYW4gbm90IGluaXRpYWxpemUgcGFyYW1ldGVyIHdoZXJlIGxvd2VyIGJvdW5kID4gdXBwZXIgYm91bmQiOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSA9PT0gInJlYWwiKSB7CiAgICAgICAgICBpZiAobG93ZXIgPT09IC1JbmZpbml0eSAmJiB1cHBlciA9PT0gSW5maW5pdHkpIHsKICAgICAgICAgICAgcmV0dXJuIDAuNTsKICAgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPT09IC1JbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gdXBwZXIgLSAwLjU7CiAgICAgICAgICB9IGVsc2UgaWYgKHVwcGVyID09PSBJbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gbG93ZXIgKyAwLjU7CiAgICAgICAgICB9IGVsc2UgaWYgKGxvd2VyIDw9IHVwcGVyKSB7CiAgICAgICAgICAgIHJldHVybiAobG93ZXIgKyB1cHBlcikgLyAyOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gImludCIpIHsKICAgICAgICAgIGlmIChsb3dlciA9PT0gLUluZmluaXR5ICYmIHVwcGVyID09PSBJbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPT09IC1JbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gdXBwZXIgLSAxOwogICAgICAgICAgfSBlbHNlIGlmICh1cHBlciA9PT0gSW5maW5pdHkpIHsKICAgICAgICAgICAgcmV0dXJuIGxvd2VyICsgMTsKICAgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPD0gdXBwZXIpIHsKICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKGxvd2VyICsgdXBwZXIpIC8gMik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAiYmluYXJ5IikgewogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIHRocm93ICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIgb2YgdHlwZSAiICsgdHlwZSArICJbIiArIGxvd2VyICsgIiwgIiArIHVwcGVyICsgIl0iOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIENvbXBsZXRlcyBwYXJhbXNfdG9fY29tcGxldGUsIGFuIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMsIAogICAgICAgKiBhbmQgaW5pdGlhbGl6ZXMgbm9uLWluaXRpYWxpemVkIHBhcmFtZXRlcnMuIFRoaXMgbW9kaWZpZWQgdmVyc2lvbiBvZgogICAgICAgKiBwYXJhbXNfdG9fY29tcGxldGUgaXMgcmV0dXJuZWQgYXMgYSBkZWVwIGNvcHkgYW5kIG5vdCBtb2RpZmllZCBpbiBwbGFjZS4KICAgICAgICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBieSBzdXBwbHlpbmcgYSBwYXJhbV9pbml0IGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlCiAgICAgICAqIGZ1bmN0aW9uKHR5cGUsIGxvd2VyLCB1cHBlcikgdGhhdCBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIG51bWJlciAKICAgICAgICogKGxpa2UgcGFyYW1faW5pdF9maXhlZCwgZm9yIGV4YW1wbGUpLgogICAgICAgKiBAZXhhbXBsZQogICAgICAgKiB2YXIgcGFyYW1zID0geyAibXUiOiB7InR5cGUiOiAicmVhbCJ9IH0KICAgICAgICogcGFyYW1zID0gY29tcGxldGVfcGFyYW1zKHBhcmFtcyk7CiAgICAgICAqIC8vIHBhcmFtcyBzaG91bGQgbm93IGJlOgogICAgICAgKiAvLyAgeyJtdSI6IHsgInR5cGUiOiAicmVhbCIsICJkaW0iOiBbMV0sICJ1cHBlciI6IEluZmluaXR5LAogICAgICAgKiAvLyAgICAgICAgICAgImxvd2VyIjogLUluZmluaXR5LCAiaW5pdCI6IDAuNSB9fQogICAgICAgKi8KICAgICAgdmFyIGNvbXBsZXRlX3BhcmFtcyA9IGZ1bmN0aW9uIChwYXJhbXNfdG9fY29tcGxldGUsIHBhcmFtX2luaXQpIHsKICAgICAgICB2YXIgcGFyYW1zID0gZGVlcF9jbG9uZShwYXJhbXNfdG9fY29tcGxldGUpOwogICAgICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gcGFyYW1zKSB7CiAgICAgICAgICBpZiAoIXBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbV9uYW1lKSkgY29udGludWU7CiAgICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbcGFyYW1fbmFtZV07CiAgICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJ0eXBlIikpIHsKICAgICAgICAgICAgcGFyYW0udHlwZSA9ICJyZWFsIjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghcGFyYW0uaGFzT3duUHJvcGVydHkoImRpbSIpKSB7CiAgICAgICAgICAgIHBhcmFtLmRpbSA9IFsxXTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc19udW1iZXIocGFyYW0uZGltKSkgewogICAgICAgICAgICBwYXJhbS5kaW0gPSBbcGFyYW0uZGltXTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJhbS50eXBlID09ICJiaW5hcnkiKSB7CiAgICAgICAgICAgIHBhcmFtLnVwcGVyID0gMTsKICAgICAgICAgICAgcGFyYW0ubG93ZXIgPSAwOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eSgidXBwZXIiKSkgewogICAgICAgICAgICBwYXJhbS51cHBlciA9IEluZmluaXR5OwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eSgibG93ZXIiKSkgewogICAgICAgICAgICBwYXJhbS5sb3dlciA9IC1JbmZpbml0eTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJhbS5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpKSB7CiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMganVzdCBhIG51bWJlciBvciBhIG5lc3RlZCBhcnJheSB3ZSBsZWF2ZSBpdCBhbG9uZSwgYnV0IGlmLi4uCiAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgdHlwZW9mIHBhcmFtLmluaXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAvLyBwYXJhbS5pbml0IGlzIGEgZnVuY3Rpb24sIHVzZSB0aGF0IHRvIGluaXRpYWxpemUgdGhlIHBhcmFtZXRlci4KICAgICAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW0uaW5pdCgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0uaW5pdCkpIHsKICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgd2hlcmUgdGhlIHBhcmFtLmluaXQgZXhpc3QgYnV0CiAgICAgICAgICAgICAgLy8gaXMgbm90IGFuIGFycmF5LiBUaGVuIGFzc3VtZSBpdCBpcyBhIG51bWJlciBvciBhIGZ1bmN0aW9uIGFuZCB1c2UKICAgICAgICAgICAgICAvLyBpdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuCiAgICAgICAgICAgICAgcGFyYW0uaW5pdCA9IGNyZWF0ZV9hcnJheShwYXJhbS5kaW0sIHBhcmFtLmluaXQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBXZSB1c2UgdGhlIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCiAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKICAgICAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJhbXM7CiAgICAgIH07CgogICAgICAvLy8vLy8vLy8vIFN0ZXBwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIC8qKgogICAgICAgKiBAaW50ZXJmYWNlCiAgICAgICAqIEEgU3RlcHBlciBpcyBhbiBvYmplY3QgcmVzcG9uc2libGUgZm9yIHB1c2hpbmcgYXJvdW5kIG9uZQogICAgICAgKiBvciBtb3JlIHBhcmFtZXRlciB2YWx1ZXMgaW4gYSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGRpc3RyaWJ1dGlvbgogICAgICAgKiBkZWZpbmVkIGJ5IHRoZSBsb2cgcG9zdGVyaW9yLiBUaGlzIGRlZmluZXMgdGhlIFN0ZXBwZXIgImludGVyZmFjZSIsCiAgICAgICAqIHdoZXJlICJpbnRlcmZhY2UiIG1lYW5zIHRoYXQgU3RlcHBlciBkZWZpbmVzIGEgY2xhc3MgdGhhdCBpcyBuZXZlcgogICAgICAgKiBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBqdXN0IHRvIGJlIHN1YmNsYXNzZWQgYnkgc3BlY2lhbGl6ZWQKICAgICAgICogc3RlcHBlciBmdW5jdGlvbnMuCiAgICAgICAqIEBpbnRlcmZhY2UKICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6CiAgICAgICAqICAgeyJtdSI6IHsgInR5cGUiOiAicmVhbCIsICJkaW0iOiBbMV0sICJ1cHBlciI6IEluZmluaXR5LCAKICAgICAgICogICAibG93ZXIiOiAtSW5maW5pdHksICJpbml0IjogMC41IH19CiAgICAgICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYmUgImNvbXBsZXRlIiwgdGhhdCBpcywKICAgICAgICogICBzcGVjaWZ5aW5nIGFsbCByZWxldmFudCBhdHRyaWJ1dGVzIHN1Y2ggYXMgZGltLCBsb3dlciBhbmQgdXBwZXIuCiAgICAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycyBpbiBwYXJhbXMKICAgICAgICogICAoYW5kIHBvc3NpYmx5IG1vcmUpLiBUaGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBnaXZlbiBhcyBrZXlzIGFuZCB0aGUgc3RhdGVzCiAgICAgICAqICAgYXMgc2NhbGFycyBvciwgcG9zc2libHkgbmVzdGVkLCBhcnJheXMuIEZvciBleGFtcGxlOgogICAgICAgKiAgIHttdTogMTAsIHNpZ21hOiA1LCBiZXRhOiBbMSwgMi41XX0KICAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiAqdGFraW5nIG5vIHBhcmFtZXRlcnMqIHRoYXQgcmV0dXJucyB0aGUKICAgICAgICogICBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBUaGF0IGlzLCB0aGUgdmFsdWUgb2YgbG9nX3Bvc3QKICAgICAgICogICBzaG91bGQgY2hhbmdlIGlmIHRoZSB0aGUgdmFsdWVzIGluIHN0YXRlIGFyZSBjaGFuZ2VkLgogICAgICAKICAgICAgICovCiAgICAgIHZhciBTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KSB7CiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwogICAgICAgIHRoaXMubG9nX3Bvc3QgPSBsb2dfcG9zdDsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBUYWtlcyBhIHN0ZXAgaW4gdGhlIHBhcmFtZXRlciBzcGFjZS4gU2hvdWxkIHJldHVybiB0aGUgbmV3IHN0YXRlLAogICAgICAgKiBidXQgaXMgbWFpbmx5IGNhbGxlZCBmb3IgaXQncyBzaWRlIGVmZmVjdCBvZiBtYWtpbmcgYSBjaGFuZ2UgaW4gdGhlCiAgICAgICAqIHN0YXRlIG9iamVjdC4KICAgICAgICovCiAgICAgIFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhyb3cgIkV2ZXJ5IFN0ZXBwZXIgbmVlZCB0byBpbXBsZW1lbnQgc3RlcCgpIjsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBJZiBpbXBsZW1lbnRlZCwgbWFrZXMgdGhlIHN0ZXBwZXIgYWRhcHQgd2hpbGUgc3RlcHBpbmcuCiAgICAgICAqLwogICAgICBTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gCiAgICAgIH07CgogICAgICAvKioKICAgICAgICogSWYgaW1wbGVtZW50ZWQsIG1ha2VzIHRoZSBzdGVwcGVyIGNlYXNlIGFkYXB0aW5nIHdoaWxlIHN0ZXBwaW5nLgogICAgICAgKi8KICAgICAgU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gCiAgICAgIH07CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmcgaW5mbyByZWdhcmRpbmcgdGhlIHN0ZXBwZXIuCiAgICAgICAqLwogICAgICBTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHN0ZXBwZXIuCiAgICAgICAgcmV0dXJuIHt9OwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KICAgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIG1ldHJvcG9saXMgc3RlcCBpbgogICAgICAgKiB0aGUgQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgogICAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLgogICAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24uCiAgICAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy4KICAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAogICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCiAgICAgICAqIEBwYXJhbSBnZW5lcmF0ZV9wcm9wb3NhbCAtIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgcHJvcG9zYWwgKGFzIGEgbnVtYmVyKQogICAgICAgKiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgbG9nX3NjYWxlKSB3aGVyZSBwYXJhbV9zdGF0ZSBpcyBhCiAgICAgICAqIG51bWJlciBhbmQgbG9nX3NjYWxlIGRlZmluZXMgdGhlIHNjYWxlIG9mIHRoZSBwcm9wb3NhbCBzb21laG93LgogICAgICAqLwogICAgICB2YXIgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGdlbmVyYXRlX3Byb3Bvc2FsKSB7CiAgICAgICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTsKICAgICAgICB2YXIgcGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CiAgICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCAhPSAxKSB7CiAgICAgICAgICB0aHJvdyAiT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgY2FuIG9ubHkgaGFuZGxlIG9uZSBwYXJhbWV0ZXIuIjsKICAgICAgICB9CiAgICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CiAgICAgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lXTsKICAgICAgICBpZiAoIWFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkgewogICAgICAgICAgdGhyb3cgIk9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIGNhbiBvbmx5IGhhbmRsZSBvbmUgb25lLWRpbWVuc2lvbmFsIHBhcmFtZXRlci4iOwogICAgICAgIH0KICAgICAgICB0aGlzLmxvd2VyID0gcGFyYW0ubG93ZXI7CiAgICAgICAgdGhpcy51cHBlciA9IHBhcmFtLnVwcGVyOwogICAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgPSBnZXRfb3B0aW9uKCJwcm9wX2xvZ19zY2FsZSIsIG9wdGlvbnMsIDApOwogICAgICAgIHRoaXMuYmF0Y2hfc2l6ZSA9IGdldF9vcHRpb24oImJhdGNoX3NpemUiLCBvcHRpb25zLCA1MCk7CiAgICAgICAgdGhpcy5tYXhfYWRhcHRhdGlvbiA9IGdldF9vcHRpb24oIm1heF9hZGFwdGF0aW9uIiwgb3B0aW9ucywgMC4zMyk7CiAgICAgICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfb3B0aW9uKCJpbml0aWFsX2FkYXB0YXRpb24iLCBvcHRpb25zLCAxLjApOwogICAgICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X29wdGlvbigidGFyZ2V0X2FjY2VwdF9yYXRlIiwgb3B0aW9ucywgMC40NCk7CiAgICAgICAgdGhpcy5pc19hZGFwdGluZyA9IGdldF9vcHRpb24oImlzX2FkYXB0aW5nIiwgb3B0aW9ucywgdHJ1ZSk7CiAgICAgICAgdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbCA9IGdlbmVyYXRlX3Byb3Bvc2FsOwogICAgICAgIHRoaXMuYWNjZXB0YW5jZV9jb3VudCA9IDA7CiAgICAgICAgdGhpcy5iYXRjaF9jb3VudCA9IDA7CiAgICAgICAgdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uID0gMDsKICAgICAgfTsKICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyOwogICAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgcGFyYW1fc3RhdGUgPSB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07CiAgICAgICAgdmFyIHBhcmFtX3Byb3Bvc2FsID0gdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbChwYXJhbV9zdGF0ZSwgdGhpcy5wcm9wX2xvZ19zY2FsZSk7CiAgICAgICAgaWYgKHBhcmFtX3Byb3Bvc2FsIDwgdGhpcy5sb3dlciB8fCBwYXJhbV9wcm9wb3NhbCA+IHRoaXMudXBwZXIpIDsgZWxzZSB7CiAgICAgICAgICAvLyBtYWtlIGEgTWV0cm9wb2xpcyBzdGVwCiAgICAgICAgICB2YXIgY3Vycl9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTsKICAgICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3Byb3Bvc2FsOwogICAgICAgICAgdmFyIHByb3BfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgICB2YXIgYWNjZXB0X3Byb2IgPSBNYXRoLmV4cChwcm9wX2xvZ19kZW5zIC0gY3Vycl9sb2dfZGVucyk7CiAgICAgICAgICBpZiAoYWNjZXB0X3Byb2IgPiBNYXRoLnJhbmRvbSgpKSB7CiAgICAgICAgICAgIC8vIFdlIGRvIG5vdGhpbmcgYXMgdGhlIHN0YXRlIG9mIHBhcmFtIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCB0byB0aGUgcHJvcG9zYWwKICAgICAgICAgICAgaWYgKHRoaXMuaXNfYWRhcHRpbmcpIHRoaXMuYWNjZXB0YW5jZV9jb3VudCsrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gcmV2ZXJ0IHN0YXRlIGJhY2sgdG8gdGhlIG9sZCBzdGF0ZSBvZiBwYXJhbQogICAgICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSBwYXJhbV9zdGF0ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuaXNfYWRhcHRpbmcpIHsKICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbisrOwogICAgICAgICAgaWYgKHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA+PSB0aGlzLmJhdGNoX3NpemUpIHsKICAgICAgICAgICAgLy8gdGhlbiBhZGFwdAogICAgICAgICAgICB0aGlzLmJhdGNoX2NvdW50Kys7CiAgICAgICAgICAgIHZhciBsb2dfc2RfYWRqdXN0bWVudCA9IE1hdGgubWluKHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uIC8gTWF0aC5zcXJ0KHRoaXMuYmF0Y2hfY291bnQpKTsKICAgICAgICAgICAgaWYgKHRoaXMuYWNjZXB0YW5jZV9jb3VudCAvIHRoaXMuYmF0Y2hfc2l6ZSA+IHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlKSB7CiAgICAgICAgICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSArPSBsb2dfc2RfYWRqdXN0bWVudDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlIC09IGxvZ19zZF9hZGp1c3RtZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuYWNjZXB0YW5jZV9jb3VudCA9IDA7CiAgICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07CiAgICAgIH07CiAgICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSB0cnVlOwogICAgICB9OwogICAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBmYWxzZTsKICAgICAgfTsKICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHByb3BfbG9nX3NjYWxlOiB0aGlzLnByb3BfbG9nX3NjYWxlLAogICAgICAgICAgaXNfYWRhcHRpbmc6IHRoaXMuaXNfYWRhcHRpbmcsCiAgICAgICAgICBhY2NlcHRhbmNlX2NvdW50OiB0aGlzLmFjY2VwdGFuY2VfY291bnQsCiAgICAgICAgICBpdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uOiB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24sCiAgICAgICAgICBiYXRjaF9jb3VudDogdGhpcy5iYXRjaF9jb3VudAogICAgICAgIH07CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGEgTm9ybWFsIHByb3Bvc2FsLgogICAgICAgKi8KICAgICAgdmFyIG5vcm1hbF9wcm9wb3NhbCA9IGZ1bmN0aW9uIChwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHsKICAgICAgICByZXR1cm4gcm5vcm0ocGFyYW1fc3RhdGUsIE1hdGguZXhwKHByb3BfbG9nX3NjYWxlKSk7CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogQGNsYXNzCiAgICAgICAqIEBhdWdtZW50cyB7T25lZGltTWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICAqIEEgInN1YmNsYXNzIiBvZiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuCiAgICAgICAqLwogICAgICB2YXIgUmVhbE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CiAgICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgbm9ybWFsX3Byb3Bvc2FsKTsKICAgICAgfTsKICAgICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsKICAgICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlYWxNZXRyb3BvbGlzU3RlcHBlcjsKCiAgICAgIC8qKgogICAgICAgKiBGdW5jdGlvbiByZXR1cm5pbmcgYSBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWwuCiAgICAgICAqLwogICAgICB2YXIgZGlzY3JldGVfbm9ybWFsX3Byb3Bvc2FsID0gZnVuY3Rpb24gKHBhcmFtX3N0YXRlLCBwcm9wX2xvZ19zY2FsZSkgewogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHJub3JtKHBhcmFtX3N0YXRlLCBNYXRoLmV4cChwcm9wX2xvZ19zY2FsZSkpKTsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAqIEBjbGFzcwogICAgICAqIEBhdWdtZW50cyB7T25lZGltTWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICogQSAic3ViY2xhc3MiIG9mIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLgogICAgICAqLwogICAgICB2YXIgSW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKICAgICAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwpOwogICAgICB9OwogICAgICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIEludE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludE1ldHJvcG9saXNTdGVwcGVyOwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KICAgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIG1ldHJvcG9saXMgc3RlcCBpbgogICAgICAgKiB0aGUgQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgogICAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpIGZvciBwb3NzaWJseSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5cy4gVGhhdAogICAgICAgKiBpcywgaW5zdGVhZCBvZiBqdXN0IHRha2luZyBhIHN0ZXAgZm9yIGEgb25lLWRpbWVuc2lvbmFsIHBhcmFtZXRlciBsaWtlIAogICAgICAgKiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciwgdGhpcyBTdGVwcGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0YWtpbmcgc3RlcHMgCiAgICAgICAqIGZvciBhIG11bHRpZGltZW5zaW9uYWwgYXJyYXkuIEl0J3Mgc3RpbGwgcHJldHR5IGR1bWIgYW5kIGp1c3QgdGFrZXMKICAgICAgICogb25lLWRpbWVuc2lvbmFsIHN0ZXBzIGZvciBlYWNoIHBhcmFtZXRlciBjb21wb25lbnQsIHRob3VnaC4KICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uIGZvciBhIAogICAgICAgKiAgIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyLgogICAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCiAgICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLgogICAgICAgKiBAcGFyYW0gU3ViU3RlcHBlciAtIGEgY29uc3RydWN0b3IgZm9yIHRoZSB0eXBlIG9mIG9uZSBkaW1lbnNpb25hbCBTdGVwcGVyIHRvIGFwcGx5IG9uCiAgICAgICAqICAgYWxsIHRoZSBjb21wb25lbnRzIG9mIHRoZSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci4KICAgICAgKi8KICAgICAgdmFyIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFN1YlN0ZXBwZXIpIHsKICAgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwogICAgICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTsKICAgICAgICBpZiAocGFyYW1fbmFtZXMubGVuZ3RoICE9IDEpIHsKICAgICAgICAgIHRocm93ICJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIGNhbid0IGhhbmRsZSBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4iOwogICAgICAgIH0KICAgICAgICB0aGlzLnBhcmFtX25hbWUgPSBwYXJhbV9uYW1lc1swXTsKICAgICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdOwogICAgICAgIHRoaXMubG93ZXIgPSBwYXJhbS5sb3dlcjsKICAgICAgICB0aGlzLnVwcGVyID0gcGFyYW0udXBwZXI7CiAgICAgICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07CiAgICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oInByb3BfbG9nX3NjYWxlIiwgb3B0aW9ucywgdGhpcy5kaW0sIDApOwogICAgICAgIHRoaXMuYmF0Y2hfc2l6ZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oImJhdGNoX3NpemUiLCBvcHRpb25zLCB0aGlzLmRpbSwgNTApOwogICAgICAgIHRoaXMubWF4X2FkYXB0YXRpb24gPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJtYXhfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIHRoaXMuZGltLCAwLjMzKTsKICAgICAgICB0aGlzLmluaXRpYWxfYWRhcHRhdGlvbiA9IGdldF9tdWx0aWRpbV9vcHRpb24oImluaXRpYWxfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIHRoaXMuZGltLCAxLjApOwogICAgICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X211bHRpZGltX29wdGlvbigidGFyZ2V0X2FjY2VwdF9yYXRlIiwgb3B0aW9ucywgdGhpcy5kaW0sIDAuNDQpOwogICAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJpc19hZGFwdGluZyIsIG9wdGlvbnMsIHRoaXMuZGltLCB0cnVlKTsKCiAgICAgICAgLy8gVGhpcyBoYWNrIGJlbG93IGlzIGEgcmVjdXJzaXZlIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbiBhcnJheSBvZiAKICAgICAgICAvLyBvbmUgZGltZW5zaW9uYWwgc3RlcHBlcnMgYWNjb3JkaW5nIHRvIGRpbS4KICAgICAgICB2YXIgY3JlYXRlX3N1YnN0ZXBwZXJzID0gZnVuY3Rpb24gKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0LCBwcm9wX2xvZ19zY2FsZSwgYmF0Y2hfc2l6ZSwgbWF4X2FkYXB0YXRpb24sIGluaXRpYWxfYWRhcHRhdGlvbiwgdGFyZ2V0X2FjY2VwdF9yYXRlLCBpc19hZGFwdGluZykgewogICAgICAgICAgdmFyIHN1YnN0ZXBwZXJzID0gW107CiAgICAgICAgICBpZiAoZGltLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgdmFyIHN1Ym9wdGlvbnMgPSB7CiAgICAgICAgICAgICAgICBwcm9wX2xvZ19zY2FsZTogcHJvcF9sb2dfc2NhbGVbaV0sCiAgICAgICAgICAgICAgICBiYXRjaF9zaXplOiBiYXRjaF9zaXplW2ldLAogICAgICAgICAgICAgICAgbWF4X2FkYXB0YXRpb246IG1heF9hZGFwdGF0aW9uW2ldLAogICAgICAgICAgICAgICAgaW5pdGlhbF9hZGFwdGF0aW9uOiBpbml0aWFsX2FkYXB0YXRpb25baV0sCiAgICAgICAgICAgICAgICB0YXJnZXRfYWNjZXB0X3JhdGU6IHRhcmdldF9hY2NlcHRfcmF0ZVtpXSwKICAgICAgICAgICAgICAgIGlzX2FkYXB0aW5nOiBpc19hZGFwdGluZ1tpXQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdmFyIHN1YnBhcmFtID0ge307CiAgICAgICAgICAgICAgc3VicGFyYW1baV0gPSBkZWVwX2Nsb25lKHBhcmFtKTsKICAgICAgICAgICAgICBzdWJwYXJhbVtpXS5kaW0gPSBbMV07IC8vIEFzIHRoaXMgc2hvdWxkIG5vdyBiZSBhIG9uZS1kaW0gcGFyYW1ldGVyCiAgICAgICAgICAgICAgZGVsZXRlIHN1YnBhcmFtW2ldLmluaXQ7IC8vIEFzIGl0IHNvdWxkIG5vdCBiZSBuZWVkZWQKICAgICAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBTdWJTdGVwcGVyKHN1YnBhcmFtLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHN1Ym9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QsIHByb3BfbG9nX3NjYWxlW2ldLCBiYXRjaF9zaXplW2ldLCBtYXhfYWRhcHRhdGlvbltpXSwgaW5pdGlhbF9hZGFwdGF0aW9uW2ldLCB0YXJnZXRfYWNjZXB0X3JhdGVbaV0sIGlzX2FkYXB0aW5nW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHN1YnN0ZXBwZXJzOwogICAgICAgIH07CiAgICAgICAgdGhpcy5zdWJzdGVwcGVycyA9IGNyZWF0ZV9zdWJzdGVwcGVycyh0aGlzLmRpbSwgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdLCB0aGlzLmxvZ19wb3N0LCB0aGlzLnByb3BfbG9nX3NjYWxlLCB0aGlzLmJhdGNoX3NpemUsIHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uLCB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSwgdGhpcy5pc19hZGFwdGluZyk7CiAgICAgIH07CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjsKICAgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS4KICAgICAgICByZXR1cm4gbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewogICAgICAgICAgcmV0dXJuIHN1YnN0ZXBwZXIuc3RlcCgpOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewogICAgICAgICAgc3Vic3RlcHBlci5zdGFydF9hZGFwdGF0aW9uKCk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBuZXN0ZWRfYXJyYXlfYXBwbHkodGhpcy5zdWJzdGVwcGVycywgZnVuY3Rpb24gKHN1YnN0ZXBwZXIpIHsKICAgICAgICAgIHN1YnN0ZXBwZXIuc3RvcF9hZGFwdGF0aW9uKCk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewogICAgICAgICAgcmV0dXJuIHN1YnN0ZXBwZXIuaW5mbygpOwogICAgICAgIH0pOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICAqIEEgInN1YmNsYXNzIiBvZiBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBjb250aW5vdXMgTm9ybWFsIHByb3Bvc2Fscy4KICAgICAgICovCiAgICAgIHZhciBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgUmVhbE1ldHJvcG9saXNTdGVwcGVyKTsKICAgICAgfTsKICAgICAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICAqIEEgInN1YmNsYXNzIiBvZiBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLgogICAgICAgKi8KICAgICAgdmFyIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKICAgICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIEludE1ldHJvcG9saXNTdGVwcGVyKTsKICAgICAgfTsKICAgICAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsKICAgICAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KICAgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYSBzdGVwIGZvciBhIGJpbmFyeSBwYXJhbWV0ZXIuCiAgICAgICAqIFRoaXMgaXMgZG9uZSBieSBldmFsdWF0aW5nIHRoZSBsb2cgcG9zdGVyaW9yIGZvciBib3RoIHN0YXRlcyBvZiB0aGUKICAgICAgICogcGFyYW1ldGVyIGFuZCB0aGVuIHNlbGVjdGluZyBhIHN0YXRlIHJhbmRvbWx5IHdpdGggcHJvYmFiaWxpdHkgcmVsYXRpdmUgCiAgICAgICAqIHRvIHRoZSBwb3N0ZXJpb3Igb2YgZWFjaCBzdGF0ZS4KICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uLgogICAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCiAgICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLgogICAgICAqLwogICAgICB2YXIgQmluYXJ5U3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7CiAgICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwogICAgICAgIGlmIChwYXJhbV9uYW1lcy5sZW5ndGggPT0gMSkgewogICAgICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93ICJCaW5hcnlTdGVwcGVyIGNhbid0IGhhbmRsZSBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4iOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsKICAgICAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCaW5hcnlTdGVwcGVyOwogICAgICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IDA7CiAgICAgICAgdmFyIHplcm9fbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMTsKICAgICAgICB2YXIgb25lX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpOwogICAgICAgIHZhciBtYXhfbG9nX2RlbnMgPSBNYXRoLm1heCh6ZXJvX2xvZ19kZW5zLCBvbmVfbG9nX2RlbnMpOwogICAgICAgIHplcm9fbG9nX2RlbnMgLT0gbWF4X2xvZ19kZW5zOwogICAgICAgIG9uZV9sb2dfZGVucyAtPSBtYXhfbG9nX2RlbnM7CiAgICAgICAgdmFyIHplcm9fcHJvYiA9IE1hdGguZXhwKHplcm9fbG9nX2RlbnMgLSBNYXRoLmxvZyhNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zKSArIE1hdGguZXhwKG9uZV9sb2dfZGVucykpKTsKICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8IHplcm9fcHJvYikgewogICAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0gLy8gZWxzZSBrZWVwIHRoZSBwYXJhbSBhdCAxIC4KICAgICAgICByZXR1cm4gMTsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAqIEBjbGFzcwogICAgICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfQogICAgICAqIEp1c3QgbGlrZSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIHRoaXMgU3RlcHBlciB0YWtlcyBhIHN0ZXBzIGZvcgogICAgICAqIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgYnkgdXBkYXRpbmcgZWFjaCBjb21wb25lbnQgaW4gdHVybi4gVGhlIGRpZmZlcmVuY2UKICAgICAgKiBpcyB0aGF0IHRoaXMgc3RlcHBlciB3b3JrcyBvbiBiaW5hcnkgcGFyYW1ldGVycy4KICAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZm9yIGEgCiAgICAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci4KICAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCiAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAogICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KICAgICAgKi8KICAgICAgdmFyIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKICAgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwogICAgICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTsKICAgICAgICBpZiAocGFyYW1fbmFtZXMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdOwogICAgICAgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lXTsKICAgICAgICAgIHRoaXMuZGltID0gcGFyYW0uZGltOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyAiQmluYXJ5Q29tcG9uZW50U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuIjsKICAgICAgICB9CiAgICAgICAgdmFyIGNyZWF0ZV9zdWJzdGVwcGVycyA9IGZ1bmN0aW9uIChkaW0sIHN1YnN0YXRlLCBsb2dfcG9zdCkgewogICAgICAgICAgdmFyIHN1YnN0ZXBwZXJzID0gW107CiAgICAgICAgICB2YXIgaTsKICAgICAgICAgIGlmIChkaW0ubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewogICAgICAgICAgICAgIHZhciBzdWJwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICBzdWJwYXJhbXNbaV0gPSBwYXJhbTsKICAgICAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBCaW5hcnlTdGVwcGVyKHN1YnBhcmFtcywgc3Vic3RhdGUsIGxvZ19wb3N0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3Vic3RlcHBlcnM7CiAgICAgICAgfTsKICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gY3JlYXRlX3N1YnN0ZXBwZXJzKHRoaXMuZGltLCB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0sIHRoaXMubG9nX3Bvc3QpOwogICAgICB9OwogICAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwogICAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI7CiAgICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gR28gdGhyb3VnaCB0aGUgc3Vic3RlcHBlcnMgaW4gYSByYW5kb20gb3JkZXIgYW5kIGNhbGwgc3RlcCgpIG9uIHRoZW0uCiAgICAgICAgcmV0dXJuIG5lc3RlZF9hcnJheV9yYW5kb21fYXBwbHkodGhpcy5zdWJzdGVwcGVycywgZnVuY3Rpb24gKHN1YnN0ZXBwZXIpIHsKICAgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLnN0ZXAoKTsKICAgICAgICB9KTsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBAY2xhc3MKICAgICAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9CiAgICAgICAqIFRoaXMgc3RlcHBlciBjYW4gYmUgcmVzcG9uc2libGUgZm9yIHRha2luZyBhIHN0ZXAgZm9yIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMuCiAgICAgICAqIEZvciByZWFsIGFuZCBpbnQgcGFyYW1ldGVycyBpdCB0YWtlcyBNZXRyb3BvbGlzIHdpdGhpbiBHaWJicyBzdGVwcywgYW5kIGZvciAKICAgICAgICogYmluYXJ5IHBhcmFtZXRlcnMgaXQgZG9lcyBldmFsdWF0ZXMgdGhlIHBvc3RlcmlvciBmb3IgYm90aCBwYXJhbXRlciB2YWx1ZXMgYW5kCiAgICAgICAqIHJhbmRvbWx5IGNoYW5nZXMgdG8gYSBjZXJ0YWluIHZhbHVlIHByb3BvcnRpb25hbGx5IHRvIHRoYXQgdmFsdWUncyBwb3N0ZXJpb3IKICAgICAgICogKHRoaXMgaXMgYWxzbyBkb25lIGZvciBlYWNoIHBhcmFtZXRlciwgc28gYWxzbyBhICogd2l0aGluIEdpYmJzIGFwcHJvYWNoKS4KICAgICAgICogVGhpcyBzdGVwcGVyIGlzIGFsc28gYWRhcHRpdmUgYW5kIGNhbiBiZSBlZmZpY2llbnQgd2hlbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICogYXJlIG5vdCB0b28gaGlnaCBhbmQgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHBhcmFtZXRlcnMgYXJlIGxvdy4KICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgb25lIG9yIG1vcmUgcGFyYW1ldGVyIGRlZmluaXRpb25zCiAgICAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy4KICAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAogICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCiAgICAgICovCiAgICAgIHZhciBBbXdnU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7CiAgICAgICAgdGhpcy5wYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTsKICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbdGhpcy5wYXJhbV9uYW1lc1tpXV07CiAgICAgICAgICB2YXIgU2VsZWN0U3RlcHBlcjsKICAgICAgICAgIHN3aXRjaCAocGFyYW0udHlwZSkgewogICAgICAgICAgICBjYXNlICJyZWFsIjoKICAgICAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CiAgICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gUmVhbE1ldHJvcG9saXNTdGVwcGVyOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJpbnQiOgogICAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKICAgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBJbnRNZXRyb3BvbGlzU3RlcHBlcjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJiaW5hcnkiOgogICAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKICAgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBCaW5hcnlTdGVwcGVyOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gQmluYXJ5Q29tcG9uZW50U3RlcHBlcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgdGhyb3cgIkFtd2dTdGVwcGVyIGNhbid0IGhhbmRsZSBwYXJhbWV0ZXIgIiArIHRoaXMucGFyYW1fbmFtZXNbaV0gKyAiIHdpdGggdHlwZSAiICsgcGFyYW0udHlwZTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBwYXJhbV9vYmplY3Rfd3JhcCA9IHt9OwogICAgICAgICAgcGFyYW1fb2JqZWN0X3dyYXBbdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSBwYXJhbTsKICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgICAgdmFyIHBhcmFtX29wdGlvbnMgPSBvcHRpb25zLnBhcmFtcyAmJiBvcHRpb25zLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVzW2ldXSB8fCB7fTsKICAgICAgICAgIHBhcmFtX29wdGlvbnMucHJvcF9sb2dfc2NhbGUgPSBwYXJhbV9vcHRpb25zLnByb3BfbG9nX3NjYWxlIHx8IG9wdGlvbnMucHJvcF9sb2dfc2NhbGU7CiAgICAgICAgICBwYXJhbV9vcHRpb25zLmJhdGNoX3NpemUgPSBwYXJhbV9vcHRpb25zLmJhdGNoX3NpemUgfHwgb3B0aW9ucy5iYXRjaF9zaXplOwogICAgICAgICAgcGFyYW1fb3B0aW9ucy5tYXhfYWRhcHRhdGlvbiA9IHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gfHwgb3B0aW9ucy5tYXhfYWRhcHRhdGlvbjsKICAgICAgICAgIHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uID0gcGFyYW1fb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb24gfHwgb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb247CiAgICAgICAgICBwYXJhbV9vcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZSA9IHBhcmFtX29wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlIHx8IG9wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlOwogICAgICAgICAgcGFyYW1fb3B0aW9ucy5pc19hZGFwdGluZyA9IHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgfHwgb3B0aW9ucy5pc19hZGFwdGluZzsKICAgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0gPSBuZXcgU2VsZWN0U3RlcHBlcihwYXJhbV9vYmplY3Rfd3JhcCwgc3RhdGUsIGxvZ19wb3N0LCBwYXJhbV9vcHRpb25zKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwogICAgICBBbXdnU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU3RlcHBlcjsKICAgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgc2h1ZmZsZV9hcnJheSh0aGlzLnN1YnN0ZXBwZXJzKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0uc3RlcCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZTsKICAgICAgfTsKICAgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0YXJ0X2FkYXB0YXRpb24oKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdG9wX2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0b3BfYWRhcHRhdGlvbigpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGluZm8gPSB7fTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGluZm9bdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSB0aGlzLnN1YnN0ZXBwZXJzW2ldLmluZm8oKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluZm87CiAgICAgIH07CgogICAgICAvLy8vLy8vLy8vLyBTYW1wbGVyIEZ1bmN0aW9ucyAvLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIC8qKgogICAgICAqIEBpbnRlcmZhY2UKICAgICAgKiBXaGlsZSB5b3UgY291bGQgZml0IGEgbW9kZWwgYnkgcGFzdGluZyB0b2dldGhlciBTdGVwcGVycywgYQogICAgICAvLyBTYW1wbGVyIGlzIGhlcmUgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyB3aGVyZSBhbiBpbnN0YW5jZSBvZiBTYW1wbGVyCiAgICAgIC8vIHNldHMgdXAgdGhlIFN0ZXBwZXJzLCBjaGVja3MgdGhlIHBhcmFtZXRlciBkZWZpbml0aW9uLAogICAgICAvLyBhbmQgbWFuYWdlcyB0aGUgc2FtcGxpbmcuIFRoaXMgaGVyZSBkZWZpbmVzIHRoZSBTYW1wbGVyICJpbnRlcmZhY2UiLgogICAgICAqIEBpbnRlcmZhY2UKICAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggcGFyYW1ldGVyIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZToKICAgICAgKiAgIHsibXUiOiB7InR5cGUiOiAicmVhbCJ9LCAic2lnbWEiOiB7InR5cGUiOiAicmVhbCIsICJsb3dlciIgPSAwfX0KICAgICAgKiAgIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgZG9lc24ndCBoYXZlIHRvIGJlICJjb21wbGV0ZSIgYW5kIHByb3BlcnRpZXMKICAgICAgKiAgIGxlZnQgb3V0IChsaWtlIGxvd2VyIGFuZCB1cHBlcikgd2lsbCBiZSBmaWxsZWQgaW4gYnkgZGVmYXVsdHMuCiAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihzdGF0ZSwgZGF0YSkuIEhlcmUKICAgICAgKiAgIHN0YXRlIHdpbGwgYmUgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3RhdGUgd2l0aCBlYWNoIHBhcmFtZXRlciBhcyBhIAogICAgICAqICAga2V5IGFuZCB0aGUgcGFyYW1ldGVyIHZhbHVlcyBhcyBudW1iZXJzIG9yIGFycmF5cy4gRm9yIGV4YW1wbGU6CiAgICAgICogICB7Im11IjogMywgInNpZ21hIjogMS41fS4gVGhlIGRhdGEgYXJndW1lbnQgd2lsbCBiZSB0aGUgc2FtZSBvYmplY3QgYXMgCiAgICAgICogICB0aGUgZGF0YSBhcmd1bWVudCBnaXZlbiBiZWxvdy4KICAgICAgKiBAcGFyYW0gZGF0YSAtIGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBsb2dfcG9zdCBmdW5jdGlvbgogICAgICAqICAgd2hlbiBzYW1wbGluZy4KICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHNhbXBsZXIuCiAgICAgICovCiAgICAgIHZhciBTYW1wbGVyID0gZnVuY3Rpb24gKHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpIHsKICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgogICAgICAgIC8vIFNldHRpbmcgZGVmYXVsdCBvcHRpb25zIGlmIG5vdCBwYXNzZWQgdGhyb3VnaCB0aGUgb3B0aW9ucyBvYmplY3QKICAgICAgICB0aGlzLnBhcmFtX2luaXRfZnVuID0gZ2V0X29wdGlvbigicGFyYW1faW5pdF9mdW4iLCBvcHRpb25zLCBwYXJhbV9pbml0X2ZpeGVkKTsKICAgICAgICB2YXIgdGhpbm5pbmdfaW50ZXJ2YWwgPSBnZXRfb3B0aW9uKCJ0aGluIiwgb3B0aW9ucywgMSk7CiAgICAgICAgdmFyIHBhcmFtc190b19tb25pdG9yID0gZ2V0X29wdGlvbigibW9uaXRvciIsIG9wdGlvbnMsIG51bGwpOwogICAgICAgIHRoaXMudGhpbih0aGlubmluZ19pbnRlcnZhbCk7CiAgICAgICAgdGhpcy5tb25pdG9yKHBhcmFtc190b19tb25pdG9yKTsKICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgIC8vIENvbXBsZXRpbmcgdGhlIHBhcmFtcyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBzdGF0ZS4KICAgICAgICB0aGlzLnBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyh0aGlzLnBhcmFtcywgdGhpcy5wYXJhbV9pbml0X2Z1bik7CiAgICAgICAgdmFyIHN0YXRlID0ge307CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBzdGF0ZVt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dLmluaXQ7CiAgICAgICAgfQogICAgICAgIHRoaXMubG9nX3Bvc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gbG9nX3Bvc3Qoc3RhdGUsIGRhdGEpOwogICAgICAgIH07CiAgICAgICAgLy8gUnVubmluZyB0aGUgbG9nX3Bvc3QgZnVuY3Rpb24gb25jZSBpbiBjYXNlIGl0IGZ1cnRoZXIgbW9kaWZpZXMgdGhlIHN0YXRlCiAgICAgICAgLy8gZm9yIGV4YW1wbGUgYWRkaW5nIGRlcml2ZWQgcXVhbnRpdGllcy4KICAgICAgICB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwogICAgICAgIHRoaXMuc3RlcHBlcnMgPSB0aGlzLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlKHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlLCB0aGlzLmxvZ19wb3N0LCB0aGlzLm9wdGlvbnMpOwogICAgICB9OwoKICAgICAgLyoqIFNob3VsZCByZXR1cm4gYSB2ZWN0b3Igb2Ygc3RlcHBlcnMgdGhhdCB3aGVuIGNhbGxlZCAKICAgICAgICogc2hvdWxkIHRha2UgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuCiAgICAgICAqLwogICAgICBTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uIChzdGF0ZSwgbG9nX3Bvc3QpIHsKICAgICAgICB0aHJvdyAiRXZlcnkgU2FtcGxlciBuZWVkcyB0byBpbXBsZW1lbnQgY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUoKSI7CiAgICAgIH07CgogICAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBpbmZvIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgU2FtcGxlci4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLAogICAgICAgICAgdGhpbjogdGhpcy50aGluLAogICAgICAgICAgbW9uaXRvcjogdGhpcy5tb25pdG9yLAogICAgICAgICAgc3RlcHBlcnM6IHRoaXMuc3RlcHBlcnMKICAgICAgICB9OwogICAgICB9OwoKICAgICAgLyoqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBSZXR1cm5zIHRoZSBuZXcgc3BhY2UKICAgICAgICogYnV0IGFsc28gbW9kaWZpZXMgdGhlIHN0YXRlIGluIHBsYWNlLgogICAgICAgKi8KICAgICAgU2FtcGxlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBzaHVmZmxlX2FycmF5KHRoaXMuc3RlcHBlcnMpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdGVwcGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGhpcy5zdGVwcGVyc1tpXS5zdGVwKCk7CiAgICAgICAgfQogICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnN0YXRlKS5sZW5ndGggPiBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcykubGVuZ3RoKSB7CiAgICAgICAgICAvLyBUaGUgc3RhdGUgY29udGFpbnMgZGV2aXZlZCBxdWFudGl0aWVzIChub3Qgb25seSBwYXJhbWV0ZXJzKSBhbmQgd2UKICAgICAgICAgIC8vIG5lZWQgdG8gcnVuIHRoZSBsb2dfcG9zdCBvbmNlIG1vcmUgaW4gb3JkZXIgdG8gc2V0IHRoZSBkZXJpdmVkIHF1YW50aXRpZXMKICAgICAgICAgIC8vIGZvciB0aGUgZmluYWwgcGFyYW1ldGVyIHN0YXRlCiAgICAgICAgICB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN0YXRlOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIFRha2VzIG5faXRlcmF0aW9ucyBzdGVwcyBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlIGFuZCByZXR1cm5zIHRoZW0KICAgICAgICogYXMgYW4gb2JqZWN0IG9mIGFycmF5cyB3aXRoIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZToKICAgICAgICoge211OiBbMSwgLTEsIDIsIDMsIC4uLl0sIHNpZ21hOiBbMSwgMiwgMiwgMSwgLi4uXX0uCiAgICAgICAqIElmIHRoaW4gaXMgPiAxIHRoZW4gbl9pdGVyYXRpb25zIC8gdGhpbiBzYW1wbGVzIGFyZSByZXR1cm5lZC4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLnNhbXBsZSA9IGZ1bmN0aW9uIChuX2l0ZXJhdGlvbnMpIHsKICAgICAgICAvLyBJbml0aWFsaXppbmcgY3Vycl9zYW1wbGUgd2hlcmUgdGhlIHNhbXBsZSBpcyBnb2luZyB0byBiZSBzYXZlZAogICAgICAgIC8vIGFzIGFuIG9iamVjdCBjb250YWluaW5nIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyIHRvIGJlIG1vbml0b3JlZC4KICAgICAgICB2YXIgaSwgaiwgbW9uaXRvcmVkX3BhcmFtczsKICAgICAgICBpZiAodGhpcy5tb25pdG9yZWRfcGFyYW1zID09PSBudWxsKSB7CiAgICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gT2JqZWN0LmtleXModGhpcy5zdGF0ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1vbml0b3JlZF9wYXJhbXMgPSB0aGlzLm1vbml0b3JlZF9wYXJhbXM7CiAgICAgICAgfQogICAgICAgIHZhciBjdXJyX3NhbXBsZSA9IHt9OwogICAgICAgIGZvciAoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBjdXJyX3NhbXBsZVttb25pdG9yZWRfcGFyYW1zW2pdXSA9IFtdOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHsKICAgICAgICAgIGlmIChpICUgdGhpcy50aGlubmluZ19pbnRlcnZhbCA9PT0gMCkgewogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbW9uaXRvcmVkX3BhcmFtcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgIHZhciBwYXJhbSA9IG1vbml0b3JlZF9wYXJhbXNbal07CiAgICAgICAgICAgICAgY3Vycl9zYW1wbGVbcGFyYW1dLnB1c2goY2xvbmVfcGFyYW1fZHJhdyh0aGlzLnN0YXRlW3BhcmFtXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnN0ZXAoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGN1cnJfc2FtcGxlOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIFRha2VzIG5faXRlcmF0aW9uIHN0ZXBzIGluIHBhcmFtZXRlciBzcGFjZSBidXQgcmV0dXJucyBub3RoaW5nLgogICAgICAgKi8KICAgICAgU2FtcGxlci5wcm90b3R5cGUuYnVybiA9IGZ1bmN0aW9uIChuX2l0ZXJhdGlvbnMpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5faXRlcmF0aW9uczsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN0ZXAoKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogU2V0cyB3aGF0IHBhcmFtZXRlcnMgc2hvdWxkIGJlIG1vbml0b3JlZCBhbmQgcmV0dXJuZWQgd2hlbiBjYWxsaW5nCiAgICAgICAqIHNhbXBsZS4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLm1vbml0b3IgPSBmdW5jdGlvbiAocGFyYW1zX3RvX21vbml0b3IpIHsKICAgICAgICB0aGlzLm1vbml0b3JlZF9wYXJhbXMgPSBwYXJhbXNfdG9fbW9uaXRvcjsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBTZXRzIHRoZSB0aGlubmluZy4gRm9yIGV4YW1wbGUgdGhpbiA9PSAxMCBtZWFucyB0aGF0IGV2ZXJ5IDEwdGggcG9zdGVyaW9yCiAgICAgICAqIGRyYXcgd2lsbCBiZSBrZXB0LgogICAgICAgKi8KICAgICAgU2FtcGxlci5wcm90b3R5cGUudGhpbiA9IGZ1bmN0aW9uICh0aGlubmluZ19pbnRlcnZhbCkgewogICAgICAgIHRoaXMudGhpbm5pbmdfaW50ZXJ2YWwgPSB0aGlubmluZ19pbnRlcnZhbDsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBTZXRzIGFkYXB0YXRpb24gb24sIGlmIGFwcGxpY2FibGUsIGluIGFsbCBzdGVwcGVycy4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0YXJ0X2FkYXB0YXRpb24oKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgKiBTZXRzIGFkYXB0YXRpb24gb2ZmLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuCiAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgLyoqCiAgICAgICogQGNsYXNzCiAgICAgICogQGltcGxlbWVudHMge1NhbXBsZXJ9CiAgICAgICogVGhpcyBzYW1wbGVyIHVzZXMgdGhlIEFtd2dTdGVwcGVyIGFzIHRoZSBzdGVwcGVyIGZ1bmN0aW9uIHdoaWNoIGltcGxlbWVudHMgdGhlIAogICAgICAqIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiAiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQyIKICAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLiBBbiBhZGl0aW9uIGlzIHRoYXQgaXQgaGFuZGxlcyBpbnQgcGFyYW1ldGVycwogICAgICAqIGJ5IG1ha2luZyBkaXNjcmV0ZSBOb3JtYWwgcHJvcG9zYWxzIGFuZCBiaW5hcnkgcGFyYW1ldGVycyBieSB0YWtpbmcgb24gYSBuZXcgCiAgICAgICogdmFsdWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBwb3N0ZXJpb3Igb2YgdGhlIHR3byBwb3NzaWJsZSBzdGF0ZXMgb2YgdGhlCiAgICAgICogcGFyYW1ldGVyLiBUaGlzIHNhbXBsZXIgY2FuIGJlIGVmZmljaWVudCB3aGVuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwogICAgICAqIGFyZSBub3QgdG9vIGhpZ2ggYW5kIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJhbWV0ZXJzIGFyZSBsb3cuCiAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgb25lIG9yIG1vcmUgcGFyYW1ldGVyIGRlZmluaXRpb25zCiAgICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLgogICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCiAgICAgICovCiAgICAgIHZhciBBbXdnU2FtcGxlciA9IGZ1bmN0aW9uIChwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgU2FtcGxlci5jYWxsKHRoaXMsIHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpOwogICAgICB9OwogICAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNhbXBsZXIucHJvdG90eXBlKTsKICAgICAgQW13Z1NhbXBsZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQW13Z1NhbXBsZXI7CiAgICAgIEFtd2dTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBbbmV3IEFtd2dTdGVwcGVyKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKV07CiAgICAgIH07CgogICAgICAvLyBSZXR1cm5pbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBwdWJsaWNseSBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCiAgICAgIHJldHVybiB7CiAgICAgICAgcnVuaWY6IHJ1bmlmLAogICAgICAgIHJ1bmlmX2Rpc2NyZXRlOiBydW5pZl9kaXNjcmV0ZSwKICAgICAgICBybm9ybTogcm5vcm0sCiAgICAgICAgcGFyYW1faW5pdF9maXhlZDogcGFyYW1faW5pdF9maXhlZCwKICAgICAgICBjb21wbGV0ZV9wYXJhbXM6IGNvbXBsZXRlX3BhcmFtcywKICAgICAgICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI6IFJlYWxNZXRyb3BvbGlzU3RlcHBlciwKICAgICAgICBJbnRNZXRyb3BvbGlzU3RlcHBlcjogSW50TWV0cm9wb2xpc1N0ZXBwZXIsCiAgICAgICAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLAogICAgICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsCiAgICAgICAgQmluYXJ5U3RlcHBlcjogQmluYXJ5U3RlcHBlciwKICAgICAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyOiBCaW5hcnlDb21wb25lbnRTdGVwcGVyLAogICAgICAgIEFtd2dTdGVwcGVyOiBBbXdnU3RlcHBlciwKICAgICAgICBBbXdnU2FtcGxlcjogQW13Z1NhbXBsZXIKICAgICAgfTsKICAgIH0pOwogIH0pKG1jbWMkMSk7CiAgdmFyIG1jbWNFeHBvcnRzID0gbWNtYyQxLmV4cG9ydHM7CgogIGZ1bmN0aW9uIGFzY2VuZGluZyQxKGEsIGIpIHsKICAgIHJldHVybiBhID09IG51bGwgfHwgYiA9PSBudWxsID8gTmFOIDogYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47CiAgfQoKICBmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHsKICAgIHsKICAgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7CiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkgewogICAgICAgICAgeWllbGQgdmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb21wYXJlRGVmaW5lZChjb21wYXJlID0gYXNjZW5kaW5nJDEpIHsKICAgIGlmIChjb21wYXJlID09PSBhc2NlbmRpbmckMSkgcmV0dXJuIGFzY2VuZGluZ0RlZmluZWQ7CiAgICBpZiAodHlwZW9mIGNvbXBhcmUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNvbXBhcmUgaXMgbm90IGEgZnVuY3Rpb24iKTsKICAgIHJldHVybiAoYSwgYikgPT4gewogICAgICBjb25zdCB4ID0gY29tcGFyZShhLCBiKTsKICAgICAgaWYgKHggfHwgeCA9PT0gMCkgcmV0dXJuIHg7CiAgICAgIHJldHVybiAoY29tcGFyZShiLCBiKSA9PT0gMCkgLSAoY29tcGFyZShhLCBhKSA9PT0gMCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhc2NlbmRpbmdEZWZpbmVkKGEsIGIpIHsKICAgIHJldHVybiAoYSA9PSBudWxsIHx8ICEoYSA+PSBhKSkgLSAoYiA9PSBudWxsIHx8ICEoYiA+PSBiKSkgfHwgKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTsKICB9CgogIGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHsKICAgIGxldCBtYXg7CiAgICB7CiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7CiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKG1heCA8IHZhbHVlIHx8IG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkgewogICAgICAgICAgbWF4ID0gdmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbWF4OwogIH0KCiAgZnVuY3Rpb24gbWluKHZhbHVlcywgdmFsdWVvZikgewogICAgbGV0IG1pbjsKICAgIHsKICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHsKICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAobWluID4gdmFsdWUgfHwgbWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSB7CiAgICAgICAgICBtaW4gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtaW47CiAgfQoKICAvLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbW91cm5lci9xdWlja3NlbGVjdAogIC8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uCiAgZnVuY3Rpb24gcXVpY2tzZWxlY3QoYXJyYXksIGssIGxlZnQgPSAwLCByaWdodCA9IEluZmluaXR5LCBjb21wYXJlKSB7CiAgICBrID0gTWF0aC5mbG9vcihrKTsKICAgIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTsKICAgIHJpZ2h0ID0gTWF0aC5mbG9vcihNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCByaWdodCkpOwogICAgaWYgKCEobGVmdCA8PSBrICYmIGsgPD0gcmlnaHQpKSByZXR1cm4gYXJyYXk7CiAgICBjb21wYXJlID0gY29tcGFyZSA9PT0gdW5kZWZpbmVkID8gYXNjZW5kaW5nRGVmaW5lZCA6IGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUpOwogICAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkgewogICAgICBpZiAocmlnaHQgLSBsZWZ0ID4gNjAwKSB7CiAgICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7CiAgICAgICAgY29uc3QgbSA9IGsgLSBsZWZ0ICsgMTsKICAgICAgICBjb25zdCB6ID0gTWF0aC5sb2cobik7CiAgICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7CiAgICAgICAgY29uc3Qgc2QgPSAwLjUgKiBNYXRoLnNxcnQoeiAqIHMgKiAobiAtIHMpIC8gbikgKiAobSAtIG4gLyAyIDwgMCA/IC0xIDogMSk7CiAgICAgICAgY29uc3QgbmV3TGVmdCA9IE1hdGgubWF4KGxlZnQsIE1hdGguZmxvb3IoayAtIG0gKiBzIC8gbiArIHNkKSk7CiAgICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTsKICAgICAgICBxdWlja3NlbGVjdChhcnJheSwgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGNvbXBhcmUpOwogICAgICB9CiAgICAgIGNvbnN0IHQgPSBhcnJheVtrXTsKICAgICAgbGV0IGkgPSBsZWZ0OwogICAgICBsZXQgaiA9IHJpZ2h0OwogICAgICBzd2FwKGFycmF5LCBsZWZ0LCBrKTsKICAgICAgaWYgKGNvbXBhcmUoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyYXksIGxlZnQsIHJpZ2h0KTsKICAgICAgd2hpbGUgKGkgPCBqKSB7CiAgICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qOwogICAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2ldLCB0KSA8IDApICsraTsKICAgICAgICB3aGlsZSAoY29tcGFyZShhcnJheVtqXSwgdCkgPiAwKSAtLWo7CiAgICAgIH0KICAgICAgaWYgKGNvbXBhcmUoYXJyYXlbbGVmdF0sIHQpID09PSAwKSBzd2FwKGFycmF5LCBsZWZ0LCBqKTtlbHNlICsraiwgc3dhcChhcnJheSwgaiwgcmlnaHQpOwogICAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7CiAgICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7CiAgICB9CiAgICByZXR1cm4gYXJyYXk7CiAgfQogIGZ1bmN0aW9uIHN3YXAoYXJyYXksIGksIGopIHsKICAgIGNvbnN0IHQgPSBhcnJheVtpXTsKICAgIGFycmF5W2ldID0gYXJyYXlbal07CiAgICBhcnJheVtqXSA9IHQ7CiAgfQoKICBmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHsKICAgIHZhbHVlcyA9IEZsb2F0NjRBcnJheS5mcm9tKG51bWJlcnModmFsdWVzKSk7CiAgICBpZiAoIShuID0gdmFsdWVzLmxlbmd0aCkgfHwgaXNOYU4ocCA9ICtwKSkgcmV0dXJuOwogICAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpOwogICAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heCh2YWx1ZXMpOwogICAgdmFyIG4sCiAgICAgIGkgPSAobiAtIDEpICogcCwKICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLAogICAgICB2YWx1ZTAgPSBtYXgocXVpY2tzZWxlY3QodmFsdWVzLCBpMCkuc3ViYXJyYXkoMCwgaTAgKyAxKSksCiAgICAgIHZhbHVlMSA9IG1pbih2YWx1ZXMuc3ViYXJyYXkoaTAgKyAxKSk7CiAgICByZXR1cm4gdmFsdWUwICsgKHZhbHVlMSAtIHZhbHVlMCkgKiAoaSAtIGkwKTsKICB9CgogIGZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIHZhbHVlb2YpIHsKICAgIHJldHVybiBxdWFudGlsZSh2YWx1ZXMsIDAuNSk7CiAgfQoKICB2YXIgbm9vcCA9IHsKICAgIHZhbHVlOiAoKSA9PiB7fQogIH07CiAgZnVuY3Rpb24gZGlzcGF0Y2goKSB7CiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF8gPSB7fSwgdDsgaSA8IG47ICsraSkgewogICAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgIiIpIHx8IHQgaW4gXyB8fCAvW1xzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiICsgdCk7CiAgICAgIF9bdF0gPSBbXTsKICAgIH0KICAgIHJldHVybiBuZXcgRGlzcGF0Y2goXyk7CiAgfQogIGZ1bmN0aW9uIERpc3BhdGNoKF8pIHsKICAgIHRoaXMuXyA9IF87CiAgfQogIGZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzJDEodHlwZW5hbWVzLCB0eXBlcykgewogICAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgIHZhciBuYW1lID0gIiIsCiAgICAgICAgaSA9IHQuaW5kZXhPZigiLiIpOwogICAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpOwogICAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdHlwZTogdCwKICAgICAgICBuYW1lOiBuYW1lCiAgICAgIH07CiAgICB9KTsKICB9CiAgRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gucHJvdG90eXBlID0gewogICAgY29uc3RydWN0b3I6IERpc3BhdGNoLAogICAgb246IGZ1bmN0aW9uICh0eXBlbmFtZSwgY2FsbGJhY2spIHsKICAgICAgdmFyIF8gPSB0aGlzLl8sCiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzJDEodHlwZW5hbWUgKyAiIiwgXyksCiAgICAgICAgdCwKICAgICAgICBpID0gLTEsCiAgICAgICAgbiA9IFQubGVuZ3RoOwoKICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4KICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpICYmICh0ID0gZ2V0JDEoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4KICAgICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS4KICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIgKyBjYWxsYmFjayk7CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0JDEoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spO2Vsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0JDEoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgY29weTogZnVuY3Rpb24gKCkgewogICAgICB2YXIgY29weSA9IHt9LAogICAgICAgIF8gPSB0aGlzLl87CiAgICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTsKICAgICAgcmV0dXJuIG5ldyBEaXNwYXRjaChjb3B5KTsKICAgIH0sCiAgICBjYWxsOiBmdW5jdGlvbiAodHlwZSwgdGhhdCkgewogICAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07CiAgICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOwogICAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7CiAgICB9LAogICAgYXBwbHk6IGZ1bmN0aW9uICh0eXBlLCB0aGF0LCBhcmdzKSB7CiAgICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOwogICAgICBmb3IgKHZhciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpOwogICAgfQogIH07CiAgZnVuY3Rpb24gZ2V0JDEodHlwZSwgbmFtZSkgewogICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkgewogICAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgcmV0dXJuIGMudmFsdWU7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gc2V0JDEodHlwZSwgbmFtZSwgY2FsbGJhY2spIHsKICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkgewogICAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHsKICAgICAgbmFtZTogbmFtZSwKICAgICAgdmFsdWU6IGNhbGxiYWNrCiAgICB9KTsKICAgIHJldHVybiB0eXBlOwogIH0KCiAgdmFyIHhodG1sID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOwogIHZhciBuYW1lc3BhY2VzID0gewogICAgc3ZnOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLAogICAgeGh0bWw6IHhodG1sLAogICAgeGxpbms6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwKICAgIHhtbDogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCiAgICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIgogIH07CgogIGZ1bmN0aW9uIG5hbWVzcGFjZSAobmFtZSkgewogICAgdmFyIHByZWZpeCA9IG5hbWUgKz0gIiIsCiAgICAgIGkgPSBwcmVmaXguaW5kZXhPZigiOiIpOwogICAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09ICJ4bWxucyIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTsKICAgIHJldHVybiBuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7CiAgICAgIHNwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sCiAgICAgIGxvY2FsOiBuYW1lCiAgICB9IDogbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMKICB9CgogIGZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCwKICAgICAgICB1cmkgPSB0aGlzLm5hbWVzcGFjZVVSSTsKICAgICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWwgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjcmVhdG9yRml4ZWQoZnVsbG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjcmVhdG9yIChuYW1lKSB7CiAgICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7CiAgICByZXR1cm4gKGZ1bGxuYW1lLmxvY2FsID8gY3JlYXRvckZpeGVkIDogY3JlYXRvckluaGVyaXQpKGZ1bGxuYW1lKTsKICB9CgogIGZ1bmN0aW9uIG5vbmUoKSB7fQogIGZ1bmN0aW9uIHNlbGVjdG9yIChzZWxlY3RvcikgewogICAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBub25lIDogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0IChzZWxlY3QpIHsKICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187CiAgICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQxKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7CiAgfQoKICAvLyBHaXZlbiBzb21ldGhpbmcgYXJyYXkgbGlrZSAob3IgbnVsbCksIHJldHVybnMgc29tZXRoaW5nIHRoYXQgaXMgc3RyaWN0bHkgYW4KICAvLyBhcnJheS4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGFycmF5LWxpa2Ugb2JqZWN0cyBwYXNzZWQgdG8gZDMuc2VsZWN0QWxsCiAgLy8gb3Igc2VsZWN0aW9uLnNlbGVjdEFsbCBhcmUgY29udmVydGVkIGludG8gcHJvcGVyIGFycmF5cyB3aGVuIGNyZWF0aW5nIGEKICAvLyBzZWxlY3Rpb247IHdlIGRvbuKAmXQgZXZlciB3YW50IHRvIGNyZWF0ZSBhIHNlbGVjdGlvbiBiYWNrZWQgYnkgYSBsaXZlCiAgLy8gSFRNTENvbGxlY3Rpb24gb3IgTm9kZUxpc3QuIEhvd2V2ZXIsIG5vdGUgdGhhdCBzZWxlY3Rpb24uc2VsZWN0QWxsIHdpbGwgdXNlIGEKICAvLyBzdGF0aWMgTm9kZUxpc3QgYXMgYSBncm91cCwgc2luY2UgaXQgc2FmZWx5IGRlcml2ZWQgZnJvbSBxdWVyeVNlbGVjdG9yQWxsLgogIGZ1bmN0aW9uIGFycmF5KHgpIHsKICAgIHJldHVybiB4ID09IG51bGwgPyBbXSA6IEFycmF5LmlzQXJyYXkoeCkgPyB4IDogQXJyYXkuZnJvbSh4KTsKICB9CgogIGZ1bmN0aW9uIGVtcHR5KCkgewogICAgcmV0dXJuIFtdOwogIH0KICBmdW5jdGlvbiBzZWxlY3RvckFsbCAoc2VsZWN0b3IpIHsKICAgIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkgOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGFycmF5QWxsKHNlbGVjdCkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGFycmF5KHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3RBbGwgKHNlbGVjdCkgewogICAgaWYgKHR5cGVvZiBzZWxlY3QgPT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IGFycmF5QWxsKHNlbGVjdCk7ZWxzZSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgc3ViZ3JvdXBzLnB1c2goc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKTsKICAgICAgICAgIHBhcmVudHMucHVzaChub2RlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDEoc3ViZ3JvdXBzLCBwYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIG1hdGNoZXIgKHNlbGVjdG9yKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHNlbGVjdG9yKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNoaWxkTWF0Y2hlcihzZWxlY3RvcikgewogICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7CiAgICAgIHJldHVybiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpOwogICAgfTsKICB9CgogIHZhciBmaW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmQ7CiAgZnVuY3Rpb24gY2hpbGRGaW5kKG1hdGNoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gZmluZC5jYWxsKHRoaXMuY2hpbGRyZW4sIG1hdGNoKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNoaWxkRmlyc3QoKSB7CiAgICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZDsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdENoaWxkIChtYXRjaCkgewogICAgcmV0dXJuIHRoaXMuc2VsZWN0KG1hdGNoID09IG51bGwgPyBjaGlsZEZpcnN0IDogY2hpbGRGaW5kKHR5cGVvZiBtYXRjaCA9PT0gImZ1bmN0aW9uIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpOwogIH0KCiAgdmFyIGZpbHRlciA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXI7CiAgZnVuY3Rpb24gY2hpbGRyZW4oKSB7CiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKTsKICB9CiAgZnVuY3Rpb24gY2hpbGRyZW5GaWx0ZXIobWF0Y2gpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0Q2hpbGRyZW4gKG1hdGNoKSB7CiAgICByZXR1cm4gdGhpcy5zZWxlY3RBbGwobWF0Y2ggPT0gbnVsbCA/IGNoaWxkcmVuIDogY2hpbGRyZW5GaWx0ZXIodHlwZW9mIG1hdGNoID09PSAiZnVuY3Rpb24iID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZmlsdGVyIChtYXRjaCkgewogICAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gImZ1bmN0aW9uIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTsKICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7CiAgICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kMShzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpOwogIH0KCiAgZnVuY3Rpb24gc3BhcnNlICh1cGRhdGUpIHsKICAgIHJldHVybiBuZXcgQXJyYXkodXBkYXRlLmxlbmd0aCk7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZW50ZXIgKCkgewogICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kMSh0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpOwogIH0KICBmdW5jdGlvbiBFbnRlck5vZGUocGFyZW50LCBkYXR1bSkgewogICAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7CiAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7CiAgICB0aGlzLl9uZXh0ID0gbnVsbDsKICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDsKICAgIHRoaXMuX19kYXRhX18gPSBkYXR1bTsKICB9CiAgRW50ZXJOb2RlLnByb3RvdHlwZSA9IHsKICAgIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUsCiAgICBhcHBlbmRDaGlsZDogZnVuY3Rpb24gKGNoaWxkKSB7CiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsKICAgIH0sCiAgICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uIChjaGlsZCwgbmV4dCkgewogICAgICByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7CiAgICB9LAogICAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24gKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICB9LAogICAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24gKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gY29uc3RhbnQkMSAoeCkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHg7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHsKICAgIHZhciBpID0gMCwKICAgICAgbm9kZSwKICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsCiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDsKCiAgICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLgogICAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuCiAgICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuCiAgICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkgewogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07CiAgICAgICAgdXBkYXRlW2ldID0gbm9kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTsKICAgICAgfQogICAgfQoKICAgIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBkb27igJl0IGZpdCBpbnRvIGV4aXQuCiAgICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7CiAgICB2YXIgaSwKICAgICAgbm9kZSwKICAgICAgbm9kZUJ5S2V5VmFsdWUgPSBuZXcgTWFwKCksCiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksCiAgICAgIGtleVZhbHVlOwoKICAgIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLgogICAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0LgogICAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApICsgIiI7CiAgICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHsKICAgICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS4KICAgIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuCiAgICAvLyBJZiB0aGVyZSBpcyBub3QgKG9yIHRoZSBrZXkgaXMgYSBkdXBsaWNhdGUpLCBhZGQgaXQgdG8gZW50ZXIuCiAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7CiAgICAgIGtleVZhbHVlID0ga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKSArICIiOwogICAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZSkpIHsKICAgICAgICB1cGRhdGVbaV0gPSBub2RlOwogICAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldOwogICAgICAgIG5vZGVCeUtleVZhbHVlLmRlbGV0ZShrZXlWYWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC4KICAgIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7CiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWVzW2ldKSA9PT0gbm9kZSkgewogICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGRhdHVtKG5vZGUpIHsKICAgIHJldHVybiBub2RlLl9fZGF0YV9fOwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fZGF0YSAodmFsdWUsIGtleSkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLCBkYXR1bSk7CiAgICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsCiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLAogICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB2YWx1ZSA9IGNvbnN0YW50JDEodmFsdWUpOwogICAgZm9yICh2YXIgbSA9IGdyb3Vwcy5sZW5ndGgsIHVwZGF0ZSA9IG5ldyBBcnJheShtKSwgZW50ZXIgPSBuZXcgQXJyYXkobSksIGV4aXQgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLAogICAgICAgIGdyb3VwID0gZ3JvdXBzW2pdLAogICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgIGRhdGEgPSBhcnJheWxpa2UodmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpKSwKICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIHVwZGF0ZUdyb3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpOwogICAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7CgogICAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXQKICAgICAgLy8gYXBwZW5kQ2hpbGQgY2FuIGluc2VydCB0aGUgbWF0ZXJpYWxpemVkIGVudGVyIG5vZGUgYmVmb3JlIHRoaXMgbm9kZSwKICAgICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuCiAgICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7CiAgICAgICAgaWYgKHByZXZpb3VzID0gZW50ZXJHcm91cFtpMF0pIHsKICAgICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7CiAgICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7CiAgICAgICAgICBwcmV2aW91cy5fbmV4dCA9IG5leHQgfHwgbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24kMSh1cGRhdGUsIHBhcmVudHMpOwogICAgdXBkYXRlLl9lbnRlciA9IGVudGVyOwogICAgdXBkYXRlLl9leGl0ID0gZXhpdDsKICAgIHJldHVybiB1cGRhdGU7CiAgfQoKICAvLyBHaXZlbiBzb21lIGRhdGEsIHRoaXMgcmV0dXJucyBhbiBhcnJheS1saWtlIHZpZXcgb2YgaXQ6IGFuIG9iamVjdCB0aGF0CiAgLy8gZXhwb3NlcyBhIGxlbmd0aCBwcm9wZXJ0eSBhbmQgYWxsb3dzIG51bWVyaWMgaW5kZXhpbmcuIE5vdGUgdGhhdCB1bmxpa2UKICAvLyBzZWxlY3RBbGwsIHRoaXMgaXNu4oCZdCB3b3JyaWVkIGFib3V0IOKAnGxpdmXigJ0gY29sbGVjdGlvbnMgYmVjYXVzZSB0aGUgcmVzdWx0aW5nCiAgLy8gYXJyYXkgd2lsbCBvbmx5IGJlIHVzZWQgYnJpZWZseSB3aGlsZSBkYXRhIGlzIGJlaW5nIGJvdW5kLiAoSXQgaXMgcG9zc2libGUgdG8KICAvLyBjYXVzZSB0aGUgZGF0YSB0byBjaGFuZ2Ugd2hpbGUgaXRlcmF0aW5nIGJ5IHVzaW5nIGEga2V5IGZ1bmN0aW9uLCBidXQgcGxlYXNlCiAgLy8gZG9u4oCZdDsgd2XigJlkIHJhdGhlciBhdm9pZCBhIGdyYXR1aXRvdXMgY29weS4pCiAgZnVuY3Rpb24gYXJyYXlsaWtlKGRhdGEpIHsKICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIgJiYgImxlbmd0aCIgaW4gZGF0YSA/IGRhdGEgLy8gQXJyYXksIFR5cGVkQXJyYXksIE5vZGVMaXN0LCBhcnJheS1saWtlCiAgICA6IEFycmF5LmZyb20oZGF0YSk7IC8vIE1hcCwgU2V0LCBpdGVyYWJsZSwgc3RyaW5nLCBvciBhbnl0aGluZyBlbHNlCiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZXhpdCAoKSB7CiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQxKHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9qb2luIChvbmVudGVyLCBvbnVwZGF0ZSwgb25leGl0KSB7CiAgICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksCiAgICAgIHVwZGF0ZSA9IHRoaXMsCiAgICAgIGV4aXQgPSB0aGlzLmV4aXQoKTsKICAgIGlmICh0eXBlb2Ygb25lbnRlciA9PT0gImZ1bmN0aW9uIikgewogICAgICBlbnRlciA9IG9uZW50ZXIoZW50ZXIpOwogICAgICBpZiAoZW50ZXIpIGVudGVyID0gZW50ZXIuc2VsZWN0aW9uKCk7CiAgICB9IGVsc2UgewogICAgICBlbnRlciA9IGVudGVyLmFwcGVuZChvbmVudGVyICsgIiIpOwogICAgfQogICAgaWYgKG9udXBkYXRlICE9IG51bGwpIHsKICAgICAgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTsKICAgICAgaWYgKHVwZGF0ZSkgdXBkYXRlID0gdXBkYXRlLnNlbGVjdGlvbigpOwogICAgfQogICAgaWYgKG9uZXhpdCA9PSBudWxsKSBleGl0LnJlbW92ZSgpO2Vsc2Ugb25leGl0KGV4aXQpOwogICAgcmV0dXJuIGVudGVyICYmIHVwZGF0ZSA/IGVudGVyLm1lcmdlKHVwZGF0ZSkub3JkZXIoKSA6IHVwZGF0ZTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9tZXJnZSAoY29udGV4dCkgewogICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7CiAgICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7CiAgICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICAgIH0KICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDEobWVyZ2VzLCB0aGlzLl9wYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9vcmRlciAoKSB7CiAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAtMSwgbSA9IGdyb3Vwcy5sZW5ndGg7ICsraiA8IG07KSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBpZiAobmV4dCAmJiBub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5leHQpIF4gNCkgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTsKICAgICAgICAgIG5leHQgPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fc29ydCAoY29tcGFyZSkgewogICAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nOwogICAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikgewogICAgICByZXR1cm4gYSAmJiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7CiAgICB9CiAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7CiAgICB9CiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQxKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7CiAgfQogIGZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7CiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fY2FsbCAoKSB7CiAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07CiAgICBhcmd1bWVudHNbMF0gPSB0aGlzOwogICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX25vZGVzICgpIHsKICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMpOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX25vZGUgKCkgewogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTsKICAgICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX3NpemUgKCkgewogICAgbGV0IHNpemUgPSAwOwogICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMpICsrc2l6ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgcmV0dXJuIHNpemU7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZW1wdHkgKCkgewogICAgcmV0dXJuICF0aGlzLm5vZGUoKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9lYWNoIChjYWxsYmFjaykgewogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KCiAgZnVuY3Rpb24gYXR0clJlbW92ZSQxKG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0clJlbW92ZU5TJDEoZnVsbG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGF0dHJDb25zdGFudCQxKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyQ29uc3RhbnROUyQxKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbiQxKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO2Vsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyQxKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7ZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdik7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fYXR0ciAobmFtZSwgdmFsdWUpIHsKICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSgpOwogICAgICByZXR1cm4gZnVsbG5hbWUubG9jYWwgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCkgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsID8gZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMkMSA6IGF0dHJSZW1vdmUkMSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIiA/IGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMkMSA6IGF0dHJGdW5jdGlvbiQxIDogZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyQxIDogYXR0ckNvbnN0YW50JDEpKGZ1bGxuYW1lLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gZGVmYXVsdFZpZXcgKG5vZGUpIHsKICAgIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IC8vIG5vZGUgaXMgYSBOb2RlCiAgICB8fCBub2RlLmRvY3VtZW50ICYmIG5vZGUgLy8gbm9kZSBpcyBhIFdpbmRvdwogICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50CiAgfQoKICBmdW5jdGlvbiBzdHlsZVJlbW92ZSQxKG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZUNvbnN0YW50JDEobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uJDEobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh2ID09IG51bGwpIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7ZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9zdHlsZSAobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyBzdHlsZVJlbW92ZSQxIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gc3R5bGVGdW5jdGlvbiQxIDogc3R5bGVDb25zdGFudCQxKShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/ICIiIDogcHJpb3JpdHkpKSA6IHN0eWxlVmFsdWUodGhpcy5ub2RlKCksIG5hbWUpOwogIH0KICBmdW5jdGlvbiBzdHlsZVZhbHVlKG5vZGUsIG5hbWUpIHsKICAgIHJldHVybiBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkgfHwgZGVmYXVsdFZpZXcobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpOwogIH0KCiAgZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgZGVsZXRlIHRoaXNbbmFtZV07CiAgICB9OwogIH0KICBmdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzW25hbWVdID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO2Vsc2UgdGhpc1tuYW1lXSA9IHY7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fcHJvcGVydHkgKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIiA/IHByb3BlcnR5RnVuY3Rpb24gOiBwcm9wZXJ0eUNvbnN0YW50KShuYW1lLCB2YWx1ZSkpIDogdGhpcy5ub2RlKClbbmFtZV07CiAgfQoKICBmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykgewogICAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XHMrLyk7CiAgfQogIGZ1bmN0aW9uIGNsYXNzTGlzdChub2RlKSB7CiAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTsKICB9CiAgZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHsKICAgIHRoaXMuX25vZGUgPSBub2RlOwogICAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8ICIiKTsKICB9CiAgQ2xhc3NMaXN0LnByb3RvdHlwZSA9IHsKICAgIGFkZDogZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpOwogICAgICBpZiAoaSA8IDApIHsKICAgICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsIHRoaXMuX25hbWVzLmpvaW4oIiAiKSk7CiAgICAgIH0KICAgIH0sCiAgICByZW1vdmU6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsKICAgICAgaWYgKGkgPj0gMCkgewogICAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTsKICAgICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOwogICAgICB9CiAgICB9LAogICAgY29udGFpbnM6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7CiAgICB9CiAgfTsKICBmdW5jdGlvbiBjbGFzc2VkQWRkKG5vZGUsIG5hbWVzKSB7CiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwKICAgICAgaSA9IC0xLAogICAgICBuID0gbmFtZXMubGVuZ3RoOwogICAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTsKICB9CiAgZnVuY3Rpb24gY2xhc3NlZFJlbW92ZShub2RlLCBuYW1lcykgewogICAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksCiAgICAgIGkgPSAtMSwKICAgICAgbiA9IG5hbWVzLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7CiAgfQogIGZ1bmN0aW9uIGNsYXNzZWRUcnVlKG5hbWVzKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICBjbGFzc2VkQWRkKHRoaXMsIG5hbWVzKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQgOiBjbGFzc2VkUmVtb3ZlKSh0aGlzLCBuYW1lcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fY2xhc3NlZCAobmFtZSwgdmFsdWUpIHsKICAgIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArICIiKTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCh0aGlzLm5vZGUoKSksCiAgICAgICAgaSA9IC0xLAogICAgICAgIG4gPSBuYW1lcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gY2xhc3NlZEZ1bmN0aW9uIDogdmFsdWUgPyBjbGFzc2VkVHJ1ZSA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7CiAgfQoKICBmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkgewogICAgdGhpcy50ZXh0Q29udGVudCA9ICIiOwogIH0KICBmdW5jdGlvbiB0ZXh0Q29uc3RhbnQkMSh2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdGV4dEZ1bmN0aW9uJDEodmFsdWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/ICIiIDogdjsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl90ZXh0ICh2YWx1ZSkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbCA/IHRleHRSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gdGV4dEZ1bmN0aW9uJDEgOiB0ZXh0Q29uc3RhbnQkMSkodmFsdWUpKSA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50OwogIH0KCiAgZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHsKICAgIHRoaXMuaW5uZXJIVE1MID0gIiI7CiAgfQogIGZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB0aGlzLmlubmVySFRNTCA9IHYgPT0gbnVsbCA/ICIiIDogdjsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9odG1sICh2YWx1ZSkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbCA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gaHRtbEZ1bmN0aW9uIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpIDogdGhpcy5ub2RlKCkuaW5uZXJIVE1MOwogIH0KCiAgZnVuY3Rpb24gcmFpc2UoKSB7CiAgICBpZiAodGhpcy5uZXh0U2libGluZykgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpOwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fcmFpc2UgKCkgewogICAgcmV0dXJuIHRoaXMuZWFjaChyYWlzZSk7CiAgfQoKICBmdW5jdGlvbiBsb3dlcigpIHsKICAgIGlmICh0aGlzLnByZXZpb3VzU2libGluZykgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLCB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9sb3dlciAoKSB7CiAgICByZXR1cm4gdGhpcy5lYWNoKGxvd2VyKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9hcHBlbmQgKG5hbWUpIHsKICAgIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpOwogICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBjb25zdGFudE51bGwoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX2luc2VydCAobmFtZSwgYmVmb3JlKSB7CiAgICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvcihuYW1lKSwKICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBlb2YgYmVmb3JlID09PSAiZnVuY3Rpb24iID8gYmVmb3JlIDogc2VsZWN0b3IoYmVmb3JlKTsKICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZSgpIHsKICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9yZW1vdmUgKCkgewogICAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdygpIHsKICAgIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwKICAgICAgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZURlZXAoKSB7CiAgICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwKICAgICAgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZSAoZGVlcCkgewogICAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwIDogc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyk7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZGF0dW0gKHZhbHVlKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMucHJvcGVydHkoIl9fZGF0YV9fIiwgdmFsdWUpIDogdGhpcy5ub2RlKCkuX19kYXRhX187CiAgfQoKICBmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCwgdGhpcy5fX2RhdGFfXyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHsKICAgIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbiAodCkgewogICAgICB2YXIgbmFtZSA9ICIiLAogICAgICAgIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB0eXBlOiB0LAogICAgICAgIG5hbWU6IG5hbWUKICAgICAgfTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG9uID0gdGhpcy5fX29uOwogICAgICBpZiAoIW9uKSByZXR1cm47CiAgICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHsKICAgICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHsKICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8ub3B0aW9ucyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9uWysraV0gPSBvOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO2Vsc2UgZGVsZXRlIHRoaXMuX19vbjsKICAgIH07CiAgfQogIGZ1bmN0aW9uIG9uQWRkKHR5cGVuYW1lLCB2YWx1ZSwgb3B0aW9ucykgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG9uID0gdGhpcy5fX29uLAogICAgICAgIG8sCiAgICAgICAgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIodmFsdWUpOwogICAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICAgICAgaWYgKChvID0gb25bal0pLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7CiAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpOwogICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLm9wdGlvbnMgPSBvcHRpb25zKTsKICAgICAgICAgIG8udmFsdWUgPSB2YWx1ZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTsKICAgICAgbyA9IHsKICAgICAgICB0eXBlOiB0eXBlbmFtZS50eXBlLAogICAgICAgIG5hbWU6IHR5cGVuYW1lLm5hbWUsCiAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgIGxpc3RlbmVyOiBsaXN0ZW5lciwKICAgICAgICBvcHRpb25zOiBvcHRpb25zCiAgICAgIH07CiAgICAgIGlmICghb24pIHRoaXMuX19vbiA9IFtvXTtlbHNlIG9uLnB1c2gobyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fb24gKHR5cGVuYW1lLCB2YWx1ZSwgb3B0aW9ucykgewogICAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgIiIpLAogICAgICBpLAogICAgICBuID0gdHlwZW5hbWVzLmxlbmd0aCwKICAgICAgdDsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uOwogICAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkgewogICAgICAgICAgICByZXR1cm4gby52YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgb3B0aW9ucykpOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50KG5vZGUsIHR5cGUsIHBhcmFtcykgewogICAgdmFyIHdpbmRvdyA9IGRlZmF1bHRWaWV3KG5vZGUpLAogICAgICBldmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDsKICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgZXZlbnQgPSBuZXcgZXZlbnQodHlwZSwgcGFyYW1zKTsKICAgIH0gZWxzZSB7CiAgICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpOwogICAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpOwogICAgfQogICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICB9CiAgZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkaXNwYXRjaEZ1bmN0aW9uKHR5cGUsIHBhcmFtcykgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX2Rpc3BhdGNoICh0eXBlLCBwYXJhbXMpIHsKICAgIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiBwYXJhbXMgPT09ICJmdW5jdGlvbiIgPyBkaXNwYXRjaEZ1bmN0aW9uIDogZGlzcGF0Y2hDb25zdGFudCkodHlwZSwgcGFyYW1zKSk7CiAgfQoKICBmdW5jdGlvbiogc2VsZWN0aW9uX2l0ZXJhdG9yICgpIHsKICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHlpZWxkIG5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIHZhciByb290ID0gW251bGxdOwogIGZ1bmN0aW9uIFNlbGVjdGlvbiQxKGdyb3VwcywgcGFyZW50cykgewogICAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzOwogICAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbigpIHsKICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDEoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSwgcm9vdCk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9CiAgU2VsZWN0aW9uJDEucHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZSA9IHsKICAgIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24kMSwKICAgIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCwKICAgIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCwKICAgIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fc2VsZWN0Q2hpbGQsCiAgICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuLAogICAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLAogICAgZGF0YTogc2VsZWN0aW9uX2RhdGEsCiAgICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLAogICAgZXhpdDogc2VsZWN0aW9uX2V4aXQsCiAgICBqb2luOiBzZWxlY3Rpb25fam9pbiwKICAgIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsCiAgICBzZWxlY3Rpb246IHNlbGVjdGlvbl9zZWxlY3Rpb24sCiAgICBvcmRlcjogc2VsZWN0aW9uX29yZGVyLAogICAgc29ydDogc2VsZWN0aW9uX3NvcnQsCiAgICBjYWxsOiBzZWxlY3Rpb25fY2FsbCwKICAgIG5vZGVzOiBzZWxlY3Rpb25fbm9kZXMsCiAgICBub2RlOiBzZWxlY3Rpb25fbm9kZSwKICAgIHNpemU6IHNlbGVjdGlvbl9zaXplLAogICAgZW1wdHk6IHNlbGVjdGlvbl9lbXB0eSwKICAgIGVhY2g6IHNlbGVjdGlvbl9lYWNoLAogICAgYXR0cjogc2VsZWN0aW9uX2F0dHIsCiAgICBzdHlsZTogc2VsZWN0aW9uX3N0eWxlLAogICAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSwKICAgIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLAogICAgdGV4dDogc2VsZWN0aW9uX3RleHQsCiAgICBodG1sOiBzZWxlY3Rpb25faHRtbCwKICAgIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsCiAgICBsb3dlcjogc2VsZWN0aW9uX2xvd2VyLAogICAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLAogICAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LAogICAgcmVtb3ZlOiBzZWxlY3Rpb25fcmVtb3ZlLAogICAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSwKICAgIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sCiAgICBvbjogc2VsZWN0aW9uX29uLAogICAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCwKICAgIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25faXRlcmF0b3IKICB9OwoKICBmdW5jdGlvbiBkZWZpbmUgKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHsKICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlOwogICAgcHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7CiAgfQogIGZ1bmN0aW9uIGV4dGVuZChwYXJlbnQsIGRlZmluaXRpb24pIHsKICAgIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpOwogICAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldOwogICAgcmV0dXJuIHByb3RvdHlwZTsKICB9CgogIGZ1bmN0aW9uIENvbG9yKCkge30KICB2YXIgZGFya2VyID0gMC43OwogIHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7CiAgdmFyIHJlSSA9ICJcXHMqKFsrLV0/XFxkKylcXHMqIiwKICAgIHJlTiA9ICJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIiwKICAgIHJlUCA9ICJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsCiAgICByZUhleCA9IC9eIyhbMC05YS1mXXszLDh9KSQvLAogICAgcmVSZ2JJbnRlZ2VyID0gbmV3IFJlZ0V4cChgXnJnYlxcKCR7cmVJfSwke3JlSX0sJHtyZUl9XFwpJGApLAogICAgcmVSZ2JQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYlxcKCR7cmVQfSwke3JlUH0sJHtyZVB9XFwpJGApLAogICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtyZUl9LCR7cmVJfSwke3JlSX0sJHtyZU59XFwpJGApLAogICAgcmVSZ2JhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtyZVB9LCR7cmVQfSwke3JlUH0sJHtyZU59XFwpJGApLAogICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cChgXmhzbFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9XFwpJGApLAogICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xhXFwoJHtyZU59LCR7cmVQfSwke3JlUH0sJHtyZU59XFwpJGApOwogIHZhciBuYW1lZCA9IHsKICAgIGFsaWNlYmx1ZTogMHhmMGY4ZmYsCiAgICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LAogICAgYXF1YTogMHgwMGZmZmYsCiAgICBhcXVhbWFyaW5lOiAweDdmZmZkNCwKICAgIGF6dXJlOiAweGYwZmZmZiwKICAgIGJlaWdlOiAweGY1ZjVkYywKICAgIGJpc3F1ZTogMHhmZmU0YzQsCiAgICBibGFjazogMHgwMDAwMDAsCiAgICBibGFuY2hlZGFsbW9uZDogMHhmZmViY2QsCiAgICBibHVlOiAweDAwMDBmZiwKICAgIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLAogICAgYnJvd246IDB4YTUyYTJhLAogICAgYnVybHl3b29kOiAweGRlYjg4NywKICAgIGNhZGV0Ymx1ZTogMHg1ZjllYTAsCiAgICBjaGFydHJldXNlOiAweDdmZmYwMCwKICAgIGNob2NvbGF0ZTogMHhkMjY5MWUsCiAgICBjb3JhbDogMHhmZjdmNTAsCiAgICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsCiAgICBjb3Juc2lsazogMHhmZmY4ZGMsCiAgICBjcmltc29uOiAweGRjMTQzYywKICAgIGN5YW46IDB4MDBmZmZmLAogICAgZGFya2JsdWU6IDB4MDAwMDhiLAogICAgZGFya2N5YW46IDB4MDA4YjhiLAogICAgZGFya2dvbGRlbnJvZDogMHhiODg2MGIsCiAgICBkYXJrZ3JheTogMHhhOWE5YTksCiAgICBkYXJrZ3JlZW46IDB4MDA2NDAwLAogICAgZGFya2dyZXk6IDB4YTlhOWE5LAogICAgZGFya2toYWtpOiAweGJkYjc2YiwKICAgIGRhcmttYWdlbnRhOiAweDhiMDA4YiwKICAgIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZiwKICAgIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLAogICAgZGFya29yY2hpZDogMHg5OTMyY2MsCiAgICBkYXJrcmVkOiAweDhiMDAwMCwKICAgIGRhcmtzYWxtb246IDB4ZTk5NjdhLAogICAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZiwKICAgIGRhcmtzbGF0ZWJsdWU6IDB4NDgzZDhiLAogICAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsCiAgICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZiwKICAgIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLAogICAgZGFya3Zpb2xldDogMHg5NDAwZDMsCiAgICBkZWVwcGluazogMHhmZjE0OTMsCiAgICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsCiAgICBkaW1ncmF5OiAweDY5Njk2OSwKICAgIGRpbWdyZXk6IDB4Njk2OTY5LAogICAgZG9kZ2VyYmx1ZTogMHgxZTkwZmYsCiAgICBmaXJlYnJpY2s6IDB4YjIyMjIyLAogICAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLAogICAgZm9yZXN0Z3JlZW46IDB4MjI4YjIyLAogICAgZnVjaHNpYTogMHhmZjAwZmYsCiAgICBnYWluc2Jvcm86IDB4ZGNkY2RjLAogICAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsCiAgICBnb2xkOiAweGZmZDcwMCwKICAgIGdvbGRlbnJvZDogMHhkYWE1MjAsCiAgICBncmF5OiAweDgwODA4MCwKICAgIGdyZWVuOiAweDAwODAwMCwKICAgIGdyZWVueWVsbG93OiAweGFkZmYyZiwKICAgIGdyZXk6IDB4ODA4MDgwLAogICAgaG9uZXlkZXc6IDB4ZjBmZmYwLAogICAgaG90cGluazogMHhmZjY5YjQsCiAgICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLAogICAgaW5kaWdvOiAweDRiMDA4MiwKICAgIGl2b3J5OiAweGZmZmZmMCwKICAgIGtoYWtpOiAweGYwZTY4YywKICAgIGxhdmVuZGVyOiAweGU2ZTZmYSwKICAgIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LAogICAgbGF3bmdyZWVuOiAweDdjZmMwMCwKICAgIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsCiAgICBsaWdodGJsdWU6IDB4YWRkOGU2LAogICAgbGlnaHRjb3JhbDogMHhmMDgwODAsCiAgICBsaWdodGN5YW46IDB4ZTBmZmZmLAogICAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLAogICAgbGlnaHRncmF5OiAweGQzZDNkMywKICAgIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLAogICAgbGlnaHRncmV5OiAweGQzZDNkMywKICAgIGxpZ2h0cGluazogMHhmZmI2YzEsCiAgICBsaWdodHNhbG1vbjogMHhmZmEwN2EsCiAgICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSwKICAgIGxpZ2h0c2t5Ymx1ZTogMHg4N2NlZmEsCiAgICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksCiAgICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksCiAgICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsCiAgICBsaWdodHllbGxvdzogMHhmZmZmZTAsCiAgICBsaW1lOiAweDAwZmYwMCwKICAgIGxpbWVncmVlbjogMHgzMmNkMzIsCiAgICBsaW5lbjogMHhmYWYwZTYsCiAgICBtYWdlbnRhOiAweGZmMDBmZiwKICAgIG1hcm9vbjogMHg4MDAwMDAsCiAgICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSwKICAgIG1lZGl1bWJsdWU6IDB4MDAwMGNkLAogICAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMywKICAgIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsCiAgICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsCiAgICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLAogICAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLAogICAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYywKICAgIG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsCiAgICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLAogICAgbWludGNyZWFtOiAweGY1ZmZmYSwKICAgIG1pc3R5cm9zZTogMHhmZmU0ZTEsCiAgICBtb2NjYXNpbjogMHhmZmU0YjUsCiAgICBuYXZham93aGl0ZTogMHhmZmRlYWQsCiAgICBuYXZ5OiAweDAwMDA4MCwKICAgIG9sZGxhY2U6IDB4ZmRmNWU2LAogICAgb2xpdmU6IDB4ODA4MDAwLAogICAgb2xpdmVkcmFiOiAweDZiOGUyMywKICAgIG9yYW5nZTogMHhmZmE1MDAsCiAgICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLAogICAgb3JjaGlkOiAweGRhNzBkNiwKICAgIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLAogICAgcGFsZWdyZWVuOiAweDk4ZmI5OCwKICAgIHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLAogICAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsCiAgICBwYXBheWF3aGlwOiAweGZmZWZkNSwKICAgIHBlYWNocHVmZjogMHhmZmRhYjksCiAgICBwZXJ1OiAweGNkODUzZiwKICAgIHBpbms6IDB4ZmZjMGNiLAogICAgcGx1bTogMHhkZGEwZGQsCiAgICBwb3dkZXJibHVlOiAweGIwZTBlNiwKICAgIHB1cnBsZTogMHg4MDAwODAsCiAgICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSwKICAgIHJlZDogMHhmZjAwMDAsCiAgICByb3N5YnJvd246IDB4YmM4ZjhmLAogICAgcm95YWxibHVlOiAweDQxNjllMSwKICAgIHNhZGRsZWJyb3duOiAweDhiNDUxMywKICAgIHNhbG1vbjogMHhmYTgwNzIsCiAgICBzYW5keWJyb3duOiAweGY0YTQ2MCwKICAgIHNlYWdyZWVuOiAweDJlOGI1NywKICAgIHNlYXNoZWxsOiAweGZmZjVlZSwKICAgIHNpZW5uYTogMHhhMDUyMmQsCiAgICBzaWx2ZXI6IDB4YzBjMGMwLAogICAgc2t5Ymx1ZTogMHg4N2NlZWIsCiAgICBzbGF0ZWJsdWU6IDB4NmE1YWNkLAogICAgc2xhdGVncmF5OiAweDcwODA5MCwKICAgIHNsYXRlZ3JleTogMHg3MDgwOTAsCiAgICBzbm93OiAweGZmZmFmYSwKICAgIHNwcmluZ2dyZWVuOiAweDAwZmY3ZiwKICAgIHN0ZWVsYmx1ZTogMHg0NjgyYjQsCiAgICB0YW46IDB4ZDJiNDhjLAogICAgdGVhbDogMHgwMDgwODAsCiAgICB0aGlzdGxlOiAweGQ4YmZkOCwKICAgIHRvbWF0bzogMHhmZjYzNDcsCiAgICB0dXJxdW9pc2U6IDB4NDBlMGQwLAogICAgdmlvbGV0OiAweGVlODJlZSwKICAgIHdoZWF0OiAweGY1ZGViMywKICAgIHdoaXRlOiAweGZmZmZmZiwKICAgIHdoaXRlc21va2U6IDB4ZjVmNWY1LAogICAgeWVsbG93OiAweGZmZmYwMCwKICAgIHllbGxvd2dyZWVuOiAweDlhY2QzMgogIH07CiAgZGVmaW5lKENvbG9yLCBjb2xvciwgewogICAgY29weShjaGFubmVscykgewogICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLCB0aGlzLCBjaGFubmVscyk7CiAgICB9LAogICAgZGlzcGxheWFibGUoKSB7CiAgICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7CiAgICB9LAogICAgaGV4OiBjb2xvcl9mb3JtYXRIZXgsCiAgICAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LgogICAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgsCiAgICBmb3JtYXRIZXg4OiBjb2xvcl9mb3JtYXRIZXg4LAogICAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsCiAgICBmb3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYiwKICAgIHRvU3RyaW5nOiBjb2xvcl9mb3JtYXRSZ2IKICB9KTsKICBmdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXgoKSB7CiAgICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTsKICB9CiAgZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4OCgpIHsKICAgIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleDgoKTsKICB9CiAgZnVuY3Rpb24gY29sb3JfZm9ybWF0SHNsKCkgewogICAgcmV0dXJuIGhzbENvbnZlcnQodGhpcykuZm9ybWF0SHNsKCk7CiAgfQogIGZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHsKICAgIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpOwogIH0KICBmdW5jdGlvbiBjb2xvcihmb3JtYXQpIHsKICAgIHZhciBtLCBsOwogICAgZm9ybWF0ID0gKGZvcm1hdCArICIiKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgIHJldHVybiAobSA9IHJlSGV4LmV4ZWMoZm9ybWF0KSkgPyAobCA9IG1bMV0ubGVuZ3RoLCBtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBsID09PSA2ID8gcmdibihtKSAvLyAjZmYwMDAwCiAgICA6IGwgPT09IDMgPyBuZXcgUmdiKG0gPj4gOCAmIDB4ZiB8IG0gPj4gNCAmIDB4ZjAsIG0gPj4gNCAmIDB4ZiB8IG0gJiAweGYwLCAobSAmIDB4ZikgPDwgNCB8IG0gJiAweGYsIDEpIC8vICNmMDAKICAgIDogbCA9PT0gOCA/IHJnYmEobSA+PiAyNCAmIDB4ZmYsIG0gPj4gMTYgJiAweGZmLCBtID4+IDggJiAweGZmLCAobSAmIDB4ZmYpIC8gMHhmZikgLy8gI2ZmMDAwMDAwCiAgICA6IGwgPT09IDQgPyByZ2JhKG0gPj4gMTIgJiAweGYgfCBtID4+IDggJiAweGYwLCBtID4+IDggJiAweGYgfCBtID4+IDQgJiAweGYwLCBtID4+IDQgJiAweGYgfCBtICYgMHhmMCwgKChtICYgMHhmKSA8PCA0IHwgbSAmIDB4ZikgLyAweGZmKSAvLyAjZjAwMAogICAgOiBudWxsIC8vIGludmFsaWQgaGV4CiAgICApIDogKG0gPSByZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMCkKICAgIDogKG0gPSByZVJnYlBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSkKICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKQogICAgOiAobSA9IHJlUmdiYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSkKICAgIDogKG0gPSByZUhzbFBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpCiAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpCiAgICA6IG5hbWVkLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuKG5hbWVkW2Zvcm1hdF0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zCiAgICA6IGZvcm1hdCA9PT0gInRyYW5zcGFyZW50IiA/IG5ldyBSZ2IoTmFOLCBOYU4sIE5hTiwgMCkgOiBudWxsOwogIH0KICBmdW5jdGlvbiByZ2JuKG4pIHsKICAgIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7CiAgfQogIGZ1bmN0aW9uIHJnYmEociwgZywgYiwgYSkgewogICAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOOwogICAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7CiAgfQogIGZ1bmN0aW9uIHJnYkNvbnZlcnQobykgewogICAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pOwogICAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYigpOwogICAgbyA9IG8ucmdiKCk7CiAgICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpOwogIH0KICBmdW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7CiAgfQogIGZ1bmN0aW9uIFJnYihyLCBnLCBiLCBvcGFjaXR5KSB7CiAgICB0aGlzLnIgPSArcjsKICAgIHRoaXMuZyA9ICtnOwogICAgdGhpcy5iID0gK2I7CiAgICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKICB9CiAgZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHsKICAgIGJyaWdodGVyKGspIHsKICAgICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspOwogICAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgfSwKICAgIGRhcmtlcihrKSB7CiAgICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspOwogICAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgfSwKICAgIHJnYigpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgY2xhbXAoKSB7CiAgICAgIHJldHVybiBuZXcgUmdiKGNsYW1waSh0aGlzLnIpLCBjbGFtcGkodGhpcy5nKSwgY2xhbXBpKHRoaXMuYiksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTsKICAgIH0sCiAgICBkaXNwbGF5YWJsZSgpIHsKICAgICAgcmV0dXJuIC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41ICYmIC0wLjUgPD0gdGhpcy5nICYmIHRoaXMuZyA8IDI1NS41ICYmIC0wLjUgPD0gdGhpcy5iICYmIHRoaXMuYiA8IDI1NS41ICYmIDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxOwogICAgfSwKICAgIGhleDogcmdiX2Zvcm1hdEhleCwKICAgIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguCiAgICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsCiAgICBmb3JtYXRIZXg4OiByZ2JfZm9ybWF0SGV4OCwKICAgIGZvcm1hdFJnYjogcmdiX2Zvcm1hdFJnYiwKICAgIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiCiAgfSkpOwogIGZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7CiAgICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX1gOwogIH0KICBmdW5jdGlvbiByZ2JfZm9ybWF0SGV4OCgpIHsKICAgIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfSR7aGV4KChpc05hTih0aGlzLm9wYWNpdHkpID8gMSA6IHRoaXMub3BhY2l0eSkgKiAyNTUpfWA7CiAgfQogIGZ1bmN0aW9uIHJnYl9mb3JtYXRSZ2IoKSB7CiAgICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7CiAgICByZXR1cm4gYCR7YSA9PT0gMSA/ICJyZ2IoIiA6ICJyZ2JhKCJ9JHtjbGFtcGkodGhpcy5yKX0sICR7Y2xhbXBpKHRoaXMuZyl9LCAke2NsYW1waSh0aGlzLmIpfSR7YSA9PT0gMSA/ICIpIiA6IGAsICR7YX0pYH1gOwogIH0KICBmdW5jdGlvbiBjbGFtcGEob3BhY2l0eSkgewogICAgcmV0dXJuIGlzTmFOKG9wYWNpdHkpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG9wYWNpdHkpKTsKICB9CiAgZnVuY3Rpb24gY2xhbXBpKHZhbHVlKSB7CiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7CiAgfQogIGZ1bmN0aW9uIGhleCh2YWx1ZSkgewogICAgdmFsdWUgPSBjbGFtcGkodmFsdWUpOwogICAgcmV0dXJuICh2YWx1ZSA8IDE2ID8gIjAiIDogIiIpICsgdmFsdWUudG9TdHJpbmcoMTYpOwogIH0KICBmdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHsKICAgIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjtlbHNlIGlmIChsIDw9IDAgfHwgbCA+PSAxKSBoID0gcyA9IE5hTjtlbHNlIGlmIChzIDw9IDApIGggPSBOYU47CiAgICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBhKTsKICB9CiAgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7CiAgICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTsKICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTsKICAgIGlmICghbykgcmV0dXJuIG5ldyBIc2woKTsKICAgIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbzsKICAgIG8gPSBvLnJnYigpOwogICAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgIGcgPSBvLmcgLyAyNTUsCiAgICAgIGIgPSBvLmIgLyAyNTUsCiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLAogICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwKICAgICAgaCA9IE5hTiwKICAgICAgcyA9IG1heCAtIG1pbiwKICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjsKICAgIGlmIChzKSB7CiAgICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O2Vsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7CiAgICAgIHMgLz0gbCA8IDAuNSA/IG1heCArIG1pbiA6IDIgLSBtYXggLSBtaW47CiAgICAgIGggKj0gNjA7CiAgICB9IGVsc2UgewogICAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDsKICAgIH0KICAgIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7CiAgfQogIGZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICB9CiAgZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHsKICAgIHRoaXMuaCA9ICtoOwogICAgdGhpcy5zID0gK3M7CiAgICB0aGlzLmwgPSArbDsKICAgIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5OwogIH0KICBkZWZpbmUoSHNsLCBoc2wsIGV4dGVuZChDb2xvciwgewogICAgYnJpZ2h0ZXIoaykgewogICAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7CiAgICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgfSwKICAgIGRhcmtlcihrKSB7CiAgICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspOwogICAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICAgIH0sCiAgICByZ2IoKSB7CiAgICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLAogICAgICAgIHMgPSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucywKICAgICAgICBsID0gdGhpcy5sLAogICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsCiAgICAgICAgbTEgPSAyICogbCAtIG0yOwogICAgICByZXR1cm4gbmV3IFJnYihoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksIGhzbDJyZ2IoaCwgbTEsIG0yKSwgaHNsMnJnYihoIDwgMTIwID8gaCArIDI0MCA6IGggLSAxMjAsIG0xLCBtMiksIHRoaXMub3BhY2l0eSk7CiAgICB9LAogICAgY2xhbXAoKSB7CiAgICAgIHJldHVybiBuZXcgSHNsKGNsYW1waCh0aGlzLmgpLCBjbGFtcHQodGhpcy5zKSwgY2xhbXB0KHRoaXMubCksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTsKICAgIH0sCiAgICBkaXNwbGF5YWJsZSgpIHsKICAgICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKSAmJiAwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSAmJiAwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMTsKICAgIH0sCiAgICBmb3JtYXRIc2woKSB7CiAgICAgIGNvbnN0IGEgPSBjbGFtcGEodGhpcy5vcGFjaXR5KTsKICAgICAgcmV0dXJuIGAke2EgPT09IDEgPyAiaHNsKCIgOiAiaHNsYSgifSR7Y2xhbXBoKHRoaXMuaCl9LCAke2NsYW1wdCh0aGlzLnMpICogMTAwfSUsICR7Y2xhbXB0KHRoaXMubCkgKiAxMDB9JSR7YSA9PT0gMSA/ICIpIiA6IGAsICR7YX0pYH1gOwogICAgfQogIH0pKTsKICBmdW5jdGlvbiBjbGFtcGgodmFsdWUpIHsKICAgIHZhbHVlID0gKHZhbHVlIHx8IDApICUgMzYwOwogICAgcmV0dXJuIHZhbHVlIDwgMCA/IHZhbHVlICsgMzYwIDogdmFsdWU7CiAgfQogIGZ1bmN0aW9uIGNsYW1wdCh2YWx1ZSkgewogICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbHVlIHx8IDApKTsKICB9CgogIC8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi8KICBmdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikgewogICAgcmV0dXJuIChoIDwgNjAgPyBtMSArIChtMiAtIG0xKSAqIGggLyA2MCA6IGggPCAxODAgPyBtMiA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwIDogbTEpICogMjU1OwogIH0KCiAgdmFyIGNvbnN0YW50ID0geCA9PiAoKSA9PiB4OwoKICBmdW5jdGlvbiBsaW5lYXIoYSwgZCkgewogICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgIHJldHVybiBhICsgdCAqIGQ7CiAgICB9OwogIH0KICBmdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7CiAgICByZXR1cm4gYSA9IE1hdGgucG93KGEsIHkpLCBiID0gTWF0aC5wb3coYiwgeSkgLSBhLCB5ID0gMSAvIHksIGZ1bmN0aW9uICh0KSB7CiAgICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZ2FtbWEoeSkgewogICAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHsKICAgIHZhciBkID0gYiAtIGE7CiAgICByZXR1cm4gZCA/IGxpbmVhcihhLCBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpOwogIH0KCiAgdmFyIGludGVycG9sYXRlUmdiID0gKGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHsKICAgIHZhciBjb2xvciA9IGdhbW1hKHkpOwogICAgZnVuY3Rpb24gcmdiJDEoc3RhcnQsIGVuZCkgewogICAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IHJnYihzdGFydCkpLnIsIChlbmQgPSByZ2IoZW5kKSkuciksCiAgICAgICAgZyA9IGNvbG9yKHN0YXJ0LmcsIGVuZC5nKSwKICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLAogICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgc3RhcnQuciA9IHIodCk7CiAgICAgICAgc3RhcnQuZyA9IGcodCk7CiAgICAgICAgc3RhcnQuYiA9IGIodCk7CiAgICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgICAgIH07CiAgICB9CiAgICByZ2IkMS5nYW1tYSA9IHJnYkdhbW1hOwogICAgcmV0dXJuIHJnYiQxOwogIH0pKDEpOwoKICBmdW5jdGlvbiBpbnRlcnBvbGF0ZU51bWJlciAoYSwgYikgewogICAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbiAodCkgewogICAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDsKICAgIH07CiAgfQoKICB2YXIgcmVBID0gL1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLAogICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCAiZyIpOwogIGZ1bmN0aW9uIHplcm8oYikgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGI7CiAgICB9OwogIH0KICBmdW5jdGlvbiBvbmUoYikgewogICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgIHJldHVybiBiKHQpICsgIiI7CiAgICB9OwogIH0KICBmdW5jdGlvbiBpbnRlcnBvbGF0ZVN0cmluZyAoYSwgYikgewogICAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLAogICAgICAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiCiAgICAgIGFtLAogICAgICAvLyBjdXJyZW50IG1hdGNoIGluIGEKICAgICAgYm0sCiAgICAgIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYgogICAgICBicywKICAgICAgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnkKICAgICAgaSA9IC0xLAogICAgICAvLyBpbmRleCBpbiBzCiAgICAgIHMgPSBbXSwKICAgICAgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzCiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKCiAgICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuCiAgICBhID0gYSArICIiLCBiID0gYiArICIiOwoKICAgIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuCiAgICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpICYmIChibSA9IHJlQi5leGVjKGIpKSkgewogICAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsKICAgICAgICAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYgogICAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpOwogICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgICAgIGVsc2Ugc1srK2ldID0gYnM7CiAgICAgIH0KICAgICAgaWYgKChhbSA9IGFtWzBdKSA9PT0gKGJtID0gYm1bMF0pKSB7CiAgICAgICAgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaAogICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJtOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgICAgIGVsc2Ugc1srK2ldID0gYm07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnMKICAgICAgICBzWysraV0gPSBudWxsOwogICAgICAgIHEucHVzaCh7CiAgICAgICAgICBpOiBpLAogICAgICAgICAgeDogaW50ZXJwb2xhdGVOdW1iZXIoYW0sIGJtKQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGJpID0gcmVCLmxhc3RJbmRleDsKICAgIH0KCiAgICAvLyBBZGQgcmVtYWlucyBvZiBiLgogICAgaWYgKGJpIDwgYi5sZW5ndGgpIHsKICAgICAgYnMgPSBiLnNsaWNlKGJpKTsKICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgIGVsc2Ugc1srK2ldID0gYnM7CiAgICB9CgogICAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guCiAgICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLgogICAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/IHFbMF0gPyBvbmUocVswXS54KSA6IHplcm8oYikgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbiAodCkgewogICAgICBmb3IgKHZhciBpID0gMCwgbzsgaSA8IGI7ICsraSkgc1sobyA9IHFbaV0pLmldID0gby54KHQpOwogICAgICByZXR1cm4gcy5qb2luKCIiKTsKICAgIH0pOwogIH0KCiAgdmFyIGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJOwogIHZhciBpZGVudGl0eSA9IHsKICAgIHRyYW5zbGF0ZVg6IDAsCiAgICB0cmFuc2xhdGVZOiAwLAogICAgcm90YXRlOiAwLAogICAgc2tld1g6IDAsCiAgICBzY2FsZVg6IDEsCiAgICBzY2FsZVk6IDEKICB9OwogIGZ1bmN0aW9uIGRlY29tcG9zZSAoYSwgYiwgYywgZCwgZSwgZikgewogICAgdmFyIHNjYWxlWCwgc2NhbGVZLCBza2V3WDsKICAgIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDsKICAgIGlmIChza2V3WCA9IGEgKiBjICsgYiAqIGQpIGMgLT0gYSAqIHNrZXdYLCBkIC09IGIgKiBza2V3WDsKICAgIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMgKyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZOwogICAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDsKICAgIHJldHVybiB7CiAgICAgIHRyYW5zbGF0ZVg6IGUsCiAgICAgIHRyYW5zbGF0ZVk6IGYsCiAgICAgIHJvdGF0ZTogTWF0aC5hdGFuMihiLCBhKSAqIGRlZ3JlZXMsCiAgICAgIHNrZXdYOiBNYXRoLmF0YW4oc2tld1gpICogZGVncmVlcywKICAgICAgc2NhbGVYOiBzY2FsZVgsCiAgICAgIHNjYWxlWTogc2NhbGVZCiAgICB9OwogIH0KCiAgdmFyIHN2Z05vZGU7CgogIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovCiAgZnVuY3Rpb24gcGFyc2VDc3ModmFsdWUpIHsKICAgIGNvbnN0IG0gPSBuZXcgKHR5cGVvZiBET01NYXRyaXggPT09ICJmdW5jdGlvbiIgPyBET01NYXRyaXggOiBXZWJLaXRDU1NNYXRyaXgpKHZhbHVlICsgIiIpOwogICAgcmV0dXJuIG0uaXNJZGVudGl0eSA/IGlkZW50aXR5IDogZGVjb21wb3NlKG0uYSwgbS5iLCBtLmMsIG0uZCwgbS5lLCBtLmYpOwogIH0KICBmdW5jdGlvbiBwYXJzZVN2Zyh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTsKICAgIGlmICghc3ZnTm9kZSkgc3ZnTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCAiZyIpOwogICAgc3ZnTm9kZS5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsIHZhbHVlKTsKICAgIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5OwogICAgdmFsdWUgPSB2YWx1ZS5tYXRyaXg7CiAgICByZXR1cm4gZGVjb21wb3NlKHZhbHVlLmEsIHZhbHVlLmIsIHZhbHVlLmMsIHZhbHVlLmQsIHZhbHVlLmUsIHZhbHVlLmYpOwogIH0KCiAgZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2UsIHB4Q29tbWEsIHB4UGFyZW4sIGRlZ1BhcmVuKSB7CiAgICBmdW5jdGlvbiBwb3AocykgewogICAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgIiAiIDogIiI7CiAgICB9CiAgICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsKICAgICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHsKICAgICAgICB2YXIgaSA9IHMucHVzaCgidHJhbnNsYXRlKCIsIG51bGwsIHB4Q29tbWEsIG51bGwsIHB4UGFyZW4pOwogICAgICAgIHEucHVzaCh7CiAgICAgICAgICBpOiBpIC0gNCwKICAgICAgICAgIHg6IGludGVycG9sYXRlTnVtYmVyKHhhLCB4YikKICAgICAgICB9LCB7CiAgICAgICAgICBpOiBpIC0gMiwKICAgICAgICAgIHg6IGludGVycG9sYXRlTnVtYmVyKHlhLCB5YikKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICh4YiB8fCB5YikgewogICAgICAgIHMucHVzaCgidHJhbnNsYXRlKCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiByb3RhdGUoYSwgYiwgcywgcSkgewogICAgICBpZiAoYSAhPT0gYikgewogICAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7ZWxzZSBpZiAoYiAtIGEgPiAxODApIGEgKz0gMzYwOyAvLyBzaG9ydGVzdCBwYXRoCiAgICAgICAgcS5wdXNoKHsKICAgICAgICAgIGk6IHMucHVzaChwb3AocykgKyAicm90YXRlKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsCiAgICAgICAgICB4OiBpbnRlcnBvbGF0ZU51bWJlcihhLCBiKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGIpIHsKICAgICAgICBzLnB1c2gocG9wKHMpICsgInJvdGF0ZSgiICsgYiArIGRlZ1BhcmVuKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc2tld1goYSwgYiwgcywgcSkgewogICAgICBpZiAoYSAhPT0gYikgewogICAgICAgIHEucHVzaCh7CiAgICAgICAgICBpOiBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsCiAgICAgICAgICB4OiBpbnRlcnBvbGF0ZU51bWJlcihhLCBiKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGIpIHsKICAgICAgICBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIgKyBiICsgZGVnUGFyZW4pOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzY2FsZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkgewogICAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5YikgewogICAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArICJzY2FsZSgiLCBudWxsLCAiLCIsIG51bGwsICIpIik7CiAgICAgICAgcS5wdXNoKHsKICAgICAgICAgIGk6IGkgLSA0LAogICAgICAgICAgeDogaW50ZXJwb2xhdGVOdW1iZXIoeGEsIHhiKQogICAgICAgIH0sIHsKICAgICAgICAgIGk6IGkgLSAyLAogICAgICAgICAgeDogaW50ZXJwb2xhdGVOdW1iZXIoeWEsIHliKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7CiAgICAgICAgcy5wdXNoKHBvcChzKSArICJzY2FsZSgiICsgeGIgKyAiLCIgKyB5YiArICIpIik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiAoYSwgYikgewogICAgICB2YXIgcyA9IFtdLAogICAgICAgIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVycwogICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKICAgICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7CiAgICAgIHRyYW5zbGF0ZShhLnRyYW5zbGF0ZVgsIGEudHJhbnNsYXRlWSwgYi50cmFuc2xhdGVYLCBiLnRyYW5zbGF0ZVksIHMsIHEpOwogICAgICByb3RhdGUoYS5yb3RhdGUsIGIucm90YXRlLCBzLCBxKTsKICAgICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7CiAgICAgIHNjYWxlKGEuc2NhbGVYLCBhLnNjYWxlWSwgYi5zY2FsZVgsIGIuc2NhbGVZLCBzLCBxKTsKICAgICAgYSA9IGIgPSBudWxsOyAvLyBnYwogICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgbiA9IHEubGVuZ3RoLAogICAgICAgICAgbzsKICAgICAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpOwogICAgICAgIHJldHVybiBzLmpvaW4oIiIpOwogICAgICB9OwogICAgfTsKICB9CiAgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VDc3MsICJweCwgIiwgInB4KSIsICJkZWcpIik7CiAgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsICIsICIsICIpIiwgIikiKTsKCiAgdmFyIGZyYW1lID0gMCwKICAgIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nPwogICAgdGltZW91dCQxID0gMCwKICAgIC8vIGlzIGEgdGltZW91dCBwZW5kaW5nPwogICAgaW50ZXJ2YWwgPSAwLAogICAgLy8gYXJlIGFueSB0aW1lcnMgYWN0aXZlPwogICAgcG9rZURlbGF5ID0gMTAwMCwKICAgIC8vIGhvdyBmcmVxdWVudGx5IHdlIGNoZWNrIGZvciBjbG9jayBza2V3CiAgICB0YXNrSGVhZCwKICAgIHRhc2tUYWlsLAogICAgY2xvY2tMYXN0ID0gMCwKICAgIGNsb2NrTm93ID0gMCwKICAgIGNsb2NrU2tldyA9IDAsCiAgICBjbG9jayA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gIm9iamVjdCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLAogICAgc2V0RnJhbWUgPSB0eXBlb2Ygd2luZG93ID09PSAib2JqZWN0IiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBmdW5jdGlvbiAoZikgewogICAgICBzZXRUaW1lb3V0KGYsIDE3KTsKICAgIH07CiAgZnVuY3Rpb24gbm93KCkgewogICAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpOwogIH0KICBmdW5jdGlvbiBjbGVhck5vdygpIHsKICAgIGNsb2NrTm93ID0gMDsKICB9CiAgZnVuY3Rpb24gVGltZXIoKSB7CiAgICB0aGlzLl9jYWxsID0gdGhpcy5fdGltZSA9IHRoaXMuX25leHQgPSBudWxsOwogIH0KICBUaW1lci5wcm90b3R5cGUgPSB0aW1lci5wcm90b3R5cGUgPSB7CiAgICBjb25zdHJ1Y3RvcjogVGltZXIsCiAgICByZXN0YXJ0OiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7CiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7CiAgICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpOwogICAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHsKICAgICAgICBpZiAodGFza1RhaWwpIHRhc2tUYWlsLl9uZXh0ID0gdGhpcztlbHNlIHRhc2tIZWFkID0gdGhpczsKICAgICAgICB0YXNrVGFpbCA9IHRoaXM7CiAgICAgIH0KICAgICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrOwogICAgICB0aGlzLl90aW1lID0gdGltZTsKICAgICAgc2xlZXAoKTsKICAgIH0sCiAgICBzdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICh0aGlzLl9jYWxsKSB7CiAgICAgICAgdGhpcy5fY2FsbCA9IG51bGw7CiAgICAgICAgdGhpcy5fdGltZSA9IEluZmluaXR5OwogICAgICAgIHNsZWVwKCk7CiAgICAgIH0KICAgIH0KICB9OwogIGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgdmFyIHQgPSBuZXcgVGltZXIoKTsKICAgIHQucmVzdGFydChjYWxsYmFjaywgZGVsYXksIHRpbWUpOwogICAgcmV0dXJuIHQ7CiAgfQogIGZ1bmN0aW9uIHRpbWVyRmx1c2goKSB7CiAgICBub3coKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC4KICAgICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LgogICAgdmFyIHQgPSB0YXNrSGVhZCwKICAgICAgZTsKICAgIHdoaWxlICh0KSB7CiAgICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKHVuZGVmaW5lZCwgZSk7CiAgICAgIHQgPSB0Ll9uZXh0OwogICAgfQogICAgLS1mcmFtZTsKICB9CiAgZnVuY3Rpb24gd2FrZSgpIHsKICAgIGNsb2NrTm93ID0gKGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpKSArIGNsb2NrU2tldzsKICAgIGZyYW1lID0gdGltZW91dCQxID0gMDsKICAgIHRyeSB7CiAgICAgIHRpbWVyRmx1c2goKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGZyYW1lID0gMDsKICAgICAgbmFwKCk7CiAgICAgIGNsb2NrTm93ID0gMDsKICAgIH0KICB9CiAgZnVuY3Rpb24gcG9rZSgpIHsKICAgIHZhciBub3cgPSBjbG9jay5ub3coKSwKICAgICAgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7CiAgICBpZiAoZGVsYXkgPiBwb2tlRGVsYXkpIGNsb2NrU2tldyAtPSBkZWxheSwgY2xvY2tMYXN0ID0gbm93OwogIH0KICBmdW5jdGlvbiBuYXAoKSB7CiAgICB2YXIgdDAsCiAgICAgIHQxID0gdGFza0hlYWQsCiAgICAgIHQyLAogICAgICB0aW1lID0gSW5maW5pdHk7CiAgICB3aGlsZSAodDEpIHsKICAgICAgaWYgKHQxLl9jYWxsKSB7CiAgICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lOwogICAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsOwogICAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjsKICAgICAgfQogICAgfQogICAgdGFza1RhaWwgPSB0MDsKICAgIHNsZWVwKHRpbWUpOwogIH0KICBmdW5jdGlvbiBzbGVlcCh0aW1lKSB7CiAgICBpZiAoZnJhbWUpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS4KICAgIGlmICh0aW1lb3V0JDEpIHRpbWVvdXQkMSA9IGNsZWFyVGltZW91dCh0aW1lb3V0JDEpOwogICAgdmFyIGRlbGF5ID0gdGltZSAtIGNsb2NrTm93OyAvLyBTdHJpY3RseSBsZXNzIHRoYW4gaWYgd2UgcmVjb21wdXRlZCBjbG9ja05vdy4KICAgIGlmIChkZWxheSA+IDI0KSB7CiAgICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQkMSA9IHNldFRpbWVvdXQod2FrZSwgdGltZSAtIGNsb2NrLm5vdygpIC0gY2xvY2tTa2V3KTsKICAgICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCFpbnRlcnZhbCkgY2xvY2tMYXN0ID0gY2xvY2subm93KCksIGludGVydmFsID0gc2V0SW50ZXJ2YWwocG9rZSwgcG9rZURlbGF5KTsKICAgICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRpbWVvdXQgKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgdmFyIHQgPSBuZXcgVGltZXIoKTsKICAgIGRlbGF5ID0gZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXk7CiAgICB0LnJlc3RhcnQoZWxhcHNlZCA9PiB7CiAgICAgIHQuc3RvcCgpOwogICAgICBjYWxsYmFjayhlbGFwc2VkICsgZGVsYXkpOwogICAgfSwgZGVsYXksIHRpbWUpOwogICAgcmV0dXJuIHQ7CiAgfQoKICB2YXIgZW1wdHlPbiA9IGRpc3BhdGNoKCJzdGFydCIsICJlbmQiLCAiY2FuY2VsIiwgImludGVycnVwdCIpOwogIHZhciBlbXB0eVR3ZWVuID0gW107CiAgdmFyIENSRUFURUQgPSAwOwogIHZhciBTQ0hFRFVMRUQgPSAxOwogIHZhciBTVEFSVElORyA9IDI7CiAgdmFyIFNUQVJURUQgPSAzOwogIHZhciBSVU5OSU5HID0gNDsKICB2YXIgRU5ESU5HID0gNTsKICB2YXIgRU5ERUQgPSA2OwogIGZ1bmN0aW9uIHNjaGVkdWxlIChub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3VwLCB0aW1pbmcpIHsKICAgIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbjsKICAgIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9O2Vsc2UgaWYgKGlkIGluIHNjaGVkdWxlcykgcmV0dXJuOwogICAgY3JlYXRlKG5vZGUsIGlkLCB7CiAgICAgIG5hbWU6IG5hbWUsCiAgICAgIGluZGV4OiBpbmRleCwKICAgICAgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLgogICAgICBncm91cDogZ3JvdXAsCiAgICAgIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4KICAgICAgb246IGVtcHR5T24sCiAgICAgIHR3ZWVuOiBlbXB0eVR3ZWVuLAogICAgICB0aW1lOiB0aW1pbmcudGltZSwKICAgICAgZGVsYXk6IHRpbWluZy5kZWxheSwKICAgICAgZHVyYXRpb246IHRpbWluZy5kdXJhdGlvbiwKICAgICAgZWFzZTogdGltaW5nLmVhc2UsCiAgICAgIHRpbWVyOiBudWxsLAogICAgICBzdGF0ZTogQ1JFQVRFRAogICAgfSk7CiAgfQogIGZ1bmN0aW9uIGluaXQobm9kZSwgaWQpIHsKICAgIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7CiAgICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBDUkVBVEVEKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpOwogICAgcmV0dXJuIHNjaGVkdWxlOwogIH0KICBmdW5jdGlvbiBzZXQobm9kZSwgaWQpIHsKICAgIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7CiAgICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBTVEFSVEVEKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmciKTsKICAgIHJldHVybiBzY2hlZHVsZTsKICB9CiAgZnVuY3Rpb24gZ2V0KG5vZGUsIGlkKSB7CiAgICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjsKICAgIGlmICghc2NoZWR1bGUgfHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTsKICAgIHJldHVybiBzY2hlZHVsZTsKICB9CiAgZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7CiAgICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sCiAgICAgIHR3ZWVuOwoKICAgIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLgogICAgLy8gTm90ZSB0aGUgYWN0dWFsIGRlbGF5IGlzIG5vdCBrbm93biB1bnRpbCB0aGUgZmlyc3QgY2FsbGJhY2shCiAgICBzY2hlZHVsZXNbaWRdID0gc2VsZjsKICAgIHNlbGYudGltZXIgPSB0aW1lcihzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTsKICAgIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHsKICAgICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRDsKICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHN0YXJ0LCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpOwoKICAgICAgLy8gSWYgdGhlIGVsYXBzZWQgZGVsYXkgaXMgbGVzcyB0aGFuIG91ciBmaXJzdCBzbGVlcCwgc3RhcnQgaW1tZWRpYXRlbHkuCiAgICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHsKICAgICAgdmFyIGksIGosIG4sIG87CgogICAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuCiAgICAgIGlmIChzZWxmLnN0YXRlICE9PSBTQ0hFRFVMRUQpIHJldHVybiBzdG9wKCk7CiAgICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHsKICAgICAgICBvID0gc2NoZWR1bGVzW2ldOwogICAgICAgIGlmIChvLm5hbWUgIT09IHNlbGYubmFtZSkgY29udGludWU7CgogICAgICAgIC8vIFdoaWxlIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIHN0YXJ0aW5nIHRyYW5zaXRpb24gZHVyaW5nIHRoaXMgZnJhbWUsCiAgICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhCiAgICAgICAgLy8gY2hhbmNlIHRvIHRpY2sgKGFuZCBwb3NzaWJseSBlbmQpOyBzZWUgZDMvZDMtdHJhbnNpdGlvbiM1NCEKICAgICAgICBpZiAoby5zdGF0ZSA9PT0gU1RBUlRFRCkgcmV0dXJuIHRpbWVvdXQoc3RhcnQpOwoKICAgICAgICAvLyBJbnRlcnJ1cHQgdGhlIGFjdGl2ZSB0cmFuc2l0aW9uLCBpZiBhbnkuCiAgICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHsKICAgICAgICAgIG8uc3RhdGUgPSBFTkRFRDsKICAgICAgICAgIG8udGltZXIuc3RvcCgpOwogICAgICAgICAgby5vbi5jYWxsKCJpbnRlcnJ1cHQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTsKICAgICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07CiAgICAgICAgfQoKICAgICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuCiAgICAgICAgZWxzZSBpZiAoK2kgPCBpZCkgewogICAgICAgICAgby5zdGF0ZSA9IEVOREVEOwogICAgICAgICAgby50aW1lci5zdG9wKCk7CiAgICAgICAgICBvLm9uLmNhbGwoImNhbmNlbCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApOwogICAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIERlZmVyIHRoZSBmaXJzdCB0aWNrIHRvIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZTsgc2VlIGQzL2QzIzE1NzYuCiAgICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shCiAgICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIHN0YXJ0IGV2ZW50OyBzZWUgZDMvZDMtdHJhbnNpdGlvbiMxNiEKICAgICAgLy8gQXNzdW1pbmcgdGhpcyBpcyBzdWNjZXNzZnVsLCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBnbyBzdHJhaWdodCB0byB0aWNrLgogICAgICB0aW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gU1RBUlRFRCkgewogICAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7CiAgICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2VsZi5kZWxheSwgc2VsZi50aW1lKTsKICAgICAgICAgIHRpY2soZWxhcHNlZCk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC4KICAgICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHR3ZWVuIGFyZSBpbml0aWFsaXplZC4KICAgICAgc2VsZi5zdGF0ZSA9IFNUQVJUSU5HOwogICAgICBzZWxmLm9uLmNhbGwoInN0YXJ0Iiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7CiAgICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZAogICAgICBzZWxmLnN0YXRlID0gU1RBUlRFRDsKCiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHR3ZWVuLCBkZWxldGluZyBudWxsIHR3ZWVuLgogICAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpOwogICAgICBmb3IgKGkgPSAwLCBqID0gLTE7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAobyA9IHNlbGYudHdlZW5baV0udmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKSkgewogICAgICAgICAgdHdlZW5bKytqXSA9IG87CiAgICAgICAgfQogICAgICB9CiAgICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxOwogICAgfQogICAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7CiAgICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSwKICAgICAgICBpID0gLTEsCiAgICAgICAgbiA9IHR3ZWVuLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICB0d2VlbltpXS5jYWxsKG5vZGUsIHQpOwogICAgICB9CgogICAgICAvLyBEaXNwYXRjaCB0aGUgZW5kIGV2ZW50LgogICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7CiAgICAgICAgc2VsZi5vbi5jYWxsKCJlbmQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTsKICAgICAgICBzdG9wKCk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0b3AoKSB7CiAgICAgIHNlbGYuc3RhdGUgPSBFTkRFRDsKICAgICAgc2VsZi50aW1lci5zdG9wKCk7CiAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaWRdOwogICAgICBmb3IgKHZhciBpIGluIHNjaGVkdWxlcykgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGludGVycnVwdCAobm9kZSwgbmFtZSkgewogICAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLAogICAgICBzY2hlZHVsZSwKICAgICAgYWN0aXZlLAogICAgICBlbXB0eSA9IHRydWUsCiAgICAgIGk7CiAgICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuOwogICAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgIiI7CiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7CiAgICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsKICAgICAgICBlbXB0eSA9IGZhbHNlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4gU1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7CiAgICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7CiAgICAgIHNjaGVkdWxlLnRpbWVyLnN0b3AoKTsKICAgICAgc2NoZWR1bGUub24uY2FsbChhY3RpdmUgPyAiaW50ZXJydXB0IiA6ICJjYW5jZWwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApOwogICAgICBkZWxldGUgc2NoZWR1bGVzW2ldOwogICAgfQogICAgaWYgKGVtcHR5KSBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25faW50ZXJydXB0IChuYW1lKSB7CiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgaW50ZXJydXB0KHRoaXMsIG5hbWUpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiB0d2VlblJlbW92ZShpZCwgbmFtZSkgewogICAgdmFyIHR3ZWVuMCwgdHdlZW4xOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSwKICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuOwoKICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLAogICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkgewogICAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpOwogICAgICAgICAgICB0d2VlbjEuc3BsaWNlKGksIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0d2VlbkZ1bmN0aW9uKGlkLCBuYW1lLCB2YWx1ZSkgewogICAgdmFyIHR3ZWVuMCwgdHdlZW4xOwogICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLAogICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47CgogICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIQogICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuCiAgICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7CiAgICAgICAgdHdlZW4xID0gKHR3ZWVuMCA9IHR3ZWVuKS5zbGljZSgpOwogICAgICAgIGZvciAodmFyIHQgPSB7CiAgICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZQogICAgICAgICAgfSwgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgdHdlZW4xW2ldID0gdDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpID09PSBuKSB0d2VlbjEucHVzaCh0KTsKICAgICAgfQogICAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHRyYW5zaXRpb25fdHdlZW4gKG5hbWUsIHZhbHVlKSB7CiAgICB2YXIgaWQgPSB0aGlzLl9pZDsKICAgIG5hbWUgKz0gIiI7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgdmFyIHR3ZWVuID0gZ2V0KHRoaXMubm9kZSgpLCBpZCkudHdlZW47CiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4ubGVuZ3RoLCB0OyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgIHJldHVybiB0LnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSA6IHR3ZWVuRnVuY3Rpb24pKGlkLCBuYW1lLCB2YWx1ZSkpOwogIH0KICBmdW5jdGlvbiB0d2VlblZhbHVlKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7CiAgICB2YXIgaWQgPSB0cmFuc2l0aW9uLl9pZDsKICAgIHRyYW5zaXRpb24uZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCk7CiAgICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0pOwogICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7CiAgICAgIHJldHVybiBnZXQobm9kZSwgaWQpLnZhbHVlW25hbWVdOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGludGVycG9sYXRlIChhLCBiKSB7CiAgICB2YXIgYzsKICAgIHJldHVybiAodHlwZW9mIGIgPT09ICJudW1iZXIiID8gaW50ZXJwb2xhdGVOdW1iZXIgOiBiIGluc3RhbmNlb2YgY29sb3IgPyBpbnRlcnBvbGF0ZVJnYiA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYikgOiBpbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7CiAgfQoKICBmdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkgewogICAgdmFyIHN0cmluZzAwLAogICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiIsCiAgICAgIGludGVycG9sYXRlMDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbCA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHsKICAgIHZhciBzdHJpbmcwMCwKICAgICAgc3RyaW5nMSA9IHZhbHVlMSArICIiLAogICAgICBpbnRlcnBvbGF0ZTA7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7CiAgICB2YXIgc3RyaW5nMDAsIHN0cmluZzEwLCBpbnRlcnBvbGF0ZTA7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc3RyaW5nMCwKICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwKICAgICAgICBzdHJpbmcxOwogICAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogICAgdmFyIHN0cmluZzAwLCBzdHJpbmcxMCwgaW50ZXJwb2xhdGUwOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHN0cmluZzAsCiAgICAgICAgdmFsdWUxID0gdmFsdWUodGhpcyksCiAgICAgICAgc3RyaW5nMTsKICAgICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9hdHRyIChuYW1lLCB2YWx1ZSkgewogICAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpLAogICAgICBpID0gZnVsbG5hbWUgPT09ICJ0cmFuc2Zvcm0iID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgOiBpbnRlcnBvbGF0ZTsKICAgIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbikoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgImF0dHIuIiArIG5hbWUsIHZhbHVlKSkgOiB2YWx1ZSA9PSBudWxsID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkoZnVsbG5hbWUpIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKGZ1bGxuYW1lLCBpLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gYXR0ckludGVycG9sYXRlKG5hbWUsIGkpIHsKICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpLmNhbGwodGhpcywgdCkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpIHsKICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaS5jYWxsKHRoaXMsIHQpKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgdmFyIHQwLCBpMDsKICAgIGZ1bmN0aW9uIHR3ZWVuKCkgewogICAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSk7CiAgICAgIHJldHVybiB0MDsKICAgIH0KICAgIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOwogICAgcmV0dXJuIHR3ZWVuOwogIH0KICBmdW5jdGlvbiBhdHRyVHdlZW4obmFtZSwgdmFsdWUpIHsKICAgIHZhciB0MCwgaTA7CiAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlKG5hbWUsIGkpOwogICAgICByZXR1cm4gdDA7CiAgICB9CiAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiB0d2VlbjsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9hdHRyVHdlZW4gKG5hbWUsIHZhbHVlKSB7CiAgICB2YXIga2V5ID0gImF0dHIuIiArIG5hbWU7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOwogICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTsKICAgIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgKGZ1bGxuYW1lLmxvY2FsID8gYXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pKGZ1bGxuYW1lLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkZWxheUNvbnN0YW50KGlkLCB2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbiAoKSB7CiAgICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX2RlbGF5ICh2YWx1ZSkgewogICAgdmFyIGlkID0gdGhpcy5faWQ7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gZGVsYXlGdW5jdGlvbiA6IGRlbGF5Q29uc3RhbnQpKGlkLCB2YWx1ZSkpIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZGVsYXk7CiAgfQoKICBmdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uKGlkLCB2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwgdmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24gKCkgewogICAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX2R1cmF0aW9uICh2YWx1ZSkgewogICAgdmFyIGlkID0gdGhpcy5faWQ7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gZHVyYXRpb25GdW5jdGlvbiA6IGR1cmF0aW9uQ29uc3RhbnQpKGlkLCB2YWx1ZSkpIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZHVyYXRpb247CiAgfQoKICBmdW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHZhbHVlOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9lYXNlICh2YWx1ZSkgewogICAgdmFyIGlkID0gdGhpcy5faWQ7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSkgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5lYXNlOwogIH0KCiAgZnVuY3Rpb24gZWFzZVZhcnlpbmcoaWQsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh0eXBlb2YgdiAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHY7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nICh2YWx1ZSkgewogICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICByZXR1cm4gdGhpcy5lYWNoKGVhc2VWYXJ5aW5nKHRoaXMuX2lkLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9maWx0ZXIgKG1hdGNoKSB7CiAgICBpZiAodHlwZW9mIG1hdGNoICE9PSAiZnVuY3Rpb24iKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHsKICAgICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7CiAgfQoKICBmdW5jdGlvbiB0cmFuc2l0aW9uX21lcmdlICh0cmFuc2l0aW9uKSB7CiAgICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7CiAgICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICAgIH0KICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHsKICAgIHJldHVybiAobmFtZSArICIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24gKHQpIHsKICAgICAgdmFyIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgICAgaWYgKGkgPj0gMCkgdCA9IHQuc2xpY2UoMCwgaSk7CiAgICAgIHJldHVybiAhdCB8fCB0ID09PSAic3RhcnQiOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSB7CiAgICB2YXIgb24wLAogICAgICBvbjEsCiAgICAgIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksCiAgICAgICAgb24gPSBzY2hlZHVsZS5vbjsKCiAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLAogICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICBpZiAob24gIT09IG9uMCkgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihuYW1lLCBsaXN0ZW5lcik7CiAgICAgIHNjaGVkdWxlLm9uID0gb24xOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9vbiAobmFtZSwgbGlzdGVuZXIpIHsKICAgIHZhciBpZCA9IHRoaXMuX2lkOwogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gZ2V0KHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSkgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGlkKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICBmb3IgKHZhciBpIGluIHRoaXMuX190cmFuc2l0aW9uKSBpZiAoK2kgIT09IGlkKSByZXR1cm47CiAgICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHRyYW5zaXRpb25fcmVtb3ZlICgpIHsKICAgIHJldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTsKICB9CgogIGZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0IChzZWxlY3QpIHsKICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQgPSB0aGlzLl9pZDsKICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187CiAgICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7CiAgICAgICAgICBzY2hlZHVsZShzdWJncm91cFtpXSwgbmFtZSwgaWQsIGksIHN1Ymdyb3VwLCBnZXQobm9kZSwgaWQpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsKICB9CgogIGZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0QWxsIChzZWxlY3QpIHsKICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQgPSB0aGlzLl9pZDsKICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgZm9yICh2YXIgY2hpbGRyZW4gPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCksIGNoaWxkLCBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkKSwgayA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGsgPCBsOyArK2spIHsKICAgICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHsKICAgICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pOwogICAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpOwogIH0KCiAgdmFyIFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9zZWxlY3Rpb24gKCkgewogICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIHN0eWxlTnVsbChuYW1lLCBpbnRlcnBvbGF0ZSkgewogICAgdmFyIHN0cmluZzAwLCBzdHJpbmcxMCwgaW50ZXJwb2xhdGUwOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHN0cmluZzAgPSBzdHlsZVZhbHVlKHRoaXMsIG5hbWUpLAogICAgICAgIHN0cmluZzEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKSk7CiAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbCA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkgewogICAgdmFyIHN0cmluZzAwLAogICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiIsCiAgICAgIGludGVycG9sYXRlMDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzdHJpbmcwID0gc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKTsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogICAgdmFyIHN0cmluZzAwLCBzdHJpbmcxMCwgaW50ZXJwb2xhdGUwOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHN0cmluZzAgPSBzdHlsZVZhbHVlKHRoaXMsIG5hbWUpLAogICAgICAgIHZhbHVlMSA9IHZhbHVlKHRoaXMpLAogICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgaWYgKHZhbHVlMSA9PSBudWxsKSBzdHJpbmcxID0gdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlVmFsdWUodGhpcywgbmFtZSkpOwogICAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMCA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZU1heWJlUmVtb3ZlKGlkLCBuYW1lKSB7CiAgICB2YXIgb24wLAogICAgICBvbjEsCiAgICAgIGxpc3RlbmVyMCwKICAgICAga2V5ID0gInN0eWxlLiIgKyBuYW1lLAogICAgICBldmVudCA9ICJlbmQuIiArIGtleSwKICAgICAgcmVtb3ZlOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSwKICAgICAgICBvbiA9IHNjaGVkdWxlLm9uLAogICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBudWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZShuYW1lKSkgOiB1bmRlZmluZWQ7CgogICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS4KICAgICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpOwogICAgICBzY2hlZHVsZS5vbiA9IG9uMTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHRyYW5zaXRpb25fc3R5bGUgKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgdmFyIGkgPSAobmFtZSArPSAiIikgPT09ICJ0cmFuc2Zvcm0iID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgOiBpbnRlcnBvbGF0ZTsKICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpcy5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlTnVsbChuYW1lLCBpKSkub24oImVuZC5zdHlsZS4iICsgbmFtZSwgc3R5bGVSZW1vdmUobmFtZSkpIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gdGhpcy5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlRnVuY3Rpb24obmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCAic3R5bGUuIiArIG5hbWUsIHZhbHVlKSkpLmVhY2goc3R5bGVNYXliZVJlbW92ZSh0aGlzLl9pZCwgbmFtZSkpIDogdGhpcy5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlQ29uc3RhbnQobmFtZSwgaSwgdmFsdWUpLCBwcmlvcml0eSkub24oImVuZC5zdHlsZS4iICsgbmFtZSwgbnVsbCk7CiAgfQoKICBmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICB2YXIgdCwgaTA7CiAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAoaSAhPT0gaTApIHQgPSAoaTAgPSBpKSAmJiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KTsKICAgICAgcmV0dXJuIHQ7CiAgICB9CiAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiB0d2VlbjsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9zdHlsZVR3ZWVuIChuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgIHZhciBrZXkgPSAic3R5bGUuIiArIChuYW1lICs9ICIiKTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7CiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsKICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcigpOwogICAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gIiIgOiBwcmlvcml0eSkpOwogIH0KCiAgZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gIiIgOiB2YWx1ZTE7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX3RleHQgKHZhbHVlKSB7CiAgICByZXR1cm4gdGhpcy50d2VlbigidGV4dCIsIHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIiA/IHRleHRGdW5jdGlvbih0d2VlblZhbHVlKHRoaXMsICJ0ZXh0IiwgdmFsdWUpKSA6IHRleHRDb25zdGFudCh2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiKSk7CiAgfQoKICBmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGUoaSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgIHRoaXMudGV4dENvbnRlbnQgPSBpLmNhbGwodGhpcywgdCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0ZXh0VHdlZW4odmFsdWUpIHsKICAgIHZhciB0MCwgaTA7CiAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgdGV4dEludGVycG9sYXRlKGkpOwogICAgICByZXR1cm4gdDA7CiAgICB9CiAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiB0d2VlbjsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl90ZXh0VHdlZW4gKHZhbHVlKSB7CiAgICB2YXIga2V5ID0gInRleHQiOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTsKICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpOwogICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICByZXR1cm4gdGhpcy50d2VlbihrZXksIHRleHRUd2Vlbih2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gdHJhbnNpdGlvbl90cmFuc2l0aW9uICgpIHsKICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQwID0gdGhpcy5faWQsCiAgICAgIGlkMSA9IG5ld0lkKCk7CiAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICB2YXIgaW5oZXJpdCA9IGdldChub2RlLCBpZDApOwogICAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQxLCBpLCBncm91cCwgewogICAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbiwKICAgICAgICAgICAgZGVsYXk6IDAsCiAgICAgICAgICAgIGR1cmF0aW9uOiBpbmhlcml0LmR1cmF0aW9uLAogICAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2UKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTsKICB9CgogIGZ1bmN0aW9uIHRyYW5zaXRpb25fZW5kICgpIHsKICAgIHZhciBvbjAsCiAgICAgIG9uMSwKICAgICAgdGhhdCA9IHRoaXMsCiAgICAgIGlkID0gdGhhdC5faWQsCiAgICAgIHNpemUgPSB0aGF0LnNpemUoKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBjYW5jZWwgPSB7CiAgICAgICAgICB2YWx1ZTogcmVqZWN0CiAgICAgICAgfSwKICAgICAgICBlbmQgPSB7CiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoLS1zaXplID09PSAwKSByZXNvbHZlKCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgdGhhdC5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLAogICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjsKCiAgICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICAgIGlmIChvbiAhPT0gb24wKSB7CiAgICAgICAgICBvbjEgPSAob24wID0gb24pLmNvcHkoKTsKICAgICAgICAgIG9uMS5fLmNhbmNlbC5wdXNoKGNhbmNlbCk7CiAgICAgICAgICBvbjEuXy5pbnRlcnJ1cHQucHVzaChjYW5jZWwpOwogICAgICAgICAgb24xLl8uZW5kLnB1c2goZW5kKTsKICAgICAgICB9CiAgICAgICAgc2NoZWR1bGUub24gPSBvbjE7CiAgICAgIH0pOwoKICAgICAgLy8gVGhlIHNlbGVjdGlvbiB3YXMgZW1wdHksIHJlc29sdmUgZW5kIGltbWVkaWF0ZWx5CiAgICAgIGlmIChzaXplID09PSAwKSByZXNvbHZlKCk7CiAgICB9KTsKICB9CgogIHZhciBpZCA9IDA7CiAgZnVuY3Rpb24gVHJhbnNpdGlvbihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7CiAgICB0aGlzLl9ncm91cHMgPSBncm91cHM7CiAgICB0aGlzLl9wYXJlbnRzID0gcGFyZW50czsKICAgIHRoaXMuX25hbWUgPSBuYW1lOwogICAgdGhpcy5faWQgPSBpZDsKICB9CiAgZnVuY3Rpb24gbmV3SWQoKSB7CiAgICByZXR1cm4gKytpZDsKICB9CiAgdmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlOwogIFRyYW5zaXRpb24ucHJvdG90eXBlID0gewogICAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sCiAgICBzZWxlY3Q6IHRyYW5zaXRpb25fc2VsZWN0LAogICAgc2VsZWN0QWxsOiB0cmFuc2l0aW9uX3NlbGVjdEFsbCwKICAgIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkLAogICAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9wcm90b3R5cGUuc2VsZWN0Q2hpbGRyZW4sCiAgICBmaWx0ZXI6IHRyYW5zaXRpb25fZmlsdGVyLAogICAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsCiAgICBzZWxlY3Rpb246IHRyYW5zaXRpb25fc2VsZWN0aW9uLAogICAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbl90cmFuc2l0aW9uLAogICAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLAogICAgbm9kZXM6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZXMsCiAgICBub2RlOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGUsCiAgICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsCiAgICBlbXB0eTogc2VsZWN0aW9uX3Byb3RvdHlwZS5lbXB0eSwKICAgIGVhY2g6IHNlbGVjdGlvbl9wcm90b3R5cGUuZWFjaCwKICAgIG9uOiB0cmFuc2l0aW9uX29uLAogICAgYXR0cjogdHJhbnNpdGlvbl9hdHRyLAogICAgYXR0clR3ZWVuOiB0cmFuc2l0aW9uX2F0dHJUd2VlbiwKICAgIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLAogICAgc3R5bGVUd2VlbjogdHJhbnNpdGlvbl9zdHlsZVR3ZWVuLAogICAgdGV4dDogdHJhbnNpdGlvbl90ZXh0LAogICAgdGV4dFR3ZWVuOiB0cmFuc2l0aW9uX3RleHRUd2VlbiwKICAgIHJlbW92ZTogdHJhbnNpdGlvbl9yZW1vdmUsCiAgICB0d2VlbjogdHJhbnNpdGlvbl90d2VlbiwKICAgIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LAogICAgZHVyYXRpb246IHRyYW5zaXRpb25fZHVyYXRpb24sCiAgICBlYXNlOiB0cmFuc2l0aW9uX2Vhc2UsCiAgICBlYXNlVmFyeWluZzogdHJhbnNpdGlvbl9lYXNlVmFyeWluZywKICAgIGVuZDogdHJhbnNpdGlvbl9lbmQsCiAgICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX3Byb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdCiAgfTsKCiAgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7CiAgICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCAqIHQgOiAodCAtPSAyKSAqIHQgKiB0ICsgMikgLyAyOwogIH0KCiAgdmFyIGRlZmF1bHRUaW1pbmcgPSB7CiAgICB0aW1lOiBudWxsLAogICAgLy8gU2V0IG9uIHVzZS4KICAgIGRlbGF5OiAwLAogICAgZHVyYXRpb246IDI1MCwKICAgIGVhc2U6IGN1YmljSW5PdXQKICB9OwogIGZ1bmN0aW9uIGluaGVyaXQobm9kZSwgaWQpIHsKICAgIHZhciB0aW1pbmc7CiAgICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkgewogICAgICBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgdHJhbnNpdGlvbiAke2lkfSBub3QgZm91bmRgKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRpbWluZzsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX3RyYW5zaXRpb24gKG5hbWUpIHsKICAgIHZhciBpZCwgdGltaW5nOwogICAgaWYgKG5hbWUgaW5zdGFuY2VvZiBUcmFuc2l0aW9uKSB7CiAgICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lOwogICAgfSBlbHNlIHsKICAgICAgaWQgPSBuZXdJZCgpLCAodGltaW5nID0gZGVmYXVsdFRpbWluZykudGltZSA9IG5vdygpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyAiIjsKICAgIH0KICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsKICB9CgogIHNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDsKICBzZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbjsKCiAgZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHsKICAgIHRoaXMuayA9IGs7CiAgICB0aGlzLnggPSB4OwogICAgdGhpcy55ID0geTsKICB9CiAgVHJhbnNmb3JtLnByb3RvdHlwZSA9IHsKICAgIGNvbnN0cnVjdG9yOiBUcmFuc2Zvcm0sCiAgICBzY2FsZTogZnVuY3Rpb24gKGspIHsKICAgICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7CiAgICB9LAogICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAoeCwgeSkgewogICAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpOwogICAgfSwKICAgIGFwcGx5OiBmdW5jdGlvbiAocG9pbnQpIHsKICAgICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldOwogICAgfSwKICAgIGFwcGx5WDogZnVuY3Rpb24gKHgpIHsKICAgICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7CiAgICB9LAogICAgYXBwbHlZOiBmdW5jdGlvbiAoeSkgewogICAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTsKICAgIH0sCiAgICBpbnZlcnQ6IGZ1bmN0aW9uIChsb2NhdGlvbikgewogICAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdOwogICAgfSwKICAgIGludmVydFg6IGZ1bmN0aW9uICh4KSB7CiAgICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7CiAgICB9LAogICAgaW52ZXJ0WTogZnVuY3Rpb24gKHkpIHsKICAgICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuazsKICAgIH0sCiAgICByZXNjYWxlWDogZnVuY3Rpb24gKHgpIHsKICAgICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7CiAgICB9LAogICAgcmVzY2FsZVk6IGZ1bmN0aW9uICh5KSB7CiAgICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpOwogICAgfSwKICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyB0aGlzLnggKyAiLCIgKyB0aGlzLnkgKyAiKSBzY2FsZSgiICsgdGhpcy5rICsgIikiOwogICAgfQogIH07CiAgVHJhbnNmb3JtLnByb3RvdHlwZTsKCiAgLyoKICAgIEhURE1hdGggU3RhdGljIENsYXNzIC0gTm90IGludGVuZGVkIGZvciBpbnN0YW50aWF0aW9uIQoKICAgIE1vZGVsIHBhcmFtZXRlcnM6CiAgICAgIGsgPSBkaXNjb3VudCBmYWN0b3IgKDAsIEluZmluaXR5KQoKICAgIEJlaGF2aW9yYWwgdmFyaWFibGVzOgogICAgICBBID0gYW1vdW50CiAgICAgIEQgPSBkZWxheQogICAgICBWID0gc3ViamVjdGl2ZSB2YWx1ZQoKICAgIEVxdWF0aW9uczoKICAgICAgViA9IEEgLyAoMSArIGtEKQogICAgICBrID0gKEEgLSBWKSAvIChWRCkKICAqLwogIGNsYXNzIEhURE1hdGggewogICAgc3RhdGljIGsgPSB7CiAgICAgIERFRkFVTFQ6IDAuMDUsCiAgICAgIE1JTjogMCwKICAgICAgTUFYOiAxMDAsCiAgICAgIFNURVA6IDAuMDAxLAogICAgICBKVU1QOiAwLjAxCiAgICB9OwogICAgc3RhdGljIGFkazJ2KGEsIGQsIGspIHsKICAgICAgcmV0dXJuIGEgLyAoMSArIGsgKiBkKTsKICAgIH0KICAgIHN0YXRpYyBhZHYyayhhLCBkLCB2KSB7CiAgICAgIHJldHVybiAoYSAtIHYpIC8gKHYgKiBkKTsKICAgIH0KICB9CgogIC8vIEludGVybmFsIGRlcGVuZGVuY2llcwoKICAvKiBlc2xpbnQgbm8tcmVzdHJpY3RlZC1nbG9iYWxzOiBbIm9mZiIsICJzZWxmIl0gKi8KCiAgc2VsZi5vbm1lc3NhZ2UgPSBldmVudCA9PiB7CiAgICBjb25zdCBwYXJhbXMgPSB7CiAgICAgIGs6IHsKICAgICAgICB0eXBlOiAncmVhbCcsCiAgICAgICAgbG93ZXI6IEhURE1hdGguay5NSU4sCiAgICAgICAgdXBwZXI6IEhURE1hdGguay5NQVgKICAgICAgfSwKICAgICAgbHVjZTogewogICAgICAgIHR5cGU6ICdyZWFsJywKICAgICAgICBsb3dlcjogMCwKICAgICAgICB1cHBlcjogMTAwCiAgICAgIH0KICAgIH07CiAgICBjb25zdCBsb2dQb3N0ID0gKHN0YXRlLCBkYXRhKSA9PiB7CiAgICAgIGxldCBscCA9IDA7CgogICAgICAvLyBQcmlvcnMKICAgICAgY29uc3Qga01lYW4gPSAyOwogICAgICBjb25zdCBrU2hhcGUgPSAzOwogICAgICBscCArPSBkaXN0cmlidXRpb25zRXhwb3J0cy5nYW1tYShzdGF0ZS5rLCBrU2hhcGUsIGtTaGFwZSAvIGtNZWFuKTsKICAgICAgLy8gbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLnVuaWYoc3RhdGUuaywgMCwgMTAwKTsKCiAgICAgIGNvbnN0IGx1Y2VNZWFuID0gMjsKICAgICAgY29uc3QgbHVjZVNoYXBlID0gMzsKICAgICAgbHAgKz0gZGlzdHJpYnV0aW9uc0V4cG9ydHMuZ2FtbWEoc3RhdGUubHVjZSwgbHVjZVNoYXBlLCBsdWNlU2hhcGUgLyBsdWNlTWVhbik7CiAgICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7CgogICAgICAvLyBMaWtlbGlob29kCiAgICAgIGRhdGEuZm9yRWFjaChjaG9pY2UgPT4gewogICAgICAgIC8vIFZhbHVlcwogICAgICAgIGNvbnN0IHZzID0gSFRETWF0aC5hZGsydihjaG9pY2UuYXMsIGNob2ljZS5kcywgc3RhdGUuayk7CiAgICAgICAgY29uc3QgdmwgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hbCwgY2hvaWNlLmRsLCBzdGF0ZS5rKTsKCiAgICAgICAgLy8gQ2hvaWNlIG9mIHNvb25lciBvciBsYXRlciBpcyBzYW1wbGVkIGZyb20gYSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uCiAgICAgICAgLy8gTHVjZSBjaG9pY2UgcnVsZSBpcyB1c2VkIHRvIGNvbXB1dGUgcHJvYmFiaWxpdHkgb2Ygd2FpdGluZyEgKDAgPSBzb29uZXIsIDEgPSBsYXRlcikKICAgICAgICBjb25zdCBiaW52YWwgPSAxIC8gKDEgKyBNYXRoLmV4cChzdGF0ZS5sdWNlICogKHZzIC0gdmwpKSk7CgogICAgICAgIC8vIEFjdHVhbCByZXNwb25zZQogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gY2hvaWNlLnJlc3BvbnNlID09PSAnZmlyc3QnID8gMCA6IDE7CiAgICAgICAgbHAgKz0gZGlzdHJpYnV0aW9uc0V4cG9ydHMuYmVybihyZXNwb25zZSwgYmludmFsKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBscDsKICAgIH07CgogICAgLy8gSW5pdGlhbGl6aW5nIHRoZSBzYW1wbGVyCiAgICBjb25zdCBzYW1wbGVyID0gbmV3IG1jbWNFeHBvcnRzLkFtd2dTYW1wbGVyKHBhcmFtcywgbG9nUG9zdCwgZXZlbnQuZGF0YSk7CiAgICAvLyBCdXJuaW5nIHNvbWUgc2FtcGxlcyB0byB0aGUgTUNNQyBnb2RzIGFuZCBzYW1wbGluZyA1MDAwIGRyYXdzCiAgICBzYW1wbGVyLmJ1cm4oMTAwMCk7CiAgICBjb25zdCBzYW1wbGVzID0gc2FtcGxlci5zYW1wbGUoNTAwMCk7CgogICAgLy8gRXh0cmFjdCBzdW1tYXJ5IHN0YXRzCiAgICBjb25zdCByZXN1bHRzID0gewogICAgICBrOiBtZWRpYW4oc2FtcGxlcy5rKSwKICAgICAgbHVjZTogbWVkaWFuKHNhbXBsZXMubHVjZSkKICAgIH07CiAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgcmVzdWx0czogcmVzdWx0cywKICAgICAgc2FtcGxlczogc2FtcGxlcwogICAgfSk7CiAgfTsKCn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0ZC1maXQtd29ya2VyLmpzLm1hcAoK', 'data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRkLWZpdC13b3JrZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9iYXllcy5qcy9kaXN0cmlidXRpb25zLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2JheWVzLmpzL21jbWMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2FzY2VuZGluZy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbnVtYmVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9zb3J0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21pbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVpY2tzZWxlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3F1YW50aWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tZWRpYW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtZGlzcGF0Y2gvc3JjL2Rpc3BhdGNoLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbmFtZXNwYWNlcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NyZWF0b3IuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rvci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9hcnJheS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yQWxsLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdEFsbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL21hdGNoZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGRyZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZmlsdGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NwYXJzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbnRlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NvbnN0YW50LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdGEuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZXhpdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9qb2luLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL21lcmdlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29yZGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NvcnQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2FsbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2Rlcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2RlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NpemUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW1wdHkuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZWFjaC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9hdHRyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvd2luZG93LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3N0eWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3Byb3BlcnR5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2NsYXNzZWQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vdGV4dC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9odG1sLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JhaXNlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2xvd2VyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2FwcGVuZC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbnNlcnQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcmVtb3ZlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Nsb25lLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdHVtLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Rpc3BhdGNoLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2l0ZXJhdG9yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9kZWZpbmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2NvbG9yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb25zdGFudC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29sb3IuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3JnYi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9zdHJpbmcuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9kZWNvbXBvc2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9wYXJzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZW91dC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NjaGVkdWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2ludGVycnVwdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW50ZXJydXB0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHdlZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbnRlcnBvbGF0ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyVHdlZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kZWxheS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2R1cmF0aW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZWFzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2VWYXJ5aW5nLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZmlsdGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9vbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3JlbW92ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdEFsbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdGlvbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGVUd2Vlbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RleHQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0VHdlZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZW5kLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY3ViaWMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL3RyYW5zaXRpb24uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3RyYW5zZm9ybS5qcyIsIi4uL2Rpc2NvdW50YWJsZS1tYXRoL3NyYy9odGQtbWF0aC5qcyIsIi4uL2Rpc2NvdW50YWJsZS1tYXRoL3NyYy9pbmRleC5qcyIsInNyYy9jb21wb25lbnRzL2h0ZC1maXQtd29ya2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5cbi8vIEEgbnVtYmVyIG9mIGxvZyBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9ucyAoUERGKS4gTmFtaW5nIGFuZCBwYXJhbWV0ZXJpemF0aW9uXG4vLyBzaG91bGQgbWF0Y2ggUidzLCBleGNlcHQgZm9yIHRoYXQgYWxsIGZ1bmN0aW9ucyByZXNpZGUgaW4gYW4gbGQgb2JqZWN0IChcbi8vIGFzIGluIFwibG9nIGRlbnNpdHlcIiksIHNvIHRvIGdldCBhIG5vcm1hbCBsb2cgZGVuc2l0eSB5b3Ugd291bGQgd3JpdGVcbi8vIGxkLm5vcm0oLi4uKS5cbi8vIE1vc3Qgb2YgdGhlIGNvZGUgYmVsb3cgaXMgZGlyZWN0bHkgdGFrZW4gZnJvbSB0aGUgZ3JlYXQgSnN0YXQgcHJvamVjdFxuLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9qc3RhdC8pIHdoaWNoIGluY2x1ZGVzIFBERiBmb3IgbWFueSBjb21tb24gcHJvYmFiaWxpdHlcbi8vIGRpc3RyaWJ1dGlvbnMuIFdoYXQgSSBoYXZlIGRvbmUgaXMgb25seSB0byBjb252ZXJ0IHRoZXNlIHRvIGxvZyBQREZzLlxuXG4vKlxuT3JpZ2luYWwgd29yayBDb3B5cmlnaHQgKGMpIDIwMTMgalN0YXRcbk1vZGlmaWVkIHdvcmsgQ29weXJpZ2h0IChjKSAyMDE1IFJhc211cyBCw6XDpXRoIFxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuXG5cbiovXG5cblxuLy8gVGhpcyBib2lsZXIgcGxhdGUgY29kZSBoZXJlIGlzIHRha2VuIGZyb206XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzXG4vLyBJdCBzaG91bGQgbWFrZSBzaHVyZSB0aGF0IG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQgYm90aCBpbiB0aGUgYnJvd3Nlcixcbi8vIE5vZGUsIGFuZCBieSB1c2luZyB0aGUgQXN5bmNocm9ub3VzIE1vZHVsZSBEZWZpbml0aW9uIHN0YW5kYXJkLlxuLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsXG4vLyBvYmplY3QgbGQgLlxuKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuXG4gICAgICAgIGRlZmluZShbXSwgZmFjdG9yeSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXRcbiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsXG4gICAgICAgIC8vIGxpa2UgTm9kZS5cbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzIChyb290IGlzIHdpbmRvdylcbiAgICAgICAgcm9vdC5sZCA9IGZhY3RvcnkoKTtcbiAgfVxufSh0aGlzLCBmdW5jdGlvbigpIHtcbiAgLy8gT2JqZWN0IHRvIGhvbGQgdGhlIGZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZC5cbiAgdmFyIGxkICA9IHt9O1xuICBcbiAgLy8vLy8vLy8vLyBIZWxwZXIgZnVuY3Rpb25zIC8vLy8vLy8vLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIHZhciBsZ2FtbWEgPSBmdW5jdGlvbih4KSB7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBjb2YgPSBbXG4gICAgICA3Ni4xODAwOTE3Mjk0NzE0NiwgLTg2LjUwNTMyMDMyOTQxNjc3LCAyNC4wMTQwOTgyNDA4MzA5MSxcbiAgICAgIC0xLjIzMTczOTU3MjQ1MDE1NSwgMC4xMjA4NjUwOTczODY2MTc5ZS0yLCAtMC41Mzk1MjM5Mzg0OTUzZS01XG4gICAgXTtcbiAgICB2YXIgc2VyID0gMS4wMDAwMDAwMDAxOTAwMTU7XG4gICAgdmFyIHh4LCB5LCB0bXA7XG4gICAgdG1wID0gKHkgPSB4eCA9IHgpICsgNS41O1xuICAgIHRtcCAtPSAoeHggKyAwLjUpICogbG9nKHRtcCk7XG4gICAgZm9yICg7IGogPCA2OyBqKyspXG4gICAgICBzZXIgKz0gY29mW2pdIC8gKyt5O1xuICAgIHJldHVybiBsb2coMi41MDY2MjgyNzQ2MzEwMDA1ICogc2VyIC8geHgpIC0gdG1wO1xuICB9O1xuICBsZC5sZ2FtbWEgPSBsZ2FtbWE7XG4gIFxuICB2YXIgbGZhY3RvcmlhbCA9IGZ1bmN0aW9uKG4pIHtcbiAgICByZXR1cm4gbiA8IDAgPyBOYU4gOiBsZ2FtbWEobiArIDEpO1xuICB9O1xuICBsZC5sZmFjdG9yaWFsID0gbGZhY3RvcmlhbDtcbiAgXG4gIHZhciBsY2hvb3NlID0gZnVuY3Rpb24obiwgayl7XG4gICAgcmV0dXJuIGxmYWN0b3JpYWwobikgLSBsZmFjdG9yaWFsKGspIC0gbGZhY3RvcmlhbChuIC0gayk7XG4gIH07XG4gIGxkLmxjaG9vc2UgPSBsY2hvb3NlO1xuICBcbiAgdmFyIGxiZXRhID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBsZ2FtbWEoYSkgKyBsZ2FtbWEoYikgLSBsZ2FtbWEoYSArIGIpO1xuICB9O1xuICBsZC5sYmV0YSA9IGxiZXRhO1xuICBcbiAgdmFyIGxvZyAgPSBNYXRoLmxvZztcbiAgdmFyIGV4cCAgPSBNYXRoLmV4cDtcbiAgdmFyIGFicyAgPSBNYXRoLmFicztcbiAgdmFyIHBvdyAgPSBNYXRoLnBvdztcbiAgdmFyIHNxcnQgPSBNYXRoLnNxcnQ7XG4gIHZhciBwaSAgID0gTWF0aC5QSTtcbiAgXG4gIC8vLy8vLy8vLy8gQ29udGlub3VzIGRpc3RyaWJ1dGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIGxkLmJldGEgPSBmdW5jdGlvbih4LCBzaGFwZTEsIHNoYXBlMikge1xuICAgIGlmICh4ID4gMSB8fCB4IDwgMCkge1xuICAgICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICBpZihzaGFwZTEgPT09IDEgJiYgc2hhcGUyID09PSAxKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIChzaGFwZTEgLSAxKSAqIGxvZyh4KSArIChzaGFwZTIgLSAxKSAqIGxvZygxIC0geCkgLSBsYmV0YShzaGFwZTEsIHNoYXBlMik7ICBcbiAgICB9XG4gIH07XG4gIFxuICBsZC5jYXVjaHkgPSBmdW5jdGlvbih4LCBsb2NhdGlvbiwgc2NhbGUpIHtcbiAgICByZXR1cm4gbG9nKHNjYWxlKSAtIGxvZyhwb3coeCAtIGxvY2F0aW9uLCAyKSArIHBvdyhzY2FsZSwgMikpICAtIGxvZyhwaSk7XG4gIH07XG4gIFxuICBsZC5ub3JtID0gZnVuY3Rpb24oeCwgbWVhbiwgc2QpIHtcbiAgICAgIHJldHVybiAtMC41ICogbG9nKDIgKiBwaSkgLWxvZyhzZCkgLSBwb3coeCAtIG1lYW4sIDIpIC8gKDIgKiBzZCAqIHNkKTtcbiAgfTtcblxuICAvLyBBIGJpdmFyaWF0ZSBOb3JtYWwgZGlzdHJpYnV0aW9uIHBhcmFtZXRlcml6ZWQgYnkgYXJyYXlzIG9mIHR3byBtZWFucyBhbmQgU0RzLCBhbmQgXG4gIC8vIHRoZSBjb3JyZWxhdGlvbi5cbiAgbGQuYml2YXJub3JtID0gZnVuY3Rpb24oeCwgbWVhbiwgc2QsIGNvcnIpIHtcbiAgICB2YXIgeiA9IHBvdyh4WzBdIC0gbWVhblswXSwgMikgLyBwb3coc2RbMF0sIDIpICtcbiAgICAgICAgICAgIHBvdyh4WzFdIC0gbWVhblsxXSwgMikgLyBwb3coc2RbMV0sIDIpIC0gXG4gICAgICAgICAgICAoMiAqIGNvcnIgKiAoeFswXSAtIG1lYW5bMF0pICogKHhbMV0gLSBtZWFuWzFdKSkgLyAoc2RbMF0gKiBzZFsxXSk7XG4gICAgdmFyIG5vcm1hbGl6aW5nX2ZhY3RvciA9IC0oIGxvZygyKSArIGxvZyhwaSkgKyBsb2coc2RbMF0pICsgbG9nKHNkWzFdKSArIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUgKiBsb2coMSAtIHBvdyhjb3JyLCAyKSkgKTsgXG4gICAgdmFyIGJpdmFyX2xvZ19kZW5zID0gbm9ybWFsaXppbmdfZmFjdG9yIC0geiAvICgyICogKDEgLSBwb3coY29yciwgMikgKSApOyBcbiAgICByZXR1cm4gYml2YXJfbG9nX2RlbnM7XG4gIH07XG4gIFxuXG4gIGxkLmxhcGxhY2UgPSBmdW5jdGlvbih4LCBsb2NhdGlvbiwgc2NhbGUpIHtcbiAgICByZXR1cm4gKC1hYnMoeCAtIGxvY2F0aW9uKS9zY2FsZSkgLSBsb2coMiAqIHNjYWxlKTtcbiAgfTtcbiAgXG4gIGxkLmRleHAgPSBsZC5sYXBsYWNlO1xuICBcbiAgbGQuZ2FtbWEgPSBmdW5jdGlvbih4LCBzaGFwZSwgcmF0ZSkge1xuICAgIHZhciBzY2FsZSA9IDEgLyByYXRlO1xuICAgIGlmICh4IDwgMCkge1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9XG4gICAgaWYoKHggPT09IDAgJiYgc2hhcGUgPT09IDEpICkge1xuICAgICAgcmV0dXJuIC1sb2coc2NhbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKHNoYXBlIC0gMSkgKiBsb2coeCkgLSB4IC8gc2NhbGUgLSBsZ2FtbWEoc2hhcGUpIC0gc2hhcGUgKiBsb2coc2NhbGUpO1xuICAgIH1cbiAgfTtcbiAgXG4gIGxkLmludmdhbW1hID0gZnVuY3Rpb24oeCwgc2hhcGUsIHNjYWxlKSB7XG4gICAgICBpZiAoeCA8PSAwKSB7XG4gICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICB9XG4gICAgICByZXR1cm4gLShzaGFwZSArIDEpICogbG9nKHgpIC0gc2NhbGUgLyB4IC0gbGdhbW1hKHNoYXBlKSArIHNoYXBlICogbG9nKHNjYWxlKTtcbiAgICB9O1xuICBcbiAgbGQubG5vcm0gPSAgZnVuY3Rpb24oeCwgbWVhbmxvZywgc2Rsb2cpIHtcbiAgICBpZiAoeCA8PSAwKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gLWxvZyh4KSAtIDAuNSAqIGxvZygyICogcGkpIC0gbG9nKHNkbG9nKSAtIFxuICAgICAgICAgICAgcG93KGxvZyh4KSAtIG1lYW5sb2csIDIpIC8gKDIgKiBzZGxvZyAqIHNkbG9nKTtcbiAgfTtcbiAgXG4gIGxkLnBhcmV0byA9IGZ1bmN0aW9uKHgsIHNjYWxlLCBzaGFwZSkge1xuICAgIGlmICh4IDwgc2NhbGUpIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiBsb2coc2hhcGUpICsgc2hhcGUgKiBsb2coc2NhbGUpIC0gKHNoYXBlICsgMSkgKiBsb2coeCk7XG4gIH07XG4gIFxuICBsZC50ICA9ICBmdW5jdGlvbih4LCBsb2NhdGlvbiwgc2NhbGUsIGRmKSB7XG4gICAgZGYgPSBkZiA+IDFlMTAwID8gMWUxMDAgOiBkZjtcbiAgICByZXR1cm4gbGdhbW1hKChkZiArIDEpLzIpIC0gbGdhbW1hKGRmLzIpIC0gbG9nKHNxcnQocGkgKiBkZikgKiBzY2FsZSkgK1xuICAgICAgICAgICBsb2cocG93KDEgKyAoMS9kZikgKiBwb3coKHggLSBsb2NhdGlvbikvc2NhbGUsIDIpLCAtKGRmICsgMSkvMikpO1xuICB9O1xuICBcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBqYXZhc2NyaXB0IHRyYW5zbGF0aW9uIG9mIHRoZSBSIGNvZGUgdXNlZCB0byBldmFsdWF0ZVxuICAvLyB0aGUgbG9nIGRlbnNpdHkgb2YgYSB3ZWlidWxsIGRpc3RyaWJ1dGlvbjogXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93Y2gvci1zb3VyY2UvYmxvYi9iMTU2ZTNhNzExOTY3ZjU4MTMxZTIzYzFiMWRjMWVhOTBlMmYwYzQzL3NyYy9ubWF0aC9kd2VpYnVsbC5jXG4gIGxkLndlaWJ1bGwgPSBmdW5jdGlvbih4LCBzaGFwZSwgc2NhbGUpIHtcbiAgICBpZiAoeCA8IDApIHJldHVybiAtSW5maW5pdHk7XG4gICAgaWYoeCA9PT0gMCAmJiBzaGFwZSA8IDEpIHJldHVybiBJbmZpbml0eTtcbiAgICB2YXIgdG1wMSA9IHBvdyh4IC8gc2NhbGUsIHNoYXBlIC0gMSk7XG4gICAgdmFyIHRtcDIgPSB0bXAxICogKHggLyBzY2FsZSk7XG5cdCAgcmV0dXJuIC10bXAyICsgbG9nKHNoYXBlICogdG1wMSAvIHNjYWxlKTtcbiAgfTtcbiAgXG4gIC8vIFRoaXMgaXMgYSBkaXJlY3QgamF2YXNjcmlwdCB0cmFuc2xhdGlvbiBvZiB0aGUgUiBjb2RlIHVzZWQgdG8gZXZhbHVhdGVcbiAgLy8gdGhlIGxvZyBkZW5zaXR5IG9mIGEgbG9naXN0aWMgZGlzdHJpYnV0aW9uOiBcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2Rsb2dpcy5jXG4gIGxkLmxvZ2lzID0gZnVuY3Rpb24oeCwgbG9jYXRpb24sIHNjYWxlKSB7XG4gICAgeCA9IGFicygoeCAtIGxvY2F0aW9uKSAvIHNjYWxlKTtcbiAgICB2YXIgZSA9IGV4cCgteCk7XG4gICAgdmFyIGYgPSAxLjAgKyBlO1xuICAgIHJldHVybiAtKHggKyBsb2coc2NhbGUgKiBmICogZikpOyAgICBcbiAgfTtcblxuICBsZC5kaXJpY2hsZXQgPSBmdW5jdGlvbih4LCBhbHBoYSkge1xuICAgIHZhciBzdW1fYWxwaGEgPSAwO1xuICAgIHZhciBzdW1fbGdhbW1hX2FscGhhID0gMDtcbiAgICB2YXIgc3VtX2FscGhhX3N1Yl8xX2xvZ194ID0gMDtcbiAgICB2YXIgbiA9IGFscGhhLmxlbmd0aDtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzdW1fYWxwaGEgKz0gYWxwaGFbaV07XG4gICAgICBzdW1fbGdhbW1hX2FscGhhICs9IGxnYW1tYShhbHBoYVtpXSk7XG4gICAgICBzdW1fYWxwaGFfc3ViXzFfbG9nX3ggKz0gKGFscGhhW2ldIC0gMSkgKiBsb2coeFtpXSk7XG4gICAgfVxuICAgIHJldHVybiBsZ2FtbWEoc3VtX2FscGhhKSAtIHN1bV9sZ2FtbWFfYWxwaGEgKyBzdW1fYWxwaGFfc3ViXzFfbG9nX3g7XG4gIH07XG4gICBcbiAgICBcbiAgbGQuZXhwID0gZnVuY3Rpb24oeCwgcmF0ZSkge1xuICAgICAgcmV0dXJuIHggPCAwID8gLUluZmluaXR5IDogbG9nKHJhdGUpIC1yYXRlICogeDtcbiAgfTtcbiAgXG4gIGxkLnVuaWYgPSBmdW5jdGlvbih4LCBtaW4sIG1heCkge1xuICAgICAgcmV0dXJuICh4IDwgbWluIHx8IHggPiBtYXgpID8gLUluZmluaXR5IDogbG9nKDEgLyAobWF4IC0gbWluKSk7XG4gIH07XG4gIFxuICAvLy8vLy8vLy8vIERpc2NyZXRlIGRpc3RyaWJ1dGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgbGQuYmVybiA9IGZ1bmN0aW9uKHgsIHByb2IpIHtcbiAgICAgIHJldHVybiAhKHggPT09IDAgfHwgeCA9PT0gMSkgPyAtSW5maW5pdHkgOiBsb2coeCAqIHByb2IgKyAoMSAtIHgpICogKDEgLSBwcm9iKSk7XG4gIH07XG4gIFxuICBsZC5jYXQgPSBmdW5jdGlvbih4LCBwcm9icykge1xuICAgIGlmKHggPCAxIHx8IHggPiBwcm9icy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBsb2coIHByb2JzW3ggLSAxXSApO1xuICAgIH1cbiAgfTtcbiAgXG4gIGxkLmJpbm9tID0gZnVuY3Rpb24oeCwgc2l6ZSwgcHJvYikge1xuICAgIGlmKHggPiBzaXplIHx8IHggPCAwKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICBpZihwcm9iID09PSAwIHx8IHByb2IgPT09IDEpIHtcbiAgICAgIHJldHVybiAoc2l6ZSAqIHByb2IpID09PSB4ID8gMCA6IC1JbmZpbml0eTtcbiAgICB9XG4gICAgcmV0dXJuIGxjaG9vc2Uoc2l6ZSwgeCkgKyB4ICogbG9nKHByb2IpICsgKHNpemUgLSB4KSAqIGxvZygxIC0gcHJvYik7XG4gIH07XG4gIFxuICB2YXIgbXVsdGlub20gPSBmdW5jdGlvbih4LCBwcm9icykge1xuICAgIHZhciBuID0geC5sZW5ndGg7XG4gICAgdmFyIHNpemUgPSAwO1xuICAgIHZhciB0bXBfdGVybSA9IDA7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgaWYocHJvYnNbaV0gPT09IDApIHtcbiAgICAgICAgaWYoeFtpXSAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7ICBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2l6ZSArPSB4W2ldO1xuICAgICAgICB0bXBfdGVybSArPSB4W2ldICogbG9nKHByb2JzW2ldKSAtIGxnYW1tYSh4W2ldICsgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsZ2FtbWEoc2l6ZSArIDEpICsgdG1wX3Rlcm0gO1xuICB9O1xuICBcbiAgbGQubmJpbm9tID0gZnVuY3Rpb24oeCwgc2l6ZSwgcHJvYikge1xuICAgIGlmKHggPCAwKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gbGNob29zZSh4ICsgc2l6ZSAtIDEsIHNpemUgLSAxKSArIHggKiBsb2coMSAtIHByb2IpICsgc2l6ZSAqIGxvZyhwcm9iKTtcbiAgfTtcbiAgXG4gIGxkLmh5cGVyID0gZnVuY3Rpb24oeCwgbSwgbiwgaykge1xuICAgIGlmKHggPCAwIHx8IHggPiBrKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxjaG9vc2UobSwgeCkgKyBsY2hvb3NlKG4sIGsteCkgLSBsY2hvb3NlKG0rbiwgayk7XG4gICAgfVxuICB9O1xuICBcbiAgbGQucG9pcyA9IGZ1bmN0aW9uKHgsIGxhbWJkYSkge1xuICAgICAgcmV0dXJuIHggPCAwID8gLUluZmluaXR5IDogbG9nKGxhbWJkYSkgKiB4IC0gbGFtYmRhIC0gbGZhY3RvcmlhbCh4KTtcbiAgfTtcbiAgXG4gIHJldHVybiBsZDtcbn0pKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gVGhpcyBib2lsZXIgcGxhdGUgY29kZSBoZXJlIGlzIHRha2VuIGZyb206XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzXG4vLyBJdCBzaG91bGQgbWFrZSBzaHVyZSB0aGF0IG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQgYm90aCBpbiB0aGUgYnJvd3Nlcixcbi8vIE5vZGUsIGFuZCBieSB1c2luZyB0aGUgQXN5bmNocm9ub3VzIE1vZHVsZSBEZWZpbml0aW9uIHN0YW5kYXJkLlxuLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsXG4vLyBvYmplY3QgbWNtYyAuXG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICAgICAgZGVmaW5lKFtdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIC8vIE5vZGUuIERvZXMgbm90IHdvcmsgd2l0aCBzdHJpY3QgQ29tbW9uSlMsIGJ1dFxuICAgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cyxcbiAgICAgICAgLy8gbGlrZSBOb2RlLlxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KVxuICAgICAgICByb290Lm1jbWMgPSBmYWN0b3J5KCk7XG4gIH1cbn0odGhpcywgZnVuY3Rpb24oKXtcblxuLy8vIFRoZSBhY3R1YWwgbW9kdWxlIGNvZGUgc3RhcnRzIGhlcmUgLy8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gIFxuICBcbiAgLy8vLy8vLy8vLyBIZWxwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGJldHdlZW4gbWluIGFuZCBtYXggKi9cbiAgdmFyIHJ1bmlmID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICByZXR1cm4gTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pICsgbWluO1xuICB9O1xuICBcbiAgLyoqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciBiZXR3ZWVuIG1pbiBhbmQgbWF4ICovXG4gIHZhciBydW5pZl9kaXNjcmV0ZSA9IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyBhIHJhbmRvbSByZWFsIG51bWJlciBmcm9tIGEgbm9ybWFsIGRpc3RyaWJidXRpb24gZGVmaW5lZFxuICAgKiAgYnkgbWVhbiBhbmQgc2QuIFxuICAgKiAgQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qc3RhdC9qc3RhdC9ibG9iL21hc3Rlci9zcmMvc3BlY2lhbC5qcyAqL1xuICB2YXIgcm5vcm0gPSBmdW5jdGlvbihtZWFuLCBzZCkge1xuICAgIHZhciB1LCB2LCB4LCB5LCBxO1xuICAgIGRvIHtcbiAgICAgIHUgPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgdiA9IDEuNzE1NiAqIChNYXRoLnJhbmRvbSgpIC0gMC41KTtcbiAgICAgIHggPSB1IC0gMC40NDk4NzE7XG4gICAgICB5ID0gTWF0aC5hYnModikgKyAwLjM4NjU5NTtcbiAgICAgIHEgPSB4ICogeCArIHkgKiAoMC4xOTYwMCAqIHkgLSAwLjI1NDcyICogeCk7XG4gICAgfSB3aGlsZSAocSA+IDAuMjc1OTcgJiYgKHEgPiAwLjI3ODQ2IHx8IHYgKiB2ID4gLTQgKiBNYXRoLmxvZyh1KSAqIHUgKiB1KSk7XG4gICAgXG4gICAgcmV0dXJuICh2IC8gdSkgKiBzZCArIG1lYW47XG4gIH07XG4gIFxuICBcbiAgLyoqIFJldHVybnMgYSBkZWVwIGNsb25lIG9mIHNyYywgc29ydCBvZi4uLiBJdCBvbmx5IGNvcGllcyBhIGxpbWl0ZWRcbiAgICogbnVtYmVyIG9mIHR5cGVzIGFuZCwgZm9yIGV4YW1wbGUsIGZ1bmN0aW9uIGFyZSBub3QgY29waWVkLiBcbiAgICogRnJvbSBodHRwOi8vZGF2aWR3YWxzaC5uYW1lL2phdmFzY3JpcHQtY2xvbmVcbiAgICovXG4gIHZhciBkZWVwX2Nsb25lID0gZnVuY3Rpb24oc3JjKSB7XG4gIFx0ZnVuY3Rpb24gbWl4aW4oZGVzdCwgc291cmNlLCBjb3B5RnVuYykge1xuICBcdFx0dmFyIG5hbWUsIHMsIGksIGVtcHR5ID0ge307XG4gIFx0XHRmb3IobmFtZSBpbiBzb3VyY2Upe1xuICBcdFx0XHQvLyB0aGUgKCEobmFtZSBpbiBlbXB0eSkgfHwgZW1wdHlbbmFtZV0gIT09IHMpIGNvbmRpdGlvbiBhdm9pZHMgY29weWluZyBwcm9wZXJ0aWVzIGluIFwic291cmNlXCJcbiAgXHRcdFx0Ly8gaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZS5cdCBGb3IgZXhhbXBsZSwgaWYgZGVzdCBoYXMgYSBjdXN0b20gdG9TdHJpbmcoKSBtZXRob2QsXG4gIFx0XHRcdC8vIGRvbid0IG92ZXJ3cml0ZSBpdCB3aXRoIHRoZSB0b1N0cmluZygpIG1ldGhvZCB0aGF0IHNvdXJjZSBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG90eXBlXG4gIFx0XHRcdHMgPSBzb3VyY2VbbmFtZV07XG4gIFx0XHRcdGlmKCEobmFtZSBpbiBkZXN0KSB8fCAoZGVzdFtuYW1lXSAhPT0gcyAmJiAoIShuYW1lIGluIGVtcHR5KSB8fCBlbXB0eVtuYW1lXSAhPT0gcykpKXtcbiAgXHRcdFx0XHRkZXN0W25hbWVdID0gY29weUZ1bmMgPyBjb3B5RnVuYyhzKSA6IHM7XG4gIFx0XHRcdH1cbiAgXHRcdH1cbiAgXHRcdHJldHVybiBkZXN0O1xuICBcdH1cbiAgXHRpZighc3JjIHx8IHR5cGVvZiBzcmMgIT0gXCJvYmplY3RcIiB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3JjKSA9PT0gXCJbb2JqZWN0IEZ1bmN0aW9uXVwiKXtcbiAgXHRcdC8vIG51bGwsIHVuZGVmaW5lZCwgYW55IG5vbi1vYmplY3QsIG9yIGZ1bmN0aW9uXG4gIFx0XHRyZXR1cm4gc3JjO1x0Ly8gYW55dGhpbmdcbiAgXHR9XG4gIFx0aWYoc3JjLm5vZGVUeXBlICYmIFwiY2xvbmVOb2RlXCIgaW4gc3JjKXtcbiAgXHRcdC8vIERPTSBOb2RlXG4gIFx0XHRyZXR1cm4gc3JjLmNsb25lTm9kZSh0cnVlKTsgLy8gTm9kZVxuICBcdH1cbiAgXHRpZihzcmMgaW5zdGFuY2VvZiBEYXRlKXtcbiAgXHRcdC8vIERhdGVcbiAgXHRcdHJldHVybiBuZXcgRGF0ZShzcmMuZ2V0VGltZSgpKTtcdC8vIERhdGVcbiAgXHR9XG4gIFx0aWYoc3JjIGluc3RhbmNlb2YgUmVnRXhwKXtcbiAgXHRcdC8vIFJlZ0V4cFxuICBcdFx0cmV0dXJuIG5ldyBSZWdFeHAoc3JjKTsgICAvLyBSZWdFeHBcbiAgXHR9XG4gIFx0dmFyIHIsIGksIGw7XG4gIFx0aWYoc3JjIGluc3RhbmNlb2YgQXJyYXkpe1xuICBcdFx0Ly8gYXJyYXlcbiAgXHRcdHIgPSBbXTtcbiAgXHRcdGZvcihpID0gMCwgbCA9IHNyYy5sZW5ndGg7IGkgPCBsOyArK2kpe1xuICBcdFx0XHRpZihpIGluIHNyYyl7XG4gIFx0XHRcdFx0ci5wdXNoKGRlZXBfY2xvbmUoc3JjW2ldKSk7XG4gIFx0XHRcdH1cbiAgXHRcdH1cbiAgXHR9IGVsc2Uge1xuICBcdFx0Ly8gZ2VuZXJpYyBvYmplY3RzXG4gIFx0XHRyID0gc3JjLmNvbnN0cnVjdG9yID8gbmV3IHNyYy5jb25zdHJ1Y3RvcigpIDoge307XG4gIFx0fVxuICBcdHJldHVybiBtaXhpbihyLCBzcmMsIGRlZXBfY2xvbmUpO1xuICB9O1xuICBcbiAgLyoqIFNwZWNpYWxpemVkIGNsb25lIGZ1bmN0aW9uIHRoYXQgb25seSBjbG9uZXMgc2NhbGFycyBhbmQgbmVzdGVkIGFycmF5cyB3aGVyZVxuICAgKiBlYWNoIGFycmF5IGVpdGhlciBjb25zaXN0cyBvZiBhbGwgYXJyYXlzIG9yIGFsbCBudW1iZXJzLiBUaGlzIGZ1bmN0aW9uXG4gICAqIGlzIG1lYW50IGFzIGEgZmFzdCB3YXkgb2YgY2xvbmluZyBwYXJhbWV0ZXIgZHJhd3Mgd2l0aGluIHRoZSBtY21jIHNhbXBsaW5nXG4gICAqIGxvb3AuXG4gICAqL1xuICB2YXIgY2xvbmVfcGFyYW1fZHJhdyA9IGZ1bmN0aW9uKHgpIHtcbiAgICBpZihBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICBpZihBcnJheS5pc0FycmF5KHhbMF0pKSB7XG4gICAgICAgIC8vIHggaXMgYW4gYXJyYXkgb2YgYXJyYXlzIHNvIHdlIG5lZWQgdG8gY2xvbmUgaXQgcmVjdXJzaXZlbHlcbiAgICAgICAgdmFyIHhfY29weSA9IFtdO1xuICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW5ndGggPSB4Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgeF9jb3B5LnB1c2goY2xvbmVfcGFyYW1fZHJhdyh4W2ldKSk7XG4gICAgICAgIH0gXG4gICAgICAgIHJldHVybiB4X2NvcHk7XG4gICAgICB9IGVsc2UgeyAvLyBXZSdsbCBhc3N1bWUgeCBpcyBhIGFycmF5cyBvZiBzY2FsYXJzXG4gICAgICAgIHJldHVybiB4LnNsaWNlKDApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIFdlJ2xsIGFzc3VtZSB4IGlzIGEgc2NhbGFyXG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyB0cnVlIGlmIG9iamVjdCBpcyBhIG51bWJlci5cbiAgICovXG4gIHZhciBpc19udW1iZXIgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09IFwibnVtYmVyXCIgfHwgKHR5cGVvZiBvYmplY3QgPT0gXCJvYmplY3RcIiAmJiBvYmplY3QuY29uc3RydWN0b3IgPT09IE51bWJlcik7XG4gIH07XG4gIFxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSAocG9zc2libHkgbXVsdGlkaW1lbnNpb25hbC9uZXN0ZWQpIGFycmF5LlxuICAgKiBAcGFyYW0gZGltIC0gQW4gYXJyYXkgZ2l2aW5nIHRoZSBkaW1lbnNpb24gb2YgdGhlIGFycmF5LiBGb3IgZXhhbXBsZSxcbiAgICogICBbNV0gd291bGQgeWllbGQgYSA1IGVsZW1lbnQgYXJyYXksIGFuZCBbMywzXSB3b3VsZCB5aWVsZCBhIDMgYnkgMyBtYXRyaXguXG4gICAqIEBwYXJhbSBpbml0IC0gQSB2YWx1ZSBvciBhIGZ1bmN0aW9uIHVzZWQgdG8gZmlsbCBpbiB0aGUgZWFjaCBlbGVtZW50IGluXG4gICAqICAgdGhlIGFycmF5LiBJZiBpdCBpcyBhIGZ1bmN0aW9uIGl0IHNob3VsZCB0YWtlIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBiZSBcbiAgICogICBldmFsdWF0ZWQgb25jZSBmb3IgZWFjaCBlbGVtZW50LCBhbmQgaXQncyByZXR1cm4gdmFsdWUgd2lsbCBiZSB1c2VkIHRvXG4gICAqICAgZmlsbCBpbiBlYWNoIGVsZW1lbnQuXG4gICAqIEBleGFtcGxlIFxuICAgKiAvLyBUaGUgZm9sbG93aW5nIHdvdWxkIHJldHVybiBbWzEsMV0sWzEsMV0sWzEsMV1dXG4gICAqIGNyZWF0ZV9hcnJheShbMiwzXSwgMSlcbiAgICovXG4gIHZhciBjcmVhdGVfYXJyYXkgPSBmdW5jdGlvbihkaW0sIGluaXQpIHtcbiAgICB2YXIgYXJyID0gbmV3IEFycmF5KGRpbVswXSk7XG4gICAgdmFyIGk7XG4gICAgaWYoZGltLmxlbmd0aCA9PSAxKSB7IC8vIEZpbGwgaXQgdXAgd2l0aCBpbml0XG4gICAgICBpZih0eXBlb2YgaW5pdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgYXJyW2ldID0gaW5pdCgpO1xuICAgICAgICB9ICBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgYXJyW2ldID0gaW5pdDtcbiAgICAgICAgfSBcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYoZGltLmxlbmd0aCA+IDEpIHtcbiAgICAgIGZvcihpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgIGFycltpXSA9IGNyZWF0ZV9hcnJheShkaW0uc2xpY2UoMSksIGluaXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBcImNyZWF0ZV9hcnJheSBjYW4ndCBjcmVhdGUgYSBkaW1lbnNpb25sZXNzIGFycmF5XCI7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG4gIH07XG4gIFxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkaW1lbnNpb25zIG9mIGEgcG9zc2libHkgbmVzdGVkIGFycmF5IGFzIGFuIGFycmF5LiBGb3IgXG4gICAqIGV4YW1wbGUsIGFycmF5X2RpbSggW1sxLCAyXSwgWzEsIDJdXSApIHNob3VsZCByZXR1cm4gWzIsIDJdXG4gICAqIEFzc3VtZXMgdGhhdCBhbGwgYXJyYXlzIGluc2lkZSBhbm90aGVyIGFycmF5IGFyZSBvZiB0aGUgc2FtZSBsZW5ndGguXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFNob3VsZCByZXR1cm4gWzQsIDIsIDFdXG4gICAqIGFycmF5X2RpbShjcmVhdGVfYXJyYXkoWzQsIDIsIDFdLCAwKSlcbiAgICovXG4gIHZhciBhcnJheV9kaW0gPSBmdW5jdGlvbihhKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhWzBdKSkge1xuICAgICAgcmV0dXJuIFthLmxlbmd0aF0uY29uY2F0KGFycmF5X2RpbShhWzBdKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbYS5sZW5ndGhdO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdHdvIGFycmF5cyBhcmUgZXF1YWwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzXG4gICAqIGFzIGp1ZGdlZCBieSB0aGUgXCI9PVwiIG9wZXJhdG9yLiBSZXR1cm5zIHRydWUgb3IgZmFsc2UuXG4gICAqIEFkYXB0ZWQgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNDg1Mzk3NC8xMDAxODQ4XG4gICAqLyBcbiAgdmFyIGFycmF5X2VxdWFsID0gZnVuY3Rpb24gKGExLCBhMikge1xuICAgICAgaWYgKGExLmxlbmd0aCAhPSBhMi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIG5lc3RlZCBhcnJheXNcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhMVtpXSkgJiYgQXJyYXkuaXNBcnJheShhMltpXSkpIHtcbiAgICAgICAgICAgICAgLy8gcmVjdXJzZSBpbnRvIHRoZSBuZXN0ZWQgYXJyYXlzXG4gICAgICAgICAgICAgIGlmICghYXJyYXlfZXF1YWwoYTFbaV0sIGEyW2ldKSkgcmV0dXJuIGZhbHNlOyAgICAgICBcbiAgICAgICAgICB9ICAgICAgICAgICBcbiAgICAgICAgICBlbHNlIGlmIChhMVtpXSAhPSBhMltpXSkgeyBcbiAgICAgICAgICAgICAgLy8gV2FybmluZyAtIHR3byBkaWZmZXJlbnQgb2JqZWN0IGluc3RhbmNlcyB3aWxsIG5ldmVyIGJlIGVxdWFsOiB7eDoyMH0gIT0ge3g6MjB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICBcbiAgICAgICAgICB9ICAgICAgICAgICBcbiAgICAgIH0gICAgICAgXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBUcmF2ZXJzZXMgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYSBhbmQgYXBwbGllcyBmdW4gdG8gYWxsIFwibGVhZiBub2Rlc1wiLCBcbiAgICogdGhhdCBpcywgdmFsdWVzIHRoYXQgYXJlIG5vdCBhcnJheXMuIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2l6ZSBhc1xuICAgKiBhLlxuICAgKi9cbiAgdmFyIG5lc3RlZF9hcnJheV9hcHBseSA9IGZ1bmN0aW9uKGEsIGZ1bikge1xuICAgIGlmKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoYS5sZW5ndGgpO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0W2ldID0gbmVzdGVkX2FycmF5X2FwcGx5KGFbaV0sIGZ1bik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZnVuKGEpO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKiBSYW5kb21pemluZyB0aGUgYXJyYXkgZWxlbWVudCBvcmRlciBpbi1wbGFjZS4gVXNpbmcgRHVyc3RlbmZlbGRcbiAgICogc2h1ZmZsZSBhbGdvcml0aG0uIEFkYXB0ZWQgZnJvbSBoZXJlOiBcbiAgICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTI2NDY4NjQvMTAwMTg0OFxuICAgKi9cbiAgZnVuY3Rpb24gc2h1ZmZsZV9hcnJheShhcnJheSkge1xuICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICB2YXIgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgICAgIHZhciB0ZW1wID0gYXJyYXlbaV07XG4gICAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgICAgICAgICBhcnJheVtqXSA9IHRlbXA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEb2VzIHRoZSBzYW1lIHRoaW5nIGFzIG5lc3RlZF9hcnJheV9hcHBseSwgdGhhdCBpcywgdHJhdmVyc2VzIGEgcG9zc2libHlcbiAgICogbmVzdGVkIGFycmF5IGEgYW5kIGFwcGxpZXMgZnVuIHRvIGFsbCBcImxlYWYgbm9kZXNcIiBhbmQgcmV0dXJucyBhbiBhcnJheSBcbiAgICogb2YgdGhlIHNhbWUgc2l6ZSBhcyBhLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG5lc3RlZF9hcnJheV9yYW5kb21fYXBwbHlcbiAgICogYnJhbmNoZXMgcmFuZG9tbHkuXG4gICAqL1xuICB2YXIgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSA9IGZ1bmN0aW9uKGEsIGZ1bikge1xuICAgIGlmKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIHZhciBsZW4gPSBhLmxlbmd0aDtcbiAgICAgIHZhciBpO1xuICAgICAgdmFyIGFycmF5X2lzID0gW107XG4gICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBhcnJheV9pc1tpXSA9IGk7XG4gICAgICB9XG4gICAgICBzaHVmZmxlX2FycmF5KGFycmF5X2lzKTtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIFxuICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGFycmF5X2kgPSBhcnJheV9pc1tpXTtcbiAgICAgICAgcmVzdWx0W2FycmF5X2ldID0gbmVzdGVkX2FycmF5X2FwcGx5KGFbYXJyYXlfaV0sIGZ1bik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZnVuKGEpO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBBbGxvd3MgYSBwcmV0dHkgd2F5IG9mIHNldHRpbmcgZGVmYXVsdCBvcHRpb25zIHdoZXJlIHRoZSBkZWZ1bHRzIGNhbiBiZVxuICAgKiBvdmVycmlkZGVuIGJ5IGFuIG9wdGlvbnMgb2JqZWN0LlxuICAgKiAgQHBhcmFtIG9wdGlvbl9uYW1lIC0gdGhlIG5hbWUgb2YgdGhlIG9wdGlvbiBhcyBhIHN0cmluZ1xuICAgKiAgQHBhcmFtIG15X29wdGlvbnMgLSBhbiBvcHRpb24gb2JqZWN0IHRoYXQgY291bGQgaGF2ZSBvcHRpb25fbmFtZSBcbiAgICogICAgYXMgYSBtZW1iZXIuXG4gICAqIEBwYXJhbSBkZWZhdWxfdmFsdWUgLSBkZWZ1bHQgdmFsdWUgdGhhdCBpcyByZXR1cm5lZCBpZiBvcHRpb25fbmFtZSBcbiAgICogICBpcyBub3QgZGVmaW5lZCBpbiBteV9vcHRpb25zLlxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgbXlfb3B0aW9ucyA9IHtwaTogMy4xNDE1OX1cbiAgICogdmFyIHBpID0gZ2V0X29wdGlvbihcInBpXCIsIG15X29wdGlvbnMsIDMuMTQpXG4gICAqL1xuICAvLyBQcmV0dHkgd2F5IG9mIHNldHRpbmcgZGVmYXVsdCBvcHRpb25zIHdoZXJlIHRoZSBkZWZhdWx0cyBjYW4gYmUgb3ZlcnJpZGRlblxuICAvLyBieSBhbiBvcHRpb25zIG9iamVjdC4gRm9yIGV4YW1wbGU6XG4gIC8vIHZhciBwaSA9IGdldF9vcHRpb24oXCJwaVwiLCBteV9vcHRpb25zLCAzLjE0KVxuICB2YXIgZ2V0X29wdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkZWZhdWxfdmFsdWUpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShvcHRpb25fbmFtZSkgJiYgXG4gICAgICAgICAgIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSB1bmRlZmluZWQgICYmIFxuICAgICAgICAgICBvcHRpb25zW29wdGlvbl9uYW1lXSAhPT0gbnVsbCA/IG9wdGlvbnNbb3B0aW9uX25hbWVdIDogZGVmYXVsX3ZhbHVlO1xuICB9O1xuICBcbiAgLyoqIFZlcnNpb24gb2YgZ2V0X29wdGlvbiB3aGVyZSB0aGUgb3B0aW9uIHNob3VsZCBiZSBhIG9uZSBvciBtdWx0aS1kaW1lbnNpb25hbFxuICAgKiBhcnJheSBhbmQgd2hlcmUgdGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gZWl0aGVyIGJ5IGEgc2NhbGFyIG9yIGJ5IGFuIGFycmF5LlxuICAgKiBJZiBpdCdzIGEgc2NhbGFyIHRoZSB0aGF0IHNjYWxhciBpcyB1c2VkIHRvIGluaXRpYWxpemUgYW4gYXJyYXkgd2l0aCBcbiAgICogZGltIGRpbWVuc2lvbnMuXG4gICAqIFxuICAgKi9cbiAgdmFyIGdldF9tdWx0aWRpbV9vcHRpb24gPSBmdW5jdGlvbihvcHRpb25fbmFtZSwgb3B0aW9ucywgZGltLCBkZWZhdWxfdmFsdWUpIHtcbiAgICB2YXIgdmFsdWUgPSBnZXRfb3B0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkZWZhdWxfdmFsdWUpO1xuICAgICBpZighIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgdmFsdWUgPSBjcmVhdGVfYXJyYXkoZGltLCB2YWx1ZSk7XG4gICAgIH0gXG4gICAgIGlmKCEgYXJyYXlfZXF1YWwoIGFycmF5X2RpbSh2YWx1ZSksIGRpbSkpIHtcbiAgICAgICB0aHJvdyBcIlRoZSBvcHRpb24gXCIgKyBvcHRpb25fbmFtZSArIFwiIGlzIG9mIGRpbWVuc2lvbiBbXCIgKyBcbiAgICAgICAgICAgICBhcnJheV9kaW0odmFsdWUpICsgXCJdIGJ1dCBzaG91bGQgYmUgW1wiICsgZGltICsgXCJdLlwiO1xuICAgIH1cbiAgICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuICBcbiAgLy8vLy8vLy8vLyBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHBhcmFtZXRlciBvYmplY3RzIC8vLy8vLy8vLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZml4ZWQgKHNhbWUgZXZlcnkgdGltZSkgbnVtYmVyIHRoYXQgY291bGQgYmUgdXNlZCB0byBpbml0aWFsaXplXG4gICAqIGEgcGFyYW1ldGVyIG9mIGEgY2VydGFpbiB0eXBlLCBwb3NzaWJseSB3aXRoIGxvd2VyIGFuZCB1cHBlciBib3VuZHMuXG4gICAqIFRoZSBwb3NzaWxlIHR5cGVzIGFyZSBcInJlYWxcIiwgXCJpbnRcIiwgYW5kIFwiYmluYXJ5XCIuXG4gICAqL1xuICB2YXIgcGFyYW1faW5pdF9maXhlZCA9IGZ1bmN0aW9uKHR5cGUsIGxvd2VyLCB1cHBlcikge1xuICAgIGlmKGxvd2VyID4gdXBwZXIpIHtcbiAgICAgIHRocm93IFwiQ2FuIG5vdCBpbml0aWFsaXplIHBhcmFtZXRlciB3aGVyZSBsb3dlciBib3VuZCA+IHVwcGVyIGJvdW5kXCI7XG4gICAgfVxuICAgIGlmKHR5cGUgPT09IFwicmVhbFwiKSB7XG4gICAgICBpZihsb3dlciA9PT0gLUluZmluaXR5ICYmIHVwcGVyID09PSBJbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gMC41O1xuICAgICAgfSBlbHNlIGlmKGxvd2VyID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIHVwcGVyIC0gMC41O1xuICAgICAgfSBlbHNlIGlmKHVwcGVyID09PSBJbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gbG93ZXIgKyAwLjU7XG4gICAgICB9IGVsc2UgaWYobG93ZXIgPD0gdXBwZXIpIHtcbiAgICAgICAgcmV0dXJuIChsb3dlciArIHVwcGVyKSAvIDI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKHR5cGUgPT09IFwiaW50XCIpIHtcbiAgICAgIGlmKGxvd2VyID09PSAtSW5maW5pdHkgJiYgdXBwZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfSBlbHNlIGlmKGxvd2VyID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIHVwcGVyIC0gMTtcbiAgICAgIH0gZWxzZSBpZih1cHBlciA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIGxvd2VyICsgMTtcbiAgICAgIH0gZWxzZSBpZihsb3dlciA8PSB1cHBlcil7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKChsb3dlciArIHVwcGVyKSAvIDIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZih0eXBlID09PSBcImJpbmFyeVwiKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgdGhyb3cgXCJDb3VsZCBub3QgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIgb2YgdHlwZSBcIiArIHR5cGUgKyBcIltcIiArIGxvd2VyICsgXCIsIFwiICsgdXBwZXIgKyBcIl1cIjtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBDb21wbGV0ZXMgcGFyYW1zX3RvX2NvbXBsZXRlLCBhbiBvYmplY3QgY29udGFpbmluZyBwYXJhbWV0ZXIgZGVzY3JpcHRpb25zLCBcbiAgICogYW5kIGluaXRpYWxpemVzIG5vbi1pbml0aWFsaXplZCBwYXJhbWV0ZXJzLiBUaGlzIG1vZGlmaWVkIHZlcnNpb24gb2ZcbiAgICogcGFyYW1zX3RvX2NvbXBsZXRlIGlzIHJldHVybmVkIGFzIGEgZGVlcCBjb3B5IGFuZCBub3QgbW9kaWZpZWQgaW4gcGxhY2UuXG4gICAqIEluaXRpYWxpemF0aW9uIGlzIGRvbmUgYnkgc3VwcGx5aW5nIGEgcGFyYW1faW5pdCBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZVxuICAgKiBmdW5jdGlvbih0eXBlLCBsb3dlciwgdXBwZXIpIHRoYXQgc2hvdWxkIHJldHVybiBhIHNpbmdsZSBudW1iZXIgXG4gICAqIChsaWtlIHBhcmFtX2luaXRfZml4ZWQsIGZvciBleGFtcGxlKS5cbiAgICogQGV4YW1wbGVcbiAgICogdmFyIHBhcmFtcyA9IHsgXCJtdVwiOiB7XCJ0eXBlXCI6IFwicmVhbFwifSB9XG4gICAqIHBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyhwYXJhbXMpO1xuICAgKiAvLyBwYXJhbXMgc2hvdWxkIG5vdyBiZTpcbiAgICogLy8gIHtcIm11XCI6IHsgXCJ0eXBlXCI6IFwicmVhbFwiLCBcImRpbVwiOiBbMV0sIFwidXBwZXJcIjogSW5maW5pdHksXG4gICAqIC8vICAgICAgICAgICBcImxvd2VyXCI6IC1JbmZpbml0eSwgXCJpbml0XCI6IDAuNSB9fVxuICAgKi8gXG4gIHZhciBjb21wbGV0ZV9wYXJhbXMgID0gZnVuY3Rpb24ocGFyYW1zX3RvX2NvbXBsZXRlLCBwYXJhbV9pbml0KSB7XG4gICAgdmFyIHBhcmFtcyA9IGRlZXBfY2xvbmUocGFyYW1zX3RvX2NvbXBsZXRlKTtcbiAgICBmb3IgKHZhciBwYXJhbV9uYW1lIGluIHBhcmFtcykgeyBpZiAoIXBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbV9uYW1lKSkgY29udGludWU7XG4gICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbcGFyYW1fbmFtZV07XG4gICAgICBpZiggIXBhcmFtLmhhc093blByb3BlcnR5KFwidHlwZVwiKSkge1xuICAgICAgICBwYXJhbS50eXBlID0gXCJyZWFsXCI7XG4gICAgICB9XG4gICAgICBpZighcGFyYW0uaGFzT3duUHJvcGVydHkoXCJkaW1cIikpIHtcbiAgICAgICAgcGFyYW0uZGltID0gWzFdO1xuICAgICAgfVxuICAgICAgaWYoaXNfbnVtYmVyKHBhcmFtLmRpbSkpIHtcbiAgICAgICAgcGFyYW0uZGltID0gW3BhcmFtLmRpbV07XG4gICAgICB9XG4gICAgICBpZihwYXJhbS50eXBlID09IFwiYmluYXJ5XCIpIHtcbiAgICAgICAgcGFyYW0udXBwZXIgPSAxO1xuICAgICAgICBwYXJhbS5sb3dlciA9IDA7XG4gICAgICB9XG4gICAgICBpZighcGFyYW0uaGFzT3duUHJvcGVydHkoXCJ1cHBlclwiKSkge1xuICAgICAgICBwYXJhbS51cHBlciA9IEluZmluaXR5O1xuICAgICAgfVxuICAgICAgaWYoIXBhcmFtLmhhc093blByb3BlcnR5KFwibG93ZXJcIikpIHtcbiAgICAgICAgcGFyYW0ubG93ZXIgPSAtSW5maW5pdHk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmKHBhcmFtLmhhc093blByb3BlcnR5KFwiaW5pdFwiKSkge1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGp1c3QgYSBudW1iZXIgb3IgYSBuZXN0ZWQgYXJyYXkgd2UgbGVhdmUgaXQgYWxvbmUsIGJ1dCBpZi4uLlxuICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgdHlwZW9mIHBhcmFtLmluaXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIHBhcmFtLmluaXQgaXMgYSBmdW5jdGlvbiwgdXNlIHRoYXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFyYW1ldGVyLlxuICAgICAgICAgIHBhcmFtLmluaXQgPSBwYXJhbS5pbml0KCk7XG4gICAgICAgIH0gZWxzZSBpZighYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pICYmICFBcnJheS5pc0FycmF5KHBhcmFtLmluaXQpKSB7XG4gICAgICAgIC8vIFdlIGhhdmUgYSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlciB3aGVyZSB0aGUgcGFyYW0uaW5pdCBleGlzdCBidXRcbiAgICAgICAgLy8gaXMgbm90IGFuIGFycmF5LiBUaGVuIGFzc3VtZSBpdCBpcyBhIG51bWJlciBvciBhIGZ1bmN0aW9uIGFuZCB1c2VcbiAgICAgICAgLy8gaXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFyYW1ldGVyLlxuICAgICAgICBwYXJhbS5pbml0ID0gY3JlYXRlX2FycmF5KHBhcmFtLmRpbSwgcGFyYW0uaW5pdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7IC8vIFdlIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi5cbiAgICAgICAgaWYoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7XG4gICAgICAgICAgcGFyYW0uaW5pdCA9IHBhcmFtX2luaXQocGFyYW0udHlwZSwgcGFyYW0ubG93ZXIsIHBhcmFtLnVwcGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJhbS5pbml0ID0gY3JlYXRlX2FycmF5KHBhcmFtLmRpbSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH07XG4gIFxuICBcbiAgLy8vLy8vLy8vLyBTdGVwcGVyIEZ1bmN0aW9ucyAvLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIFxuICBcbiAgLyoqXG4gICAqIEBpbnRlcmZhY2VcbiAgICogQSBTdGVwcGVyIGlzIGFuIG9iamVjdCByZXNwb25zaWJsZSBmb3IgcHVzaGluZyBhcm91bmQgb25lXG4gICAqIG9yIG1vcmUgcGFyYW1ldGVyIHZhbHVlcyBpbiBhIHN0YXRlIGFjY29yZGluZyB0byB0aGUgZGlzdHJpYnV0aW9uXG4gICAqIGRlZmluZWQgYnkgdGhlIGxvZyBwb3N0ZXJpb3IuIFRoaXMgZGVmaW5lcyB0aGUgU3RlcHBlciBcImludGVyZmFjZVwiLFxuICAgKiB3aGVyZSBcImludGVyZmFjZVwiIG1lYW5zIHRoYXQgU3RlcHBlciBkZWZpbmVzIGEgY2xhc3MgdGhhdCBpcyBuZXZlclxuICAgKiBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBqdXN0IHRvIGJlIHN1YmNsYXNzZWQgYnkgc3BlY2lhbGl6ZWRcbiAgICogc3RlcHBlciBmdW5jdGlvbnMuXG4gICAqIEBpbnRlcmZhY2VcbiAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6XG4gICAqICAge1wibXVcIjogeyBcInR5cGVcIjogXCJyZWFsXCIsIFwiZGltXCI6IFsxXSwgXCJ1cHBlclwiOiBJbmZpbml0eSwgXG4gICAqICAgXCJsb3dlclwiOiAtSW5maW5pdHksIFwiaW5pdFwiOiAwLjUgfX1cbiAgICogICBUaGUgcGFyYW1ldGVyIGRlZmluaXRpb25zIGFyZSBleHBlY3RlZCB0byBiZSBcImNvbXBsZXRlXCIsIHRoYXQgaXMsXG4gICAqICAgc3BlY2lmeWluZyBhbGwgcmVsZXZhbnQgYXR0cmlidXRlcyBzdWNoIGFzIGRpbSwgbG93ZXIgYW5kIHVwcGVyLlxuICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMgaW4gcGFyYW1zXG4gICAqICAgKGFuZCBwb3NzaWJseSBtb3JlKS4gVGhlIHBhcmFtZXRlciBuYW1lcyBhcmUgZ2l2ZW4gYXMga2V5cyBhbmQgdGhlIHN0YXRlc1xuICAgKiAgIGFzIHNjYWxhcnMgb3IsIHBvc3NpYmx5IG5lc3RlZCwgYXJyYXlzLiBGb3IgZXhhbXBsZTpcbiAgICogICB7bXU6IDEwLCBzaWdtYTogNSwgYmV0YTogWzEsIDIuNV19XG4gICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gKnRha2luZyBubyBwYXJhbWV0ZXJzKiB0aGF0IHJldHVybnMgdGhlXG4gICAqICAgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gVGhhdCBpcywgdGhlIHZhbHVlIG9mIGxvZ19wb3N0XG4gICAqICAgc2hvdWxkIGNoYW5nZSBpZiB0aGUgdGhlIHZhbHVlcyBpbiBzdGF0ZSBhcmUgY2hhbmdlZC5cbiAgXG4gICAqL1xuICB2YXIgU3RlcHBlciA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KSB7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMubG9nX3Bvc3QgPSBsb2dfcG9zdDtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBUYWtlcyBhIHN0ZXAgaW4gdGhlIHBhcmFtZXRlciBzcGFjZS4gU2hvdWxkIHJldHVybiB0aGUgbmV3IHN0YXRlLFxuICAgKiBidXQgaXMgbWFpbmx5IGNhbGxlZCBmb3IgaXQncyBzaWRlIGVmZmVjdCBvZiBtYWtpbmcgYSBjaGFuZ2UgaW4gdGhlXG4gICAqIHN0YXRlIG9iamVjdC5cbiAgICovXG4gIFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyBcIkV2ZXJ5IFN0ZXBwZXIgbmVlZCB0byBpbXBsZW1lbnQgc3RlcCgpXCI7XG4gIH07XG4gIFxuICAvKipcbiAgICogSWYgaW1wbGVtZW50ZWQsIG1ha2VzIHRoZSBzdGVwcGVyIGFkYXB0IHdoaWxlIHN0ZXBwaW5nLlxuICAgKi8gXG4gIFN0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICAvLyBPcHRpb25hbCwgc29tZSBzdGVwcGVycyBtaWdodCBub3QgYmUgYWRhcHRpdmUuICovIFxuICB9O1xuICBcbiAgLyoqXG4gICAqIElmIGltcGxlbWVudGVkLCBtYWtlcyB0aGUgc3RlcHBlciBjZWFzZSBhZGFwdGluZyB3aGlsZSBzdGVwcGluZy5cbiAgICovIFxuICBTdGVwcGVyLnByb3RvdHlwZS5zdG9wX2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICAvLyBPcHRpb25hbCwgc29tZSBzdGVwcGVycyBtaWdodCBub3QgYmUgYWRhcHRpdmUuICovIFxuICB9O1xuICBcbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5nIGluZm8gcmVnYXJkaW5nIHRoZSBzdGVwcGVyLlxuICAgKi8gXG4gIFN0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbigpIHtcbiAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGluZm8gYWJvdXQgdGhlIHN0YXRlIG9mIHRoZSBzdGVwcGVyLlxuICAgIHJldHVybiB7fTtcbiAgfTtcbiAgXG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfVxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgbWV0cm9wb2xpcyBzdGVwIGluXG4gICAqIHRoZSBBZGFwdGl2ZSBNZXRyb3BvbGlzLVdpdGhpbi1HaWJicyBhbGdvcml0aG0gaW4gXCJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DXCJcbiAgICogYnkgUm9iZXJ0cyBhbmQgUm9zZW50aGFsICgyMDA4KS5cbiAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uLlxuICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLlxuICAgKiBAcGFyYW0gZ2VuZXJhdGVfcHJvcG9zYWwgLSBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHByb3Bvc2FsIChhcyBhIG51bWJlcilcbiAgICogd2l0aCBzaWduYXR1cmUgZnVuY3Rpb24ocGFyYW1fc3RhdGUsIGxvZ19zY2FsZSkgd2hlcmUgcGFyYW1fc3RhdGUgaXMgYVxuICAgKiBudW1iZXIgYW5kIGxvZ19zY2FsZSBkZWZpbmVzIHRoZSBzY2FsZSBvZiB0aGUgcHJvcG9zYWwgc29tZWhvdy5cbiAgKi9cbiAgdmFyIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGdlbmVyYXRlX3Byb3Bvc2FsKSB7XG4gICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTtcbiAgICBcbiAgICB2YXIgcGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7XG4gICAgaWYocGFyYW1fbmFtZXMubGVuZ3RoICAhPSAxKSB7XG4gICAgICB0aHJvdyBcIk9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIGNhbiBvbmx5IGhhbmRsZSBvbmUgcGFyYW1ldGVyLlwiO1xuICAgIH1cbiAgICB0aGlzLnBhcmFtX25hbWUgPSBwYXJhbV9uYW1lc1swXTtcbiAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdO1xuICAgIGlmKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgIHRocm93IFwiT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgY2FuIG9ubHkgaGFuZGxlIG9uZSBvbmUtZGltZW5zaW9uYWwgcGFyYW1ldGVyLlwiO1xuICAgIH1cbiAgICB0aGlzLmxvd2VyID0gcGFyYW0ubG93ZXI7XG4gICAgdGhpcy51cHBlciA9IHBhcmFtLnVwcGVyO1xuICAgIFxuICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgICAgID0gZ2V0X29wdGlvbihcInByb3BfbG9nX3NjYWxlXCIsIG9wdGlvbnMsIDApO1xuICAgIHRoaXMuYmF0Y2hfc2l6ZSAgICAgICAgID0gZ2V0X29wdGlvbihcImJhdGNoX3NpemVcIiwgb3B0aW9ucywgNTApO1xuICAgIHRoaXMubWF4X2FkYXB0YXRpb24gICAgID0gZ2V0X29wdGlvbihcIm1heF9hZGFwdGF0aW9uXCIsIG9wdGlvbnMsIDAuMzMpO1xuICAgIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uID0gZ2V0X29wdGlvbihcImluaXRpYWxfYWRhcHRhdGlvblwiLCBvcHRpb25zLCAxLjApO1xuICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X29wdGlvbihcInRhcmdldF9hY2NlcHRfcmF0ZVwiLCBvcHRpb25zLCAwLjQ0KTtcbiAgICB0aGlzLmlzX2FkYXB0aW5nICAgICAgICA9IGdldF9vcHRpb24oXCJpc19hZGFwdGluZ1wiLCBvcHRpb25zLCB0cnVlKTtcbiAgICBcbiAgICB0aGlzLmdlbmVyYXRlX3Byb3Bvc2FsID0gZ2VuZXJhdGVfcHJvcG9zYWw7XG4gICAgXG4gICAgdGhpcy5hY2NlcHRhbmNlX2NvdW50ID0gMDtcbiAgICB0aGlzLmJhdGNoX2NvdW50ID0gMDtcbiAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24gPSAwOyAgXG4gIH07XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyO1xuICBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwYXJhbV9zdGF0ZSA9IHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXTtcbiAgICAgIHZhciBwYXJhbV9wcm9wb3NhbCA9IHRoaXMuZ2VuZXJhdGVfcHJvcG9zYWwocGFyYW1fc3RhdGUsIHRoaXMucHJvcF9sb2dfc2NhbGUpO1xuICAgICAgaWYocGFyYW1fcHJvcG9zYWwgPCB0aGlzLmxvd2VyIHx8IHBhcmFtX3Byb3Bvc2FsID4gdGhpcy51cHBlcikge1xuICAgICAgICAvLyBPdXRzaWRlIG9mIGxpbWl0cyBvZiB0aGUgcGFyYW1ldGVyLCByZWplY3QgdGhlIHByb3Bvc2FsIFxuICAgICAgICAvLyBhbmQgc3RheSBhdCB0aGUgY3VycmVudCBzdGF0ZS5cbiAgICAgIH0gZWxzZSB7IC8vIG1ha2UgYSBNZXRyb3BvbGlzIHN0ZXBcbiAgICAgICAgdmFyIGN1cnJfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7XG4gICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3Byb3Bvc2FsO1xuICAgICAgICB2YXIgcHJvcF9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICAgICAgdmFyIGFjY2VwdF9wcm9iID0gTWF0aC5leHAocHJvcF9sb2dfZGVucyAtIGN1cnJfbG9nX2RlbnMpO1xuICAgICAgICBpZihhY2NlcHRfcHJvYiA+IE1hdGgucmFuZG9tKCkpIHtcbiAgICAgICAgICAvLyBXZSBkbyBub3RoaW5nIGFzIHRoZSBzdGF0ZSBvZiBwYXJhbSBoYXMgYWxyZWFkeSBiZWVuIGNoYW5nZWQgdG8gdGhlIHByb3Bvc2FsXG4gICAgICAgICAgaWYodGhpcy5pc19hZGFwdGluZykgdGhpcy5hY2NlcHRhbmNlX2NvdW50KysgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHJldmVydCBzdGF0ZSBiYWNrIHRvIHRoZSBvbGQgc3RhdGUgb2YgcGFyYW1cbiAgICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSBwYXJhbV9zdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYodGhpcy5pc19hZGFwdGluZykge1xuICAgICAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24gKys7XG4gICAgICAgIGlmKHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA+PSB0aGlzLmJhdGNoX3NpemUpIHsgLy8gdGhlbiBhZGFwdFxuICAgICAgICAgIHRoaXMuYmF0Y2hfY291bnQgKys7XG4gICAgICAgICAgdmFyIGxvZ19zZF9hZGp1c3RtZW50ID0gXG4gICAgICAgICAgICBNYXRoLm1pbih0aGlzLm1heF9hZGFwdGF0aW9uLCBcbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uIC8gTWF0aC5zcXJ0KHRoaXMuYmF0Y2hfY291bnQpKTtcbiAgICAgICAgICBpZih0aGlzLmFjY2VwdGFuY2VfY291bnQgLyB0aGlzLmJhdGNoX3NpemUgPiB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSArPSBsb2dfc2RfYWRqdXN0bWVudDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSAtPSBsb2dfc2RfYWRqdXN0bWVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hY2NlcHRhbmNlX2NvdW50ID0gMDtcbiAgICAgICAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdO1xuICB9O1xuICBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlzX2FkYXB0aW5nID0gdHJ1ZTtcbiAgfTtcbiAgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdG9wX2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlzX2FkYXB0aW5nID0gZmFsc2U7XG4gIH07XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwcm9wX2xvZ19zY2FsZTogdGhpcy5wcm9wX2xvZ19zY2FsZSxcbiAgICAgIGlzX2FkYXB0aW5nOiB0aGlzLmlzX2FkYXB0aW5nLFxuICAgICAgYWNjZXB0YW5jZV9jb3VudDogdGhpcy5hY2NlcHRhbmNlX2NvdW50LFxuICAgICAgaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbjogdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uLFxuICAgICAgYmF0Y2hfY291bnQ6IHRoaXMuYmF0Y2hfY291bnRcbiAgICB9O1xuICB9O1xuICBcbiAgXG4gIC8qKlxuICAgKiBGdW5jdGlvbiByZXR1cm5pbmcgYSBOb3JtYWwgcHJvcG9zYWwuXG4gICAqL1xuICB2YXIgbm9ybWFsX3Byb3Bvc2FsID0gZnVuY3Rpb24ocGFyYW1fc3RhdGUsIHByb3BfbG9nX3NjYWxlKSB7XG4gICAgcmV0dXJuIHJub3JtKHBhcmFtX3N0YXRlICwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGF1Z21lbnRzIHtPbmVkaW1NZXRyb3BvbGlzU3RlcHBlcn1cbiAgICogQSBcInN1YmNsYXNzXCIgb2YgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGNvbnRpbm91cyBOb3JtYWwgcHJvcG9zYWxzLlxuICAgKi9cbiAgdmFyIFJlYWxNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7XG4gICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgbm9ybWFsX3Byb3Bvc2FsKTtcbiAgfTtcbiAgXG4gIFJlYWxNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVhbE1ldHJvcG9saXNTdGVwcGVyO1xuICBcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbC5cbiAgICovXG4gIHZhciBkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwgPSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChybm9ybShwYXJhbV9zdGF0ZSAsIE1hdGguZXhwKHByb3BfbG9nX3NjYWxlKSkpO1xuICB9O1xuICBcbiAgICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBhdWdtZW50cyB7T25lZGltTWV0cm9wb2xpc1N0ZXBwZXJ9XG4gICAqIEEgXCJzdWJjbGFzc1wiIG9mIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLlxuICAgKi9cbiAgdmFyIEludE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwpO1xuICB9O1xuICBcbiAgSW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgSW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50TWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn1cbiAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIG1ldHJvcG9saXMgc3RlcCBpblxuICAgKiB0aGUgQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluIFwiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQ1wiXG4gICAqIGJ5IFJvYmVydHMgYW5kIFJvc2VudGhhbCAoMjAwOCkgZm9yIHBvc3NpYmx5IG11bHRpZGltZW5zaW9uYWwgYXJyYXlzLiBUaGF0XG4gICAqIGlzLCBpbnN0ZWFkIG9mIGp1c3QgdGFraW5nIGEgc3RlcCBmb3IgYSBvbmUtZGltZW5zaW9uYWwgcGFyYW1ldGVyIGxpa2UgXG4gICAqIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLCB0aGlzIFN0ZXBwZXIgaXMgcmVzcG9uc2libGUgZm9yIHRha2luZyBzdGVwcyBcbiAgICogZm9yIGEgbXVsdGlkaW1lbnNpb25hbCBhcnJheS4gSXQncyBzdGlsbCBwcmV0dHkgZHVtYiBhbmQganVzdCB0YWtlc1xuICAgKiBvbmUtZGltZW5zaW9uYWwgc3RlcHMgZm9yIGVhY2ggcGFyYW1ldGVyIGNvbXBvbmVudCwgdGhvdWdoLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZm9yIGEgXG4gICAqICAgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICAqIEBwYXJhbSBTdWJTdGVwcGVyIC0gYSBjb25zdHJ1Y3RvciBmb3IgdGhlIHR5cGUgb2Ygb25lIGRpbWVuc2lvbmFsIFN0ZXBwZXIgdG8gYXBwbHkgb25cbiAgICogICBhbGwgdGhlIGNvbXBvbmVudHMgb2YgdGhlIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyLlxuICAqL1xuICB2YXIgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBTdWJTdGVwcGVyKSB7XG4gICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTtcbiAgICBcbiAgICB2YXIgcGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7XG4gICAgaWYocGFyYW1fbmFtZXMubGVuZ3RoICAhPSAxKSB7XG4gICAgICB0aHJvdyBcIk11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLlwiO1xuICAgIH1cbiAgICB0aGlzLnBhcmFtX25hbWUgPSBwYXJhbV9uYW1lc1swXTtcbiAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdO1xuICAgIHRoaXMubG93ZXIgPSBwYXJhbS5sb3dlcjtcbiAgICB0aGlzLnVwcGVyID0gcGFyYW0udXBwZXI7XG4gICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07XG4gIFxuICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgICAgID0gZ2V0X211bHRpZGltX29wdGlvbihcInByb3BfbG9nX3NjYWxlXCIsIG9wdGlvbnMsIHRoaXMuZGltLCAwKTtcbiAgICB0aGlzLmJhdGNoX3NpemUgICAgICAgICA9IGdldF9tdWx0aWRpbV9vcHRpb24oXCJiYXRjaF9zaXplXCIsIG9wdGlvbnMsIHRoaXMuZGltLCA1MCk7XG4gICAgdGhpcy5tYXhfYWRhcHRhdGlvbiAgICAgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwibWF4X2FkYXB0YXRpb25cIiwgb3B0aW9ucywgdGhpcy5kaW0sIDAuMzMpO1xuICAgIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uID0gZ2V0X211bHRpZGltX29wdGlvbihcImluaXRpYWxfYWRhcHRhdGlvblwiLCBvcHRpb25zLCB0aGlzLmRpbSwgMS4wKTtcbiAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oXCJ0YXJnZXRfYWNjZXB0X3JhdGVcIiwgb3B0aW9ucywgdGhpcy5kaW0sIDAuNDQpO1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgICAgICAgID0gZ2V0X211bHRpZGltX29wdGlvbihcImlzX2FkYXB0aW5nXCIsIG9wdGlvbnMsIHRoaXMuZGltLCB0cnVlKTtcbiAgICBcbiAgICAvLyBUaGlzIGhhY2sgYmVsb3cgaXMgYSByZWN1cnNpdmUgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFycmF5IG9mIFxuICAgIC8vIG9uZSBkaW1lbnNpb25hbCBzdGVwcGVycyBhY2NvcmRpbmcgdG8gZGltLlxuICAgIHZhciBjcmVhdGVfc3Vic3RlcHBlcnMgPSBcbiAgICAgIGZ1bmN0aW9uKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0LCBwcm9wX2xvZ19zY2FsZSwgYmF0Y2hfc2l6ZSwgbWF4X2FkYXB0YXRpb24sIGluaXRpYWxfYWRhcHRhdGlvbiwgdGFyZ2V0X2FjY2VwdF9yYXRlLCBpc19hZGFwdGluZykge1xuICAgICAgdmFyIHN1YnN0ZXBwZXJzID0gW107XG4gICAgICBpZihkaW0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBkaW1bMF07IGkrKykge1xuICAgICAgICAgIHZhciBzdWJvcHRpb25zID0ge3Byb3BfbG9nX3NjYWxlOiBwcm9wX2xvZ19zY2FsZVtpXSwgYmF0Y2hfc2l6ZTogYmF0Y2hfc2l6ZVtpXSxcbiAgICAgICAgICAgIG1heF9hZGFwdGF0aW9uOiBtYXhfYWRhcHRhdGlvbltpXSwgaW5pdGlhbF9hZGFwdGF0aW9uOiBpbml0aWFsX2FkYXB0YXRpb25baV0sXG4gICAgICAgICAgICB0YXJnZXRfYWNjZXB0X3JhdGU6IHRhcmdldF9hY2NlcHRfcmF0ZVtpXSwgaXNfYWRhcHRpbmc6IGlzX2FkYXB0aW5nW2ldfTtcbiAgICAgICAgICAgIHZhciBzdWJwYXJhbSA9IHt9O1xuICAgICAgICAgICAgc3VicGFyYW1baV0gPSBkZWVwX2Nsb25lKHBhcmFtKTtcbiAgICAgICAgICAgIHN1YnBhcmFtW2ldLmRpbSA9IFsxXTsgLy8gQXMgdGhpcyBzaG91bGQgbm93IGJlIGEgb25lLWRpbSBwYXJhbWV0ZXJcbiAgICAgICAgICAgIGRlbGV0ZSBzdWJwYXJhbVtpXS5pbml0OyAvLyBBcyBpdCBzb3VsZCBub3QgYmUgbmVlZGVkXG4gICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBuZXcgU3ViU3RlcHBlcihzdWJwYXJhbSwgc3Vic3RhdGUsIGxvZ19wb3N0LCBzdWJvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QsIHByb3BfbG9nX3NjYWxlW2ldLCBcbiAgICAgICAgICAgIGJhdGNoX3NpemVbaV0sIG1heF9hZGFwdGF0aW9uW2ldLCBpbml0aWFsX2FkYXB0YXRpb25baV0sIHRhcmdldF9hY2NlcHRfcmF0ZVtpXSwgaXNfYWRhcHRpbmdbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Vic3RlcHBlcnM7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnN1YnN0ZXBwZXJzID0gY3JlYXRlX3N1YnN0ZXBwZXJzKHRoaXMuZGltLCB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0sIHRoaXMubG9nX3Bvc3QsXG4gICAgICB0aGlzLnByb3BfbG9nX3NjYWxlLCB0aGlzLmJhdGNoX3NpemUsIHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uLFxuICAgICAgdGhpcy50YXJnZXRfYWNjZXB0X3JhdGUsIHRoaXMuaXNfYWRhcHRpbmcpO1xuICAgIFxuICB9O1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS5cbiAgICByZXR1cm4gbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7cmV0dXJuIHN1YnN0ZXBwZXIuc3RlcCgpOyB9KTtcbiAgfTtcbiAgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBuZXN0ZWRfYXJyYXlfYXBwbHkodGhpcy5zdWJzdGVwcGVycywgZnVuY3Rpb24oc3Vic3RlcHBlcikge3N1YnN0ZXBwZXIuc3RhcnRfYWRhcHRhdGlvbigpOyB9KTtcbiAgfTtcbiAgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7c3Vic3RlcHBlci5zdG9wX2FkYXB0YXRpb24oKTsgfSk7XG4gIH07XG4gIFxuICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7XG4gICAgICByZXR1cm4gc3Vic3RlcHBlci5pbmZvKCk7IFxuICAgIH0pO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9XG4gICAqIEEgXCJzdWJjbGFzc1wiIG9mIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGNvbnRpbm91cyBOb3JtYWwgcHJvcG9zYWxzLlxuICAgKi9cbiAgdmFyIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFJlYWxNZXRyb3BvbGlzU3RlcHBlcik7XG4gIH07XG4gIFxuICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsgXG4gIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyO1xuXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGF1Z21lbnRzIHtNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyfVxuICAgKiBBIFwic3ViY2xhc3NcIiBvZiBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLlxuICAgKi8gICAgXG4gIHZhciBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIEludE1ldHJvcG9saXNTdGVwcGVyKTtcbiAgfTtcbiAgXG4gIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfVxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBhIHN0ZXAgZm9yIGEgYmluYXJ5IHBhcmFtZXRlci5cbiAgICogVGhpcyBpcyBkb25lIGJ5IGV2YWx1YXRpbmcgdGhlIGxvZyBwb3N0ZXJpb3IgZm9yIGJvdGggc3RhdGVzIG9mIHRoZVxuICAgKiBwYXJhbWV0ZXIgYW5kIHRoZW4gc2VsZWN0aW5nIGEgc3RhdGUgcmFuZG9tbHkgd2l0aCBwcm9iYWJpbGl0eSByZWxhdGl2ZSBcbiAgICogdG8gdGhlIHBvc3RlcmlvciBvZiBlYWNoIHN0YXRlLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICovXG4gIHZhciBCaW5hcnlTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggID09IDEpIHtcbiAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBcIkJpbmFyeVN0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLlwiO1xuICAgIH1cbiAgfTtcbiAgXG4gIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJpbmFyeVN0ZXBwZXI7XG4gIFxuICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDtcbiAgICB2YXIgemVyb19sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSAxO1xuICAgIHZhciBvbmVfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7XG4gICAgdmFyIG1heF9sb2dfZGVucyA9IE1hdGgubWF4KHplcm9fbG9nX2RlbnMsIG9uZV9sb2dfZGVucyk7XG4gICAgemVyb19sb2dfZGVucyAtPSBtYXhfbG9nX2RlbnM7XG4gICAgb25lX2xvZ19kZW5zIC09IG1heF9sb2dfZGVucztcbiAgICB2YXIgemVyb19wcm9iID0gTWF0aC5leHAoemVyb19sb2dfZGVucyAtIE1hdGgubG9nKCBNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zKSArIE1hdGguZXhwKG9uZV9sb2dfZGVucykgKSApO1xuICAgIGlmKE1hdGgucmFuZG9tKCkgPCB6ZXJvX3Byb2IpIHtcbiAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IDA7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IC8vIGVsc2Uga2VlcCB0aGUgcGFyYW0gYXQgMSAuXG4gICAgcmV0dXJuIDE7XG4gIH07XG4gIFxuICAgIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIEp1c3QgbGlrZSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIHRoaXMgU3RlcHBlciB0YWtlcyBhIHN0ZXBzIGZvclxuICAgKiBhIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyIGJ5IHVwZGF0aW5nIGVhY2ggY29tcG9uZW50IGluIHR1cm4uIFRoZSBkaWZmZXJlbmNlXG4gICAqIGlzIHRoYXQgdGhpcyBzdGVwcGVyIHdvcmtzIG9uIGJpbmFyeSBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZm9yIGEgXG4gICAqICAgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICovXG4gIHZhciBCaW5hcnlDb21wb25lbnRTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIFxuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggID09IDEpIHtcbiAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lXTtcbiAgICAgIHRoaXMuZGltID0gcGFyYW0uZGltO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBcIkJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLlwiO1xuICAgIH1cbiAgICBcbiAgICB2YXIgY3JlYXRlX3N1YnN0ZXBwZXJzID0gXG4gICAgICBmdW5jdGlvbihkaW0sIHN1YnN0YXRlLCBsb2dfcG9zdCkge1xuICAgICAgdmFyIHN1YnN0ZXBwZXJzID0gW107XG4gICAgICB2YXIgaTtcbiAgICAgIGlmKGRpbS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICB2YXIgc3VicGFyYW1zID0ge307XG4gICAgICAgICAgc3VicGFyYW1zW2ldID0gcGFyYW07XG4gICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBuZXcgQmluYXJ5U3RlcHBlcihzdWJwYXJhbXMsIHN1YnN0YXRlLCBsb2dfcG9zdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Vic3RlcHBlcnM7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnN1YnN0ZXBwZXJzID0gY3JlYXRlX3N1YnN0ZXBwZXJzKHRoaXMuZGltLCB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0sIHRoaXMubG9nX3Bvc3QpO1xuICB9O1xuICBcbiAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsgXG4gIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmluYXJ5Q29tcG9uZW50U3RlcHBlcjtcbiAgXG4gIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS5cbiAgICByZXR1cm4gbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7cmV0dXJuIHN1YnN0ZXBwZXIuc3RlcCgpOyB9KTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIFRoaXMgc3RlcHBlciBjYW4gYmUgcmVzcG9uc2libGUgZm9yIHRha2luZyBhIHN0ZXAgZm9yIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMuXG4gICAqIEZvciByZWFsIGFuZCBpbnQgcGFyYW1ldGVycyBpdCB0YWtlcyBNZXRyb3BvbGlzIHdpdGhpbiBHaWJicyBzdGVwcywgYW5kIGZvciBcbiAgICogYmluYXJ5IHBhcmFtZXRlcnMgaXQgZG9lcyBldmFsdWF0ZXMgdGhlIHBvc3RlcmlvciBmb3IgYm90aCBwYXJhbXRlciB2YWx1ZXMgYW5kXG4gICAqIHJhbmRvbWx5IGNoYW5nZXMgdG8gYSBjZXJ0YWluIHZhbHVlIHByb3BvcnRpb25hbGx5IHRvIHRoYXQgdmFsdWUncyBwb3N0ZXJpb3JcbiAgICogKHRoaXMgaXMgYWxzbyBkb25lIGZvciBlYWNoIHBhcmFtZXRlciwgc28gYWxzbyBhICogd2l0aGluIEdpYmJzIGFwcHJvYWNoKS5cbiAgICogVGhpcyBzdGVwcGVyIGlzIGFsc28gYWRhcHRpdmUgYW5kIGNhbiBiZSBlZmZpY2llbnQgd2hlbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnNcbiAgICogYXJlIG5vdCB0b28gaGlnaCBhbmQgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHBhcmFtZXRlcnMgYXJlIGxvdy5cbiAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgb25lIG9yIG1vcmUgcGFyYW1ldGVyIGRlZmluaXRpb25zXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICovXG4gIHZhciBBbXdnU3RlcHBlciA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7XG4gICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTtcbiAgICB0aGlzLnBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBbXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJhbV9uYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dO1xuICAgICAgdmFyIFNlbGVjdFN0ZXBwZXI7XG4gICAgICBzd2l0Y2ggKHBhcmFtLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcInJlYWxcIjpcbiAgICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJpbnRcIjpcbiAgICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBJbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYmluYXJ5XCI6XG4gICAgICAgICAgaWYoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7XG4gICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gQmluYXJ5U3RlcHBlcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IFwiQW13Z1N0ZXBwZXIgY2FuJ3QgaGFuZGxlIHBhcmFtZXRlciBcIiArIHRoaXMucGFyYW1fbmFtZXNbaV0gICtcIiB3aXRoIHR5cGUgXCIgKyBwYXJhbS50eXBlOyBcbiAgICAgIH1cbiAgICAgIHZhciBwYXJhbV9vYmplY3Rfd3JhcCA9IHt9O1xuICAgICAgcGFyYW1fb2JqZWN0X3dyYXBbdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSBwYXJhbTtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgdmFyIHBhcmFtX29wdGlvbnMgPSBvcHRpb25zLnBhcmFtcyAmJiBvcHRpb25zLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVzW2ldXSB8fCB7fTtcbiAgICAgIHBhcmFtX29wdGlvbnMucHJvcF9sb2dfc2NhbGUgICAgID0gcGFyYW1fb3B0aW9ucy5wcm9wX2xvZ19zY2FsZSAgICAgfHwgb3B0aW9ucy5wcm9wX2xvZ19zY2FsZTsgXG4gICAgICBwYXJhbV9vcHRpb25zLmJhdGNoX3NpemUgICAgICAgICA9IHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSAgICAgICAgIHx8IG9wdGlvbnMuYmF0Y2hfc2l6ZTsgXG4gICAgICBwYXJhbV9vcHRpb25zLm1heF9hZGFwdGF0aW9uICAgICA9IHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gICAgIHx8IG9wdGlvbnMubWF4X2FkYXB0YXRpb247XG4gICAgICBwYXJhbV9vcHRpb25zLmluaXRpYWxfYWRhcHRhdGlvbiA9IHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uIHx8IG9wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uO1xuICAgICAgcGFyYW1fb3B0aW9ucy50YXJnZXRfYWNjZXB0X3JhdGUgPSBwYXJhbV9vcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZSB8fCBvcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZTsgXG4gICAgICBwYXJhbV9vcHRpb25zLmlzX2FkYXB0aW5nICAgICAgICA9IHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgICAgICAgIHx8IG9wdGlvbnMuaXNfYWRhcHRpbmc7IFxuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXSA9IG5ldyBTZWxlY3RTdGVwcGVyKHBhcmFtX29iamVjdF93cmFwLCBzdGF0ZSwgbG9nX3Bvc3QsIHBhcmFtX29wdGlvbnMpO1xuICAgIH1cbiAgfTtcbiAgXG4gIEFtd2dTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQW13Z1N0ZXBwZXI7XG4gIFxuICBBbXdnU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHNodWZmbGVfYXJyYXkodGhpcy5zdWJzdGVwcGVycyk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0uc3RlcCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgfTtcbiAgXG4gIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0uc3RhcnRfYWRhcHRhdGlvbigpO1xuICAgIH1cbiAgfTtcbiAgXG4gIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdG9wX2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdG9wX2FkYXB0YXRpb24oKTtcbiAgICB9IFxuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaW5mbyA9IHt9O1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpbmZvW3RoaXMucGFyYW1fbmFtZXNbaV1dID0gdGhpcy5zdWJzdGVwcGVyc1tpXS5pbmZvKCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9O1xuICBcbiAgXG4gIFxuICAvLy8vLy8vLy8vLyBTYW1wbGVyIEZ1bmN0aW9ucyAvLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIFxuICAgLyoqXG4gICAqIEBpbnRlcmZhY2VcbiAgICogV2hpbGUgeW91IGNvdWxkIGZpdCBhIG1vZGVsIGJ5IHBhc3RpbmcgdG9nZXRoZXIgU3RlcHBlcnMsIGFcbiAgLy8gU2FtcGxlciBpcyBoZXJlIGlzIGEgY29udmVuaWVuY2UgY2xhc3Mgd2hlcmUgYW4gaW5zdGFuY2Ugb2YgU2FtcGxlclxuICAvLyBzZXRzIHVwIHRoZSBTdGVwcGVycywgY2hlY2tzIHRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbixcbiAgLy8gYW5kIG1hbmFnZXMgdGhlIHNhbXBsaW5nLiBUaGlzIGhlcmUgZGVmaW5lcyB0aGUgU2FtcGxlciBcImludGVyZmFjZVwiLlxuICAgKiBAaW50ZXJmYWNlXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMsIGZvciBleGFtcGxlOlxuICAgKiAgIHtcIm11XCI6IHtcInR5cGVcIjogXCJyZWFsXCJ9LCBcInNpZ21hXCI6IHtcInR5cGVcIjogXCJyZWFsXCIsIFwibG93ZXJcIiA9IDB9fVxuICAgKiAgIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgZG9lc24ndCBoYXZlIHRvIGJlIFwiY29tcGxldGVcIiBhbmQgcHJvcGVydGllc1xuICAgKiAgIGxlZnQgb3V0IChsaWtlIGxvd2VyIGFuZCB1cHBlcikgd2lsbCBiZSBmaWxsZWQgaW4gYnkgZGVmYXVsdHMuXG4gICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gd2l0aCBzaWduYXR1cmUgZnVuY3Rpb24oc3RhdGUsIGRhdGEpLiBIZXJlXG4gICAqICAgc3RhdGUgd2lsbCBiZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSB3aXRoIGVhY2ggcGFyYW1ldGVyIGFzIGEgXG4gICAqICAga2V5IGFuZCB0aGUgcGFyYW1ldGVyIHZhbHVlcyBhcyBudW1iZXJzIG9yIGFycmF5cy4gRm9yIGV4YW1wbGU6XG4gICAqICAge1wibXVcIjogMywgXCJzaWdtYVwiOiAxLjV9LiBUaGUgZGF0YSBhcmd1bWVudCB3aWxsIGJlIHRoZSBzYW1lIG9iamVjdCBhcyBcbiAgICogICB0aGUgZGF0YSBhcmd1bWVudCBnaXZlbiBiZWxvdy5cbiAgICogQHBhcmFtIGRhdGEgLSBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgbG9nX3Bvc3QgZnVuY3Rpb25cbiAgICogICB3aGVuIHNhbXBsaW5nLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHNhbXBsZXIuXG4gICAqL1xuICB2YXIgU2FtcGxlciA9IGZ1bmN0aW9uKHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7XG4gICAgXG4gICAgLy8gU2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgaWYgbm90IHBhc3NlZCB0aHJvdWdoIHRoZSBvcHRpb25zIG9iamVjdFxuICAgIHRoaXMucGFyYW1faW5pdF9mdW4gICA9IGdldF9vcHRpb24oXCJwYXJhbV9pbml0X2Z1blwiLCBvcHRpb25zLCBwYXJhbV9pbml0X2ZpeGVkKTtcbiAgICB2YXIgdGhpbm5pbmdfaW50ZXJ2YWwgPSBnZXRfb3B0aW9uKFwidGhpblwiLCBvcHRpb25zLCAxKTtcbiAgICB2YXIgcGFyYW1zX3RvX21vbml0b3IgPSBnZXRfb3B0aW9uKFwibW9uaXRvclwiLCBvcHRpb25zLCBudWxsKTtcbiAgICB0aGlzLnRoaW4odGhpbm5pbmdfaW50ZXJ2YWwpO1xuICAgIHRoaXMubW9uaXRvcihwYXJhbXNfdG9fbW9uaXRvcik7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAvLyBDb21wbGV0aW5nIHRoZSBwYXJhbXMgYW5kIGluaXRpYWxpemluZyB0aGUgc3RhdGUuXG4gICAgdGhpcy5wYXJhbXMgPSBjb21wbGV0ZV9wYXJhbXModGhpcy5wYXJhbXMsIHRoaXMucGFyYW1faW5pdF9mdW4pO1xuICAgIHZhciBzdGF0ZSA9IHt9O1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrICkge1xuICAgICAgc3RhdGVbdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVzW2ldXS5pbml0O1xuICAgIH1cbiAgICB0aGlzLmxvZ19wb3N0ID0gZnVuY3Rpb24oKSB7IFxuICAgICAgcmV0dXJuIGxvZ19wb3N0KHN0YXRlLCBkYXRhKTtcbiAgICB9O1xuICAgIC8vIFJ1bm5pbmcgdGhlIGxvZ19wb3N0IGZ1bmN0aW9uIG9uY2UgaW4gY2FzZSBpdCBmdXJ0aGVyIG1vZGlmaWVzIHRoZSBzdGF0ZVxuICAgIC8vIGZvciBleGFtcGxlIGFkZGluZyBkZXJpdmVkIHF1YW50aXRpZXMuXG4gICAgdGhpcy5sb2dfcG9zdCgpO1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLnN0ZXBwZXJzID0gdGhpcy5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSh0aGlzLnBhcmFtcywgdGhpcy5zdGF0ZSwgdGhpcy5sb2dfcG9zdCwgdGhpcy5vcHRpb25zKTtcbiAgfTtcbiAgXG4gIC8qKiBTaG91bGQgcmV0dXJuIGEgdmVjdG9yIG9mIHN0ZXBwZXJzIHRoYXQgd2hlbiBjYWxsZWQgXG4gICAqIHNob3VsZCB0YWtlIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLlxuICAgKi9cbiAgU2FtcGxlci5wcm90b3R5cGUuY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUgPSBmdW5jdGlvbihzdGF0ZSwgbG9nX3Bvc3Qpe1xuICAgIHRocm93IFwiRXZlcnkgU2FtcGxlciBuZWVkcyB0byBpbXBsZW1lbnQgY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUoKVwiO1xuICB9O1xuICBcbiAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIFNhbXBsZXIuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7c3RhdGU6IHRoaXMuc3RhdGUsIHRoaW46IHRoaXMudGhpbiwgbW9uaXRvcjogdGhpcy5tb25pdG9yLFxuICAgICAgICAgICAgc3RlcHBlcnM6IHRoaXMuc3RlcHBlcnN9O1xuICB9O1xuICBcbiAgLyoqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBSZXR1cm5zIHRoZSBuZXcgc3BhY2VcbiAgICogYnV0IGFsc28gbW9kaWZpZXMgdGhlIHN0YXRlIGluIHBsYWNlLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICBzaHVmZmxlX2FycmF5KHRoaXMuc3RlcHBlcnMpO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0ZXAoKTtcbiAgICB9XG4gICAgaWYoT2JqZWN0LmtleXModGhpcy5zdGF0ZSkubGVuZ3RoID4gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpLmxlbmd0aCkge1xuICAgICAgLy8gVGhlIHN0YXRlIGNvbnRhaW5zIGRldml2ZWQgcXVhbnRpdGllcyAobm90IG9ubHkgcGFyYW1ldGVycykgYW5kIHdlXG4gICAgICAvLyBuZWVkIHRvIHJ1biB0aGUgbG9nX3Bvc3Qgb25jZSBtb3JlIGluIG9yZGVyIHRvIHNldCB0aGUgZGVyaXZlZCBxdWFudGl0aWVzXG4gICAgICAvLyBmb3IgdGhlIGZpbmFsIHBhcmFtZXRlciBzdGF0ZVxuICAgICAgdGhpcy5sb2dfcG9zdCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBUYWtlcyBuX2l0ZXJhdGlvbnMgc3RlcHMgaW4gdGhlIHBhcmFtZXRlciBzcGFjZSBhbmQgcmV0dXJucyB0aGVtXG4gICAqIGFzIGFuIG9iamVjdCBvZiBhcnJheXMgd2l0aCBvbmUgYXJyYXkgcGVyIHBhcmFtZXRlci4gRm9yIGV4YW1wbGU6XG4gICAqIHttdTogWzEsIC0xLCAyLCAzLCAuLi5dLCBzaWdtYTogWzEsIDIsIDIsIDEsIC4uLl19LlxuICAgKiBJZiB0aGluIGlzID4gMSB0aGVuIG5faXRlcmF0aW9ucyAvIHRoaW4gc2FtcGxlcyBhcmUgcmV0dXJuZWQuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc2FtcGxlID0gZnVuY3Rpb24obl9pdGVyYXRpb25zKSB7XG4gICAgICAvLyBJbml0aWFsaXppbmcgY3Vycl9zYW1wbGUgd2hlcmUgdGhlIHNhbXBsZSBpcyBnb2luZyB0byBiZSBzYXZlZFxuICAgICAgLy8gYXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgb25lIGFycmF5IHBlciBwYXJhbWV0ZXIgdG8gYmUgbW9uaXRvcmVkLlxuICAgICAgdmFyIGksIGosIG1vbml0b3JlZF9wYXJhbXM7XG4gICAgICBpZih0aGlzLm1vbml0b3JlZF9wYXJhbXMgPT09IG51bGwpIHtcbiAgICAgICAgbW9uaXRvcmVkX3BhcmFtcyA9IE9iamVjdC5rZXlzKHRoaXMuc3RhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW9uaXRvcmVkX3BhcmFtcyA9IHRoaXMubW9uaXRvcmVkX3BhcmFtcztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdmFyIGN1cnJfc2FtcGxlID0ge307XG4gICAgICBmb3IoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGN1cnJfc2FtcGxlW21vbml0b3JlZF9wYXJhbXNbal1dID0gW107XG4gICAgICB9XG4gICAgICBcbiAgICAgIGZvcihpID0gMDsgaSA8IG5faXRlcmF0aW9uczsgaSsrKSB7XG4gICAgICAgIGlmKGkgJSB0aGlzLnRoaW5uaW5nX2ludGVydmFsID09PSAwKSB7XG4gICAgICAgICAgZm9yKGogPSAwOyBqIDwgbW9uaXRvcmVkX3BhcmFtcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHBhcmFtID0gbW9uaXRvcmVkX3BhcmFtc1tqXTtcbiAgICAgICAgICAgIGN1cnJfc2FtcGxlW3BhcmFtXS5wdXNoKCBjbG9uZV9wYXJhbV9kcmF3KHRoaXMuc3RhdGVbcGFyYW1dKSApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0ZXAoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyX3NhbXBsZTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBUYWtlcyBuX2l0ZXJhdGlvbiBzdGVwcyBpbiBwYXJhbWV0ZXIgc3BhY2UgYnV0IHJldHVybnMgbm90aGluZy5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5idXJuID0gZnVuY3Rpb24obl9pdGVyYXRpb25zKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IG5faXRlcmF0aW9uczsgaSsrKSB7XG4gICAgICB0aGlzLnN0ZXAoKTtcbiAgICB9XG4gIH07XG4gIFxuICAvKipcbiAgICogU2V0cyB3aGF0IHBhcmFtZXRlcnMgc2hvdWxkIGJlIG1vbml0b3JlZCBhbmQgcmV0dXJuZWQgd2hlbiBjYWxsaW5nXG4gICAqIHNhbXBsZS5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5tb25pdG9yID0gZnVuY3Rpb24ocGFyYW1zX3RvX21vbml0b3IpIHtcbiAgICAgIHRoaXMubW9uaXRvcmVkX3BhcmFtcyA9IHBhcmFtc190b19tb25pdG9yO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFNldHMgdGhlIHRoaW5uaW5nLiBGb3IgZXhhbXBsZSB0aGluID09IDEwIG1lYW5zIHRoYXQgZXZlcnkgMTB0aCBwb3N0ZXJpb3JcbiAgICogZHJhdyB3aWxsIGJlIGtlcHQuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUudGhpbiA9IGZ1bmN0aW9uKHRoaW5uaW5nX2ludGVydmFsKSB7XG4gICAgdGhpcy50aGlubmluZ19pbnRlcnZhbCA9IHRoaW5uaW5nX2ludGVydmFsO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFNldHMgYWRhcHRhdGlvbiBvbiwgaWYgYXBwbGljYWJsZSwgaW4gYWxsIHN0ZXBwZXJzLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdGVwcGVyc1tpXS5zdGFydF9hZGFwdGF0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgICAvKipcbiAgICogU2V0cyBhZGFwdGF0aW9uIG9mZiwgaWYgYXBwbGljYWJsZSwgaW4gYWxsIHN0ZXBwZXJzLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0b3BfYWRhcHRhdGlvbigpO1xuICAgIH1cbiAgfTtcbiAgXG4gICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBpbXBsZW1lbnRzIHtTYW1wbGVyfVxuICAgKiBUaGlzIHNhbXBsZXIgdXNlcyB0aGUgQW13Z1N0ZXBwZXIgYXMgdGhlIHN0ZXBwZXIgZnVuY3Rpb24gd2hpY2ggaW1wbGVtZW50cyB0aGUgXG4gICAqIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiBcIkV4YW1wbGVzIG9mIEFkYXB0aXZlIE1DTUNcIlxuICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLiBBbiBhZGl0aW9uIGlzIHRoYXQgaXQgaGFuZGxlcyBpbnQgcGFyYW1ldGVyc1xuICAgKiBieSBtYWtpbmcgZGlzY3JldGUgTm9ybWFsIHByb3Bvc2FscyBhbmQgYmluYXJ5IHBhcmFtZXRlcnMgYnkgdGFraW5nIG9uIGEgbmV3IFxuICAgKiB2YWx1ZSBwcm9wb3J0aW9uYWwgdG8gdGhlIHBvc3RlcmlvciBvZiB0aGUgdHdvIHBvc3NpYmxlIHN0YXRlcyBvZiB0aGVcbiAgICogcGFyYW1ldGVyLiBUaGlzIHNhbXBsZXIgY2FuIGJlIGVmZmljaWVudCB3aGVuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyc1xuICAgKiBhcmUgbm90IHRvbyBoaWdoIGFuZCB0aGUgY29ycmVsYXRpb25zIGJldHdlZW4gcGFyYW1ldGVycyBhcmUgbG93LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnNcbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEFtd2dTYW1wbGVyID0gZnVuY3Rpb24ocGFyYW1zLCBsb2dfcG9zdCwgZGF0YSwgb3B0aW9ucykge1xuICAgIFNhbXBsZXIuY2FsbCh0aGlzLCBwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKTtcbiAgfTtcbiAgXG4gIEFtd2dTYW1wbGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU2FtcGxlci5wcm90b3R5cGUpOyBcbiAgQW13Z1NhbXBsZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQW13Z1NhbXBsZXI7XG4gIFxuICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucyl7XG4gICAgcmV0dXJuIFsgbmV3IEFtd2dTdGVwcGVyKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSBdO1xuICB9O1xuICBcbiAgXG4gIC8vIFJldHVybmluZyB0aGUgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIHB1YmxpY2x5IGV4cG9zZWQgYnkgdGhpcyBtb2R1bGVcbiAgcmV0dXJuIHtcbiAgICBydW5pZjogcnVuaWYsXG4gICAgcnVuaWZfZGlzY3JldGU6IHJ1bmlmX2Rpc2NyZXRlLFxuICAgIHJub3JtOiBybm9ybSxcbiAgICBwYXJhbV9pbml0X2ZpeGVkOiBwYXJhbV9pbml0X2ZpeGVkLCBcbiAgICBjb21wbGV0ZV9wYXJhbXM6IGNvbXBsZXRlX3BhcmFtcywgXG4gICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyOiBSZWFsTWV0cm9wb2xpc1N0ZXBwZXIsIFxuICAgIEludE1ldHJvcG9saXNTdGVwcGVyOiBJbnRNZXRyb3BvbGlzU3RlcHBlciwgXG4gICAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLCBcbiAgICBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOiBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLCBcbiAgICBCaW5hcnlTdGVwcGVyOiBCaW5hcnlTdGVwcGVyLCBcbiAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyOiBCaW5hcnlDb21wb25lbnRTdGVwcGVyLCBcbiAgICBBbXdnU3RlcHBlcjogQW13Z1N0ZXBwZXIsIFxuICAgIEFtd2dTYW1wbGVyOiBBbXdnU2FtcGxlclxuICB9O1xufSkpO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIGEgPT0gbnVsbCB8fCBiID09IG51bGwgPyBOYU4gOiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG51bWJlcih4KSB7XG4gIHJldHVybiB4ID09PSBudWxsID8gTmFOIDogK3g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkge1xuICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcbmltcG9ydCBwZXJtdXRlIGZyb20gXCIuL3Blcm11dGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydCh2YWx1ZXMsIC4uLkYpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwidmFsdWVzIGlzIG5vdCBpdGVyYWJsZVwiKTtcbiAgdmFsdWVzID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICBsZXQgW2ZdID0gRjtcbiAgaWYgKChmICYmIGYubGVuZ3RoICE9PSAyKSB8fCBGLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBpbmRleCA9IFVpbnQzMkFycmF5LmZyb20odmFsdWVzLCAoZCwgaSkgPT4gaSk7XG4gICAgaWYgKEYubGVuZ3RoID4gMSkge1xuICAgICAgRiA9IEYubWFwKGYgPT4gdmFsdWVzLm1hcChmKSk7XG4gICAgICBpbmRleC5zb3J0KChpLCBqKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBGKSB7XG4gICAgICAgICAgY29uc3QgYyA9IGFzY2VuZGluZ0RlZmluZWQoZltpXSwgZltqXSk7XG4gICAgICAgICAgaWYgKGMpIHJldHVybiBjO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZiA9IHZhbHVlcy5tYXAoZik7XG4gICAgICBpbmRleC5zb3J0KChpLCBqKSA9PiBhc2NlbmRpbmdEZWZpbmVkKGZbaV0sIGZbal0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHBlcm11dGUodmFsdWVzLCBpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlcy5zb3J0KGNvbXBhcmVEZWZpbmVkKGYpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUgPSBhc2NlbmRpbmcpIHtcbiAgaWYgKGNvbXBhcmUgPT09IGFzY2VuZGluZykgcmV0dXJuIGFzY2VuZGluZ0RlZmluZWQ7XG4gIGlmICh0eXBlb2YgY29tcGFyZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY29tcGFyZSBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgcmV0dXJuIChhLCBiKSA9PiB7XG4gICAgY29uc3QgeCA9IGNvbXBhcmUoYSwgYik7XG4gICAgaWYgKHggfHwgeCA9PT0gMCkgcmV0dXJuIHg7XG4gICAgcmV0dXJuIChjb21wYXJlKGIsIGIpID09PSAwKSAtIChjb21wYXJlKGEsIGEpID09PSAwKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzY2VuZGluZ0RlZmluZWQoYSwgYikge1xuICByZXR1cm4gKGEgPT0gbnVsbCB8fCAhKGEgPj0gYSkpIC0gKGIgPT0gbnVsbCB8fCAhKGIgPj0gYikpIHx8IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXgodmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtYXg7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXg7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtaW4odmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtaW47XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtaW47XG59XG4iLCJpbXBvcnQge2FzY2VuZGluZ0RlZmluZWQsIGNvbXBhcmVEZWZpbmVkfSBmcm9tIFwiLi9zb3J0LmpzXCI7XG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3VybmVyL3F1aWNrc2VsZWN0XG4vLyBJU0MgbGljZW5zZSwgQ29weXJpZ2h0IDIwMTggVmxhZGltaXIgQWdhZm9ua2luLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVpY2tzZWxlY3QoYXJyYXksIGssIGxlZnQgPSAwLCByaWdodCA9IEluZmluaXR5LCBjb21wYXJlKSB7XG4gIGsgPSBNYXRoLmZsb29yKGspO1xuICBsZWZ0ID0gTWF0aC5mbG9vcihNYXRoLm1heCgwLCBsZWZ0KSk7XG4gIHJpZ2h0ID0gTWF0aC5mbG9vcihNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCByaWdodCkpO1xuXG4gIGlmICghKGxlZnQgPD0gayAmJiBrIDw9IHJpZ2h0KSkgcmV0dXJuIGFycmF5O1xuXG4gIGNvbXBhcmUgPSBjb21wYXJlID09PSB1bmRlZmluZWQgPyBhc2NlbmRpbmdEZWZpbmVkIDogY29tcGFyZURlZmluZWQoY29tcGFyZSk7XG5cbiAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkge1xuICAgIGlmIChyaWdodCAtIGxlZnQgPiA2MDApIHtcbiAgICAgIGNvbnN0IG4gPSByaWdodCAtIGxlZnQgKyAxO1xuICAgICAgY29uc3QgbSA9IGsgLSBsZWZ0ICsgMTtcbiAgICAgIGNvbnN0IHogPSBNYXRoLmxvZyhuKTtcbiAgICAgIGNvbnN0IHMgPSAwLjUgKiBNYXRoLmV4cCgyICogeiAvIDMpO1xuICAgICAgY29uc3Qgc2QgPSAwLjUgKiBNYXRoLnNxcnQoeiAqIHMgKiAobiAtIHMpIC8gbikgKiAobSAtIG4gLyAyIDwgMCA/IC0xIDogMSk7XG4gICAgICBjb25zdCBuZXdMZWZ0ID0gTWF0aC5tYXgobGVmdCwgTWF0aC5mbG9vcihrIC0gbSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIGNvbnN0IG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gbSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICBxdWlja3NlbGVjdChhcnJheSwgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGNvbXBhcmUpO1xuICAgIH1cblxuICAgIGNvbnN0IHQgPSBhcnJheVtrXTtcbiAgICBsZXQgaSA9IGxlZnQ7XG4gICAgbGV0IGogPSByaWdodDtcblxuICAgIHN3YXAoYXJyYXksIGxlZnQsIGspO1xuICAgIGlmIChjb21wYXJlKGFycmF5W3JpZ2h0XSwgdCkgPiAwKSBzd2FwKGFycmF5LCBsZWZ0LCByaWdodCk7XG5cbiAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgIHN3YXAoYXJyYXksIGksIGopLCArK2ksIC0tajtcbiAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2ldLCB0KSA8IDApICsraTtcbiAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2pdLCB0KSA+IDApIC0tajtcbiAgICB9XG5cbiAgICBpZiAoY29tcGFyZShhcnJheVtsZWZ0XSwgdCkgPT09IDApIHN3YXAoYXJyYXksIGxlZnQsIGopO1xuICAgIGVsc2UgKytqLCBzd2FwKGFycmF5LCBqLCByaWdodCk7XG5cbiAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgaWYgKGsgPD0gaikgcmlnaHQgPSBqIC0gMTtcbiAgfVxuXG4gIHJldHVybiBhcnJheTtcbn1cblxuZnVuY3Rpb24gc3dhcChhcnJheSwgaSwgaikge1xuICBjb25zdCB0ID0gYXJyYXlbaV07XG4gIGFycmF5W2ldID0gYXJyYXlbal07XG4gIGFycmF5W2pdID0gdDtcbn1cbiIsImltcG9ydCBtYXggZnJvbSBcIi4vbWF4LmpzXCI7XG5pbXBvcnQgbWF4SW5kZXggZnJvbSBcIi4vbWF4SW5kZXguanNcIjtcbmltcG9ydCBtaW4gZnJvbSBcIi4vbWluLmpzXCI7XG5pbXBvcnQgbWluSW5kZXggZnJvbSBcIi4vbWluSW5kZXguanNcIjtcbmltcG9ydCBxdWlja3NlbGVjdCBmcm9tIFwiLi9xdWlja3NlbGVjdC5qc1wiO1xuaW1wb3J0IG51bWJlciwge251bWJlcnN9IGZyb20gXCIuL251bWJlci5qc1wiO1xuaW1wb3J0IHthc2NlbmRpbmdEZWZpbmVkfSBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgZ3JlYXRlc3QgZnJvbSBcIi4vZ3JlYXRlc3QuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVhbnRpbGUodmFsdWVzLCBwLCB2YWx1ZW9mKSB7XG4gIHZhbHVlcyA9IEZsb2F0NjRBcnJheS5mcm9tKG51bWJlcnModmFsdWVzLCB2YWx1ZW9mKSk7XG4gIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSB8fCBpc05hTihwID0gK3ApKSByZXR1cm47XG4gIGlmIChwIDw9IDAgfHwgbiA8IDIpIHJldHVybiBtaW4odmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heCh2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9IG1heChxdWlja3NlbGVjdCh2YWx1ZXMsIGkwKS5zdWJhcnJheSgwLCBpMCArIDEpKSxcbiAgICAgIHZhbHVlMSA9IG1pbih2YWx1ZXMuc3ViYXJyYXkoaTAgKyAxKSk7XG4gIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVhbnRpbGVTb3J0ZWQodmFsdWVzLCBwLCB2YWx1ZW9mID0gbnVtYmVyKSB7XG4gIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSB8fCBpc05hTihwID0gK3ApKSByZXR1cm47XG4gIGlmIChwIDw9IDAgfHwgbiA8IDIpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbMF0sIDAsIHZhbHVlcyk7XG4gIGlmIChwID49IDEpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbbiAtIDFdLCBuIC0gMSwgdmFsdWVzKTtcbiAgdmFyIG4sXG4gICAgICBpID0gKG4gLSAxKSAqIHAsXG4gICAgICBpMCA9IE1hdGguZmxvb3IoaSksXG4gICAgICB2YWx1ZTAgPSArdmFsdWVvZih2YWx1ZXNbaTBdLCBpMCwgdmFsdWVzKSxcbiAgICAgIHZhbHVlMSA9ICt2YWx1ZW9mKHZhbHVlc1tpMCArIDFdLCBpMCArIDEsIHZhbHVlcyk7XG4gIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVhbnRpbGVJbmRleCh2YWx1ZXMsIHAsIHZhbHVlb2YgPSBudW1iZXIpIHtcbiAgaWYgKGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgbnVtYmVycyA9IEZsb2F0NjRBcnJheS5mcm9tKHZhbHVlcywgKF8sIGkpID0+IG51bWJlcih2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkpO1xuICBpZiAocCA8PSAwKSByZXR1cm4gbWluSW5kZXgobnVtYmVycyk7XG4gIGlmIChwID49IDEpIHJldHVybiBtYXhJbmRleChudW1iZXJzKTtcbiAgdmFyIG51bWJlcnMsXG4gICAgICBpbmRleCA9IFVpbnQzMkFycmF5LmZyb20odmFsdWVzLCAoXywgaSkgPT4gaSksXG4gICAgICBqID0gbnVtYmVycy5sZW5ndGggLSAxLFxuICAgICAgaSA9IE1hdGguZmxvb3IoaiAqIHApO1xuICBxdWlja3NlbGVjdChpbmRleCwgaSwgMCwgaiwgKGksIGopID0+IGFzY2VuZGluZ0RlZmluZWQobnVtYmVyc1tpXSwgbnVtYmVyc1tqXSkpO1xuICBpID0gZ3JlYXRlc3QoaW5kZXguc3ViYXJyYXkoMCwgaSArIDEpLCAoaSkgPT4gbnVtYmVyc1tpXSk7XG4gIHJldHVybiBpID49IDAgPyBpIDogLTE7XG59XG4iLCJpbXBvcnQgcXVhbnRpbGUsIHtxdWFudGlsZUluZGV4fSBmcm9tIFwiLi9xdWFudGlsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZWRpYW4odmFsdWVzLCB2YWx1ZW9mKSB7XG4gIHJldHVybiBxdWFudGlsZSh2YWx1ZXMsIDAuNSwgdmFsdWVvZik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZWRpYW5JbmRleCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgcmV0dXJuIHF1YW50aWxlSW5kZXgodmFsdWVzLCAwLjUsIHZhbHVlb2YpO1xufVxuIiwidmFyIG5vb3AgPSB7dmFsdWU6ICgpID0+IHt9fTtcblxuZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArIFwiXCIpIHx8ICh0IGluIF8pIHx8IC9bXFxzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgdHlwZTogXCIgKyB0KTtcbiAgICBfW3RdID0gW107XG4gIH1cbiAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTtcbn1cblxuZnVuY3Rpb24gRGlzcGF0Y2goXykge1xuICB0aGlzLl8gPSBfO1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsIHR5cGVzKSB7XG4gIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgIHZhciBuYW1lID0gXCJcIiwgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0KTtcbiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9O1xuICB9KTtcbn1cblxuRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRGlzcGF0Y2gsXG4gIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgXyA9IHRoaXMuXyxcbiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiwgXyksXG4gICAgICAgIHQsXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IFQubGVuZ3RoO1xuXG4gICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdldChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLlxuICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNhbGxiYWNrOiBcIiArIGNhbGxiYWNrKTtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb3B5OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29weSA9IHt9LCBfID0gdGhpcy5fO1xuICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTtcbiAgICByZXR1cm4gbmV3IERpc3BhdGNoKGNvcHkpO1xuICB9LFxuICBjYWxsOiBmdW5jdGlvbih0eXBlLCB0aGF0KSB7XG4gICAgaWYgKChuID0gYXJndW1lbnRzLmxlbmd0aCAtIDIpID4gMCkgZm9yICh2YXIgYXJncyA9IG5ldyBBcnJheShuKSwgaSA9IDAsIG4sIHQ7IGkgPCBuOyArK2kpIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykge1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh2YXIgdCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0KHR5cGUsIG5hbWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkge1xuICAgIGlmICgoYyA9IHR5cGVbaV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHJldHVybiBjLnZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXQodHlwZSwgbmFtZSwgY2FsbGJhY2spIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGlmICh0eXBlW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChjYWxsYmFjayAhPSBudWxsKSB0eXBlLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiBjYWxsYmFja30pO1xuICByZXR1cm4gdHlwZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlzcGF0Y2g7XG4iLCJleHBvcnQgdmFyIHhodG1sID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc3ZnOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIHhodG1sOiB4aHRtbCxcbiAgeGxpbms6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICB4bWw6IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCJcbn07XG4iLCJpbXBvcnQgbmFtZXNwYWNlcyBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIHByZWZpeCA9IG5hbWUgKz0gXCJcIiwgaSA9IHByZWZpeC5pbmRleE9mKFwiOlwiKTtcbiAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09IFwieG1sbnNcIikgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpO1xuICByZXR1cm4gbmFtZXNwYWNlcy5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sIGxvY2FsOiBuYW1lfSA6IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG59XG4iLCJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuL25hbWVzcGFjZS5qc1wiO1xuaW1wb3J0IHt4aHRtbH0gZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5mdW5jdGlvbiBjcmVhdG9ySW5oZXJpdChuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQsXG4gICAgICAgIHVyaSA9IHRoaXMubmFtZXNwYWNlVVJJO1xuICAgIHJldHVybiB1cmkgPT09IHhodG1sICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IHhodG1sXG4gICAgICAgID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKVxuICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdG9yRml4ZWQoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gKGZ1bGxuYW1lLmxvY2FsXG4gICAgICA/IGNyZWF0b3JGaXhlZFxuICAgICAgOiBjcmVhdG9ySW5oZXJpdCkoZnVsbG5hbWUpO1xufVxuIiwiZnVuY3Rpb24gbm9uZSgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiLy8gR2l2ZW4gc29tZXRoaW5nIGFycmF5IGxpa2UgKG9yIG51bGwpLCByZXR1cm5zIHNvbWV0aGluZyB0aGF0IGlzIHN0cmljdGx5IGFuXG4vLyBhcnJheS4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGFycmF5LWxpa2Ugb2JqZWN0cyBwYXNzZWQgdG8gZDMuc2VsZWN0QWxsXG4vLyBvciBzZWxlY3Rpb24uc2VsZWN0QWxsIGFyZSBjb252ZXJ0ZWQgaW50byBwcm9wZXIgYXJyYXlzIHdoZW4gY3JlYXRpbmcgYVxuLy8gc2VsZWN0aW9uOyB3ZSBkb27igJl0IGV2ZXIgd2FudCB0byBjcmVhdGUgYSBzZWxlY3Rpb24gYmFja2VkIGJ5IGEgbGl2ZVxuLy8gSFRNTENvbGxlY3Rpb24gb3IgTm9kZUxpc3QuIEhvd2V2ZXIsIG5vdGUgdGhhdCBzZWxlY3Rpb24uc2VsZWN0QWxsIHdpbGwgdXNlIGFcbi8vIHN0YXRpYyBOb2RlTGlzdCBhcyBhIGdyb3VwLCBzaW5jZSBpdCBzYWZlbHkgZGVyaXZlZCBmcm9tIHF1ZXJ5U2VsZWN0b3JBbGwuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhcnJheSh4KSB7XG4gIHJldHVybiB4ID09IG51bGwgPyBbXSA6IEFycmF5LmlzQXJyYXkoeCkgPyB4IDogQXJyYXkuZnJvbSh4KTtcbn1cbiIsImZ1bmN0aW9uIGVtcHR5KCkge1xuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IGFycmF5IGZyb20gXCIuLi9hcnJheS5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yQWxsIGZyb20gXCIuLi9zZWxlY3RvckFsbC5qc1wiO1xuXG5mdW5jdGlvbiBhcnJheUFsbChzZWxlY3QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBhcnJheShzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCA9PT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBhcnJheUFsbChzZWxlY3QpO1xuICBlbHNlIHNlbGVjdCA9IHNlbGVjdG9yQWxsKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKTtcbiAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgcGFyZW50cyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZE1hdGNoZXIoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuIiwiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmQ7XG5cbmZ1bmN0aW9uIGNoaWxkRmluZChtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbmQuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNoaWxkRmlyc3QoKSB7XG4gIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QobWF0Y2ggPT0gbnVsbCA/IGNoaWxkRmlyc3RcbiAgICAgIDogY2hpbGRGaW5kKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCJpbXBvcnQge2NoaWxkTWF0Y2hlcn0gZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxudmFyIGZpbHRlciA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXI7XG5cbmZ1bmN0aW9uIGNoaWxkcmVuKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKTtcbn1cblxuZnVuY3Rpb24gY2hpbGRyZW5GaWx0ZXIobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdEFsbChtYXRjaCA9PSBudWxsID8gY2hpbGRyZW5cbiAgICAgIDogY2hpbGRyZW5GaWx0ZXIodHlwZW9mIG1hdGNoID09PSBcImZ1bmN0aW9uXCIgPyBtYXRjaCA6IGNoaWxkTWF0Y2hlcihtYXRjaCkpKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IG1hdGNoZXIgZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih1cGRhdGUpIHtcbiAgcmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKTtcbn1cbiIsImltcG9ydCBzcGFyc2UgZnJvbSBcIi4vc3BhcnNlLmpzXCI7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2VudGVyIHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBFbnRlck5vZGUocGFyZW50LCBkYXR1bSkge1xuICB0aGlzLm93bmVyRG9jdW1lbnQgPSBwYXJlbnQub3duZXJEb2N1bWVudDtcbiAgdGhpcy5uYW1lc3BhY2VVUkkgPSBwYXJlbnQubmFtZXNwYWNlVVJJO1xuICB0aGlzLl9uZXh0ID0gbnVsbDtcbiAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICB0aGlzLl9fZGF0YV9fID0gZGF0dW07XG59XG5cbkVudGVyTm9kZS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUsXG4gIGFwcGVuZENoaWxkOiBmdW5jdGlvbihjaGlsZCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgdGhpcy5fbmV4dCk7IH0sXG4gIGluc2VydEJlZm9yZTogZnVuY3Rpb24oY2hpbGQsIG5leHQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIG5leHQpOyB9LFxuICBxdWVyeVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOyB9LFxuICBxdWVyeVNlbGVjdG9yQWxsOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOyB9XG59O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCB7RW50ZXJOb2RlfSBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBiaW5kSW5kZXgocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSkge1xuICB2YXIgaSA9IDAsXG4gICAgICBub2RlLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGZpdCBpbnRvIHVwZGF0ZS5cbiAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuXG4gIC8vIFB1dCBhbnkgcmVtYWluaW5nIGRhdGEgaW50byBlbnRlci5cbiAgZm9yICg7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBkb27igJl0IGZpdCBpbnRvIGV4aXQuXG4gIGZvciAoOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBiaW5kS2V5KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEsIGtleSkge1xuICB2YXIgaSxcbiAgICAgIG5vZGUsXG4gICAgICBub2RlQnlLZXlWYWx1ZSA9IG5ldyBNYXAsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksXG4gICAgICBrZXlWYWx1ZTtcblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggbm9kZS5cbiAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApICsgXCJcIjtcbiAgICAgIGlmIChub2RlQnlLZXlWYWx1ZS5oYXMoa2V5VmFsdWUpKSB7XG4gICAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZUJ5S2V5VmFsdWUuc2V0KGtleVZhbHVlLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggZGF0dW0uXG4gIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuXG4gIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci5cbiAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGtleVZhbHVlID0ga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKSArIFwiXCI7XG4gICAgaWYgKG5vZGUgPSBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWUpKSB7XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICBub2RlQnlLZXlWYWx1ZS5kZWxldGUoa2V5VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZXNbaV0pID09PSBub2RlKSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRhdHVtKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX19kYXRhX187XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLCBkYXR1bSk7XG5cbiAgdmFyIGJpbmQgPSBrZXkgPyBiaW5kS2V5IDogYmluZEluZGV4LFxuICAgICAgcGFyZW50cyA9IHRoaXMuX3BhcmVudHMsXG4gICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB2YWx1ZSA9IGNvbnN0YW50KHZhbHVlKTtcblxuICBmb3IgKHZhciBtID0gZ3JvdXBzLmxlbmd0aCwgdXBkYXRlID0gbmV3IEFycmF5KG0pLCBlbnRlciA9IG5ldyBBcnJheShtKSwgZXhpdCA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tqXSxcbiAgICAgICAgZ3JvdXAgPSBncm91cHNbal0sXG4gICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgICBkYXRhID0gYXJyYXlsaWtlKHZhbHVlLmNhbGwocGFyZW50LCBwYXJlbnQgJiYgcGFyZW50Ll9fZGF0YV9fLCBqLCBwYXJlbnRzKSksXG4gICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICB1cGRhdGVHcm91cCA9IHVwZGF0ZVtqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgZXhpdEdyb3VwID0gZXhpdFtqXSA9IG5ldyBBcnJheShncm91cExlbmd0aCk7XG5cbiAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7XG5cbiAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXRcbiAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLFxuICAgIC8vIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudCBub2RlLlxuICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7XG4gICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkge1xuICAgICAgICBpZiAoaTAgPj0gaTEpIGkxID0gaTAgKyAxO1xuICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7XG4gICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTtcbiAgdXBkYXRlLl9lbnRlciA9IGVudGVyO1xuICB1cGRhdGUuX2V4aXQgPSBleGl0O1xuICByZXR1cm4gdXBkYXRlO1xufVxuXG4vLyBHaXZlbiBzb21lIGRhdGEsIHRoaXMgcmV0dXJucyBhbiBhcnJheS1saWtlIHZpZXcgb2YgaXQ6IGFuIG9iamVjdCB0aGF0XG4vLyBleHBvc2VzIGEgbGVuZ3RoIHByb3BlcnR5IGFuZCBhbGxvd3MgbnVtZXJpYyBpbmRleGluZy4gTm90ZSB0aGF0IHVubGlrZVxuLy8gc2VsZWN0QWxsLCB0aGlzIGlzbuKAmXQgd29ycmllZCBhYm91dCDigJxsaXZl4oCdIGNvbGxlY3Rpb25zIGJlY2F1c2UgdGhlIHJlc3VsdGluZ1xuLy8gYXJyYXkgd2lsbCBvbmx5IGJlIHVzZWQgYnJpZWZseSB3aGlsZSBkYXRhIGlzIGJlaW5nIGJvdW5kLiAoSXQgaXMgcG9zc2libGUgdG9cbi8vIGNhdXNlIHRoZSBkYXRhIHRvIGNoYW5nZSB3aGlsZSBpdGVyYXRpbmcgYnkgdXNpbmcgYSBrZXkgZnVuY3Rpb24sIGJ1dCBwbGVhc2Vcbi8vIGRvbuKAmXQ7IHdl4oCZZCByYXRoZXIgYXZvaWQgYSBncmF0dWl0b3VzIGNvcHkuKVxuZnVuY3Rpb24gYXJyYXlsaWtlKGRhdGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIFwibGVuZ3RoXCIgaW4gZGF0YVxuICAgID8gZGF0YSAvLyBBcnJheSwgVHlwZWRBcnJheSwgTm9kZUxpc3QsIGFycmF5LWxpa2VcbiAgICA6IEFycmF5LmZyb20oZGF0YSk7IC8vIE1hcCwgU2V0LCBpdGVyYWJsZSwgc3RyaW5nLCBvciBhbnl0aGluZyBlbHNlXG59XG4iLCJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9leGl0IHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvbmVudGVyLCBvbnVwZGF0ZSwgb25leGl0KSB7XG4gIHZhciBlbnRlciA9IHRoaXMuZW50ZXIoKSwgdXBkYXRlID0gdGhpcywgZXhpdCA9IHRoaXMuZXhpdCgpO1xuICBpZiAodHlwZW9mIG9uZW50ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGVudGVyID0gb25lbnRlcihlbnRlcik7XG4gICAgaWYgKGVudGVyKSBlbnRlciA9IGVudGVyLnNlbGVjdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIGVudGVyID0gZW50ZXIuYXBwZW5kKG9uZW50ZXIgKyBcIlwiKTtcbiAgfVxuICBpZiAob251cGRhdGUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZSA9IG9udXBkYXRlKHVwZGF0ZSk7XG4gICAgaWYgKHVwZGF0ZSkgdXBkYXRlID0gdXBkYXRlLnNlbGVjdGlvbigpO1xuICB9XG4gIGlmIChvbmV4aXQgPT0gbnVsbCkgZXhpdC5yZW1vdmUoKTsgZWxzZSBvbmV4aXQoZXhpdCk7XG4gIHJldHVybiBlbnRlciAmJiB1cGRhdGUgPyBlbnRlci5tZXJnZSh1cGRhdGUpLm9yZGVyKCkgOiB1cGRhdGU7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICB2YXIgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dDtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAtMSwgbSA9IGdyb3Vwcy5sZW5ndGg7ICsraiA8IG07KSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSBncm91cC5sZW5ndGggLSAxLCBuZXh0ID0gZ3JvdXBbaV0sIG5vZGU7IC0taSA+PSAwOykge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBpZiAobmV4dCAmJiBub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5leHQpIF4gNCkgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTtcbiAgICAgICAgbmV4dCA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcGFyZSkge1xuICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmc7XG5cbiAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikge1xuICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJlKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHNvcnRncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNvcnRncm91cFtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvcnRncm91cC5zb3J0KGNvbXBhcmVOb2RlKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07XG4gIGFyZ3VtZW50c1swXSA9IHRoaXM7XG4gIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRoaXMpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07XG4gICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykgKytzaXplOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiBzaXplO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiAhdGhpcy5ub2RlKCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSBjYWxsYmFjay5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4uL25hbWVzcGFjZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHYpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTtcbiAgICByZXR1cm4gZnVsbG5hbWUubG9jYWxcbiAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbClcbiAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkpKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUpIHtcbiAgcmV0dXJuIChub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSAvLyBub2RlIGlzIGEgTm9kZVxuICAgICAgfHwgKG5vZGUuZG9jdW1lbnQgJiYgbm9kZSkgLy8gbm9kZSBpcyBhIFdpbmRvd1xuICAgICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50XG59XG4iLCJpbXBvcnQgZGVmYXVsdFZpZXcgZnJvbSBcIi4uL3dpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gICAgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICAgID8gc3R5bGVSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyBzdHlsZUZ1bmN0aW9uXG4gICAgICAgICAgICA6IHN0eWxlQ29uc3RhbnQpKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSlcbiAgICAgIDogc3R5bGVWYWx1ZSh0aGlzLm5vZGUoKSwgbmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHlsZVZhbHVlKG5vZGUsIG5hbWUpIHtcbiAgcmV0dXJuIG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKVxuICAgICAgfHwgZGVmYXVsdFZpZXcobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xufVxuIiwiZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgZGVsZXRlIHRoaXNbbmFtZV07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgIGVsc2UgdGhpc1tuYW1lXSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHByb3BlcnR5UmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHByb3BlcnR5RnVuY3Rpb25cbiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07XG59XG4iLCJmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnRyaW0oKS5zcGxpdCgvXnxcXHMrLyk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzTGlzdChub2RlKSB7XG4gIHJldHVybiBub2RlLmNsYXNzTGlzdCB8fCBuZXcgQ2xhc3NMaXN0KG5vZGUpO1xufVxuXG5mdW5jdGlvbiBDbGFzc0xpc3Qobm9kZSkge1xuICB0aGlzLl9ub2RlID0gbm9kZTtcbiAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIik7XG59XG5cbkNsYXNzTGlzdC5wcm90b3R5cGUgPSB7XG4gIGFkZDogZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIHRoaXMuX25hbWVzLnB1c2gobmFtZSk7XG4gICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuX25hbWVzLmpvaW4oXCIgXCIpKTtcbiAgICB9XG4gIH0sXG4gIHJlbW92ZTogZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5zcGxpY2UoaSwgMSk7XG4gICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuX25hbWVzLmpvaW4oXCIgXCIpKTtcbiAgICB9XG4gIH0sXG4gIGNvbnRhaW5zOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSkgPj0gMDtcbiAgfVxufTtcblxuZnVuY3Rpb24gY2xhc3NlZEFkZChub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5hZGQobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkUmVtb3ZlKG5vZGUsIG5hbWVzKSB7XG4gIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRUcnVlKG5hbWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBjbGFzc2VkQWRkKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZEZhbHNlKG5hbWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBjbGFzc2VkUmVtb3ZlKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKG5hbWVzLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgKHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgPyBjbGFzc2VkQWRkIDogY2xhc3NlZFJlbW92ZSkodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgbmFtZXMgPSBjbGFzc0FycmF5KG5hbWUgKyBcIlwiKTtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCh0aGlzLm5vZGUoKSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gY2xhc3NlZEZ1bmN0aW9uIDogdmFsdWVcbiAgICAgID8gY2xhc3NlZFRydWVcbiAgICAgIDogY2xhc3NlZEZhbHNlKShuYW1lcywgdmFsdWUpKTtcbn1cbiIsImZ1bmN0aW9uIHRleHRSZW1vdmUoKSB7XG4gIHRoaXMudGV4dENvbnRlbnQgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/IFwiXCIgOiB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gdGV4dFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdGV4dEZ1bmN0aW9uXG4gICAgICAgICAgOiB0ZXh0Q29uc3RhbnQpKHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7XG59XG4iLCJmdW5jdGlvbiBodG1sUmVtb3ZlKCkge1xuICB0aGlzLmlubmVySFRNTCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGh0bWxGdW5jdGlvblxuICAgICAgICAgIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLmlubmVySFRNTDtcbn1cbiIsImZ1bmN0aW9uIHJhaXNlKCkge1xuICBpZiAodGhpcy5uZXh0U2libGluZykgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyYWlzZSk7XG59XG4iLCJmdW5jdGlvbiBsb3dlcigpIHtcbiAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gobG93ZXIpO1xufVxuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9KTtcbn1cbiIsImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmZ1bmN0aW9uIGNvbnN0YW50TnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGJlZm9yZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpLFxuICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBlb2YgYmVmb3JlID09PSBcImZ1bmN0aW9uXCIgPyBiZWZvcmUgOiBzZWxlY3RvcihiZWZvcmUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBudWxsKTtcbiAgfSk7XG59XG4iLCJmdW5jdGlvbiByZW1vdmUoKSB7XG4gIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmVtb3ZlKTtcbn1cbiIsImZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZVNoYWxsb3coKSB7XG4gIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lRGVlcCgpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUodHJ1ZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGRlZXApIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwIDogc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLnByb3BlcnR5KFwiX19kYXRhX19cIiwgdmFsdWUpXG4gICAgICA6IHRoaXMubm9kZSgpLl9fZGF0YV9fO1xufVxuIiwiZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIHJldHVybiBmdW5jdGlvbihldmVudCkge1xuICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQsIHRoaXMuX19kYXRhX18pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uID0gdGhpcy5fX29uO1xuICAgIGlmICghb24pIHJldHVybjtcbiAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uWysraV0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO1xuICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25BZGQodHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gY29udGV4dExpc3RlbmVyKHZhbHVlKTtcbiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAoKG8gPSBvbltqXSkudHlwZSA9PT0gdHlwZW5hbWUudHlwZSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLm9wdGlvbnMgPSBvcHRpb25zKTtcbiAgICAgICAgby52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlbmFtZS50eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5lciwgb3B0aW9uczogb3B0aW9uc307XG4gICAgaWYgKCFvbikgdGhpcy5fX29uID0gW29dO1xuICAgIGVsc2Ugb24ucHVzaChvKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIpLCBpLCBuID0gdHlwZW5hbWVzLmxlbmd0aCwgdDtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGZvciAoaSA9IDAsIG8gPSBvbltqXTsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkge1xuICAgICAgICAgIHJldHVybiBvLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIG9uID0gdmFsdWUgPyBvbkFkZCA6IG9uUmVtb3ZlO1xuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgb3B0aW9ucykpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSwgdHlwZSwgcGFyYW1zKSB7XG4gIHZhciB3aW5kb3cgPSBkZWZhdWx0Vmlldyhub2RlKSxcbiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50O1xuXG4gIGlmICh0eXBlb2YgZXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGV2ZW50ID0gbmV3IGV2ZW50KHR5cGUsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgICBlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gZGlzcGF0Y2hGdW5jdGlvblxuICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJhbXMpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKigpIHtcbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHlpZWxkIG5vZGU7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgc2VsZWN0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCBmcm9tIFwiLi9zZWxlY3RDaGlsZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbiBmcm9tIFwiLi9zZWxlY3RDaGlsZHJlbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdGEgZnJvbSBcIi4vZGF0YS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbnRlciBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9leGl0IGZyb20gXCIuL2V4aXQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fam9pbiBmcm9tIFwiLi9qb2luLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29yZGVyIGZyb20gXCIuL29yZGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NvcnQgZnJvbSBcIi4vc29ydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jYWxsIGZyb20gXCIuL2NhbGwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZXMgZnJvbSBcIi4vbm9kZXMuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZSBmcm9tIFwiLi9ub2RlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NpemUgZnJvbSBcIi4vc2l6ZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbXB0eSBmcm9tIFwiLi9lbXB0eS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lYWNoIGZyb20gXCIuL2VhY2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3Byb3BlcnR5IGZyb20gXCIuL3Byb3BlcnR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NsYXNzZWQgZnJvbSBcIi4vY2xhc3NlZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faHRtbCBmcm9tIFwiLi9odG1sLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JhaXNlIGZyb20gXCIuL3JhaXNlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2xvd2VyIGZyb20gXCIuL2xvd2VyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2FwcGVuZCBmcm9tIFwiLi9hcHBlbmQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faW5zZXJ0IGZyb20gXCIuL2luc2VydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9yZW1vdmUgZnJvbSBcIi4vcmVtb3ZlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Nsb25lIGZyb20gXCIuL2Nsb25lLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdHVtIGZyb20gXCIuL2RhdHVtLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29uIGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Rpc3BhdGNoIGZyb20gXCIuL2Rpc3BhdGNoLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2l0ZXJhdG9yIGZyb20gXCIuL2l0ZXJhdG9yLmpzXCI7XG5cbmV4cG9ydCB2YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdGlvbihncm91cHMsIHBhcmVudHMpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLCByb290KTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdGlvbigpIHtcbiAgcmV0dXJuIHRoaXM7XG59XG5cblNlbGVjdGlvbi5wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogU2VsZWN0aW9uLFxuICBzZWxlY3Q6IHNlbGVjdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCxcbiAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLFxuICBkYXRhOiBzZWxlY3Rpb25fZGF0YSxcbiAgZW50ZXI6IHNlbGVjdGlvbl9lbnRlcixcbiAgZXhpdDogc2VsZWN0aW9uX2V4aXQsXG4gIGpvaW46IHNlbGVjdGlvbl9qb2luLFxuICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLFxuICBzZWxlY3Rpb246IHNlbGVjdGlvbl9zZWxlY3Rpb24sXG4gIG9yZGVyOiBzZWxlY3Rpb25fb3JkZXIsXG4gIHNvcnQ6IHNlbGVjdGlvbl9zb3J0LFxuICBjYWxsOiBzZWxlY3Rpb25fY2FsbCxcbiAgbm9kZXM6IHNlbGVjdGlvbl9ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX25vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9zaXplLFxuICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fZWFjaCxcbiAgYXR0cjogc2VsZWN0aW9uX2F0dHIsXG4gIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUsXG4gIHByb3BlcnR5OiBzZWxlY3Rpb25fcHJvcGVydHksXG4gIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLFxuICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCxcbiAgaHRtbDogc2VsZWN0aW9uX2h0bWwsXG4gIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsXG4gIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIsXG4gIGFwcGVuZDogc2VsZWN0aW9uX2FwcGVuZCxcbiAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LFxuICByZW1vdmU6IHNlbGVjdGlvbl9yZW1vdmUsXG4gIGNsb25lOiBzZWxlY3Rpb25fY2xvbmUsXG4gIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sXG4gIG9uOiBzZWxlY3Rpb25fb24sXG4gIGRpc3BhdGNoOiBzZWxlY3Rpb25fZGlzcGF0Y2gsXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25faXRlcmF0b3Jcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNlbGVjdGlvbjtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5pdGlvbikge1xuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTtcbiAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldO1xuICByZXR1cm4gcHJvdG90eXBlO1xufVxuIiwiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDb2xvcigpIHt9XG5cbmV4cG9ydCB2YXIgZGFya2VyID0gMC43O1xuZXhwb3J0IHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7XG5cbnZhciByZUkgPSBcIlxcXFxzKihbKy1dP1xcXFxkKylcXFxccypcIixcbiAgICByZU4gPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPylcXFxccypcIixcbiAgICByZVAgPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPyklXFxcXHMqXCIsXG4gICAgcmVIZXggPSAvXiMoWzAtOWEtZl17Myw4fSkkLyxcbiAgICByZVJnYkludGVnZXIgPSBuZXcgUmVnRXhwKGBecmdiXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfVxcXFwpJGApLFxuICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JhXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfSwke3JlTn1cXFxcKSRgKSxcbiAgICByZVJnYmFQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYmFcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9LCR7cmVOfVxcXFwpJGApLFxuICAgIHJlSHNsUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xcXFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xhXFxcXCgke3JlTn0sJHtyZVB9LCR7cmVQfSwke3JlTn1cXFxcKSRgKTtcblxudmFyIG5hbWVkID0ge1xuICBhbGljZWJsdWU6IDB4ZjBmOGZmLFxuICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LFxuICBhcXVhOiAweDAwZmZmZixcbiAgYXF1YW1hcmluZTogMHg3ZmZmZDQsXG4gIGF6dXJlOiAweGYwZmZmZixcbiAgYmVpZ2U6IDB4ZjVmNWRjLFxuICBiaXNxdWU6IDB4ZmZlNGM0LFxuICBibGFjazogMHgwMDAwMDAsXG4gIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCxcbiAgYmx1ZTogMHgwMDAwZmYsXG4gIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLFxuICBicm93bjogMHhhNTJhMmEsXG4gIGJ1cmx5d29vZDogMHhkZWI4ODcsXG4gIGNhZGV0Ymx1ZTogMHg1ZjllYTAsXG4gIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLFxuICBjaG9jb2xhdGU6IDB4ZDI2OTFlLFxuICBjb3JhbDogMHhmZjdmNTAsXG4gIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCxcbiAgY29ybnNpbGs6IDB4ZmZmOGRjLFxuICBjcmltc29uOiAweGRjMTQzYyxcbiAgY3lhbjogMHgwMGZmZmYsXG4gIGRhcmtibHVlOiAweDAwMDA4YixcbiAgZGFya2N5YW46IDB4MDA4YjhiLFxuICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYixcbiAgZGFya2dyYXk6IDB4YTlhOWE5LFxuICBkYXJrZ3JlZW46IDB4MDA2NDAwLFxuICBkYXJrZ3JleTogMHhhOWE5YTksXG4gIGRhcmtraGFraTogMHhiZGI3NmIsXG4gIGRhcmttYWdlbnRhOiAweDhiMDA4YixcbiAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLFxuICBkYXJrb3JhbmdlOiAweGZmOGMwMCxcbiAgZGFya29yY2hpZDogMHg5OTMyY2MsXG4gIGRhcmtyZWQ6IDB4OGIwMDAwLFxuICBkYXJrc2FsbW9uOiAweGU5OTY3YSxcbiAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZixcbiAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsXG4gIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLFxuICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZixcbiAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsXG4gIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLFxuICBkZWVwcGluazogMHhmZjE0OTMsXG4gIGRlZXBza3libHVlOiAweDAwYmZmZixcbiAgZGltZ3JheTogMHg2OTY5NjksXG4gIGRpbWdyZXk6IDB4Njk2OTY5LFxuICBkb2RnZXJibHVlOiAweDFlOTBmZixcbiAgZmlyZWJyaWNrOiAweGIyMjIyMixcbiAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLFxuICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsXG4gIGZ1Y2hzaWE6IDB4ZmYwMGZmLFxuICBnYWluc2Jvcm86IDB4ZGNkY2RjLFxuICBnaG9zdHdoaXRlOiAweGY4ZjhmZixcbiAgZ29sZDogMHhmZmQ3MDAsXG4gIGdvbGRlbnJvZDogMHhkYWE1MjAsXG4gIGdyYXk6IDB4ODA4MDgwLFxuICBncmVlbjogMHgwMDgwMDAsXG4gIGdyZWVueWVsbG93OiAweGFkZmYyZixcbiAgZ3JleTogMHg4MDgwODAsXG4gIGhvbmV5ZGV3OiAweGYwZmZmMCxcbiAgaG90cGluazogMHhmZjY5YjQsXG4gIGluZGlhbnJlZDogMHhjZDVjNWMsXG4gIGluZGlnbzogMHg0YjAwODIsXG4gIGl2b3J5OiAweGZmZmZmMCxcbiAga2hha2k6IDB4ZjBlNjhjLFxuICBsYXZlbmRlcjogMHhlNmU2ZmEsXG4gIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LFxuICBsYXduZ3JlZW46IDB4N2NmYzAwLFxuICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLFxuICBsaWdodGJsdWU6IDB4YWRkOGU2LFxuICBsaWdodGNvcmFsOiAweGYwODA4MCxcbiAgbGlnaHRjeWFuOiAweGUwZmZmZixcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLFxuICBsaWdodGdyYXk6IDB4ZDNkM2QzLFxuICBsaWdodGdyZWVuOiAweDkwZWU5MCxcbiAgbGlnaHRncmV5OiAweGQzZDNkMyxcbiAgbGlnaHRwaW5rOiAweGZmYjZjMSxcbiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLFxuICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSxcbiAgbGlnaHRza3libHVlOiAweDg3Y2VmYSxcbiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LFxuICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksXG4gIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSxcbiAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLFxuICBsaW1lOiAweDAwZmYwMCxcbiAgbGltZWdyZWVuOiAweDMyY2QzMixcbiAgbGluZW46IDB4ZmFmMGU2LFxuICBtYWdlbnRhOiAweGZmMDBmZixcbiAgbWFyb29uOiAweDgwMDAwMCxcbiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsXG4gIG1lZGl1bWJsdWU6IDB4MDAwMGNkLFxuICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLFxuICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLFxuICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsXG4gIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsXG4gIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSxcbiAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYyxcbiAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSxcbiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCxcbiAgbWludGNyZWFtOiAweGY1ZmZmYSxcbiAgbWlzdHlyb3NlOiAweGZmZTRlMSxcbiAgbW9jY2FzaW46IDB4ZmZlNGI1LFxuICBuYXZham93aGl0ZTogMHhmZmRlYWQsXG4gIG5hdnk6IDB4MDAwMDgwLFxuICBvbGRsYWNlOiAweGZkZjVlNixcbiAgb2xpdmU6IDB4ODA4MDAwLFxuICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLFxuICBvcmFuZ2U6IDB4ZmZhNTAwLFxuICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLFxuICBvcmNoaWQ6IDB4ZGE3MGQ2LFxuICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSxcbiAgcGFsZWdyZWVuOiAweDk4ZmI5OCxcbiAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsXG4gIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLFxuICBwYXBheWF3aGlwOiAweGZmZWZkNSxcbiAgcGVhY2hwdWZmOiAweGZmZGFiOSxcbiAgcGVydTogMHhjZDg1M2YsXG4gIHBpbms6IDB4ZmZjMGNiLFxuICBwbHVtOiAweGRkYTBkZCxcbiAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsXG4gIHB1cnBsZTogMHg4MDAwODAsXG4gIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LFxuICByZWQ6IDB4ZmYwMDAwLFxuICByb3N5YnJvd246IDB4YmM4ZjhmLFxuICByb3lhbGJsdWU6IDB4NDE2OWUxLFxuICBzYWRkbGVicm93bjogMHg4YjQ1MTMsXG4gIHNhbG1vbjogMHhmYTgwNzIsXG4gIHNhbmR5YnJvd246IDB4ZjRhNDYwLFxuICBzZWFncmVlbjogMHgyZThiNTcsXG4gIHNlYXNoZWxsOiAweGZmZjVlZSxcbiAgc2llbm5hOiAweGEwNTIyZCxcbiAgc2lsdmVyOiAweGMwYzBjMCxcbiAgc2t5Ymx1ZTogMHg4N2NlZWIsXG4gIHNsYXRlYmx1ZTogMHg2YTVhY2QsXG4gIHNsYXRlZ3JheTogMHg3MDgwOTAsXG4gIHNsYXRlZ3JleTogMHg3MDgwOTAsXG4gIHNub3c6IDB4ZmZmYWZhLFxuICBzcHJpbmdncmVlbjogMHgwMGZmN2YsXG4gIHN0ZWVsYmx1ZTogMHg0NjgyYjQsXG4gIHRhbjogMHhkMmI0OGMsXG4gIHRlYWw6IDB4MDA4MDgwLFxuICB0aGlzdGxlOiAweGQ4YmZkOCxcbiAgdG9tYXRvOiAweGZmNjM0NyxcbiAgdHVycXVvaXNlOiAweDQwZTBkMCxcbiAgdmlvbGV0OiAweGVlODJlZSxcbiAgd2hlYXQ6IDB4ZjVkZWIzLFxuICB3aGl0ZTogMHhmZmZmZmYsXG4gIHdoaXRlc21va2U6IDB4ZjVmNWY1LFxuICB5ZWxsb3c6IDB4ZmZmZjAwLFxuICB5ZWxsb3dncmVlbjogMHg5YWNkMzJcbn07XG5cbmRlZmluZShDb2xvciwgY29sb3IsIHtcbiAgY29weShjaGFubmVscykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLCBjaGFubmVscyk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7XG4gIH0sXG4gIGhleDogY29sb3JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IGNvbG9yX2Zvcm1hdEhleCxcbiAgZm9ybWF0SGV4ODogY29sb3JfZm9ybWF0SGV4OCxcbiAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsXG4gIGZvcm1hdFJnYjogY29sb3JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogY29sb3JfZm9ybWF0UmdiXG59KTtcblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4OCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIc2woKSB7XG4gIHJldHVybiBoc2xDb252ZXJ0KHRoaXMpLmZvcm1hdEhzbCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRSZ2IoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb2xvcihmb3JtYXQpIHtcbiAgdmFyIG0sIGw7XG4gIGZvcm1hdCA9IChmb3JtYXQgKyBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChtID0gcmVIZXguZXhlYyhmb3JtYXQpKSA/IChsID0gbVsxXS5sZW5ndGgsIG0gPSBwYXJzZUludChtWzFdLCAxNiksIGwgPT09IDYgPyByZ2JuKG0pIC8vICNmZjAwMDBcbiAgICAgIDogbCA9PT0gMyA/IG5ldyBSZ2IoKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSwgMSkgLy8gI2YwMFxuICAgICAgOiBsID09PSA4ID8gcmdiYShtID4+IDI0ICYgMHhmZiwgbSA+PiAxNiAmIDB4ZmYsIG0gPj4gOCAmIDB4ZmYsIChtICYgMHhmZikgLyAweGZmKSAvLyAjZmYwMDAwMDBcbiAgICAgIDogbCA9PT0gNCA/IHJnYmEoKG0gPj4gMTIgJiAweGYpIHwgKG0gPj4gOCAmIDB4ZjApLCAobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSkgLyAweGZmKSAvLyAjZjAwMFxuICAgICAgOiBudWxsKSAvLyBpbnZhbGlkIGhleFxuICAgICAgOiAobSA9IHJlUmdiSW50ZWdlci5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAwKVxuICAgICAgOiAobSA9IHJlUmdiUGVyY2VudC5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCAxKSAvLyByZ2IoMTAwJSwgMCUsIDAlKVxuICAgICAgOiAobSA9IHJlUmdiYUludGVnZXIuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSwgbVsyXSwgbVszXSwgbVs0XSkgLy8gcmdiYSgyNTUsIDAsIDAsIDEpXG4gICAgICA6IChtID0gcmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAwJSwgMCUsIDAlLCAxKVxuICAgICAgOiAobSA9IHJlSHNsUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCAxKSAvLyBoc2woMTIwLCA1MCUsIDUwJSlcbiAgICAgIDogKG0gPSByZUhzbGFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIG1bNF0pIC8vIGhzbGEoMTIwLCA1MCUsIDUwJSwgMSlcbiAgICAgIDogbmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4obmFtZWRbZm9ybWF0XSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIDogZm9ybWF0ID09PSBcInRyYW5zcGFyZW50XCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApXG4gICAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJnYm4obikge1xuICByZXR1cm4gbmV3IFJnYihuID4+IDE2ICYgMHhmZiwgbiA+PiA4ICYgMHhmZiwgbiAmIDB4ZmYsIDEpO1xufVxuXG5mdW5jdGlvbiByZ2JhKHIsIGcsIGIsIGEpIHtcbiAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOO1xuICByZXR1cm4gbmV3IFJnYihyLCBnLCBiLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYkNvbnZlcnQobykge1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBSZ2I7XG4gIG8gPSBvLnJnYigpO1xuICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICB0aGlzLnIgPSArcjtcbiAgdGhpcy5nID0gK2c7XG4gIHRoaXMuYiA9ICtiO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY2xhbXAoKSB7XG4gICAgcmV0dXJuIG5ldyBSZ2IoY2xhbXBpKHRoaXMuciksIGNsYW1waSh0aGlzLmcpLCBjbGFtcGkodGhpcy5iKSwgY2xhbXBhKHRoaXMub3BhY2l0eSkpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmcgJiYgdGhpcy5nIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuYiAmJiB0aGlzLmIgPCAyNTUuNSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgaGV4OiByZ2JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhleDg6IHJnYl9mb3JtYXRIZXg4LFxuICBmb3JtYXRSZ2I6IHJnYl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiXG59KSk7XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfWA7XG59XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXg4KCkge1xuICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX0ke2hleCgoaXNOYU4odGhpcy5vcGFjaXR5KSA/IDEgOiB0aGlzLm9wYWNpdHkpICogMjU1KX1gO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0UmdiKCkge1xuICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gIHJldHVybiBgJHthID09PSAxID8gXCJyZ2IoXCIgOiBcInJnYmEoXCJ9JHtjbGFtcGkodGhpcy5yKX0sICR7Y2xhbXBpKHRoaXMuZyl9LCAke2NsYW1waSh0aGlzLmIpfSR7YSA9PT0gMSA/IFwiKVwiIDogYCwgJHthfSlgfWA7XG59XG5cbmZ1bmN0aW9uIGNsYW1wYShvcGFjaXR5KSB7XG4gIHJldHVybiBpc05hTihvcGFjaXR5KSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBvcGFjaXR5KSk7XG59XG5cbmZ1bmN0aW9uIGNsYW1waSh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7XG59XG5cbmZ1bmN0aW9uIGhleCh2YWx1ZSkge1xuICB2YWx1ZSA9IGNsYW1waSh2YWx1ZSk7XG4gIHJldHVybiAodmFsdWUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyB2YWx1ZS50b1N0cmluZygxNik7XG59XG5cbmZ1bmN0aW9uIGhzbGEoaCwgcywgbCwgYSkge1xuICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47XG4gIGVsc2UgaWYgKGwgPD0gMCB8fCBsID49IDEpIGggPSBzID0gTmFOO1xuICBlbHNlIGlmIChzIDw9IDApIGggPSBOYU47XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbmV3IEhzbChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBIc2w7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbztcbiAgbyA9IG8ucmdiKCk7XG4gIHZhciByID0gby5yIC8gMjU1LFxuICAgICAgZyA9IG8uZyAvIDI1NSxcbiAgICAgIGIgPSBvLmIgLyAyNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgaCA9IE5hTixcbiAgICAgIHMgPSBtYXggLSBtaW4sXG4gICAgICBsID0gKG1heCArIG1pbikgLyAyO1xuICBpZiAocykge1xuICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O1xuICAgIGVsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtcbiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7XG4gICAgcyAvPSBsIDwgMC41ID8gbWF4ICsgbWluIDogMiAtIG1heCAtIG1pbjtcbiAgICBoICo9IDYwO1xuICB9IGVsc2Uge1xuICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoO1xuICB9XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMucyA9ICtzO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCxcbiAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLFxuICAgICAgICBsID0gdGhpcy5sLFxuICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLFxuICAgICAgICBtMSA9IDIgKiBsIC0gbTI7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICBoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGgsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH0sXG4gIGNsYW1wKCkge1xuICAgIHJldHVybiBuZXcgSHNsKGNsYW1waCh0aGlzLmgpLCBjbGFtcHQodGhpcy5zKSwgY2xhbXB0KHRoaXMubCksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLmwgJiYgdGhpcy5sIDw9IDEpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGZvcm1hdEhzbCgpIHtcbiAgICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gICAgcmV0dXJuIGAke2EgPT09IDEgPyBcImhzbChcIiA6IFwiaHNsYShcIn0ke2NsYW1waCh0aGlzLmgpfSwgJHtjbGFtcHQodGhpcy5zKSAqIDEwMH0lLCAke2NsYW1wdCh0aGlzLmwpICogMTAwfSUke2EgPT09IDEgPyBcIilcIiA6IGAsICR7YX0pYH1gO1xuICB9XG59KSk7XG5cbmZ1bmN0aW9uIGNsYW1waCh2YWx1ZSkge1xuICB2YWx1ZSA9ICh2YWx1ZSB8fCAwKSAlIDM2MDtcbiAgcmV0dXJuIHZhbHVlIDwgMCA/IHZhbHVlICsgMzYwIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNsYW1wdCh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdmFsdWUgfHwgMCkpO1xufVxuXG4vKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovXG5mdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikge1xuICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwXG4gICAgICA6IGggPCAxODAgPyBtMlxuICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MFxuICAgICAgOiBtMSkgKiAyNTU7XG59XG4iLCJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gbGluZWFyKGEsIGQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSArIHQgKiBkO1xuICB9O1xufVxuXG5mdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7XG4gIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHVlKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdhbW1hKHkpIHtcbiAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbChhLCBiLCB5KSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cbiIsImltcG9ydCB7cmdiIGFzIGNvbG9yUmdifSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCBiYXNpcyBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuaW1wb3J0IGJhc2lzQ2xvc2VkIGZyb20gXCIuL2Jhc2lzQ2xvc2VkLmpzXCI7XG5pbXBvcnQgbm9nYW1tYSwge2dhbW1hfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gcmdiR2FtbWEoeSkge1xuICB2YXIgY29sb3IgPSBnYW1tYSh5KTtcblxuICBmdW5jdGlvbiByZ2Ioc3RhcnQsIGVuZCkge1xuICAgIHZhciByID0gY29sb3IoKHN0YXJ0ID0gY29sb3JSZ2Ioc3RhcnQpKS5yLCAoZW5kID0gY29sb3JSZ2IoZW5kKSkuciksXG4gICAgICAgIGcgPSBjb2xvcihzdGFydC5nLCBlbmQuZyksXG4gICAgICAgIGIgPSBjb2xvcihzdGFydC5iLCBlbmQuYiksXG4gICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgc3RhcnQuciA9IHIodCk7XG4gICAgICBzdGFydC5nID0gZyh0KTtcbiAgICAgIHN0YXJ0LmIgPSBiKHQpO1xuICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgIH07XG4gIH1cblxuICByZ2IuZ2FtbWEgPSByZ2JHYW1tYTtcblxuICByZXR1cm4gcmdiO1xufSkoMSk7XG5cbmZ1bmN0aW9uIHJnYlNwbGluZShzcGxpbmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbG9ycykge1xuICAgIHZhciBuID0gY29sb3JzLmxlbmd0aCxcbiAgICAgICAgciA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgZyA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgYiA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgaSwgY29sb3I7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgY29sb3IgPSBjb2xvclJnYihjb2xvcnNbaV0pO1xuICAgICAgcltpXSA9IGNvbG9yLnIgfHwgMDtcbiAgICAgIGdbaV0gPSBjb2xvci5nIHx8IDA7XG4gICAgICBiW2ldID0gY29sb3IuYiB8fCAwO1xuICAgIH1cbiAgICByID0gc3BsaW5lKHIpO1xuICAgIGcgPSBzcGxpbmUoZyk7XG4gICAgYiA9IHNwbGluZShiKTtcbiAgICBjb2xvci5vcGFjaXR5ID0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgY29sb3IuciA9IHIodCk7XG4gICAgICBjb2xvci5nID0gZyh0KTtcbiAgICAgIGNvbG9yLmIgPSBiKHQpO1xuICAgICAgcmV0dXJuIGNvbG9yICsgXCJcIjtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIHJnYkJhc2lzID0gcmdiU3BsaW5lKGJhc2lzKTtcbmV4cG9ydCB2YXIgcmdiQmFzaXNDbG9zZWQgPSByZ2JTcGxpbmUoYmFzaXNDbG9zZWQpO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDtcbiAgfTtcbn1cbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbnZhciByZUEgPSAvWy0rXT8oPzpcXGQrXFwuP1xcZCp8XFwuP1xcZCspKD86W2VFXVstK10/XFxkKyk/L2csXG4gICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCBcImdcIik7XG5cbmZ1bmN0aW9uIHplcm8oYikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGI7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uZShiKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGIodCkgKyBcIlwiO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYVxuICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYlxuICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55XG4gICAgICBpID0gLTEsIC8vIGluZGV4IGluIHNcbiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG5cbiAgLy8gQ29lcmNlIGlucHV0cyB0byBzdHJpbmdzLlxuICBhID0gYSArIFwiXCIsIGIgPSBiICsgXCJcIjtcblxuICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLlxuICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpXG4gICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHtcbiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpO1xuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJzO1xuICAgIH1cbiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaFxuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJtO1xuICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzXG4gICAgICBzWysraV0gPSBudWxsO1xuICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIoYW0sIGJtKX0pO1xuICAgIH1cbiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7XG4gIH1cblxuICAvLyBBZGQgcmVtYWlucyBvZiBiLlxuICBpZiAoYmkgPCBiLmxlbmd0aCkge1xuICAgIGJzID0gYi5zbGljZShiaSk7XG4gICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgZWxzZSBzWysraV0gPSBicztcbiAgfVxuXG4gIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLlxuICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLlxuICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF1cbiAgICAgID8gb25lKHFbMF0ueClcbiAgICAgIDogemVybyhiKSlcbiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICAgICAgfSk7XG59XG4iLCJ2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSB7XG4gIHRyYW5zbGF0ZVg6IDAsXG4gIHRyYW5zbGF0ZVk6IDAsXG4gIHJvdGF0ZTogMCxcbiAgc2tld1g6IDAsXG4gIHNjYWxlWDogMSxcbiAgc2NhbGVZOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7XG4gIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDtcbiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYO1xuICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTtcbiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGVYOiBlLFxuICAgIHRyYW5zbGF0ZVk6IGYsXG4gICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcyxcbiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsXG4gICAgc2NhbGVYOiBzY2FsZVgsXG4gICAgc2NhbGVZOiBzY2FsZVlcbiAgfTtcbn1cbiIsImltcG9ydCBkZWNvbXBvc2UsIHtpZGVudGl0eX0gZnJvbSBcIi4vZGVjb21wb3NlLmpzXCI7XG5cbnZhciBzdmdOb2RlO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ3NzKHZhbHVlKSB7XG4gIGNvbnN0IG0gPSBuZXcgKHR5cGVvZiBET01NYXRyaXggPT09IFwiZnVuY3Rpb25cIiA/IERPTU1hdHJpeCA6IFdlYktpdENTU01hdHJpeCkodmFsdWUgKyBcIlwiKTtcbiAgcmV0dXJuIG0uaXNJZGVudGl0eSA/IGlkZW50aXR5IDogZGVjb21wb3NlKG0uYSwgbS5iLCBtLmMsIG0uZCwgbS5lLCBtLmYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdmcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTtcbiAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICBzdmdOb2RlLnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCB2YWx1ZSk7XG4gIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5O1xuICB2YWx1ZSA9IHZhbHVlLm1hdHJpeDtcbiAgcmV0dXJuIGRlY29tcG9zZSh2YWx1ZS5hLCB2YWx1ZS5iLCB2YWx1ZS5jLCB2YWx1ZS5kLCB2YWx1ZS5lLCB2YWx1ZS5mKTtcbn1cbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4uL251bWJlci5qc1wiO1xuaW1wb3J0IHtwYXJzZUNzcywgcGFyc2VTdmd9IGZyb20gXCIuL3BhcnNlLmpzXCI7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikge1xuXG4gIGZ1bmN0aW9uIHBvcChzKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArIFwiIFwiIDogXCJcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChcInRyYW5zbGF0ZShcIiwgbnVsbCwgcHhDb21tYSwgbnVsbCwgcHhQYXJlbik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7XG4gICAgICBzLnB1c2goXCJ0cmFuc2xhdGUoXCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aFxuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIsIG51bGwsIFwiLFwiLCBudWxsLCBcIilcIik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiArIHhiICsgXCIsXCIgKyB5YiArIFwiKVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG4gICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7XG4gICAgdHJhbnNsYXRlKGEudHJhbnNsYXRlWCwgYS50cmFuc2xhdGVZLCBiLnRyYW5zbGF0ZVgsIGIudHJhbnNsYXRlWSwgcywgcSk7XG4gICAgcm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7XG4gICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7XG4gICAgc2NhbGUoYS5zY2FsZVgsIGEuc2NhbGVZLCBiLnNjYWxlWCwgYi5zY2FsZVksIHMsIHEpO1xuICAgIGEgPSBiID0gbnVsbDsgLy8gZ2NcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlQ3NzLCBcInB4LCBcIiwgXCJweClcIiwgXCJkZWcpXCIpO1xuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlU3ZnLCBcIiwgXCIsIFwiKVwiLCBcIilcIik7XG4iLCJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKHVuZGVmaW5lZCwgZSk7XG4gICAgdCA9IHQuX25leHQ7XG4gIH1cbiAgLS1mcmFtZTtcbn1cblxuZnVuY3Rpb24gd2FrZSgpIHtcbiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3O1xuICBmcmFtZSA9IHRpbWVvdXQgPSAwO1xuICB0cnkge1xuICAgIHRpbWVyRmx1c2goKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcmFtZSA9IDA7XG4gICAgbmFwKCk7XG4gICAgY2xvY2tOb3cgPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBva2UoKSB7XG4gIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7XG4gIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7XG59XG5cbmZ1bmN0aW9uIG5hcCgpIHtcbiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5O1xuICB3aGlsZSAodDEpIHtcbiAgICBpZiAodDEuX2NhbGwpIHtcbiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTtcbiAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDtcbiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjtcbiAgICB9XG4gIH1cbiAgdGFza1RhaWwgPSB0MDtcbiAgc2xlZXAodGltZSk7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHtcbiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuXG4gIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB2YXIgZGVsYXkgPSB0aW1lIC0gY2xvY2tOb3c7IC8vIFN0cmljdGx5IGxlc3MgdGhhbiBpZiB3ZSByZWNvbXB1dGVkIGNsb2NrTm93LlxuICBpZiAoZGVsYXkgPiAyNCkge1xuICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHdha2UsIHRpbWUgLSBjbG9jay5ub3coKSAtIGNsb2NrU2tldyk7XG4gICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW50ZXJ2YWwpIGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpLCBpbnRlcnZhbCA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7XG4gICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtUaW1lcn0gZnJvbSBcIi4vdGltZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICBkZWxheSA9IGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5O1xuICB0LnJlc3RhcnQoZWxhcHNlZCA9PiB7XG4gICAgdC5zdG9wKCk7XG4gICAgY2FsbGJhY2soZWxhcHNlZCArIGRlbGF5KTtcbiAgfSwgZGVsYXksIHRpbWUpO1xuICByZXR1cm4gdDtcbn1cbiIsImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHt0aW1lciwgdGltZW91dH0gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBlbXB0eU9uID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImVuZFwiLCBcImNhbmNlbFwiLCBcImludGVycnVwdFwiKTtcbnZhciBlbXB0eVR3ZWVuID0gW107XG5cbmV4cG9ydCB2YXIgQ1JFQVRFRCA9IDA7XG5leHBvcnQgdmFyIFNDSEVEVUxFRCA9IDE7XG5leHBvcnQgdmFyIFNUQVJUSU5HID0gMjtcbmV4cG9ydCB2YXIgU1RBUlRFRCA9IDM7XG5leHBvcnQgdmFyIFJVTk5JTkcgPSA0O1xuZXhwb3J0IHZhciBFTkRJTkcgPSA1O1xuZXhwb3J0IHZhciBFTkRFRCA9IDY7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIGlkLCBpbmRleCwgZ3JvdXAsIHRpbWluZykge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9O1xuICBlbHNlIGlmIChpZCBpbiBzY2hlZHVsZXMpIHJldHVybjtcbiAgY3JlYXRlKG5vZGUsIGlkLCB7XG4gICAgbmFtZTogbmFtZSxcbiAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBvbjogZW1wdHlPbixcbiAgICB0d2VlbjogZW1wdHlUd2VlbixcbiAgICB0aW1lOiB0aW1pbmcudGltZSxcbiAgICBkZWxheTogdGltaW5nLmRlbGF5LFxuICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sXG4gICAgZWFzZTogdGltaW5nLmVhc2UsXG4gICAgdGltZXI6IG51bGwsXG4gICAgc3RhdGU6IENSRUFURURcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IENSRUFURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IFNUQVJURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZSB8fCAhKHNjaGVkdWxlID0gc2NoZWR1bGVbaWRdKSkgdGhyb3cgbmV3IEVycm9yKFwidHJhbnNpdGlvbiBub3QgZm91bmRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHR3ZWVuO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLlxuICAvLyBOb3RlIHRoZSBhY3R1YWwgZGVsYXkgaXMgbm90IGtub3duIHVudGlsIHRoZSBmaXJzdCBjYWxsYmFjayFcbiAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7XG4gIHNlbGYudGltZXIgPSB0aW1lcihzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTtcblxuICBmdW5jdGlvbiBzY2hlZHVsZShlbGFwc2VkKSB7XG4gICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRDtcbiAgICBzZWxmLnRpbWVyLnJlc3RhcnQoc3RhcnQsIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG5cbiAgICAvLyBJZiB0aGUgZWxhcHNlZCBkZWxheSBpcyBsZXNzIHRoYW4gb3VyIGZpcnN0IHNsZWVwLCBzdGFydCBpbW1lZGlhdGVseS5cbiAgICBpZiAoc2VsZi5kZWxheSA8PSBlbGFwc2VkKSBzdGFydChlbGFwc2VkIC0gc2VsZi5kZWxheSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7XG4gICAgdmFyIGksIGosIG4sIG87XG5cbiAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNDSEVEVUxFRCkgcmV0dXJuIHN0b3AoKTtcblxuICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICAgIG8gPSBzY2hlZHVsZXNbaV07XG4gICAgICBpZiAoby5uYW1lICE9PSBzZWxmLm5hbWUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBXaGlsZSB0aGlzIGVsZW1lbnQgYWxyZWFkeSBoYXMgYSBzdGFydGluZyB0cmFuc2l0aW9uIGR1cmluZyB0aGlzIGZyYW1lLFxuICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhXG4gICAgICAvLyBjaGFuY2UgdG8gdGljayAoYW5kIHBvc3NpYmx5IGVuZCk7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzU0IVxuICAgICAgaWYgKG8uc3RhdGUgPT09IFNUQVJURUQpIHJldHVybiB0aW1lb3V0KHN0YXJ0KTtcblxuICAgICAgLy8gSW50ZXJydXB0IHRoZSBhY3RpdmUgdHJhbnNpdGlvbiwgaWYgYW55LlxuICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiaW50ZXJydXB0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuXG4gICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuXG4gICAgICBlbHNlIGlmICgraSA8IGlkKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZlciB0aGUgZmlyc3QgdGljayB0byBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWU7IHNlZSBkMy9kMyMxNTc2LlxuICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgc2NoZWR1bGVkIGJlZm9yZSB0aGUgc3RhcnQgZXZlbnQ7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzE2IVxuICAgIC8vIEFzc3VtaW5nIHRoaXMgaXMgc3VjY2Vzc2Z1bCwgc3Vic2VxdWVudCBjYWxsYmFja3MgZ28gc3RyYWlnaHQgdG8gdGljay5cbiAgICB0aW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFNUQVJURUQpIHtcbiAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7XG4gICAgICAgIHNlbGYudGltZXIucmVzdGFydCh0aWNrLCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuICAgICAgICB0aWNrKGVsYXBzZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIHN0YXJ0IGV2ZW50LlxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSB0d2VlbiBhcmUgaW5pdGlhbGl6ZWQuXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJUSU5HO1xuICAgIHNlbGYub24uY2FsbChcInN0YXJ0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZFxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVEVEO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgdHdlZW4sIGRlbGV0aW5nIG51bGwgdHdlZW4uXG4gICAgdHdlZW4gPSBuZXcgQXJyYXkobiA9IHNlbGYudHdlZW4ubGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwLCBqID0gLTE7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChvID0gc2VsZi50d2VlbltpXS52YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApKSB7XG4gICAgICAgIHR3ZWVuWysral0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICB0d2Vlbi5sZW5ndGggPSBqICsgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkge1xuICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gdHdlZW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIHR3ZWVuW2ldLmNhbGwobm9kZSwgdCk7XG4gICAgfVxuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIGVuZCBldmVudC5cbiAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7XG4gICAgICBzZWxmLm9uLmNhbGwoXCJlbmRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgICBzdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICBzZWxmLnN0YXRlID0gRU5ERUQ7XG4gICAgc2VsZi50aW1lci5zdG9wKCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpZF07XG4gICAgZm9yICh2YXIgaSBpbiBzY2hlZHVsZXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHtTVEFSVElORywgRU5ESU5HLCBFTkRFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHNjaGVkdWxlLFxuICAgICAgYWN0aXZlLFxuICAgICAgZW1wdHkgPSB0cnVlLFxuICAgICAgaTtcblxuICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuO1xuXG4gIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG5cbiAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsgZW1wdHkgPSBmYWxzZTsgY29udGludWU7IH1cbiAgICBhY3RpdmUgPSBzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HICYmIHNjaGVkdWxlLnN0YXRlIDwgRU5ESU5HO1xuICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7XG4gICAgc2NoZWR1bGUudGltZXIuc3RvcCgpO1xuICAgIHNjaGVkdWxlLm9uLmNhbGwoYWN0aXZlID8gXCJpbnRlcnJ1cHRcIiA6IFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNjaGVkdWxlLmluZGV4LCBzY2hlZHVsZS5ncm91cCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgfVxuXG4gIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xufVxuIiwiaW1wb3J0IGludGVycnVwdCBmcm9tIFwiLi4vaW50ZXJydXB0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICBpbnRlcnJ1cHQodGhpcywgbmFtZSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gdHdlZW5SZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpO1xuICAgICAgICAgIHR3ZWVuMS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHdlZW5GdW5jdGlvbihpZCwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSAodHdlZW4wID0gdHdlZW4pLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciB0ID0ge25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0sIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjFbaV0gPSB0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA9PT0gbikgdHdlZW4xLnB1c2godCk7XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIG5hbWUgKz0gXCJcIjtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgdHdlZW4gPSBnZXQodGhpcy5ub2RlKCksIGlkKS50d2VlbjtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuLmxlbmd0aCwgdDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbCA/IHR3ZWVuUmVtb3ZlIDogdHdlZW5GdW5jdGlvbikoaWQsIG5hbWUsIHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0d2VlblZhbHVlKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkO1xuXG4gIHRyYW5zaXRpb24uZWFjaChmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpO1xuICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gZ2V0KG5vZGUsIGlkKS52YWx1ZVtuYW1lXTtcbiAgfTtcbn1cbiIsImltcG9ydCB7Y29sb3J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZU51bWJlciwgaW50ZXJwb2xhdGVSZ2IsIGludGVycG9sYXRlU3RyaW5nfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYztcbiAgcmV0dXJuICh0eXBlb2YgYiA9PT0gXCJudW1iZXJcIiA/IGludGVycG9sYXRlTnVtYmVyXG4gICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IGludGVycG9sYXRlUmdiXG4gICAgICA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYilcbiAgICAgIDogaW50ZXJwb2xhdGVTdHJpbmcpKGEsIGIpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge25hbWVzcGFjZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSksIGkgPSBmdWxsbmFtZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbikoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgXCJhdHRyLlwiICsgbmFtZSwgdmFsdWUpKVxuICAgICAgOiB2YWx1ZSA9PSBudWxsID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkoZnVsbG5hbWUpXG4gICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KShmdWxsbmFtZSwgaSwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clR3ZWVuTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW4obmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGUobmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBrZXkgPSBcImF0dHIuXCIgKyBuYW1lO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCAoZnVsbG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2VlbikoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge2dldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlbGF5Q29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZGVsYXlGdW5jdGlvblxuICAgICAgICAgIDogZGVsYXlDb25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZGVsYXk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkdXJhdGlvbkNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZHVyYXRpb25GdW5jdGlvblxuICAgICAgICAgIDogZHVyYXRpb25Db25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZHVyYXRpb247XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZWFzZTtcbn1cbiIsImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlVmFyeWluZyhpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodHlwZW9mIHYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy5lYWNoKGVhc2VWYXJ5aW5nKHRoaXMuX2lkLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHttYXRjaGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHtcbiAgaWYgKHRyYW5zaXRpb24uX2lkICE9PSB0aGlzLl9pZCkgdGhyb3cgbmV3IEVycm9yO1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHtcbiAgcmV0dXJuIChuYW1lICsgXCJcIikudHJpbSgpLnNwbGl0KC9efFxccysvKS5ldmVyeShmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiAhdCB8fCB0ID09PSBcInN0YXJ0XCI7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgb24wLCBvbjEsIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjApIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24obmFtZSwgbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMlxuICAgICAgPyBnZXQodGhpcy5ub2RlKCksIGlkKS5vbi5vbihuYW1lKVxuICAgICAgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fX3RyYW5zaXRpb24pIGlmICgraSAhPT0gaWQpIHJldHVybjtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5vbihcImVuZC5yZW1vdmVcIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0b3J9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICAgIHNjaGVkdWxlKHN1Ymdyb3VwW2ldLCBuYW1lLCBpZCwgaSwgc3ViZ3JvdXAsIGdldChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0b3JBbGx9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBmb3IgKHZhciBjaGlsZHJlbiA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSwgY2hpbGQsIGluaGVyaXQgPSBnZXQobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykge1xuICAgICAgICAgIGlmIChjaGlsZCA9IGNoaWxkcmVuW2tdKSB7XG4gICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxudmFyIFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9ncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3N0eWxlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZU51bGwobmFtZSwgaW50ZXJwb2xhdGUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICBzdHJpbmcxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgc3RyaW5nMTAgPSBzdHJpbmcxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSxcbiAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSBzdHJpbmcxID0gdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlTWF5YmVSZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIG9uMCwgb24xLCBsaXN0ZW5lcjAsIGtleSA9IFwic3R5bGUuXCIgKyBuYW1lLCBldmVudCA9IFwiZW5kLlwiICsga2V5LCByZW1vdmU7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uLFxuICAgICAgICBsaXN0ZW5lciA9IHNjaGVkdWxlLnZhbHVlW2tleV0gPT0gbnVsbCA/IHJlbW92ZSB8fCAocmVtb3ZlID0gc3R5bGVSZW1vdmUobmFtZSkpIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wIHx8IGxpc3RlbmVyMCAhPT0gbGlzdGVuZXIpIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24oZXZlbnQsIGxpc3RlbmVyMCA9IGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGkgPSAobmFtZSArPSBcIlwiKSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVOdWxsKG5hbWUsIGkpKVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgc3R5bGVSZW1vdmUobmFtZSkpXG4gICAgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlRnVuY3Rpb24obmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcInN0eWxlLlwiICsgbmFtZSwgdmFsdWUpKSlcbiAgICAgIC5lYWNoKHN0eWxlTWF5YmVSZW1vdmUodGhpcy5faWQsIG5hbWUpKVxuICAgIDogdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVDb25zdGFudChuYW1lLCBpLCB2YWx1ZSksIHByaW9yaXR5KVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgbnVsbCk7XG59XG4iLCJmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIHQsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0ID0gKGkwID0gaSkgJiYgc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSk7XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBrZXkgPSBcInN0eWxlLlwiICsgKG5hbWUgKz0gXCJcIik7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSk7XG59XG4iLCJpbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWUxID09IG51bGwgPyBcIlwiIDogdmFsdWUxO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdGhpcy50d2VlbihcInRleHRcIiwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gdGV4dEZ1bmN0aW9uKHR3ZWVuVmFsdWUodGhpcywgXCJ0ZXh0XCIsIHZhbHVlKSlcbiAgICAgIDogdGV4dENvbnN0YW50KHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiKSk7XG59XG4iLCJmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGUoaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSBpLmNhbGwodGhpcywgdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRUd2Vlbih2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIHRleHRJbnRlcnBvbGF0ZShpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGtleSA9IFwidGV4dFwiO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgdGV4dFR3ZWVuKHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQwID0gdGhpcy5faWQsXG4gICAgICBpZDEgPSBuZXdJZCgpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHZhciBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkMCk7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkMSwgaSwgZ3JvdXAsIHtcbiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBkZWxheTogMCxcbiAgICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTtcbn1cbiIsImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG9uMCwgb24xLCB0aGF0ID0gdGhpcywgaWQgPSB0aGF0Ll9pZCwgc2l6ZSA9IHRoYXQuc2l6ZSgpO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIGNhbmNlbCA9IHt2YWx1ZTogcmVqZWN0fSxcbiAgICAgICAgZW5kID0ge3ZhbHVlOiBmdW5jdGlvbigpIHsgaWYgKC0tc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpOyB9fTtcblxuICAgIHRoYXQuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjtcblxuICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICAgIGlmIChvbiAhPT0gb24wKSB7XG4gICAgICAgIG9uMSA9IChvbjAgPSBvbikuY29weSgpO1xuICAgICAgICBvbjEuXy5jYW5jZWwucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5pbnRlcnJ1cHQucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5lbmQucHVzaChlbmQpO1xuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBzZWxlY3Rpb24gd2FzIGVtcHR5LCByZXNvbHZlIGVuZCBpbW1lZGlhdGVseVxuICAgIGlmIChzaXplID09PSAwKSByZXNvbHZlKCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHIgZnJvbSBcIi4vYXR0ci5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0clR3ZWVuIGZyb20gXCIuL2F0dHJUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZGVsYXkgZnJvbSBcIi4vZGVsYXkuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2R1cmF0aW9uIGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlIGZyb20gXCIuL2Vhc2UuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nIGZyb20gXCIuL2Vhc2VWYXJ5aW5nLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9tZXJnZSBmcm9tIFwiLi9tZXJnZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdEFsbCBmcm9tIFwiLi9zZWxlY3RBbGwuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdGlvbiBmcm9tIFwiLi9zZWxlY3Rpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zdHlsZVR3ZWVuIGZyb20gXCIuL3N0eWxlVHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dFR3ZWVuIGZyb20gXCIuL3RleHRUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90d2VlbiBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZW5kIGZyb20gXCIuL2VuZC5qc1wiO1xuXG52YXIgaWQgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gVHJhbnNpdGlvbihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7XG4gIHRoaXMuX2dyb3VwcyA9IGdyb3VwcztcbiAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7XG4gIHRoaXMuX25hbWUgPSBuYW1lO1xuICB0aGlzLl9pZCA9IGlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2l0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHNlbGVjdGlvbigpLnRyYW5zaXRpb24obmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdJZCgpIHtcbiAgcmV0dXJuICsraWQ7XG59XG5cbnZhciBzZWxlY3Rpb25fcHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZTtcblxuVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB0cmFuc2l0aW9uLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sXG4gIHNlbGVjdDogdHJhbnNpdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogdHJhbnNpdGlvbl9zZWxlY3RBbGwsXG4gIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3Byb3RvdHlwZS5zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiB0cmFuc2l0aW9uX2ZpbHRlcixcbiAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogdHJhbnNpdGlvbl9zZWxlY3Rpb24sXG4gIHRyYW5zaXRpb246IHRyYW5zaXRpb25fdHJhbnNpdGlvbixcbiAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlLFxuICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fcHJvdG90eXBlLmVtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fcHJvdG90eXBlLmVhY2gsXG4gIG9uOiB0cmFuc2l0aW9uX29uLFxuICBhdHRyOiB0cmFuc2l0aW9uX2F0dHIsXG4gIGF0dHJUd2VlbjogdHJhbnNpdGlvbl9hdHRyVHdlZW4sXG4gIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLFxuICBzdHlsZVR3ZWVuOiB0cmFuc2l0aW9uX3N0eWxlVHdlZW4sXG4gIHRleHQ6IHRyYW5zaXRpb25fdGV4dCxcbiAgdGV4dFR3ZWVuOiB0cmFuc2l0aW9uX3RleHRUd2VlbixcbiAgcmVtb3ZlOiB0cmFuc2l0aW9uX3JlbW92ZSxcbiAgdHdlZW46IHRyYW5zaXRpb25fdHdlZW4sXG4gIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LFxuICBkdXJhdGlvbjogdHJhbnNpdGlvbl9kdXJhdGlvbixcbiAgZWFzZTogdHJhbnNpdGlvbl9lYXNlLFxuICBlYXNlVmFyeWluZzogdHJhbnNpdGlvbl9lYXNlVmFyeWluZyxcbiAgZW5kOiB0cmFuc2l0aW9uX2VuZCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXVxufTtcbiIsImV4cG9ydCBmdW5jdGlvbiBjdWJpY0luKHQpIHtcbiAgcmV0dXJuIHQgKiB0ICogdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljT3V0KHQpIHtcbiAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCAqIHQgOiAodCAtPSAyKSAqIHQgKiB0ICsgMikgLyAyO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4uL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHtlYXNlQ3ViaWNJbk91dH0gZnJvbSBcImQzLWVhc2VcIjtcbmltcG9ydCB7bm93fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGRlZmF1bHRUaW1pbmcgPSB7XG4gIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuXG4gIGRlbGF5OiAwLFxuICBkdXJhdGlvbjogMjUwLFxuICBlYXNlOiBlYXNlQ3ViaWNJbk91dFxufTtcblxuZnVuY3Rpb24gaW5oZXJpdChub2RlLCBpZCkge1xuICB2YXIgdGltaW5nO1xuICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkge1xuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zaXRpb24gJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aW1pbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGlkLFxuICAgICAgdGltaW5nO1xuXG4gIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikge1xuICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lO1xuICB9IGVsc2Uge1xuICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmcpLnRpbWUgPSBub3coKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnRlcnJ1cHQgZnJvbSBcIi4vaW50ZXJydXB0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RyYW5zaXRpb24gZnJvbSBcIi4vdHJhbnNpdGlvbi5qc1wiO1xuXG5zZWxlY3Rpb24ucHJvdG90eXBlLmludGVycnVwdCA9IHNlbGVjdGlvbl9pbnRlcnJ1cHQ7XG5zZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbjtcbiIsImV4cG9ydCBmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkge1xuICB0aGlzLmsgPSBrO1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLFxuICBzY2FsZTogZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBrID09PSAxID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rICogaywgdGhpcy54LCB0aGlzLnkpO1xuICB9LFxuICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICByZXR1cm4gW3BvaW50WzBdICogdGhpcy5rICsgdGhpcy54LCBwb2ludFsxXSAqIHRoaXMuayArIHRoaXMueV07XG4gIH0sXG4gIGFwcGx5WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54O1xuICB9LFxuICBhcHBseVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbihsb2NhdGlvbikge1xuICAgIHJldHVybiBbKGxvY2F0aW9uWzBdIC0gdGhpcy54KSAvIHRoaXMuaywgKGxvY2F0aW9uWzFdIC0gdGhpcy55KSAvIHRoaXMua107XG4gIH0sXG4gIGludmVydFg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gKHggLSB0aGlzLngpIC8gdGhpcy5rO1xuICB9LFxuICBpbnZlcnRZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuaztcbiAgfSxcbiAgcmVzY2FsZVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geC5jb3B5KCkuZG9tYWluKHgucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLCB0aGlzKS5tYXAoeC5pbnZlcnQsIHgpKTtcbiAgfSxcbiAgcmVzY2FsZVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geS5jb3B5KCkuZG9tYWluKHkucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLCB0aGlzKS5tYXAoeS5pbnZlcnQsIHkpKTtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIHRoaXMueCArIFwiLFwiICsgdGhpcy55ICsgXCIpIHNjYWxlKFwiICsgdGhpcy5rICsgXCIpXCI7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSBuZXcgVHJhbnNmb3JtKDEsIDAsIDApO1xuXG50cmFuc2Zvcm0ucHJvdG90eXBlID0gVHJhbnNmb3JtLnByb3RvdHlwZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUpIHtcbiAgd2hpbGUgKCFub2RlLl9fem9vbSkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIG5vZGUuX196b29tO1xufVxuIiwiXG4vKlxuICBIVERNYXRoIFN0YXRpYyBDbGFzcyAtIE5vdCBpbnRlbmRlZCBmb3IgaW5zdGFudGlhdGlvbiFcblxuICBNb2RlbCBwYXJhbWV0ZXJzOlxuICAgIGsgPSBkaXNjb3VudCBmYWN0b3IgKDAsIEluZmluaXR5KVxuXG4gIEJlaGF2aW9yYWwgdmFyaWFibGVzOlxuICAgIEEgPSBhbW91bnRcbiAgICBEID0gZGVsYXlcbiAgICBWID0gc3ViamVjdGl2ZSB2YWx1ZVxuXG4gIEVxdWF0aW9uczpcbiAgICBWID0gQSAvICgxICsga0QpXG4gICAgayA9IChBIC0gVikgLyAoVkQpXG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSFRETWF0aCB7XG4gIHN0YXRpYyBrID0ge1xuICAgIERFRkFVTFQ6IDAuMDUsXG4gICAgTUlOOiAwLFxuICAgIE1BWDogMTAwLFxuICAgIFNURVA6IDAuMDAxLFxuICAgIEpVTVA6IDAuMDEsXG4gIH07XG5cbiAgc3RhdGljIGFkazJ2KGEsIGQsIGspIHtcbiAgICByZXR1cm4gYSAvICgxICsgayAqIGQpO1xuICB9XG5cbiAgc3RhdGljIGFkdjJrKGEsIGQsIHYpIHtcbiAgICByZXR1cm4gKGEgLSB2KSAvICh2ICogZCk7XG4gIH1cbn1cbiIsIlxuLy8gSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG5pbXBvcnQgSFRETWF0aCBmcm9tICcuL2h0ZC1tYXRoJztcblxuZXhwb3J0IGRlZmF1bHQgSFRETWF0aDtcbiIsIi8qIGVzbGludCBuby1yZXN0cmljdGVkLWdsb2JhbHM6IFtcIm9mZlwiLCBcInNlbGZcIl0gKi9cblxuLy8gTmVlZGVkIGZvciBkMyBpbiBXZWJXb3JrZXIhXG5pbXBvcnQgJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZSc7XG5cbmltcG9ydCAqIGFzIEJheWVzRGlzdHJpYnV0aW9ucyBmcm9tICdiYXllcy5qcy9kaXN0cmlidXRpb25zJztcbmltcG9ydCAqIGFzIEJheWVzTWNtYyBmcm9tICdiYXllcy5qcy9tY21jJztcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCBIVERNYXRoIGZyb20gJ0BkZWNpZGFibGVzL2Rpc2NvdW50YWJsZS1tYXRoJztcblxuc2VsZi5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIGs6IHt0eXBlOiAncmVhbCcsIGxvd2VyOiBIVERNYXRoLmsuTUlOLCB1cHBlcjogSFRETWF0aC5rLk1BWH0sXG4gICAgbHVjZToge3R5cGU6ICdyZWFsJywgbG93ZXI6IDAsIHVwcGVyOiAxMDB9LFxuICB9O1xuXG4gIGNvbnN0IGxvZ1Bvc3QgPSAoc3RhdGUsIGRhdGEpID0+IHtcbiAgICBsZXQgbHAgPSAwO1xuXG4gICAgLy8gUHJpb3JzXG4gICAgY29uc3Qga01lYW4gPSAyO1xuICAgIGNvbnN0IGtTaGFwZSA9IDM7XG4gICAgbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLmdhbW1hKFxuICAgICAgc3RhdGUuayxcbiAgICAgIGtTaGFwZSxcbiAgICAgIGtTaGFwZSAvIGtNZWFuLFxuICAgICk7XG4gICAgLy8gbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLnVuaWYoc3RhdGUuaywgMCwgMTAwKTtcblxuICAgIGNvbnN0IGx1Y2VNZWFuID0gMjtcbiAgICBjb25zdCBsdWNlU2hhcGUgPSAzO1xuICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5nYW1tYShcbiAgICAgIHN0YXRlLmx1Y2UsXG4gICAgICBsdWNlU2hhcGUsXG4gICAgICBsdWNlU2hhcGUgLyBsdWNlTWVhbixcbiAgICApO1xuICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7XG5cbiAgICAvLyBMaWtlbGlob29kXG4gICAgZGF0YS5mb3JFYWNoKChjaG9pY2UpID0+IHtcbiAgICAgIC8vIFZhbHVlc1xuICAgICAgY29uc3QgdnMgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hcywgY2hvaWNlLmRzLCBzdGF0ZS5rKTtcbiAgICAgIGNvbnN0IHZsID0gSFRETWF0aC5hZGsydihjaG9pY2UuYWwsIGNob2ljZS5kbCwgc3RhdGUuayk7XG5cbiAgICAgIC8vIENob2ljZSBvZiBzb29uZXIgb3IgbGF0ZXIgaXMgc2FtcGxlZCBmcm9tIGEgQmVybm91bGxpIGRpc3RyaWJ1dGlvblxuICAgICAgLy8gTHVjZSBjaG9pY2UgcnVsZSBpcyB1c2VkIHRvIGNvbXB1dGUgcHJvYmFiaWxpdHkgb2Ygd2FpdGluZyEgKDAgPSBzb29uZXIsIDEgPSBsYXRlcilcbiAgICAgIGNvbnN0IGJpbnZhbCA9IDEgLyAoMSArIE1hdGguZXhwKHN0YXRlLmx1Y2UgKiAodnMgLSB2bCkpKTtcblxuICAgICAgLy8gQWN0dWFsIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZSA9IChjaG9pY2UucmVzcG9uc2UgPT09ICdmaXJzdCcpID8gMCA6IDE7XG5cbiAgICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5iZXJuKHJlc3BvbnNlLCBiaW52YWwpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxwO1xuICB9O1xuXG4gIC8vIEluaXRpYWxpemluZyB0aGUgc2FtcGxlclxuICBjb25zdCBzYW1wbGVyID0gbmV3IEJheWVzTWNtYy5BbXdnU2FtcGxlcihwYXJhbXMsIGxvZ1Bvc3QsIGV2ZW50LmRhdGEpO1xuICAvLyBCdXJuaW5nIHNvbWUgc2FtcGxlcyB0byB0aGUgTUNNQyBnb2RzIGFuZCBzYW1wbGluZyA1MDAwIGRyYXdzXG4gIHNhbXBsZXIuYnVybigxMDAwKTtcbiAgY29uc3Qgc2FtcGxlcyA9IHNhbXBsZXIuc2FtcGxlKDUwMDApO1xuXG4gIC8vIEV4dHJhY3Qgc3VtbWFyeSBzdGF0c1xuICBjb25zdCByZXN1bHRzID0ge1xuICAgIGs6IGQzLm1lZGlhbihzYW1wbGVzLmspLFxuICAgIGx1Y2U6IGQzLm1lZGlhbihzYW1wbGVzLmx1Y2UpLFxuICB9O1xuXG4gIHNlbGYucG9zdE1lc3NhZ2Uoe3Jlc3VsdHM6IHJlc3VsdHMsIHNhbXBsZXM6IHNhbXBsZXN9KTtcbn07XG4iXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJtb2R1bGUiLCJleHBvcnRzIiwibGQiLCJ0aGlzIiwibGdhbW1hIiwieCIsImoiLCJjb2YiLCJzZXIiLCJ4eCIsInkiLCJ0bXAiLCJsb2ciLCJsZmFjdG9yaWFsIiwibiIsIk5hTiIsImxjaG9vc2UiLCJrIiwibGJldGEiLCJhIiwiYiIsIk1hdGgiLCJleHAiLCJhYnMiLCJwb3ciLCJzcXJ0IiwicGkiLCJQSSIsImJldGEiLCJzaGFwZTEiLCJzaGFwZTIiLCJJbmZpbml0eSIsImNhdWNoeSIsImxvY2F0aW9uIiwic2NhbGUiLCJub3JtIiwibWVhbiIsInNkIiwiYml2YXJub3JtIiwiY29yciIsInoiLCJub3JtYWxpemluZ19mYWN0b3IiLCJiaXZhcl9sb2dfZGVucyIsImxhcGxhY2UiLCJkZXhwIiwiZ2FtbWEiLCJzaGFwZSIsInJhdGUiLCJpbnZnYW1tYSIsImxub3JtIiwibWVhbmxvZyIsInNkbG9nIiwicGFyZXRvIiwidCIsImRmIiwid2VpYnVsbCIsInRtcDEiLCJ0bXAyIiwibG9naXMiLCJlIiwiZiIsImRpcmljaGxldCIsImFscGhhIiwic3VtX2FscGhhIiwic3VtX2xnYW1tYV9hbHBoYSIsInN1bV9hbHBoYV9zdWJfMV9sb2dfeCIsImxlbmd0aCIsImkiLCJ1bmlmIiwibWluIiwibWF4IiwiYmVybiIsInByb2IiLCJjYXQiLCJwcm9icyIsImJpbm9tIiwic2l6ZSIsIm5iaW5vbSIsImh5cGVyIiwibSIsInBvaXMiLCJsYW1iZGEiLCJtY21jIiwicnVuaWYiLCJyYW5kb20iLCJydW5pZl9kaXNjcmV0ZSIsImZsb29yIiwicm5vcm0iLCJ1IiwidiIsInEiLCJkZWVwX2Nsb25lIiwic3JjIiwibWl4aW4iLCJkZXN0Iiwic291cmNlIiwiY29weUZ1bmMiLCJuYW1lIiwicyIsImVtcHR5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwibm9kZVR5cGUiLCJjbG9uZU5vZGUiLCJEYXRlIiwiZ2V0VGltZSIsIlJlZ0V4cCIsInIiLCJsIiwiQXJyYXkiLCJwdXNoIiwiY29uc3RydWN0b3IiLCJjbG9uZV9wYXJhbV9kcmF3IiwiaXNBcnJheSIsInhfY29weSIsInNsaWNlIiwiaXNfbnVtYmVyIiwib2JqZWN0IiwiTnVtYmVyIiwiY3JlYXRlX2FycmF5IiwiZGltIiwiaW5pdCIsImFyciIsImFycmF5X2RpbSIsImNvbmNhdCIsImFycmF5X2VxdWFsIiwiYTEiLCJhMiIsIm5lc3RlZF9hcnJheV9hcHBseSIsImZ1biIsInJlc3VsdCIsInNodWZmbGVfYXJyYXkiLCJhcnJheSIsInRlbXAiLCJuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5IiwibGVuIiwiYXJyYXlfaXMiLCJhcnJheV9pIiwiZ2V0X29wdGlvbiIsIm9wdGlvbl9uYW1lIiwib3B0aW9ucyIsImRlZmF1bF92YWx1ZSIsImhhc093blByb3BlcnR5IiwidW5kZWZpbmVkIiwiZ2V0X211bHRpZGltX29wdGlvbiIsInZhbHVlIiwicGFyYW1faW5pdF9maXhlZCIsInR5cGUiLCJsb3dlciIsInVwcGVyIiwicm91bmQiLCJjb21wbGV0ZV9wYXJhbXMiLCJwYXJhbXNfdG9fY29tcGxldGUiLCJwYXJhbV9pbml0IiwicGFyYW1zIiwicGFyYW1fbmFtZSIsInBhcmFtIiwiU3RlcHBlciIsInN0YXRlIiwibG9nX3Bvc3QiLCJzdGVwIiwic3RhcnRfYWRhcHRhdGlvbiIsInN0b3BfYWRhcHRhdGlvbiIsImluZm8iLCJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciIsImdlbmVyYXRlX3Byb3Bvc2FsIiwicGFyYW1fbmFtZXMiLCJrZXlzIiwicHJvcF9sb2dfc2NhbGUiLCJiYXRjaF9zaXplIiwibWF4X2FkYXB0YXRpb24iLCJpbml0aWFsX2FkYXB0YXRpb24iLCJ0YXJnZXRfYWNjZXB0X3JhdGUiLCJpc19hZGFwdGluZyIsImFjY2VwdGFuY2VfY291bnQiLCJiYXRjaF9jb3VudCIsIml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24iLCJjcmVhdGUiLCJwYXJhbV9zdGF0ZSIsInBhcmFtX3Byb3Bvc2FsIiwiY3Vycl9sb2dfZGVucyIsInByb3BfbG9nX2RlbnMiLCJhY2NlcHRfcHJvYiIsImxvZ19zZF9hZGp1c3RtZW50Iiwibm9ybWFsX3Byb3Bvc2FsIiwiUmVhbE1ldHJvcG9saXNTdGVwcGVyIiwiZGlzY3JldGVfbm9ybWFsX3Byb3Bvc2FsIiwiSW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiU3ViU3RlcHBlciIsImNyZWF0ZV9zdWJzdGVwcGVycyIsInN1YnN0YXRlIiwic3Vic3RlcHBlcnMiLCJzdWJvcHRpb25zIiwic3VicGFyYW0iLCJzdWJzdGVwcGVyIiwiTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiQmluYXJ5U3RlcHBlciIsInplcm9fbG9nX2RlbnMiLCJvbmVfbG9nX2RlbnMiLCJtYXhfbG9nX2RlbnMiLCJ6ZXJvX3Byb2IiLCJCaW5hcnlDb21wb25lbnRTdGVwcGVyIiwic3VicGFyYW1zIiwiQW13Z1N0ZXBwZXIiLCJTZWxlY3RTdGVwcGVyIiwicGFyYW1fb2JqZWN0X3dyYXAiLCJwYXJhbV9vcHRpb25zIiwiU2FtcGxlciIsImRhdGEiLCJwYXJhbV9pbml0X2Z1biIsInRoaW5uaW5nX2ludGVydmFsIiwicGFyYW1zX3RvX21vbml0b3IiLCJ0aGluIiwibW9uaXRvciIsInN0ZXBwZXJzIiwiY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUiLCJzYW1wbGUiLCJuX2l0ZXJhdGlvbnMiLCJtb25pdG9yZWRfcGFyYW1zIiwiY3Vycl9zYW1wbGUiLCJidXJuIiwiQW13Z1NhbXBsZXIiLCJhc2NlbmRpbmciLCJudW1iZXJzIiwidmFsdWVzIiwidmFsdWVvZiIsImNvbXBhcmVEZWZpbmVkIiwiY29tcGFyZSIsImFzY2VuZGluZ0RlZmluZWQiLCJUeXBlRXJyb3IiLCJxdWlja3NlbGVjdCIsImxlZnQiLCJyaWdodCIsIm5ld0xlZnQiLCJuZXdSaWdodCIsInN3YXAiLCJxdWFudGlsZSIsInAiLCJGbG9hdDY0QXJyYXkiLCJmcm9tIiwiaXNOYU4iLCJpMCIsInZhbHVlMCIsInN1YmFycmF5IiwidmFsdWUxIiwibWVkaWFuIiwibm9vcCIsImRpc3BhdGNoIiwiYXJndW1lbnRzIiwiXyIsInRlc3QiLCJFcnJvciIsIkRpc3BhdGNoIiwicGFyc2VUeXBlbmFtZXMiLCJ0eXBlbmFtZXMiLCJ0eXBlcyIsInRyaW0iLCJzcGxpdCIsIm1hcCIsImluZGV4T2YiLCJvbiIsInR5cGVuYW1lIiwiY2FsbGJhY2siLCJUIiwiZ2V0Iiwic2V0IiwiY29weSIsInRoYXQiLCJhcmdzIiwiYXBwbHkiLCJjIiwieGh0bWwiLCJzdmciLCJ4bGluayIsInhtbCIsInhtbG5zIiwicHJlZml4IiwibmFtZXNwYWNlcyIsInNwYWNlIiwibG9jYWwiLCJjcmVhdG9ySW5oZXJpdCIsImRvY3VtZW50Iiwib3duZXJEb2N1bWVudCIsInVyaSIsIm5hbWVzcGFjZVVSSSIsImRvY3VtZW50RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjcmVhdGVFbGVtZW50TlMiLCJjcmVhdG9yRml4ZWQiLCJmdWxsbmFtZSIsIm5hbWVzcGFjZSIsIm5vbmUiLCJzZWxlY3RvciIsInF1ZXJ5U2VsZWN0b3IiLCJzZWxlY3QiLCJncm91cHMiLCJfZ3JvdXBzIiwic3ViZ3JvdXBzIiwiZ3JvdXAiLCJzdWJncm91cCIsIm5vZGUiLCJzdWJub2RlIiwiX19kYXRhX18iLCJTZWxlY3Rpb24iLCJfcGFyZW50cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJhcnJheUFsbCIsInNlbGVjdG9yQWxsIiwicGFyZW50cyIsIm1hdGNoZXMiLCJjaGlsZE1hdGNoZXIiLCJmaW5kIiwiY2hpbGRGaW5kIiwibWF0Y2giLCJjaGlsZHJlbiIsImNoaWxkRmlyc3QiLCJmaXJzdEVsZW1lbnRDaGlsZCIsImZpbHRlciIsImNoaWxkcmVuRmlsdGVyIiwic2VsZWN0QWxsIiwibWF0Y2hlciIsInVwZGF0ZSIsIl9lbnRlciIsInNwYXJzZSIsIkVudGVyTm9kZSIsInBhcmVudCIsImRhdHVtIiwiX25leHQiLCJfcGFyZW50IiwiYXBwZW5kQ2hpbGQiLCJjaGlsZCIsImluc2VydEJlZm9yZSIsIm5leHQiLCJiaW5kSW5kZXgiLCJlbnRlciIsImV4aXQiLCJncm91cExlbmd0aCIsImRhdGFMZW5ndGgiLCJiaW5kS2V5Iiwia2V5Iiwibm9kZUJ5S2V5VmFsdWUiLCJNYXAiLCJrZXlWYWx1ZXMiLCJrZXlWYWx1ZSIsImhhcyIsImRlbGV0ZSIsImJpbmQiLCJjb25zdGFudCIsImFycmF5bGlrZSIsImVudGVyR3JvdXAiLCJ1cGRhdGVHcm91cCIsImV4aXRHcm91cCIsImkxIiwicHJldmlvdXMiLCJfZXhpdCIsIm9uZW50ZXIiLCJvbnVwZGF0ZSIsIm9uZXhpdCIsInNlbGVjdGlvbiIsImFwcGVuZCIsInJlbW92ZSIsIm1lcmdlIiwib3JkZXIiLCJjb250ZXh0IiwiZ3JvdXBzMCIsImdyb3VwczEiLCJtMCIsIm0xIiwibWVyZ2VzIiwiZ3JvdXAwIiwiZ3JvdXAxIiwiY29tcGFyZURvY3VtZW50UG9zaXRpb24iLCJwYXJlbnROb2RlIiwiY29tcGFyZU5vZGUiLCJzb3J0Z3JvdXBzIiwic29ydGdyb3VwIiwic29ydCIsImF0dHJSZW1vdmUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJhdHRyUmVtb3ZlTlMiLCJyZW1vdmVBdHRyaWJ1dGVOUyIsImF0dHJDb25zdGFudCIsInNldEF0dHJpYnV0ZSIsImF0dHJDb25zdGFudE5TIiwic2V0QXR0cmlidXRlTlMiLCJhdHRyRnVuY3Rpb24iLCJhdHRyRnVuY3Rpb25OUyIsImdldEF0dHJpYnV0ZU5TIiwiZ2V0QXR0cmlidXRlIiwiZWFjaCIsImRlZmF1bHRWaWV3Iiwic3R5bGVSZW1vdmUiLCJzdHlsZSIsInJlbW92ZVByb3BlcnR5Iiwic3R5bGVDb25zdGFudCIsInByaW9yaXR5Iiwic2V0UHJvcGVydHkiLCJzdHlsZUZ1bmN0aW9uIiwic3R5bGVWYWx1ZSIsImdldFByb3BlcnR5VmFsdWUiLCJnZXRDb21wdXRlZFN0eWxlIiwicHJvcGVydHlSZW1vdmUiLCJwcm9wZXJ0eUNvbnN0YW50IiwicHJvcGVydHlGdW5jdGlvbiIsImNsYXNzQXJyYXkiLCJzdHJpbmciLCJjbGFzc0xpc3QiLCJDbGFzc0xpc3QiLCJfbm9kZSIsIl9uYW1lcyIsImFkZCIsImpvaW4iLCJzcGxpY2UiLCJjb250YWlucyIsImNsYXNzZWRBZGQiLCJuYW1lcyIsImxpc3QiLCJjbGFzc2VkUmVtb3ZlIiwiY2xhc3NlZFRydWUiLCJjbGFzc2VkRmFsc2UiLCJjbGFzc2VkRnVuY3Rpb24iLCJ0ZXh0UmVtb3ZlIiwidGV4dENvbnRlbnQiLCJ0ZXh0Q29uc3RhbnQiLCJ0ZXh0RnVuY3Rpb24iLCJodG1sUmVtb3ZlIiwiaW5uZXJIVE1MIiwiaHRtbENvbnN0YW50IiwiaHRtbEZ1bmN0aW9uIiwicmFpc2UiLCJuZXh0U2libGluZyIsInByZXZpb3VzU2libGluZyIsImZpcnN0Q2hpbGQiLCJjcmVhdG9yIiwiY29uc3RhbnROdWxsIiwiYmVmb3JlIiwicmVtb3ZlQ2hpbGQiLCJzZWxlY3Rpb25fY2xvbmVTaGFsbG93IiwiY2xvbmUiLCJzZWxlY3Rpb25fY2xvbmVEZWVwIiwiZGVlcCIsInByb3BlcnR5IiwiY29udGV4dExpc3RlbmVyIiwibGlzdGVuZXIiLCJldmVudCIsIm9uUmVtb3ZlIiwiX19vbiIsIm8iLCJyZW1vdmVFdmVudExpc3RlbmVyIiwib25BZGQiLCJhZGRFdmVudExpc3RlbmVyIiwiZGlzcGF0Y2hFdmVudCIsIndpbmRvdyIsIkN1c3RvbUV2ZW50IiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJidWJibGVzIiwiY2FuY2VsYWJsZSIsImRldGFpbCIsImRpc3BhdGNoQ29uc3RhbnQiLCJkaXNwYXRjaEZ1bmN0aW9uIiwic2VsZWN0aW9uX3NlbGVjdGlvbiIsInNlbGVjdGlvbl9zZWxlY3QiLCJzZWxlY3Rpb25fc2VsZWN0QWxsIiwic2VsZWN0Q2hpbGQiLCJzZWxlY3Rpb25fc2VsZWN0Q2hpbGQiLCJzZWxlY3RDaGlsZHJlbiIsInNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbiIsInNlbGVjdGlvbl9maWx0ZXIiLCJzZWxlY3Rpb25fZGF0YSIsInNlbGVjdGlvbl9lbnRlciIsInNlbGVjdGlvbl9leGl0Iiwic2VsZWN0aW9uX2pvaW4iLCJzZWxlY3Rpb25fbWVyZ2UiLCJzZWxlY3Rpb25fb3JkZXIiLCJzZWxlY3Rpb25fc29ydCIsInNlbGVjdGlvbl9jYWxsIiwibm9kZXMiLCJzZWxlY3Rpb25fbm9kZXMiLCJzZWxlY3Rpb25fbm9kZSIsInNlbGVjdGlvbl9zaXplIiwic2VsZWN0aW9uX2VtcHR5Iiwic2VsZWN0aW9uX2VhY2giLCJhdHRyIiwic2VsZWN0aW9uX2F0dHIiLCJzZWxlY3Rpb25fc3R5bGUiLCJzZWxlY3Rpb25fcHJvcGVydHkiLCJjbGFzc2VkIiwic2VsZWN0aW9uX2NsYXNzZWQiLCJ0ZXh0Iiwic2VsZWN0aW9uX3RleHQiLCJodG1sIiwic2VsZWN0aW9uX2h0bWwiLCJzZWxlY3Rpb25fcmFpc2UiLCJzZWxlY3Rpb25fbG93ZXIiLCJzZWxlY3Rpb25fYXBwZW5kIiwiaW5zZXJ0Iiwic2VsZWN0aW9uX2luc2VydCIsInNlbGVjdGlvbl9yZW1vdmUiLCJzZWxlY3Rpb25fY2xvbmUiLCJzZWxlY3Rpb25fZGF0dW0iLCJzZWxlY3Rpb25fb24iLCJzZWxlY3Rpb25fZGlzcGF0Y2giLCJTeW1ib2wiLCJpdGVyYXRvciIsInNlbGVjdGlvbl9pdGVyYXRvciIsImV4dGVuZCIsImRlZmluaXRpb24iLCJDb2xvciIsImRhcmtlciIsImJyaWdodGVyIiwicmVJIiwicmVOIiwicmVQIiwicmVIZXgiLCJyZVJnYkludGVnZXIiLCJyZVJnYlBlcmNlbnQiLCJyZVJnYmFJbnRlZ2VyIiwicmVSZ2JhUGVyY2VudCIsInJlSHNsUGVyY2VudCIsInJlSHNsYVBlcmNlbnQiLCJuYW1lZCIsImFsaWNlYmx1ZSIsImFudGlxdWV3aGl0ZSIsImFxdWEiLCJhcXVhbWFyaW5lIiwiYXp1cmUiLCJiZWlnZSIsImJpc3F1ZSIsImJsYWNrIiwiYmxhbmNoZWRhbG1vbmQiLCJibHVlIiwiYmx1ZXZpb2xldCIsImJyb3duIiwiYnVybHl3b29kIiwiY2FkZXRibHVlIiwiY2hhcnRyZXVzZSIsImNob2NvbGF0ZSIsImNvcmFsIiwiY29ybmZsb3dlcmJsdWUiLCJjb3Juc2lsayIsImNyaW1zb24iLCJjeWFuIiwiZGFya2JsdWUiLCJkYXJrY3lhbiIsImRhcmtnb2xkZW5yb2QiLCJkYXJrZ3JheSIsImRhcmtncmVlbiIsImRhcmtncmV5IiwiZGFya2toYWtpIiwiZGFya21hZ2VudGEiLCJkYXJrb2xpdmVncmVlbiIsImRhcmtvcmFuZ2UiLCJkYXJrb3JjaGlkIiwiZGFya3JlZCIsImRhcmtzYWxtb24iLCJkYXJrc2VhZ3JlZW4iLCJkYXJrc2xhdGVibHVlIiwiZGFya3NsYXRlZ3JheSIsImRhcmtzbGF0ZWdyZXkiLCJkYXJrdHVycXVvaXNlIiwiZGFya3Zpb2xldCIsImRlZXBwaW5rIiwiZGVlcHNreWJsdWUiLCJkaW1ncmF5IiwiZGltZ3JleSIsImRvZGdlcmJsdWUiLCJmaXJlYnJpY2siLCJmbG9yYWx3aGl0ZSIsImZvcmVzdGdyZWVuIiwiZnVjaHNpYSIsImdhaW5zYm9ybyIsImdob3N0d2hpdGUiLCJnb2xkIiwiZ29sZGVucm9kIiwiZ3JheSIsImdyZWVuIiwiZ3JlZW55ZWxsb3ciLCJncmV5IiwiaG9uZXlkZXciLCJob3RwaW5rIiwiaW5kaWFucmVkIiwiaW5kaWdvIiwiaXZvcnkiLCJraGFraSIsImxhdmVuZGVyIiwibGF2ZW5kZXJibHVzaCIsImxhd25ncmVlbiIsImxlbW9uY2hpZmZvbiIsImxpZ2h0Ymx1ZSIsImxpZ2h0Y29yYWwiLCJsaWdodGN5YW4iLCJsaWdodGdvbGRlbnJvZHllbGxvdyIsImxpZ2h0Z3JheSIsImxpZ2h0Z3JlZW4iLCJsaWdodGdyZXkiLCJsaWdodHBpbmsiLCJsaWdodHNhbG1vbiIsImxpZ2h0c2VhZ3JlZW4iLCJsaWdodHNreWJsdWUiLCJsaWdodHNsYXRlZ3JheSIsImxpZ2h0c2xhdGVncmV5IiwibGlnaHRzdGVlbGJsdWUiLCJsaWdodHllbGxvdyIsImxpbWUiLCJsaW1lZ3JlZW4iLCJsaW5lbiIsIm1hZ2VudGEiLCJtYXJvb24iLCJtZWRpdW1hcXVhbWFyaW5lIiwibWVkaXVtYmx1ZSIsIm1lZGl1bW9yY2hpZCIsIm1lZGl1bXB1cnBsZSIsIm1lZGl1bXNlYWdyZWVuIiwibWVkaXVtc2xhdGVibHVlIiwibWVkaXVtc3ByaW5nZ3JlZW4iLCJtZWRpdW10dXJxdW9pc2UiLCJtZWRpdW12aW9sZXRyZWQiLCJtaWRuaWdodGJsdWUiLCJtaW50Y3JlYW0iLCJtaXN0eXJvc2UiLCJtb2NjYXNpbiIsIm5hdmFqb3doaXRlIiwibmF2eSIsIm9sZGxhY2UiLCJvbGl2ZSIsIm9saXZlZHJhYiIsIm9yYW5nZSIsIm9yYW5nZXJlZCIsIm9yY2hpZCIsInBhbGVnb2xkZW5yb2QiLCJwYWxlZ3JlZW4iLCJwYWxldHVycXVvaXNlIiwicGFsZXZpb2xldHJlZCIsInBhcGF5YXdoaXAiLCJwZWFjaHB1ZmYiLCJwZXJ1IiwicGluayIsInBsdW0iLCJwb3dkZXJibHVlIiwicHVycGxlIiwicmViZWNjYXB1cnBsZSIsInJlZCIsInJvc3licm93biIsInJveWFsYmx1ZSIsInNhZGRsZWJyb3duIiwic2FsbW9uIiwic2FuZHlicm93biIsInNlYWdyZWVuIiwic2Vhc2hlbGwiLCJzaWVubmEiLCJzaWx2ZXIiLCJza3libHVlIiwic2xhdGVibHVlIiwic2xhdGVncmF5Iiwic2xhdGVncmV5Iiwic25vdyIsInNwcmluZ2dyZWVuIiwic3RlZWxibHVlIiwidGFuIiwidGVhbCIsInRoaXN0bGUiLCJ0b21hdG8iLCJ0dXJxdW9pc2UiLCJ2aW9sZXQiLCJ3aGVhdCIsIndoaXRlIiwid2hpdGVzbW9rZSIsInllbGxvdyIsInllbGxvd2dyZWVuIiwiZGVmaW5lIiwiY29sb3IiLCJjaGFubmVscyIsImFzc2lnbiIsImRpc3BsYXlhYmxlIiwicmdiIiwiaGV4IiwiY29sb3JfZm9ybWF0SGV4IiwiZm9ybWF0SGV4IiwiZm9ybWF0SGV4OCIsImNvbG9yX2Zvcm1hdEhleDgiLCJmb3JtYXRIc2wiLCJjb2xvcl9mb3JtYXRIc2wiLCJmb3JtYXRSZ2IiLCJjb2xvcl9mb3JtYXRSZ2IiLCJoc2xDb252ZXJ0IiwiZm9ybWF0IiwidG9Mb3dlckNhc2UiLCJleGVjIiwicGFyc2VJbnQiLCJyZ2JuIiwiUmdiIiwicmdiYSIsImhzbGEiLCJnIiwicmdiQ29udmVydCIsIm9wYWNpdHkiLCJjbGFtcCIsImNsYW1waSIsImNsYW1wYSIsInJnYl9mb3JtYXRIZXgiLCJyZ2JfZm9ybWF0SGV4OCIsInJnYl9mb3JtYXRSZ2IiLCJoIiwiSHNsIiwiaHNsIiwibTIiLCJoc2wycmdiIiwiY2xhbXBoIiwiY2xhbXB0IiwibGluZWFyIiwiZCIsImV4cG9uZW50aWFsIiwibm9nYW1tYSIsInJnYkdhbW1hIiwic3RhcnQiLCJlbmQiLCJjb2xvclJnYiIsInJlQSIsInJlQiIsInplcm8iLCJvbmUiLCJiaSIsImxhc3RJbmRleCIsImFtIiwiYm0iLCJicyIsImluZGV4IiwibnVtYmVyIiwiZGVncmVlcyIsImlkZW50aXR5IiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJyb3RhdGUiLCJza2V3WCIsInNjYWxlWCIsInNjYWxlWSIsImF0YW4yIiwiYXRhbiIsInN2Z05vZGUiLCJwYXJzZUNzcyIsIkRPTU1hdHJpeCIsIldlYktpdENTU01hdHJpeCIsImlzSWRlbnRpdHkiLCJkZWNvbXBvc2UiLCJwYXJzZVN2ZyIsInRyYW5zZm9ybSIsImJhc2VWYWwiLCJjb25zb2xpZGF0ZSIsIm1hdHJpeCIsImludGVycG9sYXRlVHJhbnNmb3JtIiwicGFyc2UiLCJweENvbW1hIiwicHhQYXJlbiIsImRlZ1BhcmVuIiwicG9wIiwidHJhbnNsYXRlIiwieGEiLCJ5YSIsInhiIiwieWIiLCJpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyIsImludGVycG9sYXRlVHJhbnNmb3JtU3ZnIiwiZnJhbWUiLCJ0aW1lb3V0IiwiaW50ZXJ2YWwiLCJwb2tlRGVsYXkiLCJ0YXNrSGVhZCIsInRhc2tUYWlsIiwiY2xvY2tMYXN0IiwiY2xvY2tOb3ciLCJjbG9ja1NrZXciLCJjbG9jayIsInBlcmZvcm1hbmNlIiwibm93Iiwic2V0RnJhbWUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJzZXRUaW1lb3V0IiwiY2xlYXJOb3ciLCJUaW1lciIsIl9jYWxsIiwiX3RpbWUiLCJ0aW1lciIsInJlc3RhcnQiLCJkZWxheSIsInRpbWUiLCJzbGVlcCIsInN0b3AiLCJ0aW1lckZsdXNoIiwid2FrZSIsIm5hcCIsInBva2UiLCJ0MCIsInQxIiwidDIiLCJjbGVhclRpbWVvdXQiLCJjbGVhckludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJlbGFwc2VkIiwiZW1wdHlPbiIsImVtcHR5VHdlZW4iLCJDUkVBVEVEIiwiU0NIRURVTEVEIiwiU1RBUlRJTkciLCJTVEFSVEVEIiwiUlVOTklORyIsIkVORElORyIsIkVOREVEIiwiaWQiLCJ0aW1pbmciLCJzY2hlZHVsZXMiLCJfX3RyYW5zaXRpb24iLCJ0d2VlbiIsImR1cmF0aW9uIiwiZWFzZSIsInNjaGVkdWxlIiwic2VsZiIsInRpY2siLCJhY3RpdmUiLCJpbnRlcnJ1cHQiLCJ0d2VlblJlbW92ZSIsInR3ZWVuMCIsInR3ZWVuMSIsInR3ZWVuRnVuY3Rpb24iLCJfaWQiLCJ0d2VlblZhbHVlIiwidHJhbnNpdGlvbiIsImludGVycG9sYXRlTnVtYmVyIiwiaW50ZXJwb2xhdGVSZ2IiLCJpbnRlcnBvbGF0ZVN0cmluZyIsImludGVycG9sYXRlIiwic3RyaW5nMDAiLCJzdHJpbmcxIiwiaW50ZXJwb2xhdGUwIiwic3RyaW5nMCIsInN0cmluZzEwIiwiYXR0clR3ZWVuIiwiYXR0ckludGVycG9sYXRlIiwiYXR0ckludGVycG9sYXRlTlMiLCJhdHRyVHdlZW5OUyIsIl92YWx1ZSIsImRlbGF5RnVuY3Rpb24iLCJkZWxheUNvbnN0YW50IiwiZHVyYXRpb25GdW5jdGlvbiIsImR1cmF0aW9uQ29uc3RhbnQiLCJlYXNlQ29uc3RhbnQiLCJlYXNlVmFyeWluZyIsIlRyYW5zaXRpb24iLCJfbmFtZSIsImV2ZXJ5Iiwib25GdW5jdGlvbiIsIm9uMCIsIm9uMSIsInNpdCIsInJlbW92ZUZ1bmN0aW9uIiwiaW5oZXJpdCIsInN0eWxlTnVsbCIsInN0eWxlTWF5YmVSZW1vdmUiLCJsaXN0ZW5lcjAiLCJzdHlsZVR3ZWVuIiwic3R5bGVJbnRlcnBvbGF0ZSIsInRleHRJbnRlcnBvbGF0ZSIsInRleHRUd2VlbiIsImlkMCIsImlkMSIsIm5ld0lkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJjYW5jZWwiLCJzZWxlY3Rpb25fcHJvdG90eXBlIiwidHJhbnNpdGlvbl9zZWxlY3QiLCJ0cmFuc2l0aW9uX3NlbGVjdEFsbCIsInRyYW5zaXRpb25fZmlsdGVyIiwidHJhbnNpdGlvbl9tZXJnZSIsInRyYW5zaXRpb25fc2VsZWN0aW9uIiwidHJhbnNpdGlvbl90cmFuc2l0aW9uIiwidHJhbnNpdGlvbl9vbiIsInRyYW5zaXRpb25fYXR0ciIsInRyYW5zaXRpb25fYXR0clR3ZWVuIiwidHJhbnNpdGlvbl9zdHlsZSIsInRyYW5zaXRpb25fc3R5bGVUd2VlbiIsInRyYW5zaXRpb25fdGV4dCIsInRyYW5zaXRpb25fdGV4dFR3ZWVuIiwidHJhbnNpdGlvbl9yZW1vdmUiLCJ0cmFuc2l0aW9uX3R3ZWVuIiwidHJhbnNpdGlvbl9kZWxheSIsInRyYW5zaXRpb25fZHVyYXRpb24iLCJ0cmFuc2l0aW9uX2Vhc2UiLCJ0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nIiwidHJhbnNpdGlvbl9lbmQiLCJjdWJpY0luT3V0IiwiZGVmYXVsdFRpbWluZyIsImVhc2VDdWJpY0luT3V0Iiwic2VsZWN0aW9uX2ludGVycnVwdCIsInNlbGVjdGlvbl90cmFuc2l0aW9uIiwiVHJhbnNmb3JtIiwicG9pbnQiLCJhcHBseVgiLCJhcHBseVkiLCJpbnZlcnQiLCJpbnZlcnRYIiwiaW52ZXJ0WSIsInJlc2NhbGVYIiwiZG9tYWluIiwicmFuZ2UiLCJyZXNjYWxlWSIsIkhURE1hdGgiLCJERUZBVUxUIiwiTUlOIiwiTUFYIiwiU1RFUCIsIkpVTVAiLCJhZGsydiIsImFkdjJrIiwib25tZXNzYWdlIiwibHVjZSIsImxvZ1Bvc3QiLCJscCIsImtNZWFuIiwia1NoYXBlIiwiQmF5ZXNEaXN0cmlidXRpb25zIiwibHVjZU1lYW4iLCJsdWNlU2hhcGUiLCJmb3JFYWNoIiwiY2hvaWNlIiwidnMiLCJhcyIsImRzIiwidmwiLCJhbCIsImRsIiwiYmludmFsIiwicmVzcG9uc2UiLCJzYW1wbGVyIiwiQmF5ZXNNY21jIiwic2FtcGxlcyIsInJlc3VsdHMiLCJkMyIsInBvc3RNZXNzYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztFQUdBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQU9BO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtJQUNDLENBQUEsVUFBVUEsSUFBSSxFQUFFQyxPQUFPLEVBQUU7TUFJZixJQUFrQ0MsTUFBTSxDQUFDQyxPQUFPLEVBQUU7RUFDN0Q7RUFDQTtFQUNBO0VBQ1FELE1BQUFBLE1BQUEsQ0FBQUMsT0FBQSxHQUFpQkYsT0FBTyxFQUFFO0VBQ2xDLElBQUEsQ0FBSyxNQUFNO0VBQ1g7RUFDUUQsTUFBQUEsSUFBSSxDQUFDSSxFQUFFLEdBQUdILE9BQU8sRUFBRTtFQUMzQixJQUFBO0lBQ0EsQ0FBQyxFQUFDSSxhQUFJLEVBQUUsWUFBVztFQUNuQjtNQUNFLElBQUlELEVBQUUsR0FBSSxFQUFFOztFQUVkO0VBQ0E7O0VBRUUsSUFBQSxJQUFJRSxNQUFNLEdBQUcsVUFBU0MsQ0FBQyxFQUFFO1FBQ3ZCLElBQUlDLENBQUMsR0FBRyxDQUFDO0VBQ1QsTUFBQSxJQUFJQyxHQUFHLEdBQUcsQ0FDUixpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFDeEQsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsa0JBQW1CLENBQy9EO1FBQ0QsSUFBSUMsR0FBRyxHQUFHLGlCQUFpQjtFQUMzQixNQUFBLElBQUlDLEVBQUUsRUFBRUMsQ0FBQyxFQUFFQyxHQUFHO1FBQ2RBLEdBQUcsR0FBRyxDQUFDRCxDQUFDLEdBQUdELEVBQUUsR0FBR0osQ0FBQyxJQUFJLEdBQUc7UUFDeEJNLEdBQUcsSUFBSSxDQUFDRixFQUFFLEdBQUcsR0FBRyxJQUFJRyxHQUFHLENBQUNELEdBQUcsQ0FBQztFQUM1QixNQUFBLE9BQU9MLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsRUFBRSxFQUNmRSxHQUFHLElBQUlELEdBQUcsQ0FBQ0QsQ0FBQyxDQUFDLEdBQUcsRUFBRUksQ0FBQztRQUNyQixPQUFPRSxHQUFHLENBQUMsa0JBQWtCLEdBQUdKLEdBQUcsR0FBR0MsRUFBRSxDQUFDLEdBQUdFLEdBQUc7TUFDbkQsQ0FBRztNQUNEVCxFQUFFLENBQUNFLE1BQU0sR0FBR0EsTUFBTTtFQUVsQixJQUFBLElBQUlTLFVBQVUsR0FBRyxVQUFTQyxDQUFDLEVBQUU7UUFDM0IsT0FBT0EsQ0FBQyxHQUFHLENBQUMsR0FBR0MsR0FBRyxHQUFHWCxNQUFNLENBQUNVLENBQUMsR0FBRyxDQUFDLENBQUM7TUFDdEMsQ0FBRztNQUNEWixFQUFFLENBQUNXLFVBQVUsR0FBR0EsVUFBVTtFQUUxQixJQUFBLElBQUlHLE9BQU8sR0FBRyxVQUFTRixDQUFDLEVBQUVHLENBQUMsRUFBQztFQUMxQixNQUFBLE9BQU9KLFVBQVUsQ0FBQ0MsQ0FBQyxDQUFDLEdBQUdELFVBQVUsQ0FBQ0ksQ0FBQyxDQUFDLEdBQUdKLFVBQVUsQ0FBQ0MsQ0FBQyxHQUFHRyxDQUFDLENBQUM7TUFDNUQsQ0FBRztNQUNEZixFQUFFLENBQUNjLE9BQU8sR0FBR0EsT0FBTztFQUVwQixJQUFBLElBQUlFLEtBQUssR0FBRyxVQUFTQyxDQUFDLEVBQUVDLENBQUMsRUFBRTtFQUN6QixNQUFBLE9BQU9oQixNQUFNLENBQUNlLENBQUMsQ0FBQyxHQUFHZixNQUFNLENBQUNnQixDQUFDLENBQUMsR0FBR2hCLE1BQU0sQ0FBQ2UsQ0FBQyxHQUFHQyxDQUFDLENBQUM7TUFDaEQsQ0FBRztNQUNEbEIsRUFBRSxDQUFDZ0IsS0FBSyxHQUFHQSxLQUFLO0VBRWhCLElBQUEsSUFBSU4sR0FBRyxHQUFJUyxJQUFJLENBQUNULEdBQUc7RUFDbkIsSUFBQSxJQUFJVSxHQUFHLEdBQUlELElBQUksQ0FBQ0MsR0FBRztFQUNuQixJQUFBLElBQUlDLEdBQUcsR0FBSUYsSUFBSSxDQUFDRSxHQUFHO0VBQ25CLElBQUEsSUFBSUMsR0FBRyxHQUFJSCxJQUFJLENBQUNHLEdBQUc7RUFDbkIsSUFBQSxJQUFJQyxJQUFJLEdBQUdKLElBQUksQ0FBQ0ksSUFBSTtFQUNwQixJQUFBLElBQUlDLEVBQUUsR0FBS0wsSUFBSSxDQUFDTSxFQUFFOztFQUVwQjtFQUNBOztNQUVFekIsRUFBRSxDQUFDMEIsSUFBSSxHQUFHLFVBQVN2QixDQUFDLEVBQUV3QixNQUFNLEVBQUVDLE1BQU0sRUFBRTtFQUNwQyxNQUFBLElBQUl6QixDQUFDLEdBQUcsQ0FBQyxJQUFJQSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0VBQ2hCLFFBQUEsT0FBTyxDQUFDMEIsUUFBUTtFQUN4QixNQUFBO0VBQ0ksTUFBQSxJQUFHRixNQUFNLEtBQUssQ0FBQyxJQUFJQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0VBQy9CLFFBQUEsT0FBTyxDQUFDO0VBQ2QsTUFBQSxDQUFLLE1BQU07VUFDTCxPQUFPLENBQUNELE1BQU0sR0FBRyxDQUFDLElBQUlqQixHQUFHLENBQUNQLENBQUMsQ0FBQyxHQUFHLENBQUN5QixNQUFNLEdBQUcsQ0FBQyxJQUFJbEIsR0FBRyxDQUFDLENBQUMsR0FBR1AsQ0FBQyxDQUFDLEdBQUdhLEtBQUssQ0FBQ1csTUFBTSxFQUFFQyxNQUFNLENBQUM7RUFDdEYsTUFBQTtNQUNBLENBQUc7TUFFRDVCLEVBQUUsQ0FBQzhCLE1BQU0sR0FBRyxVQUFTM0IsQ0FBQyxFQUFFNEIsUUFBUSxFQUFFQyxLQUFLLEVBQUU7UUFDdkMsT0FBT3RCLEdBQUcsQ0FBQ3NCLEtBQUssQ0FBQyxHQUFHdEIsR0FBRyxDQUFDWSxHQUFHLENBQUNuQixDQUFDLEdBQUc0QixRQUFRLEVBQUUsQ0FBQyxDQUFDLEdBQUdULEdBQUcsQ0FBQ1UsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUl0QixHQUFHLENBQUNjLEVBQUUsQ0FBQztNQUM1RSxDQUFHO01BRUR4QixFQUFFLENBQUNpQyxJQUFJLEdBQUcsVUFBUzlCLENBQUMsRUFBRStCLElBQUksRUFBRUMsRUFBRSxFQUFFO0VBQzVCLE1BQUEsT0FBTyxJQUFJLEdBQUd6QixHQUFHLENBQUMsQ0FBQyxHQUFHYyxFQUFFLENBQUMsR0FBRWQsR0FBRyxDQUFDeUIsRUFBRSxDQUFDLEdBQUdiLEdBQUcsQ0FBQ25CLENBQUMsR0FBRytCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUdDLEVBQUUsR0FBR0EsRUFBRSxDQUFDO01BQzNFLENBQUc7O0VBRUg7RUFDQTtNQUNFbkMsRUFBRSxDQUFDb0MsU0FBUyxHQUFHLFVBQVNqQyxDQUFDLEVBQUUrQixJQUFJLEVBQUVDLEVBQUUsRUFBRUUsSUFBSSxFQUFFO0VBQ3pDLE1BQUEsSUFBSUMsQ0FBQyxHQUFHaEIsR0FBRyxDQUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHK0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHWixHQUFHLENBQUNhLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FDdENiLEdBQUcsQ0FBQ25CLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRytCLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBR1osR0FBRyxDQUFDYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQ3JDLENBQUMsR0FBR0UsSUFBSSxJQUFJbEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHK0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUkvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcrQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBS0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHQSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDMUUsTUFBQSxJQUFJSSxrQkFBa0IsR0FBRyxFQUFHN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHQSxHQUFHLENBQUNjLEVBQUUsQ0FBQyxHQUFHZCxHQUFHLENBQUN5QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBR3pCLEdBQUcsQ0FBQ3lCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUMxQyxHQUFHLEdBQUd6QixHQUFHLENBQUMsQ0FBQyxHQUFHWSxHQUFHLENBQUNlLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFFO0VBQ3pELE1BQUEsSUFBSUcsY0FBYyxHQUFHRCxrQkFBa0IsR0FBR0QsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUdoQixHQUFHLENBQUNlLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBRSxDQUFFO0VBQ3hFLE1BQUEsT0FBT0csY0FBYztNQUN6QixDQUFHO01BR0R4QyxFQUFFLENBQUN5QyxPQUFPLEdBQUcsVUFBU3RDLENBQUMsRUFBRTRCLFFBQVEsRUFBRUMsS0FBSyxFQUFFO0VBQ3hDLE1BQUEsT0FBUSxDQUFDWCxHQUFHLENBQUNsQixDQUFDLEdBQUc0QixRQUFRLENBQUMsR0FBQ0MsS0FBSyxHQUFJdEIsR0FBRyxDQUFDLENBQUMsR0FBR3NCLEtBQUssQ0FBQztNQUN0RCxDQUFHO0VBRURoQyxJQUFBQSxFQUFFLENBQUMwQyxJQUFJLEdBQUcxQyxFQUFFLENBQUN5QyxPQUFPO01BRXBCekMsRUFBRSxDQUFDMkMsS0FBSyxHQUFHLFVBQVN4QyxDQUFDLEVBQUV5QyxLQUFLLEVBQUVDLElBQUksRUFBRTtFQUNsQyxNQUFBLElBQUliLEtBQUssR0FBRyxDQUFDLEdBQUdhLElBQUk7UUFDcEIsSUFBSTFDLENBQUMsR0FBRyxDQUFDLEVBQUU7RUFDVCxRQUFBLE9BQU8sQ0FBQzBCLFFBQVE7RUFDdEIsTUFBQTtFQUNJLE1BQUEsSUFBSTFCLENBQUMsS0FBSyxDQUFDLElBQUl5QyxLQUFLLEtBQUssQ0FBQyxFQUFJO0VBQzVCLFFBQUEsT0FBTyxDQUFDbEMsR0FBRyxDQUFDc0IsS0FBSyxDQUFDO0VBQ3hCLE1BQUEsQ0FBSyxNQUFNO1VBQ0wsT0FBTyxDQUFDWSxLQUFLLEdBQUcsQ0FBQyxJQUFJbEMsR0FBRyxDQUFDUCxDQUFDLENBQUMsR0FBR0EsQ0FBQyxHQUFHNkIsS0FBSyxHQUFHOUIsTUFBTSxDQUFDMEMsS0FBSyxDQUFDLEdBQUdBLEtBQUssR0FBR2xDLEdBQUcsQ0FBQ3NCLEtBQUssQ0FBQztFQUNsRixNQUFBO01BQ0EsQ0FBRztNQUVEaEMsRUFBRSxDQUFDOEMsUUFBUSxHQUFHLFVBQVMzQyxDQUFDLEVBQUV5QyxLQUFLLEVBQUVaLEtBQUssRUFBRTtRQUNwQyxJQUFJN0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtFQUNWLFFBQUEsT0FBTyxDQUFDMEIsUUFBUTtFQUN4QixNQUFBO1FBQ00sT0FBTyxFQUFFZSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUdsQyxHQUFHLENBQUNQLENBQUMsQ0FBQyxHQUFHNkIsS0FBSyxHQUFHN0IsQ0FBQyxHQUFHRCxNQUFNLENBQUMwQyxLQUFLLENBQUMsR0FBR0EsS0FBSyxHQUFHbEMsR0FBRyxDQUFDc0IsS0FBSyxDQUFDO01BQ25GLENBQUs7TUFFSGhDLEVBQUUsQ0FBQytDLEtBQUssR0FBSSxVQUFTNUMsQ0FBQyxFQUFFNkMsT0FBTyxFQUFFQyxLQUFLLEVBQUU7UUFDdEMsSUFBSTlDLENBQUMsSUFBSSxDQUFDLEVBQUU7RUFDVixRQUFBLE9BQU8sQ0FBQzBCLFFBQVE7RUFDdEIsTUFBQTtFQUNJLE1BQUEsT0FBTyxDQUFDbkIsR0FBRyxDQUFDUCxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUdPLEdBQUcsQ0FBQyxDQUFDLEdBQUdjLEVBQUUsQ0FBQyxHQUFHZCxHQUFHLENBQUN1QyxLQUFLLENBQUMsR0FDdkMzQixHQUFHLENBQUNaLEdBQUcsQ0FBQ1AsQ0FBQyxDQUFDLEdBQUc2QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHQyxLQUFLLEdBQUdBLEtBQUssQ0FBQztNQUMxRCxDQUFHO01BRURqRCxFQUFFLENBQUNrRCxNQUFNLEdBQUcsVUFBUy9DLENBQUMsRUFBRTZCLEtBQUssRUFBRVksS0FBSyxFQUFFO1FBQ3BDLElBQUl6QyxDQUFDLEdBQUc2QixLQUFLLEVBQUU7RUFDYixRQUFBLE9BQU8sQ0FBQ0gsUUFBUTtFQUN0QixNQUFBO1FBQ0ksT0FBT25CLEdBQUcsQ0FBQ2tDLEtBQUssQ0FBQyxHQUFHQSxLQUFLLEdBQUdsQyxHQUFHLENBQUNzQixLQUFLLENBQUMsR0FBRyxDQUFDWSxLQUFLLEdBQUcsQ0FBQyxJQUFJbEMsR0FBRyxDQUFDUCxDQUFDLENBQUM7TUFDakUsQ0FBRztNQUVESCxFQUFFLENBQUNtRCxDQUFDLEdBQUssVUFBU2hELENBQUMsRUFBRTRCLFFBQVEsRUFBRUMsS0FBSyxFQUFFb0IsRUFBRSxFQUFFO0VBQ3hDQSxNQUFBQSxFQUFFLEdBQUdBLEVBQUUsR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHQSxFQUFFO1FBQzVCLE9BQU9sRCxNQUFNLENBQUMsQ0FBQ2tELEVBQUUsR0FBRyxDQUFDLElBQUUsQ0FBQyxDQUFDLEdBQUdsRCxNQUFNLENBQUNrRCxFQUFFLEdBQUMsQ0FBQyxDQUFDLEdBQUcxQyxHQUFHLENBQUNhLElBQUksQ0FBQ0MsRUFBRSxHQUFHNEIsRUFBRSxDQUFDLEdBQUdwQixLQUFLLENBQUMsR0FDOUR0QixHQUFHLENBQUNZLEdBQUcsQ0FBQyxDQUFDLEdBQUksQ0FBQyxHQUFDOEIsRUFBRSxHQUFJOUIsR0FBRyxDQUFDLENBQUNuQixDQUFDLEdBQUc0QixRQUFRLElBQUVDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFb0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxDQUFDO01BQzNFLENBQUc7O0VBRUg7RUFDQTtFQUNBO01BQ0VwRCxFQUFFLENBQUNxRCxPQUFPLEdBQUcsVUFBU2xELENBQUMsRUFBRXlDLEtBQUssRUFBRVosS0FBSyxFQUFFO0VBQ3JDLE1BQUEsSUFBSTdCLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDMEIsUUFBUTtRQUMzQixJQUFHMUIsQ0FBQyxLQUFLLENBQUMsSUFBSXlDLEtBQUssR0FBRyxDQUFDLEVBQUUsT0FBT2YsUUFBUTtRQUN4QyxJQUFJeUIsSUFBSSxHQUFHaEMsR0FBRyxDQUFDbkIsQ0FBQyxHQUFHNkIsS0FBSyxFQUFFWSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0VBQ3BDLE1BQUEsSUFBSVcsSUFBSSxHQUFHRCxJQUFJLElBQUluRCxDQUFDLEdBQUc2QixLQUFLLENBQUM7UUFDOUIsT0FBTyxDQUFDdUIsSUFBSSxHQUFHN0MsR0FBRyxDQUFDa0MsS0FBSyxHQUFHVSxJQUFJLEdBQUd0QixLQUFLLENBQUM7TUFDM0MsQ0FBRzs7RUFFSDtFQUNBO0VBQ0E7TUFDRWhDLEVBQUUsQ0FBQ3dELEtBQUssR0FBRyxVQUFTckQsQ0FBQyxFQUFFNEIsUUFBUSxFQUFFQyxLQUFLLEVBQUU7UUFDdEM3QixDQUFDLEdBQUdrQixHQUFHLENBQUMsQ0FBQ2xCLENBQUMsR0FBRzRCLFFBQVEsSUFBSUMsS0FBSyxDQUFDO0VBQy9CLE1BQUEsSUFBSXlCLENBQUMsR0FBR3JDLEdBQUcsQ0FBQyxDQUFDakIsQ0FBQyxDQUFDO0VBQ2YsTUFBQSxJQUFJdUQsQ0FBQyxHQUFHLEdBQUcsR0FBR0QsQ0FBQztRQUNmLE9BQU8sRUFBRXRELENBQUMsR0FBR08sR0FBRyxDQUFDc0IsS0FBSyxHQUFHMEIsQ0FBQyxHQUFHQSxDQUFDLENBQUMsQ0FBQztNQUNwQyxDQUFHO0VBRUQxRCxJQUFBQSxFQUFFLENBQUMyRCxTQUFTLEdBQUcsVUFBU3hELENBQUMsRUFBRXlELEtBQUssRUFBRTtRQUNoQyxJQUFJQyxTQUFTLEdBQUcsQ0FBQztRQUNqQixJQUFJQyxnQkFBZ0IsR0FBRyxDQUFDO1FBQ3hCLElBQUlDLHFCQUFxQixHQUFHLENBQUM7RUFDN0IsTUFBQSxJQUFJbkQsQ0FBQyxHQUFHZ0QsS0FBSyxDQUFDSSxNQUFNO1FBQ3BCLEtBQUksSUFBSUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHckQsQ0FBQyxFQUFFcUQsQ0FBQyxFQUFFLEVBQUU7RUFDekJKLFFBQUFBLFNBQVMsSUFBSUQsS0FBSyxDQUFDSyxDQUFDLENBQUM7RUFDckJILFFBQUFBLGdCQUFnQixJQUFJNUQsTUFBTSxDQUFDMEQsS0FBSyxDQUFDSyxDQUFDLENBQUMsQ0FBQztFQUNwQ0YsUUFBQUEscUJBQXFCLElBQUksQ0FBQ0gsS0FBSyxDQUFDSyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUl2RCxHQUFHLENBQUNQLENBQUMsQ0FBQzhELENBQUMsQ0FBQyxDQUFDO0VBQ3pELE1BQUE7RUFDSSxNQUFBLE9BQU8vRCxNQUFNLENBQUMyRCxTQUFTLENBQUMsR0FBR0MsZ0JBQWdCLEdBQUdDLHFCQUFxQjtNQUN2RSxDQUFHO0VBR0QvRCxJQUFBQSxFQUFFLENBQUNvQixHQUFHLEdBQUcsVUFBU2pCLENBQUMsRUFBRTBDLElBQUksRUFBRTtFQUN2QixNQUFBLE9BQU8xQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMwQixRQUFRLEdBQUduQixHQUFHLENBQUNtQyxJQUFJLENBQUMsR0FBRUEsSUFBSSxHQUFHMUMsQ0FBQztNQUNwRCxDQUFHO01BRURILEVBQUUsQ0FBQ2tFLElBQUksR0FBRyxVQUFTL0QsQ0FBQyxFQUFFZ0UsR0FBRyxFQUFFQyxHQUFHLEVBQUU7RUFDNUIsTUFBQSxPQUFRakUsQ0FBQyxHQUFHZ0UsR0FBRyxJQUFJaEUsQ0FBQyxHQUFHaUUsR0FBRyxHQUFJLENBQUN2QyxRQUFRLEdBQUduQixHQUFHLENBQUMsQ0FBQyxJQUFJMEQsR0FBRyxHQUFHRCxHQUFHLENBQUMsQ0FBQztNQUNwRSxDQUFHOztFQUVIO0VBQ0E7O0VBRUVuRSxJQUFBQSxFQUFFLENBQUNxRSxJQUFJLEdBQUcsVUFBU2xFLENBQUMsRUFBRW1FLElBQUksRUFBRTtFQUN4QixNQUFBLE9BQU8sRUFBRW5FLENBQUMsS0FBSyxDQUFDLElBQUlBLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDMEIsUUFBUSxHQUFHbkIsR0FBRyxDQUFDUCxDQUFDLEdBQUdtRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUduRSxDQUFDLEtBQUssQ0FBQyxHQUFHbUUsSUFBSSxDQUFDLENBQUM7TUFDckYsQ0FBRztFQUVEdEUsSUFBQUEsRUFBRSxDQUFDdUUsR0FBRyxHQUFHLFVBQVNwRSxDQUFDLEVBQUVxRSxLQUFLLEVBQUU7UUFDMUIsSUFBR3JFLENBQUMsR0FBRyxDQUFDLElBQUlBLENBQUMsR0FBR3FFLEtBQUssQ0FBQ1IsTUFBTSxFQUFFO0VBQzVCLFFBQUEsT0FBTyxDQUFDbkMsUUFBUTtFQUN0QixNQUFBLENBQUssTUFBTTtVQUNMLE9BQU9uQixHQUFHLENBQUU4RCxLQUFLLENBQUNyRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUU7RUFDaEMsTUFBQTtNQUNBLENBQUc7TUFFREgsRUFBRSxDQUFDeUUsS0FBSyxHQUFHLFVBQVN0RSxDQUFDLEVBQUV1RSxJQUFJLEVBQUVKLElBQUksRUFBRTtFQUNqQyxNQUFBLElBQUduRSxDQUFDLEdBQUd1RSxJQUFJLElBQUl2RSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0VBQ3BCLFFBQUEsT0FBTyxDQUFDMEIsUUFBUTtFQUN0QixNQUFBO0VBQ0ksTUFBQSxJQUFHeUMsSUFBSSxLQUFLLENBQUMsSUFBSUEsSUFBSSxLQUFLLENBQUMsRUFBRTtVQUMzQixPQUFRSSxJQUFJLEdBQUdKLElBQUksS0FBTW5FLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQzBCLFFBQVE7RUFDaEQsTUFBQTtRQUNJLE9BQU9mLE9BQU8sQ0FBQzRELElBQUksRUFBRXZFLENBQUMsQ0FBQyxHQUFHQSxDQUFDLEdBQUdPLEdBQUcsQ0FBQzRELElBQUksQ0FBQyxHQUFHLENBQUNJLElBQUksR0FBR3ZFLENBQUMsSUFBSU8sR0FBRyxDQUFDLENBQUMsR0FBRzRELElBQUksQ0FBQztNQUN4RSxDQUFHO01BbUJEdEUsRUFBRSxDQUFDMkUsTUFBTSxHQUFHLFVBQVN4RSxDQUFDLEVBQUV1RSxJQUFJLEVBQUVKLElBQUksRUFBRTtRQUNsQyxJQUFHbkUsQ0FBQyxHQUFHLENBQUMsRUFBRTtFQUNSLFFBQUEsT0FBTyxDQUFDMEIsUUFBUTtFQUN0QixNQUFBO1FBQ0ksT0FBT2YsT0FBTyxDQUFDWCxDQUFDLEdBQUd1RSxJQUFJLEdBQUcsQ0FBQyxFQUFFQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUd2RSxDQUFDLEdBQUdPLEdBQUcsQ0FBQyxDQUFDLEdBQUc0RCxJQUFJLENBQUMsR0FBR0ksSUFBSSxHQUFHaEUsR0FBRyxDQUFDNEQsSUFBSSxDQUFDO01BQ2pGLENBQUc7TUFFRHRFLEVBQUUsQ0FBQzRFLEtBQUssR0FBRyxVQUFTekUsQ0FBQyxFQUFFMEUsQ0FBQyxFQUFFakUsQ0FBQyxFQUFFRyxDQUFDLEVBQUU7RUFDOUIsTUFBQSxJQUFHWixDQUFDLEdBQUcsQ0FBQyxJQUFJQSxDQUFDLEdBQUdZLENBQUMsRUFBRTtFQUNqQixRQUFBLE9BQU8sQ0FBQ2MsUUFBUTtFQUN0QixNQUFBLENBQUssTUFBTTtVQUNQLE9BQU9mLE9BQU8sQ0FBQytELENBQUMsRUFBRTFFLENBQUMsQ0FBQyxHQUFHVyxPQUFPLENBQUNGLENBQUMsRUFBRUcsQ0FBQyxHQUFDWixDQUFDLENBQUMsR0FBR1csT0FBTyxDQUFDK0QsQ0FBQyxHQUFDakUsQ0FBQyxFQUFFRyxDQUFDLENBQUM7RUFDNUQsTUFBQTtNQUNBLENBQUc7RUFFRGYsSUFBQUEsRUFBRSxDQUFDOEUsSUFBSSxHQUFHLFVBQVMzRSxDQUFDLEVBQUU0RSxNQUFNLEVBQUU7RUFDMUIsTUFBQSxPQUFPNUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDMEIsUUFBUSxHQUFHbkIsR0FBRyxDQUFDcUUsTUFBTSxDQUFDLEdBQUc1RSxDQUFDLEdBQUc0RSxNQUFNLEdBQUdwRSxVQUFVLENBQUNSLENBQUMsQ0FBQztNQUN6RSxDQUFHO0VBRUQsSUFBQSxPQUFPSCxFQUFFO0VBQ1gsRUFBQSxDQUFDLENBQUM7Ozs7Ozs7OztFQzVSRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7SUFDQyxDQUFBLFVBQVVKLElBQUksRUFBRUMsT0FBTyxFQUFFO01BSWYsSUFBa0NDLE1BQU0sQ0FBQ0MsT0FBTyxFQUFFO0VBQzdEO0VBQ0E7RUFDQTtFQUNRRCxNQUFBQSxNQUFBLENBQUFDLE9BQUEsR0FBaUJGLE9BQU8sRUFBRTtFQUNsQyxJQUFBLENBQUssTUFBTTtFQUNYO0VBQ1FELE1BQUFBLElBQUksQ0FBQ29GLElBQUksR0FBR25GLE9BQU8sRUFBRTtFQUM3QixJQUFBO0lBQ0EsQ0FBQyxFQUFDSSxJQUFJLEVBQUUsWUFBVTtFQUVsQjtFQUNBOztFQUVBO0VBQ0E7O0VBRUE7RUFDRSxJQUFBLElBQUlnRixLQUFLLEdBQUcsVUFBU2QsR0FBRyxFQUFFQyxHQUFHLEVBQUU7UUFDN0IsT0FBT2pELElBQUksQ0FBQytELE1BQU0sRUFBRSxJQUFJZCxHQUFHLEdBQUdELEdBQUcsQ0FBQyxHQUFHQSxHQUFHO01BQzVDLENBQUc7O0VBRUg7RUFDRSxJQUFBLElBQUlnQixjQUFjLEdBQUcsVUFBU2hCLEdBQUcsRUFBRUMsR0FBRyxFQUFFO0VBQ3RDLE1BQUEsT0FBT2pELElBQUksQ0FBQ2lFLEtBQUssQ0FBQ2pFLElBQUksQ0FBQytELE1BQU0sRUFBRSxJQUFJZCxHQUFHLEdBQUdELEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHQSxHQUFHO01BQzVELENBQUc7O0VBRUg7RUFDQTtFQUNBO0VBQ0UsSUFBQSxJQUFJa0IsS0FBSyxHQUFHLFVBQVNuRCxJQUFJLEVBQUVDLEVBQUUsRUFBRTtRQUM3QixJQUFJbUQsQ0FBQyxFQUFFQyxDQUFDLEVBQUVwRixDQUFDLEVBQUVLLENBQUMsRUFBRWdGLENBQUM7UUFDakIsR0FBRztFQUNERixRQUFBQSxDQUFDLEdBQUduRSxJQUFJLENBQUMrRCxNQUFNLEVBQUU7VUFDakJLLENBQUMsR0FBRyxNQUFNLElBQUlwRSxJQUFJLENBQUMrRCxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUM7VUFDbEMvRSxDQUFDLEdBQUdtRixDQUFDLEdBQUcsUUFBUTtVQUNoQjlFLENBQUMsR0FBR1csSUFBSSxDQUFDRSxHQUFHLENBQUNrRSxDQUFDLENBQUMsR0FBRyxRQUFRO0VBQzFCQyxRQUFBQSxDQUFDLEdBQUdyRixDQUFDLEdBQUdBLENBQUMsR0FBR0ssQ0FBQyxJQUFJLE9BQU8sR0FBR0EsQ0FBQyxHQUFHLE9BQU8sR0FBR0wsQ0FBQyxDQUFDO1FBQ2pELENBQUssUUFBUXFGLENBQUMsR0FBRyxPQUFPLEtBQUtBLENBQUMsR0FBRyxPQUFPLElBQUlELENBQUMsR0FBR0EsQ0FBQyxHQUFHLEVBQUUsR0FBR3BFLElBQUksQ0FBQ1QsR0FBRyxDQUFDNEUsQ0FBQyxDQUFDLEdBQUdBLENBQUMsR0FBR0EsQ0FBQyxDQUFDO0VBRXpFLE1BQUEsT0FBUUMsQ0FBQyxHQUFHRCxDQUFDLEdBQUluRCxFQUFFLEdBQUdELElBQUk7TUFDOUIsQ0FBRzs7RUFHSDtFQUNBO0VBQ0E7RUFDQTtFQUNFLElBQUEsSUFBSXVELFVBQVUsR0FBRyxVQUFTQyxHQUFHLEVBQUU7RUFDOUIsTUFBQSxTQUFTQyxLQUFLQSxDQUFDQyxJQUFJLEVBQUVDLE1BQU0sRUFBRUMsUUFBUSxFQUFFO0VBQ3RDLFFBQUEsSUFBSUMsSUFBSTtZQUFFQyxDQUFDO1lBQUtDLEtBQUssR0FBRztVQUN4QixLQUFJRixJQUFJLElBQUlGLE1BQU0sRUFBQztFQUN2QjtFQUNBO0VBQ0E7RUFDS0csVUFBQUEsQ0FBQyxHQUFHSCxNQUFNLENBQUNFLElBQUksQ0FBQztZQUNoQixJQUFHLEVBQUVBLElBQUksSUFBSUgsSUFBSSxDQUFDLElBQUtBLElBQUksQ0FBQ0csSUFBSSxDQUFDLEtBQUtDLENBQUMsS0FBSyxFQUFFRCxJQUFJLElBQUlFLEtBQUssQ0FBQyxJQUFJQSxLQUFLLENBQUNGLElBQUksQ0FBQyxLQUFLQyxDQUFDLENBQUUsRUFBQztjQUNuRkosSUFBSSxDQUFDRyxJQUFJLENBQUMsR0FBR0QsUUFBUSxHQUFHQSxRQUFRLENBQUNFLENBQUMsQ0FBQyxHQUFHQSxDQUFDO0VBQzdDLFVBQUE7RUFDQSxRQUFBO0VBQ0ksUUFBQSxPQUFPSixJQUFJO0VBQ2YsTUFBQTtRQUNHLElBQUcsQ0FBQ0YsR0FBRyxJQUFJLE9BQU9BLEdBQUcsSUFBSSxRQUFRLElBQUlRLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDQyxRQUFRLENBQUNDLElBQUksQ0FBQ1gsR0FBRyxDQUFDLEtBQUssbUJBQW1CLEVBQUM7RUFDcEc7VUFDSSxPQUFPQSxHQUFHLENBQUM7RUFDZixNQUFBO0VBQ0csTUFBQSxJQUFHQSxHQUFHLENBQUNZLFFBQVEsSUFBSSxXQUFXLElBQUlaLEdBQUcsRUFBQztFQUN6QztFQUNJLFFBQUEsT0FBT0EsR0FBRyxDQUFDYSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDL0IsTUFBQTtRQUNHLElBQUdiLEdBQUcsWUFBWWMsSUFBSSxFQUFDO0VBQzFCO1VBQ0ksT0FBTyxJQUFJQSxJQUFJLENBQUNkLEdBQUcsQ0FBQ2UsT0FBTyxFQUFFLENBQUMsQ0FBQztFQUNuQyxNQUFBO1FBQ0csSUFBR2YsR0FBRyxZQUFZZ0IsTUFBTSxFQUFDO0VBQzVCO0VBQ0ksUUFBQSxPQUFPLElBQUlBLE1BQU0sQ0FBQ2hCLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLE1BQUE7RUFDRyxNQUFBLElBQUlpQixDQUFDLEVBQUUxQyxDQUFDLEVBQUUyQyxDQUFDO1FBQ1gsSUFBR2xCLEdBQUcsWUFBWW1CLEtBQUssRUFBQztFQUMzQjtFQUNJRixRQUFBQSxDQUFDLEdBQUcsRUFBRTtFQUNOLFFBQUEsS0FBSTFDLENBQUMsR0FBRyxDQUFDLEVBQUUyQyxDQUFDLEdBQUdsQixHQUFHLENBQUMxQixNQUFNLEVBQUVDLENBQUMsR0FBRzJDLENBQUMsRUFBRSxFQUFFM0MsQ0FBQyxFQUFDO1lBQ3JDLElBQUdBLENBQUMsSUFBSXlCLEdBQUcsRUFBQztjQUNYaUIsQ0FBQyxDQUFDRyxJQUFJLENBQUNyQixVQUFVLENBQUNDLEdBQUcsQ0FBQ3pCLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDaEMsVUFBQTtFQUNBLFFBQUE7RUFDQSxNQUFBLENBQUksTUFBTTtFQUNWO0VBQ0kwQyxRQUFBQSxDQUFDLEdBQUdqQixHQUFHLENBQUNxQixXQUFXLEdBQUcsSUFBSXJCLEdBQUcsQ0FBQ3FCLFdBQVcsRUFBRSxHQUFHLEVBQUU7RUFDcEQsTUFBQTtFQUNHLE1BQUEsT0FBT3BCLEtBQUssQ0FBQ2dCLENBQUMsRUFBRWpCLEdBQUcsRUFBRUQsVUFBVSxDQUFDO01BQ25DLENBQUc7O0VBRUg7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNFLElBQUEsSUFBSXVCLGdCQUFnQixHQUFHLFVBQVM3RyxDQUFDLEVBQUU7RUFDakMsTUFBQSxJQUFHMEcsS0FBSyxDQUFDSSxPQUFPLENBQUM5RyxDQUFDLENBQUMsRUFBRTtVQUNuQixJQUFHMEcsS0FBSyxDQUFDSSxPQUFPLENBQUM5RyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtFQUM5QjtZQUNRLElBQUkrRyxNQUFNLEdBQUcsRUFBRTtFQUNmLFVBQUEsS0FBSSxJQUFJakQsQ0FBQyxHQUFHLENBQUMsRUFBRUQsTUFBTSxHQUFHN0QsQ0FBQyxDQUFDNkQsTUFBTSxFQUFFQyxDQUFDLEdBQUdELE1BQU0sRUFBRUMsQ0FBQyxFQUFFLEVBQUU7Y0FDakRpRCxNQUFNLENBQUNKLElBQUksQ0FBQ0UsZ0JBQWdCLENBQUM3RyxDQUFDLENBQUM4RCxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzdDLFVBQUE7RUFDUSxVQUFBLE9BQU9pRCxNQUFNO0VBQ3JCLFFBQUEsQ0FBTyxNQUFNO0VBQUE7RUFDTCxVQUFBLE9BQU8vRyxDQUFDLENBQUNnSCxLQUFLLENBQUMsQ0FBQyxDQUFDO0VBQ3pCLFFBQUE7RUFDQSxNQUFBLENBQUssTUFBTTtFQUFBO0VBQ0wsUUFBQSxPQUFPaEgsQ0FBQztFQUNkLE1BQUE7TUFDQSxDQUFHOztFQUVIO0VBQ0E7RUFDRSxJQUFBLElBQUlpSCxTQUFTLEdBQUcsVUFBU0MsTUFBTSxFQUFFO0VBQzdCLE1BQUEsT0FBTyxPQUFPQSxNQUFNLElBQUksUUFBUSxJQUFLLE9BQU9BLE1BQU0sSUFBSSxRQUFRLElBQUlBLE1BQU0sQ0FBQ04sV0FBVyxLQUFLTyxNQUFPO01BQ3RHLENBQUc7O0VBRUg7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0UsSUFBQSxJQUFJQyxZQUFZLEdBQUcsVUFBU0MsR0FBRyxFQUFFQyxJQUFJLEVBQUU7UUFDckMsSUFBSUMsR0FBRyxHQUFHLElBQUliLEtBQUssQ0FBQ1csR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzNCLE1BQUEsSUFBSXZELENBQUM7RUFDTCxNQUFBLElBQUd1RCxHQUFHLENBQUN4RCxNQUFNLElBQUksQ0FBQyxFQUFFO0VBQUE7RUFDbEIsUUFBQSxJQUFHLE9BQU95RCxJQUFJLEtBQUssVUFBVSxFQUFFO0VBQzdCLFVBQUEsS0FBSXhELENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3VELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRXZELENBQUMsRUFBRSxFQUFFO0VBQzFCeUQsWUFBQUEsR0FBRyxDQUFDekQsQ0FBQyxDQUFDLEdBQUd3RCxJQUFJLEVBQUU7RUFDekIsVUFBQTtFQUNBLFFBQUEsQ0FBTyxNQUFNO0VBQ0wsVUFBQSxLQUFJeEQsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHdUQsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFdkQsQ0FBQyxFQUFFLEVBQUU7RUFDMUJ5RCxZQUFBQSxHQUFHLENBQUN6RCxDQUFDLENBQUMsR0FBR3dELElBQUk7RUFDdkIsVUFBQTtFQUNBLFFBQUE7RUFDQSxNQUFBLENBQUssTUFBTSxJQUFHRCxHQUFHLENBQUN4RCxNQUFNLEdBQUcsQ0FBQyxFQUFFO0VBQ3hCLFFBQUEsS0FBSUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHdUQsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFdkQsQ0FBQyxFQUFFLEVBQUU7RUFDMUJ5RCxVQUFBQSxHQUFHLENBQUN6RCxDQUFDLENBQUMsR0FBR3NELFlBQVksQ0FBQ0MsR0FBRyxDQUFDTCxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUVNLElBQUksQ0FBQztFQUNqRCxRQUFBO0VBQ0EsTUFBQSxDQUFLLE1BQU07RUFDTCxRQUFBLE1BQU0saURBQWlEO0VBQzdELE1BQUE7RUFDSSxNQUFBLE9BQU9DLEdBQUc7TUFDZCxDQUFHOztFQUVIO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDRSxJQUFBLElBQUlDLFNBQVMsR0FBRyxVQUFTMUcsQ0FBQyxFQUFFO1FBQzFCLElBQUc0RixLQUFLLENBQUNJLE9BQU8sQ0FBQ2hHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0VBQ3RCLFFBQUEsT0FBTyxDQUFDQSxDQUFDLENBQUMrQyxNQUFNLENBQUMsQ0FBQzRELE1BQU0sQ0FBQ0QsU0FBUyxDQUFDMUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDL0MsTUFBQSxDQUFLLE1BQU07RUFDTCxRQUFBLE9BQU8sQ0FBQ0EsQ0FBQyxDQUFDK0MsTUFBTSxDQUFDO0VBQ3ZCLE1BQUE7TUFDQSxDQUFHOztFQUVIO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDRSxJQUFBLElBQUk2RCxXQUFXLEdBQUcsVUFBVUMsRUFBRSxFQUFFQyxFQUFFLEVBQUU7UUFDaEMsSUFBSUQsRUFBRSxDQUFDOUQsTUFBTSxJQUFJK0QsRUFBRSxDQUFDL0QsTUFBTSxFQUFFLE9BQU8sS0FBSztFQUN4QyxNQUFBLEtBQUssSUFBSUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHNkQsRUFBRSxDQUFDOUQsTUFBTSxFQUFFQyxDQUFDLEVBQUUsRUFBRTtFQUMxQztFQUNVLFFBQUEsSUFBSTRDLEtBQUssQ0FBQ0ksT0FBTyxDQUFDYSxFQUFFLENBQUM3RCxDQUFDLENBQUMsQ0FBQyxJQUFJNEMsS0FBSyxDQUFDSSxPQUFPLENBQUNjLEVBQUUsQ0FBQzlELENBQUMsQ0FBQyxDQUFDLEVBQUU7RUFDNUQ7RUFDYyxVQUFBLElBQUksQ0FBQzRELFdBQVcsQ0FBQ0MsRUFBRSxDQUFDN0QsQ0FBQyxDQUFDLEVBQUU4RCxFQUFFLENBQUM5RCxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sS0FBSztVQUMxRCxDQUFXLE1BQ0ksSUFBSTZELEVBQUUsQ0FBQzdELENBQUMsQ0FBQyxJQUFJOEQsRUFBRSxDQUFDOUQsQ0FBQyxDQUFDLEVBQUU7RUFDbkM7RUFDYyxVQUFBLE9BQU8sS0FBSztFQUMxQixRQUFBO0VBQ0EsTUFBQTtFQUNNLE1BQUEsT0FBTyxJQUFJO01BQ2pCLENBQUc7O0VBRUg7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNFLElBQUEsSUFBSStELGtCQUFrQixHQUFHLFVBQVMvRyxDQUFDLEVBQUVnSCxHQUFHLEVBQUU7RUFDeEMsTUFBQSxJQUFHcEIsS0FBSyxDQUFDSSxPQUFPLENBQUNoRyxDQUFDLENBQUMsRUFBRTtVQUNuQixJQUFJaUgsTUFBTSxHQUFHLElBQUlyQixLQUFLLENBQUM1RixDQUFDLENBQUMrQyxNQUFNLENBQUM7RUFDaEMsUUFBQSxLQUFJLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR2hELENBQUMsQ0FBQytDLE1BQU0sRUFBRUMsQ0FBQyxFQUFFLEVBQUU7RUFDaENpRSxVQUFBQSxNQUFNLENBQUNqRSxDQUFDLENBQUMsR0FBRytELGtCQUFrQixDQUFDL0csQ0FBQyxDQUFDZ0QsQ0FBQyxDQUFDLEVBQUVnRSxHQUFHLENBQUM7RUFDakQsUUFBQTtFQUNNLFFBQUEsT0FBT0MsTUFBTTtFQUNuQixNQUFBLENBQUssTUFBTTtVQUNMLE9BQU9ELEdBQUcsQ0FBQ2hILENBQUMsQ0FBQztFQUNuQixNQUFBO01BQ0EsQ0FBRzs7RUFFSDtFQUNBO0VBQ0E7RUFDQTtNQUNFLFNBQVNrSCxhQUFhQSxDQUFDQyxLQUFLLEVBQUU7RUFDMUIsTUFBQSxLQUFLLElBQUluRSxDQUFDLEdBQUdtRSxLQUFLLENBQUNwRSxNQUFNLEdBQUcsQ0FBQyxFQUFFQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEVBQUUsRUFBRTtFQUN2QyxRQUFBLElBQUk3RCxDQUFDLEdBQUdlLElBQUksQ0FBQ2lFLEtBQUssQ0FBQ2pFLElBQUksQ0FBQytELE1BQU0sRUFBRSxJQUFJakIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQzNDLFFBQUEsSUFBSW9FLElBQUksR0FBR0QsS0FBSyxDQUFDbkUsQ0FBQyxDQUFDO0VBQ25CbUUsUUFBQUEsS0FBSyxDQUFDbkUsQ0FBQyxDQUFDLEdBQUdtRSxLQUFLLENBQUNoSSxDQUFDLENBQUM7RUFDbkJnSSxRQUFBQSxLQUFLLENBQUNoSSxDQUFDLENBQUMsR0FBR2lJLElBQUk7RUFDekIsTUFBQTtFQUNNLE1BQUEsT0FBT0QsS0FBSztFQUNsQixJQUFBOztFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNFLElBQUEsSUFBSUUseUJBQXlCLEdBQUcsVUFBU3JILENBQUMsRUFBRWdILEdBQUcsRUFBRTtFQUMvQyxNQUFBLElBQUdwQixLQUFLLENBQUNJLE9BQU8sQ0FBQ2hHLENBQUMsQ0FBQyxFQUFFO0VBQ25CLFFBQUEsSUFBSXNILEdBQUcsR0FBR3RILENBQUMsQ0FBQytDLE1BQU07RUFDbEIsUUFBQSxJQUFJQyxDQUFDO1VBQ0wsSUFBSXVFLFFBQVEsR0FBRyxFQUFFO1VBQ2pCLEtBQUl2RSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdzRSxHQUFHLEVBQUV0RSxDQUFDLEVBQUUsRUFBRTtFQUN2QnVFLFVBQUFBLFFBQVEsQ0FBQ3ZFLENBQUMsQ0FBQyxHQUFHQSxDQUFDO0VBQ3ZCLFFBQUE7VUFDTWtFLGFBQWEsQ0FBQ0ssUUFBUSxDQUFDO1VBQ3ZCLElBQUlOLE1BQU0sR0FBRyxFQUFFO1VBRWYsS0FBSWpFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3NFLEdBQUcsRUFBRXRFLENBQUMsRUFBRSxFQUFFO0VBQ3ZCLFVBQUEsSUFBSXdFLE9BQU8sR0FBR0QsUUFBUSxDQUFDdkUsQ0FBQyxDQUFDO0VBQ3pCaUUsVUFBQUEsTUFBTSxDQUFDTyxPQUFPLENBQUMsR0FBR1Qsa0JBQWtCLENBQUMvRyxDQUFDLENBQUN3SCxPQUFPLENBQUMsRUFBRVIsR0FBRyxDQUFDO0VBQzdELFFBQUE7RUFDTSxRQUFBLE9BQU9DLE1BQU07RUFDbkIsTUFBQSxDQUFLLE1BQU07VUFDTCxPQUFPRCxHQUFHLENBQUNoSCxDQUFDLENBQUM7RUFDbkIsTUFBQTtNQUNBLENBQUc7O0VBRUg7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO01BQ0UsSUFBSXlILFVBQVUsR0FBRyxVQUFTQyxXQUFXLEVBQUVDLE9BQU8sRUFBRUMsWUFBWSxFQUFFO0VBQzVERCxNQUFBQSxPQUFPLEdBQUdBLE9BQU8sSUFBSSxFQUFFO1FBQ3ZCLE9BQU9BLE9BQU8sQ0FBQ0UsY0FBYyxDQUFDSCxXQUFXLENBQUMsSUFDbkNDLE9BQU8sQ0FBQ0QsV0FBVyxDQUFDLEtBQUtJLFNBQVMsSUFDbENILE9BQU8sQ0FBQ0QsV0FBVyxDQUFDLEtBQUssSUFBSSxHQUFHQyxPQUFPLENBQUNELFdBQVcsQ0FBQyxHQUFHRSxZQUFZO01BQzlFLENBQUc7O0VBRUg7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO01BQ0UsSUFBSUcsbUJBQW1CLEdBQUcsVUFBU0wsV0FBVyxFQUFFQyxPQUFPLEVBQUVwQixHQUFHLEVBQUVxQixZQUFZLEVBQUU7UUFDMUUsSUFBSUksS0FBSyxHQUFHUCxVQUFVLENBQUNDLFdBQVcsRUFBRUMsT0FBTyxFQUFFQyxZQUFZLENBQUM7RUFDekQsTUFBQSxJQUFHLENBQUVoQyxLQUFLLENBQUNJLE9BQU8sQ0FBQ2dDLEtBQUssQ0FBQyxFQUFFO0VBQ3pCQSxRQUFBQSxLQUFLLEdBQUcxQixZQUFZLENBQUNDLEdBQUcsRUFBRXlCLEtBQUssQ0FBQztFQUN2QyxNQUFBO1FBQ0ssSUFBRyxDQUFFcEIsV0FBVyxDQUFFRixTQUFTLENBQUNzQixLQUFLLENBQUMsRUFBRXpCLEdBQUcsQ0FBQyxFQUFFO0VBQ3hDLFFBQUEsTUFBTSxhQUFhLEdBQUdtQixXQUFXLEdBQUcsb0JBQW9CLEdBQ2xEaEIsU0FBUyxDQUFDc0IsS0FBSyxDQUFDLEdBQUcsbUJBQW1CLEdBQUd6QixHQUFHLEdBQUcsSUFBSTtFQUNoRSxNQUFBO0VBQ0ssTUFBQSxPQUFPeUIsS0FBSztNQUNqQixDQUFHOztFQUVIO0VBQ0E7O0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtNQUNFLElBQUlDLGdCQUFnQixHQUFHLFVBQVNDLElBQUksRUFBRUMsS0FBSyxFQUFFQyxLQUFLLEVBQUU7UUFDbEQsSUFBR0QsS0FBSyxHQUFHQyxLQUFLLEVBQUU7RUFDaEIsUUFBQSxNQUFNLDhEQUE4RDtFQUMxRSxNQUFBO1FBQ0ksSUFBR0YsSUFBSSxLQUFLLE1BQU0sRUFBRTtVQUNsQixJQUFHQyxLQUFLLEtBQUssQ0FBQ3ZILFFBQVEsSUFBSXdILEtBQUssS0FBS3hILFFBQVEsRUFBRTtFQUM1QyxVQUFBLE9BQU8sR0FBRztFQUNsQixRQUFBLENBQU8sTUFBTSxJQUFHdUgsS0FBSyxLQUFLLENBQUN2SCxRQUFRLEVBQUU7WUFDN0IsT0FBT3dILEtBQUssR0FBRyxHQUFHO0VBQzFCLFFBQUEsQ0FBTyxNQUFNLElBQUdBLEtBQUssS0FBS3hILFFBQVEsRUFBRTtZQUM1QixPQUFPdUgsS0FBSyxHQUFHLEdBQUc7RUFDMUIsUUFBQSxDQUFPLE1BQU0sSUFBR0EsS0FBSyxJQUFJQyxLQUFLLEVBQUU7RUFDeEIsVUFBQSxPQUFPLENBQUNELEtBQUssR0FBR0MsS0FBSyxJQUFJLENBQUM7RUFDbEMsUUFBQTtFQUNBLE1BQUEsQ0FBSyxNQUFNLElBQUdGLElBQUksS0FBSyxLQUFLLEVBQUU7VUFDeEIsSUFBR0MsS0FBSyxLQUFLLENBQUN2SCxRQUFRLElBQUl3SCxLQUFLLEtBQUt4SCxRQUFRLEVBQUU7RUFDNUMsVUFBQSxPQUFPLENBQUM7RUFDaEIsUUFBQSxDQUFPLE1BQU0sSUFBR3VILEtBQUssS0FBSyxDQUFDdkgsUUFBUSxFQUFFO1lBQzdCLE9BQU93SCxLQUFLLEdBQUcsQ0FBQztFQUN4QixRQUFBLENBQU8sTUFBTSxJQUFHQSxLQUFLLEtBQUt4SCxRQUFRLEVBQUU7WUFDNUIsT0FBT3VILEtBQUssR0FBRyxDQUFDO0VBQ3hCLFFBQUEsQ0FBTyxNQUFNLElBQUdBLEtBQUssSUFBSUMsS0FBSyxFQUFDO1lBQ3ZCLE9BQU9sSSxJQUFJLENBQUNtSSxLQUFLLENBQUMsQ0FBQ0YsS0FBSyxHQUFHQyxLQUFLLElBQUksQ0FBQyxDQUFDO0VBQzlDLFFBQUE7RUFDQSxNQUFBLENBQUssTUFBTSxJQUFHRixJQUFJLEtBQUssUUFBUSxFQUFFO0VBQzNCLFFBQUEsT0FBTyxDQUFDO0VBQ2QsTUFBQTtFQUNJLE1BQUEsTUFBTSx5Q0FBeUMsR0FBR0EsSUFBSSxHQUFHLEdBQUcsR0FBR0MsS0FBSyxHQUFHLElBQUksR0FBR0MsS0FBSyxHQUFHLEdBQUc7TUFDN0YsQ0FBRzs7RUFFSDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0UsSUFBQSxJQUFJRSxlQUFlLEdBQUksVUFBU0Msa0JBQWtCLEVBQUVDLFVBQVUsRUFBRTtFQUM5RCxNQUFBLElBQUlDLE1BQU0sR0FBR2pFLFVBQVUsQ0FBQytELGtCQUFrQixDQUFDO0VBQzNDLE1BQUEsS0FBSyxJQUFJRyxVQUFVLElBQUlELE1BQU0sRUFBRTtFQUFFLFFBQUEsSUFBSSxDQUFDQSxNQUFNLENBQUNaLGNBQWMsQ0FBQ2EsVUFBVSxDQUFDLEVBQUU7RUFDdkUsUUFBQSxJQUFJQyxLQUFLLEdBQUdGLE1BQU0sQ0FBQ0MsVUFBVSxDQUFDO0VBQzlCLFFBQUEsSUFBSSxDQUFDQyxLQUFLLENBQUNkLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNqQ2MsS0FBSyxDQUFDVCxJQUFJLEdBQUcsTUFBTTtFQUMzQixRQUFBO0VBQ00sUUFBQSxJQUFHLENBQUNTLEtBQUssQ0FBQ2QsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFO0VBQy9CYyxVQUFBQSxLQUFLLENBQUNwQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDdkIsUUFBQTtFQUNNLFFBQUEsSUFBR0osU0FBUyxDQUFDd0MsS0FBSyxDQUFDcEMsR0FBRyxDQUFDLEVBQUU7RUFDdkJvQyxVQUFBQSxLQUFLLENBQUNwQyxHQUFHLEdBQUcsQ0FBQ29DLEtBQUssQ0FBQ3BDLEdBQUcsQ0FBQztFQUMvQixRQUFBO0VBQ00sUUFBQSxJQUFHb0MsS0FBSyxDQUFDVCxJQUFJLElBQUksUUFBUSxFQUFFO1lBQ3pCUyxLQUFLLENBQUNQLEtBQUssR0FBRyxDQUFDO1lBQ2ZPLEtBQUssQ0FBQ1IsS0FBSyxHQUFHLENBQUM7RUFDdkIsUUFBQTtFQUNNLFFBQUEsSUFBRyxDQUFDUSxLQUFLLENBQUNkLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNqQ2MsS0FBSyxDQUFDUCxLQUFLLEdBQUd4SCxRQUFRO0VBQzlCLFFBQUE7RUFDTSxRQUFBLElBQUcsQ0FBQytILEtBQUssQ0FBQ2QsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO0VBQ2pDYyxVQUFBQSxLQUFLLENBQUNSLEtBQUssR0FBRyxDQUFDdkgsUUFBUTtFQUMvQixRQUFBO0VBRU0sUUFBQSxJQUFHK0gsS0FBSyxDQUFDZCxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUU7RUFDdkM7RUFDUSxVQUFBLElBQUdqQixXQUFXLENBQUMrQixLQUFLLENBQUNwQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU9vQyxLQUFLLENBQUNuQyxJQUFJLEtBQUssVUFBVSxFQUFFO0VBQzVFO0VBQ1VtQyxZQUFBQSxLQUFLLENBQUNuQyxJQUFJLEdBQUdtQyxLQUFLLENBQUNuQyxJQUFJLEVBQUU7WUFDbkMsQ0FBUyxNQUFNLElBQUcsQ0FBQ0ksV0FBVyxDQUFDK0IsS0FBSyxDQUFDcEMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDWCxLQUFLLENBQUNJLE9BQU8sQ0FBQzJDLEtBQUssQ0FBQ25DLElBQUksQ0FBQyxFQUFFO0VBQzlFO0VBQ0E7RUFDQTtFQUNRbUMsWUFBQUEsS0FBSyxDQUFDbkMsSUFBSSxHQUFHRixZQUFZLENBQUNxQyxLQUFLLENBQUNwQyxHQUFHLEVBQUVvQyxLQUFLLENBQUNuQyxJQUFJLENBQUM7RUFDeEQsVUFBQTtFQUNBLFFBQUEsQ0FBTyxNQUFNO0VBQUE7WUFDTCxJQUFHSSxXQUFXLENBQUMrQixLQUFLLENBQUNwQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0VBQzlCb0MsWUFBQUEsS0FBSyxDQUFDbkMsSUFBSSxHQUFHZ0MsVUFBVSxDQUFDRyxLQUFLLENBQUNULElBQUksRUFBRVMsS0FBSyxDQUFDUixLQUFLLEVBQUVRLEtBQUssQ0FBQ1AsS0FBSyxDQUFDO0VBQ3ZFLFVBQUEsQ0FBUyxNQUFNO2NBQ0xPLEtBQUssQ0FBQ25DLElBQUksR0FBR0YsWUFBWSxDQUFDcUMsS0FBSyxDQUFDcEMsR0FBRyxFQUFFLFlBQVc7RUFDOUMsY0FBQSxPQUFPaUMsVUFBVSxDQUFDRyxLQUFLLENBQUNULElBQUksRUFBRVMsS0FBSyxDQUFDUixLQUFLLEVBQUVRLEtBQUssQ0FBQ1AsS0FBSyxDQUFDO0VBQ25FLFlBQUEsQ0FBVyxDQUFDO0VBQ1osVUFBQTtFQUNBLFFBQUE7RUFDQSxNQUFBO0VBQ0ksTUFBQSxPQUFPSyxNQUFNO01BQ2pCLENBQUc7O0VBR0g7RUFDQTs7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO01BQ0UsSUFBSUcsT0FBTyxHQUFHLFVBQVNILE1BQU0sRUFBRUksS0FBSyxFQUFFQyxRQUFRLEVBQUU7UUFDOUMsSUFBSSxDQUFDTCxNQUFNLEdBQUdBLE1BQU07UUFDcEIsSUFBSSxDQUFDSSxLQUFLLEdBQUdBLEtBQUs7UUFDbEIsSUFBSSxDQUFDQyxRQUFRLEdBQUdBLFFBQVE7TUFDNUIsQ0FBRzs7RUFFSDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0VGLElBQUFBLE9BQU8sQ0FBQzFELFNBQVMsQ0FBQzZELElBQUksR0FBRyxZQUFXO0VBQ2xDLE1BQUEsTUFBTSx3Q0FBd0M7TUFDbEQsQ0FBRzs7RUFFSDtFQUNBO0VBQ0E7RUFDRUgsSUFBQUEsT0FBTyxDQUFDMUQsU0FBUyxDQUFDOEQsZ0JBQWdCLEdBQUcsWUFBVztFQUNsRDtNQUFBLENBQ0c7O0VBRUg7RUFDQTtFQUNBO0VBQ0VKLElBQUFBLE9BQU8sQ0FBQzFELFNBQVMsQ0FBQytELGVBQWUsR0FBRyxZQUFXO0VBQ2pEO01BQUEsQ0FDRzs7RUFFSDtFQUNBO0VBQ0E7RUFDRUwsSUFBQUEsT0FBTyxDQUFDMUQsU0FBUyxDQUFDZ0UsSUFBSSxHQUFHLFlBQVc7RUFDdEM7RUFDSSxNQUFBLE9BQU8sRUFBRTtNQUNiLENBQUc7O0VBR0g7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNFLElBQUEsSUFBSUMsdUJBQXVCLEdBQUcsVUFBU1YsTUFBTSxFQUFFSSxLQUFLLEVBQUVDLFFBQVEsRUFBRW5CLE9BQU8sRUFBRXlCLGlCQUFpQixFQUFFO1FBQzFGUixPQUFPLENBQUN4RCxJQUFJLENBQUMsSUFBSSxFQUFFcUQsTUFBTSxFQUFFSSxLQUFLLEVBQUVDLFFBQVEsQ0FBQztRQUUzQyxJQUFJTyxXQUFXLEdBQUdwRSxNQUFNLENBQUNxRSxJQUFJLENBQUMsSUFBSSxDQUFDYixNQUFNLENBQUM7RUFDMUMsTUFBQSxJQUFHWSxXQUFXLENBQUN0RyxNQUFNLElBQUssQ0FBQyxFQUFFO0VBQzNCLFFBQUEsTUFBTSx3REFBd0Q7RUFDcEUsTUFBQTtFQUNJLE1BQUEsSUFBSSxDQUFDMkYsVUFBVSxHQUFHVyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLElBQUlWLEtBQUssR0FBRyxJQUFJLENBQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUNDLFVBQVUsQ0FBQztRQUN4QyxJQUFHLENBQUM5QixXQUFXLENBQUMrQixLQUFLLENBQUNwQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0VBQy9CLFFBQUEsTUFBTSx3RUFBd0U7RUFDcEYsTUFBQTtFQUNJLE1BQUEsSUFBSSxDQUFDNEIsS0FBSyxHQUFHUSxLQUFLLENBQUNSLEtBQUs7RUFDeEIsTUFBQSxJQUFJLENBQUNDLEtBQUssR0FBR08sS0FBSyxDQUFDUCxLQUFLO1FBRXhCLElBQUksQ0FBQ21CLGNBQWMsR0FBTzlCLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUM2QixVQUFVLEdBQVcvQixVQUFVLENBQUMsWUFBWSxFQUFFRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQy9ELElBQUksQ0FBQzhCLGNBQWMsR0FBT2hDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRUUsT0FBTyxFQUFFLElBQUksQ0FBQztRQUNyRSxJQUFJLENBQUMrQixrQkFBa0IsR0FBR2pDLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRUUsT0FBTyxFQUFFLEdBQUcsQ0FBQztRQUN4RSxJQUFJLENBQUNnQyxrQkFBa0IsR0FBR2xDLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRUUsT0FBTyxFQUFFLElBQUksQ0FBQztRQUN6RSxJQUFJLENBQUNpQyxXQUFXLEdBQVVuQyxVQUFVLENBQUMsYUFBYSxFQUFFRSxPQUFPLEVBQUUsSUFBSSxDQUFDO1FBRWxFLElBQUksQ0FBQ3lCLGlCQUFpQixHQUFHQSxpQkFBaUI7UUFFMUMsSUFBSSxDQUFDUyxnQkFBZ0IsR0FBRyxDQUFDO1FBQ3pCLElBQUksQ0FBQ0MsV0FBVyxHQUFHLENBQUM7UUFDcEIsSUFBSSxDQUFDQyx5QkFBeUIsR0FBRyxDQUFDO01BQ3RDLENBQUc7TUFFRFosdUJBQXVCLENBQUNqRSxTQUFTLEdBQUdELE1BQU0sQ0FBQytFLE1BQU0sQ0FBQ3BCLE9BQU8sQ0FBQzFELFNBQVMsQ0FBQztFQUNwRWlFLElBQUFBLHVCQUF1QixDQUFDakUsU0FBUyxDQUFDWSxXQUFXLEdBQUdxRCx1QkFBdUI7RUFFdkVBLElBQUFBLHVCQUF1QixDQUFDakUsU0FBUyxDQUFDNkQsSUFBSSxHQUFHLFlBQVc7UUFDaEQsSUFBSWtCLFdBQVcsR0FBRyxJQUFJLENBQUNwQixLQUFLLENBQUMsSUFBSSxDQUFDSCxVQUFVLENBQUM7UUFDN0MsSUFBSXdCLGNBQWMsR0FBRyxJQUFJLENBQUNkLGlCQUFpQixDQUFDYSxXQUFXLEVBQUUsSUFBSSxDQUFDVixjQUFjLENBQUM7UUFDN0UsSUFBR1csY0FBYyxHQUFHLElBQUksQ0FBQy9CLEtBQUssSUFBSStCLGNBQWMsR0FBRyxJQUFJLENBQUM5QixLQUFLLEVBQUUsQ0FHOUQsTUFBTTtFQUFBO0VBQ0wsUUFBQSxJQUFJK0IsYUFBYSxHQUFHLElBQUksQ0FBQ3JCLFFBQVEsRUFBRTtVQUNuQyxJQUFJLENBQUNELEtBQUssQ0FBQyxJQUFJLENBQUNILFVBQVUsQ0FBQyxHQUFHd0IsY0FBYztFQUM1QyxRQUFBLElBQUlFLGFBQWEsR0FBRyxJQUFJLENBQUN0QixRQUFRLEVBQUU7VUFDbkMsSUFBSXVCLFdBQVcsR0FBR25LLElBQUksQ0FBQ0MsR0FBRyxDQUFDaUssYUFBYSxHQUFHRCxhQUFhLENBQUM7RUFDekQsUUFBQSxJQUFHRSxXQUFXLEdBQUduSyxJQUFJLENBQUMrRCxNQUFNLEVBQUUsRUFBRTtFQUN4QztFQUNVLFVBQUEsSUFBRyxJQUFJLENBQUMyRixXQUFXLEVBQUUsSUFBSSxDQUFDQyxnQkFBZ0IsRUFBRTtFQUN0RCxRQUFBLENBQVMsTUFBTTtFQUNmO1lBQ1UsSUFBSSxDQUFDaEIsS0FBSyxDQUFDLElBQUksQ0FBQ0gsVUFBVSxDQUFDLEdBQUd1QixXQUFXO0VBQ25ELFFBQUE7RUFDQSxNQUFBO1FBQ00sSUFBRyxJQUFJLENBQUNMLFdBQVcsRUFBRTtVQUNuQixJQUFJLENBQUNHLHlCQUF5QixFQUFHO0VBQ2pDLFFBQUEsSUFBRyxJQUFJLENBQUNBLHlCQUF5QixJQUFJLElBQUksQ0FBQ1AsVUFBVSxFQUFFO0VBQUE7WUFDcEQsSUFBSSxDQUFDTSxXQUFXLEVBQUc7WUFDbkIsSUFBSVEsaUJBQWlCLEdBQ25CcEssSUFBSSxDQUFDZ0QsR0FBRyxDQUFDLElBQUksQ0FBQ3VHLGNBQWMsRUFDbkIsSUFBSSxDQUFDQyxrQkFBa0IsR0FBR3hKLElBQUksQ0FBQ0ksSUFBSSxDQUFDLElBQUksQ0FBQ3dKLFdBQVcsQ0FBQyxDQUFDO1lBQ2pFLElBQUcsSUFBSSxDQUFDRCxnQkFBZ0IsR0FBRyxJQUFJLENBQUNMLFVBQVUsR0FBRyxJQUFJLENBQUNHLGtCQUFrQixFQUFFO2NBQ3BFLElBQUksQ0FBQ0osY0FBYyxJQUFJZSxpQkFBaUI7RUFDcEQsVUFBQSxDQUFXLE1BQU07Y0FDTCxJQUFJLENBQUNmLGNBQWMsSUFBSWUsaUJBQWlCO0VBQ3BELFVBQUE7WUFDVSxJQUFJLENBQUNULGdCQUFnQixHQUFHLENBQUM7WUFDekIsSUFBSSxDQUFDRSx5QkFBeUIsR0FBRyxDQUFDO0VBQzVDLFFBQUE7RUFDQSxNQUFBO0VBQ00sTUFBQSxPQUFPLElBQUksQ0FBQ2xCLEtBQUssQ0FBQyxJQUFJLENBQUNILFVBQVUsQ0FBQztNQUN4QyxDQUFHO0VBRURTLElBQUFBLHVCQUF1QixDQUFDakUsU0FBUyxDQUFDOEQsZ0JBQWdCLEdBQUcsWUFBVztRQUM5RCxJQUFJLENBQUNZLFdBQVcsR0FBRyxJQUFJO01BQzNCLENBQUc7RUFFRFQsSUFBQUEsdUJBQXVCLENBQUNqRSxTQUFTLENBQUMrRCxlQUFlLEdBQUcsWUFBVztRQUM3RCxJQUFJLENBQUNXLFdBQVcsR0FBRyxLQUFLO01BQzVCLENBQUc7RUFFRFQsSUFBQUEsdUJBQXVCLENBQUNqRSxTQUFTLENBQUNnRSxJQUFJLEdBQUcsWUFBVztRQUNsRCxPQUFPO1VBQ0xLLGNBQWMsRUFBRSxJQUFJLENBQUNBLGNBQWM7VUFDbkNLLFdBQVcsRUFBRSxJQUFJLENBQUNBLFdBQVc7VUFDN0JDLGdCQUFnQixFQUFFLElBQUksQ0FBQ0EsZ0JBQWdCO1VBQ3ZDRSx5QkFBeUIsRUFBRSxJQUFJLENBQUNBLHlCQUF5QjtVQUN6REQsV0FBVyxFQUFFLElBQUksQ0FBQ0E7U0FDbkI7TUFDTCxDQUFHOztFQUdIO0VBQ0E7RUFDQTtFQUNFLElBQUEsSUFBSVMsZUFBZSxHQUFHLFVBQVNOLFdBQVcsRUFBRVYsY0FBYyxFQUFFO1FBQzFELE9BQU9uRixLQUFLLENBQUM2RixXQUFXLEVBQUcvSixJQUFJLENBQUNDLEdBQUcsQ0FBQ29KLGNBQWMsQ0FBQyxDQUFDO01BQ3hELENBQUc7O0VBRUg7RUFDQTtFQUNBO0VBQ0E7RUFDQTtNQUNFLElBQUlpQixxQkFBcUIsR0FBRyxVQUFTL0IsTUFBTSxFQUFFSSxLQUFLLEVBQUVDLFFBQVEsRUFBRW5CLE9BQU8sRUFBRTtFQUNyRXdCLE1BQUFBLHVCQUF1QixDQUFDL0QsSUFBSSxDQUFDLElBQUksRUFBRXFELE1BQU0sRUFBRUksS0FBSyxFQUFFQyxRQUFRLEVBQUVuQixPQUFPLEVBQUU0QyxlQUFlLENBQUM7TUFDekYsQ0FBRztNQUVEQyxxQkFBcUIsQ0FBQ3RGLFNBQVMsR0FBR0QsTUFBTSxDQUFDK0UsTUFBTSxDQUFDYix1QkFBdUIsQ0FBQ2pFLFNBQVMsQ0FBQztFQUNsRnNGLElBQUFBLHFCQUFxQixDQUFDdEYsU0FBUyxDQUFDWSxXQUFXLEdBQUcwRSxxQkFBcUI7O0VBRXJFO0VBQ0E7RUFDQTtFQUNFLElBQUEsSUFBSUMsd0JBQXdCLEdBQUcsVUFBU1IsV0FBVyxFQUFFVixjQUFjLEVBQUU7RUFDbkUsTUFBQSxPQUFPckosSUFBSSxDQUFDbUksS0FBSyxDQUFDakUsS0FBSyxDQUFDNkYsV0FBVyxFQUFHL0osSUFBSSxDQUFDQyxHQUFHLENBQUNvSixjQUFjLENBQUMsQ0FBQyxDQUFDO01BQ3BFLENBQUc7O0VBRUg7RUFDQTtFQUNBO0VBQ0E7RUFDQTtNQUNFLElBQUltQixvQkFBb0IsR0FBRyxVQUFTakMsTUFBTSxFQUFFSSxLQUFLLEVBQUVDLFFBQVEsRUFBRW5CLE9BQU8sRUFBRTtFQUNwRXdCLE1BQUFBLHVCQUF1QixDQUFDL0QsSUFBSSxDQUFDLElBQUksRUFBRXFELE1BQU0sRUFBRUksS0FBSyxFQUFFQyxRQUFRLEVBQUVuQixPQUFPLEVBQUU4Qyx3QkFBd0IsQ0FBQztNQUNsRyxDQUFHO01BRURDLG9CQUFvQixDQUFDeEYsU0FBUyxHQUFHRCxNQUFNLENBQUMrRSxNQUFNLENBQUNiLHVCQUF1QixDQUFDakUsU0FBUyxDQUFDO0VBQ2pGd0YsSUFBQUEsb0JBQW9CLENBQUN4RixTQUFTLENBQUNZLFdBQVcsR0FBRzRFLG9CQUFvQjs7RUFHbkU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0UsSUFBQSxJQUFJQyxrQ0FBa0MsR0FBRyxVQUFTbEMsTUFBTSxFQUFFSSxLQUFLLEVBQUVDLFFBQVEsRUFBRW5CLE9BQU8sRUFBRWlELFVBQVUsRUFBRTtRQUM5RmhDLE9BQU8sQ0FBQ3hELElBQUksQ0FBQyxJQUFJLEVBQUVxRCxNQUFNLEVBQUVJLEtBQUssRUFBRUMsUUFBUSxDQUFDO1FBRTNDLElBQUlPLFdBQVcsR0FBR3BFLE1BQU0sQ0FBQ3FFLElBQUksQ0FBQyxJQUFJLENBQUNiLE1BQU0sQ0FBQztFQUMxQyxNQUFBLElBQUdZLFdBQVcsQ0FBQ3RHLE1BQU0sSUFBSyxDQUFDLEVBQUU7RUFDM0IsUUFBQSxNQUFNLDBFQUEwRTtFQUN0RixNQUFBO0VBQ0ksTUFBQSxJQUFJLENBQUMyRixVQUFVLEdBQUdXLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSVYsS0FBSyxHQUFHLElBQUksQ0FBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQ0MsVUFBVSxDQUFDO0VBQ3hDLE1BQUEsSUFBSSxDQUFDUCxLQUFLLEdBQUdRLEtBQUssQ0FBQ1IsS0FBSztFQUN4QixNQUFBLElBQUksQ0FBQ0MsS0FBSyxHQUFHTyxLQUFLLENBQUNQLEtBQUs7RUFDeEIsTUFBQSxJQUFJLENBQUM3QixHQUFHLEdBQUdvQyxLQUFLLENBQUNwQyxHQUFHO0VBRXBCLE1BQUEsSUFBSSxDQUFDZ0QsY0FBYyxHQUFPeEIsbUJBQW1CLENBQUMsZ0JBQWdCLEVBQUVKLE9BQU8sRUFBRSxJQUFJLENBQUNwQixHQUFHLEVBQUUsQ0FBQyxDQUFDO0VBQ3JGLE1BQUEsSUFBSSxDQUFDaUQsVUFBVSxHQUFXekIsbUJBQW1CLENBQUMsWUFBWSxFQUFFSixPQUFPLEVBQUUsSUFBSSxDQUFDcEIsR0FBRyxFQUFFLEVBQUUsQ0FBQztFQUNsRixNQUFBLElBQUksQ0FBQ2tELGNBQWMsR0FBTzFCLG1CQUFtQixDQUFDLGdCQUFnQixFQUFFSixPQUFPLEVBQUUsSUFBSSxDQUFDcEIsR0FBRyxFQUFFLElBQUksQ0FBQztFQUN4RixNQUFBLElBQUksQ0FBQ21ELGtCQUFrQixHQUFHM0IsbUJBQW1CLENBQUMsb0JBQW9CLEVBQUVKLE9BQU8sRUFBRSxJQUFJLENBQUNwQixHQUFHLEVBQUUsR0FBRyxDQUFDO0VBQzNGLE1BQUEsSUFBSSxDQUFDb0Qsa0JBQWtCLEdBQUc1QixtQkFBbUIsQ0FBQyxvQkFBb0IsRUFBRUosT0FBTyxFQUFFLElBQUksQ0FBQ3BCLEdBQUcsRUFBRSxJQUFJLENBQUM7RUFDNUYsTUFBQSxJQUFJLENBQUNxRCxXQUFXLEdBQVU3QixtQkFBbUIsQ0FBQyxhQUFhLEVBQUVKLE9BQU8sRUFBRSxJQUFJLENBQUNwQixHQUFHLEVBQUUsSUFBSSxDQUFDOztFQUV6RjtFQUNBO1FBQ0ksSUFBSXNFLGtCQUFrQixHQUNwQixVQUFTdEUsR0FBRyxFQUFFdUUsUUFBUSxFQUFFaEMsUUFBUSxFQUFFUyxjQUFjLEVBQUVDLFVBQVUsRUFBRUMsY0FBYyxFQUFFQyxrQkFBa0IsRUFBRUMsa0JBQWtCLEVBQUVDLFdBQVcsRUFBRTtVQUNuSSxJQUFJbUIsV0FBVyxHQUFHLEVBQUU7RUFDcEIsUUFBQSxJQUFHeEUsR0FBRyxDQUFDeEQsTUFBTSxLQUFLLENBQUMsRUFBRTtFQUNuQixVQUFBLEtBQUksSUFBSUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHdUQsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFdkQsQ0FBQyxFQUFFLEVBQUU7RUFDOUIsWUFBQSxJQUFJZ0ksVUFBVSxHQUFHO0VBQUN6QixjQUFBQSxjQUFjLEVBQUVBLGNBQWMsQ0FBQ3ZHLENBQUMsQ0FBQztFQUFFd0csY0FBQUEsVUFBVSxFQUFFQSxVQUFVLENBQUN4RyxDQUFDLENBQUM7RUFDNUV5RyxjQUFBQSxjQUFjLEVBQUVBLGNBQWMsQ0FBQ3pHLENBQUMsQ0FBQztFQUFFMEcsY0FBQUEsa0JBQWtCLEVBQUVBLGtCQUFrQixDQUFDMUcsQ0FBQyxDQUFDO0VBQzVFMkcsY0FBQUEsa0JBQWtCLEVBQUVBLGtCQUFrQixDQUFDM0csQ0FBQyxDQUFDO2dCQUFFNEcsV0FBVyxFQUFFQSxXQUFXLENBQUM1RyxDQUFDO2VBQUU7Y0FDdkUsSUFBSWlJLFFBQVEsR0FBRyxFQUFFO0VBQ2pCQSxZQUFBQSxRQUFRLENBQUNqSSxDQUFDLENBQUMsR0FBR3dCLFVBQVUsQ0FBQ21FLEtBQUssQ0FBQztjQUMvQnNDLFFBQVEsQ0FBQ2pJLENBQUMsQ0FBQyxDQUFDdUQsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDdEIsWUFBQSxPQUFPMEUsUUFBUSxDQUFDakksQ0FBQyxDQUFDLENBQUN3RCxJQUFJLENBQUM7RUFDMUJ1RSxZQUFBQSxXQUFXLENBQUMvSCxDQUFDLENBQUMsR0FBRyxJQUFJNEgsVUFBVSxDQUFDSyxRQUFRLEVBQUVILFFBQVEsRUFBRWhDLFFBQVEsRUFBRWtDLFVBQVUsQ0FBQztFQUNuRixVQUFBO0VBQ0EsUUFBQSxDQUFPLE1BQU07RUFDTCxVQUFBLEtBQUksSUFBSWhJLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3VELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRXZELENBQUMsRUFBRSxFQUFFO2NBQzlCK0gsV0FBVyxDQUFDL0gsQ0FBQyxDQUFDLEdBQUc2SCxrQkFBa0IsQ0FBQ3RFLEdBQUcsQ0FBQ0wsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFNEUsUUFBUSxDQUFDOUgsQ0FBQyxDQUFDLEVBQUU4RixRQUFRLEVBQUVTLGNBQWMsQ0FBQ3ZHLENBQUMsQ0FBQyxFQUN4RndHLFVBQVUsQ0FBQ3hHLENBQUMsQ0FBQyxFQUFFeUcsY0FBYyxDQUFDekcsQ0FBQyxDQUFDLEVBQUUwRyxrQkFBa0IsQ0FBQzFHLENBQUMsQ0FBQyxFQUFFMkcsa0JBQWtCLENBQUMzRyxDQUFDLENBQUMsRUFBRTRHLFdBQVcsQ0FBQzVHLENBQUMsQ0FBQyxDQUFDO0VBQzNHLFVBQUE7RUFDQSxRQUFBO0VBQ00sUUFBQSxPQUFPK0gsV0FBVztRQUN4QixDQUFLO1FBRUQsSUFBSSxDQUFDQSxXQUFXLEdBQUdGLGtCQUFrQixDQUFDLElBQUksQ0FBQ3RFLEdBQUcsRUFBRSxJQUFJLENBQUNzQyxLQUFLLENBQUMsSUFBSSxDQUFDSCxVQUFVLENBQUMsRUFBRSxJQUFJLENBQUNJLFFBQVEsRUFDeEYsSUFBSSxDQUFDUyxjQUFjLEVBQUUsSUFBSSxDQUFDQyxVQUFVLEVBQUUsSUFBSSxDQUFDQyxjQUFjLEVBQUUsSUFBSSxDQUFDQyxrQkFBa0IsRUFDbEYsSUFBSSxDQUFDQyxrQkFBa0IsRUFBRSxJQUFJLENBQUNDLFdBQVcsQ0FBQztNQUVoRCxDQUFHO01BRURlLGtDQUFrQyxDQUFDekYsU0FBUyxHQUFHRCxNQUFNLENBQUMrRSxNQUFNLENBQUNwQixPQUFPLENBQUMxRCxTQUFTLENBQUM7RUFDL0V5RixJQUFBQSxrQ0FBa0MsQ0FBQ3pGLFNBQVMsQ0FBQ1ksV0FBVyxHQUFHNkUsa0NBQWtDO0VBRTdGQSxJQUFBQSxrQ0FBa0MsQ0FBQ3pGLFNBQVMsQ0FBQzZELElBQUksR0FBRyxZQUFXO0VBQ2pFO1FBQ0ksT0FBTzFCLHlCQUF5QixDQUFDLElBQUksQ0FBQzBELFdBQVcsRUFBRSxVQUFTRyxVQUFVLEVBQUU7RUFBQyxRQUFBLE9BQU9BLFVBQVUsQ0FBQ25DLElBQUksRUFBRTtFQUFDLE1BQUEsQ0FBRSxDQUFDO01BQ3pHLENBQUc7RUFFRDRCLElBQUFBLGtDQUFrQyxDQUFDekYsU0FBUyxDQUFDOEQsZ0JBQWdCLEdBQUcsWUFBVztFQUN6RWpDLE1BQUFBLGtCQUFrQixDQUFDLElBQUksQ0FBQ2dFLFdBQVcsRUFBRSxVQUFTRyxVQUFVLEVBQUU7VUFBQ0EsVUFBVSxDQUFDbEMsZ0JBQWdCLEVBQUU7RUFBQyxNQUFBLENBQUUsQ0FBQztNQUNoRyxDQUFHO0VBRUQyQixJQUFBQSxrQ0FBa0MsQ0FBQ3pGLFNBQVMsQ0FBQytELGVBQWUsR0FBRyxZQUFXO0VBQ3hFbEMsTUFBQUEsa0JBQWtCLENBQUMsSUFBSSxDQUFDZ0UsV0FBVyxFQUFFLFVBQVNHLFVBQVUsRUFBRTtVQUFDQSxVQUFVLENBQUNqQyxlQUFlLEVBQUU7RUFBQyxNQUFBLENBQUUsQ0FBQztNQUMvRixDQUFHO0VBRUQwQixJQUFBQSxrQ0FBa0MsQ0FBQ3pGLFNBQVMsQ0FBQ2dFLElBQUksR0FBRyxZQUFXO1FBQzdELE9BQU9uQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUNnRSxXQUFXLEVBQUUsVUFBU0csVUFBVSxFQUFFO0VBQy9ELFFBQUEsT0FBT0EsVUFBVSxDQUFDaEMsSUFBSSxFQUFFO0VBQzlCLE1BQUEsQ0FBSyxDQUFDO01BQ04sQ0FBRzs7RUFFSDtFQUNBO0VBQ0E7RUFDQTtFQUNBO01BQ0UsSUFBSWlDLG1DQUFtQyxHQUFHLFVBQVMxQyxNQUFNLEVBQUVJLEtBQUssRUFBRUMsUUFBUSxFQUFFbkIsT0FBTyxFQUFFO0VBQ25GZ0QsTUFBQUEsa0NBQWtDLENBQUN2RixJQUFJLENBQUMsSUFBSSxFQUFFcUQsTUFBTSxFQUFFSSxLQUFLLEVBQUVDLFFBQVEsRUFBRW5CLE9BQU8sRUFBRTZDLHFCQUFxQixDQUFDO01BQzFHLENBQUc7TUFFRFcsbUNBQW1DLENBQUNqRyxTQUFTLEdBQUdELE1BQU0sQ0FBQytFLE1BQU0sQ0FBQ1csa0NBQWtDLENBQUN6RixTQUFTLENBQUM7RUFDM0dpRyxJQUFBQSxtQ0FBbUMsQ0FBQ2pHLFNBQVMsQ0FBQ1ksV0FBVyxHQUFHcUYsbUNBQW1DOztFQUVqRztFQUNBO0VBQ0E7RUFDQTtFQUNBO01BQ0UsSUFBSUMsa0NBQWtDLEdBQUcsVUFBUzNDLE1BQU0sRUFBRUksS0FBSyxFQUFFQyxRQUFRLEVBQUVuQixPQUFPLEVBQUU7RUFDbEZnRCxNQUFBQSxrQ0FBa0MsQ0FBQ3ZGLElBQUksQ0FBQyxJQUFJLEVBQUVxRCxNQUFNLEVBQUVJLEtBQUssRUFBRUMsUUFBUSxFQUFFbkIsT0FBTyxFQUFFK0Msb0JBQW9CLENBQUM7TUFDekcsQ0FBRztNQUVEVSxrQ0FBa0MsQ0FBQ2xHLFNBQVMsR0FBR0QsTUFBTSxDQUFDK0UsTUFBTSxDQUFDVyxrQ0FBa0MsQ0FBQ3pGLFNBQVMsQ0FBQztFQUMxR2tHLElBQUFBLGtDQUFrQyxDQUFDbEcsU0FBUyxDQUFDWSxXQUFXLEdBQUdzRixrQ0FBa0M7O0VBRS9GO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtNQUNFLElBQUlDLGFBQWEsR0FBRyxVQUFTNUMsTUFBTSxFQUFFSSxLQUFLLEVBQUVDLFFBQVEsRUFBRW5CLE9BQU8sRUFBRTtRQUM3RGlCLE9BQU8sQ0FBQ3hELElBQUksQ0FBQyxJQUFJLEVBQUVxRCxNQUFNLEVBQUVJLEtBQUssRUFBRUMsUUFBUSxDQUFDO1FBQzNDLElBQUlPLFdBQVcsR0FBR3BFLE1BQU0sQ0FBQ3FFLElBQUksQ0FBQyxJQUFJLENBQUNiLE1BQU0sQ0FBQztFQUMxQyxNQUFBLElBQUdZLFdBQVcsQ0FBQ3RHLE1BQU0sSUFBSyxDQUFDLEVBQUU7RUFDM0IsUUFBQSxJQUFJLENBQUMyRixVQUFVLEdBQUdXLFdBQVcsQ0FBQyxDQUFDLENBQUM7RUFDdEMsTUFBQSxDQUFLLE1BQU07RUFDTCxRQUFBLE1BQU0scURBQXFEO0VBQ2pFLE1BQUE7TUFDQSxDQUFHO01BRURnQyxhQUFhLENBQUNuRyxTQUFTLEdBQUdELE1BQU0sQ0FBQytFLE1BQU0sQ0FBQ3BCLE9BQU8sQ0FBQzFELFNBQVMsQ0FBQztFQUMxRG1HLElBQUFBLGFBQWEsQ0FBQ25HLFNBQVMsQ0FBQ1ksV0FBVyxHQUFHdUYsYUFBYTtFQUVuREEsSUFBQUEsYUFBYSxDQUFDbkcsU0FBUyxDQUFDNkQsSUFBSSxHQUFHLFlBQVc7UUFDeEMsSUFBSSxDQUFDRixLQUFLLENBQUMsSUFBSSxDQUFDSCxVQUFVLENBQUMsR0FBRyxDQUFDO0VBQy9CLE1BQUEsSUFBSTRDLGFBQWEsR0FBRyxJQUFJLENBQUN4QyxRQUFRLEVBQUU7UUFDbkMsSUFBSSxDQUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDSCxVQUFVLENBQUMsR0FBRyxDQUFDO0VBQy9CLE1BQUEsSUFBSTZDLFlBQVksR0FBRyxJQUFJLENBQUN6QyxRQUFRLEVBQUU7UUFDbEMsSUFBSTBDLFlBQVksR0FBR3RMLElBQUksQ0FBQ2lELEdBQUcsQ0FBQ21JLGFBQWEsRUFBRUMsWUFBWSxDQUFDO0VBQ3hERCxNQUFBQSxhQUFhLElBQUlFLFlBQVk7RUFDN0JELE1BQUFBLFlBQVksSUFBSUMsWUFBWTtRQUM1QixJQUFJQyxTQUFTLEdBQUd2TCxJQUFJLENBQUNDLEdBQUcsQ0FBQ21MLGFBQWEsR0FBR3BMLElBQUksQ0FBQ1QsR0FBRyxDQUFFUyxJQUFJLENBQUNDLEdBQUcsQ0FBQ21MLGFBQWEsQ0FBQyxHQUFHcEwsSUFBSSxDQUFDQyxHQUFHLENBQUNvTCxZQUFZLENBQUMsQ0FBRSxDQUFFO0VBQ3ZHLE1BQUEsSUFBR3JMLElBQUksQ0FBQytELE1BQU0sRUFBRSxHQUFHd0gsU0FBUyxFQUFFO1VBQzVCLElBQUksQ0FBQzVDLEtBQUssQ0FBQyxJQUFJLENBQUNILFVBQVUsQ0FBQyxHQUFHLENBQUM7RUFDL0IsUUFBQSxPQUFPLENBQUM7RUFDZCxNQUFBLENBQUs7RUFDRCxNQUFBLE9BQU8sQ0FBQztNQUNaLENBQUc7O0VBRUg7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO01BQ0UsSUFBSWdELHNCQUFzQixHQUFHLFVBQVNqRCxNQUFNLEVBQUVJLEtBQUssRUFBRUMsUUFBUSxFQUFFbkIsT0FBTyxFQUFFO1FBQ3RFaUIsT0FBTyxDQUFDeEQsSUFBSSxDQUFDLElBQUksRUFBRXFELE1BQU0sRUFBRUksS0FBSyxFQUFFQyxRQUFRLENBQUM7UUFFM0MsSUFBSU8sV0FBVyxHQUFHcEUsTUFBTSxDQUFDcUUsSUFBSSxDQUFDLElBQUksQ0FBQ2IsTUFBTSxDQUFDO0VBQzFDLE1BQUEsSUFBR1ksV0FBVyxDQUFDdEcsTUFBTSxJQUFLLENBQUMsRUFBRTtFQUMzQixRQUFBLElBQUksQ0FBQzJGLFVBQVUsR0FBR1csV0FBVyxDQUFDLENBQUMsQ0FBQztVQUNoQyxJQUFJVixLQUFLLEdBQUcsSUFBSSxDQUFDRixNQUFNLENBQUMsSUFBSSxDQUFDQyxVQUFVLENBQUM7RUFDeEMsUUFBQSxJQUFJLENBQUNuQyxHQUFHLEdBQUdvQyxLQUFLLENBQUNwQyxHQUFHO0VBQzFCLE1BQUEsQ0FBSyxNQUFNO0VBQ0wsUUFBQSxNQUFNLDhEQUE4RDtFQUMxRSxNQUFBO1FBRUksSUFBSXNFLGtCQUFrQixHQUNwQixVQUFTdEUsR0FBRyxFQUFFdUUsUUFBUSxFQUFFaEMsUUFBUSxFQUFFO1VBQ2xDLElBQUlpQyxXQUFXLEdBQUcsRUFBRTtFQUNwQixRQUFBLElBQUkvSCxDQUFDO0VBQ0wsUUFBQSxJQUFHdUQsR0FBRyxDQUFDeEQsTUFBTSxLQUFLLENBQUMsRUFBRTtFQUNuQixVQUFBLEtBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3VELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRXZELENBQUMsRUFBRSxFQUFFO2NBQzFCLElBQUkySSxTQUFTLEdBQUcsRUFBRTtFQUNsQkEsWUFBQUEsU0FBUyxDQUFDM0ksQ0FBQyxDQUFDLEdBQUcyRixLQUFLO0VBQ3BCb0MsWUFBQUEsV0FBVyxDQUFDL0gsQ0FBQyxDQUFDLEdBQUcsSUFBSXFJLGFBQWEsQ0FBQ00sU0FBUyxFQUFFYixRQUFRLEVBQUVoQyxRQUFRLENBQUM7RUFDM0UsVUFBQTtFQUNBLFFBQUEsQ0FBTyxNQUFNO0VBQ0wsVUFBQSxLQUFJOUYsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHdUQsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFdkQsQ0FBQyxFQUFFLEVBQUU7RUFDMUIrSCxZQUFBQSxXQUFXLENBQUMvSCxDQUFDLENBQUMsR0FBRzZILGtCQUFrQixDQUFDdEUsR0FBRyxDQUFDTCxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU0RSxRQUFRLENBQUM5SCxDQUFDLENBQUMsRUFBRThGLFFBQVEsQ0FBQztFQUNsRixVQUFBO0VBQ0EsUUFBQTtFQUNNLFFBQUEsT0FBT2lDLFdBQVc7UUFDeEIsQ0FBSztRQUVELElBQUksQ0FBQ0EsV0FBVyxHQUFHRixrQkFBa0IsQ0FBQyxJQUFJLENBQUN0RSxHQUFHLEVBQUUsSUFBSSxDQUFDc0MsS0FBSyxDQUFDLElBQUksQ0FBQ0gsVUFBVSxDQUFDLEVBQUUsSUFBSSxDQUFDSSxRQUFRLENBQUM7TUFDL0YsQ0FBRztNQUVENEMsc0JBQXNCLENBQUN4RyxTQUFTLEdBQUdELE1BQU0sQ0FBQytFLE1BQU0sQ0FBQ3BCLE9BQU8sQ0FBQzFELFNBQVMsQ0FBQztFQUNuRXdHLElBQUFBLHNCQUFzQixDQUFDeEcsU0FBUyxDQUFDWSxXQUFXLEdBQUc0RixzQkFBc0I7RUFFckVBLElBQUFBLHNCQUFzQixDQUFDeEcsU0FBUyxDQUFDNkQsSUFBSSxHQUFHLFlBQVc7RUFDckQ7UUFDSSxPQUFPMUIseUJBQXlCLENBQUMsSUFBSSxDQUFDMEQsV0FBVyxFQUFFLFVBQVNHLFVBQVUsRUFBRTtFQUFDLFFBQUEsT0FBT0EsVUFBVSxDQUFDbkMsSUFBSSxFQUFFO0VBQUMsTUFBQSxDQUFFLENBQUM7TUFDekcsQ0FBRzs7RUFFSDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7TUFDRSxJQUFJNkMsV0FBVyxHQUFHLFVBQVNuRCxNQUFNLEVBQUVJLEtBQUssRUFBRUMsUUFBUSxFQUFFbkIsT0FBTyxFQUFFO1FBQzNEaUIsT0FBTyxDQUFDeEQsSUFBSSxDQUFDLElBQUksRUFBRXFELE1BQU0sRUFBRUksS0FBSyxFQUFFQyxRQUFRLENBQUM7UUFDM0MsSUFBSSxDQUFDTyxXQUFXLEdBQUdwRSxNQUFNLENBQUNxRSxJQUFJLENBQUMsSUFBSSxDQUFDYixNQUFNLENBQUM7UUFDM0MsSUFBSSxDQUFDc0MsV0FBVyxHQUFHLEVBQUU7RUFDckIsTUFBQSxLQUFJLElBQUkvSCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcsSUFBSSxDQUFDcUcsV0FBVyxDQUFDdEcsTUFBTSxFQUFFQyxDQUFDLEVBQUUsRUFBRTtVQUMvQyxJQUFJMkYsS0FBSyxHQUFHRixNQUFNLENBQUMsSUFBSSxDQUFDWSxXQUFXLENBQUNyRyxDQUFDLENBQUMsQ0FBQztFQUN2QyxRQUFBLElBQUk2SSxhQUFhO1VBQ2pCLFFBQVFsRCxLQUFLLENBQUNULElBQUk7RUFDaEIsVUFBQSxLQUFLLE1BQU07Y0FDVCxJQUFHdEIsV0FBVyxDQUFDK0IsS0FBSyxDQUFDcEMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtFQUM5QnNGLGNBQUFBLGFBQWEsR0FBR3JCLHFCQUFxQjtFQUNqRCxZQUFBLENBQVcsTUFBTTtFQUNMcUIsY0FBQUEsYUFBYSxHQUFHVixtQ0FBbUM7RUFDL0QsWUFBQTtFQUNVLFlBQUE7RUFDRixVQUFBLEtBQUssS0FBSztjQUNSLElBQUd2RSxXQUFXLENBQUMrQixLQUFLLENBQUNwQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0VBQzlCc0YsY0FBQUEsYUFBYSxHQUFHbkIsb0JBQW9CO0VBQ2hELFlBQUEsQ0FBVyxNQUFNO0VBQ0xtQixjQUFBQSxhQUFhLEdBQUdULGtDQUFrQztFQUM5RCxZQUFBO0VBQ1UsWUFBQTtFQUNGLFVBQUEsS0FBSyxRQUFRO2NBQ1gsSUFBR3hFLFdBQVcsQ0FBQytCLEtBQUssQ0FBQ3BDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7RUFDOUJzRixjQUFBQSxhQUFhLEdBQUdSLGFBQWE7RUFDekMsWUFBQSxDQUFXLE1BQU07RUFDTFEsY0FBQUEsYUFBYSxHQUFHSCxzQkFBc0I7RUFDbEQsWUFBQTtFQUNVLFlBQUE7RUFDRixVQUFBO0VBQ0UsWUFBQSxNQUFNLHFDQUFxQyxHQUFHLElBQUksQ0FBQ3JDLFdBQVcsQ0FBQ3JHLENBQUMsQ0FBQyxHQUFHLGFBQWEsR0FBRzJGLEtBQUssQ0FBQ1QsSUFBSTtFQUN4RztVQUNNLElBQUk0RCxpQkFBaUIsR0FBRyxFQUFFO1VBQzFCQSxpQkFBaUIsQ0FBQyxJQUFJLENBQUN6QyxXQUFXLENBQUNyRyxDQUFDLENBQUMsQ0FBQyxHQUFHMkYsS0FBSztFQUM5Q2hCLFFBQUFBLE9BQU8sR0FBR0EsT0FBTyxJQUFJLEVBQUU7RUFDdkIsUUFBQSxJQUFJb0UsYUFBYSxHQUFHcEUsT0FBTyxDQUFDYyxNQUFNLElBQUlkLE9BQU8sQ0FBQ2MsTUFBTSxDQUFDLElBQUksQ0FBQ1ksV0FBVyxDQUFDckcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO1VBQy9FK0ksYUFBYSxDQUFDeEMsY0FBYyxHQUFPd0MsYUFBYSxDQUFDeEMsY0FBYyxJQUFRNUIsT0FBTyxDQUFDNEIsY0FBYztVQUM3RndDLGFBQWEsQ0FBQ3ZDLFVBQVUsR0FBV3VDLGFBQWEsQ0FBQ3ZDLFVBQVUsSUFBWTdCLE9BQU8sQ0FBQzZCLFVBQVU7VUFDekZ1QyxhQUFhLENBQUN0QyxjQUFjLEdBQU9zQyxhQUFhLENBQUN0QyxjQUFjLElBQVE5QixPQUFPLENBQUM4QixjQUFjO1VBQzdGc0MsYUFBYSxDQUFDckMsa0JBQWtCLEdBQUdxQyxhQUFhLENBQUNyQyxrQkFBa0IsSUFBSS9CLE9BQU8sQ0FBQytCLGtCQUFrQjtVQUNqR3FDLGFBQWEsQ0FBQ3BDLGtCQUFrQixHQUFHb0MsYUFBYSxDQUFDcEMsa0JBQWtCLElBQUloQyxPQUFPLENBQUNnQyxrQkFBa0I7VUFDakdvQyxhQUFhLENBQUNuQyxXQUFXLEdBQVVtQyxhQUFhLENBQUNuQyxXQUFXLElBQVdqQyxPQUFPLENBQUNpQyxXQUFXO0VBQzFGLFFBQUEsSUFBSSxDQUFDbUIsV0FBVyxDQUFDL0gsQ0FBQyxDQUFDLEdBQUcsSUFBSTZJLGFBQWEsQ0FBQ0MsaUJBQWlCLEVBQUVqRCxLQUFLLEVBQUVDLFFBQVEsRUFBRWlELGFBQWEsQ0FBQztFQUNoRyxNQUFBO01BQ0EsQ0FBRztNQUVESCxXQUFXLENBQUMxRyxTQUFTLEdBQUdELE1BQU0sQ0FBQytFLE1BQU0sQ0FBQ3BCLE9BQU8sQ0FBQzFELFNBQVMsQ0FBQztFQUN4RDBHLElBQUFBLFdBQVcsQ0FBQzFHLFNBQVMsQ0FBQ1ksV0FBVyxHQUFHOEYsV0FBVztFQUUvQ0EsSUFBQUEsV0FBVyxDQUFDMUcsU0FBUyxDQUFDNkQsSUFBSSxHQUFHLFlBQVc7RUFDdEM3QixNQUFBQSxhQUFhLENBQUMsSUFBSSxDQUFDNkQsV0FBVyxDQUFDO0VBQy9CLE1BQUEsS0FBSSxJQUFJL0gsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHLElBQUksQ0FBQytILFdBQVcsQ0FBQ2hJLE1BQU0sRUFBRUMsQ0FBQyxFQUFFLEVBQUU7VUFDL0MsSUFBSSxDQUFDK0gsV0FBVyxDQUFDL0gsQ0FBQyxDQUFDLENBQUMrRixJQUFJLEVBQUU7RUFDaEMsTUFBQTtRQUNJLE9BQU8sSUFBSSxDQUFDRixLQUFLO01BQ3JCLENBQUc7RUFFRCtDLElBQUFBLFdBQVcsQ0FBQzFHLFNBQVMsQ0FBQzhELGdCQUFnQixHQUFHLFlBQVc7RUFDbEQsTUFBQSxLQUFJLElBQUloRyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcsSUFBSSxDQUFDK0gsV0FBVyxDQUFDaEksTUFBTSxFQUFFQyxDQUFDLEVBQUUsRUFBRTtVQUMvQyxJQUFJLENBQUMrSCxXQUFXLENBQUMvSCxDQUFDLENBQUMsQ0FBQ2dHLGdCQUFnQixFQUFFO0VBQzVDLE1BQUE7TUFDQSxDQUFHO0VBRUQ0QyxJQUFBQSxXQUFXLENBQUMxRyxTQUFTLENBQUMrRCxlQUFlLEdBQUcsWUFBVztFQUNqRCxNQUFBLEtBQUksSUFBSWpHLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRyxJQUFJLENBQUMrSCxXQUFXLENBQUNoSSxNQUFNLEVBQUVDLENBQUMsRUFBRSxFQUFFO1VBQy9DLElBQUksQ0FBQytILFdBQVcsQ0FBQy9ILENBQUMsQ0FBQyxDQUFDaUcsZUFBZSxFQUFFO0VBQzNDLE1BQUE7TUFDQSxDQUFHO0VBRUQyQyxJQUFBQSxXQUFXLENBQUMxRyxTQUFTLENBQUNnRSxJQUFJLEdBQUcsWUFBVztRQUN0QyxJQUFJQSxJQUFJLEdBQUcsRUFBRTtFQUNiLE1BQUEsS0FBSSxJQUFJbEcsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHLElBQUksQ0FBQytILFdBQVcsQ0FBQ2hJLE1BQU0sRUFBRUMsQ0FBQyxFQUFFLEVBQUU7RUFDL0NrRyxRQUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDRyxXQUFXLENBQUNyRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQytILFdBQVcsQ0FBQy9ILENBQUMsQ0FBQyxDQUFDa0csSUFBSSxFQUFFO0VBQzVELE1BQUE7RUFDSSxNQUFBLE9BQU9BLElBQUk7TUFDZixDQUFHOztFQUlIO0VBQ0E7O0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtNQUNFLElBQUk4QyxPQUFPLEdBQUcsVUFBU3ZELE1BQU0sRUFBRUssUUFBUSxFQUFFbUQsSUFBSSxFQUFFdEUsT0FBTyxFQUFFO1FBQ3RELElBQUksQ0FBQ2MsTUFBTSxHQUFHQSxNQUFNO1FBQ3BCLElBQUksQ0FBQ3dELElBQUksR0FBR0EsSUFBSTtRQUNoQixJQUFJLENBQUM1QyxXQUFXLEdBQUdwRSxNQUFNLENBQUNxRSxJQUFJLENBQUMsSUFBSSxDQUFDYixNQUFNLENBQUM7O0VBRS9DO1FBQ0ksSUFBSSxDQUFDeUQsY0FBYyxHQUFLekUsVUFBVSxDQUFDLGdCQUFnQixFQUFFRSxPQUFPLEVBQUVNLGdCQUFnQixDQUFDO1FBQy9FLElBQUlrRSxpQkFBaUIsR0FBRzFFLFVBQVUsQ0FBQyxNQUFNLEVBQUVFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdEQsSUFBSXlFLGlCQUFpQixHQUFHM0UsVUFBVSxDQUFDLFNBQVMsRUFBRUUsT0FBTyxFQUFFLElBQUksQ0FBQztFQUM1RCxNQUFBLElBQUksQ0FBQzBFLElBQUksQ0FBQ0YsaUJBQWlCLENBQUM7RUFDNUIsTUFBQSxJQUFJLENBQUNHLE9BQU8sQ0FBQ0YsaUJBQWlCLENBQUM7UUFDL0IsSUFBSSxDQUFDekUsT0FBTyxHQUFHQSxPQUFPO0VBQzFCO0VBQ0ksTUFBQSxJQUFJLENBQUNjLE1BQU0sR0FBR0gsZUFBZSxDQUFDLElBQUksQ0FBQ0csTUFBTSxFQUFFLElBQUksQ0FBQ3lELGNBQWMsQ0FBQztRQUMvRCxJQUFJckQsS0FBSyxHQUFHLEVBQUU7RUFDZCxNQUFBLEtBQUksSUFBSTdGLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRyxJQUFJLENBQUNxRyxXQUFXLENBQUN0RyxNQUFNLEVBQUVDLENBQUMsRUFBRSxFQUFHO1VBQ2hENkYsS0FBSyxDQUFDLElBQUksQ0FBQ1EsV0FBVyxDQUFDckcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUN5RixNQUFNLENBQUMsSUFBSSxDQUFDWSxXQUFXLENBQUNyRyxDQUFDLENBQUMsQ0FBQyxDQUFDd0QsSUFBSTtFQUN4RSxNQUFBO1FBQ0ksSUFBSSxDQUFDc0MsUUFBUSxHQUFHLFlBQVc7RUFDekIsUUFBQSxPQUFPQSxRQUFRLENBQUNELEtBQUssRUFBRW9ELElBQUksQ0FBQztRQUNsQyxDQUFLO0VBQ0w7RUFDQTtRQUNJLElBQUksQ0FBQ25ELFFBQVEsRUFBRTtRQUNmLElBQUksQ0FBQ0QsS0FBSyxHQUFHQSxLQUFLO1FBQ2xCLElBQUksQ0FBQzBELFFBQVEsR0FBRyxJQUFJLENBQUNDLHVCQUF1QixDQUFDLElBQUksQ0FBQy9ELE1BQU0sRUFBRSxJQUFJLENBQUNJLEtBQUssRUFBRSxJQUFJLENBQUNDLFFBQVEsRUFBRSxJQUFJLENBQUNuQixPQUFPLENBQUM7TUFDdEcsQ0FBRzs7RUFFSDtFQUNBO0VBQ0E7TUFDRXFFLE9BQU8sQ0FBQzlHLFNBQVMsQ0FBQ3NILHVCQUF1QixHQUFHLFVBQVMzRCxLQUFLLEVBQUVDLFFBQVEsRUFBQztFQUNuRSxNQUFBLE1BQU0sNERBQTREO01BQ3RFLENBQUc7O0VBRUg7RUFDQTtFQUNFa0QsSUFBQUEsT0FBTyxDQUFDOUcsU0FBUyxDQUFDZ0UsSUFBSSxHQUFHLFlBQVc7UUFDbEMsT0FBTztVQUFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDQSxLQUFLO1VBQUV3RCxJQUFJLEVBQUUsSUFBSSxDQUFDQSxJQUFJO1VBQUVDLE9BQU8sRUFBRSxJQUFJLENBQUNBLE9BQU87VUFDekRDLFFBQVEsRUFBRSxJQUFJLENBQUNBO1NBQVM7TUFDcEMsQ0FBRzs7RUFFSDtFQUNBO0VBQ0E7RUFDRVAsSUFBQUEsT0FBTyxDQUFDOUcsU0FBUyxDQUFDNkQsSUFBSSxHQUFHLFlBQVc7RUFDbEM3QixNQUFBQSxhQUFhLENBQUMsSUFBSSxDQUFDcUYsUUFBUSxDQUFDO0VBQzVCLE1BQUEsS0FBSSxJQUFJdkosQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHLElBQUksQ0FBQ3VKLFFBQVEsQ0FBQ3hKLE1BQU0sRUFBRUMsQ0FBQyxFQUFFLEVBQUU7VUFDNUMsSUFBSSxDQUFDdUosUUFBUSxDQUFDdkosQ0FBQyxDQUFDLENBQUMrRixJQUFJLEVBQUU7RUFDN0IsTUFBQTtRQUNJLElBQUc5RCxNQUFNLENBQUNxRSxJQUFJLENBQUMsSUFBSSxDQUFDVCxLQUFLLENBQUMsQ0FBQzlGLE1BQU0sR0FBR2tDLE1BQU0sQ0FBQ3FFLElBQUksQ0FBQyxJQUFJLENBQUNiLE1BQU0sQ0FBQyxDQUFDMUYsTUFBTSxFQUFFO0VBQ3pFO0VBQ0E7RUFDQTtVQUNNLElBQUksQ0FBQytGLFFBQVEsRUFBRTtFQUNyQixNQUFBO1FBQ0ksT0FBTyxJQUFJLENBQUNELEtBQUs7TUFDckIsQ0FBRzs7RUFFSDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDRW1ELElBQUFBLE9BQU8sQ0FBQzlHLFNBQVMsQ0FBQ3VILE1BQU0sR0FBRyxVQUFTQyxZQUFZLEVBQUU7RUFDcEQ7RUFDQTtFQUNNLE1BQUEsSUFBSTFKLENBQUMsRUFBRTdELENBQUMsRUFBRXdOLGdCQUFnQjtFQUMxQixNQUFBLElBQUcsSUFBSSxDQUFDQSxnQkFBZ0IsS0FBSyxJQUFJLEVBQUU7VUFDakNBLGdCQUFnQixHQUFHMUgsTUFBTSxDQUFDcUUsSUFBSSxDQUFDLElBQUksQ0FBQ1QsS0FBSyxDQUFDO0VBQ2xELE1BQUEsQ0FBTyxNQUFNO1VBQ0w4RCxnQkFBZ0IsR0FBRyxJQUFJLENBQUNBLGdCQUFnQjtFQUNoRCxNQUFBO1FBRU0sSUFBSUMsV0FBVyxHQUFHLEVBQUU7RUFDcEIsTUFBQSxLQUFJek4sQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHd04sZ0JBQWdCLENBQUM1SixNQUFNLEVBQUU1RCxDQUFDLEVBQUUsRUFBRTtFQUMzQ3lOLFFBQUFBLFdBQVcsQ0FBQ0QsZ0JBQWdCLENBQUN4TixDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7RUFDN0MsTUFBQTtRQUVNLEtBQUk2RCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcwSixZQUFZLEVBQUUxSixDQUFDLEVBQUUsRUFBRTtFQUNoQyxRQUFBLElBQUdBLENBQUMsR0FBRyxJQUFJLENBQUNtSixpQkFBaUIsS0FBSyxDQUFDLEVBQUU7RUFDbkMsVUFBQSxLQUFJaE4sQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHd04sZ0JBQWdCLENBQUM1SixNQUFNLEVBQUU1RCxDQUFDLEVBQUUsRUFBRTtFQUMzQyxZQUFBLElBQUl3SixLQUFLLEdBQUdnRSxnQkFBZ0IsQ0FBQ3hOLENBQUMsQ0FBQztFQUMvQnlOLFlBQUFBLFdBQVcsQ0FBQ2pFLEtBQUssQ0FBQyxDQUFDOUMsSUFBSSxDQUFFRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM4QyxLQUFLLENBQUNGLEtBQUssQ0FBQyxFQUFHO0VBQzFFLFVBQUE7RUFDQSxRQUFBO1VBQ1EsSUFBSSxDQUFDSSxJQUFJLEVBQUU7RUFDbkIsTUFBQTtFQUNNLE1BQUEsT0FBTzZELFdBQVc7TUFDeEIsQ0FBRzs7RUFFSDtFQUNBO0VBQ0E7RUFDRVosSUFBQUEsT0FBTyxDQUFDOUcsU0FBUyxDQUFDMkgsSUFBSSxHQUFHLFVBQVNILFlBQVksRUFBRTtRQUM5QyxLQUFJLElBQUkxSixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcwSixZQUFZLEVBQUUxSixDQUFDLEVBQUUsRUFBRTtVQUNwQyxJQUFJLENBQUMrRixJQUFJLEVBQUU7RUFDakIsTUFBQTtNQUNBLENBQUc7O0VBRUg7RUFDQTtFQUNBO0VBQ0E7RUFDRWlELElBQUFBLE9BQU8sQ0FBQzlHLFNBQVMsQ0FBQ29ILE9BQU8sR0FBRyxVQUFTRixpQkFBaUIsRUFBRTtRQUNwRCxJQUFJLENBQUNPLGdCQUFnQixHQUFHUCxpQkFBaUI7TUFDL0MsQ0FBRzs7RUFFSDtFQUNBO0VBQ0E7RUFDQTtFQUNFSixJQUFBQSxPQUFPLENBQUM5RyxTQUFTLENBQUNtSCxJQUFJLEdBQUcsVUFBU0YsaUJBQWlCLEVBQUU7UUFDbkQsSUFBSSxDQUFDQSxpQkFBaUIsR0FBR0EsaUJBQWlCO01BQzlDLENBQUc7O0VBRUg7RUFDQTtFQUNBO0VBQ0VILElBQUFBLE9BQU8sQ0FBQzlHLFNBQVMsQ0FBQzhELGdCQUFnQixHQUFHLFlBQVc7RUFDOUMsTUFBQSxLQUFJLElBQUloRyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcsSUFBSSxDQUFDdUosUUFBUSxDQUFDeEosTUFBTSxFQUFFQyxDQUFDLEVBQUUsRUFBRTtVQUM1QyxJQUFJLENBQUN1SixRQUFRLENBQUN2SixDQUFDLENBQUMsQ0FBQ2dHLGdCQUFnQixFQUFFO0VBQ3pDLE1BQUE7TUFDQSxDQUFHOztFQUVIO0VBQ0E7RUFDQTtFQUNFZ0QsSUFBQUEsT0FBTyxDQUFDOUcsU0FBUyxDQUFDK0QsZUFBZSxHQUFHLFlBQVc7RUFDN0MsTUFBQSxLQUFJLElBQUlqRyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcsSUFBSSxDQUFDdUosUUFBUSxDQUFDeEosTUFBTSxFQUFFQyxDQUFDLEVBQUUsRUFBRTtVQUM1QyxJQUFJLENBQUN1SixRQUFRLENBQUN2SixDQUFDLENBQUMsQ0FBQ2lHLGVBQWUsRUFBRTtFQUN4QyxNQUFBO01BQ0EsQ0FBRzs7RUFFSDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7TUFDRSxJQUFJNkQsV0FBVyxHQUFHLFVBQVNyRSxNQUFNLEVBQUVLLFFBQVEsRUFBRW1ELElBQUksRUFBRXRFLE9BQU8sRUFBRTtFQUMxRHFFLE1BQUFBLE9BQU8sQ0FBQzVHLElBQUksQ0FBQyxJQUFJLEVBQUVxRCxNQUFNLEVBQUVLLFFBQVEsRUFBRW1ELElBQUksRUFBRXRFLE9BQU8sQ0FBQztNQUN2RCxDQUFHO01BRURtRixXQUFXLENBQUM1SCxTQUFTLEdBQUdELE1BQU0sQ0FBQytFLE1BQU0sQ0FBQ2dDLE9BQU8sQ0FBQzlHLFNBQVMsQ0FBQztFQUN4RDRILElBQUFBLFdBQVcsQ0FBQzVILFNBQVMsQ0FBQ1ksV0FBVyxHQUFHZ0gsV0FBVztFQUUvQ0EsSUFBQUEsV0FBVyxDQUFDNUgsU0FBUyxDQUFDc0gsdUJBQXVCLEdBQUcsVUFBUy9ELE1BQU0sRUFBRUksS0FBSyxFQUFFQyxRQUFRLEVBQUVuQixPQUFPLEVBQUM7RUFDeEYsTUFBQSxPQUFPLENBQUUsSUFBSWlFLFdBQVcsQ0FBQ25ELE1BQU0sRUFBRUksS0FBSyxFQUFFQyxRQUFRLEVBQUVuQixPQUFPLENBQUMsQ0FBRTtNQUNoRSxDQUFHOztFQUdIO01BQ0UsT0FBTztFQUNMM0QsTUFBQUEsS0FBSyxFQUFFQSxLQUFLO0VBQ1pFLE1BQUFBLGNBQWMsRUFBRUEsY0FBYztFQUM5QkUsTUFBQUEsS0FBSyxFQUFFQSxLQUFLO0VBQ1o2RCxNQUFBQSxnQkFBZ0IsRUFBRUEsZ0JBQWdCO0VBQ2xDSyxNQUFBQSxlQUFlLEVBQUVBLGVBQWU7RUFDaENrQyxNQUFBQSxxQkFBcUIsRUFBRUEscUJBQXFCO0VBQzVDRSxNQUFBQSxvQkFBb0IsRUFBRUEsb0JBQW9CO0VBQzFDUyxNQUFBQSxtQ0FBbUMsRUFBRUEsbUNBQW1DO0VBQ3hFQyxNQUFBQSxrQ0FBa0MsRUFBRUEsa0NBQWtDO0VBQ3RFQyxNQUFBQSxhQUFhLEVBQUVBLGFBQWE7RUFDNUJLLE1BQUFBLHNCQUFzQixFQUFFQSxzQkFBc0I7RUFDOUNFLE1BQUFBLFdBQVcsRUFBRUEsV0FBVztFQUN4QmtCLE1BQUFBLFdBQVcsRUFBRUE7T0FDZDtFQUNILEVBQUEsQ0FBQyxDQUFDOzs7O0VDN2xDYSxTQUFTQyxXQUFTQSxDQUFDL00sQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDdEMsRUFBQSxPQUFPRCxDQUFDLElBQUksSUFBSSxJQUFJQyxDQUFDLElBQUksSUFBSSxHQUFHTCxHQUFHLEdBQUdJLENBQUMsR0FBR0MsQ0FBQyxHQUFHLEVBQUUsR0FBR0QsQ0FBQyxHQUFHQyxDQUFDLEdBQUcsQ0FBQyxHQUFHRCxDQUFDLElBQUlDLENBQUMsR0FBRyxDQUFDLEdBQUdMLEdBQUc7RUFDakY7O0VDRU8sVUFBVW9OLE9BQU9BLENBQUNDLE1BQU0sRUFBRUMsT0FBTyxFQUFFO0lBQ2I7RUFDekIsSUFBQSxLQUFLLElBQUlsRixLQUFLLElBQUlpRixNQUFNLEVBQUU7UUFDeEIsSUFBSWpGLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQ0EsS0FBSyxHQUFHLENBQUNBLEtBQUssS0FBS0EsS0FBSyxFQUFFO0VBQzlDLFFBQUEsTUFBTUEsS0FBSztFQUNiLE1BQUE7RUFDRixJQUFBO0VBQ0YsRUFBQTtFQVFGOztFQ09PLFNBQVNtRixjQUFjQSxDQUFDQyxPQUFPLEdBQUdMLFdBQVMsRUFBRTtFQUNsRCxFQUFBLElBQUlLLE9BQU8sS0FBS0wsV0FBUyxFQUFFLE9BQU9NLGdCQUFnQjtJQUNsRCxJQUFJLE9BQU9ELE9BQU8sS0FBSyxVQUFVLEVBQUUsTUFBTSxJQUFJRSxTQUFTLENBQUMsMkJBQTJCLENBQUM7RUFDbkYsRUFBQSxPQUFPLENBQUN0TixDQUFDLEVBQUVDLENBQUMsS0FBSztFQUNmLElBQUEsTUFBTWYsQ0FBQyxHQUFHa08sT0FBTyxDQUFDcE4sQ0FBQyxFQUFFQyxDQUFDLENBQUM7RUFDdkIsSUFBQSxJQUFJZixDQUFDLElBQUlBLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBT0EsQ0FBQztFQUMxQixJQUFBLE9BQU8sQ0FBQ2tPLE9BQU8sQ0FBQ25OLENBQUMsRUFBRUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLbU4sT0FBTyxDQUFDcE4sQ0FBQyxFQUFFQSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEQsQ0FBQztFQUNIO0VBRU8sU0FBU3FOLGdCQUFnQkEsQ0FBQ3JOLENBQUMsRUFBRUMsQ0FBQyxFQUFFO0VBQ3JDLEVBQUEsT0FBTyxDQUFDRCxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUVBLENBQUMsSUFBSUEsQ0FBQyxDQUFDLEtBQUtDLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRUEsQ0FBQyxJQUFJQSxDQUFDLENBQUMsQ0FBQyxLQUFLRCxDQUFDLEdBQUdDLENBQUMsR0FBRyxFQUFFLEdBQUdELENBQUMsR0FBR0MsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDNUY7O0VDdENlLFNBQVNrRCxHQUFHQSxDQUFDOEosTUFBTSxFQUFFQyxPQUFPLEVBQUU7RUFDM0MsRUFBQSxJQUFJL0osR0FBRztJQUNvQjtFQUN6QixJQUFBLEtBQUssTUFBTTZFLEtBQUssSUFBSWlGLE1BQU0sRUFBRTtFQUMxQixNQUFBLElBQUlqRixLQUFLLElBQUksSUFBSSxLQUNUN0UsR0FBRyxHQUFHNkUsS0FBSyxJQUFLN0UsR0FBRyxLQUFLMkUsU0FBUyxJQUFJRSxLQUFLLElBQUlBLEtBQU0sQ0FBQyxFQUFFO0VBQzdEN0UsUUFBQUEsR0FBRyxHQUFHNkUsS0FBSztFQUNiLE1BQUE7RUFDRixJQUFBO0VBQ0YsRUFBQTtFQVNBLEVBQUEsT0FBTzdFLEdBQUc7RUFDWjs7RUNuQmUsU0FBU0QsR0FBR0EsQ0FBQytKLE1BQU0sRUFBRUMsT0FBTyxFQUFFO0VBQzNDLEVBQUEsSUFBSWhLLEdBQUc7SUFDb0I7RUFDekIsSUFBQSxLQUFLLE1BQU04RSxLQUFLLElBQUlpRixNQUFNLEVBQUU7RUFDMUIsTUFBQSxJQUFJakYsS0FBSyxJQUFJLElBQUksS0FDVDlFLEdBQUcsR0FBRzhFLEtBQUssSUFBSzlFLEdBQUcsS0FBSzRFLFNBQVMsSUFBSUUsS0FBSyxJQUFJQSxLQUFNLENBQUMsRUFBRTtFQUM3RDlFLFFBQUFBLEdBQUcsR0FBRzhFLEtBQUs7RUFDYixNQUFBO0VBQ0YsSUFBQTtFQUNGLEVBQUE7RUFTQSxFQUFBLE9BQU85RSxHQUFHO0VBQ1o7O0VDakJBO0VBQ0E7RUFDZSxTQUFTcUssV0FBV0EsQ0FBQ3BHLEtBQUssRUFBRXJILENBQUMsRUFBRTBOLElBQUksR0FBRyxDQUFDLEVBQUVDLEtBQUssR0FBRzdNLFFBQVEsRUFBRXdNLE9BQU8sRUFBRTtFQUNqRnROLEVBQUFBLENBQUMsR0FBR0ksSUFBSSxDQUFDaUUsS0FBSyxDQUFDckUsQ0FBQyxDQUFDO0VBQ2pCME4sRUFBQUEsSUFBSSxHQUFHdE4sSUFBSSxDQUFDaUUsS0FBSyxDQUFDakUsSUFBSSxDQUFDaUQsR0FBRyxDQUFDLENBQUMsRUFBRXFLLElBQUksQ0FBQyxDQUFDO0VBQ3BDQyxFQUFBQSxLQUFLLEdBQUd2TixJQUFJLENBQUNpRSxLQUFLLENBQUNqRSxJQUFJLENBQUNnRCxHQUFHLENBQUNpRSxLQUFLLENBQUNwRSxNQUFNLEdBQUcsQ0FBQyxFQUFFMEssS0FBSyxDQUFDLENBQUM7SUFFckQsSUFBSSxFQUFFRCxJQUFJLElBQUkxTixDQUFDLElBQUlBLENBQUMsSUFBSTJOLEtBQUssQ0FBQyxFQUFFLE9BQU90RyxLQUFLO0lBRTVDaUcsT0FBTyxHQUFHQSxPQUFPLEtBQUt0RixTQUFTLEdBQUd1RixnQkFBZ0IsR0FBR0YsY0FBYyxDQUFDQyxPQUFPLENBQUM7SUFFNUUsT0FBT0ssS0FBSyxHQUFHRCxJQUFJLEVBQUU7RUFDbkIsSUFBQSxJQUFJQyxLQUFLLEdBQUdELElBQUksR0FBRyxHQUFHLEVBQUU7RUFDdEIsTUFBQSxNQUFNN04sQ0FBQyxHQUFHOE4sS0FBSyxHQUFHRCxJQUFJLEdBQUcsQ0FBQztFQUMxQixNQUFBLE1BQU01SixDQUFDLEdBQUc5RCxDQUFDLEdBQUcwTixJQUFJLEdBQUcsQ0FBQztFQUN0QixNQUFBLE1BQU1uTSxDQUFDLEdBQUduQixJQUFJLENBQUNULEdBQUcsQ0FBQ0UsQ0FBQyxDQUFDO0VBQ3JCLE1BQUEsTUFBTW9GLENBQUMsR0FBRyxHQUFHLEdBQUc3RSxJQUFJLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEdBQUdrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ25DLE1BQUEsTUFBTUgsRUFBRSxHQUFHLEdBQUcsR0FBR2hCLElBQUksQ0FBQ0ksSUFBSSxDQUFDZSxDQUFDLEdBQUcwRCxDQUFDLElBQUlwRixDQUFDLEdBQUdvRixDQUFDLENBQUMsR0FBR3BGLENBQUMsQ0FBQyxJQUFJaUUsQ0FBQyxHQUFHakUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRSxNQUFNK04sT0FBTyxHQUFHeE4sSUFBSSxDQUFDaUQsR0FBRyxDQUFDcUssSUFBSSxFQUFFdE4sSUFBSSxDQUFDaUUsS0FBSyxDQUFDckUsQ0FBQyxHQUFHOEQsQ0FBQyxHQUFHbUIsQ0FBQyxHQUFHcEYsQ0FBQyxHQUFHdUIsRUFBRSxDQUFDLENBQUM7UUFDOUQsTUFBTXlNLFFBQVEsR0FBR3pOLElBQUksQ0FBQ2dELEdBQUcsQ0FBQ3VLLEtBQUssRUFBRXZOLElBQUksQ0FBQ2lFLEtBQUssQ0FBQ3JFLENBQUMsR0FBRyxDQUFDSCxDQUFDLEdBQUdpRSxDQUFDLElBQUltQixDQUFDLEdBQUdwRixDQUFDLEdBQUd1QixFQUFFLENBQUMsQ0FBQztRQUN0RXFNLFdBQVcsQ0FBQ3BHLEtBQUssRUFBRXJILENBQUMsRUFBRTROLE9BQU8sRUFBRUMsUUFBUSxFQUFFUCxPQUFPLENBQUM7RUFDbkQsSUFBQTtFQUVBLElBQUEsTUFBTWxMLENBQUMsR0FBR2lGLEtBQUssQ0FBQ3JILENBQUMsQ0FBQztNQUNsQixJQUFJa0QsQ0FBQyxHQUFHd0ssSUFBSTtNQUNaLElBQUlyTyxDQUFDLEdBQUdzTyxLQUFLO0VBRWJHLElBQUFBLElBQUksQ0FBQ3pHLEtBQUssRUFBRXFHLElBQUksRUFBRTFOLENBQUMsQ0FBQztFQUNwQixJQUFBLElBQUlzTixPQUFPLENBQUNqRyxLQUFLLENBQUNzRyxLQUFLLENBQUMsRUFBRXZMLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTBMLElBQUksQ0FBQ3pHLEtBQUssRUFBRXFHLElBQUksRUFBRUMsS0FBSyxDQUFDO01BRTFELE9BQU96SyxDQUFDLEdBQUc3RCxDQUFDLEVBQUU7RUFDWnlPLE1BQUFBLElBQUksQ0FBQ3pHLEtBQUssRUFBRW5FLENBQUMsRUFBRTdELENBQUMsQ0FBQyxFQUFFLEVBQUU2RCxDQUFDLEVBQUUsRUFBRTdELENBQUM7RUFDM0IsTUFBQSxPQUFPaU8sT0FBTyxDQUFDakcsS0FBSyxDQUFDbkUsQ0FBQyxDQUFDLEVBQUVkLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFYyxDQUFDO0VBQ3BDLE1BQUEsT0FBT29LLE9BQU8sQ0FBQ2pHLEtBQUssQ0FBQ2hJLENBQUMsQ0FBQyxFQUFFK0MsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUvQyxDQUFDO0VBQ3RDLElBQUE7RUFFQSxJQUFBLElBQUlpTyxPQUFPLENBQUNqRyxLQUFLLENBQUNxRyxJQUFJLENBQUMsRUFBRXRMLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTBMLElBQUksQ0FBQ3pHLEtBQUssRUFBRXFHLElBQUksRUFBRXJPLENBQUMsQ0FBQyxDQUFDLEtBQ25ELEVBQUVBLENBQUMsRUFBRXlPLElBQUksQ0FBQ3pHLEtBQUssRUFBRWhJLENBQUMsRUFBRXNPLEtBQUssQ0FBQztNQUUvQixJQUFJdE8sQ0FBQyxJQUFJVyxDQUFDLEVBQUUwTixJQUFJLEdBQUdyTyxDQUFDLEdBQUcsQ0FBQztNQUN4QixJQUFJVyxDQUFDLElBQUlYLENBQUMsRUFBRXNPLEtBQUssR0FBR3RPLENBQUMsR0FBRyxDQUFDO0VBQzNCLEVBQUE7RUFFQSxFQUFBLE9BQU9nSSxLQUFLO0VBQ2Q7RUFFQSxTQUFTeUcsSUFBSUEsQ0FBQ3pHLEtBQUssRUFBRW5FLENBQUMsRUFBRTdELENBQUMsRUFBRTtFQUN6QixFQUFBLE1BQU0rQyxDQUFDLEdBQUdpRixLQUFLLENBQUNuRSxDQUFDLENBQUM7RUFDbEJtRSxFQUFBQSxLQUFLLENBQUNuRSxDQUFDLENBQUMsR0FBR21FLEtBQUssQ0FBQ2hJLENBQUMsQ0FBQztFQUNuQmdJLEVBQUFBLEtBQUssQ0FBQ2hJLENBQUMsQ0FBQyxHQUFHK0MsQ0FBQztFQUNkOztFQzNDZSxTQUFTMkwsUUFBUUEsQ0FBQ1osTUFBTSxFQUFFYSxDQUFDLEVBQUVaLE9BQU8sRUFBRTtJQUNuREQsTUFBTSxHQUFHYyxZQUFZLENBQUNDLElBQUksQ0FBQ2hCLE9BQU8sQ0FBQ0MsTUFBZSxDQUFDLENBQUM7RUFDcEQsRUFBQSxJQUFJLEVBQUV0TixDQUFDLEdBQUdzTixNQUFNLENBQUNsSyxNQUFNLENBQUMsSUFBSWtMLEtBQUssQ0FBQ0gsQ0FBQyxHQUFHLENBQUNBLENBQUMsQ0FBQyxFQUFFO0VBQzNDLEVBQUEsSUFBSUEsQ0FBQyxJQUFJLENBQUMsSUFBSW5PLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBT3VELEdBQUcsQ0FBQytKLE1BQU0sQ0FBQztJQUN2QyxJQUFJYSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8zSyxHQUFHLENBQUM4SixNQUFNLENBQUM7RUFDOUIsRUFBQSxJQUFJdE4sQ0FBQztFQUNEcUQsSUFBQUEsQ0FBQyxHQUFHLENBQUNyRCxDQUFDLEdBQUcsQ0FBQyxJQUFJbU8sQ0FBQztFQUNmSSxJQUFBQSxFQUFFLEdBQUdoTyxJQUFJLENBQUNpRSxLQUFLLENBQUNuQixDQUFDLENBQUM7RUFDbEJtTCxJQUFBQSxNQUFNLEdBQUdoTCxHQUFHLENBQUNvSyxXQUFXLENBQUNOLE1BQU0sRUFBRWlCLEVBQUUsQ0FBQyxDQUFDRSxRQUFRLENBQUMsQ0FBQyxFQUFFRixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7TUFDekRHLE1BQU0sR0FBR25MLEdBQUcsQ0FBQytKLE1BQU0sQ0FBQ21CLFFBQVEsQ0FBQ0YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLE9BQU9DLE1BQU0sR0FBRyxDQUFDRSxNQUFNLEdBQUdGLE1BQU0sS0FBS25MLENBQUMsR0FBR2tMLEVBQUUsQ0FBQztFQUM5Qzs7RUNsQmUsU0FBU0ksTUFBTUEsQ0FBQ3JCLE1BQU0sRUFBRUMsT0FBTyxFQUFFO0VBQzlDLEVBQUEsT0FBT1csUUFBUSxDQUFDWixNQUFNLEVBQUUsR0FBWSxDQUFDO0VBQ3ZDOztFQ0pBLElBQUlzQixJQUFJLEdBQUc7SUFBQ3ZHLEtBQUssRUFBRUEsTUFBTSxDQUFDO0VBQUMsQ0FBQztFQUU1QixTQUFTd0csUUFBUUEsR0FBRztJQUNsQixLQUFLLElBQUl4TCxDQUFDLEdBQUcsQ0FBQyxFQUFFckQsQ0FBQyxHQUFHOE8sU0FBUyxDQUFDMUwsTUFBTSxFQUFFMkwsQ0FBQyxHQUFHLEVBQUUsRUFBRXhNLENBQUMsRUFBRWMsQ0FBQyxHQUFHckQsQ0FBQyxFQUFFLEVBQUVxRCxDQUFDLEVBQUU7RUFDM0QsSUFBQSxJQUFJLEVBQUVkLENBQUMsR0FBR3VNLFNBQVMsQ0FBQ3pMLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFLZCxDQUFDLElBQUl3TSxDQUFFLElBQUksT0FBTyxDQUFDQyxJQUFJLENBQUN6TSxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUkwTSxLQUFLLENBQUMsZ0JBQWdCLEdBQUcxTSxDQUFDLENBQUM7RUFDbEd3TSxJQUFBQSxDQUFDLENBQUN4TSxDQUFDLENBQUMsR0FBRyxFQUFFO0VBQ1gsRUFBQTtFQUNBLEVBQUEsT0FBTyxJQUFJMk0sUUFBUSxDQUFDSCxDQUFDLENBQUM7RUFDeEI7RUFFQSxTQUFTRyxRQUFRQSxDQUFDSCxDQUFDLEVBQUU7SUFDbkIsSUFBSSxDQUFDQSxDQUFDLEdBQUdBLENBQUM7RUFDWjtFQUVBLFNBQVNJLGdCQUFjQSxDQUFDQyxTQUFTLEVBQUVDLEtBQUssRUFBRTtFQUN4QyxFQUFBLE9BQU9ELFNBQVMsQ0FBQ0UsSUFBSSxFQUFFLENBQUNDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQ0MsR0FBRyxDQUFDLFVBQVNqTixDQUFDLEVBQUU7TUFDckQsSUFBSTRDLElBQUksR0FBRyxFQUFFO0VBQUU5QixNQUFBQSxDQUFDLEdBQUdkLENBQUMsQ0FBQ2tOLE9BQU8sQ0FBQyxHQUFHLENBQUM7TUFDakMsSUFBSXBNLENBQUMsSUFBSSxDQUFDLEVBQUU4QixJQUFJLEdBQUc1QyxDQUFDLENBQUNnRSxLQUFLLENBQUNsRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUVkLENBQUMsR0FBR0EsQ0FBQyxDQUFDZ0UsS0FBSyxDQUFDLENBQUMsRUFBRWxELENBQUMsQ0FBQztFQUNwRCxJQUFBLElBQUlkLENBQUMsSUFBSSxDQUFDOE0sS0FBSyxDQUFDbkgsY0FBYyxDQUFDM0YsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJME0sS0FBSyxDQUFDLGdCQUFnQixHQUFHMU0sQ0FBQyxDQUFDO01BQ3hFLE9BQU87RUFBQ2dHLE1BQUFBLElBQUksRUFBRWhHLENBQUM7RUFBRTRDLE1BQUFBLElBQUksRUFBRUE7T0FBSztFQUM5QixFQUFBLENBQUMsQ0FBQztFQUNKO0VBRUErSixRQUFRLENBQUMzSixTQUFTLEdBQUdzSixRQUFRLENBQUN0SixTQUFTLEdBQUc7RUFDeENZLEVBQUFBLFdBQVcsRUFBRStJLFFBQVE7RUFDckJRLEVBQUFBLEVBQUUsRUFBRSxVQUFTQyxRQUFRLEVBQUVDLFFBQVEsRUFBRTtFQUMvQixJQUFBLElBQUliLENBQUMsR0FBRyxJQUFJLENBQUNBLENBQUM7UUFDVmMsQ0FBQyxHQUFHVixnQkFBYyxDQUFDUSxRQUFRLEdBQUcsRUFBRSxFQUFFWixDQUFDLENBQUM7UUFDcEN4TSxDQUFDO1FBQ0RjLENBQUMsR0FBRyxFQUFFO1FBQ05yRCxDQUFDLEdBQUc2UCxDQUFDLENBQUN6TSxNQUFNOztFQUVoQjtFQUNBLElBQUEsSUFBSTBMLFNBQVMsQ0FBQzFMLE1BQU0sR0FBRyxDQUFDLEVBQUU7RUFDeEIsTUFBQSxPQUFPLEVBQUVDLENBQUMsR0FBR3JELENBQUMsRUFBRSxJQUFJLENBQUN1QyxDQUFDLEdBQUcsQ0FBQ29OLFFBQVEsR0FBR0UsQ0FBQyxDQUFDeE0sQ0FBQyxDQUFDLEVBQUVrRixJQUFJLE1BQU1oRyxDQUFDLEdBQUd1TixLQUFHLENBQUNmLENBQUMsQ0FBQ3hNLENBQUMsQ0FBQyxFQUFFb04sUUFBUSxDQUFDeEssSUFBSSxDQUFDLENBQUMsRUFBRSxPQUFPNUMsQ0FBQztFQUM1RixNQUFBO0VBQ0YsSUFBQTs7RUFFQTtFQUNBO0VBQ0EsSUFBQSxJQUFJcU4sUUFBUSxJQUFJLElBQUksSUFBSSxPQUFPQSxRQUFRLEtBQUssVUFBVSxFQUFFLE1BQU0sSUFBSVgsS0FBSyxDQUFDLG9CQUFvQixHQUFHVyxRQUFRLENBQUM7RUFDeEcsSUFBQSxPQUFPLEVBQUV2TSxDQUFDLEdBQUdyRCxDQUFDLEVBQUU7UUFDZCxJQUFJdUMsQ0FBQyxHQUFHLENBQUNvTixRQUFRLEdBQUdFLENBQUMsQ0FBQ3hNLENBQUMsQ0FBQyxFQUFFa0YsSUFBSSxFQUFFd0csQ0FBQyxDQUFDeE0sQ0FBQyxDQUFDLEdBQUd3TixLQUFHLENBQUNoQixDQUFDLENBQUN4TSxDQUFDLENBQUMsRUFBRW9OLFFBQVEsQ0FBQ3hLLElBQUksRUFBRXlLLFFBQVEsQ0FBQyxDQUFDLEtBQ3JFLElBQUlBLFFBQVEsSUFBSSxJQUFJLEVBQUUsS0FBS3JOLENBQUMsSUFBSXdNLENBQUMsRUFBRUEsQ0FBQyxDQUFDeE0sQ0FBQyxDQUFDLEdBQUd3TixLQUFHLENBQUNoQixDQUFDLENBQUN4TSxDQUFDLENBQUMsRUFBRW9OLFFBQVEsQ0FBQ3hLLElBQUksRUFBRSxJQUFJLENBQUM7RUFDL0UsSUFBQTtFQUVBLElBQUEsT0FBTyxJQUFJO0lBQ2IsQ0FBQztJQUNENkssSUFBSSxFQUFFLFlBQVc7TUFDZixJQUFJQSxJQUFJLEdBQUcsRUFBRTtRQUFFakIsQ0FBQyxHQUFHLElBQUksQ0FBQ0EsQ0FBQztFQUN6QixJQUFBLEtBQUssSUFBSXhNLENBQUMsSUFBSXdNLENBQUMsRUFBRWlCLElBQUksQ0FBQ3pOLENBQUMsQ0FBQyxHQUFHd00sQ0FBQyxDQUFDeE0sQ0FBQyxDQUFDLENBQUNnRSxLQUFLLEVBQUU7RUFDdkMsSUFBQSxPQUFPLElBQUkySSxRQUFRLENBQUNjLElBQUksQ0FBQztJQUMzQixDQUFDO0VBQ0R2SyxFQUFBQSxJQUFJLEVBQUUsVUFBUzhDLElBQUksRUFBRTBILElBQUksRUFBRTtNQUN6QixJQUFJLENBQUNqUSxDQUFDLEdBQUc4TyxTQUFTLENBQUMxTCxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUk4TSxJQUFJLEdBQUcsSUFBSWpLLEtBQUssQ0FBQ2pHLENBQUMsQ0FBQyxFQUFFcUQsQ0FBQyxHQUFHLENBQUMsRUFBRXJELENBQUMsRUFBRXVDLENBQUMsRUFBRWMsQ0FBQyxHQUFHckQsQ0FBQyxFQUFFLEVBQUVxRCxDQUFDLEVBQUU2TSxJQUFJLENBQUM3TSxDQUFDLENBQUMsR0FBR3lMLFNBQVMsQ0FBQ3pMLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDckgsSUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDMEwsQ0FBQyxDQUFDN0csY0FBYyxDQUFDSyxJQUFJLENBQUMsRUFBRSxNQUFNLElBQUkwRyxLQUFLLENBQUMsZ0JBQWdCLEdBQUcxRyxJQUFJLENBQUM7RUFDMUUsSUFBQSxLQUFLaEcsQ0FBQyxHQUFHLElBQUksQ0FBQ3dNLENBQUMsQ0FBQ3hHLElBQUksQ0FBQyxFQUFFbEYsQ0FBQyxHQUFHLENBQUMsRUFBRXJELENBQUMsR0FBR3VDLENBQUMsQ0FBQ2EsTUFBTSxFQUFFQyxDQUFDLEdBQUdyRCxDQUFDLEVBQUUsRUFBRXFELENBQUMsRUFBRWQsQ0FBQyxDQUFDYyxDQUFDLENBQUMsQ0FBQ2dGLEtBQUssQ0FBQzhILEtBQUssQ0FBQ0YsSUFBSSxFQUFFQyxJQUFJLENBQUM7SUFDdEYsQ0FBQztJQUNEQyxLQUFLLEVBQUUsVUFBUzVILElBQUksRUFBRTBILElBQUksRUFBRUMsSUFBSSxFQUFFO0VBQ2hDLElBQUEsSUFBSSxDQUFDLElBQUksQ0FBQ25CLENBQUMsQ0FBQzdHLGNBQWMsQ0FBQ0ssSUFBSSxDQUFDLEVBQUUsTUFBTSxJQUFJMEcsS0FBSyxDQUFDLGdCQUFnQixHQUFHMUcsSUFBSSxDQUFDO0VBQzFFLElBQUEsS0FBSyxJQUFJaEcsQ0FBQyxHQUFHLElBQUksQ0FBQ3dNLENBQUMsQ0FBQ3hHLElBQUksQ0FBQyxFQUFFbEYsQ0FBQyxHQUFHLENBQUMsRUFBRXJELENBQUMsR0FBR3VDLENBQUMsQ0FBQ2EsTUFBTSxFQUFFQyxDQUFDLEdBQUdyRCxDQUFDLEVBQUUsRUFBRXFELENBQUMsRUFBRWQsQ0FBQyxDQUFDYyxDQUFDLENBQUMsQ0FBQ2dGLEtBQUssQ0FBQzhILEtBQUssQ0FBQ0YsSUFBSSxFQUFFQyxJQUFJLENBQUM7RUFDMUYsRUFBQTtFQUNGLENBQUM7RUFFRCxTQUFTSixLQUFHQSxDQUFDdkgsSUFBSSxFQUFFcEQsSUFBSSxFQUFFO0VBQ3ZCLEVBQUEsS0FBSyxJQUFJOUIsQ0FBQyxHQUFHLENBQUMsRUFBRXJELENBQUMsR0FBR3VJLElBQUksQ0FBQ25GLE1BQU0sRUFBRWdOLENBQUMsRUFBRS9NLENBQUMsR0FBR3JELENBQUMsRUFBRSxFQUFFcUQsQ0FBQyxFQUFFO01BQzlDLElBQUksQ0FBQytNLENBQUMsR0FBRzdILElBQUksQ0FBQ2xGLENBQUMsQ0FBQyxFQUFFOEIsSUFBSSxLQUFLQSxJQUFJLEVBQUU7UUFDL0IsT0FBT2lMLENBQUMsQ0FBQy9ILEtBQUs7RUFDaEIsSUFBQTtFQUNGLEVBQUE7RUFDRjtFQUVBLFNBQVMwSCxLQUFHQSxDQUFDeEgsSUFBSSxFQUFFcEQsSUFBSSxFQUFFeUssUUFBUSxFQUFFO0VBQ2pDLEVBQUEsS0FBSyxJQUFJdk0sQ0FBQyxHQUFHLENBQUMsRUFBRXJELENBQUMsR0FBR3VJLElBQUksQ0FBQ25GLE1BQU0sRUFBRUMsQ0FBQyxHQUFHckQsQ0FBQyxFQUFFLEVBQUVxRCxDQUFDLEVBQUU7TUFDM0MsSUFBSWtGLElBQUksQ0FBQ2xGLENBQUMsQ0FBQyxDQUFDOEIsSUFBSSxLQUFLQSxJQUFJLEVBQUU7UUFDekJvRCxJQUFJLENBQUNsRixDQUFDLENBQUMsR0FBR3VMLElBQUksRUFBRXJHLElBQUksR0FBR0EsSUFBSSxDQUFDaEMsS0FBSyxDQUFDLENBQUMsRUFBRWxELENBQUMsQ0FBQyxDQUFDMkQsTUFBTSxDQUFDdUIsSUFBSSxDQUFDaEMsS0FBSyxDQUFDbEQsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ2pFLE1BQUE7RUFDRixJQUFBO0VBQ0YsRUFBQTtFQUNBLEVBQUEsSUFBSXVNLFFBQVEsSUFBSSxJQUFJLEVBQUVySCxJQUFJLENBQUNyQyxJQUFJLENBQUM7RUFBQ2YsSUFBQUEsSUFBSSxFQUFFQSxJQUFJO0VBQUVrRCxJQUFBQSxLQUFLLEVBQUV1SDtFQUFRLEdBQUMsQ0FBQztFQUM5RCxFQUFBLE9BQU9ySCxJQUFJO0VBQ2I7O0VDakZPLElBQUk4SCxLQUFLLEdBQUcsOEJBQThCO0FBRWpELG1CQUFlO0VBQ2JDLEVBQUFBLEdBQUcsRUFBRSw0QkFBNEI7RUFDakNELEVBQUFBLEtBQUssRUFBRUEsS0FBSztFQUNaRSxFQUFBQSxLQUFLLEVBQUUsOEJBQThCO0VBQ3JDQyxFQUFBQSxHQUFHLEVBQUUsc0NBQXNDO0VBQzNDQyxFQUFBQSxLQUFLLEVBQUU7RUFDVCxDQUFDOztFQ05jLGtCQUFBLEVBQVN0TCxJQUFJLEVBQUU7RUFDNUIsRUFBQSxJQUFJdUwsTUFBTSxHQUFHdkwsSUFBSSxJQUFJLEVBQUU7RUFBRTlCLElBQUFBLENBQUMsR0FBR3FOLE1BQU0sQ0FBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDaEQsSUFBSXBNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQ3FOLE1BQU0sR0FBR3ZMLElBQUksQ0FBQ29CLEtBQUssQ0FBQyxDQUFDLEVBQUVsRCxDQUFDLENBQUMsTUFBTSxPQUFPLEVBQUU4QixJQUFJLEdBQUdBLElBQUksQ0FBQ29CLEtBQUssQ0FBQ2xELENBQUMsR0FBRyxDQUFDLENBQUM7RUFDL0UsRUFBQSxPQUFPc04sVUFBVSxDQUFDekksY0FBYyxDQUFDd0ksTUFBTSxDQUFDLEdBQUc7RUFBQ0UsSUFBQUEsS0FBSyxFQUFFRCxVQUFVLENBQUNELE1BQU0sQ0FBQztFQUFFRyxJQUFBQSxLQUFLLEVBQUUxTDtLQUFLLEdBQUdBLElBQUksQ0FBQztFQUM3Rjs7RUNIQSxTQUFTMkwsY0FBY0EsQ0FBQzNMLElBQUksRUFBRTtFQUM1QixFQUFBLE9BQU8sWUFBVztFQUNoQixJQUFBLElBQUk0TCxRQUFRLEdBQUcsSUFBSSxDQUFDQyxhQUFhO1FBQzdCQyxHQUFHLEdBQUcsSUFBSSxDQUFDQyxZQUFZO01BQzNCLE9BQU9ELEdBQUcsS0FBS1osS0FBSyxJQUFJVSxRQUFRLENBQUNJLGVBQWUsQ0FBQ0QsWUFBWSxLQUFLYixLQUFLLEdBQ2pFVSxRQUFRLENBQUNLLGFBQWEsQ0FBQ2pNLElBQUksQ0FBQyxHQUM1QjRMLFFBQVEsQ0FBQ00sZUFBZSxDQUFDSixHQUFHLEVBQUU5TCxJQUFJLENBQUM7SUFDM0MsQ0FBQztFQUNIO0VBRUEsU0FBU21NLFlBQVlBLENBQUNDLFFBQVEsRUFBRTtFQUM5QixFQUFBLE9BQU8sWUFBVztFQUNoQixJQUFBLE9BQU8sSUFBSSxDQUFDUCxhQUFhLENBQUNLLGVBQWUsQ0FBQ0UsUUFBUSxDQUFDWCxLQUFLLEVBQUVXLFFBQVEsQ0FBQ1YsS0FBSyxDQUFDO0lBQzNFLENBQUM7RUFDSDtFQUVlLGdCQUFBLEVBQVMxTCxJQUFJLEVBQUU7RUFDNUIsRUFBQSxJQUFJb00sUUFBUSxHQUFHQyxTQUFTLENBQUNyTSxJQUFJLENBQUM7SUFDOUIsT0FBTyxDQUFDb00sUUFBUSxDQUFDVixLQUFLLEdBQ2hCUyxZQUFZLEdBQ1pSLGNBQWMsRUFBRVMsUUFBUSxDQUFDO0VBQ2pDOztFQ3hCQSxTQUFTRSxJQUFJQSxHQUFHLENBQUM7RUFFRixpQkFBQSxFQUFTQyxRQUFRLEVBQUU7RUFDaEMsRUFBQSxPQUFPQSxRQUFRLElBQUksSUFBSSxHQUFHRCxJQUFJLEdBQUcsWUFBVztFQUMxQyxJQUFBLE9BQU8sSUFBSSxDQUFDRSxhQUFhLENBQUNELFFBQVEsQ0FBQztJQUNyQyxDQUFDO0VBQ0g7O0VDSGUseUJBQUEsRUFBU0UsTUFBTSxFQUFFO0lBQzlCLElBQUksT0FBT0EsTUFBTSxLQUFLLFVBQVUsRUFBRUEsTUFBTSxHQUFHRixRQUFRLENBQUNFLE1BQU0sQ0FBQztFQUUzRCxFQUFBLEtBQUssSUFBSUMsTUFBTSxHQUFHLElBQUksQ0FBQ0MsT0FBTyxFQUFFN04sQ0FBQyxHQUFHNE4sTUFBTSxDQUFDek8sTUFBTSxFQUFFMk8sU0FBUyxHQUFHLElBQUk5TCxLQUFLLENBQUNoQyxDQUFDLENBQUMsRUFBRXpFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3lFLENBQUMsRUFBRSxFQUFFekUsQ0FBQyxFQUFFO0VBQzlGLElBQUEsS0FBSyxJQUFJd1MsS0FBSyxHQUFHSCxNQUFNLENBQUNyUyxDQUFDLENBQUMsRUFBRVEsQ0FBQyxHQUFHZ1MsS0FBSyxDQUFDNU8sTUFBTSxFQUFFNk8sUUFBUSxHQUFHRixTQUFTLENBQUN2UyxDQUFDLENBQUMsR0FBRyxJQUFJeUcsS0FBSyxDQUFDakcsQ0FBQyxDQUFDLEVBQUVrUyxJQUFJLEVBQUVDLE9BQU8sRUFBRTlPLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3JELENBQUMsRUFBRSxFQUFFcUQsQ0FBQyxFQUFFO1FBQ3RILElBQUksQ0FBQzZPLElBQUksR0FBR0YsS0FBSyxDQUFDM08sQ0FBQyxDQUFDLE1BQU04TyxPQUFPLEdBQUdQLE1BQU0sQ0FBQ25NLElBQUksQ0FBQ3lNLElBQUksRUFBRUEsSUFBSSxDQUFDRSxRQUFRLEVBQUUvTyxDQUFDLEVBQUUyTyxLQUFLLENBQUMsQ0FBQyxFQUFFO1VBQy9FLElBQUksVUFBVSxJQUFJRSxJQUFJLEVBQUVDLE9BQU8sQ0FBQ0MsUUFBUSxHQUFHRixJQUFJLENBQUNFLFFBQVE7RUFDeERILFFBQUFBLFFBQVEsQ0FBQzVPLENBQUMsQ0FBQyxHQUFHOE8sT0FBTztFQUN2QixNQUFBO0VBQ0YsSUFBQTtFQUNGLEVBQUE7SUFFQSxPQUFPLElBQUlFLFdBQVMsQ0FBQ04sU0FBUyxFQUFFLElBQUksQ0FBQ08sUUFBUSxDQUFDO0VBQ2hEOztFQ2hCQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDZSxTQUFTOUssS0FBS0EsQ0FBQ2pJLENBQUMsRUFBRTtJQUMvQixPQUFPQSxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRzBHLEtBQUssQ0FBQ0ksT0FBTyxDQUFDOUcsQ0FBQyxDQUFDLEdBQUdBLENBQUMsR0FBRzBHLEtBQUssQ0FBQ29JLElBQUksQ0FBQzlPLENBQUMsQ0FBQztFQUM5RDs7RUNSQSxTQUFTOEYsS0FBS0EsR0FBRztFQUNmLEVBQUEsT0FBTyxFQUFFO0VBQ1g7RUFFZSxvQkFBQSxFQUFTcU0sUUFBUSxFQUFFO0VBQ2hDLEVBQUEsT0FBT0EsUUFBUSxJQUFJLElBQUksR0FBR3JNLEtBQUssR0FBRyxZQUFXO0VBQzNDLElBQUEsT0FBTyxJQUFJLENBQUNrTixnQkFBZ0IsQ0FBQ2IsUUFBUSxDQUFDO0lBQ3hDLENBQUM7RUFDSDs7RUNKQSxTQUFTYyxRQUFRQSxDQUFDWixNQUFNLEVBQUU7RUFDeEIsRUFBQSxPQUFPLFlBQVc7TUFDaEIsT0FBT3BLLEtBQUssQ0FBQ29LLE1BQU0sQ0FBQ3pCLEtBQUssQ0FBQyxJQUFJLEVBQUVyQixTQUFTLENBQUMsQ0FBQztJQUM3QyxDQUFDO0VBQ0g7RUFFZSw0QkFBQSxFQUFTOEMsTUFBTSxFQUFFO0VBQzlCLEVBQUEsSUFBSSxPQUFPQSxNQUFNLEtBQUssVUFBVSxFQUFFQSxNQUFNLEdBQUdZLFFBQVEsQ0FBQ1osTUFBTSxDQUFDLENBQUMsS0FDdkRBLE1BQU0sR0FBR2EsV0FBVyxDQUFDYixNQUFNLENBQUM7RUFFakMsRUFBQSxLQUFLLElBQUlDLE1BQU0sR0FBRyxJQUFJLENBQUNDLE9BQU8sRUFBRTdOLENBQUMsR0FBRzROLE1BQU0sQ0FBQ3pPLE1BQU0sRUFBRTJPLFNBQVMsR0FBRyxFQUFFLEVBQUVXLE9BQU8sR0FBRyxFQUFFLEVBQUVsVCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUd5RSxDQUFDLEVBQUUsRUFBRXpFLENBQUMsRUFBRTtNQUNsRyxLQUFLLElBQUl3UyxLQUFLLEdBQUdILE1BQU0sQ0FBQ3JTLENBQUMsQ0FBQyxFQUFFUSxDQUFDLEdBQUdnUyxLQUFLLENBQUM1TyxNQUFNLEVBQUU4TyxJQUFJLEVBQUU3TyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdyRCxDQUFDLEVBQUUsRUFBRXFELENBQUMsRUFBRTtFQUNyRSxNQUFBLElBQUk2TyxJQUFJLEdBQUdGLEtBQUssQ0FBQzNPLENBQUMsQ0FBQyxFQUFFO0VBQ25CME8sUUFBQUEsU0FBUyxDQUFDN0wsSUFBSSxDQUFDMEwsTUFBTSxDQUFDbk0sSUFBSSxDQUFDeU0sSUFBSSxFQUFFQSxJQUFJLENBQUNFLFFBQVEsRUFBRS9PLENBQUMsRUFBRTJPLEtBQUssQ0FBQyxDQUFDO0VBQzFEVSxRQUFBQSxPQUFPLENBQUN4TSxJQUFJLENBQUNnTSxJQUFJLENBQUM7RUFDcEIsTUFBQTtFQUNGLElBQUE7RUFDRixFQUFBO0VBRUEsRUFBQSxPQUFPLElBQUlHLFdBQVMsQ0FBQ04sU0FBUyxFQUFFVyxPQUFPLENBQUM7RUFDMUM7O0VDeEJlLGdCQUFBLEVBQVNoQixRQUFRLEVBQUU7RUFDaEMsRUFBQSxPQUFPLFlBQVc7RUFDaEIsSUFBQSxPQUFPLElBQUksQ0FBQ2lCLE9BQU8sQ0FBQ2pCLFFBQVEsQ0FBQztJQUMvQixDQUFDO0VBQ0g7RUFFTyxTQUFTa0IsWUFBWUEsQ0FBQ2xCLFFBQVEsRUFBRTtJQUNyQyxPQUFPLFVBQVNRLElBQUksRUFBRTtFQUNwQixJQUFBLE9BQU9BLElBQUksQ0FBQ1MsT0FBTyxDQUFDakIsUUFBUSxDQUFDO0lBQy9CLENBQUM7RUFDSDs7RUNSQSxJQUFJbUIsSUFBSSxHQUFHNU0sS0FBSyxDQUFDVixTQUFTLENBQUNzTixJQUFJO0VBRS9CLFNBQVNDLFNBQVNBLENBQUNDLEtBQUssRUFBRTtFQUN4QixFQUFBLE9BQU8sWUFBVztNQUNoQixPQUFPRixJQUFJLENBQUNwTixJQUFJLENBQUMsSUFBSSxDQUFDdU4sUUFBUSxFQUFFRCxLQUFLLENBQUM7SUFDeEMsQ0FBQztFQUNIO0VBRUEsU0FBU0UsVUFBVUEsR0FBRztJQUNwQixPQUFPLElBQUksQ0FBQ0MsaUJBQWlCO0VBQy9CO0VBRWUsOEJBQUEsRUFBU0gsS0FBSyxFQUFFO0lBQzdCLE9BQU8sSUFBSSxDQUFDbkIsTUFBTSxDQUFDbUIsS0FBSyxJQUFJLElBQUksR0FBR0UsVUFBVSxHQUN2Q0gsU0FBUyxDQUFDLE9BQU9DLEtBQUssS0FBSyxVQUFVLEdBQUdBLEtBQUssR0FBR0gsWUFBWSxDQUFDRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0VBQzdFOztFQ2ZBLElBQUlJLE1BQU0sR0FBR2xOLEtBQUssQ0FBQ1YsU0FBUyxDQUFDNE4sTUFBTTtFQUVuQyxTQUFTSCxRQUFRQSxHQUFHO0VBQ2xCLEVBQUEsT0FBTy9NLEtBQUssQ0FBQ29JLElBQUksQ0FBQyxJQUFJLENBQUMyRSxRQUFRLENBQUM7RUFDbEM7RUFFQSxTQUFTSSxjQUFjQSxDQUFDTCxLQUFLLEVBQUU7RUFDN0IsRUFBQSxPQUFPLFlBQVc7TUFDaEIsT0FBT0ksTUFBTSxDQUFDMU4sSUFBSSxDQUFDLElBQUksQ0FBQ3VOLFFBQVEsRUFBRUQsS0FBSyxDQUFDO0lBQzFDLENBQUM7RUFDSDtFQUVlLGlDQUFBLEVBQVNBLEtBQUssRUFBRTtJQUM3QixPQUFPLElBQUksQ0FBQ00sU0FBUyxDQUFDTixLQUFLLElBQUksSUFBSSxHQUFHQyxRQUFRLEdBQ3hDSSxjQUFjLENBQUMsT0FBT0wsS0FBSyxLQUFLLFVBQVUsR0FBR0EsS0FBSyxHQUFHSCxZQUFZLENBQUNHLEtBQUssQ0FBQyxDQUFDLENBQUM7RUFDbEY7O0VDZGUseUJBQUEsRUFBU0EsS0FBSyxFQUFFO0lBQzdCLElBQUksT0FBT0EsS0FBSyxLQUFLLFVBQVUsRUFBRUEsS0FBSyxHQUFHTyxPQUFPLENBQUNQLEtBQUssQ0FBQztFQUV2RCxFQUFBLEtBQUssSUFBSWxCLE1BQU0sR0FBRyxJQUFJLENBQUNDLE9BQU8sRUFBRTdOLENBQUMsR0FBRzROLE1BQU0sQ0FBQ3pPLE1BQU0sRUFBRTJPLFNBQVMsR0FBRyxJQUFJOUwsS0FBSyxDQUFDaEMsQ0FBQyxDQUFDLEVBQUV6RSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUd5RSxDQUFDLEVBQUUsRUFBRXpFLENBQUMsRUFBRTtFQUM5RixJQUFBLEtBQUssSUFBSXdTLEtBQUssR0FBR0gsTUFBTSxDQUFDclMsQ0FBQyxDQUFDLEVBQUVRLENBQUMsR0FBR2dTLEtBQUssQ0FBQzVPLE1BQU0sRUFBRTZPLFFBQVEsR0FBR0YsU0FBUyxDQUFDdlMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFMFMsSUFBSSxFQUFFN08sQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHckQsQ0FBQyxFQUFFLEVBQUVxRCxDQUFDLEVBQUU7UUFDbkcsSUFBSSxDQUFDNk8sSUFBSSxHQUFHRixLQUFLLENBQUMzTyxDQUFDLENBQUMsS0FBSzBQLEtBQUssQ0FBQ3ROLElBQUksQ0FBQ3lNLElBQUksRUFBRUEsSUFBSSxDQUFDRSxRQUFRLEVBQUUvTyxDQUFDLEVBQUUyTyxLQUFLLENBQUMsRUFBRTtFQUNsRUMsUUFBQUEsUUFBUSxDQUFDL0wsSUFBSSxDQUFDZ00sSUFBSSxDQUFDO0VBQ3JCLE1BQUE7RUFDRixJQUFBO0VBQ0YsRUFBQTtJQUVBLE9BQU8sSUFBSUcsV0FBUyxDQUFDTixTQUFTLEVBQUUsSUFBSSxDQUFDTyxRQUFRLENBQUM7RUFDaEQ7O0VDZmUsZUFBQSxFQUFTaUIsTUFBTSxFQUFFO0VBQzlCLEVBQUEsT0FBTyxJQUFJdE4sS0FBSyxDQUFDc04sTUFBTSxDQUFDblEsTUFBTSxDQUFDO0VBQ2pDOztFQ0NlLHdCQUFBLElBQVc7RUFDeEIsRUFBQSxPQUFPLElBQUlpUCxXQUFTLENBQUMsSUFBSSxDQUFDbUIsTUFBTSxJQUFJLElBQUksQ0FBQzFCLE9BQU8sQ0FBQ3RDLEdBQUcsQ0FBQ2lFLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQ25CLFFBQVEsQ0FBQztFQUM5RTtFQUVPLFNBQVNvQixTQUFTQSxDQUFDQyxNQUFNLEVBQUVDLEtBQUssRUFBRTtFQUN2QyxFQUFBLElBQUksQ0FBQzVDLGFBQWEsR0FBRzJDLE1BQU0sQ0FBQzNDLGFBQWE7RUFDekMsRUFBQSxJQUFJLENBQUNFLFlBQVksR0FBR3lDLE1BQU0sQ0FBQ3pDLFlBQVk7SUFDdkMsSUFBSSxDQUFDMkMsS0FBSyxHQUFHLElBQUk7SUFDakIsSUFBSSxDQUFDQyxPQUFPLEdBQUdILE1BQU07SUFDckIsSUFBSSxDQUFDdkIsUUFBUSxHQUFHd0IsS0FBSztFQUN2QjtFQUVBRixTQUFTLENBQUNuTyxTQUFTLEdBQUc7RUFDcEJZLEVBQUFBLFdBQVcsRUFBRXVOLFNBQVM7RUFDdEJLLEVBQUFBLFdBQVcsRUFBRSxVQUFTQyxLQUFLLEVBQUU7TUFBRSxPQUFPLElBQUksQ0FBQ0YsT0FBTyxDQUFDRyxZQUFZLENBQUNELEtBQUssRUFBRSxJQUFJLENBQUNILEtBQUssQ0FBQztJQUFFLENBQUM7RUFDckZJLEVBQUFBLFlBQVksRUFBRSxVQUFTRCxLQUFLLEVBQUVFLElBQUksRUFBRTtNQUFFLE9BQU8sSUFBSSxDQUFDSixPQUFPLENBQUNHLFlBQVksQ0FBQ0QsS0FBSyxFQUFFRSxJQUFJLENBQUM7SUFBRSxDQUFDO0VBQ3RGdkMsRUFBQUEsYUFBYSxFQUFFLFVBQVNELFFBQVEsRUFBRTtFQUFFLElBQUEsT0FBTyxJQUFJLENBQUNvQyxPQUFPLENBQUNuQyxhQUFhLENBQUNELFFBQVEsQ0FBQztJQUFFLENBQUM7RUFDbEZhLEVBQUFBLGdCQUFnQixFQUFFLFVBQVNiLFFBQVEsRUFBRTtFQUFFLElBQUEsT0FBTyxJQUFJLENBQUNvQyxPQUFPLENBQUN2QixnQkFBZ0IsQ0FBQ2IsUUFBUSxDQUFDO0VBQUUsRUFBQTtFQUN6RixDQUFDOztFQ3JCYyxtQkFBQSxFQUFTblMsQ0FBQyxFQUFFO0VBQ3pCLEVBQUEsT0FBTyxZQUFXO0VBQ2hCLElBQUEsT0FBT0EsQ0FBQztJQUNWLENBQUM7RUFDSDs7RUNBQSxTQUFTNFUsU0FBU0EsQ0FBQ1IsTUFBTSxFQUFFM0IsS0FBSyxFQUFFb0MsS0FBSyxFQUFFYixNQUFNLEVBQUVjLElBQUksRUFBRS9ILElBQUksRUFBRTtJQUMzRCxJQUFJakosQ0FBQyxHQUFHLENBQUM7TUFDTDZPLElBQUk7TUFDSm9DLFdBQVcsR0FBR3RDLEtBQUssQ0FBQzVPLE1BQU07TUFDMUJtUixVQUFVLEdBQUdqSSxJQUFJLENBQUNsSixNQUFNOztFQUU1QjtFQUNBO0VBQ0E7RUFDQSxFQUFBLE9BQU9DLENBQUMsR0FBR2tSLFVBQVUsRUFBRSxFQUFFbFIsQ0FBQyxFQUFFO0VBQzFCLElBQUEsSUFBSTZPLElBQUksR0FBR0YsS0FBSyxDQUFDM08sQ0FBQyxDQUFDLEVBQUU7RUFDbkI2TyxNQUFBQSxJQUFJLENBQUNFLFFBQVEsR0FBRzlGLElBQUksQ0FBQ2pKLENBQUMsQ0FBQztFQUN2QmtRLE1BQUFBLE1BQU0sQ0FBQ2xRLENBQUMsQ0FBQyxHQUFHNk8sSUFBSTtFQUNsQixJQUFBLENBQUMsTUFBTTtFQUNMa0MsTUFBQUEsS0FBSyxDQUFDL1EsQ0FBQyxDQUFDLEdBQUcsSUFBSXFRLFNBQVMsQ0FBQ0MsTUFBTSxFQUFFckgsSUFBSSxDQUFDakosQ0FBQyxDQUFDLENBQUM7RUFDM0MsSUFBQTtFQUNGLEVBQUE7O0VBRUE7RUFDQSxFQUFBLE9BQU9BLENBQUMsR0FBR2lSLFdBQVcsRUFBRSxFQUFFalIsQ0FBQyxFQUFFO0VBQzNCLElBQUEsSUFBSTZPLElBQUksR0FBR0YsS0FBSyxDQUFDM08sQ0FBQyxDQUFDLEVBQUU7RUFDbkJnUixNQUFBQSxJQUFJLENBQUNoUixDQUFDLENBQUMsR0FBRzZPLElBQUk7RUFDaEIsSUFBQTtFQUNGLEVBQUE7RUFDRjtFQUVBLFNBQVNzQyxPQUFPQSxDQUFDYixNQUFNLEVBQUUzQixLQUFLLEVBQUVvQyxLQUFLLEVBQUViLE1BQU0sRUFBRWMsSUFBSSxFQUFFL0gsSUFBSSxFQUFFbUksR0FBRyxFQUFFO0VBQzlELEVBQUEsSUFBSXBSLENBQUM7TUFDRDZPLElBQUk7RUFDSndDLElBQUFBLGNBQWMsR0FBRyxJQUFJQyxHQUFHLEVBQUE7TUFDeEJMLFdBQVcsR0FBR3RDLEtBQUssQ0FBQzVPLE1BQU07TUFDMUJtUixVQUFVLEdBQUdqSSxJQUFJLENBQUNsSixNQUFNO0VBQ3hCd1IsSUFBQUEsU0FBUyxHQUFHLElBQUkzTyxLQUFLLENBQUNxTyxXQUFXLENBQUM7TUFDbENPLFFBQVE7O0VBRVo7RUFDQTtJQUNBLEtBQUt4UixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdpUixXQUFXLEVBQUUsRUFBRWpSLENBQUMsRUFBRTtFQUNoQyxJQUFBLElBQUk2TyxJQUFJLEdBQUdGLEtBQUssQ0FBQzNPLENBQUMsQ0FBQyxFQUFFO1FBQ25CdVIsU0FBUyxDQUFDdlIsQ0FBQyxDQUFDLEdBQUd3UixRQUFRLEdBQUdKLEdBQUcsQ0FBQ2hQLElBQUksQ0FBQ3lNLElBQUksRUFBRUEsSUFBSSxDQUFDRSxRQUFRLEVBQUUvTyxDQUFDLEVBQUUyTyxLQUFLLENBQUMsR0FBRyxFQUFFO0VBQ3RFLE1BQUEsSUFBSTBDLGNBQWMsQ0FBQ0ksR0FBRyxDQUFDRCxRQUFRLENBQUMsRUFBRTtFQUNoQ1IsUUFBQUEsSUFBSSxDQUFDaFIsQ0FBQyxDQUFDLEdBQUc2TyxJQUFJO0VBQ2hCLE1BQUEsQ0FBQyxNQUFNO0VBQ0x3QyxRQUFBQSxjQUFjLENBQUMzRSxHQUFHLENBQUM4RSxRQUFRLEVBQUUzQyxJQUFJLENBQUM7RUFDcEMsTUFBQTtFQUNGLElBQUE7RUFDRixFQUFBOztFQUVBO0VBQ0E7RUFDQTtJQUNBLEtBQUs3TyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdrUixVQUFVLEVBQUUsRUFBRWxSLENBQUMsRUFBRTtFQUMvQndSLElBQUFBLFFBQVEsR0FBR0osR0FBRyxDQUFDaFAsSUFBSSxDQUFDa08sTUFBTSxFQUFFckgsSUFBSSxDQUFDakosQ0FBQyxDQUFDLEVBQUVBLENBQUMsRUFBRWlKLElBQUksQ0FBQyxHQUFHLEVBQUU7TUFDbEQsSUFBSTRGLElBQUksR0FBR3dDLGNBQWMsQ0FBQzVFLEdBQUcsQ0FBQytFLFFBQVEsQ0FBQyxFQUFFO0VBQ3ZDdEIsTUFBQUEsTUFBTSxDQUFDbFEsQ0FBQyxDQUFDLEdBQUc2TyxJQUFJO0VBQ2hCQSxNQUFBQSxJQUFJLENBQUNFLFFBQVEsR0FBRzlGLElBQUksQ0FBQ2pKLENBQUMsQ0FBQztFQUN2QnFSLE1BQUFBLGNBQWMsQ0FBQ0ssTUFBTSxDQUFDRixRQUFRLENBQUM7RUFDakMsSUFBQSxDQUFDLE1BQU07RUFDTFQsTUFBQUEsS0FBSyxDQUFDL1EsQ0FBQyxDQUFDLEdBQUcsSUFBSXFRLFNBQVMsQ0FBQ0MsTUFBTSxFQUFFckgsSUFBSSxDQUFDakosQ0FBQyxDQUFDLENBQUM7RUFDM0MsSUFBQTtFQUNGLEVBQUE7O0VBRUE7SUFDQSxLQUFLQSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdpUixXQUFXLEVBQUUsRUFBRWpSLENBQUMsRUFBRTtFQUNoQyxJQUFBLElBQUksQ0FBQzZPLElBQUksR0FBR0YsS0FBSyxDQUFDM08sQ0FBQyxDQUFDLEtBQU1xUixjQUFjLENBQUM1RSxHQUFHLENBQUM4RSxTQUFTLENBQUN2UixDQUFDLENBQUMsQ0FBQyxLQUFLNk8sSUFBSyxFQUFFO0VBQ3BFbUMsTUFBQUEsSUFBSSxDQUFDaFIsQ0FBQyxDQUFDLEdBQUc2TyxJQUFJO0VBQ2hCLElBQUE7RUFDRixFQUFBO0VBQ0Y7RUFFQSxTQUFTMEIsS0FBS0EsQ0FBQzFCLElBQUksRUFBRTtJQUNuQixPQUFPQSxJQUFJLENBQUNFLFFBQVE7RUFDdEI7RUFFZSx1QkFBQSxFQUFTL0osS0FBSyxFQUFFb00sR0FBRyxFQUFFO0VBQ2xDLEVBQUEsSUFBSSxDQUFDM0YsU0FBUyxDQUFDMUwsTUFBTSxFQUFFLE9BQU82QyxLQUFLLENBQUNvSSxJQUFJLENBQUMsSUFBSSxFQUFFdUYsS0FBSyxDQUFDO0VBRXJELEVBQUEsSUFBSW9CLElBQUksR0FBR1AsR0FBRyxHQUFHRCxPQUFPLEdBQUdMLFNBQVM7TUFDaEN6QixPQUFPLEdBQUcsSUFBSSxDQUFDSixRQUFRO01BQ3ZCVCxNQUFNLEdBQUcsSUFBSSxDQUFDQyxPQUFPO0lBRXpCLElBQUksT0FBT3pKLEtBQUssS0FBSyxVQUFVLEVBQUVBLEtBQUssR0FBRzRNLFVBQVEsQ0FBQzVNLEtBQUssQ0FBQztFQUV4RCxFQUFBLEtBQUssSUFBSXBFLENBQUMsR0FBRzROLE1BQU0sQ0FBQ3pPLE1BQU0sRUFBRW1RLE1BQU0sR0FBRyxJQUFJdE4sS0FBSyxDQUFDaEMsQ0FBQyxDQUFDLEVBQUVtUSxLQUFLLEdBQUcsSUFBSW5PLEtBQUssQ0FBQ2hDLENBQUMsQ0FBQyxFQUFFb1EsSUFBSSxHQUFHLElBQUlwTyxLQUFLLENBQUNoQyxDQUFDLENBQUMsRUFBRXpFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3lFLENBQUMsRUFBRSxFQUFFekUsQ0FBQyxFQUFFO0VBQy9HLElBQUEsSUFBSW1VLE1BQU0sR0FBR2pCLE9BQU8sQ0FBQ2xULENBQUMsQ0FBQztFQUNuQndTLE1BQUFBLEtBQUssR0FBR0gsTUFBTSxDQUFDclMsQ0FBQyxDQUFDO1FBQ2pCOFUsV0FBVyxHQUFHdEMsS0FBSyxDQUFDNU8sTUFBTTtFQUMxQmtKLE1BQUFBLElBQUksR0FBRzRJLFNBQVMsQ0FBQzdNLEtBQUssQ0FBQzVDLElBQUksQ0FBQ2tPLE1BQU0sRUFBRUEsTUFBTSxJQUFJQSxNQUFNLENBQUN2QixRQUFRLEVBQUU1UyxDQUFDLEVBQUVrVCxPQUFPLENBQUMsQ0FBQztRQUMzRTZCLFVBQVUsR0FBR2pJLElBQUksQ0FBQ2xKLE1BQU07UUFDeEIrUixVQUFVLEdBQUdmLEtBQUssQ0FBQzVVLENBQUMsQ0FBQyxHQUFHLElBQUl5RyxLQUFLLENBQUNzTyxVQUFVLENBQUM7UUFDN0NhLFdBQVcsR0FBRzdCLE1BQU0sQ0FBQy9ULENBQUMsQ0FBQyxHQUFHLElBQUl5RyxLQUFLLENBQUNzTyxVQUFVLENBQUM7UUFDL0NjLFNBQVMsR0FBR2hCLElBQUksQ0FBQzdVLENBQUMsQ0FBQyxHQUFHLElBQUl5RyxLQUFLLENBQUNxTyxXQUFXLENBQUM7RUFFaERVLElBQUFBLElBQUksQ0FBQ3JCLE1BQU0sRUFBRTNCLEtBQUssRUFBRW1ELFVBQVUsRUFBRUMsV0FBVyxFQUFFQyxTQUFTLEVBQUUvSSxJQUFJLEVBQUVtSSxHQUFHLENBQUM7O0VBRWxFO0VBQ0E7RUFDQTtFQUNBLElBQUEsS0FBSyxJQUFJbEcsRUFBRSxHQUFHLENBQUMsRUFBRStHLEVBQUUsR0FBRyxDQUFDLEVBQUVDLFFBQVEsRUFBRXJCLElBQUksRUFBRTNGLEVBQUUsR0FBR2dHLFVBQVUsRUFBRSxFQUFFaEcsRUFBRSxFQUFFO0VBQzlELE1BQUEsSUFBSWdILFFBQVEsR0FBR0osVUFBVSxDQUFDNUcsRUFBRSxDQUFDLEVBQUU7VUFDN0IsSUFBSUEsRUFBRSxJQUFJK0csRUFBRSxFQUFFQSxFQUFFLEdBQUcvRyxFQUFFLEdBQUcsQ0FBQztFQUN6QixRQUFBLE9BQU8sRUFBRTJGLElBQUksR0FBR2tCLFdBQVcsQ0FBQ0UsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFQSxFQUFFLEdBQUdmLFVBQVUsQ0FBQztFQUN0RGdCLFFBQUFBLFFBQVEsQ0FBQzFCLEtBQUssR0FBR0ssSUFBSSxJQUFJLElBQUk7RUFDL0IsTUFBQTtFQUNGLElBQUE7RUFDRixFQUFBO0VBRUFYLEVBQUFBLE1BQU0sR0FBRyxJQUFJbEIsV0FBUyxDQUFDa0IsTUFBTSxFQUFFYixPQUFPLENBQUM7SUFDdkNhLE1BQU0sQ0FBQ0MsTUFBTSxHQUFHWSxLQUFLO0lBQ3JCYixNQUFNLENBQUNpQyxLQUFLLEdBQUduQixJQUFJO0VBQ25CLEVBQUEsT0FBT2QsTUFBTTtFQUNmOztFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLFNBQVMyQixTQUFTQSxDQUFDNUksSUFBSSxFQUFFO0lBQ3ZCLE9BQU8sT0FBT0EsSUFBSSxLQUFLLFFBQVEsSUFBSSxRQUFRLElBQUlBLElBQUksR0FDL0NBLElBQUk7RUFBQyxJQUNMckcsS0FBSyxDQUFDb0ksSUFBSSxDQUFDL0IsSUFBSSxDQUFDLENBQUM7RUFDdkI7O0VDNUhlLHVCQUFBLElBQVc7RUFDeEIsRUFBQSxPQUFPLElBQUkrRixXQUFTLENBQUMsSUFBSSxDQUFDbUQsS0FBSyxJQUFJLElBQUksQ0FBQzFELE9BQU8sQ0FBQ3RDLEdBQUcsQ0FBQ2lFLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQ25CLFFBQVEsQ0FBQztFQUM3RTs7RUNMZSx5QkFBU21ELE9BQU8sRUFBRUMsUUFBUSxFQUFFQyxNQUFNLEVBQUU7RUFDakQsRUFBQSxJQUFJdkIsS0FBSyxHQUFHLElBQUksQ0FBQ0EsS0FBSyxFQUFFO0VBQUViLElBQUFBLE1BQU0sR0FBRyxJQUFJO0VBQUVjLElBQUFBLElBQUksR0FBRyxJQUFJLENBQUNBLElBQUksRUFBRTtFQUMzRCxFQUFBLElBQUksT0FBT29CLE9BQU8sS0FBSyxVQUFVLEVBQUU7RUFDakNyQixJQUFBQSxLQUFLLEdBQUdxQixPQUFPLENBQUNyQixLQUFLLENBQUM7TUFDdEIsSUFBSUEsS0FBSyxFQUFFQSxLQUFLLEdBQUdBLEtBQUssQ0FBQ3dCLFNBQVMsRUFBRTtFQUN0QyxFQUFBLENBQUMsTUFBTTtNQUNMeEIsS0FBSyxHQUFHQSxLQUFLLENBQUN5QixNQUFNLENBQUNKLE9BQU8sR0FBRyxFQUFFLENBQUM7RUFDcEMsRUFBQTtJQUNBLElBQUlDLFFBQVEsSUFBSSxJQUFJLEVBQUU7RUFDcEJuQyxJQUFBQSxNQUFNLEdBQUdtQyxRQUFRLENBQUNuQyxNQUFNLENBQUM7TUFDekIsSUFBSUEsTUFBTSxFQUFFQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQ3FDLFNBQVMsRUFBRTtFQUN6QyxFQUFBO0VBQ0EsRUFBQSxJQUFJRCxNQUFNLElBQUksSUFBSSxFQUFFdEIsSUFBSSxDQUFDeUIsTUFBTSxFQUFFLENBQUMsS0FBTUgsTUFBTSxDQUFDdEIsSUFBSSxDQUFDO0VBQ3BELEVBQUEsT0FBT0QsS0FBSyxJQUFJYixNQUFNLEdBQUdhLEtBQUssQ0FBQzJCLEtBQUssQ0FBQ3hDLE1BQU0sQ0FBQyxDQUFDeUMsS0FBSyxFQUFFLEdBQUd6QyxNQUFNO0VBQy9EOztFQ1plLHdCQUFBLEVBQVMwQyxPQUFPLEVBQUU7RUFDL0IsRUFBQSxJQUFJTCxTQUFTLEdBQUdLLE9BQU8sQ0FBQ0wsU0FBUyxHQUFHSyxPQUFPLENBQUNMLFNBQVMsRUFBRSxHQUFHSyxPQUFPO0lBRWpFLEtBQUssSUFBSUMsT0FBTyxHQUFHLElBQUksQ0FBQ3BFLE9BQU8sRUFBRXFFLE9BQU8sR0FBR1AsU0FBUyxDQUFDOUQsT0FBTyxFQUFFc0UsRUFBRSxHQUFHRixPQUFPLENBQUM5UyxNQUFNLEVBQUVpVCxFQUFFLEdBQUdGLE9BQU8sQ0FBQy9TLE1BQU0sRUFBRWEsQ0FBQyxHQUFHMUQsSUFBSSxDQUFDZ0QsR0FBRyxDQUFDNlMsRUFBRSxFQUFFQyxFQUFFLENBQUMsRUFBRUMsTUFBTSxHQUFHLElBQUlyUSxLQUFLLENBQUNtUSxFQUFFLENBQUMsRUFBRTVXLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3lFLENBQUMsRUFBRSxFQUFFekUsQ0FBQyxFQUFFO01BQ3ZLLEtBQUssSUFBSStXLE1BQU0sR0FBR0wsT0FBTyxDQUFDMVcsQ0FBQyxDQUFDLEVBQUVnWCxNQUFNLEdBQUdMLE9BQU8sQ0FBQzNXLENBQUMsQ0FBQyxFQUFFUSxDQUFDLEdBQUd1VyxNQUFNLENBQUNuVCxNQUFNLEVBQUUyUyxLQUFLLEdBQUdPLE1BQU0sQ0FBQzlXLENBQUMsQ0FBQyxHQUFHLElBQUl5RyxLQUFLLENBQUNqRyxDQUFDLENBQUMsRUFBRWtTLElBQUksRUFBRTdPLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3JELENBQUMsRUFBRSxFQUFFcUQsQ0FBQyxFQUFFO1FBQy9ILElBQUk2TyxJQUFJLEdBQUdxRSxNQUFNLENBQUNsVCxDQUFDLENBQUMsSUFBSW1ULE1BQU0sQ0FBQ25ULENBQUMsQ0FBQyxFQUFFO0VBQ2pDMFMsUUFBQUEsS0FBSyxDQUFDMVMsQ0FBQyxDQUFDLEdBQUc2TyxJQUFJO0VBQ2pCLE1BQUE7RUFDRixJQUFBO0VBQ0YsRUFBQTtFQUVBLEVBQUEsT0FBTzFTLENBQUMsR0FBRzRXLEVBQUUsRUFBRSxFQUFFNVcsQ0FBQyxFQUFFO0VBQ2xCOFcsSUFBQUEsTUFBTSxDQUFDOVcsQ0FBQyxDQUFDLEdBQUcwVyxPQUFPLENBQUMxVyxDQUFDLENBQUM7RUFDeEIsRUFBQTtJQUVBLE9BQU8sSUFBSTZTLFdBQVMsQ0FBQ2lFLE1BQU0sRUFBRSxJQUFJLENBQUNoRSxRQUFRLENBQUM7RUFDN0M7O0VDbEJlLHdCQUFBLElBQVc7SUFFeEIsS0FBSyxJQUFJVCxNQUFNLEdBQUcsSUFBSSxDQUFDQyxPQUFPLEVBQUV0UyxDQUFDLEdBQUcsRUFBRSxFQUFFeUUsQ0FBQyxHQUFHNE4sTUFBTSxDQUFDek8sTUFBTSxFQUFFLEVBQUU1RCxDQUFDLEdBQUd5RSxDQUFDLEdBQUc7RUFDbkUsSUFBQSxLQUFLLElBQUkrTixLQUFLLEdBQUdILE1BQU0sQ0FBQ3JTLENBQUMsQ0FBQyxFQUFFNkQsQ0FBQyxHQUFHMk8sS0FBSyxDQUFDNU8sTUFBTSxHQUFHLENBQUMsRUFBRThRLElBQUksR0FBR2xDLEtBQUssQ0FBQzNPLENBQUMsQ0FBQyxFQUFFNk8sSUFBSSxFQUFFLEVBQUU3TyxDQUFDLElBQUksQ0FBQyxHQUFHO0VBQ2xGLE1BQUEsSUFBSTZPLElBQUksR0FBR0YsS0FBSyxDQUFDM08sQ0FBQyxDQUFDLEVBQUU7VUFDbkIsSUFBSTZRLElBQUksSUFBSWhDLElBQUksQ0FBQ3VFLHVCQUF1QixDQUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxJQUFJLENBQUN3QyxVQUFVLENBQUN6QyxZQUFZLENBQUMvQixJQUFJLEVBQUVnQyxJQUFJLENBQUM7RUFDNUZBLFFBQUFBLElBQUksR0FBR2hDLElBQUk7RUFDYixNQUFBO0VBQ0YsSUFBQTtFQUNGLEVBQUE7RUFFQSxFQUFBLE9BQU8sSUFBSTtFQUNiOztFQ1ZlLHVCQUFBLEVBQVN6RSxPQUFPLEVBQUU7RUFDL0IsRUFBQSxJQUFJLENBQUNBLE9BQU8sRUFBRUEsT0FBTyxHQUFHTCxTQUFTO0VBRWpDLEVBQUEsU0FBU3VKLFdBQVdBLENBQUN0VyxDQUFDLEVBQUVDLENBQUMsRUFBRTtFQUN6QixJQUFBLE9BQU9ELENBQUMsSUFBSUMsQ0FBQyxHQUFHbU4sT0FBTyxDQUFDcE4sQ0FBQyxDQUFDK1IsUUFBUSxFQUFFOVIsQ0FBQyxDQUFDOFIsUUFBUSxDQUFDLEdBQUcsQ0FBQy9SLENBQUMsR0FBRyxDQUFDQyxDQUFDO0VBQzNELEVBQUE7RUFFQSxFQUFBLEtBQUssSUFBSXVSLE1BQU0sR0FBRyxJQUFJLENBQUNDLE9BQU8sRUFBRTdOLENBQUMsR0FBRzROLE1BQU0sQ0FBQ3pPLE1BQU0sRUFBRXdULFVBQVUsR0FBRyxJQUFJM1EsS0FBSyxDQUFDaEMsQ0FBQyxDQUFDLEVBQUV6RSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUd5RSxDQUFDLEVBQUUsRUFBRXpFLENBQUMsRUFBRTtFQUMvRixJQUFBLEtBQUssSUFBSXdTLEtBQUssR0FBR0gsTUFBTSxDQUFDclMsQ0FBQyxDQUFDLEVBQUVRLENBQUMsR0FBR2dTLEtBQUssQ0FBQzVPLE1BQU0sRUFBRXlULFNBQVMsR0FBR0QsVUFBVSxDQUFDcFgsQ0FBQyxDQUFDLEdBQUcsSUFBSXlHLEtBQUssQ0FBQ2pHLENBQUMsQ0FBQyxFQUFFa1MsSUFBSSxFQUFFN08sQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHckQsQ0FBQyxFQUFFLEVBQUVxRCxDQUFDLEVBQUU7RUFDL0csTUFBQSxJQUFJNk8sSUFBSSxHQUFHRixLQUFLLENBQUMzTyxDQUFDLENBQUMsRUFBRTtFQUNuQndULFFBQUFBLFNBQVMsQ0FBQ3hULENBQUMsQ0FBQyxHQUFHNk8sSUFBSTtFQUNyQixNQUFBO0VBQ0YsSUFBQTtFQUNBMkUsSUFBQUEsU0FBUyxDQUFDQyxJQUFJLENBQUNILFdBQVcsQ0FBQztFQUM3QixFQUFBO0VBRUEsRUFBQSxPQUFPLElBQUl0RSxXQUFTLENBQUN1RSxVQUFVLEVBQUUsSUFBSSxDQUFDdEUsUUFBUSxDQUFDLENBQUMwRCxLQUFLLEVBQUU7RUFDekQ7RUFFQSxTQUFTNUksU0FBU0EsQ0FBQy9NLENBQUMsRUFBRUMsQ0FBQyxFQUFFO0VBQ3ZCLEVBQUEsT0FBT0QsQ0FBQyxHQUFHQyxDQUFDLEdBQUcsRUFBRSxHQUFHRCxDQUFDLEdBQUdDLENBQUMsR0FBRyxDQUFDLEdBQUdELENBQUMsSUFBSUMsQ0FBQyxHQUFHLENBQUMsR0FBR0wsR0FBRztFQUNsRDs7RUN2QmUsdUJBQUEsSUFBVztFQUN4QixFQUFBLElBQUkyUCxRQUFRLEdBQUdkLFNBQVMsQ0FBQyxDQUFDLENBQUM7RUFDM0JBLEVBQUFBLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJO0VBQ25CYyxFQUFBQSxRQUFRLENBQUNPLEtBQUssQ0FBQyxJQUFJLEVBQUVyQixTQUFTLENBQUM7RUFDL0IsRUFBQSxPQUFPLElBQUk7RUFDYjs7RUNMZSx3QkFBQSxJQUFXO0VBQ3hCLEVBQUEsT0FBTzdJLEtBQUssQ0FBQ29JLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDekI7O0VDRmUsdUJBQUEsSUFBVztJQUV4QixLQUFLLElBQUl3RCxNQUFNLEdBQUcsSUFBSSxDQUFDQyxPQUFPLEVBQUV0UyxDQUFDLEdBQUcsQ0FBQyxFQUFFeUUsQ0FBQyxHQUFHNE4sTUFBTSxDQUFDek8sTUFBTSxFQUFFNUQsQ0FBQyxHQUFHeUUsQ0FBQyxFQUFFLEVBQUV6RSxDQUFDLEVBQUU7TUFDcEUsS0FBSyxJQUFJd1MsS0FBSyxHQUFHSCxNQUFNLENBQUNyUyxDQUFDLENBQUMsRUFBRTZELENBQUMsR0FBRyxDQUFDLEVBQUVyRCxDQUFDLEdBQUdnUyxLQUFLLENBQUM1TyxNQUFNLEVBQUVDLENBQUMsR0FBR3JELENBQUMsRUFBRSxFQUFFcUQsQ0FBQyxFQUFFO0VBQy9ELE1BQUEsSUFBSTZPLElBQUksR0FBR0YsS0FBSyxDQUFDM08sQ0FBQyxDQUFDO1FBQ25CLElBQUk2TyxJQUFJLEVBQUUsT0FBT0EsSUFBSTtFQUN2QixJQUFBO0VBQ0YsRUFBQTtFQUVBLEVBQUEsT0FBTyxJQUFJO0VBQ2I7O0VDVmUsdUJBQUEsSUFBVztJQUN4QixJQUFJcE8sSUFBSSxHQUFHLENBQUM7SUFDWixLQUFLLE1BQU1vTyxJQUFJLElBQUksSUFBSSxFQUFFLEVBQUVwTyxJQUFJLENBQUM7RUFDaEMsRUFBQSxPQUFPQSxJQUFJO0VBQ2I7O0VDSmUsd0JBQUEsSUFBVztFQUN4QixFQUFBLE9BQU8sQ0FBQyxJQUFJLENBQUNvTyxJQUFJLEVBQUU7RUFDckI7O0VDRmUsdUJBQUEsRUFBU3RDLFFBQVEsRUFBRTtJQUVoQyxLQUFLLElBQUlpQyxNQUFNLEdBQUcsSUFBSSxDQUFDQyxPQUFPLEVBQUV0UyxDQUFDLEdBQUcsQ0FBQyxFQUFFeUUsQ0FBQyxHQUFHNE4sTUFBTSxDQUFDek8sTUFBTSxFQUFFNUQsQ0FBQyxHQUFHeUUsQ0FBQyxFQUFFLEVBQUV6RSxDQUFDLEVBQUU7TUFDcEUsS0FBSyxJQUFJd1MsS0FBSyxHQUFHSCxNQUFNLENBQUNyUyxDQUFDLENBQUMsRUFBRTZELENBQUMsR0FBRyxDQUFDLEVBQUVyRCxDQUFDLEdBQUdnUyxLQUFLLENBQUM1TyxNQUFNLEVBQUU4TyxJQUFJLEVBQUU3TyxDQUFDLEdBQUdyRCxDQUFDLEVBQUUsRUFBRXFELENBQUMsRUFBRTtRQUNyRSxJQUFJNk8sSUFBSSxHQUFHRixLQUFLLENBQUMzTyxDQUFDLENBQUMsRUFBRXVNLFFBQVEsQ0FBQ25LLElBQUksQ0FBQ3lNLElBQUksRUFBRUEsSUFBSSxDQUFDRSxRQUFRLEVBQUUvTyxDQUFDLEVBQUUyTyxLQUFLLENBQUM7RUFDbkUsSUFBQTtFQUNGLEVBQUE7RUFFQSxFQUFBLE9BQU8sSUFBSTtFQUNiOztFQ1BBLFNBQVMrRSxZQUFVQSxDQUFDNVIsSUFBSSxFQUFFO0VBQ3hCLEVBQUEsT0FBTyxZQUFXO0VBQ2hCLElBQUEsSUFBSSxDQUFDNlIsZUFBZSxDQUFDN1IsSUFBSSxDQUFDO0lBQzVCLENBQUM7RUFDSDtFQUVBLFNBQVM4UixjQUFZQSxDQUFDMUYsUUFBUSxFQUFFO0VBQzlCLEVBQUEsT0FBTyxZQUFXO01BQ2hCLElBQUksQ0FBQzJGLGlCQUFpQixDQUFDM0YsUUFBUSxDQUFDWCxLQUFLLEVBQUVXLFFBQVEsQ0FBQ1YsS0FBSyxDQUFDO0lBQ3hELENBQUM7RUFDSDtFQUVBLFNBQVNzRyxjQUFZQSxDQUFDaFMsSUFBSSxFQUFFa0QsS0FBSyxFQUFFO0VBQ2pDLEVBQUEsT0FBTyxZQUFXO0VBQ2hCLElBQUEsSUFBSSxDQUFDK08sWUFBWSxDQUFDalMsSUFBSSxFQUFFa0QsS0FBSyxDQUFDO0lBQ2hDLENBQUM7RUFDSDtFQUVBLFNBQVNnUCxnQkFBY0EsQ0FBQzlGLFFBQVEsRUFBRWxKLEtBQUssRUFBRTtFQUN2QyxFQUFBLE9BQU8sWUFBVztFQUNoQixJQUFBLElBQUksQ0FBQ2lQLGNBQWMsQ0FBQy9GLFFBQVEsQ0FBQ1gsS0FBSyxFQUFFVyxRQUFRLENBQUNWLEtBQUssRUFBRXhJLEtBQUssQ0FBQztJQUM1RCxDQUFDO0VBQ0g7RUFFQSxTQUFTa1AsY0FBWUEsQ0FBQ3BTLElBQUksRUFBRWtELEtBQUssRUFBRTtFQUNqQyxFQUFBLE9BQU8sWUFBVztNQUNoQixJQUFJMUQsQ0FBQyxHQUFHMEQsS0FBSyxDQUFDOEgsS0FBSyxDQUFDLElBQUksRUFBRXJCLFNBQVMsQ0FBQztFQUNwQyxJQUFBLElBQUluSyxDQUFDLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQ3FTLGVBQWUsQ0FBQzdSLElBQUksQ0FBQyxDQUFDLEtBQ3JDLElBQUksQ0FBQ2lTLFlBQVksQ0FBQ2pTLElBQUksRUFBRVIsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7RUFDSDtFQUVBLFNBQVM2UyxnQkFBY0EsQ0FBQ2pHLFFBQVEsRUFBRWxKLEtBQUssRUFBRTtFQUN2QyxFQUFBLE9BQU8sWUFBVztNQUNoQixJQUFJMUQsQ0FBQyxHQUFHMEQsS0FBSyxDQUFDOEgsS0FBSyxDQUFDLElBQUksRUFBRXJCLFNBQVMsQ0FBQztFQUNwQyxJQUFBLElBQUluSyxDQUFDLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQ3VTLGlCQUFpQixDQUFDM0YsUUFBUSxDQUFDWCxLQUFLLEVBQUVXLFFBQVEsQ0FBQ1YsS0FBSyxDQUFDLENBQUMsS0FDakUsSUFBSSxDQUFDeUcsY0FBYyxDQUFDL0YsUUFBUSxDQUFDWCxLQUFLLEVBQUVXLFFBQVEsQ0FBQ1YsS0FBSyxFQUFFbE0sQ0FBQyxDQUFDO0lBQzdELENBQUM7RUFDSDtFQUVlLHVCQUFBLEVBQVNRLElBQUksRUFBRWtELEtBQUssRUFBRTtFQUNuQyxFQUFBLElBQUlrSixRQUFRLEdBQUdDLFNBQVMsQ0FBQ3JNLElBQUksQ0FBQztFQUU5QixFQUFBLElBQUkySixTQUFTLENBQUMxTCxNQUFNLEdBQUcsQ0FBQyxFQUFFO0VBQ3hCLElBQUEsSUFBSThPLElBQUksR0FBRyxJQUFJLENBQUNBLElBQUksRUFBRTtNQUN0QixPQUFPWCxRQUFRLENBQUNWLEtBQUssR0FDZnFCLElBQUksQ0FBQ3VGLGNBQWMsQ0FBQ2xHLFFBQVEsQ0FBQ1gsS0FBSyxFQUFFVyxRQUFRLENBQUNWLEtBQUssQ0FBQyxHQUNuRHFCLElBQUksQ0FBQ3dGLFlBQVksQ0FBQ25HLFFBQVEsQ0FBQztFQUNuQyxFQUFBO0VBRUEsRUFBQSxPQUFPLElBQUksQ0FBQ29HLElBQUksQ0FBQyxDQUFDdFAsS0FBSyxJQUFJLElBQUksR0FDeEJrSixRQUFRLENBQUNWLEtBQUssR0FBR29HLGNBQVksR0FBR0YsWUFBVSxHQUFLLE9BQU8xTyxLQUFLLEtBQUssVUFBVSxHQUMxRWtKLFFBQVEsQ0FBQ1YsS0FBSyxHQUFHMkcsZ0JBQWMsR0FBR0QsY0FBWSxHQUM5Q2hHLFFBQVEsQ0FBQ1YsS0FBSyxHQUFHd0csZ0JBQWMsR0FBR0YsY0FBYyxFQUFFNUYsUUFBUSxFQUFFbEosS0FBSyxDQUFDLENBQUM7RUFDNUU7O0VDeERlLG9CQUFBLEVBQVM2SixJQUFJLEVBQUU7SUFDNUIsT0FBUUEsSUFBSSxDQUFDbEIsYUFBYSxJQUFJa0IsSUFBSSxDQUFDbEIsYUFBYSxDQUFDNEcsV0FBVztFQUFFLEtBQ3REMUYsSUFBSSxDQUFDbkIsUUFBUSxJQUFJbUIsSUFBSztFQUFDLEtBQ3hCQSxJQUFJLENBQUMwRixXQUFXLENBQUM7RUFDMUI7O0VDRkEsU0FBU0MsYUFBV0EsQ0FBQzFTLElBQUksRUFBRTtFQUN6QixFQUFBLE9BQU8sWUFBVztFQUNoQixJQUFBLElBQUksQ0FBQzJTLEtBQUssQ0FBQ0MsY0FBYyxDQUFDNVMsSUFBSSxDQUFDO0lBQ2pDLENBQUM7RUFDSDtFQUVBLFNBQVM2UyxlQUFhQSxDQUFDN1MsSUFBSSxFQUFFa0QsS0FBSyxFQUFFNFAsUUFBUSxFQUFFO0VBQzVDLEVBQUEsT0FBTyxZQUFXO01BQ2hCLElBQUksQ0FBQ0gsS0FBSyxDQUFDSSxXQUFXLENBQUMvUyxJQUFJLEVBQUVrRCxLQUFLLEVBQUU0UCxRQUFRLENBQUM7SUFDL0MsQ0FBQztFQUNIO0VBRUEsU0FBU0UsZUFBYUEsQ0FBQ2hULElBQUksRUFBRWtELEtBQUssRUFBRTRQLFFBQVEsRUFBRTtFQUM1QyxFQUFBLE9BQU8sWUFBVztNQUNoQixJQUFJdFQsQ0FBQyxHQUFHMEQsS0FBSyxDQUFDOEgsS0FBSyxDQUFDLElBQUksRUFBRXJCLFNBQVMsQ0FBQztNQUNwQyxJQUFJbkssQ0FBQyxJQUFJLElBQUksRUFBRSxJQUFJLENBQUNtVCxLQUFLLENBQUNDLGNBQWMsQ0FBQzVTLElBQUksQ0FBQyxDQUFDLEtBQzFDLElBQUksQ0FBQzJTLEtBQUssQ0FBQ0ksV0FBVyxDQUFDL1MsSUFBSSxFQUFFUixDQUFDLEVBQUVzVCxRQUFRLENBQUM7SUFDaEQsQ0FBQztFQUNIO0VBRWUsMEJBQVM5UyxJQUFJLEVBQUVrRCxLQUFLLEVBQUU0UCxRQUFRLEVBQUU7SUFDN0MsT0FBT25KLFNBQVMsQ0FBQzFMLE1BQU0sR0FBRyxDQUFDLEdBQ3JCLElBQUksQ0FBQ3VVLElBQUksQ0FBQyxDQUFDdFAsS0FBSyxJQUFJLElBQUksR0FDbEJ3UCxhQUFXLEdBQUcsT0FBT3hQLEtBQUssS0FBSyxVQUFVLEdBQ3pDOFAsZUFBYSxHQUNiSCxlQUFhLEVBQUU3UyxJQUFJLEVBQUVrRCxLQUFLLEVBQUU0UCxRQUFRLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBR0EsUUFBUSxDQUFDLENBQUMsR0FDcEVHLFVBQVUsQ0FBQyxJQUFJLENBQUNsRyxJQUFJLEVBQUUsRUFBRS9NLElBQUksQ0FBQztFQUNyQztFQUVPLFNBQVNpVCxVQUFVQSxDQUFDbEcsSUFBSSxFQUFFL00sSUFBSSxFQUFFO0lBQ3JDLE9BQU8rTSxJQUFJLENBQUM0RixLQUFLLENBQUNPLGdCQUFnQixDQUFDbFQsSUFBSSxDQUFDLElBQ2pDeVMsV0FBVyxDQUFDMUYsSUFBSSxDQUFDLENBQUNvRyxnQkFBZ0IsQ0FBQ3BHLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQ21HLGdCQUFnQixDQUFDbFQsSUFBSSxDQUFDO0VBQzlFOztFQ2xDQSxTQUFTb1QsY0FBY0EsQ0FBQ3BULElBQUksRUFBRTtFQUM1QixFQUFBLE9BQU8sWUFBVztNQUNoQixPQUFPLElBQUksQ0FBQ0EsSUFBSSxDQUFDO0lBQ25CLENBQUM7RUFDSDtFQUVBLFNBQVNxVCxnQkFBZ0JBLENBQUNyVCxJQUFJLEVBQUVrRCxLQUFLLEVBQUU7RUFDckMsRUFBQSxPQUFPLFlBQVc7RUFDaEIsSUFBQSxJQUFJLENBQUNsRCxJQUFJLENBQUMsR0FBR2tELEtBQUs7SUFDcEIsQ0FBQztFQUNIO0VBRUEsU0FBU29RLGdCQUFnQkEsQ0FBQ3RULElBQUksRUFBRWtELEtBQUssRUFBRTtFQUNyQyxFQUFBLE9BQU8sWUFBVztNQUNoQixJQUFJMUQsQ0FBQyxHQUFHMEQsS0FBSyxDQUFDOEgsS0FBSyxDQUFDLElBQUksRUFBRXJCLFNBQVMsQ0FBQztFQUNwQyxJQUFBLElBQUluSyxDQUFDLElBQUksSUFBSSxFQUFFLE9BQU8sSUFBSSxDQUFDUSxJQUFJLENBQUMsQ0FBQyxLQUM1QixJQUFJLENBQUNBLElBQUksQ0FBQyxHQUFHUixDQUFDO0lBQ3JCLENBQUM7RUFDSDtFQUVlLDJCQUFBLEVBQVNRLElBQUksRUFBRWtELEtBQUssRUFBRTtFQUNuQyxFQUFBLE9BQU95RyxTQUFTLENBQUMxTCxNQUFNLEdBQUcsQ0FBQyxHQUNyQixJQUFJLENBQUN1VSxJQUFJLENBQUMsQ0FBQ3RQLEtBQUssSUFBSSxJQUFJLEdBQ3BCa1EsY0FBYyxHQUFHLE9BQU9sUSxLQUFLLEtBQUssVUFBVSxHQUM1Q29RLGdCQUFnQixHQUNoQkQsZ0JBQWdCLEVBQUVyVCxJQUFJLEVBQUVrRCxLQUFLLENBQUMsQ0FBQyxHQUNuQyxJQUFJLENBQUM2SixJQUFJLEVBQUUsQ0FBQy9NLElBQUksQ0FBQztFQUN6Qjs7RUMzQkEsU0FBU3VULFVBQVVBLENBQUNDLE1BQU0sRUFBRTtJQUMxQixPQUFPQSxNQUFNLENBQUNySixJQUFJLEVBQUUsQ0FBQ0MsS0FBSyxDQUFDLE9BQU8sQ0FBQztFQUNyQztFQUVBLFNBQVNxSixTQUFTQSxDQUFDMUcsSUFBSSxFQUFFO0lBQ3ZCLE9BQU9BLElBQUksQ0FBQzBHLFNBQVMsSUFBSSxJQUFJQyxTQUFTLENBQUMzRyxJQUFJLENBQUM7RUFDOUM7RUFFQSxTQUFTMkcsU0FBU0EsQ0FBQzNHLElBQUksRUFBRTtJQUN2QixJQUFJLENBQUM0RyxLQUFLLEdBQUc1RyxJQUFJO0VBQ2pCLEVBQUEsSUFBSSxDQUFDNkcsTUFBTSxHQUFHTCxVQUFVLENBQUN4RyxJQUFJLENBQUN3RixZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0VBQzVEO0VBRUFtQixTQUFTLENBQUN0VCxTQUFTLEdBQUc7RUFDcEJ5VCxFQUFBQSxHQUFHLEVBQUUsVUFBUzdULElBQUksRUFBRTtNQUNsQixJQUFJOUIsQ0FBQyxHQUFHLElBQUksQ0FBQzBWLE1BQU0sQ0FBQ3RKLE9BQU8sQ0FBQ3RLLElBQUksQ0FBQztNQUNqQyxJQUFJOUIsQ0FBQyxHQUFHLENBQUMsRUFBRTtFQUNULE1BQUEsSUFBSSxDQUFDMFYsTUFBTSxDQUFDN1MsSUFBSSxDQUFDZixJQUFJLENBQUM7RUFDdEIsTUFBQSxJQUFJLENBQUMyVCxLQUFLLENBQUMxQixZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQzJCLE1BQU0sQ0FBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3pELElBQUE7SUFDRixDQUFDO0VBQ0RuRCxFQUFBQSxNQUFNLEVBQUUsVUFBUzNRLElBQUksRUFBRTtNQUNyQixJQUFJOUIsQ0FBQyxHQUFHLElBQUksQ0FBQzBWLE1BQU0sQ0FBQ3RKLE9BQU8sQ0FBQ3RLLElBQUksQ0FBQztNQUNqQyxJQUFJOUIsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNWLElBQUksQ0FBQzBWLE1BQU0sQ0FBQ0csTUFBTSxDQUFDN1YsQ0FBQyxFQUFFLENBQUMsQ0FBQztFQUN4QixNQUFBLElBQUksQ0FBQ3lWLEtBQUssQ0FBQzFCLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDMkIsTUFBTSxDQUFDRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDekQsSUFBQTtJQUNGLENBQUM7RUFDREUsRUFBQUEsUUFBUSxFQUFFLFVBQVNoVSxJQUFJLEVBQUU7TUFDdkIsT0FBTyxJQUFJLENBQUM0VCxNQUFNLENBQUN0SixPQUFPLENBQUN0SyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ3ZDLEVBQUE7RUFDRixDQUFDO0VBRUQsU0FBU2lVLFVBQVVBLENBQUNsSCxJQUFJLEVBQUVtSCxLQUFLLEVBQUU7RUFDL0IsRUFBQSxJQUFJQyxJQUFJLEdBQUdWLFNBQVMsQ0FBQzFHLElBQUksQ0FBQztNQUFFN08sQ0FBQyxHQUFHLEVBQUU7TUFBRXJELENBQUMsR0FBR3FaLEtBQUssQ0FBQ2pXLE1BQU07RUFDcEQsRUFBQSxPQUFPLEVBQUVDLENBQUMsR0FBR3JELENBQUMsRUFBRXNaLElBQUksQ0FBQ04sR0FBRyxDQUFDSyxLQUFLLENBQUNoVyxDQUFDLENBQUMsQ0FBQztFQUNwQztFQUVBLFNBQVNrVyxhQUFhQSxDQUFDckgsSUFBSSxFQUFFbUgsS0FBSyxFQUFFO0VBQ2xDLEVBQUEsSUFBSUMsSUFBSSxHQUFHVixTQUFTLENBQUMxRyxJQUFJLENBQUM7TUFBRTdPLENBQUMsR0FBRyxFQUFFO01BQUVyRCxDQUFDLEdBQUdxWixLQUFLLENBQUNqVyxNQUFNO0VBQ3BELEVBQUEsT0FBTyxFQUFFQyxDQUFDLEdBQUdyRCxDQUFDLEVBQUVzWixJQUFJLENBQUN4RCxNQUFNLENBQUN1RCxLQUFLLENBQUNoVyxDQUFDLENBQUMsQ0FBQztFQUN2QztFQUVBLFNBQVNtVyxXQUFXQSxDQUFDSCxLQUFLLEVBQUU7RUFDMUIsRUFBQSxPQUFPLFlBQVc7RUFDaEJELElBQUFBLFVBQVUsQ0FBQyxJQUFJLEVBQUVDLEtBQUssQ0FBQztJQUN6QixDQUFDO0VBQ0g7RUFFQSxTQUFTSSxZQUFZQSxDQUFDSixLQUFLLEVBQUU7RUFDM0IsRUFBQSxPQUFPLFlBQVc7RUFDaEJFLElBQUFBLGFBQWEsQ0FBQyxJQUFJLEVBQUVGLEtBQUssQ0FBQztJQUM1QixDQUFDO0VBQ0g7RUFFQSxTQUFTSyxlQUFlQSxDQUFDTCxLQUFLLEVBQUVoUixLQUFLLEVBQUU7RUFDckMsRUFBQSxPQUFPLFlBQVc7RUFDaEIsSUFBQSxDQUFDQSxLQUFLLENBQUM4SCxLQUFLLENBQUMsSUFBSSxFQUFFckIsU0FBUyxDQUFDLEdBQUdzSyxVQUFVLEdBQUdHLGFBQWEsRUFBRSxJQUFJLEVBQUVGLEtBQUssQ0FBQztJQUMxRSxDQUFDO0VBQ0g7RUFFZSwwQkFBQSxFQUFTbFUsSUFBSSxFQUFFa0QsS0FBSyxFQUFFO0VBQ25DLEVBQUEsSUFBSWdSLEtBQUssR0FBR1gsVUFBVSxDQUFDdlQsSUFBSSxHQUFHLEVBQUUsQ0FBQztFQUVqQyxFQUFBLElBQUkySixTQUFTLENBQUMxTCxNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQ3hCLElBQUlrVyxJQUFJLEdBQUdWLFNBQVMsQ0FBQyxJQUFJLENBQUMxRyxJQUFJLEVBQUUsQ0FBQztRQUFFN08sQ0FBQyxHQUFHLEVBQUU7UUFBRXJELENBQUMsR0FBR3FaLEtBQUssQ0FBQ2pXLE1BQU07RUFDM0QsSUFBQSxPQUFPLEVBQUVDLENBQUMsR0FBR3JELENBQUMsRUFBRSxJQUFJLENBQUNzWixJQUFJLENBQUNILFFBQVEsQ0FBQ0UsS0FBSyxDQUFDaFcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEtBQUs7RUFDMUQsSUFBQSxPQUFPLElBQUk7RUFDYixFQUFBO0lBRUEsT0FBTyxJQUFJLENBQUNzVSxJQUFJLENBQUMsQ0FBQyxPQUFPdFAsS0FBSyxLQUFLLFVBQVUsR0FDdkNxUixlQUFlLEdBQUdyUixLQUFLLEdBQ3ZCbVIsV0FBVyxHQUNYQyxZQUFZLEVBQUVKLEtBQUssRUFBRWhSLEtBQUssQ0FBQyxDQUFDO0VBQ3BDOztFQzFFQSxTQUFTc1IsVUFBVUEsR0FBRztJQUNwQixJQUFJLENBQUNDLFdBQVcsR0FBRyxFQUFFO0VBQ3ZCO0VBRUEsU0FBU0MsY0FBWUEsQ0FBQ3hSLEtBQUssRUFBRTtFQUMzQixFQUFBLE9BQU8sWUFBVztNQUNoQixJQUFJLENBQUN1UixXQUFXLEdBQUd2UixLQUFLO0lBQzFCLENBQUM7RUFDSDtFQUVBLFNBQVN5UixjQUFZQSxDQUFDelIsS0FBSyxFQUFFO0VBQzNCLEVBQUEsT0FBTyxZQUFXO01BQ2hCLElBQUkxRCxDQUFDLEdBQUcwRCxLQUFLLENBQUM4SCxLQUFLLENBQUMsSUFBSSxFQUFFckIsU0FBUyxDQUFDO01BQ3BDLElBQUksQ0FBQzhLLFdBQVcsR0FBR2pWLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHQSxDQUFDO0lBQ3ZDLENBQUM7RUFDSDtFQUVlLHVCQUFBLEVBQVMwRCxLQUFLLEVBQUU7RUFDN0IsRUFBQSxPQUFPeUcsU0FBUyxDQUFDMUwsTUFBTSxHQUNqQixJQUFJLENBQUN1VSxJQUFJLENBQUN0UCxLQUFLLElBQUksSUFBSSxHQUNuQnNSLFVBQVUsR0FBRyxDQUFDLE9BQU90UixLQUFLLEtBQUssVUFBVSxHQUN6Q3lSLGNBQVksR0FDWkQsY0FBWSxFQUFFeFIsS0FBSyxDQUFDLENBQUMsR0FDekIsSUFBSSxDQUFDNkosSUFBSSxFQUFFLENBQUMwSCxXQUFXO0VBQy9COztFQ3hCQSxTQUFTRyxVQUFVQSxHQUFHO0lBQ3BCLElBQUksQ0FBQ0MsU0FBUyxHQUFHLEVBQUU7RUFDckI7RUFFQSxTQUFTQyxZQUFZQSxDQUFDNVIsS0FBSyxFQUFFO0VBQzNCLEVBQUEsT0FBTyxZQUFXO01BQ2hCLElBQUksQ0FBQzJSLFNBQVMsR0FBRzNSLEtBQUs7SUFDeEIsQ0FBQztFQUNIO0VBRUEsU0FBUzZSLFlBQVlBLENBQUM3UixLQUFLLEVBQUU7RUFDM0IsRUFBQSxPQUFPLFlBQVc7TUFDaEIsSUFBSTFELENBQUMsR0FBRzBELEtBQUssQ0FBQzhILEtBQUssQ0FBQyxJQUFJLEVBQUVyQixTQUFTLENBQUM7TUFDcEMsSUFBSSxDQUFDa0wsU0FBUyxHQUFHclYsQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUdBLENBQUM7SUFDckMsQ0FBQztFQUNIO0VBRWUsdUJBQUEsRUFBUzBELEtBQUssRUFBRTtFQUM3QixFQUFBLE9BQU95RyxTQUFTLENBQUMxTCxNQUFNLEdBQ2pCLElBQUksQ0FBQ3VVLElBQUksQ0FBQ3RQLEtBQUssSUFBSSxJQUFJLEdBQ25CMFIsVUFBVSxHQUFHLENBQUMsT0FBTzFSLEtBQUssS0FBSyxVQUFVLEdBQ3pDNlIsWUFBWSxHQUNaRCxZQUFZLEVBQUU1UixLQUFLLENBQUMsQ0FBQyxHQUN6QixJQUFJLENBQUM2SixJQUFJLEVBQUUsQ0FBQzhILFNBQVM7RUFDN0I7O0VDeEJBLFNBQVNHLEtBQUtBLEdBQUc7SUFDZixJQUFJLElBQUksQ0FBQ0MsV0FBVyxFQUFFLElBQUksQ0FBQzFELFVBQVUsQ0FBQzNDLFdBQVcsQ0FBQyxJQUFJLENBQUM7RUFDekQ7RUFFZSx3QkFBQSxJQUFXO0VBQ3hCLEVBQUEsT0FBTyxJQUFJLENBQUM0RCxJQUFJLENBQUN3QyxLQUFLLENBQUM7RUFDekI7O0VDTkEsU0FBUzNSLEtBQUtBLEdBQUc7RUFDZixFQUFBLElBQUksSUFBSSxDQUFDNlIsZUFBZSxFQUFFLElBQUksQ0FBQzNELFVBQVUsQ0FBQ3pDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDeUMsVUFBVSxDQUFDNEQsVUFBVSxDQUFDO0VBQzFGO0VBRWUsd0JBQUEsSUFBVztFQUN4QixFQUFBLE9BQU8sSUFBSSxDQUFDM0MsSUFBSSxDQUFDblAsS0FBSyxDQUFDO0VBQ3pCOztFQ0plLHlCQUFBLEVBQVNyRCxJQUFJLEVBQUU7RUFDNUIsRUFBQSxJQUFJa0YsTUFBTSxHQUFHLE9BQU9sRixJQUFJLEtBQUssVUFBVSxHQUFHQSxJQUFJLEdBQUdvVixPQUFPLENBQUNwVixJQUFJLENBQUM7RUFDOUQsRUFBQSxPQUFPLElBQUksQ0FBQ3lNLE1BQU0sQ0FBQyxZQUFXO0VBQzVCLElBQUEsT0FBTyxJQUFJLENBQUNtQyxXQUFXLENBQUMxSixNQUFNLENBQUM4RixLQUFLLENBQUMsSUFBSSxFQUFFckIsU0FBUyxDQUFDLENBQUM7RUFDeEQsRUFBQSxDQUFDLENBQUM7RUFDSjs7RUNKQSxTQUFTMEwsWUFBWUEsR0FBRztFQUN0QixFQUFBLE9BQU8sSUFBSTtFQUNiO0VBRWUseUJBQUEsRUFBU3JWLElBQUksRUFBRXNWLE1BQU0sRUFBRTtFQUNwQyxFQUFBLElBQUlwUSxNQUFNLEdBQUcsT0FBT2xGLElBQUksS0FBSyxVQUFVLEdBQUdBLElBQUksR0FBR29WLE9BQU8sQ0FBQ3BWLElBQUksQ0FBQztFQUMxRHlNLElBQUFBLE1BQU0sR0FBRzZJLE1BQU0sSUFBSSxJQUFJLEdBQUdELFlBQVksR0FBRyxPQUFPQyxNQUFNLEtBQUssVUFBVSxHQUFHQSxNQUFNLEdBQUcvSSxRQUFRLENBQUMrSSxNQUFNLENBQUM7RUFDckcsRUFBQSxPQUFPLElBQUksQ0FBQzdJLE1BQU0sQ0FBQyxZQUFXO01BQzVCLE9BQU8sSUFBSSxDQUFDcUMsWUFBWSxDQUFDNUosTUFBTSxDQUFDOEYsS0FBSyxDQUFDLElBQUksRUFBRXJCLFNBQVMsQ0FBQyxFQUFFOEMsTUFBTSxDQUFDekIsS0FBSyxDQUFDLElBQUksRUFBRXJCLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQztFQUNoRyxFQUFBLENBQUMsQ0FBQztFQUNKOztFQ2JBLFNBQVNnSCxNQUFNQSxHQUFHO0VBQ2hCLEVBQUEsSUFBSW5DLE1BQU0sR0FBRyxJQUFJLENBQUMrQyxVQUFVO0VBQzVCLEVBQUEsSUFBSS9DLE1BQU0sRUFBRUEsTUFBTSxDQUFDK0csV0FBVyxDQUFDLElBQUksQ0FBQztFQUN0QztFQUVlLHlCQUFBLElBQVc7RUFDeEIsRUFBQSxPQUFPLElBQUksQ0FBQy9DLElBQUksQ0FBQzdCLE1BQU0sQ0FBQztFQUMxQjs7RUNQQSxTQUFTNkUsc0JBQXNCQSxHQUFHO0VBQ2hDLEVBQUEsSUFBSUMsS0FBSyxHQUFHLElBQUksQ0FBQ2pWLFNBQVMsQ0FBQyxLQUFLLENBQUM7TUFBRWdPLE1BQU0sR0FBRyxJQUFJLENBQUMrQyxVQUFVO0VBQzNELEVBQUEsT0FBTy9DLE1BQU0sR0FBR0EsTUFBTSxDQUFDTSxZQUFZLENBQUMyRyxLQUFLLEVBQUUsSUFBSSxDQUFDUixXQUFXLENBQUMsR0FBR1EsS0FBSztFQUN0RTtFQUVBLFNBQVNDLG1CQUFtQkEsR0FBRztFQUM3QixFQUFBLElBQUlELEtBQUssR0FBRyxJQUFJLENBQUNqVixTQUFTLENBQUMsSUFBSSxDQUFDO01BQUVnTyxNQUFNLEdBQUcsSUFBSSxDQUFDK0MsVUFBVTtFQUMxRCxFQUFBLE9BQU8vQyxNQUFNLEdBQUdBLE1BQU0sQ0FBQ00sWUFBWSxDQUFDMkcsS0FBSyxFQUFFLElBQUksQ0FBQ1IsV0FBVyxDQUFDLEdBQUdRLEtBQUs7RUFDdEU7RUFFZSx3QkFBQSxFQUFTRSxJQUFJLEVBQUU7SUFDNUIsT0FBTyxJQUFJLENBQUNsSixNQUFNLENBQUNrSixJQUFJLEdBQUdELG1CQUFtQixHQUFHRixzQkFBc0IsQ0FBQztFQUN6RTs7RUNaZSx3QkFBQSxFQUFTdFMsS0FBSyxFQUFFO0VBQzdCLEVBQUEsT0FBT3lHLFNBQVMsQ0FBQzFMLE1BQU0sR0FDakIsSUFBSSxDQUFDMlgsUUFBUSxDQUFDLFVBQVUsRUFBRTFTLEtBQUssQ0FBQyxHQUNoQyxJQUFJLENBQUM2SixJQUFJLEVBQUUsQ0FBQ0UsUUFBUTtFQUM1Qjs7RUNKQSxTQUFTNEksZUFBZUEsQ0FBQ0MsUUFBUSxFQUFFO0lBQ2pDLE9BQU8sVUFBU0MsS0FBSyxFQUFFO01BQ3JCRCxRQUFRLENBQUN4VixJQUFJLENBQUMsSUFBSSxFQUFFeVYsS0FBSyxFQUFFLElBQUksQ0FBQzlJLFFBQVEsQ0FBQztJQUMzQyxDQUFDO0VBQ0g7RUFFQSxTQUFTakQsY0FBY0EsQ0FBQ0MsU0FBUyxFQUFFO0VBQ2pDLEVBQUEsT0FBT0EsU0FBUyxDQUFDRSxJQUFJLEVBQUUsQ0FBQ0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDQyxHQUFHLENBQUMsVUFBU2pOLENBQUMsRUFBRTtNQUNyRCxJQUFJNEMsSUFBSSxHQUFHLEVBQUU7RUFBRTlCLE1BQUFBLENBQUMsR0FBR2QsQ0FBQyxDQUFDa04sT0FBTyxDQUFDLEdBQUcsQ0FBQztNQUNqQyxJQUFJcE0sQ0FBQyxJQUFJLENBQUMsRUFBRThCLElBQUksR0FBRzVDLENBQUMsQ0FBQ2dFLEtBQUssQ0FBQ2xELENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRWQsQ0FBQyxHQUFHQSxDQUFDLENBQUNnRSxLQUFLLENBQUMsQ0FBQyxFQUFFbEQsQ0FBQyxDQUFDO01BQ3BELE9BQU87RUFBQ2tGLE1BQUFBLElBQUksRUFBRWhHLENBQUM7RUFBRTRDLE1BQUFBLElBQUksRUFBRUE7T0FBSztFQUM5QixFQUFBLENBQUMsQ0FBQztFQUNKO0VBRUEsU0FBU2dXLFFBQVFBLENBQUN4TCxRQUFRLEVBQUU7RUFDMUIsRUFBQSxPQUFPLFlBQVc7RUFDaEIsSUFBQSxJQUFJRCxFQUFFLEdBQUcsSUFBSSxDQUFDMEwsSUFBSTtNQUNsQixJQUFJLENBQUMxTCxFQUFFLEVBQUU7TUFDVCxLQUFLLElBQUlsUSxDQUFDLEdBQUcsQ0FBQyxFQUFFNkQsQ0FBQyxHQUFHLEVBQUUsRUFBRVksQ0FBQyxHQUFHeUwsRUFBRSxDQUFDdE0sTUFBTSxFQUFFaVksQ0FBQyxFQUFFN2IsQ0FBQyxHQUFHeUUsQ0FBQyxFQUFFLEVBQUV6RSxDQUFDLEVBQUU7RUFDcEQsTUFBQSxJQUFJNmIsQ0FBQyxHQUFHM0wsRUFBRSxDQUFDbFEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDbVEsUUFBUSxDQUFDcEgsSUFBSSxJQUFJOFMsQ0FBQyxDQUFDOVMsSUFBSSxLQUFLb0gsUUFBUSxDQUFDcEgsSUFBSSxLQUFLOFMsQ0FBQyxDQUFDbFcsSUFBSSxLQUFLd0ssUUFBUSxDQUFDeEssSUFBSSxFQUFFO0VBQ3ZGLFFBQUEsSUFBSSxDQUFDbVcsbUJBQW1CLENBQUNELENBQUMsQ0FBQzlTLElBQUksRUFBRThTLENBQUMsQ0FBQ0osUUFBUSxFQUFFSSxDQUFDLENBQUNyVCxPQUFPLENBQUM7RUFDekQsTUFBQSxDQUFDLE1BQU07RUFDTDBILFFBQUFBLEVBQUUsQ0FBQyxFQUFFck0sQ0FBQyxDQUFDLEdBQUdnWSxDQUFDO0VBQ2IsTUFBQTtFQUNGLElBQUE7RUFDQSxJQUFBLElBQUksRUFBRWhZLENBQUMsRUFBRXFNLEVBQUUsQ0FBQ3RNLE1BQU0sR0FBR0MsQ0FBQyxDQUFDLEtBQ2xCLE9BQU8sSUFBSSxDQUFDK1gsSUFBSTtJQUN2QixDQUFDO0VBQ0g7RUFFQSxTQUFTRyxLQUFLQSxDQUFDNUwsUUFBUSxFQUFFdEgsS0FBSyxFQUFFTCxPQUFPLEVBQUU7RUFDdkMsRUFBQSxPQUFPLFlBQVc7RUFDaEIsSUFBQSxJQUFJMEgsRUFBRSxHQUFHLElBQUksQ0FBQzBMLElBQUk7UUFBRUMsQ0FBQztFQUFFSixNQUFBQSxRQUFRLEdBQUdELGVBQWUsQ0FBQzNTLEtBQUssQ0FBQztNQUN4RCxJQUFJcUgsRUFBRSxFQUFFLEtBQUssSUFBSWxRLENBQUMsR0FBRyxDQUFDLEVBQUV5RSxDQUFDLEdBQUd5TCxFQUFFLENBQUN0TSxNQUFNLEVBQUU1RCxDQUFDLEdBQUd5RSxDQUFDLEVBQUUsRUFBRXpFLENBQUMsRUFBRTtRQUNqRCxJQUFJLENBQUM2YixDQUFDLEdBQUczTCxFQUFFLENBQUNsUSxDQUFDLENBQUMsRUFBRStJLElBQUksS0FBS29ILFFBQVEsQ0FBQ3BILElBQUksSUFBSThTLENBQUMsQ0FBQ2xXLElBQUksS0FBS3dLLFFBQVEsQ0FBQ3hLLElBQUksRUFBRTtFQUNsRSxRQUFBLElBQUksQ0FBQ21XLG1CQUFtQixDQUFDRCxDQUFDLENBQUM5UyxJQUFJLEVBQUU4UyxDQUFDLENBQUNKLFFBQVEsRUFBRUksQ0FBQyxDQUFDclQsT0FBTyxDQUFDO0VBQ3ZELFFBQUEsSUFBSSxDQUFDd1QsZ0JBQWdCLENBQUNILENBQUMsQ0FBQzlTLElBQUksRUFBRThTLENBQUMsQ0FBQ0osUUFBUSxHQUFHQSxRQUFRLEVBQUVJLENBQUMsQ0FBQ3JULE9BQU8sR0FBR0EsT0FBTyxDQUFDO1VBQ3pFcVQsQ0FBQyxDQUFDaFQsS0FBSyxHQUFHQSxLQUFLO0VBQ2YsUUFBQTtFQUNGLE1BQUE7RUFDRixJQUFBO01BQ0EsSUFBSSxDQUFDbVQsZ0JBQWdCLENBQUM3TCxRQUFRLENBQUNwSCxJQUFJLEVBQUUwUyxRQUFRLEVBQUVqVCxPQUFPLENBQUM7RUFDdkRxVCxJQUFBQSxDQUFDLEdBQUc7UUFBQzlTLElBQUksRUFBRW9ILFFBQVEsQ0FBQ3BILElBQUk7UUFBRXBELElBQUksRUFBRXdLLFFBQVEsQ0FBQ3hLLElBQUk7RUFBRWtELE1BQUFBLEtBQUssRUFBRUEsS0FBSztFQUFFNFMsTUFBQUEsUUFBUSxFQUFFQSxRQUFRO0VBQUVqVCxNQUFBQSxPQUFPLEVBQUVBO09BQVE7RUFDbEcsSUFBQSxJQUFJLENBQUMwSCxFQUFFLEVBQUUsSUFBSSxDQUFDMEwsSUFBSSxHQUFHLENBQUNDLENBQUMsQ0FBQyxDQUFDLEtBQ3BCM0wsRUFBRSxDQUFDeEosSUFBSSxDQUFDbVYsQ0FBQyxDQUFDO0lBQ2pCLENBQUM7RUFDSDtFQUVlLHVCQUFTMUwsUUFBUSxFQUFFdEgsS0FBSyxFQUFFTCxPQUFPLEVBQUU7RUFDaEQsRUFBQSxJQUFJb0gsU0FBUyxHQUFHRCxjQUFjLENBQUNRLFFBQVEsR0FBRyxFQUFFLENBQUM7TUFBRXRNLENBQUM7TUFBRXJELENBQUMsR0FBR29QLFNBQVMsQ0FBQ2hNLE1BQU07TUFBRWIsQ0FBQztFQUV6RSxFQUFBLElBQUl1TSxTQUFTLENBQUMxTCxNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQ3hCLElBQUlzTSxFQUFFLEdBQUcsSUFBSSxDQUFDd0MsSUFBSSxFQUFFLENBQUNrSixJQUFJO01BQ3pCLElBQUkxTCxFQUFFLEVBQUUsS0FBSyxJQUFJbFEsQ0FBQyxHQUFHLENBQUMsRUFBRXlFLENBQUMsR0FBR3lMLEVBQUUsQ0FBQ3RNLE1BQU0sRUFBRWlZLENBQUMsRUFBRTdiLENBQUMsR0FBR3lFLENBQUMsRUFBRSxFQUFFekUsQ0FBQyxFQUFFO0VBQ3BELE1BQUEsS0FBSzZELENBQUMsR0FBRyxDQUFDLEVBQUVnWSxDQUFDLEdBQUczTCxFQUFFLENBQUNsUSxDQUFDLENBQUMsRUFBRTZELENBQUMsR0FBR3JELENBQUMsRUFBRSxFQUFFcUQsQ0FBQyxFQUFFO1VBQ2pDLElBQUksQ0FBQ2QsQ0FBQyxHQUFHNk0sU0FBUyxDQUFDL0wsQ0FBQyxDQUFDLEVBQUVrRixJQUFJLEtBQUs4UyxDQUFDLENBQUM5UyxJQUFJLElBQUloRyxDQUFDLENBQUM0QyxJQUFJLEtBQUtrVyxDQUFDLENBQUNsVyxJQUFJLEVBQUU7WUFDM0QsT0FBT2tXLENBQUMsQ0FBQ2hULEtBQUs7RUFDaEIsUUFBQTtFQUNGLE1BQUE7RUFDRixJQUFBO0VBQ0EsSUFBQTtFQUNGLEVBQUE7RUFFQXFILEVBQUFBLEVBQUUsR0FBR3JILEtBQUssR0FBR2tULEtBQUssR0FBR0osUUFBUTtJQUM3QixLQUFLOVgsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHckQsQ0FBQyxFQUFFLEVBQUVxRCxDQUFDLEVBQUUsSUFBSSxDQUFDc1UsSUFBSSxDQUFDakksRUFBRSxDQUFDTixTQUFTLENBQUMvTCxDQUFDLENBQUMsRUFBRWdGLEtBQUssRUFBRUwsT0FBTyxDQUFDLENBQUM7RUFDbkUsRUFBQSxPQUFPLElBQUk7RUFDYjs7RUNoRUEsU0FBU3lULGFBQWFBLENBQUN2SixJQUFJLEVBQUUzSixJQUFJLEVBQUVPLE1BQU0sRUFBRTtFQUN6QyxFQUFBLElBQUk0UyxNQUFNLEdBQUc5RCxXQUFXLENBQUMxRixJQUFJLENBQUM7TUFDMUJnSixLQUFLLEdBQUdRLE1BQU0sQ0FBQ0MsV0FBVztFQUU5QixFQUFBLElBQUksT0FBT1QsS0FBSyxLQUFLLFVBQVUsRUFBRTtFQUMvQkEsSUFBQUEsS0FBSyxHQUFHLElBQUlBLEtBQUssQ0FBQzNTLElBQUksRUFBRU8sTUFBTSxDQUFDO0VBQ2pDLEVBQUEsQ0FBQyxNQUFNO01BQ0xvUyxLQUFLLEdBQUdRLE1BQU0sQ0FBQzNLLFFBQVEsQ0FBQzZLLFdBQVcsQ0FBQyxPQUFPLENBQUM7RUFDNUMsSUFBQSxJQUFJOVMsTUFBTSxFQUFFb1MsS0FBSyxDQUFDVyxTQUFTLENBQUN0VCxJQUFJLEVBQUVPLE1BQU0sQ0FBQ2dULE9BQU8sRUFBRWhULE1BQU0sQ0FBQ2lULFVBQVUsQ0FBQyxFQUFFYixLQUFLLENBQUNjLE1BQU0sR0FBR2xULE1BQU0sQ0FBQ2tULE1BQU0sQ0FBQyxLQUM5RmQsS0FBSyxDQUFDVyxTQUFTLENBQUN0VCxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztFQUMxQyxFQUFBO0VBRUEySixFQUFBQSxJQUFJLENBQUN1SixhQUFhLENBQUNQLEtBQUssQ0FBQztFQUMzQjtFQUVBLFNBQVNlLGdCQUFnQkEsQ0FBQzFULElBQUksRUFBRU8sTUFBTSxFQUFFO0VBQ3RDLEVBQUEsT0FBTyxZQUFXO0VBQ2hCLElBQUEsT0FBTzJTLGFBQWEsQ0FBQyxJQUFJLEVBQUVsVCxJQUFJLEVBQUVPLE1BQU0sQ0FBQztJQUMxQyxDQUFDO0VBQ0g7RUFFQSxTQUFTb1QsZ0JBQWdCQSxDQUFDM1QsSUFBSSxFQUFFTyxNQUFNLEVBQUU7RUFDdEMsRUFBQSxPQUFPLFlBQVc7RUFDaEIsSUFBQSxPQUFPMlMsYUFBYSxDQUFDLElBQUksRUFBRWxULElBQUksRUFBRU8sTUFBTSxDQUFDcUgsS0FBSyxDQUFDLElBQUksRUFBRXJCLFNBQVMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7RUFDSDtFQUVlLDJCQUFBLEVBQVN2RyxJQUFJLEVBQUVPLE1BQU0sRUFBRTtFQUNwQyxFQUFBLE9BQU8sSUFBSSxDQUFDNk8sSUFBSSxDQUFDLENBQUMsT0FBTzdPLE1BQU0sS0FBSyxVQUFVLEdBQ3hDb1QsZ0JBQWdCLEdBQ2hCRCxnQkFBZ0IsRUFBRTFULElBQUksRUFBRU8sTUFBTSxDQUFDLENBQUM7RUFDeEM7O0VDakNlLDRCQUFBLElBQVk7SUFDekIsS0FBSyxJQUFJK0ksTUFBTSxHQUFHLElBQUksQ0FBQ0MsT0FBTyxFQUFFdFMsQ0FBQyxHQUFHLENBQUMsRUFBRXlFLENBQUMsR0FBRzROLE1BQU0sQ0FBQ3pPLE1BQU0sRUFBRTVELENBQUMsR0FBR3lFLENBQUMsRUFBRSxFQUFFekUsQ0FBQyxFQUFFO01BQ3BFLEtBQUssSUFBSXdTLEtBQUssR0FBR0gsTUFBTSxDQUFDclMsQ0FBQyxDQUFDLEVBQUU2RCxDQUFDLEdBQUcsQ0FBQyxFQUFFckQsQ0FBQyxHQUFHZ1MsS0FBSyxDQUFDNU8sTUFBTSxFQUFFOE8sSUFBSSxFQUFFN08sQ0FBQyxHQUFHckQsQ0FBQyxFQUFFLEVBQUVxRCxDQUFDLEVBQUU7UUFDckUsSUFBSTZPLElBQUksR0FBR0YsS0FBSyxDQUFDM08sQ0FBQyxDQUFDLEVBQUUsTUFBTTZPLElBQUk7RUFDakMsSUFBQTtFQUNGLEVBQUE7RUFDRjs7RUM2Qk8sSUFBSWxULElBQUksR0FBRyxDQUFDLElBQUksQ0FBQztFQUVqQixTQUFTcVQsV0FBU0EsQ0FBQ1IsTUFBTSxFQUFFYSxPQUFPLEVBQUU7SUFDekMsSUFBSSxDQUFDWixPQUFPLEdBQUdELE1BQU07SUFDckIsSUFBSSxDQUFDUyxRQUFRLEdBQUdJLE9BQU87RUFDekI7RUFFQSxTQUFTa0QsU0FBU0EsR0FBRztFQUNuQixFQUFBLE9BQU8sSUFBSXZELFdBQVMsQ0FBQyxDQUFDLENBQUN0QixRQUFRLENBQUNJLGVBQWUsQ0FBQyxDQUFDLEVBQUVuUyxJQUFJLENBQUM7RUFDMUQ7RUFFQSxTQUFTbWQsbUJBQW1CQSxHQUFHO0VBQzdCLEVBQUEsT0FBTyxJQUFJO0VBQ2I7QUFFQTlKLGFBQVMsQ0FBQzlNLFNBQVMsR0FBR3FRLFNBQVMsQ0FBQ3JRLFNBQVMsR0FBRztFQUMxQ1ksRUFBQUEsV0FBVyxFQUFFa00sV0FBUztFQUN0QlQsRUFBQUEsTUFBTSxFQUFFd0ssZ0JBQWdCO0VBQ3hCL0ksRUFBQUEsU0FBUyxFQUFFZ0osbUJBQW1CO0VBQzlCQyxFQUFBQSxXQUFXLEVBQUVDLHFCQUFxQjtFQUNsQ0MsRUFBQUEsY0FBYyxFQUFFQyx3QkFBd0I7RUFDeEN0SixFQUFBQSxNQUFNLEVBQUV1SixnQkFBZ0I7RUFDeEJwUSxFQUFBQSxJQUFJLEVBQUVxUSxjQUFjO0VBQ3BCdkksRUFBQUEsS0FBSyxFQUFFd0ksZUFBZTtFQUN0QnZJLEVBQUFBLElBQUksRUFBRXdJLGNBQWM7RUFDcEI1RCxFQUFBQSxJQUFJLEVBQUU2RCxjQUFjO0VBQ3BCL0csRUFBQUEsS0FBSyxFQUFFZ0gsZUFBZTtFQUN0Qm5ILEVBQUFBLFNBQVMsRUFBRXVHLG1CQUFtQjtFQUM5Qm5HLEVBQUFBLEtBQUssRUFBRWdILGVBQWU7RUFDdEJsRyxFQUFBQSxJQUFJLEVBQUVtRyxjQUFjO0VBQ3BCeFgsRUFBQUEsSUFBSSxFQUFFeVgsY0FBYztFQUNwQkMsRUFBQUEsS0FBSyxFQUFFQyxlQUFlO0VBQ3RCbEwsRUFBQUEsSUFBSSxFQUFFbUwsY0FBYztFQUNwQnZaLEVBQUFBLElBQUksRUFBRXdaLGNBQWM7RUFDcEJqWSxFQUFBQSxLQUFLLEVBQUVrWSxlQUFlO0VBQ3RCNUYsRUFBQUEsSUFBSSxFQUFFNkYsY0FBYztFQUNwQkMsRUFBQUEsSUFBSSxFQUFFQyxjQUFjO0VBQ3BCNUYsRUFBQUEsS0FBSyxFQUFFNkYsZUFBZTtFQUN0QjVDLEVBQUFBLFFBQVEsRUFBRTZDLGtCQUFrQjtFQUM1QkMsRUFBQUEsT0FBTyxFQUFFQyxpQkFBaUI7RUFDMUJDLEVBQUFBLElBQUksRUFBRUMsY0FBYztFQUNwQkMsRUFBQUEsSUFBSSxFQUFFQyxjQUFjO0VBQ3BCL0QsRUFBQUEsS0FBSyxFQUFFZ0UsZUFBZTtFQUN0QjNWLEVBQUFBLEtBQUssRUFBRTRWLGVBQWU7RUFDdEJ2SSxFQUFBQSxNQUFNLEVBQUV3SSxnQkFBZ0I7RUFDeEJDLEVBQUFBLE1BQU0sRUFBRUMsZ0JBQWdCO0VBQ3hCekksRUFBQUEsTUFBTSxFQUFFMEksZ0JBQWdCO0VBQ3hCNUQsRUFBQUEsS0FBSyxFQUFFNkQsZUFBZTtFQUN0QjdLLEVBQUFBLEtBQUssRUFBRThLLGVBQWU7RUFDdEJoUCxFQUFBQSxFQUFFLEVBQUVpUCxZQUFZO0VBQ2hCOVAsRUFBQUEsUUFBUSxFQUFFK1Asa0JBQWtCO0lBQzVCLENBQUNDLE1BQU0sQ0FBQ0MsUUFBUSxHQUFHQztFQUNyQixDQUFDOztFQ3ZGYyxpQkFBUzVZLFdBQVcsRUFBRWxILE9BQU8sRUFBRXNHLFNBQVMsRUFBRTtFQUN2RFksRUFBQUEsV0FBVyxDQUFDWixTQUFTLEdBQUd0RyxPQUFPLENBQUNzRyxTQUFTLEdBQUdBLFNBQVM7SUFDckRBLFNBQVMsQ0FBQ1ksV0FBVyxHQUFHQSxXQUFXO0VBQ3JDO0VBRU8sU0FBUzZZLE1BQU1BLENBQUNyTCxNQUFNLEVBQUVzTCxVQUFVLEVBQUU7SUFDekMsSUFBSTFaLFNBQVMsR0FBR0QsTUFBTSxDQUFDK0UsTUFBTSxDQUFDc0osTUFBTSxDQUFDcE8sU0FBUyxDQUFDO0VBQy9DLEVBQUEsS0FBSyxJQUFJa1AsR0FBRyxJQUFJd0ssVUFBVSxFQUFFMVosU0FBUyxDQUFDa1AsR0FBRyxDQUFDLEdBQUd3SyxVQUFVLENBQUN4SyxHQUFHLENBQUM7RUFDNUQsRUFBQSxPQUFPbFAsU0FBUztFQUNsQjs7RUNQTyxTQUFTMlosS0FBS0EsR0FBRyxDQUFDO0VBRWxCLElBQUlDLE1BQU0sR0FBRyxHQUFHO0VBQ2hCLElBQUlDLFFBQVEsR0FBRyxDQUFDLEdBQUdELE1BQU07RUFFaEMsSUFBSUUsR0FBRyxHQUFHLHFCQUFxQjtFQUMzQkMsRUFBQUEsR0FBRyxHQUFHLG1EQUFtRDtFQUN6REMsRUFBQUEsR0FBRyxHQUFHLG9EQUFvRDtFQUMxREMsRUFBQUEsS0FBSyxHQUFHLG9CQUFvQjtJQUM1QkMsWUFBWSxHQUFHLElBQUkzWixNQUFNLENBQUMsQ0FBQSxPQUFBLEVBQVV1WixHQUFHLENBQUEsQ0FBQSxFQUFJQSxHQUFHLENBQUEsQ0FBQSxFQUFJQSxHQUFHLENBQUEsSUFBQSxDQUFNLENBQUM7SUFDNURLLFlBQVksR0FBRyxJQUFJNVosTUFBTSxDQUFDLENBQUEsT0FBQSxFQUFVeVosR0FBRyxDQUFBLENBQUEsRUFBSUEsR0FBRyxDQUFBLENBQUEsRUFBSUEsR0FBRyxDQUFBLElBQUEsQ0FBTSxDQUFDO0VBQzVESSxFQUFBQSxhQUFhLEdBQUcsSUFBSTdaLE1BQU0sQ0FBQyxDQUFBLFFBQUEsRUFBV3VaLEdBQUcsQ0FBQSxDQUFBLEVBQUlBLEdBQUcsQ0FBQSxDQUFBLEVBQUlBLEdBQUcsQ0FBQSxDQUFBLEVBQUlDLEdBQUcsTUFBTSxDQUFDO0VBQ3JFTSxFQUFBQSxhQUFhLEdBQUcsSUFBSTlaLE1BQU0sQ0FBQyxDQUFBLFFBQUEsRUFBV3laLEdBQUcsQ0FBQSxDQUFBLEVBQUlBLEdBQUcsQ0FBQSxDQUFBLEVBQUlBLEdBQUcsQ0FBQSxDQUFBLEVBQUlELEdBQUcsTUFBTSxDQUFDO0lBQ3JFTyxZQUFZLEdBQUcsSUFBSS9aLE1BQU0sQ0FBQyxDQUFBLE9BQUEsRUFBVXdaLEdBQUcsQ0FBQSxDQUFBLEVBQUlDLEdBQUcsQ0FBQSxDQUFBLEVBQUlBLEdBQUcsQ0FBQSxJQUFBLENBQU0sQ0FBQztFQUM1RE8sRUFBQUEsYUFBYSxHQUFHLElBQUloYSxNQUFNLENBQUMsQ0FBQSxRQUFBLEVBQVd3WixHQUFHLENBQUEsQ0FBQSxFQUFJQyxHQUFHLENBQUEsQ0FBQSxFQUFJQSxHQUFHLENBQUEsQ0FBQSxFQUFJRCxHQUFHLE1BQU0sQ0FBQztFQUV6RSxJQUFJUyxLQUFLLEdBQUc7RUFDVkMsRUFBQUEsU0FBUyxFQUFFLFFBQVE7RUFDbkJDLEVBQUFBLFlBQVksRUFBRSxRQUFRO0VBQ3RCQyxFQUFBQSxJQUFJLEVBQUUsUUFBUTtFQUNkQyxFQUFBQSxVQUFVLEVBQUUsUUFBUTtFQUNwQkMsRUFBQUEsS0FBSyxFQUFFLFFBQVE7RUFDZkMsRUFBQUEsS0FBSyxFQUFFLFFBQVE7RUFDZkMsRUFBQUEsTUFBTSxFQUFFLFFBQVE7RUFDaEJDLEVBQUFBLEtBQUssRUFBRSxRQUFRO0VBQ2ZDLEVBQUFBLGNBQWMsRUFBRSxRQUFRO0VBQ3hCQyxFQUFBQSxJQUFJLEVBQUUsUUFBUTtFQUNkQyxFQUFBQSxVQUFVLEVBQUUsUUFBUTtFQUNwQkMsRUFBQUEsS0FBSyxFQUFFLFFBQVE7RUFDZkMsRUFBQUEsU0FBUyxFQUFFLFFBQVE7RUFDbkJDLEVBQUFBLFNBQVMsRUFBRSxRQUFRO0VBQ25CQyxFQUFBQSxVQUFVLEVBQUUsUUFBUTtFQUNwQkMsRUFBQUEsU0FBUyxFQUFFLFFBQVE7RUFDbkJDLEVBQUFBLEtBQUssRUFBRSxRQUFRO0VBQ2ZDLEVBQUFBLGNBQWMsRUFBRSxRQUFRO0VBQ3hCQyxFQUFBQSxRQUFRLEVBQUUsUUFBUTtFQUNsQkMsRUFBQUEsT0FBTyxFQUFFLFFBQVE7RUFDakJDLEVBQUFBLElBQUksRUFBRSxRQUFRO0VBQ2RDLEVBQUFBLFFBQVEsRUFBRSxRQUFRO0VBQ2xCQyxFQUFBQSxRQUFRLEVBQUUsUUFBUTtFQUNsQkMsRUFBQUEsYUFBYSxFQUFFLFFBQVE7RUFDdkJDLEVBQUFBLFFBQVEsRUFBRSxRQUFRO0VBQ2xCQyxFQUFBQSxTQUFTLEVBQUUsUUFBUTtFQUNuQkMsRUFBQUEsUUFBUSxFQUFFLFFBQVE7RUFDbEJDLEVBQUFBLFNBQVMsRUFBRSxRQUFRO0VBQ25CQyxFQUFBQSxXQUFXLEVBQUUsUUFBUTtFQUNyQkMsRUFBQUEsY0FBYyxFQUFFLFFBQVE7RUFDeEJDLEVBQUFBLFVBQVUsRUFBRSxRQUFRO0VBQ3BCQyxFQUFBQSxVQUFVLEVBQUUsUUFBUTtFQUNwQkMsRUFBQUEsT0FBTyxFQUFFLFFBQVE7RUFDakJDLEVBQUFBLFVBQVUsRUFBRSxRQUFRO0VBQ3BCQyxFQUFBQSxZQUFZLEVBQUUsUUFBUTtFQUN0QkMsRUFBQUEsYUFBYSxFQUFFLFFBQVE7RUFDdkJDLEVBQUFBLGFBQWEsRUFBRSxRQUFRO0VBQ3ZCQyxFQUFBQSxhQUFhLEVBQUUsUUFBUTtFQUN2QkMsRUFBQUEsYUFBYSxFQUFFLFFBQVE7RUFDdkJDLEVBQUFBLFVBQVUsRUFBRSxRQUFRO0VBQ3BCQyxFQUFBQSxRQUFRLEVBQUUsUUFBUTtFQUNsQkMsRUFBQUEsV0FBVyxFQUFFLFFBQVE7RUFDckJDLEVBQUFBLE9BQU8sRUFBRSxRQUFRO0VBQ2pCQyxFQUFBQSxPQUFPLEVBQUUsUUFBUTtFQUNqQkMsRUFBQUEsVUFBVSxFQUFFLFFBQVE7RUFDcEJDLEVBQUFBLFNBQVMsRUFBRSxRQUFRO0VBQ25CQyxFQUFBQSxXQUFXLEVBQUUsUUFBUTtFQUNyQkMsRUFBQUEsV0FBVyxFQUFFLFFBQVE7RUFDckJDLEVBQUFBLE9BQU8sRUFBRSxRQUFRO0VBQ2pCQyxFQUFBQSxTQUFTLEVBQUUsUUFBUTtFQUNuQkMsRUFBQUEsVUFBVSxFQUFFLFFBQVE7RUFDcEJDLEVBQUFBLElBQUksRUFBRSxRQUFRO0VBQ2RDLEVBQUFBLFNBQVMsRUFBRSxRQUFRO0VBQ25CQyxFQUFBQSxJQUFJLEVBQUUsUUFBUTtFQUNkQyxFQUFBQSxLQUFLLEVBQUUsUUFBUTtFQUNmQyxFQUFBQSxXQUFXLEVBQUUsUUFBUTtFQUNyQkMsRUFBQUEsSUFBSSxFQUFFLFFBQVE7RUFDZEMsRUFBQUEsUUFBUSxFQUFFLFFBQVE7RUFDbEJDLEVBQUFBLE9BQU8sRUFBRSxRQUFRO0VBQ2pCQyxFQUFBQSxTQUFTLEVBQUUsUUFBUTtFQUNuQkMsRUFBQUEsTUFBTSxFQUFFLFFBQVE7RUFDaEJDLEVBQUFBLEtBQUssRUFBRSxRQUFRO0VBQ2ZDLEVBQUFBLEtBQUssRUFBRSxRQUFRO0VBQ2ZDLEVBQUFBLFFBQVEsRUFBRSxRQUFRO0VBQ2xCQyxFQUFBQSxhQUFhLEVBQUUsUUFBUTtFQUN2QkMsRUFBQUEsU0FBUyxFQUFFLFFBQVE7RUFDbkJDLEVBQUFBLFlBQVksRUFBRSxRQUFRO0VBQ3RCQyxFQUFBQSxTQUFTLEVBQUUsUUFBUTtFQUNuQkMsRUFBQUEsVUFBVSxFQUFFLFFBQVE7RUFDcEJDLEVBQUFBLFNBQVMsRUFBRSxRQUFRO0VBQ25CQyxFQUFBQSxvQkFBb0IsRUFBRSxRQUFRO0VBQzlCQyxFQUFBQSxTQUFTLEVBQUUsUUFBUTtFQUNuQkMsRUFBQUEsVUFBVSxFQUFFLFFBQVE7RUFDcEJDLEVBQUFBLFNBQVMsRUFBRSxRQUFRO0VBQ25CQyxFQUFBQSxTQUFTLEVBQUUsUUFBUTtFQUNuQkMsRUFBQUEsV0FBVyxFQUFFLFFBQVE7RUFDckJDLEVBQUFBLGFBQWEsRUFBRSxRQUFRO0VBQ3ZCQyxFQUFBQSxZQUFZLEVBQUUsUUFBUTtFQUN0QkMsRUFBQUEsY0FBYyxFQUFFLFFBQVE7RUFDeEJDLEVBQUFBLGNBQWMsRUFBRSxRQUFRO0VBQ3hCQyxFQUFBQSxjQUFjLEVBQUUsUUFBUTtFQUN4QkMsRUFBQUEsV0FBVyxFQUFFLFFBQVE7RUFDckJDLEVBQUFBLElBQUksRUFBRSxRQUFRO0VBQ2RDLEVBQUFBLFNBQVMsRUFBRSxRQUFRO0VBQ25CQyxFQUFBQSxLQUFLLEVBQUUsUUFBUTtFQUNmQyxFQUFBQSxPQUFPLEVBQUUsUUFBUTtFQUNqQkMsRUFBQUEsTUFBTSxFQUFFLFFBQVE7RUFDaEJDLEVBQUFBLGdCQUFnQixFQUFFLFFBQVE7RUFDMUJDLEVBQUFBLFVBQVUsRUFBRSxRQUFRO0VBQ3BCQyxFQUFBQSxZQUFZLEVBQUUsUUFBUTtFQUN0QkMsRUFBQUEsWUFBWSxFQUFFLFFBQVE7RUFDdEJDLEVBQUFBLGNBQWMsRUFBRSxRQUFRO0VBQ3hCQyxFQUFBQSxlQUFlLEVBQUUsUUFBUTtFQUN6QkMsRUFBQUEsaUJBQWlCLEVBQUUsUUFBUTtFQUMzQkMsRUFBQUEsZUFBZSxFQUFFLFFBQVE7RUFDekJDLEVBQUFBLGVBQWUsRUFBRSxRQUFRO0VBQ3pCQyxFQUFBQSxZQUFZLEVBQUUsUUFBUTtFQUN0QkMsRUFBQUEsU0FBUyxFQUFFLFFBQVE7RUFDbkJDLEVBQUFBLFNBQVMsRUFBRSxRQUFRO0VBQ25CQyxFQUFBQSxRQUFRLEVBQUUsUUFBUTtFQUNsQkMsRUFBQUEsV0FBVyxFQUFFLFFBQVE7RUFDckJDLEVBQUFBLElBQUksRUFBRSxRQUFRO0VBQ2RDLEVBQUFBLE9BQU8sRUFBRSxRQUFRO0VBQ2pCQyxFQUFBQSxLQUFLLEVBQUUsUUFBUTtFQUNmQyxFQUFBQSxTQUFTLEVBQUUsUUFBUTtFQUNuQkMsRUFBQUEsTUFBTSxFQUFFLFFBQVE7RUFDaEJDLEVBQUFBLFNBQVMsRUFBRSxRQUFRO0VBQ25CQyxFQUFBQSxNQUFNLEVBQUUsUUFBUTtFQUNoQkMsRUFBQUEsYUFBYSxFQUFFLFFBQVE7RUFDdkJDLEVBQUFBLFNBQVMsRUFBRSxRQUFRO0VBQ25CQyxFQUFBQSxhQUFhLEVBQUUsUUFBUTtFQUN2QkMsRUFBQUEsYUFBYSxFQUFFLFFBQVE7RUFDdkJDLEVBQUFBLFVBQVUsRUFBRSxRQUFRO0VBQ3BCQyxFQUFBQSxTQUFTLEVBQUUsUUFBUTtFQUNuQkMsRUFBQUEsSUFBSSxFQUFFLFFBQVE7RUFDZEMsRUFBQUEsSUFBSSxFQUFFLFFBQVE7RUFDZEMsRUFBQUEsSUFBSSxFQUFFLFFBQVE7RUFDZEMsRUFBQUEsVUFBVSxFQUFFLFFBQVE7RUFDcEJDLEVBQUFBLE1BQU0sRUFBRSxRQUFRO0VBQ2hCQyxFQUFBQSxhQUFhLEVBQUUsUUFBUTtFQUN2QkMsRUFBQUEsR0FBRyxFQUFFLFFBQVE7RUFDYkMsRUFBQUEsU0FBUyxFQUFFLFFBQVE7RUFDbkJDLEVBQUFBLFNBQVMsRUFBRSxRQUFRO0VBQ25CQyxFQUFBQSxXQUFXLEVBQUUsUUFBUTtFQUNyQkMsRUFBQUEsTUFBTSxFQUFFLFFBQVE7RUFDaEJDLEVBQUFBLFVBQVUsRUFBRSxRQUFRO0VBQ3BCQyxFQUFBQSxRQUFRLEVBQUUsUUFBUTtFQUNsQkMsRUFBQUEsUUFBUSxFQUFFLFFBQVE7RUFDbEJDLEVBQUFBLE1BQU0sRUFBRSxRQUFRO0VBQ2hCQyxFQUFBQSxNQUFNLEVBQUUsUUFBUTtFQUNoQkMsRUFBQUEsT0FBTyxFQUFFLFFBQVE7RUFDakJDLEVBQUFBLFNBQVMsRUFBRSxRQUFRO0VBQ25CQyxFQUFBQSxTQUFTLEVBQUUsUUFBUTtFQUNuQkMsRUFBQUEsU0FBUyxFQUFFLFFBQVE7RUFDbkJDLEVBQUFBLElBQUksRUFBRSxRQUFRO0VBQ2RDLEVBQUFBLFdBQVcsRUFBRSxRQUFRO0VBQ3JCQyxFQUFBQSxTQUFTLEVBQUUsUUFBUTtFQUNuQkMsRUFBQUEsR0FBRyxFQUFFLFFBQVE7RUFDYkMsRUFBQUEsSUFBSSxFQUFFLFFBQVE7RUFDZEMsRUFBQUEsT0FBTyxFQUFFLFFBQVE7RUFDakJDLEVBQUFBLE1BQU0sRUFBRSxRQUFRO0VBQ2hCQyxFQUFBQSxTQUFTLEVBQUUsUUFBUTtFQUNuQkMsRUFBQUEsTUFBTSxFQUFFLFFBQVE7RUFDaEJDLEVBQUFBLEtBQUssRUFBRSxRQUFRO0VBQ2ZDLEVBQUFBLEtBQUssRUFBRSxRQUFRO0VBQ2ZDLEVBQUFBLFVBQVUsRUFBRSxRQUFRO0VBQ3BCQyxFQUFBQSxNQUFNLEVBQUUsUUFBUTtFQUNoQkMsRUFBQUEsV0FBVyxFQUFFO0VBQ2YsQ0FBQztFQUVEQyxNQUFNLENBQUNsSyxLQUFLLEVBQUVtSyxLQUFLLEVBQUU7SUFDbkJyWixJQUFJQSxDQUFDc1osUUFBUSxFQUFFO0VBQ2IsSUFBQSxPQUFPaGtCLE1BQU0sQ0FBQ2lrQixNQUFNLENBQUMsSUFBSSxJQUFJLENBQUNwakIsV0FBVyxFQUFBLEVBQUUsSUFBSSxFQUFFbWpCLFFBQVEsQ0FBQztJQUM1RCxDQUFDO0VBQ0RFLEVBQUFBLFdBQVdBLEdBQUc7TUFDWixPQUFPLElBQUksQ0FBQ0MsR0FBRyxFQUFFLENBQUNELFdBQVcsRUFBRTtJQUNqQyxDQUFDO0VBQ0RFLEVBQUFBLEdBQUcsRUFBRUMsZUFBZTtFQUFFO0VBQ3RCQyxFQUFBQSxTQUFTLEVBQUVELGVBQWU7RUFDMUJFLEVBQUFBLFVBQVUsRUFBRUMsZ0JBQWdCO0VBQzVCQyxFQUFBQSxTQUFTLEVBQUVDLGVBQWU7RUFDMUJDLEVBQUFBLFNBQVMsRUFBRUMsZUFBZTtFQUMxQjFrQixFQUFBQSxRQUFRLEVBQUUwa0I7RUFDWixDQUFDLENBQUM7RUFFRixTQUFTUCxlQUFlQSxHQUFHO0lBQ3pCLE9BQU8sSUFBSSxDQUFDRixHQUFHLEVBQUUsQ0FBQ0csU0FBUyxFQUFFO0VBQy9CO0VBRUEsU0FBU0UsZ0JBQWdCQSxHQUFHO0lBQzFCLE9BQU8sSUFBSSxDQUFDTCxHQUFHLEVBQUUsQ0FBQ0ksVUFBVSxFQUFFO0VBQ2hDO0VBRUEsU0FBU0csZUFBZUEsR0FBRztFQUN6QixFQUFBLE9BQU9HLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQ0osU0FBUyxFQUFFO0VBQ3JDO0VBRUEsU0FBU0csZUFBZUEsR0FBRztJQUN6QixPQUFPLElBQUksQ0FBQ1QsR0FBRyxFQUFFLENBQUNRLFNBQVMsRUFBRTtFQUMvQjtFQUVlLFNBQVNaLEtBQUtBLENBQUNlLE1BQU0sRUFBRTtJQUNwQyxJQUFJbm1CLENBQUMsRUFBRStCLENBQUM7RUFDUm9rQixFQUFBQSxNQUFNLEdBQUcsQ0FBQ0EsTUFBTSxHQUFHLEVBQUUsRUFBRTlhLElBQUksRUFBRSxDQUFDK2EsV0FBVyxFQUFFO0VBQzNDLEVBQUEsT0FBTyxDQUFDcG1CLENBQUMsR0FBR3ViLEtBQUssQ0FBQzhLLElBQUksQ0FBQ0YsTUFBTSxDQUFDLEtBQUtwa0IsQ0FBQyxHQUFHL0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDYixNQUFNLEVBQUVhLENBQUMsR0FBR3NtQixRQUFRLENBQUN0bUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFK0IsQ0FBQyxLQUFLLENBQUMsR0FBR3drQixJQUFJLENBQUN2bUIsQ0FBQyxDQUFDO0VBQUMsSUFDeEYrQixDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUl5a0IsR0FBRyxDQUFFeG1CLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFLQSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUssRUFBR0EsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUtBLENBQUMsR0FBRyxJQUFLLEVBQUcsQ0FBQ0EsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUtBLENBQUMsR0FBRyxHQUFJLEVBQUUsQ0FBQyxDQUFDO0VBQUMsSUFDbEgrQixDQUFDLEtBQUssQ0FBQyxHQUFHMGtCLElBQUksQ0FBQ3ptQixDQUFDLElBQUksRUFBRSxHQUFHLElBQUksRUFBRUEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUVBLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUNBLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDO01BQ2hGK0IsQ0FBQyxLQUFLLENBQUMsR0FBRzBrQixJQUFJLENBQUV6bUIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUtBLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSyxFQUFHQSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBS0EsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFLLEVBQUdBLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFLQSxDQUFDLEdBQUcsSUFBSyxFQUFFLENBQUUsQ0FBQ0EsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUtBLENBQUMsR0FBRyxHQUFJLElBQUksSUFBSSxDQUFDO0VBQUMsSUFDeEosSUFBSTtFQUFFLE1BQ04sQ0FBQ0EsQ0FBQyxHQUFHd2IsWUFBWSxDQUFDNkssSUFBSSxDQUFDRixNQUFNLENBQUMsSUFBSSxJQUFJSyxHQUFHLENBQUN4bUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7RUFBQyxJQUMvRCxDQUFDQSxDQUFDLEdBQUd5YixZQUFZLENBQUM0SyxJQUFJLENBQUNGLE1BQU0sQ0FBQyxJQUFJLElBQUlLLEdBQUcsQ0FBQ3htQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztFQUFDLElBQ25HLENBQUNBLENBQUMsR0FBRzBiLGFBQWEsQ0FBQzJLLElBQUksQ0FBQ0YsTUFBTSxDQUFDLElBQUlNLElBQUksQ0FBQ3ptQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDL0QsQ0FBQ0EsQ0FBQyxHQUFHMmIsYUFBYSxDQUFDMEssSUFBSSxDQUFDRixNQUFNLENBQUMsSUFBSU0sSUFBSSxDQUFDem1CLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUFDLElBQ3BHLENBQUNBLENBQUMsR0FBRzRiLFlBQVksQ0FBQ3lLLElBQUksQ0FBQ0YsTUFBTSxDQUFDLElBQUlPLElBQUksQ0FBQzFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUVBLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0VBQUMsSUFDeEUsQ0FBQ0EsQ0FBQyxHQUFHNmIsYUFBYSxDQUFDd0ssSUFBSSxDQUFDRixNQUFNLENBQUMsSUFBSU8sSUFBSSxDQUFDMW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQUMsSUFDNUU4YixLQUFLLENBQUM3WCxjQUFjLENBQUNraUIsTUFBTSxDQUFDLEdBQUdJLElBQUksQ0FBQ3pLLEtBQUssQ0FBQ3FLLE1BQU0sQ0FBQyxDQUFDO0VBQUMsSUFDbkRBLE1BQU0sS0FBSyxhQUFhLEdBQUcsSUFBSUssR0FBRyxDQUFDeHFCLEdBQUcsRUFBRUEsR0FBRyxFQUFFQSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQ3BELElBQUk7RUFDWjtFQUVBLFNBQVN1cUIsSUFBSUEsQ0FBQ3hxQixDQUFDLEVBQUU7SUFDZixPQUFPLElBQUl5cUIsR0FBRyxDQUFDenFCLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFQSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRUEsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7RUFDNUQ7RUFFQSxTQUFTMHFCLElBQUlBLENBQUMza0IsQ0FBQyxFQUFFNmtCLENBQUMsRUFBRXRxQixDQUFDLEVBQUVELENBQUMsRUFBRTtJQUN4QixJQUFJQSxDQUFDLElBQUksQ0FBQyxFQUFFMEYsQ0FBQyxHQUFHNmtCLENBQUMsR0FBR3RxQixDQUFDLEdBQUdMLEdBQUc7SUFDM0IsT0FBTyxJQUFJd3FCLEdBQUcsQ0FBQzFrQixDQUFDLEVBQUU2a0IsQ0FBQyxFQUFFdHFCLENBQUMsRUFBRUQsQ0FBQyxDQUFDO0VBQzVCO0VBRU8sU0FBU3dxQixVQUFVQSxDQUFDeFAsQ0FBQyxFQUFFO0lBQzVCLElBQUksRUFBRUEsQ0FBQyxZQUFZNkQsS0FBSyxDQUFDLEVBQUU3RCxDQUFDLEdBQUdnTyxLQUFLLENBQUNoTyxDQUFDLENBQUM7RUFDdkMsRUFBQSxJQUFJLENBQUNBLENBQUMsRUFBRSxPQUFPLElBQUlvUCxHQUFHLEVBQUE7RUFDdEJwUCxFQUFBQSxDQUFDLEdBQUdBLENBQUMsQ0FBQ29PLEdBQUcsRUFBRTtFQUNYLEVBQUEsT0FBTyxJQUFJZ0IsR0FBRyxDQUFDcFAsQ0FBQyxDQUFDdFYsQ0FBQyxFQUFFc1YsQ0FBQyxDQUFDdVAsQ0FBQyxFQUFFdlAsQ0FBQyxDQUFDL2EsQ0FBQyxFQUFFK2EsQ0FBQyxDQUFDeVAsT0FBTyxDQUFDO0VBQzFDO0VBRU8sU0FBU3JCLEdBQUdBLENBQUMxakIsQ0FBQyxFQUFFNmtCLENBQUMsRUFBRXRxQixDQUFDLEVBQUV3cUIsT0FBTyxFQUFFO0lBQ3BDLE9BQU9oYyxTQUFTLENBQUMxTCxNQUFNLEtBQUssQ0FBQyxHQUFHeW5CLFVBQVUsQ0FBQzlrQixDQUFDLENBQUMsR0FBRyxJQUFJMGtCLEdBQUcsQ0FBQzFrQixDQUFDLEVBQUU2a0IsQ0FBQyxFQUFFdHFCLENBQUMsRUFBRXdxQixPQUFPLElBQUksSUFBSSxHQUFHLENBQUMsR0FBR0EsT0FBTyxDQUFDO0VBQ2pHO0VBRU8sU0FBU0wsR0FBR0EsQ0FBQzFrQixDQUFDLEVBQUU2a0IsQ0FBQyxFQUFFdHFCLENBQUMsRUFBRXdxQixPQUFPLEVBQUU7RUFDcEMsRUFBQSxJQUFJLENBQUMva0IsQ0FBQyxHQUFHLENBQUNBLENBQUM7RUFDWCxFQUFBLElBQUksQ0FBQzZrQixDQUFDLEdBQUcsQ0FBQ0EsQ0FBQztFQUNYLEVBQUEsSUFBSSxDQUFDdHFCLENBQUMsR0FBRyxDQUFDQSxDQUFDO0VBQ1gsRUFBQSxJQUFJLENBQUN3cUIsT0FBTyxHQUFHLENBQUNBLE9BQU87RUFDekI7RUFFQTFCLE1BQU0sQ0FBQ3FCLEdBQUcsRUFBRWhCLEdBQUcsRUFBRXpLLE1BQU0sQ0FBQ0UsS0FBSyxFQUFFO0lBQzdCRSxRQUFRQSxDQUFDamYsQ0FBQyxFQUFFO0VBQ1ZBLElBQUFBLENBQUMsR0FBR0EsQ0FBQyxJQUFJLElBQUksR0FBR2lmLFFBQVEsR0FBRzdlLElBQUksQ0FBQ0csR0FBRyxDQUFDMGUsUUFBUSxFQUFFamYsQ0FBQyxDQUFDO01BQ2hELE9BQU8sSUFBSXNxQixHQUFHLENBQUMsSUFBSSxDQUFDMWtCLENBQUMsR0FBRzVGLENBQUMsRUFBRSxJQUFJLENBQUN5cUIsQ0FBQyxHQUFHenFCLENBQUMsRUFBRSxJQUFJLENBQUNHLENBQUMsR0FBR0gsQ0FBQyxFQUFFLElBQUksQ0FBQzJxQixPQUFPLENBQUM7SUFDbEUsQ0FBQztJQUNEM0wsTUFBTUEsQ0FBQ2hmLENBQUMsRUFBRTtFQUNSQSxJQUFBQSxDQUFDLEdBQUdBLENBQUMsSUFBSSxJQUFJLEdBQUdnZixNQUFNLEdBQUc1ZSxJQUFJLENBQUNHLEdBQUcsQ0FBQ3llLE1BQU0sRUFBRWhmLENBQUMsQ0FBQztNQUM1QyxPQUFPLElBQUlzcUIsR0FBRyxDQUFDLElBQUksQ0FBQzFrQixDQUFDLEdBQUc1RixDQUFDLEVBQUUsSUFBSSxDQUFDeXFCLENBQUMsR0FBR3pxQixDQUFDLEVBQUUsSUFBSSxDQUFDRyxDQUFDLEdBQUdILENBQUMsRUFBRSxJQUFJLENBQUMycUIsT0FBTyxDQUFDO0lBQ2xFLENBQUM7RUFDRHJCLEVBQUFBLEdBQUdBLEdBQUc7RUFDSixJQUFBLE9BQU8sSUFBSTtJQUNiLENBQUM7RUFDRHNCLEVBQUFBLEtBQUtBLEdBQUc7RUFDTixJQUFBLE9BQU8sSUFBSU4sR0FBRyxDQUFDTyxNQUFNLENBQUMsSUFBSSxDQUFDamxCLENBQUMsQ0FBQyxFQUFFaWxCLE1BQU0sQ0FBQyxJQUFJLENBQUNKLENBQUMsQ0FBQyxFQUFFSSxNQUFNLENBQUMsSUFBSSxDQUFDMXFCLENBQUMsQ0FBQyxFQUFFMnFCLE1BQU0sQ0FBQyxJQUFJLENBQUNILE9BQU8sQ0FBQyxDQUFDO0lBQ3RGLENBQUM7RUFDRHRCLEVBQUFBLFdBQVdBLEdBQUc7TUFDWixPQUFRLElBQUksSUFBSSxJQUFJLENBQUN6akIsQ0FBQyxJQUFJLElBQUksQ0FBQ0EsQ0FBQyxHQUFHLEtBQUssSUFDaEMsSUFBSSxJQUFJLElBQUksQ0FBQzZrQixDQUFDLElBQUksSUFBSSxDQUFDQSxDQUFDLEdBQUcsS0FBTSxJQUNqQyxJQUFJLElBQUksSUFBSSxDQUFDdHFCLENBQUMsSUFBSSxJQUFJLENBQUNBLENBQUMsR0FBRyxLQUFNLElBQ2pDLENBQUMsSUFBSSxJQUFJLENBQUN3cUIsT0FBTyxJQUFJLElBQUksQ0FBQ0EsT0FBTyxJQUFJLENBQUU7SUFDakQsQ0FBQztFQUNEcEIsRUFBQUEsR0FBRyxFQUFFd0IsYUFBYTtFQUFFO0VBQ3BCdEIsRUFBQUEsU0FBUyxFQUFFc0IsYUFBYTtFQUN4QnJCLEVBQUFBLFVBQVUsRUFBRXNCLGNBQWM7RUFDMUJsQixFQUFBQSxTQUFTLEVBQUVtQixhQUFhO0VBQ3hCNWxCLEVBQUFBLFFBQVEsRUFBRTRsQjtFQUNaLENBQUMsQ0FBQyxDQUFDO0VBRUgsU0FBU0YsYUFBYUEsR0FBRztJQUN2QixPQUFPLENBQUEsQ0FBQSxFQUFJeEIsR0FBRyxDQUFDLElBQUksQ0FBQzNqQixDQUFDLENBQUMsR0FBRzJqQixHQUFHLENBQUMsSUFBSSxDQUFDa0IsQ0FBQyxDQUFDLENBQUEsRUFBR2xCLEdBQUcsQ0FBQyxJQUFJLENBQUNwcEIsQ0FBQyxDQUFDLENBQUEsQ0FBRTtFQUN0RDtFQUVBLFNBQVM2cUIsY0FBY0EsR0FBRztFQUN4QixFQUFBLE9BQU8sSUFBSXpCLEdBQUcsQ0FBQyxJQUFJLENBQUMzakIsQ0FBQyxDQUFDLENBQUEsRUFBRzJqQixHQUFHLENBQUMsSUFBSSxDQUFDa0IsQ0FBQyxDQUFDLEdBQUdsQixHQUFHLENBQUMsSUFBSSxDQUFDcHBCLENBQUMsQ0FBQyxDQUFBLEVBQUdvcEIsR0FBRyxDQUFDLENBQUNwYixLQUFLLENBQUMsSUFBSSxDQUFDd2MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQ0EsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFBLENBQUU7RUFDNUc7RUFFQSxTQUFTTSxhQUFhQSxHQUFHO0VBQ3ZCLEVBQUEsTUFBTS9xQixDQUFDLEdBQUc0cUIsTUFBTSxDQUFDLElBQUksQ0FBQ0gsT0FBTyxDQUFDO0VBQzlCLEVBQUEsT0FBTyxHQUFHenFCLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQSxFQUFHMnFCLE1BQU0sQ0FBQyxJQUFJLENBQUNqbEIsQ0FBQyxDQUFDLENBQUEsRUFBQSxFQUFLaWxCLE1BQU0sQ0FBQyxJQUFJLENBQUNKLENBQUMsQ0FBQyxDQUFBLEVBQUEsRUFBS0ksTUFBTSxDQUFDLElBQUksQ0FBQzFxQixDQUFDLENBQUMsQ0FBQSxFQUFHRCxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBLEVBQUEsRUFBS0EsQ0FBQyxHQUFHLENBQUEsQ0FBRTtFQUMzSDtFQUVBLFNBQVM0cUIsTUFBTUEsQ0FBQ0gsT0FBTyxFQUFFO0lBQ3ZCLE9BQU94YyxLQUFLLENBQUN3YyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUd2cUIsSUFBSSxDQUFDaUQsR0FBRyxDQUFDLENBQUMsRUFBRWpELElBQUksQ0FBQ2dELEdBQUcsQ0FBQyxDQUFDLEVBQUV1bkIsT0FBTyxDQUFDLENBQUM7RUFDL0Q7RUFFQSxTQUFTRSxNQUFNQSxDQUFDM2lCLEtBQUssRUFBRTtJQUNyQixPQUFPOUgsSUFBSSxDQUFDaUQsR0FBRyxDQUFDLENBQUMsRUFBRWpELElBQUksQ0FBQ2dELEdBQUcsQ0FBQyxHQUFHLEVBQUVoRCxJQUFJLENBQUNtSSxLQUFLLENBQUNMLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQzNEO0VBRUEsU0FBU3FoQixHQUFHQSxDQUFDcmhCLEtBQUssRUFBRTtFQUNsQkEsRUFBQUEsS0FBSyxHQUFHMmlCLE1BQU0sQ0FBQzNpQixLQUFLLENBQUM7RUFDckIsRUFBQSxPQUFPLENBQUNBLEtBQUssR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSUEsS0FBSyxDQUFDN0MsUUFBUSxDQUFDLEVBQUUsQ0FBQztFQUNyRDtFQUVBLFNBQVNtbEIsSUFBSUEsQ0FBQ1UsQ0FBQyxFQUFFam1CLENBQUMsRUFBRVksQ0FBQyxFQUFFM0YsQ0FBQyxFQUFFO0VBQ3hCLEVBQUEsSUFBSUEsQ0FBQyxJQUFJLENBQUMsRUFBRWdyQixDQUFDLEdBQUdqbUIsQ0FBQyxHQUFHWSxDQUFDLEdBQUcvRixHQUFHLENBQUMsS0FDdkIsSUFBSStGLENBQUMsSUFBSSxDQUFDLElBQUlBLENBQUMsSUFBSSxDQUFDLEVBQUVxbEIsQ0FBQyxHQUFHam1CLENBQUMsR0FBR25GLEdBQUcsQ0FBQyxLQUNsQyxJQUFJbUYsQ0FBQyxJQUFJLENBQUMsRUFBRWltQixDQUFDLEdBQUdwckIsR0FBRztJQUN4QixPQUFPLElBQUlxckIsR0FBRyxDQUFDRCxDQUFDLEVBQUVqbUIsQ0FBQyxFQUFFWSxDQUFDLEVBQUUzRixDQUFDLENBQUM7RUFDNUI7RUFFTyxTQUFTOHBCLFVBQVVBLENBQUM5TyxDQUFDLEVBQUU7SUFDNUIsSUFBSUEsQ0FBQyxZQUFZaVEsR0FBRyxFQUFFLE9BQU8sSUFBSUEsR0FBRyxDQUFDalEsQ0FBQyxDQUFDZ1EsQ0FBQyxFQUFFaFEsQ0FBQyxDQUFDalcsQ0FBQyxFQUFFaVcsQ0FBQyxDQUFDclYsQ0FBQyxFQUFFcVYsQ0FBQyxDQUFDeVAsT0FBTyxDQUFDO0lBQzlELElBQUksRUFBRXpQLENBQUMsWUFBWTZELEtBQUssQ0FBQyxFQUFFN0QsQ0FBQyxHQUFHZ08sS0FBSyxDQUFDaE8sQ0FBQyxDQUFDO0VBQ3ZDLEVBQUEsSUFBSSxDQUFDQSxDQUFDLEVBQUUsT0FBTyxJQUFJaVEsR0FBRyxFQUFBO0VBQ3RCLEVBQUEsSUFBSWpRLENBQUMsWUFBWWlRLEdBQUcsRUFBRSxPQUFPalEsQ0FBQztFQUM5QkEsRUFBQUEsQ0FBQyxHQUFHQSxDQUFDLENBQUNvTyxHQUFHLEVBQUU7RUFDWCxFQUFBLElBQUkxakIsQ0FBQyxHQUFHc1YsQ0FBQyxDQUFDdFYsQ0FBQyxHQUFHLEdBQUc7RUFDYjZrQixJQUFBQSxDQUFDLEdBQUd2UCxDQUFDLENBQUN1UCxDQUFDLEdBQUcsR0FBRztFQUNidHFCLElBQUFBLENBQUMsR0FBRythLENBQUMsQ0FBQy9hLENBQUMsR0FBRyxHQUFHO01BQ2JpRCxHQUFHLEdBQUdoRCxJQUFJLENBQUNnRCxHQUFHLENBQUN3QyxDQUFDLEVBQUU2a0IsQ0FBQyxFQUFFdHFCLENBQUMsQ0FBQztNQUN2QmtELEdBQUcsR0FBR2pELElBQUksQ0FBQ2lELEdBQUcsQ0FBQ3VDLENBQUMsRUFBRTZrQixDQUFDLEVBQUV0cUIsQ0FBQyxDQUFDO0VBQ3ZCK3FCLElBQUFBLENBQUMsR0FBR3ByQixHQUFHO01BQ1BtRixDQUFDLEdBQUc1QixHQUFHLEdBQUdELEdBQUc7RUFDYnlDLElBQUFBLENBQUMsR0FBRyxDQUFDeEMsR0FBRyxHQUFHRCxHQUFHLElBQUksQ0FBQztFQUN2QixFQUFBLElBQUk2QixDQUFDLEVBQUU7TUFDTCxJQUFJVyxDQUFDLEtBQUt2QyxHQUFHLEVBQUU2bkIsQ0FBQyxHQUFHLENBQUNULENBQUMsR0FBR3RxQixDQUFDLElBQUk4RSxDQUFDLEdBQUcsQ0FBQ3dsQixDQUFDLEdBQUd0cUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUN4QyxJQUFJc3FCLENBQUMsS0FBS3BuQixHQUFHLEVBQUU2bkIsQ0FBQyxHQUFHLENBQUMvcUIsQ0FBQyxHQUFHeUYsQ0FBQyxJQUFJWCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQ25DaW1CLENBQUMsR0FBRyxDQUFDdGxCLENBQUMsR0FBRzZrQixDQUFDLElBQUl4bEIsQ0FBQyxHQUFHLENBQUM7RUFDeEJBLElBQUFBLENBQUMsSUFBSVksQ0FBQyxHQUFHLEdBQUcsR0FBR3hDLEdBQUcsR0FBR0QsR0FBRyxHQUFHLENBQUMsR0FBR0MsR0FBRyxHQUFHRCxHQUFHO0VBQ3hDOG5CLElBQUFBLENBQUMsSUFBSSxFQUFFO0VBQ1QsRUFBQSxDQUFDLE1BQU07TUFDTGptQixDQUFDLEdBQUdZLENBQUMsR0FBRyxDQUFDLElBQUlBLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHcWxCLENBQUM7RUFDNUIsRUFBQTtFQUNBLEVBQUEsT0FBTyxJQUFJQyxHQUFHLENBQUNELENBQUMsRUFBRWptQixDQUFDLEVBQUVZLENBQUMsRUFBRXFWLENBQUMsQ0FBQ3lQLE9BQU8sQ0FBQztFQUNwQztFQUVPLFNBQVNTLEdBQUdBLENBQUNGLENBQUMsRUFBRWptQixDQUFDLEVBQUVZLENBQUMsRUFBRThrQixPQUFPLEVBQUU7SUFDcEMsT0FBT2hjLFNBQVMsQ0FBQzFMLE1BQU0sS0FBSyxDQUFDLEdBQUcrbUIsVUFBVSxDQUFDa0IsQ0FBQyxDQUFDLEdBQUcsSUFBSUMsR0FBRyxDQUFDRCxDQUFDLEVBQUVqbUIsQ0FBQyxFQUFFWSxDQUFDLEVBQUU4a0IsT0FBTyxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUdBLE9BQU8sQ0FBQztFQUNqRztFQUVBLFNBQVNRLEdBQUdBLENBQUNELENBQUMsRUFBRWptQixDQUFDLEVBQUVZLENBQUMsRUFBRThrQixPQUFPLEVBQUU7RUFDN0IsRUFBQSxJQUFJLENBQUNPLENBQUMsR0FBRyxDQUFDQSxDQUFDO0VBQ1gsRUFBQSxJQUFJLENBQUNqbUIsQ0FBQyxHQUFHLENBQUNBLENBQUM7RUFDWCxFQUFBLElBQUksQ0FBQ1ksQ0FBQyxHQUFHLENBQUNBLENBQUM7RUFDWCxFQUFBLElBQUksQ0FBQzhrQixPQUFPLEdBQUcsQ0FBQ0EsT0FBTztFQUN6QjtFQUVBMUIsTUFBTSxDQUFDa0MsR0FBRyxFQUFFQyxHQUFHLEVBQUV2TSxNQUFNLENBQUNFLEtBQUssRUFBRTtJQUM3QkUsUUFBUUEsQ0FBQ2pmLENBQUMsRUFBRTtFQUNWQSxJQUFBQSxDQUFDLEdBQUdBLENBQUMsSUFBSSxJQUFJLEdBQUdpZixRQUFRLEdBQUc3ZSxJQUFJLENBQUNHLEdBQUcsQ0FBQzBlLFFBQVEsRUFBRWpmLENBQUMsQ0FBQztNQUNoRCxPQUFPLElBQUltckIsR0FBRyxDQUFDLElBQUksQ0FBQ0QsQ0FBQyxFQUFFLElBQUksQ0FBQ2ptQixDQUFDLEVBQUUsSUFBSSxDQUFDWSxDQUFDLEdBQUc3RixDQUFDLEVBQUUsSUFBSSxDQUFDMnFCLE9BQU8sQ0FBQztJQUMxRCxDQUFDO0lBQ0QzTCxNQUFNQSxDQUFDaGYsQ0FBQyxFQUFFO0VBQ1JBLElBQUFBLENBQUMsR0FBR0EsQ0FBQyxJQUFJLElBQUksR0FBR2dmLE1BQU0sR0FBRzVlLElBQUksQ0FBQ0csR0FBRyxDQUFDeWUsTUFBTSxFQUFFaGYsQ0FBQyxDQUFDO01BQzVDLE9BQU8sSUFBSW1yQixHQUFHLENBQUMsSUFBSSxDQUFDRCxDQUFDLEVBQUUsSUFBSSxDQUFDam1CLENBQUMsRUFBRSxJQUFJLENBQUNZLENBQUMsR0FBRzdGLENBQUMsRUFBRSxJQUFJLENBQUMycUIsT0FBTyxDQUFDO0lBQzFELENBQUM7RUFDRHJCLEVBQUFBLEdBQUdBLEdBQUc7RUFDSixJQUFBLElBQUk0QixDQUFDLEdBQUcsSUFBSSxDQUFDQSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDQSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUc7RUFDckNqbUIsTUFBQUEsQ0FBQyxHQUFHa0osS0FBSyxDQUFDK2MsQ0FBQyxDQUFDLElBQUkvYyxLQUFLLENBQUMsSUFBSSxDQUFDbEosQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQ0EsQ0FBQztRQUMxQ1ksQ0FBQyxHQUFHLElBQUksQ0FBQ0EsQ0FBQztFQUNWd2xCLE1BQUFBLEVBQUUsR0FBR3hsQixDQUFDLEdBQUcsQ0FBQ0EsQ0FBQyxHQUFHLEdBQUcsR0FBR0EsQ0FBQyxHQUFHLENBQUMsR0FBR0EsQ0FBQyxJQUFJWixDQUFDO0VBQ2xDaVIsTUFBQUEsRUFBRSxHQUFHLENBQUMsR0FBR3JRLENBQUMsR0FBR3dsQixFQUFFO01BQ25CLE9BQU8sSUFBSWYsR0FBRyxDQUNaZ0IsT0FBTyxDQUFDSixDQUFDLElBQUksR0FBRyxHQUFHQSxDQUFDLEdBQUcsR0FBRyxHQUFHQSxDQUFDLEdBQUcsR0FBRyxFQUFFaFYsRUFBRSxFQUFFbVYsRUFBRSxDQUFDLEVBQzdDQyxPQUFPLENBQUNKLENBQUMsRUFBRWhWLEVBQUUsRUFBRW1WLEVBQUUsQ0FBQyxFQUNsQkMsT0FBTyxDQUFDSixDQUFDLEdBQUcsR0FBRyxHQUFHQSxDQUFDLEdBQUcsR0FBRyxHQUFHQSxDQUFDLEdBQUcsR0FBRyxFQUFFaFYsRUFBRSxFQUFFbVYsRUFBRSxDQUFDLEVBQzVDLElBQUksQ0FBQ1YsT0FDUCxDQUFDO0lBQ0gsQ0FBQztFQUNEQyxFQUFBQSxLQUFLQSxHQUFHO0VBQ04sSUFBQSxPQUFPLElBQUlPLEdBQUcsQ0FBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQ0wsQ0FBQyxDQUFDLEVBQUVNLE1BQU0sQ0FBQyxJQUFJLENBQUN2bUIsQ0FBQyxDQUFDLEVBQUV1bUIsTUFBTSxDQUFDLElBQUksQ0FBQzNsQixDQUFDLENBQUMsRUFBRWlsQixNQUFNLENBQUMsSUFBSSxDQUFDSCxPQUFPLENBQUMsQ0FBQztJQUN0RixDQUFDO0VBQ0R0QixFQUFBQSxXQUFXQSxHQUFHO0VBQ1osSUFBQSxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQ3BrQixDQUFDLElBQUksSUFBSSxDQUFDQSxDQUFDLElBQUksQ0FBQyxJQUFJa0osS0FBSyxDQUFDLElBQUksQ0FBQ2xKLENBQUMsQ0FBQyxLQUMzQyxDQUFDLElBQUksSUFBSSxDQUFDWSxDQUFDLElBQUksSUFBSSxDQUFDQSxDQUFDLElBQUksQ0FBRSxJQUMzQixDQUFDLElBQUksSUFBSSxDQUFDOGtCLE9BQU8sSUFBSSxJQUFJLENBQUNBLE9BQU8sSUFBSSxDQUFFO0lBQ2pELENBQUM7RUFDRGYsRUFBQUEsU0FBU0EsR0FBRztFQUNWLElBQUEsTUFBTTFwQixDQUFDLEdBQUc0cUIsTUFBTSxDQUFDLElBQUksQ0FBQ0gsT0FBTyxDQUFDO0VBQzlCLElBQUEsT0FBTyxHQUFHenFCLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQSxFQUFHcXJCLE1BQU0sQ0FBQyxJQUFJLENBQUNMLENBQUMsQ0FBQyxLQUFLTSxNQUFNLENBQUMsSUFBSSxDQUFDdm1CLENBQUMsQ0FBQyxHQUFHLEdBQUcsTUFBTXVtQixNQUFNLENBQUMsSUFBSSxDQUFDM2xCLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSTNGLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUEsRUFBQSxFQUFLQSxDQUFDLEdBQUcsQ0FBQSxDQUFFO0VBQ3pJLEVBQUE7RUFDRixDQUFDLENBQUMsQ0FBQztFQUVILFNBQVNxckIsTUFBTUEsQ0FBQ3JqQixLQUFLLEVBQUU7RUFDckJBLEVBQUFBLEtBQUssR0FBRyxDQUFDQSxLQUFLLElBQUksQ0FBQyxJQUFJLEdBQUc7SUFDMUIsT0FBT0EsS0FBSyxHQUFHLENBQUMsR0FBR0EsS0FBSyxHQUFHLEdBQUcsR0FBR0EsS0FBSztFQUN4QztFQUVBLFNBQVNzakIsTUFBTUEsQ0FBQ3RqQixLQUFLLEVBQUU7RUFDckIsRUFBQSxPQUFPOUgsSUFBSSxDQUFDaUQsR0FBRyxDQUFDLENBQUMsRUFBRWpELElBQUksQ0FBQ2dELEdBQUcsQ0FBQyxDQUFDLEVBQUU4RSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7RUFDN0M7O0VBRUE7RUFDQSxTQUFTb2pCLE9BQU9BLENBQUNKLENBQUMsRUFBRWhWLEVBQUUsRUFBRW1WLEVBQUUsRUFBRTtFQUMxQixFQUFBLE9BQU8sQ0FBQ0gsQ0FBQyxHQUFHLEVBQUUsR0FBR2hWLEVBQUUsR0FBRyxDQUFDbVYsRUFBRSxHQUFHblYsRUFBRSxJQUFJZ1YsQ0FBQyxHQUFHLEVBQUUsR0FDbENBLENBQUMsR0FBRyxHQUFHLEdBQUdHLEVBQUUsR0FDWkgsQ0FBQyxHQUFHLEdBQUcsR0FBR2hWLEVBQUUsR0FBRyxDQUFDbVYsRUFBRSxHQUFHblYsRUFBRSxLQUFLLEdBQUcsR0FBR2dWLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FDekNoVixFQUFFLElBQUksR0FBRztFQUNqQjs7QUMzWUEsaUJBQWU5VyxDQUFDLElBQUksTUFBTUEsQ0FBQzs7RUNFM0IsU0FBU3FzQixNQUFNQSxDQUFDdnJCLENBQUMsRUFBRXdyQixDQUFDLEVBQUU7SUFDcEIsT0FBTyxVQUFTdHBCLENBQUMsRUFBRTtFQUNqQixJQUFBLE9BQU9sQyxDQUFDLEdBQUdrQyxDQUFDLEdBQUdzcEIsQ0FBQztJQUNsQixDQUFDO0VBQ0g7RUFFQSxTQUFTQyxXQUFXQSxDQUFDenJCLENBQUMsRUFBRUMsQ0FBQyxFQUFFVixDQUFDLEVBQUU7RUFDNUIsRUFBQSxPQUFPUyxDQUFDLEdBQUdFLElBQUksQ0FBQ0csR0FBRyxDQUFDTCxDQUFDLEVBQUVULENBQUMsQ0FBQyxFQUFFVSxDQUFDLEdBQUdDLElBQUksQ0FBQ0csR0FBRyxDQUFDSixDQUFDLEVBQUVWLENBQUMsQ0FBQyxHQUFHUyxDQUFDLEVBQUVULENBQUMsR0FBRyxDQUFDLEdBQUdBLENBQUMsRUFBRSxVQUFTMkMsQ0FBQyxFQUFFO01BQ3hFLE9BQU9oQyxJQUFJLENBQUNHLEdBQUcsQ0FBQ0wsQ0FBQyxHQUFHa0MsQ0FBQyxHQUFHakMsQ0FBQyxFQUFFVixDQUFDLENBQUM7SUFDL0IsQ0FBQztFQUNIO0VBT08sU0FBU21DLEtBQUtBLENBQUNuQyxDQUFDLEVBQUU7RUFDdkIsRUFBQSxPQUFPLENBQUNBLENBQUMsR0FBRyxDQUFDQSxDQUFDLE1BQU0sQ0FBQyxHQUFHbXNCLE9BQU8sR0FBRyxVQUFTMXJCLENBQUMsRUFBRUMsQ0FBQyxFQUFFO01BQy9DLE9BQU9BLENBQUMsR0FBR0QsQ0FBQyxHQUFHeXJCLFdBQVcsQ0FBQ3pyQixDQUFDLEVBQUVDLENBQUMsRUFBRVYsQ0FBQyxDQUFDLEdBQUdxVixRQUFRLENBQUMzRyxLQUFLLENBQUNqTyxDQUFDLENBQUMsR0FBR0MsQ0FBQyxHQUFHRCxDQUFDLENBQUM7SUFDbEUsQ0FBQztFQUNIO0VBRWUsU0FBUzByQixPQUFPQSxDQUFDMXJCLENBQUMsRUFBRUMsQ0FBQyxFQUFFO0VBQ3BDLEVBQUEsSUFBSXVyQixDQUFDLEdBQUd2ckIsQ0FBQyxHQUFHRCxDQUFDO0VBQ2IsRUFBQSxPQUFPd3JCLENBQUMsR0FBR0QsTUFBTSxDQUFDdnJCLENBQUMsRUFBRXdyQixDQUFDLENBQUMsR0FBRzVXLFFBQVEsQ0FBQzNHLEtBQUssQ0FBQ2pPLENBQUMsQ0FBQyxHQUFHQyxDQUFDLEdBQUdELENBQUMsQ0FBQztFQUN0RDs7QUN2QkEsdUJBQWUsQ0FBQyxTQUFTMnJCLFFBQVFBLENBQUNwc0IsQ0FBQyxFQUFFO0VBQ25DLEVBQUEsSUFBSXlwQixLQUFLLEdBQUd0bkIsS0FBSyxDQUFDbkMsQ0FBQyxDQUFDO0VBRXBCLEVBQUEsU0FBUzZwQixLQUFHQSxDQUFDd0MsS0FBSyxFQUFFQyxHQUFHLEVBQUU7TUFDdkIsSUFBSW5tQixDQUFDLEdBQUdzakIsS0FBSyxDQUFDLENBQUM0QyxLQUFLLEdBQUdFLEdBQVEsQ0FBQ0YsS0FBSyxDQUFDLEVBQUVsbUIsQ0FBQyxFQUFFLENBQUNtbUIsR0FBRyxHQUFHQyxHQUFRLENBQUNELEdBQUcsQ0FBQyxFQUFFbm1CLENBQUMsQ0FBQztRQUMvRDZrQixDQUFDLEdBQUd2QixLQUFLLENBQUM0QyxLQUFLLENBQUNyQixDQUFDLEVBQUVzQixHQUFHLENBQUN0QixDQUFDLENBQUM7UUFDekJ0cUIsQ0FBQyxHQUFHK29CLEtBQUssQ0FBQzRDLEtBQUssQ0FBQzNyQixDQUFDLEVBQUU0ckIsR0FBRyxDQUFDNXJCLENBQUMsQ0FBQztRQUN6QndxQixPQUFPLEdBQUdpQixPQUFPLENBQUNFLEtBQUssQ0FBQ25CLE9BQU8sRUFBRW9CLEdBQUcsQ0FBQ3BCLE9BQU8sQ0FBQztNQUNqRCxPQUFPLFVBQVN2b0IsQ0FBQyxFQUFFO0VBQ2pCMHBCLE1BQUFBLEtBQUssQ0FBQ2xtQixDQUFDLEdBQUdBLENBQUMsQ0FBQ3hELENBQUMsQ0FBQztFQUNkMHBCLE1BQUFBLEtBQUssQ0FBQ3JCLENBQUMsR0FBR0EsQ0FBQyxDQUFDcm9CLENBQUMsQ0FBQztFQUNkMHBCLE1BQUFBLEtBQUssQ0FBQzNyQixDQUFDLEdBQUdBLENBQUMsQ0FBQ2lDLENBQUMsQ0FBQztFQUNkMHBCLE1BQUFBLEtBQUssQ0FBQ25CLE9BQU8sR0FBR0EsT0FBTyxDQUFDdm9CLENBQUMsQ0FBQztRQUMxQixPQUFPMHBCLEtBQUssR0FBRyxFQUFFO01BQ25CLENBQUM7RUFDSCxFQUFBO0lBRUF4QyxLQUFHLENBQUMxbkIsS0FBSyxHQUFHaXFCLFFBQVE7RUFFcEIsRUFBQSxPQUFPdkMsS0FBRztFQUNaLENBQUMsRUFBRSxDQUFDLENBQUM7O0VDekJVLDBCQUFBLEVBQVNwcEIsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDNUIsRUFBQSxPQUFPRCxDQUFDLEdBQUcsQ0FBQ0EsQ0FBQyxFQUFFQyxDQUFDLEdBQUcsQ0FBQ0EsQ0FBQyxFQUFFLFVBQVNpQyxDQUFDLEVBQUU7TUFDakMsT0FBT2xDLENBQUMsSUFBSSxDQUFDLEdBQUdrQyxDQUFDLENBQUMsR0FBR2pDLENBQUMsR0FBR2lDLENBQUM7SUFDNUIsQ0FBQztFQUNIOztFQ0ZBLElBQUk2cEIsR0FBRyxHQUFHLDZDQUE2QztJQUNuREMsR0FBRyxHQUFHLElBQUl2bUIsTUFBTSxDQUFDc21CLEdBQUcsQ0FBQ25uQixNQUFNLEVBQUUsR0FBRyxDQUFDO0VBRXJDLFNBQVNxbkIsSUFBSUEsQ0FBQ2hzQixDQUFDLEVBQUU7RUFDZixFQUFBLE9BQU8sWUFBVztFQUNoQixJQUFBLE9BQU9BLENBQUM7SUFDVixDQUFDO0VBQ0g7RUFFQSxTQUFTaXNCLEdBQUdBLENBQUNqc0IsQ0FBQyxFQUFFO0lBQ2QsT0FBTyxVQUFTaUMsQ0FBQyxFQUFFO0VBQ2pCLElBQUEsT0FBT2pDLENBQUMsQ0FBQ2lDLENBQUMsQ0FBQyxHQUFHLEVBQUU7SUFDbEIsQ0FBQztFQUNIO0VBRWUsMEJBQUEsRUFBU2xDLENBQUMsRUFBRUMsQ0FBQyxFQUFFO0lBQzVCLElBQUlrc0IsRUFBRSxHQUFHSixHQUFHLENBQUNLLFNBQVMsR0FBR0osR0FBRyxDQUFDSSxTQUFTLEdBQUcsQ0FBQztFQUFFO01BQ3hDQyxFQUFFO0VBQUU7TUFDSkMsRUFBRTtFQUFFO01BQ0pDLEVBQUU7RUFBRTtNQUNKdnBCLENBQUMsR0FBRyxFQUFFO0VBQUU7RUFDUitCLElBQUFBLENBQUMsR0FBRyxFQUFFO0VBQUU7TUFDUlIsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7RUFFWDtJQUNBdkUsQ0FBQyxHQUFHQSxDQUFDLEdBQUcsRUFBRSxFQUFFQyxDQUFDLEdBQUdBLENBQUMsR0FBRyxFQUFFOztFQUV0QjtFQUNBLEVBQUEsT0FBTyxDQUFDb3NCLEVBQUUsR0FBR04sR0FBRyxDQUFDOUIsSUFBSSxDQUFDanFCLENBQUMsQ0FBQyxNQUNoQnNzQixFQUFFLEdBQUdOLEdBQUcsQ0FBQy9CLElBQUksQ0FBQ2hxQixDQUFDLENBQUMsQ0FBQyxFQUFFO01BQ3pCLElBQUksQ0FBQ3NzQixFQUFFLEdBQUdELEVBQUUsQ0FBQ0UsS0FBSyxJQUFJTCxFQUFFLEVBQUU7RUFBRTtRQUMxQkksRUFBRSxHQUFHdHNCLENBQUMsQ0FBQ2lHLEtBQUssQ0FBQ2ltQixFQUFFLEVBQUVJLEVBQUUsQ0FBQztFQUNwQixNQUFBLElBQUl4bkIsQ0FBQyxDQUFDL0IsQ0FBQyxDQUFDLEVBQUUrQixDQUFDLENBQUMvQixDQUFDLENBQUMsSUFBSXVwQixFQUFFLENBQUM7RUFBQyxXQUNqQnhuQixDQUFDLENBQUMsRUFBRS9CLENBQUMsQ0FBQyxHQUFHdXBCLEVBQUU7RUFDbEIsSUFBQTtFQUNBLElBQUEsSUFBSSxDQUFDRixFQUFFLEdBQUdBLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBT0MsRUFBRSxHQUFHQSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtFQUFFO0VBQ25DLE1BQUEsSUFBSXZuQixDQUFDLENBQUMvQixDQUFDLENBQUMsRUFBRStCLENBQUMsQ0FBQy9CLENBQUMsQ0FBQyxJQUFJc3BCLEVBQUUsQ0FBQztFQUFDLFdBQ2pCdm5CLENBQUMsQ0FBQyxFQUFFL0IsQ0FBQyxDQUFDLEdBQUdzcEIsRUFBRTtFQUNsQixJQUFBLENBQUMsTUFBTTtFQUFFO0VBQ1B2bkIsTUFBQUEsQ0FBQyxDQUFDLEVBQUUvQixDQUFDLENBQUMsR0FBRyxJQUFJO1FBQ2J1QixDQUFDLENBQUNzQixJQUFJLENBQUM7RUFBQzdDLFFBQUFBLENBQUMsRUFBRUEsQ0FBQztFQUFFOUQsUUFBQUEsQ0FBQyxFQUFFdXRCLGlCQUFNLENBQUNKLEVBQUUsRUFBRUMsRUFBRTtFQUFDLE9BQUMsQ0FBQztFQUNuQyxJQUFBO01BQ0FILEVBQUUsR0FBR0gsR0FBRyxDQUFDSSxTQUFTO0VBQ3BCLEVBQUE7O0VBRUE7RUFDQSxFQUFBLElBQUlELEVBQUUsR0FBR2xzQixDQUFDLENBQUM4QyxNQUFNLEVBQUU7RUFDakJ3cEIsSUFBQUEsRUFBRSxHQUFHdHNCLENBQUMsQ0FBQ2lHLEtBQUssQ0FBQ2ltQixFQUFFLENBQUM7RUFDaEIsSUFBQSxJQUFJcG5CLENBQUMsQ0FBQy9CLENBQUMsQ0FBQyxFQUFFK0IsQ0FBQyxDQUFDL0IsQ0FBQyxDQUFDLElBQUl1cEIsRUFBRSxDQUFDO0VBQUMsU0FDakJ4bkIsQ0FBQyxDQUFDLEVBQUUvQixDQUFDLENBQUMsR0FBR3VwQixFQUFFO0VBQ2xCLEVBQUE7O0VBRUE7RUFDQTtFQUNBLEVBQUEsT0FBT3huQixDQUFDLENBQUNoQyxNQUFNLEdBQUcsQ0FBQyxHQUFJd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUNyQjJuQixHQUFHLENBQUMzbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDckYsQ0FBQyxDQUFDLEdBQ1grc0IsSUFBSSxDQUFDaHNCLENBQUMsQ0FBQyxJQUNOQSxDQUFDLEdBQUdzRSxDQUFDLENBQUN4QixNQUFNLEVBQUUsVUFBU2IsQ0FBQyxFQUFFO0VBQ3pCLElBQUEsS0FBSyxJQUFJYyxDQUFDLEdBQUcsQ0FBQyxFQUFFZ1ksQ0FBQyxFQUFFaFksQ0FBQyxHQUFHL0MsQ0FBQyxFQUFFLEVBQUUrQyxDQUFDLEVBQUUrQixDQUFDLENBQUMsQ0FBQ2lXLENBQUMsR0FBR3pXLENBQUMsQ0FBQ3ZCLENBQUMsQ0FBQyxFQUFFQSxDQUFDLENBQUMsR0FBR2dZLENBQUMsQ0FBQzliLENBQUMsQ0FBQ2dELENBQUMsQ0FBQztFQUN2RCxJQUFBLE9BQU82QyxDQUFDLENBQUM2VCxJQUFJLENBQUMsRUFBRSxDQUFDO0VBQ25CLEVBQUEsQ0FBQyxDQUFDO0VBQ1Y7O0VDL0RBLElBQUk4VCxPQUFPLEdBQUcsR0FBRyxHQUFHeHNCLElBQUksQ0FBQ00sRUFBRTtFQUVwQixJQUFJbXNCLFFBQVEsR0FBRztFQUNwQkMsRUFBQUEsVUFBVSxFQUFFLENBQUM7RUFDYkMsRUFBQUEsVUFBVSxFQUFFLENBQUM7RUFDYkMsRUFBQUEsTUFBTSxFQUFFLENBQUM7RUFDVEMsRUFBQUEsS0FBSyxFQUFFLENBQUM7RUFDUkMsRUFBQUEsTUFBTSxFQUFFLENBQUM7RUFDVEMsRUFBQUEsTUFBTSxFQUFFO0VBQ1YsQ0FBQztFQUVjLGtCQUFBLEVBQVNqdEIsQ0FBQyxFQUFFQyxDQUFDLEVBQUU4UCxDQUFDLEVBQUV5YixDQUFDLEVBQUVocEIsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDeEMsRUFBQSxJQUFJdXFCLE1BQU0sRUFBRUMsTUFBTSxFQUFFRixLQUFLO0lBQ3pCLElBQUlDLE1BQU0sR0FBRzlzQixJQUFJLENBQUNJLElBQUksQ0FBQ04sQ0FBQyxHQUFHQSxDQUFDLEdBQUdDLENBQUMsR0FBR0EsQ0FBQyxDQUFDLEVBQUVELENBQUMsSUFBSWd0QixNQUFNLEVBQUUvc0IsQ0FBQyxJQUFJK3NCLE1BQU07SUFDL0QsSUFBSUQsS0FBSyxHQUFHL3NCLENBQUMsR0FBRytQLENBQUMsR0FBRzlQLENBQUMsR0FBR3VyQixDQUFDLEVBQUV6YixDQUFDLElBQUkvUCxDQUFDLEdBQUcrc0IsS0FBSyxFQUFFdkIsQ0FBQyxJQUFJdnJCLENBQUMsR0FBRzhzQixLQUFLO0lBQ3pELElBQUlFLE1BQU0sR0FBRy9zQixJQUFJLENBQUNJLElBQUksQ0FBQ3lQLENBQUMsR0FBR0EsQ0FBQyxHQUFHeWIsQ0FBQyxHQUFHQSxDQUFDLENBQUMsRUFBRXpiLENBQUMsSUFBSWtkLE1BQU0sRUFBRXpCLENBQUMsSUFBSXlCLE1BQU0sRUFBRUYsS0FBSyxJQUFJRSxNQUFNO0lBQ2hGLElBQUlqdEIsQ0FBQyxHQUFHd3JCLENBQUMsR0FBR3ZyQixDQUFDLEdBQUc4UCxDQUFDLEVBQUUvUCxDQUFDLEdBQUcsQ0FBQ0EsQ0FBQyxFQUFFQyxDQUFDLEdBQUcsQ0FBQ0EsQ0FBQyxFQUFFOHNCLEtBQUssR0FBRyxDQUFDQSxLQUFLLEVBQUVDLE1BQU0sR0FBRyxDQUFDQSxNQUFNO0lBQ25FLE9BQU87RUFDTEosSUFBQUEsVUFBVSxFQUFFcHFCLENBQUM7RUFDYnFxQixJQUFBQSxVQUFVLEVBQUVwcUIsQ0FBQztNQUNicXFCLE1BQU0sRUFBRTVzQixJQUFJLENBQUNndEIsS0FBSyxDQUFDanRCLENBQUMsRUFBRUQsQ0FBQyxDQUFDLEdBQUcwc0IsT0FBTztNQUNsQ0ssS0FBSyxFQUFFN3NCLElBQUksQ0FBQ2l0QixJQUFJLENBQUNKLEtBQUssQ0FBQyxHQUFHTCxPQUFPO0VBQ2pDTSxJQUFBQSxNQUFNLEVBQUVBLE1BQU07RUFDZEMsSUFBQUEsTUFBTSxFQUFFQTtLQUNUO0VBQ0g7O0VDdkJBLElBQUlHLE9BQU87O0VBRVg7RUFDTyxTQUFTQyxRQUFRQSxDQUFDcmxCLEtBQUssRUFBRTtFQUM5QixFQUFBLE1BQU1wRSxDQUFDLEdBQUcsS0FBSyxPQUFPMHBCLFNBQVMsS0FBSyxVQUFVLEdBQUdBLFNBQVMsR0FBR0MsZUFBZSxFQUFFdmxCLEtBQUssR0FBRyxFQUFFLENBQUM7RUFDekYsRUFBQSxPQUFPcEUsQ0FBQyxDQUFDNHBCLFVBQVUsR0FBR2IsUUFBUSxHQUFHYyxTQUFTLENBQUM3cEIsQ0FBQyxDQUFDNUQsQ0FBQyxFQUFFNEQsQ0FBQyxDQUFDM0QsQ0FBQyxFQUFFMkQsQ0FBQyxDQUFDbU0sQ0FBQyxFQUFFbk0sQ0FBQyxDQUFDNG5CLENBQUMsRUFBRTVuQixDQUFDLENBQUNwQixDQUFDLEVBQUVvQixDQUFDLENBQUNuQixDQUFDLENBQUM7RUFDMUU7RUFFTyxTQUFTaXJCLFFBQVFBLENBQUMxbEIsS0FBSyxFQUFFO0VBQzlCLEVBQUEsSUFBSUEsS0FBSyxJQUFJLElBQUksRUFBRSxPQUFPMmtCLFFBQVE7RUFDbEMsRUFBQSxJQUFJLENBQUNTLE9BQU8sRUFBRUEsT0FBTyxHQUFHMWMsUUFBUSxDQUFDTSxlQUFlLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxDQUFDO0VBQ25Gb2MsRUFBQUEsT0FBTyxDQUFDclcsWUFBWSxDQUFDLFdBQVcsRUFBRS9PLEtBQUssQ0FBQztFQUN4QyxFQUFBLElBQUksRUFBRUEsS0FBSyxHQUFHb2xCLE9BQU8sQ0FBQ08sU0FBUyxDQUFDQyxPQUFPLENBQUNDLFdBQVcsRUFBRSxDQUFDLEVBQUUsT0FBT2xCLFFBQVE7SUFDdkUza0IsS0FBSyxHQUFHQSxLQUFLLENBQUM4bEIsTUFBTTtJQUNwQixPQUFPTCxTQUFTLENBQUN6bEIsS0FBSyxDQUFDaEksQ0FBQyxFQUFFZ0ksS0FBSyxDQUFDL0gsQ0FBQyxFQUFFK0gsS0FBSyxDQUFDK0gsQ0FBQyxFQUFFL0gsS0FBSyxDQUFDd2pCLENBQUMsRUFBRXhqQixLQUFLLENBQUN4RixDQUFDLEVBQUV3RixLQUFLLENBQUN2RixDQUFDLENBQUM7RUFDeEU7O0VDZEEsU0FBU3NyQixvQkFBb0JBLENBQUNDLEtBQUssRUFBRUMsT0FBTyxFQUFFQyxPQUFPLEVBQUVDLFFBQVEsRUFBRTtJQUUvRCxTQUFTQyxHQUFHQSxDQUFDcnBCLENBQUMsRUFBRTtFQUNkLElBQUEsT0FBT0EsQ0FBQyxDQUFDaEMsTUFBTSxHQUFHZ0MsQ0FBQyxDQUFDcXBCLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFO0VBQ3RDLEVBQUE7RUFFQSxFQUFBLFNBQVNDLFNBQVNBLENBQUNDLEVBQUUsRUFBRUMsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRTFwQixDQUFDLEVBQUVSLENBQUMsRUFBRTtFQUN2QyxJQUFBLElBQUkrcEIsRUFBRSxLQUFLRSxFQUFFLElBQUlELEVBQUUsS0FBS0UsRUFBRSxFQUFFO0VBQzFCLE1BQUEsSUFBSXpyQixDQUFDLEdBQUcrQixDQUFDLENBQUNjLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFb29CLE9BQU8sRUFBRSxJQUFJLEVBQUVDLE9BQU8sQ0FBQztRQUMxRDNwQixDQUFDLENBQUNzQixJQUFJLENBQUM7VUFBQzdDLENBQUMsRUFBRUEsQ0FBQyxHQUFHLENBQUM7RUFBRTlELFFBQUFBLENBQUMsRUFBRXV0QixpQkFBTSxDQUFDNkIsRUFBRSxFQUFFRSxFQUFFO0VBQUMsT0FBQyxFQUFFO1VBQUN4ckIsQ0FBQyxFQUFFQSxDQUFDLEdBQUcsQ0FBQztFQUFFOUQsUUFBQUEsQ0FBQyxFQUFFdXRCLGlCQUFNLENBQUM4QixFQUFFLEVBQUVFLEVBQUU7RUFBQyxPQUFDLENBQUM7RUFDdEUsSUFBQSxDQUFDLE1BQU0sSUFBSUQsRUFBRSxJQUFJQyxFQUFFLEVBQUU7RUFDbkIxcEIsTUFBQUEsQ0FBQyxDQUFDYyxJQUFJLENBQUMsWUFBWSxHQUFHMm9CLEVBQUUsR0FBR1AsT0FBTyxHQUFHUSxFQUFFLEdBQUdQLE9BQU8sQ0FBQztFQUNwRCxJQUFBO0VBQ0YsRUFBQTtJQUVBLFNBQVNwQixNQUFNQSxDQUFDOXNCLENBQUMsRUFBRUMsQ0FBQyxFQUFFOEUsQ0FBQyxFQUFFUixDQUFDLEVBQUU7TUFDMUIsSUFBSXZFLENBQUMsS0FBS0MsQ0FBQyxFQUFFO1FBQ1gsSUFBSUQsQ0FBQyxHQUFHQyxDQUFDLEdBQUcsR0FBRyxFQUFFQSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQU0sSUFBSUEsQ0FBQyxHQUFHRCxDQUFDLEdBQUcsR0FBRyxFQUFFQSxDQUFDLElBQUksR0FBRyxDQUFDO1FBQzFEdUUsQ0FBQyxDQUFDc0IsSUFBSSxDQUFDO0VBQUM3QyxRQUFBQSxDQUFDLEVBQUUrQixDQUFDLENBQUNjLElBQUksQ0FBQ3VvQixHQUFHLENBQUNycEIsQ0FBQyxDQUFDLEdBQUcsU0FBUyxFQUFFLElBQUksRUFBRW9wQixRQUFRLENBQUMsR0FBRyxDQUFDO0VBQUVqdkIsUUFBQUEsQ0FBQyxFQUFFdXRCLGlCQUFNLENBQUN6c0IsQ0FBQyxFQUFFQyxDQUFDO0VBQUMsT0FBQyxDQUFDO01BQzlFLENBQUMsTUFBTSxJQUFJQSxDQUFDLEVBQUU7RUFDWjhFLE1BQUFBLENBQUMsQ0FBQ2MsSUFBSSxDQUFDdW9CLEdBQUcsQ0FBQ3JwQixDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUc5RSxDQUFDLEdBQUdrdUIsUUFBUSxDQUFDO0VBQzNDLElBQUE7RUFDRixFQUFBO0lBRUEsU0FBU3BCLEtBQUtBLENBQUMvc0IsQ0FBQyxFQUFFQyxDQUFDLEVBQUU4RSxDQUFDLEVBQUVSLENBQUMsRUFBRTtNQUN6QixJQUFJdkUsQ0FBQyxLQUFLQyxDQUFDLEVBQUU7UUFDWHNFLENBQUMsQ0FBQ3NCLElBQUksQ0FBQztFQUFDN0MsUUFBQUEsQ0FBQyxFQUFFK0IsQ0FBQyxDQUFDYyxJQUFJLENBQUN1b0IsR0FBRyxDQUFDcnBCLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxJQUFJLEVBQUVvcEIsUUFBUSxDQUFDLEdBQUcsQ0FBQztFQUFFanZCLFFBQUFBLENBQUMsRUFBRXV0QixpQkFBTSxDQUFDenNCLENBQUMsRUFBRUMsQ0FBQztFQUFDLE9BQUMsQ0FBQztNQUM3RSxDQUFDLE1BQU0sSUFBSUEsQ0FBQyxFQUFFO0VBQ1o4RSxNQUFBQSxDQUFDLENBQUNjLElBQUksQ0FBQ3VvQixHQUFHLENBQUNycEIsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHOUUsQ0FBQyxHQUFHa3VCLFFBQVEsQ0FBQztFQUMxQyxJQUFBO0VBQ0YsRUFBQTtFQUVBLEVBQUEsU0FBU3B0QixLQUFLQSxDQUFDdXRCLEVBQUUsRUFBRUMsRUFBRSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRTFwQixDQUFDLEVBQUVSLENBQUMsRUFBRTtFQUNuQyxJQUFBLElBQUkrcEIsRUFBRSxLQUFLRSxFQUFFLElBQUlELEVBQUUsS0FBS0UsRUFBRSxFQUFFO1FBQzFCLElBQUl6ckIsQ0FBQyxHQUFHK0IsQ0FBQyxDQUFDYyxJQUFJLENBQUN1b0IsR0FBRyxDQUFDcnBCLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUM7UUFDdkRSLENBQUMsQ0FBQ3NCLElBQUksQ0FBQztVQUFDN0MsQ0FBQyxFQUFFQSxDQUFDLEdBQUcsQ0FBQztFQUFFOUQsUUFBQUEsQ0FBQyxFQUFFdXRCLGlCQUFNLENBQUM2QixFQUFFLEVBQUVFLEVBQUU7RUFBQyxPQUFDLEVBQUU7VUFBQ3hyQixDQUFDLEVBQUVBLENBQUMsR0FBRyxDQUFDO0VBQUU5RCxRQUFBQSxDQUFDLEVBQUV1dEIsaUJBQU0sQ0FBQzhCLEVBQUUsRUFBRUUsRUFBRTtFQUFDLE9BQUMsQ0FBQztNQUN0RSxDQUFDLE1BQU0sSUFBSUQsRUFBRSxLQUFLLENBQUMsSUFBSUMsRUFBRSxLQUFLLENBQUMsRUFBRTtFQUMvQjFwQixNQUFBQSxDQUFDLENBQUNjLElBQUksQ0FBQ3VvQixHQUFHLENBQUNycEIsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHeXBCLEVBQUUsR0FBRyxHQUFHLEdBQUdDLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDakQsSUFBQTtFQUNGLEVBQUE7RUFFQSxFQUFBLE9BQU8sVUFBU3p1QixDQUFDLEVBQUVDLENBQUMsRUFBRTtNQUNwQixJQUFJOEUsQ0FBQyxHQUFHLEVBQUU7RUFBRTtRQUNSUixDQUFDLEdBQUcsRUFBRSxDQUFDO01BQ1h2RSxDQUFDLEdBQUdndUIsS0FBSyxDQUFDaHVCLENBQUMsQ0FBQyxFQUFFQyxDQUFDLEdBQUcrdEIsS0FBSyxDQUFDL3RCLENBQUMsQ0FBQztNQUMxQm91QixTQUFTLENBQUNydUIsQ0FBQyxDQUFDNHNCLFVBQVUsRUFBRTVzQixDQUFDLENBQUM2c0IsVUFBVSxFQUFFNXNCLENBQUMsQ0FBQzJzQixVQUFVLEVBQUUzc0IsQ0FBQyxDQUFDNHNCLFVBQVUsRUFBRTluQixDQUFDLEVBQUVSLENBQUMsQ0FBQztFQUN2RXVvQixJQUFBQSxNQUFNLENBQUM5c0IsQ0FBQyxDQUFDOHNCLE1BQU0sRUFBRTdzQixDQUFDLENBQUM2c0IsTUFBTSxFQUFFL25CLENBQUMsRUFBRVIsQ0FBQyxDQUFDO0VBQ2hDd29CLElBQUFBLEtBQUssQ0FBQy9zQixDQUFDLENBQUMrc0IsS0FBSyxFQUFFOXNCLENBQUMsQ0FBQzhzQixLQUFLLEVBQUVob0IsQ0FBQyxFQUFFUixDQUFDLENBQUM7TUFDN0J4RCxLQUFLLENBQUNmLENBQUMsQ0FBQ2d0QixNQUFNLEVBQUVodEIsQ0FBQyxDQUFDaXRCLE1BQU0sRUFBRWh0QixDQUFDLENBQUMrc0IsTUFBTSxFQUFFL3NCLENBQUMsQ0FBQ2d0QixNQUFNLEVBQUVsb0IsQ0FBQyxFQUFFUixDQUFDLENBQUM7RUFDbkR2RSxJQUFBQSxDQUFDLEdBQUdDLENBQUMsR0FBRyxJQUFJLENBQUM7TUFDYixPQUFPLFVBQVNpQyxDQUFDLEVBQUU7UUFDakIsSUFBSWMsQ0FBQyxHQUFHLEVBQUU7VUFBRXJELENBQUMsR0FBRzRFLENBQUMsQ0FBQ3hCLE1BQU07VUFBRWlZLENBQUM7UUFDM0IsT0FBTyxFQUFFaFksQ0FBQyxHQUFHckQsQ0FBQyxFQUFFb0YsQ0FBQyxDQUFDLENBQUNpVyxDQUFDLEdBQUd6VyxDQUFDLENBQUN2QixDQUFDLENBQUMsRUFBRUEsQ0FBQyxDQUFDLEdBQUdnWSxDQUFDLENBQUM5YixDQUFDLENBQUNnRCxDQUFDLENBQUM7RUFDeEMsTUFBQSxPQUFPNkMsQ0FBQyxDQUFDNlQsSUFBSSxDQUFDLEVBQUUsQ0FBQztNQUNuQixDQUFDO0lBQ0gsQ0FBQztFQUNIO0VBRU8sSUFBSThWLHVCQUF1QixHQUFHWCxvQkFBb0IsQ0FBQ1YsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDO0VBQ25GLElBQUlzQix1QkFBdUIsR0FBR1osb0JBQW9CLENBQUNMLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQzs7RUM5RG5GLElBQUlrQixLQUFLLEdBQUcsQ0FBQztFQUFFO0VBQ1hDLEVBQUFBLFNBQU8sR0FBRyxDQUFDO0VBQUU7RUFDYkMsRUFBQUEsUUFBUSxHQUFHLENBQUM7RUFBRTtFQUNkQyxFQUFBQSxTQUFTLEdBQUcsSUFBSTtFQUFFO0lBQ2xCQyxRQUFRO0lBQ1JDLFFBQVE7RUFDUkMsRUFBQUEsU0FBUyxHQUFHLENBQUM7RUFDYkMsRUFBQUEsUUFBUSxHQUFHLENBQUM7RUFDWkMsRUFBQUEsU0FBUyxHQUFHLENBQUM7RUFDYkMsRUFBQUEsS0FBSyxHQUFHLE9BQU9DLFdBQVcsS0FBSyxRQUFRLElBQUlBLFdBQVcsQ0FBQ0MsR0FBRyxHQUFHRCxXQUFXLEdBQUcvcEIsSUFBSTtJQUMvRWlxQixRQUFRLEdBQUcsT0FBT25VLE1BQU0sS0FBSyxRQUFRLElBQUlBLE1BQU0sQ0FBQ29VLHFCQUFxQixHQUFHcFUsTUFBTSxDQUFDb1UscUJBQXFCLENBQUM5YSxJQUFJLENBQUMwRyxNQUFNLENBQUMsR0FBRyxVQUFTNVksQ0FBQyxFQUFFO0VBQUVpdEIsSUFBQUEsVUFBVSxDQUFDanRCLENBQUMsRUFBRSxFQUFFLENBQUM7SUFBRSxDQUFDO0VBRW5KLFNBQVM4c0IsR0FBR0EsR0FBRztFQUNwQixFQUFBLE9BQU9KLFFBQVEsS0FBS0ssUUFBUSxDQUFDRyxRQUFRLENBQUMsRUFBRVIsUUFBUSxHQUFHRSxLQUFLLENBQUNFLEdBQUcsRUFBRSxHQUFHSCxTQUFTLENBQUM7RUFDN0U7RUFFQSxTQUFTTyxRQUFRQSxHQUFHO0VBQ2xCUixFQUFBQSxRQUFRLEdBQUcsQ0FBQztFQUNkO0VBRU8sU0FBU1MsS0FBS0EsR0FBRztJQUN0QixJQUFJLENBQUNDLEtBQUssR0FDVixJQUFJLENBQUNDLEtBQUssR0FDVixJQUFJLENBQUN0YyxLQUFLLEdBQUcsSUFBSTtFQUNuQjtFQUVBb2MsS0FBSyxDQUFDMXFCLFNBQVMsR0FBRzZxQixLQUFLLENBQUM3cUIsU0FBUyxHQUFHO0VBQ2xDWSxFQUFBQSxXQUFXLEVBQUU4cEIsS0FBSztJQUNsQkksT0FBTyxFQUFFLFVBQVN6Z0IsUUFBUSxFQUFFMGdCLEtBQUssRUFBRUMsSUFBSSxFQUFFO01BQ3ZDLElBQUksT0FBTzNnQixRQUFRLEtBQUssVUFBVSxFQUFFLE1BQU0sSUFBSWpDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FBQztNQUNyRjRpQixJQUFJLEdBQUcsQ0FBQ0EsSUFBSSxJQUFJLElBQUksR0FBR1gsR0FBRyxFQUFFLEdBQUcsQ0FBQ1csSUFBSSxLQUFLRCxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDQSxLQUFLLENBQUM7TUFDcEUsSUFBSSxDQUFDLElBQUksQ0FBQ3pjLEtBQUssSUFBSXliLFFBQVEsS0FBSyxJQUFJLEVBQUU7UUFDcEMsSUFBSUEsUUFBUSxFQUFFQSxRQUFRLENBQUN6YixLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQy9Cd2IsUUFBUSxHQUFHLElBQUk7RUFDcEJDLE1BQUFBLFFBQVEsR0FBRyxJQUFJO0VBQ2pCLElBQUE7TUFDQSxJQUFJLENBQUNZLEtBQUssR0FBR3RnQixRQUFRO01BQ3JCLElBQUksQ0FBQ3VnQixLQUFLLEdBQUdJLElBQUk7RUFDakJDLElBQUFBLEtBQUssRUFBRTtJQUNULENBQUM7SUFDREMsSUFBSSxFQUFFLFlBQVc7TUFDZixJQUFJLElBQUksQ0FBQ1AsS0FBSyxFQUFFO1FBQ2QsSUFBSSxDQUFDQSxLQUFLLEdBQUcsSUFBSTtRQUNqQixJQUFJLENBQUNDLEtBQUssR0FBR2x2QixRQUFRO0VBQ3JCdXZCLE1BQUFBLEtBQUssRUFBRTtFQUNULElBQUE7RUFDRixFQUFBO0VBQ0YsQ0FBQztFQUVNLFNBQVNKLEtBQUtBLENBQUN4Z0IsUUFBUSxFQUFFMGdCLEtBQUssRUFBRUMsSUFBSSxFQUFFO0VBQzNDLEVBQUEsSUFBSWh1QixDQUFDLEdBQUcsSUFBSTB0QixLQUFLLEVBQUE7SUFDakIxdEIsQ0FBQyxDQUFDOHRCLE9BQU8sQ0FBQ3pnQixRQUFRLEVBQUUwZ0IsS0FBSyxFQUFFQyxJQUFJLENBQUM7RUFDaEMsRUFBQSxPQUFPaHVCLENBQUM7RUFDVjtFQUVPLFNBQVNtdUIsVUFBVUEsR0FBRztJQUMzQmQsR0FBRyxFQUFFLENBQUM7SUFDTixFQUFFWCxLQUFLLENBQUM7SUFDUixJQUFJMXNCLENBQUMsR0FBRzhzQixRQUFRO01BQUV4c0IsQ0FBQztFQUNuQixFQUFBLE9BQU9OLENBQUMsRUFBRTtNQUNSLElBQUksQ0FBQ00sQ0FBQyxHQUFHMnNCLFFBQVEsR0FBR2p0QixDQUFDLENBQUM0dEIsS0FBSyxLQUFLLENBQUMsRUFBRTV0QixDQUFDLENBQUMydEIsS0FBSyxDQUFDenFCLElBQUksQ0FBQzBDLFNBQVMsRUFBRXRGLENBQUMsQ0FBQztNQUM3RE4sQ0FBQyxHQUFHQSxDQUFDLENBQUNzUixLQUFLO0VBQ2IsRUFBQTtFQUNBLEVBQUEsRUFBRW9iLEtBQUs7RUFDVDtFQUVBLFNBQVMwQixJQUFJQSxHQUFHO0lBQ2RuQixRQUFRLEdBQUcsQ0FBQ0QsU0FBUyxHQUFHRyxLQUFLLENBQUNFLEdBQUcsRUFBRSxJQUFJSCxTQUFTO0lBQ2hEUixLQUFLLEdBQUdDLFNBQU8sR0FBRyxDQUFDO0lBQ25CLElBQUk7RUFDRndCLElBQUFBLFVBQVUsRUFBRTtFQUNkLEVBQUEsQ0FBQyxTQUFTO0VBQ1J6QixJQUFBQSxLQUFLLEdBQUcsQ0FBQztFQUNUMkIsSUFBQUEsR0FBRyxFQUFFO0VBQ0xwQixJQUFBQSxRQUFRLEdBQUcsQ0FBQztFQUNkLEVBQUE7RUFDRjtFQUVBLFNBQVNxQixJQUFJQSxHQUFHO0VBQ2QsRUFBQSxJQUFJakIsR0FBRyxHQUFHRixLQUFLLENBQUNFLEdBQUcsRUFBRTtNQUFFVSxLQUFLLEdBQUdWLEdBQUcsR0FBR0wsU0FBUztJQUM5QyxJQUFJZSxLQUFLLEdBQUdsQixTQUFTLEVBQUVLLFNBQVMsSUFBSWEsS0FBSyxFQUFFZixTQUFTLEdBQUdLLEdBQUc7RUFDNUQ7RUFFQSxTQUFTZ0IsR0FBR0EsR0FBRztFQUNiLEVBQUEsSUFBSUUsRUFBRTtFQUFFQyxJQUFBQSxFQUFFLEdBQUcxQixRQUFRO01BQUUyQixFQUFFO0VBQUVULElBQUFBLElBQUksR0FBR3R2QixRQUFRO0VBQzFDLEVBQUEsT0FBTzh2QixFQUFFLEVBQUU7TUFDVCxJQUFJQSxFQUFFLENBQUNiLEtBQUssRUFBRTtRQUNaLElBQUlLLElBQUksR0FBR1EsRUFBRSxDQUFDWixLQUFLLEVBQUVJLElBQUksR0FBR1EsRUFBRSxDQUFDWixLQUFLO0VBQ3BDVyxNQUFBQSxFQUFFLEdBQUdDLEVBQUUsRUFBRUEsRUFBRSxHQUFHQSxFQUFFLENBQUNsZCxLQUFLO0VBQ3hCLElBQUEsQ0FBQyxNQUFNO1FBQ0xtZCxFQUFFLEdBQUdELEVBQUUsQ0FBQ2xkLEtBQUssRUFBRWtkLEVBQUUsQ0FBQ2xkLEtBQUssR0FBRyxJQUFJO1FBQzlCa2QsRUFBRSxHQUFHRCxFQUFFLEdBQUdBLEVBQUUsQ0FBQ2pkLEtBQUssR0FBR21kLEVBQUUsR0FBRzNCLFFBQVEsR0FBRzJCLEVBQUU7RUFDekMsSUFBQTtFQUNGLEVBQUE7RUFDQTFCLEVBQUFBLFFBQVEsR0FBR3dCLEVBQUU7SUFDYk4sS0FBSyxDQUFDRCxJQUFJLENBQUM7RUFDYjtFQUVBLFNBQVNDLEtBQUtBLENBQUNELElBQUksRUFBRTtJQUNuQixJQUFJdEIsS0FBSyxFQUFFLE9BQU87RUFDbEIsRUFBQSxJQUFJQyxTQUFPLEVBQUVBLFNBQU8sR0FBRytCLFlBQVksQ0FBQy9CLFNBQU8sQ0FBQztFQUM1QyxFQUFBLElBQUlvQixLQUFLLEdBQUdDLElBQUksR0FBR2YsUUFBUSxDQUFDO0lBQzVCLElBQUljLEtBQUssR0FBRyxFQUFFLEVBQUU7RUFDZCxJQUFBLElBQUlDLElBQUksR0FBR3R2QixRQUFRLEVBQUVpdUIsU0FBTyxHQUFHYSxVQUFVLENBQUNZLElBQUksRUFBRUosSUFBSSxHQUFHYixLQUFLLENBQUNFLEdBQUcsRUFBRSxHQUFHSCxTQUFTLENBQUM7RUFDL0UsSUFBQSxJQUFJTixRQUFRLEVBQUVBLFFBQVEsR0FBRytCLGFBQWEsQ0FBQy9CLFFBQVEsQ0FBQztFQUNsRCxFQUFBLENBQUMsTUFBTTtFQUNMLElBQUEsSUFBSSxDQUFDQSxRQUFRLEVBQUVJLFNBQVMsR0FBR0csS0FBSyxDQUFDRSxHQUFHLEVBQUUsRUFBRVQsUUFBUSxHQUFHZ0MsV0FBVyxDQUFDTixJQUFJLEVBQUV6QixTQUFTLENBQUM7RUFDL0VILElBQUFBLEtBQUssR0FBRyxDQUFDLEVBQUVZLFFBQVEsQ0FBQ2MsSUFBSSxDQUFDO0VBQzNCLEVBQUE7RUFDRjs7RUMzR2Usa0JBQVMvZ0IsUUFBUSxFQUFFMGdCLEtBQUssRUFBRUMsSUFBSSxFQUFFO0VBQzdDLEVBQUEsSUFBSWh1QixDQUFDLEdBQUcsSUFBSTB0QixLQUFLLEVBQUE7SUFDakJLLEtBQUssR0FBR0EsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQ0EsS0FBSztFQUNsQy90QixFQUFBQSxDQUFDLENBQUM4dEIsT0FBTyxDQUFDZSxPQUFPLElBQUk7TUFDbkI3dUIsQ0FBQyxDQUFDa3VCLElBQUksRUFBRTtFQUNSN2dCLElBQUFBLFFBQVEsQ0FBQ3doQixPQUFPLEdBQUdkLEtBQUssQ0FBQztFQUMzQixFQUFBLENBQUMsRUFBRUEsS0FBSyxFQUFFQyxJQUFJLENBQUM7RUFDZixFQUFBLE9BQU9odUIsQ0FBQztFQUNWOztFQ1BBLElBQUk4dUIsT0FBTyxHQUFHeGlCLFFBQVEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUM7RUFDN0QsSUFBSXlpQixVQUFVLEdBQUcsRUFBRTtFQUVaLElBQUlDLE9BQU8sR0FBRyxDQUFDO0VBQ2YsSUFBSUMsU0FBUyxHQUFHLENBQUM7RUFDakIsSUFBSUMsUUFBUSxHQUFHLENBQUM7RUFDaEIsSUFBSUMsT0FBTyxHQUFHLENBQUM7RUFDZixJQUFJQyxPQUFPLEdBQUcsQ0FBQztFQUNmLElBQUlDLE1BQU0sR0FBRyxDQUFDO0VBQ2QsSUFBSUMsS0FBSyxHQUFHLENBQUM7RUFFTCxpQkFBQSxFQUFTM2YsSUFBSSxFQUFFL00sSUFBSSxFQUFFMnNCLEVBQUUsRUFBRWpGLEtBQUssRUFBRTdhLEtBQUssRUFBRStmLE1BQU0sRUFBRTtFQUM1RCxFQUFBLElBQUlDLFNBQVMsR0FBRzlmLElBQUksQ0FBQytmLFlBQVk7RUFDakMsRUFBQSxJQUFJLENBQUNELFNBQVMsRUFBRTlmLElBQUksQ0FBQytmLFlBQVksR0FBRyxFQUFFLENBQUMsS0FDbEMsSUFBSUgsRUFBRSxJQUFJRSxTQUFTLEVBQUU7RUFDMUIzbkIsRUFBQUEsTUFBTSxDQUFDNkgsSUFBSSxFQUFFNGYsRUFBRSxFQUFFO0VBQ2Yzc0IsSUFBQUEsSUFBSSxFQUFFQSxJQUFJO0VBQ1YwbkIsSUFBQUEsS0FBSyxFQUFFQSxLQUFLO0VBQUU7RUFDZDdhLElBQUFBLEtBQUssRUFBRUEsS0FBSztFQUFFO0VBQ2R0QyxJQUFBQSxFQUFFLEVBQUUyaEIsT0FBTztFQUNYYSxJQUFBQSxLQUFLLEVBQUVaLFVBQVU7TUFDakJmLElBQUksRUFBRXdCLE1BQU0sQ0FBQ3hCLElBQUk7TUFDakJELEtBQUssRUFBRXlCLE1BQU0sQ0FBQ3pCLEtBQUs7TUFDbkI2QixRQUFRLEVBQUVKLE1BQU0sQ0FBQ0ksUUFBUTtNQUN6QkMsSUFBSSxFQUFFTCxNQUFNLENBQUNLLElBQUk7RUFDakJoQyxJQUFBQSxLQUFLLEVBQUUsSUFBSTtFQUNYbG5CLElBQUFBLEtBQUssRUFBRXFvQjtFQUNULEdBQUMsQ0FBQztFQUNKO0VBRU8sU0FBUzFxQixJQUFJQSxDQUFDcUwsSUFBSSxFQUFFNGYsRUFBRSxFQUFFO0VBQzdCLEVBQUEsSUFBSU8sUUFBUSxHQUFHdmlCLEdBQUcsQ0FBQ29DLElBQUksRUFBRTRmLEVBQUUsQ0FBQztJQUM1QixJQUFJTyxRQUFRLENBQUNucEIsS0FBSyxHQUFHcW9CLE9BQU8sRUFBRSxNQUFNLElBQUl0aUIsS0FBSyxDQUFDLDZCQUE2QixDQUFDO0VBQzVFLEVBQUEsT0FBT29qQixRQUFRO0VBQ2pCO0VBRU8sU0FBU3RpQixHQUFHQSxDQUFDbUMsSUFBSSxFQUFFNGYsRUFBRSxFQUFFO0VBQzVCLEVBQUEsSUFBSU8sUUFBUSxHQUFHdmlCLEdBQUcsQ0FBQ29DLElBQUksRUFBRTRmLEVBQUUsQ0FBQztJQUM1QixJQUFJTyxRQUFRLENBQUNucEIsS0FBSyxHQUFHd29CLE9BQU8sRUFBRSxNQUFNLElBQUl6aUIsS0FBSyxDQUFDLDJCQUEyQixDQUFDO0VBQzFFLEVBQUEsT0FBT29qQixRQUFRO0VBQ2pCO0VBRU8sU0FBU3ZpQixHQUFHQSxDQUFDb0MsSUFBSSxFQUFFNGYsRUFBRSxFQUFFO0VBQzVCLEVBQUEsSUFBSU8sUUFBUSxHQUFHbmdCLElBQUksQ0FBQytmLFlBQVk7RUFDaEMsRUFBQSxJQUFJLENBQUNJLFFBQVEsSUFBSSxFQUFFQSxRQUFRLEdBQUdBLFFBQVEsQ0FBQ1AsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUk3aUIsS0FBSyxDQUFDLHNCQUFzQixDQUFDO0VBQ3BGLEVBQUEsT0FBT29qQixRQUFRO0VBQ2pCO0VBRUEsU0FBU2hvQixNQUFNQSxDQUFDNkgsSUFBSSxFQUFFNGYsRUFBRSxFQUFFUSxJQUFJLEVBQUU7RUFDOUIsRUFBQSxJQUFJTixTQUFTLEdBQUc5ZixJQUFJLENBQUMrZixZQUFZO01BQzdCQyxLQUFLOztFQUVUO0VBQ0E7RUFDQUYsRUFBQUEsU0FBUyxDQUFDRixFQUFFLENBQUMsR0FBR1EsSUFBSTtFQUNwQkEsRUFBQUEsSUFBSSxDQUFDbEMsS0FBSyxHQUFHQSxLQUFLLENBQUNpQyxRQUFRLEVBQUUsQ0FBQyxFQUFFQyxJQUFJLENBQUMvQixJQUFJLENBQUM7SUFFMUMsU0FBUzhCLFFBQVFBLENBQUNqQixPQUFPLEVBQUU7TUFDekJrQixJQUFJLENBQUNwcEIsS0FBSyxHQUFHc29CLFNBQVM7RUFDdEJjLElBQUFBLElBQUksQ0FBQ2xDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDcEUsS0FBSyxFQUFFcUcsSUFBSSxDQUFDaEMsS0FBSyxFQUFFZ0MsSUFBSSxDQUFDL0IsSUFBSSxDQUFDOztFQUVoRDtFQUNBLElBQUEsSUFBSStCLElBQUksQ0FBQ2hDLEtBQUssSUFBSWMsT0FBTyxFQUFFbkYsS0FBSyxDQUFDbUYsT0FBTyxHQUFHa0IsSUFBSSxDQUFDaEMsS0FBSyxDQUFDO0VBQ3hELEVBQUE7SUFFQSxTQUFTckUsS0FBS0EsQ0FBQ21GLE9BQU8sRUFBRTtFQUN0QixJQUFBLElBQUkvdEIsQ0FBQyxFQUFFN0QsQ0FBQyxFQUFFUSxDQUFDLEVBQUVxYixDQUFDOztFQUVkO01BQ0EsSUFBSWlYLElBQUksQ0FBQ3BwQixLQUFLLEtBQUtzb0IsU0FBUyxFQUFFLE9BQU9mLElBQUksRUFBRTtNQUUzQyxLQUFLcHRCLENBQUMsSUFBSTJ1QixTQUFTLEVBQUU7RUFDbkIzVyxNQUFBQSxDQUFDLEdBQUcyVyxTQUFTLENBQUMzdUIsQ0FBQyxDQUFDO0VBQ2hCLE1BQUEsSUFBSWdZLENBQUMsQ0FBQ2xXLElBQUksS0FBS210QixJQUFJLENBQUNudEIsSUFBSSxFQUFFOztFQUUxQjtFQUNBO0VBQ0E7UUFDQSxJQUFJa1csQ0FBQyxDQUFDblMsS0FBSyxLQUFLd29CLE9BQU8sRUFBRSxPQUFPeEMsT0FBTyxDQUFDakQsS0FBSyxDQUFDOztFQUU5QztFQUNBLE1BQUEsSUFBSTVRLENBQUMsQ0FBQ25TLEtBQUssS0FBS3lvQixPQUFPLEVBQUU7VUFDdkJ0VyxDQUFDLENBQUNuUyxLQUFLLEdBQUcyb0IsS0FBSztFQUNmeFcsUUFBQUEsQ0FBQyxDQUFDK1UsS0FBSyxDQUFDSyxJQUFJLEVBQUU7VUFDZHBWLENBQUMsQ0FBQzNMLEVBQUUsQ0FBQ2pLLElBQUksQ0FBQyxXQUFXLEVBQUV5TSxJQUFJLEVBQUVBLElBQUksQ0FBQ0UsUUFBUSxFQUFFaUosQ0FBQyxDQUFDd1IsS0FBSyxFQUFFeFIsQ0FBQyxDQUFDckosS0FBSyxDQUFDO1VBQzdELE9BQU9nZ0IsU0FBUyxDQUFDM3VCLENBQUMsQ0FBQztFQUNyQixNQUFBOztFQUVBO0VBQUEsV0FDSyxJQUFJLENBQUNBLENBQUMsR0FBR3l1QixFQUFFLEVBQUU7VUFDaEJ6VyxDQUFDLENBQUNuUyxLQUFLLEdBQUcyb0IsS0FBSztFQUNmeFcsUUFBQUEsQ0FBQyxDQUFDK1UsS0FBSyxDQUFDSyxJQUFJLEVBQUU7VUFDZHBWLENBQUMsQ0FBQzNMLEVBQUUsQ0FBQ2pLLElBQUksQ0FBQyxRQUFRLEVBQUV5TSxJQUFJLEVBQUVBLElBQUksQ0FBQ0UsUUFBUSxFQUFFaUosQ0FBQyxDQUFDd1IsS0FBSyxFQUFFeFIsQ0FBQyxDQUFDckosS0FBSyxDQUFDO1VBQzFELE9BQU9nZ0IsU0FBUyxDQUFDM3VCLENBQUMsQ0FBQztFQUNyQixNQUFBO0VBQ0YsSUFBQTs7RUFFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBNnJCLElBQUFBLE9BQU8sQ0FBQyxZQUFXO0VBQ2pCLE1BQUEsSUFBSW9ELElBQUksQ0FBQ3BwQixLQUFLLEtBQUt3b0IsT0FBTyxFQUFFO1VBQzFCWSxJQUFJLENBQUNwcEIsS0FBSyxHQUFHeW9CLE9BQU87RUFDcEJXLFFBQUFBLElBQUksQ0FBQ2xDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDa0MsSUFBSSxFQUFFRCxJQUFJLENBQUNoQyxLQUFLLEVBQUVnQyxJQUFJLENBQUMvQixJQUFJLENBQUM7VUFDL0NnQyxJQUFJLENBQUNuQixPQUFPLENBQUM7RUFDZixNQUFBO0VBQ0YsSUFBQSxDQUFDLENBQUM7O0VBRUY7RUFDQTtNQUNBa0IsSUFBSSxDQUFDcHBCLEtBQUssR0FBR3VvQixRQUFRO01BQ3JCYSxJQUFJLENBQUM1aUIsRUFBRSxDQUFDakssSUFBSSxDQUFDLE9BQU8sRUFBRXlNLElBQUksRUFBRUEsSUFBSSxDQUFDRSxRQUFRLEVBQUVrZ0IsSUFBSSxDQUFDekYsS0FBSyxFQUFFeUYsSUFBSSxDQUFDdGdCLEtBQUssQ0FBQztFQUNsRSxJQUFBLElBQUlzZ0IsSUFBSSxDQUFDcHBCLEtBQUssS0FBS3VvQixRQUFRLEVBQUUsT0FBTztNQUNwQ2EsSUFBSSxDQUFDcHBCLEtBQUssR0FBR3dvQixPQUFPOztFQUVwQjtNQUNBUSxLQUFLLEdBQUcsSUFBSWpzQixLQUFLLENBQUNqRyxDQUFDLEdBQUdzeUIsSUFBSSxDQUFDSixLQUFLLENBQUM5dUIsTUFBTSxDQUFDO0VBQ3hDLElBQUEsS0FBS0MsQ0FBQyxHQUFHLENBQUMsRUFBRTdELENBQUMsR0FBRyxFQUFFLEVBQUU2RCxDQUFDLEdBQUdyRCxDQUFDLEVBQUUsRUFBRXFELENBQUMsRUFBRTtRQUM5QixJQUFJZ1ksQ0FBQyxHQUFHaVgsSUFBSSxDQUFDSixLQUFLLENBQUM3dUIsQ0FBQyxDQUFDLENBQUNnRixLQUFLLENBQUM1QyxJQUFJLENBQUN5TSxJQUFJLEVBQUVBLElBQUksQ0FBQ0UsUUFBUSxFQUFFa2dCLElBQUksQ0FBQ3pGLEtBQUssRUFBRXlGLElBQUksQ0FBQ3RnQixLQUFLLENBQUMsRUFBRTtFQUM3RWtnQixRQUFBQSxLQUFLLENBQUMsRUFBRTF5QixDQUFDLENBQUMsR0FBRzZiLENBQUM7RUFDaEIsTUFBQTtFQUNGLElBQUE7RUFDQTZXLElBQUFBLEtBQUssQ0FBQzl1QixNQUFNLEdBQUc1RCxDQUFDLEdBQUcsQ0FBQztFQUN0QixFQUFBO0lBRUEsU0FBUyt5QixJQUFJQSxDQUFDbkIsT0FBTyxFQUFFO0VBQ3JCLElBQUEsSUFBSTd1QixDQUFDLEdBQUc2dUIsT0FBTyxHQUFHa0IsSUFBSSxDQUFDSCxRQUFRLEdBQUdHLElBQUksQ0FBQ0YsSUFBSSxDQUFDM3NCLElBQUksQ0FBQyxJQUFJLEVBQUUyckIsT0FBTyxHQUFHa0IsSUFBSSxDQUFDSCxRQUFRLENBQUMsSUFBSUcsSUFBSSxDQUFDbEMsS0FBSyxDQUFDQyxPQUFPLENBQUNJLElBQUksQ0FBQyxFQUFFNkIsSUFBSSxDQUFDcHBCLEtBQUssR0FBRzBvQixNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2hJdnVCLENBQUMsR0FBRyxFQUFFO1FBQ05yRCxDQUFDLEdBQUdreUIsS0FBSyxDQUFDOXVCLE1BQU07RUFFcEIsSUFBQSxPQUFPLEVBQUVDLENBQUMsR0FBR3JELENBQUMsRUFBRTtRQUNka3lCLEtBQUssQ0FBQzd1QixDQUFDLENBQUMsQ0FBQ29DLElBQUksQ0FBQ3lNLElBQUksRUFBRTNQLENBQUMsQ0FBQztFQUN4QixJQUFBOztFQUVBO0VBQ0EsSUFBQSxJQUFJK3ZCLElBQUksQ0FBQ3BwQixLQUFLLEtBQUswb0IsTUFBTSxFQUFFO1FBQ3pCVSxJQUFJLENBQUM1aUIsRUFBRSxDQUFDakssSUFBSSxDQUFDLEtBQUssRUFBRXlNLElBQUksRUFBRUEsSUFBSSxDQUFDRSxRQUFRLEVBQUVrZ0IsSUFBSSxDQUFDekYsS0FBSyxFQUFFeUYsSUFBSSxDQUFDdGdCLEtBQUssQ0FBQztFQUNoRXllLE1BQUFBLElBQUksRUFBRTtFQUNSLElBQUE7RUFDRixFQUFBO0lBRUEsU0FBU0EsSUFBSUEsR0FBRztNQUNkNkIsSUFBSSxDQUFDcHBCLEtBQUssR0FBRzJvQixLQUFLO0VBQ2xCUyxJQUFBQSxJQUFJLENBQUNsQyxLQUFLLENBQUNLLElBQUksRUFBRTtNQUNqQixPQUFPdUIsU0FBUyxDQUFDRixFQUFFLENBQUM7RUFDcEIsSUFBQSxLQUFLLElBQUl6dUIsQ0FBQyxJQUFJMnVCLFNBQVMsRUFBRSxPQUFPO01BQ2hDLE9BQU85ZixJQUFJLENBQUMrZixZQUFZO0VBQzFCLEVBQUE7RUFDRjs7RUN0SmUsa0JBQUEsRUFBUy9mLElBQUksRUFBRS9NLElBQUksRUFBRTtFQUNsQyxFQUFBLElBQUk2c0IsU0FBUyxHQUFHOWYsSUFBSSxDQUFDK2YsWUFBWTtNQUM3QkksUUFBUTtNQUNSRyxNQUFNO0VBQ05udEIsSUFBQUEsS0FBSyxHQUFHLElBQUk7TUFDWmhDLENBQUM7SUFFTCxJQUFJLENBQUMydUIsU0FBUyxFQUFFO0lBRWhCN3NCLElBQUksR0FBR0EsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUdBLElBQUksR0FBRyxFQUFFO0lBRXRDLEtBQUs5QixDQUFDLElBQUkydUIsU0FBUyxFQUFFO01BQ25CLElBQUksQ0FBQ0ssUUFBUSxHQUFHTCxTQUFTLENBQUMzdUIsQ0FBQyxDQUFDLEVBQUU4QixJQUFJLEtBQUtBLElBQUksRUFBRTtFQUFFRSxNQUFBQSxLQUFLLEdBQUcsS0FBSztFQUFFLE1BQUE7RUFBVSxJQUFBO01BQ3hFbXRCLE1BQU0sR0FBR0gsUUFBUSxDQUFDbnBCLEtBQUssR0FBR3VvQixRQUFRLElBQUlZLFFBQVEsQ0FBQ25wQixLQUFLLEdBQUcwb0IsTUFBTTtNQUM3RFMsUUFBUSxDQUFDbnBCLEtBQUssR0FBRzJvQixLQUFLO0VBQ3RCUSxJQUFBQSxRQUFRLENBQUNqQyxLQUFLLENBQUNLLElBQUksRUFBRTtNQUNyQjRCLFFBQVEsQ0FBQzNpQixFQUFFLENBQUNqSyxJQUFJLENBQUMrc0IsTUFBTSxHQUFHLFdBQVcsR0FBRyxRQUFRLEVBQUV0Z0IsSUFBSSxFQUFFQSxJQUFJLENBQUNFLFFBQVEsRUFBRWlnQixRQUFRLENBQUN4RixLQUFLLEVBQUV3RixRQUFRLENBQUNyZ0IsS0FBSyxDQUFDO01BQ3RHLE9BQU9nZ0IsU0FBUyxDQUFDM3VCLENBQUMsQ0FBQztFQUNyQixFQUFBO0VBRUEsRUFBQSxJQUFJZ0MsS0FBSyxFQUFFLE9BQU82TSxJQUFJLENBQUMrZixZQUFZO0VBQ3JDOztFQ3JCZSw0QkFBQSxFQUFTOXNCLElBQUksRUFBRTtFQUM1QixFQUFBLE9BQU8sSUFBSSxDQUFDd1MsSUFBSSxDQUFDLFlBQVc7RUFDMUI4YSxJQUFBQSxTQUFTLENBQUMsSUFBSSxFQUFFdHRCLElBQUksQ0FBQztFQUN2QixFQUFBLENBQUMsQ0FBQztFQUNKOztFQ0pBLFNBQVN1dEIsV0FBV0EsQ0FBQ1osRUFBRSxFQUFFM3NCLElBQUksRUFBRTtJQUM3QixJQUFJd3RCLE1BQU0sRUFBRUMsTUFBTTtFQUNsQixFQUFBLE9BQU8sWUFBVztFQUNoQixJQUFBLElBQUlQLFFBQVEsR0FBR3RpQixHQUFHLENBQUMsSUFBSSxFQUFFK2hCLEVBQUUsQ0FBQztRQUN4QkksS0FBSyxHQUFHRyxRQUFRLENBQUNILEtBQUs7O0VBRTFCO0VBQ0E7RUFDQTtNQUNBLElBQUlBLEtBQUssS0FBS1MsTUFBTSxFQUFFO1FBQ3BCQyxNQUFNLEdBQUdELE1BQU0sR0FBR1QsS0FBSztFQUN2QixNQUFBLEtBQUssSUFBSTd1QixDQUFDLEdBQUcsQ0FBQyxFQUFFckQsQ0FBQyxHQUFHNHlCLE1BQU0sQ0FBQ3h2QixNQUFNLEVBQUVDLENBQUMsR0FBR3JELENBQUMsRUFBRSxFQUFFcUQsQ0FBQyxFQUFFO1VBQzdDLElBQUl1dkIsTUFBTSxDQUFDdnZCLENBQUMsQ0FBQyxDQUFDOEIsSUFBSSxLQUFLQSxJQUFJLEVBQUU7RUFDM0J5dEIsVUFBQUEsTUFBTSxHQUFHQSxNQUFNLENBQUNyc0IsS0FBSyxFQUFFO0VBQ3ZCcXNCLFVBQUFBLE1BQU0sQ0FBQzFaLE1BQU0sQ0FBQzdWLENBQUMsRUFBRSxDQUFDLENBQUM7RUFDbkIsVUFBQTtFQUNGLFFBQUE7RUFDRixNQUFBO0VBQ0YsSUFBQTtNQUVBZ3ZCLFFBQVEsQ0FBQ0gsS0FBSyxHQUFHVSxNQUFNO0lBQ3pCLENBQUM7RUFDSDtFQUVBLFNBQVNDLGFBQWFBLENBQUNmLEVBQUUsRUFBRTNzQixJQUFJLEVBQUVrRCxLQUFLLEVBQUU7SUFDdEMsSUFBSXNxQixNQUFNLEVBQUVDLE1BQU07SUFDbEIsSUFBSSxPQUFPdnFCLEtBQUssS0FBSyxVQUFVLEVBQUUsTUFBTSxJQUFJNEcsS0FBSyxFQUFBO0VBQ2hELEVBQUEsT0FBTyxZQUFXO0VBQ2hCLElBQUEsSUFBSW9qQixRQUFRLEdBQUd0aUIsR0FBRyxDQUFDLElBQUksRUFBRStoQixFQUFFLENBQUM7UUFDeEJJLEtBQUssR0FBR0csUUFBUSxDQUFDSCxLQUFLOztFQUUxQjtFQUNBO0VBQ0E7TUFDQSxJQUFJQSxLQUFLLEtBQUtTLE1BQU0sRUFBRTtRQUNwQkMsTUFBTSxHQUFHLENBQUNELE1BQU0sR0FBR1QsS0FBSyxFQUFFM3JCLEtBQUssRUFBRTtRQUNqQyxLQUFLLElBQUloRSxDQUFDLEdBQUc7RUFBQzRDLFVBQUFBLElBQUksRUFBRUEsSUFBSTtFQUFFa0QsVUFBQUEsS0FBSyxFQUFFQTtFQUFLLFNBQUMsRUFBRWhGLENBQUMsR0FBRyxDQUFDLEVBQUVyRCxDQUFDLEdBQUc0eUIsTUFBTSxDQUFDeHZCLE1BQU0sRUFBRUMsQ0FBQyxHQUFHckQsQ0FBQyxFQUFFLEVBQUVxRCxDQUFDLEVBQUU7VUFDN0UsSUFBSXV2QixNQUFNLENBQUN2dkIsQ0FBQyxDQUFDLENBQUM4QixJQUFJLEtBQUtBLElBQUksRUFBRTtFQUMzQnl0QixVQUFBQSxNQUFNLENBQUN2dkIsQ0FBQyxDQUFDLEdBQUdkLENBQUM7RUFDYixVQUFBO0VBQ0YsUUFBQTtFQUNGLE1BQUE7UUFDQSxJQUFJYyxDQUFDLEtBQUtyRCxDQUFDLEVBQUU0eUIsTUFBTSxDQUFDMXNCLElBQUksQ0FBQzNELENBQUMsQ0FBQztFQUM3QixJQUFBO01BRUE4dkIsUUFBUSxDQUFDSCxLQUFLLEdBQUdVLE1BQU07SUFDekIsQ0FBQztFQUNIO0VBRWUseUJBQUEsRUFBU3p0QixJQUFJLEVBQUVrRCxLQUFLLEVBQUU7RUFDbkMsRUFBQSxJQUFJeXBCLEVBQUUsR0FBRyxJQUFJLENBQUNnQixHQUFHO0VBRWpCM3RCLEVBQUFBLElBQUksSUFBSSxFQUFFO0VBRVYsRUFBQSxJQUFJMkosU0FBUyxDQUFDMUwsTUFBTSxHQUFHLENBQUMsRUFBRTtFQUN4QixJQUFBLElBQUk4dUIsS0FBSyxHQUFHcGlCLEdBQUcsQ0FBQyxJQUFJLENBQUNvQyxJQUFJLEVBQUUsRUFBRTRmLEVBQUUsQ0FBQyxDQUFDSSxLQUFLO0VBQ3RDLElBQUEsS0FBSyxJQUFJN3VCLENBQUMsR0FBRyxDQUFDLEVBQUVyRCxDQUFDLEdBQUdreUIsS0FBSyxDQUFDOXVCLE1BQU0sRUFBRWIsQ0FBQyxFQUFFYyxDQUFDLEdBQUdyRCxDQUFDLEVBQUUsRUFBRXFELENBQUMsRUFBRTtRQUMvQyxJQUFJLENBQUNkLENBQUMsR0FBRzJ2QixLQUFLLENBQUM3dUIsQ0FBQyxDQUFDLEVBQUU4QixJQUFJLEtBQUtBLElBQUksRUFBRTtVQUNoQyxPQUFPNUMsQ0FBQyxDQUFDOEYsS0FBSztFQUNoQixNQUFBO0VBQ0YsSUFBQTtFQUNBLElBQUEsT0FBTyxJQUFJO0VBQ2IsRUFBQTtFQUVBLEVBQUEsT0FBTyxJQUFJLENBQUNzUCxJQUFJLENBQUMsQ0FBQ3RQLEtBQUssSUFBSSxJQUFJLEdBQUdxcUIsV0FBVyxHQUFHRyxhQUFhLEVBQUVmLEVBQUUsRUFBRTNzQixJQUFJLEVBQUVrRCxLQUFLLENBQUMsQ0FBQztFQUNsRjtFQUVPLFNBQVMwcUIsVUFBVUEsQ0FBQ0MsVUFBVSxFQUFFN3RCLElBQUksRUFBRWtELEtBQUssRUFBRTtFQUNsRCxFQUFBLElBQUl5cEIsRUFBRSxHQUFHa0IsVUFBVSxDQUFDRixHQUFHO0lBRXZCRSxVQUFVLENBQUNyYixJQUFJLENBQUMsWUFBVztFQUN6QixJQUFBLElBQUkwYSxRQUFRLEdBQUd0aUIsR0FBRyxDQUFDLElBQUksRUFBRStoQixFQUFFLENBQUM7TUFDNUIsQ0FBQ08sUUFBUSxDQUFDaHFCLEtBQUssS0FBS2dxQixRQUFRLENBQUNocUIsS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFFbEQsSUFBSSxDQUFDLEdBQUdrRCxLQUFLLENBQUM4SCxLQUFLLENBQUMsSUFBSSxFQUFFckIsU0FBUyxDQUFDO0VBQ2hGLEVBQUEsQ0FBQyxDQUFDO0lBRUYsT0FBTyxVQUFTb0QsSUFBSSxFQUFFO01BQ3BCLE9BQU9wQyxHQUFHLENBQUNvQyxJQUFJLEVBQUU0ZixFQUFFLENBQUMsQ0FBQ3pwQixLQUFLLENBQUNsRCxJQUFJLENBQUM7SUFDbEMsQ0FBQztFQUNIOztFQzdFZSxvQkFBQSxFQUFTOUUsQ0FBQyxFQUFFQyxDQUFDLEVBQUU7RUFDNUIsRUFBQSxJQUFJOFAsQ0FBQztFQUNMLEVBQUEsT0FBTyxDQUFDLE9BQU85UCxDQUFDLEtBQUssUUFBUSxHQUFHMnlCLGlCQUFpQixHQUMzQzN5QixDQUFDLFlBQVkrb0IsS0FBSyxHQUFHNkosY0FBYyxHQUNuQyxDQUFDOWlCLENBQUMsR0FBR2laLEtBQUssQ0FBQy9vQixDQUFDLENBQUMsS0FBS0EsQ0FBQyxHQUFHOFAsQ0FBQyxFQUFFOGlCLGNBQWMsSUFDdkNDLGlCQUFpQixFQUFFOXlCLENBQUMsRUFBRUMsQ0FBQyxDQUFDO0VBQ2hDOztFQ0pBLFNBQVN5VyxVQUFVQSxDQUFDNVIsSUFBSSxFQUFFO0VBQ3hCLEVBQUEsT0FBTyxZQUFXO0VBQ2hCLElBQUEsSUFBSSxDQUFDNlIsZUFBZSxDQUFDN1IsSUFBSSxDQUFDO0lBQzVCLENBQUM7RUFDSDtFQUVBLFNBQVM4UixZQUFZQSxDQUFDMUYsUUFBUSxFQUFFO0VBQzlCLEVBQUEsT0FBTyxZQUFXO01BQ2hCLElBQUksQ0FBQzJGLGlCQUFpQixDQUFDM0YsUUFBUSxDQUFDWCxLQUFLLEVBQUVXLFFBQVEsQ0FBQ1YsS0FBSyxDQUFDO0lBQ3hELENBQUM7RUFDSDtFQUVBLFNBQVNzRyxZQUFZQSxDQUFDaFMsSUFBSSxFQUFFaXVCLFdBQVcsRUFBRTFrQixNQUFNLEVBQUU7RUFDL0MsRUFBQSxJQUFJMmtCLFFBQVE7TUFDUkMsT0FBTyxHQUFHNWtCLE1BQU0sR0FBRyxFQUFFO01BQ3JCNmtCLFlBQVk7RUFDaEIsRUFBQSxPQUFPLFlBQVc7RUFDaEIsSUFBQSxJQUFJQyxPQUFPLEdBQUcsSUFBSSxDQUFDOWIsWUFBWSxDQUFDdlMsSUFBSSxDQUFDO01BQ3JDLE9BQU9xdUIsT0FBTyxLQUFLRixPQUFPLEdBQUcsSUFBSSxHQUMzQkUsT0FBTyxLQUFLSCxRQUFRLEdBQUdFLFlBQVksR0FDbkNBLFlBQVksR0FBR0gsV0FBVyxDQUFDQyxRQUFRLEdBQUdHLE9BQU8sRUFBRTlrQixNQUFNLENBQUM7SUFDOUQsQ0FBQztFQUNIO0VBRUEsU0FBUzJJLGNBQWNBLENBQUM5RixRQUFRLEVBQUU2aEIsV0FBVyxFQUFFMWtCLE1BQU0sRUFBRTtFQUNyRCxFQUFBLElBQUkya0IsUUFBUTtNQUNSQyxPQUFPLEdBQUc1a0IsTUFBTSxHQUFHLEVBQUU7TUFDckI2a0IsWUFBWTtFQUNoQixFQUFBLE9BQU8sWUFBVztFQUNoQixJQUFBLElBQUlDLE9BQU8sR0FBRyxJQUFJLENBQUMvYixjQUFjLENBQUNsRyxRQUFRLENBQUNYLEtBQUssRUFBRVcsUUFBUSxDQUFDVixLQUFLLENBQUM7TUFDakUsT0FBTzJpQixPQUFPLEtBQUtGLE9BQU8sR0FBRyxJQUFJLEdBQzNCRSxPQUFPLEtBQUtILFFBQVEsR0FBR0UsWUFBWSxHQUNuQ0EsWUFBWSxHQUFHSCxXQUFXLENBQUNDLFFBQVEsR0FBR0csT0FBTyxFQUFFOWtCLE1BQU0sQ0FBQztJQUM5RCxDQUFDO0VBQ0g7RUFFQSxTQUFTNkksWUFBWUEsQ0FBQ3BTLElBQUksRUFBRWl1QixXQUFXLEVBQUUvcUIsS0FBSyxFQUFFO0VBQzlDLEVBQUEsSUFBSWdyQixRQUFRLEVBQ1JJLFFBQVEsRUFDUkYsWUFBWTtFQUNoQixFQUFBLE9BQU8sWUFBVztFQUNoQixJQUFBLElBQUlDLE9BQU87RUFBRTlrQixNQUFBQSxNQUFNLEdBQUdyRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQUVpckIsT0FBTztNQUMxQyxJQUFJNWtCLE1BQU0sSUFBSSxJQUFJLEVBQUUsT0FBTyxLQUFLLElBQUksQ0FBQ3NJLGVBQWUsQ0FBQzdSLElBQUksQ0FBQztFQUMxRHF1QixJQUFBQSxPQUFPLEdBQUcsSUFBSSxDQUFDOWIsWUFBWSxDQUFDdlMsSUFBSSxDQUFDO01BQ2pDbXVCLE9BQU8sR0FBRzVrQixNQUFNLEdBQUcsRUFBRTtFQUNyQixJQUFBLE9BQU84a0IsT0FBTyxLQUFLRixPQUFPLEdBQUcsSUFBSSxHQUMzQkUsT0FBTyxLQUFLSCxRQUFRLElBQUlDLE9BQU8sS0FBS0csUUFBUSxHQUFHRixZQUFZLElBQzFERSxRQUFRLEdBQUdILE9BQU8sRUFBRUMsWUFBWSxHQUFHSCxXQUFXLENBQUNDLFFBQVEsR0FBR0csT0FBTyxFQUFFOWtCLE1BQU0sQ0FBQyxDQUFDO0lBQ3BGLENBQUM7RUFDSDtFQUVBLFNBQVM4SSxjQUFjQSxDQUFDakcsUUFBUSxFQUFFNmhCLFdBQVcsRUFBRS9xQixLQUFLLEVBQUU7RUFDcEQsRUFBQSxJQUFJZ3JCLFFBQVEsRUFDUkksUUFBUSxFQUNSRixZQUFZO0VBQ2hCLEVBQUEsT0FBTyxZQUFXO0VBQ2hCLElBQUEsSUFBSUMsT0FBTztFQUFFOWtCLE1BQUFBLE1BQU0sR0FBR3JHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFBRWlyQixPQUFPO0VBQzFDLElBQUEsSUFBSTVrQixNQUFNLElBQUksSUFBSSxFQUFFLE9BQU8sS0FBSyxJQUFJLENBQUN3SSxpQkFBaUIsQ0FBQzNGLFFBQVEsQ0FBQ1gsS0FBSyxFQUFFVyxRQUFRLENBQUNWLEtBQUssQ0FBQztFQUN0RjJpQixJQUFBQSxPQUFPLEdBQUcsSUFBSSxDQUFDL2IsY0FBYyxDQUFDbEcsUUFBUSxDQUFDWCxLQUFLLEVBQUVXLFFBQVEsQ0FBQ1YsS0FBSyxDQUFDO01BQzdEeWlCLE9BQU8sR0FBRzVrQixNQUFNLEdBQUcsRUFBRTtFQUNyQixJQUFBLE9BQU84a0IsT0FBTyxLQUFLRixPQUFPLEdBQUcsSUFBSSxHQUMzQkUsT0FBTyxLQUFLSCxRQUFRLElBQUlDLE9BQU8sS0FBS0csUUFBUSxHQUFHRixZQUFZLElBQzFERSxRQUFRLEdBQUdILE9BQU8sRUFBRUMsWUFBWSxHQUFHSCxXQUFXLENBQUNDLFFBQVEsR0FBR0csT0FBTyxFQUFFOWtCLE1BQU0sQ0FBQyxDQUFDO0lBQ3BGLENBQUM7RUFDSDtFQUVlLHdCQUFBLEVBQVN2SixJQUFJLEVBQUVrRCxLQUFLLEVBQUU7RUFDbkMsRUFBQSxJQUFJa0osUUFBUSxHQUFHQyxTQUFTLENBQUNyTSxJQUFJLENBQUM7RUFBRTlCLElBQUFBLENBQUMsR0FBR2tPLFFBQVEsS0FBSyxXQUFXLEdBQUc2Yyx1QkFBb0IsR0FBR2dGLFdBQVc7RUFDakcsRUFBQSxPQUFPLElBQUksQ0FBQ00sU0FBUyxDQUFDdnVCLElBQUksRUFBRSxPQUFPa0QsS0FBSyxLQUFLLFVBQVUsR0FDakQsQ0FBQ2tKLFFBQVEsQ0FBQ1YsS0FBSyxHQUFHMkcsY0FBYyxHQUFHRCxZQUFZLEVBQUVoRyxRQUFRLEVBQUVsTyxDQUFDLEVBQUUwdkIsVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLEdBQUc1dEIsSUFBSSxFQUFFa0QsS0FBSyxDQUFDLENBQUMsR0FDdEdBLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQ2tKLFFBQVEsQ0FBQ1YsS0FBSyxHQUFHb0csWUFBWSxHQUFHRixVQUFVLEVBQUV4RixRQUFRLENBQUMsR0FDdEUsQ0FBQ0EsUUFBUSxDQUFDVixLQUFLLEdBQUd3RyxjQUFjLEdBQUdGLFlBQVksRUFBRTVGLFFBQVEsRUFBRWxPLENBQUMsRUFBRWdGLEtBQUssQ0FBQyxDQUFDO0VBQzdFOztFQzNFQSxTQUFTc3JCLGVBQWVBLENBQUN4dUIsSUFBSSxFQUFFOUIsQ0FBQyxFQUFFO0lBQ2hDLE9BQU8sVUFBU2QsQ0FBQyxFQUFFO0VBQ2pCLElBQUEsSUFBSSxDQUFDNlUsWUFBWSxDQUFDalMsSUFBSSxFQUFFOUIsQ0FBQyxDQUFDb0MsSUFBSSxDQUFDLElBQUksRUFBRWxELENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7RUFDSDtFQUVBLFNBQVNxeEIsaUJBQWlCQSxDQUFDcmlCLFFBQVEsRUFBRWxPLENBQUMsRUFBRTtJQUN0QyxPQUFPLFVBQVNkLENBQUMsRUFBRTtFQUNqQixJQUFBLElBQUksQ0FBQytVLGNBQWMsQ0FBQy9GLFFBQVEsQ0FBQ1gsS0FBSyxFQUFFVyxRQUFRLENBQUNWLEtBQUssRUFBRXhOLENBQUMsQ0FBQ29DLElBQUksQ0FBQyxJQUFJLEVBQUVsRCxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0VBQ0g7RUFFQSxTQUFTc3hCLFdBQVdBLENBQUN0aUIsUUFBUSxFQUFFbEosS0FBSyxFQUFFO0lBQ3BDLElBQUl5b0IsRUFBRSxFQUFFdmlCLEVBQUU7SUFDVixTQUFTMmpCLEtBQUtBLEdBQUc7TUFDZixJQUFJN3VCLENBQUMsR0FBR2dGLEtBQUssQ0FBQzhILEtBQUssQ0FBQyxJQUFJLEVBQUVyQixTQUFTLENBQUM7RUFDcEMsSUFBQSxJQUFJekwsQ0FBQyxLQUFLa0wsRUFBRSxFQUFFdWlCLEVBQUUsR0FBRyxDQUFDdmlCLEVBQUUsR0FBR2xMLENBQUMsS0FBS3V3QixpQkFBaUIsQ0FBQ3JpQixRQUFRLEVBQUVsTyxDQUFDLENBQUM7RUFDN0QsSUFBQSxPQUFPeXRCLEVBQUU7RUFDWCxFQUFBO0lBQ0FvQixLQUFLLENBQUM0QixNQUFNLEdBQUd6ckIsS0FBSztFQUNwQixFQUFBLE9BQU82cEIsS0FBSztFQUNkO0VBRUEsU0FBU3dCLFNBQVNBLENBQUN2dUIsSUFBSSxFQUFFa0QsS0FBSyxFQUFFO0lBQzlCLElBQUl5b0IsRUFBRSxFQUFFdmlCLEVBQUU7SUFDVixTQUFTMmpCLEtBQUtBLEdBQUc7TUFDZixJQUFJN3VCLENBQUMsR0FBR2dGLEtBQUssQ0FBQzhILEtBQUssQ0FBQyxJQUFJLEVBQUVyQixTQUFTLENBQUM7RUFDcEMsSUFBQSxJQUFJekwsQ0FBQyxLQUFLa0wsRUFBRSxFQUFFdWlCLEVBQUUsR0FBRyxDQUFDdmlCLEVBQUUsR0FBR2xMLENBQUMsS0FBS3N3QixlQUFlLENBQUN4dUIsSUFBSSxFQUFFOUIsQ0FBQyxDQUFDO0VBQ3ZELElBQUEsT0FBT3l0QixFQUFFO0VBQ1gsRUFBQTtJQUNBb0IsS0FBSyxDQUFDNEIsTUFBTSxHQUFHenJCLEtBQUs7RUFDcEIsRUFBQSxPQUFPNnBCLEtBQUs7RUFDZDtFQUVlLDZCQUFBLEVBQVMvc0IsSUFBSSxFQUFFa0QsS0FBSyxFQUFFO0VBQ25DLEVBQUEsSUFBSW9NLEdBQUcsR0FBRyxPQUFPLEdBQUd0UCxJQUFJO0VBQ3hCLEVBQUEsSUFBSTJKLFNBQVMsQ0FBQzFMLE1BQU0sR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDcVIsR0FBRyxHQUFHLElBQUksQ0FBQ3lkLEtBQUssQ0FBQ3pkLEdBQUcsQ0FBQyxLQUFLQSxHQUFHLENBQUNxZixNQUFNO0VBQ3RFLEVBQUEsSUFBSXpyQixLQUFLLElBQUksSUFBSSxFQUFFLE9BQU8sSUFBSSxDQUFDNnBCLEtBQUssQ0FBQ3pkLEdBQUcsRUFBRSxJQUFJLENBQUM7SUFDL0MsSUFBSSxPQUFPcE0sS0FBSyxLQUFLLFVBQVUsRUFBRSxNQUFNLElBQUk0RyxLQUFLLEVBQUE7RUFDaEQsRUFBQSxJQUFJc0MsUUFBUSxHQUFHQyxTQUFTLENBQUNyTSxJQUFJLENBQUM7RUFDOUIsRUFBQSxPQUFPLElBQUksQ0FBQytzQixLQUFLLENBQUN6ZCxHQUFHLEVBQUUsQ0FBQ2xELFFBQVEsQ0FBQ1YsS0FBSyxHQUFHZ2pCLFdBQVcsR0FBR0gsU0FBUyxFQUFFbmlCLFFBQVEsRUFBRWxKLEtBQUssQ0FBQyxDQUFDO0VBQ3JGOztFQ3pDQSxTQUFTMHJCLGFBQWFBLENBQUNqQyxFQUFFLEVBQUV6cEIsS0FBSyxFQUFFO0VBQ2hDLEVBQUEsT0FBTyxZQUFXO0VBQ2hCeEIsSUFBQUEsSUFBSSxDQUFDLElBQUksRUFBRWlyQixFQUFFLENBQUMsQ0FBQ3hCLEtBQUssR0FBRyxDQUFDam9CLEtBQUssQ0FBQzhILEtBQUssQ0FBQyxJQUFJLEVBQUVyQixTQUFTLENBQUM7SUFDdEQsQ0FBQztFQUNIO0VBRUEsU0FBU2tsQixhQUFhQSxDQUFDbEMsRUFBRSxFQUFFenBCLEtBQUssRUFBRTtFQUNoQyxFQUFBLE9BQU9BLEtBQUssR0FBRyxDQUFDQSxLQUFLLEVBQUUsWUFBVztNQUNoQ3hCLElBQUksQ0FBQyxJQUFJLEVBQUVpckIsRUFBRSxDQUFDLENBQUN4QixLQUFLLEdBQUdqb0IsS0FBSztJQUM5QixDQUFDO0VBQ0g7RUFFZSx5QkFBQSxFQUFTQSxLQUFLLEVBQUU7RUFDN0IsRUFBQSxJQUFJeXBCLEVBQUUsR0FBRyxJQUFJLENBQUNnQixHQUFHO0VBRWpCLEVBQUEsT0FBT2hrQixTQUFTLENBQUMxTCxNQUFNLEdBQ2pCLElBQUksQ0FBQ3VVLElBQUksQ0FBQyxDQUFDLE9BQU90UCxLQUFLLEtBQUssVUFBVSxHQUNsQzByQixhQUFhLEdBQ2JDLGFBQWEsRUFBRWxDLEVBQUUsRUFBRXpwQixLQUFLLENBQUMsQ0FBQyxHQUM5QnlILEdBQUcsQ0FBQyxJQUFJLENBQUNvQyxJQUFJLEVBQUUsRUFBRTRmLEVBQUUsQ0FBQyxDQUFDeEIsS0FBSztFQUNsQzs7RUNwQkEsU0FBUzJELGdCQUFnQkEsQ0FBQ25DLEVBQUUsRUFBRXpwQixLQUFLLEVBQUU7RUFDbkMsRUFBQSxPQUFPLFlBQVc7RUFDaEIwSCxJQUFBQSxHQUFHLENBQUMsSUFBSSxFQUFFK2hCLEVBQUUsQ0FBQyxDQUFDSyxRQUFRLEdBQUcsQ0FBQzlwQixLQUFLLENBQUM4SCxLQUFLLENBQUMsSUFBSSxFQUFFckIsU0FBUyxDQUFDO0lBQ3hELENBQUM7RUFDSDtFQUVBLFNBQVNvbEIsZ0JBQWdCQSxDQUFDcEMsRUFBRSxFQUFFenBCLEtBQUssRUFBRTtFQUNuQyxFQUFBLE9BQU9BLEtBQUssR0FBRyxDQUFDQSxLQUFLLEVBQUUsWUFBVztNQUNoQzBILEdBQUcsQ0FBQyxJQUFJLEVBQUUraEIsRUFBRSxDQUFDLENBQUNLLFFBQVEsR0FBRzlwQixLQUFLO0lBQ2hDLENBQUM7RUFDSDtFQUVlLDRCQUFBLEVBQVNBLEtBQUssRUFBRTtFQUM3QixFQUFBLElBQUl5cEIsRUFBRSxHQUFHLElBQUksQ0FBQ2dCLEdBQUc7RUFFakIsRUFBQSxPQUFPaGtCLFNBQVMsQ0FBQzFMLE1BQU0sR0FDakIsSUFBSSxDQUFDdVUsSUFBSSxDQUFDLENBQUMsT0FBT3RQLEtBQUssS0FBSyxVQUFVLEdBQ2xDNHJCLGdCQUFnQixHQUNoQkMsZ0JBQWdCLEVBQUVwQyxFQUFFLEVBQUV6cEIsS0FBSyxDQUFDLENBQUMsR0FDakN5SCxHQUFHLENBQUMsSUFBSSxDQUFDb0MsSUFBSSxFQUFFLEVBQUU0ZixFQUFFLENBQUMsQ0FBQ0ssUUFBUTtFQUNyQzs7RUNwQkEsU0FBU2dDLFlBQVlBLENBQUNyQyxFQUFFLEVBQUV6cEIsS0FBSyxFQUFFO0lBQy9CLElBQUksT0FBT0EsS0FBSyxLQUFLLFVBQVUsRUFBRSxNQUFNLElBQUk0RyxLQUFLLEVBQUE7RUFDaEQsRUFBQSxPQUFPLFlBQVc7TUFDaEJjLEdBQUcsQ0FBQyxJQUFJLEVBQUUraEIsRUFBRSxDQUFDLENBQUNNLElBQUksR0FBRy9wQixLQUFLO0lBQzVCLENBQUM7RUFDSDtFQUVlLHdCQUFBLEVBQVNBLEtBQUssRUFBRTtFQUM3QixFQUFBLElBQUl5cEIsRUFBRSxHQUFHLElBQUksQ0FBQ2dCLEdBQUc7SUFFakIsT0FBT2hrQixTQUFTLENBQUMxTCxNQUFNLEdBQ2pCLElBQUksQ0FBQ3VVLElBQUksQ0FBQ3djLFlBQVksQ0FBQ3JDLEVBQUUsRUFBRXpwQixLQUFLLENBQUMsQ0FBQyxHQUNsQ3lILEdBQUcsQ0FBQyxJQUFJLENBQUNvQyxJQUFJLEVBQUUsRUFBRTRmLEVBQUUsQ0FBQyxDQUFDTSxJQUFJO0VBQ2pDOztFQ2JBLFNBQVNnQyxXQUFXQSxDQUFDdEMsRUFBRSxFQUFFenBCLEtBQUssRUFBRTtFQUM5QixFQUFBLE9BQU8sWUFBVztNQUNoQixJQUFJMUQsQ0FBQyxHQUFHMEQsS0FBSyxDQUFDOEgsS0FBSyxDQUFDLElBQUksRUFBRXJCLFNBQVMsQ0FBQztNQUNwQyxJQUFJLE9BQU9uSyxDQUFDLEtBQUssVUFBVSxFQUFFLE1BQU0sSUFBSXNLLEtBQUssRUFBQTtNQUM1Q2MsR0FBRyxDQUFDLElBQUksRUFBRStoQixFQUFFLENBQUMsQ0FBQ00sSUFBSSxHQUFHenRCLENBQUM7SUFDeEIsQ0FBQztFQUNIO0VBRWUsK0JBQUEsRUFBUzBELEtBQUssRUFBRTtJQUM3QixJQUFJLE9BQU9BLEtBQUssS0FBSyxVQUFVLEVBQUUsTUFBTSxJQUFJNEcsS0FBSyxFQUFBO0VBQ2hELEVBQUEsT0FBTyxJQUFJLENBQUMwSSxJQUFJLENBQUN5YyxXQUFXLENBQUMsSUFBSSxDQUFDdEIsR0FBRyxFQUFFenFCLEtBQUssQ0FBQyxDQUFDO0VBQ2hEOztFQ1ZlLDBCQUFBLEVBQVMwSyxLQUFLLEVBQUU7SUFDN0IsSUFBSSxPQUFPQSxLQUFLLEtBQUssVUFBVSxFQUFFQSxLQUFLLEdBQUdPLE9BQU8sQ0FBQ1AsS0FBSyxDQUFDO0VBRXZELEVBQUEsS0FBSyxJQUFJbEIsTUFBTSxHQUFHLElBQUksQ0FBQ0MsT0FBTyxFQUFFN04sQ0FBQyxHQUFHNE4sTUFBTSxDQUFDek8sTUFBTSxFQUFFMk8sU0FBUyxHQUFHLElBQUk5TCxLQUFLLENBQUNoQyxDQUFDLENBQUMsRUFBRXpFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3lFLENBQUMsRUFBRSxFQUFFekUsQ0FBQyxFQUFFO0VBQzlGLElBQUEsS0FBSyxJQUFJd1MsS0FBSyxHQUFHSCxNQUFNLENBQUNyUyxDQUFDLENBQUMsRUFBRVEsQ0FBQyxHQUFHZ1MsS0FBSyxDQUFDNU8sTUFBTSxFQUFFNk8sUUFBUSxHQUFHRixTQUFTLENBQUN2UyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUwUyxJQUFJLEVBQUU3TyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdyRCxDQUFDLEVBQUUsRUFBRXFELENBQUMsRUFBRTtRQUNuRyxJQUFJLENBQUM2TyxJQUFJLEdBQUdGLEtBQUssQ0FBQzNPLENBQUMsQ0FBQyxLQUFLMFAsS0FBSyxDQUFDdE4sSUFBSSxDQUFDeU0sSUFBSSxFQUFFQSxJQUFJLENBQUNFLFFBQVEsRUFBRS9PLENBQUMsRUFBRTJPLEtBQUssQ0FBQyxFQUFFO0VBQ2xFQyxRQUFBQSxRQUFRLENBQUMvTCxJQUFJLENBQUNnTSxJQUFJLENBQUM7RUFDckIsTUFBQTtFQUNGLElBQUE7RUFDRixFQUFBO0VBRUEsRUFBQSxPQUFPLElBQUltaUIsVUFBVSxDQUFDdGlCLFNBQVMsRUFBRSxJQUFJLENBQUNPLFFBQVEsRUFBRSxJQUFJLENBQUNnaUIsS0FBSyxFQUFFLElBQUksQ0FBQ3hCLEdBQUcsQ0FBQztFQUN2RTs7RUNiZSx5QkFBQSxFQUFTRSxVQUFVLEVBQUU7RUFDbEMsRUFBQSxJQUFJQSxVQUFVLENBQUNGLEdBQUcsS0FBSyxJQUFJLENBQUNBLEdBQUcsRUFBRSxNQUFNLElBQUk3akIsS0FBSyxFQUFBO0lBRWhELEtBQUssSUFBSWlILE9BQU8sR0FBRyxJQUFJLENBQUNwRSxPQUFPLEVBQUVxRSxPQUFPLEdBQUc2YyxVQUFVLENBQUNsaEIsT0FBTyxFQUFFc0UsRUFBRSxHQUFHRixPQUFPLENBQUM5UyxNQUFNLEVBQUVpVCxFQUFFLEdBQUdGLE9BQU8sQ0FBQy9TLE1BQU0sRUFBRWEsQ0FBQyxHQUFHMUQsSUFBSSxDQUFDZ0QsR0FBRyxDQUFDNlMsRUFBRSxFQUFFQyxFQUFFLENBQUMsRUFBRUMsTUFBTSxHQUFHLElBQUlyUSxLQUFLLENBQUNtUSxFQUFFLENBQUMsRUFBRTVXLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3lFLENBQUMsRUFBRSxFQUFFekUsQ0FBQyxFQUFFO01BQ3hLLEtBQUssSUFBSStXLE1BQU0sR0FBR0wsT0FBTyxDQUFDMVcsQ0FBQyxDQUFDLEVBQUVnWCxNQUFNLEdBQUdMLE9BQU8sQ0FBQzNXLENBQUMsQ0FBQyxFQUFFUSxDQUFDLEdBQUd1VyxNQUFNLENBQUNuVCxNQUFNLEVBQUUyUyxLQUFLLEdBQUdPLE1BQU0sQ0FBQzlXLENBQUMsQ0FBQyxHQUFHLElBQUl5RyxLQUFLLENBQUNqRyxDQUFDLENBQUMsRUFBRWtTLElBQUksRUFBRTdPLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3JELENBQUMsRUFBRSxFQUFFcUQsQ0FBQyxFQUFFO1FBQy9ILElBQUk2TyxJQUFJLEdBQUdxRSxNQUFNLENBQUNsVCxDQUFDLENBQUMsSUFBSW1ULE1BQU0sQ0FBQ25ULENBQUMsQ0FBQyxFQUFFO0VBQ2pDMFMsUUFBQUEsS0FBSyxDQUFDMVMsQ0FBQyxDQUFDLEdBQUc2TyxJQUFJO0VBQ2pCLE1BQUE7RUFDRixJQUFBO0VBQ0YsRUFBQTtFQUVBLEVBQUEsT0FBTzFTLENBQUMsR0FBRzRXLEVBQUUsRUFBRSxFQUFFNVcsQ0FBQyxFQUFFO0VBQ2xCOFcsSUFBQUEsTUFBTSxDQUFDOVcsQ0FBQyxDQUFDLEdBQUcwVyxPQUFPLENBQUMxVyxDQUFDLENBQUM7RUFDeEIsRUFBQTtFQUVBLEVBQUEsT0FBTyxJQUFJNjBCLFVBQVUsQ0FBQy9kLE1BQU0sRUFBRSxJQUFJLENBQUNoRSxRQUFRLEVBQUUsSUFBSSxDQUFDZ2lCLEtBQUssRUFBRSxJQUFJLENBQUN4QixHQUFHLENBQUM7RUFDcEU7O0VDaEJBLFNBQVM3RyxLQUFLQSxDQUFDOW1CLElBQUksRUFBRTtFQUNuQixFQUFBLE9BQU8sQ0FBQ0EsSUFBSSxHQUFHLEVBQUUsRUFBRW1LLElBQUksRUFBRSxDQUFDQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUNnbEIsS0FBSyxDQUFDLFVBQVNoeUIsQ0FBQyxFQUFFO0VBQ3pELElBQUEsSUFBSWMsQ0FBQyxHQUFHZCxDQUFDLENBQUNrTixPQUFPLENBQUMsR0FBRyxDQUFDO0VBQ3RCLElBQUEsSUFBSXBNLENBQUMsSUFBSSxDQUFDLEVBQUVkLENBQUMsR0FBR0EsQ0FBQyxDQUFDZ0UsS0FBSyxDQUFDLENBQUMsRUFBRWxELENBQUMsQ0FBQztFQUM3QixJQUFBLE9BQU8sQ0FBQ2QsQ0FBQyxJQUFJQSxDQUFDLEtBQUssT0FBTztFQUM1QixFQUFBLENBQUMsQ0FBQztFQUNKO0VBRUEsU0FBU2l5QixVQUFVQSxDQUFDMUMsRUFBRSxFQUFFM3NCLElBQUksRUFBRThWLFFBQVEsRUFBRTtFQUN0QyxFQUFBLElBQUl3WixHQUFHO01BQUVDLEdBQUc7TUFBRUMsR0FBRyxHQUFHMUksS0FBSyxDQUFDOW1CLElBQUksQ0FBQyxHQUFHMEIsSUFBSSxHQUFHa0osR0FBRztFQUM1QyxFQUFBLE9BQU8sWUFBVztFQUNoQixJQUFBLElBQUlzaUIsUUFBUSxHQUFHc0MsR0FBRyxDQUFDLElBQUksRUFBRTdDLEVBQUUsQ0FBQztRQUN4QnBpQixFQUFFLEdBQUcyaUIsUUFBUSxDQUFDM2lCLEVBQUU7O0VBRXBCO0VBQ0E7RUFDQTtNQUNBLElBQUlBLEVBQUUsS0FBSytrQixHQUFHLEVBQUUsQ0FBQ0MsR0FBRyxHQUFHLENBQUNELEdBQUcsR0FBRy9rQixFQUFFLEVBQUVNLElBQUksRUFBRSxFQUFFTixFQUFFLENBQUN2SyxJQUFJLEVBQUU4VixRQUFRLENBQUM7TUFFNURvWCxRQUFRLENBQUMzaUIsRUFBRSxHQUFHZ2xCLEdBQUc7SUFDbkIsQ0FBQztFQUNIO0VBRWUsc0JBQUEsRUFBU3Z2QixJQUFJLEVBQUU4VixRQUFRLEVBQUU7RUFDdEMsRUFBQSxJQUFJNlcsRUFBRSxHQUFHLElBQUksQ0FBQ2dCLEdBQUc7RUFFakIsRUFBQSxPQUFPaGtCLFNBQVMsQ0FBQzFMLE1BQU0sR0FBRyxDQUFDLEdBQ3JCME0sR0FBRyxDQUFDLElBQUksQ0FBQ29DLElBQUksRUFBRSxFQUFFNGYsRUFBRSxDQUFDLENBQUNwaUIsRUFBRSxDQUFDQSxFQUFFLENBQUN2SyxJQUFJLENBQUMsR0FDaEMsSUFBSSxDQUFDd1MsSUFBSSxDQUFDNmMsVUFBVSxDQUFDMUMsRUFBRSxFQUFFM3NCLElBQUksRUFBRThWLFFBQVEsQ0FBQyxDQUFDO0VBQ2pEOztFQy9CQSxTQUFTMlosY0FBY0EsQ0FBQzlDLEVBQUUsRUFBRTtFQUMxQixFQUFBLE9BQU8sWUFBVztFQUNoQixJQUFBLElBQUluZSxNQUFNLEdBQUcsSUFBSSxDQUFDK0MsVUFBVTtFQUM1QixJQUFBLEtBQUssSUFBSXJULENBQUMsSUFBSSxJQUFJLENBQUM0dUIsWUFBWSxFQUFFLElBQUksQ0FBQzV1QixDQUFDLEtBQUt5dUIsRUFBRSxFQUFFO0VBQ2hELElBQUEsSUFBSW5lLE1BQU0sRUFBRUEsTUFBTSxDQUFDK0csV0FBVyxDQUFDLElBQUksQ0FBQztJQUN0QyxDQUFDO0VBQ0g7RUFFZSwwQkFBQSxJQUFXO0VBQ3hCLEVBQUEsT0FBTyxJQUFJLENBQUNoTCxFQUFFLENBQUMsWUFBWSxFQUFFa2xCLGNBQWMsQ0FBQyxJQUFJLENBQUM5QixHQUFHLENBQUMsQ0FBQztFQUN4RDs7RUNOZSwwQkFBQSxFQUFTbGhCLE1BQU0sRUFBRTtFQUM5QixFQUFBLElBQUl6TSxJQUFJLEdBQUcsSUFBSSxDQUFDbXZCLEtBQUs7TUFDakJ4QyxFQUFFLEdBQUcsSUFBSSxDQUFDZ0IsR0FBRztJQUVqQixJQUFJLE9BQU9saEIsTUFBTSxLQUFLLFVBQVUsRUFBRUEsTUFBTSxHQUFHRixRQUFRLENBQUNFLE1BQU0sQ0FBQztFQUUzRCxFQUFBLEtBQUssSUFBSUMsTUFBTSxHQUFHLElBQUksQ0FBQ0MsT0FBTyxFQUFFN04sQ0FBQyxHQUFHNE4sTUFBTSxDQUFDek8sTUFBTSxFQUFFMk8sU0FBUyxHQUFHLElBQUk5TCxLQUFLLENBQUNoQyxDQUFDLENBQUMsRUFBRXpFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3lFLENBQUMsRUFBRSxFQUFFekUsQ0FBQyxFQUFFO0VBQzlGLElBQUEsS0FBSyxJQUFJd1MsS0FBSyxHQUFHSCxNQUFNLENBQUNyUyxDQUFDLENBQUMsRUFBRVEsQ0FBQyxHQUFHZ1MsS0FBSyxDQUFDNU8sTUFBTSxFQUFFNk8sUUFBUSxHQUFHRixTQUFTLENBQUN2UyxDQUFDLENBQUMsR0FBRyxJQUFJeUcsS0FBSyxDQUFDakcsQ0FBQyxDQUFDLEVBQUVrUyxJQUFJLEVBQUVDLE9BQU8sRUFBRTlPLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR3JELENBQUMsRUFBRSxFQUFFcUQsQ0FBQyxFQUFFO1FBQ3RILElBQUksQ0FBQzZPLElBQUksR0FBR0YsS0FBSyxDQUFDM08sQ0FBQyxDQUFDLE1BQU04TyxPQUFPLEdBQUdQLE1BQU0sQ0FBQ25NLElBQUksQ0FBQ3lNLElBQUksRUFBRUEsSUFBSSxDQUFDRSxRQUFRLEVBQUUvTyxDQUFDLEVBQUUyTyxLQUFLLENBQUMsQ0FBQyxFQUFFO1VBQy9FLElBQUksVUFBVSxJQUFJRSxJQUFJLEVBQUVDLE9BQU8sQ0FBQ0MsUUFBUSxHQUFHRixJQUFJLENBQUNFLFFBQVE7RUFDeERILFFBQUFBLFFBQVEsQ0FBQzVPLENBQUMsQ0FBQyxHQUFHOE8sT0FBTztVQUNyQmtnQixRQUFRLENBQUNwZ0IsUUFBUSxDQUFDNU8sQ0FBQyxDQUFDLEVBQUU4QixJQUFJLEVBQUUyc0IsRUFBRSxFQUFFenVCLENBQUMsRUFBRTRPLFFBQVEsRUFBRW5DLEdBQUcsQ0FBQ29DLElBQUksRUFBRTRmLEVBQUUsQ0FBQyxDQUFDO0VBQzdELE1BQUE7RUFDRixJQUFBO0VBQ0YsRUFBQTtFQUVBLEVBQUEsT0FBTyxJQUFJdUMsVUFBVSxDQUFDdGlCLFNBQVMsRUFBRSxJQUFJLENBQUNPLFFBQVEsRUFBRW5OLElBQUksRUFBRTJzQixFQUFFLENBQUM7RUFDM0Q7O0VDakJlLDZCQUFBLEVBQVNsZ0IsTUFBTSxFQUFFO0VBQzlCLEVBQUEsSUFBSXpNLElBQUksR0FBRyxJQUFJLENBQUNtdkIsS0FBSztNQUNqQnhDLEVBQUUsR0FBRyxJQUFJLENBQUNnQixHQUFHO0lBRWpCLElBQUksT0FBT2xoQixNQUFNLEtBQUssVUFBVSxFQUFFQSxNQUFNLEdBQUdhLFdBQVcsQ0FBQ2IsTUFBTSxDQUFDO0VBRTlELEVBQUEsS0FBSyxJQUFJQyxNQUFNLEdBQUcsSUFBSSxDQUFDQyxPQUFPLEVBQUU3TixDQUFDLEdBQUc0TixNQUFNLENBQUN6TyxNQUFNLEVBQUUyTyxTQUFTLEdBQUcsRUFBRSxFQUFFVyxPQUFPLEdBQUcsRUFBRSxFQUFFbFQsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHeUUsQ0FBQyxFQUFFLEVBQUV6RSxDQUFDLEVBQUU7TUFDbEcsS0FBSyxJQUFJd1MsS0FBSyxHQUFHSCxNQUFNLENBQUNyUyxDQUFDLENBQUMsRUFBRVEsQ0FBQyxHQUFHZ1MsS0FBSyxDQUFDNU8sTUFBTSxFQUFFOE8sSUFBSSxFQUFFN08sQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHckQsQ0FBQyxFQUFFLEVBQUVxRCxDQUFDLEVBQUU7RUFDckUsTUFBQSxJQUFJNk8sSUFBSSxHQUFHRixLQUFLLENBQUMzTyxDQUFDLENBQUMsRUFBRTtVQUNuQixLQUFLLElBQUkyUCxRQUFRLEdBQUdwQixNQUFNLENBQUNuTSxJQUFJLENBQUN5TSxJQUFJLEVBQUVBLElBQUksQ0FBQ0UsUUFBUSxFQUFFL08sQ0FBQyxFQUFFMk8sS0FBSyxDQUFDLEVBQUVnQyxLQUFLLEVBQUU2Z0IsT0FBTyxHQUFHL2tCLEdBQUcsQ0FBQ29DLElBQUksRUFBRTRmLEVBQUUsQ0FBQyxFQUFFM3hCLENBQUMsR0FBRyxDQUFDLEVBQUU2RixDQUFDLEdBQUdnTixRQUFRLENBQUM1UCxNQUFNLEVBQUVqRCxDQUFDLEdBQUc2RixDQUFDLEVBQUUsRUFBRTdGLENBQUMsRUFBRTtFQUN0SSxVQUFBLElBQUk2VCxLQUFLLEdBQUdoQixRQUFRLENBQUM3UyxDQUFDLENBQUMsRUFBRTtFQUN2Qmt5QixZQUFBQSxRQUFRLENBQUNyZSxLQUFLLEVBQUU3TyxJQUFJLEVBQUUyc0IsRUFBRSxFQUFFM3hCLENBQUMsRUFBRTZTLFFBQVEsRUFBRTZoQixPQUFPLENBQUM7RUFDakQsVUFBQTtFQUNGLFFBQUE7RUFDQTlpQixRQUFBQSxTQUFTLENBQUM3TCxJQUFJLENBQUM4TSxRQUFRLENBQUM7RUFDeEJOLFFBQUFBLE9BQU8sQ0FBQ3hNLElBQUksQ0FBQ2dNLElBQUksQ0FBQztFQUNwQixNQUFBO0VBQ0YsSUFBQTtFQUNGLEVBQUE7SUFFQSxPQUFPLElBQUltaUIsVUFBVSxDQUFDdGlCLFNBQVMsRUFBRVcsT0FBTyxFQUFFdk4sSUFBSSxFQUFFMnNCLEVBQUUsQ0FBQztFQUNyRDs7RUN2QkEsSUFBSXpmLFNBQVMsR0FBR3VELFNBQVMsQ0FBQ3JRLFNBQVMsQ0FBQ1ksV0FBVztFQUVoQyw2QkFBQSxJQUFXO0lBQ3hCLE9BQU8sSUFBSWtNLFNBQVMsQ0FBQyxJQUFJLENBQUNQLE9BQU8sRUFBRSxJQUFJLENBQUNRLFFBQVEsQ0FBQztFQUNuRDs7RUNBQSxTQUFTd2lCLFNBQVNBLENBQUMzdkIsSUFBSSxFQUFFaXVCLFdBQVcsRUFBRTtFQUNwQyxFQUFBLElBQUlDLFFBQVEsRUFDUkksUUFBUSxFQUNSRixZQUFZO0VBQ2hCLEVBQUEsT0FBTyxZQUFXO0VBQ2hCLElBQUEsSUFBSUMsT0FBTyxHQUFHMWIsVUFBSyxDQUFDLElBQUksRUFBRTNTLElBQUksQ0FBQztFQUMzQm11QixNQUFBQSxPQUFPLElBQUksSUFBSSxDQUFDeGIsS0FBSyxDQUFDQyxjQUFjLENBQUM1UyxJQUFJLENBQUMsRUFBRTJTLFVBQUssQ0FBQyxJQUFJLEVBQUUzUyxJQUFJLENBQUMsQ0FBQztNQUNsRSxPQUFPcXVCLE9BQU8sS0FBS0YsT0FBTyxHQUFHLElBQUksR0FDM0JFLE9BQU8sS0FBS0gsUUFBUSxJQUFJQyxPQUFPLEtBQUtHLFFBQVEsR0FBR0YsWUFBWSxHQUMzREEsWUFBWSxHQUFHSCxXQUFXLENBQUNDLFFBQVEsR0FBR0csT0FBTyxFQUFFQyxRQUFRLEdBQUdILE9BQU8sQ0FBQztJQUMxRSxDQUFDO0VBQ0g7RUFFQSxTQUFTemIsV0FBV0EsQ0FBQzFTLElBQUksRUFBRTtFQUN6QixFQUFBLE9BQU8sWUFBVztFQUNoQixJQUFBLElBQUksQ0FBQzJTLEtBQUssQ0FBQ0MsY0FBYyxDQUFDNVMsSUFBSSxDQUFDO0lBQ2pDLENBQUM7RUFDSDtFQUVBLFNBQVM2UyxhQUFhQSxDQUFDN1MsSUFBSSxFQUFFaXVCLFdBQVcsRUFBRTFrQixNQUFNLEVBQUU7RUFDaEQsRUFBQSxJQUFJMmtCLFFBQVE7TUFDUkMsT0FBTyxHQUFHNWtCLE1BQU0sR0FBRyxFQUFFO01BQ3JCNmtCLFlBQVk7RUFDaEIsRUFBQSxPQUFPLFlBQVc7RUFDaEIsSUFBQSxJQUFJQyxPQUFPLEdBQUcxYixVQUFLLENBQUMsSUFBSSxFQUFFM1MsSUFBSSxDQUFDO01BQy9CLE9BQU9xdUIsT0FBTyxLQUFLRixPQUFPLEdBQUcsSUFBSSxHQUMzQkUsT0FBTyxLQUFLSCxRQUFRLEdBQUdFLFlBQVksR0FDbkNBLFlBQVksR0FBR0gsV0FBVyxDQUFDQyxRQUFRLEdBQUdHLE9BQU8sRUFBRTlrQixNQUFNLENBQUM7SUFDOUQsQ0FBQztFQUNIO0VBRUEsU0FBU3lKLGFBQWFBLENBQUNoVCxJQUFJLEVBQUVpdUIsV0FBVyxFQUFFL3FCLEtBQUssRUFBRTtFQUMvQyxFQUFBLElBQUlnckIsUUFBUSxFQUNSSSxRQUFRLEVBQ1JGLFlBQVk7RUFDaEIsRUFBQSxPQUFPLFlBQVc7RUFDaEIsSUFBQSxJQUFJQyxPQUFPLEdBQUcxYixVQUFLLENBQUMsSUFBSSxFQUFFM1MsSUFBSSxDQUFDO0VBQzNCdUosTUFBQUEsTUFBTSxHQUFHckcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUNwQmlyQixPQUFPLEdBQUc1a0IsTUFBTSxHQUFHLEVBQUU7TUFDekIsSUFBSUEsTUFBTSxJQUFJLElBQUksRUFBRTRrQixPQUFPLEdBQUc1a0IsTUFBTSxJQUFJLElBQUksQ0FBQ29KLEtBQUssQ0FBQ0MsY0FBYyxDQUFDNVMsSUFBSSxDQUFDLEVBQUUyUyxVQUFLLENBQUMsSUFBSSxFQUFFM1MsSUFBSSxDQUFDLENBQUM7RUFDM0YsSUFBQSxPQUFPcXVCLE9BQU8sS0FBS0YsT0FBTyxHQUFHLElBQUksR0FDM0JFLE9BQU8sS0FBS0gsUUFBUSxJQUFJQyxPQUFPLEtBQUtHLFFBQVEsR0FBR0YsWUFBWSxJQUMxREUsUUFBUSxHQUFHSCxPQUFPLEVBQUVDLFlBQVksR0FBR0gsV0FBVyxDQUFDQyxRQUFRLEdBQUdHLE9BQU8sRUFBRTlrQixNQUFNLENBQUMsQ0FBQztJQUNwRixDQUFDO0VBQ0g7RUFFQSxTQUFTcW1CLGdCQUFnQkEsQ0FBQ2pELEVBQUUsRUFBRTNzQixJQUFJLEVBQUU7RUFDbEMsRUFBQSxJQUFJc3ZCLEdBQUc7TUFBRUMsR0FBRztNQUFFTSxTQUFTO01BQUV2Z0IsR0FBRyxHQUFHLFFBQVEsR0FBR3RQLElBQUk7TUFBRStWLEtBQUssR0FBRyxNQUFNLEdBQUd6RyxHQUFHO01BQUVxQixNQUFNO0VBQzVFLEVBQUEsT0FBTyxZQUFXO0VBQ2hCLElBQUEsSUFBSXVjLFFBQVEsR0FBR3RpQixHQUFHLENBQUMsSUFBSSxFQUFFK2hCLEVBQUUsQ0FBQztRQUN4QnBpQixFQUFFLEdBQUcyaUIsUUFBUSxDQUFDM2lCLEVBQUU7UUFDaEJ1TCxRQUFRLEdBQUdvWCxRQUFRLENBQUNocUIsS0FBSyxDQUFDb00sR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHcUIsTUFBTSxLQUFLQSxNQUFNLEdBQUcrQixXQUFXLENBQUMxUyxJQUFJLENBQUMsQ0FBQyxHQUFHZ0QsU0FBUzs7RUFFL0Y7RUFDQTtFQUNBO01BQ0EsSUFBSXVILEVBQUUsS0FBSytrQixHQUFHLElBQUlPLFNBQVMsS0FBSy9aLFFBQVEsRUFBRSxDQUFDeVosR0FBRyxHQUFHLENBQUNELEdBQUcsR0FBRy9rQixFQUFFLEVBQUVNLElBQUksRUFBRSxFQUFFTixFQUFFLENBQUN3TCxLQUFLLEVBQUU4WixTQUFTLEdBQUcvWixRQUFRLENBQUM7TUFFbkdvWCxRQUFRLENBQUMzaUIsRUFBRSxHQUFHZ2xCLEdBQUc7SUFDbkIsQ0FBQztFQUNIO0VBRWUsMkJBQVN2dkIsSUFBSSxFQUFFa0QsS0FBSyxFQUFFNFAsUUFBUSxFQUFFO0lBQzdDLElBQUk1VSxDQUFDLEdBQUcsQ0FBQzhCLElBQUksSUFBSSxFQUFFLE1BQU0sV0FBVyxHQUFHaXBCLHVCQUFvQixHQUFHZ0YsV0FBVztJQUN6RSxPQUFPL3FCLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUN0QjRzQixVQUFVLENBQUM5dkIsSUFBSSxFQUFFMnZCLFNBQVMsQ0FBQzN2QixJQUFJLEVBQUU5QixDQUFDLENBQUMsQ0FBQyxDQUNwQ3FNLEVBQUUsQ0FBQyxZQUFZLEdBQUd2SyxJQUFJLEVBQUUwUyxXQUFXLENBQUMxUyxJQUFJLENBQUMsQ0FBQyxHQUMzQyxPQUFPa0QsS0FBSyxLQUFLLFVBQVUsR0FBRyxJQUFJLENBQ2pDNHNCLFVBQVUsQ0FBQzl2QixJQUFJLEVBQUVnVCxhQUFhLENBQUNoVCxJQUFJLEVBQUU5QixDQUFDLEVBQUUwdkIsVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLEdBQUc1dEIsSUFBSSxFQUFFa0QsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUNsRnNQLElBQUksQ0FBQ29kLGdCQUFnQixDQUFDLElBQUksQ0FBQ2pDLEdBQUcsRUFBRTN0QixJQUFJLENBQUMsQ0FBQyxHQUN2QyxJQUFJLENBQ0g4dkIsVUFBVSxDQUFDOXZCLElBQUksRUFBRTZTLGFBQWEsQ0FBQzdTLElBQUksRUFBRTlCLENBQUMsRUFBRWdGLEtBQUssQ0FBQyxFQUFFNFAsUUFBUSxDQUFDLENBQ3pEdkksRUFBRSxDQUFDLFlBQVksR0FBR3ZLLElBQUksRUFBRSxJQUFJLENBQUM7RUFDcEM7O0VDL0VBLFNBQVMrdkIsZ0JBQWdCQSxDQUFDL3ZCLElBQUksRUFBRTlCLENBQUMsRUFBRTRVLFFBQVEsRUFBRTtJQUMzQyxPQUFPLFVBQVMxVixDQUFDLEVBQUU7RUFDakIsSUFBQSxJQUFJLENBQUN1VixLQUFLLENBQUNJLFdBQVcsQ0FBQy9TLElBQUksRUFBRTlCLENBQUMsQ0FBQ29DLElBQUksQ0FBQyxJQUFJLEVBQUVsRCxDQUFDLENBQUMsRUFBRTBWLFFBQVEsQ0FBQztJQUN6RCxDQUFDO0VBQ0g7RUFFQSxTQUFTZ2QsVUFBVUEsQ0FBQzl2QixJQUFJLEVBQUVrRCxLQUFLLEVBQUU0UCxRQUFRLEVBQUU7SUFDekMsSUFBSTFWLENBQUMsRUFBRWdNLEVBQUU7SUFDVCxTQUFTMmpCLEtBQUtBLEdBQUc7TUFDZixJQUFJN3VCLENBQUMsR0FBR2dGLEtBQUssQ0FBQzhILEtBQUssQ0FBQyxJQUFJLEVBQUVyQixTQUFTLENBQUM7RUFDcEMsSUFBQSxJQUFJekwsQ0FBQyxLQUFLa0wsRUFBRSxFQUFFaE0sQ0FBQyxHQUFHLENBQUNnTSxFQUFFLEdBQUdsTCxDQUFDLEtBQUs2eEIsZ0JBQWdCLENBQUMvdkIsSUFBSSxFQUFFOUIsQ0FBQyxFQUFFNFUsUUFBUSxDQUFDO0VBQ2pFLElBQUEsT0FBTzFWLENBQUM7RUFDVixFQUFBO0lBQ0EydkIsS0FBSyxDQUFDNEIsTUFBTSxHQUFHenJCLEtBQUs7RUFDcEIsRUFBQSxPQUFPNnBCLEtBQUs7RUFDZDtFQUVlLGdDQUFTL3NCLElBQUksRUFBRWtELEtBQUssRUFBRTRQLFFBQVEsRUFBRTtFQUM3QyxFQUFBLElBQUl4RCxHQUFHLEdBQUcsUUFBUSxJQUFJdFAsSUFBSSxJQUFJLEVBQUUsQ0FBQztFQUNqQyxFQUFBLElBQUkySixTQUFTLENBQUMxTCxNQUFNLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQ3FSLEdBQUcsR0FBRyxJQUFJLENBQUN5ZCxLQUFLLENBQUN6ZCxHQUFHLENBQUMsS0FBS0EsR0FBRyxDQUFDcWYsTUFBTTtFQUN0RSxFQUFBLElBQUl6ckIsS0FBSyxJQUFJLElBQUksRUFBRSxPQUFPLElBQUksQ0FBQzZwQixLQUFLLENBQUN6ZCxHQUFHLEVBQUUsSUFBSSxDQUFDO0lBQy9DLElBQUksT0FBT3BNLEtBQUssS0FBSyxVQUFVLEVBQUUsTUFBTSxJQUFJNEcsS0FBSyxFQUFBO0lBQ2hELE9BQU8sSUFBSSxDQUFDaWpCLEtBQUssQ0FBQ3pkLEdBQUcsRUFBRXdnQixVQUFVLENBQUM5dkIsSUFBSSxFQUFFa0QsS0FBSyxFQUFFNFAsUUFBUSxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUdBLFFBQVEsQ0FBQyxDQUFDO0VBQ25GOztFQ3JCQSxTQUFTNEIsWUFBWUEsQ0FBQ3hSLEtBQUssRUFBRTtFQUMzQixFQUFBLE9BQU8sWUFBVztNQUNoQixJQUFJLENBQUN1UixXQUFXLEdBQUd2UixLQUFLO0lBQzFCLENBQUM7RUFDSDtFQUVBLFNBQVN5UixZQUFZQSxDQUFDelIsS0FBSyxFQUFFO0VBQzNCLEVBQUEsT0FBTyxZQUFXO0VBQ2hCLElBQUEsSUFBSXFHLE1BQU0sR0FBR3JHLEtBQUssQ0FBQyxJQUFJLENBQUM7TUFDeEIsSUFBSSxDQUFDdVIsV0FBVyxHQUFHbEwsTUFBTSxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUdBLE1BQU07SUFDakQsQ0FBQztFQUNIO0VBRWUsd0JBQUEsRUFBU3JHLEtBQUssRUFBRTtFQUM3QixFQUFBLE9BQU8sSUFBSSxDQUFDNnBCLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTzdwQixLQUFLLEtBQUssVUFBVSxHQUMvQ3lSLFlBQVksQ0FBQ2laLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFMXFCLEtBQUssQ0FBQyxDQUFDLEdBQzdDd1IsWUFBWSxDQUFDeFIsS0FBSyxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUdBLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztFQUN0RDs7RUNuQkEsU0FBUzhzQixlQUFlQSxDQUFDOXhCLENBQUMsRUFBRTtJQUMxQixPQUFPLFVBQVNkLENBQUMsRUFBRTtNQUNqQixJQUFJLENBQUNxWCxXQUFXLEdBQUd2VyxDQUFDLENBQUNvQyxJQUFJLENBQUMsSUFBSSxFQUFFbEQsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7RUFDSDtFQUVBLFNBQVM2eUIsU0FBU0EsQ0FBQy9zQixLQUFLLEVBQUU7SUFDeEIsSUFBSXlvQixFQUFFLEVBQUV2aUIsRUFBRTtJQUNWLFNBQVMyakIsS0FBS0EsR0FBRztNQUNmLElBQUk3dUIsQ0FBQyxHQUFHZ0YsS0FBSyxDQUFDOEgsS0FBSyxDQUFDLElBQUksRUFBRXJCLFNBQVMsQ0FBQztFQUNwQyxJQUFBLElBQUl6TCxDQUFDLEtBQUtrTCxFQUFFLEVBQUV1aUIsRUFBRSxHQUFHLENBQUN2aUIsRUFBRSxHQUFHbEwsQ0FBQyxLQUFLOHhCLGVBQWUsQ0FBQzl4QixDQUFDLENBQUM7RUFDakQsSUFBQSxPQUFPeXRCLEVBQUU7RUFDWCxFQUFBO0lBQ0FvQixLQUFLLENBQUM0QixNQUFNLEdBQUd6ckIsS0FBSztFQUNwQixFQUFBLE9BQU82cEIsS0FBSztFQUNkO0VBRWUsNkJBQUEsRUFBUzdwQixLQUFLLEVBQUU7SUFDN0IsSUFBSW9NLEdBQUcsR0FBRyxNQUFNO0VBQ2hCLEVBQUEsSUFBSTNGLFNBQVMsQ0FBQzFMLE1BQU0sR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDcVIsR0FBRyxHQUFHLElBQUksQ0FBQ3lkLEtBQUssQ0FBQ3pkLEdBQUcsQ0FBQyxLQUFLQSxHQUFHLENBQUNxZixNQUFNO0VBQ3RFLEVBQUEsSUFBSXpyQixLQUFLLElBQUksSUFBSSxFQUFFLE9BQU8sSUFBSSxDQUFDNnBCLEtBQUssQ0FBQ3pkLEdBQUcsRUFBRSxJQUFJLENBQUM7SUFDL0MsSUFBSSxPQUFPcE0sS0FBSyxLQUFLLFVBQVUsRUFBRSxNQUFNLElBQUk0RyxLQUFLLEVBQUE7SUFDaEQsT0FBTyxJQUFJLENBQUNpakIsS0FBSyxDQUFDemQsR0FBRyxFQUFFMmdCLFNBQVMsQ0FBQy9zQixLQUFLLENBQUMsQ0FBQztFQUMxQzs7RUNwQmUsOEJBQUEsSUFBVztFQUN4QixFQUFBLElBQUlsRCxJQUFJLEdBQUcsSUFBSSxDQUFDbXZCLEtBQUs7TUFDakJlLEdBQUcsR0FBRyxJQUFJLENBQUN2QyxHQUFHO01BQ2R3QyxHQUFHLEdBQUdDLEtBQUssRUFBRTtJQUVqQixLQUFLLElBQUkxakIsTUFBTSxHQUFHLElBQUksQ0FBQ0MsT0FBTyxFQUFFN04sQ0FBQyxHQUFHNE4sTUFBTSxDQUFDek8sTUFBTSxFQUFFNUQsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHeUUsQ0FBQyxFQUFFLEVBQUV6RSxDQUFDLEVBQUU7TUFDcEUsS0FBSyxJQUFJd1MsS0FBSyxHQUFHSCxNQUFNLENBQUNyUyxDQUFDLENBQUMsRUFBRVEsQ0FBQyxHQUFHZ1MsS0FBSyxDQUFDNU8sTUFBTSxFQUFFOE8sSUFBSSxFQUFFN08sQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHckQsQ0FBQyxFQUFFLEVBQUVxRCxDQUFDLEVBQUU7RUFDckUsTUFBQSxJQUFJNk8sSUFBSSxHQUFHRixLQUFLLENBQUMzTyxDQUFDLENBQUMsRUFBRTtFQUNuQixRQUFBLElBQUl3eEIsT0FBTyxHQUFHL2tCLEdBQUcsQ0FBQ29DLElBQUksRUFBRW1qQixHQUFHLENBQUM7VUFDNUJoRCxRQUFRLENBQUNuZ0IsSUFBSSxFQUFFL00sSUFBSSxFQUFFbXdCLEdBQUcsRUFBRWp5QixDQUFDLEVBQUUyTyxLQUFLLEVBQUU7WUFDbEN1ZSxJQUFJLEVBQUVzRSxPQUFPLENBQUN0RSxJQUFJLEdBQUdzRSxPQUFPLENBQUN2RSxLQUFLLEdBQUd1RSxPQUFPLENBQUMxQyxRQUFRO0VBQ3JEN0IsVUFBQUEsS0FBSyxFQUFFLENBQUM7WUFDUjZCLFFBQVEsRUFBRTBDLE9BQU8sQ0FBQzFDLFFBQVE7WUFDMUJDLElBQUksRUFBRXlDLE9BQU8sQ0FBQ3pDO0VBQ2hCLFNBQUMsQ0FBQztFQUNKLE1BQUE7RUFDRixJQUFBO0VBQ0YsRUFBQTtFQUVBLEVBQUEsT0FBTyxJQUFJaUMsVUFBVSxDQUFDeGlCLE1BQU0sRUFBRSxJQUFJLENBQUNTLFFBQVEsRUFBRW5OLElBQUksRUFBRW13QixHQUFHLENBQUM7RUFDekQ7O0VDckJlLHVCQUFBLElBQVc7RUFDeEIsRUFBQSxJQUFJYixHQUFHO01BQUVDLEdBQUc7RUFBRXprQixJQUFBQSxJQUFJLEdBQUcsSUFBSTtNQUFFNmhCLEVBQUUsR0FBRzdoQixJQUFJLENBQUM2aUIsR0FBRztFQUFFaHZCLElBQUFBLElBQUksR0FBR21NLElBQUksQ0FBQ25NLElBQUksRUFBRTtFQUM1RCxFQUFBLE9BQU8sSUFBSTB4QixPQUFPLENBQUMsVUFBU0MsT0FBTyxFQUFFQyxNQUFNLEVBQUU7RUFDM0MsSUFBQSxJQUFJQyxNQUFNLEdBQUc7RUFBQ3R0QixRQUFBQSxLQUFLLEVBQUVxdEI7U0FBTztFQUN4QnhKLE1BQUFBLEdBQUcsR0FBRztVQUFDN2pCLEtBQUssRUFBRSxZQUFXO0VBQUUsVUFBQSxJQUFJLEVBQUV2RSxJQUFJLEtBQUssQ0FBQyxFQUFFMnhCLE9BQU8sRUFBRTtFQUFFLFFBQUE7U0FBRTtNQUU5RHhsQixJQUFJLENBQUMwSCxJQUFJLENBQUMsWUFBVztFQUNuQixNQUFBLElBQUkwYSxRQUFRLEdBQUd0aUIsR0FBRyxDQUFDLElBQUksRUFBRStoQixFQUFFLENBQUM7VUFDeEJwaUIsRUFBRSxHQUFHMmlCLFFBQVEsQ0FBQzNpQixFQUFFOztFQUVwQjtFQUNBO0VBQ0E7UUFDQSxJQUFJQSxFQUFFLEtBQUsra0IsR0FBRyxFQUFFO1VBQ2RDLEdBQUcsR0FBRyxDQUFDRCxHQUFHLEdBQUcva0IsRUFBRSxFQUFFTSxJQUFJLEVBQUU7VUFDdkIwa0IsR0FBRyxDQUFDM2xCLENBQUMsQ0FBQzRtQixNQUFNLENBQUN6dkIsSUFBSSxDQUFDeXZCLE1BQU0sQ0FBQztVQUN6QmpCLEdBQUcsQ0FBQzNsQixDQUFDLENBQUMwakIsU0FBUyxDQUFDdnNCLElBQUksQ0FBQ3l2QixNQUFNLENBQUM7VUFDNUJqQixHQUFHLENBQUMzbEIsQ0FBQyxDQUFDbWQsR0FBRyxDQUFDaG1CLElBQUksQ0FBQ2dtQixHQUFHLENBQUM7RUFDckIsTUFBQTtRQUVBbUcsUUFBUSxDQUFDM2lCLEVBQUUsR0FBR2dsQixHQUFHO0VBQ25CLElBQUEsQ0FBQyxDQUFDOztFQUVGO0VBQ0EsSUFBQSxJQUFJNXdCLElBQUksS0FBSyxDQUFDLEVBQUUyeEIsT0FBTyxFQUFFO0VBQzNCLEVBQUEsQ0FBQyxDQUFDO0VBQ0o7O0VDTkEsSUFBSTNELEVBQUUsR0FBRyxDQUFDO0VBRUgsU0FBU3VDLFVBQVVBLENBQUN4aUIsTUFBTSxFQUFFYSxPQUFPLEVBQUV2TixJQUFJLEVBQUUyc0IsRUFBRSxFQUFFO0lBQ3BELElBQUksQ0FBQ2hnQixPQUFPLEdBQUdELE1BQU07SUFDckIsSUFBSSxDQUFDUyxRQUFRLEdBQUdJLE9BQU87SUFDdkIsSUFBSSxDQUFDNGhCLEtBQUssR0FBR252QixJQUFJO0lBQ2pCLElBQUksQ0FBQzJ0QixHQUFHLEdBQUdoQixFQUFFO0VBQ2Y7RUFNTyxTQUFTeUQsS0FBS0EsR0FBRztFQUN0QixFQUFBLE9BQU8sRUFBRXpELEVBQUU7RUFDYjtFQUVBLElBQUk4RCxtQkFBbUIsR0FBR2hnQixTQUFTLENBQUNyUSxTQUFTO0VBRTdDOHVCLFVBQVUsQ0FBQzl1QixTQUFTLEdBQTBCO0VBQzVDWSxFQUFBQSxXQUFXLEVBQUVrdUIsVUFBVTtFQUN2QnppQixFQUFBQSxNQUFNLEVBQUVpa0IsaUJBQWlCO0VBQ3pCeGlCLEVBQUFBLFNBQVMsRUFBRXlpQixvQkFBb0I7SUFDL0J4WixXQUFXLEVBQUVzWixtQkFBbUIsQ0FBQ3RaLFdBQVc7SUFDNUNFLGNBQWMsRUFBRW9aLG1CQUFtQixDQUFDcFosY0FBYztFQUNsRHJKLEVBQUFBLE1BQU0sRUFBRTRpQixpQkFBaUI7RUFDekJoZ0IsRUFBQUEsS0FBSyxFQUFFaWdCLGdCQUFnQjtFQUN2QnBnQixFQUFBQSxTQUFTLEVBQUVxZ0Isb0JBQW9CO0VBQy9CakQsRUFBQUEsVUFBVSxFQUFFa0QscUJBQXFCO0lBQ2pDendCLElBQUksRUFBRW13QixtQkFBbUIsQ0FBQ253QixJQUFJO0lBQzlCMFgsS0FBSyxFQUFFeVksbUJBQW1CLENBQUN6WSxLQUFLO0lBQ2hDakwsSUFBSSxFQUFFMGpCLG1CQUFtQixDQUFDMWpCLElBQUk7SUFDOUJwTyxJQUFJLEVBQUU4eEIsbUJBQW1CLENBQUM5eEIsSUFBSTtJQUM5QnVCLEtBQUssRUFBRXV3QixtQkFBbUIsQ0FBQ3Z3QixLQUFLO0lBQ2hDc1MsSUFBSSxFQUFFaWUsbUJBQW1CLENBQUNqZSxJQUFJO0VBQzlCakksRUFBQUEsRUFBRSxFQUFFeW1CLGFBQWE7RUFDakIxWSxFQUFBQSxJQUFJLEVBQUUyWSxlQUFlO0VBQ3JCMUMsRUFBQUEsU0FBUyxFQUFFMkMsb0JBQW9CO0VBQy9CdmUsRUFBQUEsS0FBSyxFQUFFd2UsZ0JBQWdCO0VBQ3ZCckIsRUFBQUEsVUFBVSxFQUFFc0IscUJBQXFCO0VBQ2pDeFksRUFBQUEsSUFBSSxFQUFFeVksZUFBZTtFQUNyQnBCLEVBQUFBLFNBQVMsRUFBRXFCLG9CQUFvQjtFQUMvQjNnQixFQUFBQSxNQUFNLEVBQUU0Z0IsaUJBQWlCO0VBQ3pCeEUsRUFBQUEsS0FBSyxFQUFFeUUsZ0JBQWdCO0VBQ3ZCckcsRUFBQUEsS0FBSyxFQUFFc0csZ0JBQWdCO0VBQ3ZCekUsRUFBQUEsUUFBUSxFQUFFMEUsbUJBQW1CO0VBQzdCekUsRUFBQUEsSUFBSSxFQUFFMEUsZUFBZTtFQUNyQjFDLEVBQUFBLFdBQVcsRUFBRTJDLHNCQUFzQjtFQUNuQzdLLEVBQUFBLEdBQUcsRUFBRThLLGNBQWM7SUFDbkIsQ0FBQ25ZLE1BQU0sQ0FBQ0MsUUFBUSxHQUFHOFcsbUJBQW1CLENBQUMvVyxNQUFNLENBQUNDLFFBQVE7RUFDeEQsQ0FBQzs7RUNoRU0sU0FBU21ZLFVBQVVBLENBQUMxMEIsQ0FBQyxFQUFFO0lBQzVCLE9BQU8sQ0FBQyxDQUFDQSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBR0EsQ0FBQyxHQUFHQSxDQUFDLEdBQUdBLENBQUMsR0FBRyxDQUFDQSxDQUFDLElBQUksQ0FBQyxJQUFJQSxDQUFDLEdBQUdBLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztFQUMvRDs7RUNMQSxJQUFJMjBCLGFBQWEsR0FBRztFQUNsQjNHLEVBQUFBLElBQUksRUFBRSxJQUFJO0VBQUU7RUFDWkQsRUFBQUEsS0FBSyxFQUFFLENBQUM7RUFDUjZCLEVBQUFBLFFBQVEsRUFBRSxHQUFHO0VBQ2JDLEVBQUFBLElBQUksRUFBRStFO0VBQ1IsQ0FBQztFQUVELFNBQVN0QyxPQUFPQSxDQUFDM2lCLElBQUksRUFBRTRmLEVBQUUsRUFBRTtFQUN6QixFQUFBLElBQUlDLE1BQU07RUFDVixFQUFBLE9BQU8sRUFBRUEsTUFBTSxHQUFHN2YsSUFBSSxDQUFDK2YsWUFBWSxDQUFDLElBQUksRUFBRUYsTUFBTSxHQUFHQSxNQUFNLENBQUNELEVBQUUsQ0FBQyxDQUFDLEVBQUU7RUFDOUQsSUFBQSxJQUFJLEVBQUU1ZixJQUFJLEdBQUdBLElBQUksQ0FBQ3dFLFVBQVUsQ0FBQyxFQUFFO0VBQzdCLE1BQUEsTUFBTSxJQUFJekgsS0FBSyxDQUFDLENBQUEsV0FBQSxFQUFjNmlCLEVBQUUsWUFBWSxDQUFDO0VBQy9DLElBQUE7RUFDRixFQUFBO0VBQ0EsRUFBQSxPQUFPQyxNQUFNO0VBQ2Y7RUFFZSw2QkFBQSxFQUFTNXNCLElBQUksRUFBRTtJQUM1QixJQUFJMnNCLEVBQUUsRUFDRkMsTUFBTTtJQUVWLElBQUk1c0IsSUFBSSxZQUFZa3ZCLFVBQVUsRUFBRTtNQUM5QnZDLEVBQUUsR0FBRzNzQixJQUFJLENBQUMydEIsR0FBRyxFQUFFM3RCLElBQUksR0FBR0EsSUFBSSxDQUFDbXZCLEtBQUs7RUFDbEMsRUFBQSxDQUFDLE1BQU07TUFDTHhDLEVBQUUsR0FBR3lELEtBQUssRUFBRSxFQUFFLENBQUN4RCxNQUFNLEdBQUdtRixhQUFhLEVBQUUzRyxJQUFJLEdBQUdYLEdBQUcsRUFBRSxFQUFFenFCLElBQUksR0FBR0EsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUdBLElBQUksR0FBRyxFQUFFO0VBQzdGLEVBQUE7SUFFQSxLQUFLLElBQUkwTSxNQUFNLEdBQUcsSUFBSSxDQUFDQyxPQUFPLEVBQUU3TixDQUFDLEdBQUc0TixNQUFNLENBQUN6TyxNQUFNLEVBQUU1RCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUd5RSxDQUFDLEVBQUUsRUFBRXpFLENBQUMsRUFBRTtNQUNwRSxLQUFLLElBQUl3UyxLQUFLLEdBQUdILE1BQU0sQ0FBQ3JTLENBQUMsQ0FBQyxFQUFFUSxDQUFDLEdBQUdnUyxLQUFLLENBQUM1TyxNQUFNLEVBQUU4TyxJQUFJLEVBQUU3TyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdyRCxDQUFDLEVBQUUsRUFBRXFELENBQUMsRUFBRTtFQUNyRSxNQUFBLElBQUk2TyxJQUFJLEdBQUdGLEtBQUssQ0FBQzNPLENBQUMsQ0FBQyxFQUFFO0VBQ25CZ3ZCLFFBQUFBLFFBQVEsQ0FBQ25nQixJQUFJLEVBQUUvTSxJQUFJLEVBQUUyc0IsRUFBRSxFQUFFenVCLENBQUMsRUFBRTJPLEtBQUssRUFBRStmLE1BQU0sSUFBSThDLE9BQU8sQ0FBQzNpQixJQUFJLEVBQUU0ZixFQUFFLENBQUMsQ0FBQztFQUNqRSxNQUFBO0VBQ0YsSUFBQTtFQUNGLEVBQUE7RUFFQSxFQUFBLE9BQU8sSUFBSXVDLFVBQVUsQ0FBQ3hpQixNQUFNLEVBQUUsSUFBSSxDQUFDUyxRQUFRLEVBQUVuTixJQUFJLEVBQUUyc0IsRUFBRSxDQUFDO0VBQ3hEOztFQ3JDQWxjLFNBQVMsQ0FBQ3JRLFNBQVMsQ0FBQ2t0QixTQUFTLEdBQUcyRSxtQkFBbUI7RUFDbkR4aEIsU0FBUyxDQUFDclEsU0FBUyxDQUFDeXRCLFVBQVUsR0FBR3FFLG9CQUFvQjs7RUNMOUMsU0FBU0MsU0FBU0EsQ0FBQ24zQixDQUFDLEVBQUVaLENBQUMsRUFBRUssQ0FBQyxFQUFFO0lBQ2pDLElBQUksQ0FBQ08sQ0FBQyxHQUFHQSxDQUFDO0lBQ1YsSUFBSSxDQUFDWixDQUFDLEdBQUdBLENBQUM7SUFDVixJQUFJLENBQUNLLENBQUMsR0FBR0EsQ0FBQztFQUNaO0VBRUEwM0IsU0FBUyxDQUFDL3hCLFNBQVMsR0FBRztFQUNwQlksRUFBQUEsV0FBVyxFQUFFbXhCLFNBQVM7RUFDdEJsMkIsRUFBQUEsS0FBSyxFQUFFLFVBQVNqQixDQUFDLEVBQUU7TUFDakIsT0FBT0EsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSW0zQixTQUFTLENBQUMsSUFBSSxDQUFDbjNCLENBQUMsR0FBR0EsQ0FBQyxFQUFFLElBQUksQ0FBQ1osQ0FBQyxFQUFFLElBQUksQ0FBQ0ssQ0FBQyxDQUFDO0lBQ25FLENBQUM7RUFDRDh1QixFQUFBQSxTQUFTLEVBQUUsVUFBU252QixDQUFDLEVBQUVLLENBQUMsRUFBRTtFQUN4QixJQUFBLE9BQU9MLENBQUMsS0FBSyxDQUFDLEdBQUdLLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUkwM0IsU0FBUyxDQUFDLElBQUksQ0FBQ24zQixDQUFDLEVBQUUsSUFBSSxDQUFDWixDQUFDLEdBQUcsSUFBSSxDQUFDWSxDQUFDLEdBQUdaLENBQUMsRUFBRSxJQUFJLENBQUNLLENBQUMsR0FBRyxJQUFJLENBQUNPLENBQUMsR0FBR1AsQ0FBQyxDQUFDO0lBQ25HLENBQUM7RUFDRHVRLEVBQUFBLEtBQUssRUFBRSxVQUFTb25CLEtBQUssRUFBRTtNQUNyQixPQUFPLENBQUNBLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUNwM0IsQ0FBQyxHQUFHLElBQUksQ0FBQ1osQ0FBQyxFQUFFZzRCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUNwM0IsQ0FBQyxHQUFHLElBQUksQ0FBQ1AsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7RUFDRDQzQixFQUFBQSxNQUFNLEVBQUUsVUFBU2o0QixDQUFDLEVBQUU7TUFDbEIsT0FBT0EsQ0FBQyxHQUFHLElBQUksQ0FBQ1ksQ0FBQyxHQUFHLElBQUksQ0FBQ1osQ0FBQztJQUM1QixDQUFDO0VBQ0RrNEIsRUFBQUEsTUFBTSxFQUFFLFVBQVM3M0IsQ0FBQyxFQUFFO01BQ2xCLE9BQU9BLENBQUMsR0FBRyxJQUFJLENBQUNPLENBQUMsR0FBRyxJQUFJLENBQUNQLENBQUM7SUFDNUIsQ0FBQztFQUNEODNCLEVBQUFBLE1BQU0sRUFBRSxVQUFTdjJCLFFBQVEsRUFBRTtFQUN6QixJQUFBLE9BQU8sQ0FBQyxDQUFDQSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDNUIsQ0FBQyxJQUFJLElBQUksQ0FBQ1ksQ0FBQyxFQUFFLENBQUNnQixRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDdkIsQ0FBQyxJQUFJLElBQUksQ0FBQ08sQ0FBQyxDQUFDO0lBQzNFLENBQUM7RUFDRHczQixFQUFBQSxPQUFPLEVBQUUsVUFBU3A0QixDQUFDLEVBQUU7TUFDbkIsT0FBTyxDQUFDQSxDQUFDLEdBQUcsSUFBSSxDQUFDQSxDQUFDLElBQUksSUFBSSxDQUFDWSxDQUFDO0lBQzlCLENBQUM7RUFDRHkzQixFQUFBQSxPQUFPLEVBQUUsVUFBU2g0QixDQUFDLEVBQUU7TUFDbkIsT0FBTyxDQUFDQSxDQUFDLEdBQUcsSUFBSSxDQUFDQSxDQUFDLElBQUksSUFBSSxDQUFDTyxDQUFDO0lBQzlCLENBQUM7RUFDRDAzQixFQUFBQSxRQUFRLEVBQUUsVUFBU3Q0QixDQUFDLEVBQUU7RUFDcEIsSUFBQSxPQUFPQSxDQUFDLENBQUN5USxJQUFJLEVBQUUsQ0FBQzhuQixNQUFNLENBQUN2NEIsQ0FBQyxDQUFDdzRCLEtBQUssRUFBRSxDQUFDdm9CLEdBQUcsQ0FBQyxJQUFJLENBQUNtb0IsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDbm9CLEdBQUcsQ0FBQ2pRLENBQUMsQ0FBQ200QixNQUFNLEVBQUVuNEIsQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztFQUNEeTRCLEVBQUFBLFFBQVEsRUFBRSxVQUFTcDRCLENBQUMsRUFBRTtFQUNwQixJQUFBLE9BQU9BLENBQUMsQ0FBQ29RLElBQUksRUFBRSxDQUFDOG5CLE1BQU0sQ0FBQ2w0QixDQUFDLENBQUNtNEIsS0FBSyxFQUFFLENBQUN2b0IsR0FBRyxDQUFDLElBQUksQ0FBQ29vQixPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUNwb0IsR0FBRyxDQUFDNVAsQ0FBQyxDQUFDODNCLE1BQU0sRUFBRTkzQixDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0Q0RixRQUFRLEVBQUUsWUFBVztFQUNuQixJQUFBLE9BQU8sWUFBWSxHQUFHLElBQUksQ0FBQ2pHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDSyxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQ08sQ0FBQyxHQUFHLEdBQUc7RUFDekUsRUFBQTtFQUNGLENBQUM7RUFJcUJtM0IsU0FBUyxDQUFDL3hCLFNBQVM7O0VDNUN6QztFQUNBOztFQUVBO0VBQ0E7O0VBRUE7RUFDQTtFQUNBO0VBQ0E7O0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDZSxNQUFNMHlCLE9BQU8sQ0FBQztFQUMzQixFQUFBLE9BQU85M0IsQ0FBQyxHQUFHO0VBQ1QrM0IsSUFBQUEsT0FBTyxFQUFFLElBQUk7RUFDYkMsSUFBQUEsR0FBRyxFQUFFLENBQUM7RUFDTkMsSUFBQUEsR0FBRyxFQUFFLEdBQUc7RUFDUkMsSUFBQUEsSUFBSSxFQUFFLEtBQUs7RUFDWEMsSUFBQUEsSUFBSSxFQUFFO0tBQ1A7RUFFRCxFQUFBLE9BQU9DLEtBQUtBLENBQUNsNEIsQ0FBQyxFQUFFd3JCLENBQUMsRUFBRTFyQixDQUFDLEVBQUU7RUFDcEIsSUFBQSxPQUFPRSxDQUFDLElBQUksQ0FBQyxHQUFHRixDQUFDLEdBQUcwckIsQ0FBQyxDQUFDO0VBQ3hCLEVBQUE7RUFFQSxFQUFBLE9BQU8yTSxLQUFLQSxDQUFDbjRCLENBQUMsRUFBRXdyQixDQUFDLEVBQUVsbkIsQ0FBQyxFQUFFO01BQ3BCLE9BQU8sQ0FBQ3RFLENBQUMsR0FBR3NFLENBQUMsS0FBS0EsQ0FBQyxHQUFHa25CLENBQUMsQ0FBQztFQUMxQixFQUFBO0VBQ0Y7O0VDL0JBOztFQ0RBOztFQVVBeUcsSUFBSSxDQUFDbUcsU0FBUyxHQUFJdmQsS0FBSyxJQUFLO0VBQzFCLEVBQUEsTUFBTXBTLE1BQU0sR0FBRztFQUNiM0ksSUFBQUEsQ0FBQyxFQUFFO0VBQUNvSSxNQUFBQSxJQUFJLEVBQUUsTUFBTTtFQUFFQyxNQUFBQSxLQUFLLEVBQUV5dkIsT0FBTyxDQUFDOTNCLENBQUMsQ0FBQ2c0QixHQUFHO0VBQUUxdkIsTUFBQUEsS0FBSyxFQUFFd3ZCLE9BQU8sQ0FBQzkzQixDQUFDLENBQUNpNEI7T0FBSTtFQUM3RE0sSUFBQUEsSUFBSSxFQUFFO0VBQUNud0IsTUFBQUEsSUFBSSxFQUFFLE1BQU07RUFBRUMsTUFBQUEsS0FBSyxFQUFFLENBQUM7RUFBRUMsTUFBQUEsS0FBSyxFQUFFO0VBQUc7S0FDMUM7RUFFRCxFQUFBLE1BQU1rd0IsT0FBTyxHQUFHQSxDQUFDenZCLEtBQUssRUFBRW9ELElBQUksS0FBSztNQUMvQixJQUFJc3NCLEVBQUUsR0FBRyxDQUFDOztFQUVWO01BQ0EsTUFBTUMsS0FBSyxHQUFHLENBQUM7TUFDZixNQUFNQyxNQUFNLEdBQUcsQ0FBQztFQUNoQkYsSUFBQUEsRUFBRSxJQUFJRywwQkFBd0IsQ0FDNUI3dkIsS0FBSyxDQUFDL0ksQ0FBQyxFQUNQMjRCLE1BQU0sRUFDTkEsTUFBTSxHQUFHRCxLQUNYLENBQUM7RUFDRDs7TUFFQSxNQUFNRyxRQUFRLEdBQUcsQ0FBQztNQUNsQixNQUFNQyxTQUFTLEdBQUcsQ0FBQztFQUNuQkwsSUFBQUEsRUFBRSxJQUFJRywwQkFBd0IsQ0FDNUI3dkIsS0FBSyxDQUFDd3ZCLElBQUksRUFDVk8sU0FBUyxFQUNUQSxTQUFTLEdBQUdELFFBQ2QsQ0FBQztFQUNEOztFQUVBO0VBQ0Exc0IsSUFBQUEsSUFBSSxDQUFDNHNCLE9BQU8sQ0FBRUMsTUFBTSxJQUFLO0VBQ3ZCO0VBQ0EsTUFBQSxNQUFNQyxFQUFFLEdBQUduQixPQUFPLENBQUNNLEtBQUssQ0FBQ1ksTUFBTSxDQUFDRSxFQUFFLEVBQUVGLE1BQU0sQ0FBQ0csRUFBRSxFQUFFcHdCLEtBQUssQ0FBQy9JLENBQUMsQ0FBQztFQUN2RCxNQUFBLE1BQU1vNUIsRUFBRSxHQUFHdEIsT0FBTyxDQUFDTSxLQUFLLENBQUNZLE1BQU0sQ0FBQ0ssRUFBRSxFQUFFTCxNQUFNLENBQUNNLEVBQUUsRUFBRXZ3QixLQUFLLENBQUMvSSxDQUFDLENBQUM7O0VBRXZEO0VBQ0E7RUFDQSxNQUFBLE1BQU11NUIsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUduNUIsSUFBSSxDQUFDQyxHQUFHLENBQUMwSSxLQUFLLENBQUN3dkIsSUFBSSxJQUFJVSxFQUFFLEdBQUdHLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0VBRXpEO1FBQ0EsTUFBTUksUUFBUSxHQUFJUixNQUFNLENBQUNRLFFBQVEsS0FBSyxPQUFPLEdBQUksQ0FBQyxHQUFHLENBQUM7UUFFdERmLEVBQUUsSUFBSUcseUJBQXVCLENBQUNZLFFBQVEsRUFBRUQsTUFBTSxDQUFDO0VBQ2pELElBQUEsQ0FBQyxDQUFDO0VBRUYsSUFBQSxPQUFPZCxFQUFFO0lBQ1gsQ0FBQzs7RUFFRDtFQUNBLEVBQUEsTUFBTWdCLE9BQU8sR0FBRyxJQUFJQyx1QkFBcUIsQ0FBQy93QixNQUFNLEVBQUU2dkIsT0FBTyxFQUFFemQsS0FBSyxDQUFDNU8sSUFBSSxDQUFDO0VBQ3RFO0VBQ0FzdEIsRUFBQUEsT0FBTyxDQUFDMXNCLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDbEIsRUFBQSxNQUFNNHNCLE9BQU8sR0FBR0YsT0FBTyxDQUFDOXNCLE1BQU0sQ0FBQyxJQUFJLENBQUM7O0VBRXBDO0VBQ0EsRUFBQSxNQUFNaXRCLE9BQU8sR0FBRztNQUNkNTVCLENBQUMsRUFBRTY1QixNQUFTLENBQUNGLE9BQU8sQ0FBQzM1QixDQUFDLENBQUM7RUFDdkJ1NEIsSUFBQUEsSUFBSSxFQUFFc0IsTUFBUyxDQUFDRixPQUFPLENBQUNwQixJQUFJO0tBQzdCO0lBRURwRyxJQUFJLENBQUMySCxXQUFXLENBQUM7RUFBQ0YsSUFBQUEsT0FBTyxFQUFFQSxPQUFPO0VBQUVELElBQUFBLE9BQU8sRUFBRUE7RUFBTyxHQUFDLENBQUM7RUFDeEQsQ0FBQzs7Ozs7OyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LDk2XX0=');
22778
22858
  /* eslint-enable */
22779
22859
 
22780
22860
  /*