@decidables/discountable-elements 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,21 +3,21 @@
3
3
  * Copyright 2019 Google LLC
4
4
  * SPDX-License-Identifier: BSD-3-Clause
5
5
  */
6
- const t$2 = window,
7
- e$4 = t$2.ShadowRoot && (void 0 === t$2.ShadyCSS || t$2.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype,
8
- s$5 = Symbol(),
9
- n$5 = new WeakMap();
10
- let o$4 = class o {
11
- constructor(t, e, n) {
12
- if (this._$cssResult$ = !0, n !== s$5) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");
6
+ const t$2 = globalThis,
7
+ e$3 = t$2.ShadowRoot && (void 0 === t$2.ShadyCSS || t$2.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype,
8
+ s$4 = Symbol(),
9
+ o$5 = new WeakMap();
10
+ let n$4 = class n {
11
+ constructor(t, e, o) {
12
+ if (this._$cssResult$ = !0, o !== s$4) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");
13
13
  this.cssText = t, this.t = e;
14
14
  }
15
15
  get styleSheet() {
16
16
  let t = this.o;
17
17
  const s = this.t;
18
- if (e$4 && void 0 === t) {
18
+ if (e$3 && void 0 === t) {
19
19
  const e = void 0 !== s && 1 === s.length;
20
- e && (t = n$5.get(s)), void 0 === t && ((this.o = t = new CSSStyleSheet()).replaceSync(this.cssText), e && n$5.set(s, t));
20
+ e && (t = o$5.get(s)), void 0 === t && ((this.o = t = new CSSStyleSheet()).replaceSync(this.cssText), e && o$5.set(s, t));
21
21
  }
22
22
  return t;
23
23
  }
@@ -25,26 +25,26 @@ let o$4 = class o {
25
25
  return this.cssText;
26
26
  }
27
27
  };
28
- const r$4 = t => new o$4("string" == typeof t ? t : t + "", void 0, s$5),
29
- i$3 = (t, ...e) => {
30
- const n = 1 === t.length ? t[0] : e.reduce((e, s, n) => e + (t => {
28
+ const r$5 = t => new n$4("string" == typeof t ? t : t + "", void 0, s$4),
29
+ i$4 = (t, ...e) => {
30
+ const o = 1 === t.length ? t[0] : e.reduce((e, s, o) => e + (t => {
31
31
  if (!0 === t._$cssResult$) return t.cssText;
32
32
  if ("number" == typeof t) return t;
33
33
  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.");
34
- })(s) + t[n + 1], t[0]);
35
- return new o$4(n, t, s$5);
34
+ })(s) + t[o + 1], t[0]);
35
+ return new n$4(o, t, s$4);
36
36
  },
37
- S$1 = (s, n) => {
38
- e$4 ? s.adoptedStyleSheets = n.map(t => t instanceof CSSStyleSheet ? t : t.styleSheet) : n.forEach(e => {
39
- const n = document.createElement("style"),
40
- o = t$2.litNonce;
41
- void 0 !== o && n.setAttribute("nonce", o), n.textContent = e.cssText, s.appendChild(n);
42
- });
37
+ S$1 = (s, o) => {
38
+ if (e$3) s.adoptedStyleSheets = o.map(t => t instanceof CSSStyleSheet ? t : t.styleSheet);else for (const e of o) {
39
+ const o = document.createElement("style"),
40
+ n = t$2.litNonce;
41
+ void 0 !== n && o.setAttribute("nonce", n), o.textContent = e.cssText, s.appendChild(o);
42
+ }
43
43
  },
44
- c$5 = e$4 ? t => t : t => t instanceof CSSStyleSheet ? (t => {
44
+ c$6 = e$3 ? t => t : t => t instanceof CSSStyleSheet ? (t => {
45
45
  let e = "";
46
46
  for (const s of t.cssRules) e += s.cssText;
47
- return r$4(e);
47
+ return r$5(e);
48
48
  })(t) : t;
49
49
 
50
50
  /**
@@ -52,16 +52,24 @@ const r$4 = t => new o$4("string" == typeof t ? t : t + "", void 0, s$5),
52
52
  * Copyright 2017 Google LLC
53
53
  * SPDX-License-Identifier: BSD-3-Clause
54
54
  */
55
- var s$4;
56
- const e$3 = window,
57
- r$3 = e$3.trustedTypes,
58
- h$3 = r$3 ? r$3.emptyScript : "",
59
- o$3 = e$3.reactiveElementPolyfillSupport,
60
- n$4 = {
61
- toAttribute(t, i) {
62
- switch (i) {
55
+ const {
56
+ is: i$3,
57
+ defineProperty: e$2,
58
+ getOwnPropertyDescriptor: r$4,
59
+ getOwnPropertyNames: h$2,
60
+ getOwnPropertySymbols: o$4,
61
+ getPrototypeOf: n$3
62
+ } = Object,
63
+ a$3 = globalThis,
64
+ c$5 = a$3.trustedTypes,
65
+ l$1 = c$5 ? c$5.emptyScript : "",
66
+ p$1 = a$3.reactiveElementPolyfillSupport,
67
+ d$1 = (t, s) => t,
68
+ u$1 = {
69
+ toAttribute(t, s) {
70
+ switch (s) {
63
71
  case Boolean:
64
- t = t ? h$3 : null;
72
+ t = t ? l$1 : null;
65
73
  break;
66
74
  case Object:
67
75
  case Array:
@@ -69,165 +77,177 @@ const e$3 = window,
69
77
  }
70
78
  return t;
71
79
  },
72
- fromAttribute(t, i) {
73
- let s = t;
74
- switch (i) {
80
+ fromAttribute(t, s) {
81
+ let i = t;
82
+ switch (s) {
75
83
  case Boolean:
76
- s = null !== t;
84
+ i = null !== t;
77
85
  break;
78
86
  case Number:
79
- s = null === t ? null : Number(t);
87
+ i = null === t ? null : Number(t);
80
88
  break;
81
89
  case Object:
82
90
  case Array:
83
91
  try {
84
- s = JSON.parse(t);
92
+ i = JSON.parse(t);
85
93
  } catch (t) {
86
- s = null;
94
+ i = null;
87
95
  }
88
96
  }
89
- return s;
97
+ return i;
90
98
  }
91
99
  },
92
- a$3 = (t, i) => i !== t && (i == i || t == t),
93
- l$4 = {
100
+ f$3 = (t, s) => !i$3(t, s),
101
+ y$2 = {
94
102
  attribute: !0,
95
103
  type: String,
96
- converter: n$4,
104
+ converter: u$1,
97
105
  reflect: !1,
98
- hasChanged: a$3
99
- },
100
- d$1 = "finalized";
101
- let u$1 = class u extends HTMLElement {
102
- constructor() {
103
- super(), this._$Ei = new Map(), this.isUpdatePending = !1, this.hasUpdated = !1, this._$El = null, this._$Eu();
104
- }
106
+ hasChanged: f$3
107
+ };
108
+ Symbol.metadata ??= Symbol("metadata"), a$3.litPropertyMetadata ??= new WeakMap();
109
+ let b$2 = class b extends HTMLElement {
105
110
  static addInitializer(t) {
106
- var i;
107
- this.finalize(), (null !== (i = this.h) && void 0 !== i ? i : this.h = []).push(t);
111
+ this._$Ei(), (this.l ??= []).push(t);
108
112
  }
109
113
  static get observedAttributes() {
110
- this.finalize();
111
- const t = [];
112
- return this.elementProperties.forEach((i, s) => {
113
- const e = this._$Ep(s, i);
114
- void 0 !== e && (this._$Ev.set(e, s), t.push(e));
115
- }), t;
114
+ return this.finalize(), this._$Eh && [...this._$Eh.keys()];
116
115
  }
117
- static createProperty(t, i = l$4) {
118
- if (i.state && (i.attribute = !1), this.finalize(), this.elementProperties.set(t, i), !i.noAccessor && !this.prototype.hasOwnProperty(t)) {
119
- const s = "symbol" == typeof t ? Symbol() : "__" + t,
120
- e = this.getPropertyDescriptor(t, s, i);
121
- void 0 !== e && Object.defineProperty(this.prototype, t, e);
116
+ static createProperty(t, s = y$2) {
117
+ if (s.state && (s.attribute = !1), this._$Ei(), this.elementProperties.set(t, s), !s.noAccessor) {
118
+ const i = Symbol(),
119
+ r = this.getPropertyDescriptor(t, i, s);
120
+ void 0 !== r && e$2(this.prototype, t, r);
122
121
  }
123
122
  }
124
- static getPropertyDescriptor(t, i, s) {
123
+ static getPropertyDescriptor(t, s, i) {
124
+ const {
125
+ get: e,
126
+ set: h
127
+ } = r$4(this.prototype, t) ?? {
128
+ get() {
129
+ return this[s];
130
+ },
131
+ set(t) {
132
+ this[s] = t;
133
+ }
134
+ };
125
135
  return {
126
136
  get() {
127
- return this[i];
137
+ return e?.call(this);
128
138
  },
129
- set(e) {
130
- const r = this[t];
131
- this[i] = e, this.requestUpdate(t, r, s);
139
+ set(s) {
140
+ const r = e?.call(this);
141
+ h.call(this, s), this.requestUpdate(t, r, i);
132
142
  },
133
143
  configurable: !0,
134
144
  enumerable: !0
135
145
  };
136
146
  }
137
147
  static getPropertyOptions(t) {
138
- return this.elementProperties.get(t) || l$4;
148
+ return this.elementProperties.get(t) ?? y$2;
149
+ }
150
+ static _$Ei() {
151
+ if (this.hasOwnProperty(d$1("elementProperties"))) return;
152
+ const t = n$3(this);
153
+ t.finalize(), void 0 !== t.l && (this.l = [...t.l]), this.elementProperties = new Map(t.elementProperties);
139
154
  }
140
155
  static finalize() {
141
- if (this.hasOwnProperty(d$1)) return !1;
142
- this[d$1] = !0;
143
- const t = Object.getPrototypeOf(this);
144
- if (t.finalize(), void 0 !== t.h && (this.h = [...t.h]), this.elementProperties = new Map(t.elementProperties), this._$Ev = new Map(), this.hasOwnProperty("properties")) {
156
+ if (this.hasOwnProperty(d$1("finalized"))) return;
157
+ if (this.finalized = !0, this._$Ei(), this.hasOwnProperty(d$1("properties"))) {
145
158
  const t = this.properties,
146
- i = [...Object.getOwnPropertyNames(t), ...Object.getOwnPropertySymbols(t)];
147
- for (const s of i) this.createProperty(s, t[s]);
159
+ s = [...h$2(t), ...o$4(t)];
160
+ for (const i of s) this.createProperty(i, t[i]);
148
161
  }
149
- return this.elementStyles = this.finalizeStyles(this.styles), !0;
162
+ const t = this[Symbol.metadata];
163
+ if (null !== t) {
164
+ const s = litPropertyMetadata.get(t);
165
+ if (void 0 !== s) for (const [t, i] of s) this.elementProperties.set(t, i);
166
+ }
167
+ this._$Eh = new Map();
168
+ for (const [t, s] of this.elementProperties) {
169
+ const i = this._$Eu(t, s);
170
+ void 0 !== i && this._$Eh.set(i, t);
171
+ }
172
+ this.elementStyles = this.finalizeStyles(this.styles);
150
173
  }
151
- static finalizeStyles(i) {
152
- const s = [];
153
- if (Array.isArray(i)) {
154
- const e = new Set(i.flat(1 / 0).reverse());
155
- for (const i of e) s.unshift(c$5(i));
156
- } else void 0 !== i && s.push(c$5(i));
157
- return s;
174
+ static finalizeStyles(s) {
175
+ const i = [];
176
+ if (Array.isArray(s)) {
177
+ const e = new Set(s.flat(1 / 0).reverse());
178
+ for (const s of e) i.unshift(c$6(s));
179
+ } else void 0 !== s && i.push(c$6(s));
180
+ return i;
158
181
  }
159
- static _$Ep(t, i) {
160
- const s = i.attribute;
161
- return !1 === s ? void 0 : "string" == typeof s ? s : "string" == typeof t ? t.toLowerCase() : void 0;
182
+ static _$Eu(t, s) {
183
+ const i = s.attribute;
184
+ return !1 === i ? void 0 : "string" == typeof i ? i : "string" == typeof t ? t.toLowerCase() : void 0;
162
185
  }
163
- _$Eu() {
164
- var t;
165
- this._$E_ = new Promise(t => this.enableUpdating = t), this._$AL = new Map(), this._$Eg(), this.requestUpdate(), null === (t = this.constructor.h) || void 0 === t || t.forEach(t => t(this));
186
+ constructor() {
187
+ super(), this._$Ep = void 0, this.isUpdatePending = !1, this.hasUpdated = !1, this._$Em = null, this._$Ev();
188
+ }
189
+ _$Ev() {
190
+ this._$Eg = new Promise(t => this.enableUpdating = t), this._$AL = new Map(), this._$ES(), this.requestUpdate(), this.constructor.l?.forEach(t => t(this));
166
191
  }
167
192
  addController(t) {
168
- var i, s;
169
- (null !== (i = this._$ES) && void 0 !== i ? i : this._$ES = []).push(t), void 0 !== this.renderRoot && this.isConnected && (null === (s = t.hostConnected) || void 0 === s || s.call(t));
193
+ (this._$E_ ??= new Set()).add(t), void 0 !== this.renderRoot && this.isConnected && t.hostConnected?.();
170
194
  }
171
195
  removeController(t) {
172
- var i;
173
- null === (i = this._$ES) || void 0 === i || i.splice(this._$ES.indexOf(t) >>> 0, 1);
196
+ this._$E_?.delete(t);
174
197
  }
175
- _$Eg() {
176
- this.constructor.elementProperties.forEach((t, i) => {
177
- this.hasOwnProperty(i) && (this._$Ei.set(i, this[i]), delete this[i]);
178
- });
198
+ _$ES() {
199
+ const t = new Map(),
200
+ s = this.constructor.elementProperties;
201
+ for (const i of s.keys()) this.hasOwnProperty(i) && (t.set(i, this[i]), delete this[i]);
202
+ t.size > 0 && (this._$Ep = t);
179
203
  }
180
204
  createRenderRoot() {
181
- var t;
182
- const s = null !== (t = this.shadowRoot) && void 0 !== t ? t : this.attachShadow(this.constructor.shadowRootOptions);
183
- return S$1(s, this.constructor.elementStyles), s;
205
+ const t = this.shadowRoot ?? this.attachShadow(this.constructor.shadowRootOptions);
206
+ return S$1(t, this.constructor.elementStyles), t;
184
207
  }
185
208
  connectedCallback() {
186
- var t;
187
- void 0 === this.renderRoot && (this.renderRoot = this.createRenderRoot()), this.enableUpdating(!0), null === (t = this._$ES) || void 0 === t || t.forEach(t => {
188
- var i;
189
- return null === (i = t.hostConnected) || void 0 === i ? void 0 : i.call(t);
190
- });
209
+ this.renderRoot ??= this.createRenderRoot(), this.enableUpdating(!0), this._$E_?.forEach(t => t.hostConnected?.());
191
210
  }
192
211
  enableUpdating(t) {}
193
212
  disconnectedCallback() {
194
- var t;
195
- null === (t = this._$ES) || void 0 === t || t.forEach(t => {
196
- var i;
197
- return null === (i = t.hostDisconnected) || void 0 === i ? void 0 : i.call(t);
198
- });
213
+ this._$E_?.forEach(t => t.hostDisconnected?.());
199
214
  }
200
- attributeChangedCallback(t, i, s) {
201
- this._$AK(t, s);
215
+ attributeChangedCallback(t, s, i) {
216
+ this._$AK(t, i);
202
217
  }
203
- _$EO(t, i, s = l$4) {
204
- var e;
205
- const r = this.constructor._$Ep(t, s);
206
- if (void 0 !== r && !0 === s.reflect) {
207
- const h = (void 0 !== (null === (e = s.converter) || void 0 === e ? void 0 : e.toAttribute) ? s.converter : n$4).toAttribute(i, s.type);
208
- this._$El = t, null == h ? this.removeAttribute(r) : this.setAttribute(r, h), this._$El = null;
218
+ _$EO(t, s) {
219
+ const i = this.constructor.elementProperties.get(t),
220
+ e = this.constructor._$Eu(t, i);
221
+ if (void 0 !== e && !0 === i.reflect) {
222
+ const r = (void 0 !== i.converter?.toAttribute ? i.converter : u$1).toAttribute(s, i.type);
223
+ this._$Em = t, null == r ? this.removeAttribute(e) : this.setAttribute(e, r), this._$Em = null;
209
224
  }
210
225
  }
211
- _$AK(t, i) {
212
- var s;
213
- const e = this.constructor,
214
- r = e._$Ev.get(t);
215
- if (void 0 !== r && this._$El !== r) {
216
- const t = e.getPropertyOptions(r),
217
- h = "function" == typeof t.converter ? {
226
+ _$AK(t, s) {
227
+ const i = this.constructor,
228
+ e = i._$Eh.get(t);
229
+ if (void 0 !== e && this._$Em !== e) {
230
+ const t = i.getPropertyOptions(e),
231
+ r = "function" == typeof t.converter ? {
218
232
  fromAttribute: t.converter
219
- } : void 0 !== (null === (s = t.converter) || void 0 === s ? void 0 : s.fromAttribute) ? t.converter : n$4;
220
- this._$El = r, this[r] = h.fromAttribute(i, t.type), this._$El = null;
233
+ } : void 0 !== t.converter?.fromAttribute ? t.converter : u$1;
234
+ this._$Em = e, this[e] = r.fromAttribute(s, t.type), this._$Em = null;
221
235
  }
222
236
  }
223
- requestUpdate(t, i, s) {
224
- let e = !0;
225
- void 0 !== t && (((s = s || this.constructor.getPropertyOptions(t)).hasChanged || a$3)(this[t], i) ? (this._$AL.has(t) || this._$AL.set(t, i), !0 === s.reflect && this._$El !== t && (void 0 === this._$EC && (this._$EC = new Map()), this._$EC.set(t, s))) : e = !1), !this.isUpdatePending && e && (this._$E_ = this._$Ej());
237
+ requestUpdate(t, s, i, e = !1, r) {
238
+ if (void 0 !== t) {
239
+ if (i ??= this.constructor.getPropertyOptions(t), !(i.hasChanged ?? f$3)(e ? r : this[t], s)) return;
240
+ this.C(t, s, i);
241
+ }
242
+ !1 === this.isUpdatePending && (this._$Eg = this._$EP());
243
+ }
244
+ C(t, s, i) {
245
+ this._$AL.has(t) || this._$AL.set(t, s), !0 === i.reflect && this._$Em !== t && (this._$Ej ??= new Set()).add(t);
226
246
  }
227
- async _$Ej() {
247
+ async _$EP() {
228
248
  this.isUpdatePending = !0;
229
249
  try {
230
- await this._$E_;
250
+ await this._$Eg;
231
251
  } catch (t) {
232
252
  Promise.reject(t);
233
253
  }
@@ -238,192 +258,182 @@ let u$1 = class u extends HTMLElement {
238
258
  return this.performUpdate();
239
259
  }
240
260
  performUpdate() {
241
- var t;
242
261
  if (!this.isUpdatePending) return;
243
- this.hasUpdated, this._$Ei && (this._$Ei.forEach((t, i) => this[i] = t), this._$Ei = void 0);
244
- let i = !1;
262
+ if (!this.hasUpdated) {
263
+ if (this.renderRoot ??= this.createRenderRoot(), this._$Ep) {
264
+ for (const [t, s] of this._$Ep) this[t] = s;
265
+ this._$Ep = void 0;
266
+ }
267
+ const t = this.constructor.elementProperties;
268
+ if (t.size > 0) for (const [s, i] of t) !0 !== i.wrapped || this._$AL.has(s) || void 0 === this[s] || this.C(s, this[s], i);
269
+ }
270
+ let t = !1;
245
271
  const s = this._$AL;
246
272
  try {
247
- i = this.shouldUpdate(s), i ? (this.willUpdate(s), null === (t = this._$ES) || void 0 === t || t.forEach(t => {
248
- var i;
249
- return null === (i = t.hostUpdate) || void 0 === i ? void 0 : i.call(t);
250
- }), this.update(s)) : this._$Ek();
251
- } catch (t) {
252
- throw i = !1, this._$Ek(), t;
273
+ t = this.shouldUpdate(s), t ? (this.willUpdate(s), this._$E_?.forEach(t => t.hostUpdate?.()), this.update(s)) : this._$ET();
274
+ } catch (s) {
275
+ throw t = !1, this._$ET(), s;
253
276
  }
254
- i && this._$AE(s);
277
+ t && this._$AE(s);
255
278
  }
256
279
  willUpdate(t) {}
257
280
  _$AE(t) {
258
- var i;
259
- null === (i = this._$ES) || void 0 === i || i.forEach(t => {
260
- var i;
261
- return null === (i = t.hostUpdated) || void 0 === i ? void 0 : i.call(t);
262
- }), this.hasUpdated || (this.hasUpdated = !0, this.firstUpdated(t)), this.updated(t);
281
+ this._$E_?.forEach(t => t.hostUpdated?.()), this.hasUpdated || (this.hasUpdated = !0, this.firstUpdated(t)), this.updated(t);
263
282
  }
264
- _$Ek() {
283
+ _$ET() {
265
284
  this._$AL = new Map(), this.isUpdatePending = !1;
266
285
  }
267
286
  get updateComplete() {
268
287
  return this.getUpdateComplete();
269
288
  }
270
289
  getUpdateComplete() {
271
- return this._$E_;
290
+ return this._$Eg;
272
291
  }
273
292
  shouldUpdate(t) {
274
293
  return !0;
275
294
  }
276
295
  update(t) {
277
- void 0 !== this._$EC && (this._$EC.forEach((t, i) => this._$EO(i, this[i], t)), this._$EC = void 0), this._$Ek();
296
+ this._$Ej &&= this._$Ej.forEach(t => this._$EO(t, this[t])), this._$ET();
278
297
  }
279
298
  updated(t) {}
280
299
  firstUpdated(t) {}
281
300
  };
282
- u$1[d$1] = !0, u$1.elementProperties = new Map(), u$1.elementStyles = [], u$1.shadowRootOptions = {
301
+ b$2.elementStyles = [], b$2.shadowRootOptions = {
283
302
  mode: "open"
284
- }, null == o$3 || o$3({
285
- ReactiveElement: u$1
286
- }), (null !== (s$4 = e$3.reactiveElementVersions) && void 0 !== s$4 ? s$4 : e$3.reactiveElementVersions = []).push("1.6.3");
303
+ }, b$2[d$1("elementProperties")] = new Map(), b$2[d$1("finalized")] = new Map(), p$1?.({
304
+ ReactiveElement: b$2
305
+ }), (a$3.reactiveElementVersions ??= []).push("2.0.2");
287
306
 
288
307
  /**
289
308
  * @license
290
309
  * Copyright 2017 Google LLC
291
310
  * SPDX-License-Identifier: BSD-3-Clause
292
311
  */
293
- var t$1;
294
- const i$2 = window,
295
- s$3 = i$2.trustedTypes,
296
- e$2 = s$3 ? s$3.createPolicy("lit-html", {
312
+ const t$1 = globalThis,
313
+ i$2 = t$1.trustedTypes,
314
+ s$3 = i$2 ? i$2.createPolicy("lit-html", {
297
315
  createHTML: t => t
298
316
  }) : void 0,
299
- o$2 = "$lit$",
300
- n$3 = `lit$${(Math.random() + "").slice(9)}$`,
301
- l$3 = "?" + n$3,
302
- h$2 = `<${l$3}>`,
303
- r$2 = document,
304
- u = () => r$2.createComment(""),
305
- d = t => null === t || "object" != typeof t && "function" != typeof t,
306
- c$4 = Array.isArray,
307
- v = t => c$4(t) || "function" == typeof (null == t ? void 0 : t[Symbol.iterator]),
308
- a$2 = "[ \t\n\f\r]",
309
- f = /<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,
310
- _ = /-->/g,
311
- m = />/g,
312
- p$1 = RegExp(`>|${a$2}(?:([^\\s"'>=/]+)(${a$2}*=${a$2}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`, "g"),
313
- g$1 = /'/g,
314
- $ = /"/g,
315
- y$1 = /^(?:script|style|textarea|title)$/i,
316
- w$1 = t => (i, ...s) => ({
317
+ e$1 = "$lit$",
318
+ h$1 = `lit$${(Math.random() + "").slice(9)}$`,
319
+ o$3 = "?" + h$1,
320
+ n$2 = `<${o$3}>`,
321
+ r$3 = document,
322
+ l = () => r$3.createComment(""),
323
+ c$4 = t => null === t || "object" != typeof t && "function" != typeof t,
324
+ a$2 = Array.isArray,
325
+ u = t => a$2(t) || "function" == typeof t?.[Symbol.iterator],
326
+ d = "[ \t\n\f\r]",
327
+ f$2 = /<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,
328
+ v$1 = /-->/g,
329
+ _ = />/g,
330
+ m = RegExp(`>|${d}(?:([^\\s"'>=/]+)(${d}*=${d}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`, "g"),
331
+ p = /'/g,
332
+ g$1 = /"/g,
333
+ $ = /^(?:script|style|textarea|title)$/i,
334
+ y$1 = t => (i, ...s) => ({
317
335
  _$litType$: t,
318
336
  strings: i,
319
337
  values: s
320
338
  }),
321
- x$2 = w$1(1),
322
- b$1 = w$1(2),
323
- T = Symbol.for("lit-noChange"),
324
- A$2 = Symbol.for("lit-nothing"),
325
- E$1 = new WeakMap(),
326
- C$1 = r$2.createTreeWalker(r$2, 129, null, !1);
327
- function P(t, i) {
339
+ x$2 = y$1(1),
340
+ b$1 = y$1(2),
341
+ w$1 = Symbol.for("lit-noChange"),
342
+ T = Symbol.for("lit-nothing"),
343
+ A$2 = new WeakMap(),
344
+ E$1 = r$3.createTreeWalker(r$3, 129);
345
+ function C$1(t, i) {
328
346
  if (!Array.isArray(t) || !t.hasOwnProperty("raw")) throw Error("invalid template strings array");
329
- return void 0 !== e$2 ? e$2.createHTML(i) : i;
347
+ return void 0 !== s$3 ? s$3.createHTML(i) : i;
330
348
  }
331
- const V = (t, i) => {
349
+ const P = (t, i) => {
332
350
  const s = t.length - 1,
333
- e = [];
334
- let l,
335
- r = 2 === i ? "<svg>" : "",
336
- u = f;
351
+ o = [];
352
+ let r,
353
+ l = 2 === i ? "<svg>" : "",
354
+ c = f$2;
337
355
  for (let i = 0; i < s; i++) {
338
356
  const s = t[i];
339
- let d,
340
- c,
341
- v = -1,
342
- a = 0;
343
- for (; a < s.length && (u.lastIndex = a, c = u.exec(s), null !== c);) a = u.lastIndex, u === f ? "!--" === c[1] ? u = _ : void 0 !== c[1] ? u = m : void 0 !== c[2] ? (y$1.test(c[2]) && (l = RegExp("</" + c[2], "g")), u = p$1) : void 0 !== c[3] && (u = p$1) : u === p$1 ? ">" === c[0] ? (u = null != l ? l : f, v = -1) : void 0 === c[1] ? v = -2 : (v = u.lastIndex - c[2].length, d = c[1], u = void 0 === c[3] ? p$1 : '"' === c[3] ? $ : g$1) : u === $ || u === g$1 ? u = p$1 : u === _ || u === m ? u = f : (u = p$1, l = void 0);
344
- const w = u === p$1 && t[i + 1].startsWith("/>") ? " " : "";
345
- r += u === f ? s + h$2 : v >= 0 ? (e.push(d), s.slice(0, v) + o$2 + s.slice(v) + n$3 + w) : s + n$3 + (-2 === v ? (e.push(void 0), i) : w);
346
- }
347
- return [P(t, r + (t[s] || "<?>") + (2 === i ? "</svg>" : "")), e];
357
+ let a,
358
+ u,
359
+ d = -1,
360
+ y = 0;
361
+ 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);
362
+ const x = c === m && t[i + 1].startsWith("/>") ? " " : "";
363
+ 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);
364
+ }
365
+ return [C$1(t, l + (t[s] || "<?>") + (2 === i ? "</svg>" : "")), o];
348
366
  };
349
- let N$1 = class N {
367
+ class V {
350
368
  constructor({
351
369
  strings: t,
352
- _$litType$: i
353
- }, e) {
354
- let h;
370
+ _$litType$: s
371
+ }, n) {
372
+ let r;
355
373
  this.parts = [];
356
- let r = 0,
357
- d = 0;
358
- const c = t.length - 1,
359
- v = this.parts,
360
- [a, f] = V(t, i);
361
- if (this.el = N.createElement(a, e), C$1.currentNode = this.el.content, 2 === i) {
362
- const t = this.el.content,
363
- i = t.firstChild;
364
- i.remove(), t.append(...i.childNodes);
365
- }
366
- for (; null !== (h = C$1.nextNode()) && v.length < c;) {
367
- if (1 === h.nodeType) {
368
- if (h.hasAttributes()) {
369
- const t = [];
370
- for (const i of h.getAttributeNames()) if (i.endsWith(o$2) || i.startsWith(n$3)) {
371
- const s = f[d++];
372
- if (t.push(i), void 0 !== s) {
373
- const t = h.getAttribute(s.toLowerCase() + o$2).split(n$3),
374
- i = /([.?@])?(.*)/.exec(s);
375
- v.push({
376
- type: 1,
377
- index: r,
378
- name: i[2],
379
- strings: t,
380
- ctor: "." === i[1] ? H : "?" === i[1] ? L : "@" === i[1] ? z : k$1
381
- });
382
- } else v.push({
383
- type: 6,
384
- index: r
385
- });
386
- }
387
- for (const i of t) h.removeAttribute(i);
388
- }
389
- if (y$1.test(h.tagName)) {
390
- const t = h.textContent.split(n$3),
391
- i = t.length - 1;
392
- if (i > 0) {
393
- h.textContent = s$3 ? s$3.emptyScript : "";
394
- for (let s = 0; s < i; s++) h.append(t[s], u()), C$1.nextNode(), v.push({
374
+ let c = 0,
375
+ a = 0;
376
+ const u = t.length - 1,
377
+ d = this.parts,
378
+ [f, v] = P(t, s);
379
+ if (this.el = V.createElement(f, n), E$1.currentNode = this.el.content, 2 === s) {
380
+ const t = this.el.content.firstChild;
381
+ t.replaceWith(...t.childNodes);
382
+ }
383
+ for (; null !== (r = E$1.nextNode()) && d.length < u;) {
384
+ if (1 === r.nodeType) {
385
+ if (r.hasAttributes()) for (const t of r.getAttributeNames()) if (t.endsWith(e$1)) {
386
+ const i = v[a++],
387
+ s = r.getAttribute(t).split(h$1),
388
+ e = /([.?@])?(.*)/.exec(i);
389
+ d.push({
390
+ type: 1,
391
+ index: c,
392
+ name: e[2],
393
+ strings: s,
394
+ ctor: "." === e[1] ? k$1 : "?" === e[1] ? H : "@" === e[1] ? I : R
395
+ }), r.removeAttribute(t);
396
+ } else t.startsWith(h$1) && (d.push({
397
+ type: 6,
398
+ index: c
399
+ }), r.removeAttribute(t));
400
+ if ($.test(r.tagName)) {
401
+ const t = r.textContent.split(h$1),
402
+ s = t.length - 1;
403
+ if (s > 0) {
404
+ r.textContent = i$2 ? i$2.emptyScript : "";
405
+ for (let i = 0; i < s; i++) r.append(t[i], l()), E$1.nextNode(), d.push({
395
406
  type: 2,
396
- index: ++r
407
+ index: ++c
397
408
  });
398
- h.append(t[i], u());
409
+ r.append(t[s], l());
399
410
  }
400
411
  }
401
- } else if (8 === h.nodeType) if (h.data === l$3) v.push({
412
+ } else if (8 === r.nodeType) if (r.data === o$3) d.push({
402
413
  type: 2,
403
- index: r
414
+ index: c
404
415
  });else {
405
416
  let t = -1;
406
- for (; -1 !== (t = h.data.indexOf(n$3, t + 1));) v.push({
417
+ for (; -1 !== (t = r.data.indexOf(h$1, t + 1));) d.push({
407
418
  type: 7,
408
- index: r
409
- }), t += n$3.length - 1;
419
+ index: c
420
+ }), t += h$1.length - 1;
410
421
  }
411
- r++;
422
+ c++;
412
423
  }
413
424
  }
414
425
  static createElement(t, i) {
415
- const s = r$2.createElement("template");
426
+ const s = r$3.createElement("template");
416
427
  return s.innerHTML = t, s;
417
428
  }
418
- };
419
- function S(t, i, s = t, e) {
420
- var o, n, l, h;
421
- if (i === T) return i;
422
- let r = void 0 !== e ? null === (o = s._$Co) || void 0 === o ? void 0 : o[e] : s._$Cl;
423
- const u = d(i) ? void 0 : i._$litDirective$;
424
- return (null == r ? void 0 : r.constructor) !== u && (null === (n = null == r ? void 0 : r._$AO) || void 0 === n || n.call(r, !1), void 0 === u ? r = void 0 : (r = new u(t), r._$AT(t, s, e)), void 0 !== e ? (null !== (l = (h = s)._$Co) && void 0 !== l ? l : h._$Co = [])[e] = r : s._$Cl = r), void 0 !== r && (i = S(t, r._$AS(t, i.values), r, e)), i;
425
429
  }
426
- let M$1 = class M {
430
+ function N$1(t, i, s = t, e) {
431
+ if (i === w$1) return i;
432
+ let h = void 0 !== e ? s._$Co?.[e] : s._$Cl;
433
+ const o = c$4(i) ? void 0 : i._$litDirective$;
434
+ return h?.constructor !== o && (h?._$AO?.(!1), 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 = N$1(t, h._$AS(t, i.values), h, e)), i;
435
+ }
436
+ class S {
427
437
  constructor(t, i) {
428
438
  this._$AV = [], this._$AN = void 0, this._$AD = t, this._$AM = i;
429
439
  }
@@ -434,46 +444,43 @@ let M$1 = class M {
434
444
  return this._$AM._$AU;
435
445
  }
436
446
  u(t) {
437
- var i;
438
447
  const {
439
448
  el: {
440
- content: s
449
+ content: i
441
450
  },
442
- parts: e
451
+ parts: s
443
452
  } = this._$AD,
444
- o = (null !== (i = null == t ? void 0 : t.creationScope) && void 0 !== i ? i : r$2).importNode(s, !0);
445
- C$1.currentNode = o;
446
- let n = C$1.nextNode(),
447
- l = 0,
448
- h = 0,
449
- u = e[0];
450
- for (; void 0 !== u;) {
451
- if (l === u.index) {
453
+ e = (t?.creationScope ?? r$3).importNode(i, !0);
454
+ E$1.currentNode = e;
455
+ let h = E$1.nextNode(),
456
+ o = 0,
457
+ n = 0,
458
+ l = s[0];
459
+ for (; void 0 !== l;) {
460
+ if (o === l.index) {
452
461
  let i;
453
- 2 === u.type ? i = new R(n, n.nextSibling, this, t) : 1 === u.type ? i = new u.ctor(n, u.name, u.strings, this, t) : 6 === u.type && (i = new Z(n, this, t)), this._$AV.push(i), u = e[++h];
462
+ 2 === l.type ? i = new M$1(h, h.nextSibling, this, t) : 1 === l.type ? i = new l.ctor(h, l.name, l.strings, this, t) : 6 === l.type && (i = new L(h, this, t)), this._$AV.push(i), l = s[++n];
454
463
  }
455
- l !== (null == u ? void 0 : u.index) && (n = C$1.nextNode(), l++);
464
+ o !== l?.index && (h = E$1.nextNode(), o++);
456
465
  }
457
- return C$1.currentNode = r$2, o;
466
+ return E$1.currentNode = r$3, e;
458
467
  }
459
- v(t) {
468
+ p(t) {
460
469
  let i = 0;
461
470
  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++;
462
471
  }
463
- };
464
- class R {
465
- constructor(t, i, s, e) {
466
- var o;
467
- this.type = 2, this._$AH = A$2, this._$AN = void 0, this._$AA = t, this._$AB = i, this._$AM = s, this.options = e, this._$Cp = null === (o = null == e ? void 0 : e.isConnected) || void 0 === o || o;
468
- }
472
+ }
473
+ let M$1 = class M {
469
474
  get _$AU() {
470
- var t, i;
471
- return null !== (i = null === (t = this._$AM) || void 0 === t ? void 0 : t._$AU) && void 0 !== i ? i : this._$Cp;
475
+ return this._$AM?._$AU ?? this._$Cv;
476
+ }
477
+ constructor(t, i, s, e) {
478
+ this.type = 2, this._$AH = T, this._$AN = void 0, this._$AA = t, this._$AB = i, this._$AM = s, this.options = e, this._$Cv = e?.isConnected ?? !0;
472
479
  }
473
480
  get parentNode() {
474
481
  let t = this._$AA.parentNode;
475
482
  const i = this._$AM;
476
- return void 0 !== i && 11 === (null == t ? void 0 : t.nodeType) && (t = i.parentNode), t;
483
+ return void 0 !== i && 11 === t?.nodeType && (t = i.parentNode), t;
477
484
  }
478
485
  get startNode() {
479
486
  return this._$AA;
@@ -482,7 +489,7 @@ class R {
482
489
  return this._$AB;
483
490
  }
484
491
  _$AI(t, i = this) {
485
- t = S(this, t, i), d(t) ? t === A$2 || null == t || "" === t ? (this._$AH !== A$2 && this._$AR(), this._$AH = A$2) : t !== this._$AH && t !== T && this._(t) : void 0 !== t._$litType$ ? this.g(t) : void 0 !== t.nodeType ? this.$(t) : v(t) ? this.T(t) : this._(t);
492
+ t = N$1(this, t, i), c$4(t) ? t === T || null == t || "" === t ? (this._$AH !== T && this._$AR(), this._$AH = T) : t !== this._$AH && t !== w$1 && this._(t) : void 0 !== t._$litType$ ? this.g(t) : void 0 !== t.nodeType ? this.$(t) : u(t) ? this.T(t) : this._(t);
486
493
  }
487
494
  k(t) {
488
495
  return this._$AA.parentNode.insertBefore(t, this._$AB);
@@ -491,104 +498,98 @@ class R {
491
498
  this._$AH !== t && (this._$AR(), this._$AH = this.k(t));
492
499
  }
493
500
  _(t) {
494
- this._$AH !== A$2 && d(this._$AH) ? this._$AA.nextSibling.data = t : this.$(r$2.createTextNode(t)), this._$AH = t;
501
+ this._$AH !== T && c$4(this._$AH) ? this._$AA.nextSibling.data = t : this.$(r$3.createTextNode(t)), this._$AH = t;
495
502
  }
496
503
  g(t) {
497
- var i;
498
504
  const {
499
- values: s,
500
- _$litType$: e
505
+ values: i,
506
+ _$litType$: s
501
507
  } = t,
502
- o = "number" == typeof e ? this._$AC(t) : (void 0 === e.el && (e.el = N$1.createElement(P(e.h, e.h[0]), this.options)), e);
503
- if ((null === (i = this._$AH) || void 0 === i ? void 0 : i._$AD) === o) this._$AH.v(s);else {
504
- const t = new M$1(o, this),
505
- i = t.u(this.options);
506
- t.v(s), this.$(i), this._$AH = t;
508
+ e = "number" == typeof s ? this._$AC(t) : (void 0 === s.el && (s.el = V.createElement(C$1(s.h, s.h[0]), this.options)), s);
509
+ if (this._$AH?._$AD === e) this._$AH.p(i);else {
510
+ const t = new S(e, this),
511
+ s = t.u(this.options);
512
+ t.p(i), this.$(s), this._$AH = t;
507
513
  }
508
514
  }
509
515
  _$AC(t) {
510
- let i = E$1.get(t.strings);
511
- return void 0 === i && E$1.set(t.strings, i = new N$1(t)), i;
516
+ let i = A$2.get(t.strings);
517
+ return void 0 === i && A$2.set(t.strings, i = new V(t)), i;
512
518
  }
513
519
  T(t) {
514
- c$4(this._$AH) || (this._$AH = [], this._$AR());
520
+ a$2(this._$AH) || (this._$AH = [], this._$AR());
515
521
  const i = this._$AH;
516
522
  let s,
517
523
  e = 0;
518
- for (const o of t) e === i.length ? i.push(s = new R(this.k(u()), this.k(u()), this, this.options)) : s = i[e], s._$AI(o), e++;
524
+ for (const h of t) e === i.length ? i.push(s = new M(this.k(l()), this.k(l()), this, this.options)) : s = i[e], s._$AI(h), e++;
519
525
  e < i.length && (this._$AR(s && s._$AB.nextSibling, e), i.length = e);
520
526
  }
521
527
  _$AR(t = this._$AA.nextSibling, i) {
522
- var s;
523
- for (null === (s = this._$AP) || void 0 === s || s.call(this, !1, !0, i); t && t !== this._$AB;) {
528
+ for (this._$AP?.(!1, !0, i); t && t !== this._$AB;) {
524
529
  const i = t.nextSibling;
525
530
  t.remove(), t = i;
526
531
  }
527
532
  }
528
533
  setConnected(t) {
529
- var i;
530
- void 0 === this._$AM && (this._$Cp = t, null === (i = this._$AP) || void 0 === i || i.call(this, t));
531
- }
532
- }
533
- let k$1 = class k {
534
- constructor(t, i, s, e, o) {
535
- this.type = 1, this._$AH = A$2, this._$AN = void 0, this.element = t, this.name = i, this._$AM = e, this.options = o, s.length > 2 || "" !== s[0] || "" !== s[1] ? (this._$AH = Array(s.length - 1).fill(new String()), this.strings = s) : this._$AH = A$2;
534
+ void 0 === this._$AM && (this._$Cv = t, this._$AP?.(t));
536
535
  }
536
+ };
537
+ class R {
537
538
  get tagName() {
538
539
  return this.element.tagName;
539
540
  }
540
541
  get _$AU() {
541
542
  return this._$AM._$AU;
542
543
  }
544
+ constructor(t, i, s, e, h) {
545
+ this.type = 1, this._$AH = T, 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 = T;
546
+ }
543
547
  _$AI(t, i = this, s, e) {
544
- const o = this.strings;
545
- let n = !1;
546
- if (void 0 === o) t = S(this, t, i, 0), n = !d(t) || t !== this._$AH && t !== T, n && (this._$AH = t);else {
548
+ const h = this.strings;
549
+ let o = !1;
550
+ if (void 0 === h) t = N$1(this, t, i, 0), o = !c$4(t) || t !== this._$AH && t !== w$1, o && (this._$AH = t);else {
547
551
  const e = t;
548
- let l, h;
549
- for (t = o[0], l = 0; l < o.length - 1; l++) h = S(this, e[s + l], i, l), h === T && (h = this._$AH[l]), n || (n = !d(h) || h !== this._$AH[l]), h === A$2 ? t = A$2 : t !== A$2 && (t += (null != h ? h : "") + o[l + 1]), this._$AH[l] = h;
552
+ let n, r;
553
+ for (t = h[0], n = 0; n < h.length - 1; n++) r = N$1(this, e[s + n], i, n), r === w$1 && (r = this._$AH[n]), o ||= !c$4(r) || r !== this._$AH[n], r === T ? t = T : t !== T && (t += (r ?? "") + h[n + 1]), this._$AH[n] = r;
550
554
  }
551
- n && !e && this.j(t);
555
+ o && !e && this.O(t);
552
556
  }
553
- j(t) {
554
- t === A$2 ? this.element.removeAttribute(this.name) : this.element.setAttribute(this.name, null != t ? t : "");
557
+ O(t) {
558
+ t === T ? this.element.removeAttribute(this.name) : this.element.setAttribute(this.name, t ?? "");
555
559
  }
556
- };
557
- class H extends k$1 {
560
+ }
561
+ let k$1 = class k extends R {
558
562
  constructor() {
559
563
  super(...arguments), this.type = 3;
560
564
  }
561
- j(t) {
562
- this.element[this.name] = t === A$2 ? void 0 : t;
565
+ O(t) {
566
+ this.element[this.name] = t === T ? void 0 : t;
563
567
  }
564
- }
565
- const I = s$3 ? s$3.emptyScript : "";
566
- class L extends k$1 {
568
+ };
569
+ class H extends R {
567
570
  constructor() {
568
571
  super(...arguments), this.type = 4;
569
572
  }
570
- j(t) {
571
- t && t !== A$2 ? this.element.setAttribute(this.name, I) : this.element.removeAttribute(this.name);
573
+ O(t) {
574
+ this.element.toggleAttribute(this.name, !!t && t !== T);
572
575
  }
573
576
  }
574
- class z extends k$1 {
575
- constructor(t, i, s, e, o) {
576
- super(t, i, s, e, o), this.type = 5;
577
+ class I extends R {
578
+ constructor(t, i, s, e, h) {
579
+ super(t, i, s, e, h), this.type = 5;
577
580
  }
578
581
  _$AI(t, i = this) {
579
- var s;
580
- if ((t = null !== (s = S(this, t, i, 0)) && void 0 !== s ? s : A$2) === T) return;
581
- const e = this._$AH,
582
- o = t === A$2 && e !== A$2 || t.capture !== e.capture || t.once !== e.once || t.passive !== e.passive,
583
- n = t !== A$2 && (e === A$2 || o);
584
- o && this.element.removeEventListener(this.name, this, e), n && this.element.addEventListener(this.name, this, t), this._$AH = t;
582
+ if ((t = N$1(this, t, i, 0) ?? T) === w$1) return;
583
+ const s = this._$AH,
584
+ e = t === T && s !== T || t.capture !== s.capture || t.once !== s.once || t.passive !== s.passive,
585
+ h = t !== T && (s === T || e);
586
+ e && this.element.removeEventListener(this.name, this, s), h && this.element.addEventListener(this.name, this, t), this._$AH = t;
585
587
  }
586
588
  handleEvent(t) {
587
- var i, s;
588
- "function" == typeof this._$AH ? this._$AH.call(null !== (s = null === (i = this.options) || void 0 === i ? void 0 : i.host) && void 0 !== s ? s : this.element, t) : this._$AH.handleEvent(t);
589
+ "function" == typeof this._$AH ? this._$AH.call(this.options?.host ?? this.element, t) : this._$AH.handleEvent(t);
589
590
  }
590
591
  }
591
- class Z {
592
+ class L {
592
593
  constructor(t, i, s) {
593
594
  this.element = t, this.type = 6, this._$AN = void 0, this._$AM = i, this.options = s;
594
595
  }
@@ -596,20 +597,19 @@ class Z {
596
597
  return this._$AM._$AU;
597
598
  }
598
599
  _$AI(t) {
599
- S(this, t);
600
+ N$1(this, t);
600
601
  }
601
602
  }
602
- const B$1 = i$2.litHtmlPolyfillSupport;
603
- null == B$1 || B$1(N$1, R), (null !== (t$1 = i$2.litHtmlVersions) && void 0 !== t$1 ? t$1 : i$2.litHtmlVersions = []).push("2.8.0");
604
- const D$1 = (t, i, s) => {
605
- var e, o;
606
- const n = null !== (e = null == s ? void 0 : s.renderBefore) && void 0 !== e ? e : i;
607
- let l = n._$litPart$;
608
- if (void 0 === l) {
609
- const t = null !== (o = null == s ? void 0 : s.renderBefore) && void 0 !== o ? o : null;
610
- n._$litPart$ = l = new R(i.insertBefore(u(), t), t, void 0, null != s ? s : {});
603
+ const Z = t$1.litHtmlPolyfillSupport;
604
+ Z?.(V, M$1), (t$1.litHtmlVersions ??= []).push("3.1.0");
605
+ const j$1 = (t, i, s) => {
606
+ const e = s?.renderBefore ?? i;
607
+ let h = e._$litPart$;
608
+ if (void 0 === h) {
609
+ const t = s?.renderBefore ?? null;
610
+ e._$litPart$ = h = new M$1(i.insertBefore(l(), t), t, void 0, s ?? {});
611
611
  }
612
- return l._$AI(t), l;
612
+ return h._$AI(t), h;
613
613
  };
614
614
 
615
615
  /**
@@ -617,42 +617,38 @@ const D$1 = (t, i, s) => {
617
617
  * Copyright 2017 Google LLC
618
618
  * SPDX-License-Identifier: BSD-3-Clause
619
619
  */
620
- var l$2, o$1;
621
- let s$2 = class s extends u$1 {
620
+ let s$2 = class s extends b$2 {
622
621
  constructor() {
623
622
  super(...arguments), this.renderOptions = {
624
623
  host: this
625
624
  }, this._$Do = void 0;
626
625
  }
627
626
  createRenderRoot() {
628
- var t, e;
629
- const i = super.createRenderRoot();
630
- return null !== (t = (e = this.renderOptions).renderBefore) && void 0 !== t || (e.renderBefore = i.firstChild), i;
627
+ const t = super.createRenderRoot();
628
+ return this.renderOptions.renderBefore ??= t.firstChild, t;
631
629
  }
632
630
  update(t) {
633
631
  const i = this.render();
634
- this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t), this._$Do = D$1(i, this.renderRoot, this.renderOptions);
632
+ this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t), this._$Do = j$1(i, this.renderRoot, this.renderOptions);
635
633
  }
636
634
  connectedCallback() {
637
- var t;
638
- super.connectedCallback(), null === (t = this._$Do) || void 0 === t || t.setConnected(!0);
635
+ super.connectedCallback(), this._$Do?.setConnected(!0);
639
636
  }
640
637
  disconnectedCallback() {
641
- var t;
642
- super.disconnectedCallback(), null === (t = this._$Do) || void 0 === t || t.setConnected(!1);
638
+ super.disconnectedCallback(), this._$Do?.setConnected(!1);
643
639
  }
644
640
  render() {
645
- return T;
641
+ return w$1;
646
642
  }
647
643
  };
648
- s$2.finalized = !0, s$2._$litElement$ = !0, null === (l$2 = globalThis.litElementHydrateSupport) || void 0 === l$2 || l$2.call(globalThis, {
644
+ s$2._$litElement$ = !0, s$2[("finalized")] = !0, globalThis.litElementHydrateSupport?.({
649
645
  LitElement: s$2
650
646
  });
651
- const n$2 = globalThis.litElementPolyfillSupport;
652
- null == n$2 || n$2({
647
+ const r$2 = globalThis.litElementPolyfillSupport;
648
+ r$2?.({
653
649
  LitElement: s$2
654
650
  });
655
- (null !== (o$1 = globalThis.litElementVersions) && void 0 !== o$1 ? o$1 : globalThis.litElementVersions = []).push("3.3.3");
651
+ (globalThis.litElementVersions ??= []).push("4.0.2");
656
652
 
657
653
  function ascending$1(a, b) {
658
654
  return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
@@ -5617,7 +5613,6 @@ function clipAntimeridianLine(stream) {
5617
5613
  }
5618
5614
  };
5619
5615
  }
5620
-
5621
5616
  function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
5622
5617
  var cosPhi0,
5623
5618
  cosPhi1,
@@ -5887,7 +5882,6 @@ function clipRectangle(x0, y0, x1, y1) {
5887
5882
  function corner(p, direction) {
5888
5883
  return abs(p[0] - x0) < epsilon$1 ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < epsilon$1 ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < epsilon$1 ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
5889
5884
  }
5890
-
5891
5885
  function compareIntersection(a, b) {
5892
5886
  return comparePoint(a.x, b.x);
5893
5887
  }
@@ -7759,7 +7753,6 @@ function timeInterval(floori, offseti, count, field) {
7759
7753
  }
7760
7754
  });
7761
7755
  };
7762
-
7763
7756
  if (count) {
7764
7757
  interval.count = (start, end) => {
7765
7758
  t0.setTime(+start), t1.setTime(+end);
@@ -10340,7 +10333,6 @@ class DecidablesElement extends s$2 {
10340
10333
  };
10341
10334
  /* eslint-enable key-spacing, object-curly-newline */
10342
10335
  }
10343
-
10344
10336
  static cssBoxShadow(elevation, rotate = false, inverse = false) {
10345
10337
  const umbraO = this.shadows.opacityUmbra + this.shadows.opacityBoost;
10346
10338
  const penumbraO = this.shadows.opacityPenumbra + this.shadows.opacityBoost;
@@ -10443,24 +10435,24 @@ class DecidablesElement extends s$2 {
10443
10435
  `;
10444
10436
  }
10445
10437
  static get styles() {
10446
- return i$3`
10438
+ return i$4`
10447
10439
  :host {
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)});
10440
+ ---shadow-0: var(--shadow-0, ${r$5(this.cssBoxShadow(0))});
10441
+ ---shadow-2: var(--shadow-2, ${r$5(this.cssBoxShadow(2))});
10442
+ ---shadow-4: var(--shadow-4, ${r$5(this.cssBoxShadow(4))});
10443
+ ---shadow-8: var(--shadow-8, ${r$5(this.cssBoxShadow(8))});
10444
+
10445
+ ---color-background: var(--color-background, ${r$5(this.greys.white)});
10446
+ ---color-border: var(--color-border, ${r$5(this.greys.light75)});
10447
+ ---color-text: var(--color-text, ${r$5(this.greys.dark75)});
10448
+ ---color-text-inverse: var(--color-text-inverse, ${r$5(this.greys.white)});
10449
+ ---color-link: var(--color-link, ${r$5(this.greys.dark25)});
10450
+ ---color-element-background: var(--color-element-background, ${r$5(this.greys.light75)});
10451
+ ---color-element-disabled: var(--color-element-disabled, ${r$5(this.greys.light50)});
10452
+ ---color-element-enabled: var(--color-element-enabled, ${r$5(this.greys.dark25)});
10453
+ ---color-element-selected: var(--color-element-selected, ${r$5(this.greys.grey)});
10454
+ ---color-element-border: var(--color-element-border, ${r$5(this.greys.dark50)});
10455
+ ---color-element-emphasis: var(--color-element-emphasis, ${r$5(this.greys.dark75)});
10464
10456
 
10465
10457
  ---font-family-base: var(--font-family-base, "Source Sans", sans-serif);
10466
10458
  ---font-family-math: var(--font-family-math, "Source Serif", serif);
@@ -10521,7 +10513,7 @@ class DecidablesButton extends DecidablesElement {
10521
10513
  this.disabled = false;
10522
10514
  }
10523
10515
  static get styles() {
10524
- return [super.styles, i$3`
10516
+ return [super.styles, i$4`
10525
10517
  :host {
10526
10518
  margin: 0.25rem;
10527
10519
  }
@@ -10591,7 +10583,7 @@ customElements.define('decidables-button', DecidablesButton);
10591
10583
  * Copyright 2018 Google LLC
10592
10584
  * SPDX-License-Identifier: BSD-3-Clause
10593
10585
  */
10594
- const l$1 = l => null != l ? l : A$2;
10586
+ const o$2 = o => o ?? T;
10595
10587
 
10596
10588
  class DecidablesSlider extends DecidablesElement {
10597
10589
  static get properties() {
@@ -10646,11 +10638,11 @@ class DecidablesSlider extends DecidablesElement {
10646
10638
  this.value = event.target.value;
10647
10639
  }
10648
10640
  static get styles() {
10649
- return [super.styles, i$3`
10641
+ return [super.styles, i$4`
10650
10642
  :host {
10651
- ---shadow-2-rotate: var(--shadow-2-rotate, ${r$4(this.cssBoxShadow(2, true, false))});
10652
- ---shadow-4-rotate: var(--shadow-4-rotate, ${r$4(this.cssBoxShadow(4, true, false))});
10653
- ---shadow-8-rotate: var(--shadow-8-rotate, ${r$4(this.cssBoxShadow(8, true, false))});
10643
+ ---shadow-2-rotate: var(--shadow-2-rotate, ${r$5(this.cssBoxShadow(2, true, false))});
10644
+ ---shadow-4-rotate: var(--shadow-4-rotate, ${r$5(this.cssBoxShadow(4, true, false))});
10645
+ ---shadow-8-rotate: var(--shadow-8-rotate, ${r$5(this.cssBoxShadow(8, true, false))});
10654
10646
 
10655
10647
  display: flex;
10656
10648
 
@@ -10904,9 +10896,9 @@ class DecidablesSlider extends DecidablesElement {
10904
10896
  <slot></slot>
10905
10897
  </label>
10906
10898
  <div class="range">
10907
- <input type="range" id="slider" min=${l$1(this.min)} max=${l$1(this.max)} step=${l$1(this.step)} .value=${this.value} @change=${this.changed.bind(this)} @input=${this.inputted.bind(this)}>
10899
+ <input type="range" id="slider" min=${o$2(this.min)} max=${o$2(this.max)} step=${o$2(this.step)} .value=${this.value} @change=${this.changed.bind(this)} @input=${this.inputted.bind(this)}>
10908
10900
  </div>
10909
- <decidables-spinner min=${l$1(this.min)} max=${l$1(this.max)} step=${l$1(this.step)} .value=${this.value} @input=${this.inputted.bind(this)}></decidables-spinner>
10901
+ <decidables-spinner min=${o$2(this.min)} max=${o$2(this.max)} step=${o$2(this.step)} .value=${this.value} @input=${this.inputted.bind(this)}></decidables-spinner>
10910
10902
  `;
10911
10903
  }
10912
10904
  }
@@ -10956,7 +10948,7 @@ class DecidablesSpinner extends DecidablesElement {
10956
10948
  this.value = event.target.value;
10957
10949
  }
10958
10950
  static get styles() {
10959
- return [super.styles, i$3`
10951
+ return [super.styles, i$4`
10960
10952
  :host {
10961
10953
  ---decidables-spinner-font-size: var(--decidables-spinner-font-size, 1.125rem);
10962
10954
  ---decidables-spinner-input-width: var(--decidables-spinner-input-width, 4rem);
@@ -11056,7 +11048,7 @@ class DecidablesSpinner extends DecidablesElement {
11056
11048
  return x$2`
11057
11049
  <label>
11058
11050
  <slot></slot>
11059
- <input ?disabled=${this.disabled} type="number" min=${l$1(this.min)} max=${l$1(this.max)} step=${l$1(this.step)} .value=${this.value} @input=${this.inputted.bind(this)}>
11051
+ <input ?disabled=${this.disabled} type="number" min=${o$2(this.min)} max=${o$2(this.max)} step=${o$2(this.step)} .value=${this.value} @input=${this.inputted.bind(this)}>
11060
11052
  </label>
11061
11053
  `;
11062
11054
  }
@@ -11095,7 +11087,7 @@ class DecidablesSwitch extends DecidablesElement {
11095
11087
  }));
11096
11088
  }
11097
11089
  static get styles() {
11098
- return [super.styles, i$3`
11090
+ return [super.styles, i$4`
11099
11091
  :host {
11100
11092
  display: flex;
11101
11093
 
@@ -11247,7 +11239,7 @@ class DecidablesToggle extends DecidablesElement {
11247
11239
  this.disabled = false;
11248
11240
  }
11249
11241
  static get styles() {
11250
- return [super.styles, i$3`
11242
+ return [super.styles, i$4`
11251
11243
  fieldset {
11252
11244
  display: flex;
11253
11245
 
@@ -11322,7 +11314,7 @@ class DecidablesToggleOption extends DecidablesElement {
11322
11314
  }));
11323
11315
  }
11324
11316
  static get styles() {
11325
- return [super.styles, i$3`
11317
+ return [super.styles, i$4`
11326
11318
  :host {
11327
11319
  display: flex;
11328
11320
  }
@@ -11496,12 +11488,11 @@ class DiscountableElement extends DecidablesElement {
11496
11488
  d: schemeSet1[1],
11497
11489
  k: schemeSet1[2],
11498
11490
  v: schemeSet1[3],
11499
- chosen: schemeSet1[8],
11500
- better: '#4545d0',
11501
- worse: '#f032e6',
11502
- even: '#10dbc9',
11503
- correct: '#ffffff',
11504
- error: '#000000',
11491
+ sooner: schemeSet1[5],
11492
+ later: schemeSet1[7],
11493
+ larger: '#4545d0',
11494
+ smaller: '#f032e6',
11495
+ equal: '#10dbc9',
11505
11496
  nr: '#cccccc'
11506
11497
  };
11507
11498
  }
@@ -11518,43 +11509,40 @@ class DiscountableElement extends DecidablesElement {
11518
11509
  }, {});
11519
11510
  }
11520
11511
  static get styles() {
11521
- return [super.styles, i$3`
11512
+ return [super.styles, i$4`
11522
11513
  :host {
11523
- ---color-a: var(--color-a, ${r$4(this.colors.a)});
11524
- ---color-d: var(--color-d, ${r$4(this.colors.d)});
11525
- ---color-k: var(--color-k, ${r$4(this.colors.k)});
11526
- ---color-v: var(--color-v, ${r$4(this.colors.v)});
11527
- ---color-chosen: var(--color-chosen, ${r$4(this.colors.chosen)});
11528
- ---color-better: var(--color-better, ${r$4(this.colors.better)});
11529
- ---color-worse: var(--color-worse, ${r$4(this.colors.worse)});
11530
- ---color-even: var(--color-even, ${r$4(this.colors.even)});
11531
- ---color-correct: var(--color-correct, ${r$4(this.colors.correct)});
11532
- ---color-error: var(--color-error, ${r$4(this.colors.error)});
11533
- ---color-nr: var(--color-nr, ${r$4(this.colors.nr)});
11534
-
11535
- ---color-a-light: var(--color-a-light, ${r$4(this.lights.a)});
11536
- ---color-d-light: var(--color-d-light, ${r$4(this.lights.d)});
11537
- ---color-k-light: var(--color-k-light, ${r$4(this.lights.k)});
11538
- ---color-v-light: var(--color-v-light, ${r$4(this.lights.v)});
11539
- ---color-chosen-light: var(--color-chosen-light, ${r$4(this.lights.chosen)});
11540
- ---color-better-light: var(--color-better-light, ${r$4(this.lights.better)});
11541
- ---color-worse-light: var(--color-worse-light, ${r$4(this.lights.worse)});
11542
- ---color-even-light: var(--color-even-light, ${r$4(this.lights.even)});
11543
- ---color-correct-light: var(--color-correct-light, ${r$4(this.lights.correct)});
11544
- ---color-error-light: var(--color-error-light, ${r$4(this.lights.error)});
11545
- ---color-nr-light: var(--color-nr-light, ${r$4(this.lights.nr)});
11546
-
11547
- ---color-a-dark: var(--color-a-dark, ${r$4(this.darks.a)});
11548
- ---color-d-dark: var(--color-d-dark, ${r$4(this.darks.d)});
11549
- ---color-k-dark: var(--color-k-dark, ${r$4(this.darks.k)});
11550
- ---color-v-dark: var(--color-v-dark, ${r$4(this.darks.v)});
11551
- ---color-chosen-dark: var(--color-chosen-dark, ${r$4(this.darks.chosen)});
11552
- ---color-better-dark: var(--color-better-dark, ${r$4(this.darks.better)});
11553
- ---color-worse-dark: var(--color-worse-dark, ${r$4(this.darks.worse)});
11554
- ---color-even-dark: var(--color-even-dark, ${r$4(this.darks.even)});
11555
- ---color-correct-dark: var(--color-correct-dark, ${r$4(this.darks.correct)});
11556
- ---color-error-dark: var(--color-error-dark, ${r$4(this.darks.error)});
11557
- ---color-nr-dark: var(--color-nr-dark, ${r$4(this.darks.nr)});
11514
+ ---color-a: var(--color-a, ${r$5(this.colors.a)});
11515
+ ---color-d: var(--color-d, ${r$5(this.colors.d)});
11516
+ ---color-k: var(--color-k, ${r$5(this.colors.k)});
11517
+ ---color-v: var(--color-v, ${r$5(this.colors.v)});
11518
+ ---color-sooner: var(--color-sooner, ${r$5(this.colors.sooner)});
11519
+ ---color-later: var(--color-later, ${r$5(this.colors.later)});
11520
+ ---color-larger: var(--color-larger, ${r$5(this.colors.larger)});
11521
+ ---color-smaller: var(--color-smaller, ${r$5(this.colors.smaller)});
11522
+ ---color-equal: var(--color-equal, ${r$5(this.colors.equal)});
11523
+ ---color-nr: var(--color-nr, ${r$5(this.colors.nr)});
11524
+
11525
+ ---color-a-light: var(--color-a-light, ${r$5(this.lights.a)});
11526
+ ---color-d-light: var(--color-d-light, ${r$5(this.lights.d)});
11527
+ ---color-k-light: var(--color-k-light, ${r$5(this.lights.k)});
11528
+ ---color-v-light: var(--color-v-light, ${r$5(this.lights.v)});
11529
+ ---color-sooner-light: var(--color-sooner-light, ${r$5(this.lights.sooner)});
11530
+ ---color-later-light: var(--color-later-light, ${r$5(this.lights.later)});
11531
+ ---color-larger-light: var(--color-larger-light, ${r$5(this.lights.larger)});
11532
+ ---color-smaller-light: var(--color-smaller-light, ${r$5(this.lights.smaller)});
11533
+ ---color-equal-light: var(--color-equal-light, ${r$5(this.lights.equal)});
11534
+ ---color-nr-light: var(--color-nr-light, ${r$5(this.lights.nr)});
11535
+
11536
+ ---color-a-dark: var(--color-a-dark, ${r$5(this.darks.a)});
11537
+ ---color-d-dark: var(--color-d-dark, ${r$5(this.darks.d)});
11538
+ ---color-k-dark: var(--color-k-dark, ${r$5(this.darks.k)});
11539
+ ---color-v-dark: var(--color-v-dark, ${r$5(this.darks.v)});
11540
+ ---color-sooner-dark: var(--color-sooner-dark, ${r$5(this.darks.sooner)});
11541
+ ---color-later-dark: var(--color-later-dark, ${r$5(this.darks.later)});
11542
+ ---color-larger-dark: var(--color-larger-dark, ${r$5(this.darks.larger)});
11543
+ ---color-smaller-dark: var(--color-smaller-dark, ${r$5(this.darks.smaller)});
11544
+ ---color-equal-dark: var(--color-equal-dark, ${r$5(this.darks.equal)});
11545
+ ---color-nr-dark: var(--color-nr-dark, ${r$5(this.darks.nr)});
11558
11546
  }
11559
11547
  `];
11560
11548
  }
@@ -11659,7 +11647,7 @@ class DiscountableControl extends DiscountableElement {
11659
11647
  this.state = 'ended';
11660
11648
  }
11661
11649
  static get styles() {
11662
- return [super.styles, i$3`
11650
+ return [super.styles, i$4`
11663
11651
  :host {
11664
11652
  display: inline-block;
11665
11653
  }
@@ -11759,7 +11747,6 @@ class DiscountableResponse extends DiscountableElement {
11759
11747
  this.responses = ['first', 'second', 'nr']; // Possible values of 'response'
11760
11748
  this.response = undefined; // Response for current trial
11761
11749
  }
11762
-
11763
11750
  start(as, ds, al, dl, trial) {
11764
11751
  this.state = 'waiting';
11765
11752
  this.as = as;
@@ -11802,7 +11789,7 @@ class DiscountableResponse extends DiscountableElement {
11802
11789
  this.response = undefined;
11803
11790
  }
11804
11791
  static get styles() {
11805
- return [super.styles, i$3`
11792
+ return [super.styles, i$4`
11806
11793
  :host {
11807
11794
  display: inline-block;
11808
11795
  }
@@ -11850,11 +11837,11 @@ class DiscountableResponse extends DiscountableElement {
11850
11837
  }
11851
11838
 
11852
11839
  .selected[disabled][name="first"] {
11853
- --decidables-button-background-color: var(---color-worse);
11840
+ --decidables-button-background-color: var(---color-sooner);
11854
11841
  }
11855
11842
 
11856
11843
  .selected[disabled][name="second"] {
11857
- --decidables-button-background-color: var(---color-better);
11844
+ --decidables-button-background-color: var(---color-later);
11858
11845
  }
11859
11846
 
11860
11847
  /* Feedback messages */
@@ -11887,11 +11874,11 @@ class DiscountableResponse extends DiscountableElement {
11887
11874
  }
11888
11875
 
11889
11876
  .feedback.first {
11890
- background-color: var(---color-worse-light);
11877
+ background-color: var(---color-sooner-light);
11891
11878
  }
11892
11879
 
11893
11880
  .feedback.second {
11894
- background-color: var(---color-better-light);
11881
+ background-color: var(---color-later-light);
11895
11882
  }
11896
11883
 
11897
11884
  .feedback.nr {
@@ -11950,7 +11937,7 @@ const t = {
11950
11937
  EVENT: 5,
11951
11938
  ELEMENT: 6
11952
11939
  },
11953
- e$1 = t => (...e) => ({
11940
+ e = t => (...e) => ({
11954
11941
  _$litDirective$: t,
11955
11942
  values: e
11956
11943
  });
@@ -11975,7 +11962,7 @@ let i$1 = class i {
11975
11962
  * Copyright 2020 Google LLC
11976
11963
  * SPDX-License-Identifier: BSD-3-Clause
11977
11964
  */
11978
- const e = o => void 0 === o.strings;
11965
+ const f$1 = o => void 0 === o.strings;
11979
11966
 
11980
11967
  /**
11981
11968
  * @license
@@ -11983,41 +11970,39 @@ const e = o => void 0 === o.strings;
11983
11970
  * SPDX-License-Identifier: BSD-3-Clause
11984
11971
  */
11985
11972
  const s = (i, t) => {
11986
- var e, o;
11987
- const r = i._$AN;
11988
- if (void 0 === r) return !1;
11989
- for (const i of r) null === (o = (e = i)._$AO) || void 0 === o || o.call(e, t, !1), s(i, t);
11973
+ const e = i._$AN;
11974
+ if (void 0 === e) return !1;
11975
+ for (const i of e) i._$AO?.(t, !1), s(i, t);
11990
11976
  return !0;
11991
11977
  },
11992
- o = i => {
11978
+ o$1 = i => {
11993
11979
  let t, e;
11994
11980
  do {
11995
11981
  if (void 0 === (t = i._$AM)) break;
11996
11982
  e = t._$AN, e.delete(i), i = t;
11997
- } while (0 === (null == e ? void 0 : e.size));
11983
+ } while (0 === e?.size);
11998
11984
  },
11999
11985
  r$1 = i => {
12000
11986
  for (let t; t = i._$AM; i = t) {
12001
11987
  let e = t._$AN;
12002
11988
  if (void 0 === e) t._$AN = e = new Set();else if (e.has(i)) break;
12003
- e.add(i), l(t);
11989
+ e.add(i), c(t);
12004
11990
  }
12005
11991
  };
12006
- function n$1(i) {
12007
- void 0 !== this._$AN ? (o(this), this._$AM = i, r$1(this)) : this._$AM = i;
11992
+ function h(i) {
11993
+ void 0 !== this._$AN ? (o$1(this), this._$AM = i, r$1(this)) : this._$AM = i;
12008
11994
  }
12009
- function h$1(i, t = !1, e = 0) {
11995
+ function n$1(i, t = !1, e = 0) {
12010
11996
  const r = this._$AH,
12011
- n = this._$AN;
12012
- if (void 0 !== n && 0 !== n.size) if (t) {
12013
- if (Array.isArray(r)) for (let i = e; i < r.length; i++) s(r[i], !1), o(r[i]);else null != r && (s(r, !1), o(r));
11997
+ h = this._$AN;
11998
+ if (void 0 !== h && 0 !== h.size) if (t) {
11999
+ if (Array.isArray(r)) for (let i = e; i < r.length; i++) s(r[i], !1), o$1(r[i]);else null != r && (s(r, !1), o$1(r));
12014
12000
  } else s(this, i);
12015
12001
  }
12016
- const l = i => {
12017
- var t$1, s, o, r;
12018
- i.type == t.CHILD && (null !== (t$1 = (o = i)._$AP) && void 0 !== t$1 || (o._$AP = h$1), null !== (s = (r = i)._$AQ) && void 0 !== s || (r._$AQ = n$1));
12002
+ const c = i => {
12003
+ i.type == t.CHILD && (i._$AP ??= n$1, i._$AQ ??= h);
12019
12004
  };
12020
- class c extends i$1 {
12005
+ class f extends i$1 {
12021
12006
  constructor() {
12022
12007
  super(...arguments), this._$AN = void 0;
12023
12008
  }
@@ -12025,11 +12010,10 @@ class c extends i$1 {
12025
12010
  super._$AT(i, t, e), r$1(this), this.isConnected = i._$AU;
12026
12011
  }
12027
12012
  _$AO(i, t = !0) {
12028
- var e, r;
12029
- i !== this.isConnected && (this.isConnected = i, i ? null === (e = this.reconnected) || void 0 === e || e.call(this) : null === (r = this.disconnected) || void 0 === r || r.call(this)), t && (s(this, i), o(this));
12013
+ i !== this.isConnected && (this.isConnected = i, i ? this.reconnected?.() : this.disconnected?.()), t && (s(this, i), o$1(this));
12030
12014
  }
12031
12015
  setValue(t) {
12032
- if (e(this._$Ct)) this._$Ct._$AI(t, this);else {
12016
+ if (f$1(this._$Ct)) this._$Ct._$AI(t, this);else {
12033
12017
  const i = [...this._$Ct._$AH];
12034
12018
  i[this._$Ci] = t, this._$Ct._$AI(i, this, 0);
12035
12019
  }
@@ -12040,11 +12024,11 @@ class c extends i$1 {
12040
12024
 
12041
12025
  const i = new WeakMap();
12042
12026
 
12043
- let h = 0;
12027
+ let o = 0;
12044
12028
  const r = new Map(),
12045
12029
  n = new WeakSet(),
12046
12030
  a = () => new Promise(t => requestAnimationFrame(t)),
12047
- p = [{
12031
+ v = [{
12048
12032
  opacity: 0
12049
12033
  }, {
12050
12034
  opacity: 1
@@ -12103,60 +12087,54 @@ const r = new Map(),
12103
12087
  },
12104
12088
  b = ["left", "top", "width", "height", "opacity", "color", "background"],
12105
12089
  j = new WeakMap();
12106
- class x extends c {
12090
+ class x extends f {
12107
12091
  constructor(t$1) {
12108
12092
  if (super(t$1), this.t = null, this.i = null, this.o = !0, this.shouldLog = !1, t$1.type === t.CHILD) throw Error("The `animate` directive must be used in attribute position.");
12109
12093
  this.createFinished();
12110
12094
  }
12111
12095
  createFinished() {
12112
- var t;
12113
- null === (t = this.resolveFinished) || void 0 === t || t.call(this), this.finished = new Promise(t => {
12096
+ this.resolveFinished?.(), this.finished = new Promise(t => {
12114
12097
  this.h = t;
12115
12098
  });
12116
12099
  }
12117
12100
  async resolveFinished() {
12118
- var t;
12119
- null === (t = this.h) || void 0 === t || t.call(this), this.h = void 0;
12101
+ this.h?.(), this.h = void 0;
12120
12102
  }
12121
12103
  render(i) {
12122
- return A$2;
12104
+ return T;
12123
12105
  }
12124
12106
  getController() {
12125
12107
  return i.get(this.l);
12126
12108
  }
12127
12109
  isDisabled() {
12128
- var t;
12129
- return this.options.disabled || (null === (t = this.getController()) || void 0 === t ? void 0 : t.disabled);
12110
+ return this.options.disabled || this.getController()?.disabled;
12130
12111
  }
12131
12112
  update(t, [i]) {
12132
- var s;
12133
- const e = void 0 === this.l;
12134
- return e && (this.l = null === (s = t.options) || void 0 === s ? void 0 : s.host, this.l.addController(this), this.element = t.element, j.set(this.element, this)), this.optionsOrCallback = i, (e || "function" != typeof i) && this.u(i), this.render(i);
12113
+ const s = void 0 === this.l;
12114
+ return s && (this.l = t.options?.host, this.l.addController(this), this.element = t.element, j.set(this.element, this)), this.optionsOrCallback = i, (s || "function" != typeof i) && this.u(i), this.render(i);
12135
12115
  }
12136
12116
  u(t) {
12137
- var i, s;
12138
- t = null != t ? t : {};
12139
- const e = this.getController();
12140
- void 0 !== e && ((t = {
12141
- ...e.defaultOptions,
12117
+ t = t ?? {};
12118
+ const i = this.getController();
12119
+ void 0 !== i && ((t = {
12120
+ ...i.defaultOptions,
12142
12121
  ...t
12143
12122
  }).keyframeOptions = {
12144
- ...e.defaultOptions.keyframeOptions,
12123
+ ...i.defaultOptions.keyframeOptions,
12145
12124
  ...t.keyframeOptions
12146
- }), null !== (i = (s = t).properties) && void 0 !== i || (s.properties = b), this.options = t;
12125
+ }), t.properties ??= b, this.options = t;
12147
12126
  }
12148
- v() {
12127
+ p() {
12149
12128
  const t = {},
12150
12129
  i = this.element.getBoundingClientRect(),
12151
12130
  s = getComputedStyle(this.element);
12152
12131
  return this.options.properties.forEach(e => {
12153
- var o;
12154
- const h = null !== (o = i[e]) && void 0 !== o ? o : N[e] ? void 0 : s[e],
12155
- r = Number(h);
12156
- t[e] = isNaN(r) ? h + "" : r;
12132
+ const h = i[e] ?? (N[e] ? void 0 : s[e]),
12133
+ o = Number(h);
12134
+ t[e] = isNaN(o) ? h + "" : o;
12157
12135
  }), t;
12158
12136
  }
12159
- p() {
12137
+ m() {
12160
12138
  let t,
12161
12139
  i = !0;
12162
12140
  return this.options.guard && (t = this.options.guard(), i = ((t, i) => {
@@ -12164,11 +12142,10 @@ class x extends c {
12164
12142
  if (Array.isArray(i) && i.length === t.length && t.every((t, s) => t === i[s])) return !1;
12165
12143
  } else if (i === t) return !1;
12166
12144
  return !0;
12167
- })(t, this.m)), this.o = this.l.hasUpdated && !this.isDisabled() && !this.isAnimating() && i && this.element.isConnected, this.o && (this.m = Array.isArray(t) ? Array.from(t) : t), this.o;
12145
+ })(t, this.v)), this.o = this.l.hasUpdated && !this.isDisabled() && !this.isAnimating() && i && this.element.isConnected, this.o && (this.v = Array.isArray(t) ? Array.from(t) : t), this.o;
12168
12146
  }
12169
12147
  hostUpdate() {
12170
- var t;
12171
- "function" == typeof this.optionsOrCallback && this.u(this.optionsOrCallback()), this.p() && (this.g = this.v(), this.t = null !== (t = this.t) && void 0 !== t ? t : this.element.parentNode, this.i = this.element.nextSibling);
12148
+ "function" == typeof this.optionsOrCallback && this.u(this.optionsOrCallback()), this.m() && (this.g = this.p(), this.t = this.t ?? this.element.parentNode, this.i = this.element.nextSibling);
12172
12149
  }
12173
12150
  async hostUpdated() {
12174
12151
  if (!this.o || !this.element.isConnected || this.options.skipInitial && !this.isHostRendered) return;
@@ -12176,69 +12153,64 @@ class x extends c {
12176
12153
  this.prepare(), await a;
12177
12154
  const i = this._(),
12178
12155
  s = this.A(this.options.keyframeOptions, i),
12179
- e = this.v();
12156
+ e = this.p();
12180
12157
  if (void 0 !== this.g) {
12181
12158
  const {
12182
12159
  from: s,
12183
- to: o
12160
+ to: h
12184
12161
  } = this.O(this.g, e, i);
12185
- this.log("measured", [this.g, e, s, o]), t = this.calculateKeyframes(s, o);
12162
+ this.log("measured", [this.g, e, s, h]), t = this.calculateKeyframes(s, h);
12186
12163
  } else {
12187
12164
  const s = r.get(this.options.inId);
12188
12165
  if (s) {
12189
12166
  r.delete(this.options.inId);
12190
12167
  const {
12191
- from: o,
12168
+ from: h,
12192
12169
  to: n
12193
12170
  } = this.O(s, e, i);
12194
- t = this.calculateKeyframes(o, n), t = this.options.in ? [{
12171
+ t = this.calculateKeyframes(h, n), t = this.options.in ? [{
12195
12172
  ...this.options.in[0],
12196
12173
  ...t[0]
12197
- }, ...this.options.in.slice(1), t[1]] : t, h++, t.forEach(t => t.zIndex = h);
12174
+ }, ...this.options.in.slice(1), t[1]] : t, o++, t.forEach(t => t.zIndex = o);
12198
12175
  } else this.options.in && (t = [...this.options.in, {}]);
12199
12176
  }
12200
12177
  this.animate(t, s);
12201
12178
  }
12202
12179
  resetStyles() {
12203
- var t;
12204
- void 0 !== this.j && (this.element.setAttribute("style", null !== (t = this.j) && void 0 !== t ? t : ""), this.j = void 0);
12180
+ void 0 !== this.j && (this.element.setAttribute("style", this.j ?? ""), this.j = void 0);
12205
12181
  }
12206
12182
  commitStyles() {
12207
- var t, i;
12208
- this.j = this.element.getAttribute("style"), null === (t = this.webAnimation) || void 0 === t || t.commitStyles(), null === (i = this.webAnimation) || void 0 === i || i.cancel();
12183
+ this.j = this.element.getAttribute("style"), this.webAnimation?.commitStyles(), this.webAnimation?.cancel();
12209
12184
  }
12210
12185
  reconnected() {}
12211
12186
  async disconnected() {
12212
- var t;
12213
12187
  if (!this.o) return;
12214
12188
  if (void 0 !== this.options.id && r.set(this.options.id, this.g), void 0 === this.options.out) return;
12215
- if (this.prepare(), await a(), null === (t = this.t) || void 0 === t ? void 0 : t.isConnected) {
12189
+ if (this.prepare(), await a(), this.t?.isConnected) {
12216
12190
  const t = this.i && this.i.parentNode === this.t ? this.i : null;
12217
12191
  if (this.t.insertBefore(this.element, t), this.options.stabilizeOut) {
12218
- const t = this.v();
12192
+ const t = this.p();
12219
12193
  this.log("stabilizing out");
12220
12194
  const i = this.g.left - t.left,
12221
12195
  s = this.g.top - t.top;
12222
12196
  !("static" === getComputedStyle(this.element).position) || 0 === i && 0 === s || (this.element.style.position = "relative"), 0 !== i && (this.element.style.left = i + "px"), 0 !== s && (this.element.style.top = s + "px");
12223
12197
  }
12224
12198
  }
12225
- const i = this.A(this.options.keyframeOptions);
12226
- await this.animate(this.options.out, i), this.element.remove();
12199
+ const t = this.A(this.options.keyframeOptions);
12200
+ await this.animate(this.options.out, t), this.element.remove();
12227
12201
  }
12228
12202
  prepare() {
12229
12203
  this.createFinished();
12230
12204
  }
12231
12205
  start() {
12232
- var t, i;
12233
- null === (i = (t = this.options).onStart) || void 0 === i || i.call(t, this);
12206
+ this.options.onStart?.(this);
12234
12207
  }
12235
12208
  didFinish(t) {
12236
- var i, s;
12237
- t && (null === (s = (i = this.options).onComplete) || void 0 === s || s.call(i, this)), this.g = void 0, this.animatingProperties = void 0, this.frames = void 0, this.resolveFinished();
12209
+ t && this.options.onComplete?.(this), this.g = void 0, this.animatingProperties = void 0, this.frames = void 0, this.resolveFinished();
12238
12210
  }
12239
12211
  _() {
12240
12212
  const t = [];
12241
- for (let i = this.element.parentNode; i; i = null == i ? void 0 : i.parentNode) {
12213
+ for (let i = this.element.parentNode; i; i = i?.parentNode) {
12242
12214
  const s = j.get(i);
12243
12215
  s && !s.isDisabled() && s && t.push(s);
12244
12216
  }
@@ -12263,32 +12235,31 @@ class x extends c {
12263
12235
  ...i
12264
12236
  };
12265
12237
  const e = s.map(t => t.animatingProperties).filter(t => void 0 !== t);
12266
- let o = 1,
12267
- h = 1;
12238
+ let h = 1,
12239
+ o = 1;
12268
12240
  return void 0 !== e && (e.forEach(t => {
12269
- t.width && (o /= t.width), t.height && (h /= t.height);
12270
- }), void 0 !== t.left && void 0 !== i.left && (t.left = o * t.left, i.left = o * i.left), void 0 !== t.top && void 0 !== i.top && (t.top = h * t.top, i.top = h * i.top)), {
12241
+ t.width && (h /= t.width), t.height && (o /= t.height);
12242
+ }), 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)), {
12271
12243
  from: t,
12272
12244
  to: i
12273
12245
  };
12274
12246
  }
12275
12247
  calculateKeyframes(t, i, s = !1) {
12276
- var e;
12277
- const o = {},
12248
+ const e = {},
12278
12249
  h = {};
12279
- let r = !1;
12280
- const n = {};
12250
+ let o = !1;
12251
+ const r = {};
12281
12252
  for (const s in i) {
12282
- const a = t[s],
12283
- l = i[s];
12253
+ const n = t[s],
12254
+ a = i[s];
12284
12255
  if (s in N) {
12285
12256
  const t = N[s];
12286
- if (void 0 === a || void 0 === l) continue;
12287
- const i = t(a, l);
12288
- void 0 !== i.transform && (n[s] = i.value, r = !0, o.transform = `${null !== (e = o.transform) && void 0 !== e ? e : ""} ${i.transform}`, void 0 !== i.overrideFrom && Object.assign(o, i.overrideFrom));
12289
- } else a !== l && void 0 !== a && void 0 !== l && (r = !0, o[s] = a, h[s] = l);
12257
+ if (void 0 === n || void 0 === a) continue;
12258
+ const i = t(n, a);
12259
+ void 0 !== i.transform && (r[s] = i.value, o = !0, e.transform = `${e.transform ?? ""} ${i.transform}`, void 0 !== i.overrideFrom && Object.assign(e, i.overrideFrom));
12260
+ } else n !== a && void 0 !== n && void 0 !== a && (o = !0, e[s] = n, h[s] = a);
12290
12261
  }
12291
- return o.transformOrigin = h.transformOrigin = s ? "center center" : "top left", this.animatingProperties = n, r ? [o, h] : void 0;
12262
+ return e.transformOrigin = h.transformOrigin = s ? "center center" : "top left", this.animatingProperties = r, o ? [e, h] : void 0;
12292
12263
  }
12293
12264
  async animate(t, i = this.options.keyframeOptions) {
12294
12265
  this.start(), this.frames = t;
@@ -12296,23 +12267,22 @@ class x extends c {
12296
12267
  if (!this.isAnimating() && !this.isDisabled() && (this.options.onFrames && (this.frames = t = this.options.onFrames(this), this.log("modified frames", t)), void 0 !== t)) {
12297
12268
  this.log("animate", [t, i]), s = !0, this.webAnimation = this.element.animate(t, i);
12298
12269
  const e = this.getController();
12299
- null == e || e.add(this);
12270
+ e?.add(this);
12300
12271
  try {
12301
12272
  await this.webAnimation.finished;
12302
12273
  } catch (t) {}
12303
- null == e || e.remove(this);
12274
+ e?.remove(this);
12304
12275
  }
12305
12276
  return this.didFinish(s), s;
12306
12277
  }
12307
12278
  isAnimating() {
12308
- var t, i;
12309
- return "running" === (null === (t = this.webAnimation) || void 0 === t ? void 0 : t.playState) || (null === (i = this.webAnimation) || void 0 === i ? void 0 : i.pending);
12279
+ return "running" === this.webAnimation?.playState || this.webAnimation?.pending;
12310
12280
  }
12311
12281
  log(t, i) {
12312
12282
  this.shouldLog && !this.isDisabled() && console.log(t, this.options.id, i);
12313
12283
  }
12314
12284
  }
12315
- const F = e$1(x);
12285
+ const F = e(x);
12316
12286
 
12317
12287
  /*
12318
12288
  HTDMath Static Class - Not intended for instantiation!
@@ -12355,7 +12325,7 @@ class HTDEquation extends DiscountableElement {
12355
12325
  this.numeric = false;
12356
12326
  }
12357
12327
  static get styles() {
12358
- return [super.styles, i$3`
12328
+ return [super.styles, i$4`
12359
12329
  :host {
12360
12330
  display: block;
12361
12331
 
@@ -12623,7 +12593,7 @@ class HTDCalculation extends HTDEquation {
12623
12593
  this.sendEvent();
12624
12594
  }
12625
12595
  static get styles() {
12626
- return [super.styles, i$3`
12596
+ return [super.styles, i$4`
12627
12597
  /* :host {
12628
12598
  display: inline-block;
12629
12599
  } */
@@ -12670,11 +12640,11 @@ class HTDCalculation extends HTDEquation {
12670
12640
  <var class="math-var">V<sub class="subscript">ll</sub></var>
12671
12641
  </decidables-spinner>`;
12672
12642
  vDiff = x$2`${this.vDiff > 0 ? x$2`<span class="comparison" ${F({
12673
- in: p
12643
+ in: v
12674
12644
  })}>&gt;</span>` : this.vDiff < 0 ? x$2`<span class="comparison" ${F({
12675
- in: p
12645
+ in: v
12676
12646
  })}>&lt;</span>` : x$2`<span class="comparison" ${F({
12677
- in: p
12647
+ in: v
12678
12648
  })}>=</span>`}`;
12679
12649
  } else {
12680
12650
  as = x$2`<var class="math-var a as">A<sub class="subscript">ss</sub></var>`;
@@ -12907,7 +12877,7 @@ class HTDCurves extends DecidablesMixinResizeable(DiscountableElement) {
12907
12877
  this.requestUpdate();
12908
12878
  }
12909
12879
  static get styles() {
12910
- return [super.styles, i$3`
12880
+ return [super.styles, i$4`
12911
12881
  :host {
12912
12882
  display: inline-block;
12913
12883
 
@@ -13060,7 +13030,6 @@ class HTDCurves extends DecidablesMixinResizeable(DiscountableElement) {
13060
13030
  // ${DiscountableElement.svgFilters}
13061
13031
  // `;
13062
13032
  }
13063
-
13064
13033
  update(changedProperties) {
13065
13034
  super.update(changedProperties);
13066
13035
  this.alignState();
@@ -13289,7 +13258,6 @@ class HTDCurves extends DecidablesMixinResizeable(DiscountableElement) {
13289
13258
  break;
13290
13259
  // no-op
13291
13260
  }
13292
-
13293
13261
  keyK = keyK < this.scale.discount.min ? this.scale.discount.min : keyK > this.scale.discount.max ? this.scale.discount.max : this.scale.discount.round(keyK);
13294
13262
  if (keyK !== this.k) {
13295
13263
  this.k = keyK;
@@ -13358,7 +13326,6 @@ class HTDCurves extends DecidablesMixinResizeable(DiscountableElement) {
13358
13326
  break;
13359
13327
  // no-op
13360
13328
  }
13361
-
13362
13329
  keyD = keyD < this.scale.time.min ? this.scale.time.min : keyD > this.scale.time.max ? this.scale.time.max : keyD;
13363
13330
  if (keyD !== datum.d) {
13364
13331
  datum.d = keyD;
@@ -13430,7 +13397,6 @@ class HTDCurves extends DecidablesMixinResizeable(DiscountableElement) {
13430
13397
  break;
13431
13398
  // no-op
13432
13399
  }
13433
-
13434
13400
  keyA = keyA < this.scale.value.min ? this.scale.value.min : keyA > this.scale.value.max ? this.scale.value.max : keyA;
13435
13401
  if (keyA !== datum.a) {
13436
13402
  datum.a = keyA;
@@ -13623,7 +13589,6 @@ const tickIntervals = [["millisecond", 1], ["2 milliseconds", 2], ["5 millisecon
13623
13589
  // https://github.com/d3/d3-time/issues/46
13624
13590
  ["year", durationYear], ["2 years", 2 * durationYear], ["5 years", 5 * durationYear], ["10 years", 10 * durationYear], ["20 years", 20 * durationYear], ["50 years", 50 * durationYear], ["100 years", 100 * durationYear] // TODO generalize to longer time scales
13625
13591
  ];
13626
-
13627
13592
  const durations = new Map([["second", durationSecond], ["minute", durationMinute], ["hour", durationHour], ["day", durationDay], ["monday", durationWeek], ["tuesday", durationWeek], ["wednesday", durationWeek], ["thursday", durationWeek], ["friday", durationWeek], ["saturday", durationWeek], ["sunday", durationWeek], ["week", durationWeek], ["month", durationMonth], ["year", durationYear]]);
13628
13593
  const timeIntervals = new Map([["second", second$1], ["minute", timeMinute], ["hour", timeHour], ["day", timeDay],
13629
13594
  // https://github.com/d3/d3-time/issues/62
@@ -14183,7 +14148,6 @@ function isColor(value) {
14183
14148
  namedColors.has(value) // currentColor, red, etc.
14184
14149
  ;
14185
14150
  }
14186
-
14187
14151
  function isOpacity(value) {
14188
14152
  return typeof value === "number" && (0 <= value && value <= 1 || isNaN(value));
14189
14153
  }
@@ -15255,7 +15219,6 @@ function applyClip(selection, mark, dimensions, context) {
15255
15219
  this.appendChild(selection.node());
15256
15220
  selection.node = () => this; // Note: mutation!
15257
15221
  });
15258
-
15259
15222
  break;
15260
15223
  }
15261
15224
  case "sphere":
@@ -15823,7 +15786,6 @@ function createScaleQ(key, scale, channels, {
15823
15786
  range = Float64Array.from(domain, (_, i) => i / (domain.length - 1));
15824
15787
  if (range.length === 2) range = unit; // optimize common case of [0, 1]
15825
15788
  }
15826
-
15827
15789
  scale.interpolate((range === unit ? constant : interpolatePiecewise)(interpolate));
15828
15790
  } else {
15829
15791
  scale.interpolate(interpolate);
@@ -15842,7 +15804,6 @@ function createScaleQ(key, scale, channels, {
15842
15804
  else domain[0] = 0; // [1, 2] or [-1, -2]
15843
15805
  }
15844
15806
  }
15845
-
15846
15807
  if (reverse$1) domain = reverse(domain);
15847
15808
  scale.domain(domain).unknown(unknown);
15848
15809
  if (nice) scale.nice(maybeNice(nice, type)), domain = scale.domain();
@@ -15941,7 +15902,6 @@ function createScaleQuantize(key, channels, {
15941
15902
  thresholds = quantize(interpolateNumber(min, max), n + 1).slice(1, -1); // exactly n - 1 thresholds to match range
15942
15903
  if (min instanceof Date) thresholds = thresholds.map(x => new Date(x)); // preserve date types
15943
15904
  }
15944
-
15945
15905
  if (orderof(arrayify(domain)) < 0) thresholds.reverse(); // preserve descending domain
15946
15906
  return createScaleThreshold(key, channels, {
15947
15907
  domain: thresholds,
@@ -16254,7 +16214,6 @@ function createScaleOrdinal(key, channels, {
16254
16214
  range = maybeBooleanRange(domain, scheme);
16255
16215
  if (range !== undefined) scheme = undefined; // Don’t re-apply scheme.
16256
16216
  }
16257
-
16258
16217
  if (scheme === undefined && range === undefined) {
16259
16218
  scheme = type === "ordinal" ? "turbo" : "tableau10";
16260
16219
  }
@@ -16339,7 +16298,6 @@ function inferHint(channels, key) {
16339
16298
  // first hint
16340
16299
  else if (value !== candidate) return; // inconsistent hint
16341
16300
  }
16342
-
16343
16301
  return value;
16344
16302
  }
16345
16303
  function inferSymbolHint(channels) {
@@ -17457,7 +17415,6 @@ function composeRender(r1, r2) {
17457
17415
  });
17458
17416
  };
17459
17417
  }
17460
-
17461
17418
  function maybeChannels(channels) {
17462
17419
  return Object.fromEntries(Object.entries(maybeNamed(channels)).map(([name, channel]) => {
17463
17420
  channel = typeof channel === "string" ? {
@@ -17474,7 +17431,6 @@ function maybeChannels(channels) {
17474
17431
  function maybeTip(tip) {
17475
17432
  return tip === true ? "xy" : tip === false || tip == null ? null : typeof tip === "string" ? keyword(tip, "tip", ["x", "y", "xy"]) : tip; // tip options object
17476
17433
  }
17477
-
17478
17434
  function withTip(options, pointer) {
17479
17435
  return options?.tip === true ? {
17480
17436
  ...options,
@@ -17683,7 +17639,6 @@ function pointerK(kx, ky, {
17683
17639
  else state.sticky = true, render(i);
17684
17640
  event.stopImmediatePropagation(); // suppress other pointers
17685
17641
  }
17686
-
17687
17642
  function pointerleave(event) {
17688
17643
  if (event.pointerType !== "mouse") return;
17689
17644
  if (!state.sticky) update(null);
@@ -19405,7 +19360,6 @@ function axisMark(mark, k, anchor, ariaLabel, data, options, initialize) {
19405
19360
  data = data.filter(d => domainSet.has(d));
19406
19361
  if (!data.length) warn(`Warning: the ${k}-axis ticks appear to not align with the scale domain, resulting in no ticks. Try different ticks?`); // prettier-ignore
19407
19362
  }
19408
-
19409
19363
  if (k === "y" || k === "x") {
19410
19364
  facets = [range(data)];
19411
19365
  } else {
@@ -19888,7 +19842,6 @@ class Tip extends Mark {
19888
19842
  ...format
19889
19843
  }; // defensive copy before mutate; also promote nullish to empty
19890
19844
  }
19891
-
19892
19845
  render(index, scales, values, dimensions, context) {
19893
19846
  const mark = this;
19894
19847
  const {
@@ -21407,7 +21360,6 @@ function maybeThresholds(thresholds, interval, defaultThresholds = thresholdAuto
21407
21360
  }
21408
21361
  return thresholds; // pass array, count, or function to bin.thresholds
21409
21362
  }
21410
-
21411
21363
  function maybeBinOutputs(outputs, inputs) {
21412
21364
  return maybeOutputs(outputs, inputs, maybeBinOutput);
21413
21365
  }
@@ -21713,7 +21665,6 @@ function stack(x, y = one, kx, ky, {
21713
21665
  if (y < 0) yn = Y2[i] = (Y1[i] = yn) + y;else if (y > 0) yp = Y2[i] = (Y1[i] = yp) + y;else Y2[i] = Y1[i] = yp; // NaN or zero
21714
21666
  }
21715
21667
  }
21716
-
21717
21668
  facetstacks.push(stacks);
21718
21669
  }
21719
21670
  if (offset) offset(facetstacks, Y1, Y2, Z);
@@ -22132,7 +22083,7 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
22132
22083
  };
22133
22084
  }
22134
22085
 
22135
- var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewoJJ3VzZSBzdHJpY3QnOwoKCXZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9OwoKCXZhciBkaXN0cmlidXRpb25zID0ge2V4cG9ydHM6IHt9fTsKCgkoZnVuY3Rpb24gKG1vZHVsZSkgewoKCSAgLy8gQSBudW1iZXIgb2YgbG9nIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb25zIChQREYpLiBOYW1pbmcgYW5kIHBhcmFtZXRlcml6YXRpb24KCSAgLy8gc2hvdWxkIG1hdGNoIFIncywgZXhjZXB0IGZvciB0aGF0IGFsbCBmdW5jdGlvbnMgcmVzaWRlIGluIGFuIGxkIG9iamVjdCAoCgkgIC8vIGFzIGluICJsb2cgZGVuc2l0eSIpLCBzbyB0byBnZXQgYSBub3JtYWwgbG9nIGRlbnNpdHkgeW91IHdvdWxkIHdyaXRlCgkgIC8vIGxkLm5vcm0oLi4uKS4KCSAgLy8gTW9zdCBvZiB0aGUgY29kZSBiZWxvdyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBncmVhdCBKc3RhdCBwcm9qZWN0CgkgIC8vIChodHRwczovL2dpdGh1Yi5jb20vanN0YXQvKSB3aGljaCBpbmNsdWRlcyBQREYgZm9yIG1hbnkgY29tbW9uIHByb2JhYmlsaXR5CgkgIC8vIGRpc3RyaWJ1dGlvbnMuIFdoYXQgSSBoYXZlIGRvbmUgaXMgb25seSB0byBjb252ZXJ0IHRoZXNlIHRvIGxvZyBQREZzLgoKCSAgLyoKCSAgT3JpZ2luYWwgd29yayBDb3B5cmlnaHQgKGMpIDIwMTMgalN0YXQKCSAgTW9kaWZpZWQgd29yayBDb3B5cmlnaHQgKGMpIDIwMTUgUmFzbXVzIELDpcOldGggCgkgIAlQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CgkgIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCgkgIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKCSAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAoJICBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKCSAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCSAgCVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCgkgIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoJICAJVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKCSAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCgkgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQoJICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCgkgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCgkgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KCSAgVEhFIFNPRlRXQVJFLgoJICAJKi8KCgkgIC8vIFRoaXMgYm9pbGVyIHBsYXRlIGNvZGUgaGVyZSBpcyB0YWtlbiBmcm9tOgoJICAvLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzCgkgIC8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLAoJICAvLyBOb2RlLCBhbmQgYnkgdXNpbmcgdGhlIEFzeW5jaHJvbm91cyBNb2R1bGUgRGVmaW5pdGlvbiBzdGFuZGFyZC4KCSAgLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsCgkgIC8vIG9iamVjdCBsZCAuCgkgIChmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewoJICAgIGlmIChtb2R1bGUuZXhwb3J0cykgewoJICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CgkgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKCSAgICAgIC8vIGxpa2UgTm9kZS4KCSAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KQoJICAgICAgcm9vdC5sZCA9IGZhY3RvcnkoKTsKCSAgICB9CgkgIH0pKGNvbW1vbmpzR2xvYmFsLCBmdW5jdGlvbiAoKSB7CgkgICAgLy8gT2JqZWN0IHRvIGhvbGQgdGhlIGZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZC4KCSAgICB2YXIgbGQgPSB7fTsKCgkgICAgLy8vLy8vLy8vLyBIZWxwZXIgZnVuY3Rpb25zIC8vLy8vLy8vLy8KCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCSAgICB2YXIgbGdhbW1hID0gZnVuY3Rpb24gKHgpIHsKCSAgICAgIHZhciBqID0gMDsKCSAgICAgIHZhciBjb2YgPSBbNzYuMTgwMDkxNzI5NDcxNDYsIC04Ni41MDUzMjAzMjk0MTY3NywgMjQuMDE0MDk4MjQwODMwOTEsIC0xLjIzMTczOTU3MjQ1MDE1NSwgMC4xMjA4NjUwOTczODY2MTc5ZS0yLCAtMC41Mzk1MjM5Mzg0OTUzZS01XTsKCSAgICAgIHZhciBzZXIgPSAxLjAwMDAwMDAwMDE5MDAxNTsKCSAgICAgIHZhciB4eCwgeSwgdG1wOwoJICAgICAgdG1wID0gKHkgPSB4eCA9IHgpICsgNS41OwoJICAgICAgdG1wIC09ICh4eCArIDAuNSkgKiBsb2codG1wKTsKCSAgICAgIGZvciAoOyBqIDwgNjsgaisrKSBzZXIgKz0gY29mW2pdIC8gKyt5OwoJICAgICAgcmV0dXJuIGxvZygyLjUwNjYyODI3NDYzMTAwMDUgKiBzZXIgLyB4eCkgLSB0bXA7CgkgICAgfTsKCSAgICBsZC5sZ2FtbWEgPSBsZ2FtbWE7CgkgICAgdmFyIGxmYWN0b3JpYWwgPSBmdW5jdGlvbiAobikgewoJICAgICAgcmV0dXJuIG4gPCAwID8gTmFOIDogbGdhbW1hKG4gKyAxKTsKCSAgICB9OwoJICAgIGxkLmxmYWN0b3JpYWwgPSBsZmFjdG9yaWFsOwoJICAgIHZhciBsY2hvb3NlID0gZnVuY3Rpb24gKG4sIGspIHsKCSAgICAgIHJldHVybiBsZmFjdG9yaWFsKG4pIC0gbGZhY3RvcmlhbChrKSAtIGxmYWN0b3JpYWwobiAtIGspOwoJICAgIH07CgkgICAgbGQubGNob29zZSA9IGxjaG9vc2U7CgkgICAgdmFyIGxiZXRhID0gZnVuY3Rpb24gKGEsIGIpIHsKCSAgICAgIHJldHVybiBsZ2FtbWEoYSkgKyBsZ2FtbWEoYikgLSBsZ2FtbWEoYSArIGIpOwoJICAgIH07CgkgICAgbGQubGJldGEgPSBsYmV0YTsKCSAgICB2YXIgbG9nID0gTWF0aC5sb2c7CgkgICAgdmFyIGV4cCA9IE1hdGguZXhwOwoJICAgIHZhciBhYnMgPSBNYXRoLmFiczsKCSAgICB2YXIgcG93ID0gTWF0aC5wb3c7CgkgICAgdmFyIHNxcnQgPSBNYXRoLnNxcnQ7CgkgICAgdmFyIHBpID0gTWF0aC5QSTsKCgkgICAgLy8vLy8vLy8vLyBDb250aW5vdXMgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJICAgIGxkLmJldGEgPSBmdW5jdGlvbiAoeCwgc2hhcGUxLCBzaGFwZTIpIHsKCSAgICAgIGlmICh4ID4gMSB8fCB4IDwgMCkgewoJICAgICAgICByZXR1cm4gLUluZmluaXR5OwoJICAgICAgfQoJICAgICAgaWYgKHNoYXBlMSA9PT0gMSAmJiBzaGFwZTIgPT09IDEpIHsKCSAgICAgICAgcmV0dXJuIDA7CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXR1cm4gKHNoYXBlMSAtIDEpICogbG9nKHgpICsgKHNoYXBlMiAtIDEpICogbG9nKDEgLSB4KSAtIGxiZXRhKHNoYXBlMSwgc2hhcGUyKTsKCSAgICAgIH0KCSAgICB9OwoJICAgIGxkLmNhdWNoeSA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKCSAgICAgIHJldHVybiBsb2coc2NhbGUpIC0gbG9nKHBvdyh4IC0gbG9jYXRpb24sIDIpICsgcG93KHNjYWxlLCAyKSkgLSBsb2cocGkpOwoJICAgIH07CgkgICAgbGQubm9ybSA9IGZ1bmN0aW9uICh4LCBtZWFuLCBzZCkgewoJICAgICAgcmV0dXJuIC0wLjUgKiBsb2coMiAqIHBpKSAtIGxvZyhzZCkgLSBwb3coeCAtIG1lYW4sIDIpIC8gKDIgKiBzZCAqIHNkKTsKCSAgICB9OwoKCSAgICAvLyBBIGJpdmFyaWF0ZSBOb3JtYWwgZGlzdHJpYnV0aW9uIHBhcmFtZXRlcml6ZWQgYnkgYXJyYXlzIG9mIHR3byBtZWFucyBhbmQgU0RzLCBhbmQgCgkgICAgLy8gdGhlIGNvcnJlbGF0aW9uLgoJICAgIGxkLmJpdmFybm9ybSA9IGZ1bmN0aW9uICh4LCBtZWFuLCBzZCwgY29ycikgewoJICAgICAgdmFyIHogPSBwb3coeFswXSAtIG1lYW5bMF0sIDIpIC8gcG93KHNkWzBdLCAyKSArIHBvdyh4WzFdIC0gbWVhblsxXSwgMikgLyBwb3coc2RbMV0sIDIpIC0gMiAqIGNvcnIgKiAoeFswXSAtIG1lYW5bMF0pICogKHhbMV0gLSBtZWFuWzFdKSAvIChzZFswXSAqIHNkWzFdKTsKCSAgICAgIHZhciBub3JtYWxpemluZ19mYWN0b3IgPSAtKGxvZygyKSArIGxvZyhwaSkgKyBsb2coc2RbMF0pICsgbG9nKHNkWzFdKSArIDAuNSAqIGxvZygxIC0gcG93KGNvcnIsIDIpKSk7CgkgICAgICB2YXIgYml2YXJfbG9nX2RlbnMgPSBub3JtYWxpemluZ19mYWN0b3IgLSB6IC8gKDIgKiAoMSAtIHBvdyhjb3JyLCAyKSkpOwoJICAgICAgcmV0dXJuIGJpdmFyX2xvZ19kZW5zOwoJICAgIH07CgkgICAgbGQubGFwbGFjZSA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKCSAgICAgIHJldHVybiAtYWJzKHggLSBsb2NhdGlvbikgLyBzY2FsZSAtIGxvZygyICogc2NhbGUpOwoJICAgIH07CgkgICAgbGQuZGV4cCA9IGxkLmxhcGxhY2U7CgkgICAgbGQuZ2FtbWEgPSBmdW5jdGlvbiAoeCwgc2hhcGUsIHJhdGUpIHsKCSAgICAgIHZhciBzY2FsZSA9IDEgLyByYXRlOwoJICAgICAgaWYgKHggPCAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICBpZiAoeCA9PT0gMCAmJiBzaGFwZSA9PT0gMSkgewoJICAgICAgICByZXR1cm4gLWxvZyhzY2FsZSk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXR1cm4gKHNoYXBlIC0gMSkgKiBsb2coeCkgLSB4IC8gc2NhbGUgLSBsZ2FtbWEoc2hhcGUpIC0gc2hhcGUgKiBsb2coc2NhbGUpOwoJICAgICAgfQoJICAgIH07CgkgICAgbGQuaW52Z2FtbWEgPSBmdW5jdGlvbiAoeCwgc2hhcGUsIHNjYWxlKSB7CgkgICAgICBpZiAoeCA8PSAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gLShzaGFwZSArIDEpICogbG9nKHgpIC0gc2NhbGUgLyB4IC0gbGdhbW1hKHNoYXBlKSArIHNoYXBlICogbG9nKHNjYWxlKTsKCSAgICB9OwoJICAgIGxkLmxub3JtID0gZnVuY3Rpb24gKHgsIG1lYW5sb2csIHNkbG9nKSB7CgkgICAgICBpZiAoeCA8PSAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gLWxvZyh4KSAtIDAuNSAqIGxvZygyICogcGkpIC0gbG9nKHNkbG9nKSAtIHBvdyhsb2coeCkgLSBtZWFubG9nLCAyKSAvICgyICogc2Rsb2cgKiBzZGxvZyk7CgkgICAgfTsKCSAgICBsZC5wYXJldG8gPSBmdW5jdGlvbiAoeCwgc2NhbGUsIHNoYXBlKSB7CgkgICAgICBpZiAoeCA8IHNjYWxlKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gbG9nKHNoYXBlKSArIHNoYXBlICogbG9nKHNjYWxlKSAtIChzaGFwZSArIDEpICogbG9nKHgpOwoJICAgIH07CgkgICAgbGQudCA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUsIGRmKSB7CgkgICAgICBkZiA9IGRmID4gMWUxMDAgPyAxZTEwMCA6IGRmOwoJICAgICAgcmV0dXJuIGxnYW1tYSgoZGYgKyAxKSAvIDIpIC0gbGdhbW1hKGRmIC8gMikgLSBsb2coc3FydChwaSAqIGRmKSAqIHNjYWxlKSArIGxvZyhwb3coMSArIDEgLyBkZiAqIHBvdygoeCAtIGxvY2F0aW9uKSAvIHNjYWxlLCAyKSwgLShkZiArIDEpIC8gMikpOwoJICAgIH07CgoJICAgIC8vIFRoaXMgaXMgYSBkaXJlY3QgamF2YXNjcmlwdCB0cmFuc2xhdGlvbiBvZiB0aGUgUiBjb2RlIHVzZWQgdG8gZXZhbHVhdGUKCSAgICAvLyB0aGUgbG9nIGRlbnNpdHkgb2YgYSB3ZWlidWxsIGRpc3RyaWJ1dGlvbjogCgkgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2R3ZWlidWxsLmMKCSAgICBsZC53ZWlidWxsID0gZnVuY3Rpb24gKHgsIHNoYXBlLCBzY2FsZSkgewoJICAgICAgaWYgKHggPCAwKSByZXR1cm4gLUluZmluaXR5OwoJICAgICAgaWYgKHggPT09IDAgJiYgc2hhcGUgPCAxKSByZXR1cm4gSW5maW5pdHk7CgkgICAgICB2YXIgdG1wMSA9IHBvdyh4IC8gc2NhbGUsIHNoYXBlIC0gMSk7CgkgICAgICB2YXIgdG1wMiA9IHRtcDEgKiAoeCAvIHNjYWxlKTsKCSAgICAgIHJldHVybiAtdG1wMiArIGxvZyhzaGFwZSAqIHRtcDEgLyBzY2FsZSk7CgkgICAgfTsKCgkgICAgLy8gVGhpcyBpcyBhIGRpcmVjdCBqYXZhc2NyaXB0IHRyYW5zbGF0aW9uIG9mIHRoZSBSIGNvZGUgdXNlZCB0byBldmFsdWF0ZQoJICAgIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIGxvZ2lzdGljIGRpc3RyaWJ1dGlvbjogCgkgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2Rsb2dpcy5jCgkgICAgbGQubG9naXMgPSBmdW5jdGlvbiAoeCwgbG9jYXRpb24sIHNjYWxlKSB7CgkgICAgICB4ID0gYWJzKCh4IC0gbG9jYXRpb24pIC8gc2NhbGUpOwoJICAgICAgdmFyIGUgPSBleHAoLXgpOwoJICAgICAgdmFyIGYgPSAxLjAgKyBlOwoJICAgICAgcmV0dXJuIC0oeCArIGxvZyhzY2FsZSAqIGYgKiBmKSk7CgkgICAgfTsKCSAgICBsZC5kaXJpY2hsZXQgPSBmdW5jdGlvbiAoeCwgYWxwaGEpIHsKCSAgICAgIHZhciBzdW1fYWxwaGEgPSAwOwoJICAgICAgdmFyIHN1bV9sZ2FtbWFfYWxwaGEgPSAwOwoJICAgICAgdmFyIHN1bV9hbHBoYV9zdWJfMV9sb2dfeCA9IDA7CgkgICAgICB2YXIgbiA9IGFscGhhLmxlbmd0aDsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkgICAgICAgIHN1bV9hbHBoYSArPSBhbHBoYVtpXTsKCSAgICAgICAgc3VtX2xnYW1tYV9hbHBoYSArPSBsZ2FtbWEoYWxwaGFbaV0pOwoJICAgICAgICBzdW1fYWxwaGFfc3ViXzFfbG9nX3ggKz0gKGFscGhhW2ldIC0gMSkgKiBsb2coeFtpXSk7CgkgICAgICB9CgkgICAgICByZXR1cm4gbGdhbW1hKHN1bV9hbHBoYSkgLSBzdW1fbGdhbW1hX2FscGhhICsgc3VtX2FscGhhX3N1Yl8xX2xvZ194OwoJICAgIH07CgkgICAgbGQuZXhwID0gZnVuY3Rpb24gKHgsIHJhdGUpIHsKCSAgICAgIHJldHVybiB4IDwgMCA/IC1JbmZpbml0eSA6IGxvZyhyYXRlKSAtIHJhdGUgKiB4OwoJICAgIH07CgkgICAgbGQudW5pZiA9IGZ1bmN0aW9uICh4LCBtaW4sIG1heCkgewoJICAgICAgcmV0dXJuIHggPCBtaW4gfHwgeCA+IG1heCA/IC1JbmZpbml0eSA6IGxvZygxIC8gKG1heCAtIG1pbikpOwoJICAgIH07CgoJICAgIC8vLy8vLy8vLy8gRGlzY3JldGUgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkgICAgbGQuYmVybiA9IGZ1bmN0aW9uICh4LCBwcm9iKSB7CgkgICAgICByZXR1cm4gISh4ID09PSAwIHx8IHggPT09IDEpID8gLUluZmluaXR5IDogbG9nKHggKiBwcm9iICsgKDEgLSB4KSAqICgxIC0gcHJvYikpOwoJICAgIH07CgkgICAgbGQuY2F0ID0gZnVuY3Rpb24gKHgsIHByb2JzKSB7CgkgICAgICBpZiAoeCA8IDEgfHwgeCA+IHByb2JzLmxlbmd0aCkgewoJICAgICAgICByZXR1cm4gLUluZmluaXR5OwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIGxvZyhwcm9ic1t4IC0gMV0pOwoJICAgICAgfQoJICAgIH07CgkgICAgbGQuYmlub20gPSBmdW5jdGlvbiAoeCwgc2l6ZSwgcHJvYikgewoJICAgICAgaWYgKHggPiBzaXplIHx8IHggPCAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICBpZiAocHJvYiA9PT0gMCB8fCBwcm9iID09PSAxKSB7CgkgICAgICAgIHJldHVybiBzaXplICogcHJvYiA9PT0geCA/IDAgOiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gbGNob29zZShzaXplLCB4KSArIHggKiBsb2cocHJvYikgKyAoc2l6ZSAtIHgpICogbG9nKDEgLSBwcm9iKTsKCSAgICB9OwoJICAgIGxkLm5iaW5vbSA9IGZ1bmN0aW9uICh4LCBzaXplLCBwcm9iKSB7CgkgICAgICBpZiAoeCA8IDApIHsKCSAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKCSAgICAgIH0KCSAgICAgIHJldHVybiBsY2hvb3NlKHggKyBzaXplIC0gMSwgc2l6ZSAtIDEpICsgeCAqIGxvZygxIC0gcHJvYikgKyBzaXplICogbG9nKHByb2IpOwoJICAgIH07CgkgICAgbGQuaHlwZXIgPSBmdW5jdGlvbiAoeCwgbSwgbiwgaykgewoJICAgICAgaWYgKHggPCAwIHx8IHggPiBrKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXR1cm4gbGNob29zZShtLCB4KSArIGxjaG9vc2UobiwgayAtIHgpIC0gbGNob29zZShtICsgbiwgayk7CgkgICAgICB9CgkgICAgfTsKCSAgICBsZC5wb2lzID0gZnVuY3Rpb24gKHgsIGxhbWJkYSkgewoJICAgICAgcmV0dXJuIHggPCAwID8gLUluZmluaXR5IDogbG9nKGxhbWJkYSkgKiB4IC0gbGFtYmRhIC0gbGZhY3RvcmlhbCh4KTsKCSAgICB9OwoJICAgIHJldHVybiBsZDsKCSAgfSk7Cgl9KShkaXN0cmlidXRpb25zKTsKCXZhciBkaXN0cmlidXRpb25zRXhwb3J0cyA9IGRpc3RyaWJ1dGlvbnMuZXhwb3J0czsKCgl2YXIgbWNtYyA9IHtleHBvcnRzOiB7fX07CgoJKGZ1bmN0aW9uIChtb2R1bGUpIHsKCgkgIC8vIFRoaXMgYm9pbGVyIHBsYXRlIGNvZGUgaGVyZSBpcyB0YWtlbiBmcm9tOgoJICAvLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzCgkgIC8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLAoJICAvLyBOb2RlLCBhbmQgYnkgdXNpbmcgdGhlIEFzeW5jaHJvbm91cyBNb2R1bGUgRGVmaW5pdGlvbiBzdGFuZGFyZC4KCSAgLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsCgkgIC8vIG9iamVjdCBtY21jIC4KCSAgKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7CgkgICAgaWYgKG1vZHVsZS5leHBvcnRzKSB7CgkgICAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXQKCSAgICAgIC8vIG9ubHkgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLAoJICAgICAgLy8gbGlrZSBOb2RlLgoJICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpCgkgICAgICByb290Lm1jbWMgPSBmYWN0b3J5KCk7CgkgICAgfQoJICB9KShjb21tb25qc0dsb2JhbCwgZnVuY3Rpb24gKCkgewoJICAgIC8vLyBUaGUgYWN0dWFsIG1vZHVsZSBjb2RlIHN0YXJ0cyBoZXJlIC8vLwoJICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgCgoJICAgIC8vLy8vLy8vLy8gSGVscGVyIEZ1bmN0aW9ucyAvLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkgICAgLyoqIFJldHVybnMgYSByYW5kb20gcmVhbCBudW1iZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAqLwoJICAgIHZhciBydW5pZiA9IGZ1bmN0aW9uIChtaW4sIG1heCkgewoJICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSArIG1pbjsKCSAgICB9OwoKCSAgICAvKiogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbWluIGFuZCBtYXggKi8KCSAgICB2YXIgcnVuaWZfZGlzY3JldGUgPSBmdW5jdGlvbiAobWluLCBtYXgpIHsKCSAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluOwoJICAgIH07CgoJICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGZyb20gYSBub3JtYWwgZGlzdHJpYmJ1dGlvbiBkZWZpbmVkCgkgICAgICogIGJ5IG1lYW4gYW5kIHNkLiAKCSAgICAgKiAgQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qc3RhdC9qc3RhdC9ibG9iL21hc3Rlci9zcmMvc3BlY2lhbC5qcyAqLwoJICAgIHZhciBybm9ybSA9IGZ1bmN0aW9uIChtZWFuLCBzZCkgewoJICAgICAgdmFyIHUsIHYsIHgsIHksIHE7CgkgICAgICBkbyB7CgkgICAgICAgIHUgPSBNYXRoLnJhbmRvbSgpOwoJICAgICAgICB2ID0gMS43MTU2ICogKE1hdGgucmFuZG9tKCkgLSAwLjUpOwoJICAgICAgICB4ID0gdSAtIDAuNDQ5ODcxOwoJICAgICAgICB5ID0gTWF0aC5hYnModikgKyAwLjM4NjU5NTsKCSAgICAgICAgcSA9IHggKiB4ICsgeSAqICgwLjE5NjAwICogeSAtIDAuMjU0NzIgKiB4KTsKCSAgICAgIH0gd2hpbGUgKHEgPiAwLjI3NTk3ICYmIChxID4gMC4yNzg0NiB8fCB2ICogdiA+IC00ICogTWF0aC5sb2codSkgKiB1ICogdSkpOwoJICAgICAgcmV0dXJuIHYgLyB1ICogc2QgKyBtZWFuOwoJICAgIH07CgoJICAgIC8qKiBSZXR1cm5zIGEgZGVlcCBjbG9uZSBvZiBzcmMsIHNvcnQgb2YuLi4gSXQgb25seSBjb3BpZXMgYSBsaW1pdGVkCgkgICAgICogbnVtYmVyIG9mIHR5cGVzIGFuZCwgZm9yIGV4YW1wbGUsIGZ1bmN0aW9uIGFyZSBub3QgY29waWVkLiAKCSAgICAgKiBGcm9tIGh0dHA6Ly9kYXZpZHdhbHNoLm5hbWUvamF2YXNjcmlwdC1jbG9uZQoJICAgICAqLwoJICAgIHZhciBkZWVwX2Nsb25lID0gZnVuY3Rpb24gKHNyYykgewoJICAgICAgZnVuY3Rpb24gbWl4aW4oZGVzdCwgc291cmNlLCBjb3B5RnVuYykgewoJICAgICAgICB2YXIgbmFtZSwKCSAgICAgICAgICBzLAoJICAgICAgICAgIGVtcHR5ID0ge307CgkgICAgICAgIGZvciAobmFtZSBpbiBzb3VyY2UpIHsKCSAgICAgICAgICAvLyB0aGUgKCEobmFtZSBpbiBlbXB0eSkgfHwgZW1wdHlbbmFtZV0gIT09IHMpIGNvbmRpdGlvbiBhdm9pZHMgY29weWluZyBwcm9wZXJ0aWVzIGluICJzb3VyY2UiCgkgICAgICAgICAgLy8gaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZS4JIEZvciBleGFtcGxlLCBpZiBkZXN0IGhhcyBhIGN1c3RvbSB0b1N0cmluZygpIG1ldGhvZCwKCSAgICAgICAgICAvLyBkb24ndCBvdmVyd3JpdGUgaXQgd2l0aCB0aGUgdG9TdHJpbmcoKSBtZXRob2QgdGhhdCBzb3VyY2UgaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZQoJICAgICAgICAgIHMgPSBzb3VyY2VbbmFtZV07CgkgICAgICAgICAgaWYgKCEobmFtZSBpbiBkZXN0KSB8fCBkZXN0W25hbWVdICE9PSBzICYmICghKG5hbWUgaW4gZW1wdHkpIHx8IGVtcHR5W25hbWVdICE9PSBzKSkgewoJICAgICAgICAgICAgZGVzdFtuYW1lXSA9IGNvcHlGdW5jID8gY29weUZ1bmMocykgOiBzOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gZGVzdDsKCSAgICAgIH0KCSAgICAgIGlmICghc3JjIHx8IHR5cGVvZiBzcmMgIT0gIm9iamVjdCIgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHNyYykgPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKCSAgICAgICAgLy8gbnVsbCwgdW5kZWZpbmVkLCBhbnkgbm9uLW9iamVjdCwgb3IgZnVuY3Rpb24KCSAgICAgICAgcmV0dXJuIHNyYzsgLy8gYW55dGhpbmcKCSAgICAgIH0KCgkgICAgICBpZiAoc3JjLm5vZGVUeXBlICYmICJjbG9uZU5vZGUiIGluIHNyYykgewoJICAgICAgICAvLyBET00gTm9kZQoJICAgICAgICByZXR1cm4gc3JjLmNsb25lTm9kZSh0cnVlKTsgLy8gTm9kZQoJICAgICAgfQoKCSAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBEYXRlKSB7CgkgICAgICAgIC8vIERhdGUKCSAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHNyYy5nZXRUaW1lKCkpOyAvLyBEYXRlCgkgICAgICB9CgoJICAgICAgaWYgKHNyYyBpbnN0YW5jZW9mIFJlZ0V4cCkgewoJICAgICAgICAvLyBSZWdFeHAKCSAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoc3JjKTsgLy8gUmVnRXhwCgkgICAgICB9CgoJICAgICAgdmFyIHIsIGksIGw7CgkgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgQXJyYXkpIHsKCSAgICAgICAgLy8gYXJyYXkKCSAgICAgICAgciA9IFtdOwoJICAgICAgICBmb3IgKGkgPSAwLCBsID0gc3JjLmxlbmd0aDsgaSA8IGw7ICsraSkgewoJICAgICAgICAgIGlmIChpIGluIHNyYykgewoJICAgICAgICAgICAgci5wdXNoKGRlZXBfY2xvbmUoc3JjW2ldKSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICAvLyBnZW5lcmljIG9iamVjdHMKCSAgICAgICAgciA9IHNyYy5jb25zdHJ1Y3RvciA/IG5ldyBzcmMuY29uc3RydWN0b3IoKSA6IHt9OwoJICAgICAgfQoJICAgICAgcmV0dXJuIG1peGluKHIsIHNyYywgZGVlcF9jbG9uZSk7CgkgICAgfTsKCgkgICAgLyoqIFNwZWNpYWxpemVkIGNsb25lIGZ1bmN0aW9uIHRoYXQgb25seSBjbG9uZXMgc2NhbGFycyBhbmQgbmVzdGVkIGFycmF5cyB3aGVyZQoJICAgICAqIGVhY2ggYXJyYXkgZWl0aGVyIGNvbnNpc3RzIG9mIGFsbCBhcnJheXMgb3IgYWxsIG51bWJlcnMuIFRoaXMgZnVuY3Rpb24KCSAgICAgKiBpcyBtZWFudCBhcyBhIGZhc3Qgd2F5IG9mIGNsb25pbmcgcGFyYW1ldGVyIGRyYXdzIHdpdGhpbiB0aGUgbWNtYyBzYW1wbGluZwoJICAgICAqIGxvb3AuCgkgICAgICovCgkgICAgdmFyIGNsb25lX3BhcmFtX2RyYXcgPSBmdW5jdGlvbiAoeCkgewoJICAgICAgaWYgKEFycmF5LmlzQXJyYXkoeCkpIHsKCSAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoeFswXSkpIHsKCSAgICAgICAgICAvLyB4IGlzIGFuIGFycmF5IG9mIGFycmF5cyBzbyB3ZSBuZWVkIHRvIGNsb25lIGl0IHJlY3Vyc2l2ZWx5CgkgICAgICAgICAgdmFyIHhfY29weSA9IFtdOwoJICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSB4Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CgkgICAgICAgICAgICB4X2NvcHkucHVzaChjbG9uZV9wYXJhbV9kcmF3KHhbaV0pKTsKCSAgICAgICAgICB9CgkgICAgICAgICAgcmV0dXJuIHhfY29weTsKCSAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAvLyBXZSdsbCBhc3N1bWUgeCBpcyBhIGFycmF5cyBvZiBzY2FsYXJzCgkgICAgICAgICAgcmV0dXJuIHguc2xpY2UoMCk7CgkgICAgICAgIH0KCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIC8vIFdlJ2xsIGFzc3VtZSB4IGlzIGEgc2NhbGFyCgkgICAgICAgIHJldHVybiB4OwoJICAgICAgfQoJICAgIH07CgoJICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIGEgbnVtYmVyLgoJICAgICAqLwoJICAgIHZhciBpc19udW1iZXIgPSBmdW5jdGlvbiAob2JqZWN0KSB7CgkgICAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PSAibnVtYmVyIiB8fCB0eXBlb2Ygb2JqZWN0ID09ICJvYmplY3QiICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgKHBvc3NpYmx5IG11bHRpZGltZW5zaW9uYWwvbmVzdGVkKSBhcnJheS4KCSAgICAgKiBAcGFyYW0gZGltIC0gQW4gYXJyYXkgZ2l2aW5nIHRoZSBkaW1lbnNpb24gb2YgdGhlIGFycmF5LiBGb3IgZXhhbXBsZSwKCSAgICAgKiAgIFs1XSB3b3VsZCB5aWVsZCBhIDUgZWxlbWVudCBhcnJheSwgYW5kIFszLDNdIHdvdWxkIHlpZWxkIGEgMyBieSAzIG1hdHJpeC4KCSAgICAgKiBAcGFyYW0gaW5pdCAtIEEgdmFsdWUgb3IgYSBmdW5jdGlvbiB1c2VkIHRvIGZpbGwgaW4gdGhlIGVhY2ggZWxlbWVudCBpbgoJICAgICAqICAgdGhlIGFycmF5LiBJZiBpdCBpcyBhIGZ1bmN0aW9uIGl0IHNob3VsZCB0YWtlIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBiZSAKCSAgICAgKiAgIGV2YWx1YXRlZCBvbmNlIGZvciBlYWNoIGVsZW1lbnQsIGFuZCBpdCdzIHJldHVybiB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8KCSAgICAgKiAgIGZpbGwgaW4gZWFjaCBlbGVtZW50LgoJICAgICAqIEBleGFtcGxlIAoJICAgICAqIC8vIFRoZSBmb2xsb3dpbmcgd291bGQgcmV0dXJuIFtbMSwxXSxbMSwxXSxbMSwxXV0KCSAgICAgKiBjcmVhdGVfYXJyYXkoWzIsM10sIDEpCgkgICAgICovCgkgICAgdmFyIGNyZWF0ZV9hcnJheSA9IGZ1bmN0aW9uIChkaW0sIGluaXQpIHsKCSAgICAgIHZhciBhcnIgPSBuZXcgQXJyYXkoZGltWzBdKTsKCSAgICAgIHZhciBpOwoJICAgICAgaWYgKGRpbS5sZW5ndGggPT0gMSkgewoJICAgICAgICAvLyBGaWxsIGl0IHVwIHdpdGggaW5pdAoJICAgICAgICBpZiAodHlwZW9mIGluaXQgPT09ICJmdW5jdGlvbiIpIHsKCSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHsKCSAgICAgICAgICAgIGFycltpXSA9IGluaXQoKTsKCSAgICAgICAgICB9CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CgkgICAgICAgICAgICBhcnJbaV0gPSBpbml0OwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgfSBlbHNlIGlmIChkaW0ubGVuZ3RoID4gMSkgewoJICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHsKCSAgICAgICAgICBhcnJbaV0gPSBjcmVhdGVfYXJyYXkoZGltLnNsaWNlKDEpLCBpbml0KTsKCSAgICAgICAgfQoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdGhyb3cgImNyZWF0ZV9hcnJheSBjYW4ndCBjcmVhdGUgYSBkaW1lbnNpb25sZXNzIGFycmF5IjsKCSAgICAgIH0KCSAgICAgIHJldHVybiBhcnI7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogUmV0dXJuIHRoZSBkaW1lbnNpb25zIG9mIGEgcG9zc2libHkgbmVzdGVkIGFycmF5IGFzIGFuIGFycmF5LiBGb3IgCgkgICAgICogZXhhbXBsZSwgYXJyYXlfZGltKCBbWzEsIDJdLCBbMSwgMl1dICkgc2hvdWxkIHJldHVybiBbMiwgMl0KCSAgICAgKiBBc3N1bWVzIHRoYXQgYWxsIGFycmF5cyBpbnNpZGUgYW5vdGhlciBhcnJheSBhcmUgb2YgdGhlIHNhbWUgbGVuZ3RoLgoJICAgICAqIEBleGFtcGxlCgkgICAgICogLy8gU2hvdWxkIHJldHVybiBbNCwgMiwgMV0KCSAgICAgKiBhcnJheV9kaW0oY3JlYXRlX2FycmF5KFs0LCAyLCAxXSwgMCkpCgkgICAgICovCgkgICAgdmFyIGFycmF5X2RpbSA9IGZ1bmN0aW9uIChhKSB7CgkgICAgICBpZiAoQXJyYXkuaXNBcnJheShhWzBdKSkgewoJICAgICAgICByZXR1cm4gW2EubGVuZ3RoXS5jb25jYXQoYXJyYXlfZGltKGFbMF0pKTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBbYS5sZW5ndGhdOwoJICAgICAgfQoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIENoZWNrcyBpZiB0d28gYXJyYXlzIGFyZSBlcXVhbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMKCSAgICAgKiBhcyBqdWRnZWQgYnkgdGhlICI9PSIgb3BlcmF0b3IuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KCSAgICAgKiBBZGFwdGVkIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTQ4NTM5NzQvMTAwMTg0OAoJICAgICAqLwoJICAgIHZhciBhcnJheV9lcXVhbCA9IGZ1bmN0aW9uIChhMSwgYTIpIHsKCSAgICAgIGlmIChhMS5sZW5ndGggIT0gYTIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5cwoJICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhMVtpXSkgJiYgQXJyYXkuaXNBcnJheShhMltpXSkpIHsKCSAgICAgICAgICAvLyByZWN1cnNlIGludG8gdGhlIG5lc3RlZCBhcnJheXMKCSAgICAgICAgICBpZiAoIWFycmF5X2VxdWFsKGExW2ldLCBhMltpXSkpIHJldHVybiBmYWxzZTsKCSAgICAgICAgfSBlbHNlIGlmIChhMVtpXSAhPSBhMltpXSkgewoJICAgICAgICAgIC8vIFdhcm5pbmcgLSB0d28gZGlmZmVyZW50IG9iamVjdCBpbnN0YW5jZXMgd2lsbCBuZXZlciBiZSBlcXVhbDoge3g6MjB9ICE9IHt4OjIwfQoJICAgICAgICAgIHJldHVybiBmYWxzZTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgICAgcmV0dXJuIHRydWU7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogVHJhdmVyc2VzIGEgcG9zc2libHkgbmVzdGVkIGFycmF5IGEgYW5kIGFwcGxpZXMgZnVuIHRvIGFsbCAibGVhZiBub2RlcyIsIAoJICAgICAqIHRoYXQgaXMsIHZhbHVlcyB0aGF0IGFyZSBub3QgYXJyYXlzLiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBzYW1lIHNpemUgYXMKCSAgICAgKiBhLgoJICAgICAqLwoJICAgIHZhciBuZXN0ZWRfYXJyYXlfYXBwbHkgPSBmdW5jdGlvbiAoYSwgZnVuKSB7CgkgICAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkgewoJICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KGEubGVuZ3RoKTsKCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgICAgcmVzdWx0W2ldID0gbmVzdGVkX2FycmF5X2FwcGx5KGFbaV0sIGZ1bik7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBmdW4oYSk7CgkgICAgICB9CgkgICAgfTsKCgkgICAgLyoqIFJhbmRvbWl6aW5nIHRoZSBhcnJheSBlbGVtZW50IG9yZGVyIGluLXBsYWNlLiBVc2luZyBEdXJzdGVuZmVsZAoJICAgICAqIHNodWZmbGUgYWxnb3JpdGhtLiBBZGFwdGVkIGZyb20gaGVyZTogCgkgICAgICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTI2NDY4NjQvMTAwMTg0OAoJICAgICAqLwoJICAgIGZ1bmN0aW9uIHNodWZmbGVfYXJyYXkoYXJyYXkpIHsKCSAgICAgIGZvciAodmFyIGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7CgkgICAgICAgIHZhciBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7CgkgICAgICAgIHZhciB0ZW1wID0gYXJyYXlbaV07CgkgICAgICAgIGFycmF5W2ldID0gYXJyYXlbal07CgkgICAgICAgIGFycmF5W2pdID0gdGVtcDsKCSAgICAgIH0KCSAgICAgIHJldHVybiBhcnJheTsKCSAgICB9CgoJICAgIC8qKgoJICAgICAqIERvZXMgdGhlIHNhbWUgdGhpbmcgYXMgbmVzdGVkX2FycmF5X2FwcGx5LCB0aGF0IGlzLCB0cmF2ZXJzZXMgYSBwb3NzaWJseQoJICAgICAqIG5lc3RlZCBhcnJheSBhIGFuZCBhcHBsaWVzIGZ1biB0byBhbGwgImxlYWYgbm9kZXMiIGFuZCByZXR1cm5zIGFuIGFycmF5IAoJICAgICAqIG9mIHRoZSBzYW1lIHNpemUgYXMgYS4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5CgkgICAgICogYnJhbmNoZXMgcmFuZG9tbHkuCgkgICAgICovCgkgICAgdmFyIG5lc3RlZF9hcnJheV9yYW5kb21fYXBwbHkgPSBmdW5jdGlvbiAoYSwgZnVuKSB7CgkgICAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkgewoJICAgICAgICB2YXIgbGVuID0gYS5sZW5ndGg7CgkgICAgICAgIHZhciBpOwoJICAgICAgICB2YXIgYXJyYXlfaXMgPSBbXTsKCSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgICAgYXJyYXlfaXNbaV0gPSBpOwoJICAgICAgICB9CgkgICAgICAgIHNodWZmbGVfYXJyYXkoYXJyYXlfaXMpOwoJICAgICAgICB2YXIgcmVzdWx0ID0gW107CgkgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewoJICAgICAgICAgIHZhciBhcnJheV9pID0gYXJyYXlfaXNbaV07CgkgICAgICAgICAgcmVzdWx0W2FycmF5X2ldID0gbmVzdGVkX2FycmF5X2FwcGx5KGFbYXJyYXlfaV0sIGZ1bik7CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHJlc3VsdDsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHJldHVybiBmdW4oYSk7CgkgICAgICB9CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogQWxsb3dzIGEgcHJldHR5IHdheSBvZiBzZXR0aW5nIGRlZmF1bHQgb3B0aW9ucyB3aGVyZSB0aGUgZGVmdWx0cyBjYW4gYmUKCSAgICAgKiBvdmVycmlkZGVuIGJ5IGFuIG9wdGlvbnMgb2JqZWN0LgoJICAgICAqICBAcGFyYW0gb3B0aW9uX25hbWUgLSB0aGUgbmFtZSBvZiB0aGUgb3B0aW9uIGFzIGEgc3RyaW5nCgkgICAgICogIEBwYXJhbSBteV9vcHRpb25zIC0gYW4gb3B0aW9uIG9iamVjdCB0aGF0IGNvdWxkIGhhdmUgb3B0aW9uX25hbWUgCgkgICAgICogICAgYXMgYSBtZW1iZXIuCgkgICAgICogQHBhcmFtIGRlZmF1bF92YWx1ZSAtIGRlZnVsdCB2YWx1ZSB0aGF0IGlzIHJldHVybmVkIGlmIG9wdGlvbl9uYW1lIAoJICAgICAqICAgaXMgbm90IGRlZmluZWQgaW4gbXlfb3B0aW9ucy4KCSAgICAgKiBAZXhhbXBsZQoJICAgICAqIHZhciBteV9vcHRpb25zID0ge3BpOiAzLjE0MTU5fQoJICAgICAqIHZhciBwaSA9IGdldF9vcHRpb24oInBpIiwgbXlfb3B0aW9ucywgMy4xNCkKCSAgICAgKi8KCSAgICAvLyBQcmV0dHkgd2F5IG9mIHNldHRpbmcgZGVmYXVsdCBvcHRpb25zIHdoZXJlIHRoZSBkZWZhdWx0cyBjYW4gYmUgb3ZlcnJpZGRlbgoJICAgIC8vIGJ5IGFuIG9wdGlvbnMgb2JqZWN0LiBGb3IgZXhhbXBsZToKCSAgICAvLyB2YXIgcGkgPSBnZXRfb3B0aW9uKCJwaSIsIG15X29wdGlvbnMsIDMuMTQpCgkgICAgdmFyIGdldF9vcHRpb24gPSBmdW5jdGlvbiAob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSkgewoJICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgkgICAgICByZXR1cm4gb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShvcHRpb25fbmFtZSkgJiYgb3B0aW9uc1tvcHRpb25fbmFtZV0gIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zW29wdGlvbl9uYW1lXSAhPT0gbnVsbCA/IG9wdGlvbnNbb3B0aW9uX25hbWVdIDogZGVmYXVsX3ZhbHVlOwoJICAgIH07CgoJICAgIC8qKiBWZXJzaW9uIG9mIGdldF9vcHRpb24gd2hlcmUgdGhlIG9wdGlvbiBzaG91bGQgYmUgYSBvbmUgb3IgbXVsdGktZGltZW5zaW9uYWwKCSAgICAgKiBhcnJheSBhbmQgd2hlcmUgdGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gZWl0aGVyIGJ5IGEgc2NhbGFyIG9yIGJ5IGFuIGFycmF5LgoJICAgICAqIElmIGl0J3MgYSBzY2FsYXIgdGhlIHRoYXQgc2NhbGFyIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBhcnJheSB3aXRoIAoJICAgICAqIGRpbSBkaW1lbnNpb25zLgoJICAgICAqIAoJICAgICAqLwoJICAgIHZhciBnZXRfbXVsdGlkaW1fb3B0aW9uID0gZnVuY3Rpb24gKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkaW0sIGRlZmF1bF92YWx1ZSkgewoJICAgICAgdmFyIHZhbHVlID0gZ2V0X29wdGlvbihvcHRpb25fbmFtZSwgb3B0aW9ucywgZGVmYXVsX3ZhbHVlKTsKCSAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKCSAgICAgICAgdmFsdWUgPSBjcmVhdGVfYXJyYXkoZGltLCB2YWx1ZSk7CgkgICAgICB9CgkgICAgICBpZiAoIWFycmF5X2VxdWFsKGFycmF5X2RpbSh2YWx1ZSksIGRpbSkpIHsKCSAgICAgICAgdGhyb3cgIlRoZSBvcHRpb24gIiArIG9wdGlvbl9uYW1lICsgIiBpcyBvZiBkaW1lbnNpb24gWyIgKyBhcnJheV9kaW0odmFsdWUpICsgIl0gYnV0IHNob3VsZCBiZSBbIiArIGRpbSArICJdLiI7CgkgICAgICB9CgkgICAgICByZXR1cm4gdmFsdWU7CgkgICAgfTsKCgkgICAgLy8vLy8vLy8vLyBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHBhcmFtZXRlciBvYmplY3RzIC8vLy8vLy8vLy8KCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCSAgICAvKioKCSAgICAgKiBSZXR1cm5zIGEgZml4ZWQgKHNhbWUgZXZlcnkgdGltZSkgbnVtYmVyIHRoYXQgY291bGQgYmUgdXNlZCB0byBpbml0aWFsaXplCgkgICAgICogYSBwYXJhbWV0ZXIgb2YgYSBjZXJ0YWluIHR5cGUsIHBvc3NpYmx5IHdpdGggbG93ZXIgYW5kIHVwcGVyIGJvdW5kcy4KCSAgICAgKiBUaGUgcG9zc2lsZSB0eXBlcyBhcmUgInJlYWwiLCAiaW50IiwgYW5kICJiaW5hcnkiLgoJICAgICAqLwoJICAgIHZhciBwYXJhbV9pbml0X2ZpeGVkID0gZnVuY3Rpb24gKHR5cGUsIGxvd2VyLCB1cHBlcikgewoJICAgICAgaWYgKGxvd2VyID4gdXBwZXIpIHsKCSAgICAgICAgdGhyb3cgIkNhbiBub3QgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIgd2hlcmUgbG93ZXIgYm91bmQgPiB1cHBlciBib3VuZCI7CgkgICAgICB9CgkgICAgICBpZiAodHlwZSA9PT0gInJlYWwiKSB7CgkgICAgICAgIGlmIChsb3dlciA9PT0gLUluZmluaXR5ICYmIHVwcGVyID09PSBJbmZpbml0eSkgewoJICAgICAgICAgIHJldHVybiAwLjU7CgkgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPT09IC1JbmZpbml0eSkgewoJICAgICAgICAgIHJldHVybiB1cHBlciAtIDAuNTsKCSAgICAgICAgfSBlbHNlIGlmICh1cHBlciA9PT0gSW5maW5pdHkpIHsKCSAgICAgICAgICByZXR1cm4gbG93ZXIgKyAwLjU7CgkgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPD0gdXBwZXIpIHsKCSAgICAgICAgICByZXR1cm4gKGxvd2VyICsgdXBwZXIpIC8gMjsKCSAgICAgICAgfQoJICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAiaW50IikgewoJICAgICAgICBpZiAobG93ZXIgPT09IC1JbmZpbml0eSAmJiB1cHBlciA9PT0gSW5maW5pdHkpIHsKCSAgICAgICAgICByZXR1cm4gMTsKCSAgICAgICAgfSBlbHNlIGlmIChsb3dlciA9PT0gLUluZmluaXR5KSB7CgkgICAgICAgICAgcmV0dXJuIHVwcGVyIC0gMTsKCSAgICAgICAgfSBlbHNlIGlmICh1cHBlciA9PT0gSW5maW5pdHkpIHsKCSAgICAgICAgICByZXR1cm4gbG93ZXIgKyAxOwoJICAgICAgICB9IGVsc2UgaWYgKGxvd2VyIDw9IHVwcGVyKSB7CgkgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKGxvd2VyICsgdXBwZXIpIC8gMik7CgkgICAgICAgIH0KCSAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gImJpbmFyeSIpIHsKCSAgICAgICAgcmV0dXJuIDE7CgkgICAgICB9CgkgICAgICB0aHJvdyAiQ291bGQgbm90IGluaXRpYWxpemUgcGFyYW1ldGVyIG9mIHR5cGUgIiArIHR5cGUgKyAiWyIgKyBsb3dlciArICIsICIgKyB1cHBlciArICJdIjsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBDb21wbGV0ZXMgcGFyYW1zX3RvX2NvbXBsZXRlLCBhbiBvYmplY3QgY29udGFpbmluZyBwYXJhbWV0ZXIgZGVzY3JpcHRpb25zLCAKCSAgICAgKiBhbmQgaW5pdGlhbGl6ZXMgbm9uLWluaXRpYWxpemVkIHBhcmFtZXRlcnMuIFRoaXMgbW9kaWZpZWQgdmVyc2lvbiBvZgoJICAgICAqIHBhcmFtc190b19jb21wbGV0ZSBpcyByZXR1cm5lZCBhcyBhIGRlZXAgY29weSBhbmQgbm90IG1vZGlmaWVkIGluIHBsYWNlLgoJICAgICAqIEluaXRpYWxpemF0aW9uIGlzIGRvbmUgYnkgc3VwcGx5aW5nIGEgcGFyYW1faW5pdCBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZQoJICAgICAqIGZ1bmN0aW9uKHR5cGUsIGxvd2VyLCB1cHBlcikgdGhhdCBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIG51bWJlciAKCSAgICAgKiAobGlrZSBwYXJhbV9pbml0X2ZpeGVkLCBmb3IgZXhhbXBsZSkuCgkgICAgICogQGV4YW1wbGUKCSAgICAgKiB2YXIgcGFyYW1zID0geyAibXUiOiB7InR5cGUiOiAicmVhbCJ9IH0KCSAgICAgKiBwYXJhbXMgPSBjb21wbGV0ZV9wYXJhbXMocGFyYW1zKTsKCSAgICAgKiAvLyBwYXJhbXMgc2hvdWxkIG5vdyBiZToKCSAgICAgKiAvLyAgeyJtdSI6IHsgInR5cGUiOiAicmVhbCIsICJkaW0iOiBbMV0sICJ1cHBlciI6IEluZmluaXR5LAoJICAgICAqIC8vICAgICAgICAgICAibG93ZXIiOiAtSW5maW5pdHksICJpbml0IjogMC41IH19CgkgICAgICovCgkgICAgdmFyIGNvbXBsZXRlX3BhcmFtcyA9IGZ1bmN0aW9uIChwYXJhbXNfdG9fY29tcGxldGUsIHBhcmFtX2luaXQpIHsKCSAgICAgIHZhciBwYXJhbXMgPSBkZWVwX2Nsb25lKHBhcmFtc190b19jb21wbGV0ZSk7CgkgICAgICBmb3IgKHZhciBwYXJhbV9uYW1lIGluIHBhcmFtcykgewoJICAgICAgICBpZiAoIXBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbV9uYW1lKSkgY29udGludWU7CgkgICAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1twYXJhbV9uYW1lXTsKCSAgICAgICAgaWYgKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eSgidHlwZSIpKSB7CgkgICAgICAgICAgcGFyYW0udHlwZSA9ICJyZWFsIjsKCSAgICAgICAgfQoJICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJkaW0iKSkgewoJICAgICAgICAgIHBhcmFtLmRpbSA9IFsxXTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoaXNfbnVtYmVyKHBhcmFtLmRpbSkpIHsKCSAgICAgICAgICBwYXJhbS5kaW0gPSBbcGFyYW0uZGltXTsKCSAgICAgICAgfQoJICAgICAgICBpZiAocGFyYW0udHlwZSA9PSAiYmluYXJ5IikgewoJICAgICAgICAgIHBhcmFtLnVwcGVyID0gMTsKCSAgICAgICAgICBwYXJhbS5sb3dlciA9IDA7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eSgidXBwZXIiKSkgewoJICAgICAgICAgIHBhcmFtLnVwcGVyID0gSW5maW5pdHk7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eSgibG93ZXIiKSkgewoJICAgICAgICAgIHBhcmFtLmxvd2VyID0gLUluZmluaXR5OwoJICAgICAgICB9CgkgICAgICAgIGlmIChwYXJhbS5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpKSB7CgkgICAgICAgICAgLy8gSWYgdGhpcyBpcyBqdXN0IGEgbnVtYmVyIG9yIGEgbmVzdGVkIGFycmF5IHdlIGxlYXZlIGl0IGFsb25lLCBidXQgaWYuLi4KCSAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pICYmIHR5cGVvZiBwYXJhbS5pbml0ID09PSAiZnVuY3Rpb24iKSB7CgkgICAgICAgICAgICAvLyBwYXJhbS5pbml0IGlzIGEgZnVuY3Rpb24sIHVzZSB0aGF0IHRvIGluaXRpYWxpemUgdGhlIHBhcmFtZXRlci4KCSAgICAgICAgICAgIHBhcmFtLmluaXQgPSBwYXJhbS5pbml0KCk7CgkgICAgICAgICAgfSBlbHNlIGlmICghYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pICYmICFBcnJheS5pc0FycmF5KHBhcmFtLmluaXQpKSB7CgkgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgd2hlcmUgdGhlIHBhcmFtLmluaXQgZXhpc3QgYnV0CgkgICAgICAgICAgICAvLyBpcyBub3QgYW4gYXJyYXkuIFRoZW4gYXNzdW1lIGl0IGlzIGEgbnVtYmVyIG9yIGEgZnVuY3Rpb24gYW5kIHVzZQoJICAgICAgICAgICAgLy8gaXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFyYW1ldGVyLgoJICAgICAgICAgICAgcGFyYW0uaW5pdCA9IGNyZWF0ZV9hcnJheShwYXJhbS5kaW0sIHBhcmFtLmluaXQpOwoJICAgICAgICAgIH0KCSAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAvLyBXZSB1c2UgdGhlIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCgkgICAgICAgICAgaWYgKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkgewoJICAgICAgICAgICAgcGFyYW0uaW5pdCA9IHBhcmFtX2luaXQocGFyYW0udHlwZSwgcGFyYW0ubG93ZXIsIHBhcmFtLnVwcGVyKTsKCSAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgcGFyYW0uaW5pdCA9IGNyZWF0ZV9hcnJheShwYXJhbS5kaW0sIGZ1bmN0aW9uICgpIHsKCSAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtX2luaXQocGFyYW0udHlwZSwgcGFyYW0ubG93ZXIsIHBhcmFtLnVwcGVyKTsKCSAgICAgICAgICAgIH0pOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgfQoJICAgICAgcmV0dXJuIHBhcmFtczsKCSAgICB9OwoKCSAgICAvLy8vLy8vLy8vIFN0ZXBwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCSAgICAvKioKCSAgICAgKiBAaW50ZXJmYWNlCgkgICAgICogQSBTdGVwcGVyIGlzIGFuIG9iamVjdCByZXNwb25zaWJsZSBmb3IgcHVzaGluZyBhcm91bmQgb25lCgkgICAgICogb3IgbW9yZSBwYXJhbWV0ZXIgdmFsdWVzIGluIGEgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBkaXN0cmlidXRpb24KCSAgICAgKiBkZWZpbmVkIGJ5IHRoZSBsb2cgcG9zdGVyaW9yLiBUaGlzIGRlZmluZXMgdGhlIFN0ZXBwZXIgImludGVyZmFjZSIsCgkgICAgICogd2hlcmUgImludGVyZmFjZSIgbWVhbnMgdGhhdCBTdGVwcGVyIGRlZmluZXMgYSBjbGFzcyB0aGF0IGlzIG5ldmVyCgkgICAgICogbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkLCBidXQganVzdCB0byBiZSBzdWJjbGFzc2VkIGJ5IHNwZWNpYWxpemVkCgkgICAgICogc3RlcHBlciBmdW5jdGlvbnMuCgkgICAgICogQGludGVyZmFjZQoJICAgICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMsIGZvciBleGFtcGxlOgoJICAgICAqICAgeyJtdSI6IHsgInR5cGUiOiAicmVhbCIsICJkaW0iOiBbMV0sICJ1cHBlciI6IEluZmluaXR5LCAKCSAgICAgKiAgICJsb3dlciI6IC1JbmZpbml0eSwgImluaXQiOiAwLjUgfX0KCSAgICAgKiAgIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGJlICJjb21wbGV0ZSIsIHRoYXQgaXMsCgkgICAgICogICBzcGVjaWZ5aW5nIGFsbCByZWxldmFudCBhdHRyaWJ1dGVzIHN1Y2ggYXMgZGltLCBsb3dlciBhbmQgdXBwZXIuCgkgICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzIGluIHBhcmFtcwoJICAgICAqICAgKGFuZCBwb3NzaWJseSBtb3JlKS4gVGhlIHBhcmFtZXRlciBuYW1lcyBhcmUgZ2l2ZW4gYXMga2V5cyBhbmQgdGhlIHN0YXRlcwoJICAgICAqICAgYXMgc2NhbGFycyBvciwgcG9zc2libHkgbmVzdGVkLCBhcnJheXMuIEZvciBleGFtcGxlOgoJICAgICAqICAge211OiAxMCwgc2lnbWE6IDUsIGJldGE6IFsxLCAyLjVdfQoJICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gKnRha2luZyBubyBwYXJhbWV0ZXJzKiB0aGF0IHJldHVybnMgdGhlCgkgICAgICogICBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBUaGF0IGlzLCB0aGUgdmFsdWUgb2YgbG9nX3Bvc3QKCSAgICAgKiAgIHNob3VsZCBjaGFuZ2UgaWYgdGhlIHRoZSB2YWx1ZXMgaW4gc3RhdGUgYXJlIGNoYW5nZWQuCgkgICAgCgkgICAgICovCgkgICAgdmFyIFN0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpIHsKCSAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwoJICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwoJICAgICAgdGhpcy5sb2dfcG9zdCA9IGxvZ19wb3N0OwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBTaG91bGQgcmV0dXJuIHRoZSBuZXcgc3RhdGUsCgkgICAgICogYnV0IGlzIG1haW5seSBjYWxsZWQgZm9yIGl0J3Mgc2lkZSBlZmZlY3Qgb2YgbWFraW5nIGEgY2hhbmdlIGluIHRoZQoJICAgICAqIHN0YXRlIG9iamVjdC4KCSAgICAgKi8KCSAgICBTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewoJICAgICAgdGhyb3cgIkV2ZXJ5IFN0ZXBwZXIgbmVlZCB0byBpbXBsZW1lbnQgc3RlcCgpIjsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBJZiBpbXBsZW1lbnRlZCwgbWFrZXMgdGhlIHN0ZXBwZXIgYWRhcHQgd2hpbGUgc3RlcHBpbmcuCgkgICAgICovCgkgICAgU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gCgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogSWYgaW1wbGVtZW50ZWQsIG1ha2VzIHRoZSBzdGVwcGVyIGNlYXNlIGFkYXB0aW5nIHdoaWxlIHN0ZXBwaW5nLgoJICAgICAqLwoJICAgIFN0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gCgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmcgaW5mbyByZWdhcmRpbmcgdGhlIHN0ZXBwZXIuCgkgICAgICovCgkgICAgU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHN0ZXBwZXIuCgkgICAgICByZXR1cm4ge307CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogQGNsYXNzCgkgICAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9CgkgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIG1ldHJvcG9saXMgc3RlcCBpbgoJICAgICAqIHRoZSBBZGFwdGl2ZSBNZXRyb3BvbGlzLVdpdGhpbi1HaWJicyBhbGdvcml0aG0gaW4gIkV4YW1wbGVzIG9mIEFkYXB0aXZlIE1DTUMiCgkgICAgICogYnkgUm9iZXJ0cyBhbmQgUm9zZW50aGFsICgyMDA4KS4KCSAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24uCgkgICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLgoJICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKCSAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCgkgICAgICogQHBhcmFtIGdlbmVyYXRlX3Byb3Bvc2FsIC0gYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBwcm9wb3NhbCAoYXMgYSBudW1iZXIpCgkgICAgICogd2l0aCBzaWduYXR1cmUgZnVuY3Rpb24ocGFyYW1fc3RhdGUsIGxvZ19zY2FsZSkgd2hlcmUgcGFyYW1fc3RhdGUgaXMgYQoJICAgICAqIG51bWJlciBhbmQgbG9nX3NjYWxlIGRlZmluZXMgdGhlIHNjYWxlIG9mIHRoZSBwcm9wb3NhbCBzb21laG93LgoJICAgICovCgkgICAgdmFyIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBnZW5lcmF0ZV9wcm9wb3NhbCkgewoJICAgICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTsKCSAgICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTsKCSAgICAgIGlmIChwYXJhbV9uYW1lcy5sZW5ndGggIT0gMSkgewoJICAgICAgICB0aHJvdyAiT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgY2FuIG9ubHkgaGFuZGxlIG9uZSBwYXJhbWV0ZXIuIjsKCSAgICAgIH0KCSAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdOwoJICAgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lXTsKCSAgICAgIGlmICghYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CgkgICAgICAgIHRocm93ICJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBjYW4gb25seSBoYW5kbGUgb25lIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIuIjsKCSAgICAgIH0KCSAgICAgIHRoaXMubG93ZXIgPSBwYXJhbS5sb3dlcjsKCSAgICAgIHRoaXMudXBwZXIgPSBwYXJhbS51cHBlcjsKCSAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgPSBnZXRfb3B0aW9uKCJwcm9wX2xvZ19zY2FsZSIsIG9wdGlvbnMsIDApOwoJICAgICAgdGhpcy5iYXRjaF9zaXplID0gZ2V0X29wdGlvbigiYmF0Y2hfc2l6ZSIsIG9wdGlvbnMsIDUwKTsKCSAgICAgIHRoaXMubWF4X2FkYXB0YXRpb24gPSBnZXRfb3B0aW9uKCJtYXhfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIDAuMzMpOwoJICAgICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfb3B0aW9uKCJpbml0aWFsX2FkYXB0YXRpb24iLCBvcHRpb25zLCAxLjApOwoJICAgICAgdGhpcy50YXJnZXRfYWNjZXB0X3JhdGUgPSBnZXRfb3B0aW9uKCJ0YXJnZXRfYWNjZXB0X3JhdGUiLCBvcHRpb25zLCAwLjQ0KTsKCSAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBnZXRfb3B0aW9uKCJpc19hZGFwdGluZyIsIG9wdGlvbnMsIHRydWUpOwoJICAgICAgdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbCA9IGdlbmVyYXRlX3Byb3Bvc2FsOwoJICAgICAgdGhpcy5hY2NlcHRhbmNlX2NvdW50ID0gMDsKCSAgICAgIHRoaXMuYmF0Y2hfY291bnQgPSAwOwoJICAgICAgdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uID0gMDsKCSAgICB9OwoJICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwoJICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyOwoJICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewoJICAgICAgdmFyIHBhcmFtX3N0YXRlID0gdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdOwoJICAgICAgdmFyIHBhcmFtX3Byb3Bvc2FsID0gdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbChwYXJhbV9zdGF0ZSwgdGhpcy5wcm9wX2xvZ19zY2FsZSk7CgkgICAgICBpZiAocGFyYW1fcHJvcG9zYWwgPCB0aGlzLmxvd2VyIHx8IHBhcmFtX3Byb3Bvc2FsID4gdGhpcy51cHBlcikgOyBlbHNlIHsKCSAgICAgICAgLy8gbWFrZSBhIE1ldHJvcG9saXMgc3RlcAoJICAgICAgICB2YXIgY3Vycl9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTsKCSAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gcGFyYW1fcHJvcG9zYWw7CgkgICAgICAgIHZhciBwcm9wX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpOwoJICAgICAgICB2YXIgYWNjZXB0X3Byb2IgPSBNYXRoLmV4cChwcm9wX2xvZ19kZW5zIC0gY3Vycl9sb2dfZGVucyk7CgkgICAgICAgIGlmIChhY2NlcHRfcHJvYiA+IE1hdGgucmFuZG9tKCkpIHsKCSAgICAgICAgICAvLyBXZSBkbyBub3RoaW5nIGFzIHRoZSBzdGF0ZSBvZiBwYXJhbSBoYXMgYWxyZWFkeSBiZWVuIGNoYW5nZWQgdG8gdGhlIHByb3Bvc2FsCgkgICAgICAgICAgaWYgKHRoaXMuaXNfYWRhcHRpbmcpIHRoaXMuYWNjZXB0YW5jZV9jb3VudCsrOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIHJldmVydCBzdGF0ZSBiYWNrIHRvIHRoZSBvbGQgc3RhdGUgb2YgcGFyYW0KCSAgICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSBwYXJhbV9zdGF0ZTsKCSAgICAgICAgfQoJICAgICAgfQoJICAgICAgaWYgKHRoaXMuaXNfYWRhcHRpbmcpIHsKCSAgICAgICAgdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uKys7CgkgICAgICAgIGlmICh0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24gPj0gdGhpcy5iYXRjaF9zaXplKSB7CgkgICAgICAgICAgLy8gdGhlbiBhZGFwdAoJICAgICAgICAgIHRoaXMuYmF0Y2hfY291bnQrKzsKCSAgICAgICAgICB2YXIgbG9nX3NkX2FkanVzdG1lbnQgPSBNYXRoLm1pbih0aGlzLm1heF9hZGFwdGF0aW9uLCB0aGlzLmluaXRpYWxfYWRhcHRhdGlvbiAvIE1hdGguc3FydCh0aGlzLmJhdGNoX2NvdW50KSk7CgkgICAgICAgICAgaWYgKHRoaXMuYWNjZXB0YW5jZV9jb3VudCAvIHRoaXMuYmF0Y2hfc2l6ZSA+IHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlKSB7CgkgICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlICs9IGxvZ19zZF9hZGp1c3RtZW50OwoJICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlIC09IGxvZ19zZF9hZGp1c3RtZW50OwoJICAgICAgICAgIH0KCSAgICAgICAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwOwoJICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7CgkgICAgICAgIH0KCSAgICAgIH0KCSAgICAgIHJldHVybiB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07CgkgICAgfTsKCSAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSB0cnVlOwoJICAgIH07CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBmYWxzZTsKCSAgICB9OwoJICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24gKCkgewoJICAgICAgcmV0dXJuIHsKCSAgICAgICAgcHJvcF9sb2dfc2NhbGU6IHRoaXMucHJvcF9sb2dfc2NhbGUsCgkgICAgICAgIGlzX2FkYXB0aW5nOiB0aGlzLmlzX2FkYXB0aW5nLAoJICAgICAgICBhY2NlcHRhbmNlX2NvdW50OiB0aGlzLmFjY2VwdGFuY2VfY291bnQsCgkgICAgICAgIGl0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb246IHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiwKCSAgICAgICAgYmF0Y2hfY291bnQ6IHRoaXMuYmF0Y2hfY291bnQKCSAgICAgIH07CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGEgTm9ybWFsIHByb3Bvc2FsLgoJICAgICAqLwoJICAgIHZhciBub3JtYWxfcHJvcG9zYWwgPSBmdW5jdGlvbiAocGFyYW1fc3RhdGUsIHByb3BfbG9nX3NjYWxlKSB7CgkgICAgICByZXR1cm4gcm5vcm0ocGFyYW1fc3RhdGUsIE1hdGguZXhwKHByb3BfbG9nX3NjYWxlKSk7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogQGNsYXNzCgkgICAgICogQGF1Z21lbnRzIHtPbmVkaW1NZXRyb3BvbGlzU3RlcHBlcn0KCSAgICAgKiBBICJzdWJjbGFzcyIgb2YgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGNvbnRpbm91cyBOb3JtYWwgcHJvcG9zYWxzLgoJICAgICAqLwoJICAgIHZhciBSZWFsTWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKCSAgICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIG5vcm1hbF9wcm9wb3NhbCk7CgkgICAgfTsKCSAgICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUpOwoJICAgIFJlYWxNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI7CgoJICAgIC8qKgoJICAgICAqIEZ1bmN0aW9uIHJldHVybmluZyBhIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbC4KCSAgICAgKi8KCSAgICB2YXIgZGlzY3JldGVfbm9ybWFsX3Byb3Bvc2FsID0gZnVuY3Rpb24gKHBhcmFtX3N0YXRlLCBwcm9wX2xvZ19zY2FsZSkgewoJICAgICAgcmV0dXJuIE1hdGgucm91bmQocm5vcm0ocGFyYW1fc3RhdGUsIE1hdGguZXhwKHByb3BfbG9nX3NjYWxlKSkpOwoJICAgIH07CgoJICAgIC8qKgoJICAgICogQGNsYXNzCgkgICAgKiBAYXVnbWVudHMge09uZWRpbU1ldHJvcG9saXNTdGVwcGVyfQoJICAgICogQSAic3ViY2xhc3MiIG9mIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLgoJICAgICovCgkgICAgdmFyIEludE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CgkgICAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwpOwoJICAgIH07CgkgICAgSW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUpOwoJICAgIEludE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludE1ldHJvcG9saXNTdGVwcGVyOwoKCSAgICAvKioKCSAgICAgKiBAY2xhc3MKCSAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KCSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgbWV0cm9wb2xpcyBzdGVwIGluCgkgICAgICogdGhlIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiAiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQyIKCSAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpIGZvciBwb3NzaWJseSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5cy4gVGhhdAoJICAgICAqIGlzLCBpbnN0ZWFkIG9mIGp1c3QgdGFraW5nIGEgc3RlcCBmb3IgYSBvbmUtZGltZW5zaW9uYWwgcGFyYW1ldGVyIGxpa2UgCgkgICAgICogT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIsIHRoaXMgU3RlcHBlciBpcyByZXNwb25zaWJsZSBmb3IgdGFraW5nIHN0ZXBzIAoJICAgICAqIGZvciBhIG11bHRpZGltZW5zaW9uYWwgYXJyYXkuIEl0J3Mgc3RpbGwgcHJldHR5IGR1bWIgYW5kIGp1c3QgdGFrZXMKCSAgICAgKiBvbmUtZGltZW5zaW9uYWwgc3RlcHMgZm9yIGVhY2ggcGFyYW1ldGVyIGNvbXBvbmVudCwgdGhvdWdoLgoJICAgICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBmb3IgYSAKCSAgICAgKiAgIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyLgoJICAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy4KCSAgICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gCgkgICAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLgoJICAgICAqIEBwYXJhbSBTdWJTdGVwcGVyIC0gYSBjb25zdHJ1Y3RvciBmb3IgdGhlIHR5cGUgb2Ygb25lIGRpbWVuc2lvbmFsIFN0ZXBwZXIgdG8gYXBwbHkgb24KCSAgICAgKiAgIGFsbCB0aGUgY29tcG9uZW50cyBvZiB0aGUgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuCgkgICAgKi8KCSAgICB2YXIgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgU3ViU3RlcHBlcikgewoJICAgICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTsKCSAgICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTsKCSAgICAgIGlmIChwYXJhbV9uYW1lcy5sZW5ndGggIT0gMSkgewoJICAgICAgICB0aHJvdyAiTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuIjsKCSAgICAgIH0KCSAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdOwoJICAgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lXTsKCSAgICAgIHRoaXMubG93ZXIgPSBwYXJhbS5sb3dlcjsKCSAgICAgIHRoaXMudXBwZXIgPSBwYXJhbS51cHBlcjsKCSAgICAgIHRoaXMuZGltID0gcGFyYW0uZGltOwoJICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oInByb3BfbG9nX3NjYWxlIiwgb3B0aW9ucywgdGhpcy5kaW0sIDApOwoJICAgICAgdGhpcy5iYXRjaF9zaXplID0gZ2V0X211bHRpZGltX29wdGlvbigiYmF0Y2hfc2l6ZSIsIG9wdGlvbnMsIHRoaXMuZGltLCA1MCk7CgkgICAgICB0aGlzLm1heF9hZGFwdGF0aW9uID0gZ2V0X211bHRpZGltX29wdGlvbigibWF4X2FkYXB0YXRpb24iLCBvcHRpb25zLCB0aGlzLmRpbSwgMC4zMyk7CgkgICAgICB0aGlzLmluaXRpYWxfYWRhcHRhdGlvbiA9IGdldF9tdWx0aWRpbV9vcHRpb24oImluaXRpYWxfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIHRoaXMuZGltLCAxLjApOwoJICAgICAgdGhpcy50YXJnZXRfYWNjZXB0X3JhdGUgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJ0YXJnZXRfYWNjZXB0X3JhdGUiLCBvcHRpb25zLCB0aGlzLmRpbSwgMC40NCk7CgkgICAgICB0aGlzLmlzX2FkYXB0aW5nID0gZ2V0X211bHRpZGltX29wdGlvbigiaXNfYWRhcHRpbmciLCBvcHRpb25zLCB0aGlzLmRpbSwgdHJ1ZSk7CgoJICAgICAgLy8gVGhpcyBoYWNrIGJlbG93IGlzIGEgcmVjdXJzaXZlIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbiBhcnJheSBvZiAKCSAgICAgIC8vIG9uZSBkaW1lbnNpb25hbCBzdGVwcGVycyBhY2NvcmRpbmcgdG8gZGltLgoJICAgICAgdmFyIGNyZWF0ZV9zdWJzdGVwcGVycyA9IGZ1bmN0aW9uIChkaW0sIHN1YnN0YXRlLCBsb2dfcG9zdCwgcHJvcF9sb2dfc2NhbGUsIGJhdGNoX3NpemUsIG1heF9hZGFwdGF0aW9uLCBpbml0aWFsX2FkYXB0YXRpb24sIHRhcmdldF9hY2NlcHRfcmF0ZSwgaXNfYWRhcHRpbmcpIHsKCSAgICAgICAgdmFyIHN1YnN0ZXBwZXJzID0gW107CgkgICAgICAgIGlmIChkaW0ubGVuZ3RoID09PSAxKSB7CgkgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewoJICAgICAgICAgICAgdmFyIHN1Ym9wdGlvbnMgPSB7CgkgICAgICAgICAgICAgIHByb3BfbG9nX3NjYWxlOiBwcm9wX2xvZ19zY2FsZVtpXSwKCSAgICAgICAgICAgICAgYmF0Y2hfc2l6ZTogYmF0Y2hfc2l6ZVtpXSwKCSAgICAgICAgICAgICAgbWF4X2FkYXB0YXRpb246IG1heF9hZGFwdGF0aW9uW2ldLAoJICAgICAgICAgICAgICBpbml0aWFsX2FkYXB0YXRpb246IGluaXRpYWxfYWRhcHRhdGlvbltpXSwKCSAgICAgICAgICAgICAgdGFyZ2V0X2FjY2VwdF9yYXRlOiB0YXJnZXRfYWNjZXB0X3JhdGVbaV0sCgkgICAgICAgICAgICAgIGlzX2FkYXB0aW5nOiBpc19hZGFwdGluZ1tpXQoJICAgICAgICAgICAgfTsKCSAgICAgICAgICAgIHZhciBzdWJwYXJhbSA9IHt9OwoJICAgICAgICAgICAgc3VicGFyYW1baV0gPSBkZWVwX2Nsb25lKHBhcmFtKTsKCSAgICAgICAgICAgIHN1YnBhcmFtW2ldLmRpbSA9IFsxXTsgLy8gQXMgdGhpcyBzaG91bGQgbm93IGJlIGEgb25lLWRpbSBwYXJhbWV0ZXIKCSAgICAgICAgICAgIGRlbGV0ZSBzdWJwYXJhbVtpXS5pbml0OyAvLyBBcyBpdCBzb3VsZCBub3QgYmUgbmVlZGVkCgkgICAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBTdWJTdGVwcGVyKHN1YnBhcmFtLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHN1Ym9wdGlvbnMpOwoJICAgICAgICAgIH0KCSAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CgkgICAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IGNyZWF0ZV9zdWJzdGVwcGVycyhkaW0uc2xpY2UoMSksIHN1YnN0YXRlW2ldLCBsb2dfcG9zdCwgcHJvcF9sb2dfc2NhbGVbaV0sIGJhdGNoX3NpemVbaV0sIG1heF9hZGFwdGF0aW9uW2ldLCBpbml0aWFsX2FkYXB0YXRpb25baV0sIHRhcmdldF9hY2NlcHRfcmF0ZVtpXSwgaXNfYWRhcHRpbmdbaV0pOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gc3Vic3RlcHBlcnM7CgkgICAgICB9OwoJICAgICAgdGhpcy5zdWJzdGVwcGVycyA9IGNyZWF0ZV9zdWJzdGVwcGVycyh0aGlzLmRpbSwgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdLCB0aGlzLmxvZ19wb3N0LCB0aGlzLnByb3BfbG9nX3NjYWxlLCB0aGlzLmJhdGNoX3NpemUsIHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uLCB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSwgdGhpcy5pc19hZGFwdGluZyk7CgkgICAgfTsKCSAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwoJICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjsKCSAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewoJICAgICAgLy8gR28gdGhyb3VnaCB0aGUgc3Vic3RlcHBlcnMgaW4gYSByYW5kb20gb3JkZXIgYW5kIGNhbGwgc3RlcCgpIG9uIHRoZW0uCgkgICAgICByZXR1cm4gbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewoJICAgICAgICByZXR1cm4gc3Vic3RlcHBlci5zdGVwKCk7CgkgICAgICB9KTsKCSAgICB9OwoJICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CgkgICAgICBuZXN0ZWRfYXJyYXlfYXBwbHkodGhpcy5zdWJzdGVwcGVycywgZnVuY3Rpb24gKHN1YnN0ZXBwZXIpIHsKCSAgICAgICAgc3Vic3RlcHBlci5zdGFydF9hZGFwdGF0aW9uKCk7CgkgICAgICB9KTsKCSAgICB9OwoJICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewoJICAgICAgICBzdWJzdGVwcGVyLnN0b3BfYWRhcHRhdGlvbigpOwoJICAgICAgfSk7CgkgICAgfTsKCSAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24gKCkgewoJICAgICAgcmV0dXJuIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewoJICAgICAgICByZXR1cm4gc3Vic3RlcHBlci5pbmZvKCk7CgkgICAgICB9KTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBAY2xhc3MKCSAgICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9CgkgICAgICogQSAic3ViY2xhc3MiIG9mIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGNvbnRpbm91cyBOb3JtYWwgcHJvcG9zYWxzLgoJICAgICAqLwoJICAgIHZhciBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewoJICAgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBSZWFsTWV0cm9wb2xpc1N0ZXBwZXIpOwoJICAgIH07CgkgICAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7CgoJICAgIC8qKgoJICAgICAqIEBjbGFzcwoJICAgICAqIEBhdWdtZW50cyB7TXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcn0KCSAgICAgKiBBICJzdWJjbGFzcyIgb2YgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgZGlzY3JldGl6ZWQgTm9ybWFsIHByb3Bvc2Fscy4KCSAgICAgKi8KCSAgICB2YXIgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewoJICAgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBJbnRNZXRyb3BvbGlzU3RlcHBlcik7CgkgICAgfTsKCSAgICBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUpOwoJICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjsKCgkgICAgLyoqCgkgICAgICogQGNsYXNzCgkgICAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9CgkgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYSBzdGVwIGZvciBhIGJpbmFyeSBwYXJhbWV0ZXIuCgkgICAgICogVGhpcyBpcyBkb25lIGJ5IGV2YWx1YXRpbmcgdGhlIGxvZyBwb3N0ZXJpb3IgZm9yIGJvdGggc3RhdGVzIG9mIHRoZQoJICAgICAqIHBhcmFtZXRlciBhbmQgdGhlbiBzZWxlY3RpbmcgYSBzdGF0ZSByYW5kb21seSB3aXRoIHByb2JhYmlsaXR5IHJlbGF0aXZlIAoJICAgICAqIHRvIHRoZSBwb3N0ZXJpb3Igb2YgZWFjaCBzdGF0ZS4KCSAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24uCgkgICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLgoJICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKCSAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCgkgICAgKi8KCSAgICB2YXIgQmluYXJ5U3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewoJICAgICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTsKCSAgICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTsKCSAgICAgIGlmIChwYXJhbV9uYW1lcy5sZW5ndGggPT0gMSkgewoJICAgICAgICB0aGlzLnBhcmFtX25hbWUgPSBwYXJhbV9uYW1lc1swXTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRocm93ICJCaW5hcnlTdGVwcGVyIGNhbid0IGhhbmRsZSBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4iOwoJICAgICAgfQoJICAgIH07CgkgICAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsKCSAgICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJpbmFyeVN0ZXBwZXI7CgkgICAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IDA7CgkgICAgICB2YXIgemVyb19sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTsKCSAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IDE7CgkgICAgICB2YXIgb25lX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpOwoJICAgICAgdmFyIG1heF9sb2dfZGVucyA9IE1hdGgubWF4KHplcm9fbG9nX2RlbnMsIG9uZV9sb2dfZGVucyk7CgkgICAgICB6ZXJvX2xvZ19kZW5zIC09IG1heF9sb2dfZGVuczsKCSAgICAgIG9uZV9sb2dfZGVucyAtPSBtYXhfbG9nX2RlbnM7CgkgICAgICB2YXIgemVyb19wcm9iID0gTWF0aC5leHAoemVyb19sb2dfZGVucyAtIE1hdGgubG9nKE1hdGguZXhwKHplcm9fbG9nX2RlbnMpICsgTWF0aC5leHAob25lX2xvZ19kZW5zKSkpOwoJICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPCB6ZXJvX3Byb2IpIHsKCSAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDsKCSAgICAgICAgcmV0dXJuIDA7CgkgICAgICB9IC8vIGVsc2Uga2VlcCB0aGUgcGFyYW0gYXQgMSAuCgkgICAgICByZXR1cm4gMTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAqIEBjbGFzcwoJICAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9CgkgICAgKiBKdXN0IGxpa2UgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciB0aGlzIFN0ZXBwZXIgdGFrZXMgYSBzdGVwcyBmb3IKCSAgICAqIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgYnkgdXBkYXRpbmcgZWFjaCBjb21wb25lbnQgaW4gdHVybi4gVGhlIGRpZmZlcmVuY2UKCSAgICAqIGlzIHRoYXQgdGhpcyBzdGVwcGVyIHdvcmtzIG9uIGJpbmFyeSBwYXJhbWV0ZXJzLgoJICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uIGZvciBhIAoJICAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci4KCSAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy4KCSAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKCSAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAqLwoJICAgIHZhciBCaW5hcnlDb21wb25lbnRTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CgkgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwoJICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwoJICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCA9PSAxKSB7CgkgICAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdOwoJICAgICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdOwoJICAgICAgICB0aGlzLmRpbSA9IHBhcmFtLmRpbTsKCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIHRocm93ICJCaW5hcnlDb21wb25lbnRTdGVwcGVyIGNhbid0IGhhbmRsZSBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4iOwoJICAgICAgfQoJICAgICAgdmFyIGNyZWF0ZV9zdWJzdGVwcGVycyA9IGZ1bmN0aW9uIChkaW0sIHN1YnN0YXRlLCBsb2dfcG9zdCkgewoJICAgICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTsKCSAgICAgICAgdmFyIGk7CgkgICAgICAgIGlmIChkaW0ubGVuZ3RoID09PSAxKSB7CgkgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CgkgICAgICAgICAgICB2YXIgc3VicGFyYW1zID0ge307CgkgICAgICAgICAgICBzdWJwYXJhbXNbaV0gPSBwYXJhbTsKCSAgICAgICAgICAgIHN1YnN0ZXBwZXJzW2ldID0gbmV3IEJpbmFyeVN0ZXBwZXIoc3VicGFyYW1zLCBzdWJzdGF0ZSwgbG9nX3Bvc3QpOwoJICAgICAgICAgIH0KCSAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHsKCSAgICAgICAgICAgIHN1YnN0ZXBwZXJzW2ldID0gY3JlYXRlX3N1YnN0ZXBwZXJzKGRpbS5zbGljZSgxKSwgc3Vic3RhdGVbaV0sIGxvZ19wb3N0KTsKCSAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgcmV0dXJuIHN1YnN0ZXBwZXJzOwoJICAgICAgfTsKCSAgICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBjcmVhdGVfc3Vic3RlcHBlcnModGhpcy5kaW0sIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSwgdGhpcy5sb2dfcG9zdCk7CgkgICAgfTsKCSAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwoJICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmluYXJ5Q29tcG9uZW50U3RlcHBlcjsKCSAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewoJICAgICAgLy8gR28gdGhyb3VnaCB0aGUgc3Vic3RlcHBlcnMgaW4gYSByYW5kb20gb3JkZXIgYW5kIGNhbGwgc3RlcCgpIG9uIHRoZW0uCgkgICAgICByZXR1cm4gbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewoJICAgICAgICByZXR1cm4gc3Vic3RlcHBlci5zdGVwKCk7CgkgICAgICB9KTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBAY2xhc3MKCSAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KCSAgICAgKiBUaGlzIHN0ZXBwZXIgY2FuIGJlIHJlc3BvbnNpYmxlIGZvciB0YWtpbmcgYSBzdGVwIGZvciBvbmUgb3IgbW9yZSBwYXJhbWV0ZXJzLgoJICAgICAqIEZvciByZWFsIGFuZCBpbnQgcGFyYW1ldGVycyBpdCB0YWtlcyBNZXRyb3BvbGlzIHdpdGhpbiBHaWJicyBzdGVwcywgYW5kIGZvciAKCSAgICAgKiBiaW5hcnkgcGFyYW1ldGVycyBpdCBkb2VzIGV2YWx1YXRlcyB0aGUgcG9zdGVyaW9yIGZvciBib3RoIHBhcmFtdGVyIHZhbHVlcyBhbmQKCSAgICAgKiByYW5kb21seSBjaGFuZ2VzIHRvIGEgY2VydGFpbiB2YWx1ZSBwcm9wb3J0aW9uYWxseSB0byB0aGF0IHZhbHVlJ3MgcG9zdGVyaW9yCgkgICAgICogKHRoaXMgaXMgYWxzbyBkb25lIGZvciBlYWNoIHBhcmFtZXRlciwgc28gYWxzbyBhICogd2l0aGluIEdpYmJzIGFwcHJvYWNoKS4KCSAgICAgKiBUaGlzIHN0ZXBwZXIgaXMgYWxzbyBhZGFwdGl2ZSBhbmQgY2FuIGJlIGVmZmljaWVudCB3aGVuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwoJICAgICAqIGFyZSBub3QgdG9vIGhpZ2ggYW5kIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJhbWV0ZXJzIGFyZSBsb3cuCgkgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgb25lIG9yIG1vcmUgcGFyYW1ldGVyIGRlZmluaXRpb25zCgkgICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLgoJICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKCSAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCgkgICAgKi8KCSAgICB2YXIgQW13Z1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKCSAgICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7CgkgICAgICB0aGlzLnBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwoJICAgICAgdGhpcy5zdWJzdGVwcGVycyA9IFtdOwoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1t0aGlzLnBhcmFtX25hbWVzW2ldXTsKCSAgICAgICAgdmFyIFNlbGVjdFN0ZXBwZXI7CgkgICAgICAgIHN3aXRjaCAocGFyYW0udHlwZSkgewoJICAgICAgICAgIGNhc2UgInJlYWwiOgoJICAgICAgICAgICAgaWYgKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkgewoJICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gUmVhbE1ldHJvcG9saXNTdGVwcGVyOwoJICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgY2FzZSAiaW50IjoKCSAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKCSAgICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IEludE1ldHJvcG9saXNTdGVwcGVyOwoJICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICBjYXNlICJiaW5hcnkiOgoJICAgICAgICAgICAgaWYgKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkgewoJICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gQmluYXJ5U3RlcHBlcjsKCSAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBCaW5hcnlDb21wb25lbnRTdGVwcGVyOwoJICAgICAgICAgICAgfQoJICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgICAgZGVmYXVsdDoKCSAgICAgICAgICAgIHRocm93ICJBbXdnU3RlcHBlciBjYW4ndCBoYW5kbGUgcGFyYW1ldGVyICIgKyB0aGlzLnBhcmFtX25hbWVzW2ldICsgIiB3aXRoIHR5cGUgIiArIHBhcmFtLnR5cGU7CgkgICAgICAgIH0KCSAgICAgICAgdmFyIHBhcmFtX29iamVjdF93cmFwID0ge307CgkgICAgICAgIHBhcmFtX29iamVjdF93cmFwW3RoaXMucGFyYW1fbmFtZXNbaV1dID0gcGFyYW07CgkgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJICAgICAgICB2YXIgcGFyYW1fb3B0aW9ucyA9IG9wdGlvbnMucGFyYW1zICYmIG9wdGlvbnMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dIHx8IHt9OwoJICAgICAgICBwYXJhbV9vcHRpb25zLnByb3BfbG9nX3NjYWxlID0gcGFyYW1fb3B0aW9ucy5wcm9wX2xvZ19zY2FsZSB8fCBvcHRpb25zLnByb3BfbG9nX3NjYWxlOwoJICAgICAgICBwYXJhbV9vcHRpb25zLmJhdGNoX3NpemUgPSBwYXJhbV9vcHRpb25zLmJhdGNoX3NpemUgfHwgb3B0aW9ucy5iYXRjaF9zaXplOwoJICAgICAgICBwYXJhbV9vcHRpb25zLm1heF9hZGFwdGF0aW9uID0gcGFyYW1fb3B0aW9ucy5tYXhfYWRhcHRhdGlvbiB8fCBvcHRpb25zLm1heF9hZGFwdGF0aW9uOwoJICAgICAgICBwYXJhbV9vcHRpb25zLmluaXRpYWxfYWRhcHRhdGlvbiA9IHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uIHx8IG9wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uOwoJICAgICAgICBwYXJhbV9vcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZSA9IHBhcmFtX29wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlIHx8IG9wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlOwoJICAgICAgICBwYXJhbV9vcHRpb25zLmlzX2FkYXB0aW5nID0gcGFyYW1fb3B0aW9ucy5pc19hZGFwdGluZyB8fCBvcHRpb25zLmlzX2FkYXB0aW5nOwoJICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldID0gbmV3IFNlbGVjdFN0ZXBwZXIocGFyYW1fb2JqZWN0X3dyYXAsIHN0YXRlLCBsb2dfcG9zdCwgcGFyYW1fb3B0aW9ucyk7CgkgICAgICB9CgkgICAgfTsKCSAgICBBbXdnU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsKCSAgICBBbXdnU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU3RlcHBlcjsKCSAgICBBbXdnU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHNodWZmbGVfYXJyYXkodGhpcy5zdWJzdGVwcGVycyk7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGVwKCk7CgkgICAgICB9CgkgICAgICByZXR1cm4gdGhpcy5zdGF0ZTsKCSAgICB9OwoJICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0uc3RhcnRfYWRhcHRhdGlvbigpOwoJICAgICAgfQoJICAgIH07CgkgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykgewoJICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0b3BfYWRhcHRhdGlvbigpOwoJICAgICAgfQoJICAgIH07CgkgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CgkgICAgICB2YXIgaW5mbyA9IHt9OwoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIGluZm9bdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSB0aGlzLnN1YnN0ZXBwZXJzW2ldLmluZm8oKTsKCSAgICAgIH0KCSAgICAgIHJldHVybiBpbmZvOwoJICAgIH07CgoJICAgIC8vLy8vLy8vLy8vIFNhbXBsZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8KCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJICAgIC8qKgoJICAgICogQGludGVyZmFjZQoJICAgICogV2hpbGUgeW91IGNvdWxkIGZpdCBhIG1vZGVsIGJ5IHBhc3RpbmcgdG9nZXRoZXIgU3RlcHBlcnMsIGEKCSAgICAvLyBTYW1wbGVyIGlzIGhlcmUgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyB3aGVyZSBhbiBpbnN0YW5jZSBvZiBTYW1wbGVyCgkgICAgLy8gc2V0cyB1cCB0aGUgU3RlcHBlcnMsIGNoZWNrcyB0aGUgcGFyYW1ldGVyIGRlZmluaXRpb24sCgkgICAgLy8gYW5kIG1hbmFnZXMgdGhlIHNhbXBsaW5nLiBUaGlzIGhlcmUgZGVmaW5lcyB0aGUgU2FtcGxlciAiaW50ZXJmYWNlIi4KCSAgICAqIEBpbnRlcmZhY2UKCSAgICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMsIGZvciBleGFtcGxlOgoJICAgICogICB7Im11IjogeyJ0eXBlIjogInJlYWwifSwgInNpZ21hIjogeyJ0eXBlIjogInJlYWwiLCAibG93ZXIiID0gMH19CgkgICAgKiAgIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgZG9lc24ndCBoYXZlIHRvIGJlICJjb21wbGV0ZSIgYW5kIHByb3BlcnRpZXMKCSAgICAqICAgbGVmdCBvdXQgKGxpa2UgbG93ZXIgYW5kIHVwcGVyKSB3aWxsIGJlIGZpbGxlZCBpbiBieSBkZWZhdWx0cy4KCSAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gd2l0aCBzaWduYXR1cmUgZnVuY3Rpb24oc3RhdGUsIGRhdGEpLiBIZXJlCgkgICAgKiAgIHN0YXRlIHdpbGwgYmUgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3RhdGUgd2l0aCBlYWNoIHBhcmFtZXRlciBhcyBhIAoJICAgICogICBrZXkgYW5kIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGFzIG51bWJlcnMgb3IgYXJyYXlzLiBGb3IgZXhhbXBsZToKCSAgICAqICAgeyJtdSI6IDMsICJzaWdtYSI6IDEuNX0uIFRoZSBkYXRhIGFyZ3VtZW50IHdpbGwgYmUgdGhlIHNhbWUgb2JqZWN0IGFzIAoJICAgICogICB0aGUgZGF0YSBhcmd1bWVudCBnaXZlbiBiZWxvdy4KCSAgICAqIEBwYXJhbSBkYXRhIC0gYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBwYXNzZWQgb24gdG8gdGhlIGxvZ19wb3N0IGZ1bmN0aW9uCgkgICAgKiAgIHdoZW4gc2FtcGxpbmcuCgkgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHNhbXBsZXIuCgkgICAgKi8KCSAgICB2YXIgU2FtcGxlciA9IGZ1bmN0aW9uIChwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKSB7CgkgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKCSAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CgkgICAgICB0aGlzLnBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwoKCSAgICAgIC8vIFNldHRpbmcgZGVmYXVsdCBvcHRpb25zIGlmIG5vdCBwYXNzZWQgdGhyb3VnaCB0aGUgb3B0aW9ucyBvYmplY3QKCSAgICAgIHRoaXMucGFyYW1faW5pdF9mdW4gPSBnZXRfb3B0aW9uKCJwYXJhbV9pbml0X2Z1biIsIG9wdGlvbnMsIHBhcmFtX2luaXRfZml4ZWQpOwoJICAgICAgdmFyIHRoaW5uaW5nX2ludGVydmFsID0gZ2V0X29wdGlvbigidGhpbiIsIG9wdGlvbnMsIDEpOwoJICAgICAgdmFyIHBhcmFtc190b19tb25pdG9yID0gZ2V0X29wdGlvbigibW9uaXRvciIsIG9wdGlvbnMsIG51bGwpOwoJICAgICAgdGhpcy50aGluKHRoaW5uaW5nX2ludGVydmFsKTsKCSAgICAgIHRoaXMubW9uaXRvcihwYXJhbXNfdG9fbW9uaXRvcik7CgkgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJICAgICAgLy8gQ29tcGxldGluZyB0aGUgcGFyYW1zIGFuZCBpbml0aWFsaXppbmcgdGhlIHN0YXRlLgoJICAgICAgdGhpcy5wYXJhbXMgPSBjb21wbGV0ZV9wYXJhbXModGhpcy5wYXJhbXMsIHRoaXMucGFyYW1faW5pdF9mdW4pOwoJICAgICAgdmFyIHN0YXRlID0ge307CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1fbmFtZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgc3RhdGVbdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVzW2ldXS5pbml0OwoJICAgICAgfQoJICAgICAgdGhpcy5sb2dfcG9zdCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgICAgcmV0dXJuIGxvZ19wb3N0KHN0YXRlLCBkYXRhKTsKCSAgICAgIH07CgkgICAgICAvLyBSdW5uaW5nIHRoZSBsb2dfcG9zdCBmdW5jdGlvbiBvbmNlIGluIGNhc2UgaXQgZnVydGhlciBtb2RpZmllcyB0aGUgc3RhdGUKCSAgICAgIC8vIGZvciBleGFtcGxlIGFkZGluZyBkZXJpdmVkIHF1YW50aXRpZXMuCgkgICAgICB0aGlzLmxvZ19wb3N0KCk7CgkgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CgkgICAgICB0aGlzLnN0ZXBwZXJzID0gdGhpcy5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSh0aGlzLnBhcmFtcywgdGhpcy5zdGF0ZSwgdGhpcy5sb2dfcG9zdCwgdGhpcy5vcHRpb25zKTsKCSAgICB9OwoKCSAgICAvKiogU2hvdWxkIHJldHVybiBhIHZlY3RvciBvZiBzdGVwcGVycyB0aGF0IHdoZW4gY2FsbGVkIAoJICAgICAqIHNob3VsZCB0YWtlIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLgoJICAgICAqLwoJICAgIFNhbXBsZXIucHJvdG90eXBlLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlID0gZnVuY3Rpb24gKHN0YXRlLCBsb2dfcG9zdCkgewoJICAgICAgdGhyb3cgIkV2ZXJ5IFNhbXBsZXIgbmVlZHMgdG8gaW1wbGVtZW50IGNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlKCkiOwoJICAgIH07CgoJICAgIC8qKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGluZm8gYWJvdXQgdGhlIHN0YXRlIG9mIHRoZSBTYW1wbGVyLgoJICAgICAqLwoJICAgIFNhbXBsZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CgkgICAgICByZXR1cm4gewoJICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSwKCSAgICAgICAgdGhpbjogdGhpcy50aGluLAoJICAgICAgICBtb25pdG9yOiB0aGlzLm1vbml0b3IsCgkgICAgICAgIHN0ZXBwZXJzOiB0aGlzLnN0ZXBwZXJzCgkgICAgICB9OwoJICAgIH07CgoJICAgIC8qKiBUYWtlcyBhIHN0ZXAgaW4gdGhlIHBhcmFtZXRlciBzcGFjZS4gUmV0dXJucyB0aGUgbmV3IHNwYWNlCgkgICAgICogYnV0IGFsc28gbW9kaWZpZXMgdGhlIHN0YXRlIGluIHBsYWNlLgoJICAgICAqLwoJICAgIFNhbXBsZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICBzaHVmZmxlX2FycmF5KHRoaXMuc3RlcHBlcnMpOwoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RlcCgpOwoJICAgICAgfQoJICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuc3RhdGUpLmxlbmd0aCA+IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKS5sZW5ndGgpIHsKCSAgICAgICAgLy8gVGhlIHN0YXRlIGNvbnRhaW5zIGRldml2ZWQgcXVhbnRpdGllcyAobm90IG9ubHkgcGFyYW1ldGVycykgYW5kIHdlCgkgICAgICAgIC8vIG5lZWQgdG8gcnVuIHRoZSBsb2dfcG9zdCBvbmNlIG1vcmUgaW4gb3JkZXIgdG8gc2V0IHRoZSBkZXJpdmVkIHF1YW50aXRpZXMKCSAgICAgICAgLy8gZm9yIHRoZSBmaW5hbCBwYXJhbWV0ZXIgc3RhdGUKCSAgICAgICAgdGhpcy5sb2dfcG9zdCgpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogVGFrZXMgbl9pdGVyYXRpb25zIHN0ZXBzIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UgYW5kIHJldHVybnMgdGhlbQoJICAgICAqIGFzIGFuIG9iamVjdCBvZiBhcnJheXMgd2l0aCBvbmUgYXJyYXkgcGVyIHBhcmFtZXRlci4gRm9yIGV4YW1wbGU6CgkgICAgICoge211OiBbMSwgLTEsIDIsIDMsIC4uLl0sIHNpZ21hOiBbMSwgMiwgMiwgMSwgLi4uXX0uCgkgICAgICogSWYgdGhpbiBpcyA+IDEgdGhlbiBuX2l0ZXJhdGlvbnMgLyB0aGluIHNhbXBsZXMgYXJlIHJldHVybmVkLgoJICAgICAqLwoJICAgIFNhbXBsZXIucHJvdG90eXBlLnNhbXBsZSA9IGZ1bmN0aW9uIChuX2l0ZXJhdGlvbnMpIHsKCSAgICAgIC8vIEluaXRpYWxpemluZyBjdXJyX3NhbXBsZSB3aGVyZSB0aGUgc2FtcGxlIGlzIGdvaW5nIHRvIGJlIHNhdmVkCgkgICAgICAvLyBhcyBhbiBvYmplY3QgY29udGFpbmluZyBvbmUgYXJyYXkgcGVyIHBhcmFtZXRlciB0byBiZSBtb25pdG9yZWQuCgkgICAgICB2YXIgaSwgaiwgbW9uaXRvcmVkX3BhcmFtczsKCSAgICAgIGlmICh0aGlzLm1vbml0b3JlZF9wYXJhbXMgPT09IG51bGwpIHsKCSAgICAgICAgbW9uaXRvcmVkX3BhcmFtcyA9IE9iamVjdC5rZXlzKHRoaXMuc3RhdGUpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgbW9uaXRvcmVkX3BhcmFtcyA9IHRoaXMubW9uaXRvcmVkX3BhcmFtczsKCSAgICAgIH0KCSAgICAgIHZhciBjdXJyX3NhbXBsZSA9IHt9OwoJICAgICAgZm9yIChqID0gMDsgaiA8IG1vbml0b3JlZF9wYXJhbXMubGVuZ3RoOyBqKyspIHsKCSAgICAgICAgY3Vycl9zYW1wbGVbbW9uaXRvcmVkX3BhcmFtc1tqXV0gPSBbXTsKCSAgICAgIH0KCSAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2l0ZXJhdGlvbnM7IGkrKykgewoJICAgICAgICBpZiAoaSAlIHRoaXMudGhpbm5pbmdfaW50ZXJ2YWwgPT09IDApIHsKCSAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbW9uaXRvcmVkX3BhcmFtcy5sZW5ndGg7IGorKykgewoJICAgICAgICAgICAgdmFyIHBhcmFtID0gbW9uaXRvcmVkX3BhcmFtc1tqXTsKCSAgICAgICAgICAgIGN1cnJfc2FtcGxlW3BhcmFtXS5wdXNoKGNsb25lX3BhcmFtX2RyYXcodGhpcy5zdGF0ZVtwYXJhbV0pKTsKCSAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgICAgdGhpcy5zdGVwKCk7CgkgICAgICB9CgkgICAgICByZXR1cm4gY3Vycl9zYW1wbGU7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogVGFrZXMgbl9pdGVyYXRpb24gc3RlcHMgaW4gcGFyYW1ldGVyIHNwYWNlIGJ1dCByZXR1cm5zIG5vdGhpbmcuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuYnVybiA9IGZ1bmN0aW9uIChuX2l0ZXJhdGlvbnMpIHsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHsKCSAgICAgICAgdGhpcy5zdGVwKCk7CgkgICAgICB9CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogU2V0cyB3aGF0IHBhcmFtZXRlcnMgc2hvdWxkIGJlIG1vbml0b3JlZCBhbmQgcmV0dXJuZWQgd2hlbiBjYWxsaW5nCgkgICAgICogc2FtcGxlLgoJICAgICAqLwoJICAgIFNhbXBsZXIucHJvdG90eXBlLm1vbml0b3IgPSBmdW5jdGlvbiAocGFyYW1zX3RvX21vbml0b3IpIHsKCSAgICAgIHRoaXMubW9uaXRvcmVkX3BhcmFtcyA9IHBhcmFtc190b19tb25pdG9yOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIFNldHMgdGhlIHRoaW5uaW5nLiBGb3IgZXhhbXBsZSB0aGluID09IDEwIG1lYW5zIHRoYXQgZXZlcnkgMTB0aCBwb3N0ZXJpb3IKCSAgICAgKiBkcmF3IHdpbGwgYmUga2VwdC4KCSAgICAgKi8KCSAgICBTYW1wbGVyLnByb3RvdHlwZS50aGluID0gZnVuY3Rpb24gKHRoaW5uaW5nX2ludGVydmFsKSB7CgkgICAgICB0aGlzLnRoaW5uaW5nX2ludGVydmFsID0gdGhpbm5pbmdfaW50ZXJ2YWw7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogU2V0cyBhZGFwdGF0aW9uIG9uLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdGVwcGVycy5sZW5ndGg7IGkrKykgewoJICAgICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0YXJ0X2FkYXB0YXRpb24oKTsKCSAgICAgIH0KCSAgICB9OwoKCSAgICAvKioKCSAgICAqIFNldHMgYWRhcHRhdGlvbiBvZmYsIGlmIGFwcGxpY2FibGUsIGluIGFsbCBzdGVwcGVycy4KCSAgICAqLwoJICAgIFNhbXBsZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdGVwcGVycy5sZW5ndGg7IGkrKykgewoJICAgICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0b3BfYWRhcHRhdGlvbigpOwoJICAgICAgfQoJICAgIH07CgoJICAgIC8qKgoJICAgICogQGNsYXNzCgkgICAgKiBAaW1wbGVtZW50cyB7U2FtcGxlcn0KCSAgICAqIFRoaXMgc2FtcGxlciB1c2VzIHRoZSBBbXdnU3RlcHBlciBhcyB0aGUgc3RlcHBlciBmdW5jdGlvbiB3aGljaCBpbXBsZW1lbnRzIHRoZSAKCSAgICAqIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiAiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQyIKCSAgICAqIGJ5IFJvYmVydHMgYW5kIFJvc2VudGhhbCAoMjAwOCkuIEFuIGFkaXRpb24gaXMgdGhhdCBpdCBoYW5kbGVzIGludCBwYXJhbWV0ZXJzCgkgICAgKiBieSBtYWtpbmcgZGlzY3JldGUgTm9ybWFsIHByb3Bvc2FscyBhbmQgYmluYXJ5IHBhcmFtZXRlcnMgYnkgdGFraW5nIG9uIGEgbmV3IAoJICAgICogdmFsdWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBwb3N0ZXJpb3Igb2YgdGhlIHR3byBwb3NzaWJsZSBzdGF0ZXMgb2YgdGhlCgkgICAgKiBwYXJhbWV0ZXIuIFRoaXMgc2FtcGxlciBjYW4gYmUgZWZmaWNpZW50IHdoZW4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzCgkgICAgKiBhcmUgbm90IHRvbyBoaWdoIGFuZCB0aGUgY29ycmVsYXRpb25zIGJldHdlZW4gcGFyYW1ldGVycyBhcmUgbG93LgoJICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgb25lIG9yIG1vcmUgcGFyYW1ldGVyIGRlZmluaXRpb25zCgkgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCgkgICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gCgkgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCgkgICAgKi8KCSAgICB2YXIgQW13Z1NhbXBsZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBsb2dfcG9zdCwgZGF0YSwgb3B0aW9ucykgewoJICAgICAgU2FtcGxlci5jYWxsKHRoaXMsIHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpOwoJICAgIH07CgkgICAgQW13Z1NhbXBsZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTYW1wbGVyLnByb3RvdHlwZSk7CgkgICAgQW13Z1NhbXBsZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQW13Z1NhbXBsZXI7CgkgICAgQW13Z1NhbXBsZXIucHJvdG90eXBlLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CgkgICAgICByZXR1cm4gW25ldyBBbXdnU3RlcHBlcihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucyldOwoJICAgIH07CgoJICAgIC8vIFJldHVybmluZyB0aGUgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIHB1YmxpY2x5IGV4cG9zZWQgYnkgdGhpcyBtb2R1bGUKCSAgICByZXR1cm4gewoJICAgICAgcnVuaWY6IHJ1bmlmLAoJICAgICAgcnVuaWZfZGlzY3JldGU6IHJ1bmlmX2Rpc2NyZXRlLAoJICAgICAgcm5vcm06IHJub3JtLAoJICAgICAgcGFyYW1faW5pdF9maXhlZDogcGFyYW1faW5pdF9maXhlZCwKCSAgICAgIGNvbXBsZXRlX3BhcmFtczogY29tcGxldGVfcGFyYW1zLAoJICAgICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyOiBSZWFsTWV0cm9wb2xpc1N0ZXBwZXIsCgkgICAgICBJbnRNZXRyb3BvbGlzU3RlcHBlcjogSW50TWV0cm9wb2xpc1N0ZXBwZXIsCgkgICAgICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjogTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsCgkgICAgICBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOiBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLAoJICAgICAgQmluYXJ5U3RlcHBlcjogQmluYXJ5U3RlcHBlciwKCSAgICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI6IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIsCgkgICAgICBBbXdnU3RlcHBlcjogQW13Z1N0ZXBwZXIsCgkgICAgICBBbXdnU2FtcGxlcjogQW13Z1NhbXBsZXIKCSAgICB9OwoJICB9KTsKCX0pKG1jbWMpOwoJdmFyIG1jbWNFeHBvcnRzID0gbWNtYy5leHBvcnRzOwoKCWZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7CgkgIHJldHVybiBhID09IG51bGwgfHwgYiA9PSBudWxsID8gTmFOIDogYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47Cgl9CgoJZnVuY3Rpb24qIG51bWJlcnModmFsdWVzLCB2YWx1ZW9mKSB7CgkgIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHsKCSAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHsKCSAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICh2YWx1ZSA9ICt2YWx1ZSkgPj0gdmFsdWUpIHsKCSAgICAgICAgeWllbGQgdmFsdWU7CgkgICAgICB9CgkgICAgfQoJICB9IGVsc2UgewoJICAgIGxldCBpbmRleCA9IC0xOwoJICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykgewoJICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkgewoJICAgICAgICB5aWVsZCB2YWx1ZTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCX0KCglmdW5jdGlvbiBjb21wYXJlRGVmaW5lZChjb21wYXJlID0gYXNjZW5kaW5nKSB7CgkgIGlmIChjb21wYXJlID09PSBhc2NlbmRpbmcpIHJldHVybiBhc2NlbmRpbmdEZWZpbmVkOwoJICBpZiAodHlwZW9mIGNvbXBhcmUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNvbXBhcmUgaXMgbm90IGEgZnVuY3Rpb24iKTsKCSAgcmV0dXJuIChhLCBiKSA9PiB7CgkgICAgY29uc3QgeCA9IGNvbXBhcmUoYSwgYik7CgkgICAgaWYgKHggfHwgeCA9PT0gMCkgcmV0dXJuIHg7CgkgICAgcmV0dXJuIChjb21wYXJlKGIsIGIpID09PSAwKSAtIChjb21wYXJlKGEsIGEpID09PSAwKTsKCSAgfTsKCX0KCWZ1bmN0aW9uIGFzY2VuZGluZ0RlZmluZWQoYSwgYikgewoJICByZXR1cm4gKGEgPT0gbnVsbCB8fCAhKGEgPj0gYSkpIC0gKGIgPT0gbnVsbCB8fCAhKGIgPj0gYikpIHx8IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCk7Cgl9CgoJZnVuY3Rpb24gbWF4KHZhbHVlcywgdmFsdWVvZikgewoJICBsZXQgbWF4OwoJICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7CgkgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHsKCSAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIChtYXggPCB2YWx1ZSB8fCBtYXggPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpIHsKCSAgICAgICAgbWF4ID0gdmFsdWU7CgkgICAgICB9CgkgICAgfQoJICB9IGVsc2UgewoJICAgIGxldCBpbmRleCA9IC0xOwoJICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykgewoJICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGwgJiYgKG1heCA8IHZhbHVlIHx8IG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkgewoJICAgICAgICBtYXggPSB2YWx1ZTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCSAgcmV0dXJuIG1heDsKCX0KCglmdW5jdGlvbiBtaW4odmFsdWVzLCB2YWx1ZW9mKSB7CgkgIGxldCBtaW47CgkgIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHsKCSAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykgewoJICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKG1pbiA+IHZhbHVlIHx8IG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkgewoJICAgICAgICBtaW4gPSB2YWx1ZTsKCSAgICAgIH0KCSAgICB9CgkgIH0gZWxzZSB7CgkgICAgbGV0IGluZGV4ID0gLTE7CgkgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7CgkgICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCAmJiAobWluID4gdmFsdWUgfHwgbWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSB7CgkgICAgICAgIG1pbiA9IHZhbHVlOwoJICAgICAgfQoJICAgIH0KCSAgfQoJICByZXR1cm4gbWluOwoJfQoKCS8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3VybmVyL3F1aWNrc2VsZWN0CgkvLyBJU0MgbGljZW5zZSwgQ29weXJpZ2h0IDIwMTggVmxhZGltaXIgQWdhZm9ua2luLgoJZnVuY3Rpb24gcXVpY2tzZWxlY3QoYXJyYXksIGssIGxlZnQgPSAwLCByaWdodCA9IEluZmluaXR5LCBjb21wYXJlKSB7CgkgIGsgPSBNYXRoLmZsb29yKGspOwoJICBsZWZ0ID0gTWF0aC5mbG9vcihNYXRoLm1heCgwLCBsZWZ0KSk7CgkgIHJpZ2h0ID0gTWF0aC5mbG9vcihNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCByaWdodCkpOwoJICBpZiAoIShsZWZ0IDw9IGsgJiYgayA8PSByaWdodCkpIHJldHVybiBhcnJheTsKCSAgY29tcGFyZSA9IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IGFzY2VuZGluZ0RlZmluZWQgOiBjb21wYXJlRGVmaW5lZChjb21wYXJlKTsKCSAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkgewoJICAgIGlmIChyaWdodCAtIGxlZnQgPiA2MDApIHsKCSAgICAgIGNvbnN0IG4gPSByaWdodCAtIGxlZnQgKyAxOwoJICAgICAgY29uc3QgbSA9IGsgLSBsZWZ0ICsgMTsKCSAgICAgIGNvbnN0IHogPSBNYXRoLmxvZyhuKTsKCSAgICAgIGNvbnN0IHMgPSAwLjUgKiBNYXRoLmV4cCgyICogeiAvIDMpOwoJICAgICAgY29uc3Qgc2QgPSAwLjUgKiBNYXRoLnNxcnQoeiAqIHMgKiAobiAtIHMpIC8gbikgKiAobSAtIG4gLyAyIDwgMCA/IC0xIDogMSk7CgkgICAgICBjb25zdCBuZXdMZWZ0ID0gTWF0aC5tYXgobGVmdCwgTWF0aC5mbG9vcihrIC0gbSAqIHMgLyBuICsgc2QpKTsKCSAgICAgIGNvbnN0IG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gbSkgKiBzIC8gbiArIHNkKSk7CgkgICAgICBxdWlja3NlbGVjdChhcnJheSwgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGNvbXBhcmUpOwoJICAgIH0KCSAgICBjb25zdCB0ID0gYXJyYXlba107CgkgICAgbGV0IGkgPSBsZWZ0OwoJICAgIGxldCBqID0gcmlnaHQ7CgkgICAgc3dhcChhcnJheSwgbGVmdCwgayk7CgkgICAgaWYgKGNvbXBhcmUoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyYXksIGxlZnQsIHJpZ2h0KTsKCSAgICB3aGlsZSAoaSA8IGopIHsKCSAgICAgIHN3YXAoYXJyYXksIGksIGopLCArK2ksIC0tajsKCSAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2ldLCB0KSA8IDApICsraTsKCSAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2pdLCB0KSA+IDApIC0tajsKCSAgICB9CgkgICAgaWYgKGNvbXBhcmUoYXJyYXlbbGVmdF0sIHQpID09PSAwKSBzd2FwKGFycmF5LCBsZWZ0LCBqKTtlbHNlICsraiwgc3dhcChhcnJheSwgaiwgcmlnaHQpOwoJICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTsKCSAgICBpZiAoayA8PSBqKSByaWdodCA9IGogLSAxOwoJICB9CgkgIHJldHVybiBhcnJheTsKCX0KCWZ1bmN0aW9uIHN3YXAoYXJyYXksIGksIGopIHsKCSAgY29uc3QgdCA9IGFycmF5W2ldOwoJICBhcnJheVtpXSA9IGFycmF5W2pdOwoJICBhcnJheVtqXSA9IHQ7Cgl9CgoJZnVuY3Rpb24gcXVhbnRpbGUodmFsdWVzLCBwLCB2YWx1ZW9mKSB7CgkgIHZhbHVlcyA9IEZsb2F0NjRBcnJheS5mcm9tKG51bWJlcnModmFsdWVzLCB2YWx1ZW9mKSk7CgkgIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSB8fCBpc05hTihwID0gK3ApKSByZXR1cm47CgkgIGlmIChwIDw9IDAgfHwgbiA8IDIpIHJldHVybiBtaW4odmFsdWVzKTsKCSAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heCh2YWx1ZXMpOwoJICB2YXIgbiwKCSAgICBpID0gKG4gLSAxKSAqIHAsCgkgICAgaTAgPSBNYXRoLmZsb29yKGkpLAoJICAgIHZhbHVlMCA9IG1heChxdWlja3NlbGVjdCh2YWx1ZXMsIGkwKS5zdWJhcnJheSgwLCBpMCArIDEpKSwKCSAgICB2YWx1ZTEgPSBtaW4odmFsdWVzLnN1YmFycmF5KGkwICsgMSkpOwoJICByZXR1cm4gdmFsdWUwICsgKHZhbHVlMSAtIHZhbHVlMCkgKiAoaSAtIGkwKTsKCX0KCglmdW5jdGlvbiBtZWRpYW4odmFsdWVzLCB2YWx1ZW9mKSB7CgkgIHJldHVybiBxdWFudGlsZSh2YWx1ZXMsIDAuNSwgdmFsdWVvZik7Cgl9CgoJZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHsKCSAgdGhpcy5rID0gazsKCSAgdGhpcy54ID0geDsKCSAgdGhpcy55ID0geTsKCX0KCVRyYW5zZm9ybS5wcm90b3R5cGUgPSB7CgkgIGNvbnN0cnVjdG9yOiBUcmFuc2Zvcm0sCgkgIHNjYWxlOiBmdW5jdGlvbiAoaykgewoJICAgIHJldHVybiBrID09PSAxID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rICogaywgdGhpcy54LCB0aGlzLnkpOwoJICB9LAoJICB0cmFuc2xhdGU6IGZ1bmN0aW9uICh4LCB5KSB7CgkgICAgcmV0dXJuIHggPT09IDAgJiB5ID09PSAwID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rLCB0aGlzLnggKyB0aGlzLmsgKiB4LCB0aGlzLnkgKyB0aGlzLmsgKiB5KTsKCSAgfSwKCSAgYXBwbHk6IGZ1bmN0aW9uIChwb2ludCkgewoJICAgIHJldHVybiBbcG9pbnRbMF0gKiB0aGlzLmsgKyB0aGlzLngsIHBvaW50WzFdICogdGhpcy5rICsgdGhpcy55XTsKCSAgfSwKCSAgYXBwbHlYOiBmdW5jdGlvbiAoeCkgewoJICAgIHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54OwoJICB9LAoJICBhcHBseVk6IGZ1bmN0aW9uICh5KSB7CgkgICAgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7CgkgIH0sCgkgIGludmVydDogZnVuY3Rpb24gKGxvY2F0aW9uKSB7CgkgICAgcmV0dXJuIFsobG9jYXRpb25bMF0gLSB0aGlzLngpIC8gdGhpcy5rLCAobG9jYXRpb25bMV0gLSB0aGlzLnkpIC8gdGhpcy5rXTsKCSAgfSwKCSAgaW52ZXJ0WDogZnVuY3Rpb24gKHgpIHsKCSAgICByZXR1cm4gKHggLSB0aGlzLngpIC8gdGhpcy5rOwoJICB9LAoJICBpbnZlcnRZOiBmdW5jdGlvbiAoeSkgewoJICAgIHJldHVybiAoeSAtIHRoaXMueSkgLyB0aGlzLms7CgkgIH0sCgkgIHJlc2NhbGVYOiBmdW5jdGlvbiAoeCkgewoJICAgIHJldHVybiB4LmNvcHkoKS5kb21haW4oeC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFgsIHRoaXMpLm1hcCh4LmludmVydCwgeCkpOwoJICB9LAoJICByZXNjYWxlWTogZnVuY3Rpb24gKHkpIHsKCSAgICByZXR1cm4geS5jb3B5KCkuZG9tYWluKHkucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLCB0aGlzKS5tYXAoeS5pbnZlcnQsIHkpKTsKCSAgfSwKCSAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsKCSAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgdGhpcy54ICsgIiwiICsgdGhpcy55ICsgIikgc2NhbGUoIiArIHRoaXMuayArICIpIjsKCSAgfQoJfTsKCVRyYW5zZm9ybS5wcm90b3R5cGU7CgoJLyoKCSAgSFRETWF0aCBTdGF0aWMgQ2xhc3MgLSBOb3QgaW50ZW5kZWQgZm9yIGluc3RhbnRpYXRpb24hCgoJICBWYXJpYWJsZXM6CgkgICAgQSA9IGFtb3VudAoJICAgIEQgPSBkZWxheQoJICAgIFYgPSBzdWJqZWN0aXZlIHZhbHVlCgoJICAgIGsgPSBkaXNjb3VudCBmYWN0b3IKCgkgIEVxdWF0aW9uczoKCSAgICBWID0gQSAvICgxICsga0QpCgkqLwoJY2xhc3MgSFRETWF0aCB7CgkgIHN0YXRpYyBhZGsydihhLCBkLCBrKSB7CgkgICAgcmV0dXJuIGEgLyAoMSArIGsgKiBkKTsKCSAgfQoJICBzdGF0aWMgYWR2MmsoYSwgZCwgdikgewoJICAgIHJldHVybiAoYSAtIHYpIC8gKHYgKiBkKTsKCSAgfQoJfQoKCS8vIEludGVybmFsIGRlcGVuZGVuY2llcwoKCS8qIGVzbGludCBuby1yZXN0cmljdGVkLWdsb2JhbHM6IFsib2ZmIiwgInNlbGYiXSAqLwoKCXNlbGYub25tZXNzYWdlID0gZXZlbnQgPT4gewoJICBjb25zdCBwYXJhbXMgPSB7CgkgICAgazogewoJICAgICAgdHlwZTogJ3JlYWwnLAoJICAgICAgbG93ZXI6IDAsCgkgICAgICB1cHBlcjogMTAwCgkgICAgfSwKCSAgICBsdWNlOiB7CgkgICAgICB0eXBlOiAncmVhbCcsCgkgICAgICBsb3dlcjogMCwKCSAgICAgIHVwcGVyOiAxMDAKCSAgICB9CgkgIH07CgkgIGNvbnN0IGxvZ1Bvc3QgPSAoc3RhdGUsIGRhdGEpID0+IHsKCSAgICBsZXQgbHAgPSAwOwoKCSAgICAvLyBQcmlvcnMKCSAgICBjb25zdCBrTWVhbiA9IDI7CgkgICAgY29uc3Qga1NoYXBlID0gMzsKCSAgICBscCArPSBkaXN0cmlidXRpb25zRXhwb3J0cy5nYW1tYShzdGF0ZS5rLCBrU2hhcGUsIGtTaGFwZSAvIGtNZWFuKTsKCSAgICAvLyBscCArPSBCYXllc0Rpc3RyaWJ1dGlvbnMudW5pZihzdGF0ZS5rLCAwLCAxMDApOwoKCSAgICBjb25zdCBsdWNlTWVhbiA9IDI7CgkgICAgY29uc3QgbHVjZVNoYXBlID0gMzsKCSAgICBscCArPSBkaXN0cmlidXRpb25zRXhwb3J0cy5nYW1tYShzdGF0ZS5sdWNlLCBsdWNlU2hhcGUsIGx1Y2VTaGFwZSAvIGx1Y2VNZWFuKTsKCSAgICAvLyBscCArPSBCYXllc0Rpc3RyaWJ1dGlvbnMudW5pZihzdGF0ZS5sdWNlLCAwLCAxMDApOwoKCSAgICAvLyBMaWtlbGlob29kCgkgICAgZGF0YS5mb3JFYWNoKGNob2ljZSA9PiB7CgkgICAgICAvLyBWYWx1ZXMKCSAgICAgIGNvbnN0IHZzID0gSFRETWF0aC5hZGsydihjaG9pY2UuYXMsIGNob2ljZS5kcywgc3RhdGUuayk7CgkgICAgICBjb25zdCB2bCA9IEhURE1hdGguYWRrMnYoY2hvaWNlLmFsLCBjaG9pY2UuZGwsIHN0YXRlLmspOwoKCSAgICAgIC8vIENob2ljZSBvZiBzb29uZXIgb3IgbGF0ZXIgaXMgc2FtcGxlZCBmcm9tIGEgQmVybm91bGxpIGRpc3RyaWJ1dGlvbgoJICAgICAgLy8gTHVjZSBjaG9pY2UgcnVsZSBpcyB1c2VkIHRvIGNvbXB1dGUgcHJvYmFiaWxpdHkgb2Ygd2FpdGluZyEgKDAgPSBzb29uZXIsIDEgPSBsYXRlcikKCSAgICAgIGNvbnN0IGJpbnZhbCA9IDEgLyAoMSArIE1hdGguZXhwKHN0YXRlLmx1Y2UgKiAodnMgLSB2bCkpKTsKCgkgICAgICAvLyBBY3R1YWwgcmVzcG9uc2UKCSAgICAgIGNvbnN0IHJlc3BvbnNlID0gY2hvaWNlLnJlc3BvbnNlID09PSAnZmlyc3QnID8gMCA6IDE7CgkgICAgICBscCArPSBkaXN0cmlidXRpb25zRXhwb3J0cy5iZXJuKHJlc3BvbnNlLCBiaW52YWwpOwoJICAgIH0pOwoJICAgIHJldHVybiBscDsKCSAgfTsKCgkgIC8vIEluaXRpYWxpemluZyB0aGUgc2FtcGxlcgoJICBjb25zdCBzYW1wbGVyID0gbmV3IG1jbWNFeHBvcnRzLkFtd2dTYW1wbGVyKHBhcmFtcywgbG9nUG9zdCwgZXZlbnQuZGF0YSk7CgkgIC8vIEJ1cm5pbmcgc29tZSBzYW1wbGVzIHRvIHRoZSBNQ01DIGdvZHMgYW5kIHNhbXBsaW5nIDUwMDAgZHJhd3MKCSAgc2FtcGxlci5idXJuKDEwMDApOwoJICBjb25zdCBzYW1wbGVzID0gc2FtcGxlci5zYW1wbGUoNTAwMCk7CgoJICAvLyBFeHRyYWN0IHN1bW1hcnkgc3RhdHMKCSAgY29uc3QgcmVzdWx0cyA9IHsKCSAgICBrOiBtZWRpYW4oc2FtcGxlcy5rKSwKCSAgICBsdWNlOiBtZWRpYW4oc2FtcGxlcy5sdWNlKQoJICB9OwoJICBzZWxmLnBvc3RNZXNzYWdlKHsKCSAgICByZXN1bHRzOiByZXN1bHRzLAoJICAgIHNhbXBsZXM6IHNhbXBsZXMKCSAgfSk7Cgl9OwoKfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHRkLWZpdC13b3JrZXIuanMubWFwCgo=', 'data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRkLWZpdC13b3JrZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9iYXllcy5qcy9kaXN0cmlidXRpb25zLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2JheWVzLmpzL21jbWMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2FzY2VuZGluZy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbnVtYmVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9zb3J0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21pbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVpY2tzZWxlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3F1YW50aWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tZWRpYW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvdHJhbnNmb3JtLmpzIiwiLi4vZGlzY291bnRhYmxlLW1hdGgvc3JjL2h0ZC1tYXRoLmpzIiwiLi4vZGlzY291bnRhYmxlLW1hdGgvc3JjL2luZGV4LmpzIiwic3JjL2NvbXBvbmVudHMvaHRkLWZpdC13b3JrZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLy8gQSBudW1iZXIgb2YgbG9nIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb25zIChQREYpLiBOYW1pbmcgYW5kIHBhcmFtZXRlcml6YXRpb25cbi8vIHNob3VsZCBtYXRjaCBSJ3MsIGV4Y2VwdCBmb3IgdGhhdCBhbGwgZnVuY3Rpb25zIHJlc2lkZSBpbiBhbiBsZCBvYmplY3QgKFxuLy8gYXMgaW4gXCJsb2cgZGVuc2l0eVwiKSwgc28gdG8gZ2V0IGEgbm9ybWFsIGxvZyBkZW5zaXR5IHlvdSB3b3VsZCB3cml0ZVxuLy8gbGQubm9ybSguLi4pLlxuLy8gTW9zdCBvZiB0aGUgY29kZSBiZWxvdyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBncmVhdCBKc3RhdCBwcm9qZWN0XG4vLyAoaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0Lykgd2hpY2ggaW5jbHVkZXMgUERGIGZvciBtYW55IGNvbW1vbiBwcm9iYWJpbGl0eVxuLy8gZGlzdHJpYnV0aW9ucy4gV2hhdCBJIGhhdmUgZG9uZSBpcyBvbmx5IHRvIGNvbnZlcnQgdGhlc2UgdG8gbG9nIFBERnMuXG5cbi8qXG5PcmlnaW5hbCB3b3JrIENvcHlyaWdodCAoYykgMjAxMyBqU3RhdFxuTW9kaWZpZWQgd29yayBDb3B5cmlnaHQgKGMpIDIwMTUgUmFzbXVzIELDpcOldGggXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS5cblxuKi9cblxuXG4vLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanNcbi8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLFxuLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuXG4vLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWxcbi8vIG9iamVjdCBsZCAuXG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICAgICAgZGVmaW5lKFtdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIC8vIE5vZGUuIERvZXMgbm90IHdvcmsgd2l0aCBzdHJpY3QgQ29tbW9uSlMsIGJ1dFxuICAgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cyxcbiAgICAgICAgLy8gbGlrZSBOb2RlLlxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KVxuICAgICAgICByb290LmxkID0gZmFjdG9yeSgpO1xuICB9XG59KHRoaXMsIGZ1bmN0aW9uKCkge1xuICAvLyBPYmplY3QgdG8gaG9sZCB0aGUgZnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkLlxuICB2YXIgbGQgID0ge307XG4gIFxuICAvLy8vLy8vLy8vIEhlbHBlciBmdW5jdGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgdmFyIGxnYW1tYSA9IGZ1bmN0aW9uKHgpIHtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGNvZiA9IFtcbiAgICAgIDc2LjE4MDA5MTcyOTQ3MTQ2LCAtODYuNTA1MzIwMzI5NDE2NzcsIDI0LjAxNDA5ODI0MDgzMDkxLFxuICAgICAgLTEuMjMxNzM5NTcyNDUwMTU1LCAwLjEyMDg2NTA5NzM4NjYxNzllLTIsIC0wLjUzOTUyMzkzODQ5NTNlLTVcbiAgICBdO1xuICAgIHZhciBzZXIgPSAxLjAwMDAwMDAwMDE5MDAxNTtcbiAgICB2YXIgeHgsIHksIHRtcDtcbiAgICB0bXAgPSAoeSA9IHh4ID0geCkgKyA1LjU7XG4gICAgdG1wIC09ICh4eCArIDAuNSkgKiBsb2codG1wKTtcbiAgICBmb3IgKDsgaiA8IDY7IGorKylcbiAgICAgIHNlciArPSBjb2Zbal0gLyArK3k7XG4gICAgcmV0dXJuIGxvZygyLjUwNjYyODI3NDYzMTAwMDUgKiBzZXIgLyB4eCkgLSB0bXA7XG4gIH07XG4gIGxkLmxnYW1tYSA9IGxnYW1tYTtcbiAgXG4gIHZhciBsZmFjdG9yaWFsID0gZnVuY3Rpb24obikge1xuICAgIHJldHVybiBuIDwgMCA/IE5hTiA6IGxnYW1tYShuICsgMSk7XG4gIH07XG4gIGxkLmxmYWN0b3JpYWwgPSBsZmFjdG9yaWFsO1xuICBcbiAgdmFyIGxjaG9vc2UgPSBmdW5jdGlvbihuLCBrKXtcbiAgICByZXR1cm4gbGZhY3RvcmlhbChuKSAtIGxmYWN0b3JpYWwoaykgLSBsZmFjdG9yaWFsKG4gLSBrKTtcbiAgfTtcbiAgbGQubGNob29zZSA9IGxjaG9vc2U7XG4gIFxuICB2YXIgbGJldGEgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGxnYW1tYShhKSArIGxnYW1tYShiKSAtIGxnYW1tYShhICsgYik7XG4gIH07XG4gIGxkLmxiZXRhID0gbGJldGE7XG4gIFxuICB2YXIgbG9nICA9IE1hdGgubG9nO1xuICB2YXIgZXhwICA9IE1hdGguZXhwO1xuICB2YXIgYWJzICA9IE1hdGguYWJzO1xuICB2YXIgcG93ICA9IE1hdGgucG93O1xuICB2YXIgc3FydCA9IE1hdGguc3FydDtcbiAgdmFyIHBpICAgPSBNYXRoLlBJO1xuICBcbiAgLy8vLy8vLy8vLyBDb250aW5vdXMgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgbGQuYmV0YSA9IGZ1bmN0aW9uKHgsIHNoYXBlMSwgc2hhcGUyKSB7XG4gICAgaWYgKHggPiAxIHx8IHggPCAwKSB7XG4gICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIGlmKHNoYXBlMSA9PT0gMSAmJiBzaGFwZTIgPT09IDEpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKHNoYXBlMSAtIDEpICogbG9nKHgpICsgKHNoYXBlMiAtIDEpICogbG9nKDEgLSB4KSAtIGxiZXRhKHNoYXBlMSwgc2hhcGUyKTsgIFxuICAgIH1cbiAgfTtcbiAgXG4gIGxkLmNhdWNoeSA9IGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSkge1xuICAgIHJldHVybiBsb2coc2NhbGUpIC0gbG9nKHBvdyh4IC0gbG9jYXRpb24sIDIpICsgcG93KHNjYWxlLCAyKSkgIC0gbG9nKHBpKTtcbiAgfTtcbiAgXG4gIGxkLm5vcm0gPSBmdW5jdGlvbih4LCBtZWFuLCBzZCkge1xuICAgICAgcmV0dXJuIC0wLjUgKiBsb2coMiAqIHBpKSAtbG9nKHNkKSAtIHBvdyh4IC0gbWVhbiwgMikgLyAoMiAqIHNkICogc2QpO1xuICB9O1xuXG4gIC8vIEEgYml2YXJpYXRlIE5vcm1hbCBkaXN0cmlidXRpb24gcGFyYW1ldGVyaXplZCBieSBhcnJheXMgb2YgdHdvIG1lYW5zIGFuZCBTRHMsIGFuZCBcbiAgLy8gdGhlIGNvcnJlbGF0aW9uLlxuICBsZC5iaXZhcm5vcm0gPSBmdW5jdGlvbih4LCBtZWFuLCBzZCwgY29ycikge1xuICAgIHZhciB6ID0gcG93KHhbMF0gLSBtZWFuWzBdLCAyKSAvIHBvdyhzZFswXSwgMikgK1xuICAgICAgICAgICAgcG93KHhbMV0gLSBtZWFuWzFdLCAyKSAvIHBvdyhzZFsxXSwgMikgLSBcbiAgICAgICAgICAgICgyICogY29yciAqICh4WzBdIC0gbWVhblswXSkgKiAoeFsxXSAtIG1lYW5bMV0pKSAvIChzZFswXSAqIHNkWzFdKTtcbiAgICB2YXIgbm9ybWFsaXppbmdfZmFjdG9yID0gLSggbG9nKDIpICsgbG9nKHBpKSArIGxvZyhzZFswXSkgKyBsb2coc2RbMV0pICsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNSAqIGxvZygxIC0gcG93KGNvcnIsIDIpKSApOyBcbiAgICB2YXIgYml2YXJfbG9nX2RlbnMgPSBub3JtYWxpemluZ19mYWN0b3IgLSB6IC8gKDIgKiAoMSAtIHBvdyhjb3JyLCAyKSApICk7IFxuICAgIHJldHVybiBiaXZhcl9sb2dfZGVucztcbiAgfTtcbiAgXG5cbiAgbGQubGFwbGFjZSA9IGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSkge1xuICAgIHJldHVybiAoLWFicyh4IC0gbG9jYXRpb24pL3NjYWxlKSAtIGxvZygyICogc2NhbGUpO1xuICB9O1xuICBcbiAgbGQuZGV4cCA9IGxkLmxhcGxhY2U7XG4gIFxuICBsZC5nYW1tYSA9IGZ1bmN0aW9uKHgsIHNoYXBlLCByYXRlKSB7XG4gICAgdmFyIHNjYWxlID0gMSAvIHJhdGU7XG4gICAgaWYgKHggPCAwKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICBpZigoeCA9PT0gMCAmJiBzaGFwZSA9PT0gMSkgKSB7XG4gICAgICByZXR1cm4gLWxvZyhzY2FsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoc2hhcGUgLSAxKSAqIGxvZyh4KSAtIHggLyBzY2FsZSAtIGxnYW1tYShzaGFwZSkgLSBzaGFwZSAqIGxvZyhzY2FsZSk7XG4gICAgfVxuICB9O1xuICBcbiAgbGQuaW52Z2FtbWEgPSBmdW5jdGlvbih4LCBzaGFwZSwgc2NhbGUpIHtcbiAgICAgIGlmICh4IDw9IDApIHtcbiAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAtKHNoYXBlICsgMSkgKiBsb2coeCkgLSBzY2FsZSAvIHggLSBsZ2FtbWEoc2hhcGUpICsgc2hhcGUgKiBsb2coc2NhbGUpO1xuICAgIH07XG4gIFxuICBsZC5sbm9ybSA9ICBmdW5jdGlvbih4LCBtZWFubG9nLCBzZGxvZykge1xuICAgIGlmICh4IDw9IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiAtbG9nKHgpIC0gMC41ICogbG9nKDIgKiBwaSkgLSBsb2coc2Rsb2cpIC0gXG4gICAgICAgICAgICBwb3cobG9nKHgpIC0gbWVhbmxvZywgMikgLyAoMiAqIHNkbG9nICogc2Rsb2cpO1xuICB9O1xuICBcbiAgbGQucGFyZXRvID0gZnVuY3Rpb24oeCwgc2NhbGUsIHNoYXBlKSB7XG4gICAgaWYgKHggPCBzY2FsZSkge1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9XG4gICAgcmV0dXJuIGxvZyhzaGFwZSkgKyBzaGFwZSAqIGxvZyhzY2FsZSkgLSAoc2hhcGUgKyAxKSAqIGxvZyh4KTtcbiAgfTtcbiAgXG4gIGxkLnQgID0gIGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSwgZGYpIHtcbiAgICBkZiA9IGRmID4gMWUxMDAgPyAxZTEwMCA6IGRmO1xuICAgIHJldHVybiBsZ2FtbWEoKGRmICsgMSkvMikgLSBsZ2FtbWEoZGYvMikgLSBsb2coc3FydChwaSAqIGRmKSAqIHNjYWxlKSArXG4gICAgICAgICAgIGxvZyhwb3coMSArICgxL2RmKSAqIHBvdygoeCAtIGxvY2F0aW9uKS9zY2FsZSwgMiksIC0oZGYgKyAxKS8yKSk7XG4gIH07XG4gIFxuICAvLyBUaGlzIGlzIGEgZGlyZWN0IGphdmFzY3JpcHQgdHJhbnNsYXRpb24gb2YgdGhlIFIgY29kZSB1c2VkIHRvIGV2YWx1YXRlXG4gIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIHdlaWJ1bGwgZGlzdHJpYnV0aW9uOiBcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2R3ZWlidWxsLmNcbiAgbGQud2VpYnVsbCA9IGZ1bmN0aW9uKHgsIHNoYXBlLCBzY2FsZSkge1xuICAgIGlmICh4IDwgMCkgcmV0dXJuIC1JbmZpbml0eTtcbiAgICBpZih4ID09PSAwICYmIHNoYXBlIDwgMSkgcmV0dXJuIEluZmluaXR5O1xuICAgIHZhciB0bXAxID0gcG93KHggLyBzY2FsZSwgc2hhcGUgLSAxKTtcbiAgICB2YXIgdG1wMiA9IHRtcDEgKiAoeCAvIHNjYWxlKTtcblx0ICByZXR1cm4gLXRtcDIgKyBsb2coc2hhcGUgKiB0bXAxIC8gc2NhbGUpO1xuICB9O1xuICBcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBqYXZhc2NyaXB0IHRyYW5zbGF0aW9uIG9mIHRoZSBSIGNvZGUgdXNlZCB0byBldmFsdWF0ZVxuICAvLyB0aGUgbG9nIGRlbnNpdHkgb2YgYSBsb2dpc3RpYyBkaXN0cmlidXRpb246IFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2NoL3Itc291cmNlL2Jsb2IvYjE1NmUzYTcxMTk2N2Y1ODEzMWUyM2MxYjFkYzFlYTkwZTJmMGM0My9zcmMvbm1hdGgvZGxvZ2lzLmNcbiAgbGQubG9naXMgPSBmdW5jdGlvbih4LCBsb2NhdGlvbiwgc2NhbGUpIHtcbiAgICB4ID0gYWJzKCh4IC0gbG9jYXRpb24pIC8gc2NhbGUpO1xuICAgIHZhciBlID0gZXhwKC14KTtcbiAgICB2YXIgZiA9IDEuMCArIGU7XG4gICAgcmV0dXJuIC0oeCArIGxvZyhzY2FsZSAqIGYgKiBmKSk7ICAgIFxuICB9O1xuXG4gIGxkLmRpcmljaGxldCA9IGZ1bmN0aW9uKHgsIGFscGhhKSB7XG4gICAgdmFyIHN1bV9hbHBoYSA9IDA7XG4gICAgdmFyIHN1bV9sZ2FtbWFfYWxwaGEgPSAwO1xuICAgIHZhciBzdW1fYWxwaGFfc3ViXzFfbG9nX3ggPSAwO1xuICAgIHZhciBuID0gYWxwaGEubGVuZ3RoO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIHN1bV9hbHBoYSArPSBhbHBoYVtpXTtcbiAgICAgIHN1bV9sZ2FtbWFfYWxwaGEgKz0gbGdhbW1hKGFscGhhW2ldKTtcbiAgICAgIHN1bV9hbHBoYV9zdWJfMV9sb2dfeCArPSAoYWxwaGFbaV0gLSAxKSAqIGxvZyh4W2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGxnYW1tYShzdW1fYWxwaGEpIC0gc3VtX2xnYW1tYV9hbHBoYSArIHN1bV9hbHBoYV9zdWJfMV9sb2dfeDtcbiAgfTtcbiAgIFxuICAgIFxuICBsZC5leHAgPSBmdW5jdGlvbih4LCByYXRlKSB7XG4gICAgICByZXR1cm4geCA8IDAgPyAtSW5maW5pdHkgOiBsb2cocmF0ZSkgLXJhdGUgKiB4O1xuICB9O1xuICBcbiAgbGQudW5pZiA9IGZ1bmN0aW9uKHgsIG1pbiwgbWF4KSB7XG4gICAgICByZXR1cm4gKHggPCBtaW4gfHwgeCA+IG1heCkgPyAtSW5maW5pdHkgOiBsb2coMSAvIChtYXggLSBtaW4pKTtcbiAgfTtcbiAgXG4gIC8vLy8vLy8vLy8gRGlzY3JldGUgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIFxuICBsZC5iZXJuID0gZnVuY3Rpb24oeCwgcHJvYikge1xuICAgICAgcmV0dXJuICEoeCA9PT0gMCB8fCB4ID09PSAxKSA/IC1JbmZpbml0eSA6IGxvZyh4ICogcHJvYiArICgxIC0geCkgKiAoMSAtIHByb2IpKTtcbiAgfTtcbiAgXG4gIGxkLmNhdCA9IGZ1bmN0aW9uKHgsIHByb2JzKSB7XG4gICAgaWYoeCA8IDEgfHwgeCA+IHByb2JzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxvZyggcHJvYnNbeCAtIDFdICk7XG4gICAgfVxuICB9O1xuICBcbiAgbGQuYmlub20gPSBmdW5jdGlvbih4LCBzaXplLCBwcm9iKSB7XG4gICAgaWYoeCA+IHNpemUgfHwgeCA8IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIGlmKHByb2IgPT09IDAgfHwgcHJvYiA9PT0gMSkge1xuICAgICAgcmV0dXJuIChzaXplICogcHJvYikgPT09IHggPyAwIDogLUluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gbGNob29zZShzaXplLCB4KSArIHggKiBsb2cocHJvYikgKyAoc2l6ZSAtIHgpICogbG9nKDEgLSBwcm9iKTtcbiAgfTtcbiAgXG4gIHZhciBtdWx0aW5vbSA9IGZ1bmN0aW9uKHgsIHByb2JzKSB7XG4gICAgdmFyIG4gPSB4Lmxlbmd0aDtcbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgdmFyIHRtcF90ZXJtID0gMDtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBpZihwcm9ic1tpXSA9PT0gMCkge1xuICAgICAgICBpZih4W2ldICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsgIFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplICs9IHhbaV07XG4gICAgICAgIHRtcF90ZXJtICs9IHhbaV0gKiBsb2cocHJvYnNbaV0pIC0gbGdhbW1hKHhbaV0gKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxnYW1tYShzaXplICsgMSkgKyB0bXBfdGVybSA7XG4gIH07XG4gIFxuICBsZC5uYmlub20gPSBmdW5jdGlvbih4LCBzaXplLCBwcm9iKSB7XG4gICAgaWYoeCA8IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiBsY2hvb3NlKHggKyBzaXplIC0gMSwgc2l6ZSAtIDEpICsgeCAqIGxvZygxIC0gcHJvYikgKyBzaXplICogbG9nKHByb2IpO1xuICB9O1xuICBcbiAgbGQuaHlwZXIgPSBmdW5jdGlvbih4LCBtLCBuLCBrKSB7XG4gICAgaWYoeCA8IDAgfHwgeCA+IGspIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGNob29zZShtLCB4KSArIGxjaG9vc2Uobiwgay14KSAtIGxjaG9vc2UobStuLCBrKTtcbiAgICB9XG4gIH07XG4gIFxuICBsZC5wb2lzID0gZnVuY3Rpb24oeCwgbGFtYmRhKSB7XG4gICAgICByZXR1cm4geCA8IDAgPyAtSW5maW5pdHkgOiBsb2cobGFtYmRhKSAqIHggLSBsYW1iZGEgLSBsZmFjdG9yaWFsKHgpO1xuICB9O1xuICBcbiAgcmV0dXJuIGxkO1xufSkpOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanNcbi8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLFxuLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuXG4vLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWxcbi8vIG9iamVjdCBtY21jIC5cbihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLlxuICAgICAgICBkZWZpbmUoW10sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0XG4gICAgICAgIC8vIG9ubHkgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLFxuICAgICAgICAvLyBsaWtlIE5vZGUuXG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpXG4gICAgICAgIHJvb3QubWNtYyA9IGZhY3RvcnkoKTtcbiAgfVxufSh0aGlzLCBmdW5jdGlvbigpe1xuXG4vLy8gVGhlIGFjdHVhbCBtb2R1bGUgY29kZSBzdGFydHMgaGVyZSAvLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgXG4gIFxuICAvLy8vLy8vLy8vIEhlbHBlciBGdW5jdGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgLyoqIFJldHVybnMgYSByYW5kb20gcmVhbCBudW1iZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAqL1xuICB2YXIgcnVuaWYgPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikgKyBtaW47XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbWluIGFuZCBtYXggKi9cbiAgdmFyIHJ1bmlmX2Rpc2NyZXRlID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjtcbiAgfTtcbiAgXG4gIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGZyb20gYSBub3JtYWwgZGlzdHJpYmJ1dGlvbiBkZWZpbmVkXG4gICAqICBieSBtZWFuIGFuZCBzZC4gXG4gICAqICBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0L2pzdGF0L2Jsb2IvbWFzdGVyL3NyYy9zcGVjaWFsLmpzICovXG4gIHZhciBybm9ybSA9IGZ1bmN0aW9uKG1lYW4sIHNkKSB7XG4gICAgdmFyIHUsIHYsIHgsIHksIHE7XG4gICAgZG8ge1xuICAgICAgdSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICB2ID0gMS43MTU2ICogKE1hdGgucmFuZG9tKCkgLSAwLjUpO1xuICAgICAgeCA9IHUgLSAwLjQ0OTg3MTtcbiAgICAgIHkgPSBNYXRoLmFicyh2KSArIDAuMzg2NTk1O1xuICAgICAgcSA9IHggKiB4ICsgeSAqICgwLjE5NjAwICogeSAtIDAuMjU0NzIgKiB4KTtcbiAgICB9IHdoaWxlIChxID4gMC4yNzU5NyAmJiAocSA+IDAuMjc4NDYgfHwgdiAqIHYgPiAtNCAqIE1hdGgubG9nKHUpICogdSAqIHUpKTtcbiAgICBcbiAgICByZXR1cm4gKHYgLyB1KSAqIHNkICsgbWVhbjtcbiAgfTtcbiAgXG4gIFxuICAvKiogUmV0dXJucyBhIGRlZXAgY2xvbmUgb2Ygc3JjLCBzb3J0IG9mLi4uIEl0IG9ubHkgY29waWVzIGEgbGltaXRlZFxuICAgKiBudW1iZXIgb2YgdHlwZXMgYW5kLCBmb3IgZXhhbXBsZSwgZnVuY3Rpb24gYXJlIG5vdCBjb3BpZWQuIFxuICAgKiBGcm9tIGh0dHA6Ly9kYXZpZHdhbHNoLm5hbWUvamF2YXNjcmlwdC1jbG9uZVxuICAgKi9cbiAgdmFyIGRlZXBfY2xvbmUgPSBmdW5jdGlvbihzcmMpIHtcbiAgXHRmdW5jdGlvbiBtaXhpbihkZXN0LCBzb3VyY2UsIGNvcHlGdW5jKSB7XG4gIFx0XHR2YXIgbmFtZSwgcywgaSwgZW1wdHkgPSB7fTtcbiAgXHRcdGZvcihuYW1lIGluIHNvdXJjZSl7XG4gIFx0XHRcdC8vIHRoZSAoIShuYW1lIGluIGVtcHR5KSB8fCBlbXB0eVtuYW1lXSAhPT0gcykgY29uZGl0aW9uIGF2b2lkcyBjb3B5aW5nIHByb3BlcnRpZXMgaW4gXCJzb3VyY2VcIlxuICBcdFx0XHQvLyBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG90eXBlLlx0IEZvciBleGFtcGxlLCBpZiBkZXN0IGhhcyBhIGN1c3RvbSB0b1N0cmluZygpIG1ldGhvZCxcbiAgXHRcdFx0Ly8gZG9uJ3Qgb3ZlcndyaXRlIGl0IHdpdGggdGhlIHRvU3RyaW5nKCkgbWV0aG9kIHRoYXQgc291cmNlIGluaGVyaXRlZCBmcm9tIE9iamVjdC5wcm90b3R5cGVcbiAgXHRcdFx0cyA9IHNvdXJjZVtuYW1lXTtcbiAgXHRcdFx0aWYoIShuYW1lIGluIGRlc3QpIHx8IChkZXN0W25hbWVdICE9PSBzICYmICghKG5hbWUgaW4gZW1wdHkpIHx8IGVtcHR5W25hbWVdICE9PSBzKSkpe1xuICBcdFx0XHRcdGRlc3RbbmFtZV0gPSBjb3B5RnVuYyA/IGNvcHlGdW5jKHMpIDogcztcbiAgXHRcdFx0fVxuICBcdFx0fVxuICBcdFx0cmV0dXJuIGRlc3Q7XG4gIFx0fVxuICBcdGlmKCFzcmMgfHwgdHlwZW9mIHNyYyAhPSBcIm9iamVjdFwiIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzcmMpID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCIpe1xuICBcdFx0Ly8gbnVsbCwgdW5kZWZpbmVkLCBhbnkgbm9uLW9iamVjdCwgb3IgZnVuY3Rpb25cbiAgXHRcdHJldHVybiBzcmM7XHQvLyBhbnl0aGluZ1xuICBcdH1cbiAgXHRpZihzcmMubm9kZVR5cGUgJiYgXCJjbG9uZU5vZGVcIiBpbiBzcmMpe1xuICBcdFx0Ly8gRE9NIE5vZGVcbiAgXHRcdHJldHVybiBzcmMuY2xvbmVOb2RlKHRydWUpOyAvLyBOb2RlXG4gIFx0fVxuICBcdGlmKHNyYyBpbnN0YW5jZW9mIERhdGUpe1xuICBcdFx0Ly8gRGF0ZVxuICBcdFx0cmV0dXJuIG5ldyBEYXRlKHNyYy5nZXRUaW1lKCkpO1x0Ly8gRGF0ZVxuICBcdH1cbiAgXHRpZihzcmMgaW5zdGFuY2VvZiBSZWdFeHApe1xuICBcdFx0Ly8gUmVnRXhwXG4gIFx0XHRyZXR1cm4gbmV3IFJlZ0V4cChzcmMpOyAgIC8vIFJlZ0V4cFxuICBcdH1cbiAgXHR2YXIgciwgaSwgbDtcbiAgXHRpZihzcmMgaW5zdGFuY2VvZiBBcnJheSl7XG4gIFx0XHQvLyBhcnJheVxuICBcdFx0ciA9IFtdO1xuICBcdFx0Zm9yKGkgPSAwLCBsID0gc3JjLmxlbmd0aDsgaSA8IGw7ICsraSl7XG4gIFx0XHRcdGlmKGkgaW4gc3JjKXtcbiAgXHRcdFx0XHRyLnB1c2goZGVlcF9jbG9uZShzcmNbaV0pKTtcbiAgXHRcdFx0fVxuICBcdFx0fVxuICBcdH0gZWxzZSB7XG4gIFx0XHQvLyBnZW5lcmljIG9iamVjdHNcbiAgXHRcdHIgPSBzcmMuY29uc3RydWN0b3IgPyBuZXcgc3JjLmNvbnN0cnVjdG9yKCkgOiB7fTtcbiAgXHR9XG4gIFx0cmV0dXJuIG1peGluKHIsIHNyYywgZGVlcF9jbG9uZSk7XG4gIH07XG4gIFxuICAvKiogU3BlY2lhbGl6ZWQgY2xvbmUgZnVuY3Rpb24gdGhhdCBvbmx5IGNsb25lcyBzY2FsYXJzIGFuZCBuZXN0ZWQgYXJyYXlzIHdoZXJlXG4gICAqIGVhY2ggYXJyYXkgZWl0aGVyIGNvbnNpc3RzIG9mIGFsbCBhcnJheXMgb3IgYWxsIG51bWJlcnMuIFRoaXMgZnVuY3Rpb25cbiAgICogaXMgbWVhbnQgYXMgYSBmYXN0IHdheSBvZiBjbG9uaW5nIHBhcmFtZXRlciBkcmF3cyB3aXRoaW4gdGhlIG1jbWMgc2FtcGxpbmdcbiAgICogbG9vcC5cbiAgICovXG4gIHZhciBjbG9uZV9wYXJhbV9kcmF3ID0gZnVuY3Rpb24oeCkge1xuICAgIGlmKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgIGlmKEFycmF5LmlzQXJyYXkoeFswXSkpIHtcbiAgICAgICAgLy8geCBpcyBhbiBhcnJheSBvZiBhcnJheXMgc28gd2UgbmVlZCB0byBjbG9uZSBpdCByZWN1cnNpdmVseVxuICAgICAgICB2YXIgeF9jb3B5ID0gW107XG4gICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbmd0aCA9IHgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB4X2NvcHkucHVzaChjbG9uZV9wYXJhbV9kcmF3KHhbaV0pKTtcbiAgICAgICAgfSBcbiAgICAgICAgcmV0dXJuIHhfY29weTtcbiAgICAgIH0gZWxzZSB7IC8vIFdlJ2xsIGFzc3VtZSB4IGlzIGEgYXJyYXlzIG9mIHNjYWxhcnNcbiAgICAgICAgcmV0dXJuIHguc2xpY2UoMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBzY2FsYXJcbiAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIGEgbnVtYmVyLlxuICAgKi9cbiAgdmFyIGlzX251bWJlciA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT0gXCJudW1iZXJcIiB8fCAodHlwZW9mIG9iamVjdCA9PSBcIm9iamVjdFwiICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIChwb3NzaWJseSBtdWx0aWRpbWVuc2lvbmFsL25lc3RlZCkgYXJyYXkuXG4gICAqIEBwYXJhbSBkaW0gLSBBbiBhcnJheSBnaXZpbmcgdGhlIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkuIEZvciBleGFtcGxlLFxuICAgKiAgIFs1XSB3b3VsZCB5aWVsZCBhIDUgZWxlbWVudCBhcnJheSwgYW5kIFszLDNdIHdvdWxkIHlpZWxkIGEgMyBieSAzIG1hdHJpeC5cbiAgICogQHBhcmFtIGluaXQgLSBBIHZhbHVlIG9yIGEgZnVuY3Rpb24gdXNlZCB0byBmaWxsIGluIHRoZSBlYWNoIGVsZW1lbnQgaW5cbiAgICogICB0aGUgYXJyYXkuIElmIGl0IGlzIGEgZnVuY3Rpb24gaXQgc2hvdWxkIHRha2Ugbm8gYXJndW1lbnRzLCBpdCB3aWxsIGJlIFxuICAgKiAgIGV2YWx1YXRlZCBvbmNlIGZvciBlYWNoIGVsZW1lbnQsIGFuZCBpdCdzIHJldHVybiB2YWx1ZSB3aWxsIGJlIHVzZWQgdG9cbiAgICogICBmaWxsIGluIGVhY2ggZWxlbWVudC5cbiAgICogQGV4YW1wbGUgXG4gICAqIC8vIFRoZSBmb2xsb3dpbmcgd291bGQgcmV0dXJuIFtbMSwxXSxbMSwxXSxbMSwxXV1cbiAgICogY3JlYXRlX2FycmF5KFsyLDNdLCAxKVxuICAgKi9cbiAgdmFyIGNyZWF0ZV9hcnJheSA9IGZ1bmN0aW9uKGRpbSwgaW5pdCkge1xuICAgIHZhciBhcnIgPSBuZXcgQXJyYXkoZGltWzBdKTtcbiAgICB2YXIgaTtcbiAgICBpZihkaW0ubGVuZ3RoID09IDEpIHsgLy8gRmlsbCBpdCB1cCB3aXRoIGluaXRcbiAgICAgIGlmKHR5cGVvZiBpbml0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBhcnJbaV0gPSBpbml0KCk7XG4gICAgICAgIH0gIFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBhcnJbaV0gPSBpbml0O1xuICAgICAgICB9IFxuICAgICAgfVxuICAgIH0gZWxzZSBpZihkaW0ubGVuZ3RoID4gMSkge1xuICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gY3JlYXRlX2FycmF5KGRpbS5zbGljZSgxKSwgaW5pdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiY3JlYXRlX2FycmF5IGNhbid0IGNyZWF0ZSBhIGRpbWVuc2lvbmxlc3MgYXJyYXlcIjtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRpbWVuc2lvbnMgb2YgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYXMgYW4gYXJyYXkuIEZvciBcbiAgICogZXhhbXBsZSwgYXJyYXlfZGltKCBbWzEsIDJdLCBbMSwgMl1dICkgc2hvdWxkIHJldHVybiBbMiwgMl1cbiAgICogQXNzdW1lcyB0aGF0IGFsbCBhcnJheXMgaW5zaWRlIGFub3RoZXIgYXJyYXkgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aC5cbiAgICogQGV4YW1wbGVcbiAgICogLy8gU2hvdWxkIHJldHVybiBbNCwgMiwgMV1cbiAgICogYXJyYXlfZGltKGNyZWF0ZV9hcnJheShbNCwgMiwgMV0sIDApKVxuICAgKi9cbiAgdmFyIGFycmF5X2RpbSA9IGZ1bmN0aW9uKGEpIHtcbiAgICBpZihBcnJheS5pc0FycmF5KGFbMF0pKSB7XG4gICAgICByZXR1cm4gW2EubGVuZ3RoXS5jb25jYXQoYXJyYXlfZGltKGFbMF0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFthLmxlbmd0aF07XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0d28gYXJyYXlzIGFyZSBlcXVhbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHNcbiAgICogYXMganVkZ2VkIGJ5IHRoZSBcIj09XCIgb3BlcmF0b3IuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS5cbiAgICogQWRhcHRlZCBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0ODUzOTc0LzEwMDE4NDhcbiAgICovIFxuICB2YXIgYXJyYXlfZXF1YWwgPSBmdW5jdGlvbiAoYTEsIGEyKSB7XG4gICAgICBpZiAoYTEubGVuZ3RoICE9IGEyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5c1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGExW2ldKSAmJiBBcnJheS5pc0FycmF5KGEyW2ldKSkge1xuICAgICAgICAgICAgICAvLyByZWN1cnNlIGludG8gdGhlIG5lc3RlZCBhcnJheXNcbiAgICAgICAgICAgICAgaWYgKCFhcnJheV9lcXVhbChhMVtpXSwgYTJbaV0pKSByZXR1cm4gZmFsc2U7ICAgICAgIFxuICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgICAgIGVsc2UgaWYgKGExW2ldICE9IGEyW2ldKSB7IFxuICAgICAgICAgICAgICAvLyBXYXJuaW5nIC0gdHdvIGRpZmZlcmVudCBvYmplY3QgaW5zdGFuY2VzIHdpbGwgbmV2ZXIgYmUgZXF1YWw6IHt4OjIwfSAhPSB7eDoyMH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIFxuICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgfSAgICAgICBcbiAgICAgIHJldHVybiB0cnVlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRyYXZlcnNlcyBhIHBvc3NpYmx5IG5lc3RlZCBhcnJheSBhIGFuZCBhcHBsaWVzIGZ1biB0byBhbGwgXCJsZWFmIG5vZGVzXCIsIFxuICAgKiB0aGF0IGlzLCB2YWx1ZXMgdGhhdCBhcmUgbm90IGFycmF5cy4gUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaXplIGFzXG4gICAqIGEuXG4gICAqL1xuICB2YXIgbmVzdGVkX2FycmF5X2FwcGx5ID0gZnVuY3Rpb24oYSwgZnVuKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheShhLmxlbmd0aCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHRbaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVtpXSwgZnVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmdW4oYSk7XG4gICAgfVxuICB9O1xuICBcbiAgLyoqIFJhbmRvbWl6aW5nIHRoZSBhcnJheSBlbGVtZW50IG9yZGVyIGluLXBsYWNlLiBVc2luZyBEdXJzdGVuZmVsZFxuICAgKiBzaHVmZmxlIGFsZ29yaXRobS4gQWRhcHRlZCBmcm9tIGhlcmU6IFxuICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMjY0Njg2NC8xMDAxODQ4XG4gICAqL1xuICBmdW5jdGlvbiBzaHVmZmxlX2FycmF5KGFycmF5KSB7XG4gICAgICBmb3IgKHZhciBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgIHZhciBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgdmFyIHRlbXAgPSBhcnJheVtpXTtcbiAgICAgICAgICBhcnJheVtpXSA9IGFycmF5W2pdO1xuICAgICAgICAgIGFycmF5W2pdID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERvZXMgdGhlIHNhbWUgdGhpbmcgYXMgbmVzdGVkX2FycmF5X2FwcGx5LCB0aGF0IGlzLCB0cmF2ZXJzZXMgYSBwb3NzaWJseVxuICAgKiBuZXN0ZWQgYXJyYXkgYSBhbmQgYXBwbGllcyBmdW4gdG8gYWxsIFwibGVhZiBub2Rlc1wiIGFuZCByZXR1cm5zIGFuIGFycmF5IFxuICAgKiBvZiB0aGUgc2FtZSBzaXplIGFzIGEuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseVxuICAgKiBicmFuY2hlcyByYW5kb21seS5cbiAgICovXG4gIHZhciBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5ID0gZnVuY3Rpb24oYSwgZnVuKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgdmFyIGxlbiA9IGEubGVuZ3RoO1xuICAgICAgdmFyIGk7XG4gICAgICB2YXIgYXJyYXlfaXMgPSBbXTtcbiAgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGFycmF5X2lzW2ldID0gaTtcbiAgICAgIH1cbiAgICAgIHNodWZmbGVfYXJyYXkoYXJyYXlfaXMpO1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgXG4gICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgYXJyYXlfaSA9IGFycmF5X2lzW2ldO1xuICAgICAgICByZXN1bHRbYXJyYXlfaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVthcnJheV9pXSwgZnVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmdW4oYSk7XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIEFsbG93cyBhIHByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZnVsdHMgY2FuIGJlXG4gICAqIG92ZXJyaWRkZW4gYnkgYW4gb3B0aW9ucyBvYmplY3QuXG4gICAqICBAcGFyYW0gb3B0aW9uX25hbWUgLSB0aGUgbmFtZSBvZiB0aGUgb3B0aW9uIGFzIGEgc3RyaW5nXG4gICAqICBAcGFyYW0gbXlfb3B0aW9ucyAtIGFuIG9wdGlvbiBvYmplY3QgdGhhdCBjb3VsZCBoYXZlIG9wdGlvbl9uYW1lIFxuICAgKiAgICBhcyBhIG1lbWJlci5cbiAgICogQHBhcmFtIGRlZmF1bF92YWx1ZSAtIGRlZnVsdCB2YWx1ZSB0aGF0IGlzIHJldHVybmVkIGlmIG9wdGlvbl9uYW1lIFxuICAgKiAgIGlzIG5vdCBkZWZpbmVkIGluIG15X29wdGlvbnMuXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBteV9vcHRpb25zID0ge3BpOiAzLjE0MTU5fVxuICAgKiB2YXIgcGkgPSBnZXRfb3B0aW9uKFwicGlcIiwgbXlfb3B0aW9ucywgMy4xNClcbiAgICovXG4gIC8vIFByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuXG4gIC8vIGJ5IGFuIG9wdGlvbnMgb2JqZWN0LiBGb3IgZXhhbXBsZTpcbiAgLy8gdmFyIHBpID0gZ2V0X29wdGlvbihcInBpXCIsIG15X29wdGlvbnMsIDMuMTQpXG4gIHZhciBnZXRfb3B0aW9uID0gZnVuY3Rpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSkge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBvcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbl9uYW1lKSAmJiBcbiAgICAgICAgICAgb3B0aW9uc1tvcHRpb25fbmFtZV0gIT09IHVuZGVmaW5lZCAgJiYgXG4gICAgICAgICAgIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSBudWxsID8gb3B0aW9uc1tvcHRpb25fbmFtZV0gOiBkZWZhdWxfdmFsdWU7XG4gIH07XG4gIFxuICAvKiogVmVyc2lvbiBvZiBnZXRfb3B0aW9uIHdoZXJlIHRoZSBvcHRpb24gc2hvdWxkIGJlIGEgb25lIG9yIG11bHRpLWRpbWVuc2lvbmFsXG4gICAqIGFycmF5IGFuZCB3aGVyZSB0aGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBlaXRoZXIgYnkgYSBzY2FsYXIgb3IgYnkgYW4gYXJyYXkuXG4gICAqIElmIGl0J3MgYSBzY2FsYXIgdGhlIHRoYXQgc2NhbGFyIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBhcnJheSB3aXRoIFxuICAgKiBkaW0gZGltZW5zaW9ucy5cbiAgICogXG4gICAqL1xuICB2YXIgZ2V0X211bHRpZGltX29wdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkaW0sIGRlZmF1bF92YWx1ZSkge1xuICAgIHZhciB2YWx1ZSA9IGdldF9vcHRpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSk7XG4gICAgIGlmKCEgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICB2YWx1ZSA9IGNyZWF0ZV9hcnJheShkaW0sIHZhbHVlKTtcbiAgICAgfSBcbiAgICAgaWYoISBhcnJheV9lcXVhbCggYXJyYXlfZGltKHZhbHVlKSwgZGltKSkge1xuICAgICAgIHRocm93IFwiVGhlIG9wdGlvbiBcIiArIG9wdGlvbl9uYW1lICsgXCIgaXMgb2YgZGltZW5zaW9uIFtcIiArIFxuICAgICAgICAgICAgIGFycmF5X2RpbSh2YWx1ZSkgKyBcIl0gYnV0IHNob3VsZCBiZSBbXCIgKyBkaW0gKyBcIl0uXCI7XG4gICAgfVxuICAgICByZXR1cm4gdmFsdWU7XG4gIH07XG4gIFxuICAvLy8vLy8vLy8vIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgcGFyYW1ldGVyIG9iamVjdHMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgLyoqXG4gICAqIFJldHVybnMgYSBmaXhlZCAoc2FtZSBldmVyeSB0aW1lKSBudW1iZXIgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgICogYSBwYXJhbWV0ZXIgb2YgYSBjZXJ0YWluIHR5cGUsIHBvc3NpYmx5IHdpdGggbG93ZXIgYW5kIHVwcGVyIGJvdW5kcy5cbiAgICogVGhlIHBvc3NpbGUgdHlwZXMgYXJlIFwicmVhbFwiLCBcImludFwiLCBhbmQgXCJiaW5hcnlcIi5cbiAgICovXG4gIHZhciBwYXJhbV9pbml0X2ZpeGVkID0gZnVuY3Rpb24odHlwZSwgbG93ZXIsIHVwcGVyKSB7XG4gICAgaWYobG93ZXIgPiB1cHBlcikge1xuICAgICAgdGhyb3cgXCJDYW4gbm90IGluaXRpYWxpemUgcGFyYW1ldGVyIHdoZXJlIGxvd2VyIGJvdW5kID4gdXBwZXIgYm91bmRcIjtcbiAgICB9XG4gICAgaWYodHlwZSA9PT0gXCJyZWFsXCIpIHtcbiAgICAgIGlmKGxvd2VyID09PSAtSW5maW5pdHkgJiYgdXBwZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiAwLjU7XG4gICAgICB9IGVsc2UgaWYobG93ZXIgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gdXBwZXIgLSAwLjU7XG4gICAgICB9IGVsc2UgaWYodXBwZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiBsb3dlciArIDAuNTtcbiAgICAgIH0gZWxzZSBpZihsb3dlciA8PSB1cHBlcikge1xuICAgICAgICByZXR1cm4gKGxvd2VyICsgdXBwZXIpIC8gMjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYodHlwZSA9PT0gXCJpbnRcIikge1xuICAgICAgaWYobG93ZXIgPT09IC1JbmZpbml0eSAmJiB1cHBlciA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYobG93ZXIgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gdXBwZXIgLSAxO1xuICAgICAgfSBlbHNlIGlmKHVwcGVyID09PSBJbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gbG93ZXIgKyAxO1xuICAgICAgfSBlbHNlIGlmKGxvd2VyIDw9IHVwcGVyKXtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKGxvd2VyICsgdXBwZXIpIC8gMik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKHR5cGUgPT09IFwiYmluYXJ5XCIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICB0aHJvdyBcIkNvdWxkIG5vdCBpbml0aWFsaXplIHBhcmFtZXRlciBvZiB0eXBlIFwiICsgdHlwZSArIFwiW1wiICsgbG93ZXIgKyBcIiwgXCIgKyB1cHBlciArIFwiXVwiO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIENvbXBsZXRlcyBwYXJhbXNfdG9fY29tcGxldGUsIGFuIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMsIFxuICAgKiBhbmQgaW5pdGlhbGl6ZXMgbm9uLWluaXRpYWxpemVkIHBhcmFtZXRlcnMuIFRoaXMgbW9kaWZpZWQgdmVyc2lvbiBvZlxuICAgKiBwYXJhbXNfdG9fY29tcGxldGUgaXMgcmV0dXJuZWQgYXMgYSBkZWVwIGNvcHkgYW5kIG5vdCBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBieSBzdXBwbHlpbmcgYSBwYXJhbV9pbml0IGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlXG4gICAqIGZ1bmN0aW9uKHR5cGUsIGxvd2VyLCB1cHBlcikgdGhhdCBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIG51bWJlciBcbiAgICogKGxpa2UgcGFyYW1faW5pdF9maXhlZCwgZm9yIGV4YW1wbGUpLlxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgcGFyYW1zID0geyBcIm11XCI6IHtcInR5cGVcIjogXCJyZWFsXCJ9IH1cbiAgICogcGFyYW1zID0gY29tcGxldGVfcGFyYW1zKHBhcmFtcyk7XG4gICAqIC8vIHBhcmFtcyBzaG91bGQgbm93IGJlOlxuICAgKiAvLyAge1wibXVcIjogeyBcInR5cGVcIjogXCJyZWFsXCIsIFwiZGltXCI6IFsxXSwgXCJ1cHBlclwiOiBJbmZpbml0eSxcbiAgICogLy8gICAgICAgICAgIFwibG93ZXJcIjogLUluZmluaXR5LCBcImluaXRcIjogMC41IH19XG4gICAqLyBcbiAgdmFyIGNvbXBsZXRlX3BhcmFtcyAgPSBmdW5jdGlvbihwYXJhbXNfdG9fY29tcGxldGUsIHBhcmFtX2luaXQpIHtcbiAgICB2YXIgcGFyYW1zID0gZGVlcF9jbG9uZShwYXJhbXNfdG9fY29tcGxldGUpO1xuICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gcGFyYW1zKSB7IGlmICghcGFyYW1zLmhhc093blByb3BlcnR5KHBhcmFtX25hbWUpKSBjb250aW51ZTtcbiAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1twYXJhbV9uYW1lXTtcbiAgICAgIGlmKCAhcGFyYW0uaGFzT3duUHJvcGVydHkoXCJ0eXBlXCIpKSB7XG4gICAgICAgIHBhcmFtLnR5cGUgPSBcInJlYWxcIjtcbiAgICAgIH1cbiAgICAgIGlmKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eShcImRpbVwiKSkge1xuICAgICAgICBwYXJhbS5kaW0gPSBbMV07XG4gICAgICB9XG4gICAgICBpZihpc19udW1iZXIocGFyYW0uZGltKSkge1xuICAgICAgICBwYXJhbS5kaW0gPSBbcGFyYW0uZGltXTtcbiAgICAgIH1cbiAgICAgIGlmKHBhcmFtLnR5cGUgPT0gXCJiaW5hcnlcIikge1xuICAgICAgICBwYXJhbS51cHBlciA9IDE7XG4gICAgICAgIHBhcmFtLmxvd2VyID0gMDtcbiAgICAgIH1cbiAgICAgIGlmKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eShcInVwcGVyXCIpKSB7XG4gICAgICAgIHBhcmFtLnVwcGVyID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgICBpZighcGFyYW0uaGFzT3duUHJvcGVydHkoXCJsb3dlclwiKSkge1xuICAgICAgICBwYXJhbS5sb3dlciA9IC1JbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYocGFyYW0uaGFzT3duUHJvcGVydHkoXCJpbml0XCIpKSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMganVzdCBhIG51bWJlciBvciBhIG5lc3RlZCBhcnJheSB3ZSBsZWF2ZSBpdCBhbG9uZSwgYnV0IGlmLi4uXG4gICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSAmJiB0eXBlb2YgcGFyYW0uaW5pdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gcGFyYW0uaW5pdCBpcyBhIGZ1bmN0aW9uLCB1c2UgdGhhdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgICAgcGFyYW0uaW5pdCA9IHBhcmFtLmluaXQoKTtcbiAgICAgICAgfSBlbHNlIGlmKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0uaW5pdCkpIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBhIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyIHdoZXJlIHRoZSBwYXJhbS5pbml0IGV4aXN0IGJ1dFxuICAgICAgICAvLyBpcyBub3QgYW4gYXJyYXkuIFRoZW4gYXNzdW1lIGl0IGlzIGEgbnVtYmVyIG9yIGEgZnVuY3Rpb24gYW5kIHVzZVxuICAgICAgICAvLyBpdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBwYXJhbS5pbml0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHsgLy8gV2UgdXNlIHRoZSBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLlxuICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbV9pbml0KHBhcmFtLnR5cGUsIHBhcmFtLmxvd2VyLCBwYXJhbS51cHBlcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfTtcbiAgXG4gIFxuICAvLy8vLy8vLy8vIFN0ZXBwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIFxuICAvKipcbiAgICogQGludGVyZmFjZVxuICAgKiBBIFN0ZXBwZXIgaXMgYW4gb2JqZWN0IHJlc3BvbnNpYmxlIGZvciBwdXNoaW5nIGFyb3VuZCBvbmVcbiAgICogb3IgbW9yZSBwYXJhbWV0ZXIgdmFsdWVzIGluIGEgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBkaXN0cmlidXRpb25cbiAgICogZGVmaW5lZCBieSB0aGUgbG9nIHBvc3Rlcmlvci4gVGhpcyBkZWZpbmVzIHRoZSBTdGVwcGVyIFwiaW50ZXJmYWNlXCIsXG4gICAqIHdoZXJlIFwiaW50ZXJmYWNlXCIgbWVhbnMgdGhhdCBTdGVwcGVyIGRlZmluZXMgYSBjbGFzcyB0aGF0IGlzIG5ldmVyXG4gICAqIG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCwgYnV0IGp1c3QgdG8gYmUgc3ViY2xhc3NlZCBieSBzcGVjaWFsaXplZFxuICAgKiBzdGVwcGVyIGZ1bmN0aW9ucy5cbiAgICogQGludGVyZmFjZVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggcGFyYW1ldGVyIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZTpcbiAgICogICB7XCJtdVwiOiB7IFwidHlwZVwiOiBcInJlYWxcIiwgXCJkaW1cIjogWzFdLCBcInVwcGVyXCI6IEluZmluaXR5LCBcbiAgICogICBcImxvd2VyXCI6IC1JbmZpbml0eSwgXCJpbml0XCI6IDAuNSB9fVxuICAgKiAgIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGJlIFwiY29tcGxldGVcIiwgdGhhdCBpcyxcbiAgICogICBzcGVjaWZ5aW5nIGFsbCByZWxldmFudCBhdHRyaWJ1dGVzIHN1Y2ggYXMgZGltLCBsb3dlciBhbmQgdXBwZXIuXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycyBpbiBwYXJhbXNcbiAgICogICAoYW5kIHBvc3NpYmx5IG1vcmUpLiBUaGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBnaXZlbiBhcyBrZXlzIGFuZCB0aGUgc3RhdGVzXG4gICAqICAgYXMgc2NhbGFycyBvciwgcG9zc2libHkgbmVzdGVkLCBhcnJheXMuIEZvciBleGFtcGxlOlxuICAgKiAgIHttdTogMTAsIHNpZ21hOiA1LCBiZXRhOiBbMSwgMi41XX1cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiAqdGFraW5nIG5vIHBhcmFtZXRlcnMqIHRoYXQgcmV0dXJucyB0aGVcbiAgICogICBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBUaGF0IGlzLCB0aGUgdmFsdWUgb2YgbG9nX3Bvc3RcbiAgICogICBzaG91bGQgY2hhbmdlIGlmIHRoZSB0aGUgdmFsdWVzIGluIHN0YXRlIGFyZSBjaGFuZ2VkLlxuICBcbiAgICovXG4gIHZhciBTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpIHtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5sb2dfcG9zdCA9IGxvZ19wb3N0O1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBTaG91bGQgcmV0dXJuIHRoZSBuZXcgc3RhdGUsXG4gICAqIGJ1dCBpcyBtYWlubHkgY2FsbGVkIGZvciBpdCdzIHNpZGUgZWZmZWN0IG9mIG1ha2luZyBhIGNoYW5nZSBpbiB0aGVcbiAgICogc3RhdGUgb2JqZWN0LlxuICAgKi9cbiAgU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHRocm93IFwiRXZlcnkgU3RlcHBlciBuZWVkIHRvIGltcGxlbWVudCBzdGVwKClcIjtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBJZiBpbXBsZW1lbnRlZCwgbWFrZXMgdGhlIHN0ZXBwZXIgYWRhcHQgd2hpbGUgc3RlcHBpbmcuXG4gICAqLyBcbiAgU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gXG4gIH07XG4gIFxuICAvKipcbiAgICogSWYgaW1wbGVtZW50ZWQsIG1ha2VzIHRoZSBzdGVwcGVyIGNlYXNlIGFkYXB0aW5nIHdoaWxlIHN0ZXBwaW5nLlxuICAgKi8gXG4gIFN0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gXG4gIH07XG4gIFxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmcgaW5mbyByZWdhcmRpbmcgdGhlIHN0ZXBwZXIuXG4gICAqLyBcbiAgU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHN0ZXBwZXIuXG4gICAgcmV0dXJuIHt9O1xuICB9O1xuICBcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBtZXRyb3BvbGlzIHN0ZXAgaW5cbiAgICogdGhlIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiBcIkV4YW1wbGVzIG9mIEFkYXB0aXZlIE1DTUNcIlxuICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICAqIEBwYXJhbSBnZW5lcmF0ZV9wcm9wb3NhbCAtIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgcHJvcG9zYWwgKGFzIGEgbnVtYmVyKVxuICAgKiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgbG9nX3NjYWxlKSB3aGVyZSBwYXJhbV9zdGF0ZSBpcyBhXG4gICAqIG51bWJlciBhbmQgbG9nX3NjYWxlIGRlZmluZXMgdGhlIHNjYWxlIG9mIHRoZSBwcm9wb3NhbCBzb21laG93LlxuICAqL1xuICB2YXIgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgZ2VuZXJhdGVfcHJvcG9zYWwpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIFxuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggICE9IDEpIHtcbiAgICAgIHRocm93IFwiT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgY2FuIG9ubHkgaGFuZGxlIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07XG4gICAgaWYoIWFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgdGhyb3cgXCJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBjYW4gb25seSBoYW5kbGUgb25lIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMubG93ZXIgPSBwYXJhbS5sb3dlcjtcbiAgICB0aGlzLnVwcGVyID0gcGFyYW0udXBwZXI7XG4gICAgXG4gICAgdGhpcy5wcm9wX2xvZ19zY2FsZSAgICAgPSBnZXRfb3B0aW9uKFwicHJvcF9sb2dfc2NhbGVcIiwgb3B0aW9ucywgMCk7XG4gICAgdGhpcy5iYXRjaF9zaXplICAgICAgICAgPSBnZXRfb3B0aW9uKFwiYmF0Y2hfc2l6ZVwiLCBvcHRpb25zLCA1MCk7XG4gICAgdGhpcy5tYXhfYWRhcHRhdGlvbiAgICAgPSBnZXRfb3B0aW9uKFwibWF4X2FkYXB0YXRpb25cIiwgb3B0aW9ucywgMC4zMyk7XG4gICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfb3B0aW9uKFwiaW5pdGlhbF9hZGFwdGF0aW9uXCIsIG9wdGlvbnMsIDEuMCk7XG4gICAgdGhpcy50YXJnZXRfYWNjZXB0X3JhdGUgPSBnZXRfb3B0aW9uKFwidGFyZ2V0X2FjY2VwdF9yYXRlXCIsIG9wdGlvbnMsIDAuNDQpO1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgICAgICAgID0gZ2V0X29wdGlvbihcImlzX2FkYXB0aW5nXCIsIG9wdGlvbnMsIHRydWUpO1xuICAgIFxuICAgIHRoaXMuZ2VuZXJhdGVfcHJvcG9zYWwgPSBnZW5lcmF0ZV9wcm9wb3NhbDtcbiAgICBcbiAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwO1xuICAgIHRoaXMuYmF0Y2hfY291bnQgPSAwO1xuICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7ICBcbiAgfTtcbiAgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT25lZGltTWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHBhcmFtX3N0YXRlID0gdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdO1xuICAgICAgdmFyIHBhcmFtX3Byb3Bvc2FsID0gdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbChwYXJhbV9zdGF0ZSwgdGhpcy5wcm9wX2xvZ19zY2FsZSk7XG4gICAgICBpZihwYXJhbV9wcm9wb3NhbCA8IHRoaXMubG93ZXIgfHwgcGFyYW1fcHJvcG9zYWwgPiB0aGlzLnVwcGVyKSB7XG4gICAgICAgIC8vIE91dHNpZGUgb2YgbGltaXRzIG9mIHRoZSBwYXJhbWV0ZXIsIHJlamVjdCB0aGUgcHJvcG9zYWwgXG4gICAgICAgIC8vIGFuZCBzdGF5IGF0IHRoZSBjdXJyZW50IHN0YXRlLlxuICAgICAgfSBlbHNlIHsgLy8gbWFrZSBhIE1ldHJvcG9saXMgc3RlcFxuICAgICAgICB2YXIgY3Vycl9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gcGFyYW1fcHJvcG9zYWw7XG4gICAgICAgIHZhciBwcm9wX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpO1xuICAgICAgICB2YXIgYWNjZXB0X3Byb2IgPSBNYXRoLmV4cChwcm9wX2xvZ19kZW5zIC0gY3Vycl9sb2dfZGVucyk7XG4gICAgICAgIGlmKGFjY2VwdF9wcm9iID4gTWF0aC5yYW5kb20oKSkge1xuICAgICAgICAgIC8vIFdlIGRvIG5vdGhpbmcgYXMgdGhlIHN0YXRlIG9mIHBhcmFtIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCB0byB0aGUgcHJvcG9zYWxcbiAgICAgICAgICBpZih0aGlzLmlzX2FkYXB0aW5nKSB0aGlzLmFjY2VwdGFuY2VfY291bnQrKyA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHN0YXRlIGJhY2sgdG8gdGhlIG9sZCBzdGF0ZSBvZiBwYXJhbVxuICAgICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3N0YXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZih0aGlzLmlzX2FkYXB0aW5nKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiArKztcbiAgICAgICAgaWYodGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uID49IHRoaXMuYmF0Y2hfc2l6ZSkgeyAvLyB0aGVuIGFkYXB0XG4gICAgICAgICAgdGhpcy5iYXRjaF9jb3VudCArKztcbiAgICAgICAgICB2YXIgbG9nX3NkX2FkanVzdG1lbnQgPSBcbiAgICAgICAgICAgIE1hdGgubWluKHRoaXMubWF4X2FkYXB0YXRpb24sIFxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gLyBNYXRoLnNxcnQodGhpcy5iYXRjaF9jb3VudCkpO1xuICAgICAgICAgIGlmKHRoaXMuYWNjZXB0YW5jZV9jb3VudCAvIHRoaXMuYmF0Y2hfc2l6ZSA+IHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlICs9IGxvZ19zZF9hZGp1c3RtZW50O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlIC09IGxvZ19zZF9hZGp1c3RtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwO1xuICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07XG4gIH07XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgPSB0cnVlO1xuICB9O1xuICBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBmYWxzZTtcbiAgfTtcbiAgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BfbG9nX3NjYWxlOiB0aGlzLnByb3BfbG9nX3NjYWxlLFxuICAgICAgaXNfYWRhcHRpbmc6IHRoaXMuaXNfYWRhcHRpbmcsXG4gICAgICBhY2NlcHRhbmNlX2NvdW50OiB0aGlzLmFjY2VwdGFuY2VfY291bnQsXG4gICAgICBpdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uOiB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24sXG4gICAgICBiYXRjaF9jb3VudDogdGhpcy5iYXRjaF9jb3VudFxuICAgIH07XG4gIH07XG4gIFxuICBcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhIE5vcm1hbCBwcm9wb3NhbC5cbiAgICovXG4gIHZhciBub3JtYWxfcHJvcG9zYWwgPSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHtcbiAgICByZXR1cm4gcm5vcm0ocGFyYW1fc3RhdGUgLCBNYXRoLmV4cChwcm9wX2xvZ19zY2FsZSkpO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAYXVnbWVudHMge09uZWRpbU1ldHJvcG9saXNTdGVwcGVyfVxuICAgKiBBIFwic3ViY2xhc3NcIiBvZiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgUmVhbE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBub3JtYWxfcHJvcG9zYWwpO1xuICB9O1xuICBcbiAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsgXG4gIFJlYWxNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICAvKipcbiAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGEgZGlzY3JldGl6ZWQgTm9ybWFsIHByb3Bvc2FsLlxuICAgKi9cbiAgdmFyIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCA9IGZ1bmN0aW9uKHBhcmFtX3N0YXRlLCBwcm9wX2xvZ19zY2FsZSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHJub3JtKHBhcmFtX3N0YXRlICwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKSk7XG4gIH07XG4gIFxuICAgIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGF1Z21lbnRzIHtPbmVkaW1NZXRyb3BvbGlzU3RlcHBlcn1cbiAgICogQSBcInN1YmNsYXNzXCIgb2YgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgSW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCk7XG4gIH07XG4gIFxuICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgXG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfVxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgbWV0cm9wb2xpcyBzdGVwIGluXG4gICAqIHRoZSBBZGFwdGl2ZSBNZXRyb3BvbGlzLVdpdGhpbi1HaWJicyBhbGdvcml0aG0gaW4gXCJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DXCJcbiAgICogYnkgUm9iZXJ0cyBhbmQgUm9zZW50aGFsICgyMDA4KSBmb3IgcG9zc2libHkgbXVsdGlkaW1lbnNpb25hbCBhcnJheXMuIFRoYXRcbiAgICogaXMsIGluc3RlYWQgb2YganVzdCB0YWtpbmcgYSBzdGVwIGZvciBhIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIgbGlrZSBcbiAgICogT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIsIHRoaXMgU3RlcHBlciBpcyByZXNwb25zaWJsZSBmb3IgdGFraW5nIHN0ZXBzIFxuICAgKiBmb3IgYSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5LiBJdCdzIHN0aWxsIHByZXR0eSBkdW1iIGFuZCBqdXN0IHRha2VzXG4gICAqIG9uZS1kaW1lbnNpb25hbCBzdGVwcyBmb3IgZWFjaCBwYXJhbWV0ZXIgY29tcG9uZW50LCB0aG91Z2guXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBmb3IgYSBcbiAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgICogQHBhcmFtIFN1YlN0ZXBwZXIgLSBhIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSBvZiBvbmUgZGltZW5zaW9uYWwgU3RlcHBlciB0byBhcHBseSBvblxuICAgKiAgIGFsbCB0aGUgY29tcG9uZW50cyBvZiB0aGUgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuXG4gICovXG4gIHZhciBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFN1YlN0ZXBwZXIpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIFxuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggICE9IDEpIHtcbiAgICAgIHRocm93IFwiTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07XG4gICAgdGhpcy5sb3dlciA9IHBhcmFtLmxvd2VyO1xuICAgIHRoaXMudXBwZXIgPSBwYXJhbS51cHBlcjtcbiAgICB0aGlzLmRpbSA9IHBhcmFtLmRpbTtcbiAgXG4gICAgdGhpcy5wcm9wX2xvZ19zY2FsZSAgICAgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwicHJvcF9sb2dfc2NhbGVcIiwgb3B0aW9ucywgdGhpcy5kaW0sIDApO1xuICAgIHRoaXMuYmF0Y2hfc2l6ZSAgICAgICAgID0gZ2V0X211bHRpZGltX29wdGlvbihcImJhdGNoX3NpemVcIiwgb3B0aW9ucywgdGhpcy5kaW0sIDUwKTtcbiAgICB0aGlzLm1heF9hZGFwdGF0aW9uICAgICA9IGdldF9tdWx0aWRpbV9vcHRpb24oXCJtYXhfYWRhcHRhdGlvblwiLCBvcHRpb25zLCB0aGlzLmRpbSwgMC4zMyk7XG4gICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwiaW5pdGlhbF9hZGFwdGF0aW9uXCIsIG9wdGlvbnMsIHRoaXMuZGltLCAxLjApO1xuICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X211bHRpZGltX29wdGlvbihcInRhcmdldF9hY2NlcHRfcmF0ZVwiLCBvcHRpb25zLCB0aGlzLmRpbSwgMC40NCk7XG4gICAgdGhpcy5pc19hZGFwdGluZyAgICAgICAgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwiaXNfYWRhcHRpbmdcIiwgb3B0aW9ucywgdGhpcy5kaW0sIHRydWUpO1xuICAgIFxuICAgIC8vIFRoaXMgaGFjayBiZWxvdyBpcyBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJyYXkgb2YgXG4gICAgLy8gb25lIGRpbWVuc2lvbmFsIHN0ZXBwZXJzIGFjY29yZGluZyB0byBkaW0uXG4gICAgdmFyIGNyZWF0ZV9zdWJzdGVwcGVycyA9IFxuICAgICAgZnVuY3Rpb24oZGltLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHByb3BfbG9nX3NjYWxlLCBiYXRjaF9zaXplLCBtYXhfYWRhcHRhdGlvbiwgaW5pdGlhbF9hZGFwdGF0aW9uLCB0YXJnZXRfYWNjZXB0X3JhdGUsIGlzX2FkYXB0aW5nKSB7XG4gICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTtcbiAgICAgIGlmKGRpbS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgdmFyIHN1Ym9wdGlvbnMgPSB7cHJvcF9sb2dfc2NhbGU6IHByb3BfbG9nX3NjYWxlW2ldLCBiYXRjaF9zaXplOiBiYXRjaF9zaXplW2ldLFxuICAgICAgICAgICAgbWF4X2FkYXB0YXRpb246IG1heF9hZGFwdGF0aW9uW2ldLCBpbml0aWFsX2FkYXB0YXRpb246IGluaXRpYWxfYWRhcHRhdGlvbltpXSxcbiAgICAgICAgICAgIHRhcmdldF9hY2NlcHRfcmF0ZTogdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZzogaXNfYWRhcHRpbmdbaV19O1xuICAgICAgICAgICAgdmFyIHN1YnBhcmFtID0ge307XG4gICAgICAgICAgICBzdWJwYXJhbVtpXSA9IGRlZXBfY2xvbmUocGFyYW0pO1xuICAgICAgICAgICAgc3VicGFyYW1baV0uZGltID0gWzFdOyAvLyBBcyB0aGlzIHNob3VsZCBub3cgYmUgYSBvbmUtZGltIHBhcmFtZXRlclxuICAgICAgICAgICAgZGVsZXRlIHN1YnBhcmFtW2ldLmluaXQ7IC8vIEFzIGl0IHNvdWxkIG5vdCBiZSBuZWVkZWRcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBTdWJTdGVwcGVyKHN1YnBhcmFtLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHN1Ym9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IGNyZWF0ZV9zdWJzdGVwcGVycyhkaW0uc2xpY2UoMSksIHN1YnN0YXRlW2ldLCBsb2dfcG9zdCwgcHJvcF9sb2dfc2NhbGVbaV0sIFxuICAgICAgICAgICAgYmF0Y2hfc2l6ZVtpXSwgbWF4X2FkYXB0YXRpb25baV0sIGluaXRpYWxfYWRhcHRhdGlvbltpXSwgdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZ1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdGVwcGVycztcbiAgICB9O1xuICAgIFxuICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBjcmVhdGVfc3Vic3RlcHBlcnModGhpcy5kaW0sIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSwgdGhpcy5sb2dfcG9zdCxcbiAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUsIHRoaXMuYmF0Y2hfc2l6ZSwgdGhpcy5tYXhfYWRhcHRhdGlvbiwgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24sXG4gICAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSwgdGhpcy5pc19hZGFwdGluZyk7XG4gICAgXG4gIH07XG4gIFxuICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyO1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIEdvIHRocm91Z2ggdGhlIHN1YnN0ZXBwZXJzIGluIGEgcmFuZG9tIG9yZGVyIGFuZCBjYWxsIHN0ZXAoKSBvbiB0aGVtLlxuICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtyZXR1cm4gc3Vic3RlcHBlci5zdGVwKCk7IH0pO1xuICB9O1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7c3Vic3RlcHBlci5zdGFydF9hZGFwdGF0aW9uKCk7IH0pO1xuICB9O1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtzdWJzdGVwcGVyLnN0b3BfYWRhcHRhdGlvbigpOyB9KTtcbiAgfTtcbiAgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtcbiAgICAgIHJldHVybiBzdWJzdGVwcGVyLmluZm8oKTsgXG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBhdWdtZW50cyB7TXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcn1cbiAgICogQSBcInN1YmNsYXNzXCIgb2YgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgUmVhbE1ldHJvcG9saXNTdGVwcGVyKTtcbiAgfTtcbiAgXG4gIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7XG5cbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9XG4gICAqIEEgXCJzdWJjbGFzc1wiIG9mIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqLyAgICBcbiAgdmFyIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgSW50TWV0cm9wb2xpc1N0ZXBwZXIpO1xuICB9O1xuICBcbiAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsgXG4gIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGEgc3RlcCBmb3IgYSBiaW5hcnkgcGFyYW1ldGVyLlxuICAgKiBUaGlzIGlzIGRvbmUgYnkgZXZhbHVhdGluZyB0aGUgbG9nIHBvc3RlcmlvciBmb3IgYm90aCBzdGF0ZXMgb2YgdGhlXG4gICAqIHBhcmFtZXRlciBhbmQgdGhlbiBzZWxlY3RpbmcgYSBzdGF0ZSByYW5kb21seSB3aXRoIHByb2JhYmlsaXR5IHJlbGF0aXZlIFxuICAgKiB0byB0aGUgcG9zdGVyaW9yIG9mIGVhY2ggc3RhdGUuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEJpbmFyeVN0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7XG4gICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIGlmKHBhcmFtX25hbWVzLmxlbmd0aCAgPT0gMSkge1xuICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiQmluYXJ5U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICB9O1xuICBcbiAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsgXG4gIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmluYXJ5U3RlcHBlcjtcbiAgXG4gIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSAwO1xuICAgIHZhciB6ZXJvX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpO1xuICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IDE7XG4gICAgdmFyIG9uZV9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICB2YXIgbWF4X2xvZ19kZW5zID0gTWF0aC5tYXgoemVyb19sb2dfZGVucywgb25lX2xvZ19kZW5zKTtcbiAgICB6ZXJvX2xvZ19kZW5zIC09IG1heF9sb2dfZGVucztcbiAgICBvbmVfbG9nX2RlbnMgLT0gbWF4X2xvZ19kZW5zO1xuICAgIHZhciB6ZXJvX3Byb2IgPSBNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zIC0gTWF0aC5sb2coIE1hdGguZXhwKHplcm9fbG9nX2RlbnMpICsgTWF0aC5leHAob25lX2xvZ19kZW5zKSApICk7XG4gICAgaWYoTWF0aC5yYW5kb20oKSA8IHplcm9fcHJvYikge1xuICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gLy8gZWxzZSBrZWVwIHRoZSBwYXJhbSBhdCAxIC5cbiAgICByZXR1cm4gMTtcbiAgfTtcbiAgXG4gICAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn1cbiAgICogSnVzdCBsaWtlIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgdGhpcyBTdGVwcGVyIHRha2VzIGEgc3RlcHMgZm9yXG4gICAqIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgYnkgdXBkYXRpbmcgZWFjaCBjb21wb25lbnQgaW4gdHVybi4gVGhlIGRpZmZlcmVuY2VcbiAgICogaXMgdGhhdCB0aGlzIHN0ZXBwZXIgd29ya3Mgb24gYmluYXJ5IHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBmb3IgYSBcbiAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7XG4gICAgXG4gICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIGlmKHBhcmFtX25hbWVzLmxlbmd0aCAgPT0gMSkge1xuICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07XG4gICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdO1xuICAgICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiQmluYXJ5Q29tcG9uZW50U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIFxuICAgIHZhciBjcmVhdGVfc3Vic3RlcHBlcnMgPSBcbiAgICAgIGZ1bmN0aW9uKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0KSB7XG4gICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTtcbiAgICAgIHZhciBpO1xuICAgICAgaWYoZGltLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykge1xuICAgICAgICAgIHZhciBzdWJwYXJhbXMgPSB7fTtcbiAgICAgICAgICBzdWJwYXJhbXNbaV0gPSBwYXJhbTtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBCaW5hcnlTdGVwcGVyKHN1YnBhcmFtcywgc3Vic3RhdGUsIGxvZ19wb3N0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IGNyZWF0ZV9zdWJzdGVwcGVycyhkaW0uc2xpY2UoMSksIHN1YnN0YXRlW2ldLCBsb2dfcG9zdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdGVwcGVycztcbiAgICB9O1xuICAgIFxuICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBjcmVhdGVfc3Vic3RlcHBlcnModGhpcy5kaW0sIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSwgdGhpcy5sb2dfcG9zdCk7XG4gIH07XG4gIFxuICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCaW5hcnlDb21wb25lbnRTdGVwcGVyO1xuICBcbiAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIEdvIHRocm91Z2ggdGhlIHN1YnN0ZXBwZXJzIGluIGEgcmFuZG9tIG9yZGVyIGFuZCBjYWxsIHN0ZXAoKSBvbiB0aGVtLlxuICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtyZXR1cm4gc3Vic3RlcHBlci5zdGVwKCk7IH0pO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn1cbiAgICogVGhpcyBzdGVwcGVyIGNhbiBiZSByZXNwb25zaWJsZSBmb3IgdGFraW5nIGEgc3RlcCBmb3Igb25lIG9yIG1vcmUgcGFyYW1ldGVycy5cbiAgICogRm9yIHJlYWwgYW5kIGludCBwYXJhbWV0ZXJzIGl0IHRha2VzIE1ldHJvcG9saXMgd2l0aGluIEdpYmJzIHN0ZXBzLCBhbmQgZm9yIFxuICAgKiBiaW5hcnkgcGFyYW1ldGVycyBpdCBkb2VzIGV2YWx1YXRlcyB0aGUgcG9zdGVyaW9yIGZvciBib3RoIHBhcmFtdGVyIHZhbHVlcyBhbmRcbiAgICogcmFuZG9tbHkgY2hhbmdlcyB0byBhIGNlcnRhaW4gdmFsdWUgcHJvcG9ydGlvbmFsbHkgdG8gdGhhdCB2YWx1ZSdzIHBvc3RlcmlvclxuICAgKiAodGhpcyBpcyBhbHNvIGRvbmUgZm9yIGVhY2ggcGFyYW1ldGVyLCBzbyBhbHNvIGEgKiB3aXRoaW4gR2liYnMgYXBwcm9hY2gpLlxuICAgKiBUaGlzIHN0ZXBwZXIgaXMgYWxzbyBhZGFwdGl2ZSBhbmQgY2FuIGJlIGVmZmljaWVudCB3aGVuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyc1xuICAgKiBhcmUgbm90IHRvbyBoaWdoIGFuZCB0aGUgY29ycmVsYXRpb25zIGJldHdlZW4gcGFyYW1ldGVycyBhcmUgbG93LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnNcbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEFtd2dTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7XG4gICAgdGhpcy5zdWJzdGVwcGVycyA9IFtdO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbdGhpcy5wYXJhbV9uYW1lc1tpXV07XG4gICAgICB2YXIgU2VsZWN0U3RlcHBlcjtcbiAgICAgIHN3aXRjaCAocGFyYW0udHlwZSkge1xuICAgICAgICBjYXNlIFwicmVhbFwiOlxuICAgICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IFJlYWxNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImludFwiOlxuICAgICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IEludE1ldHJvcG9saXNTdGVwcGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJiaW5hcnlcIjpcbiAgICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBCaW5hcnlTdGVwcGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gQmluYXJ5Q29tcG9uZW50U3RlcHBlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgXCJBbXdnU3RlcHBlciBjYW4ndCBoYW5kbGUgcGFyYW1ldGVyIFwiICsgdGhpcy5wYXJhbV9uYW1lc1tpXSAgK1wiIHdpdGggdHlwZSBcIiArIHBhcmFtLnR5cGU7IFxuICAgICAgfVxuICAgICAgdmFyIHBhcmFtX29iamVjdF93cmFwID0ge307XG4gICAgICBwYXJhbV9vYmplY3Rfd3JhcFt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHBhcmFtO1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICB2YXIgcGFyYW1fb3B0aW9ucyA9IG9wdGlvbnMucGFyYW1zICYmIG9wdGlvbnMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dIHx8IHt9O1xuICAgICAgcGFyYW1fb3B0aW9ucy5wcm9wX2xvZ19zY2FsZSAgICAgPSBwYXJhbV9vcHRpb25zLnByb3BfbG9nX3NjYWxlICAgICB8fCBvcHRpb25zLnByb3BfbG9nX3NjYWxlOyBcbiAgICAgIHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSAgICAgICAgID0gcGFyYW1fb3B0aW9ucy5iYXRjaF9zaXplICAgICAgICAgfHwgb3B0aW9ucy5iYXRjaF9zaXplOyBcbiAgICAgIHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gICAgID0gcGFyYW1fb3B0aW9ucy5tYXhfYWRhcHRhdGlvbiAgICAgfHwgb3B0aW9ucy5tYXhfYWRhcHRhdGlvbjtcbiAgICAgIHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uID0gcGFyYW1fb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb24gfHwgb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb247XG4gICAgICBwYXJhbV9vcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZSA9IHBhcmFtX29wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlIHx8IG9wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlOyBcbiAgICAgIHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgICAgICAgID0gcGFyYW1fb3B0aW9ucy5pc19hZGFwdGluZyAgICAgICAgfHwgb3B0aW9ucy5pc19hZGFwdGluZzsgXG4gICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldID0gbmV3IFNlbGVjdFN0ZXBwZXIocGFyYW1fb2JqZWN0X3dyYXAsIHN0YXRlLCBsb2dfcG9zdCwgcGFyYW1fb3B0aW9ucyk7XG4gICAgfVxuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBBbXdnU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU3RlcHBlcjtcbiAgXG4gIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24oKSB7XG4gICAgc2h1ZmZsZV9hcnJheSh0aGlzLnN1YnN0ZXBwZXJzKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGVwKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGFydF9hZGFwdGF0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0b3BfYWRhcHRhdGlvbigpO1xuICAgIH0gXG4gIH07XG4gIFxuICBBbXdnU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbmZvID0ge307XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGluZm9bdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSB0aGlzLnN1YnN0ZXBwZXJzW2ldLmluZm8oKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH07XG4gIFxuICBcbiAgXG4gIC8vLy8vLy8vLy8vIFNhbXBsZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgXG4gICAvKipcbiAgICogQGludGVyZmFjZVxuICAgKiBXaGlsZSB5b3UgY291bGQgZml0IGEgbW9kZWwgYnkgcGFzdGluZyB0b2dldGhlciBTdGVwcGVycywgYVxuICAvLyBTYW1wbGVyIGlzIGhlcmUgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyB3aGVyZSBhbiBpbnN0YW5jZSBvZiBTYW1wbGVyXG4gIC8vIHNldHMgdXAgdGhlIFN0ZXBwZXJzLCBjaGVja3MgdGhlIHBhcmFtZXRlciBkZWZpbml0aW9uLFxuICAvLyBhbmQgbWFuYWdlcyB0aGUgc2FtcGxpbmcuIFRoaXMgaGVyZSBkZWZpbmVzIHRoZSBTYW1wbGVyIFwiaW50ZXJmYWNlXCIuXG4gICAqIEBpbnRlcmZhY2VcbiAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6XG4gICAqICAge1wibXVcIjoge1widHlwZVwiOiBcInJlYWxcIn0sIFwic2lnbWFcIjoge1widHlwZVwiOiBcInJlYWxcIiwgXCJsb3dlclwiID0gMH19XG4gICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBkb2Vzbid0IGhhdmUgdG8gYmUgXCJjb21wbGV0ZVwiIGFuZCBwcm9wZXJ0aWVzXG4gICAqICAgbGVmdCBvdXQgKGxpa2UgbG93ZXIgYW5kIHVwcGVyKSB3aWxsIGJlIGZpbGxlZCBpbiBieSBkZWZhdWx0cy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihzdGF0ZSwgZGF0YSkuIEhlcmVcbiAgICogICBzdGF0ZSB3aWxsIGJlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHN0YXRlIHdpdGggZWFjaCBwYXJhbWV0ZXIgYXMgYSBcbiAgICogICBrZXkgYW5kIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGFzIG51bWJlcnMgb3IgYXJyYXlzLiBGb3IgZXhhbXBsZTpcbiAgICogICB7XCJtdVwiOiAzLCBcInNpZ21hXCI6IDEuNX0uIFRoZSBkYXRhIGFyZ3VtZW50IHdpbGwgYmUgdGhlIHNhbWUgb2JqZWN0IGFzIFxuICAgKiAgIHRoZSBkYXRhIGFyZ3VtZW50IGdpdmVuIGJlbG93LlxuICAgKiBAcGFyYW0gZGF0YSAtIGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBsb2dfcG9zdCBmdW5jdGlvblxuICAgKiAgIHdoZW4gc2FtcGxpbmcuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc2FtcGxlci5cbiAgICovXG4gIHZhciBTYW1wbGVyID0gZnVuY3Rpb24ocGFyYW1zLCBsb2dfcG9zdCwgZGF0YSwgb3B0aW9ucykge1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5wYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBcbiAgICAvLyBTZXR0aW5nIGRlZmF1bHQgb3B0aW9ucyBpZiBub3QgcGFzc2VkIHRocm91Z2ggdGhlIG9wdGlvbnMgb2JqZWN0XG4gICAgdGhpcy5wYXJhbV9pbml0X2Z1biAgID0gZ2V0X29wdGlvbihcInBhcmFtX2luaXRfZnVuXCIsIG9wdGlvbnMsIHBhcmFtX2luaXRfZml4ZWQpO1xuICAgIHZhciB0aGlubmluZ19pbnRlcnZhbCA9IGdldF9vcHRpb24oXCJ0aGluXCIsIG9wdGlvbnMsIDEpO1xuICAgIHZhciBwYXJhbXNfdG9fbW9uaXRvciA9IGdldF9vcHRpb24oXCJtb25pdG9yXCIsIG9wdGlvbnMsIG51bGwpO1xuICAgIHRoaXMudGhpbih0aGlubmluZ19pbnRlcnZhbCk7XG4gICAgdGhpcy5tb25pdG9yKHBhcmFtc190b19tb25pdG9yKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIC8vIENvbXBsZXRpbmcgdGhlIHBhcmFtcyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBzdGF0ZS5cbiAgICB0aGlzLnBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyh0aGlzLnBhcmFtcywgdGhpcy5wYXJhbV9pbml0X2Z1bik7XG4gICAgdmFyIHN0YXRlID0ge307XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1fbmFtZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICBzdGF0ZVt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dLmluaXQ7XG4gICAgfVxuICAgIHRoaXMubG9nX3Bvc3QgPSBmdW5jdGlvbigpIHsgXG4gICAgICByZXR1cm4gbG9nX3Bvc3Qoc3RhdGUsIGRhdGEpO1xuICAgIH07XG4gICAgLy8gUnVubmluZyB0aGUgbG9nX3Bvc3QgZnVuY3Rpb24gb25jZSBpbiBjYXNlIGl0IGZ1cnRoZXIgbW9kaWZpZXMgdGhlIHN0YXRlXG4gICAgLy8gZm9yIGV4YW1wbGUgYWRkaW5nIGRlcml2ZWQgcXVhbnRpdGllcy5cbiAgICB0aGlzLmxvZ19wb3N0KCk7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMuc3RlcHBlcnMgPSB0aGlzLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlKHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlLCB0aGlzLmxvZ19wb3N0LCB0aGlzLm9wdGlvbnMpO1xuICB9O1xuICBcbiAgLyoqIFNob3VsZCByZXR1cm4gYSB2ZWN0b3Igb2Ygc3RlcHBlcnMgdGhhdCB3aGVuIGNhbGxlZCBcbiAgICogc2hvdWxkIHRha2UgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuXG4gICAqL1xuICBTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uKHN0YXRlLCBsb2dfcG9zdCl7XG4gICAgdGhyb3cgXCJFdmVyeSBTYW1wbGVyIG5lZWRzIHRvIGltcGxlbWVudCBjcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSgpXCI7XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBpbmZvIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgU2FtcGxlci5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtzdGF0ZTogdGhpcy5zdGF0ZSwgdGhpbjogdGhpcy50aGluLCBtb25pdG9yOiB0aGlzLm1vbml0b3IsXG4gICAgICAgICAgICBzdGVwcGVyczogdGhpcy5zdGVwcGVyc307XG4gIH07XG4gIFxuICAvKiogVGFrZXMgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuIFJldHVybnMgdGhlIG5ldyBzcGFjZVxuICAgKiBidXQgYWxzbyBtb2RpZmllcyB0aGUgc3RhdGUgaW4gcGxhY2UuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHNodWZmbGVfYXJyYXkodGhpcy5zdGVwcGVycyk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RlcCgpO1xuICAgIH1cbiAgICBpZihPYmplY3Qua2V5cyh0aGlzLnN0YXRlKS5sZW5ndGggPiBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcykubGVuZ3RoKSB7XG4gICAgICAvLyBUaGUgc3RhdGUgY29udGFpbnMgZGV2aXZlZCBxdWFudGl0aWVzIChub3Qgb25seSBwYXJhbWV0ZXJzKSBhbmQgd2VcbiAgICAgIC8vIG5lZWQgdG8gcnVuIHRoZSBsb2dfcG9zdCBvbmNlIG1vcmUgaW4gb3JkZXIgdG8gc2V0IHRoZSBkZXJpdmVkIHF1YW50aXRpZXNcbiAgICAgIC8vIGZvciB0aGUgZmluYWwgcGFyYW1ldGVyIHN0YXRlXG4gICAgICB0aGlzLmxvZ19wb3N0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIG5faXRlcmF0aW9ucyBzdGVwcyBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlIGFuZCByZXR1cm5zIHRoZW1cbiAgICogYXMgYW4gb2JqZWN0IG9mIGFycmF5cyB3aXRoIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZTpcbiAgICoge211OiBbMSwgLTEsIDIsIDMsIC4uLl0sIHNpZ21hOiBbMSwgMiwgMiwgMSwgLi4uXX0uXG4gICAqIElmIHRoaW4gaXMgPiAxIHRoZW4gbl9pdGVyYXRpb25zIC8gdGhpbiBzYW1wbGVzIGFyZSByZXR1cm5lZC5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5zYW1wbGUgPSBmdW5jdGlvbihuX2l0ZXJhdGlvbnMpIHtcbiAgICAgIC8vIEluaXRpYWxpemluZyBjdXJyX3NhbXBsZSB3aGVyZSB0aGUgc2FtcGxlIGlzIGdvaW5nIHRvIGJlIHNhdmVkXG4gICAgICAvLyBhcyBhbiBvYmplY3QgY29udGFpbmluZyBvbmUgYXJyYXkgcGVyIHBhcmFtZXRlciB0byBiZSBtb25pdG9yZWQuXG4gICAgICB2YXIgaSwgaiwgbW9uaXRvcmVkX3BhcmFtcztcbiAgICAgIGlmKHRoaXMubW9uaXRvcmVkX3BhcmFtcyA9PT0gbnVsbCkge1xuICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gT2JqZWN0LmtleXModGhpcy5zdGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gdGhpcy5tb25pdG9yZWRfcGFyYW1zO1xuICAgICAgfVxuICAgICAgXG4gICAgICB2YXIgY3Vycl9zYW1wbGUgPSB7fTtcbiAgICAgIGZvcihqID0gMDsgaiA8IG1vbml0b3JlZF9wYXJhbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY3Vycl9zYW1wbGVbbW9uaXRvcmVkX3BhcmFtc1tqXV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZm9yKGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHtcbiAgICAgICAgaWYoaSAlIHRoaXMudGhpbm5pbmdfaW50ZXJ2YWwgPT09IDApIHtcbiAgICAgICAgICBmb3IoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW0gPSBtb25pdG9yZWRfcGFyYW1zW2pdO1xuICAgICAgICAgICAgY3Vycl9zYW1wbGVbcGFyYW1dLnB1c2goIGNsb25lX3BhcmFtX2RyYXcodGhpcy5zdGF0ZVtwYXJhbV0pICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RlcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJfc2FtcGxlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIG5faXRlcmF0aW9uIHN0ZXBzIGluIHBhcmFtZXRlciBzcGFjZSBidXQgcmV0dXJucyBub3RoaW5nLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLmJ1cm4gPSBmdW5jdGlvbihuX2l0ZXJhdGlvbnMpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcCgpO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBTZXRzIHdoYXQgcGFyYW1ldGVycyBzaG91bGQgYmUgbW9uaXRvcmVkIGFuZCByZXR1cm5lZCB3aGVuIGNhbGxpbmdcbiAgICogc2FtcGxlLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLm1vbml0b3IgPSBmdW5jdGlvbihwYXJhbXNfdG9fbW9uaXRvcikge1xuICAgICAgdGhpcy5tb25pdG9yZWRfcGFyYW1zID0gcGFyYW1zX3RvX21vbml0b3I7XG4gIH07XG4gIFxuICAvKipcbiAgICogU2V0cyB0aGUgdGhpbm5pbmcuIEZvciBleGFtcGxlIHRoaW4gPT0gMTAgbWVhbnMgdGhhdCBldmVyeSAxMHRoIHBvc3RlcmlvclxuICAgKiBkcmF3IHdpbGwgYmUga2VwdC5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS50aGluID0gZnVuY3Rpb24odGhpbm5pbmdfaW50ZXJ2YWwpIHtcbiAgICB0aGlzLnRoaW5uaW5nX2ludGVydmFsID0gdGhpbm5pbmdfaW50ZXJ2YWw7XG4gIH07XG4gIFxuICAvKipcbiAgICogU2V0cyBhZGFwdGF0aW9uIG9uLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0YXJ0X2FkYXB0YXRpb24oKTtcbiAgICB9XG4gIH07XG4gIFxuICAgIC8qKlxuICAgKiBTZXRzIGFkYXB0YXRpb24gb2ZmLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1NhbXBsZXJ9XG4gICAqIFRoaXMgc2FtcGxlciB1c2VzIHRoZSBBbXdnU3RlcHBlciBhcyB0aGUgc3RlcHBlciBmdW5jdGlvbiB3aGljaCBpbXBsZW1lbnRzIHRoZSBcbiAgICogQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluIFwiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQ1wiXG4gICAqIGJ5IFJvYmVydHMgYW5kIFJvc2VudGhhbCAoMjAwOCkuIEFuIGFkaXRpb24gaXMgdGhhdCBpdCBoYW5kbGVzIGludCBwYXJhbWV0ZXJzXG4gICAqIGJ5IG1ha2luZyBkaXNjcmV0ZSBOb3JtYWwgcHJvcG9zYWxzIGFuZCBiaW5hcnkgcGFyYW1ldGVycyBieSB0YWtpbmcgb24gYSBuZXcgXG4gICAqIHZhbHVlIHByb3BvcnRpb25hbCB0byB0aGUgcG9zdGVyaW9yIG9mIHRoZSB0d28gcG9zc2libGUgc3RhdGVzIG9mIHRoZVxuICAgKiBwYXJhbWV0ZXIuIFRoaXMgc2FtcGxlciBjYW4gYmUgZWZmaWNpZW50IHdoZW4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gICAqIGFyZSBub3QgdG9vIGhpZ2ggYW5kIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJhbWV0ZXJzIGFyZSBsb3cuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIG9uZSBvciBtb3JlIHBhcmFtZXRlciBkZWZpbml0aW9uc1xuICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLlxuICAqL1xuICB2YXIgQW13Z1NhbXBsZXIgPSBmdW5jdGlvbihwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKSB7XG4gICAgU2FtcGxlci5jYWxsKHRoaXMsIHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpO1xuICB9O1xuICBcbiAgQW13Z1NhbXBsZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTYW1wbGVyLnByb3RvdHlwZSk7IFxuICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU2FtcGxlcjtcbiAgXG4gIEFtd2dTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKXtcbiAgICByZXR1cm4gWyBuZXcgQW13Z1N0ZXBwZXIocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIF07XG4gIH07XG4gIFxuICBcbiAgLy8gUmV0dXJuaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgcHVibGljbHkgZXhwb3NlZCBieSB0aGlzIG1vZHVsZVxuICByZXR1cm4ge1xuICAgIHJ1bmlmOiBydW5pZixcbiAgICBydW5pZl9kaXNjcmV0ZTogcnVuaWZfZGlzY3JldGUsXG4gICAgcm5vcm06IHJub3JtLFxuICAgIHBhcmFtX2luaXRfZml4ZWQ6IHBhcmFtX2luaXRfZml4ZWQsIFxuICAgIGNvbXBsZXRlX3BhcmFtczogY29tcGxldGVfcGFyYW1zLCBcbiAgICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI6IFJlYWxNZXRyb3BvbGlzU3RlcHBlciwgXG4gICAgSW50TWV0cm9wb2xpc1N0ZXBwZXI6IEludE1ldHJvcG9saXNTdGVwcGVyLCBcbiAgICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjogTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsIFxuICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsIFxuICAgIEJpbmFyeVN0ZXBwZXI6IEJpbmFyeVN0ZXBwZXIsIFxuICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI6IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIsIFxuICAgIEFtd2dTdGVwcGVyOiBBbXdnU3RlcHBlciwgXG4gICAgQW13Z1NhbXBsZXI6IEFtd2dTYW1wbGVyXG4gIH07XG59KSk7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA9PSBudWxsIHx8IGIgPT0gbnVsbCA/IE5hTiA6IGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbnVtYmVyKHgpIHtcbiAgcmV0dXJuIHggPT09IG51bGwgPyBOYU4gOiAreDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBudW1iZXJzKHZhbHVlcywgdmFsdWVvZikge1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsICYmICh2YWx1ZSA9ICt2YWx1ZSkgPj0gdmFsdWUpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuaW1wb3J0IHBlcm11dGUgZnJvbSBcIi4vcGVybXV0ZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0KHZhbHVlcywgLi4uRikge1xuICBpZiAodHlwZW9mIHZhbHVlc1tTeW1ib2wuaXRlcmF0b3JdICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ2YWx1ZXMgaXMgbm90IGl0ZXJhYmxlXCIpO1xuICB2YWx1ZXMgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gIGxldCBbZl0gPSBGO1xuICBpZiAoKGYgJiYgZi5sZW5ndGggIT09IDIpIHx8IEYubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChkLCBpKSA9PiBpKTtcbiAgICBpZiAoRi5sZW5ndGggPiAxKSB7XG4gICAgICBGID0gRi5tYXAoZiA9PiB2YWx1ZXMubWFwKGYpKTtcbiAgICAgIGluZGV4LnNvcnQoKGksIGopID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIEYpIHtcbiAgICAgICAgICBjb25zdCBjID0gYXNjZW5kaW5nRGVmaW5lZChmW2ldLCBmW2pdKTtcbiAgICAgICAgICBpZiAoYykgcmV0dXJuIGM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmID0gdmFsdWVzLm1hcChmKTtcbiAgICAgIGluZGV4LnNvcnQoKGksIGopID0+IGFzY2VuZGluZ0RlZmluZWQoZltpXSwgZltqXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcGVybXV0ZSh2YWx1ZXMsIGluZGV4KTtcbiAgfVxuICByZXR1cm4gdmFsdWVzLnNvcnQoY29tcGFyZURlZmluZWQoZikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZURlZmluZWQoY29tcGFyZSA9IGFzY2VuZGluZykge1xuICBpZiAoY29tcGFyZSA9PT0gYXNjZW5kaW5nKSByZXR1cm4gYXNjZW5kaW5nRGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBjb21wYXJlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjb21wYXJlIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICBjb25zdCB4ID0gY29tcGFyZShhLCBiKTtcbiAgICBpZiAoeCB8fCB4ID09PSAwKSByZXR1cm4geDtcbiAgICByZXR1cm4gKGNvbXBhcmUoYiwgYikgPT09IDApIC0gKGNvbXBhcmUoYSwgYSkgPT09IDApO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNjZW5kaW5nRGVmaW5lZChhLCBiKSB7XG4gIHJldHVybiAoYSA9PSBudWxsIHx8ICEoYSA+PSBhKSkgLSAoYiA9PSBudWxsIHx8ICEoYiA+PSBiKSkgfHwgKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1heDtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1pbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1pbjtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pbjtcbn1cbiIsImltcG9ydCB7YXNjZW5kaW5nRGVmaW5lZCwgY29tcGFyZURlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vdXJuZXIvcXVpY2tzZWxlY3Rcbi8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWlja3NlbGVjdChhcnJheSwgaywgbGVmdCA9IDAsIHJpZ2h0ID0gSW5maW5pdHksIGNvbXBhcmUpIHtcbiAgayA9IE1hdGguZmxvb3Ioayk7XG4gIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTtcbiAgcmlnaHQgPSBNYXRoLmZsb29yKE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIHJpZ2h0KSk7XG5cbiAgaWYgKCEobGVmdCA8PSBrICYmIGsgPD0gcmlnaHQpKSByZXR1cm4gYXJyYXk7XG5cbiAgY29tcGFyZSA9IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IGFzY2VuZGluZ0RlZmluZWQgOiBjb21wYXJlRGVmaW5lZChjb21wYXJlKTtcblxuICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7XG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIHF1aWNrc2VsZWN0KGFycmF5LCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdCA9IGFycmF5W2tdO1xuICAgIGxldCBpID0gbGVmdDtcbiAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgc3dhcChhcnJheSwgbGVmdCwgayk7XG4gICAgaWYgKGNvbXBhcmUoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyYXksIGxlZnQsIHJpZ2h0KTtcblxuICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbaV0sIHQpIDwgMCkgKytpO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbal0sIHQpID4gMCkgLS1qO1xuICAgIH1cblxuICAgIGlmIChjb21wYXJlKGFycmF5W2xlZnRdLCB0KSA9PT0gMCkgc3dhcChhcnJheSwgbGVmdCwgaik7XG4gICAgZWxzZSArK2osIHN3YXAoYXJyYXksIGosIHJpZ2h0KTtcblxuICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICBpZiAoayA8PSBqKSByaWdodCA9IGogLSAxO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiBzd2FwKGFycmF5LCBpLCBqKSB7XG4gIGNvbnN0IHQgPSBhcnJheVtpXTtcbiAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgYXJyYXlbal0gPSB0O1xufVxuIiwiaW1wb3J0IG1heCBmcm9tIFwiLi9tYXguanNcIjtcbmltcG9ydCBtYXhJbmRleCBmcm9tIFwiLi9tYXhJbmRleC5qc1wiO1xuaW1wb3J0IG1pbiBmcm9tIFwiLi9taW4uanNcIjtcbmltcG9ydCBtaW5JbmRleCBmcm9tIFwiLi9taW5JbmRleC5qc1wiO1xuaW1wb3J0IHF1aWNrc2VsZWN0IGZyb20gXCIuL3F1aWNrc2VsZWN0LmpzXCI7XG5pbXBvcnQgbnVtYmVyLCB7bnVtYmVyc30gZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge2FzY2VuZGluZ0RlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcbmltcG9ydCBncmVhdGVzdCBmcm9tIFwiLi9ncmVhdGVzdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHtcbiAgdmFsdWVzID0gRmxvYXQ2NEFycmF5LmZyb20obnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpKTtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpO1xuICBpZiAocCA+PSAxKSByZXR1cm4gbWF4KHZhbHVlcyk7XG4gIHZhciBuLFxuICAgICAgaSA9IChuIC0gMSkgKiBwLFxuICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLFxuICAgICAgdmFsdWUwID0gbWF4KHF1aWNrc2VsZWN0KHZhbHVlcywgaTApLnN1YmFycmF5KDAsIGkwICsgMSkpLFxuICAgICAgdmFsdWUxID0gbWluKHZhbHVlcy5zdWJhcnJheShpMCArIDEpKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZVNvcnRlZCh2YWx1ZXMsIHAsIHZhbHVlb2YgPSBudW1iZXIpIHtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1swXSwgMCwgdmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1tuIC0gMV0sIG4gLSAxLCB2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9ICt2YWx1ZW9mKHZhbHVlc1tpMF0sIGkwLCB2YWx1ZXMpLFxuICAgICAgdmFsdWUxID0gK3ZhbHVlb2YodmFsdWVzW2kwICsgMV0sIGkwICsgMSwgdmFsdWVzKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZUluZGV4KHZhbHVlcywgcCwgdmFsdWVvZiA9IG51bWJlcikge1xuICBpZiAoaXNOYU4ocCA9ICtwKSkgcmV0dXJuO1xuICBudW1iZXJzID0gRmxvYXQ2NEFycmF5LmZyb20odmFsdWVzLCAoXywgaSkgPT4gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSk7XG4gIGlmIChwIDw9IDApIHJldHVybiBtaW5JbmRleChudW1iZXJzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heEluZGV4KG51bWJlcnMpO1xuICB2YXIgbnVtYmVycyxcbiAgICAgIGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChfLCBpKSA9PiBpKSxcbiAgICAgIGogPSBudW1iZXJzLmxlbmd0aCAtIDEsXG4gICAgICBpID0gTWF0aC5mbG9vcihqICogcCk7XG4gIHF1aWNrc2VsZWN0KGluZGV4LCBpLCAwLCBqLCAoaSwgaikgPT4gYXNjZW5kaW5nRGVmaW5lZChudW1iZXJzW2ldLCBudW1iZXJzW2pdKSk7XG4gIGkgPSBncmVhdGVzdChpbmRleC5zdWJhcnJheSgwLCBpICsgMSksIChpKSA9PiBudW1iZXJzW2ldKTtcbiAgcmV0dXJuIGkgPj0gMCA/IGkgOiAtMTtcbn1cbiIsImltcG9ydCBxdWFudGlsZSwge3F1YW50aWxlSW5kZXh9IGZyb20gXCIuL3F1YW50aWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgcmV0dXJuIHF1YW50aWxlKHZhbHVlcywgMC41LCB2YWx1ZW9mKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lZGlhbkluZGV4KHZhbHVlcywgdmFsdWVvZikge1xuICByZXR1cm4gcXVhbnRpbGVJbmRleCh2YWx1ZXMsIDAuNSwgdmFsdWVvZik7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHtcbiAgdGhpcy5rID0gaztcbiAgdGhpcy54ID0geDtcbiAgdGhpcy55ID0geTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zZm9ybSxcbiAgc2NhbGU6IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gayA9PT0gMSA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuayAqIGssIHRoaXMueCwgdGhpcy55KTtcbiAgfSxcbiAgdHJhbnNsYXRlOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIHggPT09IDAgJiB5ID09PSAwID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rLCB0aGlzLnggKyB0aGlzLmsgKiB4LCB0aGlzLnkgKyB0aGlzLmsgKiB5KTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHBvaW50KSB7XG4gICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldO1xuICB9LFxuICBhcHBseVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geCAqIHRoaXMuayArIHRoaXMueDtcbiAgfSxcbiAgYXBwbHlZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24obG9jYXRpb24pIHtcbiAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdO1xuICB9LFxuICBpbnZlcnRYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuICh4IC0gdGhpcy54KSAvIHRoaXMuaztcbiAgfSxcbiAgaW52ZXJ0WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiAoeSAtIHRoaXMueSkgLyB0aGlzLms7XG4gIH0sXG4gIHJlc2NhbGVYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7XG4gIH0sXG4gIHJlc2NhbGVZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkuY29weSgpLmRvbWFpbih5LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSwgdGhpcykubWFwKHkuaW52ZXJ0LCB5KSk7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyB0aGlzLnggKyBcIixcIiArIHRoaXMueSArIFwiKSBzY2FsZShcIiArIHRoaXMuayArIFwiKVwiO1xuICB9XG59O1xuXG5leHBvcnQgdmFyIGlkZW50aXR5ID0gbmV3IFRyYW5zZm9ybSgxLCAwLCAwKTtcblxudHJhbnNmb3JtLnByb3RvdHlwZSA9IFRyYW5zZm9ybS5wcm90b3R5cGU7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlKSB7XG4gIHdoaWxlICghbm9kZS5fX3pvb20pIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHJldHVybiBub2RlLl9fem9vbTtcbn1cbiIsIlxuLypcbiAgSFRETWF0aCBTdGF0aWMgQ2xhc3MgLSBOb3QgaW50ZW5kZWQgZm9yIGluc3RhbnRpYXRpb24hXG5cbiAgVmFyaWFibGVzOlxuICAgIEEgPSBhbW91bnRcbiAgICBEID0gZGVsYXlcbiAgICBWID0gc3ViamVjdGl2ZSB2YWx1ZVxuXG4gICAgayA9IGRpc2NvdW50IGZhY3RvclxuXG4gIEVxdWF0aW9uczpcbiAgICBWID0gQSAvICgxICsga0QpXG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSFRETWF0aCB7XG4gIHN0YXRpYyBhZGsydihhLCBkLCBrKSB7XG4gICAgcmV0dXJuIGEgLyAoMSArIGsgKiBkKTtcbiAgfVxuXG4gIHN0YXRpYyBhZHYyayhhLCBkLCB2KSB7XG4gICAgcmV0dXJuIChhIC0gdikgLyAodiAqIGQpO1xuICB9XG59XG4iLCJcbi8vIEludGVybmFsIGRlcGVuZGVuY2llc1xuaW1wb3J0IEhURE1hdGggZnJvbSAnLi9odGQtbWF0aCc7XG5cbmV4cG9ydCBkZWZhdWx0IEhURE1hdGg7XG4iLCIvKiBlc2xpbnQgbm8tcmVzdHJpY3RlZC1nbG9iYWxzOiBbXCJvZmZcIiwgXCJzZWxmXCJdICovXG5cbi8vIE5lZWRlZCBmb3IgZDMgaW4gV2ViV29ya2VyIVxuaW1wb3J0ICdyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUnO1xuXG5pbXBvcnQgKiBhcyBCYXllc0Rpc3RyaWJ1dGlvbnMgZnJvbSAnYmF5ZXMuanMvZGlzdHJpYnV0aW9ucyc7XG5pbXBvcnQgKiBhcyBCYXllc01jbWMgZnJvbSAnYmF5ZXMuanMvbWNtYyc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgSFRETWF0aCBmcm9tICdAZGVjaWRhYmxlcy9kaXNjb3VudGFibGUtbWF0aCc7XG5cbnNlbGYub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBrOiB7dHlwZTogJ3JlYWwnLCBsb3dlcjogMCwgdXBwZXI6IDEwMH0sXG4gICAgbHVjZToge3R5cGU6ICdyZWFsJywgbG93ZXI6IDAsIHVwcGVyOiAxMDB9LFxuICB9O1xuXG4gIGNvbnN0IGxvZ1Bvc3QgPSAoc3RhdGUsIGRhdGEpID0+IHtcbiAgICBsZXQgbHAgPSAwO1xuXG4gICAgLy8gUHJpb3JzXG4gICAgY29uc3Qga01lYW4gPSAyO1xuICAgIGNvbnN0IGtTaGFwZSA9IDM7XG4gICAgbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLmdhbW1hKFxuICAgICAgc3RhdGUuayxcbiAgICAgIGtTaGFwZSxcbiAgICAgIGtTaGFwZSAvIGtNZWFuLFxuICAgICk7XG4gICAgLy8gbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLnVuaWYoc3RhdGUuaywgMCwgMTAwKTtcblxuICAgIGNvbnN0IGx1Y2VNZWFuID0gMjtcbiAgICBjb25zdCBsdWNlU2hhcGUgPSAzO1xuICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5nYW1tYShcbiAgICAgIHN0YXRlLmx1Y2UsXG4gICAgICBsdWNlU2hhcGUsXG4gICAgICBsdWNlU2hhcGUgLyBsdWNlTWVhbixcbiAgICApO1xuICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7XG5cbiAgICAvLyBMaWtlbGlob29kXG4gICAgZGF0YS5mb3JFYWNoKChjaG9pY2UpID0+IHtcbiAgICAgIC8vIFZhbHVlc1xuICAgICAgY29uc3QgdnMgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hcywgY2hvaWNlLmRzLCBzdGF0ZS5rKTtcbiAgICAgIGNvbnN0IHZsID0gSFRETWF0aC5hZGsydihjaG9pY2UuYWwsIGNob2ljZS5kbCwgc3RhdGUuayk7XG5cbiAgICAgIC8vIENob2ljZSBvZiBzb29uZXIgb3IgbGF0ZXIgaXMgc2FtcGxlZCBmcm9tIGEgQmVybm91bGxpIGRpc3RyaWJ1dGlvblxuICAgICAgLy8gTHVjZSBjaG9pY2UgcnVsZSBpcyB1c2VkIHRvIGNvbXB1dGUgcHJvYmFiaWxpdHkgb2Ygd2FpdGluZyEgKDAgPSBzb29uZXIsIDEgPSBsYXRlcilcbiAgICAgIGNvbnN0IGJpbnZhbCA9IDEgLyAoMSArIE1hdGguZXhwKHN0YXRlLmx1Y2UgKiAodnMgLSB2bCkpKTtcblxuICAgICAgLy8gQWN0dWFsIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZSA9IChjaG9pY2UucmVzcG9uc2UgPT09ICdmaXJzdCcpID8gMCA6IDE7XG5cbiAgICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5iZXJuKHJlc3BvbnNlLCBiaW52YWwpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxwO1xuICB9O1xuXG4gIC8vIEluaXRpYWxpemluZyB0aGUgc2FtcGxlclxuICBjb25zdCBzYW1wbGVyID0gbmV3IEJheWVzTWNtYy5BbXdnU2FtcGxlcihwYXJhbXMsIGxvZ1Bvc3QsIGV2ZW50LmRhdGEpO1xuICAvLyBCdXJuaW5nIHNvbWUgc2FtcGxlcyB0byB0aGUgTUNNQyBnb2RzIGFuZCBzYW1wbGluZyA1MDAwIGRyYXdzXG4gIHNhbXBsZXIuYnVybigxMDAwKTtcbiAgY29uc3Qgc2FtcGxlcyA9IHNhbXBsZXIuc2FtcGxlKDUwMDApO1xuXG4gIC8vIEV4dHJhY3Qgc3VtbWFyeSBzdGF0c1xuICBjb25zdCByZXN1bHRzID0ge1xuICAgIGs6IGQzLm1lZGlhbihzYW1wbGVzLmspLFxuICAgIGx1Y2U6IGQzLm1lZGlhbihzYW1wbGVzLmx1Y2UpLFxuICB9O1xuXG4gIHNlbGYucG9zdE1lc3NhZ2Uoe3Jlc3VsdHM6IHJlc3VsdHMsIHNhbXBsZXM6IHNhbXBsZXN9KTtcbn07XG4iXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJtb2R1bGUiLCJleHBvcnRzIiwibGQiLCJ0aGlzIiwibGdhbW1hIiwieCIsImoiLCJjb2YiLCJzZXIiLCJ4eCIsInkiLCJ0bXAiLCJsb2ciLCJsZmFjdG9yaWFsIiwibiIsIk5hTiIsImxjaG9vc2UiLCJrIiwibGJldGEiLCJhIiwiYiIsIk1hdGgiLCJleHAiLCJhYnMiLCJwb3ciLCJzcXJ0IiwicGkiLCJQSSIsImJldGEiLCJzaGFwZTEiLCJzaGFwZTIiLCJJbmZpbml0eSIsImNhdWNoeSIsImxvY2F0aW9uIiwic2NhbGUiLCJub3JtIiwibWVhbiIsInNkIiwiYml2YXJub3JtIiwiY29yciIsInoiLCJub3JtYWxpemluZ19mYWN0b3IiLCJiaXZhcl9sb2dfZGVucyIsImxhcGxhY2UiLCJkZXhwIiwiZ2FtbWEiLCJzaGFwZSIsInJhdGUiLCJpbnZnYW1tYSIsImxub3JtIiwibWVhbmxvZyIsInNkbG9nIiwicGFyZXRvIiwidCIsImRmIiwid2VpYnVsbCIsInRtcDEiLCJ0bXAyIiwibG9naXMiLCJlIiwiZiIsImRpcmljaGxldCIsImFscGhhIiwic3VtX2FscGhhIiwic3VtX2xnYW1tYV9hbHBoYSIsInN1bV9hbHBoYV9zdWJfMV9sb2dfeCIsImxlbmd0aCIsImkiLCJ1bmlmIiwibWluIiwibWF4IiwiYmVybiIsInByb2IiLCJjYXQiLCJwcm9icyIsImJpbm9tIiwic2l6ZSIsIm5iaW5vbSIsImh5cGVyIiwibSIsInBvaXMiLCJsYW1iZGEiLCJtY21jIiwicnVuaWYiLCJyYW5kb20iLCJydW5pZl9kaXNjcmV0ZSIsImZsb29yIiwicm5vcm0iLCJ1IiwidiIsInEiLCJkZWVwX2Nsb25lIiwic3JjIiwibWl4aW4iLCJkZXN0Iiwic291cmNlIiwiY29weUZ1bmMiLCJuYW1lIiwicyIsImVtcHR5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwibm9kZVR5cGUiLCJjbG9uZU5vZGUiLCJEYXRlIiwiZ2V0VGltZSIsIlJlZ0V4cCIsInIiLCJsIiwiQXJyYXkiLCJwdXNoIiwiY29uc3RydWN0b3IiLCJjbG9uZV9wYXJhbV9kcmF3IiwiaXNBcnJheSIsInhfY29weSIsInNsaWNlIiwiaXNfbnVtYmVyIiwib2JqZWN0IiwiTnVtYmVyIiwiY3JlYXRlX2FycmF5IiwiZGltIiwiaW5pdCIsImFyciIsImFycmF5X2RpbSIsImNvbmNhdCIsImFycmF5X2VxdWFsIiwiYTEiLCJhMiIsIm5lc3RlZF9hcnJheV9hcHBseSIsImZ1biIsInJlc3VsdCIsInNodWZmbGVfYXJyYXkiLCJhcnJheSIsInRlbXAiLCJuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5IiwibGVuIiwiYXJyYXlfaXMiLCJhcnJheV9pIiwiZ2V0X29wdGlvbiIsIm9wdGlvbl9uYW1lIiwib3B0aW9ucyIsImRlZmF1bF92YWx1ZSIsImhhc093blByb3BlcnR5IiwidW5kZWZpbmVkIiwiZ2V0X211bHRpZGltX29wdGlvbiIsInZhbHVlIiwicGFyYW1faW5pdF9maXhlZCIsInR5cGUiLCJsb3dlciIsInVwcGVyIiwicm91bmQiLCJjb21wbGV0ZV9wYXJhbXMiLCJwYXJhbXNfdG9fY29tcGxldGUiLCJwYXJhbV9pbml0IiwicGFyYW1zIiwicGFyYW1fbmFtZSIsInBhcmFtIiwiU3RlcHBlciIsInN0YXRlIiwibG9nX3Bvc3QiLCJzdGVwIiwic3RhcnRfYWRhcHRhdGlvbiIsInN0b3BfYWRhcHRhdGlvbiIsImluZm8iLCJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciIsImdlbmVyYXRlX3Byb3Bvc2FsIiwicGFyYW1fbmFtZXMiLCJrZXlzIiwicHJvcF9sb2dfc2NhbGUiLCJiYXRjaF9zaXplIiwibWF4X2FkYXB0YXRpb24iLCJpbml0aWFsX2FkYXB0YXRpb24iLCJ0YXJnZXRfYWNjZXB0X3JhdGUiLCJpc19hZGFwdGluZyIsImFjY2VwdGFuY2VfY291bnQiLCJiYXRjaF9jb3VudCIsIml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24iLCJjcmVhdGUiLCJwYXJhbV9zdGF0ZSIsInBhcmFtX3Byb3Bvc2FsIiwiY3Vycl9sb2dfZGVucyIsInByb3BfbG9nX2RlbnMiLCJhY2NlcHRfcHJvYiIsImxvZ19zZF9hZGp1c3RtZW50Iiwibm9ybWFsX3Byb3Bvc2FsIiwiUmVhbE1ldHJvcG9saXNTdGVwcGVyIiwiZGlzY3JldGVfbm9ybWFsX3Byb3Bvc2FsIiwiSW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiU3ViU3RlcHBlciIsImNyZWF0ZV9zdWJzdGVwcGVycyIsInN1YnN0YXRlIiwic3Vic3RlcHBlcnMiLCJzdWJvcHRpb25zIiwic3VicGFyYW0iLCJzdWJzdGVwcGVyIiwiTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiQmluYXJ5U3RlcHBlciIsInplcm9fbG9nX2RlbnMiLCJvbmVfbG9nX2RlbnMiLCJtYXhfbG9nX2RlbnMiLCJ6ZXJvX3Byb2IiLCJCaW5hcnlDb21wb25lbnRTdGVwcGVyIiwic3VicGFyYW1zIiwiQW13Z1N0ZXBwZXIiLCJTZWxlY3RTdGVwcGVyIiwicGFyYW1fb2JqZWN0X3dyYXAiLCJwYXJhbV9vcHRpb25zIiwiU2FtcGxlciIsImRhdGEiLCJwYXJhbV9pbml0X2Z1biIsInRoaW5uaW5nX2ludGVydmFsIiwicGFyYW1zX3RvX21vbml0b3IiLCJ0aGluIiwibW9uaXRvciIsInN0ZXBwZXJzIiwiY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUiLCJzYW1wbGUiLCJuX2l0ZXJhdGlvbnMiLCJtb25pdG9yZWRfcGFyYW1zIiwiY3Vycl9zYW1wbGUiLCJidXJuIiwiQW13Z1NhbXBsZXIiLCJhc2NlbmRpbmciLCJudW1iZXJzIiwidmFsdWVzIiwidmFsdWVvZiIsImluZGV4IiwiY29tcGFyZURlZmluZWQiLCJjb21wYXJlIiwiYXNjZW5kaW5nRGVmaW5lZCIsIlR5cGVFcnJvciIsInF1aWNrc2VsZWN0IiwibGVmdCIsInJpZ2h0IiwibmV3TGVmdCIsIm5ld1JpZ2h0Iiwic3dhcCIsInF1YW50aWxlIiwicCIsIkZsb2F0NjRBcnJheSIsImZyb20iLCJpc05hTiIsImkwIiwidmFsdWUwIiwic3ViYXJyYXkiLCJ2YWx1ZTEiLCJtZWRpYW4iLCJUcmFuc2Zvcm0iLCJ0cmFuc2xhdGUiLCJhcHBseSIsInBvaW50IiwiYXBwbHlYIiwiYXBwbHlZIiwiaW52ZXJ0IiwiaW52ZXJ0WCIsImludmVydFkiLCJyZXNjYWxlWCIsImNvcHkiLCJkb21haW4iLCJyYW5nZSIsIm1hcCIsInJlc2NhbGVZIiwiSFRETWF0aCIsImFkazJ2IiwiZCIsImFkdjJrIiwic2VsZiIsIm9ubWVzc2FnZSIsImV2ZW50IiwibHVjZSIsImxvZ1Bvc3QiLCJscCIsImtNZWFuIiwia1NoYXBlIiwiQmF5ZXNEaXN0cmlidXRpb25zIiwibHVjZU1lYW4iLCJsdWNlU2hhcGUiLCJmb3JFYWNoIiwiY2hvaWNlIiwidnMiLCJhcyIsImRzIiwidmwiLCJhbCIsImRsIiwiYmludmFsIiwicmVzcG9uc2UiLCJzYW1wbGVyIiwiQmF5ZXNNY21jIiwic2FtcGxlcyIsInJlc3VsdHMiLCJkMyIsInBvc3RNZXNzYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Q0FHQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FPQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7R0FDQyxDQUFVQSxVQUFBQSxJQUFJLEVBQUVDLE9BQU8sRUFBRTtLQUlmLElBQWtDQyxNQUFNLENBQUNDLE9BQU8sRUFBRTtDQUM3RDtDQUNBO0NBQ0E7Q0FDUUQsTUFBQUEsTUFBQSxDQUFBQyxPQUFBLEdBQWlCRixPQUFPLEVBQUUsQ0FBQTtDQUNsQyxLQUFLLE1BQU07Q0FDWDtDQUNRRCxNQUFBQSxJQUFJLENBQUNJLEVBQUUsR0FBR0gsT0FBTyxFQUFFLENBQUE7Q0FDeEIsS0FBQTtDQUNILEdBQUMsRUFBQ0ksY0FBSSxFQUFFLFlBQVc7Q0FDbkI7S0FDRSxJQUFJRCxFQUFFLEdBQUksRUFBRSxDQUFBOztDQUVkO0NBQ0E7O0NBRUUsSUFBQSxJQUFJRSxNQUFNLEdBQUcsVUFBU0MsQ0FBQyxFQUFFO09BQ3ZCLElBQUlDLENBQUMsR0FBRyxDQUFDLENBQUE7Q0FDVCxNQUFBLElBQUlDLEdBQUcsR0FBRyxDQUNSLGlCQUFpQixFQUFFLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQ3hELENBQUMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxrQkFBa0IsQ0FDL0QsQ0FBQTtPQUNELElBQUlDLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQTtDQUMzQixNQUFBLElBQUlDLEVBQUUsRUFBRUMsQ0FBQyxFQUFFQyxHQUFHLENBQUE7T0FDZEEsR0FBRyxHQUFHLENBQUNELENBQUMsR0FBR0QsRUFBRSxHQUFHSixDQUFDLElBQUks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QkFBd0IsQ0FDNUJ0SCxLQUFLLENBQUNpSCxJQUFJLEVBQ1ZPLFNBQVMsRUFDVEEsU0FBUyxHQUFHRCxRQUNkLENBQUMsQ0FBQTtDQUNEOztDQUVBO0NBQ0FuRSxJQUFBQSxJQUFJLENBQUNxRSxPQUFPLENBQUVDLE1BQU0sSUFBSztDQUN2QjtDQUNBLE1BQUEsTUFBTUMsRUFBRSxHQUFHakIsT0FBTyxDQUFDQyxLQUFLLENBQUNlLE1BQU0sQ0FBQ0UsRUFBRSxFQUFFRixNQUFNLENBQUNHLEVBQUUsRUFBRTdILEtBQUssQ0FBQy9JLENBQUMsQ0FBQyxDQUFBO0NBQ3ZELE1BQUEsTUFBTTZRLEVBQUUsR0FBR3BCLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDZSxNQUFNLENBQUNLLEVBQUUsRUFBRUwsTUFBTSxDQUFDTSxFQUFFLEVBQUVoSSxLQUFLLENBQUMvSSxDQUFDLENBQUMsQ0FBQTs7Q0FFdkQ7Q0FDQTtDQUNBLE1BQUEsTUFBTWdSLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHNVEsSUFBSSxDQUFDQyxHQUFHLENBQUMwSSxLQUFLLENBQUNpSCxJQUFJLElBQUlVLEVBQUUsR0FBR0csRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBOztDQUV6RDtPQUNBLE1BQU1JLFFBQVEsR0FBSVIsTUFBTSxDQUFDUSxRQUFRLEtBQUssT0FBTyxHQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7T0FFdERmLEVBQUUsSUFBSUcseUJBQXVCLENBQUNZLFFBQVEsRUFBRUQsTUFBTSxDQUFDLENBQUE7Q0FDakQsS0FBQyxDQUFDLENBQUE7Q0FFRixJQUFBLE9BQU9kLEVBQUUsQ0FBQTtJQUNWLENBQUE7O0NBRUQ7Q0FDQSxFQUFBLE1BQU1nQixPQUFPLEdBQUcsSUFBSUMsdUJBQXFCLENBQUN4SSxNQUFNLEVBQUVzSCxPQUFPLEVBQUVGLEtBQUssQ0FBQzVELElBQUksQ0FBQyxDQUFBO0NBQ3RFO0NBQ0ErRSxFQUFBQSxPQUFPLENBQUNuRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7Q0FDbEIsRUFBQSxNQUFNcUUsT0FBTyxHQUFHRixPQUFPLENBQUN2RSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7O0NBRXBDO0NBQ0EsRUFBQSxNQUFNMEUsT0FBTyxHQUFHO0tBQ2RyUixDQUFDLEVBQUVzUixNQUFTLENBQUNGLE9BQU8sQ0FBQ3BSLENBQUMsQ0FBQztDQUN2QmdRLElBQUFBLElBQUksRUFBRXNCLE1BQVMsQ0FBQ0YsT0FBTyxDQUFDcEIsSUFBSSxDQUFBO0lBQzdCLENBQUE7R0FFREgsSUFBSSxDQUFDMEIsV0FBVyxDQUFDO0NBQUNGLElBQUFBLE9BQU8sRUFBRUEsT0FBTztDQUFFRCxJQUFBQSxPQUFPLEVBQUVBLE9BQUFBO0NBQU8sR0FBQyxDQUFDLENBQUE7Q0FDeEQsQ0FBQzs7Ozs7OyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMiwzLDQsNSw2LDcsOCw5LDEwXX0=', false);
22086
+ var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewoJJ3VzZSBzdHJpY3QnOwoKCXZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9OwoKCXZhciBkaXN0cmlidXRpb25zID0ge2V4cG9ydHM6IHt9fTsKCgkoZnVuY3Rpb24gKG1vZHVsZSkgewoKCSAgLy8gQSBudW1iZXIgb2YgbG9nIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb25zIChQREYpLiBOYW1pbmcgYW5kIHBhcmFtZXRlcml6YXRpb24KCSAgLy8gc2hvdWxkIG1hdGNoIFIncywgZXhjZXB0IGZvciB0aGF0IGFsbCBmdW5jdGlvbnMgcmVzaWRlIGluIGFuIGxkIG9iamVjdCAoCgkgIC8vIGFzIGluICJsb2cgZGVuc2l0eSIpLCBzbyB0byBnZXQgYSBub3JtYWwgbG9nIGRlbnNpdHkgeW91IHdvdWxkIHdyaXRlCgkgIC8vIGxkLm5vcm0oLi4uKS4KCSAgLy8gTW9zdCBvZiB0aGUgY29kZSBiZWxvdyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBncmVhdCBKc3RhdCBwcm9qZWN0CgkgIC8vIChodHRwczovL2dpdGh1Yi5jb20vanN0YXQvKSB3aGljaCBpbmNsdWRlcyBQREYgZm9yIG1hbnkgY29tbW9uIHByb2JhYmlsaXR5CgkgIC8vIGRpc3RyaWJ1dGlvbnMuIFdoYXQgSSBoYXZlIGRvbmUgaXMgb25seSB0byBjb252ZXJ0IHRoZXNlIHRvIGxvZyBQREZzLgoKCSAgLyoKCSAgT3JpZ2luYWwgd29yayBDb3B5cmlnaHQgKGMpIDIwMTMgalN0YXQKCSAgTW9kaWZpZWQgd29yayBDb3B5cmlnaHQgKGMpIDIwMTUgUmFzbXVzIELDpcOldGggCgkgIAlQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CgkgIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCgkgIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKCSAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAoJICBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKCSAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCSAgCVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCgkgIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoJICAJVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKCSAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCgkgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQoJICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCgkgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCgkgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KCSAgVEhFIFNPRlRXQVJFLgoJICAJKi8KCgkgIC8vIFRoaXMgYm9pbGVyIHBsYXRlIGNvZGUgaGVyZSBpcyB0YWtlbiBmcm9tOgoJICAvLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzCgkgIC8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLAoJICAvLyBOb2RlLCBhbmQgYnkgdXNpbmcgdGhlIEFzeW5jaHJvbm91cyBNb2R1bGUgRGVmaW5pdGlvbiBzdGFuZGFyZC4KCSAgLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsCgkgIC8vIG9iamVjdCBsZCAuCgkgIChmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewoJICAgIGlmIChtb2R1bGUuZXhwb3J0cykgewoJICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CgkgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKCSAgICAgIC8vIGxpa2UgTm9kZS4KCSAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KQoJICAgICAgcm9vdC5sZCA9IGZhY3RvcnkoKTsKCSAgICB9CgkgIH0pKGNvbW1vbmpzR2xvYmFsLCBmdW5jdGlvbiAoKSB7CgkgICAgLy8gT2JqZWN0IHRvIGhvbGQgdGhlIGZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZC4KCSAgICB2YXIgbGQgPSB7fTsKCgkgICAgLy8vLy8vLy8vLyBIZWxwZXIgZnVuY3Rpb25zIC8vLy8vLy8vLy8KCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCSAgICB2YXIgbGdhbW1hID0gZnVuY3Rpb24gKHgpIHsKCSAgICAgIHZhciBqID0gMDsKCSAgICAgIHZhciBjb2YgPSBbNzYuMTgwMDkxNzI5NDcxNDYsIC04Ni41MDUzMjAzMjk0MTY3NywgMjQuMDE0MDk4MjQwODMwOTEsIC0xLjIzMTczOTU3MjQ1MDE1NSwgMC4xMjA4NjUwOTczODY2MTc5ZS0yLCAtMC41Mzk1MjM5Mzg0OTUzZS01XTsKCSAgICAgIHZhciBzZXIgPSAxLjAwMDAwMDAwMDE5MDAxNTsKCSAgICAgIHZhciB4eCwgeSwgdG1wOwoJICAgICAgdG1wID0gKHkgPSB4eCA9IHgpICsgNS41OwoJICAgICAgdG1wIC09ICh4eCArIDAuNSkgKiBsb2codG1wKTsKCSAgICAgIGZvciAoOyBqIDwgNjsgaisrKSBzZXIgKz0gY29mW2pdIC8gKyt5OwoJICAgICAgcmV0dXJuIGxvZygyLjUwNjYyODI3NDYzMTAwMDUgKiBzZXIgLyB4eCkgLSB0bXA7CgkgICAgfTsKCSAgICBsZC5sZ2FtbWEgPSBsZ2FtbWE7CgkgICAgdmFyIGxmYWN0b3JpYWwgPSBmdW5jdGlvbiAobikgewoJICAgICAgcmV0dXJuIG4gPCAwID8gTmFOIDogbGdhbW1hKG4gKyAxKTsKCSAgICB9OwoJICAgIGxkLmxmYWN0b3JpYWwgPSBsZmFjdG9yaWFsOwoJICAgIHZhciBsY2hvb3NlID0gZnVuY3Rpb24gKG4sIGspIHsKCSAgICAgIHJldHVybiBsZmFjdG9yaWFsKG4pIC0gbGZhY3RvcmlhbChrKSAtIGxmYWN0b3JpYWwobiAtIGspOwoJICAgIH07CgkgICAgbGQubGNob29zZSA9IGxjaG9vc2U7CgkgICAgdmFyIGxiZXRhID0gZnVuY3Rpb24gKGEsIGIpIHsKCSAgICAgIHJldHVybiBsZ2FtbWEoYSkgKyBsZ2FtbWEoYikgLSBsZ2FtbWEoYSArIGIpOwoJICAgIH07CgkgICAgbGQubGJldGEgPSBsYmV0YTsKCSAgICB2YXIgbG9nID0gTWF0aC5sb2c7CgkgICAgdmFyIGV4cCA9IE1hdGguZXhwOwoJICAgIHZhciBhYnMgPSBNYXRoLmFiczsKCSAgICB2YXIgcG93ID0gTWF0aC5wb3c7CgkgICAgdmFyIHNxcnQgPSBNYXRoLnNxcnQ7CgkgICAgdmFyIHBpID0gTWF0aC5QSTsKCgkgICAgLy8vLy8vLy8vLyBDb250aW5vdXMgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJICAgIGxkLmJldGEgPSBmdW5jdGlvbiAoeCwgc2hhcGUxLCBzaGFwZTIpIHsKCSAgICAgIGlmICh4ID4gMSB8fCB4IDwgMCkgewoJICAgICAgICByZXR1cm4gLUluZmluaXR5OwoJICAgICAgfQoJICAgICAgaWYgKHNoYXBlMSA9PT0gMSAmJiBzaGFwZTIgPT09IDEpIHsKCSAgICAgICAgcmV0dXJuIDA7CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXR1cm4gKHNoYXBlMSAtIDEpICogbG9nKHgpICsgKHNoYXBlMiAtIDEpICogbG9nKDEgLSB4KSAtIGxiZXRhKHNoYXBlMSwgc2hhcGUyKTsKCSAgICAgIH0KCSAgICB9OwoJICAgIGxkLmNhdWNoeSA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKCSAgICAgIHJldHVybiBsb2coc2NhbGUpIC0gbG9nKHBvdyh4IC0gbG9jYXRpb24sIDIpICsgcG93KHNjYWxlLCAyKSkgLSBsb2cocGkpOwoJICAgIH07CgkgICAgbGQubm9ybSA9IGZ1bmN0aW9uICh4LCBtZWFuLCBzZCkgewoJICAgICAgcmV0dXJuIC0wLjUgKiBsb2coMiAqIHBpKSAtIGxvZyhzZCkgLSBwb3coeCAtIG1lYW4sIDIpIC8gKDIgKiBzZCAqIHNkKTsKCSAgICB9OwoKCSAgICAvLyBBIGJpdmFyaWF0ZSBOb3JtYWwgZGlzdHJpYnV0aW9uIHBhcmFtZXRlcml6ZWQgYnkgYXJyYXlzIG9mIHR3byBtZWFucyBhbmQgU0RzLCBhbmQgCgkgICAgLy8gdGhlIGNvcnJlbGF0aW9uLgoJICAgIGxkLmJpdmFybm9ybSA9IGZ1bmN0aW9uICh4LCBtZWFuLCBzZCwgY29ycikgewoJICAgICAgdmFyIHogPSBwb3coeFswXSAtIG1lYW5bMF0sIDIpIC8gcG93KHNkWzBdLCAyKSArIHBvdyh4WzFdIC0gbWVhblsxXSwgMikgLyBwb3coc2RbMV0sIDIpIC0gMiAqIGNvcnIgKiAoeFswXSAtIG1lYW5bMF0pICogKHhbMV0gLSBtZWFuWzFdKSAvIChzZFswXSAqIHNkWzFdKTsKCSAgICAgIHZhciBub3JtYWxpemluZ19mYWN0b3IgPSAtKGxvZygyKSArIGxvZyhwaSkgKyBsb2coc2RbMF0pICsgbG9nKHNkWzFdKSArIDAuNSAqIGxvZygxIC0gcG93KGNvcnIsIDIpKSk7CgkgICAgICB2YXIgYml2YXJfbG9nX2RlbnMgPSBub3JtYWxpemluZ19mYWN0b3IgLSB6IC8gKDIgKiAoMSAtIHBvdyhjb3JyLCAyKSkpOwoJICAgICAgcmV0dXJuIGJpdmFyX2xvZ19kZW5zOwoJICAgIH07CgkgICAgbGQubGFwbGFjZSA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKCSAgICAgIHJldHVybiAtYWJzKHggLSBsb2NhdGlvbikgLyBzY2FsZSAtIGxvZygyICogc2NhbGUpOwoJICAgIH07CgkgICAgbGQuZGV4cCA9IGxkLmxhcGxhY2U7CgkgICAgbGQuZ2FtbWEgPSBmdW5jdGlvbiAoeCwgc2hhcGUsIHJhdGUpIHsKCSAgICAgIHZhciBzY2FsZSA9IDEgLyByYXRlOwoJICAgICAgaWYgKHggPCAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICBpZiAoeCA9PT0gMCAmJiBzaGFwZSA9PT0gMSkgewoJICAgICAgICByZXR1cm4gLWxvZyhzY2FsZSk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXR1cm4gKHNoYXBlIC0gMSkgKiBsb2coeCkgLSB4IC8gc2NhbGUgLSBsZ2FtbWEoc2hhcGUpIC0gc2hhcGUgKiBsb2coc2NhbGUpOwoJICAgICAgfQoJICAgIH07CgkgICAgbGQuaW52Z2FtbWEgPSBmdW5jdGlvbiAoeCwgc2hhcGUsIHNjYWxlKSB7CgkgICAgICBpZiAoeCA8PSAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gLShzaGFwZSArIDEpICogbG9nKHgpIC0gc2NhbGUgLyB4IC0gbGdhbW1hKHNoYXBlKSArIHNoYXBlICogbG9nKHNjYWxlKTsKCSAgICB9OwoJICAgIGxkLmxub3JtID0gZnVuY3Rpb24gKHgsIG1lYW5sb2csIHNkbG9nKSB7CgkgICAgICBpZiAoeCA8PSAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gLWxvZyh4KSAtIDAuNSAqIGxvZygyICogcGkpIC0gbG9nKHNkbG9nKSAtIHBvdyhsb2coeCkgLSBtZWFubG9nLCAyKSAvICgyICogc2Rsb2cgKiBzZGxvZyk7CgkgICAgfTsKCSAgICBsZC5wYXJldG8gPSBmdW5jdGlvbiAoeCwgc2NhbGUsIHNoYXBlKSB7CgkgICAgICBpZiAoeCA8IHNjYWxlKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gbG9nKHNoYXBlKSArIHNoYXBlICogbG9nKHNjYWxlKSAtIChzaGFwZSArIDEpICogbG9nKHgpOwoJICAgIH07CgkgICAgbGQudCA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUsIGRmKSB7CgkgICAgICBkZiA9IGRmID4gMWUxMDAgPyAxZTEwMCA6IGRmOwoJICAgICAgcmV0dXJuIGxnYW1tYSgoZGYgKyAxKSAvIDIpIC0gbGdhbW1hKGRmIC8gMikgLSBsb2coc3FydChwaSAqIGRmKSAqIHNjYWxlKSArIGxvZyhwb3coMSArIDEgLyBkZiAqIHBvdygoeCAtIGxvY2F0aW9uKSAvIHNjYWxlLCAyKSwgLShkZiArIDEpIC8gMikpOwoJICAgIH07CgoJICAgIC8vIFRoaXMgaXMgYSBkaXJlY3QgamF2YXNjcmlwdCB0cmFuc2xhdGlvbiBvZiB0aGUgUiBjb2RlIHVzZWQgdG8gZXZhbHVhdGUKCSAgICAvLyB0aGUgbG9nIGRlbnNpdHkgb2YgYSB3ZWlidWxsIGRpc3RyaWJ1dGlvbjogCgkgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2R3ZWlidWxsLmMKCSAgICBsZC53ZWlidWxsID0gZnVuY3Rpb24gKHgsIHNoYXBlLCBzY2FsZSkgewoJICAgICAgaWYgKHggPCAwKSByZXR1cm4gLUluZmluaXR5OwoJICAgICAgaWYgKHggPT09IDAgJiYgc2hhcGUgPCAxKSByZXR1cm4gSW5maW5pdHk7CgkgICAgICB2YXIgdG1wMSA9IHBvdyh4IC8gc2NhbGUsIHNoYXBlIC0gMSk7CgkgICAgICB2YXIgdG1wMiA9IHRtcDEgKiAoeCAvIHNjYWxlKTsKCSAgICAgIHJldHVybiAtdG1wMiArIGxvZyhzaGFwZSAqIHRtcDEgLyBzY2FsZSk7CgkgICAgfTsKCgkgICAgLy8gVGhpcyBpcyBhIGRpcmVjdCBqYXZhc2NyaXB0IHRyYW5zbGF0aW9uIG9mIHRoZSBSIGNvZGUgdXNlZCB0byBldmFsdWF0ZQoJICAgIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIGxvZ2lzdGljIGRpc3RyaWJ1dGlvbjogCgkgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2Rsb2dpcy5jCgkgICAgbGQubG9naXMgPSBmdW5jdGlvbiAoeCwgbG9jYXRpb24sIHNjYWxlKSB7CgkgICAgICB4ID0gYWJzKCh4IC0gbG9jYXRpb24pIC8gc2NhbGUpOwoJICAgICAgdmFyIGUgPSBleHAoLXgpOwoJICAgICAgdmFyIGYgPSAxLjAgKyBlOwoJICAgICAgcmV0dXJuIC0oeCArIGxvZyhzY2FsZSAqIGYgKiBmKSk7CgkgICAgfTsKCSAgICBsZC5kaXJpY2hsZXQgPSBmdW5jdGlvbiAoeCwgYWxwaGEpIHsKCSAgICAgIHZhciBzdW1fYWxwaGEgPSAwOwoJICAgICAgdmFyIHN1bV9sZ2FtbWFfYWxwaGEgPSAwOwoJICAgICAgdmFyIHN1bV9hbHBoYV9zdWJfMV9sb2dfeCA9IDA7CgkgICAgICB2YXIgbiA9IGFscGhhLmxlbmd0aDsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkgICAgICAgIHN1bV9hbHBoYSArPSBhbHBoYVtpXTsKCSAgICAgICAgc3VtX2xnYW1tYV9hbHBoYSArPSBsZ2FtbWEoYWxwaGFbaV0pOwoJICAgICAgICBzdW1fYWxwaGFfc3ViXzFfbG9nX3ggKz0gKGFscGhhW2ldIC0gMSkgKiBsb2coeFtpXSk7CgkgICAgICB9CgkgICAgICByZXR1cm4gbGdhbW1hKHN1bV9hbHBoYSkgLSBzdW1fbGdhbW1hX2FscGhhICsgc3VtX2FscGhhX3N1Yl8xX2xvZ194OwoJICAgIH07CgkgICAgbGQuZXhwID0gZnVuY3Rpb24gKHgsIHJhdGUpIHsKCSAgICAgIHJldHVybiB4IDwgMCA/IC1JbmZpbml0eSA6IGxvZyhyYXRlKSAtIHJhdGUgKiB4OwoJICAgIH07CgkgICAgbGQudW5pZiA9IGZ1bmN0aW9uICh4LCBtaW4sIG1heCkgewoJICAgICAgcmV0dXJuIHggPCBtaW4gfHwgeCA+IG1heCA/IC1JbmZpbml0eSA6IGxvZygxIC8gKG1heCAtIG1pbikpOwoJICAgIH07CgoJICAgIC8vLy8vLy8vLy8gRGlzY3JldGUgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkgICAgbGQuYmVybiA9IGZ1bmN0aW9uICh4LCBwcm9iKSB7CgkgICAgICByZXR1cm4gISh4ID09PSAwIHx8IHggPT09IDEpID8gLUluZmluaXR5IDogbG9nKHggKiBwcm9iICsgKDEgLSB4KSAqICgxIC0gcHJvYikpOwoJICAgIH07CgkgICAgbGQuY2F0ID0gZnVuY3Rpb24gKHgsIHByb2JzKSB7CgkgICAgICBpZiAoeCA8IDEgfHwgeCA+IHByb2JzLmxlbmd0aCkgewoJICAgICAgICByZXR1cm4gLUluZmluaXR5OwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIGxvZyhwcm9ic1t4IC0gMV0pOwoJICAgICAgfQoJICAgIH07CgkgICAgbGQuYmlub20gPSBmdW5jdGlvbiAoeCwgc2l6ZSwgcHJvYikgewoJICAgICAgaWYgKHggPiBzaXplIHx8IHggPCAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICBpZiAocHJvYiA9PT0gMCB8fCBwcm9iID09PSAxKSB7CgkgICAgICAgIHJldHVybiBzaXplICogcHJvYiA9PT0geCA/IDAgOiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gbGNob29zZShzaXplLCB4KSArIHggKiBsb2cocHJvYikgKyAoc2l6ZSAtIHgpICogbG9nKDEgLSBwcm9iKTsKCSAgICB9OwoJICAgIGxkLm5iaW5vbSA9IGZ1bmN0aW9uICh4LCBzaXplLCBwcm9iKSB7CgkgICAgICBpZiAoeCA8IDApIHsKCSAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKCSAgICAgIH0KCSAgICAgIHJldHVybiBsY2hvb3NlKHggKyBzaXplIC0gMSwgc2l6ZSAtIDEpICsgeCAqIGxvZygxIC0gcHJvYikgKyBzaXplICogbG9nKHByb2IpOwoJICAgIH07CgkgICAgbGQuaHlwZXIgPSBmdW5jdGlvbiAoeCwgbSwgbiwgaykgewoJICAgICAgaWYgKHggPCAwIHx8IHggPiBrKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXR1cm4gbGNob29zZShtLCB4KSArIGxjaG9vc2UobiwgayAtIHgpIC0gbGNob29zZShtICsgbiwgayk7CgkgICAgICB9CgkgICAgfTsKCSAgICBsZC5wb2lzID0gZnVuY3Rpb24gKHgsIGxhbWJkYSkgewoJICAgICAgcmV0dXJuIHggPCAwID8gLUluZmluaXR5IDogbG9nKGxhbWJkYSkgKiB4IC0gbGFtYmRhIC0gbGZhY3RvcmlhbCh4KTsKCSAgICB9OwoJICAgIHJldHVybiBsZDsKCSAgfSk7Cgl9KShkaXN0cmlidXRpb25zKTsKCXZhciBkaXN0cmlidXRpb25zRXhwb3J0cyA9IGRpc3RyaWJ1dGlvbnMuZXhwb3J0czsKCgl2YXIgbWNtYyA9IHtleHBvcnRzOiB7fX07CgoJKGZ1bmN0aW9uIChtb2R1bGUpIHsKCgkgIC8vIFRoaXMgYm9pbGVyIHBsYXRlIGNvZGUgaGVyZSBpcyB0YWtlbiBmcm9tOgoJICAvLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzCgkgIC8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLAoJICAvLyBOb2RlLCBhbmQgYnkgdXNpbmcgdGhlIEFzeW5jaHJvbm91cyBNb2R1bGUgRGVmaW5pdGlvbiBzdGFuZGFyZC4KCSAgLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsCgkgIC8vIG9iamVjdCBtY21jIC4KCSAgKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7CgkgICAgaWYgKG1vZHVsZS5leHBvcnRzKSB7CgkgICAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXQKCSAgICAgIC8vIG9ubHkgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLAoJICAgICAgLy8gbGlrZSBOb2RlLgoJICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpCgkgICAgICByb290Lm1jbWMgPSBmYWN0b3J5KCk7CgkgICAgfQoJICB9KShjb21tb25qc0dsb2JhbCwgZnVuY3Rpb24gKCkgewoJICAgIC8vLyBUaGUgYWN0dWFsIG1vZHVsZSBjb2RlIHN0YXJ0cyBoZXJlIC8vLwoJICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgCgoJICAgIC8vLy8vLy8vLy8gSGVscGVyIEZ1bmN0aW9ucyAvLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkgICAgLyoqIFJldHVybnMgYSByYW5kb20gcmVhbCBudW1iZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAqLwoJICAgIHZhciBydW5pZiA9IGZ1bmN0aW9uIChtaW4sIG1heCkgewoJICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSArIG1pbjsKCSAgICB9OwoKCSAgICAvKiogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbWluIGFuZCBtYXggKi8KCSAgICB2YXIgcnVuaWZfZGlzY3JldGUgPSBmdW5jdGlvbiAobWluLCBtYXgpIHsKCSAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluOwoJICAgIH07CgoJICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGZyb20gYSBub3JtYWwgZGlzdHJpYmJ1dGlvbiBkZWZpbmVkCgkgICAgICogIGJ5IG1lYW4gYW5kIHNkLiAKCSAgICAgKiAgQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qc3RhdC9qc3RhdC9ibG9iL21hc3Rlci9zcmMvc3BlY2lhbC5qcyAqLwoJICAgIHZhciBybm9ybSA9IGZ1bmN0aW9uIChtZWFuLCBzZCkgewoJICAgICAgdmFyIHUsIHYsIHgsIHksIHE7CgkgICAgICBkbyB7CgkgICAgICAgIHUgPSBNYXRoLnJhbmRvbSgpOwoJICAgICAgICB2ID0gMS43MTU2ICogKE1hdGgucmFuZG9tKCkgLSAwLjUpOwoJICAgICAgICB4ID0gdSAtIDAuNDQ5ODcxOwoJICAgICAgICB5ID0gTWF0aC5hYnModikgKyAwLjM4NjU5NTsKCSAgICAgICAgcSA9IHggKiB4ICsgeSAqICgwLjE5NjAwICogeSAtIDAuMjU0NzIgKiB4KTsKCSAgICAgIH0gd2hpbGUgKHEgPiAwLjI3NTk3ICYmIChxID4gMC4yNzg0NiB8fCB2ICogdiA+IC00ICogTWF0aC5sb2codSkgKiB1ICogdSkpOwoJICAgICAgcmV0dXJuIHYgLyB1ICogc2QgKyBtZWFuOwoJICAgIH07CgoJICAgIC8qKiBSZXR1cm5zIGEgZGVlcCBjbG9uZSBvZiBzcmMsIHNvcnQgb2YuLi4gSXQgb25seSBjb3BpZXMgYSBsaW1pdGVkCgkgICAgICogbnVtYmVyIG9mIHR5cGVzIGFuZCwgZm9yIGV4YW1wbGUsIGZ1bmN0aW9uIGFyZSBub3QgY29waWVkLiAKCSAgICAgKiBGcm9tIGh0dHA6Ly9kYXZpZHdhbHNoLm5hbWUvamF2YXNjcmlwdC1jbG9uZQoJICAgICAqLwoJICAgIHZhciBkZWVwX2Nsb25lID0gZnVuY3Rpb24gKHNyYykgewoJICAgICAgZnVuY3Rpb24gbWl4aW4oZGVzdCwgc291cmNlLCBjb3B5RnVuYykgewoJICAgICAgICB2YXIgbmFtZSwKCSAgICAgICAgICBzLAoJICAgICAgICAgIGVtcHR5ID0ge307CgkgICAgICAgIGZvciAobmFtZSBpbiBzb3VyY2UpIHsKCSAgICAgICAgICAvLyB0aGUgKCEobmFtZSBpbiBlbXB0eSkgfHwgZW1wdHlbbmFtZV0gIT09IHMpIGNvbmRpdGlvbiBhdm9pZHMgY29weWluZyBwcm9wZXJ0aWVzIGluICJzb3VyY2UiCgkgICAgICAgICAgLy8gaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZS4JIEZvciBleGFtcGxlLCBpZiBkZXN0IGhhcyBhIGN1c3RvbSB0b1N0cmluZygpIG1ldGhvZCwKCSAgICAgICAgICAvLyBkb24ndCBvdmVyd3JpdGUgaXQgd2l0aCB0aGUgdG9TdHJpbmcoKSBtZXRob2QgdGhhdCBzb3VyY2UgaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZQoJICAgICAgICAgIHMgPSBzb3VyY2VbbmFtZV07CgkgICAgICAgICAgaWYgKCEobmFtZSBpbiBkZXN0KSB8fCBkZXN0W25hbWVdICE9PSBzICYmICghKG5hbWUgaW4gZW1wdHkpIHx8IGVtcHR5W25hbWVdICE9PSBzKSkgewoJICAgICAgICAgICAgZGVzdFtuYW1lXSA9IGNvcHlGdW5jID8gY29weUZ1bmMocykgOiBzOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gZGVzdDsKCSAgICAgIH0KCSAgICAgIGlmICghc3JjIHx8IHR5cGVvZiBzcmMgIT0gIm9iamVjdCIgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHNyYykgPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKCSAgICAgICAgLy8gbnVsbCwgdW5kZWZpbmVkLCBhbnkgbm9uLW9iamVjdCwgb3IgZnVuY3Rpb24KCSAgICAgICAgcmV0dXJuIHNyYzsgLy8gYW55dGhpbmcKCSAgICAgIH0KCSAgICAgIGlmIChzcmMubm9kZVR5cGUgJiYgImNsb25lTm9kZSIgaW4gc3JjKSB7CgkgICAgICAgIC8vIERPTSBOb2RlCgkgICAgICAgIHJldHVybiBzcmMuY2xvbmVOb2RlKHRydWUpOyAvLyBOb2RlCgkgICAgICB9CgkgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgRGF0ZSkgewoJICAgICAgICAvLyBEYXRlCgkgICAgICAgIHJldHVybiBuZXcgRGF0ZShzcmMuZ2V0VGltZSgpKTsgLy8gRGF0ZQoJICAgICAgfQoJICAgICAgaWYgKHNyYyBpbnN0YW5jZW9mIFJlZ0V4cCkgewoJICAgICAgICAvLyBSZWdFeHAKCSAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoc3JjKTsgLy8gUmVnRXhwCgkgICAgICB9CgkgICAgICB2YXIgciwgaSwgbDsKCSAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBBcnJheSkgewoJICAgICAgICAvLyBhcnJheQoJICAgICAgICByID0gW107CgkgICAgICAgIGZvciAoaSA9IDAsIGwgPSBzcmMubGVuZ3RoOyBpIDwgbDsgKytpKSB7CgkgICAgICAgICAgaWYgKGkgaW4gc3JjKSB7CgkgICAgICAgICAgICByLnB1c2goZGVlcF9jbG9uZShzcmNbaV0pKTsKCSAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIC8vIGdlbmVyaWMgb2JqZWN0cwoJICAgICAgICByID0gc3JjLmNvbnN0cnVjdG9yID8gbmV3IHNyYy5jb25zdHJ1Y3RvcigpIDoge307CgkgICAgICB9CgkgICAgICByZXR1cm4gbWl4aW4ociwgc3JjLCBkZWVwX2Nsb25lKTsKCSAgICB9OwoKCSAgICAvKiogU3BlY2lhbGl6ZWQgY2xvbmUgZnVuY3Rpb24gdGhhdCBvbmx5IGNsb25lcyBzY2FsYXJzIGFuZCBuZXN0ZWQgYXJyYXlzIHdoZXJlCgkgICAgICogZWFjaCBhcnJheSBlaXRoZXIgY29uc2lzdHMgb2YgYWxsIGFycmF5cyBvciBhbGwgbnVtYmVycy4gVGhpcyBmdW5jdGlvbgoJICAgICAqIGlzIG1lYW50IGFzIGEgZmFzdCB3YXkgb2YgY2xvbmluZyBwYXJhbWV0ZXIgZHJhd3Mgd2l0aGluIHRoZSBtY21jIHNhbXBsaW5nCgkgICAgICogbG9vcC4KCSAgICAgKi8KCSAgICB2YXIgY2xvbmVfcGFyYW1fZHJhdyA9IGZ1bmN0aW9uICh4KSB7CgkgICAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkgewoJICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh4WzBdKSkgewoJICAgICAgICAgIC8vIHggaXMgYW4gYXJyYXkgb2YgYXJyYXlzIHNvIHdlIG5lZWQgdG8gY2xvbmUgaXQgcmVjdXJzaXZlbHkKCSAgICAgICAgICB2YXIgeF9jb3B5ID0gW107CgkgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgIHhfY29weS5wdXNoKGNsb25lX3BhcmFtX2RyYXcoeFtpXSkpOwoJICAgICAgICAgIH0KCSAgICAgICAgICByZXR1cm4geF9jb3B5OwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIFdlJ2xsIGFzc3VtZSB4IGlzIGEgYXJyYXlzIG9mIHNjYWxhcnMKCSAgICAgICAgICByZXR1cm4geC5zbGljZSgwKTsKCSAgICAgICAgfQoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBzY2FsYXIKCSAgICAgICAgcmV0dXJuIHg7CgkgICAgICB9CgkgICAgfTsKCgkgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBvYmplY3QgaXMgYSBudW1iZXIuCgkgICAgICovCgkgICAgdmFyIGlzX251bWJlciA9IGZ1bmN0aW9uIChvYmplY3QpIHsKCSAgICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09ICJudW1iZXIiIHx8IHR5cGVvZiBvYmplY3QgPT0gIm9iamVjdCIgJiYgb2JqZWN0LmNvbnN0cnVjdG9yID09PSBOdW1iZXI7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSAocG9zc2libHkgbXVsdGlkaW1lbnNpb25hbC9uZXN0ZWQpIGFycmF5LgoJICAgICAqIEBwYXJhbSBkaW0gLSBBbiBhcnJheSBnaXZpbmcgdGhlIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkuIEZvciBleGFtcGxlLAoJICAgICAqICAgWzVdIHdvdWxkIHlpZWxkIGEgNSBlbGVtZW50IGFycmF5LCBhbmQgWzMsM10gd291bGQgeWllbGQgYSAzIGJ5IDMgbWF0cml4LgoJICAgICAqIEBwYXJhbSBpbml0IC0gQSB2YWx1ZSBvciBhIGZ1bmN0aW9uIHVzZWQgdG8gZmlsbCBpbiB0aGUgZWFjaCBlbGVtZW50IGluCgkgICAgICogICB0aGUgYXJyYXkuIElmIGl0IGlzIGEgZnVuY3Rpb24gaXQgc2hvdWxkIHRha2Ugbm8gYXJndW1lbnRzLCBpdCB3aWxsIGJlIAoJICAgICAqICAgZXZhbHVhdGVkIG9uY2UgZm9yIGVhY2ggZWxlbWVudCwgYW5kIGl0J3MgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZCB0bwoJICAgICAqICAgZmlsbCBpbiBlYWNoIGVsZW1lbnQuCgkgICAgICogQGV4YW1wbGUgCgkgICAgICogLy8gVGhlIGZvbGxvd2luZyB3b3VsZCByZXR1cm4gW1sxLDFdLFsxLDFdLFsxLDFdXQoJICAgICAqIGNyZWF0ZV9hcnJheShbMiwzXSwgMSkKCSAgICAgKi8KCSAgICB2YXIgY3JlYXRlX2FycmF5ID0gZnVuY3Rpb24gKGRpbSwgaW5pdCkgewoJICAgICAgdmFyIGFyciA9IG5ldyBBcnJheShkaW1bMF0pOwoJICAgICAgdmFyIGk7CgkgICAgICBpZiAoZGltLmxlbmd0aCA9PSAxKSB7CgkgICAgICAgIC8vIEZpbGwgaXQgdXAgd2l0aCBpbml0CgkgICAgICAgIGlmICh0eXBlb2YgaW5pdCA9PT0gImZ1bmN0aW9uIikgewoJICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewoJICAgICAgICAgICAgYXJyW2ldID0gaW5pdCgpOwoJICAgICAgICAgIH0KCSAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHsKCSAgICAgICAgICAgIGFycltpXSA9IGluaXQ7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgaWYgKGRpbS5sZW5ndGggPiAxKSB7CgkgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewoJICAgICAgICAgIGFycltpXSA9IGNyZWF0ZV9hcnJheShkaW0uc2xpY2UoMSksIGluaXQpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aHJvdyAiY3JlYXRlX2FycmF5IGNhbid0IGNyZWF0ZSBhIGRpbWVuc2lvbmxlc3MgYXJyYXkiOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGFycjsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBSZXR1cm4gdGhlIGRpbWVuc2lvbnMgb2YgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYXMgYW4gYXJyYXkuIEZvciAKCSAgICAgKiBleGFtcGxlLCBhcnJheV9kaW0oIFtbMSwgMl0sIFsxLCAyXV0gKSBzaG91bGQgcmV0dXJuIFsyLCAyXQoJICAgICAqIEFzc3VtZXMgdGhhdCBhbGwgYXJyYXlzIGluc2lkZSBhbm90aGVyIGFycmF5IGFyZSBvZiB0aGUgc2FtZSBsZW5ndGguCgkgICAgICogQGV4YW1wbGUKCSAgICAgKiAvLyBTaG91bGQgcmV0dXJuIFs0LCAyLCAxXQoJICAgICAqIGFycmF5X2RpbShjcmVhdGVfYXJyYXkoWzQsIDIsIDFdLCAwKSkKCSAgICAgKi8KCSAgICB2YXIgYXJyYXlfZGltID0gZnVuY3Rpb24gKGEpIHsKCSAgICAgIGlmIChBcnJheS5pc0FycmF5KGFbMF0pKSB7CgkgICAgICAgIHJldHVybiBbYS5sZW5ndGhdLmNvbmNhdChhcnJheV9kaW0oYVswXSkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIFthLmxlbmd0aF07CgkgICAgICB9CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogQ2hlY2tzIGlmIHR3byBhcnJheXMgYXJlIGVxdWFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cwoJICAgICAqIGFzIGp1ZGdlZCBieSB0aGUgIj09IiBvcGVyYXRvci4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgoJICAgICAqIEFkYXB0ZWQgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNDg1Mzk3NC8xMDAxODQ4CgkgICAgICovCgkgICAgdmFyIGFycmF5X2VxdWFsID0gZnVuY3Rpb24gKGExLCBhMikgewoJICAgICAgaWYgKGExLmxlbmd0aCAhPSBhMi5sZW5ndGgpIHJldHVybiBmYWxzZTsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBuZXN0ZWQgYXJyYXlzCgkgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGExW2ldKSAmJiBBcnJheS5pc0FycmF5KGEyW2ldKSkgewoJICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byB0aGUgbmVzdGVkIGFycmF5cwoJICAgICAgICAgIGlmICghYXJyYXlfZXF1YWwoYTFbaV0sIGEyW2ldKSkgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9IGVsc2UgaWYgKGExW2ldICE9IGEyW2ldKSB7CgkgICAgICAgICAgLy8gV2FybmluZyAtIHR3byBkaWZmZXJlbnQgb2JqZWN0IGluc3RhbmNlcyB3aWxsIG5ldmVyIGJlIGVxdWFsOiB7eDoyMH0gIT0ge3g6MjB9CgkgICAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICByZXR1cm4gdHJ1ZTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBUcmF2ZXJzZXMgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYSBhbmQgYXBwbGllcyBmdW4gdG8gYWxsICJsZWFmIG5vZGVzIiwgCgkgICAgICogdGhhdCBpcywgdmFsdWVzIHRoYXQgYXJlIG5vdCBhcnJheXMuIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2l6ZSBhcwoJICAgICAqIGEuCgkgICAgICovCgkgICAgdmFyIG5lc3RlZF9hcnJheV9hcHBseSA9IGZ1bmN0aW9uIChhLCBmdW4pIHsKCSAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CgkgICAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoYS5sZW5ndGgpOwoJICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICByZXN1bHRbaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVtpXSwgZnVuKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gcmVzdWx0OwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIGZ1bihhKTsKCSAgICAgIH0KCSAgICB9OwoKCSAgICAvKiogUmFuZG9taXppbmcgdGhlIGFycmF5IGVsZW1lbnQgb3JkZXIgaW4tcGxhY2UuIFVzaW5nIER1cnN0ZW5mZWxkCgkgICAgICogc2h1ZmZsZSBhbGdvcml0aG0uIEFkYXB0ZWQgZnJvbSBoZXJlOiAKCSAgICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMjY0Njg2NC8xMDAxODQ4CgkgICAgICovCgkgICAgZnVuY3Rpb24gc2h1ZmZsZV9hcnJheShhcnJheSkgewoJICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHsKCSAgICAgICAgdmFyIGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTsKCSAgICAgICAgdmFyIHRlbXAgPSBhcnJheVtpXTsKCSAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTsKCSAgICAgICAgYXJyYXlbal0gPSB0ZW1wOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGFycmF5OwoJICAgIH0KCgkgICAgLyoqCgkgICAgICogRG9lcyB0aGUgc2FtZSB0aGluZyBhcyBuZXN0ZWRfYXJyYXlfYXBwbHksIHRoYXQgaXMsIHRyYXZlcnNlcyBhIHBvc3NpYmx5CgkgICAgICogbmVzdGVkIGFycmF5IGEgYW5kIGFwcGxpZXMgZnVuIHRvIGFsbCAibGVhZiBub2RlcyIgYW5kIHJldHVybnMgYW4gYXJyYXkgCgkgICAgICogb2YgdGhlIHNhbWUgc2l6ZSBhcyBhLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG5lc3RlZF9hcnJheV9yYW5kb21fYXBwbHkKCSAgICAgKiBicmFuY2hlcyByYW5kb21seS4KCSAgICAgKi8KCSAgICB2YXIgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSA9IGZ1bmN0aW9uIChhLCBmdW4pIHsKCSAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CgkgICAgICAgIHZhciBsZW4gPSBhLmxlbmd0aDsKCSAgICAgICAgdmFyIGk7CgkgICAgICAgIHZhciBhcnJheV9pcyA9IFtdOwoJICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgICAgICBhcnJheV9pc1tpXSA9IGk7CgkgICAgICAgIH0KCSAgICAgICAgc2h1ZmZsZV9hcnJheShhcnJheV9pcyk7CgkgICAgICAgIHZhciByZXN1bHQgPSBbXTsKCSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgICAgdmFyIGFycmF5X2kgPSBhcnJheV9pc1tpXTsKCSAgICAgICAgICByZXN1bHRbYXJyYXlfaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVthcnJheV9pXSwgZnVuKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gcmVzdWx0OwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIGZ1bihhKTsKCSAgICAgIH0KCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBBbGxvd3MgYSBwcmV0dHkgd2F5IG9mIHNldHRpbmcgZGVmYXVsdCBvcHRpb25zIHdoZXJlIHRoZSBkZWZ1bHRzIGNhbiBiZQoJICAgICAqIG92ZXJyaWRkZW4gYnkgYW4gb3B0aW9ucyBvYmplY3QuCgkgICAgICogIEBwYXJhbSBvcHRpb25fbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gYXMgYSBzdHJpbmcKCSAgICAgKiAgQHBhcmFtIG15X29wdGlvbnMgLSBhbiBvcHRpb24gb2JqZWN0IHRoYXQgY291bGQgaGF2ZSBvcHRpb25fbmFtZSAKCSAgICAgKiAgICBhcyBhIG1lbWJlci4KCSAgICAgKiBAcGFyYW0gZGVmYXVsX3ZhbHVlIC0gZGVmdWx0IHZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgaWYgb3B0aW9uX25hbWUgCgkgICAgICogICBpcyBub3QgZGVmaW5lZCBpbiBteV9vcHRpb25zLgoJICAgICAqIEBleGFtcGxlCgkgICAgICogdmFyIG15X29wdGlvbnMgPSB7cGk6IDMuMTQxNTl9CgkgICAgICogdmFyIHBpID0gZ2V0X29wdGlvbigicGkiLCBteV9vcHRpb25zLCAzLjE0KQoJICAgICAqLwoJICAgIC8vIFByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuCgkgICAgLy8gYnkgYW4gb3B0aW9ucyBvYmplY3QuIEZvciBleGFtcGxlOgoJICAgIC8vIHZhciBwaSA9IGdldF9vcHRpb24oInBpIiwgbXlfb3B0aW9ucywgMy4xNCkKCSAgICB2YXIgZ2V0X29wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25fbmFtZSwgb3B0aW9ucywgZGVmYXVsX3ZhbHVlKSB7CgkgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgICAgIHJldHVybiBvcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbl9uYW1lKSAmJiBvcHRpb25zW29wdGlvbl9uYW1lXSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSBudWxsID8gb3B0aW9uc1tvcHRpb25fbmFtZV0gOiBkZWZhdWxfdmFsdWU7CgkgICAgfTsKCgkgICAgLyoqIFZlcnNpb24gb2YgZ2V0X29wdGlvbiB3aGVyZSB0aGUgb3B0aW9uIHNob3VsZCBiZSBhIG9uZSBvciBtdWx0aS1kaW1lbnNpb25hbAoJICAgICAqIGFycmF5IGFuZCB3aGVyZSB0aGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBlaXRoZXIgYnkgYSBzY2FsYXIgb3IgYnkgYW4gYXJyYXkuCgkgICAgICogSWYgaXQncyBhIHNjYWxhciB0aGUgdGhhdCBzY2FsYXIgaXMgdXNlZCB0byBpbml0aWFsaXplIGFuIGFycmF5IHdpdGggCgkgICAgICogZGltIGRpbWVuc2lvbnMuCgkgICAgICogCgkgICAgICovCgkgICAgdmFyIGdldF9tdWx0aWRpbV9vcHRpb24gPSBmdW5jdGlvbiAob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRpbSwgZGVmYXVsX3ZhbHVlKSB7CgkgICAgICB2YXIgdmFsdWUgPSBnZXRfb3B0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkZWZhdWxfdmFsdWUpOwoJICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgewoJICAgICAgICB2YWx1ZSA9IGNyZWF0ZV9hcnJheShkaW0sIHZhbHVlKTsKCSAgICAgIH0KCSAgICAgIGlmICghYXJyYXlfZXF1YWwoYXJyYXlfZGltKHZhbHVlKSwgZGltKSkgewoJICAgICAgICB0aHJvdyAiVGhlIG9wdGlvbiAiICsgb3B0aW9uX25hbWUgKyAiIGlzIG9mIGRpbWVuc2lvbiBbIiArIGFycmF5X2RpbSh2YWx1ZSkgKyAiXSBidXQgc2hvdWxkIGJlIFsiICsgZGltICsgIl0uIjsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9OwoKCSAgICAvLy8vLy8vLy8vIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgcGFyYW1ldGVyIG9iamVjdHMgLy8vLy8vLy8vLwoJICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJICAgIC8qKgoJICAgICAqIFJldHVybnMgYSBmaXhlZCAoc2FtZSBldmVyeSB0aW1lKSBudW1iZXIgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIGluaXRpYWxpemUKCSAgICAgKiBhIHBhcmFtZXRlciBvZiBhIGNlcnRhaW4gdHlwZSwgcG9zc2libHkgd2l0aCBsb3dlciBhbmQgdXBwZXIgYm91bmRzLgoJICAgICAqIFRoZSBwb3NzaWxlIHR5cGVzIGFyZSAicmVhbCIsICJpbnQiLCBhbmQgImJpbmFyeSIuCgkgICAgICovCgkgICAgdmFyIHBhcmFtX2luaXRfZml4ZWQgPSBmdW5jdGlvbiAodHlwZSwgbG93ZXIsIHVwcGVyKSB7CgkgICAgICBpZiAobG93ZXIgPiB1cHBlcikgewoJICAgICAgICB0aHJvdyAiQ2FuIG5vdCBpbml0aWFsaXplIHBhcmFtZXRlciB3aGVyZSBsb3dlciBib3VuZCA+IHVwcGVyIGJvdW5kIjsKCSAgICAgIH0KCSAgICAgIGlmICh0eXBlID09PSAicmVhbCIpIHsKCSAgICAgICAgaWYgKGxvd2VyID09PSAtSW5maW5pdHkgJiYgdXBwZXIgPT09IEluZmluaXR5KSB7CgkgICAgICAgICAgcmV0dXJuIDAuNTsKCSAgICAgICAgfSBlbHNlIGlmIChsb3dlciA9PT0gLUluZmluaXR5KSB7CgkgICAgICAgICAgcmV0dXJuIHVwcGVyIC0gMC41OwoJICAgICAgICB9IGVsc2UgaWYgKHVwcGVyID09PSBJbmZpbml0eSkgewoJICAgICAgICAgIHJldHVybiBsb3dlciArIDAuNTsKCSAgICAgICAgfSBlbHNlIGlmIChsb3dlciA8PSB1cHBlcikgewoJICAgICAgICAgIHJldHVybiAobG93ZXIgKyB1cHBlcikgLyAyOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJpbnQiKSB7CgkgICAgICAgIGlmIChsb3dlciA9PT0gLUluZmluaXR5ICYmIHVwcGVyID09PSBJbmZpbml0eSkgewoJICAgICAgICAgIHJldHVybiAxOwoJICAgICAgICB9IGVsc2UgaWYgKGxvd2VyID09PSAtSW5maW5pdHkpIHsKCSAgICAgICAgICByZXR1cm4gdXBwZXIgLSAxOwoJICAgICAgICB9IGVsc2UgaWYgKHVwcGVyID09PSBJbmZpbml0eSkgewoJICAgICAgICAgIHJldHVybiBsb3dlciArIDE7CgkgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPD0gdXBwZXIpIHsKCSAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgobG93ZXIgKyB1cHBlcikgLyAyKTsKCSAgICAgICAgfQoJICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAiYmluYXJ5IikgewoJICAgICAgICByZXR1cm4gMTsKCSAgICAgIH0KCSAgICAgIHRocm93ICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIgb2YgdHlwZSAiICsgdHlwZSArICJbIiArIGxvd2VyICsgIiwgIiArIHVwcGVyICsgIl0iOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIENvbXBsZXRlcyBwYXJhbXNfdG9fY29tcGxldGUsIGFuIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMsIAoJICAgICAqIGFuZCBpbml0aWFsaXplcyBub24taW5pdGlhbGl6ZWQgcGFyYW1ldGVycy4gVGhpcyBtb2RpZmllZCB2ZXJzaW9uIG9mCgkgICAgICogcGFyYW1zX3RvX2NvbXBsZXRlIGlzIHJldHVybmVkIGFzIGEgZGVlcCBjb3B5IGFuZCBub3QgbW9kaWZpZWQgaW4gcGxhY2UuCgkgICAgICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBieSBzdXBwbHlpbmcgYSBwYXJhbV9pbml0IGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlCgkgICAgICogZnVuY3Rpb24odHlwZSwgbG93ZXIsIHVwcGVyKSB0aGF0IHNob3VsZCByZXR1cm4gYSBzaW5nbGUgbnVtYmVyIAoJICAgICAqIChsaWtlIHBhcmFtX2luaXRfZml4ZWQsIGZvciBleGFtcGxlKS4KCSAgICAgKiBAZXhhbXBsZQoJICAgICAqIHZhciBwYXJhbXMgPSB7ICJtdSI6IHsidHlwZSI6ICJyZWFsIn0gfQoJICAgICAqIHBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyhwYXJhbXMpOwoJICAgICAqIC8vIHBhcmFtcyBzaG91bGQgbm93IGJlOgoJICAgICAqIC8vICB7Im11IjogeyAidHlwZSI6ICJyZWFsIiwgImRpbSI6IFsxXSwgInVwcGVyIjogSW5maW5pdHksCgkgICAgICogLy8gICAgICAgICAgICJsb3dlciI6IC1JbmZpbml0eSwgImluaXQiOiAwLjUgfX0KCSAgICAgKi8KCSAgICB2YXIgY29tcGxldGVfcGFyYW1zID0gZnVuY3Rpb24gKHBhcmFtc190b19jb21wbGV0ZSwgcGFyYW1faW5pdCkgewoJICAgICAgdmFyIHBhcmFtcyA9IGRlZXBfY2xvbmUocGFyYW1zX3RvX2NvbXBsZXRlKTsKCSAgICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gcGFyYW1zKSB7CgkgICAgICAgIGlmICghcGFyYW1zLmhhc093blByb3BlcnR5KHBhcmFtX25hbWUpKSBjb250aW51ZTsKCSAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW3BhcmFtX25hbWVdOwoJICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJ0eXBlIikpIHsKCSAgICAgICAgICBwYXJhbS50eXBlID0gInJlYWwiOwoJICAgICAgICB9CgkgICAgICAgIGlmICghcGFyYW0uaGFzT3duUHJvcGVydHkoImRpbSIpKSB7CgkgICAgICAgICAgcGFyYW0uZGltID0gWzFdOwoJICAgICAgICB9CgkgICAgICAgIGlmIChpc19udW1iZXIocGFyYW0uZGltKSkgewoJICAgICAgICAgIHBhcmFtLmRpbSA9IFtwYXJhbS5kaW1dOwoJICAgICAgICB9CgkgICAgICAgIGlmIChwYXJhbS50eXBlID09ICJiaW5hcnkiKSB7CgkgICAgICAgICAgcGFyYW0udXBwZXIgPSAxOwoJICAgICAgICAgIHBhcmFtLmxvd2VyID0gMDsKCSAgICAgICAgfQoJICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJ1cHBlciIpKSB7CgkgICAgICAgICAgcGFyYW0udXBwZXIgPSBJbmZpbml0eTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJsb3dlciIpKSB7CgkgICAgICAgICAgcGFyYW0ubG93ZXIgPSAtSW5maW5pdHk7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKHBhcmFtLmhhc093blByb3BlcnR5KCJpbml0IikpIHsKCSAgICAgICAgICAvLyBJZiB0aGlzIGlzIGp1c3QgYSBudW1iZXIgb3IgYSBuZXN0ZWQgYXJyYXkgd2UgbGVhdmUgaXQgYWxvbmUsIGJ1dCBpZi4uLgoJICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgdHlwZW9mIHBhcmFtLmluaXQgPT09ICJmdW5jdGlvbiIpIHsKCSAgICAgICAgICAgIC8vIHBhcmFtLmluaXQgaXMgYSBmdW5jdGlvbiwgdXNlIHRoYXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFyYW1ldGVyLgoJICAgICAgICAgICAgcGFyYW0uaW5pdCA9IHBhcmFtLmluaXQoKTsKCSAgICAgICAgICB9IGVsc2UgaWYgKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0uaW5pdCkpIHsKCSAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlciB3aGVyZSB0aGUgcGFyYW0uaW5pdCBleGlzdCBidXQKCSAgICAgICAgICAgIC8vIGlzIG5vdCBhbiBhcnJheS4gVGhlbiBhc3N1bWUgaXQgaXMgYSBudW1iZXIgb3IgYSBmdW5jdGlvbiBhbmQgdXNlCgkgICAgICAgICAgICAvLyBpdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuCgkgICAgICAgICAgICBwYXJhbS5pbml0ID0gY3JlYXRlX2FycmF5KHBhcmFtLmRpbSwgcGFyYW0uaW5pdCk7CgkgICAgICAgICAgfQoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIFdlIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KCSAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CgkgICAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwoJICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICBwYXJhbS5pbml0ID0gY3JlYXRlX2FycmF5KHBhcmFtLmRpbSwgZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgICByZXR1cm4gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwoJICAgICAgICAgICAgfSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgkgICAgICByZXR1cm4gcGFyYW1zOwoJICAgIH07CgoJICAgIC8vLy8vLy8vLy8gU3RlcHBlciBGdW5jdGlvbnMgLy8vLy8vLy8vLy8KCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJICAgIC8qKgoJICAgICAqIEBpbnRlcmZhY2UKCSAgICAgKiBBIFN0ZXBwZXIgaXMgYW4gb2JqZWN0IHJlc3BvbnNpYmxlIGZvciBwdXNoaW5nIGFyb3VuZCBvbmUKCSAgICAgKiBvciBtb3JlIHBhcmFtZXRlciB2YWx1ZXMgaW4gYSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGRpc3RyaWJ1dGlvbgoJICAgICAqIGRlZmluZWQgYnkgdGhlIGxvZyBwb3N0ZXJpb3IuIFRoaXMgZGVmaW5lcyB0aGUgU3RlcHBlciAiaW50ZXJmYWNlIiwKCSAgICAgKiB3aGVyZSAiaW50ZXJmYWNlIiBtZWFucyB0aGF0IFN0ZXBwZXIgZGVmaW5lcyBhIGNsYXNzIHRoYXQgaXMgbmV2ZXIKCSAgICAgKiBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBqdXN0IHRvIGJlIHN1YmNsYXNzZWQgYnkgc3BlY2lhbGl6ZWQKCSAgICAgKiBzdGVwcGVyIGZ1bmN0aW9ucy4KCSAgICAgKiBAaW50ZXJmYWNlCgkgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6CgkgICAgICogICB7Im11IjogeyAidHlwZSI6ICJyZWFsIiwgImRpbSI6IFsxXSwgInVwcGVyIjogSW5maW5pdHksIAoJICAgICAqICAgImxvd2VyIjogLUluZmluaXR5LCAiaW5pdCI6IDAuNSB9fQoJICAgICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYmUgImNvbXBsZXRlIiwgdGhhdCBpcywKCSAgICAgKiAgIHNwZWNpZnlpbmcgYWxsIHJlbGV2YW50IGF0dHJpYnV0ZXMgc3VjaCBhcyBkaW0sIGxvd2VyIGFuZCB1cHBlci4KCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMgaW4gcGFyYW1zCgkgICAgICogICAoYW5kIHBvc3NpYmx5IG1vcmUpLiBUaGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBnaXZlbiBhcyBrZXlzIGFuZCB0aGUgc3RhdGVzCgkgICAgICogICBhcyBzY2FsYXJzIG9yLCBwb3NzaWJseSBuZXN0ZWQsIGFycmF5cy4gRm9yIGV4YW1wbGU6CgkgICAgICogICB7bXU6IDEwLCBzaWdtYTogNSwgYmV0YTogWzEsIDIuNV19CgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiAqdGFraW5nIG5vIHBhcmFtZXRlcnMqIHRoYXQgcmV0dXJucyB0aGUKCSAgICAgKiAgIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFRoYXQgaXMsIHRoZSB2YWx1ZSBvZiBsb2dfcG9zdAoJICAgICAqICAgc2hvdWxkIGNoYW5nZSBpZiB0aGUgdGhlIHZhbHVlcyBpbiBzdGF0ZSBhcmUgY2hhbmdlZC4KCSAgICAKCSAgICAgKi8KCSAgICB2YXIgU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCkgewoJICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CgkgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CgkgICAgICB0aGlzLmxvZ19wb3N0ID0gbG9nX3Bvc3Q7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogVGFrZXMgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuIFNob3VsZCByZXR1cm4gdGhlIG5ldyBzdGF0ZSwKCSAgICAgKiBidXQgaXMgbWFpbmx5IGNhbGxlZCBmb3IgaXQncyBzaWRlIGVmZmVjdCBvZiBtYWtpbmcgYSBjaGFuZ2UgaW4gdGhlCgkgICAgICogc3RhdGUgb2JqZWN0LgoJICAgICAqLwoJICAgIFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICB0aHJvdyAiRXZlcnkgU3RlcHBlciBuZWVkIHRvIGltcGxlbWVudCBzdGVwKCkiOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIElmIGltcGxlbWVudGVkLCBtYWtlcyB0aGUgc3RlcHBlciBhZGFwdCB3aGlsZSBzdGVwcGluZy4KCSAgICAgKi8KCSAgICBTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgLy8gT3B0aW9uYWwsIHNvbWUgc3RlcHBlcnMgbWlnaHQgbm90IGJlIGFkYXB0aXZlLiAqLyAKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBJZiBpbXBsZW1lbnRlZCwgbWFrZXMgdGhlIHN0ZXBwZXIgY2Vhc2UgYWRhcHRpbmcgd2hpbGUgc3RlcHBpbmcuCgkgICAgICovCgkgICAgU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgLy8gT3B0aW9uYWwsIHNvbWUgc3RlcHBlcnMgbWlnaHQgbm90IGJlIGFkYXB0aXZlLiAqLyAKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluZyBpbmZvIHJlZ2FyZGluZyB0aGUgc3RlcHBlci4KCSAgICAgKi8KCSAgICBTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24gKCkgewoJICAgICAgLy8gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBpbmZvIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgc3RlcHBlci4KCSAgICAgIHJldHVybiB7fTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBAY2xhc3MKCSAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KCSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgbWV0cm9wb2xpcyBzdGVwIGluCgkgICAgICogdGhlIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiAiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQyIKCSAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLgoJICAgICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbi4KCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAgKiBAcGFyYW0gZ2VuZXJhdGVfcHJvcG9zYWwgLSBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHByb3Bvc2FsIChhcyBhIG51bWJlcikKCSAgICAgKiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgbG9nX3NjYWxlKSB3aGVyZSBwYXJhbV9zdGF0ZSBpcyBhCgkgICAgICogbnVtYmVyIGFuZCBsb2dfc2NhbGUgZGVmaW5lcyB0aGUgc2NhbGUgb2YgdGhlIHByb3Bvc2FsIHNvbWVob3cuCgkgICAgKi8KCSAgICB2YXIgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGdlbmVyYXRlX3Byb3Bvc2FsKSB7CgkgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwoJICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwoJICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCAhPSAxKSB7CgkgICAgICAgIHRocm93ICJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBjYW4gb25seSBoYW5kbGUgb25lIHBhcmFtZXRlci4iOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CgkgICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdOwoJICAgICAgaWYgKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKCSAgICAgICAgdGhyb3cgIk9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIGNhbiBvbmx5IGhhbmRsZSBvbmUgb25lLWRpbWVuc2lvbmFsIHBhcmFtZXRlci4iOwoJICAgICAgfQoJICAgICAgdGhpcy5sb3dlciA9IHBhcmFtLmxvd2VyOwoJICAgICAgdGhpcy51cHBlciA9IHBhcmFtLnVwcGVyOwoJICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSA9IGdldF9vcHRpb24oInByb3BfbG9nX3NjYWxlIiwgb3B0aW9ucywgMCk7CgkgICAgICB0aGlzLmJhdGNoX3NpemUgPSBnZXRfb3B0aW9uKCJiYXRjaF9zaXplIiwgb3B0aW9ucywgNTApOwoJICAgICAgdGhpcy5tYXhfYWRhcHRhdGlvbiA9IGdldF9vcHRpb24oIm1heF9hZGFwdGF0aW9uIiwgb3B0aW9ucywgMC4zMyk7CgkgICAgICB0aGlzLmluaXRpYWxfYWRhcHRhdGlvbiA9IGdldF9vcHRpb24oImluaXRpYWxfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIDEuMCk7CgkgICAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSA9IGdldF9vcHRpb24oInRhcmdldF9hY2NlcHRfcmF0ZSIsIG9wdGlvbnMsIDAuNDQpOwoJICAgICAgdGhpcy5pc19hZGFwdGluZyA9IGdldF9vcHRpb24oImlzX2FkYXB0aW5nIiwgb3B0aW9ucywgdHJ1ZSk7CgkgICAgICB0aGlzLmdlbmVyYXRlX3Byb3Bvc2FsID0gZ2VuZXJhdGVfcHJvcG9zYWw7CgkgICAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwOwoJICAgICAgdGhpcy5iYXRjaF9jb3VudCA9IDA7CgkgICAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24gPSAwOwoJICAgIH07CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT25lZGltTWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICB2YXIgcGFyYW1fc3RhdGUgPSB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07CgkgICAgICB2YXIgcGFyYW1fcHJvcG9zYWwgPSB0aGlzLmdlbmVyYXRlX3Byb3Bvc2FsKHBhcmFtX3N0YXRlLCB0aGlzLnByb3BfbG9nX3NjYWxlKTsKCSAgICAgIGlmIChwYXJhbV9wcm9wb3NhbCA8IHRoaXMubG93ZXIgfHwgcGFyYW1fcHJvcG9zYWwgPiB0aGlzLnVwcGVyKSA7IGVsc2UgewoJICAgICAgICAvLyBtYWtlIGEgTWV0cm9wb2xpcyBzdGVwCgkgICAgICAgIHZhciBjdXJyX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpOwoJICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSBwYXJhbV9wcm9wb3NhbDsKCSAgICAgICAgdmFyIHByb3BfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CgkgICAgICAgIHZhciBhY2NlcHRfcHJvYiA9IE1hdGguZXhwKHByb3BfbG9nX2RlbnMgLSBjdXJyX2xvZ19kZW5zKTsKCSAgICAgICAgaWYgKGFjY2VwdF9wcm9iID4gTWF0aC5yYW5kb20oKSkgewoJICAgICAgICAgIC8vIFdlIGRvIG5vdGhpbmcgYXMgdGhlIHN0YXRlIG9mIHBhcmFtIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCB0byB0aGUgcHJvcG9zYWwKCSAgICAgICAgICBpZiAodGhpcy5pc19hZGFwdGluZykgdGhpcy5hY2NlcHRhbmNlX2NvdW50Kys7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgLy8gcmV2ZXJ0IHN0YXRlIGJhY2sgdG8gdGhlIG9sZCBzdGF0ZSBvZiBwYXJhbQoJICAgICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3N0YXRlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5pc19hZGFwdGluZykgewoJICAgICAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24rKzsKCSAgICAgICAgaWYgKHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA+PSB0aGlzLmJhdGNoX3NpemUpIHsKCSAgICAgICAgICAvLyB0aGVuIGFkYXB0CgkgICAgICAgICAgdGhpcy5iYXRjaF9jb3VudCsrOwoJICAgICAgICAgIHZhciBsb2dfc2RfYWRqdXN0bWVudCA9IE1hdGgubWluKHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uIC8gTWF0aC5zcXJ0KHRoaXMuYmF0Y2hfY291bnQpKTsKCSAgICAgICAgICBpZiAodGhpcy5hY2NlcHRhbmNlX2NvdW50IC8gdGhpcy5iYXRjaF9zaXplID4gdGhpcy50YXJnZXRfYWNjZXB0X3JhdGUpIHsKCSAgICAgICAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgKz0gbG9nX3NkX2FkanVzdG1lbnQ7CgkgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgLT0gbG9nX3NkX2FkanVzdG1lbnQ7CgkgICAgICAgICAgfQoJICAgICAgICAgIHRoaXMuYWNjZXB0YW5jZV9jb3VudCA9IDA7CgkgICAgICAgICAgdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uID0gMDsKCSAgICAgICAgfQoJICAgICAgfQoJICAgICAgcmV0dXJuIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXTsKCSAgICB9OwoJICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgdGhpcy5pc19hZGFwdGluZyA9IHRydWU7CgkgICAgfTsKCSAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgdGhpcy5pc19hZGFwdGluZyA9IGZhbHNlOwoJICAgIH07CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CgkgICAgICByZXR1cm4gewoJICAgICAgICBwcm9wX2xvZ19zY2FsZTogdGhpcy5wcm9wX2xvZ19zY2FsZSwKCSAgICAgICAgaXNfYWRhcHRpbmc6IHRoaXMuaXNfYWRhcHRpbmcsCgkgICAgICAgIGFjY2VwdGFuY2VfY291bnQ6IHRoaXMuYWNjZXB0YW5jZV9jb3VudCwKCSAgICAgICAgaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbjogdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uLAoJICAgICAgICBiYXRjaF9jb3VudDogdGhpcy5iYXRjaF9jb3VudAoJICAgICAgfTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBGdW5jdGlvbiByZXR1cm5pbmcgYSBOb3JtYWwgcHJvcG9zYWwuCgkgICAgICovCgkgICAgdmFyIG5vcm1hbF9wcm9wb3NhbCA9IGZ1bmN0aW9uIChwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHsKCSAgICAgIHJldHVybiBybm9ybShwYXJhbV9zdGF0ZSwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBAY2xhc3MKCSAgICAgKiBAYXVnbWVudHMge09uZWRpbU1ldHJvcG9saXNTdGVwcGVyfQoJICAgICAqIEEgInN1YmNsYXNzIiBvZiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuCgkgICAgICovCgkgICAgdmFyIFJlYWxNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewoJICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgbm9ybWFsX3Byb3Bvc2FsKTsKCSAgICB9OwoJICAgIFJlYWxNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlYWxNZXRyb3BvbGlzU3RlcHBlcjsKCgkgICAgLyoqCgkgICAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGEgZGlzY3JldGl6ZWQgTm9ybWFsIHByb3Bvc2FsLgoJICAgICAqLwoJICAgIHZhciBkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwgPSBmdW5jdGlvbiAocGFyYW1fc3RhdGUsIHByb3BfbG9nX3NjYWxlKSB7CgkgICAgICByZXR1cm4gTWF0aC5yb3VuZChybm9ybShwYXJhbV9zdGF0ZSwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKSk7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgKiBAY2xhc3MKCSAgICAqIEBhdWdtZW50cyB7T25lZGltTWV0cm9wb2xpc1N0ZXBwZXJ9CgkgICAgKiBBICJzdWJjbGFzcyIgb2YgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuCgkgICAgKi8KCSAgICB2YXIgSW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKCSAgICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCk7CgkgICAgfTsKCSAgICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgSW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50TWV0cm9wb2xpc1N0ZXBwZXI7CgoJICAgIC8qKgoJICAgICAqIEBjbGFzcwoJICAgICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfQoJICAgICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBtZXRyb3BvbGlzIHN0ZXAgaW4KCSAgICAgKiB0aGUgQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgoJICAgICAqIGJ5IFJvYmVydHMgYW5kIFJvc2VudGhhbCAoMjAwOCkgZm9yIHBvc3NpYmx5IG11bHRpZGltZW5zaW9uYWwgYXJyYXlzLiBUaGF0CgkgICAgICogaXMsIGluc3RlYWQgb2YganVzdCB0YWtpbmcgYSBzdGVwIGZvciBhIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIgbGlrZSAKCSAgICAgKiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciwgdGhpcyBTdGVwcGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0YWtpbmcgc3RlcHMgCgkgICAgICogZm9yIGEgbXVsdGlkaW1lbnNpb25hbCBhcnJheS4gSXQncyBzdGlsbCBwcmV0dHkgZHVtYiBhbmQganVzdCB0YWtlcwoJICAgICAqIG9uZS1kaW1lbnNpb25hbCBzdGVwcyBmb3IgZWFjaCBwYXJhbWV0ZXIgY29tcG9uZW50LCB0aG91Z2guCgkgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uIGZvciBhIAoJICAgICAqICAgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuCgkgICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLgoJICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKCSAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCgkgICAgICogQHBhcmFtIFN1YlN0ZXBwZXIgLSBhIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSBvZiBvbmUgZGltZW5zaW9uYWwgU3RlcHBlciB0byBhcHBseSBvbgoJICAgICAqICAgYWxsIHRoZSBjb21wb25lbnRzIG9mIHRoZSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci4KCSAgICAqLwoJICAgIHZhciBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBTdWJTdGVwcGVyKSB7CgkgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwoJICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwoJICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCAhPSAxKSB7CgkgICAgICAgIHRocm93ICJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIGNhbid0IGhhbmRsZSBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4iOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CgkgICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdOwoJICAgICAgdGhpcy5sb3dlciA9IHBhcmFtLmxvd2VyOwoJICAgICAgdGhpcy51cHBlciA9IHBhcmFtLnVwcGVyOwoJICAgICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07CgkgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlID0gZ2V0X211bHRpZGltX29wdGlvbigicHJvcF9sb2dfc2NhbGUiLCBvcHRpb25zLCB0aGlzLmRpbSwgMCk7CgkgICAgICB0aGlzLmJhdGNoX3NpemUgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJiYXRjaF9zaXplIiwgb3B0aW9ucywgdGhpcy5kaW0sIDUwKTsKCSAgICAgIHRoaXMubWF4X2FkYXB0YXRpb24gPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJtYXhfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIHRoaXMuZGltLCAwLjMzKTsKCSAgICAgIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uID0gZ2V0X211bHRpZGltX29wdGlvbigiaW5pdGlhbF9hZGFwdGF0aW9uIiwgb3B0aW9ucywgdGhpcy5kaW0sIDEuMCk7CgkgICAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oInRhcmdldF9hY2NlcHRfcmF0ZSIsIG9wdGlvbnMsIHRoaXMuZGltLCAwLjQ0KTsKCSAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJpc19hZGFwdGluZyIsIG9wdGlvbnMsIHRoaXMuZGltLCB0cnVlKTsKCgkgICAgICAvLyBUaGlzIGhhY2sgYmVsb3cgaXMgYSByZWN1cnNpdmUgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFycmF5IG9mIAoJICAgICAgLy8gb25lIGRpbWVuc2lvbmFsIHN0ZXBwZXJzIGFjY29yZGluZyB0byBkaW0uCgkgICAgICB2YXIgY3JlYXRlX3N1YnN0ZXBwZXJzID0gZnVuY3Rpb24gKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0LCBwcm9wX2xvZ19zY2FsZSwgYmF0Y2hfc2l6ZSwgbWF4X2FkYXB0YXRpb24sIGluaXRpYWxfYWRhcHRhdGlvbiwgdGFyZ2V0X2FjY2VwdF9yYXRlLCBpc19hZGFwdGluZykgewoJICAgICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTsKCSAgICAgICAgaWYgKGRpbS5sZW5ndGggPT09IDEpIHsKCSAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CgkgICAgICAgICAgICB2YXIgc3Vib3B0aW9ucyA9IHsKCSAgICAgICAgICAgICAgcHJvcF9sb2dfc2NhbGU6IHByb3BfbG9nX3NjYWxlW2ldLAoJICAgICAgICAgICAgICBiYXRjaF9zaXplOiBiYXRjaF9zaXplW2ldLAoJICAgICAgICAgICAgICBtYXhfYWRhcHRhdGlvbjogbWF4X2FkYXB0YXRpb25baV0sCgkgICAgICAgICAgICAgIGluaXRpYWxfYWRhcHRhdGlvbjogaW5pdGlhbF9hZGFwdGF0aW9uW2ldLAoJICAgICAgICAgICAgICB0YXJnZXRfYWNjZXB0X3JhdGU6IHRhcmdldF9hY2NlcHRfcmF0ZVtpXSwKCSAgICAgICAgICAgICAgaXNfYWRhcHRpbmc6IGlzX2FkYXB0aW5nW2ldCgkgICAgICAgICAgICB9OwoJICAgICAgICAgICAgdmFyIHN1YnBhcmFtID0ge307CgkgICAgICAgICAgICBzdWJwYXJhbVtpXSA9IGRlZXBfY2xvbmUocGFyYW0pOwoJICAgICAgICAgICAgc3VicGFyYW1baV0uZGltID0gWzFdOyAvLyBBcyB0aGlzIHNob3VsZCBub3cgYmUgYSBvbmUtZGltIHBhcmFtZXRlcgoJICAgICAgICAgICAgZGVsZXRlIHN1YnBhcmFtW2ldLmluaXQ7IC8vIEFzIGl0IHNvdWxkIG5vdCBiZSBuZWVkZWQKCSAgICAgICAgICAgIHN1YnN0ZXBwZXJzW2ldID0gbmV3IFN1YlN0ZXBwZXIoc3VicGFyYW0sIHN1YnN0YXRlLCBsb2dfcG9zdCwgc3Vib3B0aW9ucyk7CgkgICAgICAgICAgfQoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHsKCSAgICAgICAgICAgIHN1YnN0ZXBwZXJzW2ldID0gY3JlYXRlX3N1YnN0ZXBwZXJzKGRpbS5zbGljZSgxKSwgc3Vic3RhdGVbaV0sIGxvZ19wb3N0LCBwcm9wX2xvZ19zY2FsZVtpXSwgYmF0Y2hfc2l6ZVtpXSwgbWF4X2FkYXB0YXRpb25baV0sIGluaXRpYWxfYWRhcHRhdGlvbltpXSwgdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZ1tpXSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyczsKCSAgICAgIH07CgkgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gY3JlYXRlX3N1YnN0ZXBwZXJzKHRoaXMuZGltLCB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0sIHRoaXMubG9nX3Bvc3QsIHRoaXMucHJvcF9sb2dfc2NhbGUsIHRoaXMuYmF0Y2hfc2l6ZSwgdGhpcy5tYXhfYWRhcHRhdGlvbiwgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24sIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlLCB0aGlzLmlzX2FkYXB0aW5nKTsKCSAgICB9OwoJICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoJICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS4KCSAgICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLnN0ZXAoKTsKCSAgICAgIH0pOwoJICAgIH07CgkgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewoJICAgICAgICBzdWJzdGVwcGVyLnN0YXJ0X2FkYXB0YXRpb24oKTsKCSAgICAgIH0pOwoJICAgIH07CgkgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHN1YnN0ZXBwZXIuc3RvcF9hZGFwdGF0aW9uKCk7CgkgICAgICB9KTsKCSAgICB9OwoJICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CgkgICAgICByZXR1cm4gbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLmluZm8oKTsKCSAgICAgIH0pOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIEBjbGFzcwoJICAgICAqIEBhdWdtZW50cyB7TXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcn0KCSAgICAgKiBBICJzdWJjbGFzcyIgb2YgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuCgkgICAgICovCgkgICAgdmFyIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CgkgICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFJlYWxNZXRyb3BvbGlzU3RlcHBlcik7CgkgICAgfTsKCSAgICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsKCSAgICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjsKCgkgICAgLyoqCgkgICAgICogQGNsYXNzCgkgICAgICogQGF1Z21lbnRzIHtNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyfQoJICAgICAqIEEgInN1YmNsYXNzIiBvZiBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLgoJICAgICAqLwoJICAgIHZhciBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CgkgICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIEludE1ldHJvcG9saXNTdGVwcGVyKTsKCSAgICB9OwoJICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoKCSAgICAvKioKCSAgICAgKiBAY2xhc3MKCSAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KCSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBhIHN0ZXAgZm9yIGEgYmluYXJ5IHBhcmFtZXRlci4KCSAgICAgKiBUaGlzIGlzIGRvbmUgYnkgZXZhbHVhdGluZyB0aGUgbG9nIHBvc3RlcmlvciBmb3IgYm90aCBzdGF0ZXMgb2YgdGhlCgkgICAgICogcGFyYW1ldGVyIGFuZCB0aGVuIHNlbGVjdGluZyBhIHN0YXRlIHJhbmRvbWx5IHdpdGggcHJvYmFiaWxpdHkgcmVsYXRpdmUgCgkgICAgICogdG8gdGhlIHBvc3RlcmlvciBvZiBlYWNoIHN0YXRlLgoJICAgICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbi4KCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAqLwoJICAgIHZhciBCaW5hcnlTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CgkgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwoJICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwoJICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCA9PSAxKSB7CgkgICAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdGhyb3cgIkJpbmFyeVN0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLiI7CgkgICAgICB9CgkgICAgfTsKCSAgICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwoJICAgIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmluYXJ5U3RlcHBlcjsKCSAgICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewoJICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDsKCSAgICAgIHZhciB6ZXJvX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpOwoJICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMTsKCSAgICAgIHZhciBvbmVfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CgkgICAgICB2YXIgbWF4X2xvZ19kZW5zID0gTWF0aC5tYXgoemVyb19sb2dfZGVucywgb25lX2xvZ19kZW5zKTsKCSAgICAgIHplcm9fbG9nX2RlbnMgLT0gbWF4X2xvZ19kZW5zOwoJICAgICAgb25lX2xvZ19kZW5zIC09IG1heF9sb2dfZGVuczsKCSAgICAgIHZhciB6ZXJvX3Byb2IgPSBNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zIC0gTWF0aC5sb2coTWF0aC5leHAoemVyb19sb2dfZGVucykgKyBNYXRoLmV4cChvbmVfbG9nX2RlbnMpKSk7CgkgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8IHplcm9fcHJvYikgewoJICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSAwOwoJICAgICAgICByZXR1cm4gMDsKCSAgICAgIH0gLy8gZWxzZSBrZWVwIHRoZSBwYXJhbSBhdCAxIC4KCSAgICAgIHJldHVybiAxOwoJICAgIH07CgoJICAgIC8qKgoJICAgICogQGNsYXNzCgkgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KCSAgICAqIEp1c3QgbGlrZSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIHRoaXMgU3RlcHBlciB0YWtlcyBhIHN0ZXBzIGZvcgoJICAgICogYSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlciBieSB1cGRhdGluZyBlYWNoIGNvbXBvbmVudCBpbiB0dXJuLiBUaGUgZGlmZmVyZW5jZQoJICAgICogaXMgdGhhdCB0aGlzIHN0ZXBwZXIgd29ya3Mgb24gYmluYXJ5IHBhcmFtZXRlcnMuCgkgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZm9yIGEgCgkgICAgKiAgIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyLgoJICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLgoJICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLgoJICAgICovCgkgICAgdmFyIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKCSAgICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7CgkgICAgICB2YXIgcGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgkgICAgICBpZiAocGFyYW1fbmFtZXMubGVuZ3RoID09IDEpIHsKCSAgICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CgkgICAgICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07CgkgICAgICAgIHRoaXMuZGltID0gcGFyYW0uZGltOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdGhyb3cgIkJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLiI7CgkgICAgICB9CgkgICAgICB2YXIgY3JlYXRlX3N1YnN0ZXBwZXJzID0gZnVuY3Rpb24gKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0KSB7CgkgICAgICAgIHZhciBzdWJzdGVwcGVycyA9IFtdOwoJICAgICAgICB2YXIgaTsKCSAgICAgICAgaWYgKGRpbS5sZW5ndGggPT09IDEpIHsKCSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHsKCSAgICAgICAgICAgIHZhciBzdWJwYXJhbXMgPSB7fTsKCSAgICAgICAgICAgIHN1YnBhcmFtc1tpXSA9IHBhcmFtOwoJICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBuZXcgQmluYXJ5U3RlcHBlcihzdWJwYXJhbXMsIHN1YnN0YXRlLCBsb2dfcG9zdCk7CgkgICAgICAgICAgfQoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewoJICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QpOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gc3Vic3RlcHBlcnM7CgkgICAgICB9OwoJICAgICAgdGhpcy5zdWJzdGVwcGVycyA9IGNyZWF0ZV9zdWJzdGVwcGVycyh0aGlzLmRpbSwgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdLCB0aGlzLmxvZ19wb3N0KTsKCSAgICB9OwoJICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCaW5hcnlDb21wb25lbnRTdGVwcGVyOwoJICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS4KCSAgICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLnN0ZXAoKTsKCSAgICAgIH0pOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIEBjbGFzcwoJICAgICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfQoJICAgICAqIFRoaXMgc3RlcHBlciBjYW4gYmUgcmVzcG9uc2libGUgZm9yIHRha2luZyBhIHN0ZXAgZm9yIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMuCgkgICAgICogRm9yIHJlYWwgYW5kIGludCBwYXJhbWV0ZXJzIGl0IHRha2VzIE1ldHJvcG9saXMgd2l0aGluIEdpYmJzIHN0ZXBzLCBhbmQgZm9yIAoJICAgICAqIGJpbmFyeSBwYXJhbWV0ZXJzIGl0IGRvZXMgZXZhbHVhdGVzIHRoZSBwb3N0ZXJpb3IgZm9yIGJvdGggcGFyYW10ZXIgdmFsdWVzIGFuZAoJICAgICAqIHJhbmRvbWx5IGNoYW5nZXMgdG8gYSBjZXJ0YWluIHZhbHVlIHByb3BvcnRpb25hbGx5IHRvIHRoYXQgdmFsdWUncyBwb3N0ZXJpb3IKCSAgICAgKiAodGhpcyBpcyBhbHNvIGRvbmUgZm9yIGVhY2ggcGFyYW1ldGVyLCBzbyBhbHNvIGEgKiB3aXRoaW4gR2liYnMgYXBwcm9hY2gpLgoJICAgICAqIFRoaXMgc3RlcHBlciBpcyBhbHNvIGFkYXB0aXZlIGFuZCBjYW4gYmUgZWZmaWNpZW50IHdoZW4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzCgkgICAgICogYXJlIG5vdCB0b28gaGlnaCBhbmQgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHBhcmFtZXRlcnMgYXJlIGxvdy4KCSAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMKCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAqLwoJICAgIHZhciBBbXdnU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewoJICAgICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTsKCSAgICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgkgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gW107CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1fbmFtZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dOwoJICAgICAgICB2YXIgU2VsZWN0U3RlcHBlcjsKCSAgICAgICAgc3dpdGNoIChwYXJhbS50eXBlKSB7CgkgICAgICAgICAgY2FzZSAicmVhbCI6CgkgICAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CgkgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICBjYXNlICJpbnQiOgoJICAgICAgICAgICAgaWYgKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkgewoJICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gSW50TWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgIGNhc2UgImJpbmFyeSI6CgkgICAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CgkgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBCaW5hcnlTdGVwcGVyOwoJICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICBkZWZhdWx0OgoJICAgICAgICAgICAgdGhyb3cgIkFtd2dTdGVwcGVyIGNhbid0IGhhbmRsZSBwYXJhbWV0ZXIgIiArIHRoaXMucGFyYW1fbmFtZXNbaV0gKyAiIHdpdGggdHlwZSAiICsgcGFyYW0udHlwZTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgcGFyYW1fb2JqZWN0X3dyYXAgPSB7fTsKCSAgICAgICAgcGFyYW1fb2JqZWN0X3dyYXBbdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSBwYXJhbTsKCSAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgkgICAgICAgIHZhciBwYXJhbV9vcHRpb25zID0gb3B0aW9ucy5wYXJhbXMgJiYgb3B0aW9ucy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lc1tpXV0gfHwge307CgkgICAgICAgIHBhcmFtX29wdGlvbnMucHJvcF9sb2dfc2NhbGUgPSBwYXJhbV9vcHRpb25zLnByb3BfbG9nX3NjYWxlIHx8IG9wdGlvbnMucHJvcF9sb2dfc2NhbGU7CgkgICAgICAgIHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSA9IHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSB8fCBvcHRpb25zLmJhdGNoX3NpemU7CgkgICAgICAgIHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gPSBwYXJhbV9vcHRpb25zLm1heF9hZGFwdGF0aW9uIHx8IG9wdGlvbnMubWF4X2FkYXB0YXRpb247CgkgICAgICAgIHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uID0gcGFyYW1fb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb24gfHwgb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb247CgkgICAgICAgIHBhcmFtX29wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlID0gcGFyYW1fb3B0aW9ucy50YXJnZXRfYWNjZXB0X3JhdGUgfHwgb3B0aW9ucy50YXJnZXRfYWNjZXB0X3JhdGU7CgkgICAgICAgIHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgPSBwYXJhbV9vcHRpb25zLmlzX2FkYXB0aW5nIHx8IG9wdGlvbnMuaXNfYWRhcHRpbmc7CgkgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0gPSBuZXcgU2VsZWN0U3RlcHBlcihwYXJhbV9vYmplY3Rfd3JhcCwgc3RhdGUsIGxvZ19wb3N0LCBwYXJhbV9vcHRpb25zKTsKCSAgICAgIH0KCSAgICB9OwoJICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwoJICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFtd2dTdGVwcGVyOwoJICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewoJICAgICAgc2h1ZmZsZV9hcnJheSh0aGlzLnN1YnN0ZXBwZXJzKTsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykgewoJICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0ZXAoKTsKCSAgICAgIH0KCSAgICAgIHJldHVybiB0aGlzLnN0YXRlOwoJICAgIH07CgkgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGFydF9hZGFwdGF0aW9uKCk7CgkgICAgICB9CgkgICAgfTsKCSAgICBBbXdnU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7CgkgICAgICB9CgkgICAgfTsKCSAgICBBbXdnU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHZhciBpbmZvID0ge307CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgaW5mb1t0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMuc3Vic3RlcHBlcnNbaV0uaW5mbygpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGluZm87CgkgICAgfTsKCgkgICAgLy8vLy8vLy8vLy8gU2FtcGxlciBGdW5jdGlvbnMgLy8vLy8vLy8vLwoJICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkgICAgLyoqCgkgICAgKiBAaW50ZXJmYWNlCgkgICAgKiBXaGlsZSB5b3UgY291bGQgZml0IGEgbW9kZWwgYnkgcGFzdGluZyB0b2dldGhlciBTdGVwcGVycywgYQoJICAgIC8vIFNhbXBsZXIgaXMgaGVyZSBpcyBhIGNvbnZlbmllbmNlIGNsYXNzIHdoZXJlIGFuIGluc3RhbmNlIG9mIFNhbXBsZXIKCSAgICAvLyBzZXRzIHVwIHRoZSBTdGVwcGVycywgY2hlY2tzIHRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiwKCSAgICAvLyBhbmQgbWFuYWdlcyB0aGUgc2FtcGxpbmcuIFRoaXMgaGVyZSBkZWZpbmVzIHRoZSBTYW1wbGVyICJpbnRlcmZhY2UiLgoJICAgICogQGludGVyZmFjZQoJICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6CgkgICAgKiAgIHsibXUiOiB7InR5cGUiOiAicmVhbCJ9LCAic2lnbWEiOiB7InR5cGUiOiAicmVhbCIsICJsb3dlciIgPSAwfX0KCSAgICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBkb2Vzbid0IGhhdmUgdG8gYmUgImNvbXBsZXRlIiBhbmQgcHJvcGVydGllcwoJICAgICogICBsZWZ0IG91dCAobGlrZSBsb3dlciBhbmQgdXBwZXIpIHdpbGwgYmUgZmlsbGVkIGluIGJ5IGRlZmF1bHRzLgoJICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihzdGF0ZSwgZGF0YSkuIEhlcmUKCSAgICAqICAgc3RhdGUgd2lsbCBiZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSB3aXRoIGVhY2ggcGFyYW1ldGVyIGFzIGEgCgkgICAgKiAgIGtleSBhbmQgdGhlIHBhcmFtZXRlciB2YWx1ZXMgYXMgbnVtYmVycyBvciBhcnJheXMuIEZvciBleGFtcGxlOgoJICAgICogICB7Im11IjogMywgInNpZ21hIjogMS41fS4gVGhlIGRhdGEgYXJndW1lbnQgd2lsbCBiZSB0aGUgc2FtZSBvYmplY3QgYXMgCgkgICAgKiAgIHRoZSBkYXRhIGFyZ3VtZW50IGdpdmVuIGJlbG93LgoJICAgICogQHBhcmFtIGRhdGEgLSBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgbG9nX3Bvc3QgZnVuY3Rpb24KCSAgICAqICAgd2hlbiBzYW1wbGluZy4KCSAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc2FtcGxlci4KCSAgICAqLwoJICAgIHZhciBTYW1wbGVyID0gZnVuY3Rpb24gKHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpIHsKCSAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwoJICAgICAgdGhpcy5kYXRhID0gZGF0YTsKCSAgICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgoJICAgICAgLy8gU2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgaWYgbm90IHBhc3NlZCB0aHJvdWdoIHRoZSBvcHRpb25zIG9iamVjdAoJICAgICAgdGhpcy5wYXJhbV9pbml0X2Z1biA9IGdldF9vcHRpb24oInBhcmFtX2luaXRfZnVuIiwgb3B0aW9ucywgcGFyYW1faW5pdF9maXhlZCk7CgkgICAgICB2YXIgdGhpbm5pbmdfaW50ZXJ2YWwgPSBnZXRfb3B0aW9uKCJ0aGluIiwgb3B0aW9ucywgMSk7CgkgICAgICB2YXIgcGFyYW1zX3RvX21vbml0b3IgPSBnZXRfb3B0aW9uKCJtb25pdG9yIiwgb3B0aW9ucywgbnVsbCk7CgkgICAgICB0aGlzLnRoaW4odGhpbm5pbmdfaW50ZXJ2YWwpOwoJICAgICAgdGhpcy5tb25pdG9yKHBhcmFtc190b19tb25pdG9yKTsKCSAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgICAvLyBDb21wbGV0aW5nIHRoZSBwYXJhbXMgYW5kIGluaXRpYWxpemluZyB0aGUgc3RhdGUuCgkgICAgICB0aGlzLnBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyh0aGlzLnBhcmFtcywgdGhpcy5wYXJhbV9pbml0X2Z1bik7CgkgICAgICB2YXIgc3RhdGUgPSB7fTsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJhbV9uYW1lcy5sZW5ndGg7IGkrKykgewoJICAgICAgICBzdGF0ZVt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dLmluaXQ7CgkgICAgICB9CgkgICAgICB0aGlzLmxvZ19wb3N0ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gbG9nX3Bvc3Qoc3RhdGUsIGRhdGEpOwoJICAgICAgfTsKCSAgICAgIC8vIFJ1bm5pbmcgdGhlIGxvZ19wb3N0IGZ1bmN0aW9uIG9uY2UgaW4gY2FzZSBpdCBmdXJ0aGVyIG1vZGlmaWVzIHRoZSBzdGF0ZQoJICAgICAgLy8gZm9yIGV4YW1wbGUgYWRkaW5nIGRlcml2ZWQgcXVhbnRpdGllcy4KCSAgICAgIHRoaXMubG9nX3Bvc3QoKTsKCSAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKCSAgICAgIHRoaXMuc3RlcHBlcnMgPSB0aGlzLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlKHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlLCB0aGlzLmxvZ19wb3N0LCB0aGlzLm9wdGlvbnMpOwoJICAgIH07CgoJICAgIC8qKiBTaG91bGQgcmV0dXJuIGEgdmVjdG9yIG9mIHN0ZXBwZXJzIHRoYXQgd2hlbiBjYWxsZWQgCgkgICAgICogc2hvdWxkIHRha2UgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUgPSBmdW5jdGlvbiAoc3RhdGUsIGxvZ19wb3N0KSB7CgkgICAgICB0aHJvdyAiRXZlcnkgU2FtcGxlciBuZWVkcyB0byBpbXBsZW1lbnQgY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUoKSI7CgkgICAgfTsKCgkgICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIFNhbXBsZXIuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHJldHVybiB7CgkgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLAoJICAgICAgICB0aGluOiB0aGlzLnRoaW4sCgkgICAgICAgIG1vbml0b3I6IHRoaXMubW9uaXRvciwKCSAgICAgICAgc3RlcHBlcnM6IHRoaXMuc3RlcHBlcnMKCSAgICAgIH07CgkgICAgfTsKCgkgICAgLyoqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBSZXR1cm5zIHRoZSBuZXcgc3BhY2UKCSAgICAgKiBidXQgYWxzbyBtb2RpZmllcyB0aGUgc3RhdGUgaW4gcGxhY2UuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHNodWZmbGVfYXJyYXkodGhpcy5zdGVwcGVycyk7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdGhpcy5zdGVwcGVyc1tpXS5zdGVwKCk7CgkgICAgICB9CgkgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zdGF0ZSkubGVuZ3RoID4gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpLmxlbmd0aCkgewoJICAgICAgICAvLyBUaGUgc3RhdGUgY29udGFpbnMgZGV2aXZlZCBxdWFudGl0aWVzIChub3Qgb25seSBwYXJhbWV0ZXJzKSBhbmQgd2UKCSAgICAgICAgLy8gbmVlZCB0byBydW4gdGhlIGxvZ19wb3N0IG9uY2UgbW9yZSBpbiBvcmRlciB0byBzZXQgdGhlIGRlcml2ZWQgcXVhbnRpdGllcwoJICAgICAgICAvLyBmb3IgdGhlIGZpbmFsIHBhcmFtZXRlciBzdGF0ZQoJICAgICAgICB0aGlzLmxvZ19wb3N0KCk7CgkgICAgICB9CgkgICAgICByZXR1cm4gdGhpcy5zdGF0ZTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBUYWtlcyBuX2l0ZXJhdGlvbnMgc3RlcHMgaW4gdGhlIHBhcmFtZXRlciBzcGFjZSBhbmQgcmV0dXJucyB0aGVtCgkgICAgICogYXMgYW4gb2JqZWN0IG9mIGFycmF5cyB3aXRoIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZToKCSAgICAgKiB7bXU6IFsxLCAtMSwgMiwgMywgLi4uXSwgc2lnbWE6IFsxLCAyLCAyLCAxLCAuLi5dfS4KCSAgICAgKiBJZiB0aGluIGlzID4gMSB0aGVuIG5faXRlcmF0aW9ucyAvIHRoaW4gc2FtcGxlcyBhcmUgcmV0dXJuZWQuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuc2FtcGxlID0gZnVuY3Rpb24gKG5faXRlcmF0aW9ucykgewoJICAgICAgLy8gSW5pdGlhbGl6aW5nIGN1cnJfc2FtcGxlIHdoZXJlIHRoZSBzYW1wbGUgaXMgZ29pbmcgdG8gYmUgc2F2ZWQKCSAgICAgIC8vIGFzIGFuIG9iamVjdCBjb250YWluaW5nIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyIHRvIGJlIG1vbml0b3JlZC4KCSAgICAgIHZhciBpLCBqLCBtb25pdG9yZWRfcGFyYW1zOwoJICAgICAgaWYgKHRoaXMubW9uaXRvcmVkX3BhcmFtcyA9PT0gbnVsbCkgewoJICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gT2JqZWN0LmtleXModGhpcy5zdGF0ZSk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gdGhpcy5tb25pdG9yZWRfcGFyYW1zOwoJICAgICAgfQoJICAgICAgdmFyIGN1cnJfc2FtcGxlID0ge307CgkgICAgICBmb3IgKGogPSAwOyBqIDwgbW9uaXRvcmVkX3BhcmFtcy5sZW5ndGg7IGorKykgewoJICAgICAgICBjdXJyX3NhbXBsZVttb25pdG9yZWRfcGFyYW1zW2pdXSA9IFtdOwoJICAgICAgfQoJICAgICAgZm9yIChpID0gMDsgaSA8IG5faXRlcmF0aW9uczsgaSsrKSB7CgkgICAgICAgIGlmIChpICUgdGhpcy50aGlubmluZ19pbnRlcnZhbCA9PT0gMCkgewoJICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7CgkgICAgICAgICAgICB2YXIgcGFyYW0gPSBtb25pdG9yZWRfcGFyYW1zW2pdOwoJICAgICAgICAgICAgY3Vycl9zYW1wbGVbcGFyYW1dLnB1c2goY2xvbmVfcGFyYW1fZHJhdyh0aGlzLnN0YXRlW3BhcmFtXSkpOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0ZXAoKTsKCSAgICAgIH0KCSAgICAgIHJldHVybiBjdXJyX3NhbXBsZTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBUYWtlcyBuX2l0ZXJhdGlvbiBzdGVwcyBpbiBwYXJhbWV0ZXIgc3BhY2UgYnV0IHJldHVybnMgbm90aGluZy4KCSAgICAgKi8KCSAgICBTYW1wbGVyLnByb3RvdHlwZS5idXJuID0gZnVuY3Rpb24gKG5faXRlcmF0aW9ucykgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuX2l0ZXJhdGlvbnM7IGkrKykgewoJICAgICAgICB0aGlzLnN0ZXAoKTsKCSAgICAgIH0KCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBTZXRzIHdoYXQgcGFyYW1ldGVycyBzaG91bGQgYmUgbW9uaXRvcmVkIGFuZCByZXR1cm5lZCB3aGVuIGNhbGxpbmcKCSAgICAgKiBzYW1wbGUuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUubW9uaXRvciA9IGZ1bmN0aW9uIChwYXJhbXNfdG9fbW9uaXRvcikgewoJICAgICAgdGhpcy5tb25pdG9yZWRfcGFyYW1zID0gcGFyYW1zX3RvX21vbml0b3I7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogU2V0cyB0aGUgdGhpbm5pbmcuIEZvciBleGFtcGxlIHRoaW4gPT0gMTAgbWVhbnMgdGhhdCBldmVyeSAxMHRoIHBvc3RlcmlvcgoJICAgICAqIGRyYXcgd2lsbCBiZSBrZXB0LgoJICAgICAqLwoJICAgIFNhbXBsZXIucHJvdG90eXBlLnRoaW4gPSBmdW5jdGlvbiAodGhpbm5pbmdfaW50ZXJ2YWwpIHsKCSAgICAgIHRoaXMudGhpbm5pbmdfaW50ZXJ2YWwgPSB0aGlubmluZ19pbnRlcnZhbDsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBTZXRzIGFkYXB0YXRpb24gb24sIGlmIGFwcGxpY2FibGUsIGluIGFsbCBzdGVwcGVycy4KCSAgICAgKi8KCSAgICBTYW1wbGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RhcnRfYWRhcHRhdGlvbigpOwoJICAgICAgfQoJICAgIH07CgoJICAgIC8qKgoJICAgICogU2V0cyBhZGFwdGF0aW9uIG9mZiwgaWYgYXBwbGljYWJsZSwgaW4gYWxsIHN0ZXBwZXJzLgoJICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7CgkgICAgICB9CgkgICAgfTsKCgkgICAgLyoqCgkgICAgKiBAY2xhc3MKCSAgICAqIEBpbXBsZW1lbnRzIHtTYW1wbGVyfQoJICAgICogVGhpcyBzYW1wbGVyIHVzZXMgdGhlIEFtd2dTdGVwcGVyIGFzIHRoZSBzdGVwcGVyIGZ1bmN0aW9uIHdoaWNoIGltcGxlbWVudHMgdGhlIAoJICAgICogQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgoJICAgICogYnkgUm9iZXJ0cyBhbmQgUm9zZW50aGFsICgyMDA4KS4gQW4gYWRpdGlvbiBpcyB0aGF0IGl0IGhhbmRsZXMgaW50IHBhcmFtZXRlcnMKCSAgICAqIGJ5IG1ha2luZyBkaXNjcmV0ZSBOb3JtYWwgcHJvcG9zYWxzIGFuZCBiaW5hcnkgcGFyYW1ldGVycyBieSB0YWtpbmcgb24gYSBuZXcgCgkgICAgKiB2YWx1ZSBwcm9wb3J0aW9uYWwgdG8gdGhlIHBvc3RlcmlvciBvZiB0aGUgdHdvIHBvc3NpYmxlIHN0YXRlcyBvZiB0aGUKCSAgICAqIHBhcmFtZXRlci4gVGhpcyBzYW1wbGVyIGNhbiBiZSBlZmZpY2llbnQgd2hlbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKCSAgICAqIGFyZSBub3QgdG9vIGhpZ2ggYW5kIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJhbWV0ZXJzIGFyZSBsb3cuCgkgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMKCSAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy4KCSAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKCSAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAqLwoJICAgIHZhciBBbXdnU2FtcGxlciA9IGZ1bmN0aW9uIChwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKSB7CgkgICAgICBTYW1wbGVyLmNhbGwodGhpcywgcGFyYW1zLCBsb2dfcG9zdCwgZGF0YSwgb3B0aW9ucyk7CgkgICAgfTsKCSAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNhbXBsZXIucHJvdG90eXBlKTsKCSAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU2FtcGxlcjsKCSAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKCSAgICAgIHJldHVybiBbbmV3IEFtd2dTdGVwcGVyKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKV07CgkgICAgfTsKCgkgICAgLy8gUmV0dXJuaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgcHVibGljbHkgZXhwb3NlZCBieSB0aGlzIG1vZHVsZQoJICAgIHJldHVybiB7CgkgICAgICBydW5pZjogcnVuaWYsCgkgICAgICBydW5pZl9kaXNjcmV0ZTogcnVuaWZfZGlzY3JldGUsCgkgICAgICBybm9ybTogcm5vcm0sCgkgICAgICBwYXJhbV9pbml0X2ZpeGVkOiBwYXJhbV9pbml0X2ZpeGVkLAoJICAgICAgY29tcGxldGVfcGFyYW1zOiBjb21wbGV0ZV9wYXJhbXMsCgkgICAgICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI6IFJlYWxNZXRyb3BvbGlzU3RlcHBlciwKCSAgICAgIEludE1ldHJvcG9saXNTdGVwcGVyOiBJbnRNZXRyb3BvbGlzU3RlcHBlciwKCSAgICAgIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOiBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciwKCSAgICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsCgkgICAgICBCaW5hcnlTdGVwcGVyOiBCaW5hcnlTdGVwcGVyLAoJICAgICAgQmluYXJ5Q29tcG9uZW50U3RlcHBlcjogQmluYXJ5Q29tcG9uZW50U3RlcHBlciwKCSAgICAgIEFtd2dTdGVwcGVyOiBBbXdnU3RlcHBlciwKCSAgICAgIEFtd2dTYW1wbGVyOiBBbXdnU2FtcGxlcgoJICAgIH07CgkgIH0pOwoJfSkobWNtYyk7Cgl2YXIgbWNtY0V4cG9ydHMgPSBtY21jLmV4cG9ydHM7CgoJZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHsKCSAgcmV0dXJuIGEgPT0gbnVsbCB8fCBiID09IG51bGwgPyBOYU4gOiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjsKCX0KCglmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHsKCSAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkgewoJICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykgewoJICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkgewoJICAgICAgICB5aWVsZCB2YWx1ZTsKCSAgICAgIH0KCSAgICB9CgkgIH0gZWxzZSB7CgkgICAgbGV0IGluZGV4ID0gLTE7CgkgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7CgkgICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7CgkgICAgICAgIHlpZWxkIHZhbHVlOwoJICAgICAgfQoJICAgIH0KCSAgfQoJfQoKCWZ1bmN0aW9uIGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUgPSBhc2NlbmRpbmcpIHsKCSAgaWYgKGNvbXBhcmUgPT09IGFzY2VuZGluZykgcmV0dXJuIGFzY2VuZGluZ0RlZmluZWQ7CgkgIGlmICh0eXBlb2YgY29tcGFyZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiY29tcGFyZSBpcyBub3QgYSBmdW5jdGlvbiIpOwoJICByZXR1cm4gKGEsIGIpID0+IHsKCSAgICBjb25zdCB4ID0gY29tcGFyZShhLCBiKTsKCSAgICBpZiAoeCB8fCB4ID09PSAwKSByZXR1cm4geDsKCSAgICByZXR1cm4gKGNvbXBhcmUoYiwgYikgPT09IDApIC0gKGNvbXBhcmUoYSwgYSkgPT09IDApOwoJICB9OwoJfQoJZnVuY3Rpb24gYXNjZW5kaW5nRGVmaW5lZChhLCBiKSB7CgkgIHJldHVybiAoYSA9PSBudWxsIHx8ICEoYSA+PSBhKSkgLSAoYiA9PSBudWxsIHx8ICEoYiA+PSBiKSkgfHwgKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTsKCX0KCglmdW5jdGlvbiBtYXgodmFsdWVzLCB2YWx1ZW9mKSB7CgkgIGxldCBtYXg7CgkgIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHsKCSAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykgewoJICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKG1heCA8IHZhbHVlIHx8IG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkgewoJICAgICAgICBtYXggPSB2YWx1ZTsKCSAgICAgIH0KCSAgICB9CgkgIH0gZWxzZSB7CgkgICAgbGV0IGluZGV4ID0gLTE7CgkgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7CgkgICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCAmJiAobWF4IDwgdmFsdWUgfHwgbWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSB7CgkgICAgICAgIG1heCA9IHZhbHVlOwoJICAgICAgfQoJICAgIH0KCSAgfQoJICByZXR1cm4gbWF4OwoJfQoKCWZ1bmN0aW9uIG1pbih2YWx1ZXMsIHZhbHVlb2YpIHsKCSAgbGV0IG1pbjsKCSAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkgewoJICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7CgkgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAobWluID4gdmFsdWUgfHwgbWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSB7CgkgICAgICAgIG1pbiA9IHZhbHVlOwoJICAgICAgfQoJICAgIH0KCSAgfSBlbHNlIHsKCSAgICBsZXQgaW5kZXggPSAtMTsKCSAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHsKCSAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsICYmIChtaW4gPiB2YWx1ZSB8fCBtaW4gPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpIHsKCSAgICAgICAgbWluID0gdmFsdWU7CgkgICAgICB9CgkgICAgfQoJICB9CgkgIHJldHVybiBtaW47Cgl9CgoJLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vdXJuZXIvcXVpY2tzZWxlY3QKCS8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uCglmdW5jdGlvbiBxdWlja3NlbGVjdChhcnJheSwgaywgbGVmdCA9IDAsIHJpZ2h0ID0gSW5maW5pdHksIGNvbXBhcmUpIHsKCSAgayA9IE1hdGguZmxvb3Ioayk7CgkgIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTsKCSAgcmlnaHQgPSBNYXRoLmZsb29yKE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIHJpZ2h0KSk7CgkgIGlmICghKGxlZnQgPD0gayAmJiBrIDw9IHJpZ2h0KSkgcmV0dXJuIGFycmF5OwoJICBjb21wYXJlID0gY29tcGFyZSA9PT0gdW5kZWZpbmVkID8gYXNjZW5kaW5nRGVmaW5lZCA6IGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUpOwoJICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7CgkgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkgewoJICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7CgkgICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxOwoJICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pOwoJICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7CgkgICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTsKCSAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpOwoJICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTsKCSAgICAgIHF1aWNrc2VsZWN0KGFycmF5LCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7CgkgICAgfQoJICAgIGNvbnN0IHQgPSBhcnJheVtrXTsKCSAgICBsZXQgaSA9IGxlZnQ7CgkgICAgbGV0IGogPSByaWdodDsKCSAgICBzd2FwKGFycmF5LCBsZWZ0LCBrKTsKCSAgICBpZiAoY29tcGFyZShhcnJheVtyaWdodF0sIHQpID4gMCkgc3dhcChhcnJheSwgbGVmdCwgcmlnaHQpOwoJICAgIHdoaWxlIChpIDwgaikgewoJICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qOwoJICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbaV0sIHQpIDwgMCkgKytpOwoJICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbal0sIHQpID4gMCkgLS1qOwoJICAgIH0KCSAgICBpZiAoY29tcGFyZShhcnJheVtsZWZ0XSwgdCkgPT09IDApIHN3YXAoYXJyYXksIGxlZnQsIGopO2Vsc2UgKytqLCBzd2FwKGFycmF5LCBqLCByaWdodCk7CgkgICAgaWYgKGogPD0gaykgbGVmdCA9IGogKyAxOwoJICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7CgkgIH0KCSAgcmV0dXJuIGFycmF5OwoJfQoJZnVuY3Rpb24gc3dhcChhcnJheSwgaSwgaikgewoJICBjb25zdCB0ID0gYXJyYXlbaV07CgkgIGFycmF5W2ldID0gYXJyYXlbal07CgkgIGFycmF5W2pdID0gdDsKCX0KCglmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHsKCSAgdmFsdWVzID0gRmxvYXQ2NEFycmF5LmZyb20obnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpKTsKCSAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjsKCSAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpOwoJICBpZiAocCA+PSAxKSByZXR1cm4gbWF4KHZhbHVlcyk7CgkgIHZhciBuLAoJICAgIGkgPSAobiAtIDEpICogcCwKCSAgICBpMCA9IE1hdGguZmxvb3IoaSksCgkgICAgdmFsdWUwID0gbWF4KHF1aWNrc2VsZWN0KHZhbHVlcywgaTApLnN1YmFycmF5KDAsIGkwICsgMSkpLAoJICAgIHZhbHVlMSA9IG1pbih2YWx1ZXMuc3ViYXJyYXkoaTAgKyAxKSk7CgkgIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApOwoJfQoKCWZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIHZhbHVlb2YpIHsKCSAgcmV0dXJuIHF1YW50aWxlKHZhbHVlcywgMC41LCB2YWx1ZW9mKTsKCX0KCglmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkgewoJICB0aGlzLmsgPSBrOwoJICB0aGlzLnggPSB4OwoJICB0aGlzLnkgPSB5OwoJfQoJVHJhbnNmb3JtLnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IFRyYW5zZm9ybSwKCSAgc2NhbGU6IGZ1bmN0aW9uIChrKSB7CgkgICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7CgkgIH0sCgkgIHRyYW5zbGF0ZTogZnVuY3Rpb24gKHgsIHkpIHsKCSAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpOwoJICB9LAoJICBhcHBseTogZnVuY3Rpb24gKHBvaW50KSB7CgkgICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldOwoJICB9LAoJICBhcHBseVg6IGZ1bmN0aW9uICh4KSB7CgkgICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7CgkgIH0sCgkgIGFwcGx5WTogZnVuY3Rpb24gKHkpIHsKCSAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTsKCSAgfSwKCSAgaW52ZXJ0OiBmdW5jdGlvbiAobG9jYXRpb24pIHsKCSAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdOwoJICB9LAoJICBpbnZlcnRYOiBmdW5jdGlvbiAoeCkgewoJICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7CgkgIH0sCgkgIGludmVydFk6IGZ1bmN0aW9uICh5KSB7CgkgICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuazsKCSAgfSwKCSAgcmVzY2FsZVg6IGZ1bmN0aW9uICh4KSB7CgkgICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7CgkgIH0sCgkgIHJlc2NhbGVZOiBmdW5jdGlvbiAoeSkgewoJICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpOwoJICB9LAoJICB0b1N0cmluZzogZnVuY3Rpb24gKCkgewoJICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyB0aGlzLnggKyAiLCIgKyB0aGlzLnkgKyAiKSBzY2FsZSgiICsgdGhpcy5rICsgIikiOwoJICB9Cgl9OwoJVHJhbnNmb3JtLnByb3RvdHlwZTsKCgkvKgoJICBIVERNYXRoIFN0YXRpYyBDbGFzcyAtIE5vdCBpbnRlbmRlZCBmb3IgaW5zdGFudGlhdGlvbiEKCgkgIFZhcmlhYmxlczoKCSAgICBBID0gYW1vdW50CgkgICAgRCA9IGRlbGF5CgkgICAgViA9IHN1YmplY3RpdmUgdmFsdWUKCgkgICAgayA9IGRpc2NvdW50IGZhY3RvcgoKCSAgRXF1YXRpb25zOgoJICAgIFYgPSBBIC8gKDEgKyBrRCkKCSovCgljbGFzcyBIVERNYXRoIHsKCSAgc3RhdGljIGFkazJ2KGEsIGQsIGspIHsKCSAgICByZXR1cm4gYSAvICgxICsgayAqIGQpOwoJICB9CgkgIHN0YXRpYyBhZHYyayhhLCBkLCB2KSB7CgkgICAgcmV0dXJuIChhIC0gdikgLyAodiAqIGQpOwoJICB9Cgl9CgoJLy8gSW50ZXJuYWwgZGVwZW5kZW5jaWVzCgoJLyogZXNsaW50IG5vLXJlc3RyaWN0ZWQtZ2xvYmFsczogWyJvZmYiLCAic2VsZiJdICovCgoJc2VsZi5vbm1lc3NhZ2UgPSBldmVudCA9PiB7CgkgIGNvbnN0IHBhcmFtcyA9IHsKCSAgICBrOiB7CgkgICAgICB0eXBlOiAncmVhbCcsCgkgICAgICBsb3dlcjogMCwKCSAgICAgIHVwcGVyOiAxMDAKCSAgICB9LAoJICAgIGx1Y2U6IHsKCSAgICAgIHR5cGU6ICdyZWFsJywKCSAgICAgIGxvd2VyOiAwLAoJICAgICAgdXBwZXI6IDEwMAoJICAgIH0KCSAgfTsKCSAgY29uc3QgbG9nUG9zdCA9IChzdGF0ZSwgZGF0YSkgPT4gewoJICAgIGxldCBscCA9IDA7CgoJICAgIC8vIFByaW9ycwoJICAgIGNvbnN0IGtNZWFuID0gMjsKCSAgICBjb25zdCBrU2hhcGUgPSAzOwoJICAgIGxwICs9IGRpc3RyaWJ1dGlvbnNFeHBvcnRzLmdhbW1hKHN0YXRlLmssIGtTaGFwZSwga1NoYXBlIC8ga01lYW4pOwoJICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmssIDAsIDEwMCk7CgoJICAgIGNvbnN0IGx1Y2VNZWFuID0gMjsKCSAgICBjb25zdCBsdWNlU2hhcGUgPSAzOwoJICAgIGxwICs9IGRpc3RyaWJ1dGlvbnNFeHBvcnRzLmdhbW1hKHN0YXRlLmx1Y2UsIGx1Y2VTaGFwZSwgbHVjZVNoYXBlIC8gbHVjZU1lYW4pOwoJICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7CgoJICAgIC8vIExpa2VsaWhvb2QKCSAgICBkYXRhLmZvckVhY2goY2hvaWNlID0+IHsKCSAgICAgIC8vIFZhbHVlcwoJICAgICAgY29uc3QgdnMgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hcywgY2hvaWNlLmRzLCBzdGF0ZS5rKTsKCSAgICAgIGNvbnN0IHZsID0gSFRETWF0aC5hZGsydihjaG9pY2UuYWwsIGNob2ljZS5kbCwgc3RhdGUuayk7CgoJICAgICAgLy8gQ2hvaWNlIG9mIHNvb25lciBvciBsYXRlciBpcyBzYW1wbGVkIGZyb20gYSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uCgkgICAgICAvLyBMdWNlIGNob2ljZSBydWxlIGlzIHVzZWQgdG8gY29tcHV0ZSBwcm9iYWJpbGl0eSBvZiB3YWl0aW5nISAoMCA9IHNvb25lciwgMSA9IGxhdGVyKQoJICAgICAgY29uc3QgYmludmFsID0gMSAvICgxICsgTWF0aC5leHAoc3RhdGUubHVjZSAqICh2cyAtIHZsKSkpOwoKCSAgICAgIC8vIEFjdHVhbCByZXNwb25zZQoJICAgICAgY29uc3QgcmVzcG9uc2UgPSBjaG9pY2UucmVzcG9uc2UgPT09ICdmaXJzdCcgPyAwIDogMTsKCSAgICAgIGxwICs9IGRpc3RyaWJ1dGlvbnNFeHBvcnRzLmJlcm4ocmVzcG9uc2UsIGJpbnZhbCk7CgkgICAgfSk7CgkgICAgcmV0dXJuIGxwOwoJICB9OwoKCSAgLy8gSW5pdGlhbGl6aW5nIHRoZSBzYW1wbGVyCgkgIGNvbnN0IHNhbXBsZXIgPSBuZXcgbWNtY0V4cG9ydHMuQW13Z1NhbXBsZXIocGFyYW1zLCBsb2dQb3N0LCBldmVudC5kYXRhKTsKCSAgLy8gQnVybmluZyBzb21lIHNhbXBsZXMgdG8gdGhlIE1DTUMgZ29kcyBhbmQgc2FtcGxpbmcgNTAwMCBkcmF3cwoJICBzYW1wbGVyLmJ1cm4oMTAwMCk7CgkgIGNvbnN0IHNhbXBsZXMgPSBzYW1wbGVyLnNhbXBsZSg1MDAwKTsKCgkgIC8vIEV4dHJhY3Qgc3VtbWFyeSBzdGF0cwoJICBjb25zdCByZXN1bHRzID0gewoJICAgIGs6IG1lZGlhbihzYW1wbGVzLmspLAoJICAgIGx1Y2U6IG1lZGlhbihzYW1wbGVzLmx1Y2UpCgkgIH07CgkgIHNlbGYucG9zdE1lc3NhZ2UoewoJICAgIHJlc3VsdHM6IHJlc3VsdHMsCgkgICAgc2FtcGxlczogc2FtcGxlcwoJICB9KTsKCX07Cgp9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD1odGQtZml0LXdvcmtlci5qcy5tYXAKCg==', 'data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRkLWZpdC13b3JrZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9iYXllcy5qcy9kaXN0cmlidXRpb25zLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2JheWVzLmpzL21jbWMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2FzY2VuZGluZy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbnVtYmVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9zb3J0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21pbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVpY2tzZWxlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3F1YW50aWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tZWRpYW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvdHJhbnNmb3JtLmpzIiwiLi4vZGlzY291bnRhYmxlLW1hdGgvc3JjL2h0ZC1tYXRoLmpzIiwiLi4vZGlzY291bnRhYmxlLW1hdGgvc3JjL2luZGV4LmpzIiwic3JjL2NvbXBvbmVudHMvaHRkLWZpdC13b3JrZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLy8gQSBudW1iZXIgb2YgbG9nIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb25zIChQREYpLiBOYW1pbmcgYW5kIHBhcmFtZXRlcml6YXRpb25cbi8vIHNob3VsZCBtYXRjaCBSJ3MsIGV4Y2VwdCBmb3IgdGhhdCBhbGwgZnVuY3Rpb25zIHJlc2lkZSBpbiBhbiBsZCBvYmplY3QgKFxuLy8gYXMgaW4gXCJsb2cgZGVuc2l0eVwiKSwgc28gdG8gZ2V0IGEgbm9ybWFsIGxvZyBkZW5zaXR5IHlvdSB3b3VsZCB3cml0ZVxuLy8gbGQubm9ybSguLi4pLlxuLy8gTW9zdCBvZiB0aGUgY29kZSBiZWxvdyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBncmVhdCBKc3RhdCBwcm9qZWN0XG4vLyAoaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0Lykgd2hpY2ggaW5jbHVkZXMgUERGIGZvciBtYW55IGNvbW1vbiBwcm9iYWJpbGl0eVxuLy8gZGlzdHJpYnV0aW9ucy4gV2hhdCBJIGhhdmUgZG9uZSBpcyBvbmx5IHRvIGNvbnZlcnQgdGhlc2UgdG8gbG9nIFBERnMuXG5cbi8qXG5PcmlnaW5hbCB3b3JrIENvcHlyaWdodCAoYykgMjAxMyBqU3RhdFxuTW9kaWZpZWQgd29yayBDb3B5cmlnaHQgKGMpIDIwMTUgUmFzbXVzIELDpcOldGggXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS5cblxuKi9cblxuXG4vLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanNcbi8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLFxuLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuXG4vLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWxcbi8vIG9iamVjdCBsZCAuXG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICAgICAgZGVmaW5lKFtdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIC8vIE5vZGUuIERvZXMgbm90IHdvcmsgd2l0aCBzdHJpY3QgQ29tbW9uSlMsIGJ1dFxuICAgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cyxcbiAgICAgICAgLy8gbGlrZSBOb2RlLlxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KVxuICAgICAgICByb290LmxkID0gZmFjdG9yeSgpO1xuICB9XG59KHRoaXMsIGZ1bmN0aW9uKCkge1xuICAvLyBPYmplY3QgdG8gaG9sZCB0aGUgZnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkLlxuICB2YXIgbGQgID0ge307XG4gIFxuICAvLy8vLy8vLy8vIEhlbHBlciBmdW5jdGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgdmFyIGxnYW1tYSA9IGZ1bmN0aW9uKHgpIHtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGNvZiA9IFtcbiAgICAgIDc2LjE4MDA5MTcyOTQ3MTQ2LCAtODYuNTA1MzIwMzI5NDE2NzcsIDI0LjAxNDA5ODI0MDgzMDkxLFxuICAgICAgLTEuMjMxNzM5NTcyNDUwMTU1LCAwLjEyMDg2NTA5NzM4NjYxNzllLTIsIC0wLjUzOTUyMzkzODQ5NTNlLTVcbiAgICBdO1xuICAgIHZhciBzZXIgPSAxLjAwMDAwMDAwMDE5MDAxNTtcbiAgICB2YXIgeHgsIHksIHRtcDtcbiAgICB0bXAgPSAoeSA9IHh4ID0geCkgKyA1LjU7XG4gICAgdG1wIC09ICh4eCArIDAuNSkgKiBsb2codG1wKTtcbiAgICBmb3IgKDsgaiA8IDY7IGorKylcbiAgICAgIHNlciArPSBjb2Zbal0gLyArK3k7XG4gICAgcmV0dXJuIGxvZygyLjUwNjYyODI3NDYzMTAwMDUgKiBzZXIgLyB4eCkgLSB0bXA7XG4gIH07XG4gIGxkLmxnYW1tYSA9IGxnYW1tYTtcbiAgXG4gIHZhciBsZmFjdG9yaWFsID0gZnVuY3Rpb24obikge1xuICAgIHJldHVybiBuIDwgMCA/IE5hTiA6IGxnYW1tYShuICsgMSk7XG4gIH07XG4gIGxkLmxmYWN0b3JpYWwgPSBsZmFjdG9yaWFsO1xuICBcbiAgdmFyIGxjaG9vc2UgPSBmdW5jdGlvbihuLCBrKXtcbiAgICByZXR1cm4gbGZhY3RvcmlhbChuKSAtIGxmYWN0b3JpYWwoaykgLSBsZmFjdG9yaWFsKG4gLSBrKTtcbiAgfTtcbiAgbGQubGNob29zZSA9IGxjaG9vc2U7XG4gIFxuICB2YXIgbGJldGEgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGxnYW1tYShhKSArIGxnYW1tYShiKSAtIGxnYW1tYShhICsgYik7XG4gIH07XG4gIGxkLmxiZXRhID0gbGJldGE7XG4gIFxuICB2YXIgbG9nICA9IE1hdGgubG9nO1xuICB2YXIgZXhwICA9IE1hdGguZXhwO1xuICB2YXIgYWJzICA9IE1hdGguYWJzO1xuICB2YXIgcG93ICA9IE1hdGgucG93O1xuICB2YXIgc3FydCA9IE1hdGguc3FydDtcbiAgdmFyIHBpICAgPSBNYXRoLlBJO1xuICBcbiAgLy8vLy8vLy8vLyBDb250aW5vdXMgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgbGQuYmV0YSA9IGZ1bmN0aW9uKHgsIHNoYXBlMSwgc2hhcGUyKSB7XG4gICAgaWYgKHggPiAxIHx8IHggPCAwKSB7XG4gICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIGlmKHNoYXBlMSA9PT0gMSAmJiBzaGFwZTIgPT09IDEpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKHNoYXBlMSAtIDEpICogbG9nKHgpICsgKHNoYXBlMiAtIDEpICogbG9nKDEgLSB4KSAtIGxiZXRhKHNoYXBlMSwgc2hhcGUyKTsgIFxuICAgIH1cbiAgfTtcbiAgXG4gIGxkLmNhdWNoeSA9IGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSkge1xuICAgIHJldHVybiBsb2coc2NhbGUpIC0gbG9nKHBvdyh4IC0gbG9jYXRpb24sIDIpICsgcG93KHNjYWxlLCAyKSkgIC0gbG9nKHBpKTtcbiAgfTtcbiAgXG4gIGxkLm5vcm0gPSBmdW5jdGlvbih4LCBtZWFuLCBzZCkge1xuICAgICAgcmV0dXJuIC0wLjUgKiBsb2coMiAqIHBpKSAtbG9nKHNkKSAtIHBvdyh4IC0gbWVhbiwgMikgLyAoMiAqIHNkICogc2QpO1xuICB9O1xuXG4gIC8vIEEgYml2YXJpYXRlIE5vcm1hbCBkaXN0cmlidXRpb24gcGFyYW1ldGVyaXplZCBieSBhcnJheXMgb2YgdHdvIG1lYW5zIGFuZCBTRHMsIGFuZCBcbiAgLy8gdGhlIGNvcnJlbGF0aW9uLlxuICBsZC5iaXZhcm5vcm0gPSBmdW5jdGlvbih4LCBtZWFuLCBzZCwgY29ycikge1xuICAgIHZhciB6ID0gcG93KHhbMF0gLSBtZWFuWzBdLCAyKSAvIHBvdyhzZFswXSwgMikgK1xuICAgICAgICAgICAgcG93KHhbMV0gLSBtZWFuWzFdLCAyKSAvIHBvdyhzZFsxXSwgMikgLSBcbiAgICAgICAgICAgICgyICogY29yciAqICh4WzBdIC0gbWVhblswXSkgKiAoeFsxXSAtIG1lYW5bMV0pKSAvIChzZFswXSAqIHNkWzFdKTtcbiAgICB2YXIgbm9ybWFsaXppbmdfZmFjdG9yID0gLSggbG9nKDIpICsgbG9nKHBpKSArIGxvZyhzZFswXSkgKyBsb2coc2RbMV0pICsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNSAqIGxvZygxIC0gcG93KGNvcnIsIDIpKSApOyBcbiAgICB2YXIgYml2YXJfbG9nX2RlbnMgPSBub3JtYWxpemluZ19mYWN0b3IgLSB6IC8gKDIgKiAoMSAtIHBvdyhjb3JyLCAyKSApICk7IFxuICAgIHJldHVybiBiaXZhcl9sb2dfZGVucztcbiAgfTtcbiAgXG5cbiAgbGQubGFwbGFjZSA9IGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSkge1xuICAgIHJldHVybiAoLWFicyh4IC0gbG9jYXRpb24pL3NjYWxlKSAtIGxvZygyICogc2NhbGUpO1xuICB9O1xuICBcbiAgbGQuZGV4cCA9IGxkLmxhcGxhY2U7XG4gIFxuICBsZC5nYW1tYSA9IGZ1bmN0aW9uKHgsIHNoYXBlLCByYXRlKSB7XG4gICAgdmFyIHNjYWxlID0gMSAvIHJhdGU7XG4gICAgaWYgKHggPCAwKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICBpZigoeCA9PT0gMCAmJiBzaGFwZSA9PT0gMSkgKSB7XG4gICAgICByZXR1cm4gLWxvZyhzY2FsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoc2hhcGUgLSAxKSAqIGxvZyh4KSAtIHggLyBzY2FsZSAtIGxnYW1tYShzaGFwZSkgLSBzaGFwZSAqIGxvZyhzY2FsZSk7XG4gICAgfVxuICB9O1xuICBcbiAgbGQuaW52Z2FtbWEgPSBmdW5jdGlvbih4LCBzaGFwZSwgc2NhbGUpIHtcbiAgICAgIGlmICh4IDw9IDApIHtcbiAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAtKHNoYXBlICsgMSkgKiBsb2coeCkgLSBzY2FsZSAvIHggLSBsZ2FtbWEoc2hhcGUpICsgc2hhcGUgKiBsb2coc2NhbGUpO1xuICAgIH07XG4gIFxuICBsZC5sbm9ybSA9ICBmdW5jdGlvbih4LCBtZWFubG9nLCBzZGxvZykge1xuICAgIGlmICh4IDw9IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiAtbG9nKHgpIC0gMC41ICogbG9nKDIgKiBwaSkgLSBsb2coc2Rsb2cpIC0gXG4gICAgICAgICAgICBwb3cobG9nKHgpIC0gbWVhbmxvZywgMikgLyAoMiAqIHNkbG9nICogc2Rsb2cpO1xuICB9O1xuICBcbiAgbGQucGFyZXRvID0gZnVuY3Rpb24oeCwgc2NhbGUsIHNoYXBlKSB7XG4gICAgaWYgKHggPCBzY2FsZSkge1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9XG4gICAgcmV0dXJuIGxvZyhzaGFwZSkgKyBzaGFwZSAqIGxvZyhzY2FsZSkgLSAoc2hhcGUgKyAxKSAqIGxvZyh4KTtcbiAgfTtcbiAgXG4gIGxkLnQgID0gIGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSwgZGYpIHtcbiAgICBkZiA9IGRmID4gMWUxMDAgPyAxZTEwMCA6IGRmO1xuICAgIHJldHVybiBsZ2FtbWEoKGRmICsgMSkvMikgLSBsZ2FtbWEoZGYvMikgLSBsb2coc3FydChwaSAqIGRmKSAqIHNjYWxlKSArXG4gICAgICAgICAgIGxvZyhwb3coMSArICgxL2RmKSAqIHBvdygoeCAtIGxvY2F0aW9uKS9zY2FsZSwgMiksIC0oZGYgKyAxKS8yKSk7XG4gIH07XG4gIFxuICAvLyBUaGlzIGlzIGEgZGlyZWN0IGphdmFzY3JpcHQgdHJhbnNsYXRpb24gb2YgdGhlIFIgY29kZSB1c2VkIHRvIGV2YWx1YXRlXG4gIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIHdlaWJ1bGwgZGlzdHJpYnV0aW9uOiBcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2R3ZWlidWxsLmNcbiAgbGQud2VpYnVsbCA9IGZ1bmN0aW9uKHgsIHNoYXBlLCBzY2FsZSkge1xuICAgIGlmICh4IDwgMCkgcmV0dXJuIC1JbmZpbml0eTtcbiAgICBpZih4ID09PSAwICYmIHNoYXBlIDwgMSkgcmV0dXJuIEluZmluaXR5O1xuICAgIHZhciB0bXAxID0gcG93KHggLyBzY2FsZSwgc2hhcGUgLSAxKTtcbiAgICB2YXIgdG1wMiA9IHRtcDEgKiAoeCAvIHNjYWxlKTtcblx0ICByZXR1cm4gLXRtcDIgKyBsb2coc2hhcGUgKiB0bXAxIC8gc2NhbGUpO1xuICB9O1xuICBcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBqYXZhc2NyaXB0IHRyYW5zbGF0aW9uIG9mIHRoZSBSIGNvZGUgdXNlZCB0byBldmFsdWF0ZVxuICAvLyB0aGUgbG9nIGRlbnNpdHkgb2YgYSBsb2dpc3RpYyBkaXN0cmlidXRpb246IFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2NoL3Itc291cmNlL2Jsb2IvYjE1NmUzYTcxMTk2N2Y1ODEzMWUyM2MxYjFkYzFlYTkwZTJmMGM0My9zcmMvbm1hdGgvZGxvZ2lzLmNcbiAgbGQubG9naXMgPSBmdW5jdGlvbih4LCBsb2NhdGlvbiwgc2NhbGUpIHtcbiAgICB4ID0gYWJzKCh4IC0gbG9jYXRpb24pIC8gc2NhbGUpO1xuICAgIHZhciBlID0gZXhwKC14KTtcbiAgICB2YXIgZiA9IDEuMCArIGU7XG4gICAgcmV0dXJuIC0oeCArIGxvZyhzY2FsZSAqIGYgKiBmKSk7ICAgIFxuICB9O1xuXG4gIGxkLmRpcmljaGxldCA9IGZ1bmN0aW9uKHgsIGFscGhhKSB7XG4gICAgdmFyIHN1bV9hbHBoYSA9IDA7XG4gICAgdmFyIHN1bV9sZ2FtbWFfYWxwaGEgPSAwO1xuICAgIHZhciBzdW1fYWxwaGFfc3ViXzFfbG9nX3ggPSAwO1xuICAgIHZhciBuID0gYWxwaGEubGVuZ3RoO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIHN1bV9hbHBoYSArPSBhbHBoYVtpXTtcbiAgICAgIHN1bV9sZ2FtbWFfYWxwaGEgKz0gbGdhbW1hKGFscGhhW2ldKTtcbiAgICAgIHN1bV9hbHBoYV9zdWJfMV9sb2dfeCArPSAoYWxwaGFbaV0gLSAxKSAqIGxvZyh4W2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGxnYW1tYShzdW1fYWxwaGEpIC0gc3VtX2xnYW1tYV9hbHBoYSArIHN1bV9hbHBoYV9zdWJfMV9sb2dfeDtcbiAgfTtcbiAgIFxuICAgIFxuICBsZC5leHAgPSBmdW5jdGlvbih4LCByYXRlKSB7XG4gICAgICByZXR1cm4geCA8IDAgPyAtSW5maW5pdHkgOiBsb2cocmF0ZSkgLXJhdGUgKiB4O1xuICB9O1xuICBcbiAgbGQudW5pZiA9IGZ1bmN0aW9uKHgsIG1pbiwgbWF4KSB7XG4gICAgICByZXR1cm4gKHggPCBtaW4gfHwgeCA+IG1heCkgPyAtSW5maW5pdHkgOiBsb2coMSAvIChtYXggLSBtaW4pKTtcbiAgfTtcbiAgXG4gIC8vLy8vLy8vLy8gRGlzY3JldGUgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIFxuICBsZC5iZXJuID0gZnVuY3Rpb24oeCwgcHJvYikge1xuICAgICAgcmV0dXJuICEoeCA9PT0gMCB8fCB4ID09PSAxKSA/IC1JbmZpbml0eSA6IGxvZyh4ICogcHJvYiArICgxIC0geCkgKiAoMSAtIHByb2IpKTtcbiAgfTtcbiAgXG4gIGxkLmNhdCA9IGZ1bmN0aW9uKHgsIHByb2JzKSB7XG4gICAgaWYoeCA8IDEgfHwgeCA+IHByb2JzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxvZyggcHJvYnNbeCAtIDFdICk7XG4gICAgfVxuICB9O1xuICBcbiAgbGQuYmlub20gPSBmdW5jdGlvbih4LCBzaXplLCBwcm9iKSB7XG4gICAgaWYoeCA+IHNpemUgfHwgeCA8IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIGlmKHByb2IgPT09IDAgfHwgcHJvYiA9PT0gMSkge1xuICAgICAgcmV0dXJuIChzaXplICogcHJvYikgPT09IHggPyAwIDogLUluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gbGNob29zZShzaXplLCB4KSArIHggKiBsb2cocHJvYikgKyAoc2l6ZSAtIHgpICogbG9nKDEgLSBwcm9iKTtcbiAgfTtcbiAgXG4gIHZhciBtdWx0aW5vbSA9IGZ1bmN0aW9uKHgsIHByb2JzKSB7XG4gICAgdmFyIG4gPSB4Lmxlbmd0aDtcbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgdmFyIHRtcF90ZXJtID0gMDtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBpZihwcm9ic1tpXSA9PT0gMCkge1xuICAgICAgICBpZih4W2ldICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsgIFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplICs9IHhbaV07XG4gICAgICAgIHRtcF90ZXJtICs9IHhbaV0gKiBsb2cocHJvYnNbaV0pIC0gbGdhbW1hKHhbaV0gKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxnYW1tYShzaXplICsgMSkgKyB0bXBfdGVybSA7XG4gIH07XG4gIFxuICBsZC5uYmlub20gPSBmdW5jdGlvbih4LCBzaXplLCBwcm9iKSB7XG4gICAgaWYoeCA8IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiBsY2hvb3NlKHggKyBzaXplIC0gMSwgc2l6ZSAtIDEpICsgeCAqIGxvZygxIC0gcHJvYikgKyBzaXplICogbG9nKHByb2IpO1xuICB9O1xuICBcbiAgbGQuaHlwZXIgPSBmdW5jdGlvbih4LCBtLCBuLCBrKSB7XG4gICAgaWYoeCA8IDAgfHwgeCA+IGspIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGNob29zZShtLCB4KSArIGxjaG9vc2Uobiwgay14KSAtIGxjaG9vc2UobStuLCBrKTtcbiAgICB9XG4gIH07XG4gIFxuICBsZC5wb2lzID0gZnVuY3Rpb24oeCwgbGFtYmRhKSB7XG4gICAgICByZXR1cm4geCA8IDAgPyAtSW5maW5pdHkgOiBsb2cobGFtYmRhKSAqIHggLSBsYW1iZGEgLSBsZmFjdG9yaWFsKHgpO1xuICB9O1xuICBcbiAgcmV0dXJuIGxkO1xufSkpOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanNcbi8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLFxuLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuXG4vLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWxcbi8vIG9iamVjdCBtY21jIC5cbihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLlxuICAgICAgICBkZWZpbmUoW10sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0XG4gICAgICAgIC8vIG9ubHkgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLFxuICAgICAgICAvLyBsaWtlIE5vZGUuXG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpXG4gICAgICAgIHJvb3QubWNtYyA9IGZhY3RvcnkoKTtcbiAgfVxufSh0aGlzLCBmdW5jdGlvbigpe1xuXG4vLy8gVGhlIGFjdHVhbCBtb2R1bGUgY29kZSBzdGFydHMgaGVyZSAvLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgXG4gIFxuICAvLy8vLy8vLy8vIEhlbHBlciBGdW5jdGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgLyoqIFJldHVybnMgYSByYW5kb20gcmVhbCBudW1iZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAqL1xuICB2YXIgcnVuaWYgPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikgKyBtaW47XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbWluIGFuZCBtYXggKi9cbiAgdmFyIHJ1bmlmX2Rpc2NyZXRlID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjtcbiAgfTtcbiAgXG4gIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGZyb20gYSBub3JtYWwgZGlzdHJpYmJ1dGlvbiBkZWZpbmVkXG4gICAqICBieSBtZWFuIGFuZCBzZC4gXG4gICAqICBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0L2pzdGF0L2Jsb2IvbWFzdGVyL3NyYy9zcGVjaWFsLmpzICovXG4gIHZhciBybm9ybSA9IGZ1bmN0aW9uKG1lYW4sIHNkKSB7XG4gICAgdmFyIHUsIHYsIHgsIHksIHE7XG4gICAgZG8ge1xuICAgICAgdSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICB2ID0gMS43MTU2ICogKE1hdGgucmFuZG9tKCkgLSAwLjUpO1xuICAgICAgeCA9IHUgLSAwLjQ0OTg3MTtcbiAgICAgIHkgPSBNYXRoLmFicyh2KSArIDAuMzg2NTk1O1xuICAgICAgcSA9IHggKiB4ICsgeSAqICgwLjE5NjAwICogeSAtIDAuMjU0NzIgKiB4KTtcbiAgICB9IHdoaWxlIChxID4gMC4yNzU5NyAmJiAocSA+IDAuMjc4NDYgfHwgdiAqIHYgPiAtNCAqIE1hdGgubG9nKHUpICogdSAqIHUpKTtcbiAgICBcbiAgICByZXR1cm4gKHYgLyB1KSAqIHNkICsgbWVhbjtcbiAgfTtcbiAgXG4gIFxuICAvKiogUmV0dXJucyBhIGRlZXAgY2xvbmUgb2Ygc3JjLCBzb3J0IG9mLi4uIEl0IG9ubHkgY29waWVzIGEgbGltaXRlZFxuICAgKiBudW1iZXIgb2YgdHlwZXMgYW5kLCBmb3IgZXhhbXBsZSwgZnVuY3Rpb24gYXJlIG5vdCBjb3BpZWQuIFxuICAgKiBGcm9tIGh0dHA6Ly9kYXZpZHdhbHNoLm5hbWUvamF2YXNjcmlwdC1jbG9uZVxuICAgKi9cbiAgdmFyIGRlZXBfY2xvbmUgPSBmdW5jdGlvbihzcmMpIHtcbiAgXHRmdW5jdGlvbiBtaXhpbihkZXN0LCBzb3VyY2UsIGNvcHlGdW5jKSB7XG4gIFx0XHR2YXIgbmFtZSwgcywgaSwgZW1wdHkgPSB7fTtcbiAgXHRcdGZvcihuYW1lIGluIHNvdXJjZSl7XG4gIFx0XHRcdC8vIHRoZSAoIShuYW1lIGluIGVtcHR5KSB8fCBlbXB0eVtuYW1lXSAhPT0gcykgY29uZGl0aW9uIGF2b2lkcyBjb3B5aW5nIHByb3BlcnRpZXMgaW4gXCJzb3VyY2VcIlxuICBcdFx0XHQvLyBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG90eXBlLlx0IEZvciBleGFtcGxlLCBpZiBkZXN0IGhhcyBhIGN1c3RvbSB0b1N0cmluZygpIG1ldGhvZCxcbiAgXHRcdFx0Ly8gZG9uJ3Qgb3ZlcndyaXRlIGl0IHdpdGggdGhlIHRvU3RyaW5nKCkgbWV0aG9kIHRoYXQgc291cmNlIGluaGVyaXRlZCBmcm9tIE9iamVjdC5wcm90b3R5cGVcbiAgXHRcdFx0cyA9IHNvdXJjZVtuYW1lXTtcbiAgXHRcdFx0aWYoIShuYW1lIGluIGRlc3QpIHx8IChkZXN0W25hbWVdICE9PSBzICYmICghKG5hbWUgaW4gZW1wdHkpIHx8IGVtcHR5W25hbWVdICE9PSBzKSkpe1xuICBcdFx0XHRcdGRlc3RbbmFtZV0gPSBjb3B5RnVuYyA/IGNvcHlGdW5jKHMpIDogcztcbiAgXHRcdFx0fVxuICBcdFx0fVxuICBcdFx0cmV0dXJuIGRlc3Q7XG4gIFx0fVxuICBcdGlmKCFzcmMgfHwgdHlwZW9mIHNyYyAhPSBcIm9iamVjdFwiIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzcmMpID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCIpe1xuICBcdFx0Ly8gbnVsbCwgdW5kZWZpbmVkLCBhbnkgbm9uLW9iamVjdCwgb3IgZnVuY3Rpb25cbiAgXHRcdHJldHVybiBzcmM7XHQvLyBhbnl0aGluZ1xuICBcdH1cbiAgXHRpZihzcmMubm9kZVR5cGUgJiYgXCJjbG9uZU5vZGVcIiBpbiBzcmMpe1xuICBcdFx0Ly8gRE9NIE5vZGVcbiAgXHRcdHJldHVybiBzcmMuY2xvbmVOb2RlKHRydWUpOyAvLyBOb2RlXG4gIFx0fVxuICBcdGlmKHNyYyBpbnN0YW5jZW9mIERhdGUpe1xuICBcdFx0Ly8gRGF0ZVxuICBcdFx0cmV0dXJuIG5ldyBEYXRlKHNyYy5nZXRUaW1lKCkpO1x0Ly8gRGF0ZVxuICBcdH1cbiAgXHRpZihzcmMgaW5zdGFuY2VvZiBSZWdFeHApe1xuICBcdFx0Ly8gUmVnRXhwXG4gIFx0XHRyZXR1cm4gbmV3IFJlZ0V4cChzcmMpOyAgIC8vIFJlZ0V4cFxuICBcdH1cbiAgXHR2YXIgciwgaSwgbDtcbiAgXHRpZihzcmMgaW5zdGFuY2VvZiBBcnJheSl7XG4gIFx0XHQvLyBhcnJheVxuICBcdFx0ciA9IFtdO1xuICBcdFx0Zm9yKGkgPSAwLCBsID0gc3JjLmxlbmd0aDsgaSA8IGw7ICsraSl7XG4gIFx0XHRcdGlmKGkgaW4gc3JjKXtcbiAgXHRcdFx0XHRyLnB1c2goZGVlcF9jbG9uZShzcmNbaV0pKTtcbiAgXHRcdFx0fVxuICBcdFx0fVxuICBcdH0gZWxzZSB7XG4gIFx0XHQvLyBnZW5lcmljIG9iamVjdHNcbiAgXHRcdHIgPSBzcmMuY29uc3RydWN0b3IgPyBuZXcgc3JjLmNvbnN0cnVjdG9yKCkgOiB7fTtcbiAgXHR9XG4gIFx0cmV0dXJuIG1peGluKHIsIHNyYywgZGVlcF9jbG9uZSk7XG4gIH07XG4gIFxuICAvKiogU3BlY2lhbGl6ZWQgY2xvbmUgZnVuY3Rpb24gdGhhdCBvbmx5IGNsb25lcyBzY2FsYXJzIGFuZCBuZXN0ZWQgYXJyYXlzIHdoZXJlXG4gICAqIGVhY2ggYXJyYXkgZWl0aGVyIGNvbnNpc3RzIG9mIGFsbCBhcnJheXMgb3IgYWxsIG51bWJlcnMuIFRoaXMgZnVuY3Rpb25cbiAgICogaXMgbWVhbnQgYXMgYSBmYXN0IHdheSBvZiBjbG9uaW5nIHBhcmFtZXRlciBkcmF3cyB3aXRoaW4gdGhlIG1jbWMgc2FtcGxpbmdcbiAgICogbG9vcC5cbiAgICovXG4gIHZhciBjbG9uZV9wYXJhbV9kcmF3ID0gZnVuY3Rpb24oeCkge1xuICAgIGlmKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgIGlmKEFycmF5LmlzQXJyYXkoeFswXSkpIHtcbiAgICAgICAgLy8geCBpcyBhbiBhcnJheSBvZiBhcnJheXMgc28gd2UgbmVlZCB0byBjbG9uZSBpdCByZWN1cnNpdmVseVxuICAgICAgICB2YXIgeF9jb3B5ID0gW107XG4gICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbmd0aCA9IHgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB4X2NvcHkucHVzaChjbG9uZV9wYXJhbV9kcmF3KHhbaV0pKTtcbiAgICAgICAgfSBcbiAgICAgICAgcmV0dXJuIHhfY29weTtcbiAgICAgIH0gZWxzZSB7IC8vIFdlJ2xsIGFzc3VtZSB4IGlzIGEgYXJyYXlzIG9mIHNjYWxhcnNcbiAgICAgICAgcmV0dXJuIHguc2xpY2UoMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBzY2FsYXJcbiAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIGEgbnVtYmVyLlxuICAgKi9cbiAgdmFyIGlzX251bWJlciA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT0gXCJudW1iZXJcIiB8fCAodHlwZW9mIG9iamVjdCA9PSBcIm9iamVjdFwiICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIChwb3NzaWJseSBtdWx0aWRpbWVuc2lvbmFsL25lc3RlZCkgYXJyYXkuXG4gICAqIEBwYXJhbSBkaW0gLSBBbiBhcnJheSBnaXZpbmcgdGhlIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkuIEZvciBleGFtcGxlLFxuICAgKiAgIFs1XSB3b3VsZCB5aWVsZCBhIDUgZWxlbWVudCBhcnJheSwgYW5kIFszLDNdIHdvdWxkIHlpZWxkIGEgMyBieSAzIG1hdHJpeC5cbiAgICogQHBhcmFtIGluaXQgLSBBIHZhbHVlIG9yIGEgZnVuY3Rpb24gdXNlZCB0byBmaWxsIGluIHRoZSBlYWNoIGVsZW1lbnQgaW5cbiAgICogICB0aGUgYXJyYXkuIElmIGl0IGlzIGEgZnVuY3Rpb24gaXQgc2hvdWxkIHRha2Ugbm8gYXJndW1lbnRzLCBpdCB3aWxsIGJlIFxuICAgKiAgIGV2YWx1YXRlZCBvbmNlIGZvciBlYWNoIGVsZW1lbnQsIGFuZCBpdCdzIHJldHVybiB2YWx1ZSB3aWxsIGJlIHVzZWQgdG9cbiAgICogICBmaWxsIGluIGVhY2ggZWxlbWVudC5cbiAgICogQGV4YW1wbGUgXG4gICAqIC8vIFRoZSBmb2xsb3dpbmcgd291bGQgcmV0dXJuIFtbMSwxXSxbMSwxXSxbMSwxXV1cbiAgICogY3JlYXRlX2FycmF5KFsyLDNdLCAxKVxuICAgKi9cbiAgdmFyIGNyZWF0ZV9hcnJheSA9IGZ1bmN0aW9uKGRpbSwgaW5pdCkge1xuICAgIHZhciBhcnIgPSBuZXcgQXJyYXkoZGltWzBdKTtcbiAgICB2YXIgaTtcbiAgICBpZihkaW0ubGVuZ3RoID09IDEpIHsgLy8gRmlsbCBpdCB1cCB3aXRoIGluaXRcbiAgICAgIGlmKHR5cGVvZiBpbml0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBhcnJbaV0gPSBpbml0KCk7XG4gICAgICAgIH0gIFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBhcnJbaV0gPSBpbml0O1xuICAgICAgICB9IFxuICAgICAgfVxuICAgIH0gZWxzZSBpZihkaW0ubGVuZ3RoID4gMSkge1xuICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gY3JlYXRlX2FycmF5KGRpbS5zbGljZSgxKSwgaW5pdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiY3JlYXRlX2FycmF5IGNhbid0IGNyZWF0ZSBhIGRpbWVuc2lvbmxlc3MgYXJyYXlcIjtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRpbWVuc2lvbnMgb2YgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYXMgYW4gYXJyYXkuIEZvciBcbiAgICogZXhhbXBsZSwgYXJyYXlfZGltKCBbWzEsIDJdLCBbMSwgMl1dICkgc2hvdWxkIHJldHVybiBbMiwgMl1cbiAgICogQXNzdW1lcyB0aGF0IGFsbCBhcnJheXMgaW5zaWRlIGFub3RoZXIgYXJyYXkgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aC5cbiAgICogQGV4YW1wbGVcbiAgICogLy8gU2hvdWxkIHJldHVybiBbNCwgMiwgMV1cbiAgICogYXJyYXlfZGltKGNyZWF0ZV9hcnJheShbNCwgMiwgMV0sIDApKVxuICAgKi9cbiAgdmFyIGFycmF5X2RpbSA9IGZ1bmN0aW9uKGEpIHtcbiAgICBpZihBcnJheS5pc0FycmF5KGFbMF0pKSB7XG4gICAgICByZXR1cm4gW2EubGVuZ3RoXS5jb25jYXQoYXJyYXlfZGltKGFbMF0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFthLmxlbmd0aF07XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0d28gYXJyYXlzIGFyZSBlcXVhbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHNcbiAgICogYXMganVkZ2VkIGJ5IHRoZSBcIj09XCIgb3BlcmF0b3IuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS5cbiAgICogQWRhcHRlZCBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0ODUzOTc0LzEwMDE4NDhcbiAgICovIFxuICB2YXIgYXJyYXlfZXF1YWwgPSBmdW5jdGlvbiAoYTEsIGEyKSB7XG4gICAgICBpZiAoYTEubGVuZ3RoICE9IGEyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5c1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGExW2ldKSAmJiBBcnJheS5pc0FycmF5KGEyW2ldKSkge1xuICAgICAgICAgICAgICAvLyByZWN1cnNlIGludG8gdGhlIG5lc3RlZCBhcnJheXNcbiAgICAgICAgICAgICAgaWYgKCFhcnJheV9lcXVhbChhMVtpXSwgYTJbaV0pKSByZXR1cm4gZmFsc2U7ICAgICAgIFxuICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgICAgIGVsc2UgaWYgKGExW2ldICE9IGEyW2ldKSB7IFxuICAgICAgICAgICAgICAvLyBXYXJuaW5nIC0gdHdvIGRpZmZlcmVudCBvYmplY3QgaW5zdGFuY2VzIHdpbGwgbmV2ZXIgYmUgZXF1YWw6IHt4OjIwfSAhPSB7eDoyMH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIFxuICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgfSAgICAgICBcbiAgICAgIHJldHVybiB0cnVlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRyYXZlcnNlcyBhIHBvc3NpYmx5IG5lc3RlZCBhcnJheSBhIGFuZCBhcHBsaWVzIGZ1biB0byBhbGwgXCJsZWFmIG5vZGVzXCIsIFxuICAgKiB0aGF0IGlzLCB2YWx1ZXMgdGhhdCBhcmUgbm90IGFycmF5cy4gUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaXplIGFzXG4gICAqIGEuXG4gICAqL1xuICB2YXIgbmVzdGVkX2FycmF5X2FwcGx5ID0gZnVuY3Rpb24oYSwgZnVuKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheShhLmxlbmd0aCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHRbaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVtpXSwgZnVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmdW4oYSk7XG4gICAgfVxuICB9O1xuICBcbiAgLyoqIFJhbmRvbWl6aW5nIHRoZSBhcnJheSBlbGVtZW50IG9yZGVyIGluLXBsYWNlLiBVc2luZyBEdXJzdGVuZmVsZFxuICAgKiBzaHVmZmxlIGFsZ29yaXRobS4gQWRhcHRlZCBmcm9tIGhlcmU6IFxuICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMjY0Njg2NC8xMDAxODQ4XG4gICAqL1xuICBmdW5jdGlvbiBzaHVmZmxlX2FycmF5KGFycmF5KSB7XG4gICAgICBmb3IgKHZhciBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgIHZhciBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgdmFyIHRlbXAgPSBhcnJheVtpXTtcbiAgICAgICAgICBhcnJheVtpXSA9IGFycmF5W2pdO1xuICAgICAgICAgIGFycmF5W2pdID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERvZXMgdGhlIHNhbWUgdGhpbmcgYXMgbmVzdGVkX2FycmF5X2FwcGx5LCB0aGF0IGlzLCB0cmF2ZXJzZXMgYSBwb3NzaWJseVxuICAgKiBuZXN0ZWQgYXJyYXkgYSBhbmQgYXBwbGllcyBmdW4gdG8gYWxsIFwibGVhZiBub2Rlc1wiIGFuZCByZXR1cm5zIGFuIGFycmF5IFxuICAgKiBvZiB0aGUgc2FtZSBzaXplIGFzIGEuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseVxuICAgKiBicmFuY2hlcyByYW5kb21seS5cbiAgICovXG4gIHZhciBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5ID0gZnVuY3Rpb24oYSwgZnVuKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgdmFyIGxlbiA9IGEubGVuZ3RoO1xuICAgICAgdmFyIGk7XG4gICAgICB2YXIgYXJyYXlfaXMgPSBbXTtcbiAgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGFycmF5X2lzW2ldID0gaTtcbiAgICAgIH1cbiAgICAgIHNodWZmbGVfYXJyYXkoYXJyYXlfaXMpO1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgXG4gICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgYXJyYXlfaSA9IGFycmF5X2lzW2ldO1xuICAgICAgICByZXN1bHRbYXJyYXlfaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVthcnJheV9pXSwgZnVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmdW4oYSk7XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIEFsbG93cyBhIHByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZnVsdHMgY2FuIGJlXG4gICAqIG92ZXJyaWRkZW4gYnkgYW4gb3B0aW9ucyBvYmplY3QuXG4gICAqICBAcGFyYW0gb3B0aW9uX25hbWUgLSB0aGUgbmFtZSBvZiB0aGUgb3B0aW9uIGFzIGEgc3RyaW5nXG4gICAqICBAcGFyYW0gbXlfb3B0aW9ucyAtIGFuIG9wdGlvbiBvYmplY3QgdGhhdCBjb3VsZCBoYXZlIG9wdGlvbl9uYW1lIFxuICAgKiAgICBhcyBhIG1lbWJlci5cbiAgICogQHBhcmFtIGRlZmF1bF92YWx1ZSAtIGRlZnVsdCB2YWx1ZSB0aGF0IGlzIHJldHVybmVkIGlmIG9wdGlvbl9uYW1lIFxuICAgKiAgIGlzIG5vdCBkZWZpbmVkIGluIG15X29wdGlvbnMuXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBteV9vcHRpb25zID0ge3BpOiAzLjE0MTU5fVxuICAgKiB2YXIgcGkgPSBnZXRfb3B0aW9uKFwicGlcIiwgbXlfb3B0aW9ucywgMy4xNClcbiAgICovXG4gIC8vIFByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuXG4gIC8vIGJ5IGFuIG9wdGlvbnMgb2JqZWN0LiBGb3IgZXhhbXBsZTpcbiAgLy8gdmFyIHBpID0gZ2V0X29wdGlvbihcInBpXCIsIG15X29wdGlvbnMsIDMuMTQpXG4gIHZhciBnZXRfb3B0aW9uID0gZnVuY3Rpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSkge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBvcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbl9uYW1lKSAmJiBcbiAgICAgICAgICAgb3B0aW9uc1tvcHRpb25fbmFtZV0gIT09IHVuZGVmaW5lZCAgJiYgXG4gICAgICAgICAgIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSBudWxsID8gb3B0aW9uc1tvcHRpb25fbmFtZV0gOiBkZWZhdWxfdmFsdWU7XG4gIH07XG4gIFxuICAvKiogVmVyc2lvbiBvZiBnZXRfb3B0aW9uIHdoZXJlIHRoZSBvcHRpb24gc2hvdWxkIGJlIGEgb25lIG9yIG11bHRpLWRpbWVuc2lvbmFsXG4gICAqIGFycmF5IGFuZCB3aGVyZSB0aGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBlaXRoZXIgYnkgYSBzY2FsYXIgb3IgYnkgYW4gYXJyYXkuXG4gICAqIElmIGl0J3MgYSBzY2FsYXIgdGhlIHRoYXQgc2NhbGFyIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBhcnJheSB3aXRoIFxuICAgKiBkaW0gZGltZW5zaW9ucy5cbiAgICogXG4gICAqL1xuICB2YXIgZ2V0X211bHRpZGltX29wdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkaW0sIGRlZmF1bF92YWx1ZSkge1xuICAgIHZhciB2YWx1ZSA9IGdldF9vcHRpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSk7XG4gICAgIGlmKCEgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICB2YWx1ZSA9IGNyZWF0ZV9hcnJheShkaW0sIHZhbHVlKTtcbiAgICAgfSBcbiAgICAgaWYoISBhcnJheV9lcXVhbCggYXJyYXlfZGltKHZhbHVlKSwgZGltKSkge1xuICAgICAgIHRocm93IFwiVGhlIG9wdGlvbiBcIiArIG9wdGlvbl9uYW1lICsgXCIgaXMgb2YgZGltZW5zaW9uIFtcIiArIFxuICAgICAgICAgICAgIGFycmF5X2RpbSh2YWx1ZSkgKyBcIl0gYnV0IHNob3VsZCBiZSBbXCIgKyBkaW0gKyBcIl0uXCI7XG4gICAgfVxuICAgICByZXR1cm4gdmFsdWU7XG4gIH07XG4gIFxuICAvLy8vLy8vLy8vIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgcGFyYW1ldGVyIG9iamVjdHMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgLyoqXG4gICAqIFJldHVybnMgYSBmaXhlZCAoc2FtZSBldmVyeSB0aW1lKSBudW1iZXIgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgICogYSBwYXJhbWV0ZXIgb2YgYSBjZXJ0YWluIHR5cGUsIHBvc3NpYmx5IHdpdGggbG93ZXIgYW5kIHVwcGVyIGJvdW5kcy5cbiAgICogVGhlIHBvc3NpbGUgdHlwZXMgYXJlIFwicmVhbFwiLCBcImludFwiLCBhbmQgXCJiaW5hcnlcIi5cbiAgICovXG4gIHZhciBwYXJhbV9pbml0X2ZpeGVkID0gZnVuY3Rpb24odHlwZSwgbG93ZXIsIHVwcGVyKSB7XG4gICAgaWYobG93ZXIgPiB1cHBlcikge1xuICAgICAgdGhyb3cgXCJDYW4gbm90IGluaXRpYWxpemUgcGFyYW1ldGVyIHdoZXJlIGxvd2VyIGJvdW5kID4gdXBwZXIgYm91bmRcIjtcbiAgICB9XG4gICAgaWYodHlwZSA9PT0gXCJyZWFsXCIpIHtcbiAgICAgIGlmKGxvd2VyID09PSAtSW5maW5pdHkgJiYgdXBwZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiAwLjU7XG4gICAgICB9IGVsc2UgaWYobG93ZXIgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gdXBwZXIgLSAwLjU7XG4gICAgICB9IGVsc2UgaWYodXBwZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiBsb3dlciArIDAuNTtcbiAgICAgIH0gZWxzZSBpZihsb3dlciA8PSB1cHBlcikge1xuICAgICAgICByZXR1cm4gKGxvd2VyICsgdXBwZXIpIC8gMjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYodHlwZSA9PT0gXCJpbnRcIikge1xuICAgICAgaWYobG93ZXIgPT09IC1JbmZpbml0eSAmJiB1cHBlciA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYobG93ZXIgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gdXBwZXIgLSAxO1xuICAgICAgfSBlbHNlIGlmKHVwcGVyID09PSBJbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gbG93ZXIgKyAxO1xuICAgICAgfSBlbHNlIGlmKGxvd2VyIDw9IHVwcGVyKXtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKGxvd2VyICsgdXBwZXIpIC8gMik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKHR5cGUgPT09IFwiYmluYXJ5XCIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICB0aHJvdyBcIkNvdWxkIG5vdCBpbml0aWFsaXplIHBhcmFtZXRlciBvZiB0eXBlIFwiICsgdHlwZSArIFwiW1wiICsgbG93ZXIgKyBcIiwgXCIgKyB1cHBlciArIFwiXVwiO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIENvbXBsZXRlcyBwYXJhbXNfdG9fY29tcGxldGUsIGFuIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMsIFxuICAgKiBhbmQgaW5pdGlhbGl6ZXMgbm9uLWluaXRpYWxpemVkIHBhcmFtZXRlcnMuIFRoaXMgbW9kaWZpZWQgdmVyc2lvbiBvZlxuICAgKiBwYXJhbXNfdG9fY29tcGxldGUgaXMgcmV0dXJuZWQgYXMgYSBkZWVwIGNvcHkgYW5kIG5vdCBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBieSBzdXBwbHlpbmcgYSBwYXJhbV9pbml0IGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlXG4gICAqIGZ1bmN0aW9uKHR5cGUsIGxvd2VyLCB1cHBlcikgdGhhdCBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIG51bWJlciBcbiAgICogKGxpa2UgcGFyYW1faW5pdF9maXhlZCwgZm9yIGV4YW1wbGUpLlxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgcGFyYW1zID0geyBcIm11XCI6IHtcInR5cGVcIjogXCJyZWFsXCJ9IH1cbiAgICogcGFyYW1zID0gY29tcGxldGVfcGFyYW1zKHBhcmFtcyk7XG4gICAqIC8vIHBhcmFtcyBzaG91bGQgbm93IGJlOlxuICAgKiAvLyAge1wibXVcIjogeyBcInR5cGVcIjogXCJyZWFsXCIsIFwiZGltXCI6IFsxXSwgXCJ1cHBlclwiOiBJbmZpbml0eSxcbiAgICogLy8gICAgICAgICAgIFwibG93ZXJcIjogLUluZmluaXR5LCBcImluaXRcIjogMC41IH19XG4gICAqLyBcbiAgdmFyIGNvbXBsZXRlX3BhcmFtcyAgPSBmdW5jdGlvbihwYXJhbXNfdG9fY29tcGxldGUsIHBhcmFtX2luaXQpIHtcbiAgICB2YXIgcGFyYW1zID0gZGVlcF9jbG9uZShwYXJhbXNfdG9fY29tcGxldGUpO1xuICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gcGFyYW1zKSB7IGlmICghcGFyYW1zLmhhc093blByb3BlcnR5KHBhcmFtX25hbWUpKSBjb250aW51ZTtcbiAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1twYXJhbV9uYW1lXTtcbiAgICAgIGlmKCAhcGFyYW0uaGFzT3duUHJvcGVydHkoXCJ0eXBlXCIpKSB7XG4gICAgICAgIHBhcmFtLnR5cGUgPSBcInJlYWxcIjtcbiAgICAgIH1cbiAgICAgIGlmKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eShcImRpbVwiKSkge1xuICAgICAgICBwYXJhbS5kaW0gPSBbMV07XG4gICAgICB9XG4gICAgICBpZihpc19udW1iZXIocGFyYW0uZGltKSkge1xuICAgICAgICBwYXJhbS5kaW0gPSBbcGFyYW0uZGltXTtcbiAgICAgIH1cbiAgICAgIGlmKHBhcmFtLnR5cGUgPT0gXCJiaW5hcnlcIikge1xuICAgICAgICBwYXJhbS51cHBlciA9IDE7XG4gICAgICAgIHBhcmFtLmxvd2VyID0gMDtcbiAgICAgIH1cbiAgICAgIGlmKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eShcInVwcGVyXCIpKSB7XG4gICAgICAgIHBhcmFtLnVwcGVyID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgICBpZighcGFyYW0uaGFzT3duUHJvcGVydHkoXCJsb3dlclwiKSkge1xuICAgICAgICBwYXJhbS5sb3dlciA9IC1JbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYocGFyYW0uaGFzT3duUHJvcGVydHkoXCJpbml0XCIpKSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMganVzdCBhIG51bWJlciBvciBhIG5lc3RlZCBhcnJheSB3ZSBsZWF2ZSBpdCBhbG9uZSwgYnV0IGlmLi4uXG4gICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSAmJiB0eXBlb2YgcGFyYW0uaW5pdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gcGFyYW0uaW5pdCBpcyBhIGZ1bmN0aW9uLCB1c2UgdGhhdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgICAgcGFyYW0uaW5pdCA9IHBhcmFtLmluaXQoKTtcbiAgICAgICAgfSBlbHNlIGlmKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0uaW5pdCkpIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBhIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyIHdoZXJlIHRoZSBwYXJhbS5pbml0IGV4aXN0IGJ1dFxuICAgICAgICAvLyBpcyBub3QgYW4gYXJyYXkuIFRoZW4gYXNzdW1lIGl0IGlzIGEgbnVtYmVyIG9yIGEgZnVuY3Rpb24gYW5kIHVzZVxuICAgICAgICAvLyBpdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBwYXJhbS5pbml0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHsgLy8gV2UgdXNlIHRoZSBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLlxuICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbV9pbml0KHBhcmFtLnR5cGUsIHBhcmFtLmxvd2VyLCBwYXJhbS51cHBlcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfTtcbiAgXG4gIFxuICAvLy8vLy8vLy8vIFN0ZXBwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIFxuICAvKipcbiAgICogQGludGVyZmFjZVxuICAgKiBBIFN0ZXBwZXIgaXMgYW4gb2JqZWN0IHJlc3BvbnNpYmxlIGZvciBwdXNoaW5nIGFyb3VuZCBvbmVcbiAgICogb3IgbW9yZSBwYXJhbWV0ZXIgdmFsdWVzIGluIGEgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBkaXN0cmlidXRpb25cbiAgICogZGVmaW5lZCBieSB0aGUgbG9nIHBvc3Rlcmlvci4gVGhpcyBkZWZpbmVzIHRoZSBTdGVwcGVyIFwiaW50ZXJmYWNlXCIsXG4gICAqIHdoZXJlIFwiaW50ZXJmYWNlXCIgbWVhbnMgdGhhdCBTdGVwcGVyIGRlZmluZXMgYSBjbGFzcyB0aGF0IGlzIG5ldmVyXG4gICAqIG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCwgYnV0IGp1c3QgdG8gYmUgc3ViY2xhc3NlZCBieSBzcGVjaWFsaXplZFxuICAgKiBzdGVwcGVyIGZ1bmN0aW9ucy5cbiAgICogQGludGVyZmFjZVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggcGFyYW1ldGVyIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZTpcbiAgICogICB7XCJtdVwiOiB7IFwidHlwZVwiOiBcInJlYWxcIiwgXCJkaW1cIjogWzFdLCBcInVwcGVyXCI6IEluZmluaXR5LCBcbiAgICogICBcImxvd2VyXCI6IC1JbmZpbml0eSwgXCJpbml0XCI6IDAuNSB9fVxuICAgKiAgIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGJlIFwiY29tcGxldGVcIiwgdGhhdCBpcyxcbiAgICogICBzcGVjaWZ5aW5nIGFsbCByZWxldmFudCBhdHRyaWJ1dGVzIHN1Y2ggYXMgZGltLCBsb3dlciBhbmQgdXBwZXIuXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycyBpbiBwYXJhbXNcbiAgICogICAoYW5kIHBvc3NpYmx5IG1vcmUpLiBUaGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBnaXZlbiBhcyBrZXlzIGFuZCB0aGUgc3RhdGVzXG4gICAqICAgYXMgc2NhbGFycyBvciwgcG9zc2libHkgbmVzdGVkLCBhcnJheXMuIEZvciBleGFtcGxlOlxuICAgKiAgIHttdTogMTAsIHNpZ21hOiA1LCBiZXRhOiBbMSwgMi41XX1cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiAqdGFraW5nIG5vIHBhcmFtZXRlcnMqIHRoYXQgcmV0dXJucyB0aGVcbiAgICogICBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBUaGF0IGlzLCB0aGUgdmFsdWUgb2YgbG9nX3Bvc3RcbiAgICogICBzaG91bGQgY2hhbmdlIGlmIHRoZSB0aGUgdmFsdWVzIGluIHN0YXRlIGFyZSBjaGFuZ2VkLlxuICBcbiAgICovXG4gIHZhciBTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpIHtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5sb2dfcG9zdCA9IGxvZ19wb3N0O1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBTaG91bGQgcmV0dXJuIHRoZSBuZXcgc3RhdGUsXG4gICAqIGJ1dCBpcyBtYWlubHkgY2FsbGVkIGZvciBpdCdzIHNpZGUgZWZmZWN0IG9mIG1ha2luZyBhIGNoYW5nZSBpbiB0aGVcbiAgICogc3RhdGUgb2JqZWN0LlxuICAgKi9cbiAgU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHRocm93IFwiRXZlcnkgU3RlcHBlciBuZWVkIHRvIGltcGxlbWVudCBzdGVwKClcIjtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBJZiBpbXBsZW1lbnRlZCwgbWFrZXMgdGhlIHN0ZXBwZXIgYWRhcHQgd2hpbGUgc3RlcHBpbmcuXG4gICAqLyBcbiAgU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gXG4gIH07XG4gIFxuICAvKipcbiAgICogSWYgaW1wbGVtZW50ZWQsIG1ha2VzIHRoZSBzdGVwcGVyIGNlYXNlIGFkYXB0aW5nIHdoaWxlIHN0ZXBwaW5nLlxuICAgKi8gXG4gIFN0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gXG4gIH07XG4gIFxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmcgaW5mbyByZWdhcmRpbmcgdGhlIHN0ZXBwZXIuXG4gICAqLyBcbiAgU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHN0ZXBwZXIuXG4gICAgcmV0dXJuIHt9O1xuICB9O1xuICBcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBtZXRyb3BvbGlzIHN0ZXAgaW5cbiAgICogdGhlIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiBcIkV4YW1wbGVzIG9mIEFkYXB0aXZlIE1DTUNcIlxuICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICAqIEBwYXJhbSBnZW5lcmF0ZV9wcm9wb3NhbCAtIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgcHJvcG9zYWwgKGFzIGEgbnVtYmVyKVxuICAgKiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgbG9nX3NjYWxlKSB3aGVyZSBwYXJhbV9zdGF0ZSBpcyBhXG4gICAqIG51bWJlciBhbmQgbG9nX3NjYWxlIGRlZmluZXMgdGhlIHNjYWxlIG9mIHRoZSBwcm9wb3NhbCBzb21laG93LlxuICAqL1xuICB2YXIgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgZ2VuZXJhdGVfcHJvcG9zYWwpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIFxuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggICE9IDEpIHtcbiAgICAgIHRocm93IFwiT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgY2FuIG9ubHkgaGFuZGxlIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07XG4gICAgaWYoIWFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgdGhyb3cgXCJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBjYW4gb25seSBoYW5kbGUgb25lIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMubG93ZXIgPSBwYXJhbS5sb3dlcjtcbiAgICB0aGlzLnVwcGVyID0gcGFyYW0udXBwZXI7XG4gICAgXG4gICAgdGhpcy5wcm9wX2xvZ19zY2FsZSAgICAgPSBnZXRfb3B0aW9uKFwicHJvcF9sb2dfc2NhbGVcIiwgb3B0aW9ucywgMCk7XG4gICAgdGhpcy5iYXRjaF9zaXplICAgICAgICAgPSBnZXRfb3B0aW9uKFwiYmF0Y2hfc2l6ZVwiLCBvcHRpb25zLCA1MCk7XG4gICAgdGhpcy5tYXhfYWRhcHRhdGlvbiAgICAgPSBnZXRfb3B0aW9uKFwibWF4X2FkYXB0YXRpb25cIiwgb3B0aW9ucywgMC4zMyk7XG4gICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfb3B0aW9uKFwiaW5pdGlhbF9hZGFwdGF0aW9uXCIsIG9wdGlvbnMsIDEuMCk7XG4gICAgdGhpcy50YXJnZXRfYWNjZXB0X3JhdGUgPSBnZXRfb3B0aW9uKFwidGFyZ2V0X2FjY2VwdF9yYXRlXCIsIG9wdGlvbnMsIDAuNDQpO1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgICAgICAgID0gZ2V0X29wdGlvbihcImlzX2FkYXB0aW5nXCIsIG9wdGlvbnMsIHRydWUpO1xuICAgIFxuICAgIHRoaXMuZ2VuZXJhdGVfcHJvcG9zYWwgPSBnZW5lcmF0ZV9wcm9wb3NhbDtcbiAgICBcbiAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwO1xuICAgIHRoaXMuYmF0Y2hfY291bnQgPSAwO1xuICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7ICBcbiAgfTtcbiAgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT25lZGltTWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHBhcmFtX3N0YXRlID0gdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdO1xuICAgICAgdmFyIHBhcmFtX3Byb3Bvc2FsID0gdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbChwYXJhbV9zdGF0ZSwgdGhpcy5wcm9wX2xvZ19zY2FsZSk7XG4gICAgICBpZihwYXJhbV9wcm9wb3NhbCA8IHRoaXMubG93ZXIgfHwgcGFyYW1fcHJvcG9zYWwgPiB0aGlzLnVwcGVyKSB7XG4gICAgICAgIC8vIE91dHNpZGUgb2YgbGltaXRzIG9mIHRoZSBwYXJhbWV0ZXIsIHJlamVjdCB0aGUgcHJvcG9zYWwgXG4gICAgICAgIC8vIGFuZCBzdGF5IGF0IHRoZSBjdXJyZW50IHN0YXRlLlxuICAgICAgfSBlbHNlIHsgLy8gbWFrZSBhIE1ldHJvcG9saXMgc3RlcFxuICAgICAgICB2YXIgY3Vycl9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gcGFyYW1fcHJvcG9zYWw7XG4gICAgICAgIHZhciBwcm9wX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpO1xuICAgICAgICB2YXIgYWNjZXB0X3Byb2IgPSBNYXRoLmV4cChwcm9wX2xvZ19kZW5zIC0gY3Vycl9sb2dfZGVucyk7XG4gICAgICAgIGlmKGFjY2VwdF9wcm9iID4gTWF0aC5yYW5kb20oKSkge1xuICAgICAgICAgIC8vIFdlIGRvIG5vdGhpbmcgYXMgdGhlIHN0YXRlIG9mIHBhcmFtIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCB0byB0aGUgcHJvcG9zYWxcbiAgICAgICAgICBpZih0aGlzLmlzX2FkYXB0aW5nKSB0aGlzLmFjY2VwdGFuY2VfY291bnQrKyA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHN0YXRlIGJhY2sgdG8gdGhlIG9sZCBzdGF0ZSBvZiBwYXJhbVxuICAgICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3N0YXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZih0aGlzLmlzX2FkYXB0aW5nKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiArKztcbiAgICAgICAgaWYodGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uID49IHRoaXMuYmF0Y2hfc2l6ZSkgeyAvLyB0aGVuIGFkYXB0XG4gICAgICAgICAgdGhpcy5iYXRjaF9jb3VudCArKztcbiAgICAgICAgICB2YXIgbG9nX3NkX2FkanVzdG1lbnQgPSBcbiAgICAgICAgICAgIE1hdGgubWluKHRoaXMubWF4X2FkYXB0YXRpb24sIFxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gLyBNYXRoLnNxcnQodGhpcy5iYXRjaF9jb3VudCkpO1xuICAgICAgICAgIGlmKHRoaXMuYWNjZXB0YW5jZV9jb3VudCAvIHRoaXMuYmF0Y2hfc2l6ZSA+IHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlICs9IGxvZ19zZF9hZGp1c3RtZW50O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlIC09IGxvZ19zZF9hZGp1c3RtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwO1xuICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07XG4gIH07XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgPSB0cnVlO1xuICB9O1xuICBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBmYWxzZTtcbiAgfTtcbiAgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BfbG9nX3NjYWxlOiB0aGlzLnByb3BfbG9nX3NjYWxlLFxuICAgICAgaXNfYWRhcHRpbmc6IHRoaXMuaXNfYWRhcHRpbmcsXG4gICAgICBhY2NlcHRhbmNlX2NvdW50OiB0aGlzLmFjY2VwdGFuY2VfY291bnQsXG4gICAgICBpdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uOiB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24sXG4gICAgICBiYXRjaF9jb3VudDogdGhpcy5iYXRjaF9jb3VudFxuICAgIH07XG4gIH07XG4gIFxuICBcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhIE5vcm1hbCBwcm9wb3NhbC5cbiAgICovXG4gIHZhciBub3JtYWxfcHJvcG9zYWwgPSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHtcbiAgICByZXR1cm4gcm5vcm0ocGFyYW1fc3RhdGUgLCBNYXRoLmV4cChwcm9wX2xvZ19zY2FsZSkpO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAYXVnbWVudHMge09uZWRpbU1ldHJvcG9saXNTdGVwcGVyfVxuICAgKiBBIFwic3ViY2xhc3NcIiBvZiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgUmVhbE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBub3JtYWxfcHJvcG9zYWwpO1xuICB9O1xuICBcbiAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsgXG4gIFJlYWxNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICAvKipcbiAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGEgZGlzY3JldGl6ZWQgTm9ybWFsIHByb3Bvc2FsLlxuICAgKi9cbiAgdmFyIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCA9IGZ1bmN0aW9uKHBhcmFtX3N0YXRlLCBwcm9wX2xvZ19zY2FsZSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHJub3JtKHBhcmFtX3N0YXRlICwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKSk7XG4gIH07XG4gIFxuICAgIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGF1Z21lbnRzIHtPbmVkaW1NZXRyb3BvbGlzU3RlcHBlcn1cbiAgICogQSBcInN1YmNsYXNzXCIgb2YgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgSW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCk7XG4gIH07XG4gIFxuICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgXG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfVxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgbWV0cm9wb2xpcyBzdGVwIGluXG4gICAqIHRoZSBBZGFwdGl2ZSBNZXRyb3BvbGlzLVdpdGhpbi1HaWJicyBhbGdvcml0aG0gaW4gXCJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DXCJcbiAgICogYnkgUm9iZXJ0cyBhbmQgUm9zZW50aGFsICgyMDA4KSBmb3IgcG9zc2libHkgbXVsdGlkaW1lbnNpb25hbCBhcnJheXMuIFRoYXRcbiAgICogaXMsIGluc3RlYWQgb2YganVzdCB0YWtpbmcgYSBzdGVwIGZvciBhIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIgbGlrZSBcbiAgICogT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIsIHRoaXMgU3RlcHBlciBpcyByZXNwb25zaWJsZSBmb3IgdGFraW5nIHN0ZXBzIFxuICAgKiBmb3IgYSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5LiBJdCdzIHN0aWxsIHByZXR0eSBkdW1iIGFuZCBqdXN0IHRha2VzXG4gICAqIG9uZS1kaW1lbnNpb25hbCBzdGVwcyBmb3IgZWFjaCBwYXJhbWV0ZXIgY29tcG9uZW50LCB0aG91Z2guXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBmb3IgYSBcbiAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgICogQHBhcmFtIFN1YlN0ZXBwZXIgLSBhIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSBvZiBvbmUgZGltZW5zaW9uYWwgU3RlcHBlciB0byBhcHBseSBvblxuICAgKiAgIGFsbCB0aGUgY29tcG9uZW50cyBvZiB0aGUgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuXG4gICovXG4gIHZhciBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFN1YlN0ZXBwZXIpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIFxuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggICE9IDEpIHtcbiAgICAgIHRocm93IFwiTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07XG4gICAgdGhpcy5sb3dlciA9IHBhcmFtLmxvd2VyO1xuICAgIHRoaXMudXBwZXIgPSBwYXJhbS51cHBlcjtcbiAgICB0aGlzLmRpbSA9IHBhcmFtLmRpbTtcbiAgXG4gICAgdGhpcy5wcm9wX2xvZ19zY2FsZSAgICAgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwicHJvcF9sb2dfc2NhbGVcIiwgb3B0aW9ucywgdGhpcy5kaW0sIDApO1xuICAgIHRoaXMuYmF0Y2hfc2l6ZSAgICAgICAgID0gZ2V0X211bHRpZGltX29wdGlvbihcImJhdGNoX3NpemVcIiwgb3B0aW9ucywgdGhpcy5kaW0sIDUwKTtcbiAgICB0aGlzLm1heF9hZGFwdGF0aW9uICAgICA9IGdldF9tdWx0aWRpbV9vcHRpb24oXCJtYXhfYWRhcHRhdGlvblwiLCBvcHRpb25zLCB0aGlzLmRpbSwgMC4zMyk7XG4gICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwiaW5pdGlhbF9hZGFwdGF0aW9uXCIsIG9wdGlvbnMsIHRoaXMuZGltLCAxLjApO1xuICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X211bHRpZGltX29wdGlvbihcInRhcmdldF9hY2NlcHRfcmF0ZVwiLCBvcHRpb25zLCB0aGlzLmRpbSwgMC40NCk7XG4gICAgdGhpcy5pc19hZGFwdGluZyAgICAgICAgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwiaXNfYWRhcHRpbmdcIiwgb3B0aW9ucywgdGhpcy5kaW0sIHRydWUpO1xuICAgIFxuICAgIC8vIFRoaXMgaGFjayBiZWxvdyBpcyBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJyYXkgb2YgXG4gICAgLy8gb25lIGRpbWVuc2lvbmFsIHN0ZXBwZXJzIGFjY29yZGluZyB0byBkaW0uXG4gICAgdmFyIGNyZWF0ZV9zdWJzdGVwcGVycyA9IFxuICAgICAgZnVuY3Rpb24oZGltLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHByb3BfbG9nX3NjYWxlLCBiYXRjaF9zaXplLCBtYXhfYWRhcHRhdGlvbiwgaW5pdGlhbF9hZGFwdGF0aW9uLCB0YXJnZXRfYWNjZXB0X3JhdGUsIGlzX2FkYXB0aW5nKSB7XG4gICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTtcbiAgICAgIGlmKGRpbS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgdmFyIHN1Ym9wdGlvbnMgPSB7cHJvcF9sb2dfc2NhbGU6IHByb3BfbG9nX3NjYWxlW2ldLCBiYXRjaF9zaXplOiBiYXRjaF9zaXplW2ldLFxuICAgICAgICAgICAgbWF4X2FkYXB0YXRpb246IG1heF9hZGFwdGF0aW9uW2ldLCBpbml0aWFsX2FkYXB0YXRpb246IGluaXRpYWxfYWRhcHRhdGlvbltpXSxcbiAgICAgICAgICAgIHRhcmdldF9hY2NlcHRfcmF0ZTogdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZzogaXNfYWRhcHRpbmdbaV19O1xuICAgICAgICAgICAgdmFyIHN1YnBhcmFtID0ge307XG4gICAgICAgICAgICBzdWJwYXJhbVtpXSA9IGRlZXBfY2xvbmUocGFyYW0pO1xuICAgICAgICAgICAgc3VicGFyYW1baV0uZGltID0gWzFdOyAvLyBBcyB0aGlzIHNob3VsZCBub3cgYmUgYSBvbmUtZGltIHBhcmFtZXRlclxuICAgICAgICAgICAgZGVsZXRlIHN1YnBhcmFtW2ldLmluaXQ7IC8vIEFzIGl0IHNvdWxkIG5vdCBiZSBuZWVkZWRcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBTdWJTdGVwcGVyKHN1YnBhcmFtLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHN1Ym9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IGNyZWF0ZV9zdWJzdGVwcGVycyhkaW0uc2xpY2UoMSksIHN1YnN0YXRlW2ldLCBsb2dfcG9zdCwgcHJvcF9sb2dfc2NhbGVbaV0sIFxuICAgICAgICAgICAgYmF0Y2hfc2l6ZVtpXSwgbWF4X2FkYXB0YXRpb25baV0sIGluaXRpYWxfYWRhcHRhdGlvbltpXSwgdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZ1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdGVwcGVycztcbiAgICB9O1xuICAgIFxuICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBjcmVhdGVfc3Vic3RlcHBlcnModGhpcy5kaW0sIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSwgdGhpcy5sb2dfcG9zdCxcbiAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUsIHRoaXMuYmF0Y2hfc2l6ZSwgdGhpcy5tYXhfYWRhcHRhdGlvbiwgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24sXG4gICAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSwgdGhpcy5pc19hZGFwdGluZyk7XG4gICAgXG4gIH07XG4gIFxuICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyO1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIEdvIHRocm91Z2ggdGhlIHN1YnN0ZXBwZXJzIGluIGEgcmFuZG9tIG9yZGVyIGFuZCBjYWxsIHN0ZXAoKSBvbiB0aGVtLlxuICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtyZXR1cm4gc3Vic3RlcHBlci5zdGVwKCk7IH0pO1xuICB9O1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7c3Vic3RlcHBlci5zdGFydF9hZGFwdGF0aW9uKCk7IH0pO1xuICB9O1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtzdWJzdGVwcGVyLnN0b3BfYWRhcHRhdGlvbigpOyB9KTtcbiAgfTtcbiAgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtcbiAgICAgIHJldHVybiBzdWJzdGVwcGVyLmluZm8oKTsgXG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBhdWdtZW50cyB7TXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcn1cbiAgICogQSBcInN1YmNsYXNzXCIgb2YgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgUmVhbE1ldHJvcG9saXNTdGVwcGVyKTtcbiAgfTtcbiAgXG4gIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7XG5cbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9XG4gICAqIEEgXCJzdWJjbGFzc1wiIG9mIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqLyAgICBcbiAgdmFyIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgSW50TWV0cm9wb2xpc1N0ZXBwZXIpO1xuICB9O1xuICBcbiAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsgXG4gIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGEgc3RlcCBmb3IgYSBiaW5hcnkgcGFyYW1ldGVyLlxuICAgKiBUaGlzIGlzIGRvbmUgYnkgZXZhbHVhdGluZyB0aGUgbG9nIHBvc3RlcmlvciBmb3IgYm90aCBzdGF0ZXMgb2YgdGhlXG4gICAqIHBhcmFtZXRlciBhbmQgdGhlbiBzZWxlY3RpbmcgYSBzdGF0ZSByYW5kb21seSB3aXRoIHByb2JhYmlsaXR5IHJlbGF0aXZlIFxuICAgKiB0byB0aGUgcG9zdGVyaW9yIG9mIGVhY2ggc3RhdGUuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEJpbmFyeVN0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7XG4gICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIGlmKHBhcmFtX25hbWVzLmxlbmd0aCAgPT0gMSkge1xuICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiQmluYXJ5U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICB9O1xuICBcbiAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsgXG4gIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmluYXJ5U3RlcHBlcjtcbiAgXG4gIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSAwO1xuICAgIHZhciB6ZXJvX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpO1xuICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IDE7XG4gICAgdmFyIG9uZV9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICB2YXIgbWF4X2xvZ19kZW5zID0gTWF0aC5tYXgoemVyb19sb2dfZGVucywgb25lX2xvZ19kZW5zKTtcbiAgICB6ZXJvX2xvZ19kZW5zIC09IG1heF9sb2dfZGVucztcbiAgICBvbmVfbG9nX2RlbnMgLT0gbWF4X2xvZ19kZW5zO1xuICAgIHZhciB6ZXJvX3Byb2IgPSBNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zIC0gTWF0aC5sb2coIE1hdGguZXhwKHplcm9fbG9nX2RlbnMpICsgTWF0aC5leHAob25lX2xvZ19kZW5zKSApICk7XG4gICAgaWYoTWF0aC5yYW5kb20oKSA8IHplcm9fcHJvYikge1xuICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gLy8gZWxzZSBrZWVwIHRoZSBwYXJhbSBhdCAxIC5cbiAgICByZXR1cm4gMTtcbiAgfTtcbiAgXG4gICAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn1cbiAgICogSnVzdCBsaWtlIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgdGhpcyBTdGVwcGVyIHRha2VzIGEgc3RlcHMgZm9yXG4gICAqIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgYnkgdXBkYXRpbmcgZWFjaCBjb21wb25lbnQgaW4gdHVybi4gVGhlIGRpZmZlcmVuY2VcbiAgICogaXMgdGhhdCB0aGlzIHN0ZXBwZXIgd29ya3Mgb24gYmluYXJ5IHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBmb3IgYSBcbiAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7XG4gICAgXG4gICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIGlmKHBhcmFtX25hbWVzLmxlbmd0aCAgPT0gMSkge1xuICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07XG4gICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdO1xuICAgICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiQmluYXJ5Q29tcG9uZW50U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIFxuICAgIHZhciBjcmVhdGVfc3Vic3RlcHBlcnMgPSBcbiAgICAgIGZ1bmN0aW9uKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0KSB7XG4gICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTtcbiAgICAgIHZhciBpO1xuICAgICAgaWYoZGltLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykge1xuICAgICAgICAgIHZhciBzdWJwYXJhbXMgPSB7fTtcbiAgICAgICAgICBzdWJwYXJhbXNbaV0gPSBwYXJhbTtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBCaW5hcnlTdGVwcGVyKHN1YnBhcmFtcywgc3Vic3RhdGUsIGxvZ19wb3N0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IGNyZWF0ZV9zdWJzdGVwcGVycyhkaW0uc2xpY2UoMSksIHN1YnN0YXRlW2ldLCBsb2dfcG9zdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdGVwcGVycztcbiAgICB9O1xuICAgIFxuICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBjcmVhdGVfc3Vic3RlcHBlcnModGhpcy5kaW0sIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSwgdGhpcy5sb2dfcG9zdCk7XG4gIH07XG4gIFxuICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCaW5hcnlDb21wb25lbnRTdGVwcGVyO1xuICBcbiAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIEdvIHRocm91Z2ggdGhlIHN1YnN0ZXBwZXJzIGluIGEgcmFuZG9tIG9yZGVyIGFuZCBjYWxsIHN0ZXAoKSBvbiB0aGVtLlxuICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtyZXR1cm4gc3Vic3RlcHBlci5zdGVwKCk7IH0pO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn1cbiAgICogVGhpcyBzdGVwcGVyIGNhbiBiZSByZXNwb25zaWJsZSBmb3IgdGFraW5nIGEgc3RlcCBmb3Igb25lIG9yIG1vcmUgcGFyYW1ldGVycy5cbiAgICogRm9yIHJlYWwgYW5kIGludCBwYXJhbWV0ZXJzIGl0IHRha2VzIE1ldHJvcG9saXMgd2l0aGluIEdpYmJzIHN0ZXBzLCBhbmQgZm9yIFxuICAgKiBiaW5hcnkgcGFyYW1ldGVycyBpdCBkb2VzIGV2YWx1YXRlcyB0aGUgcG9zdGVyaW9yIGZvciBib3RoIHBhcmFtdGVyIHZhbHVlcyBhbmRcbiAgICogcmFuZG9tbHkgY2hhbmdlcyB0byBhIGNlcnRhaW4gdmFsdWUgcHJvcG9ydGlvbmFsbHkgdG8gdGhhdCB2YWx1ZSdzIHBvc3RlcmlvclxuICAgKiAodGhpcyBpcyBhbHNvIGRvbmUgZm9yIGVhY2ggcGFyYW1ldGVyLCBzbyBhbHNvIGEgKiB3aXRoaW4gR2liYnMgYXBwcm9hY2gpLlxuICAgKiBUaGlzIHN0ZXBwZXIgaXMgYWxzbyBhZGFwdGl2ZSBhbmQgY2FuIGJlIGVmZmljaWVudCB3aGVuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyc1xuICAgKiBhcmUgbm90IHRvbyBoaWdoIGFuZCB0aGUgY29ycmVsYXRpb25zIGJldHdlZW4gcGFyYW1ldGVycyBhcmUgbG93LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnNcbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEFtd2dTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7XG4gICAgdGhpcy5zdWJzdGVwcGVycyA9IFtdO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbdGhpcy5wYXJhbV9uYW1lc1tpXV07XG4gICAgICB2YXIgU2VsZWN0U3RlcHBlcjtcbiAgICAgIHN3aXRjaCAocGFyYW0udHlwZSkge1xuICAgICAgICBjYXNlIFwicmVhbFwiOlxuICAgICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IFJlYWxNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImludFwiOlxuICAgICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IEludE1ldHJvcG9saXNTdGVwcGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJiaW5hcnlcIjpcbiAgICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBCaW5hcnlTdGVwcGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gQmluYXJ5Q29tcG9uZW50U3RlcHBlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgXCJBbXdnU3RlcHBlciBjYW4ndCBoYW5kbGUgcGFyYW1ldGVyIFwiICsgdGhpcy5wYXJhbV9uYW1lc1tpXSAgK1wiIHdpdGggdHlwZSBcIiArIHBhcmFtLnR5cGU7IFxuICAgICAgfVxuICAgICAgdmFyIHBhcmFtX29iamVjdF93cmFwID0ge307XG4gICAgICBwYXJhbV9vYmplY3Rfd3JhcFt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHBhcmFtO1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICB2YXIgcGFyYW1fb3B0aW9ucyA9IG9wdGlvbnMucGFyYW1zICYmIG9wdGlvbnMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dIHx8IHt9O1xuICAgICAgcGFyYW1fb3B0aW9ucy5wcm9wX2xvZ19zY2FsZSAgICAgPSBwYXJhbV9vcHRpb25zLnByb3BfbG9nX3NjYWxlICAgICB8fCBvcHRpb25zLnByb3BfbG9nX3NjYWxlOyBcbiAgICAgIHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSAgICAgICAgID0gcGFyYW1fb3B0aW9ucy5iYXRjaF9zaXplICAgICAgICAgfHwgb3B0aW9ucy5iYXRjaF9zaXplOyBcbiAgICAgIHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gICAgID0gcGFyYW1fb3B0aW9ucy5tYXhfYWRhcHRhdGlvbiAgICAgfHwgb3B0aW9ucy5tYXhfYWRhcHRhdGlvbjtcbiAgICAgIHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uID0gcGFyYW1fb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb24gfHwgb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb247XG4gICAgICBwYXJhbV9vcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZSA9IHBhcmFtX29wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlIHx8IG9wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlOyBcbiAgICAgIHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgICAgICAgID0gcGFyYW1fb3B0aW9ucy5pc19hZGFwdGluZyAgICAgICAgfHwgb3B0aW9ucy5pc19hZGFwdGluZzsgXG4gICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldID0gbmV3IFNlbGVjdFN0ZXBwZXIocGFyYW1fb2JqZWN0X3dyYXAsIHN0YXRlLCBsb2dfcG9zdCwgcGFyYW1fb3B0aW9ucyk7XG4gICAgfVxuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBBbXdnU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU3RlcHBlcjtcbiAgXG4gIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24oKSB7XG4gICAgc2h1ZmZsZV9hcnJheSh0aGlzLnN1YnN0ZXBwZXJzKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGVwKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGFydF9hZGFwdGF0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0b3BfYWRhcHRhdGlvbigpO1xuICAgIH0gXG4gIH07XG4gIFxuICBBbXdnU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbmZvID0ge307XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGluZm9bdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSB0aGlzLnN1YnN0ZXBwZXJzW2ldLmluZm8oKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH07XG4gIFxuICBcbiAgXG4gIC8vLy8vLy8vLy8vIFNhbXBsZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgXG4gICAvKipcbiAgICogQGludGVyZmFjZVxuICAgKiBXaGlsZSB5b3UgY291bGQgZml0IGEgbW9kZWwgYnkgcGFzdGluZyB0b2dldGhlciBTdGVwcGVycywgYVxuICAvLyBTYW1wbGVyIGlzIGhlcmUgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyB3aGVyZSBhbiBpbnN0YW5jZSBvZiBTYW1wbGVyXG4gIC8vIHNldHMgdXAgdGhlIFN0ZXBwZXJzLCBjaGVja3MgdGhlIHBhcmFtZXRlciBkZWZpbml0aW9uLFxuICAvLyBhbmQgbWFuYWdlcyB0aGUgc2FtcGxpbmcuIFRoaXMgaGVyZSBkZWZpbmVzIHRoZSBTYW1wbGVyIFwiaW50ZXJmYWNlXCIuXG4gICAqIEBpbnRlcmZhY2VcbiAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6XG4gICAqICAge1wibXVcIjoge1widHlwZVwiOiBcInJlYWxcIn0sIFwic2lnbWFcIjoge1widHlwZVwiOiBcInJlYWxcIiwgXCJsb3dlclwiID0gMH19XG4gICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBkb2Vzbid0IGhhdmUgdG8gYmUgXCJjb21wbGV0ZVwiIGFuZCBwcm9wZXJ0aWVzXG4gICAqICAgbGVmdCBvdXQgKGxpa2UgbG93ZXIgYW5kIHVwcGVyKSB3aWxsIGJlIGZpbGxlZCBpbiBieSBkZWZhdWx0cy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihzdGF0ZSwgZGF0YSkuIEhlcmVcbiAgICogICBzdGF0ZSB3aWxsIGJlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHN0YXRlIHdpdGggZWFjaCBwYXJhbWV0ZXIgYXMgYSBcbiAgICogICBrZXkgYW5kIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGFzIG51bWJlcnMgb3IgYXJyYXlzLiBGb3IgZXhhbXBsZTpcbiAgICogICB7XCJtdVwiOiAzLCBcInNpZ21hXCI6IDEuNX0uIFRoZSBkYXRhIGFyZ3VtZW50IHdpbGwgYmUgdGhlIHNhbWUgb2JqZWN0IGFzIFxuICAgKiAgIHRoZSBkYXRhIGFyZ3VtZW50IGdpdmVuIGJlbG93LlxuICAgKiBAcGFyYW0gZGF0YSAtIGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBsb2dfcG9zdCBmdW5jdGlvblxuICAgKiAgIHdoZW4gc2FtcGxpbmcuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc2FtcGxlci5cbiAgICovXG4gIHZhciBTYW1wbGVyID0gZnVuY3Rpb24ocGFyYW1zLCBsb2dfcG9zdCwgZGF0YSwgb3B0aW9ucykge1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5wYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBcbiAgICAvLyBTZXR0aW5nIGRlZmF1bHQgb3B0aW9ucyBpZiBub3QgcGFzc2VkIHRocm91Z2ggdGhlIG9wdGlvbnMgb2JqZWN0XG4gICAgdGhpcy5wYXJhbV9pbml0X2Z1biAgID0gZ2V0X29wdGlvbihcInBhcmFtX2luaXRfZnVuXCIsIG9wdGlvbnMsIHBhcmFtX2luaXRfZml4ZWQpO1xuICAgIHZhciB0aGlubmluZ19pbnRlcnZhbCA9IGdldF9vcHRpb24oXCJ0aGluXCIsIG9wdGlvbnMsIDEpO1xuICAgIHZhciBwYXJhbXNfdG9fbW9uaXRvciA9IGdldF9vcHRpb24oXCJtb25pdG9yXCIsIG9wdGlvbnMsIG51bGwpO1xuICAgIHRoaXMudGhpbih0aGlubmluZ19pbnRlcnZhbCk7XG4gICAgdGhpcy5tb25pdG9yKHBhcmFtc190b19tb25pdG9yKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIC8vIENvbXBsZXRpbmcgdGhlIHBhcmFtcyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBzdGF0ZS5cbiAgICB0aGlzLnBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyh0aGlzLnBhcmFtcywgdGhpcy5wYXJhbV9pbml0X2Z1bik7XG4gICAgdmFyIHN0YXRlID0ge307XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1fbmFtZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICBzdGF0ZVt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dLmluaXQ7XG4gICAgfVxuICAgIHRoaXMubG9nX3Bvc3QgPSBmdW5jdGlvbigpIHsgXG4gICAgICByZXR1cm4gbG9nX3Bvc3Qoc3RhdGUsIGRhdGEpO1xuICAgIH07XG4gICAgLy8gUnVubmluZyB0aGUgbG9nX3Bvc3QgZnVuY3Rpb24gb25jZSBpbiBjYXNlIGl0IGZ1cnRoZXIgbW9kaWZpZXMgdGhlIHN0YXRlXG4gICAgLy8gZm9yIGV4YW1wbGUgYWRkaW5nIGRlcml2ZWQgcXVhbnRpdGllcy5cbiAgICB0aGlzLmxvZ19wb3N0KCk7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMuc3RlcHBlcnMgPSB0aGlzLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlKHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlLCB0aGlzLmxvZ19wb3N0LCB0aGlzLm9wdGlvbnMpO1xuICB9O1xuICBcbiAgLyoqIFNob3VsZCByZXR1cm4gYSB2ZWN0b3Igb2Ygc3RlcHBlcnMgdGhhdCB3aGVuIGNhbGxlZCBcbiAgICogc2hvdWxkIHRha2UgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuXG4gICAqL1xuICBTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uKHN0YXRlLCBsb2dfcG9zdCl7XG4gICAgdGhyb3cgXCJFdmVyeSBTYW1wbGVyIG5lZWRzIHRvIGltcGxlbWVudCBjcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSgpXCI7XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBpbmZvIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgU2FtcGxlci5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtzdGF0ZTogdGhpcy5zdGF0ZSwgdGhpbjogdGhpcy50aGluLCBtb25pdG9yOiB0aGlzLm1vbml0b3IsXG4gICAgICAgICAgICBzdGVwcGVyczogdGhpcy5zdGVwcGVyc307XG4gIH07XG4gIFxuICAvKiogVGFrZXMgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuIFJldHVybnMgdGhlIG5ldyBzcGFjZVxuICAgKiBidXQgYWxzbyBtb2RpZmllcyB0aGUgc3RhdGUgaW4gcGxhY2UuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHNodWZmbGVfYXJyYXkodGhpcy5zdGVwcGVycyk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RlcCgpO1xuICAgIH1cbiAgICBpZihPYmplY3Qua2V5cyh0aGlzLnN0YXRlKS5sZW5ndGggPiBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcykubGVuZ3RoKSB7XG4gICAgICAvLyBUaGUgc3RhdGUgY29udGFpbnMgZGV2aXZlZCBxdWFudGl0aWVzIChub3Qgb25seSBwYXJhbWV0ZXJzKSBhbmQgd2VcbiAgICAgIC8vIG5lZWQgdG8gcnVuIHRoZSBsb2dfcG9zdCBvbmNlIG1vcmUgaW4gb3JkZXIgdG8gc2V0IHRoZSBkZXJpdmVkIHF1YW50aXRpZXNcbiAgICAgIC8vIGZvciB0aGUgZmluYWwgcGFyYW1ldGVyIHN0YXRlXG4gICAgICB0aGlzLmxvZ19wb3N0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIG5faXRlcmF0aW9ucyBzdGVwcyBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlIGFuZCByZXR1cm5zIHRoZW1cbiAgICogYXMgYW4gb2JqZWN0IG9mIGFycmF5cyB3aXRoIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZTpcbiAgICoge211OiBbMSwgLTEsIDIsIDMsIC4uLl0sIHNpZ21hOiBbMSwgMiwgMiwgMSwgLi4uXX0uXG4gICAqIElmIHRoaW4gaXMgPiAxIHRoZW4gbl9pdGVyYXRpb25zIC8gdGhpbiBzYW1wbGVzIGFyZSByZXR1cm5lZC5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5zYW1wbGUgPSBmdW5jdGlvbihuX2l0ZXJhdGlvbnMpIHtcbiAgICAgIC8vIEluaXRpYWxpemluZyBjdXJyX3NhbXBsZSB3aGVyZSB0aGUgc2FtcGxlIGlzIGdvaW5nIHRvIGJlIHNhdmVkXG4gICAgICAvLyBhcyBhbiBvYmplY3QgY29udGFpbmluZyBvbmUgYXJyYXkgcGVyIHBhcmFtZXRlciB0byBiZSBtb25pdG9yZWQuXG4gICAgICB2YXIgaSwgaiwgbW9uaXRvcmVkX3BhcmFtcztcbiAgICAgIGlmKHRoaXMubW9uaXRvcmVkX3BhcmFtcyA9PT0gbnVsbCkge1xuICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gT2JqZWN0LmtleXModGhpcy5zdGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gdGhpcy5tb25pdG9yZWRfcGFyYW1zO1xuICAgICAgfVxuICAgICAgXG4gICAgICB2YXIgY3Vycl9zYW1wbGUgPSB7fTtcbiAgICAgIGZvcihqID0gMDsgaiA8IG1vbml0b3JlZF9wYXJhbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY3Vycl9zYW1wbGVbbW9uaXRvcmVkX3BhcmFtc1tqXV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZm9yKGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHtcbiAgICAgICAgaWYoaSAlIHRoaXMudGhpbm5pbmdfaW50ZXJ2YWwgPT09IDApIHtcbiAgICAgICAgICBmb3IoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW0gPSBtb25pdG9yZWRfcGFyYW1zW2pdO1xuICAgICAgICAgICAgY3Vycl9zYW1wbGVbcGFyYW1dLnB1c2goIGNsb25lX3BhcmFtX2RyYXcodGhpcy5zdGF0ZVtwYXJhbV0pICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RlcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJfc2FtcGxlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIG5faXRlcmF0aW9uIHN0ZXBzIGluIHBhcmFtZXRlciBzcGFjZSBidXQgcmV0dXJucyBub3RoaW5nLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLmJ1cm4gPSBmdW5jdGlvbihuX2l0ZXJhdGlvbnMpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcCgpO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBTZXRzIHdoYXQgcGFyYW1ldGVycyBzaG91bGQgYmUgbW9uaXRvcmVkIGFuZCByZXR1cm5lZCB3aGVuIGNhbGxpbmdcbiAgICogc2FtcGxlLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLm1vbml0b3IgPSBmdW5jdGlvbihwYXJhbXNfdG9fbW9uaXRvcikge1xuICAgICAgdGhpcy5tb25pdG9yZWRfcGFyYW1zID0gcGFyYW1zX3RvX21vbml0b3I7XG4gIH07XG4gIFxuICAvKipcbiAgICogU2V0cyB0aGUgdGhpbm5pbmcuIEZvciBleGFtcGxlIHRoaW4gPT0gMTAgbWVhbnMgdGhhdCBldmVyeSAxMHRoIHBvc3RlcmlvclxuICAgKiBkcmF3IHdpbGwgYmUga2VwdC5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS50aGluID0gZnVuY3Rpb24odGhpbm5pbmdfaW50ZXJ2YWwpIHtcbiAgICB0aGlzLnRoaW5uaW5nX2ludGVydmFsID0gdGhpbm5pbmdfaW50ZXJ2YWw7XG4gIH07XG4gIFxuICAvKipcbiAgICogU2V0cyBhZGFwdGF0aW9uIG9uLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0YXJ0X2FkYXB0YXRpb24oKTtcbiAgICB9XG4gIH07XG4gIFxuICAgIC8qKlxuICAgKiBTZXRzIGFkYXB0YXRpb24gb2ZmLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1NhbXBsZXJ9XG4gICAqIFRoaXMgc2FtcGxlciB1c2VzIHRoZSBBbXdnU3RlcHBlciBhcyB0aGUgc3RlcHBlciBmdW5jdGlvbiB3aGljaCBpbXBsZW1lbnRzIHRoZSBcbiAgICogQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluIFwiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQ1wiXG4gICAqIGJ5IFJvYmVydHMgYW5kIFJvc2VudGhhbCAoMjAwOCkuIEFuIGFkaXRpb24gaXMgdGhhdCBpdCBoYW5kbGVzIGludCBwYXJhbWV0ZXJzXG4gICAqIGJ5IG1ha2luZyBkaXNjcmV0ZSBOb3JtYWwgcHJvcG9zYWxzIGFuZCBiaW5hcnkgcGFyYW1ldGVycyBieSB0YWtpbmcgb24gYSBuZXcgXG4gICAqIHZhbHVlIHByb3BvcnRpb25hbCB0byB0aGUgcG9zdGVyaW9yIG9mIHRoZSB0d28gcG9zc2libGUgc3RhdGVzIG9mIHRoZVxuICAgKiBwYXJhbWV0ZXIuIFRoaXMgc2FtcGxlciBjYW4gYmUgZWZmaWNpZW50IHdoZW4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gICAqIGFyZSBub3QgdG9vIGhpZ2ggYW5kIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJhbWV0ZXJzIGFyZSBsb3cuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIG9uZSBvciBtb3JlIHBhcmFtZXRlciBkZWZpbml0aW9uc1xuICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLlxuICAqL1xuICB2YXIgQW13Z1NhbXBsZXIgPSBmdW5jdGlvbihwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKSB7XG4gICAgU2FtcGxlci5jYWxsKHRoaXMsIHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpO1xuICB9O1xuICBcbiAgQW13Z1NhbXBsZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTYW1wbGVyLnByb3RvdHlwZSk7IFxuICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU2FtcGxlcjtcbiAgXG4gIEFtd2dTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKXtcbiAgICByZXR1cm4gWyBuZXcgQW13Z1N0ZXBwZXIocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIF07XG4gIH07XG4gIFxuICBcbiAgLy8gUmV0dXJuaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgcHVibGljbHkgZXhwb3NlZCBieSB0aGlzIG1vZHVsZVxuICByZXR1cm4ge1xuICAgIHJ1bmlmOiBydW5pZixcbiAgICBydW5pZl9kaXNjcmV0ZTogcnVuaWZfZGlzY3JldGUsXG4gICAgcm5vcm06IHJub3JtLFxuICAgIHBhcmFtX2luaXRfZml4ZWQ6IHBhcmFtX2luaXRfZml4ZWQsIFxuICAgIGNvbXBsZXRlX3BhcmFtczogY29tcGxldGVfcGFyYW1zLCBcbiAgICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI6IFJlYWxNZXRyb3BvbGlzU3RlcHBlciwgXG4gICAgSW50TWV0cm9wb2xpc1N0ZXBwZXI6IEludE1ldHJvcG9saXNTdGVwcGVyLCBcbiAgICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjogTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsIFxuICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsIFxuICAgIEJpbmFyeVN0ZXBwZXI6IEJpbmFyeVN0ZXBwZXIsIFxuICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI6IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIsIFxuICAgIEFtd2dTdGVwcGVyOiBBbXdnU3RlcHBlciwgXG4gICAgQW13Z1NhbXBsZXI6IEFtd2dTYW1wbGVyXG4gIH07XG59KSk7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA9PSBudWxsIHx8IGIgPT0gbnVsbCA/IE5hTiA6IGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbnVtYmVyKHgpIHtcbiAgcmV0dXJuIHggPT09IG51bGwgPyBOYU4gOiAreDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBudW1iZXJzKHZhbHVlcywgdmFsdWVvZikge1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsICYmICh2YWx1ZSA9ICt2YWx1ZSkgPj0gdmFsdWUpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuaW1wb3J0IHBlcm11dGUgZnJvbSBcIi4vcGVybXV0ZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0KHZhbHVlcywgLi4uRikge1xuICBpZiAodHlwZW9mIHZhbHVlc1tTeW1ib2wuaXRlcmF0b3JdICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ2YWx1ZXMgaXMgbm90IGl0ZXJhYmxlXCIpO1xuICB2YWx1ZXMgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gIGxldCBbZl0gPSBGO1xuICBpZiAoKGYgJiYgZi5sZW5ndGggIT09IDIpIHx8IEYubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChkLCBpKSA9PiBpKTtcbiAgICBpZiAoRi5sZW5ndGggPiAxKSB7XG4gICAgICBGID0gRi5tYXAoZiA9PiB2YWx1ZXMubWFwKGYpKTtcbiAgICAgIGluZGV4LnNvcnQoKGksIGopID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIEYpIHtcbiAgICAgICAgICBjb25zdCBjID0gYXNjZW5kaW5nRGVmaW5lZChmW2ldLCBmW2pdKTtcbiAgICAgICAgICBpZiAoYykgcmV0dXJuIGM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmID0gdmFsdWVzLm1hcChmKTtcbiAgICAgIGluZGV4LnNvcnQoKGksIGopID0+IGFzY2VuZGluZ0RlZmluZWQoZltpXSwgZltqXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcGVybXV0ZSh2YWx1ZXMsIGluZGV4KTtcbiAgfVxuICByZXR1cm4gdmFsdWVzLnNvcnQoY29tcGFyZURlZmluZWQoZikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZURlZmluZWQoY29tcGFyZSA9IGFzY2VuZGluZykge1xuICBpZiAoY29tcGFyZSA9PT0gYXNjZW5kaW5nKSByZXR1cm4gYXNjZW5kaW5nRGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBjb21wYXJlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjb21wYXJlIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICBjb25zdCB4ID0gY29tcGFyZShhLCBiKTtcbiAgICBpZiAoeCB8fCB4ID09PSAwKSByZXR1cm4geDtcbiAgICByZXR1cm4gKGNvbXBhcmUoYiwgYikgPT09IDApIC0gKGNvbXBhcmUoYSwgYSkgPT09IDApO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNjZW5kaW5nRGVmaW5lZChhLCBiKSB7XG4gIHJldHVybiAoYSA9PSBudWxsIHx8ICEoYSA+PSBhKSkgLSAoYiA9PSBudWxsIHx8ICEoYiA+PSBiKSkgfHwgKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1heDtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1pbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1pbjtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pbjtcbn1cbiIsImltcG9ydCB7YXNjZW5kaW5nRGVmaW5lZCwgY29tcGFyZURlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vdXJuZXIvcXVpY2tzZWxlY3Rcbi8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWlja3NlbGVjdChhcnJheSwgaywgbGVmdCA9IDAsIHJpZ2h0ID0gSW5maW5pdHksIGNvbXBhcmUpIHtcbiAgayA9IE1hdGguZmxvb3Ioayk7XG4gIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTtcbiAgcmlnaHQgPSBNYXRoLmZsb29yKE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIHJpZ2h0KSk7XG5cbiAgaWYgKCEobGVmdCA8PSBrICYmIGsgPD0gcmlnaHQpKSByZXR1cm4gYXJyYXk7XG5cbiAgY29tcGFyZSA9IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IGFzY2VuZGluZ0RlZmluZWQgOiBjb21wYXJlRGVmaW5lZChjb21wYXJlKTtcblxuICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7XG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIHF1aWNrc2VsZWN0KGFycmF5LCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdCA9IGFycmF5W2tdO1xuICAgIGxldCBpID0gbGVmdDtcbiAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgc3dhcChhcnJheSwgbGVmdCwgayk7XG4gICAgaWYgKGNvbXBhcmUoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyYXksIGxlZnQsIHJpZ2h0KTtcblxuICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbaV0sIHQpIDwgMCkgKytpO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbal0sIHQpID4gMCkgLS1qO1xuICAgIH1cblxuICAgIGlmIChjb21wYXJlKGFycmF5W2xlZnRdLCB0KSA9PT0gMCkgc3dhcChhcnJheSwgbGVmdCwgaik7XG4gICAgZWxzZSArK2osIHN3YXAoYXJyYXksIGosIHJpZ2h0KTtcblxuICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICBpZiAoayA8PSBqKSByaWdodCA9IGogLSAxO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiBzd2FwKGFycmF5LCBpLCBqKSB7XG4gIGNvbnN0IHQgPSBhcnJheVtpXTtcbiAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgYXJyYXlbal0gPSB0O1xufVxuIiwiaW1wb3J0IG1heCBmcm9tIFwiLi9tYXguanNcIjtcbmltcG9ydCBtYXhJbmRleCBmcm9tIFwiLi9tYXhJbmRleC5qc1wiO1xuaW1wb3J0IG1pbiBmcm9tIFwiLi9taW4uanNcIjtcbmltcG9ydCBtaW5JbmRleCBmcm9tIFwiLi9taW5JbmRleC5qc1wiO1xuaW1wb3J0IHF1aWNrc2VsZWN0IGZyb20gXCIuL3F1aWNrc2VsZWN0LmpzXCI7XG5pbXBvcnQgbnVtYmVyLCB7bnVtYmVyc30gZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge2FzY2VuZGluZ0RlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcbmltcG9ydCBncmVhdGVzdCBmcm9tIFwiLi9ncmVhdGVzdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHtcbiAgdmFsdWVzID0gRmxvYXQ2NEFycmF5LmZyb20obnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpKTtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpO1xuICBpZiAocCA+PSAxKSByZXR1cm4gbWF4KHZhbHVlcyk7XG4gIHZhciBuLFxuICAgICAgaSA9IChuIC0gMSkgKiBwLFxuICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLFxuICAgICAgdmFsdWUwID0gbWF4KHF1aWNrc2VsZWN0KHZhbHVlcywgaTApLnN1YmFycmF5KDAsIGkwICsgMSkpLFxuICAgICAgdmFsdWUxID0gbWluKHZhbHVlcy5zdWJhcnJheShpMCArIDEpKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZVNvcnRlZCh2YWx1ZXMsIHAsIHZhbHVlb2YgPSBudW1iZXIpIHtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1swXSwgMCwgdmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1tuIC0gMV0sIG4gLSAxLCB2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9ICt2YWx1ZW9mKHZhbHVlc1tpMF0sIGkwLCB2YWx1ZXMpLFxuICAgICAgdmFsdWUxID0gK3ZhbHVlb2YodmFsdWVzW2kwICsgMV0sIGkwICsgMSwgdmFsdWVzKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZUluZGV4KHZhbHVlcywgcCwgdmFsdWVvZiA9IG51bWJlcikge1xuICBpZiAoaXNOYU4ocCA9ICtwKSkgcmV0dXJuO1xuICBudW1iZXJzID0gRmxvYXQ2NEFycmF5LmZyb20odmFsdWVzLCAoXywgaSkgPT4gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSk7XG4gIGlmIChwIDw9IDApIHJldHVybiBtaW5JbmRleChudW1iZXJzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heEluZGV4KG51bWJlcnMpO1xuICB2YXIgbnVtYmVycyxcbiAgICAgIGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChfLCBpKSA9PiBpKSxcbiAgICAgIGogPSBudW1iZXJzLmxlbmd0aCAtIDEsXG4gICAgICBpID0gTWF0aC5mbG9vcihqICogcCk7XG4gIHF1aWNrc2VsZWN0KGluZGV4LCBpLCAwLCBqLCAoaSwgaikgPT4gYXNjZW5kaW5nRGVmaW5lZChudW1iZXJzW2ldLCBudW1iZXJzW2pdKSk7XG4gIGkgPSBncmVhdGVzdChpbmRleC5zdWJhcnJheSgwLCBpICsgMSksIChpKSA9PiBudW1iZXJzW2ldKTtcbiAgcmV0dXJuIGkgPj0gMCA/IGkgOiAtMTtcbn1cbiIsImltcG9ydCBxdWFudGlsZSwge3F1YW50aWxlSW5kZXh9IGZyb20gXCIuL3F1YW50aWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgcmV0dXJuIHF1YW50aWxlKHZhbHVlcywgMC41LCB2YWx1ZW9mKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lZGlhbkluZGV4KHZhbHVlcywgdmFsdWVvZikge1xuICByZXR1cm4gcXVhbnRpbGVJbmRleCh2YWx1ZXMsIDAuNSwgdmFsdWVvZik7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHtcbiAgdGhpcy5rID0gaztcbiAgdGhpcy54ID0geDtcbiAgdGhpcy55ID0geTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zZm9ybSxcbiAgc2NhbGU6IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gayA9PT0gMSA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuayAqIGssIHRoaXMueCwgdGhpcy55KTtcbiAgfSxcbiAgdHJhbnNsYXRlOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIHggPT09IDAgJiB5ID09PSAwID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rLCB0aGlzLnggKyB0aGlzLmsgKiB4LCB0aGlzLnkgKyB0aGlzLmsgKiB5KTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHBvaW50KSB7XG4gICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldO1xuICB9LFxuICBhcHBseVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geCAqIHRoaXMuayArIHRoaXMueDtcbiAgfSxcbiAgYXBwbHlZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24obG9jYXRpb24pIHtcbiAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdO1xuICB9LFxuICBpbnZlcnRYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuICh4IC0gdGhpcy54KSAvIHRoaXMuaztcbiAgfSxcbiAgaW52ZXJ0WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiAoeSAtIHRoaXMueSkgLyB0aGlzLms7XG4gIH0sXG4gIHJlc2NhbGVYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7XG4gIH0sXG4gIHJlc2NhbGVZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkuY29weSgpLmRvbWFpbih5LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSwgdGhpcykubWFwKHkuaW52ZXJ0LCB5KSk7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyB0aGlzLnggKyBcIixcIiArIHRoaXMueSArIFwiKSBzY2FsZShcIiArIHRoaXMuayArIFwiKVwiO1xuICB9XG59O1xuXG5leHBvcnQgdmFyIGlkZW50aXR5ID0gbmV3IFRyYW5zZm9ybSgxLCAwLCAwKTtcblxudHJhbnNmb3JtLnByb3RvdHlwZSA9IFRyYW5zZm9ybS5wcm90b3R5cGU7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlKSB7XG4gIHdoaWxlICghbm9kZS5fX3pvb20pIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHJldHVybiBub2RlLl9fem9vbTtcbn1cbiIsIlxuLypcbiAgSFRETWF0aCBTdGF0aWMgQ2xhc3MgLSBOb3QgaW50ZW5kZWQgZm9yIGluc3RhbnRpYXRpb24hXG5cbiAgVmFyaWFibGVzOlxuICAgIEEgPSBhbW91bnRcbiAgICBEID0gZGVsYXlcbiAgICBWID0gc3ViamVjdGl2ZSB2YWx1ZVxuXG4gICAgayA9IGRpc2NvdW50IGZhY3RvclxuXG4gIEVxdWF0aW9uczpcbiAgICBWID0gQSAvICgxICsga0QpXG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSFRETWF0aCB7XG4gIHN0YXRpYyBhZGsydihhLCBkLCBrKSB7XG4gICAgcmV0dXJuIGEgLyAoMSArIGsgKiBkKTtcbiAgfVxuXG4gIHN0YXRpYyBhZHYyayhhLCBkLCB2KSB7XG4gICAgcmV0dXJuIChhIC0gdikgLyAodiAqIGQpO1xuICB9XG59XG4iLCJcbi8vIEludGVybmFsIGRlcGVuZGVuY2llc1xuaW1wb3J0IEhURE1hdGggZnJvbSAnLi9odGQtbWF0aCc7XG5cbmV4cG9ydCBkZWZhdWx0IEhURE1hdGg7XG4iLCIvKiBlc2xpbnQgbm8tcmVzdHJpY3RlZC1nbG9iYWxzOiBbXCJvZmZcIiwgXCJzZWxmXCJdICovXG5cbi8vIE5lZWRlZCBmb3IgZDMgaW4gV2ViV29ya2VyIVxuaW1wb3J0ICdyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUnO1xuXG5pbXBvcnQgKiBhcyBCYXllc0Rpc3RyaWJ1dGlvbnMgZnJvbSAnYmF5ZXMuanMvZGlzdHJpYnV0aW9ucyc7XG5pbXBvcnQgKiBhcyBCYXllc01jbWMgZnJvbSAnYmF5ZXMuanMvbWNtYyc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgSFRETWF0aCBmcm9tICdAZGVjaWRhYmxlcy9kaXNjb3VudGFibGUtbWF0aCc7XG5cbnNlbGYub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBrOiB7dHlwZTogJ3JlYWwnLCBsb3dlcjogMCwgdXBwZXI6IDEwMH0sXG4gICAgbHVjZToge3R5cGU6ICdyZWFsJywgbG93ZXI6IDAsIHVwcGVyOiAxMDB9LFxuICB9O1xuXG4gIGNvbnN0IGxvZ1Bvc3QgPSAoc3RhdGUsIGRhdGEpID0+IHtcbiAgICBsZXQgbHAgPSAwO1xuXG4gICAgLy8gUHJpb3JzXG4gICAgY29uc3Qga01lYW4gPSAyO1xuICAgIGNvbnN0IGtTaGFwZSA9IDM7XG4gICAgbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLmdhbW1hKFxuICAgICAgc3RhdGUuayxcbiAgICAgIGtTaGFwZSxcbiAgICAgIGtTaGFwZSAvIGtNZWFuLFxuICAgICk7XG4gICAgLy8gbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLnVuaWYoc3RhdGUuaywgMCwgMTAwKTtcblxuICAgIGNvbnN0IGx1Y2VNZWFuID0gMjtcbiAgICBjb25zdCBsdWNlU2hhcGUgPSAzO1xuICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5nYW1tYShcbiAgICAgIHN0YXRlLmx1Y2UsXG4gICAgICBsdWNlU2hhcGUsXG4gICAgICBsdWNlU2hhcGUgLyBsdWNlTWVhbixcbiAgICApO1xuICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7XG5cbiAgICAvLyBMaWtlbGlob29kXG4gICAgZGF0YS5mb3JFYWNoKChjaG9pY2UpID0+IHtcbiAgICAgIC8vIFZhbHVlc1xuICAgICAgY29uc3QgdnMgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hcywgY2hvaWNlLmRzLCBzdGF0ZS5rKTtcbiAgICAgIGNvbnN0IHZsID0gSFRETWF0aC5hZGsydihjaG9pY2UuYWwsIGNob2ljZS5kbCwgc3RhdGUuayk7XG5cbiAgICAgIC8vIENob2ljZSBvZiBzb29uZXIgb3IgbGF0ZXIgaXMgc2FtcGxlZCBmcm9tIGEgQmVybm91bGxpIGRpc3RyaWJ1dGlvblxuICAgICAgLy8gTHVjZSBjaG9pY2UgcnVsZSBpcyB1c2VkIHRvIGNvbXB1dGUgcHJvYmFiaWxpdHkgb2Ygd2FpdGluZyEgKDAgPSBzb29uZXIsIDEgPSBsYXRlcilcbiAgICAgIGNvbnN0IGJpbnZhbCA9IDEgLyAoMSArIE1hdGguZXhwKHN0YXRlLmx1Y2UgKiAodnMgLSB2bCkpKTtcblxuICAgICAgLy8gQWN0dWFsIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZSA9IChjaG9pY2UucmVzcG9uc2UgPT09ICdmaXJzdCcpID8gMCA6IDE7XG5cbiAgICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5iZXJuKHJlc3BvbnNlLCBiaW52YWwpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxwO1xuICB9O1xuXG4gIC8vIEluaXRpYWxpemluZyB0aGUgc2FtcGxlclxuICBjb25zdCBzYW1wbGVyID0gbmV3IEJheWVzTWNtYy5BbXdnU2FtcGxlcihwYXJhbXMsIGxvZ1Bvc3QsIGV2ZW50LmRhdGEpO1xuICAvLyBCdXJuaW5nIHNvbWUgc2FtcGxlcyB0byB0aGUgTUNNQyBnb2RzIGFuZCBzYW1wbGluZyA1MDAwIGRyYXdzXG4gIHNhbXBsZXIuYnVybigxMDAwKTtcbiAgY29uc3Qgc2FtcGxlcyA9IHNhbXBsZXIuc2FtcGxlKDUwMDApO1xuXG4gIC8vIEV4dHJhY3Qgc3VtbWFyeSBzdGF0c1xuICBjb25zdCByZXN1bHRzID0ge1xuICAgIGs6IGQzLm1lZGlhbihzYW1wbGVzLmspLFxuICAgIGx1Y2U6IGQzLm1lZGlhbihzYW1wbGVzLmx1Y2UpLFxuICB9O1xuXG4gIHNlbGYucG9zdE1lc3NhZ2Uoe3Jlc3VsdHM6IHJlc3VsdHMsIHNhbXBsZXM6IHNhbXBsZXN9KTtcbn07XG4iXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJtb2R1bGUiLCJleHBvcnRzIiwibGQiLCJ0aGlzIiwibGdhbW1hIiwieCIsImoiLCJjb2YiLCJzZXIiLCJ4eCIsInkiLCJ0bXAiLCJsb2ciLCJsZmFjdG9yaWFsIiwibiIsIk5hTiIsImxjaG9vc2UiLCJrIiwibGJldGEiLCJhIiwiYiIsIk1hdGgiLCJleHAiLCJhYnMiLCJwb3ciLCJzcXJ0IiwicGkiLCJQSSIsImJldGEiLCJzaGFwZTEiLCJzaGFwZTIiLCJJbmZpbml0eSIsImNhdWNoeSIsImxvY2F0aW9uIiwic2NhbGUiLCJub3JtIiwibWVhbiIsInNkIiwiYml2YXJub3JtIiwiY29yciIsInoiLCJub3JtYWxpemluZ19mYWN0b3IiLCJiaXZhcl9sb2dfZGVucyIsImxhcGxhY2UiLCJkZXhwIiwiZ2FtbWEiLCJzaGFwZSIsInJhdGUiLCJpbnZnYW1tYSIsImxub3JtIiwibWVhbmxvZyIsInNkbG9nIiwicGFyZXRvIiwidCIsImRmIiwid2VpYnVsbCIsInRtcDEiLCJ0bXAyIiwibG9naXMiLCJlIiwiZiIsImRpcmljaGxldCIsImFscGhhIiwic3VtX2FscGhhIiwic3VtX2xnYW1tYV9hbHBoYSIsInN1bV9hbHBoYV9zdWJfMV9sb2dfeCIsImxlbmd0aCIsImkiLCJ1bmlmIiwibWluIiwibWF4IiwiYmVybiIsInByb2IiLCJjYXQiLCJwcm9icyIsImJpbm9tIiwic2l6ZSIsIm5iaW5vbSIsImh5cGVyIiwibSIsInBvaXMiLCJsYW1iZGEiLCJtY21jIiwicnVuaWYiLCJyYW5kb20iLCJydW5pZl9kaXNjcmV0ZSIsImZsb29yIiwicm5vcm0iLCJ1IiwidiIsInEiLCJkZWVwX2Nsb25lIiwic3JjIiwibWl4aW4iLCJkZXN0Iiwic291cmNlIiwiY29weUZ1bmMiLCJuYW1lIiwicyIsImVtcHR5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwibm9kZVR5cGUiLCJjbG9uZU5vZGUiLCJEYXRlIiwiZ2V0VGltZSIsIlJlZ0V4cCIsInIiLCJsIiwiQXJyYXkiLCJwdXNoIiwiY29uc3RydWN0b3IiLCJjbG9uZV9wYXJhbV9kcmF3IiwiaXNBcnJheSIsInhfY29weSIsInNsaWNlIiwiaXNfbnVtYmVyIiwib2JqZWN0IiwiTnVtYmVyIiwiY3JlYXRlX2FycmF5IiwiZGltIiwiaW5pdCIsImFyciIsImFycmF5X2RpbSIsImNvbmNhdCIsImFycmF5X2VxdWFsIiwiYTEiLCJhMiIsIm5lc3RlZF9hcnJheV9hcHBseSIsImZ1biIsInJlc3VsdCIsInNodWZmbGVfYXJyYXkiLCJhcnJheSIsInRlbXAiLCJuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5IiwibGVuIiwiYXJyYXlfaXMiLCJhcnJheV9pIiwiZ2V0X29wdGlvbiIsIm9wdGlvbl9uYW1lIiwib3B0aW9ucyIsImRlZmF1bF92YWx1ZSIsImhhc093blByb3BlcnR5IiwidW5kZWZpbmVkIiwiZ2V0X211bHRpZGltX29wdGlvbiIsInZhbHVlIiwicGFyYW1faW5pdF9maXhlZCIsInR5cGUiLCJsb3dlciIsInVwcGVyIiwicm91bmQiLCJjb21wbGV0ZV9wYXJhbXMiLCJwYXJhbXNfdG9fY29tcGxldGUiLCJwYXJhbV9pbml0IiwicGFyYW1zIiwicGFyYW1fbmFtZSIsInBhcmFtIiwiU3RlcHBlciIsInN0YXRlIiwibG9nX3Bvc3QiLCJzdGVwIiwic3RhcnRfYWRhcHRhdGlvbiIsInN0b3BfYWRhcHRhdGlvbiIsImluZm8iLCJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciIsImdlbmVyYXRlX3Byb3Bvc2FsIiwicGFyYW1fbmFtZXMiLCJrZXlzIiwicHJvcF9sb2dfc2NhbGUiLCJiYXRjaF9zaXplIiwibWF4X2FkYXB0YXRpb24iLCJpbml0aWFsX2FkYXB0YXRpb24iLCJ0YXJnZXRfYWNjZXB0X3JhdGUiLCJpc19hZGFwdGluZyIsImFjY2VwdGFuY2VfY291bnQiLCJiYXRjaF9jb3VudCIsIml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24iLCJjcmVhdGUiLCJwYXJhbV9zdGF0ZSIsInBhcmFtX3Byb3Bvc2FsIiwiY3Vycl9sb2dfZGVucyIsInByb3BfbG9nX2RlbnMiLCJhY2NlcHRfcHJvYiIsImxvZ19zZF9hZGp1c3RtZW50Iiwibm9ybWFsX3Byb3Bvc2FsIiwiUmVhbE1ldHJvcG9saXNTdGVwcGVyIiwiZGlzY3JldGVfbm9ybWFsX3Byb3Bvc2FsIiwiSW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiU3ViU3RlcHBlciIsImNyZWF0ZV9zdWJzdGVwcGVycyIsInN1YnN0YXRlIiwic3Vic3RlcHBlcnMiLCJzdWJvcHRpb25zIiwic3VicGFyYW0iLCJzdWJzdGVwcGVyIiwiTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiQmluYXJ5U3RlcHBlciIsInplcm9fbG9nX2RlbnMiLCJvbmVfbG9nX2RlbnMiLCJtYXhfbG9nX2RlbnMiLCJ6ZXJvX3Byb2IiLCJCaW5hcnlDb21wb25lbnRTdGVwcGVyIiwic3VicGFyYW1zIiwiQW13Z1N0ZXBwZXIiLCJTZWxlY3RTdGVwcGVyIiwicGFyYW1fb2JqZWN0X3dyYXAiLCJwYXJhbV9vcHRpb25zIiwiU2FtcGxlciIsImRhdGEiLCJwYXJhbV9pbml0X2Z1biIsInRoaW5uaW5nX2ludGVydmFsIiwicGFyYW1zX3RvX21vbml0b3IiLCJ0aGluIiwibW9uaXRvciIsInN0ZXBwZXJzIiwiY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUiLCJzYW1wbGUiLCJuX2l0ZXJhdGlvbnMiLCJtb25pdG9yZWRfcGFyYW1zIiwiY3Vycl9zYW1wbGUiLCJidXJuIiwiQW13Z1NhbXBsZXIiLCJhc2NlbmRpbmciLCJudW1iZXJzIiwidmFsdWVzIiwidmFsdWVvZiIsImluZGV4IiwiY29tcGFyZURlZmluZWQiLCJjb21wYXJlIiwiYXNjZW5kaW5nRGVmaW5lZCIsIlR5cGVFcnJvciIsInF1aWNrc2VsZWN0IiwibGVmdCIsInJpZ2h0IiwibmV3TGVmdCIsIm5ld1JpZ2h0Iiwic3dhcCIsInF1YW50aWxlIiwicCIsIkZsb2F0NjRBcnJheSIsImZyb20iLCJpc05hTiIsImkwIiwidmFsdWUwIiwic3ViYXJyYXkiLCJ2YWx1ZTEiLCJtZWRpYW4iLCJUcmFuc2Zvcm0iLCJ0cmFuc2xhdGUiLCJhcHBseSIsInBvaW50IiwiYXBwbHlYIiwiYXBwbHlZIiwiaW52ZXJ0IiwiaW52ZXJ0WCIsImludmVydFkiLCJyZXNjYWxlWCIsImNvcHkiLCJkb21haW4iLCJyYW5nZSIsIm1hcCIsInJlc2NhbGVZIiwiSFRETWF0aCIsImFkazJ2IiwiZCIsImFkdjJrIiwic2VsZiIsIm9ubWVzc2FnZSIsImV2ZW50IiwibHVjZSIsImxvZ1Bvc3QiLCJscCIsImtNZWFuIiwia1NoYXBlIiwiQmF5ZXNEaXN0cmlidXRpb25zIiwibHVjZU1lYW4iLCJsdWNlU2hhcGUiLCJmb3JFYWNoIiwiY2hvaWNlIiwidnMiLCJhcyIsImRzIiwidmwiLCJhbCIsImRsIiwiYmludmFsIiwicmVzcG9uc2UiLCJzYW1wbGVyIiwiQmF5ZXNNY21jIiwic2FtcGxlcyIsInJlc3VsdHMiLCJkMyIsInBvc3RNZXNzYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Q0FHQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FFQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTs7Q0FPQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7R0FDQyxDQUFVQSxVQUFBQSxJQUFJLEVBQUVDLE9BQU8sRUFBRTtLQUlmLElBQWtDQyxNQUFNLENBQUNDLE9BQU8sRUFBRTtDQUM3RDtDQUNBO0NBQ0E7Q0FDUUQsTUFBQUEsTUFBQSxDQUFBQyxPQUFBLEdBQWlCRixPQUFPLEVBQUUsQ0FBQTtDQUNsQyxLQUFLLE1BQU07Q0FDWDtDQUNRRCxNQUFBQSxJQUFJLENBQUNJLEVBQUUsR0FBR0gsT0FBTyxFQUFFLENBQUE7Q0FDeEIsS0FBQTtDQUNILEdBQUMsRUFBQ0ksY0FBSSxFQUFFLFlBQVc7Q0FDbkI7S0FDRSxJQUFJRCxFQUFFLEdBQUksRUFBRSxDQUFBOztDQUVkO0NBQ0E7O0NBRUUsSUFBQSxJQUFJRSxNQUFNLEdBQUcsVUFBU0MsQ0FBQyxFQUFFO09BQ3ZCLElBQUlDLENBQUMsR0FBRyxDQUFDLENBQUE7Q0FDVCxNQUFBLElBQUlDLEdBQUcsR0FBRyxDQUNSLGlCQUFpQixFQUFFLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQ3hELENBQUMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxrQkFBa0IsQ0FDL0QsQ0FBQTtPQUNELElBQUlDLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQTtDQUMzQixNQUFBLElBQUlDLEVBQUUsRUFBRUMsQ0FBQyxFQUFFQyxHQUFHLENBQUE7T0FDZEEsR0FBRyxHQUFHLENBQUNELENBQUMsR0FBR0QsRUFBRSxHQUFHSixDQUFDLElBQUks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QixDQUM1QnRILEtBQUssQ0FBQ2lILElBQUksRUFDVk8sU0FBUyxFQUNUQSxTQUFTLEdBQUdELFFBQ2QsQ0FBQyxDQUFBO0NBQ0Q7O0NBRUE7Q0FDQW5FLElBQUFBLElBQUksQ0FBQ3FFLE9BQU8sQ0FBRUMsTUFBTSxJQUFLO0NBQ3ZCO0NBQ0EsTUFBQSxNQUFNQyxFQUFFLEdBQUdqQixPQUFPLENBQUNDLEtBQUssQ0FBQ2UsTUFBTSxDQUFDRSxFQUFFLEVBQUVGLE1BQU0sQ0FBQ0csRUFBRSxFQUFFN0gsS0FBSyxDQUFDL0ksQ0FBQyxDQUFDLENBQUE7Q0FDdkQsTUFBQSxNQUFNNlEsRUFBRSxHQUFHcEIsT0FBTyxDQUFDQyxLQUFLLENBQUNlLE1BQU0sQ0FBQ0ssRUFBRSxFQUFFTCxNQUFNLENBQUNNLEVBQUUsRUFBRWhJLEtBQUssQ0FBQy9JLENBQUMsQ0FBQyxDQUFBOztDQUV2RDtDQUNBO0NBQ0EsTUFBQSxNQUFNZ1IsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUc1USxJQUFJLENBQUNDLEdBQUcsQ0FBQzBJLEtBQUssQ0FBQ2lILElBQUksSUFBSVUsRUFBRSxHQUFHRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7O0NBRXpEO09BQ0EsTUFBTUksUUFBUSxHQUFJUixNQUFNLENBQUNRLFFBQVEsS0FBSyxPQUFPLEdBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtPQUV0RGYsRUFBRSxJQUFJRyx5QkFBdUIsQ0FBQ1ksUUFBUSxFQUFFRCxNQUFNLENBQUMsQ0FBQTtDQUNqRCxLQUFDLENBQUMsQ0FBQTtDQUVGLElBQUEsT0FBT2QsRUFBRSxDQUFBO0lBQ1YsQ0FBQTs7Q0FFRDtDQUNBLEVBQUEsTUFBTWdCLE9BQU8sR0FBRyxJQUFJQyx1QkFBcUIsQ0FBQ3hJLE1BQU0sRUFBRXNILE9BQU8sRUFBRUYsS0FBSyxDQUFDNUQsSUFBSSxDQUFDLENBQUE7Q0FDdEU7Q0FDQStFLEVBQUFBLE9BQU8sQ0FBQ25FLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtDQUNsQixFQUFBLE1BQU1xRSxPQUFPLEdBQUdGLE9BQU8sQ0FBQ3ZFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTs7Q0FFcEM7Q0FDQSxFQUFBLE1BQU0wRSxPQUFPLEdBQUc7S0FDZHJSLENBQUMsRUFBRXNSLE1BQVMsQ0FBQ0YsT0FBTyxDQUFDcFIsQ0FBQyxDQUFDO0NBQ3ZCZ1EsSUFBQUEsSUFBSSxFQUFFc0IsTUFBUyxDQUFDRixPQUFPLENBQUNwQixJQUFJLENBQUE7SUFDN0IsQ0FBQTtHQUVESCxJQUFJLENBQUMwQixXQUFXLENBQUM7Q0FBQ0YsSUFBQUEsT0FBTyxFQUFFQSxPQUFPO0NBQUVELElBQUFBLE9BQU8sRUFBRUEsT0FBQUE7Q0FBTyxHQUFDLENBQUMsQ0FBQTtDQUN4RCxDQUFDOzs7Ozs7IiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTBdfQ==', false);
22136
22087
  /* eslint-enable */
22137
22088
 
22138
22089
  /*
@@ -22216,7 +22167,7 @@ class HTDFit extends DiscountableElement {
22216
22167
  this.fit();
22217
22168
  }
22218
22169
  static get styles() {
22219
- return [super.styles, i$3`
22170
+ return [super.styles, i$4`
22220
22171
  /* :host {
22221
22172
  display: inline-block;
22222
22173
  } */
@@ -22332,7 +22283,7 @@ class ITCOption extends DiscountableElement {
22332
22283
  this.d = 0;
22333
22284
  }
22334
22285
  static get styles() {
22335
- return [super.styles, i$3`
22286
+ return [super.styles, i$4`
22336
22287
  :host {
22337
22288
  display: inline-block;
22338
22289
 
@@ -22355,7 +22306,7 @@ class ITCOption extends DiscountableElement {
22355
22306
 
22356
22307
  background: var(---color-element-background);
22357
22308
  border: 2px solid var(---color-element-emphasis);
22358
- border-radius: 50%;
22309
+ border-radius: var(---border-radius);
22359
22310
  }
22360
22311
 
22361
22312
  .interactive,
@@ -22487,7 +22438,7 @@ class ITCChoice extends DiscountableElement {
22487
22438
  this.dl = 30;
22488
22439
  }
22489
22440
  static get styles() {
22490
- return [super.styles, i$3`
22441
+ return [super.styles, i$4`
22491
22442
  :host {
22492
22443
  display: inline-block;
22493
22444
  }
@@ -22613,24 +22564,24 @@ class ITCTask extends DiscountableElement {
22613
22564
  // Decision parameters
22614
22565
  this.range = {};
22615
22566
  this.range.as = {
22616
- start: 10,
22567
+ start: 5,
22617
22568
  stop: 20,
22618
- step: 1
22569
+ step: 5
22619
22570
  }; // Amount SS
22620
22571
  this.range.ds = {
22621
- start: 10,
22622
- stop: 40,
22623
- step: 1
22572
+ start: 5,
22573
+ stop: 20,
22574
+ step: 5
22624
22575
  }; // Delay SS
22625
22576
  this.range.al = {
22626
- start: 20,
22627
- stop: 40,
22628
- step: 1
22577
+ start: 40,
22578
+ stop: 80,
22579
+ step: 5
22629
22580
  }; // Amount LL
22630
22581
  this.range.dl = {
22631
- start: 50,
22582
+ start: 40,
22632
22583
  stop: 80,
22633
- step: 1
22584
+ step: 5
22634
22585
  }; // Delay LL
22635
22586
 
22636
22587
  this.range.as.values = range$1(this.range.as.start, this.range.as.stop + 0.01, this.range.as.step);
@@ -22653,9 +22604,8 @@ class ITCTask extends DiscountableElement {
22653
22604
 
22654
22605
  this.runner = undefined; // D3 Interval for frame timing
22655
22606
  }
22656
-
22657
22607
  static get styles() {
22658
- return [super.styles, i$3`
22608
+ return [super.styles, i$4`
22659
22609
  :host {
22660
22610
  display: inline-block;
22661
22611
  }
@@ -22913,7 +22863,7 @@ customElements.define('htd-equation-adk2v', HTDEquationADK2V);
22913
22863
  */
22914
22864
  class HTDExample extends DiscountableElement {
22915
22865
  static get styles() {
22916
- return [super.styles, i$3`
22866
+ return [super.styles, i$4`
22917
22867
  :host {
22918
22868
  ---border: var(--border, 1px solid var(---color-border));
22919
22869
  display: inline-block;