vis-core 0.19.13 → 0.19.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -3
- package/dist/index.module.js +48 -34
- package/dist/version.d.ts +1 -1
- package/package.json +2 -2
package/dist/index.module.js
CHANGED
|
@@ -34515,24 +34515,14 @@ class Iw extends be {
|
|
|
34515
34515
|
}
|
|
34516
34516
|
class Nw extends be {
|
|
34517
34517
|
constructor(t) {
|
|
34518
|
-
super(), this.objectType = "BaseObject#Node", this.drawGroupShow = !0, this.visibleCache = !0, this.options = ui({
|
|
34518
|
+
super(), this.objectType = "BaseObject#Node", this.drawGroupShow = !0, this.visibleCache = !0, this.onNodePointerIndex = [], this.options = ui({
|
|
34519
34519
|
event: "click",
|
|
34520
34520
|
type: "2d"
|
|
34521
34521
|
}, t);
|
|
34522
34522
|
}
|
|
34523
|
-
get clickTarge() {
|
|
34524
|
-
const { eventTarge: t } = this.options;
|
|
34525
|
-
return t ? t.map((e) => [...this.element.querySelectorAll(e)]).flat() : [this.element];
|
|
34526
|
-
}
|
|
34527
34523
|
create() {
|
|
34528
|
-
const { position: t, children: e
|
|
34529
|
-
this.element =
|
|
34530
|
-
const o = Array.isArray(n) ? n : [n], c = Array.isArray(i) ? i : [i];
|
|
34531
|
-
o.forEach((d, h) => {
|
|
34532
|
-
const r = c[h];
|
|
34533
|
-
r && a.addEventListener(d, r);
|
|
34534
|
-
});
|
|
34535
|
-
});
|
|
34524
|
+
const { position: t, children: e } = this.options, i = document.createElement("div");
|
|
34525
|
+
this.element = i, e && i.appendChild(e), this.options.type === "3d" ? this.createCSS3DObject(i) : this.options.type === "3dSprite" ? this.createCSS3DSprite(i) : this.createCSS2DObject(i), t && this.object3d.position.copy(t);
|
|
34536
34526
|
}
|
|
34537
34527
|
setChildren(t) {
|
|
34538
34528
|
this.element.innerHTML = "", this.element.appendChild(t);
|
|
@@ -34549,14 +34539,13 @@ class Nw extends be {
|
|
|
34549
34539
|
checkVisible() {
|
|
34550
34540
|
this.drawGroupShow && this.visibleCache ? super.show() : (!this.drawGroupShow || !this.visibleCache) && super.hide();
|
|
34551
34541
|
}
|
|
34542
|
+
onPointerEvent(t, e) {
|
|
34543
|
+
const i = this.drawController.handlePickNode([this], t, e);
|
|
34544
|
+
this.onNodePointerIndex.push(i);
|
|
34545
|
+
}
|
|
34552
34546
|
dispose() {
|
|
34553
|
-
|
|
34554
|
-
|
|
34555
|
-
const n = Array.isArray(e) ? e : [e], l = Array.isArray(t) ? t : [t];
|
|
34556
|
-
n.forEach((a, o) => {
|
|
34557
|
-
const c = l[o];
|
|
34558
|
-
c && i.removeEventListener(a, c);
|
|
34559
|
-
});
|
|
34547
|
+
this.onNodePointerIndex.forEach((t) => {
|
|
34548
|
+
this.drawController.removePickNode(t);
|
|
34560
34549
|
}), super.dispose();
|
|
34561
34550
|
}
|
|
34562
34551
|
}
|
|
@@ -39869,7 +39858,7 @@ class co {
|
|
|
39869
39858
|
this.pluginName = "draw", this.objMap = /* @__PURE__ */ new Map(), this.targetNullMap = /* @__PURE__ */ new Map(), this.nodeGroupVisible = !0, this.objectNamesToFactories = /* @__PURE__ */ new Map(), this.objects = /* @__PURE__ */ new Map(), this.pickFunctionsMapIndex = -1, this.pickFunctionsMap = {}, this.pickListener = {
|
|
39870
39859
|
move: !1,
|
|
39871
39860
|
down: !1
|
|
39872
|
-
}, this.objects_ = t;
|
|
39861
|
+
}, this.pickNodeFunctionsMapIndex = -1, this.pickNodeFunctionsMap = {}, this.objects_ = t;
|
|
39873
39862
|
}
|
|
39874
39863
|
get objectsPromise() {
|
|
39875
39864
|
const t = [];
|
|
@@ -40074,10 +40063,36 @@ class co {
|
|
|
40074
40063
|
removePick(t) {
|
|
40075
40064
|
delete this.pickFunctionsMap[t];
|
|
40076
40065
|
}
|
|
40066
|
+
handlePickNode(t, e, i) {
|
|
40067
|
+
this.pickNodeFunctionsMapIndex += 1;
|
|
40068
|
+
const n = this.pickNodeFunctionsMapIndex;
|
|
40069
|
+
return (t instanceof Function ? t() : t).forEach((l) => {
|
|
40070
|
+
const a = l;
|
|
40071
|
+
a.element.style.pointerEvents = "auto";
|
|
40072
|
+
const o = (c) => {
|
|
40073
|
+
i(a, c);
|
|
40074
|
+
};
|
|
40075
|
+
a.element.addEventListener(`pointer${e}`, o, !1), this.pickNodeFunctionsMap[n] || (this.pickNodeFunctionsMap[n] = []), this.pickNodeFunctionsMap[n].push({
|
|
40076
|
+
arr: a,
|
|
40077
|
+
type: `pointer${e}`,
|
|
40078
|
+
listener: o
|
|
40079
|
+
});
|
|
40080
|
+
}), n;
|
|
40081
|
+
}
|
|
40082
|
+
removePickNode(t) {
|
|
40083
|
+
const e = this.pickNodeFunctionsMap[t];
|
|
40084
|
+
e && (e.forEach((i) => {
|
|
40085
|
+
i.arr.element.style.pointerEvents = "none", i.arr.element.removeEventListener(
|
|
40086
|
+
i.type,
|
|
40087
|
+
i.listener,
|
|
40088
|
+
!1
|
|
40089
|
+
);
|
|
40090
|
+
}), delete this.pickNodeFunctionsMap[t]);
|
|
40091
|
+
}
|
|
40077
40092
|
dispose() {
|
|
40078
40093
|
this.objects.forEach((t, e) => {
|
|
40079
40094
|
t.dispose(), t.pm.reject(`stop draw:${e}`);
|
|
40080
|
-
}), this.objects.clear(), this.objMap.clear(), this.targetNullMap.clear(), this.objectNamesToFactories.clear(), this.group = void 0, this.prefabGroup = void 0;
|
|
40095
|
+
}), this.objects.clear(), this.objMap.clear(), this.targetNullMap.clear(), this.objectNamesToFactories.clear(), this.pickFunctionsMap = {}, this.pickNodeFunctionsMap = {}, this.group = void 0, this.prefabGroup = void 0;
|
|
40081
40096
|
}
|
|
40082
40097
|
}
|
|
40083
40098
|
const wf = "dmFyIFhOPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxxTj1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgWU49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIHVoPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIHdTPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksQVM9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgaG09KFF0LGVlKT0+KGVlPVN5bWJvbFtRdF0pP2VlOlN5bWJvbC5mb3IoIlN5bWJvbC4iK1F0KSxaTj1RdD0+e3Rocm93IFR5cGVFcnJvcihRdCl9LG9vPU1hdGgucG93LGJTPShRdCxlZSxnZSk9PmVlIGluIFF0P1hOKFF0LGVlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpnZX0pOlF0W2VlXT1nZSxPaT0oUXQsZWUpPT57Zm9yKHZhciBnZSBpbiBlZXx8KGVlPXt9KSl3Uy5jYWxsKGVlLGdlKSYmYlMoUXQsZ2UsZWVbZ2VdKTtpZih1aClmb3IodmFyIGdlIG9mIHVoKGVlKSlBUy5jYWxsKGVlLGdlKSYmYlMoUXQsZ2UsZWVbZ2VdKTtyZXR1cm4gUXR9LGhoPShRdCxlZSk9PnFOKFF0LFlOKGVlKSk7dmFyIEVTPShRdCxlZSk9Pnt2YXIgZ2U9e307Zm9yKHZhciBDZSBpbiBRdCl3Uy5jYWxsKFF0LENlKSYmZWUuaW5kZXhPZihDZSk8MCYmKGdlW0NlXT1RdFtDZV0pO2lmKFF0IT1udWxsJiZ1aClmb3IodmFyIENlIG9mIHVoKFF0KSllZS5pbmRleE9mKENlKTwwJiZBUy5jYWxsKFF0LENlKSYmKGdlW0NlXT1RdFtDZV0pO3JldHVybiBnZX07dmFyIEpyPShRdCxlZSxnZSk9Pm5ldyBQcm9taXNlKChDZSx5bik9Pnt2YXIgdm49bG49Pnt0cnl7bHIoZ2UubmV4dChsbikpfWNhdGNoKEtyKXt5bihLcil9fSx1aT1sbj0+e3RyeXtscihnZS50aHJvdyhsbikpfWNhdGNoKEtyKXt5bihLcil9fSxscj1sbj0+bG4uZG9uZT9DZShsbi52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKGxuLnZhbHVlKS50aGVuKHZuLHVpKTtscigoZ2U9Z2UuYXBwbHkoUXQsZWUpKS5uZXh0KCkpfSksSk49ZnVuY3Rpb24oUXQsZWUpe3RoaXNbMF09UXQsdGhpc1sxXT1lZX07dmFyIFRTPVF0PT57dmFyIGVlPVF0W2htKCJhc3luY0l0ZXJhdG9yIildLGdlPSExLENlLHluPXt9O3JldHVybiBlZT09bnVsbD8oZWU9UXRbaG0oIml0ZXJhdG9yIildKCksQ2U9dm49PnluW3ZuXT11aT0+ZWVbdm5dKHVpKSk6KGVlPWVlLmNhbGwoUXQpLENlPXZuPT55blt2bl09dWk9PntpZihnZSl7aWYoZ2U9ITEsdm49PT0idGhyb3ciKXRocm93IHVpO3JldHVybiB1aX1yZXR1cm4gZ2U9ITAse2RvbmU6ITEsdmFsdWU6bmV3IEpOKG5ldyBQcm9taXNlKGxyPT57dmFyIGxuPWVlW3ZuXSh1aSk7bG4gaW5zdGFuY2VvZiBPYmplY3R8fFpOKCJPYmplY3QgZXhwZWN0ZWQiKSxscihsbil9KSwxKX19KSx5bltobSgiaXRlcmF0b3IiKV09KCk9PnluLENlKCJuZXh0IiksInRocm93ImluIGVlP0NlKCJ0aHJvdyIpOnluLnRocm93PXZuPT57dGhyb3cgdm59LCJyZXR1cm4iaW4gZWUmJkNlKCJyZXR1cm4iKSx5bn07KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiOy8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgMjAxMC0yMDI0IFRocmVlLmpzIEF1dGhvcnMKICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogKi9jb25zdCBRdD0iMTY4IixlZT17TEVGVDowLE1JRERMRToxLFJJR0hUOjIsUk9UQVRFOjAsRE9MTFk6MSxQQU46Mn0sZ2U9e1JPVEFURTowLFBBTjoxLERPTExZX1BBTjoyLERPTExZX1JPVEFURTozfSxDZT0wLHluPTEsdm49Mix1aT0zLGxyPTAsbG49MSxLcj0yLEpuPTMsaGk9MCxLZT0xLEtuPTIsZmk9MCxjcj0xLGZoPTIsZGg9MyxwaD00LGZtPTUsQmk9MTAwLGRtPTEwMSxwbT0xMDIsbW09MTAzLGdtPTEwNCx5bT0yMDAsdm09MjAxLF9tPTIwMix4bT0yMDMsRmE9MjA0LE9hPTIwNSxNbT0yMDYsU209MjA3LGJtPTIwOCx3bT0yMDksQW09MjEwLEVtPTIxMSxUbT0yMTIsQ209MjEzLFJtPTIxNCxQbT0wLEltPTEsTG09Mixhbz0zLERtPTQsVW09NSxObT02LEZtPTcsbG89MCxPbT0xLEJtPTIsZGk9MCx6bT0xLGttPTIsR209MyxWbT00LEhtPTUsV209NiwkbT03LG1oPSJhdHRhY2hlZCIsWG09ImRldGFjaGVkIixCYT0zMDAscGk9MzAxLHppPTMwMixjbz0zMDMsdW89MzA0LGpyPTMwNixobz0xZTMsSW49MTAwMSxmbz0xMDAyLEZlPTEwMDMsZ2g9MTAwNCxSUz0xMDA0LFFyPTEwMDUsUFM9MTAwNSxSZT0xMDA2LHBvPTEwMDcsSVM9MTAwNyxqbj0xMDA4LExTPTEwMDgsUW49MTAwOSx5aD0xMDEwLHZoPTEwMTEsdHM9MTAxMix6YT0xMDEzLG1pPTEwMTQsY249MTAxNSxlcz0xMDE2LGthPTEwMTcsR2E9MTAxOCx1cj0xMDIwLF9oPTM1OTAyLHhoPTEwMjEsTWg9MTAyMixqZT0xMDIzLFNoPTEwMjQsYmg9MTAyNSxocj0xMDI2LGZyPTEwMjcsVmE9MTAyOCxtbz0xMDI5LHdoPTEwMzAsSGE9MTAzMSxEUz0xMDMyLFdhPTEwMzMsZ289MzM3NzYseW89MzM3Nzcsdm89MzM3NzgsX289MzM3NzksJGE9MzU4NDAsWGE9MzU4NDEscWE9MzU4NDIsWWE9MzU4NDMsWmE9MzYxOTYsSmE9Mzc0OTIsS2E9Mzc0OTYsamE9Mzc4MDgsUWE9Mzc4MDksdGw9Mzc4MTAsZWw9Mzc4MTEsbmw9Mzc4MTIsaWw9Mzc4MTMscmw9Mzc4MTQsc2w9Mzc4MTUsb2w9Mzc4MTYsYWw9Mzc4MTcsbGw9Mzc4MTgsY2w9Mzc4MTksdWw9Mzc4MjAsaGw9Mzc4MjEseG89MzY0OTIsZmw9MzY0OTQsZGw9MzY0OTUsQWg9MzYyODMscGw9MzYyODQsbWw9MzYyODUsZ2w9MzYyODYscW09MjIwMCxZbT0yMjAxLFptPTIyMDIsTW89MjMwMCx5bD0yMzAxLHZsPTIzMDIsZHI9MjQwMCxwcj0yNDAxLFNvPTI0MDIsX2w9MjUwMCxFaD0yNTAxLFVTPTAsTlM9MSxGUz0yLEptPTMyMDAsS209MzIwMSxPUz0zMjAyLEJTPTMyMDMsa2k9MCxqbT0xLGdpPSIiLExuPSJzcmdiIix5aT0ic3JnYi1saW5lYXIiLHhsPSJkaXNwbGF5LXAzIixibz0iZGlzcGxheS1wMy1saW5lYXIiLHdvPSJsaW5lYXIiLGRlPSJzcmdiIixBbz0icmVjNzA5IixFbz0icDMiLHpTPTAsbXI9NzY4MCxrUz03NjgxLEdTPTc2ODIsVlM9NzY4MyxIUz0zNDA1NSxXUz0zNDA1NiwkUz01Mzg2LFhTPTUxMixxUz01MTMsWVM9NTE0LFpTPTUxNSxKUz01MTYsS1M9NTE3LGpTPTUxOCxUaD01MTksUW09NTEyLHRnPTUxMyxlZz01MTQsQ2g9NTE1LG5nPTUxNixpZz01MTcscmc9NTE4LHNnPTUxOSxUbz0zNTA0NCxRUz0zNTA0OCx0Yj0zNTA0MCxlYj0zNTA0NSxuYj0zNTA0OSxpYj0zNTA0MSxyYj0zNTA0NixzYj0zNTA1MCxvYj0zNTA0MixhYj0iMTAwIixSaD0iMzAwIGVzIix0aT0yZTMsQ289MjAwMTtjbGFzcyBlaXthZGRFdmVudExpc3RlbmVyKHQsZSl7dGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztuW3RdPT09dm9pZCAwJiYoblt0XT1bXSksblt0XS5pbmRleE9mKGUpPT09LTEmJm5bdF0ucHVzaChlKX1oYXNFdmVudExpc3RlbmVyKHQsZSl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybiExO2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiBuW3RdIT09dm9pZCAwJiZuW3RdLmluZGV4T2YoZSkhPT0tMX1yZW1vdmVFdmVudExpc3RlbmVyKHQsZSl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybjtjb25zdCByPXRoaXMuX2xpc3RlbmVyc1t0XTtpZihyIT09dm9pZCAwKXtjb25zdCBzPXIuaW5kZXhPZihlKTtzIT09LTEmJnIuc3BsaWNlKHMsMSl9fWRpc3BhdGNoRXZlbnQodCl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybjtjb25zdCBuPXRoaXMuX2xpc3RlbmVyc1t0LnR5cGVdO2lmKG4hPT12b2lkIDApe3QudGFyZ2V0PXRoaXM7Y29uc3Qgcj1uLnNsaWNlKDApO2ZvcihsZXQgcz0wLG89ci5sZW5ndGg7czxvO3MrKylyW3NdLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3QgSGU9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2xldCBvZz0xMjM0NTY3O2NvbnN0IGdyPU1hdGguUEkvMTgwLG5zPTE4MC9NYXRoLlBJO2Z1bmN0aW9uIF9uKCl7Y29uc3QgaT1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCx0PU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLGU9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAsbj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MDtyZXR1cm4oSGVbaSYyNTVdK0hlW2k+PjgmMjU1XStIZVtpPj4xNiYyNTVdK0hlW2k+PjI0JjI1NV0rIi0iK0hlW3QmMjU1XStIZVt0Pj44JjI1NV0rIi0iK0hlW3Q+PjE2JjE1fDY0XStIZVt0Pj4yNCYyNTVdKyItIitIZVtlJjYzfDEyOF0rSGVbZT4+OCYyNTVdKyItIitIZVtlPj4xNiYyNTVdK0hlW2U+PjI0JjI1NV0rSGVbbiYyNTVdK0hlW24+PjgmMjU1XStIZVtuPj4xNiYyNTVdK0hlW24+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24geGUoaSx0LGUpe3JldHVybiBNYXRoLm1heCh0LE1hdGgubWluKGUsaSkpfWZ1bmN0aW9uIFBoKGksdCl7cmV0dXJuKGkldCt0KSV0fWZ1bmN0aW9uIGxiKGksdCxlLG4scil7cmV0dXJuIG4rKGktdCkqKHItbikvKGUtdCl9ZnVuY3Rpb24gY2IoaSx0LGUpe3JldHVybiBpIT09dD8oZS1pKS8odC1pKTowfWZ1bmN0aW9uIFJvKGksdCxlKXtyZXR1cm4oMS1lKSppK2UqdH1mdW5jdGlvbiB1YihpLHQsZSxuKXtyZXR1cm4gUm8oaSx0LDEtTWF0aC5leHAoLWUqbikpfWZ1bmN0aW9uIGhiKGksdD0xKXtyZXR1cm4gdC1NYXRoLmFicyhQaChpLHQqMiktdCl9ZnVuY3Rpb24gZmIoaSx0LGUpe3JldHVybiBpPD10PzA6aT49ZT8xOihpPShpLXQpLyhlLXQpLGkqaSooMy0yKmkpKX1mdW5jdGlvbiBkYihpLHQsZSl7cmV0dXJuIGk8PXQ/MDppPj1lPzE6KGk9KGktdCkvKGUtdCksaSppKmkqKGkqKGkqNi0xNSkrMTApKX1mdW5jdGlvbiBwYihpLHQpe3JldHVybiBpK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoodC1pKzEpKX1mdW5jdGlvbiBtYihpLHQpe3JldHVybiBpK01hdGgucmFuZG9tKCkqKHQtaSl9ZnVuY3Rpb24gZ2IoaSl7cmV0dXJuIGkqKC41LU1hdGgucmFuZG9tKCkpfWZ1bmN0aW9uIHliKGkpe2khPT12b2lkIDAmJihvZz1pKTtsZXQgdD1vZys9MTgzMTU2NTgxMztyZXR1cm4gdD1NYXRoLmltdWwodF50Pj4+MTUsdHwxKSx0Xj10K01hdGguaW11bCh0XnQ+Pj43LHR8NjEpLCgodF50Pj4+MTQpPj4+MCkvNDI5NDk2NzI5Nn1mdW5jdGlvbiB2YihpKXtyZXR1cm4gaSpncn1mdW5jdGlvbiBfYihpKXtyZXR1cm4gaSpuc31mdW5jdGlvbiB4YihpKXtyZXR1cm4oaSZpLTEpPT09MCYmaSE9PTB9ZnVuY3Rpb24gTWIoaSl7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5jZWlsKE1hdGgubG9nKGkpL01hdGguTE4yKSl9ZnVuY3Rpb24gU2IoaSl7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyhpKS9NYXRoLkxOMikpfWZ1bmN0aW9uIGJiKGksdCxlLG4scil7Y29uc3Qgcz1NYXRoLmNvcyxvPU1hdGguc2luLGE9cyhlLzIpLGw9byhlLzIpLGM9cygodCtuKS8yKSx1PW8oKHQrbikvMiksaD1zKCh0LW4pLzIpLGY9bygodC1uKS8yKSxkPXMoKG4tdCkvMikscD1vKChuLXQpLzIpO3N3aXRjaChyKXtjYXNlIlhZWCI6aS5zZXQoYSp1LGwqaCxsKmYsYSpjKTticmVhaztjYXNlIllaWSI6aS5zZXQobCpmLGEqdSxsKmgsYSpjKTticmVhaztjYXNlIlpYWiI6aS5zZXQobCpoLGwqZixhKnUsYSpjKTticmVhaztjYXNlIlhaWCI6aS5zZXQoYSp1LGwqcCxsKmQsYSpjKTticmVhaztjYXNlIllYWSI6aS5zZXQobCpkLGEqdSxsKnAsYSpjKTticmVhaztjYXNlIlpZWiI6aS5zZXQobCpwLGwqZCxhKnUsYSpjKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuTWF0aFV0aWxzOiAuc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrcil9fWZ1bmN0aW9uIFFlKGksdCl7c3dpdGNoKHQuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiBpO2Nhc2UgVWludDMyQXJyYXk6cmV0dXJuIGkvNDI5NDk2NzI5NTtjYXNlIFVpbnQxNkFycmF5OnJldHVybiBpLzY1NTM1O2Nhc2UgVWludDhBcnJheTpyZXR1cm4gaS8yNTU7Y2FzZSBJbnQzMkFycmF5OnJldHVybiBNYXRoLm1heChpLzIxNDc0ODM2NDcsLTEpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5tYXgoaS8zMjc2NywtMSk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgubWF4KGkvMTI3LC0xKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb21wb25lbnQgdHlwZS4iKX19ZnVuY3Rpb24gJHQoaSx0KXtzd2l0Y2godC5jb25zdHJ1Y3Rvcil7Y2FzZSBGbG9hdDMyQXJyYXk6cmV0dXJuIGk7Y2FzZSBVaW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjQyOTQ5NjcyOTUpO2Nhc2UgVWludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSo2NTUzNSk7Y2FzZSBVaW50OEFycmF5OnJldHVybiBNYXRoLnJvdW5kKGkqMjU1KTtjYXNlIEludDMyQXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoyMTQ3NDgzNjQ3KTtjYXNlIEludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSozMjc2Nyk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoxMjcpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCB0eXBlLiIpfX1jb25zdCB3Yj17REVHMlJBRDpncixSQUQyREVHOm5zLGdlbmVyYXRlVVVJRDpfbixjbGFtcDp4ZSxldWNsaWRlYW5Nb2R1bG86UGgsbWFwTGluZWFyOmxiLGludmVyc2VMZXJwOmNiLGxlcnA6Um8sZGFtcDp1YixwaW5ncG9uZzpoYixzbW9vdGhzdGVwOmZiLHNtb290aGVyc3RlcDpkYixyYW5kSW50OnBiLHJhbmRGbG9hdDptYixyYW5kRmxvYXRTcHJlYWQ6Z2Isc2VlZGVkUmFuZG9tOnliLGRlZ1RvUmFkOnZiLHJhZFRvRGVnOl9iLGlzUG93ZXJPZlR3bzp4YixjZWlsUG93ZXJPZlR3bzpNYixmbG9vclBvd2VyT2ZUd286U2Isc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcjpiYixub3JtYWxpemU6JHQsZGVub3JtYWxpemU6UWV9O2NsYXNzIHF7Y29uc3RydWN0b3IodD0wLGU9MCl7cS5wcm90b3R5cGUuaXNWZWN0b3IyPSEwLHRoaXMueD10LHRoaXMueT1lfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnh9c2V0IHdpZHRoKHQpe3RoaXMueD10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy55fXNldCBoZWlnaHQodCl7dGhpcy55PXR9c2V0KHQsZSl7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9clswXSplK3JbM10qbityWzZdLHRoaXMueT1yWzFdKmUrcls0XSpuK3JbN10sdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUsbikpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueX1jcm9zcyh0KXtyZXR1cm4gdGhpcy54KnQueS10aGlzLnkqdC54fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9YW5nbGUoKXtyZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LC10aGlzLngpK01hdGguUEl9YW5nbGVUbyh0KXtjb25zdCBlPU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqdC5sZW5ndGhTcSgpKTtpZihlPT09MClyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QodCkvZTtyZXR1cm4gTWF0aC5hY29zKHhlKG4sLTEsMSkpfWRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVRvU3F1YXJlZCh0KXtjb25zdCBlPXRoaXMueC10Lngsbj10aGlzLnktdC55O3JldHVybiBlKmUrbipufW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueX1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzfXJvdGF0ZUFyb3VuZCh0LGUpe2NvbnN0IG49TWF0aC5jb3MoZSkscj1NYXRoLnNpbihlKSxzPXRoaXMueC10Lngsbz10aGlzLnktdC55O3JldHVybiB0aGlzLng9cypuLW8qcit0LngsdGhpcy55PXMqcitvKm4rdC55LHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueX19Y2xhc3MgWHR7Y29uc3RydWN0b3IodCxlLG4scixzLG8sYSxsLGMpe1h0LnByb3RvdHlwZS5pc01hdHJpeDM9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdLHQhPT12b2lkIDAmJnRoaXMuc2V0KHQsZSxuLHIscyxvLGEsbCxjKX1zZXQodCxlLG4scixzLG8sYSxsLGMpe2NvbnN0IHU9dGhpcy5lbGVtZW50cztyZXR1cm4gdVswXT10LHVbMV09cix1WzJdPWEsdVszXT1lLHVbNF09cyx1WzVdPWwsdVs2XT1uLHVbN109byx1WzhdPWMsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSksdGhpc31jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09blswXSxlWzFdPW5bMV0sZVsyXT1uWzJdLGVbM109blszXSxlWzRdPW5bNF0sZVs1XT1uWzVdLGVbNl09bls2XSxlWzddPW5bN10sZVs4XT1uWzhdLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMiksdGhpc31zZXRGcm9tTWF0cml4NCh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVs0XSxlWzhdLGVbMV0sZVs1XSxlWzldLGVbMl0sZVs2XSxlWzEwXSksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMscj1lLmVsZW1lbnRzLHM9dGhpcy5lbGVtZW50cyxvPW5bMF0sYT1uWzNdLGw9bls2XSxjPW5bMV0sdT1uWzRdLGg9bls3XSxmPW5bMl0sZD1uWzVdLHA9bls4XSx5PXJbMF0sbT1yWzNdLGc9cls2XSx4PXJbMV0sdj1yWzRdLF89cls3XSxFPXJbMl0sYj1yWzVdLFQ9cls4XTtyZXR1cm4gc1swXT1vKnkrYSp4K2wqRSxzWzNdPW8qbSthKnYrbCpiLHNbNl09bypnK2EqXytsKlQsc1sxXT1jKnkrdSp4K2gqRSxzWzRdPWMqbSt1KnYraCpiLHNbN109YypnK3UqXytoKlQsc1syXT1mKnkrZCp4K3AqRSxzWzVdPWYqbStkKnYrcCpiLHNbOF09ZipnK2QqXytwKlQsdGhpc31tdWx0aXBseVNjYWxhcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbMF0qPXQsZVszXSo9dCxlWzZdKj10LGVbMV0qPXQsZVs0XSo9dCxlWzddKj10LGVbMl0qPXQsZVs1XSo9dCxlWzhdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxyPXRbMl0scz10WzNdLG89dFs0XSxhPXRbNV0sbD10WzZdLGM9dFs3XSx1PXRbOF07cmV0dXJuIGUqbyp1LWUqYSpjLW4qcyp1K24qYSpsK3IqcypjLXIqbypsfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHI9dFsyXSxzPXRbM10sbz10WzRdLGE9dFs1XSxsPXRbNl0sYz10WzddLHU9dFs4XSxoPXUqby1hKmMsZj1hKmwtdSpzLGQ9YypzLW8qbCxwPWUqaCtuKmYrcipkO2lmKHA9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgeT0xL3A7cmV0dXJuIHRbMF09aCp5LHRbMV09KHIqYy11Km4pKnksdFsyXT0oYSpuLXIqbykqeSx0WzNdPWYqeSx0WzRdPSh1KmUtcipsKSp5LHRbNV09KHIqcy1hKmUpKnksdFs2XT1kKnksdFs3XT0obipsLWMqZSkqeSx0WzhdPShvKmUtbipzKSp5LHRoaXN9dHJhbnNwb3NlKCl7bGV0IHQ7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0PWVbMV0sZVsxXT1lWzNdLGVbM109dCx0PWVbMl0sZVsyXT1lWzZdLGVbNl09dCx0PWVbNV0sZVs1XT1lWzddLGVbN109dCx0aGlzfWdldE5vcm1hbE1hdHJpeCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCh0KS5pbnZlcnQoKS50cmFuc3Bvc2UoKX10cmFuc3Bvc2VJbnRvQXJyYXkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XSx0aGlzfXNldFV2VHJhbnNmb3JtKHQsZSxuLHIscyxvLGEpe2NvbnN0IGw9TWF0aC5jb3MocyksYz1NYXRoLnNpbihzKTtyZXR1cm4gdGhpcy5zZXQobipsLG4qYywtbioobCpvK2MqYSkrbyt0LC1yKmMscipsLC1yKigtYypvK2wqYSkrYStlLDAsMCwxKSx0aGlzfXNjYWxlKHQsZSl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkoSWgubWFrZVNjYWxlKHQsZSkpLHRoaXN9cm90YXRlKHQpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KEloLm1ha2VSb3RhdGlvbigtdCkpLHRoaXN9dHJhbnNsYXRlKHQsZSl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkoSWgubWFrZVRyYW5zbGF0aW9uKHQsZSkpLHRoaXN9bWFrZVRyYW5zbGF0aW9uKHQsZSl7cmV0dXJuIHQuaXNWZWN0b3IyP3RoaXMuc2V0KDEsMCx0LngsMCwxLHQueSwwLDAsMSk6dGhpcy5zZXQoMSwwLHQsMCwxLGUsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwtbiwwLG4sZSwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZSh0LGUpe3JldHVybiB0aGlzLnNldCh0LDAsMCwwLGUsMCwwLDAsMSksdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztmb3IobGV0IHI9MDtyPDk7cisrKWlmKGVbcl0hPT1uW3JdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjw5O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09blswXSx0W2UrMV09blsxXSx0W2UrMl09blsyXSx0W2UrM109blszXSx0W2UrNF09bls0XSx0W2UrNV09bls1XSx0W2UrNl09bls2XSx0W2UrN109bls3XSx0W2UrOF09bls4XSx0fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfX1jb25zdCBJaD1uZXcgWHQ7ZnVuY3Rpb24gYWcoaSl7Zm9yKGxldCB0PWkubGVuZ3RoLTE7dD49MDstLXQpaWYoaVt0XT49NjU1MzUpcmV0dXJuITA7cmV0dXJuITF9Y29uc3QgQWI9e0ludDhBcnJheSxVaW50OEFycmF5LFVpbnQ4Q2xhbXBlZEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5fTtmdW5jdGlvbiBpcyhpLHQpe3JldHVybiBuZXcgQWJbaV0odCl9ZnVuY3Rpb24gUG8oaSl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsaSl9ZnVuY3Rpb24gbGcoKXtjb25zdCBpPVBvKCJjYW52YXMiKTtyZXR1cm4gaS5zdHlsZS5kaXNwbGF5PSJibG9jayIsaX1jb25zdCBjZz17fTtmdW5jdGlvbiBycyhpKXtpIGluIGNnfHwoY2dbaV09ITAsY29uc29sZS53YXJuKGkpKX1mdW5jdGlvbiBFYihpLHQsZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scil7ZnVuY3Rpb24gcygpe3N3aXRjaChpLmNsaWVudFdhaXRTeW5jKHQsaS5TWU5DX0ZMVVNIX0NPTU1BTkRTX0JJVCwwKSl7Y2FzZSBpLldBSVRfRkFJTEVEOnIoKTticmVhaztjYXNlIGkuVElNRU9VVF9FWFBJUkVEOnNldFRpbWVvdXQocyxlKTticmVhaztkZWZhdWx0Om4oKX19c2V0VGltZW91dChzLGUpfSl9Y29uc3QgdWc9bmV3IFh0KCkuc2V0KC44MjI0NjIxLC4xNzc1MzgsMCwuMDMzMTk0MSwuOTY2ODA1OCwwLC4wMTcwODI3LC4wNzIzOTc0LC45MTA1MTk5KSxoZz1uZXcgWHQoKS5zZXQoMS4yMjQ5NDAxLC0uMjI0OTQwNCwwLC0uMDQyMDU2OSwxLjA0MjA1NzEsMCwtLjAxOTYzNzYsLS4wNzg2MzYxLDEuMDk4MjczNSksSW89e1t5aV06e3RyYW5zZmVyOndvLHByaW1hcmllczpBbyxsdW1pbmFuY2VDb2VmZmljaWVudHM6Wy4yMTI2LC43MTUyLC4wNzIyXSx0b1JlZmVyZW5jZTppPT5pLGZyb21SZWZlcmVuY2U6aT0+aX0sW0xuXTp7dHJhbnNmZXI6ZGUscHJpbWFyaWVzOkFvLGx1bWluYW5jZUNvZWZmaWNpZW50czpbLjIxMjYsLjcxNTIsLjA3MjJdLHRvUmVmZXJlbmNlOmk9PmkuY29udmVydFNSR0JUb0xpbmVhcigpLGZyb21SZWZlcmVuY2U6aT0+aS5jb252ZXJ0TGluZWFyVG9TUkdCKCl9LFtib106e3RyYW5zZmVyOndvLHByaW1hcmllczpFbyxsdW1pbmFuY2VDb2VmZmljaWVudHM6Wy4yMjg5LC42OTE3LC4wNzkzXSx0b1JlZmVyZW5jZTppPT5pLmFwcGx5TWF0cml4MyhoZyksZnJvbVJlZmVyZW5jZTppPT5pLmFwcGx5TWF0cml4Myh1Zyl9LFt4bF06e3RyYW5zZmVyOmRlLHByaW1hcmllczpFbyxsdW1pbmFuY2VDb2VmZmljaWVudHM6Wy4yMjg5LC42OTE3LC4wNzkzXSx0b1JlZmVyZW5jZTppPT5pLmNvbnZlcnRTUkdCVG9MaW5lYXIoKS5hcHBseU1hdHJpeDMoaGcpLGZyb21SZWZlcmVuY2U6aT0+aS5hcHBseU1hdHJpeDModWcpLmNvbnZlcnRMaW5lYXJUb1NSR0IoKX19LFRiPW5ldyBTZXQoW3lpLGJvXSksc2U9e2VuYWJsZWQ6ITAsX3dvcmtpbmdDb2xvclNwYWNlOnlpLGdldCB3b3JraW5nQ29sb3JTcGFjZSgpe3JldHVybiB0aGlzLl93b3JraW5nQ29sb3JTcGFjZX0sc2V0IHdvcmtpbmdDb2xvclNwYWNlKGkpe2lmKCFUYi5oYXMoaSkpdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB3b3JraW5nIGNvbG9yIHNwYWNlLCAiJHtpfSIuYCk7dGhpcy5fd29ya2luZ0NvbG9yU3BhY2U9aX0sY29udmVydDpmdW5jdGlvbihpLHQsZSl7aWYodGhpcy5lbmFibGVkPT09ITF8fHQ9PT1lfHwhdHx8IWUpcmV0dXJuIGk7Y29uc3Qgbj1Jb1t0XS50b1JlZmVyZW5jZSxyPUlvW2VdLmZyb21SZWZlcmVuY2U7cmV0dXJuIHIobihpKSl9LGZyb21Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbihpLHQpe3JldHVybiB0aGlzLmNvbnZlcnQoaSx0aGlzLl93b3JraW5nQ29sb3JTcGFjZSx0KX0sdG9Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbihpLHQpe3JldHVybiB0aGlzLmNvbnZlcnQoaSx0LHRoaXMuX3dvcmtpbmdDb2xvclNwYWNlKX0sZ2V0UHJpbWFyaWVzOmZ1bmN0aW9uKGkpe3JldHVybiBJb1tpXS5wcmltYXJpZXN9LGdldFRyYW5zZmVyOmZ1bmN0aW9uKGkpe3JldHVybiBpPT09Z2k/d286SW9baV0udHJhbnNmZXJ9LGdldEx1bWluYW5jZUNvZWZmaWNpZW50czpmdW5jdGlvbihpLHQ9dGhpcy5fd29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiBpLmZyb21BcnJheShJb1t0XS5sdW1pbmFuY2VDb2VmZmljaWVudHMpfX07ZnVuY3Rpb24gc3MoaSl7cmV0dXJuIGk8LjA0MDQ1P2kqLjA3NzM5OTM4MDg6TWF0aC5wb3coaSouOTQ3ODY3Mjk4NisuMDUyMTMyNzAxNCwyLjQpfWZ1bmN0aW9uIExoKGkpe3JldHVybiBpPC4wMDMxMzA4P2kqMTIuOTI6MS4wNTUqTWF0aC5wb3coaSwuNDE2NjYpLS4wNTV9bGV0IG9zO2NsYXNzIGZne3N0YXRpYyBnZXREYXRhVVJMKHQpe2lmKC9eZGF0YTovaS50ZXN0KHQuc3JjKXx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50PT0idW5kZWZpbmVkIilyZXR1cm4gdC5zcmM7bGV0IGU7aWYodCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KWU9dDtlbHNle29zPT09dm9pZCAwJiYob3M9UG8oImNhbnZhcyIpKSxvcy53aWR0aD10LndpZHRoLG9zLmhlaWdodD10LmhlaWdodDtjb25zdCBuPW9zLmdldENvbnRleHQoIjJkIik7dCBpbnN0YW5jZW9mIEltYWdlRGF0YT9uLnB1dEltYWdlRGF0YSh0LDAsMCk6bi5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksZT1vc31yZXR1cm4gZS53aWR0aD4yMDQ4fHxlLmhlaWdodD4yMDQ4Pyhjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlVXRpbHMuZ2V0RGF0YVVSTDogSW1hZ2UgY29udmVydGVkIHRvIGpwZyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyIsdCksZS50b0RhdGFVUkwoImltYWdlL2pwZWciLC42KSk6ZS50b0RhdGFVUkwoImltYWdlL3BuZyIpfXN0YXRpYyBzUkdCVG9MaW5lYXIodCl7aWYodHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQhPSJ1bmRlZmluZWQiJiZ0IGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50IT0idW5kZWZpbmVkIiYmdCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHx0eXBlb2YgSW1hZ2VCaXRtYXAhPSJ1bmRlZmluZWQiJiZ0IGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApe2NvbnN0IGU9UG8oImNhbnZhcyIpO2Uud2lkdGg9dC53aWR0aCxlLmhlaWdodD10LmhlaWdodDtjb25zdCBuPWUuZ2V0Q29udGV4dCgiMmQiKTtuLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KTtjb25zdCByPW4uZ2V0SW1hZ2VEYXRhKDAsMCx0LndpZHRoLHQuaGVpZ2h0KSxzPXIuZGF0YTtmb3IobGV0IG89MDtvPHMubGVuZ3RoO28rKylzW29dPXNzKHNbb10vMjU1KSoyNTU7cmV0dXJuIG4ucHV0SW1hZ2VEYXRhKHIsMCwwKSxlfWVsc2UgaWYodC5kYXRhKXtjb25zdCBlPXQuZGF0YS5zbGljZSgwKTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyllIGluc3RhbmNlb2YgVWludDhBcnJheXx8ZSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5P2Vbbl09TWF0aC5mbG9vcihzcyhlW25dLzI1NSkqMjU1KTplW25dPXNzKGVbbl0pO3JldHVybntkYXRhOmUsd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHR9fWVsc2UgcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5zUkdCVG9MaW5lYXIoKTogVW5zdXBwb3J0ZWQgaW1hZ2UgdHlwZS4gTm8gY29sb3Igc3BhY2UgY29udmVyc2lvbiBhcHBsaWVkLiIpLHR9fWxldCBDYj0wO2NsYXNzIHlye2NvbnN0cnVjdG9yKHQ9bnVsbCl7dGhpcy5pc1NvdXJjZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpDYisrfSksdGhpcy51dWlkPV9uKCksdGhpcy5kYXRhPXQsdGhpcy5kYXRhUmVhZHk9ITAsdGhpcy52ZXJzaW9uPTB9c2V0IG5lZWRzVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy52ZXJzaW9uKyt9dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciO2lmKCFlJiZ0LmltYWdlc1t0aGlzLnV1aWRdIT09dm9pZCAwKXJldHVybiB0LmltYWdlc1t0aGlzLnV1aWRdO2NvbnN0IG49e3V1aWQ6dGhpcy51dWlkLHVybDoiIn0scj10aGlzLmRhdGE7aWYociE9PW51bGwpe2xldCBzO2lmKEFycmF5LmlzQXJyYXkocikpe3M9W107Zm9yKGxldCBvPTAsYT1yLmxlbmd0aDtvPGE7bysrKXJbb10uaXNEYXRhVGV4dHVyZT9zLnB1c2goRGgocltvXS5pbWFnZSkpOnMucHVzaChEaChyW29dKSl9ZWxzZSBzPURoKHIpO24udXJsPXN9cmV0dXJuIGV8fCh0LmltYWdlc1t0aGlzLnV1aWRdPW4pLG59fWZ1bmN0aW9uIERoKGkpe3JldHVybiB0eXBlb2YgSFRNTEltYWdlRWxlbWVudCE9InVuZGVmaW5lZCImJmkgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZpIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fHR5cGVvZiBJbWFnZUJpdG1hcCE9InVuZGVmaW5lZCImJmkgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcD9mZy5nZXREYXRhVVJMKGkpOmkuZGF0YT97ZGF0YTpBcnJheS5mcm9tKGkuZGF0YSksd2lkdGg6aS53aWR0aCxoZWlnaHQ6aS5oZWlnaHQsdHlwZTppLmRhdGEuY29uc3RydWN0b3IubmFtZX06KGNvbnNvbGUud2FybigiVEhSRUUuVGV4dHVyZTogVW5hYmxlIHRvIHNlcmlhbGl6ZSBUZXh0dXJlLiIpLHt9KX1sZXQgUmI9MDtjbGFzcyBNZSBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKHQ9TWUuREVGQVVMVF9JTUFHRSxlPU1lLkRFRkFVTFRfTUFQUElORyxuPUluLHI9SW4scz1SZSxvPWpuLGE9amUsbD1RbixjPU1lLkRFRkFVTFRfQU5JU09UUk9QWSx1PWdpKXtzdXBlcigpLHRoaXMuaXNUZXh0dXJlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOlJiKyt9KSx0aGlzLnV1aWQ9X24oKSx0aGlzLm5hbWU9IiIsdGhpcy5zb3VyY2U9bmV3IHlyKHQpLHRoaXMubWlwbWFwcz1bXSx0aGlzLm1hcHBpbmc9ZSx0aGlzLmNoYW5uZWw9MCx0aGlzLndyYXBTPW4sdGhpcy53cmFwVD1yLHRoaXMubWFnRmlsdGVyPXMsdGhpcy5taW5GaWx0ZXI9byx0aGlzLmFuaXNvdHJvcHk9Yyx0aGlzLmZvcm1hdD1hLHRoaXMuaW50ZXJuYWxGb3JtYXQ9bnVsbCx0aGlzLnR5cGU9bCx0aGlzLm9mZnNldD1uZXcgcSgwLDApLHRoaXMucmVwZWF0PW5ldyBxKDEsMSksdGhpcy5jZW50ZXI9bmV3IHEoMCwwKSx0aGlzLnJvdGF0aW9uPTAsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSEwLHRoaXMubWF0cml4PW5ldyBYdCx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMCx0aGlzLnByZW11bHRpcGx5QWxwaGE9ITEsdGhpcy5mbGlwWT0hMCx0aGlzLnVucGFja0FsaWdubWVudD00LHRoaXMuY29sb3JTcGFjZT11LHRoaXMudXNlckRhdGE9e30sdGhpcy52ZXJzaW9uPTAsdGhpcy5vblVwZGF0ZT1udWxsLHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSExLHRoaXMucG1yZW1WZXJzaW9uPTB9Z2V0IGltYWdlKCl7cmV0dXJuIHRoaXMuc291cmNlLmRhdGF9c2V0IGltYWdlKHQ9bnVsbCl7dGhpcy5zb3VyY2UuZGF0YT10fXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueSx0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnksdGhpcy5yb3RhdGlvbix0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnkpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuc291cmNlPXQuc291cmNlLHRoaXMubWlwbWFwcz10Lm1pcG1hcHMuc2xpY2UoMCksdGhpcy5tYXBwaW5nPXQubWFwcGluZyx0aGlzLmNoYW5uZWw9dC5jaGFubmVsLHRoaXMud3JhcFM9dC53cmFwUyx0aGlzLndyYXBUPXQud3JhcFQsdGhpcy5tYWdGaWx0ZXI9dC5tYWdGaWx0ZXIsdGhpcy5taW5GaWx0ZXI9dC5taW5GaWx0ZXIsdGhpcy5hbmlzb3Ryb3B5PXQuYW5pc290cm9weSx0aGlzLmZvcm1hdD10LmZvcm1hdCx0aGlzLmludGVybmFsRm9ybWF0PXQuaW50ZXJuYWxGb3JtYXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLm9mZnNldC5jb3B5KHQub2Zmc2V0KSx0aGlzLnJlcGVhdC5jb3B5KHQucmVwZWF0KSx0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLmdlbmVyYXRlTWlwbWFwcz10LmdlbmVyYXRlTWlwbWFwcyx0aGlzLnByZW11bHRpcGx5QWxwaGE9dC5wcmVtdWx0aXBseUFscGhhLHRoaXMuZmxpcFk9dC5mbGlwWSx0aGlzLnVucGFja0FsaWdubWVudD10LnVucGFja0FsaWdubWVudCx0aGlzLmNvbG9yU3BhY2U9dC5jb2xvclNwYWNlLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksdGhpcy5uZWVkc1VwZGF0ZT0hMCx0aGlzfXRvSlNPTih0KXtjb25zdCBlPXQ9PT12b2lkIDB8fHR5cGVvZiB0PT0ic3RyaW5nIjtpZighZSYmdC50ZXh0dXJlc1t0aGlzLnV1aWRdIT09dm9pZCAwKXJldHVybiB0LnRleHR1cmVzW3RoaXMudXVpZF07Y29uc3Qgbj17bWV0YWRhdGE6e3ZlcnNpb246NC42LHR5cGU6IlRleHR1cmUiLGdlbmVyYXRvcjoiVGV4dHVyZS50b0pTT04ifSx1dWlkOnRoaXMudXVpZCxuYW1lOnRoaXMubmFtZSxpbWFnZTp0aGlzLnNvdXJjZS50b0pTT04odCkudXVpZCxtYXBwaW5nOnRoaXMubWFwcGluZyxjaGFubmVsOnRoaXMuY2hhbm5lbCxyZXBlYXQ6W3RoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueV0sb2Zmc2V0Olt0aGlzLm9mZnNldC54LHRoaXMub2Zmc2V0LnldLGNlbnRlcjpbdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55XSxyb3RhdGlvbjp0aGlzLnJvdGF0aW9uLHdyYXA6W3RoaXMud3JhcFMsdGhpcy53cmFwVF0sZm9ybWF0OnRoaXMuZm9ybWF0LGludGVybmFsRm9ybWF0OnRoaXMuaW50ZXJuYWxGb3JtYXQsdHlwZTp0aGlzLnR5cGUsY29sb3JTcGFjZTp0aGlzLmNvbG9yU3BhY2UsbWluRmlsdGVyOnRoaXMubWluRmlsdGVyLG1hZ0ZpbHRlcjp0aGlzLm1hZ0ZpbHRlcixhbmlzb3Ryb3B5OnRoaXMuYW5pc290cm9weSxmbGlwWTp0aGlzLmZsaXBZLGdlbmVyYXRlTWlwbWFwczp0aGlzLmdlbmVyYXRlTWlwbWFwcyxwcmVtdWx0aXBseUFscGhhOnRoaXMucHJlbXVsdGlwbHlBbHBoYSx1bnBhY2tBbGlnbm1lbnQ6dGhpcy51bnBhY2tBbGlnbm1lbnR9O3JldHVybiBPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKG4udXNlckRhdGE9dGhpcy51c2VyRGF0YSksZXx8KHQudGV4dHVyZXNbdGhpcy51dWlkXT1uKSxufWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9dHJhbnNmb3JtVXYodCl7aWYodGhpcy5tYXBwaW5nIT09QmEpcmV0dXJuIHQ7aWYodC5hcHBseU1hdHJpeDModGhpcy5tYXRyaXgpLHQueDwwfHx0Lng+MSlzd2l0Y2godGhpcy53cmFwUyl7Y2FzZSBobzp0Lng9dC54LU1hdGguZmxvb3IodC54KTticmVhaztjYXNlIEluOnQueD10Lng8MD8wOjE7YnJlYWs7Y2FzZSBmbzpNYXRoLmFicyhNYXRoLmZsb29yKHQueCklMik9PT0xP3QueD1NYXRoLmNlaWwodC54KS10Lng6dC54PXQueC1NYXRoLmZsb29yKHQueCk7YnJlYWt9aWYodC55PDB8fHQueT4xKXN3aXRjaCh0aGlzLndyYXBUKXtjYXNlIGhvOnQueT10LnktTWF0aC5mbG9vcih0LnkpO2JyZWFrO2Nhc2UgSW46dC55PXQueTwwPzA6MTticmVhaztjYXNlIGZvOk1hdGguYWJzKE1hdGguZmxvb3IodC55KSUyKT09PTE/dC55PU1hdGguY2VpbCh0LnkpLXQueTp0Lnk9dC55LU1hdGguZmxvb3IodC55KTticmVha31yZXR1cm4gdGhpcy5mbGlwWSYmKHQueT0xLXQueSksdH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiYodGhpcy52ZXJzaW9uKyssdGhpcy5zb3VyY2UubmVlZHNVcGRhdGU9ITApfXNldCBuZWVkc1BNUkVNVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy5wbXJlbVZlcnNpb24rK319TWUuREVGQVVMVF9JTUFHRT1udWxsLE1lLkRFRkFVTFRfTUFQUElORz1CYSxNZS5ERUZBVUxUX0FOSVNPVFJPUFk9MTtjbGFzcyBvZXtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxyPTEpe29lLnByb3RvdHlwZS5pc1ZlY3RvcjQ9ITAsdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW4sdGhpcy53PXJ9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMuen1zZXQgd2lkdGgodCl7dGhpcy56PXR9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnd9c2V0IGhlaWdodCh0KXt0aGlzLnc9dH1zZXQodCxlLG4scil7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1yLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzLnc9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldFcodCl7cmV0dXJuIHRoaXMudz10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7Y2FzZSAyOnRoaXMuej1lO2JyZWFrO2Nhc2UgMzp0aGlzLnc9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7Y2FzZSAzOnJldHVybiB0aGlzLnc7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnosdGhpcy53KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzLnc9dC53IT09dm9pZCAwP3QudzoxLHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzLncrPXQudyx0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpcy53Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzLnc9dC53K2Uudyx0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzLncrPXQudyplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzLnctPXQudyx0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpcy53LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzLnc9dC53LWUudyx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzLncqPXQudyx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzLncqPXQsdGhpc31hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10aGlzLnoscz10aGlzLncsbz10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9b1swXSplK29bNF0qbitvWzhdKnIrb1sxMl0qcyx0aGlzLnk9b1sxXSplK29bNV0qbitvWzldKnIrb1sxM10qcyx0aGlzLno9b1syXSplK29bNl0qbitvWzEwXSpyK29bMTRdKnMsdGhpcy53PW9bM10qZStvWzddKm4rb1sxMV0qcitvWzE1XSpzLHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24odCl7dGhpcy53PTIqTWF0aC5hY29zKHQudyk7Y29uc3QgZT1NYXRoLnNxcnQoMS10LncqdC53KTtyZXR1cm4gZTwxZS00Pyh0aGlzLng9MSx0aGlzLnk9MCx0aGlzLno9MCk6KHRoaXMueD10LngvZSx0aGlzLnk9dC55L2UsdGhpcy56PXQuei9lKSx0aGlzfXNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeCh0KXtsZXQgZSxuLHIscztjb25zdCBsPXQuZWxlbWVudHMsYz1sWzBdLHU9bFs0XSxoPWxbOF0sZj1sWzFdLGQ9bFs1XSxwPWxbOV0seT1sWzJdLG09bFs2XSxnPWxbMTBdO2lmKE1hdGguYWJzKHUtZik8LjAxJiZNYXRoLmFicyhoLXkpPC4wMSYmTWF0aC5hYnMocC1tKTwuMDEpe2lmKE1hdGguYWJzKHUrZik8LjEmJk1hdGguYWJzKGgreSk8LjEmJk1hdGguYWJzKHArbSk8LjEmJk1hdGguYWJzKGMrZCtnLTMpPC4xKXJldHVybiB0aGlzLnNldCgxLDAsMCwwKSx0aGlzO2U9TWF0aC5QSTtjb25zdCB2PShjKzEpLzIsXz0oZCsxKS8yLEU9KGcrMSkvMixiPSh1K2YpLzQsVD0oaCt5KS80LFA9KHArbSkvNDtyZXR1cm4gdj5fJiZ2PkU/djwuMDE/KG49MCxyPS43MDcxMDY3ODEscz0uNzA3MTA2NzgxKToobj1NYXRoLnNxcnQodikscj1iL24scz1UL24pOl8+RT9fPC4wMT8obj0uNzA3MTA2NzgxLHI9MCxzPS43MDcxMDY3ODEpOihyPU1hdGguc3FydChfKSxuPWIvcixzPVAvcik6RTwuMDE/KG49LjcwNzEwNjc4MSxyPS43MDcxMDY3ODEscz0wKToocz1NYXRoLnNxcnQoRSksbj1UL3Mscj1QL3MpLHRoaXMuc2V0KG4scixzLGUpLHRoaXN9bGV0IHg9TWF0aC5zcXJ0KChtLXApKihtLXApKyhoLXkpKihoLXkpKyhmLXUpKihmLXUpKTtyZXR1cm4gTWF0aC5hYnMoeCk8LjAwMSYmKHg9MSksdGhpcy54PShtLXApL3gsdGhpcy55PShoLXkpL3gsdGhpcy56PShmLXUpL3gsdGhpcy53PU1hdGguYWNvcygoYytkK2ctMSkvMiksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzLnc9ZVsxNV0sdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1pbih0aGlzLncsdC53KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpcy53PU1hdGgubWF4KHRoaXMudyx0LncpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQueCxNYXRoLm1pbihlLngsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQueSxNYXRoLm1pbihlLnksdGhpcy55KSksdGhpcy56PU1hdGgubWF4KHQueixNYXRoLm1pbihlLnosdGhpcy56KSksdGhpcy53PU1hdGgubWF4KHQudyxNYXRoLm1pbihlLncsdGhpcy53KSksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy55KSksdGhpcy56PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnopKSx0aGlzLnc9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMudykpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KHQsTWF0aC5taW4oZSxuKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXMudz1NYXRoLmZsb29yKHRoaXMudyksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpcy56PU1hdGguY2VpbCh0aGlzLnopLHRoaXMudz1NYXRoLmNlaWwodGhpcy53KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXMudz1NYXRoLnJvdW5kKHRoaXMudyksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpcy56PU1hdGgudHJ1bmModGhpcy56KSx0aGlzLnc9TWF0aC50cnVuYyh0aGlzLncpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXMuej0tdGhpcy56LHRoaXMudz0tdGhpcy53LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0LnkrdGhpcy56KnQueit0aGlzLncqdC53fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLnd9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpK01hdGguYWJzKHRoaXMueikrTWF0aC5hYnModGhpcy53KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpcy53Kz0odC53LXRoaXMudykqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXMuej10LnorKGUuei10LnopKm4sdGhpcy53PXQudysoZS53LXQudykqbix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnkmJnQuej09PXRoaXMueiYmdC53PT09dGhpcy53fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzLnc9dFtlKzNdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdFtlKzJdPXRoaXMueix0W2UrM109dGhpcy53LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpcy56PXQuZ2V0WihlKSx0aGlzLnc9dC5nZXRXKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXMudz1NYXRoLnJhbmRvbSgpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueSx5aWVsZCB0aGlzLnoseWllbGQgdGhpcy53fX1jbGFzcyBkZyBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKHQ9MSxlPTEsbj17fSl7c3VwZXIoKSx0aGlzLmlzUmVuZGVyVGFyZ2V0PSEwLHRoaXMud2lkdGg9dCx0aGlzLmhlaWdodD1lLHRoaXMuZGVwdGg9MSx0aGlzLnNjaXNzb3I9bmV3IG9lKDAsMCx0LGUpLHRoaXMuc2Npc3NvclRlc3Q9ITEsdGhpcy52aWV3cG9ydD1uZXcgb2UoMCwwLHQsZSk7Y29uc3Qgcj17d2lkdGg6dCxoZWlnaHQ6ZSxkZXB0aDoxfTtuPU9iamVjdC5hc3NpZ24oe2dlbmVyYXRlTWlwbWFwczohMSxpbnRlcm5hbEZvcm1hdDpudWxsLG1pbkZpbHRlcjpSZSxkZXB0aEJ1ZmZlcjohMCxzdGVuY2lsQnVmZmVyOiExLHJlc29sdmVEZXB0aEJ1ZmZlcjohMCxyZXNvbHZlU3RlbmNpbEJ1ZmZlcjohMCxkZXB0aFRleHR1cmU6bnVsbCxzYW1wbGVzOjAsY291bnQ6MX0sbik7Y29uc3Qgcz1uZXcgTWUocixuLm1hcHBpbmcsbi53cmFwUyxuLndyYXBULG4ubWFnRmlsdGVyLG4ubWluRmlsdGVyLG4uZm9ybWF0LG4udHlwZSxuLmFuaXNvdHJvcHksbi5jb2xvclNwYWNlKTtzLmZsaXBZPSExLHMuZ2VuZXJhdGVNaXBtYXBzPW4uZ2VuZXJhdGVNaXBtYXBzLHMuaW50ZXJuYWxGb3JtYXQ9bi5pbnRlcm5hbEZvcm1hdCx0aGlzLnRleHR1cmVzPVtdO2NvbnN0IG89bi5jb3VudDtmb3IobGV0IGE9MDthPG87YSsrKXRoaXMudGV4dHVyZXNbYV09cy5jbG9uZSgpLHRoaXMudGV4dHVyZXNbYV0uaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwO3RoaXMuZGVwdGhCdWZmZXI9bi5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9bi5zdGVuY2lsQnVmZmVyLHRoaXMucmVzb2x2ZURlcHRoQnVmZmVyPW4ucmVzb2x2ZURlcHRoQnVmZmVyLHRoaXMucmVzb2x2ZVN0ZW5jaWxCdWZmZXI9bi5yZXNvbHZlU3RlbmNpbEJ1ZmZlcix0aGlzLmRlcHRoVGV4dHVyZT1uLmRlcHRoVGV4dHVyZSx0aGlzLnNhbXBsZXM9bi5zYW1wbGVzfWdldCB0ZXh0dXJlKCl7cmV0dXJuIHRoaXMudGV4dHVyZXNbMF19c2V0IHRleHR1cmUodCl7dGhpcy50ZXh0dXJlc1swXT10fXNldFNpemUodCxlLG49MSl7aWYodGhpcy53aWR0aCE9PXR8fHRoaXMuaGVpZ2h0IT09ZXx8dGhpcy5kZXB0aCE9PW4pe3RoaXMud2lkdGg9dCx0aGlzLmhlaWdodD1lLHRoaXMuZGVwdGg9bjtmb3IobGV0IHI9MCxzPXRoaXMudGV4dHVyZXMubGVuZ3RoO3I8cztyKyspdGhpcy50ZXh0dXJlc1tyXS5pbWFnZS53aWR0aD10LHRoaXMudGV4dHVyZXNbcl0uaW1hZ2UuaGVpZ2h0PWUsdGhpcy50ZXh0dXJlc1tyXS5pbWFnZS5kZXB0aD1uO3RoaXMuZGlzcG9zZSgpfXRoaXMudmlld3BvcnQuc2V0KDAsMCx0LGUpLHRoaXMuc2Npc3Nvci5zZXQoMCwwLHQsZSl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy53aWR0aD10LndpZHRoLHRoaXMuaGVpZ2h0PXQuaGVpZ2h0LHRoaXMuZGVwdGg9dC5kZXB0aCx0aGlzLnNjaXNzb3IuY29weSh0LnNjaXNzb3IpLHRoaXMuc2Npc3NvclRlc3Q9dC5zY2lzc29yVGVzdCx0aGlzLnZpZXdwb3J0LmNvcHkodC52aWV3cG9ydCksdGhpcy50ZXh0dXJlcy5sZW5ndGg9MDtmb3IobGV0IG49MCxyPXQudGV4dHVyZXMubGVuZ3RoO248cjtuKyspdGhpcy50ZXh0dXJlc1tuXT10LnRleHR1cmVzW25dLmNsb25lKCksdGhpcy50ZXh0dXJlc1tuXS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITA7Y29uc3QgZT1PYmplY3QuYXNzaWduKHt9LHQudGV4dHVyZS5pbWFnZSk7cmV0dXJuIHRoaXMudGV4dHVyZS5zb3VyY2U9bmV3IHlyKGUpLHRoaXMuZGVwdGhCdWZmZXI9dC5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9dC5zdGVuY2lsQnVmZmVyLHRoaXMucmVzb2x2ZURlcHRoQnVmZmVyPXQucmVzb2x2ZURlcHRoQnVmZmVyLHRoaXMucmVzb2x2ZVN0ZW5jaWxCdWZmZXI9dC5yZXNvbHZlU3RlbmNpbEJ1ZmZlcix0LmRlcHRoVGV4dHVyZSE9PW51bGwmJih0aGlzLmRlcHRoVGV4dHVyZT10LmRlcHRoVGV4dHVyZS5jbG9uZSgpKSx0aGlzLnNhbXBsZXM9dC5zYW1wbGVzLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19Y2xhc3MgT24gZXh0ZW5kcyBkZ3tjb25zdHJ1Y3Rvcih0PTEsZT0xLG49e30pe3N1cGVyKHQsZSxuKSx0aGlzLmlzV2ViR0xSZW5kZXJUYXJnZXQ9ITB9fWNsYXNzIE1sIGV4dGVuZHMgTWV7Y29uc3RydWN0b3IodD1udWxsLGU9MSxuPTEscj0xKXtzdXBlcihudWxsKSx0aGlzLmlzRGF0YUFycmF5VGV4dHVyZT0hMCx0aGlzLmltYWdlPXtkYXRhOnQsd2lkdGg6ZSxoZWlnaHQ6bixkZXB0aDpyfSx0aGlzLm1hZ0ZpbHRlcj1GZSx0aGlzLm1pbkZpbHRlcj1GZSx0aGlzLndyYXBSPUluLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuZmxpcFk9ITEsdGhpcy51bnBhY2tBbGlnbm1lbnQ9MSx0aGlzLmxheWVyVXBkYXRlcz1uZXcgU2V0fWFkZExheWVyVXBkYXRlKHQpe3RoaXMubGF5ZXJVcGRhdGVzLmFkZCh0KX1jbGVhckxheWVyVXBkYXRlcygpe3RoaXMubGF5ZXJVcGRhdGVzLmNsZWFyKCl9fWNsYXNzIFBiIGV4dGVuZHMgT257Y29uc3RydWN0b3IodD0xLGU9MSxuPTEscj17fSl7c3VwZXIodCxlLHIpLHRoaXMuaXNXZWJHTEFycmF5UmVuZGVyVGFyZ2V0PSEwLHRoaXMuZGVwdGg9bix0aGlzLnRleHR1cmU9bmV3IE1sKG51bGwsdCxlLG4pLHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITB9fWNsYXNzIFVoIGV4dGVuZHMgTWV7Y29uc3RydWN0b3IodD1udWxsLGU9MSxuPTEscj0xKXtzdXBlcihudWxsKSx0aGlzLmlzRGF0YTNEVGV4dHVyZT0hMCx0aGlzLmltYWdlPXtkYXRhOnQsd2lkdGg6ZSxoZWlnaHQ6bixkZXB0aDpyfSx0aGlzLm1hZ0ZpbHRlcj1GZSx0aGlzLm1pbkZpbHRlcj1GZSx0aGlzLndyYXBSPUluLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuZmxpcFk9ITEsdGhpcy51bnBhY2tBbGlnbm1lbnQ9MX19Y2xhc3MgSWIgZXh0ZW5kcyBPbntjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxyPXt9KXtzdXBlcih0LGUsciksdGhpcy5pc1dlYkdMM0RSZW5kZXJUYXJnZXQ9ITAsdGhpcy5kZXB0aD1uLHRoaXMudGV4dHVyZT1uZXcgVWgobnVsbCx0LGUsbiksdGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMH19Y2xhc3MgdW57Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscj0xKXt0aGlzLmlzUXVhdGVybmlvbj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PXJ9c3RhdGljIHNsZXJwRmxhdCh0LGUsbixyLHMsbyxhKXtsZXQgbD1uW3IrMF0sYz1uW3IrMV0sdT1uW3IrMl0saD1uW3IrM107Y29uc3QgZj1zW28rMF0sZD1zW28rMV0scD1zW28rMl0seT1zW28rM107aWYoYT09PTApe3RbZSswXT1sLHRbZSsxXT1jLHRbZSsyXT11LHRbZSszXT1oO3JldHVybn1pZihhPT09MSl7dFtlKzBdPWYsdFtlKzFdPWQsdFtlKzJdPXAsdFtlKzNdPXk7cmV0dXJufWlmKGghPT15fHxsIT09Znx8YyE9PWR8fHUhPT1wKXtsZXQgbT0xLWE7Y29uc3QgZz1sKmYrYypkK3UqcCtoKnkseD1nPj0wPzE6LTEsdj0xLWcqZztpZih2Pk51bWJlci5FUFNJTE9OKXtjb25zdCBFPU1hdGguc3FydCh2KSxiPU1hdGguYXRhbjIoRSxnKngpO209TWF0aC5zaW4obSpiKS9FLGE9TWF0aC5zaW4oYSpiKS9FfWNvbnN0IF89YSp4O2lmKGw9bCptK2YqXyxjPWMqbStkKl8sdT11Km0rcCpfLGg9aCptK3kqXyxtPT09MS1hKXtjb25zdCBFPTEvTWF0aC5zcXJ0KGwqbCtjKmMrdSp1K2gqaCk7bCo9RSxjKj1FLHUqPUUsaCo9RX19dFtlXT1sLHRbZSsxXT1jLHRbZSsyXT11LHRbZSszXT1ofXN0YXRpYyBtdWx0aXBseVF1YXRlcm5pb25zRmxhdCh0LGUsbixyLHMsbyl7Y29uc3QgYT1uW3JdLGw9bltyKzFdLGM9bltyKzJdLHU9bltyKzNdLGg9c1tvXSxmPXNbbysxXSxkPXNbbysyXSxwPXNbbyszXTtyZXR1cm4gdFtlXT1hKnArdSpoK2wqZC1jKmYsdFtlKzFdPWwqcCt1KmYrYypoLWEqZCx0W2UrMl09YypwK3UqZCthKmYtbCpoLHRbZSszXT11KnAtYSpoLWwqZi1jKmQsdH1nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KHQpe3RoaXMuX3g9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeSh0KXt0aGlzLl95PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHoodCl7dGhpcy5fej10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgdygpe3JldHVybiB0aGlzLl93fXNldCB3KHQpe3RoaXMuX3c9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxuLHIpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PXIsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fdyl9Y29weSh0KXtyZXR1cm4gdGhpcy5feD10LngsdGhpcy5feT10LnksdGhpcy5fej10LnosdGhpcy5fdz10LncsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUV1bGVyKHQsZT0hMCl7Y29uc3Qgbj10Ll94LHI9dC5feSxzPXQuX3osbz10Ll9vcmRlcixhPU1hdGguY29zLGw9TWF0aC5zaW4sYz1hKG4vMiksdT1hKHIvMiksaD1hKHMvMiksZj1sKG4vMiksZD1sKHIvMikscD1sKHMvMik7c3dpdGNoKG8pe2Nhc2UiWFlaIjp0aGlzLl94PWYqdSpoK2MqZCpwLHRoaXMuX3k9YypkKmgtZip1KnAsdGhpcy5fej1jKnUqcCtmKmQqaCx0aGlzLl93PWMqdSpoLWYqZCpwO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PWYqdSpoK2MqZCpwLHRoaXMuX3k9YypkKmgtZip1KnAsdGhpcy5fej1jKnUqcC1mKmQqaCx0aGlzLl93PWMqdSpoK2YqZCpwO2JyZWFrO2Nhc2UiWlhZIjp0aGlzLl94PWYqdSpoLWMqZCpwLHRoaXMuX3k9YypkKmgrZip1KnAsdGhpcy5fej1jKnUqcCtmKmQqaCx0aGlzLl93PWMqdSpoLWYqZCpwO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl94PWYqdSpoLWMqZCpwLHRoaXMuX3k9YypkKmgrZip1KnAsdGhpcy5fej1jKnUqcC1mKmQqaCx0aGlzLl93PWMqdSpoK2YqZCpwO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl94PWYqdSpoK2MqZCpwLHRoaXMuX3k9YypkKmgrZip1KnAsdGhpcy5fej1jKnUqcC1mKmQqaCx0aGlzLl93PWMqdSpoLWYqZCpwO2JyZWFrO2Nhc2UiWFpZIjp0aGlzLl94PWYqdSpoLWMqZCpwLHRoaXMuX3k9YypkKmgtZip1KnAsdGhpcy5fej1jKnUqcCtmKmQqaCx0aGlzLl93PWMqdSpoK2YqZCpwO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIitvKX1yZXR1cm4gZT09PSEwJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tQXhpc0FuZ2xlKHQsZSl7Y29uc3Qgbj1lLzIscj1NYXRoLnNpbihuKTtyZXR1cm4gdGhpcy5feD10Lngqcix0aGlzLl95PXQueSpyLHRoaXMuX3o9dC56KnIsdGhpcy5fdz1NYXRoLmNvcyhuKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCl7Y29uc3QgZT10LmVsZW1lbnRzLG49ZVswXSxyPWVbNF0scz1lWzhdLG89ZVsxXSxhPWVbNV0sbD1lWzldLGM9ZVsyXSx1PWVbNl0saD1lWzEwXSxmPW4rYStoO2lmKGY+MCl7Y29uc3QgZD0uNS9NYXRoLnNxcnQoZisxKTt0aGlzLl93PS4yNS9kLHRoaXMuX3g9KHUtbCkqZCx0aGlzLl95PShzLWMpKmQsdGhpcy5fej0oby1yKSpkfWVsc2UgaWYobj5hJiZuPmgpe2NvbnN0IGQ9MipNYXRoLnNxcnQoMStuLWEtaCk7dGhpcy5fdz0odS1sKS9kLHRoaXMuX3g9LjI1KmQsdGhpcy5feT0ocitvKS9kLHRoaXMuX3o9KHMrYykvZH1lbHNlIGlmKGE+aCl7Y29uc3QgZD0yKk1hdGguc3FydCgxK2Etbi1oKTt0aGlzLl93PShzLWMpL2QsdGhpcy5feD0ocitvKS9kLHRoaXMuX3k9LjI1KmQsdGhpcy5fej0obCt1KS9kfWVsc2V7Y29uc3QgZD0yKk1hdGguc3FydCgxK2gtbi1hKTt0aGlzLl93PShvLXIpL2QsdGhpcy5feD0ocytjKS9kLHRoaXMuX3k9KGwrdSkvZCx0aGlzLl96PS4yNSpkfXJldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tVW5pdFZlY3RvcnModCxlKXtsZXQgbj10LmRvdChlKSsxO3JldHVybiBuPE51bWJlci5FUFNJTE9OPyhuPTAsTWF0aC5hYnModC54KT5NYXRoLmFicyh0LnopPyh0aGlzLl94PS10LnksdGhpcy5feT10LngsdGhpcy5fej0wLHRoaXMuX3c9bik6KHRoaXMuX3g9MCx0aGlzLl95PS10LnosdGhpcy5fej10LnksdGhpcy5fdz1uKSk6KHRoaXMuX3g9dC55KmUuei10LnoqZS55LHRoaXMuX3k9dC56KmUueC10LngqZS56LHRoaXMuX3o9dC54KmUueS10LnkqZS54LHRoaXMuX3c9biksdGhpcy5ub3JtYWxpemUoKX1hbmdsZVRvKHQpe3JldHVybiAyKk1hdGguYWNvcyhNYXRoLmFicyh4ZSh0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBuPXRoaXMuYW5nbGVUbyh0KTtpZihuPT09MClyZXR1cm4gdGhpcztjb25zdCByPU1hdGgubWluKDEsZS9uKTtyZXR1cm4gdGhpcy5zbGVycCh0LHIpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdD09PTA/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBuPXQuX3gscj10Ll95LHM9dC5feixvPXQuX3csYT1lLl94LGw9ZS5feSxjPWUuX3osdT1lLl93O3JldHVybiB0aGlzLl94PW4qdStvKmErcipjLXMqbCx0aGlzLl95PXIqdStvKmwrcyphLW4qYyx0aGlzLl96PXMqdStvKmMrbipsLXIqYSx0aGlzLl93PW8qdS1uKmEtcipsLXMqYyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKGU9PT0wKXJldHVybiB0aGlzO2lmKGU9PT0xKXJldHVybiB0aGlzLmNvcHkodCk7Y29uc3Qgbj10aGlzLl94LHI9dGhpcy5feSxzPXRoaXMuX3osbz10aGlzLl93O2xldCBhPW8qdC5fdytuKnQuX3grcip0Ll95K3MqdC5fejtpZihhPDA/KHRoaXMuX3c9LXQuX3csdGhpcy5feD0tdC5feCx0aGlzLl95PS10Ll95LHRoaXMuX3o9LXQuX3osYT0tYSk6dGhpcy5jb3B5KHQpLGE+PTEpcmV0dXJuIHRoaXMuX3c9byx0aGlzLl94PW4sdGhpcy5feT1yLHRoaXMuX3o9cyx0aGlzO2NvbnN0IGw9MS1hKmE7aWYobDw9TnVtYmVyLkVQU0lMT04pe2NvbnN0IGQ9MS1lO3JldHVybiB0aGlzLl93PWQqbytlKnRoaXMuX3csdGhpcy5feD1kKm4rZSp0aGlzLl94LHRoaXMuX3k9ZCpyK2UqdGhpcy5feSx0aGlzLl96PWQqcytlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzfWNvbnN0IGM9TWF0aC5zcXJ0KGwpLHU9TWF0aC5hdGFuMihjLGEpLGg9TWF0aC5zaW4oKDEtZSkqdSkvYyxmPU1hdGguc2luKGUqdSkvYztyZXR1cm4gdGhpcy5fdz1vKmgrdGhpcy5fdypmLHRoaXMuX3g9bipoK3RoaXMuX3gqZix0aGlzLl95PXIqaCt0aGlzLl95KmYsdGhpcy5fej1zKmgrdGhpcy5feipmLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLG4pe3JldHVybiB0aGlzLmNvcHkodCkuc2xlcnAoZSxuKX1yYW5kb20oKXtjb25zdCB0PTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLGU9MipNYXRoLlBJKk1hdGgucmFuZG9tKCksbj1NYXRoLnJhbmRvbSgpLHI9TWF0aC5zcXJ0KDEtbikscz1NYXRoLnNxcnQobik7cmV0dXJuIHRoaXMuc2V0KHIqTWF0aC5zaW4odCkscipNYXRoLmNvcyh0KSxzKk1hdGguc2luKGUpLHMqTWF0aC5jb3MoZSkpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5feD10W2VdLHRoaXMuX3k9dFtlKzFdLHRoaXMuX3o9dFtlKzJdLHRoaXMuX3c9dFtlKzNdLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLnRvQXJyYXkoKX1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX3d9fWNsYXNzIEx7Y29uc3RydWN0b3IodD0wLGU9MCxuPTApe0wucHJvdG90eXBlLmlzVmVjdG9yMz0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bn1zZXQodCxlLG4pe3JldHVybiBuPT09dm9pZCAwJiYobj10aGlzLnopLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXMuej10LnotZS56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXN9bXVsdGlwbHlWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngqZS54LHRoaXMueT10LnkqZS55LHRoaXMuej10LnoqZS56LHRoaXN9YXBwbHlFdWxlcih0KXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24ocGcuc2V0RnJvbUV1bGVyKHQpKX1hcHBseUF4aXNBbmdsZSh0LGUpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihwZy5zZXRGcm9tQXhpc0FuZ2xlKHQsZSkpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxyPXRoaXMueixzPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1zWzBdKmUrc1szXSpuK3NbNl0qcix0aGlzLnk9c1sxXSplK3NbNF0qbitzWzddKnIsdGhpcy56PXNbMl0qZStzWzVdKm4rc1s4XSpyLHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXgzKHQpLm5vcm1hbGl6ZSgpfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxyPXRoaXMueixzPXQuZWxlbWVudHMsbz0xLyhzWzNdKmUrc1s3XSpuK3NbMTFdKnIrc1sxNV0pO3JldHVybiB0aGlzLng9KHNbMF0qZStzWzRdKm4rc1s4XSpyK3NbMTJdKSpvLHRoaXMueT0oc1sxXSplK3NbNV0qbitzWzldKnIrc1sxM10pKm8sdGhpcy56PShzWzJdKmUrc1s2XSpuK3NbMTBdKnIrc1sxNF0pKm8sdGhpc31hcHBseVF1YXRlcm5pb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10aGlzLnoscz10Lngsbz10LnksYT10LnosbD10LncsYz0yKihvKnItYSpuKSx1PTIqKGEqZS1zKnIpLGg9MioocypuLW8qZSk7cmV0dXJuIHRoaXMueD1lK2wqYytvKmgtYSp1LHRoaXMueT1uK2wqdSthKmMtcypoLHRoaXMuej1yK2wqaCtzKnUtbypjLHRoaXN9cHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZEludmVyc2UpLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXgpfXVucHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpfXRyYW5zZm9ybURpcmVjdGlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxyPXRoaXMueixzPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1zWzBdKmUrc1s0XSpuK3NbOF0qcix0aGlzLnk9c1sxXSplK3NbNV0qbitzWzldKnIsdGhpcy56PXNbMl0qZStzWzZdKm4rc1sxMF0qcix0aGlzLm5vcm1hbGl6ZSgpfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LngsTWF0aC5taW4oZS54LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LnksTWF0aC5taW4oZS55LHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LnosTWF0aC5taW4oZS56LHRoaXMueikpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy56KSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgodCxNYXRoLm1pbihlLG4pKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpcy56PU1hdGguY2VpbCh0aGlzLnopLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpcy56PU1hdGgudHJ1bmModGhpcy56KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0Lnp9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnp9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueil9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXMuej10LnorKGUuei10LnopKm4sdGhpc31jcm9zcyh0KXtyZXR1cm4gdGhpcy5jcm9zc1ZlY3RvcnModGhpcyx0KX1jcm9zc1ZlY3RvcnModCxlKXtjb25zdCBuPXQueCxyPXQueSxzPXQueixvPWUueCxhPWUueSxsPWUuejtyZXR1cm4gdGhpcy54PXIqbC1zKmEsdGhpcy55PXMqby1uKmwsdGhpcy56PW4qYS1yKm8sdGhpc31wcm9qZWN0T25WZWN0b3IodCl7Y29uc3QgZT10Lmxlbmd0aFNxKCk7aWYoZT09PTApcmV0dXJuIHRoaXMuc2V0KDAsMCwwKTtjb25zdCBuPXQuZG90KHRoaXMpL2U7cmV0dXJuIHRoaXMuY29weSh0KS5tdWx0aXBseVNjYWxhcihuKX1wcm9qZWN0T25QbGFuZSh0KXtyZXR1cm4gTmguY29weSh0aGlzKS5wcm9qZWN0T25WZWN0b3IodCksdGhpcy5zdWIoTmgpfXJlZmxlY3QodCl7cmV0dXJuIHRoaXMuc3ViKE5oLmNvcHkodCkubXVsdGlwbHlTY2FsYXIoMip0aGlzLmRvdCh0KSkpfWFuZ2xlVG8odCl7Y29uc3QgZT1NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKnQubGVuZ3RoU3EoKSk7aWYoZT09PTApcmV0dXJuIE1hdGguUEkvMjtjb25zdCBuPXRoaXMuZG90KHQpL2U7cmV0dXJuIE1hdGguYWNvcyh4ZShuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueSxyPXRoaXMuei10Lno7cmV0dXJuIGUqZStuKm4rcipyfW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpK01hdGguYWJzKHRoaXMuei10LnopfXNldEZyb21TcGhlcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnBoaSx0LnRoZXRhKX1zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQsZSxuKXtjb25zdCByPU1hdGguc2luKGUpKnQ7cmV0dXJuIHRoaXMueD1yKk1hdGguc2luKG4pLHRoaXMueT1NYXRoLmNvcyhlKSp0LHRoaXMuej1yKk1hdGguY29zKG4pLHRoaXN9c2V0RnJvbUN5bGluZHJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnRoZXRhLHQueSl9c2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQqTWF0aC5zaW4oZSksdGhpcy55PW4sdGhpcy56PXQqTWF0aC5jb3MoZSksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzfXNldEZyb21NYXRyaXhTY2FsZSh0KXtjb25zdCBlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLG49dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCkscj10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gdGhpcy54PWUsdGhpcy55PW4sdGhpcy56PXIsdGhpc31zZXRGcm9tTWF0cml4Q29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsZSo0KX1zZXRGcm9tTWF0cml4M0NvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLGUqMyl9c2V0RnJvbUV1bGVyKHQpe3JldHVybiB0aGlzLng9dC5feCx0aGlzLnk9dC5feSx0aGlzLno9dC5feix0aGlzfXNldEZyb21Db2xvcih0KXtyZXR1cm4gdGhpcy54PXQucix0aGlzLnk9dC5nLHRoaXMuej10LmIsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnp9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdFtlKzJdPXRoaXMueix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpc31yYW5kb21EaXJlY3Rpb24oKXtjb25zdCB0PU1hdGgucmFuZG9tKCkqTWF0aC5QSSoyLGU9TWF0aC5yYW5kb20oKSoyLTEsbj1NYXRoLnNxcnQoMS1lKmUpO3JldHVybiB0aGlzLng9bipNYXRoLmNvcyh0KSx0aGlzLnk9ZSx0aGlzLno9bipNYXRoLnNpbih0KSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56fX1jb25zdCBOaD1uZXcgTCxwZz1uZXcgdW47Y2xhc3MgT2V7Y29uc3RydWN0b3IodD1uZXcgTCgxLzAsMS8wLDEvMCksZT1uZXcgTCgtMS8wLC0xLzAsLTEvMCkpe3RoaXMuaXNCb3gzPSEwLHRoaXMubWluPXQsdGhpcy5tYXg9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5taW4uY29weSh0KSx0aGlzLm1heC5jb3B5KGUpLHRoaXN9c2V0RnJvbUFycmF5KHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSs9Myl0aGlzLmV4cGFuZEJ5UG9pbnQoQm4uZnJvbUFycmF5KHQsZSkpO3JldHVybiB0aGlzfXNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQuY291bnQ7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoQm4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tUG9pbnRzKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMuZXhwYW5kQnlQb2ludCh0W2VdKTtyZXR1cm4gdGhpc31zZXRGcm9tQ2VudGVyQW5kU2l6ZSh0LGUpe2NvbnN0IG49Qm4uY29weShlKS5tdWx0aXBseVNjYWxhciguNSk7cmV0dXJuIHRoaXMubWluLmNvcHkodCkuc3ViKG4pLHRoaXMubWF4LmNvcHkodCkuYWRkKG4pLHRoaXN9c2V0RnJvbU9iamVjdCh0LGU9ITEpe3JldHVybiB0aGlzLm1ha2VFbXB0eSgpLHRoaXMuZXhwYW5kQnlPYmplY3QodCxlKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PXRoaXMubWluLno9MS8wLHRoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS0xLzAsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fHx0aGlzLm1heC56PHRoaXMubWluLnp9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9Z2V0U2l6ZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9ZXhwYW5kQnlQb2ludCh0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQpLHRoaXMubWF4Lm1heCh0KSx0aGlzfWV4cGFuZEJ5VmVjdG9yKHQpe3JldHVybiB0aGlzLm1pbi5zdWIodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXhwYW5kQnlTY2FsYXIodCl7cmV0dXJuIHRoaXMubWluLmFkZFNjYWxhcigtdCksdGhpcy5tYXguYWRkU2NhbGFyKHQpLHRoaXN9ZXhwYW5kQnlPYmplY3QodCxlPSExKXt0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTtjb25zdCBuPXQuZ2VvbWV0cnk7aWYobiE9PXZvaWQgMCl7Y29uc3Qgcz1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZihlPT09ITAmJnMhPT12b2lkIDAmJnQuaXNJbnN0YW5jZWRNZXNoIT09ITApZm9yKGxldCBvPTAsYT1zLmNvdW50O288YTtvKyspdC5pc01lc2g9PT0hMD90LmdldFZlcnRleFBvc2l0aW9uKG8sQm4pOkJuLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxvKSxCbi5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KEJuKTtlbHNlIHQuYm91bmRpbmdCb3ghPT12b2lkIDA/KHQuYm91bmRpbmdCb3g9PT1udWxsJiZ0LmNvbXB1dGVCb3VuZGluZ0JveCgpLFNsLmNvcHkodC5ib3VuZGluZ0JveCkpOihuLmJvdW5kaW5nQm94PT09bnVsbCYmbi5jb21wdXRlQm91bmRpbmdCb3goKSxTbC5jb3B5KG4uYm91bmRpbmdCb3gpKSxTbC5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy51bmlvbihTbCl9Y29uc3Qgcj10LmNoaWxkcmVuO2ZvcihsZXQgcz0wLG89ci5sZW5ndGg7czxvO3MrKyl0aGlzLmV4cGFuZEJ5T2JqZWN0KHJbc10sZSk7cmV0dXJuIHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC54Pj10aGlzLm1pbi54JiZ0Lng8PXRoaXMubWF4LngmJnQueT49dGhpcy5taW4ueSYmdC55PD10aGlzLm1heC55JiZ0Lno+PXRoaXMubWluLnomJnQuejw9dGhpcy5tYXguen1jb250YWluc0JveCh0KXtyZXR1cm4gdGhpcy5taW4ueDw9dC5taW4ueCYmdC5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9dC5taW4ueSYmdC5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9dC5taW4ueiYmdC5tYXguejw9dGhpcy5tYXguen1nZXRQYXJhbWV0ZXIodCxlKXtyZXR1cm4gZS5zZXQoKHQueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwodC55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLCh0LnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQubWF4Lng+PXRoaXMubWluLngmJnQubWluLng8PXRoaXMubWF4LngmJnQubWF4Lnk+PXRoaXMubWluLnkmJnQubWluLnk8PXRoaXMubWF4LnkmJnQubWF4Lno+PXRoaXMubWluLnomJnQubWluLno8PXRoaXMubWF4Lnp9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQuY2VudGVyLEJuKSxCbi5kaXN0YW5jZVRvU3F1YXJlZCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWludGVyc2VjdHNQbGFuZSh0KXtsZXQgZSxuO3JldHVybiB0Lm5vcm1hbC54PjA/KGU9dC5ub3JtYWwueCp0aGlzLm1pbi54LG49dC5ub3JtYWwueCp0aGlzLm1heC54KTooZT10Lm5vcm1hbC54KnRoaXMubWF4Lngsbj10Lm5vcm1hbC54KnRoaXMubWluLngpLHQubm9ybWFsLnk+MD8oZSs9dC5ub3JtYWwueSp0aGlzLm1pbi55LG4rPXQubm9ybWFsLnkqdGhpcy5tYXgueSk6KGUrPXQubm9ybWFsLnkqdGhpcy5tYXgueSxuKz10Lm5vcm1hbC55KnRoaXMubWluLnkpLHQubm9ybWFsLno+MD8oZSs9dC5ub3JtYWwueip0aGlzLm1pbi56LG4rPXQubm9ybWFsLnoqdGhpcy5tYXgueik6KGUrPXQubm9ybWFsLnoqdGhpcy5tYXgueixuKz10Lm5vcm1hbC56KnRoaXMubWluLnopLGU8PS10LmNvbnN0YW50JiZuPj0tdC5jb25zdGFudH1pbnRlcnNlY3RzVHJpYW5nbGUodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7dGhpcy5nZXRDZW50ZXIoTG8pLGJsLnN1YlZlY3RvcnModGhpcy5tYXgsTG8pLGFzLnN1YlZlY3RvcnModC5hLExvKSxscy5zdWJWZWN0b3JzKHQuYixMbyksY3Muc3ViVmVjdG9ycyh0LmMsTG8pLEdpLnN1YlZlY3RvcnMobHMsYXMpLFZpLnN1YlZlY3RvcnMoY3MsbHMpLHZyLnN1YlZlY3RvcnMoYXMsY3MpO2xldCBlPVswLC1HaS56LEdpLnksMCwtVmkueixWaS55LDAsLXZyLnosdnIueSxHaS56LDAsLUdpLngsVmkueiwwLC1WaS54LHZyLnosMCwtdnIueCwtR2kueSxHaS54LDAsLVZpLnksVmkueCwwLC12ci55LHZyLngsMF07cmV0dXJuIUZoKGUsYXMsbHMsY3MsYmwpfHwoZT1bMSwwLDAsMCwxLDAsMCwwLDFdLCFGaChlLGFzLGxzLGNzLGJsKSk/ITE6KHdsLmNyb3NzVmVjdG9ycyhHaSxWaSksZT1bd2wueCx3bC55LHdsLnpdLEZoKGUsYXMsbHMsY3MsYmwpKX1jbGFtcFBvaW50KHQsZSl7cmV0dXJuIGUuY29weSh0KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodCxCbikuZGlzdGFuY2VUbyh0KX1nZXRCb3VuZGluZ1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5tYWtlRW1wdHkoKToodGhpcy5nZXRDZW50ZXIodC5jZW50ZXIpLHQucmFkaXVzPXRoaXMuZ2V0U2l6ZShCbikubGVuZ3RoKCkqLjUpLHR9aW50ZXJzZWN0KHQpe3JldHVybiB0aGlzLm1pbi5tYXgodC5taW4pLHRoaXMubWF4Lm1pbih0Lm1heCksdGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCksdGhpc311bmlvbih0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQubWluKSx0aGlzLm1heC5tYXgodC5tYXgpLHRoaXN9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90aGlzOih2aVswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx2aVsxXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx2aVsyXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx2aVszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx2aVs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx2aVs1XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx2aVs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx2aVs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldEZyb21Qb2ludHModmkpLHRoaXMpfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5taW4uYWRkKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5taW4uZXF1YWxzKHRoaXMubWluKSYmdC5tYXguZXF1YWxzKHRoaXMubWF4KX19Y29uc3Qgdmk9W25ldyBMLG5ldyBMLG5ldyBMLG5ldyBMLG5ldyBMLG5ldyBMLG5ldyBMLG5ldyBMXSxCbj1uZXcgTCxTbD1uZXcgT2UsYXM9bmV3IEwsbHM9bmV3IEwsY3M9bmV3IEwsR2k9bmV3IEwsVmk9bmV3IEwsdnI9bmV3IEwsTG89bmV3IEwsYmw9bmV3IEwsd2w9bmV3IEwsX3I9bmV3IEw7ZnVuY3Rpb24gRmgoaSx0LGUsbixyKXtmb3IobGV0IHM9MCxvPWkubGVuZ3RoLTM7czw9bztzKz0zKXtfci5mcm9tQXJyYXkoaSxzKTtjb25zdCBhPXIueCpNYXRoLmFicyhfci54KStyLnkqTWF0aC5hYnMoX3IueSkrci56Kk1hdGguYWJzKF9yLnopLGw9dC5kb3QoX3IpLGM9ZS5kb3QoX3IpLHU9bi5kb3QoX3IpO2lmKE1hdGgubWF4KC1NYXRoLm1heChsLGMsdSksTWF0aC5taW4obCxjLHUpKT5hKXJldHVybiExfXJldHVybiEwfWNvbnN0IExiPW5ldyBPZSxEbz1uZXcgTCxPaD1uZXcgTDtjbGFzcyBXZXtjb25zdHJ1Y3Rvcih0PW5ldyBMLGU9LTEpe3RoaXMuaXNTcGhlcmU9ITAsdGhpcy5jZW50ZXI9dCx0aGlzLnJhZGl1cz1lfXNldCh0LGUpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQpLHRoaXMucmFkaXVzPWUsdGhpc31zZXRGcm9tUG9pbnRzKHQsZSl7Y29uc3Qgbj10aGlzLmNlbnRlcjtlIT09dm9pZCAwP24uY29weShlKTpMYi5zZXRGcm9tUG9pbnRzKHQpLmdldENlbnRlcihuKTtsZXQgcj0wO2ZvcihsZXQgcz0wLG89dC5sZW5ndGg7czxvO3MrKylyPU1hdGgubWF4KHIsbi5kaXN0YW5jZVRvU3F1YXJlZCh0W3NdKSk7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydChyKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucmFkaXVzPXQucmFkaXVzLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLnJhZGl1czwwfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLmNlbnRlci5zZXQoMCwwLDApLHRoaXMucmFkaXVzPS0xLHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PXRoaXMucmFkaXVzKnRoaXMucmFkaXVzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKS10aGlzLnJhZGl1c31pbnRlcnNlY3RzU3BoZXJlKHQpe2NvbnN0IGU9dGhpcy5yYWRpdXMrdC5yYWRpdXM7cmV0dXJuIHQuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9ZSplfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX1pbnRlcnNlY3RzUGxhbmUodCl7cmV0dXJuIE1hdGguYWJzKHQuZGlzdGFuY2VUb1BvaW50KHRoaXMuY2VudGVyKSk8PXRoaXMucmFkaXVzfWNsYW1wUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHQpO3JldHVybiBlLmNvcHkodCksbj50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyYmKGUuc3ViKHRoaXMuY2VudGVyKS5ub3JtYWxpemUoKSxlLm11bHRpcGx5U2NhbGFyKHRoaXMucmFkaXVzKS5hZGQodGhpcy5jZW50ZXIpKSxlfWdldEJvdW5kaW5nQm94KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT8odC5tYWtlRW1wdHkoKSx0KToodC5zZXQodGhpcy5jZW50ZXIsdGhpcy5jZW50ZXIpLHQuZXhwYW5kQnlTY2FsYXIodGhpcy5yYWRpdXMpLHQpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KHQpLHRoaXMucmFkaXVzPXRoaXMucmFkaXVzKnQuZ2V0TWF4U2NhbGVPbkF4aXMoKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYWRkKHQpLHRoaXN9ZXhwYW5kQnlQb2ludCh0KXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz0wLHRoaXM7RG8uc3ViVmVjdG9ycyh0LHRoaXMuY2VudGVyKTtjb25zdCBlPURvLmxlbmd0aFNxKCk7aWYoZT50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyl7Y29uc3Qgbj1NYXRoLnNxcnQoZSkscj0obi10aGlzLnJhZGl1cykqLjU7dGhpcy5jZW50ZXIuYWRkU2NhbGVkVmVjdG9yKERvLHIvbiksdGhpcy5yYWRpdXMrPXJ9cmV0dXJuIHRoaXN9dW5pb24odCl7cmV0dXJuIHQuaXNFbXB0eSgpP3RoaXM6dGhpcy5pc0VtcHR5KCk/KHRoaXMuY29weSh0KSx0aGlzKToodGhpcy5jZW50ZXIuZXF1YWxzKHQuY2VudGVyKT09PSEwP3RoaXMucmFkaXVzPU1hdGgubWF4KHRoaXMucmFkaXVzLHQucmFkaXVzKTooT2guc3ViVmVjdG9ycyh0LmNlbnRlcix0aGlzLmNlbnRlcikuc2V0TGVuZ3RoKHQucmFkaXVzKSx0aGlzLmV4cGFuZEJ5UG9pbnQoRG8uY29weSh0LmNlbnRlcikuYWRkKE9oKSksdGhpcy5leHBhbmRCeVBvaW50KERvLmNvcHkodC5jZW50ZXIpLnN1YihPaCkpKSx0aGlzKX1lcXVhbHModCl7cmV0dXJuIHQuY2VudGVyLmVxdWFscyh0aGlzLmNlbnRlcikmJnQucmFkaXVzPT09dGhpcy5yYWRpdXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jb25zdCBfaT1uZXcgTCxCaD1uZXcgTCxBbD1uZXcgTCxIaT1uZXcgTCx6aD1uZXcgTCxFbD1uZXcgTCxraD1uZXcgTDtjbGFzcyB1c3tjb25zdHJ1Y3Rvcih0PW5ldyBMLGU9bmV3IEwoMCwwLC0xKSl7dGhpcy5vcmlnaW49dCx0aGlzLmRpcmVjdGlvbj1lfXNldCh0LGUpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQpLHRoaXMuZGlyZWN0aW9uLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQub3JpZ2luKSx0aGlzLmRpcmVjdGlvbi5jb3B5KHQuZGlyZWN0aW9uKSx0aGlzfWF0KHQsZSl7cmV0dXJuIGUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLHQpfWxvb2tBdCh0KXtyZXR1cm4gdGhpcy5kaXJlY3Rpb24uY29weSh0KS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpLHRoaXN9cmVjYXN0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHRoaXMuYXQodCxfaSkpLHRoaXN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2Uuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKTtjb25zdCBuPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gbjwwP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sbil9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0KSl9ZGlzdGFuY2VTcVRvUG9pbnQodCl7Y29uc3QgZT1faS5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIGU8MD90aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCh0KTooX2kuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLGUpLF9pLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVNxVG9TZWdtZW50KHQsZSxuLHIpe0JoLmNvcHkodCkuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KSxBbC5jb3B5KGUpLnN1Yih0KS5ub3JtYWxpemUoKSxIaS5jb3B5KHRoaXMub3JpZ2luKS5zdWIoQmgpO2NvbnN0IHM9dC5kaXN0YW5jZVRvKGUpKi41LG89LXRoaXMuZGlyZWN0aW9uLmRvdChBbCksYT1IaS5kb3QodGhpcy5kaXJlY3Rpb24pLGw9LUhpLmRvdChBbCksYz1IaS5sZW5ndGhTcSgpLHU9TWF0aC5hYnMoMS1vKm8pO2xldCBoLGYsZCxwO2lmKHU+MClpZihoPW8qbC1hLGY9byphLWwscD1zKnUsaD49MClpZihmPj0tcClpZihmPD1wKXtjb25zdCB5PTEvdTtoKj15LGYqPXksZD1oKihoK28qZisyKmEpK2YqKG8qaCtmKzIqbCkrY31lbHNlIGY9cyxoPU1hdGgubWF4KDAsLShvKmYrYSkpLGQ9LWgqaCtmKihmKzIqbCkrYztlbHNlIGY9LXMsaD1NYXRoLm1heCgwLC0obypmK2EpKSxkPS1oKmgrZiooZisyKmwpK2M7ZWxzZSBmPD0tcD8oaD1NYXRoLm1heCgwLC0oLW8qcythKSksZj1oPjA/LXM6TWF0aC5taW4oTWF0aC5tYXgoLXMsLWwpLHMpLGQ9LWgqaCtmKihmKzIqbCkrYyk6Zjw9cD8oaD0wLGY9TWF0aC5taW4oTWF0aC5tYXgoLXMsLWwpLHMpLGQ9ZiooZisyKmwpK2MpOihoPU1hdGgubWF4KDAsLShvKnMrYSkpLGY9aD4wP3M6TWF0aC5taW4oTWF0aC5tYXgoLXMsLWwpLHMpLGQ9LWgqaCtmKihmKzIqbCkrYyk7ZWxzZSBmPW8+MD8tczpzLGg9TWF0aC5tYXgoMCwtKG8qZithKSksZD0taCpoK2YqKGYrMipsKStjO3JldHVybiBuJiZuLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbixoKSxyJiZyLmNvcHkoQmgpLmFkZFNjYWxlZFZlY3RvcihBbCxmKSxkfWludGVyc2VjdFNwaGVyZSh0LGUpe19pLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5vcmlnaW4pO2NvbnN0IG49X2kuZG90KHRoaXMuZGlyZWN0aW9uKSxyPV9pLmRvdChfaSktbipuLHM9dC5yYWRpdXMqdC5yYWRpdXM7aWYocj5zKXJldHVybiBudWxsO2NvbnN0IG89TWF0aC5zcXJ0KHMtciksYT1uLW8sbD1uK287cmV0dXJuIGw8MD9udWxsOmE8MD90aGlzLmF0KGwsZSk6dGhpcy5hdChhLGUpfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31kaXN0YW5jZVRvUGxhbmUodCl7Y29uc3QgZT10Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKGU9PT0wKXJldHVybiB0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik9PT0wPzA6bnVsbDtjb25zdCBuPS0odGhpcy5vcmlnaW4uZG90KHQubm9ybWFsKSt0LmNvbnN0YW50KS9lO3JldHVybiBuPj0wP246bnVsbH1pbnRlcnNlY3RQbGFuZSh0LGUpe2NvbnN0IG49dGhpcy5kaXN0YW5jZVRvUGxhbmUodCk7cmV0dXJuIG49PT1udWxsP251bGw6dGhpcy5hdChuLGUpfWludGVyc2VjdHNQbGFuZSh0KXtjb25zdCBlPXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTtyZXR1cm4gZT09PTB8fHQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqZTwwfWludGVyc2VjdEJveCh0LGUpe2xldCBuLHIscyxvLGEsbDtjb25zdCBjPTEvdGhpcy5kaXJlY3Rpb24ueCx1PTEvdGhpcy5kaXJlY3Rpb24ueSxoPTEvdGhpcy5kaXJlY3Rpb24ueixmPXRoaXMub3JpZ2luO3JldHVybiBjPj0wPyhuPSh0Lm1pbi54LWYueCkqYyxyPSh0Lm1heC54LWYueCkqYyk6KG49KHQubWF4LngtZi54KSpjLHI9KHQubWluLngtZi54KSpjKSx1Pj0wPyhzPSh0Lm1pbi55LWYueSkqdSxvPSh0Lm1heC55LWYueSkqdSk6KHM9KHQubWF4LnktZi55KSp1LG89KHQubWluLnktZi55KSp1KSxuPm98fHM+cnx8KChzPm58fGlzTmFOKG4pKSYmKG49cyksKG88cnx8aXNOYU4ocikpJiYocj1vKSxoPj0wPyhhPSh0Lm1pbi56LWYueikqaCxsPSh0Lm1heC56LWYueikqaCk6KGE9KHQubWF4LnotZi56KSpoLGw9KHQubWluLnotZi56KSpoKSxuPmx8fGE+cil8fCgoYT5ufHxuIT09bikmJihuPWEpLChsPHJ8fHIhPT1yKSYmKHI9bCkscjwwKT9udWxsOnRoaXMuYXQobj49MD9uOnIsZSl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3godCxfaSkhPT1udWxsfWludGVyc2VjdFRyaWFuZ2xlKHQsZSxuLHIscyl7emguc3ViVmVjdG9ycyhlLHQpLEVsLnN1YlZlY3RvcnMobix0KSxraC5jcm9zc1ZlY3RvcnMoemgsRWwpO2xldCBvPXRoaXMuZGlyZWN0aW9uLmRvdChraCksYTtpZihvPjApe2lmKHIpcmV0dXJuIG51bGw7YT0xfWVsc2UgaWYobzwwKWE9LTEsbz0tbztlbHNlIHJldHVybiBudWxsO0hpLnN1YlZlY3RvcnModGhpcy5vcmlnaW4sdCk7Y29uc3QgbD1hKnRoaXMuZGlyZWN0aW9uLmRvdChFbC5jcm9zc1ZlY3RvcnMoSGksRWwpKTtpZihsPDApcmV0dXJuIG51bGw7Y29uc3QgYz1hKnRoaXMuZGlyZWN0aW9uLmRvdCh6aC5jcm9zcyhIaSkpO2lmKGM8MHx8bCtjPm8pcmV0dXJuIG51bGw7Y29uc3QgdT0tYSpIaS5kb3Qoa2gpO3JldHVybiB1PDA/bnVsbDp0aGlzLmF0KHUvbyxzKX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMub3JpZ2luLmFwcGx5TWF0cml4NCh0KSx0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24odCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQub3JpZ2luLmVxdWFscyh0aGlzLm9yaWdpbikmJnQuZGlyZWN0aW9uLmVxdWFscyh0aGlzLmRpcmVjdGlvbil9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jbGFzcyBMdHtjb25zdHJ1Y3Rvcih0LGUsbixyLHMsbyxhLGwsYyx1LGgsZixkLHAseSxtKXtMdC5wcm90b3R5cGUuaXNNYXRyaXg0PSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdLHQhPT12b2lkIDAmJnRoaXMuc2V0KHQsZSxuLHIscyxvLGEsbCxjLHUsaCxmLGQscCx5LG0pfXNldCh0LGUsbixyLHMsbyxhLGwsYyx1LGgsZixkLHAseSxtKXtjb25zdCBnPXRoaXMuZWxlbWVudHM7cmV0dXJuIGdbMF09dCxnWzRdPWUsZ1s4XT1uLGdbMTJdPXIsZ1sxXT1zLGdbNV09byxnWzldPWEsZ1sxM109bCxnWzJdPWMsZ1s2XT11LGdbMTBdPWgsZ1sxNF09ZixnWzNdPWQsZ1s3XT1wLGdbMTFdPXksZ1sxNV09bSx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IEx0KCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sZVs5XT1uWzldLGVbMTBdPW5bMTBdLGVbMTFdPW5bMTFdLGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLGVbMTVdPW5bMTVdLHRoaXN9Y29weVBvc2l0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLHRoaXN9c2V0RnJvbU1hdHJpeDModCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbM10sZVs2XSwwLGVbMV0sZVs0XSxlWzddLDAsZVsyXSxlWzVdLGVbOF0sMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpLHRoaXN9bWFrZUJhc2lzKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodC54LGUueCxuLngsMCx0LnksZS55LG4ueSwwLHQueixlLnosbi56LDAsMCwwLDAsMSksdGhpc31leHRyYWN0Um90YXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cyxyPTEvaHMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLHM9MS9ocy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCksbz0xL2hzLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gZVswXT1uWzBdKnIsZVsxXT1uWzFdKnIsZVsyXT1uWzJdKnIsZVszXT0wLGVbNF09bls0XSpzLGVbNV09bls1XSpzLGVbNl09bls2XSpzLGVbN109MCxlWzhdPW5bOF0qbyxlWzldPW5bOV0qbyxlWzEwXT1uWzEwXSpvLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21FdWxlcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10Lngscj10Lnkscz10Lnosbz1NYXRoLmNvcyhuKSxhPU1hdGguc2luKG4pLGw9TWF0aC5jb3MociksYz1NYXRoLnNpbihyKSx1PU1hdGguY29zKHMpLGg9TWF0aC5zaW4ocyk7aWYodC5vcmRlcj09PSJYWVoiKXtjb25zdCBmPW8qdSxkPW8qaCxwPWEqdSx5PWEqaDtlWzBdPWwqdSxlWzRdPS1sKmgsZVs4XT1jLGVbMV09ZCtwKmMsZVs1XT1mLXkqYyxlWzldPS1hKmwsZVsyXT15LWYqYyxlWzZdPXArZCpjLGVbMTBdPW8qbH1lbHNlIGlmKHQub3JkZXI9PT0iWVhaIil7Y29uc3QgZj1sKnUsZD1sKmgscD1jKnUseT1jKmg7ZVswXT1mK3kqYSxlWzRdPXAqYS1kLGVbOF09bypjLGVbMV09bypoLGVbNV09byp1LGVbOV09LWEsZVsyXT1kKmEtcCxlWzZdPXkrZiphLGVbMTBdPW8qbH1lbHNlIGlmKHQub3JkZXI9PT0iWlhZIil7Y29uc3QgZj1sKnUsZD1sKmgscD1jKnUseT1jKmg7ZVswXT1mLXkqYSxlWzRdPS1vKmgsZVs4XT1wK2QqYSxlWzFdPWQrcCphLGVbNV09byp1LGVbOV09eS1mKmEsZVsyXT0tbypjLGVbNl09YSxlWzEwXT1vKmx9ZWxzZSBpZih0Lm9yZGVyPT09IlpZWCIpe2NvbnN0IGY9byp1LGQ9bypoLHA9YSp1LHk9YSpoO2VbMF09bCp1LGVbNF09cCpjLWQsZVs4XT1mKmMreSxlWzFdPWwqaCxlWzVdPXkqYytmLGVbOV09ZCpjLXAsZVsyXT0tYyxlWzZdPWEqbCxlWzEwXT1vKmx9ZWxzZSBpZih0Lm9yZGVyPT09IllaWCIpe2NvbnN0IGY9bypsLGQ9bypjLHA9YSpsLHk9YSpjO2VbMF09bCp1LGVbNF09eS1mKmgsZVs4XT1wKmgrZCxlWzFdPWgsZVs1XT1vKnUsZVs5XT0tYSp1LGVbMl09LWMqdSxlWzZdPWQqaCtwLGVbMTBdPWYteSpofWVsc2UgaWYodC5vcmRlcj09PSJYWlkiKXtjb25zdCBmPW8qbCxkPW8qYyxwPWEqbCx5PWEqYztlWzBdPWwqdSxlWzRdPS1oLGVbOF09Yyp1LGVbMV09ZipoK3ksZVs1XT1vKnUsZVs5XT1kKmgtcCxlWzJdPXAqaC1kLGVbNl09YSp1LGVbMTBdPXkqaCtmfXJldHVybiBlWzNdPTAsZVs3XT0wLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLmNvbXBvc2UoRGIsdCxVYil9bG9va0F0KHQsZSxuKXtjb25zdCByPXRoaXMuZWxlbWVudHM7cmV0dXJuIHhuLnN1YlZlY3RvcnModCxlKSx4bi5sZW5ndGhTcSgpPT09MCYmKHhuLno9MSkseG4ubm9ybWFsaXplKCksV2kuY3Jvc3NWZWN0b3JzKG4seG4pLFdpLmxlbmd0aFNxKCk9PT0wJiYoTWF0aC5hYnMobi56KT09PTE/eG4ueCs9MWUtNDp4bi56Kz0xZS00LHhuLm5vcm1hbGl6ZSgpLFdpLmNyb3NzVmVjdG9ycyhuLHhuKSksV2kubm9ybWFsaXplKCksVGwuY3Jvc3NWZWN0b3JzKHhuLFdpKSxyWzBdPVdpLngscls0XT1UbC54LHJbOF09eG4ueCxyWzFdPVdpLnkscls1XT1UbC55LHJbOV09eG4ueSxyWzJdPVdpLnoscls2XT1UbC56LHJbMTBdPXhuLnosdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMscj1lLmVsZW1lbnRzLHM9dGhpcy5lbGVtZW50cyxvPW5bMF0sYT1uWzRdLGw9bls4XSxjPW5bMTJdLHU9blsxXSxoPW5bNV0sZj1uWzldLGQ9blsxM10scD1uWzJdLHk9bls2XSxtPW5bMTBdLGc9blsxNF0seD1uWzNdLHY9bls3XSxfPW5bMTFdLEU9blsxNV0sYj1yWzBdLFQ9cls0XSxQPXJbOF0sdz1yWzEyXSxNPXJbMV0sQT1yWzVdLEY9cls5XSxEPXJbMTNdLE49clsyXSxVPXJbNl0sQj1yWzEwXSxIPXJbMTRdLEc9clszXSx0dD1yWzddLGx0PXJbMTFdLGh0PXJbMTVdO3JldHVybiBzWzBdPW8qYithKk0rbCpOK2MqRyxzWzRdPW8qVCthKkErbCpVK2MqdHQsc1s4XT1vKlArYSpGK2wqQitjKmx0LHNbMTJdPW8qdythKkQrbCpIK2MqaHQsc1sxXT11KmIraCpNK2YqTitkKkcsc1s1XT11KlQraCpBK2YqVStkKnR0LHNbOV09dSpQK2gqRitmKkIrZCpsdCxzWzEzXT11KncraCpEK2YqSCtkKmh0LHNbMl09cCpiK3kqTSttKk4rZypHLHNbNl09cCpUK3kqQSttKlUrZyp0dCxzWzEwXT1wKlAreSpGK20qQitnKmx0LHNbMTRdPXAqdyt5KkQrbSpIK2cqaHQsc1szXT14KmIrdipNK18qTitFKkcsc1s3XT14KlQrdipBK18qVStFKnR0LHNbMTFdPXgqUCt2KkYrXypCK0UqbHQsc1sxNV09eCp3K3YqRCtfKkgrRSpodCx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzRdKj10LGVbOF0qPXQsZVsxMl0qPXQsZVsxXSo9dCxlWzVdKj10LGVbOV0qPXQsZVsxM10qPXQsZVsyXSo9dCxlWzZdKj10LGVbMTBdKj10LGVbMTRdKj10LGVbM10qPXQsZVs3XSo9dCxlWzExXSo9dCxlWzE1XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbNF0scj10WzhdLHM9dFsxMl0sbz10WzFdLGE9dFs1XSxsPXRbOV0sYz10WzEzXSx1PXRbMl0saD10WzZdLGY9dFsxMF0sZD10WzE0XSxwPXRbM10seT10WzddLG09dFsxMV0sZz10WzE1XTtyZXR1cm4gcCooK3MqbCpoLXIqYypoLXMqYSpmK24qYypmK3IqYSpkLW4qbCpkKSt5KigrZSpsKmQtZSpjKmYrcypvKmYtcipvKmQrcipjKnUtcypsKnUpK20qKCtlKmMqaC1lKmEqZC1zKm8qaCtuKm8qZCtzKmEqdS1uKmMqdSkrZyooLXIqYSp1LWUqbCpoK2UqYSpmK3IqbypoLW4qbypmK24qbCp1KX10cmFuc3Bvc2UoKXtjb25zdCB0PXRoaXMuZWxlbWVudHM7bGV0IGU7cmV0dXJuIGU9dFsxXSx0WzFdPXRbNF0sdFs0XT1lLGU9dFsyXSx0WzJdPXRbOF0sdFs4XT1lLGU9dFs2XSx0WzZdPXRbOV0sdFs5XT1lLGU9dFszXSx0WzNdPXRbMTJdLHRbMTJdPWUsZT10WzddLHRbN109dFsxM10sdFsxM109ZSxlPXRbMTFdLHRbMTFdPXRbMTRdLHRbMTRdPWUsdGhpc31zZXRQb3NpdGlvbih0LGUsbil7Y29uc3Qgcj10aGlzLmVsZW1lbnRzO3JldHVybiB0LmlzVmVjdG9yMz8oclsxMl09dC54LHJbMTNdPXQueSxyWzE0XT10LnopOihyWzEyXT10LHJbMTNdPWUsclsxNF09biksdGhpc31pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxyPXRbMl0scz10WzNdLG89dFs0XSxhPXRbNV0sbD10WzZdLGM9dFs3XSx1PXRbOF0saD10WzldLGY9dFsxMF0sZD10WzExXSxwPXRbMTJdLHk9dFsxM10sbT10WzE0XSxnPXRbMTVdLHg9aCptKmMteSpmKmMreSpsKmQtYSptKmQtaCpsKmcrYSpmKmcsdj1wKmYqYy11Km0qYy1wKmwqZCtvKm0qZCt1KmwqZy1vKmYqZyxfPXUqeSpjLXAqaCpjK3AqYSpkLW8qeSpkLXUqYSpnK28qaCpnLEU9cCpoKmwtdSp5KmwtcCphKmYrbyp5KmYrdSphKm0tbypoKm0sYj1lKngrbip2K3IqXytzKkU7aWYoYj09PTApcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IFQ9MS9iO3JldHVybiB0WzBdPXgqVCx0WzFdPSh5KmYqcy1oKm0qcy15KnIqZCtuKm0qZCtoKnIqZy1uKmYqZykqVCx0WzJdPShhKm0qcy15Kmwqcyt5KnIqYy1uKm0qYy1hKnIqZytuKmwqZykqVCx0WzNdPShoKmwqcy1hKmYqcy1oKnIqYytuKmYqYythKnIqZC1uKmwqZCkqVCx0WzRdPXYqVCx0WzVdPSh1Km0qcy1wKmYqcytwKnIqZC1lKm0qZC11KnIqZytlKmYqZykqVCx0WzZdPShwKmwqcy1vKm0qcy1wKnIqYytlKm0qYytvKnIqZy1lKmwqZykqVCx0WzddPShvKmYqcy11Kmwqcyt1KnIqYy1lKmYqYy1vKnIqZCtlKmwqZCkqVCx0WzhdPV8qVCx0WzldPShwKmgqcy11Knkqcy1wKm4qZCtlKnkqZCt1Km4qZy1lKmgqZykqVCx0WzEwXT0obyp5KnMtcCphKnMrcCpuKmMtZSp5KmMtbypuKmcrZSphKmcpKlQsdFsxMV09KHUqYSpzLW8qaCpzLXUqbipjK2UqaCpjK28qbipkLWUqYSpkKSpULHRbMTJdPUUqVCx0WzEzXT0odSp5KnItcCpoKnIrcCpuKmYtZSp5KmYtdSpuKm0rZSpoKm0pKlQsdFsxNF09KHAqYSpyLW8qeSpyLXAqbipsK2UqeSpsK28qbiptLWUqYSptKSpULHRbMTVdPShvKmgqci11KmEqcit1Km4qbC1lKmgqbC1vKm4qZitlKmEqZikqVCx0aGlzfXNjYWxlKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQueCxyPXQueSxzPXQuejtyZXR1cm4gZVswXSo9bixlWzRdKj1yLGVbOF0qPXMsZVsxXSo9bixlWzVdKj1yLGVbOV0qPXMsZVsyXSo9bixlWzZdKj1yLGVbMTBdKj1zLGVbM10qPW4sZVs3XSo9cixlWzExXSo9cyx0aGlzfWdldE1heFNjYWxlT25BeGlzKCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSp0WzBdK3RbMV0qdFsxXSt0WzJdKnRbMl0sbj10WzRdKnRbNF0rdFs1XSp0WzVdK3RbNl0qdFs2XSxyPXRbOF0qdFs4XSt0WzldKnRbOV0rdFsxMF0qdFsxMF07cmV0dXJuIE1hdGguc3FydChNYXRoLm1heChlLG4scikpfW1ha2VUcmFuc2xhdGlvbih0LGUsbil7cmV0dXJuIHQuaXNWZWN0b3IzP3RoaXMuc2V0KDEsMCwwLHQueCwwLDEsMCx0LnksMCwwLDEsdC56LDAsMCwwLDEpOnRoaXMuc2V0KDEsMCwwLHQsMCwxLDAsZSwwLDAsMSxuLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWCh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCxlLC1uLDAsMCxuLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvblkodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLDAsbiwwLDAsMSwwLDAsLW4sMCxlLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25aKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwtbiwwLDAsbixlLDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uQXhpcyh0LGUpe2NvbnN0IG49TWF0aC5jb3MoZSkscj1NYXRoLnNpbihlKSxzPTEtbixvPXQueCxhPXQueSxsPXQueixjPXMqbyx1PXMqYTtyZXR1cm4gdGhpcy5zZXQoYypvK24sYyphLXIqbCxjKmwrciphLDAsYyphK3IqbCx1KmErbix1KmwtcipvLDAsYypsLXIqYSx1KmwrcipvLHMqbCpsK24sMCwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZSh0LGUsbil7cmV0dXJuIHRoaXMuc2V0KHQsMCwwLDAsMCxlLDAsMCwwLDAsbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNoZWFyKHQsZSxuLHIscyxvKXtyZXR1cm4gdGhpcy5zZXQoMSxuLHMsMCx0LDEsbywwLGUsciwxLDAsMCwwLDAsMSksdGhpc31jb21wb3NlKHQsZSxuKXtjb25zdCByPXRoaXMuZWxlbWVudHMscz1lLl94LG89ZS5feSxhPWUuX3osbD1lLl93LGM9cytzLHU9bytvLGg9YSthLGY9cypjLGQ9cyp1LHA9cypoLHk9byp1LG09bypoLGc9YSpoLHg9bCpjLHY9bCp1LF89bCpoLEU9bi54LGI9bi55LFQ9bi56O3JldHVybiByWzBdPSgxLSh5K2cpKSpFLHJbMV09KGQrXykqRSxyWzJdPShwLXYpKkUsclszXT0wLHJbNF09KGQtXykqYixyWzVdPSgxLShmK2cpKSpiLHJbNl09KG0reCkqYixyWzddPTAscls4XT0ocCt2KSpULHJbOV09KG0teCkqVCxyWzEwXT0oMS0oZit5KSkqVCxyWzExXT0wLHJbMTJdPXQueCxyWzEzXT10LnksclsxNF09dC56LHJbMTVdPTEsdGhpc31kZWNvbXBvc2UodCxlLG4pe2NvbnN0IHI9dGhpcy5lbGVtZW50cztsZXQgcz1ocy5zZXQoclswXSxyWzFdLHJbMl0pLmxlbmd0aCgpO2NvbnN0IG89aHMuc2V0KHJbNF0scls1XSxyWzZdKS5sZW5ndGgoKSxhPWhzLnNldChyWzhdLHJbOV0sclsxMF0pLmxlbmd0aCgpO3RoaXMuZGV0ZXJtaW5hbnQoKTwwJiYocz0tcyksdC54PXJbMTJdLHQueT1yWzEzXSx0Lno9clsxNF0sem4uY29weSh0aGlzKTtjb25zdCBjPTEvcyx1PTEvbyxoPTEvYTtyZXR1cm4gem4uZWxlbWVudHNbMF0qPWMsem4uZWxlbWVudHNbMV0qPWMsem4uZWxlbWVudHNbMl0qPWMsem4uZWxlbWVudHNbNF0qPXUsem4uZWxlbWVudHNbNV0qPXUsem4uZWxlbWVudHNbNl0qPXUsem4uZWxlbWVudHNbOF0qPWgsem4uZWxlbWVudHNbOV0qPWgsem4uZWxlbWVudHNbMTBdKj1oLGUuc2V0RnJvbVJvdGF0aW9uTWF0cml4KHpuKSxuLng9cyxuLnk9byxuLno9YSx0aGlzfW1ha2VQZXJzcGVjdGl2ZSh0LGUsbixyLHMsbyxhPXRpKXtjb25zdCBsPXRoaXMuZWxlbWVudHMsYz0yKnMvKGUtdCksdT0yKnMvKG4tciksaD0oZSt0KS8oZS10KSxmPShuK3IpLyhuLXIpO2xldCBkLHA7aWYoYT09PXRpKWQ9LShvK3MpLyhvLXMpLHA9LTIqbypzLyhvLXMpO2Vsc2UgaWYoYT09PUNvKWQ9LW8vKG8tcykscD0tbypzLyhvLXMpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VQZXJzcGVjdGl2ZSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2EpO3JldHVybiBsWzBdPWMsbFs0XT0wLGxbOF09aCxsWzEyXT0wLGxbMV09MCxsWzVdPXUsbFs5XT1mLGxbMTNdPTAsbFsyXT0wLGxbNl09MCxsWzEwXT1kLGxbMTRdPXAsbFszXT0wLGxbN109MCxsWzExXT0tMSxsWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyh0LGUsbixyLHMsbyxhPXRpKXtjb25zdCBsPXRoaXMuZWxlbWVudHMsYz0xLyhlLXQpLHU9MS8obi1yKSxoPTEvKG8tcyksZj0oZSt0KSpjLGQ9KG4rcikqdTtsZXQgcCx5O2lmKGE9PT10aSlwPShvK3MpKmgseT0tMipoO2Vsc2UgaWYoYT09PUNvKXA9cypoLHk9LTEqaDtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuTWF0cml4NC5tYWtlT3J0aG9ncmFwaGljKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrYSk7cmV0dXJuIGxbMF09MipjLGxbNF09MCxsWzhdPTAsbFsxMl09LWYsbFsxXT0wLGxbNV09Mip1LGxbOV09MCxsWzEzXT0tZCxsWzJdPTAsbFs2XT0wLGxbMTBdPXksbFsxNF09LXAsbFszXT0wLGxbN109MCxsWzExXT0wLGxbMTVdPTEsdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztmb3IobGV0IHI9MDtyPDE2O3IrKylpZihlW3JdIT09bltyXSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgbj0wO248MTY7bisrKXRoaXMuZWxlbWVudHNbbl09dFtuK2VdO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gdFtlXT1uWzBdLHRbZSsxXT1uWzFdLHRbZSsyXT1uWzJdLHRbZSszXT1uWzNdLHRbZSs0XT1uWzRdLHRbZSs1XT1uWzVdLHRbZSs2XT1uWzZdLHRbZSs3XT1uWzddLHRbZSs4XT1uWzhdLHRbZSs5XT1uWzldLHRbZSsxMF09blsxMF0sdFtlKzExXT1uWzExXSx0W2UrMTJdPW5bMTJdLHRbZSsxM109blsxM10sdFtlKzE0XT1uWzE0XSx0W2UrMTVdPW5bMTVdLHR9fWNvbnN0IGhzPW5ldyBMLHpuPW5ldyBMdCxEYj1uZXcgTCgwLDAsMCksVWI9bmV3IEwoMSwxLDEpLFdpPW5ldyBMLFRsPW5ldyBMLHhuPW5ldyBMLG1nPW5ldyBMdCxnZz1uZXcgdW47Y2xhc3MgTW57Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscj1Nbi5ERUZBVUxUX09SREVSKXt0aGlzLmlzRXVsZXI9ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fb3JkZXI9cn1nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KHQpe3RoaXMuX3g9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeSh0KXt0aGlzLl95PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHoodCl7dGhpcy5fej10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgb3JkZXIoKXtyZXR1cm4gdGhpcy5fb3JkZXJ9c2V0IG9yZGVyKHQpe3RoaXMuX29yZGVyPXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsbixyPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fb3JkZXI9cix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9Y29weSh0KXtyZXR1cm4gdGhpcy5feD10Ll94LHRoaXMuX3k9dC5feSx0aGlzLl96PXQuX3osdGhpcy5fb3JkZXI9dC5fb3JkZXIsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQsZT10aGlzLl9vcmRlcixuPSEwKXtjb25zdCByPXQuZWxlbWVudHMscz1yWzBdLG89cls0XSxhPXJbOF0sbD1yWzFdLGM9cls1XSx1PXJbOV0saD1yWzJdLGY9cls2XSxkPXJbMTBdO3N3aXRjaChlKXtjYXNlIlhZWiI6dGhpcy5feT1NYXRoLmFzaW4oeGUoYSwtMSwxKSksTWF0aC5hYnMoYSk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtdSxkKSx0aGlzLl96PU1hdGguYXRhbjIoLW8scykpOih0aGlzLl94PU1hdGguYXRhbjIoZixjKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PU1hdGguYXNpbigteGUodSwtMSwxKSksTWF0aC5hYnModSk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMihhLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihsLGMpKToodGhpcy5feT1NYXRoLmF0YW4yKC1oLHMpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9TWF0aC5hc2luKHhlKGYsLTEsMSkpLE1hdGguYWJzKGYpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIoLWgsZCksdGhpcy5fej1NYXRoLmF0YW4yKC1vLGMpKToodGhpcy5feT0wLHRoaXMuX3o9TWF0aC5hdGFuMihsLHMpKTticmVhaztjYXNlIlpZWCI6dGhpcy5feT1NYXRoLmFzaW4oLXhlKGgsLTEsMSkpLE1hdGguYWJzKGgpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZixkKSx0aGlzLl96PU1hdGguYXRhbjIobCxzKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLW8sYykpO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl96PU1hdGguYXNpbih4ZShsLC0xLDEpKSxNYXRoLmFicyhsKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC11LGMpLHRoaXMuX3k9TWF0aC5hdGFuMigtaCxzKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIoYSxkKSk7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3o9TWF0aC5hc2luKC14ZShvLC0xLDEpKSxNYXRoLmFicyhvKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKGYsYyksdGhpcy5feT1NYXRoLmF0YW4yKGEscykpOih0aGlzLl94PU1hdGguYXRhbjIoLXUsZCksdGhpcy5feT0wKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuRXVsZXI6IC5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK2UpfXJldHVybiB0aGlzLl9vcmRlcj1lLG49PT0hMCYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVF1YXRlcm5pb24odCxlLG4pe3JldHVybiBtZy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeChtZyxlLG4pfXNldEZyb21WZWN0b3IzKHQsZT10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuc2V0KHQueCx0LnksdC56LGUpfXJlb3JkZXIodCl7cmV0dXJuIGdnLnNldEZyb21FdWxlcih0aGlzKSx0aGlzLnNldEZyb21RdWF0ZXJuaW9uKGdnLHQpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fb3JkZXI9PT10aGlzLl9vcmRlcn1mcm9tQXJyYXkodCl7cmV0dXJuIHRoaXMuX3g9dFswXSx0aGlzLl95PXRbMV0sdGhpcy5fej10WzJdLHRbM10hPT12b2lkIDAmJih0aGlzLl9vcmRlcj10WzNdKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl9vcmRlcix0fV9vbkNoYW5nZSh0KXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz10LHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5feCx5aWVsZCB0aGlzLl95LHlpZWxkIHRoaXMuX3oseWllbGQgdGhpcy5fb3JkZXJ9fU1uLkRFRkFVTFRfT1JERVI9IlhZWiI7Y2xhc3MgQ2x7Y29uc3RydWN0b3IoKXt0aGlzLm1hc2s9MX1zZXQodCl7dGhpcy5tYXNrPSgxPDx0fDApPj4+MH1lbmFibGUodCl7dGhpcy5tYXNrfD0xPDx0fDB9ZW5hYmxlQWxsKCl7dGhpcy5tYXNrPS0xfXRvZ2dsZSh0KXt0aGlzLm1hc2tePTE8PHR8MH1kaXNhYmxlKHQpe3RoaXMubWFzayY9figxPDx0fDApfWRpc2FibGVBbGwoKXt0aGlzLm1hc2s9MH10ZXN0KHQpe3JldHVybih0aGlzLm1hc2smdC5tYXNrKSE9PTB9aXNFbmFibGVkKHQpe3JldHVybih0aGlzLm1hc2smKDE8PHR8MCkpIT09MH19bGV0IE5iPTA7Y29uc3QgeWc9bmV3IEwsZnM9bmV3IHVuLHhpPW5ldyBMdCxSbD1uZXcgTCxVbz1uZXcgTCxGYj1uZXcgTCxPYj1uZXcgdW4sdmc9bmV3IEwoMSwwLDApLF9nPW5ldyBMKDAsMSwwKSx4Zz1uZXcgTCgwLDAsMSksTWc9e3R5cGU6ImFkZGVkIn0sQmI9e3R5cGU6InJlbW92ZWQifSxkcz17dHlwZToiY2hpbGRhZGRlZCIsY2hpbGQ6bnVsbH0sR2g9e3R5cGU6ImNoaWxkcmVtb3ZlZCIsY2hpbGQ6bnVsbH07Y2xhc3MgbmUgZXh0ZW5kcyBlaXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc09iamVjdDNEPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOk5iKyt9KSx0aGlzLnV1aWQ9X24oKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJPYmplY3QzRCIsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMudXA9bmUuREVGQVVMVF9VUC5jbG9uZSgpO2NvbnN0IHQ9bmV3IEwsZT1uZXcgTW4sbj1uZXcgdW4scj1uZXcgTCgxLDEsMSk7ZnVuY3Rpb24gcygpe24uc2V0RnJvbUV1bGVyKGUsITEpfWZ1bmN0aW9uIG8oKXtlLnNldEZyb21RdWF0ZXJuaW9uKG4sdm9pZCAwLCExKX1lLl9vbkNoYW5nZShzKSxuLl9vbkNoYW5nZShvKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtwb3NpdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dH0scm90YXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmV9LHF1YXRlcm5pb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm59LHNjYWxlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpyfSxtb2RlbFZpZXdNYXRyaXg6e3ZhbHVlOm5ldyBMdH0sbm9ybWFsTWF0cml4Ont2YWx1ZTpuZXcgWHR9fSksdGhpcy5tYXRyaXg9bmV3IEx0LHRoaXMubWF0cml4V29ybGQ9bmV3IEx0LHRoaXMubWF0cml4QXV0b1VwZGF0ZT1uZS5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT1uZS5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdGhpcy5sYXllcnM9bmV3IENsLHRoaXMudmlzaWJsZT0hMCx0aGlzLmNhc3RTaGFkb3c9ITEsdGhpcy5yZWNlaXZlU2hhZG93PSExLHRoaXMuZnJ1c3R1bUN1bGxlZD0hMCx0aGlzLnJlbmRlck9yZGVyPTAsdGhpcy5hbmltYXRpb25zPVtdLHRoaXMudXNlckRhdGE9e319b25CZWZvcmVTaGFkb3coKXt9b25BZnRlclNoYWRvdygpe31vbkJlZm9yZVJlbmRlcigpe31vbkFmdGVyUmVuZGVyKCl7fWFwcGx5TWF0cml4NCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXgucHJlbXVsdGlwbHkodCksdGhpcy5tYXRyaXguZGVjb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpfWFwcGx5UXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KHQpLHRoaXN9c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlKHQsZSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUodCxlKX1zZXRSb3RhdGlvbkZyb21FdWxlcih0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKHQsITApfXNldFJvdGF0aW9uRnJvbU1hdHJpeCh0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpfXNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7dGhpcy5xdWF0ZXJuaW9uLmNvcHkodCl9cm90YXRlT25BeGlzKHQsZSl7cmV0dXJuIGZzLnNldEZyb21BeGlzQW5nbGUodCxlKSx0aGlzLnF1YXRlcm5pb24ubXVsdGlwbHkoZnMpLHRoaXN9cm90YXRlT25Xb3JsZEF4aXModCxlKXtyZXR1cm4gZnMuc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShmcyksdGhpc31yb3RhdGVYKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyh2Zyx0KX1yb3RhdGVZKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhfZyx0KX1yb3RhdGVaKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyh4Zyx0KX10cmFuc2xhdGVPbkF4aXModCxlKXtyZXR1cm4geWcuY29weSh0KS5hcHBseVF1YXRlcm5pb24odGhpcy5xdWF0ZXJuaW9uKSx0aGlzLnBvc2l0aW9uLmFkZCh5Zy5tdWx0aXBseVNjYWxhcihlKSksdGhpc310cmFuc2xhdGVYKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyh2Zyx0KX10cmFuc2xhdGVZKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhfZyx0KX10cmFuc2xhdGVaKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyh4Zyx0KX1sb2NhbFRvV29ybGQodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpfXdvcmxkVG9Mb2NhbCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5hcHBseU1hdHJpeDQoeGkuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSl9bG9va0F0KHQsZSxuKXt0LmlzVmVjdG9yMz9SbC5jb3B5KHQpOlJsLnNldCh0LGUsbik7Y29uc3Qgcj10aGlzLnBhcmVudDt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxVby5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCksdGhpcy5pc0NhbWVyYXx8dGhpcy5pc0xpZ2h0P3hpLmxvb2tBdChVbyxSbCx0aGlzLnVwKTp4aS5sb29rQXQoUmwsVW8sdGhpcy51cCksdGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh4aSksciYmKHhpLmV4dHJhY3RSb3RhdGlvbihyLm1hdHJpeFdvcmxkKSxmcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoeGkpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShmcy5pbnZlcnQoKSkpfWFkZCh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdGhpcy5hZGQoYXJndW1lbnRzW2VdKTtyZXR1cm4gdGhpc31yZXR1cm4gdD09PXRoaXM/KGNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLiIsdCksdGhpcyk6KHQmJnQuaXNPYmplY3QzRD8odC5yZW1vdmVGcm9tUGFyZW50KCksdC5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2godCksdC5kaXNwYXRjaEV2ZW50KE1nKSxkcy5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudChkcyksZHMuY2hpbGQ9bnVsbCk6Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3Qgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk9iamVjdDNELiIsdCksdGhpcyl9cmVtb3ZlKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCBuPTA7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0aGlzLnJlbW92ZShhcmd1bWVudHNbbl0pO3JldHVybiB0aGlzfWNvbnN0IGU9dGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpO3JldHVybiBlIT09LTEmJih0LnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGUsMSksdC5kaXNwYXRjaEV2ZW50KEJiKSxHaC5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudChHaCksR2guY2hpbGQ9bnVsbCksdGhpc31yZW1vdmVGcm9tUGFyZW50KCl7Y29uc3QgdD10aGlzLnBhcmVudDtyZXR1cm4gdCE9PW51bGwmJnQucmVtb3ZlKHRoaXMpLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy5yZW1vdmUoLi4udGhpcy5jaGlsZHJlbil9YXR0YWNoKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx4aS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpLHQucGFyZW50IT09bnVsbCYmKHQucGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx4aS5tdWx0aXBseSh0LnBhcmVudC5tYXRyaXhXb3JsZCkpLHQuYXBwbHlNYXRyaXg0KHhpKSx0LnJlbW92ZUZyb21QYXJlbnQoKSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKSx0LmRpc3BhdGNoRXZlbnQoTWcpLGRzLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KGRzKSxkcy5jaGlsZD1udWxsLHRoaXN9Z2V0T2JqZWN0QnlJZCh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsdCl9Z2V0T2JqZWN0QnlOYW1lKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoIm5hbWUiLHQpfWdldE9iamVjdEJ5UHJvcGVydHkodCxlKXtpZih0aGlzW3RdPT09ZSlyZXR1cm4gdGhpcztmb3IobGV0IG49MCxyPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO248cjtuKyspe2NvbnN0IG89dGhpcy5jaGlsZHJlbltuXS5nZXRPYmplY3RCeVByb3BlcnR5KHQsZSk7aWYobyE9PXZvaWQgMClyZXR1cm4gb319Z2V0T2JqZWN0c0J5UHJvcGVydHkodCxlLG49W10pe3RoaXNbdF09PT1lJiZuLnB1c2godGhpcyk7Y29uc3Qgcj10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcz0wLG89ci5sZW5ndGg7czxvO3MrKylyW3NdLmdldE9iamVjdHNCeVByb3BlcnR5KHQsZSxuKTtyZXR1cm4gbn1nZXRXb3JsZFBvc2l0aW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKX1nZXRXb3JsZFF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKFVvLHQsRmIpLHR9Z2V0V29ybGRTY2FsZSh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoVW8sT2IsdCksdH1nZXRXb3JsZERpcmVjdGlvbih0KXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtjb25zdCBlPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIHQuc2V0KGVbOF0sZVs5XSxlWzEwXSkubm9ybWFsaXplKCl9cmF5Y2FzdCgpe310cmF2ZXJzZSh0KXt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspZVtuXS50cmF2ZXJzZSh0KX10cmF2ZXJzZVZpc2libGUodCl7aWYodGhpcy52aXNpYmxlPT09ITEpcmV0dXJuO3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyllW25dLnRyYXZlcnNlVmlzaWJsZSh0KX10cmF2ZXJzZUFuY2VzdG9ycyh0KXtjb25zdCBlPXRoaXMucGFyZW50O2UhPT1udWxsJiYodChlKSxlLnRyYXZlcnNlQW5jZXN0b3JzKHQpKX11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5jb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH11cGRhdGVNYXRyaXhXb3JsZCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksKHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZXx8dCkmJih0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT09PSEwJiYodGhpcy5wYXJlbnQ9PT1udWxsP3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHQ9ITApO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspZVtuXS51cGRhdGVNYXRyaXhXb3JsZCh0KX11cGRhdGVXb3JsZE1hdHJpeCh0LGUpe2NvbnN0IG49dGhpcy5wYXJlbnQ7aWYodD09PSEwJiZuIT09bnVsbCYmbi51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPT09ITAmJih0aGlzLnBhcmVudD09PW51bGw/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpKSxlPT09ITApe2NvbnN0IHI9dGhpcy5jaGlsZHJlbjtmb3IobGV0IHM9MCxvPXIubGVuZ3RoO3M8bztzKyspcltzXS51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCl9fXRvSlNPTih0KXtjb25zdCBlPXQ9PT12b2lkIDB8fHR5cGVvZiB0PT0ic3RyaW5nIixuPXt9O2UmJih0PXtnZW9tZXRyaWVzOnt9LG1hdGVyaWFsczp7fSx0ZXh0dXJlczp7fSxpbWFnZXM6e30sc2hhcGVzOnt9LHNrZWxldG9uczp7fSxhbmltYXRpb25zOnt9LG5vZGVzOnt9fSxuLm1ldGFkYXRhPXt2ZXJzaW9uOjQuNix0eXBlOiJPYmplY3QiLGdlbmVyYXRvcjoiT2JqZWN0M0QudG9KU09OIn0pO2NvbnN0IHI9e307ci51dWlkPXRoaXMudXVpZCxyLnR5cGU9dGhpcy50eXBlLHRoaXMubmFtZSE9PSIiJiYoci5uYW1lPXRoaXMubmFtZSksdGhpcy5jYXN0U2hhZG93PT09ITAmJihyLmNhc3RTaGFkb3c9ITApLHRoaXMucmVjZWl2ZVNoYWRvdz09PSEwJiYoci5yZWNlaXZlU2hhZG93PSEwKSx0aGlzLnZpc2libGU9PT0hMSYmKHIudmlzaWJsZT0hMSksdGhpcy5mcnVzdHVtQ3VsbGVkPT09ITEmJihyLmZydXN0dW1DdWxsZWQ9ITEpLHRoaXMucmVuZGVyT3JkZXIhPT0wJiYoci5yZW5kZXJPcmRlcj10aGlzLnJlbmRlck9yZGVyKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKHIudXNlckRhdGE9dGhpcy51c2VyRGF0YSksci5sYXllcnM9dGhpcy5sYXllcnMubWFzayxyLm1hdHJpeD10aGlzLm1hdHJpeC50b0FycmF5KCksci51cD10aGlzLnVwLnRvQXJyYXkoKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9PT0hMSYmKHIubWF0cml4QXV0b1VwZGF0ZT0hMSksdGhpcy5pc0luc3RhbmNlZE1lc2gmJihyLnR5cGU9Ikluc3RhbmNlZE1lc2giLHIuY291bnQ9dGhpcy5jb3VudCxyLmluc3RhbmNlTWF0cml4PXRoaXMuaW5zdGFuY2VNYXRyaXgudG9KU09OKCksdGhpcy5pbnN0YW5jZUNvbG9yIT09bnVsbCYmKHIuaW5zdGFuY2VDb2xvcj10aGlzLmluc3RhbmNlQ29sb3IudG9KU09OKCkpKSx0aGlzLmlzQmF0Y2hlZE1lc2gmJihyLnR5cGU9IkJhdGNoZWRNZXNoIixyLnBlck9iamVjdEZydXN0dW1DdWxsZWQ9dGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkLHIuc29ydE9iamVjdHM9dGhpcy5zb3J0T2JqZWN0cyxyLmRyYXdSYW5nZXM9dGhpcy5fZHJhd1JhbmdlcyxyLnJlc2VydmVkUmFuZ2VzPXRoaXMuX3Jlc2VydmVkUmFuZ2VzLHIudmlzaWJpbGl0eT10aGlzLl92aXNpYmlsaXR5LHIuYWN0aXZlPXRoaXMuX2FjdGl2ZSxyLmJvdW5kcz10aGlzLl9ib3VuZHMubWFwKGE9Pih7Ym94SW5pdGlhbGl6ZWQ6YS5ib3hJbml0aWFsaXplZCxib3hNaW46YS5ib3gubWluLnRvQXJyYXkoKSxib3hNYXg6YS5ib3gubWF4LnRvQXJyYXkoKSxzcGhlcmVJbml0aWFsaXplZDphLnNwaGVyZUluaXRpYWxpemVkLHNwaGVyZVJhZGl1czphLnNwaGVyZS5yYWRpdXMsc3BoZXJlQ2VudGVyOmEuc3BoZXJlLmNlbnRlci50b0FycmF5KCl9KSksci5tYXhJbnN0YW5jZUNvdW50PXRoaXMuX21heEluc3RhbmNlQ291bnQsci5tYXhWZXJ0ZXhDb3VudD10aGlzLl9tYXhWZXJ0ZXhDb3VudCxyLm1heEluZGV4Q291bnQ9dGhpcy5fbWF4SW5kZXhDb3VudCxyLmdlb21ldHJ5SW5pdGlhbGl6ZWQ9dGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCxyLmdlb21ldHJ5Q291bnQ9dGhpcy5fZ2VvbWV0cnlDb3VudCxyLm1hdHJpY2VzVGV4dHVyZT10aGlzLl9tYXRyaWNlc1RleHR1cmUudG9KU09OKHQpLHRoaXMuX2NvbG9yc1RleHR1cmUhPT1udWxsJiYoci5jb2xvcnNUZXh0dXJlPXRoaXMuX2NvbG9yc1RleHR1cmUudG9KU09OKHQpKSx0aGlzLmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmKHIuYm91bmRpbmdTcGhlcmU9e2NlbnRlcjpyLmJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCkscmFkaXVzOnIuYm91bmRpbmdTcGhlcmUucmFkaXVzfSksdGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJihyLmJvdW5kaW5nQm94PXttaW46ci5ib3VuZGluZ0JveC5taW4udG9BcnJheSgpLG1heDpyLmJvdW5kaW5nQm94Lm1heC50b0FycmF5KCl9KSk7ZnVuY3Rpb24gcyhhLGwpe3JldHVybiBhW2wudXVpZF09PT12b2lkIDAmJihhW2wudXVpZF09bC50b0pTT04odCkpLGwudXVpZH1pZih0aGlzLmlzU2NlbmUpdGhpcy5iYWNrZ3JvdW5kJiYodGhpcy5iYWNrZ3JvdW5kLmlzQ29sb3I/ci5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04oKTp0aGlzLmJhY2tncm91bmQuaXNUZXh0dXJlJiYoci5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04odCkudXVpZCkpLHRoaXMuZW52aXJvbm1lbnQmJnRoaXMuZW52aXJvbm1lbnQuaXNUZXh0dXJlJiZ0aGlzLmVudmlyb25tZW50LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSE9PSEwJiYoci5lbnZpcm9ubWVudD10aGlzLmVudmlyb25tZW50LnRvSlNPTih0KS51dWlkKTtlbHNlIGlmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7ci5nZW9tZXRyeT1zKHQuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTtjb25zdCBhPXRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztpZihhIT09dm9pZCAwJiZhLnNoYXBlcyE9PXZvaWQgMCl7Y29uc3QgbD1hLnNoYXBlcztpZihBcnJheS5pc0FycmF5KGwpKWZvcihsZXQgYz0wLHU9bC5sZW5ndGg7Yzx1O2MrKyl7Y29uc3QgaD1sW2NdO3ModC5zaGFwZXMsaCl9ZWxzZSBzKHQuc2hhcGVzLGwpfX1pZih0aGlzLmlzU2tpbm5lZE1lc2gmJihyLmJpbmRNb2RlPXRoaXMuYmluZE1vZGUsci5iaW5kTWF0cml4PXRoaXMuYmluZE1hdHJpeC50b0FycmF5KCksdGhpcy5za2VsZXRvbiE9PXZvaWQgMCYmKHModC5za2VsZXRvbnMsdGhpcy5za2VsZXRvbiksci5za2VsZXRvbj10aGlzLnNrZWxldG9uLnV1aWQpKSx0aGlzLm1hdGVyaWFsIT09dm9pZCAwKWlmKEFycmF5LmlzQXJyYXkodGhpcy5tYXRlcmlhbCkpe2NvbnN0IGE9W107Zm9yKGxldCBsPTAsYz10aGlzLm1hdGVyaWFsLmxlbmd0aDtsPGM7bCsrKWEucHVzaChzKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbbF0pKTtyLm1hdGVyaWFsPWF9ZWxzZSByLm1hdGVyaWFsPXModC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYodGhpcy5jaGlsZHJlbi5sZW5ndGg+MCl7ci5jaGlsZHJlbj1bXTtmb3IobGV0IGE9MDthPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2ErKylyLmNoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlblthXS50b0pTT04odCkub2JqZWN0KX1pZih0aGlzLmFuaW1hdGlvbnMubGVuZ3RoPjApe3IuYW5pbWF0aW9ucz1bXTtmb3IobGV0IGE9MDthPHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg7YSsrKXtjb25zdCBsPXRoaXMuYW5pbWF0aW9uc1thXTtyLmFuaW1hdGlvbnMucHVzaChzKHQuYW5pbWF0aW9ucyxsKSl9fWlmKGUpe2NvbnN0IGE9byh0Lmdlb21ldHJpZXMpLGw9byh0Lm1hdGVyaWFscyksYz1vKHQudGV4dHVyZXMpLHU9byh0LmltYWdlcyksaD1vKHQuc2hhcGVzKSxmPW8odC5za2VsZXRvbnMpLGQ9byh0LmFuaW1hdGlvbnMpLHA9byh0Lm5vZGVzKTthLmxlbmd0aD4wJiYobi5nZW9tZXRyaWVzPWEpLGwubGVuZ3RoPjAmJihuLm1hdGVyaWFscz1sKSxjLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1jKSx1Lmxlbmd0aD4wJiYobi5pbWFnZXM9dSksaC5sZW5ndGg+MCYmKG4uc2hhcGVzPWgpLGYubGVuZ3RoPjAmJihuLnNrZWxldG9ucz1mKSxkLmxlbmd0aD4wJiYobi5hbmltYXRpb25zPWQpLHAubGVuZ3RoPjAmJihuLm5vZGVzPXApfXJldHVybiBuLm9iamVjdD1yLG47ZnVuY3Rpb24gbyhhKXtjb25zdCBsPVtdO2Zvcihjb25zdCBjIGluIGEpe2NvbnN0IHU9YVtjXTtkZWxldGUgdS5tZXRhZGF0YSxsLnB1c2godSl9cmV0dXJuIGx9fWNsb25lKHQpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyx0KX1jb3B5KHQsZT0hMCl7aWYodGhpcy5uYW1lPXQubmFtZSx0aGlzLnVwLmNvcHkodC51cCksdGhpcy5wb3NpdGlvbi5jb3B5KHQucG9zaXRpb24pLHRoaXMucm90YXRpb24ub3JkZXI9dC5yb3RhdGlvbi5vcmRlcix0aGlzLnF1YXRlcm5pb24uY29weSh0LnF1YXRlcm5pb24pLHRoaXMuc2NhbGUuY29weSh0LnNjYWxlKSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT10Lm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlLHRoaXMubGF5ZXJzLm1hc2s9dC5sYXllcnMubWFzayx0aGlzLnZpc2libGU9dC52aXNpYmxlLHRoaXMuY2FzdFNoYWRvdz10LmNhc3RTaGFkb3csdGhpcy5yZWNlaXZlU2hhZG93PXQucmVjZWl2ZVNoYWRvdyx0aGlzLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkLHRoaXMucmVuZGVyT3JkZXI9dC5yZW5kZXJPcmRlcix0aGlzLmFuaW1hdGlvbnM9dC5hbmltYXRpb25zLnNsaWNlKCksdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSxlPT09ITApZm9yKGxldCBuPTA7bjx0LmNoaWxkcmVuLmxlbmd0aDtuKyspe2NvbnN0IHI9dC5jaGlsZHJlbltuXTt0aGlzLmFkZChyLmNsb25lKCkpfXJldHVybiB0aGlzfX1uZS5ERUZBVUxUX1VQPW5ldyBMKDAsMSwwKSxuZS5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURT0hMCxuZS5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURT0hMDtjb25zdCBrbj1uZXcgTCxNaT1uZXcgTCxWaD1uZXcgTCxTaT1uZXcgTCxwcz1uZXcgTCxtcz1uZXcgTCxTZz1uZXcgTCxIaD1uZXcgTCxXaD1uZXcgTCwkaD1uZXcgTDtjbGFzcyBTbntjb25zdHJ1Y3Rvcih0PW5ldyBMLGU9bmV3IEwsbj1uZXcgTCl7dGhpcy5hPXQsdGhpcy5iPWUsdGhpcy5jPW59c3RhdGljIGdldE5vcm1hbCh0LGUsbixyKXtyLnN1YlZlY3RvcnMobixlKSxrbi5zdWJWZWN0b3JzKHQsZSksci5jcm9zcyhrbik7Y29uc3Qgcz1yLmxlbmd0aFNxKCk7cmV0dXJuIHM+MD9yLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KHMpKTpyLnNldCgwLDAsMCl9c3RhdGljIGdldEJhcnljb29yZCh0LGUsbixyLHMpe2tuLnN1YlZlY3RvcnMocixlKSxNaS5zdWJWZWN0b3JzKG4sZSksVmguc3ViVmVjdG9ycyh0LGUpO2NvbnN0IG89a24uZG90KGtuKSxhPWtuLmRvdChNaSksbD1rbi5kb3QoVmgpLGM9TWkuZG90KE1pKSx1PU1pLmRvdChWaCksaD1vKmMtYSphO2lmKGg9PT0wKXJldHVybiBzLnNldCgwLDAsMCksbnVsbDtjb25zdCBmPTEvaCxkPShjKmwtYSp1KSpmLHA9KG8qdS1hKmwpKmY7cmV0dXJuIHMuc2V0KDEtZC1wLHAsZCl9c3RhdGljIGNvbnRhaW5zUG9pbnQodCxlLG4scil7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxuLHIsU2kpPT09bnVsbD8hMTpTaS54Pj0wJiZTaS55Pj0wJiZTaS54K1NpLnk8PTF9c3RhdGljIGdldEludGVycG9sYXRpb24odCxlLG4scixzLG8sYSxsKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLG4scixTaSk9PT1udWxsPyhsLng9MCxsLnk9MCwieiJpbiBsJiYobC56PTApLCJ3ImluIGwmJihsLnc9MCksbnVsbCk6KGwuc2V0U2NhbGFyKDApLGwuYWRkU2NhbGVkVmVjdG9yKHMsU2kueCksbC5hZGRTY2FsZWRWZWN0b3IobyxTaS55KSxsLmFkZFNjYWxlZFZlY3RvcihhLFNpLnopLGwpfXN0YXRpYyBpc0Zyb250RmFjaW5nKHQsZSxuLHIpe3JldHVybiBrbi5zdWJWZWN0b3JzKG4sZSksTWkuc3ViVmVjdG9ycyh0LGUpLGtuLmNyb3NzKE1pKS5kb3Qocik8MH1zZXQodCxlLG4pe3JldHVybiB0aGlzLmEuY29weSh0KSx0aGlzLmIuY29weShlKSx0aGlzLmMuY29weShuKSx0aGlzfXNldEZyb21Qb2ludHNBbmRJbmRpY2VzKHQsZSxuLHIpe3JldHVybiB0aGlzLmEuY29weSh0W2VdKSx0aGlzLmIuY29weSh0W25dKSx0aGlzLmMuY29weSh0W3JdKSx0aGlzfXNldEZyb21BdHRyaWJ1dGVBbmRJbmRpY2VzKHQsZSxuLHIpe3JldHVybiB0aGlzLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLHRoaXMuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbiksdGhpcy5jLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxyKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmEuY29weSh0LmEpLHRoaXMuYi5jb3B5KHQuYiksdGhpcy5jLmNvcHkodC5jKSx0aGlzfWdldEFyZWEoKXtyZXR1cm4ga24uc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKSxNaS5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLGtuLmNyb3NzKE1pKS5sZW5ndGgoKSouNX1nZXRNaWRwb2ludCh0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9Z2V0Tm9ybWFsKHQpe3JldHVybiBTbi5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9Z2V0UGxhbmUodCl7cmV0dXJuIHQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1nZXRCYXJ5Y29vcmQodCxlKXtyZXR1cm4gU24uZ2V0QmFyeWNvb3JkKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSl9Z2V0SW50ZXJwb2xhdGlvbih0LGUsbixyLHMpe3JldHVybiBTbi5nZXRJbnRlcnBvbGF0aW9uKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSxuLHIscyl9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gU24uY29udGFpbnNQb2ludCh0LHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1pc0Zyb250RmFjaW5nKHQpe3JldHVybiBTbi5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLHQpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1RyaWFuZ2xlKHRoaXMpfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuYSxyPXRoaXMuYixzPXRoaXMuYztsZXQgbyxhO3BzLnN1YlZlY3RvcnMocixuKSxtcy5zdWJWZWN0b3JzKHMsbiksSGguc3ViVmVjdG9ycyh0LG4pO2NvbnN0IGw9cHMuZG90KEhoKSxjPW1zLmRvdChIaCk7aWYobDw9MCYmYzw9MClyZXR1cm4gZS5jb3B5KG4pO1doLnN1YlZlY3RvcnModCxyKTtjb25zdCB1PXBzLmRvdChXaCksaD1tcy5kb3QoV2gpO2lmKHU+PTAmJmg8PXUpcmV0dXJuIGUuY29weShyKTtjb25zdCBmPWwqaC11KmM7aWYoZjw9MCYmbD49MCYmdTw9MClyZXR1cm4gbz1sLyhsLXUpLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IocHMsbyk7JGguc3ViVmVjdG9ycyh0LHMpO2NvbnN0IGQ9cHMuZG90KCRoKSxwPW1zLmRvdCgkaCk7aWYocD49MCYmZDw9cClyZXR1cm4gZS5jb3B5KHMpO2NvbnN0IHk9ZCpjLWwqcDtpZih5PD0wJiZjPj0wJiZwPD0wKXJldHVybiBhPWMvKGMtcCksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihtcyxhKTtjb25zdCBtPXUqcC1kKmg7aWYobTw9MCYmaC11Pj0wJiZkLXA+PTApcmV0dXJuIFNnLnN1YlZlY3RvcnMocyxyKSxhPShoLXUpLyhoLXUrKGQtcCkpLGUuY29weShyKS5hZGRTY2FsZWRWZWN0b3IoU2csYSk7Y29uc3QgZz0xLyhtK3krZik7cmV0dXJuIG89eSpnLGE9ZipnLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IocHMsbykuYWRkU2NhbGVkVmVjdG9yKG1zLGEpfWVxdWFscyh0KXtyZXR1cm4gdC5hLmVxdWFscyh0aGlzLmEpJiZ0LmIuZXF1YWxzKHRoaXMuYikmJnQuYy5lcXVhbHModGhpcy5jKX19Y29uc3QgYmc9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0sJGk9e2g6MCxzOjAsbDowfSxQbD17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIFhoKGksdCxlKXtyZXR1cm4gZTwwJiYoZSs9MSksZT4xJiYoZS09MSksZTwxLzY/aSsodC1pKSo2KmU6ZTwxLzI/dDplPDIvMz9pKyh0LWkpKjYqKDIvMy1lKTppfWxldCB2dD1jbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbil7cmV0dXJuIHRoaXMuaXNDb2xvcj0hMCx0aGlzLnI9MSx0aGlzLmc9MSx0aGlzLmI9MSx0aGlzLnNldCh0LGUsbil9c2V0KHQsZSxuKXtpZihlPT09dm9pZCAwJiZuPT09dm9pZCAwKXtjb25zdCByPXQ7ciYmci5pc0NvbG9yP3RoaXMuY29weShyKTp0eXBlb2Ygcj09Im51bWJlciI/dGhpcy5zZXRIZXgocik6dHlwZW9mIHI9PSJzdHJpbmciJiZ0aGlzLnNldFN0eWxlKHIpfWVsc2UgdGhpcy5zZXRSR0IodCxlLG4pO3JldHVybiB0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPXQsdGhpcy5iPXQsdGhpc31zZXRIZXgodCxlPUxuKXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLHRoaXMucj0odD4+MTYmMjU1KS8yNTUsdGhpcy5nPSh0Pj44JjI1NSkvMjU1LHRoaXMuYj0odCYyNTUpLzI1NSxzZS50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMsZSksdGhpc31zZXRSR0IodCxlLG4scj1zZS53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz1lLHRoaXMuYj1uLHNlLnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxyKSx0aGlzfXNldEhTTCh0LGUsbixyPXNlLndvcmtpbmdDb2xvclNwYWNlKXtpZih0PVBoKHQsMSksZT14ZShlLDAsMSksbj14ZShuLDAsMSksZT09PTApdGhpcy5yPXRoaXMuZz10aGlzLmI9bjtlbHNle2NvbnN0IHM9bjw9LjU/biooMStlKTpuK2UtbiplLG89MipuLXM7dGhpcy5yPVhoKG8scyx0KzEvMyksdGhpcy5nPVhoKG8scyx0KSx0aGlzLmI9WGgobyxzLHQtMS8zKX1yZXR1cm4gc2UudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLHIpLHRoaXN9c2V0U3R5bGUodCxlPUxuKXtmdW5jdGlvbiBuKHMpe3MhPT12b2lkIDAmJnBhcnNlRmxvYXQocyk8MSYmY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIrdCsiIHdpbGwgYmUgaWdub3JlZC4iKX1sZXQgcjtpZihyPS9eKFx3KylcKChbXlwpXSopXCkvLmV4ZWModCkpe2xldCBzO2NvbnN0IG89clsxXSxhPXJbMl07c3dpdGNoKG8pe2Nhc2UicmdiIjpjYXNlInJnYmEiOmlmKHM9L15ccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhhKSlyZXR1cm4gbihzWzRdKSx0aGlzLnNldFJHQihNYXRoLm1pbigyNTUscGFyc2VJbnQoc1sxXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQoc1syXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQoc1szXSwxMCkpLzI1NSxlKTtpZihzPS9eXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4oc1s0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMTAwLHBhcnNlSW50KHNbMV0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHNbMl0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHNbM10sMTApKS8xMDAsZSk7YnJlYWs7Y2FzZSJoc2wiOmNhc2UiaHNsYSI6aWYocz0vXlxzKihcZCpcLj9cZCspXHMqLFxzKihcZCpcLj9cZCspXCVccyosXHMqKFxkKlwuP1xkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhhKSlyZXR1cm4gbihzWzRdKSx0aGlzLnNldEhTTChwYXJzZUZsb2F0KHNbMV0pLzM2MCxwYXJzZUZsb2F0KHNbMl0pLzEwMCxwYXJzZUZsb2F0KHNbM10pLzEwMCxlKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgbW9kZWwgIit0KX19ZWxzZSBpZihyPS9eXCMoW0EtRmEtZlxkXSspJC8uZXhlYyh0KSl7Y29uc3Qgcz1yWzFdLG89cy5sZW5ndGg7aWYobz09PTMpcmV0dXJuIHRoaXMuc2V0UkdCKHBhcnNlSW50KHMuY2hhckF0KDApLDE2KS8xNSxwYXJzZUludChzLmNoYXJBdCgxKSwxNikvMTUscGFyc2VJbnQocy5jaGFyQXQoMiksMTYpLzE1LGUpO2lmKG89PT02KXJldHVybiB0aGlzLnNldEhleChwYXJzZUludChzLDE2KSxlKTtjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBJbnZhbGlkIGhleCBjb2xvciAiK3QpfWVsc2UgaWYodCYmdC5sZW5ndGg+MClyZXR1cm4gdGhpcy5zZXRDb2xvck5hbWUodCxlKTtyZXR1cm4gdGhpc31zZXRDb2xvck5hbWUodCxlPUxuKXtjb25zdCBuPWJnW3QudG9Mb3dlckNhc2UoKV07cmV0dXJuIG4hPT12b2lkIDA/dGhpcy5zZXRIZXgobixlKTpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICIrdCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnIsdGhpcy5nLHRoaXMuYil9Y29weSh0KXtyZXR1cm4gdGhpcy5yPXQucix0aGlzLmc9dC5nLHRoaXMuYj10LmIsdGhpc31jb3B5U1JHQlRvTGluZWFyKHQpe3JldHVybiB0aGlzLnI9c3ModC5yKSx0aGlzLmc9c3ModC5nKSx0aGlzLmI9c3ModC5iKSx0aGlzfWNvcHlMaW5lYXJUb1NSR0IodCl7cmV0dXJuIHRoaXMucj1MaCh0LnIpLHRoaXMuZz1MaCh0LmcpLHRoaXMuYj1MaCh0LmIpLHRoaXN9Y29udmVydFNSR0JUb0xpbmVhcigpe3JldHVybiB0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyksdGhpc31jb252ZXJ0TGluZWFyVG9TUkdCKCl7cmV0dXJuIHRoaXMuY29weUxpbmVhclRvU1JHQih0aGlzKSx0aGlzfWdldEhleCh0PUxuKXtyZXR1cm4gc2UuZnJvbVdvcmtpbmdDb2xvclNwYWNlKCRlLmNvcHkodGhpcyksdCksTWF0aC5yb3VuZCh4ZSgkZS5yKjI1NSwwLDI1NSkpKjY1NTM2K01hdGgucm91bmQoeGUoJGUuZyoyNTUsMCwyNTUpKSoyNTYrTWF0aC5yb3VuZCh4ZSgkZS5iKjI1NSwwLDI1NSkpfWdldEhleFN0cmluZyh0PUxuKXtyZXR1cm4oIjAwMDAwMCIrdGhpcy5nZXRIZXgodCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNil9Z2V0SFNMKHQsZT1zZS53b3JraW5nQ29sb3JTcGFjZSl7c2UuZnJvbVdvcmtpbmdDb2xvclNwYWNlKCRlLmNvcHkodGhpcyksZSk7Y29uc3Qgbj0kZS5yLHI9JGUuZyxzPSRlLmIsbz1NYXRoLm1heChuLHIscyksYT1NYXRoLm1pbihuLHIscyk7bGV0IGwsYztjb25zdCB1PShhK28pLzI7aWYoYT09PW8pbD0wLGM9MDtlbHNle2NvbnN0IGg9by1hO3N3aXRjaChjPXU8PS41P2gvKG8rYSk6aC8oMi1vLWEpLG8pe2Nhc2UgbjpsPShyLXMpL2grKHI8cz82OjApO2JyZWFrO2Nhc2UgcjpsPShzLW4pL2grMjticmVhaztjYXNlIHM6bD0obi1yKS9oKzQ7YnJlYWt9bC89Nn1yZXR1cm4gdC5oPWwsdC5zPWMsdC5sPXUsdH1nZXRSR0IodCxlPXNlLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gc2UuZnJvbVdvcmtpbmdDb2xvclNwYWNlKCRlLmNvcHkodGhpcyksZSksdC5yPSRlLnIsdC5nPSRlLmcsdC5iPSRlLmIsdH1nZXRTdHlsZSh0PUxuKXtzZS5mcm9tV29ya2luZ0NvbG9yU3BhY2UoJGUuY29weSh0aGlzKSx0KTtjb25zdCBlPSRlLnIsbj0kZS5nLHI9JGUuYjtyZXR1cm4gdCE9PUxuP2Bjb2xvcigke3R9ICR7ZS50b0ZpeGVkKDMpfSAke24udG9GaXhlZCgzKX0gJHtyLnRvRml4ZWQoMyl9KWA6YHJnYigke01hdGgucm91bmQoZSoyNTUpfSwke01hdGgucm91bmQobioyNTUpfSwke01hdGgucm91bmQocioyNTUpfSlgfW9mZnNldEhTTCh0LGUsbil7cmV0dXJuIHRoaXMuZ2V0SFNMKCRpKSx0aGlzLnNldEhTTCgkaS5oK3QsJGkucytlLCRpLmwrbil9YWRkKHQpe3JldHVybiB0aGlzLnIrPXQucix0aGlzLmcrPXQuZyx0aGlzLmIrPXQuYix0aGlzfWFkZENvbG9ycyh0LGUpe3JldHVybiB0aGlzLnI9dC5yK2Uucix0aGlzLmc9dC5nK2UuZyx0aGlzLmI9dC5iK2UuYix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKz10LHRoaXMuZys9dCx0aGlzLmIrPXQsdGhpc31zdWIodCl7cmV0dXJuIHRoaXMucj1NYXRoLm1heCgwLHRoaXMuci10LnIpLHRoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy10LmcpLHRoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi10LmIpLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMucio9dC5yLHRoaXMuZyo9dC5nLHRoaXMuYio9dC5iLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMucio9dCx0aGlzLmcqPXQsdGhpcy5iKj10LHRoaXN9bGVycCh0LGUpe3JldHVybiB0aGlzLnIrPSh0LnItdGhpcy5yKSplLHRoaXMuZys9KHQuZy10aGlzLmcpKmUsdGhpcy5iKz0odC5iLXRoaXMuYikqZSx0aGlzfWxlcnBDb2xvcnModCxlLG4pe3JldHVybiB0aGlzLnI9dC5yKyhlLnItdC5yKSpuLHRoaXMuZz10LmcrKGUuZy10LmcpKm4sdGhpcy5iPXQuYisoZS5iLXQuYikqbix0aGlzfWxlcnBIU0wodCxlKXt0aGlzLmdldEhTTCgkaSksdC5nZXRIU0woUGwpO2NvbnN0IG49Um8oJGkuaCxQbC5oLGUpLHI9Um8oJGkucyxQbC5zLGUpLHM9Um8oJGkubCxQbC5sLGUpO3JldHVybiB0aGlzLnNldEhTTChuLHIscyksdGhpc31zZXRGcm9tVmVjdG9yMyh0KXtyZXR1cm4gdGhpcy5yPXQueCx0aGlzLmc9dC55LHRoaXMuYj10LnosdGhpc31hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLnIsbj10aGlzLmcscj10aGlzLmIscz10LmVsZW1lbnRzO3JldHVybiB0aGlzLnI9c1swXSplK3NbM10qbitzWzZdKnIsdGhpcy5nPXNbMV0qZStzWzRdKm4rc1s3XSpyLHRoaXMuYj1zWzJdKmUrc1s1XSpuK3NbOF0qcix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5yPT09dGhpcy5yJiZ0Lmc9PT10aGlzLmcmJnQuYj09PXRoaXMuYn1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLnI9dFtlXSx0aGlzLmc9dFtlKzFdLHRoaXMuYj10W2UrMl0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLnIsdFtlKzFdPXRoaXMuZyx0W2UrMl09dGhpcy5iLHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLnI9dC5nZXRYKGUpLHRoaXMuZz10LmdldFkoZSksdGhpcy5iPXQuZ2V0WihlKSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLmdldEhleCgpfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMucix5aWVsZCB0aGlzLmcseWllbGQgdGhpcy5ifX07Y29uc3QgJGU9bmV3IHZ0O3Z0Lk5BTUVTPWJnO2xldCB6Yj0wO2NsYXNzIFhlIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNNYXRlcmlhbD0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTp6YisrfSksdGhpcy51dWlkPV9uKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iTWF0ZXJpYWwiLHRoaXMuYmxlbmRpbmc9Y3IsdGhpcy5zaWRlPWhpLHRoaXMudmVydGV4Q29sb3JzPSExLHRoaXMub3BhY2l0eT0xLHRoaXMudHJhbnNwYXJlbnQ9ITEsdGhpcy5hbHBoYUhhc2g9ITEsdGhpcy5ibGVuZFNyYz1GYSx0aGlzLmJsZW5kRHN0PU9hLHRoaXMuYmxlbmRFcXVhdGlvbj1CaSx0aGlzLmJsZW5kU3JjQWxwaGE9bnVsbCx0aGlzLmJsZW5kRHN0QWxwaGE9bnVsbCx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT1udWxsLHRoaXMuYmxlbmRDb2xvcj1uZXcgdnQoMCwwLDApLHRoaXMuYmxlbmRBbHBoYT0wLHRoaXMuZGVwdGhGdW5jPWFvLHRoaXMuZGVwdGhUZXN0PSEwLHRoaXMuZGVwdGhXcml0ZT0hMCx0aGlzLnN0ZW5jaWxXcml0ZU1hc2s9MjU1LHRoaXMuc3RlbmNpbEZ1bmM9VGgsdGhpcy5zdGVuY2lsUmVmPTAsdGhpcy5zdGVuY2lsRnVuY01hc2s9MjU1LHRoaXMuc3RlbmNpbEZhaWw9bXIsdGhpcy5zdGVuY2lsWkZhaWw9bXIsdGhpcy5zdGVuY2lsWlBhc3M9bXIsdGhpcy5zdGVuY2lsV3JpdGU9ITEsdGhpcy5jbGlwcGluZ1BsYW5lcz1udWxsLHRoaXMuY2xpcEludGVyc2VjdGlvbj0hMSx0aGlzLmNsaXBTaGFkb3dzPSExLHRoaXMuc2hhZG93U2lkZT1udWxsLHRoaXMuY29sb3JXcml0ZT0hMCx0aGlzLnByZWNpc2lvbj1udWxsLHRoaXMucG9seWdvbk9mZnNldD0hMSx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9MCx0aGlzLnBvbHlnb25PZmZzZXRVbml0cz0wLHRoaXMuZGl0aGVyaW5nPSExLHRoaXMuYWxwaGFUb0NvdmVyYWdlPSExLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPSExLHRoaXMuZm9yY2VTaW5nbGVQYXNzPSExLHRoaXMudmlzaWJsZT0hMCx0aGlzLnRvbmVNYXBwZWQ9ITAsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLl9hbHBoYVRlc3Q9MH1nZXQgYWxwaGFUZXN0KCl7cmV0dXJuIHRoaXMuX2FscGhhVGVzdH1zZXQgYWxwaGFUZXN0KHQpe3RoaXMuX2FscGhhVGVzdD4wIT10PjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX2FscGhhVGVzdD10fW9uQmVmb3JlUmVuZGVyKCl7fW9uQmVmb3JlQ29tcGlsZSgpe31jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKXtyZXR1cm4gdGhpcy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKX1zZXRWYWx1ZXModCl7aWYodCE9PXZvaWQgMClmb3IoY29uc3QgZSBpbiB0KXtjb25zdCBuPXRbZV07aWYobj09PXZvaWQgMCl7Y29uc29sZS53YXJuKGBUSFJFRS5NYXRlcmlhbDogcGFyYW1ldGVyICcke2V9JyBoYXMgdmFsdWUgb2YgdW5kZWZpbmVkLmApO2NvbnRpbnVlfWNvbnN0IHI9dGhpc1tlXTtpZihyPT09dm9pZCAwKXtjb25zb2xlLndhcm4oYFRIUkVFLk1hdGVyaWFsOiAnJHtlfScgaXMgbm90IGEgcHJvcGVydHkgb2YgVEhSRUUuJHt0aGlzLnR5cGV9LmApO2NvbnRpbnVlfXImJnIuaXNDb2xvcj9yLnNldChuKTpyJiZyLmlzVmVjdG9yMyYmbiYmbi5pc1ZlY3RvcjM/ci5jb3B5KG4pOnRoaXNbZV09bn19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciO2UmJih0PXt0ZXh0dXJlczp7fSxpbWFnZXM6e319KTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O24udXVpZD10aGlzLnV1aWQsbi50eXBlPXRoaXMudHlwZSx0aGlzLm5hbWUhPT0iIiYmKG4ubmFtZT10aGlzLm5hbWUpLHRoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKG4uY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSksdGhpcy5yb3VnaG5lc3MhPT12b2lkIDAmJihuLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyksdGhpcy5tZXRhbG5lc3MhPT12b2lkIDAmJihuLm1ldGFsbmVzcz10aGlzLm1ldGFsbmVzcyksdGhpcy5zaGVlbiE9PXZvaWQgMCYmKG4uc2hlZW49dGhpcy5zaGVlbiksdGhpcy5zaGVlbkNvbG9yJiZ0aGlzLnNoZWVuQ29sb3IuaXNDb2xvciYmKG4uc2hlZW5Db2xvcj10aGlzLnNoZWVuQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2hlZW5Sb3VnaG5lc3MhPT12b2lkIDAmJihuLnNoZWVuUm91Z2huZXNzPXRoaXMuc2hlZW5Sb3VnaG5lc3MpLHRoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKG4uZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSksdGhpcy5lbWlzc2l2ZUludGVuc2l0eSE9PXZvaWQgMCYmdGhpcy5lbWlzc2l2ZUludGVuc2l0eSE9PTEmJihuLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXImJnRoaXMuc3BlY3VsYXIuaXNDb2xvciYmKG4uc3BlY3VsYXI9dGhpcy5zcGVjdWxhci5nZXRIZXgoKSksdGhpcy5zcGVjdWxhckludGVuc2l0eSE9PXZvaWQgMCYmKG4uc3BlY3VsYXJJbnRlbnNpdHk9dGhpcy5zcGVjdWxhckludGVuc2l0eSksdGhpcy5zcGVjdWxhckNvbG9yJiZ0aGlzLnNwZWN1bGFyQ29sb3IuaXNDb2xvciYmKG4uc3BlY3VsYXJDb2xvcj10aGlzLnNwZWN1bGFyQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2hpbmluZXNzIT09dm9pZCAwJiYobi5zaGluaW5lc3M9dGhpcy5zaGluaW5lc3MpLHRoaXMuY2xlYXJjb2F0IT09dm9pZCAwJiYobi5jbGVhcmNvYXQ9dGhpcy5jbGVhcmNvYXQpLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzIT09dm9pZCAwJiYobi5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MpLHRoaXMuY2xlYXJjb2F0TWFwJiZ0aGlzLmNsZWFyY29hdE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE1hcD10aGlzLmNsZWFyY29hdE1hcC50b0pTT04odCkudXVpZCksdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJnRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0Um91Z2huZXNzTWFwPXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCYmdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXROb3JtYWxNYXA9dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5jbGVhcmNvYXROb3JtYWxTY2FsZT10aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKSksdGhpcy5kaXNwZXJzaW9uIT09dm9pZCAwJiYobi5kaXNwZXJzaW9uPXRoaXMuZGlzcGVyc2lvbiksdGhpcy5pcmlkZXNjZW5jZSE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2U9dGhpcy5pcmlkZXNjZW5jZSksdGhpcy5pcmlkZXNjZW5jZUlPUiE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2VJT1I9dGhpcy5pcmlkZXNjZW5jZUlPUiksdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPXRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSksdGhpcy5pcmlkZXNjZW5jZU1hcCYmdGhpcy5pcmlkZXNjZW5jZU1hcC5pc1RleHR1cmUmJihuLmlyaWRlc2NlbmNlTWFwPXRoaXMuaXJpZGVzY2VuY2VNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAmJnRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD10aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmFuaXNvdHJvcHkhPT12b2lkIDAmJihuLmFuaXNvdHJvcHk9dGhpcy5hbmlzb3Ryb3B5KSx0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbiE9PXZvaWQgMCYmKG4uYW5pc290cm9weVJvdGF0aW9uPXRoaXMuYW5pc290cm9weVJvdGF0aW9uKSx0aGlzLmFuaXNvdHJvcHlNYXAmJnRoaXMuYW5pc290cm9weU1hcC5pc1RleHR1cmUmJihuLmFuaXNvdHJvcHlNYXA9dGhpcy5hbmlzb3Ryb3B5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYobi5tYXA9dGhpcy5tYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihuLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04odCkudXVpZCksdGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihuLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYobi5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTih0KS51dWlkLG4ubGlnaHRNYXBJbnRlbnNpdHk9dGhpcy5saWdodE1hcEludGVuc2l0eSksdGhpcy5hb01hcCYmdGhpcy5hb01hcC5pc1RleHR1cmUmJihuLmFvTWFwPXRoaXMuYW9NYXAudG9KU09OKHQpLnV1aWQsbi5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KSx0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihuLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTih0KS51dWlkLG4uYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKSx0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYobi5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxuLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYobi5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKHQpLnV1aWQsbi5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLG4uZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpLHRoaXMucm91Z2huZXNzTWFwJiZ0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUmJihuLnJvdWdobmVzc01hcD10aGlzLnJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5tZXRhbG5lc3NNYXAmJnRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSYmKG4ubWV0YWxuZXNzTWFwPXRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVtaXNzaXZlTWFwJiZ0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSYmKG4uZW1pc3NpdmVNYXA9dGhpcy5lbWlzc2l2ZU1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhck1hcCYmdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyTWFwPXRoaXMuc3BlY3VsYXJNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJnRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhckludGVuc2l0eU1hcD10aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFyQ29sb3JNYXAmJnRoaXMuc3BlY3VsYXJDb2xvck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyQ29sb3JNYXA9dGhpcy5zcGVjdWxhckNvbG9yTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYobi5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKHQpLnV1aWQsdGhpcy5jb21iaW5lIT09dm9pZCAwJiYobi5jb21iaW5lPXRoaXMuY29tYmluZSkpLHRoaXMuZW52TWFwUm90YXRpb24hPT12b2lkIDAmJihuLmVudk1hcFJvdGF0aW9uPXRoaXMuZW52TWFwUm90YXRpb24udG9BcnJheSgpKSx0aGlzLmVudk1hcEludGVuc2l0eSE9PXZvaWQgMCYmKG4uZW52TWFwSW50ZW5zaXR5PXRoaXMuZW52TWFwSW50ZW5zaXR5KSx0aGlzLnJlZmxlY3Rpdml0eSE9PXZvaWQgMCYmKG4ucmVmbGVjdGl2aXR5PXRoaXMucmVmbGVjdGl2aXR5KSx0aGlzLnJlZnJhY3Rpb25SYXRpbyE9PXZvaWQgMCYmKG4ucmVmcmFjdGlvblJhdGlvPXRoaXMucmVmcmFjdGlvblJhdGlvKSx0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKG4uZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04odCkudXVpZCksdGhpcy50cmFuc21pc3Npb24hPT12b2lkIDAmJihuLnRyYW5zbWlzc2lvbj10aGlzLnRyYW5zbWlzc2lvbiksdGhpcy50cmFuc21pc3Npb25NYXAmJnRoaXMudHJhbnNtaXNzaW9uTWFwLmlzVGV4dHVyZSYmKG4udHJhbnNtaXNzaW9uTWFwPXRoaXMudHJhbnNtaXNzaW9uTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnRoaWNrbmVzcyE9PXZvaWQgMCYmKG4udGhpY2tuZXNzPXRoaXMudGhpY2tuZXNzKSx0aGlzLnRoaWNrbmVzc01hcCYmdGhpcy50aGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi50aGlja25lc3NNYXA9dGhpcy50aGlja25lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSE9PXZvaWQgMCYmdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlIT09MS8wJiYobi5hdHRlbnVhdGlvbkRpc3RhbmNlPXRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSksdGhpcy5hdHRlbnVhdGlvbkNvbG9yIT09dm9pZCAwJiYobi5hdHRlbnVhdGlvbkNvbG9yPXRoaXMuYXR0ZW51YXRpb25Db2xvci5nZXRIZXgoKSksdGhpcy5zaXplIT09dm9pZCAwJiYobi5zaXplPXRoaXMuc2l6ZSksdGhpcy5zaGFkb3dTaWRlIT09bnVsbCYmKG4uc2hhZG93U2lkZT10aGlzLnNoYWRvd1NpZGUpLHRoaXMuc2l6ZUF0dGVudWF0aW9uIT09dm9pZCAwJiYobi5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pLHRoaXMuYmxlbmRpbmchPT1jciYmKG4uYmxlbmRpbmc9dGhpcy5ibGVuZGluZyksdGhpcy5zaWRlIT09aGkmJihuLnNpZGU9dGhpcy5zaWRlKSx0aGlzLnZlcnRleENvbG9ycz09PSEwJiYobi52ZXJ0ZXhDb2xvcnM9ITApLHRoaXMub3BhY2l0eTwxJiYobi5vcGFjaXR5PXRoaXMub3BhY2l0eSksdGhpcy50cmFuc3BhcmVudD09PSEwJiYobi50cmFuc3BhcmVudD0hMCksdGhpcy5ibGVuZFNyYyE9PUZhJiYobi5ibGVuZFNyYz10aGlzLmJsZW5kU3JjKSx0aGlzLmJsZW5kRHN0IT09T2EmJihuLmJsZW5kRHN0PXRoaXMuYmxlbmREc3QpLHRoaXMuYmxlbmRFcXVhdGlvbiE9PUJpJiYobi5ibGVuZEVxdWF0aW9uPXRoaXMuYmxlbmRFcXVhdGlvbiksdGhpcy5ibGVuZFNyY0FscGhhIT09bnVsbCYmKG4uYmxlbmRTcmNBbHBoYT10aGlzLmJsZW5kU3JjQWxwaGEpLHRoaXMuYmxlbmREc3RBbHBoYSE9PW51bGwmJihuLmJsZW5kRHN0QWxwaGE9dGhpcy5ibGVuZERzdEFscGhhKSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSE9PW51bGwmJihuLmJsZW5kRXF1YXRpb25BbHBoYT10aGlzLmJsZW5kRXF1YXRpb25BbHBoYSksdGhpcy5ibGVuZENvbG9yJiZ0aGlzLmJsZW5kQ29sb3IuaXNDb2xvciYmKG4uYmxlbmRDb2xvcj10aGlzLmJsZW5kQ29sb3IuZ2V0SGV4KCkpLHRoaXMuYmxlbmRBbHBoYSE9PTAmJihuLmJsZW5kQWxwaGE9dGhpcy5ibGVuZEFscGhhKSx0aGlzLmRlcHRoRnVuYyE9PWFvJiYobi5kZXB0aEZ1bmM9dGhpcy5kZXB0aEZ1bmMpLHRoaXMuZGVwdGhUZXN0PT09ITEmJihuLmRlcHRoVGVzdD10aGlzLmRlcHRoVGVzdCksdGhpcy5kZXB0aFdyaXRlPT09ITEmJihuLmRlcHRoV3JpdGU9dGhpcy5kZXB0aFdyaXRlKSx0aGlzLmNvbG9yV3JpdGU9PT0hMSYmKG4uY29sb3JXcml0ZT10aGlzLmNvbG9yV3JpdGUpLHRoaXMuc3RlbmNpbFdyaXRlTWFzayE9PTI1NSYmKG4uc3RlbmNpbFdyaXRlTWFzaz10aGlzLnN0ZW5jaWxXcml0ZU1hc2spLHRoaXMuc3RlbmNpbEZ1bmMhPT1UaCYmKG4uc3RlbmNpbEZ1bmM9dGhpcy5zdGVuY2lsRnVuYyksdGhpcy5zdGVuY2lsUmVmIT09MCYmKG4uc3RlbmNpbFJlZj10aGlzLnN0ZW5jaWxSZWYpLHRoaXMuc3RlbmNpbEZ1bmNNYXNrIT09MjU1JiYobi5zdGVuY2lsRnVuY01hc2s9dGhpcy5zdGVuY2lsRnVuY01hc2spLHRoaXMuc3RlbmNpbEZhaWwhPT1tciYmKG4uc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbCksdGhpcy5zdGVuY2lsWkZhaWwhPT1tciYmKG4uc3RlbmNpbFpGYWlsPXRoaXMuc3RlbmNpbFpGYWlsKSx0aGlzLnN0ZW5jaWxaUGFzcyE9PW1yJiYobi5zdGVuY2lsWlBhc3M9dGhpcy5zdGVuY2lsWlBhc3MpLHRoaXMuc3RlbmNpbFdyaXRlPT09ITAmJihuLnN0ZW5jaWxXcml0ZT10aGlzLnN0ZW5jaWxXcml0ZSksdGhpcy5yb3RhdGlvbiE9PXZvaWQgMCYmdGhpcy5yb3RhdGlvbiE9PTAmJihuLnJvdGF0aW9uPXRoaXMucm90YXRpb24pLHRoaXMucG9seWdvbk9mZnNldD09PSEwJiYobi5wb2x5Z29uT2Zmc2V0PSEwKSx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IhPT0wJiYobi5wb2x5Z29uT2Zmc2V0RmFjdG9yPXRoaXMucG9seWdvbk9mZnNldEZhY3RvciksdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMhPT0wJiYobi5wb2x5Z29uT2Zmc2V0VW5pdHM9dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMpLHRoaXMubGluZXdpZHRoIT09dm9pZCAwJiZ0aGlzLmxpbmV3aWR0aCE9PTEmJihuLmxpbmV3aWR0aD10aGlzLmxpbmV3aWR0aCksdGhpcy5kYXNoU2l6ZSE9PXZvaWQgMCYmKG4uZGFzaFNpemU9dGhpcy5kYXNoU2l6ZSksdGhpcy5nYXBTaXplIT09dm9pZCAwJiYobi5nYXBTaXplPXRoaXMuZ2FwU2l6ZSksdGhpcy5zY2FsZSE9PXZvaWQgMCYmKG4uc2NhbGU9dGhpcy5zY2FsZSksdGhpcy5kaXRoZXJpbmc9PT0hMCYmKG4uZGl0aGVyaW5nPSEwKSx0aGlzLmFscGhhVGVzdD4wJiYobi5hbHBoYVRlc3Q9dGhpcy5hbHBoYVRlc3QpLHRoaXMuYWxwaGFIYXNoPT09ITAmJihuLmFscGhhSGFzaD0hMCksdGhpcy5hbHBoYVRvQ292ZXJhZ2U9PT0hMCYmKG4uYWxwaGFUb0NvdmVyYWdlPSEwKSx0aGlzLnByZW11bHRpcGxpZWRBbHBoYT09PSEwJiYobi5wcmVtdWx0aXBsaWVkQWxwaGE9ITApLHRoaXMuZm9yY2VTaW5nbGVQYXNzPT09ITAmJihuLmZvcmNlU2luZ2xlUGFzcz0hMCksdGhpcy53aXJlZnJhbWU9PT0hMCYmKG4ud2lyZWZyYW1lPSEwKSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD4xJiYobi53aXJlZnJhbWVMaW5ld2lkdGg9dGhpcy53aXJlZnJhbWVMaW5ld2lkdGgpLHRoaXMud2lyZWZyYW1lTGluZWNhcCE9PSJyb3VuZCImJihuLndpcmVmcmFtZUxpbmVjYXA9dGhpcy53aXJlZnJhbWVMaW5lY2FwKSx0aGlzLndpcmVmcmFtZUxpbmVqb2luIT09InJvdW5kIiYmKG4ud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lam9pbiksdGhpcy5mbGF0U2hhZGluZz09PSEwJiYobi5mbGF0U2hhZGluZz0hMCksdGhpcy52aXNpYmxlPT09ITEmJihuLnZpc2libGU9ITEpLHRoaXMudG9uZU1hcHBlZD09PSExJiYobi50b25lTWFwcGVkPSExKSx0aGlzLmZvZz09PSExJiYobi5mb2c9ITEpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYobi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTtmdW5jdGlvbiByKHMpe2NvbnN0IG89W107Zm9yKGNvbnN0IGEgaW4gcyl7Y29uc3QgbD1zW2FdO2RlbGV0ZSBsLm1ldGFkYXRhLG8ucHVzaChsKX1yZXR1cm4gb31pZihlKXtjb25zdCBzPXIodC50ZXh0dXJlcyksbz1yKHQuaW1hZ2VzKTtzLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1zKSxvLmxlbmd0aD4wJiYobi5pbWFnZXM9byl9cmV0dXJuIG59Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy5uYW1lPXQubmFtZSx0aGlzLmJsZW5kaW5nPXQuYmxlbmRpbmcsdGhpcy5zaWRlPXQuc2lkZSx0aGlzLnZlcnRleENvbG9ycz10LnZlcnRleENvbG9ycyx0aGlzLm9wYWNpdHk9dC5vcGFjaXR5LHRoaXMudHJhbnNwYXJlbnQ9dC50cmFuc3BhcmVudCx0aGlzLmJsZW5kU3JjPXQuYmxlbmRTcmMsdGhpcy5ibGVuZERzdD10LmJsZW5kRHN0LHRoaXMuYmxlbmRFcXVhdGlvbj10LmJsZW5kRXF1YXRpb24sdGhpcy5ibGVuZFNyY0FscGhhPXQuYmxlbmRTcmNBbHBoYSx0aGlzLmJsZW5kRHN0QWxwaGE9dC5ibGVuZERzdEFscGhhLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPXQuYmxlbmRFcXVhdGlvbkFscGhhLHRoaXMuYmxlbmRDb2xvci5jb3B5KHQuYmxlbmRDb2xvciksdGhpcy5ibGVuZEFscGhhPXQuYmxlbmRBbHBoYSx0aGlzLmRlcHRoRnVuYz10LmRlcHRoRnVuYyx0aGlzLmRlcHRoVGVzdD10LmRlcHRoVGVzdCx0aGlzLmRlcHRoV3JpdGU9dC5kZXB0aFdyaXRlLHRoaXMuc3RlbmNpbFdyaXRlTWFzaz10LnN0ZW5jaWxXcml0ZU1hc2ssdGhpcy5zdGVuY2lsRnVuYz10LnN0ZW5jaWxGdW5jLHRoaXMuc3RlbmNpbFJlZj10LnN0ZW5jaWxSZWYsdGhpcy5zdGVuY2lsRnVuY01hc2s9dC5zdGVuY2lsRnVuY01hc2ssdGhpcy5zdGVuY2lsRmFpbD10LnN0ZW5jaWxGYWlsLHRoaXMuc3RlbmNpbFpGYWlsPXQuc3RlbmNpbFpGYWlsLHRoaXMuc3RlbmNpbFpQYXNzPXQuc3RlbmNpbFpQYXNzLHRoaXMuc3RlbmNpbFdyaXRlPXQuc3RlbmNpbFdyaXRlO2NvbnN0IGU9dC5jbGlwcGluZ1BsYW5lcztsZXQgbj1udWxsO2lmKGUhPT1udWxsKXtjb25zdCByPWUubGVuZ3RoO249bmV3IEFycmF5KHIpO2ZvcihsZXQgcz0wO3MhPT1yOysrcyluW3NdPWVbc10uY2xvbmUoKX1yZXR1cm4gdGhpcy5jbGlwcGluZ1BsYW5lcz1uLHRoaXMuY2xpcEludGVyc2VjdGlvbj10LmNsaXBJbnRlcnNlY3Rpb24sdGhpcy5jbGlwU2hhZG93cz10LmNsaXBTaGFkb3dzLHRoaXMuc2hhZG93U2lkZT10LnNoYWRvd1NpZGUsdGhpcy5jb2xvcldyaXRlPXQuY29sb3JXcml0ZSx0aGlzLnByZWNpc2lvbj10LnByZWNpc2lvbix0aGlzLnBvbHlnb25PZmZzZXQ9dC5wb2x5Z29uT2Zmc2V0LHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj10LnBvbHlnb25PZmZzZXRGYWN0b3IsdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM9dC5wb2x5Z29uT2Zmc2V0VW5pdHMsdGhpcy5kaXRoZXJpbmc9dC5kaXRoZXJpbmcsdGhpcy5hbHBoYVRlc3Q9dC5hbHBoYVRlc3QsdGhpcy5hbHBoYUhhc2g9dC5hbHBoYUhhc2gsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9dC5hbHBoYVRvQ292ZXJhZ2UsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9dC5wcmVtdWx0aXBsaWVkQWxwaGEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9dC5mb3JjZVNpbmdsZVBhc3MsdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLnRvbmVNYXBwZWQ9dC50b25lTWFwcGVkLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfW9uQnVpbGQoKXtjb25zb2xlLndhcm4oIk1hdGVyaWFsOiBvbkJ1aWxkKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19Y2xhc3MgWGkgZXh0ZW5kcyBYZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoQmFzaWNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB2dCgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuZW52TWFwUm90YXRpb249bmV3IE1uLHRoaXMuY29tYmluZT1sbyx0aGlzLnJlZmxlY3Rpdml0eT0xLHRoaXMucmVmcmFjdGlvblJhdGlvPS45OCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiLHRoaXMud2lyZWZyYW1lTGluZWpvaW49InJvdW5kIix0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hcD10Lm1hcCx0aGlzLmxpZ2h0TWFwPXQubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT10LmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9dC5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PXQuYW9NYXBJbnRlbnNpdHksdGhpcy5zcGVjdWxhck1hcD10LnNwZWN1bGFyTWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmVudk1hcD10LmVudk1hcCx0aGlzLmVudk1hcFJvdGF0aW9uLmNvcHkodC5lbnZNYXBSb3RhdGlvbiksdGhpcy5jb21iaW5lPXQuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZvZz10LmZvZyx0aGlzfX1jb25zdCBiaT1rYigpO2Z1bmN0aW9uIGtiKCl7Y29uc3QgaT1uZXcgQXJyYXlCdWZmZXIoNCksdD1uZXcgRmxvYXQzMkFycmF5KGkpLGU9bmV3IFVpbnQzMkFycmF5KGkpLG49bmV3IFVpbnQzMkFycmF5KDUxMikscj1uZXcgVWludDMyQXJyYXkoNTEyKTtmb3IobGV0IGw9MDtsPDI1NjsrK2wpe2NvbnN0IGM9bC0xMjc7YzwtMjc/KG5bbF09MCxuW2x8MjU2XT0zMjc2OCxyW2xdPTI0LHJbbHwyNTZdPTI0KTpjPC0xND8obltsXT0xMDI0Pj4tYy0xNCxuW2x8MjU2XT0xMDI0Pj4tYy0xNHwzMjc2OCxyW2xdPS1jLTEscltsfDI1Nl09LWMtMSk6Yzw9MTU/KG5bbF09YysxNTw8MTAsbltsfDI1Nl09YysxNTw8MTB8MzI3NjgscltsXT0xMyxyW2x8MjU2XT0xMyk6YzwxMjg/KG5bbF09MzE3NDQsbltsfDI1Nl09NjQ1MTIscltsXT0yNCxyW2x8MjU2XT0yNCk6KG5bbF09MzE3NDQsbltsfDI1Nl09NjQ1MTIscltsXT0xMyxyW2x8MjU2XT0xMyl9Y29uc3Qgcz1uZXcgVWludDMyQXJyYXkoMjA0OCksbz1uZXcgVWludDMyQXJyYXkoNjQpLGE9bmV3IFVpbnQzMkFycmF5KDY0KTtmb3IobGV0IGw9MTtsPDEwMjQ7KytsKXtsZXQgYz1sPDwxMyx1PTA7Zm9yKDshKGMmODM4ODYwOCk7KWM8PD0xLHUtPTgzODg2MDg7YyY9LTgzODg2MDksdSs9OTQ3OTEyNzA0LHNbbF09Y3x1fWZvcihsZXQgbD0xMDI0O2w8MjA0ODsrK2wpc1tsXT05Mzk1MjQwOTYrKGwtMTAyNDw8MTMpO2ZvcihsZXQgbD0xO2w8MzE7KytsKW9bbF09bDw8MjM7b1szMV09MTE5OTU3MDk0NCxvWzMyXT0yMTQ3NDgzNjQ4O2ZvcihsZXQgbD0zMztsPDYzOysrbClvW2xdPTIxNDc0ODM2NDgrKGwtMzI8PDIzKTtvWzYzXT0zMzQ3MDU0NTkyO2ZvcihsZXQgbD0xO2w8NjQ7KytsKWwhPT0zMiYmKGFbbF09MTAyNCk7cmV0dXJue2Zsb2F0Vmlldzp0LHVpbnQzMlZpZXc6ZSxiYXNlVGFibGU6bixzaGlmdFRhYmxlOnIsbWFudGlzc2FUYWJsZTpzLGV4cG9uZW50VGFibGU6byxvZmZzZXRUYWJsZTphfX1mdW5jdGlvbiBobihpKXtNYXRoLmFicyhpKT42NTUwNCYmY29uc29sZS53YXJuKCJUSFJFRS5EYXRhVXRpbHMudG9IYWxmRmxvYXQoKTogVmFsdWUgb3V0IG9mIHJhbmdlLiIpLGk9eGUoaSwtNjU1MDQsNjU1MDQpLGJpLmZsb2F0Vmlld1swXT1pO2NvbnN0IHQ9YmkudWludDMyVmlld1swXSxlPXQ+PjIzJjUxMTtyZXR1cm4gYmkuYmFzZVRhYmxlW2VdKygodCY4Mzg4NjA3KT4+Ymkuc2hpZnRUYWJsZVtlXSl9ZnVuY3Rpb24gTm8oaSl7Y29uc3QgdD1pPj4xMDtyZXR1cm4gYmkudWludDMyVmlld1swXT1iaS5tYW50aXNzYVRhYmxlW2JpLm9mZnNldFRhYmxlW3RdKyhpJjEwMjMpXStiaS5leHBvbmVudFRhYmxlW3RdLGJpLmZsb2F0Vmlld1swXX1jb25zdCBHYj17dG9IYWxmRmxvYXQ6aG4sZnJvbUhhbGZGbG9hdDpOb30sUGU9bmV3IEwsSWw9bmV3IHE7Y2xhc3MgWnR7Y29uc3RydWN0b3IodCxlLG49ITEpe2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTt0aGlzLmlzQnVmZmVyQXR0cmlidXRlPSEwLHRoaXMubmFtZT0iIix0aGlzLmFycmF5PXQsdGhpcy5pdGVtU2l6ZT1lLHRoaXMuY291bnQ9dCE9PXZvaWQgMD90Lmxlbmd0aC9lOjAsdGhpcy5ub3JtYWxpemVkPW4sdGhpcy51c2FnZT1Ubyx0aGlzLl91cGRhdGVSYW5nZT17b2Zmc2V0OjAsY291bnQ6LTF9LHRoaXMudXBkYXRlUmFuZ2VzPVtdLHRoaXMuZ3B1VHlwZT1jbix0aGlzLnZlcnNpb249MH1vblVwbG9hZENhbGxiYWNrKCl7fXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfWdldCB1cGRhdGVSYW5nZSgpe3JldHVybiBycygiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiB1cGRhdGVSYW5nZSgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiByMTY5LiBVc2UgYWRkVXBkYXRlUmFuZ2UoKSBpbnN0ZWFkLiIpLHRoaXMuX3VwZGF0ZVJhbmdlfXNldFVzYWdlKHQpe3JldHVybiB0aGlzLnVzYWdlPXQsdGhpc31hZGRVcGRhdGVSYW5nZSh0LGUpe3RoaXMudXBkYXRlUmFuZ2VzLnB1c2goe3N0YXJ0OnQsY291bnQ6ZX0pfWNsZWFyVXBkYXRlUmFuZ2VzKCl7dGhpcy51cGRhdGVSYW5nZXMubGVuZ3RoPTB9Y29weSh0KXtyZXR1cm4gdGhpcy5uYW1lPXQubmFtZSx0aGlzLmFycmF5PW5ldyB0LmFycmF5LmNvbnN0cnVjdG9yKHQuYXJyYXkpLHRoaXMuaXRlbVNpemU9dC5pdGVtU2l6ZSx0aGlzLmNvdW50PXQuY291bnQsdGhpcy5ub3JtYWxpemVkPXQubm9ybWFsaXplZCx0aGlzLnVzYWdlPXQudXNhZ2UsdGhpcy5ncHVUeXBlPXQuZ3B1VHlwZSx0aGlzfWNvcHlBdCh0LGUsbil7dCo9dGhpcy5pdGVtU2l6ZSxuKj1lLml0ZW1TaXplO2ZvcihsZXQgcj0wLHM9dGhpcy5pdGVtU2l6ZTtyPHM7cisrKXRoaXMuYXJyYXlbdCtyXT1lLmFycmF5W24rcl07cmV0dXJuIHRoaXN9Y29weUFycmF5KHQpe3JldHVybiB0aGlzLmFycmF5LnNldCh0KSx0aGlzfWFwcGx5TWF0cml4Myh0KXtpZih0aGlzLml0ZW1TaXplPT09Milmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylJbC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksSWwuYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFkoZSxJbC54LElsLnkpO2Vsc2UgaWYodGhpcy5pdGVtU2l6ZT09PTMpZm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspUGUuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLFBlLmFwcGx5TWF0cml4Myh0KSx0aGlzLnNldFhZWihlLFBlLngsUGUueSxQZS56KTtyZXR1cm4gdGhpc31hcHBseU1hdHJpeDQodCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspUGUuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLFBlLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldFhZWihlLFBlLngsUGUueSxQZS56KTtyZXR1cm4gdGhpc31hcHBseU5vcm1hbE1hdHJpeCh0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylQZS5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksUGUuYXBwbHlOb3JtYWxNYXRyaXgodCksdGhpcy5zZXRYWVooZSxQZS54LFBlLnksUGUueik7cmV0dXJuIHRoaXN9dHJhbnNmb3JtRGlyZWN0aW9uKHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKVBlLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxQZS50cmFuc2Zvcm1EaXJlY3Rpb24odCksdGhpcy5zZXRYWVooZSxQZS54LFBlLnksUGUueik7cmV0dXJuIHRoaXN9c2V0KHQsZT0wKXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCxlKSx0aGlzfWdldENvbXBvbmVudCh0LGUpe2xldCBuPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplK2VdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihuPVFlKG4sdGhpcy5hcnJheSkpLG59c2V0Q29tcG9uZW50KHQsZSxuKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYobj0kdChuLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZStlXT1uLHRoaXN9Z2V0WCh0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9UWUoZSx0aGlzLmFycmF5KSksZX1zZXRYKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9JHQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdPWUsdGhpc31nZXRZKHQpe2xldCBlPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVFlKGUsdGhpcy5hcnJheSkpLGV9c2V0WSh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPSR0KGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdPWUsdGhpc31nZXRaKHQpe2xldCBlPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzJdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVFlKGUsdGhpcy5hcnJheSkpLGV9c2V0Wih0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPSR0KGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzJdPWUsdGhpc31nZXRXKHQpe2xldCBlPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzNdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVFlKGUsdGhpcy5hcnJheSkpLGV9c2V0Vyh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPSR0KGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzNdPWUsdGhpc31zZXRYWSh0LGUsbil7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT0kdChlLHRoaXMuYXJyYXkpLG49JHQobix0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPWUsdGhpcy5hcnJheVt0KzFdPW4sdGhpc31zZXRYWVoodCxlLG4scil7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT0kdChlLHRoaXMuYXJyYXkpLG49JHQobix0aGlzLmFycmF5KSxyPSR0KHIsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1lLHRoaXMuYXJyYXlbdCsxXT1uLHRoaXMuYXJyYXlbdCsyXT1yLHRoaXN9c2V0WFlaVyh0LGUsbixyLHMpe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9JHQoZSx0aGlzLmFycmF5KSxuPSR0KG4sdGhpcy5hcnJheSkscj0kdChyLHRoaXMuYXJyYXkpLHM9JHQocyx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPWUsdGhpcy5hcnJheVt0KzFdPW4sdGhpcy5hcnJheVt0KzJdPXIsdGhpcy5hcnJheVt0KzNdPXMsdGhpc31vblVwbG9hZCh0KXtyZXR1cm4gdGhpcy5vblVwbG9hZENhbGxiYWNrPXQsdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LHRoaXMuaXRlbVNpemUpLmNvcHkodGhpcyl9dG9KU09OKCl7Y29uc3QgdD17aXRlbVNpemU6dGhpcy5pdGVtU2l6ZSx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5mcm9tKHRoaXMuYXJyYXkpLG5vcm1hbGl6ZWQ6dGhpcy5ub3JtYWxpemVkfTtyZXR1cm4gdGhpcy5uYW1lIT09IiImJih0Lm5hbWU9dGhpcy5uYW1lKSx0aGlzLnVzYWdlIT09VG8mJih0LnVzYWdlPXRoaXMudXNhZ2UpLHR9fWNsYXNzIFZiIGV4dGVuZHMgWnR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBJbnQ4QXJyYXkodCksZSxuKX19Y2xhc3MgSGIgZXh0ZW5kcyBadHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQ4QXJyYXkodCksZSxuKX19Y2xhc3MgV2IgZXh0ZW5kcyBadHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHQpLGUsbil9fWNsYXNzICRiIGV4dGVuZHMgWnR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBJbnQxNkFycmF5KHQpLGUsbil9fWNsYXNzIHFoIGV4dGVuZHMgWnR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50MTZBcnJheSh0KSxlLG4pfX1jbGFzcyBYYiBleHRlbmRzIFp0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgSW50MzJBcnJheSh0KSxlLG4pfX1jbGFzcyBZaCBleHRlbmRzIFp0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgVWludDMyQXJyYXkodCksZSxuKX19Y2xhc3MgcWIgZXh0ZW5kcyBadHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUsbiksdGhpcy5pc0Zsb2F0MTZCdWZmZXJBdHRyaWJ1dGU9ITB9Z2V0WCh0KXtsZXQgZT1Obyh0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV0pO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVFlKGUsdGhpcy5hcnJheSkpLGV9c2V0WCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPSR0KGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplXT1obihlKSx0aGlzfWdldFkodCl7bGV0IGU9Tm8odGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV0pO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVFlKGUsdGhpcy5hcnJheSkpLGV9c2V0WSh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPSR0KGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdPWhuKGUpLHRoaXN9Z2V0Wih0KXtsZXQgZT1Obyh0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXSk7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9UWUoZSx0aGlzLmFycmF5KSksZX1zZXRaKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9JHQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl09aG4oZSksdGhpc31nZXRXKHQpe2xldCBlPU5vKHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzNdKTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1RZShlLHRoaXMuYXJyYXkpKSxlfXNldFcodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT0kdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXT1obihlKSx0aGlzfXNldFhZKHQsZSxuKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPSR0KGUsdGhpcy5hcnJheSksbj0kdChuLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09aG4oZSksdGhpcy5hcnJheVt0KzFdPWhuKG4pLHRoaXN9c2V0WFlaKHQsZSxuLHIpe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9JHQoZSx0aGlzLmFycmF5KSxuPSR0KG4sdGhpcy5hcnJheSkscj0kdChyLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09aG4oZSksdGhpcy5hcnJheVt0KzFdPWhuKG4pLHRoaXMuYXJyYXlbdCsyXT1obihyKSx0aGlzfXNldFhZWlcodCxlLG4scixzKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPSR0KGUsdGhpcy5hcnJheSksbj0kdChuLHRoaXMuYXJyYXkpLHI9JHQocix0aGlzLmFycmF5KSxzPSR0KHMsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1obihlKSx0aGlzLmFycmF5W3QrMV09aG4obiksdGhpcy5hcnJheVt0KzJdPWhuKHIpLHRoaXMuYXJyYXlbdCszXT1obihzKSx0aGlzfX1jbGFzcyBTdCBleHRlbmRzIFp0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgRmxvYXQzMkFycmF5KHQpLGUsbil9fWxldCBZYj0wO2NvbnN0IERuPW5ldyBMdCxaaD1uZXcgbmUsZ3M9bmV3IEwsYm49bmV3IE9lLEZvPW5ldyBPZSxCZT1uZXcgTDtjbGFzcyBOdCBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzQnVmZmVyR2VvbWV0cnk9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6WWIrK30pLHRoaXMudXVpZD1fbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9IkJ1ZmZlckdlb21ldHJ5Iix0aGlzLmluZGV4PW51bGwsdGhpcy5hdHRyaWJ1dGVzPXt9LHRoaXMubW9ycGhBdHRyaWJ1dGVzPXt9LHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU9ITEsdGhpcy5ncm91cHM9W10sdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbCx0aGlzLmRyYXdSYW5nZT17c3RhcnQ6MCxjb3VudDoxLzB9LHRoaXMudXNlckRhdGE9e319Z2V0SW5kZXgoKXtyZXR1cm4gdGhpcy5pbmRleH1zZXRJbmRleCh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90aGlzLmluZGV4PW5ldyhhZyh0KT9ZaDpxaCkodCwxKTp0aGlzLmluZGV4PXQsdGhpc31nZXRBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XX1zZXRBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdPWUsdGhpc31kZWxldGVBdHRyaWJ1dGUodCl7cmV0dXJuIGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbdF0sdGhpc31oYXNBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XSE9PXZvaWQgMH1hZGRHcm91cCh0LGUsbj0wKXt0aGlzLmdyb3Vwcy5wdXNoKHtzdGFydDp0LGNvdW50OmUsbWF0ZXJpYWxJbmRleDpufSl9Y2xlYXJHcm91cHMoKXt0aGlzLmdyb3Vwcz1bXX1zZXREcmF3UmFuZ2UodCxlKXt0aGlzLmRyYXdSYW5nZS5zdGFydD10LHRoaXMuZHJhd1JhbmdlLmNvdW50PWV9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO2UhPT12b2lkIDAmJihlLmFwcGx5TWF0cml4NCh0KSxlLm5lZWRzVXBkYXRlPSEwKTtjb25zdCBuPXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7aWYobiE9PXZvaWQgMCl7Y29uc3Qgcz1uZXcgWHQoKS5nZXROb3JtYWxNYXRyaXgodCk7bi5hcHBseU5vcm1hbE1hdHJpeChzKSxuLm5lZWRzVXBkYXRlPSEwfWNvbnN0IHI9dGhpcy5hdHRyaWJ1dGVzLnRhbmdlbnQ7cmV0dXJuIHIhPT12b2lkIDAmJihyLnRyYW5zZm9ybURpcmVjdGlvbih0KSxyLm5lZWRzVXBkYXRlPSEwKSx0aGlzLmJvdW5kaW5nQm94IT09bnVsbCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSx0aGlzfWFwcGx5UXVhdGVybmlvbih0KXtyZXR1cm4gRG4ubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCksdGhpcy5hcHBseU1hdHJpeDQoRG4pLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gRG4ubWFrZVJvdGF0aW9uWCh0KSx0aGlzLmFwcGx5TWF0cml4NChEbiksdGhpc31yb3RhdGVZKHQpe3JldHVybiBEbi5tYWtlUm90YXRpb25ZKHQpLHRoaXMuYXBwbHlNYXRyaXg0KERuKSx0aGlzfXJvdGF0ZVoodCl7cmV0dXJuIERuLm1ha2VSb3RhdGlvbloodCksdGhpcy5hcHBseU1hdHJpeDQoRG4pLHRoaXN9dHJhbnNsYXRlKHQsZSxuKXtyZXR1cm4gRG4ubWFrZVRyYW5zbGF0aW9uKHQsZSxuKSx0aGlzLmFwcGx5TWF0cml4NChEbiksdGhpc31zY2FsZSh0LGUsbil7cmV0dXJuIERuLm1ha2VTY2FsZSh0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoRG4pLHRoaXN9bG9va0F0KHQpe3JldHVybiBaaC5sb29rQXQodCksWmgudXBkYXRlTWF0cml4KCksdGhpcy5hcHBseU1hdHJpeDQoWmgubWF0cml4KSx0aGlzfWNlbnRlcigpe3JldHVybiB0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpLHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKGdzKS5uZWdhdGUoKSx0aGlzLnRyYW5zbGF0ZShncy54LGdzLnksZ3MueiksdGhpc31zZXRGcm9tUG9pbnRzKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTAscj10Lmxlbmd0aDtuPHI7bisrKXtjb25zdCBzPXRbbl07ZS5wdXNoKHMueCxzLnkscy56fHwwKX1yZXR1cm4gdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU3QoZSwzKSksdGhpc31jb21wdXRlQm91bmRpbmdCb3goKXt0aGlzLmJvdW5kaW5nQm94PT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IE9lKTtjb25zdCB0PXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbixlPXRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKHQmJnQuaXNHTEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIGJveC4iLHRoaXMpLHRoaXMuYm91bmRpbmdCb3guc2V0KG5ldyBMKC0xLzAsLTEvMCwtMS8wKSxuZXcgTCgxLzAsMS8wLDEvMCkpO3JldHVybn1pZih0IT09dm9pZCAwKXtpZih0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspe2NvbnN0IHM9ZVtuXTtibi5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHMpLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU/KEJlLmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5taW4sYm4ubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoQmUpLEJlLmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5tYXgsYm4ubWF4KSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoQmUpKToodGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KGJuLm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KGJuLm1heCkpfX1lbHNlIHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7KGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLngpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi55KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueikpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7dGhpcy5ib3VuZGluZ1NwaGVyZT09PW51bGwmJih0aGlzLmJvdW5kaW5nU3BoZXJlPW5ldyBXZSk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBzcGhlcmUuIix0aGlzKSx0aGlzLmJvdW5kaW5nU3BoZXJlLnNldChuZXcgTCwxLzApO3JldHVybn1pZih0KXtjb25zdCBuPXRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO2lmKGJuLnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IHM9MCxvPWUubGVuZ3RoO3M8bztzKyspe2NvbnN0IGE9ZVtzXTtGby5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGEpLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU/KEJlLmFkZFZlY3RvcnMoYm4ubWluLEZvLm1pbiksYm4uZXhwYW5kQnlQb2ludChCZSksQmUuYWRkVmVjdG9ycyhibi5tYXgsRm8ubWF4KSxibi5leHBhbmRCeVBvaW50KEJlKSk6KGJuLmV4cGFuZEJ5UG9pbnQoRm8ubWluKSxibi5leHBhbmRCeVBvaW50KEZvLm1heCkpfWJuLmdldENlbnRlcihuKTtsZXQgcj0wO2ZvcihsZXQgcz0wLG89dC5jb3VudDtzPG87cysrKUJlLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSxyPU1hdGgubWF4KHIsbi5kaXN0YW5jZVRvU3F1YXJlZChCZSkpO2lmKGUpZm9yKGxldCBzPTAsbz1lLmxlbmd0aDtzPG87cysrKXtjb25zdCBhPWVbc10sbD10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2ZvcihsZXQgYz0wLHU9YS5jb3VudDtjPHU7YysrKUJlLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxjKSxsJiYoZ3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGMpLEJlLmFkZChncykpLHI9TWF0aC5tYXgocixuLmRpc3RhbmNlVG9TcXVhcmVkKEJlKSl9dGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXM9TWF0aC5zcXJ0KHIpLGlzTmFOKHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9fWNvbXB1dGVUYW5nZW50cygpe2NvbnN0IHQ9dGhpcy5pbmRleCxlPXRoaXMuYXR0cmlidXRlcztpZih0PT09bnVsbHx8ZS5wb3NpdGlvbj09PXZvaWQgMHx8ZS5ub3JtYWw9PT12b2lkIDB8fGUudXY9PT12b2lkIDApe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgZmFpbGVkLiBNaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZXMgKGluZGV4LCBwb3NpdGlvbiwgbm9ybWFsIG9yIHV2KSIpO3JldHVybn1jb25zdCBuPWUucG9zaXRpb24scj1lLm5vcm1hbCxzPWUudXY7dGhpcy5oYXNBdHRyaWJ1dGUoInRhbmdlbnQiKT09PSExJiZ0aGlzLnNldEF0dHJpYnV0ZSgidGFuZ2VudCIsbmV3IFp0KG5ldyBGbG9hdDMyQXJyYXkoNCpuLmNvdW50KSw0KSk7Y29uc3Qgbz10aGlzLmdldEF0dHJpYnV0ZSgidGFuZ2VudCIpLGE9W10sbD1bXTtmb3IobGV0IFA9MDtQPG4uY291bnQ7UCsrKWFbUF09bmV3IEwsbFtQXT1uZXcgTDtjb25zdCBjPW5ldyBMLHU9bmV3IEwsaD1uZXcgTCxmPW5ldyBxLGQ9bmV3IHEscD1uZXcgcSx5PW5ldyBMLG09bmV3IEw7ZnVuY3Rpb24gZyhQLHcsTSl7Yy5mcm9tQnVmZmVyQXR0cmlidXRlKG4sUCksdS5mcm9tQnVmZmVyQXR0cmlidXRlKG4sdyksaC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sTSksZi5mcm9tQnVmZmVyQXR0cmlidXRlKHMsUCksZC5mcm9tQnVmZmVyQXR0cmlidXRlKHMsdykscC5mcm9tQnVmZmVyQXR0cmlidXRlKHMsTSksdS5zdWIoYyksaC5zdWIoYyksZC5zdWIoZikscC5zdWIoZik7Y29uc3QgQT0xLyhkLngqcC55LXAueCpkLnkpO2lzRmluaXRlKEEpJiYoeS5jb3B5KHUpLm11bHRpcGx5U2NhbGFyKHAueSkuYWRkU2NhbGVkVmVjdG9yKGgsLWQueSkubXVsdGlwbHlTY2FsYXIoQSksbS5jb3B5KGgpLm11bHRpcGx5U2NhbGFyKGQueCkuYWRkU2NhbGVkVmVjdG9yKHUsLXAueCkubXVsdGlwbHlTY2FsYXIoQSksYVtQXS5hZGQoeSksYVt3XS5hZGQoeSksYVtNXS5hZGQoeSksbFtQXS5hZGQobSksbFt3XS5hZGQobSksbFtNXS5hZGQobSkpfWxldCB4PXRoaXMuZ3JvdXBzO3gubGVuZ3RoPT09MCYmKHg9W3tzdGFydDowLGNvdW50OnQuY291bnR9XSk7Zm9yKGxldCBQPTAsdz14Lmxlbmd0aDtQPHc7KytQKXtjb25zdCBNPXhbUF0sQT1NLnN0YXJ0LEY9TS5jb3VudDtmb3IobGV0IEQ9QSxOPUErRjtEPE47RCs9MylnKHQuZ2V0WChEKzApLHQuZ2V0WChEKzEpLHQuZ2V0WChEKzIpKX1jb25zdCB2PW5ldyBMLF89bmV3IEwsRT1uZXcgTCxiPW5ldyBMO2Z1bmN0aW9uIFQoUCl7RS5mcm9tQnVmZmVyQXR0cmlidXRlKHIsUCksYi5jb3B5KEUpO2NvbnN0IHc9YVtQXTt2LmNvcHkodyksdi5zdWIoRS5tdWx0aXBseVNjYWxhcihFLmRvdCh3KSkpLm5vcm1hbGl6ZSgpLF8uY3Jvc3NWZWN0b3JzKGIsdyk7Y29uc3QgQT1fLmRvdChsW1BdKTwwPy0xOjE7by5zZXRYWVpXKFAsdi54LHYueSx2LnosQSl9Zm9yKGxldCBQPTAsdz14Lmxlbmd0aDtQPHc7KytQKXtjb25zdCBNPXhbUF0sQT1NLnN0YXJ0LEY9TS5jb3VudDtmb3IobGV0IEQ9QSxOPUErRjtEPE47RCs9MylUKHQuZ2V0WChEKzApKSxUKHQuZ2V0WChEKzEpKSxUKHQuZ2V0WChEKzIpKX19Y29tcHV0ZVZlcnRleE5vcm1hbHMoKXtjb25zdCB0PXRoaXMuaW5kZXgsZT10aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZihlIT09dm9pZCAwKXtsZXQgbj10aGlzLmdldEF0dHJpYnV0ZSgibm9ybWFsIik7aWYobj09PXZvaWQgMCluPW5ldyBadChuZXcgRmxvYXQzMkFycmF5KGUuY291bnQqMyksMyksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbik7ZWxzZSBmb3IobGV0IGY9MCxkPW4uY291bnQ7ZjxkO2YrKyluLnNldFhZWihmLDAsMCwwKTtjb25zdCByPW5ldyBMLHM9bmV3IEwsbz1uZXcgTCxhPW5ldyBMLGw9bmV3IEwsYz1uZXcgTCx1PW5ldyBMLGg9bmV3IEw7aWYodClmb3IobGV0IGY9MCxkPXQuY291bnQ7ZjxkO2YrPTMpe2NvbnN0IHA9dC5nZXRYKGYrMCkseT10LmdldFgoZisxKSxtPXQuZ2V0WChmKzIpO3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHApLHMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHkpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG0pLHUuc3ViVmVjdG9ycyhvLHMpLGguc3ViVmVjdG9ycyhyLHMpLHUuY3Jvc3MoaCksYS5mcm9tQnVmZmVyQXR0cmlidXRlKG4scCksbC5mcm9tQnVmZmVyQXR0cmlidXRlKG4seSksYy5mcm9tQnVmZmVyQXR0cmlidXRlKG4sbSksYS5hZGQodSksbC5hZGQodSksYy5hZGQodSksbi5zZXRYWVoocCxhLngsYS55LGEueiksbi5zZXRYWVooeSxsLngsbC55LGwueiksbi5zZXRYWVoobSxjLngsYy55LGMueil9ZWxzZSBmb3IobGV0IGY9MCxkPWUuY291bnQ7ZjxkO2YrPTMpci5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZiswKSxzLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxmKzEpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGYrMiksdS5zdWJWZWN0b3JzKG8scyksaC5zdWJWZWN0b3JzKHIscyksdS5jcm9zcyhoKSxuLnNldFhZWihmKzAsdS54LHUueSx1LnopLG4uc2V0WFlaKGYrMSx1LngsdS55LHUueiksbi5zZXRYWVooZisyLHUueCx1LnksdS56KTt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKSxuLm5lZWRzVXBkYXRlPSEwfX1ub3JtYWxpemVOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2ZvcihsZXQgZT0wLG49dC5jb3VudDtlPG47ZSsrKUJlLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSxCZS5ub3JtYWxpemUoKSx0LnNldFhZWihlLEJlLngsQmUueSxCZS56KX10b05vbkluZGV4ZWQoKXtmdW5jdGlvbiB0KGEsbCl7Y29uc3QgYz1hLmFycmF5LHU9YS5pdGVtU2l6ZSxoPWEubm9ybWFsaXplZCxmPW5ldyBjLmNvbnN0cnVjdG9yKGwubGVuZ3RoKnUpO2xldCBkPTAscD0wO2ZvcihsZXQgeT0wLG09bC5sZW5ndGg7eTxtO3krKyl7YS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlP2Q9bFt5XSphLmRhdGEuc3RyaWRlK2Eub2Zmc2V0OmQ9bFt5XSp1O2ZvcihsZXQgZz0wO2c8dTtnKyspZltwKytdPWNbZCsrXX1yZXR1cm4gbmV3IFp0KGYsdSxoKX1pZih0aGlzLmluZGV4PT09bnVsbClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogQnVmZmVyR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO2NvbnN0IGU9bmV3IE50LG49dGhpcy5pbmRleC5hcnJheSxyPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgYSBpbiByKXtjb25zdCBsPXJbYV0sYz10KGwsbik7ZS5zZXRBdHRyaWJ1dGUoYSxjKX1jb25zdCBzPXRoaXMubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBhIGluIHMpe2NvbnN0IGw9W10sYz1zW2FdO2ZvcihsZXQgdT0wLGg9Yy5sZW5ndGg7dTxoO3UrKyl7Y29uc3QgZj1jW3VdLGQ9dChmLG4pO2wucHVzaChkKX1lLm1vcnBoQXR0cmlidXRlc1thXT1sfWUubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBvPXRoaXMuZ3JvdXBzO2ZvcihsZXQgYT0wLGw9by5sZW5ndGg7YTxsO2ErKyl7Y29uc3QgYz1vW2FdO2UuYWRkR3JvdXAoYy5zdGFydCxjLmNvdW50LGMubWF0ZXJpYWxJbmRleCl9cmV0dXJuIGV9dG9KU09OKCl7Y29uc3QgdD17bWV0YWRhdGE6e3ZlcnNpb246NC42LHR5cGU6IkJ1ZmZlckdlb21ldHJ5IixnZW5lcmF0b3I6IkJ1ZmZlckdlb21ldHJ5LnRvSlNPTiJ9fTtpZih0LnV1aWQ9dGhpcy51dWlkLHQudHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJih0Lm5hbWU9dGhpcy5uYW1lKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKHQudXNlckRhdGE9dGhpcy51c2VyRGF0YSksdGhpcy5wYXJhbWV0ZXJzIT09dm9pZCAwKXtjb25zdCBsPXRoaXMucGFyYW1ldGVycztmb3IoY29uc3QgYyBpbiBsKWxbY10hPT12b2lkIDAmJih0W2NdPWxbY10pO3JldHVybiB0fXQuZGF0YT17YXR0cmlidXRlczp7fX07Y29uc3QgZT10aGlzLmluZGV4O2UhPT1udWxsJiYodC5kYXRhLmluZGV4PXt0eXBlOmUuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmFycmF5KX0pO2NvbnN0IG49dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBsIGluIG4pe2NvbnN0IGM9bltsXTt0LmRhdGEuYXR0cmlidXRlc1tsXT1jLnRvSlNPTih0LmRhdGEpfWNvbnN0IHI9e307bGV0IHM9ITE7Zm9yKGNvbnN0IGwgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IGM9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbbF0sdT1bXTtmb3IobGV0IGg9MCxmPWMubGVuZ3RoO2g8ZjtoKyspe2NvbnN0IGQ9Y1toXTt1LnB1c2goZC50b0pTT04odC5kYXRhKSl9dS5sZW5ndGg+MCYmKHJbbF09dSxzPSEwKX1zJiYodC5kYXRhLm1vcnBoQXR0cmlidXRlcz1yLHQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKTtjb25zdCBvPXRoaXMuZ3JvdXBzO28ubGVuZ3RoPjAmJih0LmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobykpKTtjb25zdCBhPXRoaXMuYm91bmRpbmdTcGhlcmU7cmV0dXJuIGEhPT1udWxsJiYodC5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6YS5jZW50ZXIudG9BcnJheSgpLHJhZGl1czphLnJhZGl1c30pLHR9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsO2NvbnN0IGU9e307dGhpcy5uYW1lPXQubmFtZTtjb25zdCBuPXQuaW5kZXg7biE9PW51bGwmJnRoaXMuc2V0SW5kZXgobi5jbG9uZShlKSk7Y29uc3Qgcj10LmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGMgaW4gcil7Y29uc3QgdT1yW2NdO3RoaXMuc2V0QXR0cmlidXRlKGMsdS5jbG9uZShlKSl9Y29uc3Qgcz10Lm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgYyBpbiBzKXtjb25zdCB1PVtdLGg9c1tjXTtmb3IobGV0IGY9MCxkPWgubGVuZ3RoO2Y8ZDtmKyspdS5wdXNoKGhbZl0uY2xvbmUoZSkpO3RoaXMubW9ycGhBdHRyaWJ1dGVzW2NdPXV9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT10Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2NvbnN0IG89dC5ncm91cHM7Zm9yKGxldCBjPTAsdT1vLmxlbmd0aDtjPHU7YysrKXtjb25zdCBoPW9bY107dGhpcy5hZGRHcm91cChoLnN0YXJ0LGguY291bnQsaC5tYXRlcmlhbEluZGV4KX1jb25zdCBhPXQuYm91bmRpbmdCb3g7YSE9PW51bGwmJih0aGlzLmJvdW5kaW5nQm94PWEuY2xvbmUoKSk7Y29uc3QgbD10LmJvdW5kaW5nU3BoZXJlO3JldHVybiBsIT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bC5jbG9uZSgpKSx0aGlzLmRyYXdSYW5nZS5zdGFydD10LmRyYXdSYW5nZS5zdGFydCx0aGlzLmRyYXdSYW5nZS5jb3VudD10LmRyYXdSYW5nZS5jb3VudCx0aGlzLnVzZXJEYXRhPXQudXNlckRhdGEsdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX1jb25zdCB3Zz1uZXcgTHQseHI9bmV3IHVzLExsPW5ldyBXZSxBZz1uZXcgTCx5cz1uZXcgTCx2cz1uZXcgTCxfcz1uZXcgTCxKaD1uZXcgTCxEbD1uZXcgTCxVbD1uZXcgcSxObD1uZXcgcSxGbD1uZXcgcSxFZz1uZXcgTCxUZz1uZXcgTCxDZz1uZXcgTCxPbD1uZXcgTCxCbD1uZXcgTDtjbGFzcyBJZSBleHRlbmRzIG5le2NvbnN0cnVjdG9yKHQ9bmV3IE50LGU9bmV3IFhpKXtzdXBlcigpLHRoaXMuaXNNZXNoPSEwLHRoaXMudHlwZT0iTWVzaCIsdGhpcy5nZW9tZXRyeT10LHRoaXMubWF0ZXJpYWw9ZSx0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHQubW9ycGhUYXJnZXRJbmZsdWVuY2VzIT09dm9pZCAwJiYodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9dC5tb3JwaFRhcmdldEluZmx1ZW5jZXMuc2xpY2UoKSksdC5tb3JwaFRhcmdldERpY3Rpb25hcnkhPT12b2lkIDAmJih0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT1PYmplY3QuYXNzaWduKHt9LHQubW9ycGhUYXJnZXREaWN0aW9uYXJ5KSksdGhpcy5tYXRlcmlhbD1BcnJheS5pc0FycmF5KHQubWF0ZXJpYWwpP3QubWF0ZXJpYWwuc2xpY2UoKTp0Lm1hdGVyaWFsLHRoaXMuZ2VvbWV0cnk9dC5nZW9tZXRyeSx0aGlzfXVwZGF0ZU1vcnBoVGFyZ2V0cygpe2NvbnN0IGU9dGhpcy5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMsbj1PYmplY3Qua2V5cyhlKTtpZihuLmxlbmd0aD4wKXtjb25zdCByPWVbblswXV07aWYociE9PXZvaWQgMCl7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e307Zm9yKGxldCBzPTAsbz1yLmxlbmd0aDtzPG87cysrKXtjb25zdCBhPXJbc10ubmFtZXx8U3RyaW5nKHMpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCksdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbYV09c319fX1nZXRWZXJ0ZXhQb3NpdGlvbih0LGUpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxyPW4uYXR0cmlidXRlcy5wb3NpdGlvbixzPW4ubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLG89bi5tb3JwaFRhcmdldHNSZWxhdGl2ZTtlLmZyb21CdWZmZXJBdHRyaWJ1dGUocix0KTtjb25zdCBhPXRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzO2lmKHMmJmEpe0RsLnNldCgwLDAsMCk7Zm9yKGxldCBsPTAsYz1zLmxlbmd0aDtsPGM7bCsrKXtjb25zdCB1PWFbbF0saD1zW2xdO3UhPT0wJiYoSmguZnJvbUJ1ZmZlckF0dHJpYnV0ZShoLHQpLG8/RGwuYWRkU2NhbGVkVmVjdG9yKEpoLHUpOkRsLmFkZFNjYWxlZFZlY3RvcihKaC5zdWIoZSksdSkpfWUuYWRkKERsKX1yZXR1cm4gZX1yYXljYXN0KHQsZSl7Y29uc3Qgbj10aGlzLmdlb21ldHJ5LHI9dGhpcy5tYXRlcmlhbCxzPXRoaXMubWF0cml4V29ybGQ7ciE9PXZvaWQgMCYmKG4uYm91bmRpbmdTcGhlcmU9PT1udWxsJiZuLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLExsLmNvcHkobi5ib3VuZGluZ1NwaGVyZSksTGwuYXBwbHlNYXRyaXg0KHMpLHhyLmNvcHkodC5yYXkpLnJlY2FzdCh0Lm5lYXIpLCEoTGwuY29udGFpbnNQb2ludCh4ci5vcmlnaW4pPT09ITEmJih4ci5pbnRlcnNlY3RTcGhlcmUoTGwsQWcpPT09bnVsbHx8eHIub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKEFnKT5vbyh0LmZhci10Lm5lYXIsMikpKSYmKHdnLmNvcHkocykuaW52ZXJ0KCkseHIuY29weSh0LnJheSkuYXBwbHlNYXRyaXg0KHdnKSwhKG4uYm91bmRpbmdCb3ghPT1udWxsJiZ4ci5pbnRlcnNlY3RzQm94KG4uYm91bmRpbmdCb3gpPT09ITEpJiZ0aGlzLl9jb21wdXRlSW50ZXJzZWN0aW9ucyh0LGUseHIpKSl9X2NvbXB1dGVJbnRlcnNlY3Rpb25zKHQsZSxuKXtsZXQgcjtjb25zdCBzPXRoaXMuZ2VvbWV0cnksbz10aGlzLm1hdGVyaWFsLGE9cy5pbmRleCxsPXMuYXR0cmlidXRlcy5wb3NpdGlvbixjPXMuYXR0cmlidXRlcy51dix1PXMuYXR0cmlidXRlcy51djEsaD1zLmF0dHJpYnV0ZXMubm9ybWFsLGY9cy5ncm91cHMsZD1zLmRyYXdSYW5nZTtpZihhIT09bnVsbClpZihBcnJheS5pc0FycmF5KG8pKWZvcihsZXQgcD0wLHk9Zi5sZW5ndGg7cDx5O3ArKyl7Y29uc3QgbT1mW3BdLGc9b1ttLm1hdGVyaWFsSW5kZXhdLHg9TWF0aC5tYXgobS5zdGFydCxkLnN0YXJ0KSx2PU1hdGgubWluKGEuY291bnQsTWF0aC5taW4obS5zdGFydCttLmNvdW50LGQuc3RhcnQrZC5jb3VudCkpO2ZvcihsZXQgXz14LEU9djtfPEU7Xys9Myl7Y29uc3QgYj1hLmdldFgoXyksVD1hLmdldFgoXysxKSxQPWEuZ2V0WChfKzIpO3I9emwodGhpcyxnLHQsbixjLHUsaCxiLFQsUCksciYmKHIuZmFjZUluZGV4PU1hdGguZmxvb3IoXy8zKSxyLmZhY2UubWF0ZXJpYWxJbmRleD1tLm1hdGVyaWFsSW5kZXgsZS5wdXNoKHIpKX19ZWxzZXtjb25zdCBwPU1hdGgubWF4KDAsZC5zdGFydCkseT1NYXRoLm1pbihhLmNvdW50LGQuc3RhcnQrZC5jb3VudCk7Zm9yKGxldCBtPXAsZz15O208ZzttKz0zKXtjb25zdCB4PWEuZ2V0WChtKSx2PWEuZ2V0WChtKzEpLF89YS5nZXRYKG0rMik7cj16bCh0aGlzLG8sdCxuLGMsdSxoLHgsdixfKSxyJiYoci5mYWNlSW5kZXg9TWF0aC5mbG9vcihtLzMpLGUucHVzaChyKSl9fWVsc2UgaWYobCE9PXZvaWQgMClpZihBcnJheS5pc0FycmF5KG8pKWZvcihsZXQgcD0wLHk9Zi5sZW5ndGg7cDx5O3ArKyl7Y29uc3QgbT1mW3BdLGc9b1ttLm1hdGVyaWFsSW5kZXhdLHg9TWF0aC5tYXgobS5zdGFydCxkLnN0YXJ0KSx2PU1hdGgubWluKGwuY291bnQsTWF0aC5taW4obS5zdGFydCttLmNvdW50LGQuc3RhcnQrZC5jb3VudCkpO2ZvcihsZXQgXz14LEU9djtfPEU7Xys9Myl7Y29uc3QgYj1fLFQ9XysxLFA9XysyO3I9emwodGhpcyxnLHQsbixjLHUsaCxiLFQsUCksciYmKHIuZmFjZUluZGV4PU1hdGguZmxvb3IoXy8zKSxyLmZhY2UubWF0ZXJpYWxJbmRleD1tLm1hdGVyaWFsSW5kZXgsZS5wdXNoKHIpKX19ZWxzZXtjb25zdCBwPU1hdGgubWF4KDAsZC5zdGFydCkseT1NYXRoLm1pbihsLmNvdW50LGQuc3RhcnQrZC5jb3VudCk7Zm9yKGxldCBtPXAsZz15O208ZzttKz0zKXtjb25zdCB4PW0sdj1tKzEsXz1tKzI7cj16bCh0aGlzLG8sdCxuLGMsdSxoLHgsdixfKSxyJiYoci5mYWNlSW5kZXg9TWF0aC5mbG9vcihtLzMpLGUucHVzaChyKSl9fX19ZnVuY3Rpb24gWmIoaSx0LGUsbixyLHMsbyxhKXtsZXQgbDtpZih0LnNpZGU9PT1LZT9sPW4uaW50ZXJzZWN0VHJpYW5nbGUobyxzLHIsITAsYSk6bD1uLmludGVyc2VjdFRyaWFuZ2xlKHIscyxvLHQuc2lkZT09PWhpLGEpLGw9PT1udWxsKXJldHVybiBudWxsO0JsLmNvcHkoYSksQmwuYXBwbHlNYXRyaXg0KGkubWF0cml4V29ybGQpO2NvbnN0IGM9ZS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oQmwpO3JldHVybiBjPGUubmVhcnx8Yz5lLmZhcj9udWxsOntkaXN0YW5jZTpjLHBvaW50OkJsLmNsb25lKCksb2JqZWN0Oml9fWZ1bmN0aW9uIHpsKGksdCxlLG4scixzLG8sYSxsLGMpe2kuZ2V0VmVydGV4UG9zaXRpb24oYSx5cyksaS5nZXRWZXJ0ZXhQb3NpdGlvbihsLHZzKSxpLmdldFZlcnRleFBvc2l0aW9uKGMsX3MpO2NvbnN0IHU9WmIoaSx0LGUsbix5cyx2cyxfcyxPbCk7aWYodSl7ciYmKFVsLmZyb21CdWZmZXJBdHRyaWJ1dGUocixhKSxObC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsbCksRmwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLGMpLHUudXY9U24uZ2V0SW50ZXJwb2xhdGlvbihPbCx5cyx2cyxfcyxVbCxObCxGbCxuZXcgcSkpLHMmJihVbC5mcm9tQnVmZmVyQXR0cmlidXRlKHMsYSksTmwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGwpLEZsLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxjKSx1LnV2MT1Tbi5nZXRJbnRlcnBvbGF0aW9uKE9sLHlzLHZzLF9zLFVsLE5sLEZsLG5ldyBxKSksbyYmKEVnLmZyb21CdWZmZXJBdHRyaWJ1dGUobyxhKSxUZy5mcm9tQnVmZmVyQXR0cmlidXRlKG8sbCksQ2cuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLGMpLHUubm9ybWFsPVNuLmdldEludGVycG9sYXRpb24oT2wseXMsdnMsX3MsRWcsVGcsQ2csbmV3IEwpLHUubm9ybWFsLmRvdChuLmRpcmVjdGlvbik+MCYmdS5ub3JtYWwubXVsdGlwbHlTY2FsYXIoLTEpKTtjb25zdCBoPXthLGI6bCxjLG5vcm1hbDpuZXcgTCxtYXRlcmlhbEluZGV4OjB9O1NuLmdldE5vcm1hbCh5cyx2cyxfcyxoLm5vcm1hbCksdS5mYWNlPWh9cmV0dXJuIHV9Y2xhc3MgTXIgZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxyPTEscz0xLG89MSl7c3VwZXIoKSx0aGlzLnR5cGU9IkJveEdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOnQsaGVpZ2h0OmUsZGVwdGg6bix3aWR0aFNlZ21lbnRzOnIsaGVpZ2h0U2VnbWVudHM6cyxkZXB0aFNlZ21lbnRzOm99O2NvbnN0IGE9dGhpcztyPU1hdGguZmxvb3Iocikscz1NYXRoLmZsb29yKHMpLG89TWF0aC5mbG9vcihvKTtjb25zdCBsPVtdLGM9W10sdT1bXSxoPVtdO2xldCBmPTAsZD0wO3AoInoiLCJ5IiwieCIsLTEsLTEsbixlLHQsbyxzLDApLHAoInoiLCJ5IiwieCIsMSwtMSxuLGUsLXQsbyxzLDEpLHAoIngiLCJ6IiwieSIsMSwxLHQsbixlLHIsbywyKSxwKCJ4IiwieiIsInkiLDEsLTEsdCxuLC1lLHIsbywzKSxwKCJ4IiwieSIsInoiLDEsLTEsdCxlLG4scixzLDQpLHAoIngiLCJ5IiwieiIsLTEsLTEsdCxlLC1uLHIscyw1KSx0aGlzLnNldEluZGV4KGwpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFN0KGMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBTdCh1LDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBTdChoLDIpKTtmdW5jdGlvbiBwKHksbSxnLHgsdixfLEUsYixULFAsdyl7Y29uc3QgTT1fL1QsQT1FL1AsRj1fLzIsRD1FLzIsTj1iLzIsVT1UKzEsQj1QKzE7bGV0IEg9MCxHPTA7Y29uc3QgdHQ9bmV3IEw7Zm9yKGxldCBsdD0wO2x0PEI7bHQrKyl7Y29uc3QgaHQ9bHQqQS1EO2ZvcihsZXQgUnQ9MDtSdDxVO1J0Kyspe2NvbnN0IFZ0PVJ0Kk0tRjt0dFt5XT1WdCp4LHR0W21dPWh0KnYsdHRbZ109TixjLnB1c2godHQueCx0dC55LHR0LnopLHR0W3ldPTAsdHRbbV09MCx0dFtnXT1iPjA/MTotMSx1LnB1c2godHQueCx0dC55LHR0LnopLGgucHVzaChSdC9UKSxoLnB1c2goMS1sdC9QKSxIKz0xfX1mb3IobGV0IGx0PTA7bHQ8UDtsdCsrKWZvcihsZXQgaHQ9MDtodDxUO2h0Kyspe2NvbnN0IFJ0PWYraHQrVSpsdCxWdD1mK2h0K1UqKGx0KzEpLEs9ZisoaHQrMSkrVSoobHQrMSkscnQ9ZisoaHQrMSkrVSpsdDtsLnB1c2goUnQsVnQscnQpLGwucHVzaChWdCxLLHJ0KSxHKz02fWEuYWRkR3JvdXAoZCxHLHcpLGQrPUcsZis9SH19Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgTXIodC53aWR0aCx0LmhlaWdodCx0LmRlcHRoLHQud2lkdGhTZWdtZW50cyx0LmhlaWdodFNlZ21lbnRzLHQuZGVwdGhTZWdtZW50cyl9fWZ1bmN0aW9uIHhzKGkpe2NvbnN0IHQ9e307Zm9yKGNvbnN0IGUgaW4gaSl7dFtlXT17fTtmb3IoY29uc3QgbiBpbiBpW2VdKXtjb25zdCByPWlbZV1bbl07ciYmKHIuaXNDb2xvcnx8ci5pc01hdHJpeDN8fHIuaXNNYXRyaXg0fHxyLmlzVmVjdG9yMnx8ci5pc1ZlY3RvcjN8fHIuaXNWZWN0b3I0fHxyLmlzVGV4dHVyZXx8ci5pc1F1YXRlcm5pb24pP3IuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPyhjb25zb2xlLndhcm4oIlVuaWZvcm1zVXRpbHM6IFRleHR1cmVzIG9mIHJlbmRlciB0YXJnZXRzIGNhbm5vdCBiZSBjbG9uZWQgdmlhIGNsb25lVW5pZm9ybXMoKSBvciBtZXJnZVVuaWZvcm1zKCkuIiksdFtlXVtuXT1udWxsKTp0W2VdW25dPXIuY2xvbmUoKTpBcnJheS5pc0FycmF5KHIpP3RbZV1bbl09ci5zbGljZSgpOnRbZV1bbl09cn19cmV0dXJuIHR9ZnVuY3Rpb24gdG4oaSl7Y29uc3QgdD17fTtmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrKyl7Y29uc3Qgbj14cyhpW2VdKTtmb3IoY29uc3QgciBpbiBuKXRbcl09bltyXX1yZXR1cm4gdH1mdW5jdGlvbiBKYihpKXtjb25zdCB0PVtdO2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKXQucHVzaChpW2VdLmNsb25lKCkpO3JldHVybiB0fWZ1bmN0aW9uIFJnKGkpe2NvbnN0IHQ9aS5nZXRSZW5kZXJUYXJnZXQoKTtyZXR1cm4gdD09PW51bGw/aS5vdXRwdXRDb2xvclNwYWNlOnQuaXNYUlJlbmRlclRhcmdldD09PSEwP3QudGV4dHVyZS5jb2xvclNwYWNlOnNlLndvcmtpbmdDb2xvclNwYWNlfWNvbnN0IFBnPXtjbG9uZTp4cyxtZXJnZTp0bn07dmFyIEtiPWB2b2lkIG1haW4oKSB7CglnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7Cn1gLGpiPWB2b2lkIG1haW4oKSB7CglnbF9GcmFnQ29sb3IgPSB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTsKfWA7Y2xhc3MgR24gZXh0ZW5kcyBYZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNTaGFkZXJNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IlNoYWRlck1hdGVyaWFsIix0aGlzLmRlZmluZXM9e30sdGhpcy51bmlmb3Jtcz17fSx0aGlzLnVuaWZvcm1zR3JvdXBzPVtdLHRoaXMudmVydGV4U2hhZGVyPUtiLHRoaXMuZnJhZ21lbnRTaGFkZXI9amIsdGhpcy5saW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMuZm9nPSExLHRoaXMubGlnaHRzPSExLHRoaXMuY2xpcHBpbmc9ITEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9ITAsdGhpcy5leHRlbnNpb25zPXtjbGlwQ3VsbERpc3RhbmNlOiExLG11bHRpRHJhdzohMX0sdGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzPXtjb2xvcjpbMSwxLDFdLHV2OlswLDBdLHV2MTpbMCwwXX0sdGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lPXZvaWQgMCx0aGlzLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMSx0aGlzLmdsc2xWZXJzaW9uPW51bGwsdCE9PXZvaWQgMCYmdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmZyYWdtZW50U2hhZGVyPXQuZnJhZ21lbnRTaGFkZXIsdGhpcy52ZXJ0ZXhTaGFkZXI9dC52ZXJ0ZXhTaGFkZXIsdGhpcy51bmlmb3Jtcz14cyh0LnVuaWZvcm1zKSx0aGlzLnVuaWZvcm1zR3JvdXBzPUpiKHQudW5pZm9ybXNHcm91cHMpLHRoaXMuZGVmaW5lcz1PYmplY3QuYXNzaWduKHt9LHQuZGVmaW5lcyksdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy5mb2c9dC5mb2csdGhpcy5saWdodHM9dC5saWdodHMsdGhpcy5jbGlwcGluZz10LmNsaXBwaW5nLHRoaXMuZXh0ZW5zaW9ucz1PYmplY3QuYXNzaWduKHt9LHQuZXh0ZW5zaW9ucyksdGhpcy5nbHNsVmVyc2lvbj10Lmdsc2xWZXJzaW9uLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO2UuZ2xzbFZlcnNpb249dGhpcy5nbHNsVmVyc2lvbixlLnVuaWZvcm1zPXt9O2Zvcihjb25zdCByIGluIHRoaXMudW5pZm9ybXMpe2NvbnN0IG89dGhpcy51bmlmb3Jtc1tyXS52YWx1ZTtvJiZvLmlzVGV4dHVyZT9lLnVuaWZvcm1zW3JdPXt0eXBlOiJ0Iix2YWx1ZTpvLnRvSlNPTih0KS51dWlkfTpvJiZvLmlzQ29sb3I/ZS51bmlmb3Jtc1tyXT17dHlwZToiYyIsdmFsdWU6by5nZXRIZXgoKX06byYmby5pc1ZlY3RvcjI/ZS51bmlmb3Jtc1tyXT17dHlwZToidjIiLHZhbHVlOm8udG9BcnJheSgpfTpvJiZvLmlzVmVjdG9yMz9lLnVuaWZvcm1zW3JdPXt0eXBlOiJ2MyIsdmFsdWU6by50b0FycmF5KCl9Om8mJm8uaXNWZWN0b3I0P2UudW5pZm9ybXNbcl09e3R5cGU6InY0Iix2YWx1ZTpvLnRvQXJyYXkoKX06byYmby5pc01hdHJpeDM/ZS51bmlmb3Jtc1tyXT17dHlwZToibTMiLHZhbHVlOm8udG9BcnJheSgpfTpvJiZvLmlzTWF0cml4ND9lLnVuaWZvcm1zW3JdPXt0eXBlOiJtNCIsdmFsdWU6by50b0FycmF5KCl9OmUudW5pZm9ybXNbcl09e3ZhbHVlOm99fU9iamVjdC5rZXlzKHRoaXMuZGVmaW5lcykubGVuZ3RoPjAmJihlLmRlZmluZXM9dGhpcy5kZWZpbmVzKSxlLnZlcnRleFNoYWRlcj10aGlzLnZlcnRleFNoYWRlcixlLmZyYWdtZW50U2hhZGVyPXRoaXMuZnJhZ21lbnRTaGFkZXIsZS5saWdodHM9dGhpcy5saWdodHMsZS5jbGlwcGluZz10aGlzLmNsaXBwaW5nO2NvbnN0IG49e307Zm9yKGNvbnN0IHIgaW4gdGhpcy5leHRlbnNpb25zKXRoaXMuZXh0ZW5zaW9uc1tyXT09PSEwJiYobltyXT0hMCk7cmV0dXJuIE9iamVjdC5rZXlzKG4pLmxlbmd0aD4wJiYoZS5leHRlbnNpb25zPW4pLGV9fWNsYXNzIGtsIGV4dGVuZHMgbmV7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNDYW1lcmE9ITAsdGhpcy50eXBlPSJDYW1lcmEiLHRoaXMubWF0cml4V29ybGRJbnZlcnNlPW5ldyBMdCx0aGlzLnByb2plY3Rpb25NYXRyaXg9bmV3IEx0LHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2U9bmV3IEx0LHRoaXMuY29vcmRpbmF0ZVN5c3RlbT10aX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHQubWF0cml4V29ybGRJbnZlcnNlKSx0aGlzLnByb2plY3Rpb25NYXRyaXguY29weSh0LnByb2plY3Rpb25NYXRyaXgpLHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSh0LnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKSx0aGlzLmNvb3JkaW5hdGVTeXN0ZW09dC5jb29yZGluYXRlU3lzdGVtLHRoaXN9Z2V0V29ybGREaXJlY3Rpb24odCl7cmV0dXJuIHN1cGVyLmdldFdvcmxkRGlyZWN0aW9uKHQpLm5lZ2F0ZSgpfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3N1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9dXBkYXRlV29ybGRNYXRyaXgodCxlKXtzdXBlci51cGRhdGVXb3JsZE1hdHJpeCh0LGUpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jb25zdCBxaT1uZXcgTCxJZz1uZXcgcSxMZz1uZXcgcTtjbGFzcyBrZSBleHRlbmRzIGtse2NvbnN0cnVjdG9yKHQ9NTAsZT0xLG49LjEscj0yZTMpe3N1cGVyKCksdGhpcy5pc1BlcnNwZWN0aXZlQ2FtZXJhPSEwLHRoaXMudHlwZT0iUGVyc3BlY3RpdmVDYW1lcmEiLHRoaXMuZm92PXQsdGhpcy56b29tPTEsdGhpcy5uZWFyPW4sdGhpcy5mYXI9cix0aGlzLmZvY3VzPTEwLHRoaXMuYXNwZWN0PWUsdGhpcy52aWV3PW51bGwsdGhpcy5maWxtR2F1Z2U9MzUsdGhpcy5maWxtT2Zmc2V0PTAsdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5mb3Y9dC5mb3YsdGhpcy56b29tPXQuem9vbSx0aGlzLm5lYXI9dC5uZWFyLHRoaXMuZmFyPXQuZmFyLHRoaXMuZm9jdXM9dC5mb2N1cyx0aGlzLmFzcGVjdD10LmFzcGVjdCx0aGlzLnZpZXc9dC52aWV3PT09bnVsbD9udWxsOk9iamVjdC5hc3NpZ24oe30sdC52aWV3KSx0aGlzLmZpbG1HYXVnZT10LmZpbG1HYXVnZSx0aGlzLmZpbG1PZmZzZXQ9dC5maWxtT2Zmc2V0LHRoaXN9c2V0Rm9jYWxMZW5ndGgodCl7Y29uc3QgZT0uNSp0aGlzLmdldEZpbG1IZWlnaHQoKS90O3RoaXMuZm92PW5zKjIqTWF0aC5hdGFuKGUpLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWdldEZvY2FsTGVuZ3RoKCl7Y29uc3QgdD1NYXRoLnRhbihnciouNSp0aGlzLmZvdik7cmV0dXJuIC41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL3R9Z2V0RWZmZWN0aXZlRk9WKCl7cmV0dXJuIG5zKjIqTWF0aC5hdGFuKE1hdGgudGFuKGdyKi41KnRoaXMuZm92KS90aGlzLnpvb20pfWdldEZpbG1XaWR0aCgpe3JldHVybiB0aGlzLmZpbG1HYXVnZSpNYXRoLm1pbih0aGlzLmFzcGVjdCwxKX1nZXRGaWxtSGVpZ2h0KCl7cmV0dXJuIHRoaXMuZmlsbUdhdWdlL01hdGgubWF4KHRoaXMuYXNwZWN0LDEpfWdldFZpZXdCb3VuZHModCxlLG4pe3FpLnNldCgtMSwtMSwuNSkuYXBwbHlNYXRyaXg0KHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLGUuc2V0KHFpLngscWkueSkubXVsdGlwbHlTY2FsYXIoLXQvcWkueikscWkuc2V0KDEsMSwuNSkuYXBwbHlNYXRyaXg0KHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLG4uc2V0KHFpLngscWkueSkubXVsdGlwbHlTY2FsYXIoLXQvcWkueil9Z2V0Vmlld1NpemUodCxlKXtyZXR1cm4gdGhpcy5nZXRWaWV3Qm91bmRzKHQsSWcsTGcpLGUuc3ViVmVjdG9ycyhMZyxJZyl9c2V0Vmlld09mZnNldCh0LGUsbixyLHMsbyl7dGhpcy5hc3BlY3Q9dC9lLHRoaXMudmlldz09PW51bGwmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pLHRoaXMudmlldy5lbmFibGVkPSEwLHRoaXMudmlldy5mdWxsV2lkdGg9dCx0aGlzLnZpZXcuZnVsbEhlaWdodD1lLHRoaXMudmlldy5vZmZzZXRYPW4sdGhpcy52aWV3Lm9mZnNldFk9cix0aGlzLnZpZXcud2lkdGg9cyx0aGlzLnZpZXcuaGVpZ2h0PW8sdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y2xlYXJWaWV3T2Zmc2V0KCl7dGhpcy52aWV3IT09bnVsbCYmKHRoaXMudmlldy5lbmFibGVkPSExKSx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX11cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl7Y29uc3QgdD10aGlzLm5lYXI7bGV0IGU9dCpNYXRoLnRhbihnciouNSp0aGlzLmZvdikvdGhpcy56b29tLG49MiplLHI9dGhpcy5hc3BlY3QqbixzPS0uNSpyO2NvbnN0IG89dGhpcy52aWV3O2lmKHRoaXMudmlldyE9PW51bGwmJnRoaXMudmlldy5lbmFibGVkKXtjb25zdCBsPW8uZnVsbFdpZHRoLGM9by5mdWxsSGVpZ2h0O3MrPW8ub2Zmc2V0WCpyL2wsZS09by5vZmZzZXRZKm4vYyxyKj1vLndpZHRoL2wsbio9by5oZWlnaHQvY31jb25zdCBhPXRoaXMuZmlsbU9mZnNldDthIT09MCYmKHMrPXQqYS90aGlzLmdldEZpbG1XaWR0aCgpKSx0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKHMscytyLGUsZS1uLHQsdGhpcy5mYXIsdGhpcy5jb29yZGluYXRlU3lzdGVtKSx0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5wcm9qZWN0aW9uTWF0cml4KS5pbnZlcnQoKX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0LmZvdj10aGlzLmZvdixlLm9iamVjdC56b29tPXRoaXMuem9vbSxlLm9iamVjdC5uZWFyPXRoaXMubmVhcixlLm9iamVjdC5mYXI9dGhpcy5mYXIsZS5vYmplY3QuZm9jdXM9dGhpcy5mb2N1cyxlLm9iamVjdC5hc3BlY3Q9dGhpcy5hc3BlY3QsdGhpcy52aWV3IT09bnVsbCYmKGUub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKSxlLm9iamVjdC5maWxtR2F1Z2U9dGhpcy5maWxtR2F1Z2UsZS5vYmplY3QuZmlsbU9mZnNldD10aGlzLmZpbG1PZmZzZXQsZX19Y29uc3QgTXM9LTkwLFNzPTE7Y2xhc3MgRGcgZXh0ZW5kcyBuZXtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIoKSx0aGlzLnR5cGU9IkN1YmVDYW1lcmEiLHRoaXMucmVuZGVyVGFyZ2V0PW4sdGhpcy5jb29yZGluYXRlU3lzdGVtPW51bGwsdGhpcy5hY3RpdmVNaXBtYXBMZXZlbD0wO2NvbnN0IHI9bmV3IGtlKE1zLFNzLHQsZSk7ci5sYXllcnM9dGhpcy5sYXllcnMsdGhpcy5hZGQocik7Y29uc3Qgcz1uZXcga2UoTXMsU3MsdCxlKTtzLmxheWVycz10aGlzLmxheWVycyx0aGlzLmFkZChzKTtjb25zdCBvPW5ldyBrZShNcyxTcyx0LGUpO28ubGF5ZXJzPXRoaXMubGF5ZXJzLHRoaXMuYWRkKG8pO2NvbnN0IGE9bmV3IGtlKE1zLFNzLHQsZSk7YS5sYXllcnM9dGhpcy5sYXllcnMsdGhpcy5hZGQoYSk7Y29uc3QgbD1uZXcga2UoTXMsU3MsdCxlKTtsLmxheWVycz10aGlzLmxheWVycyx0aGlzLmFkZChsKTtjb25zdCBjPW5ldyBrZShNcyxTcyx0LGUpO2MubGF5ZXJzPXRoaXMubGF5ZXJzLHRoaXMuYWRkKGMpfXVwZGF0ZUNvb3JkaW5hdGVTeXN0ZW0oKXtjb25zdCB0PXRoaXMuY29vcmRpbmF0ZVN5c3RlbSxlPXRoaXMuY2hpbGRyZW4uY29uY2F0KCksW24scixzLG8sYSxsXT1lO2Zvcihjb25zdCBjIG9mIGUpdGhpcy5yZW1vdmUoYyk7aWYodD09PXRpKW4udXAuc2V0KDAsMSwwKSxuLmxvb2tBdCgxLDAsMCksci51cC5zZXQoMCwxLDApLHIubG9va0F0KC0xLDAsMCkscy51cC5zZXQoMCwwLC0xKSxzLmxvb2tBdCgwLDEsMCksby51cC5zZXQoMCwwLDEpLG8ubG9va0F0KDAsLTEsMCksYS51cC5zZXQoMCwxLDApLGEubG9va0F0KDAsMCwxKSxsLnVwLnNldCgwLDEsMCksbC5sb29rQXQoMCwwLC0xKTtlbHNlIGlmKHQ9PT1DbyluLnVwLnNldCgwLC0xLDApLG4ubG9va0F0KC0xLDAsMCksci51cC5zZXQoMCwtMSwwKSxyLmxvb2tBdCgxLDAsMCkscy51cC5zZXQoMCwwLDEpLHMubG9va0F0KDAsMSwwKSxvLnVwLnNldCgwLDAsLTEpLG8ubG9va0F0KDAsLTEsMCksYS51cC5zZXQoMCwtMSwwKSxhLmxvb2tBdCgwLDAsMSksbC51cC5zZXQoMCwtMSwwKSxsLmxvb2tBdCgwLDAsLTEpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5DdWJlQ2FtZXJhLnVwZGF0ZUNvb3JkaW5hdGVTeXN0ZW0oKTogSW52YWxpZCBjb29yZGluYXRlIHN5c3RlbTogIit0KTtmb3IoY29uc3QgYyBvZiBlKXRoaXMuYWRkKGMpLGMudXBkYXRlTWF0cml4V29ybGQoKX11cGRhdGUodCxlKXt0aGlzLnBhcmVudD09PW51bGwmJnRoaXMudXBkYXRlTWF0cml4V29ybGQoKTtjb25zdHtyZW5kZXJUYXJnZXQ6bixhY3RpdmVNaXBtYXBMZXZlbDpyfT10aGlzO3RoaXMuY29vcmRpbmF0ZVN5c3RlbSE9PXQuY29vcmRpbmF0ZVN5c3RlbSYmKHRoaXMuY29vcmRpbmF0ZVN5c3RlbT10LmNvb3JkaW5hdGVTeXN0ZW0sdGhpcy51cGRhdGVDb29yZGluYXRlU3lzdGVtKCkpO2NvbnN0W3MsbyxhLGwsYyx1XT10aGlzLmNoaWxkcmVuLGg9dC5nZXRSZW5kZXJUYXJnZXQoKSxmPXQuZ2V0QWN0aXZlQ3ViZUZhY2UoKSxkPXQuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKSxwPXQueHIuZW5hYmxlZDt0LnhyLmVuYWJsZWQ9ITE7Y29uc3QgeT1uLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO24udGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9ITEsdC5zZXRSZW5kZXJUYXJnZXQobiwwLHIpLHQucmVuZGVyKGUscyksdC5zZXRSZW5kZXJUYXJnZXQobiwxLHIpLHQucmVuZGVyKGUsbyksdC5zZXRSZW5kZXJUYXJnZXQobiwyLHIpLHQucmVuZGVyKGUsYSksdC5zZXRSZW5kZXJUYXJnZXQobiwzLHIpLHQucmVuZGVyKGUsbCksdC5zZXRSZW5kZXJUYXJnZXQobiw0LHIpLHQucmVuZGVyKGUsYyksbi50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz15LHQuc2V0UmVuZGVyVGFyZ2V0KG4sNSxyKSx0LnJlbmRlcihlLHUpLHQuc2V0UmVuZGVyVGFyZ2V0KGgsZixkKSx0LnhyLmVuYWJsZWQ9cCxuLnRleHR1cmUubmVlZHNQTVJFTVVwZGF0ZT0hMH19Y2xhc3MgT28gZXh0ZW5kcyBNZXtjb25zdHJ1Y3Rvcih0LGUsbixyLHMsbyxhLGwsYyx1KXt0PXQhPT12b2lkIDA/dDpbXSxlPWUhPT12b2lkIDA/ZTpwaSxzdXBlcih0LGUsbixyLHMsbyxhLGwsYyx1KSx0aGlzLmlzQ3ViZVRleHR1cmU9ITAsdGhpcy5mbGlwWT0hMX1nZXQgaW1hZ2VzKCl7cmV0dXJuIHRoaXMuaW1hZ2V9c2V0IGltYWdlcyh0KXt0aGlzLmltYWdlPXR9fWNsYXNzIFVnIGV4dGVuZHMgT257Y29uc3RydWN0b3IodD0xLGU9e30pe3N1cGVyKHQsdCxlKSx0aGlzLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0PSEwO2NvbnN0IG49e3dpZHRoOnQsaGVpZ2h0OnQsZGVwdGg6MX0scj1bbixuLG4sbixuLG5dO3RoaXMudGV4dHVyZT1uZXcgT28ocixlLm1hcHBpbmcsZS53cmFwUyxlLndyYXBULGUubWFnRmlsdGVyLGUubWluRmlsdGVyLGUuZm9ybWF0LGUudHlwZSxlLmFuaXNvdHJvcHksZS5jb2xvclNwYWNlKSx0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwLHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9ZS5nZW5lcmF0ZU1pcG1hcHMhPT12b2lkIDA/ZS5nZW5lcmF0ZU1pcG1hcHM6ITEsdGhpcy50ZXh0dXJlLm1pbkZpbHRlcj1lLm1pbkZpbHRlciE9PXZvaWQgMD9lLm1pbkZpbHRlcjpSZX1mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZSh0LGUpe3RoaXMudGV4dHVyZS50eXBlPWUudHlwZSx0aGlzLnRleHR1cmUuY29sb3JTcGFjZT1lLmNvbG9yU3BhY2UsdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1lLmdlbmVyYXRlTWlwbWFwcyx0aGlzLnRleHR1cmUubWluRmlsdGVyPWUubWluRmlsdGVyLHRoaXMudGV4dHVyZS5tYWdGaWx0ZXI9ZS5tYWdGaWx0ZXI7Y29uc3Qgbj17dW5pZm9ybXM6e3RFcXVpcmVjdDp7dmFsdWU6bnVsbH19LHZlcnRleFNoYWRlcjpgCgoJCQkJdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKCgkJCQl2ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkgewoKCQkJCQlyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTsKCgkJCQl9CgoJCQkJdm9pZCBtYWluKCkgewoKCQkJCQl2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApOwoKCQkJCQkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJCQkJCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCgkJCQl9CgkJCWAsZnJhZ21lbnRTaGFkZXI6YAoKCQkJCXVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDsKCgkJCQl2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwoKCQkJCSNpbmNsdWRlIDxjb21tb24+CgoJCQkJdm9pZCBtYWluKCkgewoKCQkJCQl2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7CgoJCQkJCXZlYzIgc2FtcGxlVVYgPSBlcXVpcmVjdFV2KCBkaXJlY3Rpb24gKTsKCgkJCQkJZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7CgoJCQkJfQoJCQlgfSxyPW5ldyBNcig1LDUsNSkscz1uZXcgR24oe25hbWU6IkN1YmVtYXBGcm9tRXF1aXJlY3QiLHVuaWZvcm1zOnhzKG4udW5pZm9ybXMpLHZlcnRleFNoYWRlcjpuLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjpuLmZyYWdtZW50U2hhZGVyLHNpZGU6S2UsYmxlbmRpbmc6Zml9KTtzLnVuaWZvcm1zLnRFcXVpcmVjdC52YWx1ZT1lO2NvbnN0IG89bmV3IEllKHIscyksYT1lLm1pbkZpbHRlcjtyZXR1cm4gZS5taW5GaWx0ZXI9PT1qbiYmKGUubWluRmlsdGVyPVJlKSxuZXcgRGcoMSwxMCx0aGlzKS51cGRhdGUodCxvKSxlLm1pbkZpbHRlcj1hLG8uZ2VvbWV0cnkuZGlzcG9zZSgpLG8ubWF0ZXJpYWwuZGlzcG9zZSgpLHRoaXN9Y2xlYXIodCxlLG4scil7Y29uc3Qgcz10LmdldFJlbmRlclRhcmdldCgpO2ZvcihsZXQgbz0wO288NjtvKyspdC5zZXRSZW5kZXJUYXJnZXQodGhpcyxvKSx0LmNsZWFyKGUsbixyKTt0LnNldFJlbmRlclRhcmdldChzKX19Y29uc3QgS2g9bmV3IEwsUWI9bmV3IEwsdDE9bmV3IFh0O2NsYXNzIFlpe2NvbnN0cnVjdG9yKHQ9bmV3IEwoMSwwLDApLGU9MCl7dGhpcy5pc1BsYW5lPSEwLHRoaXMubm9ybWFsPXQsdGhpcy5jb25zdGFudD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLHRoaXMuY29uc3RhbnQ9ZSx0aGlzfXNldENvbXBvbmVudHModCxlLG4scil7cmV0dXJuIHRoaXMubm9ybWFsLnNldCh0LGUsbiksdGhpcy5jb25zdGFudD1yLHRoaXN9c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PS1lLmRvdCh0aGlzLm5vcm1hbCksdGhpc31zZXRGcm9tQ29wbGFuYXJQb2ludHModCxlLG4pe2NvbnN0IHI9S2guc3ViVmVjdG9ycyhuLGUpLmNyb3NzKFFiLnN1YlZlY3RvcnModCxlKSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQocix0KSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodC5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9dC5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IHQ9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIodCksdGhpcy5jb25zdGFudCo9dCx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KHQpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQodC5jZW50ZXIpLXQucmFkaXVzfXByb2plY3RQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLC10aGlzLmRpc3RhbmNlVG9Qb2ludCh0KSl9aW50ZXJzZWN0TGluZSh0LGUpe2NvbnN0IG49dC5kZWx0YShLaCkscj10aGlzLm5vcm1hbC5kb3Qobik7aWYocj09PTApcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpPT09MD9lLmNvcHkodC5zdGFydCk6bnVsbDtjb25zdCBzPS0odC5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL3I7cmV0dXJuIHM8MHx8cz4xP251bGw6ZS5jb3B5KHQuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihuLHMpfWludGVyc2VjdHNMaW5lKHQpe2NvbnN0IGU9dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCksbj10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LmVuZCk7cmV0dXJuIGU8MCYmbj4wfHxuPDAmJmU+MH1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KHQpe3JldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQodCxlKXtjb25zdCBuPWV8fHQxLmdldE5vcm1hbE1hdHJpeCh0KSxyPXRoaXMuY29wbGFuYXJQb2ludChLaCkuYXBwbHlNYXRyaXg0KHQpLHM9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKG4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1yLmRvdChzKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jb25zdGFudC09dC5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZ0LmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNvbnN0IFNyPW5ldyBXZSxHbD1uZXcgTDtjbGFzcyBCb3tjb25zdHJ1Y3Rvcih0PW5ldyBZaSxlPW5ldyBZaSxuPW5ldyBZaSxyPW5ldyBZaSxzPW5ldyBZaSxvPW5ldyBZaSl7dGhpcy5wbGFuZXM9W3QsZSxuLHIscyxvXX1zZXQodCxlLG4scixzLG8pe2NvbnN0IGE9dGhpcy5wbGFuZXM7cmV0dXJuIGFbMF0uY29weSh0KSxhWzFdLmNvcHkoZSksYVsyXS5jb3B5KG4pLGFbM10uY29weShyKSxhWzRdLmNvcHkocyksYVs1XS5jb3B5KG8pLHRoaXN9Y29weSh0KXtjb25zdCBlPXRoaXMucGxhbmVzO2ZvcihsZXQgbj0wO248NjtuKyspZVtuXS5jb3B5KHQucGxhbmVzW25dKTtyZXR1cm4gdGhpc31zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCh0LGU9dGkpe2NvbnN0IG49dGhpcy5wbGFuZXMscj10LmVsZW1lbnRzLHM9clswXSxvPXJbMV0sYT1yWzJdLGw9clszXSxjPXJbNF0sdT1yWzVdLGg9cls2XSxmPXJbN10sZD1yWzhdLHA9cls5XSx5PXJbMTBdLG09clsxMV0sZz1yWzEyXSx4PXJbMTNdLHY9clsxNF0sXz1yWzE1XTtpZihuWzBdLnNldENvbXBvbmVudHMobC1zLGYtYyxtLWQsXy1nKS5ub3JtYWxpemUoKSxuWzFdLnNldENvbXBvbmVudHMobCtzLGYrYyxtK2QsXytnKS5ub3JtYWxpemUoKSxuWzJdLnNldENvbXBvbmVudHMobCtvLGYrdSxtK3AsXyt4KS5ub3JtYWxpemUoKSxuWzNdLnNldENvbXBvbmVudHMobC1vLGYtdSxtLXAsXy14KS5ub3JtYWxpemUoKSxuWzRdLnNldENvbXBvbmVudHMobC1hLGYtaCxtLXksXy12KS5ub3JtYWxpemUoKSxlPT09dGkpbls1XS5zZXRDb21wb25lbnRzKGwrYSxmK2gsbSt5LF8rdikubm9ybWFsaXplKCk7ZWxzZSBpZihlPT09Q28pbls1XS5zZXRDb21wb25lbnRzKGEsaCx5LHYpLm5vcm1hbGl6ZSgpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5GcnVzdHVtLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrZSk7cmV0dXJuIHRoaXN9aW50ZXJzZWN0c09iamVjdCh0KXtpZih0LmJvdW5kaW5nU3BoZXJlIT09dm9pZCAwKXQuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZ0LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLFNyLmNvcHkodC5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpO2Vsc2V7Y29uc3QgZT10Lmdlb21ldHJ5O2UuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZlLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLFNyLmNvcHkoZS5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpfXJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoU3IpfWludGVyc2VjdHNTcHJpdGUodCl7cmV0dXJuIFNyLmNlbnRlci5zZXQoMCwwLDApLFNyLnJhZGl1cz0uNzA3MTA2NzgxMTg2NTQ3NixTci5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy5pbnRlcnNlY3RzU3BoZXJlKFNyKX1pbnRlcnNlY3RzU3BoZXJlKHQpe2NvbnN0IGU9dGhpcy5wbGFuZXMsbj10LmNlbnRlcixyPS10LnJhZGl1cztmb3IobGV0IHM9MDtzPDY7cysrKWlmKGVbc10uZGlzdGFuY2VUb1BvaW50KG4pPHIpcmV0dXJuITE7cmV0dXJuITB9aW50ZXJzZWN0c0JveCh0KXtjb25zdCBlPXRoaXMucGxhbmVzO2ZvcihsZXQgbj0wO248NjtuKyspe2NvbnN0IHI9ZVtuXTtpZihHbC54PXIubm9ybWFsLng+MD90Lm1heC54OnQubWluLngsR2wueT1yLm5vcm1hbC55PjA/dC5tYXgueTp0Lm1pbi55LEdsLno9ci5ub3JtYWwuej4wP3QubWF4Lno6dC5taW4ueixyLmRpc3RhbmNlVG9Qb2ludChHbCk8MClyZXR1cm4hMX1yZXR1cm4hMH1jb250YWluc1BvaW50KHQpe2NvbnN0IGU9dGhpcy5wbGFuZXM7Zm9yKGxldCBuPTA7bjw2O24rKylpZihlW25dLmRpc3RhbmNlVG9Qb2ludCh0KTwwKXJldHVybiExO3JldHVybiEwfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19ZnVuY3Rpb24gTmcoKXtsZXQgaT1udWxsLHQ9ITEsZT1udWxsLG49bnVsbDtmdW5jdGlvbiByKHMsbyl7ZShzLG8pLG49aS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocil9cmV0dXJue3N0YXJ0OmZ1bmN0aW9uKCl7dCE9PSEwJiZlIT09bnVsbCYmKG49aS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUociksdD0hMCl9LHN0b3A6ZnVuY3Rpb24oKXtpLmNhbmNlbEFuaW1hdGlvbkZyYW1lKG4pLHQ9ITF9LHNldEFuaW1hdGlvbkxvb3A6ZnVuY3Rpb24ocyl7ZT1zfSxzZXRDb250ZXh0OmZ1bmN0aW9uKHMpe2k9c319fWZ1bmN0aW9uIGUxKGkpe2NvbnN0IHQ9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gZShhLGwpe2NvbnN0IGM9YS5hcnJheSx1PWEudXNhZ2UsaD1jLmJ5dGVMZW5ndGgsZj1pLmNyZWF0ZUJ1ZmZlcigpO2kuYmluZEJ1ZmZlcihsLGYpLGkuYnVmZmVyRGF0YShsLGMsdSksYS5vblVwbG9hZENhbGxiYWNrKCk7bGV0IGQ7aWYoYyBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSlkPWkuRkxPQVQ7ZWxzZSBpZihjIGluc3RhbmNlb2YgVWludDE2QXJyYXkpYS5pc0Zsb2F0MTZCdWZmZXJBdHRyaWJ1dGU/ZD1pLkhBTEZfRkxPQVQ6ZD1pLlVOU0lHTkVEX1NIT1JUO2Vsc2UgaWYoYyBpbnN0YW5jZW9mIEludDE2QXJyYXkpZD1pLlNIT1JUO2Vsc2UgaWYoYyBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KWQ9aS5VTlNJR05FRF9JTlQ7ZWxzZSBpZihjIGluc3RhbmNlb2YgSW50MzJBcnJheSlkPWkuSU5UO2Vsc2UgaWYoYyBpbnN0YW5jZW9mIEludDhBcnJheSlkPWkuQllURTtlbHNlIGlmKGMgaW5zdGFuY2VvZiBVaW50OEFycmF5KWQ9aS5VTlNJR05FRF9CWVRFO2Vsc2UgaWYoYyBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KWQ9aS5VTlNJR05FRF9CWVRFO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTEF0dHJpYnV0ZXM6IFVuc3VwcG9ydGVkIGJ1ZmZlciBkYXRhIGZvcm1hdDogIitjKTtyZXR1cm57YnVmZmVyOmYsdHlwZTpkLGJ5dGVzUGVyRWxlbWVudDpjLkJZVEVTX1BFUl9FTEVNRU5ULHZlcnNpb246YS52ZXJzaW9uLHNpemU6aH19ZnVuY3Rpb24gbihhLGwsYyl7Y29uc3QgdT1sLmFycmF5LGg9bC5fdXBkYXRlUmFuZ2UsZj1sLnVwZGF0ZVJhbmdlcztpZihpLmJpbmRCdWZmZXIoYyxhKSxoLmNvdW50PT09LTEmJmYubGVuZ3RoPT09MCYmaS5idWZmZXJTdWJEYXRhKGMsMCx1KSxmLmxlbmd0aCE9PTApe2ZvcihsZXQgZD0wLHA9Zi5sZW5ndGg7ZDxwO2QrKyl7Y29uc3QgeT1mW2RdO2kuYnVmZmVyU3ViRGF0YShjLHkuc3RhcnQqdS5CWVRFU19QRVJfRUxFTUVOVCx1LHkuc3RhcnQseS5jb3VudCl9bC5jbGVhclVwZGF0ZVJhbmdlcygpfWguY291bnQhPT0tMSYmKGkuYnVmZmVyU3ViRGF0YShjLGgub2Zmc2V0KnUuQllURVNfUEVSX0VMRU1FTlQsdSxoLm9mZnNldCxoLmNvdW50KSxoLmNvdW50PS0xKSxsLm9uVXBsb2FkQ2FsbGJhY2soKX1mdW5jdGlvbiByKGEpe3JldHVybiBhLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihhPWEuZGF0YSksdC5nZXQoYSl9ZnVuY3Rpb24gcyhhKXthLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihhPWEuZGF0YSk7Y29uc3QgbD10LmdldChhKTtsJiYoaS5kZWxldGVCdWZmZXIobC5idWZmZXIpLHQuZGVsZXRlKGEpKX1mdW5jdGlvbiBvKGEsbCl7aWYoYS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYoYT1hLmRhdGEpLGEuaXNHTEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc3QgdT10LmdldChhKTsoIXV8fHUudmVyc2lvbjxhLnZlcnNpb24pJiZ0LnNldChhLHtidWZmZXI6YS5idWZmZXIsdHlwZTphLnR5cGUsYnl0ZXNQZXJFbGVtZW50OmEuZWxlbWVudFNpemUsdmVyc2lvbjphLnZlcnNpb259KTtyZXR1cm59Y29uc3QgYz10LmdldChhKTtpZihjPT09dm9pZCAwKXQuc2V0KGEsZShhLGwpKTtlbHNlIGlmKGMudmVyc2lvbjxhLnZlcnNpb24pe2lmKGMuc2l6ZSE9PWEuYXJyYXkuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLldlYkdMQXR0cmlidXRlczogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBhdHRyaWJ1dGUncyBhcnJheSBidWZmZXIgZG9lcyBub3QgbWF0Y2ggdGhlIG9yaWdpbmFsIHNpemUuIFJlc2l6aW5nIGJ1ZmZlciBhdHRyaWJ1dGVzIGlzIG5vdCBzdXBwb3J0ZWQuIik7bihjLmJ1ZmZlcixhLGwpLGMudmVyc2lvbj1hLnZlcnNpb259fXJldHVybntnZXQ6cixyZW1vdmU6cyx1cGRhdGU6b319Y2xhc3MgYnMgZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxyPTEpe3N1cGVyKCksdGhpcy50eXBlPSJQbGFuZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOnQsaGVpZ2h0OmUsd2lkdGhTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOnJ9O2NvbnN0IHM9dC8yLG89ZS8yLGE9TWF0aC5mbG9vcihuKSxsPU1hdGguZmxvb3IociksYz1hKzEsdT1sKzEsaD10L2EsZj1lL2wsZD1bXSxwPVtdLHk9W10sbT1bXTtmb3IobGV0IGc9MDtnPHU7ZysrKXtjb25zdCB4PWcqZi1vO2ZvcihsZXQgdj0wO3Y8Yzt2Kyspe2NvbnN0IF89dipoLXM7cC5wdXNoKF8sLXgsMCkseS5wdXNoKDAsMCwxKSxtLnB1c2godi9hKSxtLnB1c2goMS1nL2wpfX1mb3IobGV0IGc9MDtnPGw7ZysrKWZvcihsZXQgeD0wO3g8YTt4Kyspe2NvbnN0IHY9eCtjKmcsXz14K2MqKGcrMSksRT14KzErYyooZysxKSxiPXgrMStjKmc7ZC5wdXNoKHYsXyxiKSxkLnB1c2goXyxFLGIpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU3QocCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFN0KHksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFN0KG0sMikpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IGJzKHQud2lkdGgsdC5oZWlnaHQsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMpfX12YXIgbjE9YCNpZmRlZiBVU0VfQUxQSEFIQVNICglpZiAoIGRpZmZ1c2VDb2xvci5hIDwgZ2V0QWxwaGFIYXNoVGhyZXNob2xkKCB2UG9zaXRpb24gKSApIGRpc2NhcmQ7CiNlbmRpZmAsaTE9YCNpZmRlZiBVU0VfQUxQSEFIQVNICgljb25zdCBmbG9hdCBBTFBIQV9IQVNIX1NDQUxFID0gMC4wNTsKCWZsb2F0IGhhc2gyRCggdmVjMiB2YWx1ZSApIHsKCQlyZXR1cm4gZnJhY3QoIDEuMGU0ICogc2luKCAxNy4wICogdmFsdWUueCArIDAuMSAqIHZhbHVlLnkgKSAqICggMC4xICsgYWJzKCBzaW4oIDEzLjAgKiB2YWx1ZS55ICsgdmFsdWUueCApICkgKSApOwoJfQoJZmxvYXQgaGFzaDNEKCB2ZWMzIHZhbHVlICkgewoJCXJldHVybiBoYXNoMkQoIHZlYzIoIGhhc2gyRCggdmFsdWUueHkgKSwgdmFsdWUueiApICk7Cgl9CglmbG9hdCBnZXRBbHBoYUhhc2hUaHJlc2hvbGQoIHZlYzMgcG9zaXRpb24gKSB7CgkJZmxvYXQgbWF4RGVyaXYgPSBtYXgoCgkJCWxlbmd0aCggZEZkeCggcG9zaXRpb24ueHl6ICkgKSwKCQkJbGVuZ3RoKCBkRmR5KCBwb3NpdGlvbi54eXogKSApCgkJKTsKCQlmbG9hdCBwaXhTY2FsZSA9IDEuMCAvICggQUxQSEFfSEFTSF9TQ0FMRSAqIG1heERlcml2ICk7CgkJdmVjMiBwaXhTY2FsZXMgPSB2ZWMyKAoJCQlleHAyKCBmbG9vciggbG9nMiggcGl4U2NhbGUgKSApICksCgkJCWV4cDIoIGNlaWwoIGxvZzIoIHBpeFNjYWxlICkgKSApCgkJKTsKCQl2ZWMyIGFscGhhID0gdmVjMigKCQkJaGFzaDNEKCBmbG9vciggcGl4U2NhbGVzLnggKiBwb3NpdGlvbi54eXogKSApLAoJCQloYXNoM0QoIGZsb29yKCBwaXhTY2FsZXMueSAqIHBvc2l0aW9uLnh5eiApICkKCQkpOwoJCWZsb2F0IGxlcnBGYWN0b3IgPSBmcmFjdCggbG9nMiggcGl4U2NhbGUgKSApOwoJCWZsb2F0IHggPSAoIDEuMCAtIGxlcnBGYWN0b3IgKSAqIGFscGhhLnggKyBsZXJwRmFjdG9yICogYWxwaGEueTsKCQlmbG9hdCBhID0gbWluKCBsZXJwRmFjdG9yLCAxLjAgLSBsZXJwRmFjdG9yICk7CgkJdmVjMyBjYXNlcyA9IHZlYzMoCgkJCXggKiB4IC8gKCAyLjAgKiBhICogKCAxLjAgLSBhICkgKSwKCQkJKCB4IC0gMC41ICogYSApIC8gKCAxLjAgLSBhICksCgkJCTEuMCAtICggKCAxLjAgLSB4ICkgKiAoIDEuMCAtIHggKSAvICggMi4wICogYSAqICggMS4wIC0gYSApICkgKQoJCSk7CgkJZmxvYXQgdGhyZXNob2xkID0gKCB4IDwgKCAxLjAgLSBhICkgKQoJCQk/ICggKCB4IDwgYSApID8gY2FzZXMueCA6IGNhc2VzLnkgKQoJCQk6IGNhc2VzLno7CgkJcmV0dXJuIGNsYW1wKCB0aHJlc2hvbGQgLCAxLjBlLTYsIDEuMCApOwoJfQojZW5kaWZgLHIxPWAjaWZkZWYgVVNFX0FMUEhBTUFQCglkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2QWxwaGFNYXBVdiApLmc7CiNlbmRpZmAsczE9YCNpZmRlZiBVU0VfQUxQSEFNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwOwojZW5kaWZgLG8xPWAjaWZkZWYgVVNFX0FMUEhBVEVTVAoJI2lmZGVmIEFMUEhBX1RPX0NPVkVSQUdFCglkaWZmdXNlQ29sb3IuYSA9IHNtb290aHN0ZXAoIGFscGhhVGVzdCwgYWxwaGFUZXN0ICsgZndpZHRoKCBkaWZmdXNlQ29sb3IuYSApLCBkaWZmdXNlQ29sb3IuYSApOwoJaWYgKCBkaWZmdXNlQ29sb3IuYSA9PSAwLjAgKSBkaXNjYXJkOwoJI2Vsc2UKCWlmICggZGlmZnVzZUNvbG9yLmEgPCBhbHBoYVRlc3QgKSBkaXNjYXJkOwoJI2VuZGlmCiNlbmRpZmAsYTE9YCNpZmRlZiBVU0VfQUxQSEFURVNUCgl1bmlmb3JtIGZsb2F0IGFscGhhVGVzdDsKI2VuZGlmYCxsMT1gI2lmZGVmIFVTRV9BT01BUAoJZmxvYXQgYW1iaWVudE9jY2x1c2lvbiA9ICggdGV4dHVyZTJEKCBhb01hcCwgdkFvTWFwVXYgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBhbWJpZW50T2NjbHVzaW9uOwoJI2lmIGRlZmluZWQoIFVTRV9DTEVBUkNPQVQgKSAKCQljbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0ICo9IGFtYmllbnRPY2NsdXNpb247CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKSAKCQlzaGVlblNwZWN1bGFySW5kaXJlY3QgKj0gYW1iaWVudE9jY2x1c2lvbjsKCSNlbmRpZgoJI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBTVEFOREFSRCApCgkJZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyICkgKTsKCQlyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICo9IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnJvdWdobmVzcyApOwoJI2VuZGlmCiNlbmRpZmAsYzE9YCNpZmRlZiBVU0VfQU9NQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGFvTWFwOwoJdW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTsKI2VuZGlmYCx1MT1gI2lmZGVmIFVTRV9CQVRDSElORwoJI2lmICEgZGVmaW5lZCggR0xfQU5HTEVfbXVsdGlfZHJhdyApCgkjZGVmaW5lIGdsX0RyYXdJRCBfZ2xfRHJhd0lECgl1bmlmb3JtIGludCBfZ2xfRHJhd0lEOwoJI2VuZGlmCgl1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBiYXRjaGluZ1RleHR1cmU7Cgl1bmlmb3JtIGhpZ2hwIHVzYW1wbGVyMkQgYmF0Y2hpbmdJZFRleHR1cmU7CgltYXQ0IGdldEJhdGNoaW5nTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nVGV4dHVyZSwgMCApLng7CgkJaW50IGogPSBpbnQoIGkgKSAqIDQ7CgkJaW50IHggPSBqICUgc2l6ZTsKCQlpbnQgeSA9IGogLyBzaXplOwoJCXZlYzQgdjEgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4LCB5ICksIDAgKTsKCQl2ZWM0IHYyID0gdGV4ZWxGZXRjaCggYmF0Y2hpbmdUZXh0dXJlLCBpdmVjMiggeCArIDEsIHkgKSwgMCApOwoJCXZlYzQgdjMgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4ICsgMiwgeSApLCAwICk7CgkJdmVjNCB2NCA9IHRleGVsRmV0Y2goIGJhdGNoaW5nVGV4dHVyZSwgaXZlYzIoIHggKyAzLCB5ICksIDAgKTsKCQlyZXR1cm4gbWF0NCggdjEsIHYyLCB2MywgdjQgKTsKCX0KCWZsb2F0IGdldEluZGlyZWN0SW5kZXgoIGNvbnN0IGluIGludCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nSWRUZXh0dXJlLCAwICkueDsKCQlpbnQgeCA9IGkgJSBzaXplOwoJCWludCB5ID0gaSAvIHNpemU7CgkJcmV0dXJuIGZsb2F0KCB0ZXhlbEZldGNoKCBiYXRjaGluZ0lkVGV4dHVyZSwgaXZlYzIoIHgsIHkgKSwgMCApLnIgKTsKCX0KI2VuZGlmCiNpZmRlZiBVU0VfQkFUQ0hJTkdfQ09MT1IKCXVuaWZvcm0gc2FtcGxlcjJEIGJhdGNoaW5nQ29sb3JUZXh0dXJlOwoJdmVjMyBnZXRCYXRjaGluZ0NvbG9yKCBjb25zdCBpbiBmbG9hdCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nQ29sb3JUZXh0dXJlLCAwICkueDsKCQlpbnQgaiA9IGludCggaSApOwoJCWludCB4ID0gaiAlIHNpemU7CgkJaW50IHkgPSBqIC8gc2l6ZTsKCQlyZXR1cm4gdGV4ZWxGZXRjaCggYmF0Y2hpbmdDb2xvclRleHR1cmUsIGl2ZWMyKCB4LCB5ICksIDAgKS5yZ2I7Cgl9CiNlbmRpZmAsaDE9YCNpZmRlZiBVU0VfQkFUQ0hJTkcKCW1hdDQgYmF0Y2hpbmdNYXRyaXggPSBnZXRCYXRjaGluZ01hdHJpeCggZ2V0SW5kaXJlY3RJbmRleCggZ2xfRHJhd0lEICkgKTsKI2VuZGlmYCxmMT1gdmVjMyB0cmFuc2Zvcm1lZCA9IHZlYzMoIHBvc2l0aW9uICk7CiNpZmRlZiBVU0VfQUxQSEFIQVNICgl2UG9zaXRpb24gPSB2ZWMzKCBwb3NpdGlvbiApOwojZW5kaWZgLGQxPWB2ZWMzIG9iamVjdE5vcm1hbCA9IHZlYzMoIG5vcm1hbCApOwojaWZkZWYgVVNFX1RBTkdFTlQKCXZlYzMgb2JqZWN0VGFuZ2VudCA9IHZlYzMoIHRhbmdlbnQueHl6ICk7CiNlbmRpZmAscDE9YGZsb2F0IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKSB7CglyZXR1cm4gMC4yNTsKfQpmbG9hdCBEX0JsaW5uUGhvbmcoIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7CglyZXR1cm4gUkVDSVBST0NBTF9QSSAqICggc2hpbmluZXNzICogMC41ICsgMS4wICkgKiBwb3coIGRvdE5ILCBzaGluaW5lc3MgKTsKfQp2ZWMzIEJSREZfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVjMyBsaWdodERpciwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7Cgl2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGxpZ2h0RGlyICsgdmlld0RpciApOwoJZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApOwoJZmxvYXQgZG90VkggPSBzYXR1cmF0ZSggZG90KCB2aWV3RGlyLCBoYWxmRGlyICkgKTsKCXZlYzMgRiA9IEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgMS4wLCBkb3RWSCApOwoJZmxvYXQgRyA9IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKTsKCWZsb2F0IEQgPSBEX0JsaW5uUGhvbmcoIHNoaW5pbmVzcywgZG90TkggKTsKCXJldHVybiBGICogKCBHICogRCApOwp9IC8vIHZhbGlkYXRlZGAsbTE9YCNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCWNvbnN0IG1hdDMgWFlaX1RPX1JFQzcwOSA9IG1hdDMoCgkJIDMuMjQwNDU0MiwgLTAuOTY5MjY2MCwgIDAuMDU1NjQzNCwKCQktMS41MzcxMzg1LCAgMS44NzYwMTA4LCAtMC4yMDQwMjU5LAoJCS0wLjQ5ODUzMTQsICAwLjA0MTU1NjAsICAxLjA1NzIyNTIKCSk7Cgl2ZWMzIEZyZXNuZWwwVG9Jb3IoIHZlYzMgZnJlc25lbDAgKSB7CgkJdmVjMyBzcXJ0RjAgPSBzcXJ0KCBmcmVzbmVsMCApOwoJCXJldHVybiAoIHZlYzMoIDEuMCApICsgc3FydEYwICkgLyAoIHZlYzMoIDEuMCApIC0gc3FydEYwICk7Cgl9Cgl2ZWMzIElvclRvRnJlc25lbDAoIHZlYzMgdHJhbnNtaXR0ZWRJb3IsIGZsb2F0IGluY2lkZW50SW9yICkgewoJCXJldHVybiBwb3cyKCAoIHRyYW5zbWl0dGVkSW9yIC0gdmVjMyggaW5jaWRlbnRJb3IgKSApIC8gKCB0cmFuc21pdHRlZElvciArIHZlYzMoIGluY2lkZW50SW9yICkgKSApOwoJfQoJZmxvYXQgSW9yVG9GcmVzbmVsMCggZmxvYXQgdHJhbnNtaXR0ZWRJb3IsIGZsb2F0IGluY2lkZW50SW9yICkgewoJCXJldHVybiBwb3cyKCAoIHRyYW5zbWl0dGVkSW9yIC0gaW5jaWRlbnRJb3IgKSAvICggdHJhbnNtaXR0ZWRJb3IgKyBpbmNpZGVudElvciApKTsKCX0KCXZlYzMgZXZhbFNlbnNpdGl2aXR5KCBmbG9hdCBPUEQsIHZlYzMgc2hpZnQgKSB7CgkJZmxvYXQgcGhhc2UgPSAyLjAgKiBQSSAqIE9QRCAqIDEuMGUtOTsKCQl2ZWMzIHZhbCA9IHZlYzMoIDUuNDg1NmUtMTMsIDQuNDIwMWUtMTMsIDUuMjQ4MWUtMTMgKTsKCQl2ZWMzIHBvcyA9IHZlYzMoIDEuNjgxMGUrMDYsIDEuNzk1M2UrMDYsIDIuMjA4NGUrMDYgKTsKCQl2ZWMzIHZhciA9IHZlYzMoIDQuMzI3OGUrMDksIDkuMzA0NmUrMDksIDYuNjEyMWUrMDkgKTsKCQl2ZWMzIHh5eiA9IHZhbCAqIHNxcnQoIDIuMCAqIFBJICogdmFyICkgKiBjb3MoIHBvcyAqIHBoYXNlICsgc2hpZnQgKSAqIGV4cCggLSBwb3cyKCBwaGFzZSApICogdmFyICk7CgkJeHl6LnggKz0gOS43NDcwZS0xNCAqIHNxcnQoIDIuMCAqIFBJICogNC41MjgyZSswOSApICogY29zKCAyLjIzOTllKzA2ICogcGhhc2UgKyBzaGlmdFsgMCBdICkgKiBleHAoIC0gNC41MjgyZSswOSAqIHBvdzIoIHBoYXNlICkgKTsKCQl4eXogLz0gMS4wNjg1ZS03OwoJCXZlYzMgcmdiID0gWFlaX1RPX1JFQzcwOSAqIHh5ejsKCQlyZXR1cm4gcmdiOwoJfQoJdmVjMyBldmFsSXJpZGVzY2VuY2UoIGZsb2F0IG91dHNpZGVJT1IsIGZsb2F0IGV0YTIsIGZsb2F0IGNvc1RoZXRhMSwgZmxvYXQgdGhpbkZpbG1UaGlja25lc3MsIHZlYzMgYmFzZUYwICkgewoJCXZlYzMgSTsKCQlmbG9hdCBpcmlkZXNjZW5jZUlPUiA9IG1peCggb3V0c2lkZUlPUiwgZXRhMiwgc21vb3Roc3RlcCggMC4wLCAwLjAzLCB0aGluRmlsbVRoaWNrbmVzcyApICk7CgkJZmxvYXQgc2luVGhldGEyU3EgPSBwb3cyKCBvdXRzaWRlSU9SIC8gaXJpZGVzY2VuY2VJT1IgKSAqICggMS4wIC0gcG93MiggY29zVGhldGExICkgKTsKCQlmbG9hdCBjb3NUaGV0YTJTcSA9IDEuMCAtIHNpblRoZXRhMlNxOwoJCWlmICggY29zVGhldGEyU3EgPCAwLjAgKSB7CgkJCXJldHVybiB2ZWMzKCAxLjAgKTsKCQl9CgkJZmxvYXQgY29zVGhldGEyID0gc3FydCggY29zVGhldGEyU3EgKTsKCQlmbG9hdCBSMCA9IElvclRvRnJlc25lbDAoIGlyaWRlc2NlbmNlSU9SLCBvdXRzaWRlSU9SICk7CgkJZmxvYXQgUjEyID0gRl9TY2hsaWNrKCBSMCwgMS4wLCBjb3NUaGV0YTEgKTsKCQlmbG9hdCBUMTIxID0gMS4wIC0gUjEyOwoJCWZsb2F0IHBoaTEyID0gMC4wOwoJCWlmICggaXJpZGVzY2VuY2VJT1IgPCBvdXRzaWRlSU9SICkgcGhpMTIgPSBQSTsKCQlmbG9hdCBwaGkyMSA9IFBJIC0gcGhpMTI7CgkJdmVjMyBiYXNlSU9SID0gRnJlc25lbDBUb0lvciggY2xhbXAoIGJhc2VGMCwgMC4wLCAwLjk5OTkgKSApOwkJdmVjMyBSMSA9IElvclRvRnJlc25lbDAoIGJhc2VJT1IsIGlyaWRlc2NlbmNlSU9SICk7CgkJdmVjMyBSMjMgPSBGX1NjaGxpY2soIFIxLCAxLjAsIGNvc1RoZXRhMiApOwoJCXZlYzMgcGhpMjMgPSB2ZWMzKCAwLjAgKTsKCQlpZiAoIGJhc2VJT1JbIDAgXSA8IGlyaWRlc2NlbmNlSU9SICkgcGhpMjNbIDAgXSA9IFBJOwoJCWlmICggYmFzZUlPUlsgMSBdIDwgaXJpZGVzY2VuY2VJT1IgKSBwaGkyM1sgMSBdID0gUEk7CgkJaWYgKCBiYXNlSU9SWyAyIF0gPCBpcmlkZXNjZW5jZUlPUiApIHBoaTIzWyAyIF0gPSBQSTsKCQlmbG9hdCBPUEQgPSAyLjAgKiBpcmlkZXNjZW5jZUlPUiAqIHRoaW5GaWxtVGhpY2tuZXNzICogY29zVGhldGEyOwoJCXZlYzMgcGhpID0gdmVjMyggcGhpMjEgKSArIHBoaTIzOwoJCXZlYzMgUjEyMyA9IGNsYW1wKCBSMTIgKiBSMjMsIDFlLTUsIDAuOTk5OSApOwoJCXZlYzMgcjEyMyA9IHNxcnQoIFIxMjMgKTsKCQl2ZWMzIFJzID0gcG93MiggVDEyMSApICogUjIzIC8gKCB2ZWMzKCAxLjAgKSAtIFIxMjMgKTsKCQl2ZWMzIEMwID0gUjEyICsgUnM7CgkJSSA9IEMwOwoJCXZlYzMgQ20gPSBScyAtIFQxMjE7CgkJZm9yICggaW50IG0gPSAxOyBtIDw9IDI7ICsrIG0gKSB7CgkJCUNtICo9IHIxMjM7CgkJCXZlYzMgU20gPSAyLjAgKiBldmFsU2Vuc2l0aXZpdHkoIGZsb2F0KCBtICkgKiBPUEQsIGZsb2F0KCBtICkgKiBwaGkgKTsKCQkJSSArPSBDbSAqIFNtOwoJCX0KCQlyZXR1cm4gbWF4KCBJLCB2ZWMzKCAwLjAgKSApOwoJfQojZW5kaWZgLGcxPWAjaWZkZWYgVVNFX0JVTVBNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGJ1bXBNYXA7Cgl1bmlmb3JtIGZsb2F0IGJ1bXBTY2FsZTsKCXZlYzIgZEhkeHlfZndkKCkgewoJCXZlYzIgZFNUZHggPSBkRmR4KCB2QnVtcE1hcFV2ICk7CgkJdmVjMiBkU1RkeSA9IGRGZHkoIHZCdW1wTWFwVXYgKTsKCQlmbG9hdCBIbGwgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZCdW1wTWFwVXYgKS54OwoJCWZsb2F0IGRCeCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdkJ1bXBNYXBVdiArIGRTVGR4ICkueCAtIEhsbDsKCQlmbG9hdCBkQnkgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZCdW1wTWFwVXYgKyBkU1RkeSApLnggLSBIbGw7CgkJcmV0dXJuIHZlYzIoIGRCeCwgZEJ5ICk7Cgl9Cgl2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZlYzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5LCBmbG9hdCBmYWNlRGlyZWN0aW9uICkgewoJCXZlYzMgdlNpZ21hWCA9IG5vcm1hbGl6ZSggZEZkeCggc3VyZl9wb3MueHl6ICkgKTsKCQl2ZWMzIHZTaWdtYVkgPSBub3JtYWxpemUoIGRGZHkoIHN1cmZfcG9zLnh5eiApICk7CgkJdmVjMyB2TiA9IHN1cmZfbm9ybTsKCQl2ZWMzIFIxID0gY3Jvc3MoIHZTaWdtYVksIHZOICk7CgkJdmVjMyBSMiA9IGNyb3NzKCB2TiwgdlNpZ21hWCApOwoJCWZsb2F0IGZEZXQgPSBkb3QoIHZTaWdtYVgsIFIxICkgKiBmYWNlRGlyZWN0aW9uOwoJCXZlYzMgdkdyYWQgPSBzaWduKCBmRGV0ICkgKiAoIGRIZHh5LnggKiBSMSArIGRIZHh5LnkgKiBSMiApOwoJCXJldHVybiBub3JtYWxpemUoIGFicyggZkRldCApICogc3VyZl9ub3JtIC0gdkdyYWQgKTsKCX0KI2VuZGlmYCx5MT1gI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwCgl2ZWM0IHBsYW5lOwoJI2lmZGVmIEFMUEhBX1RPX0NPVkVSQUdFCgkJZmxvYXQgZGlzdGFuY2VUb1BsYW5lLCBkaXN0YW5jZUdyYWRpZW50OwoJCWZsb2F0IGNsaXBPcGFjaXR5ID0gMS4wOwoJCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBVTklPTl9DTElQUElOR19QTEFORVM7IGkgKysgKSB7CgkJCXBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTsKCQkJZGlzdGFuY2VUb1BsYW5lID0gLSBkb3QoIHZDbGlwUG9zaXRpb24sIHBsYW5lLnh5eiApICsgcGxhbmUudzsKCQkJZGlzdGFuY2VHcmFkaWVudCA9IGZ3aWR0aCggZGlzdGFuY2VUb1BsYW5lICkgLyAyLjA7CgkJCWNsaXBPcGFjaXR5ICo9IHNtb290aHN0ZXAoIC0gZGlzdGFuY2VHcmFkaWVudCwgZGlzdGFuY2VHcmFkaWVudCwgZGlzdGFuY2VUb1BsYW5lICk7CgkJCWlmICggY2xpcE9wYWNpdHkgPT0gMC4wICkgZGlzY2FyZDsKCQl9CgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKCQkjaWYgVU5JT05fQ0xJUFBJTkdfUExBTkVTIDwgTlVNX0NMSVBQSU5HX1BMQU5FUwoJCQlmbG9hdCB1bmlvbkNsaXBPcGFjaXR5ID0gMS4wOwoJCQkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0CgkJCWZvciAoIGludCBpID0gVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpIDwgTlVNX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHsKCQkJCXBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTsKCQkJCWRpc3RhbmNlVG9QbGFuZSA9IC0gZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSArIHBsYW5lLnc7CgkJCQlkaXN0YW5jZUdyYWRpZW50ID0gZndpZHRoKCBkaXN0YW5jZVRvUGxhbmUgKSAvIDIuMDsKCQkJCXVuaW9uQ2xpcE9wYWNpdHkgKj0gMS4wIC0gc21vb3Roc3RlcCggLSBkaXN0YW5jZUdyYWRpZW50LCBkaXN0YW5jZUdyYWRpZW50LCBkaXN0YW5jZVRvUGxhbmUgKTsKCQkJfQoJCQkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJCQljbGlwT3BhY2l0eSAqPSAxLjAgLSB1bmlvbkNsaXBPcGFjaXR5OwoJCSNlbmRpZgoJCWRpZmZ1c2VDb2xvci5hICo9IGNsaXBPcGFjaXR5OwoJCWlmICggZGlmZnVzZUNvbG9yLmEgPT0gMC4wICkgZGlzY2FyZDsKCSNlbHNlCgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCWZvciAoIGludCBpID0gMDsgaSA8IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHsKCQkJcGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdOwoJCQlpZiAoIGRvdCggdkNsaXBQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgZGlzY2FyZDsKCQl9CgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKCQkjaWYgVU5JT05fQ0xJUFBJTkdfUExBTkVTIDwgTlVNX0NMSVBQSU5HX1BMQU5FUwoJCQlib29sIGNsaXBwZWQgPSB0cnVlOwoJCQkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0CgkJCWZvciAoIGludCBpID0gVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpIDwgTlVNX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHsKCQkJCXBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTsKCQkJCWNsaXBwZWQgPSAoIGRvdCggdkNsaXBQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgJiYgY2xpcHBlZDsKCQkJfQoJCQkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJCQlpZiAoIGNsaXBwZWQgKSBkaXNjYXJkOwoJCSNlbmRpZgoJI2VuZGlmCiNlbmRpZmAsdjE9YCNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMAoJdmFyeWluZyB2ZWMzIHZDbGlwUG9zaXRpb247Cgl1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTsKI2VuZGlmYCxfMT1gI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwCgl2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjsKI2VuZGlmYCx4MT1gI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwCgl2Q2xpcFBvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejsKI2VuZGlmYCxNMT1gI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApCglkaWZmdXNlQ29sb3IgKj0gdkNvbG9yOwojZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKQoJZGlmZnVzZUNvbG9yLnJnYiAqPSB2Q29sb3I7CiNlbmRpZmAsUzE9YCNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKQoJdmFyeWluZyB2ZWM0IHZDb2xvcjsKI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkKCXZhcnlpbmcgdmVjMyB2Q29sb3I7CiNlbmRpZmAsYjE9YCNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKQoJdmFyeWluZyB2ZWM0IHZDb2xvcjsKI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkgfHwgZGVmaW5lZCggVVNFX0lOU1RBTkNJTkdfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfQkFUQ0hJTkdfQ09MT1IgKQoJdmFyeWluZyB2ZWMzIHZDb2xvcjsKI2VuZGlmYCx3MT1gI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApCgl2Q29sb3IgPSB2ZWM0KCAxLjAgKTsKI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkgfHwgZGVmaW5lZCggVVNFX0lOU1RBTkNJTkdfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfQkFUQ0hJTkdfQ09MT1IgKQoJdkNvbG9yID0gdmVjMyggMS4wICk7CiNlbmRpZgojaWZkZWYgVVNFX0NPTE9SCgl2Q29sb3IgKj0gY29sb3I7CiNlbmRpZgojaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1IKCXZDb2xvci54eXogKj0gaW5zdGFuY2VDb2xvci54eXo7CiNlbmRpZgojaWZkZWYgVVNFX0JBVENISU5HX0NPTE9SCgl2ZWMzIGJhdGNoaW5nQ29sb3IgPSBnZXRCYXRjaGluZ0NvbG9yKCBnZXRJbmRpcmVjdEluZGV4KCBnbF9EcmF3SUQgKSApOwoJdkNvbG9yLnh5eiAqPSBiYXRjaGluZ0NvbG9yLnh5ejsKI2VuZGlmYCxBMT1gI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MwojZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE3OTU4NgojZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ4OTY2CiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4Mzc5MDcKI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0MzA5MTg5NTM1CiNkZWZpbmUgRVBTSUxPTiAxZS02CiNpZm5kZWYgc2F0dXJhdGUKI2RlZmluZSBzYXR1cmF0ZSggYSApIGNsYW1wKCBhLCAwLjAsIDEuMCApCiNlbmRpZgojZGVmaW5lIHdoaXRlQ29tcGxlbWVudCggYSApICggMS4wIC0gc2F0dXJhdGUoIGEgKSApCmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH0KdmVjMyBwb3cyKCBjb25zdCBpbiB2ZWMzIHggKSB7IHJldHVybiB4Kng7IH0KZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9CmZsb2F0IHBvdzQoIGNvbnN0IGluIGZsb2F0IHggKSB7IGZsb2F0IHgyID0geCp4OyByZXR1cm4geDIqeDI7IH0KZmxvYXQgbWF4MyggY29uc3QgaW4gdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9CmZsb2F0IGF2ZXJhZ2UoIGNvbnN0IGluIHZlYzMgdiApIHsgcmV0dXJuIGRvdCggdiwgdmVjMyggMC4zMzMzMzMzICkgKTsgfQpoaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkgewoJY29uc3QgaGlnaHAgZmxvYXQgYSA9IDEyLjk4OTgsIGIgPSA3OC4yMzMsIGMgPSA0Mzc1OC41NDUzOwoJaGlnaHAgZmxvYXQgZHQgPSBkb3QoIHV2Lnh5LCB2ZWMyKCBhLGIgKSApLCBzbiA9IG1vZCggZHQsIFBJICk7CglyZXR1cm4gZnJhY3QoIHNpbiggc24gKSAqIGMgKTsKfQojaWZkZWYgSElHSF9QUkVDSVNJT04KCWZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHsgcmV0dXJuIGxlbmd0aCggdiApOyB9CiNlbHNlCglmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7CgkJZmxvYXQgbWF4Q29tcG9uZW50ID0gbWF4MyggYWJzKCB2ICkgKTsKCQlyZXR1cm4gbGVuZ3RoKCB2IC8gbWF4Q29tcG9uZW50ICkgKiBtYXhDb21wb25lbnQ7Cgl9CiNlbmRpZgpzdHJ1Y3QgSW5jaWRlbnRMaWdodCB7Cgl2ZWMzIGNvbG9yOwoJdmVjMyBkaXJlY3Rpb247Cglib29sIHZpc2libGU7Cn07CnN0cnVjdCBSZWZsZWN0ZWRMaWdodCB7Cgl2ZWMzIGRpcmVjdERpZmZ1c2U7Cgl2ZWMzIGRpcmVjdFNwZWN1bGFyOwoJdmVjMyBpbmRpcmVjdERpZmZ1c2U7Cgl2ZWMzIGluZGlyZWN0U3BlY3VsYXI7Cn07CiNpZmRlZiBVU0VfQUxQSEFIQVNICgl2YXJ5aW5nIHZlYzMgdlBvc2l0aW9uOwojZW5kaWYKdmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHsKCXJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApOwp9CnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkgewoJcmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBkaXIsIDAuMCApICogbWF0cml4ICkueHl6ICk7Cn0KbWF0MyB0cmFuc3Bvc2VNYXQzKCBjb25zdCBpbiBtYXQzIG0gKSB7CgltYXQzIHRtcDsKCXRtcFsgMCBdID0gdmVjMyggbVsgMCBdLngsIG1bIDEgXS54LCBtWyAyIF0ueCApOwoJdG1wWyAxIF0gPSB2ZWMzKCBtWyAwIF0ueSwgbVsgMSBdLnksIG1bIDIgXS55ICk7Cgl0bXBbIDIgXSA9IHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTsKCXJldHVybiB0bXA7Cn0KYm9vbCBpc1BlcnNwZWN0aXZlTWF0cml4KCBtYXQ0IG0gKSB7CglyZXR1cm4gbVsgMiBdWyAzIF0gPT0gLSAxLjA7Cn0KdmVjMiBlcXVpcmVjdFV2KCBpbiB2ZWMzIGRpciApIHsKCWZsb2F0IHUgPSBhdGFuKCBkaXIueiwgZGlyLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41OwoJZmxvYXQgdiA9IGFzaW4oIGNsYW1wKCBkaXIueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41OwoJcmV0dXJuIHZlYzIoIHUsIHYgKTsKfQp2ZWMzIEJSREZfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7CglyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjsKfQp2ZWMzIEZfU2NobGljayggY29uc3QgaW4gdmVjMyBmMCwgY29uc3QgaW4gZmxvYXQgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHsKCWZsb2F0IGZyZXNuZWwgPSBleHAyKCAoIC0gNS41NTQ3MyAqIGRvdFZIIC0gNi45ODMxNiApICogZG90VkggKTsKCXJldHVybiBmMCAqICggMS4wIC0gZnJlc25lbCApICsgKCBmOTAgKiBmcmVzbmVsICk7Cn0KZmxvYXQgRl9TY2hsaWNrKCBjb25zdCBpbiBmbG9hdCBmMCwgY29uc3QgaW4gZmxvYXQgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHsKCWZsb2F0IGZyZXNuZWwgPSBleHAyKCAoIC0gNS41NTQ3MyAqIGRvdFZIIC0gNi45ODMxNiApICogZG90VkggKTsKCXJldHVybiBmMCAqICggMS4wIC0gZnJlc25lbCApICsgKCBmOTAgKiBmcmVzbmVsICk7Cn0gLy8gdmFsaWRhdGVkYCxFMT1gI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVYKCSNkZWZpbmUgY3ViZVVWX21pbk1pcExldmVsIDQuMAoJI2RlZmluZSBjdWJlVVZfbWluVGlsZVNpemUgMTYuMAoJZmxvYXQgZ2V0RmFjZSggdmVjMyBkaXJlY3Rpb24gKSB7CgkJdmVjMyBhYnNEaXJlY3Rpb24gPSBhYnMoIGRpcmVjdGlvbiApOwoJCWZsb2F0IGZhY2UgPSAtIDEuMDsKCQlpZiAoIGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0aW9uLnogKSB7CgkJCWlmICggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueSApCgkJCQlmYWNlID0gZGlyZWN0aW9uLnggPiAwLjAgPyAwLjAgOiAzLjA7CgkJCWVsc2UKCQkJCWZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEuMCA6IDQuMDsKCQl9IGVsc2UgewoJCQlpZiAoIGFic0RpcmVjdGlvbi56ID4gYWJzRGlyZWN0aW9uLnkgKQoJCQkJZmFjZSA9IGRpcmVjdGlvbi56ID4gMC4wID8gMi4wIDogNS4wOwoJCQllbHNlCgkJCQlmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxLjAgOiA0LjA7CgkJfQoJCXJldHVybiBmYWNlOwoJfQoJdmVjMiBnZXRVViggdmVjMyBkaXJlY3Rpb24sIGZsb2F0IGZhY2UgKSB7CgkJdmVjMiB1djsKCQlpZiAoIGZhY2UgPT0gMC4wICkgewoJCQl1diA9IHZlYzIoIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueCApOwoJCX0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkgewoJCQl1diA9IHZlYzIoIC0gZGlyZWN0aW9uLngsIC0gZGlyZWN0aW9uLnogKSAvIGFicyggZGlyZWN0aW9uLnkgKTsKCQl9IGVsc2UgaWYgKCBmYWNlID09IDIuMCApIHsKCQkJdXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueiApOwoJCX0gZWxzZSBpZiAoIGZhY2UgPT0gMy4wICkgewoJCQl1diA9IHZlYzIoIC0gZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55ICkgLyBhYnMoIGRpcmVjdGlvbi54ICk7CgkJfSBlbHNlIGlmICggZmFjZSA9PSA0LjAgKSB7CgkJCXV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnogKSAvIGFicyggZGlyZWN0aW9uLnkgKTsKCQl9IGVsc2UgewoJCQl1diA9IHZlYzIoIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueiApOwoJCX0KCQlyZXR1cm4gMC41ICogKCB1diArIDEuMCApOwoJfQoJdmVjMyBiaWxpbmVhckN1YmVVViggc2FtcGxlcjJEIGVudk1hcCwgdmVjMyBkaXJlY3Rpb24sIGZsb2F0IG1pcEludCApIHsKCQlmbG9hdCBmYWNlID0gZ2V0RmFjZSggZGlyZWN0aW9uICk7CgkJZmxvYXQgZmlsdGVySW50ID0gbWF4KCBjdWJlVVZfbWluTWlwTGV2ZWwgLSBtaXBJbnQsIDAuMCApOwoJCW1pcEludCA9IG1heCggbWlwSW50LCBjdWJlVVZfbWluTWlwTGV2ZWwgKTsKCQlmbG9hdCBmYWNlU2l6ZSA9IGV4cDIoIG1pcEludCApOwoJCWhpZ2hwIHZlYzIgdXYgPSBnZXRVViggZGlyZWN0aW9uLCBmYWNlICkgKiAoIGZhY2VTaXplIC0gMi4wICkgKyAxLjA7CgkJaWYgKCBmYWNlID4gMi4wICkgewoJCQl1di55ICs9IGZhY2VTaXplOwoJCQlmYWNlIC09IDMuMDsKCQl9CgkJdXYueCArPSBmYWNlICogZmFjZVNpemU7CgkJdXYueCArPSBmaWx0ZXJJbnQgKiAzLjAgKiBjdWJlVVZfbWluVGlsZVNpemU7CgkJdXYueSArPSA0LjAgKiAoIGV4cDIoIENVQkVVVl9NQVhfTUlQICkgLSBmYWNlU2l6ZSApOwoJCXV2LnggKj0gQ1VCRVVWX1RFWEVMX1dJRFRIOwoJCXV2LnkgKj0gQ1VCRVVWX1RFWEVMX0hFSUdIVDsKCQkjaWZkZWYgdGV4dHVyZTJER3JhZEVYVAoJCQlyZXR1cm4gdGV4dHVyZTJER3JhZEVYVCggZW52TWFwLCB1diwgdmVjMiggMC4wICksIHZlYzIoIDAuMCApICkucmdiOwoJCSNlbHNlCgkJCXJldHVybiB0ZXh0dXJlMkQoIGVudk1hcCwgdXYgKS5yZ2I7CgkJI2VuZGlmCgl9CgkjZGVmaW5lIGN1YmVVVl9yMCAxLjAKCSNkZWZpbmUgY3ViZVVWX20wIC0gMi4wCgkjZGVmaW5lIGN1YmVVVl9yMSAwLjgKCSNkZWZpbmUgY3ViZVVWX20xIC0gMS4wCgkjZGVmaW5lIGN1YmVVVl9yNCAwLjQKCSNkZWZpbmUgY3ViZVVWX200IDIuMAoJI2RlZmluZSBjdWJlVVZfcjUgMC4zMDUKCSNkZWZpbmUgY3ViZVVWX201IDMuMAoJI2RlZmluZSBjdWJlVVZfcjYgMC4yMQoJI2RlZmluZSBjdWJlVVZfbTYgNC4wCglmbG9hdCByb3VnaG5lc3NUb01pcCggZmxvYXQgcm91Z2huZXNzICkgewoJCWZsb2F0IG1pcCA9IDAuMDsKCQlpZiAoIHJvdWdobmVzcyA+PSBjdWJlVVZfcjEgKSB7CgkJCW1pcCA9ICggY3ViZVVWX3IwIC0gcm91Z2huZXNzICkgKiAoIGN1YmVVVl9tMSAtIGN1YmVVVl9tMCApIC8gKCBjdWJlVVZfcjAgLSBjdWJlVVZfcjEgKSArIGN1YmVVVl9tMDsKCQl9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3I0ICkgewoJCQltaXAgPSAoIGN1YmVVVl9yMSAtIHJvdWdobmVzcyApICogKCBjdWJlVVZfbTQgLSBjdWJlVVZfbTEgKSAvICggY3ViZVVWX3IxIC0gY3ViZVVWX3I0ICkgKyBjdWJlVVZfbTE7CgkJfSBlbHNlIGlmICggcm91Z2huZXNzID49IGN1YmVVVl9yNSApIHsKCQkJbWlwID0gKCBjdWJlVVZfcjQgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX201IC0gY3ViZVVWX200ICkgLyAoIGN1YmVVVl9yNCAtIGN1YmVVVl9yNSApICsgY3ViZVVWX200OwoJCX0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSBjdWJlVVZfcjYgKSB7CgkJCW1pcCA9ICggY3ViZVVWX3I1IC0gcm91Z2huZXNzICkgKiAoIGN1YmVVVl9tNiAtIGN1YmVVVl9tNSApIC8gKCBjdWJlVVZfcjUgLSBjdWJlVVZfcjYgKSArIGN1YmVVVl9tNTsKCQl9IGVsc2UgewoJCQltaXAgPSAtIDIuMCAqIGxvZzIoIDEuMTYgKiByb3VnaG5lc3MgKTsJCX0KCQlyZXR1cm4gbWlwOwoJfQoJdmVjNCB0ZXh0dXJlQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIHNhbXBsZURpciwgZmxvYXQgcm91Z2huZXNzICkgewoJCWZsb2F0IG1pcCA9IGNsYW1wKCByb3VnaG5lc3NUb01pcCggcm91Z2huZXNzICksIGN1YmVVVl9tMCwgQ1VCRVVWX01BWF9NSVAgKTsKCQlmbG9hdCBtaXBGID0gZnJhY3QoIG1pcCApOwoJCWZsb2F0IG1pcEludCA9IGZsb29yKCBtaXAgKTsKCQl2ZWMzIGNvbG9yMCA9IGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpciwgbWlwSW50ICk7CgkJaWYgKCBtaXBGID09IDAuMCApIHsKCQkJcmV0dXJuIHZlYzQoIGNvbG9yMCwgMS4wICk7CgkJfSBlbHNlIHsKCQkJdmVjMyBjb2xvcjEgPSBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXIsIG1pcEludCArIDEuMCApOwoJCQlyZXR1cm4gdmVjNCggbWl4KCBjb2xvcjAsIGNvbG9yMSwgbWlwRiApLCAxLjAgKTsKCQl9Cgl9CiNlbmRpZmAsVDE9YHZlYzMgdHJhbnNmb3JtZWROb3JtYWwgPSBvYmplY3ROb3JtYWw7CiNpZmRlZiBVU0VfVEFOR0VOVAoJdmVjMyB0cmFuc2Zvcm1lZFRhbmdlbnQgPSBvYmplY3RUYW5nZW50OwojZW5kaWYKI2lmZGVmIFVTRV9CQVRDSElORwoJbWF0MyBibSA9IG1hdDMoIGJhdGNoaW5nTWF0cml4ICk7Cgl0cmFuc2Zvcm1lZE5vcm1hbCAvPSB2ZWMzKCBkb3QoIGJtWyAwIF0sIGJtWyAwIF0gKSwgZG90KCBibVsgMSBdLCBibVsgMSBdICksIGRvdCggYm1bIDIgXSwgYm1bIDIgXSApICk7Cgl0cmFuc2Zvcm1lZE5vcm1hbCA9IGJtICogdHJhbnNmb3JtZWROb3JtYWw7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQl0cmFuc2Zvcm1lZFRhbmdlbnQgPSBibSAqIHRyYW5zZm9ybWVkVGFuZ2VudDsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9JTlNUQU5DSU5HCgltYXQzIGltID0gbWF0MyggaW5zdGFuY2VNYXRyaXggKTsKCXRyYW5zZm9ybWVkTm9ybWFsIC89IHZlYzMoIGRvdCggaW1bIDAgXSwgaW1bIDAgXSApLCBkb3QoIGltWyAxIF0sIGltWyAxIF0gKSwgZG90KCBpbVsgMiBdLCBpbVsgMiBdICkgKTsKCXRyYW5zZm9ybWVkTm9ybWFsID0gaW0gKiB0cmFuc2Zvcm1lZE5vcm1hbDsKCSNpZmRlZiBVU0VfVEFOR0VOVAoJCXRyYW5zZm9ybWVkVGFuZ2VudCA9IGltICogdHJhbnNmb3JtZWRUYW5nZW50OwoJI2VuZGlmCiNlbmRpZgp0cmFuc2Zvcm1lZE5vcm1hbCA9IG5vcm1hbE1hdHJpeCAqIHRyYW5zZm9ybWVkTm9ybWFsOwojaWZkZWYgRkxJUF9TSURFRAoJdHJhbnNmb3JtZWROb3JtYWwgPSAtIHRyYW5zZm9ybWVkTm9ybWFsOwojZW5kaWYKI2lmZGVmIFVTRV9UQU5HRU5UCgl0cmFuc2Zvcm1lZFRhbmdlbnQgPSAoIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkVGFuZ2VudCwgMC4wICkgKS54eXo7CgkjaWZkZWYgRkxJUF9TSURFRAoJCXRyYW5zZm9ybWVkVGFuZ2VudCA9IC0gdHJhbnNmb3JtZWRUYW5nZW50OwoJI2VuZGlmCiNlbmRpZmAsQzE9YCNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBkaXNwbGFjZW1lbnRNYXA7Cgl1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlOwoJdW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRCaWFzOwojZW5kaWZgLFIxPWAjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUAoJdHJhbnNmb3JtZWQgKz0gbm9ybWFsaXplKCBvYmplY3ROb3JtYWwgKSAqICggdGV4dHVyZTJEKCBkaXNwbGFjZW1lbnRNYXAsIHZEaXNwbGFjZW1lbnRNYXBVdiApLnggKiBkaXNwbGFjZW1lbnRTY2FsZSArIGRpc3BsYWNlbWVudEJpYXMgKTsKI2VuZGlmYCxQMT1gI2lmZGVmIFVTRV9FTUlTU0lWRU1BUAoJdmVjNCBlbWlzc2l2ZUNvbG9yID0gdGV4dHVyZTJEKCBlbWlzc2l2ZU1hcCwgdkVtaXNzaXZlTWFwVXYgKTsKCXRvdGFsRW1pc3NpdmVSYWRpYW5jZSAqPSBlbWlzc2l2ZUNvbG9yLnJnYjsKI2VuZGlmYCxJMT1gI2lmZGVmIFVTRV9FTUlTU0lWRU1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7CiNlbmRpZmAsTDE9ImdsX0ZyYWdDb2xvciA9IGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApOyIsRDE9YApjb25zdCBtYXQzIExJTkVBUl9TUkdCX1RPX0xJTkVBUl9ESVNQTEFZX1AzID0gbWF0MygKCXZlYzMoIDAuODIyNDYyMSwgMC4xNzc1MzgsIDAuMCApLAoJdmVjMyggMC4wMzMxOTQxLCAwLjk2NjgwNTgsIDAuMCApLAoJdmVjMyggMC4wMTcwODI3LCAwLjA3MjM5NzQsIDAuOTEwNTE5OSApCik7CmNvbnN0IG1hdDMgTElORUFSX0RJU1BMQVlfUDNfVE9fTElORUFSX1NSR0IgPSBtYXQzKAoJdmVjMyggMS4yMjQ5NDAxLCAtIDAuMjI0OTQwNCwgMC4wICksCgl2ZWMzKCAtIDAuMDQyMDU2OSwgMS4wNDIwNTcxLCAwLjAgKSwKCXZlYzMoIC0gMC4wMTk2Mzc2LCAtIDAuMDc4NjM2MSwgMS4wOTgyNzM1ICkKKTsKdmVjNCBMaW5lYXJTUkdCVG9MaW5lYXJEaXNwbGF5UDMoIGluIHZlYzQgdmFsdWUgKSB7CglyZXR1cm4gdmVjNCggdmFsdWUucmdiICogTElORUFSX1NSR0JfVE9fTElORUFSX0RJU1BMQVlfUDMsIHZhbHVlLmEgKTsKfQp2ZWM0IExpbmVhckRpc3BsYXlQM1RvTGluZWFyU1JHQiggaW4gdmVjNCB2YWx1ZSApIHsKCXJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiBMSU5FQVJfRElTUExBWV9QM19UT19MSU5FQVJfU1JHQiwgdmFsdWUuYSApOwp9CnZlYzQgTGluZWFyVHJhbnNmZXJPRVRGKCBpbiB2ZWM0IHZhbHVlICkgewoJcmV0dXJuIHZhbHVlOwp9CnZlYzQgc1JHQlRyYW5zZmVyT0VURiggaW4gdmVjNCB2YWx1ZSApIHsKCXJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLmEgKTsKfWAsVTE9YCNpZmRlZiBVU0VfRU5WTUFQCgkjaWZkZWYgRU5WX1dPUkxEUE9TCgkJdmVjMyBjYW1lcmFUb0ZyYWc7CgkJaWYgKCBpc09ydGhvZ3JhcGhpYyApIHsKCQkJY2FtZXJhVG9GcmFnID0gbm9ybWFsaXplKCB2ZWMzKCAtIHZpZXdNYXRyaXhbIDAgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDEgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDIgXVsgMiBdICkgKTsKCQl9IGVsc2UgewoJCQljYW1lcmFUb0ZyYWcgPSBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTsKCQl9CgkJdmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApOwoJCSNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OCgkJCXZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIGNhbWVyYVRvRnJhZywgd29ybGROb3JtYWwgKTsKCQkjZWxzZQoJCQl2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCBjYW1lcmFUb0ZyYWcsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTsKCQkjZW5kaWYKCSNlbHNlCgkJdmVjMyByZWZsZWN0VmVjID0gdlJlZmxlY3Q7CgkjZW5kaWYKCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFCgkJdmVjNCBlbnZDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIGVudk1hcFJvdGF0aW9uICogdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApICk7CgkjZWxzZQoJCXZlYzQgZW52Q29sb3IgPSB2ZWM0KCAwLjAgKTsKCSNlbmRpZgoJI2lmZGVmIEVOVk1BUF9CTEVORElOR19NVUxUSVBMWQoJCW91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIG91dGdvaW5nTGlnaHQgKiBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTsKCSNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKQoJCW91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApOwoJI2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX0FERCApCgkJb3V0Z29pbmdMaWdodCArPSBlbnZDb2xvci54eXogKiBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5OwoJI2VuZGlmCiNlbmRpZmAsTjE9YCNpZmRlZiBVU0VfRU5WTUFQCgl1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTsKCXVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDsKCXVuaWZvcm0gbWF0MyBlbnZNYXBSb3RhdGlvbjsKCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFCgkJdW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7CgkjZWxzZQoJCXVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDsKCSNlbmRpZgoJCiNlbmRpZmAsRjE9YCNpZmRlZiBVU0VfRU5WTUFQCgl1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTsKCSNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIHx8IGRlZmluZWQoIExBTUJFUlQgKQoJCSNkZWZpbmUgRU5WX1dPUkxEUE9TCgkjZW5kaWYKCSNpZmRlZiBFTlZfV09STERQT1MKCQl2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CgkJdW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87CgkjZWxzZQoJCXZhcnlpbmcgdmVjMyB2UmVmbGVjdDsKCSNlbmRpZgojZW5kaWZgLE8xPWAjaWZkZWYgVVNFX0VOVk1BUAoJI2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgfHwgZGVmaW5lZCggTEFNQkVSVCApCgkJI2RlZmluZSBFTlZfV09STERQT1MKCSNlbmRpZgoJI2lmZGVmIEVOVl9XT1JMRFBPUwoJCQoJCXZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjsKCSNlbHNlCgkJdmFyeWluZyB2ZWMzIHZSZWZsZWN0OwoJCXVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvOwoJI2VuZGlmCiNlbmRpZmAsQjE9YCNpZmRlZiBVU0VfRU5WTUFQCgkjaWZkZWYgRU5WX1dPUkxEUE9TCgkJdldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejsKCSNlbHNlCgkJdmVjMyBjYW1lcmFUb1ZlcnRleDsKCQlpZiAoIGlzT3J0aG9ncmFwaGljICkgewoJCQljYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggdmVjMyggLSB2aWV3TWF0cml4WyAwIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAxIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAyIF1bIDIgXSApICk7CgkJfSBlbHNlIHsKCQkJY2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHdvcmxkUG9zaXRpb24ueHl6IC0gY2FtZXJhUG9zaXRpb24gKTsKCQl9CgkJdmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7CgkJI2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT04KCQkJdlJlZmxlY3QgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTsKCQkjZWxzZQoJCQl2UmVmbGVjdCA9IHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7CgkJI2VuZGlmCgkjZW5kaWYKI2VuZGlmYCx6MT1gI2lmZGVmIFVTRV9GT0cKCXZGb2dEZXB0aCA9IC0gbXZQb3NpdGlvbi56OwojZW5kaWZgLGsxPWAjaWZkZWYgVVNFX0ZPRwoJdmFyeWluZyBmbG9hdCB2Rm9nRGVwdGg7CiNlbmRpZmAsRzE9YCNpZmRlZiBVU0VfRk9HCgkjaWZkZWYgRk9HX0VYUDIKCQlmbG9hdCBmb2dGYWN0b3IgPSAxLjAgLSBleHAoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiB2Rm9nRGVwdGggKiB2Rm9nRGVwdGggKTsKCSNlbHNlCgkJZmxvYXQgZm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCB2Rm9nRGVwdGggKTsKCSNlbmRpZgoJZ2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApOwojZW5kaWZgLFYxPWAjaWZkZWYgVVNFX0ZPRwoJdW5pZm9ybSB2ZWMzIGZvZ0NvbG9yOwoJdmFyeWluZyBmbG9hdCB2Rm9nRGVwdGg7CgkjaWZkZWYgRk9HX0VYUDIKCQl1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7CgkjZWxzZQoJCXVuaWZvcm0gZmxvYXQgZm9nTmVhcjsKCQl1bmlmb3JtIGZsb2F0IGZvZ0ZhcjsKCSNlbmRpZgojZW5kaWZgLEgxPWAjaWZkZWYgVVNFX0dSQURJRU5UTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDsKI2VuZGlmCnZlYzMgZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCB2ZWMzIG5vcm1hbCwgdmVjMyBsaWdodERpcmVjdGlvbiApIHsKCWZsb2F0IGRvdE5MID0gZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7Cgl2ZWMyIGNvb3JkID0gdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApOwoJI2lmZGVmIFVTRV9HUkFESUVOVE1BUAoJCXJldHVybiB2ZWMzKCB0ZXh0dXJlMkQoIGdyYWRpZW50TWFwLCBjb29yZCApLnIgKTsKCSNlbHNlCgkJdmVjMiBmdyA9IGZ3aWR0aCggY29vcmQgKSAqIDAuNTsKCQlyZXR1cm4gbWl4KCB2ZWMzKCAwLjcgKSwgdmVjMyggMS4wICksIHNtb290aHN0ZXAoIDAuNyAtIGZ3LngsIDAuNyArIGZ3LngsIGNvb3JkLnggKSApOwoJI2VuZGlmCn1gLFcxPWAjaWZkZWYgVVNFX0xJR0hUTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBsaWdodE1hcDsKCXVuaWZvcm0gZmxvYXQgbGlnaHRNYXBJbnRlbnNpdHk7CiNlbmRpZmAsJDE9YExhbWJlcnRNYXRlcmlhbCBtYXRlcmlhbDsKbWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjsKbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aCA9IHNwZWN1bGFyU3RyZW5ndGg7YCxYMT1gdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CnN0cnVjdCBMYW1iZXJ0TWF0ZXJpYWwgewoJdmVjMyBkaWZmdXNlQ29sb3I7CglmbG9hdCBzcGVjdWxhclN0cmVuZ3RoOwp9Owp2b2lkIFJFX0RpcmVjdF9MYW1iZXJ0KCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBMYW1iZXJ0TWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeU5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTsKCXZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7CglyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwp9CnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gTGFtYmVydE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQojZGVmaW5lIFJFX0RpcmVjdAkJCQlSRV9EaXJlY3RfTGFtYmVydAojZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZQkJUkVfSW5kaXJlY3REaWZmdXNlX0xhbWJlcnRgLHExPWB1bmlmb3JtIGJvb2wgcmVjZWl2ZVNoYWRvdzsKdW5pZm9ybSB2ZWMzIGFtYmllbnRMaWdodENvbG9yOwojaWYgZGVmaW5lZCggVVNFX0xJR0hUX1BST0JFUyApCgl1bmlmb3JtIHZlYzMgbGlnaHRQcm9iZVsgOSBdOwojZW5kaWYKdmVjMyBzaEdldElycmFkaWFuY2VBdCggaW4gdmVjMyBub3JtYWwsIGluIHZlYzMgc2hDb2VmZmljaWVudHNbIDkgXSApIHsKCWZsb2F0IHggPSBub3JtYWwueCwgeSA9IG5vcm1hbC55LCB6ID0gbm9ybWFsLno7Cgl2ZWMzIHJlc3VsdCA9IHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNzsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMSBdICogMi4wICogMC41MTE2NjQgKiB5OwoJcmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAyIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHo7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNSBdICogMi4wICogMC40MjkwNDMgKiB5ICogejsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNiBdICogKCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgOCBdICogMC40MjkwNDMgKiAoIHggKiB4IC0geSAqIHkgKTsKCXJldHVybiByZXN1bHQ7Cn0KdmVjMyBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBsaWdodFByb2JlWyA5IF0sIGNvbnN0IGluIHZlYzMgbm9ybWFsICkgewoJdmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApOwoJdmVjMyBpcnJhZGlhbmNlID0gc2hHZXRJcnJhZGlhbmNlQXQoIHdvcmxkTm9ybWFsLCBsaWdodFByb2JlICk7CglyZXR1cm4gaXJyYWRpYW5jZTsKfQp2ZWMzIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgYW1iaWVudExpZ2h0Q29sb3IgKSB7Cgl2ZWMzIGlycmFkaWFuY2UgPSBhbWJpZW50TGlnaHRDb2xvcjsKCXJldHVybiBpcnJhZGlhbmNlOwp9CmZsb2F0IGdldERpc3RhbmNlQXR0ZW51YXRpb24oIGNvbnN0IGluIGZsb2F0IGxpZ2h0RGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGN1dG9mZkRpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBkZWNheUV4cG9uZW50ICkgewoJZmxvYXQgZGlzdGFuY2VGYWxsb2ZmID0gMS4wIC8gbWF4KCBwb3coIGxpZ2h0RGlzdGFuY2UsIGRlY2F5RXhwb25lbnQgKSwgMC4wMSApOwoJaWYgKCBjdXRvZmZEaXN0YW5jZSA+IDAuMCApIHsKCQlkaXN0YW5jZUZhbGxvZmYgKj0gcG93Miggc2F0dXJhdGUoIDEuMCAtIHBvdzQoIGxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSApICkgKTsKCX0KCXJldHVybiBkaXN0YW5jZUZhbGxvZmY7Cn0KZmxvYXQgZ2V0U3BvdEF0dGVudWF0aW9uKCBjb25zdCBpbiBmbG9hdCBjb25lQ29zaW5lLCBjb25zdCBpbiBmbG9hdCBwZW51bWJyYUNvc2luZSwgY29uc3QgaW4gZmxvYXQgYW5nbGVDb3NpbmUgKSB7CglyZXR1cm4gc21vb3Roc3RlcCggY29uZUNvc2luZSwgcGVudW1icmFDb3NpbmUsIGFuZ2xlQ29zaW5lICk7Cn0KI2lmIE5VTV9ESVJfTElHSFRTID4gMAoJc3RydWN0IERpcmVjdGlvbmFsTGlnaHQgewoJCXZlYzMgZGlyZWN0aW9uOwoJCXZlYzMgY29sb3I7Cgl9OwoJdW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHRzWyBOVU1fRElSX0xJR0hUUyBdOwoJdm9pZCBnZXREaXJlY3Rpb25hbExpZ2h0SW5mbyggY29uc3QgaW4gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0LCBvdXQgSW5jaWRlbnRMaWdodCBsaWdodCApIHsKCQlsaWdodC5jb2xvciA9IGRpcmVjdGlvbmFsTGlnaHQuY29sb3I7CgkJbGlnaHQuZGlyZWN0aW9uID0gZGlyZWN0aW9uYWxMaWdodC5kaXJlY3Rpb247CgkJbGlnaHQudmlzaWJsZSA9IHRydWU7Cgl9CiNlbmRpZgojaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDAKCXN0cnVjdCBQb2ludExpZ2h0IHsKCQl2ZWMzIHBvc2l0aW9uOwoJCXZlYzMgY29sb3I7CgkJZmxvYXQgZGlzdGFuY2U7CgkJZmxvYXQgZGVjYXk7Cgl9OwoJdW5pZm9ybSBQb2ludExpZ2h0IHBvaW50TGlnaHRzWyBOVU1fUE9JTlRfTElHSFRTIF07Cgl2b2lkIGdldFBvaW50TGlnaHRJbmZvKCBjb25zdCBpbiBQb2ludExpZ2h0IHBvaW50TGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgb3V0IEluY2lkZW50TGlnaHQgbGlnaHQgKSB7CgkJdmVjMyBsVmVjdG9yID0gcG9pbnRMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5UG9zaXRpb247CgkJbGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7CgkJZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApOwoJCWxpZ2h0LmNvbG9yID0gcG9pbnRMaWdodC5jb2xvcjsKCQlsaWdodC5jb2xvciAqPSBnZXREaXN0YW5jZUF0dGVudWF0aW9uKCBsaWdodERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7CgkJbGlnaHQudmlzaWJsZSA9ICggbGlnaHQuY29sb3IgIT0gdmVjMyggMC4wICkgKTsKCX0KI2VuZGlmCiNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwCglzdHJ1Y3QgU3BvdExpZ2h0IHsKCQl2ZWMzIHBvc2l0aW9uOwoJCXZlYzMgZGlyZWN0aW9uOwoJCXZlYzMgY29sb3I7CgkJZmxvYXQgZGlzdGFuY2U7CgkJZmxvYXQgZGVjYXk7CgkJZmxvYXQgY29uZUNvczsKCQlmbG9hdCBwZW51bWJyYUNvczsKCX07Cgl1bmlmb3JtIFNwb3RMaWdodCBzcG90TGlnaHRzWyBOVU1fU1BPVF9MSUdIVFMgXTsKCXZvaWQgZ2V0U3BvdExpZ2h0SW5mbyggY29uc3QgaW4gU3BvdExpZ2h0IHNwb3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBvdXQgSW5jaWRlbnRMaWdodCBsaWdodCApIHsKCQl2ZWMzIGxWZWN0b3IgPSBzcG90TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeVBvc2l0aW9uOwoJCWxpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApOwoJCWZsb2F0IGFuZ2xlQ29zID0gZG90KCBsaWdodC5kaXJlY3Rpb24sIHNwb3RMaWdodC5kaXJlY3Rpb24gKTsKCQlmbG9hdCBzcG90QXR0ZW51YXRpb24gPSBnZXRTcG90QXR0ZW51YXRpb24oIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7CgkJaWYgKCBzcG90QXR0ZW51YXRpb24gPiAwLjAgKSB7CgkJCWZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTsKCQkJbGlnaHQuY29sb3IgPSBzcG90TGlnaHQuY29sb3IgKiBzcG90QXR0ZW51YXRpb247CgkJCWxpZ2h0LmNvbG9yICo9IGdldERpc3RhbmNlQXR0ZW51YXRpb24oIGxpZ2h0RGlzdGFuY2UsIHNwb3RMaWdodC5kaXN0YW5jZSwgc3BvdExpZ2h0LmRlY2F5ICk7CgkJCWxpZ2h0LnZpc2libGUgPSAoIGxpZ2h0LmNvbG9yICE9IHZlYzMoIDAuMCApICk7CgkJfSBlbHNlIHsKCQkJbGlnaHQuY29sb3IgPSB2ZWMzKCAwLjAgKTsKCQkJbGlnaHQudmlzaWJsZSA9IGZhbHNlOwoJCX0KCX0KI2VuZGlmCiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAKCXN0cnVjdCBSZWN0QXJlYUxpZ2h0IHsKCQl2ZWMzIGNvbG9yOwoJCXZlYzMgcG9zaXRpb247CgkJdmVjMyBoYWxmV2lkdGg7CgkJdmVjMyBoYWxmSGVpZ2h0OwoJfTsKCXVuaWZvcm0gc2FtcGxlcjJEIGx0Y18xOwl1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMjsKCXVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTsKI2VuZGlmCiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwCglzdHJ1Y3QgSGVtaXNwaGVyZUxpZ2h0IHsKCQl2ZWMzIGRpcmVjdGlvbjsKCQl2ZWMzIHNreUNvbG9yOwoJCXZlYzMgZ3JvdW5kQ29sb3I7Cgl9OwoJdW5pZm9ybSBIZW1pc3BoZXJlTGlnaHQgaGVtaXNwaGVyZUxpZ2h0c1sgTlVNX0hFTUlfTElHSFRTIF07Cgl2ZWMzIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIEhlbWlzcGhlcmVMaWdodCBoZW1pTGlnaHQsIGNvbnN0IGluIHZlYzMgbm9ybWFsICkgewoJCWZsb2F0IGRvdE5MID0gZG90KCBub3JtYWwsIGhlbWlMaWdodC5kaXJlY3Rpb24gKTsKCQlmbG9hdCBoZW1pRGlmZnVzZVdlaWdodCA9IDAuNSAqIGRvdE5MICsgMC41OwoJCXZlYzMgaXJyYWRpYW5jZSA9IG1peCggaGVtaUxpZ2h0Lmdyb3VuZENvbG9yLCBoZW1pTGlnaHQuc2t5Q29sb3IsIGhlbWlEaWZmdXNlV2VpZ2h0ICk7CgkJcmV0dXJuIGlycmFkaWFuY2U7Cgl9CiNlbmRpZmAsWTE9YCNpZmRlZiBVU0VfRU5WTUFQCgl2ZWMzIGdldElCTElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkgewoJCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWCgkJCXZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTsKCQkJdmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgZW52TWFwUm90YXRpb24gKiB3b3JsZE5vcm1hbCwgMS4wICk7CgkJCXJldHVybiBQSSAqIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTsKCQkjZWxzZQoJCQlyZXR1cm4gdmVjMyggMC4wICk7CgkJI2VuZGlmCgl9Cgl2ZWMzIGdldElCTFJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7CgkJI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVYKCQkJdmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggLSB2aWV3RGlyLCBub3JtYWwgKTsKCQkJcmVmbGVjdFZlYyA9IG5vcm1hbGl6ZSggbWl4KCByZWZsZWN0VmVjLCBub3JtYWwsIHJvdWdobmVzcyAqIHJvdWdobmVzcykgKTsKCQkJcmVmbGVjdFZlYyA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTsKCQkJdmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgZW52TWFwUm90YXRpb24gKiByZWZsZWN0VmVjLCByb3VnaG5lc3MgKTsKCQkJcmV0dXJuIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTsKCQkjZWxzZQoJCQlyZXR1cm4gdmVjMyggMC4wICk7CgkJI2VuZGlmCgl9CgkjaWZkZWYgVVNFX0FOSVNPVFJPUFkKCQl2ZWMzIGdldElCTEFuaXNvdHJvcHlSYWRpYW5jZSggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiB2ZWMzIGJpdGFuZ2VudCwgY29uc3QgaW4gZmxvYXQgYW5pc290cm9weSApIHsKCQkJI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVYKCQkJCXZlYzMgYmVudE5vcm1hbCA9IGNyb3NzKCBiaXRhbmdlbnQsIHZpZXdEaXIgKTsKCQkJCWJlbnROb3JtYWwgPSBub3JtYWxpemUoIGNyb3NzKCBiZW50Tm9ybWFsLCBiaXRhbmdlbnQgKSApOwoJCQkJYmVudE5vcm1hbCA9IG5vcm1hbGl6ZSggbWl4KCBiZW50Tm9ybWFsLCBub3JtYWwsIHBvdzIoIHBvdzIoIDEuMCAtIGFuaXNvdHJvcHkgKiAoIDEuMCAtIHJvdWdobmVzcyApICkgKSApICk7CgkJCQlyZXR1cm4gZ2V0SUJMUmFkaWFuY2UoIHZpZXdEaXIsIGJlbnROb3JtYWwsIHJvdWdobmVzcyApOwoJCQkjZWxzZQoJCQkJcmV0dXJuIHZlYzMoIDAuMCApOwoJCQkjZW5kaWYKCQl9CgkjZW5kaWYKI2VuZGlmYCxaMT1gVG9vbk1hdGVyaWFsIG1hdGVyaWFsOwptYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO2AsSjE9YHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwpzdHJ1Y3QgVG9vbk1hdGVyaWFsIHsKCXZlYzMgZGlmZnVzZUNvbG9yOwp9Owp2b2lkIFJFX0RpcmVjdF9Ub29uKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBUb29uTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJdmVjMyBpcnJhZGlhbmNlID0gZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCBnZW9tZXRyeU5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjsKCXJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7Cn0Kdm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfVG9vbiggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBUb29uTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwp9CiNkZWZpbmUgUkVfRGlyZWN0CQkJCVJFX0RpcmVjdF9Ub29uCiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlCQlSRV9JbmRpcmVjdERpZmZ1c2VfVG9vbmAsSzE9YEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDsKbWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjsKbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IHNwZWN1bGFyOwptYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyA9IHNoaW5pbmVzczsKbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aCA9IHNwZWN1bGFyU3RyZW5ndGg7YCxqMT1gdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CnN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwgewoJdmVjMyBkaWZmdXNlQ29sb3I7Cgl2ZWMzIHNwZWN1bGFyQ29sb3I7CglmbG9hdCBzcGVjdWxhclNoaW5pbmVzczsKCWZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7Cn07CnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CglmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApOwoJdmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjsKCXJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7CglyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9CbGlublBob25nKCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoOwp9CnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQojZGVmaW5lIFJFX0RpcmVjdAkJCQlSRV9EaXJlY3RfQmxpbm5QaG9uZwojZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZQkJUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmdgLFExPWBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsOwptYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiICogKCAxLjAgLSBtZXRhbG5lc3NGYWN0b3IgKTsKdmVjMyBkeHkgPSBtYXgoIGFicyggZEZkeCggbm9uUGVydHVyYmVkTm9ybWFsICkgKSwgYWJzKCBkRmR5KCBub25QZXJ0dXJiZWROb3JtYWwgKSApICk7CmZsb2F0IGdlb21ldHJ5Um91Z2huZXNzID0gbWF4KCBtYXgoIGR4eS54LCBkeHkueSApLCBkeHkueiApOwptYXRlcmlhbC5yb3VnaG5lc3MgPSBtYXgoIHJvdWdobmVzc0ZhY3RvciwgMC4wNTI1ICk7bWF0ZXJpYWwucm91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzOwptYXRlcmlhbC5yb3VnaG5lc3MgPSBtaW4oIG1hdGVyaWFsLnJvdWdobmVzcywgMS4wICk7CiNpZmRlZiBJT1IKCW1hdGVyaWFsLmlvciA9IGlvcjsKCSNpZmRlZiBVU0VfU1BFQ1VMQVIKCQlmbG9hdCBzcGVjdWxhckludGVuc2l0eUZhY3RvciA9IHNwZWN1bGFySW50ZW5zaXR5OwoJCXZlYzMgc3BlY3VsYXJDb2xvckZhY3RvciA9IHNwZWN1bGFyQ29sb3I7CgkJI2lmZGVmIFVTRV9TUEVDVUxBUl9DT0xPUk1BUAoJCQlzcGVjdWxhckNvbG9yRmFjdG9yICo9IHRleHR1cmUyRCggc3BlY3VsYXJDb2xvck1hcCwgdlNwZWN1bGFyQ29sb3JNYXBVdiApLnJnYjsKCQkjZW5kaWYKCQkjaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUAoJCQlzcGVjdWxhckludGVuc2l0eUZhY3RvciAqPSB0ZXh0dXJlMkQoIHNwZWN1bGFySW50ZW5zaXR5TWFwLCB2U3BlY3VsYXJJbnRlbnNpdHlNYXBVdiApLmE7CgkJI2VuZGlmCgkJbWF0ZXJpYWwuc3BlY3VsYXJGOTAgPSBtaXgoIHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yLCAxLjAsIG1ldGFsbmVzc0ZhY3RvciApOwoJI2Vsc2UKCQlmbG9hdCBzcGVjdWxhckludGVuc2l0eUZhY3RvciA9IDEuMDsKCQl2ZWMzIHNwZWN1bGFyQ29sb3JGYWN0b3IgPSB2ZWMzKCAxLjAgKTsKCQltYXRlcmlhbC5zcGVjdWxhckY5MCA9IDEuMDsKCSNlbmRpZgoJbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggbWluKCBwb3cyKCAoIG1hdGVyaWFsLmlvciAtIDEuMCApIC8gKCBtYXRlcmlhbC5pb3IgKyAxLjAgKSApICogc3BlY3VsYXJDb2xvckZhY3RvciwgdmVjMyggMS4wICkgKSAqIHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTsKI2Vsc2UKCW1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIDAuMDQgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7CgltYXRlcmlhbC5zcGVjdWxhckY5MCA9IDEuMDsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUCgltYXRlcmlhbC5jbGVhcmNvYXQgPSBjbGVhcmNvYXQ7CgltYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBjbGVhcmNvYXRSb3VnaG5lc3M7CgltYXRlcmlhbC5jbGVhcmNvYXRGMCA9IHZlYzMoIDAuMDQgKTsKCW1hdGVyaWFsLmNsZWFyY29hdEY5MCA9IDEuMDsKCSNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQCgkJbWF0ZXJpYWwuY2xlYXJjb2F0ICo9IHRleHR1cmUyRCggY2xlYXJjb2F0TWFwLCB2Q2xlYXJjb2F0TWFwVXYgKS54OwoJI2VuZGlmCgkjaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAKCQltYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKj0gdGV4dHVyZTJEKCBjbGVhcmNvYXRSb3VnaG5lc3NNYXAsIHZDbGVhcmNvYXRSb3VnaG5lc3NNYXBVdiApLnk7CgkjZW5kaWYKCW1hdGVyaWFsLmNsZWFyY29hdCA9IHNhdHVyYXRlKCBtYXRlcmlhbC5jbGVhcmNvYXQgKTsJbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gbWF4KCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIDAuMDUyNSApOwoJbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzOwoJbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gbWluKCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIDEuMCApOwojZW5kaWYKI2lmZGVmIFVTRV9ESVNQRVJTSU9OCgltYXRlcmlhbC5kaXNwZXJzaW9uID0gZGlzcGVyc2lvbjsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCW1hdGVyaWFsLmlyaWRlc2NlbmNlID0gaXJpZGVzY2VuY2U7CgltYXRlcmlhbC5pcmlkZXNjZW5jZUlPUiA9IGlyaWRlc2NlbmNlSU9SOwoJI2lmZGVmIFVTRV9JUklERVNDRU5DRU1BUAoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlICo9IHRleHR1cmUyRCggaXJpZGVzY2VuY2VNYXAsIHZJcmlkZXNjZW5jZU1hcFV2ICkucjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAKCQltYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcyA9IChpcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW0gLSBpcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW0pICogdGV4dHVyZTJEKCBpcmlkZXNjZW5jZVRoaWNrbmVzc01hcCwgdklyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXYgKS5nICsgaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtOwoJI2Vsc2UKCQltYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcyA9IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTgoJbWF0ZXJpYWwuc2hlZW5Db2xvciA9IHNoZWVuQ29sb3I7CgkjaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQCgkJbWF0ZXJpYWwuc2hlZW5Db2xvciAqPSB0ZXh0dXJlMkQoIHNoZWVuQ29sb3JNYXAsIHZTaGVlbkNvbG9yTWFwVXYgKS5yZ2I7CgkjZW5kaWYKCW1hdGVyaWFsLnNoZWVuUm91Z2huZXNzID0gY2xhbXAoIHNoZWVuUm91Z2huZXNzLCAwLjA3LCAxLjAgKTsKCSNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgkJbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgKj0gdGV4dHVyZTJEKCBzaGVlblJvdWdobmVzc01hcCwgdlNoZWVuUm91Z2huZXNzTWFwVXYgKS5hOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0FOSVNPVFJPUFkKCSNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUAoJCW1hdDIgYW5pc290cm9weU1hdCA9IG1hdDIoIGFuaXNvdHJvcHlWZWN0b3IueCwgYW5pc290cm9weVZlY3Rvci55LCAtIGFuaXNvdHJvcHlWZWN0b3IueSwgYW5pc290cm9weVZlY3Rvci54ICk7CgkJdmVjMyBhbmlzb3Ryb3B5UG9sYXIgPSB0ZXh0dXJlMkQoIGFuaXNvdHJvcHlNYXAsIHZBbmlzb3Ryb3B5TWFwVXYgKS5yZ2I7CgkJdmVjMiBhbmlzb3Ryb3B5ViA9IGFuaXNvdHJvcHlNYXQgKiBub3JtYWxpemUoIDIuMCAqIGFuaXNvdHJvcHlQb2xhci5yZyAtIHZlYzIoIDEuMCApICkgKiBhbmlzb3Ryb3B5UG9sYXIuYjsKCSNlbHNlCgkJdmVjMiBhbmlzb3Ryb3B5ViA9IGFuaXNvdHJvcHlWZWN0b3I7CgkjZW5kaWYKCW1hdGVyaWFsLmFuaXNvdHJvcHkgPSBsZW5ndGgoIGFuaXNvdHJvcHlWICk7CglpZiggbWF0ZXJpYWwuYW5pc290cm9weSA9PSAwLjAgKSB7CgkJYW5pc290cm9weVYgPSB2ZWMyKCAxLjAsIDAuMCApOwoJfSBlbHNlIHsKCQlhbmlzb3Ryb3B5ViAvPSBtYXRlcmlhbC5hbmlzb3Ryb3B5OwoJCW1hdGVyaWFsLmFuaXNvdHJvcHkgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuYW5pc290cm9weSApOwoJfQoJbWF0ZXJpYWwuYWxwaGFUID0gbWl4KCBwb3cyKCBtYXRlcmlhbC5yb3VnaG5lc3MgKSwgMS4wLCBwb3cyKCBtYXRlcmlhbC5hbmlzb3Ryb3B5ICkgKTsKCW1hdGVyaWFsLmFuaXNvdHJvcHlUID0gdGJuWyAwIF0gKiBhbmlzb3Ryb3B5Vi54ICsgdGJuWyAxIF0gKiBhbmlzb3Ryb3B5Vi55OwoJbWF0ZXJpYWwuYW5pc290cm9weUIgPSB0Ym5bIDEgXSAqIGFuaXNvdHJvcHlWLnggLSB0Ym5bIDAgXSAqIGFuaXNvdHJvcHlWLnk7CiNlbmRpZmAsdHc9YHN0cnVjdCBQaHlzaWNhbE1hdGVyaWFsIHsKCXZlYzMgZGlmZnVzZUNvbG9yOwoJZmxvYXQgcm91Z2huZXNzOwoJdmVjMyBzcGVjdWxhckNvbG9yOwoJZmxvYXQgc3BlY3VsYXJGOTA7CglmbG9hdCBkaXNwZXJzaW9uOwoJI2lmZGVmIFVTRV9DTEVBUkNPQVQKCQlmbG9hdCBjbGVhcmNvYXQ7CgkJZmxvYXQgY2xlYXJjb2F0Um91Z2huZXNzOwoJCXZlYzMgY2xlYXJjb2F0RjA7CgkJZmxvYXQgY2xlYXJjb2F0RjkwOwoJI2VuZGlmCgkjaWZkZWYgVVNFX0lSSURFU0NFTkNFCgkJZmxvYXQgaXJpZGVzY2VuY2U7CgkJZmxvYXQgaXJpZGVzY2VuY2VJT1I7CgkJZmxvYXQgaXJpZGVzY2VuY2VUaGlja25lc3M7CgkJdmVjMyBpcmlkZXNjZW5jZUZyZXNuZWw7CgkJdmVjMyBpcmlkZXNjZW5jZUYwOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1NIRUVOCgkJdmVjMyBzaGVlbkNvbG9yOwoJCWZsb2F0IHNoZWVuUm91Z2huZXNzOwoJI2VuZGlmCgkjaWZkZWYgSU9SCgkJZmxvYXQgaW9yOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJCWZsb2F0IHRyYW5zbWlzc2lvbjsKCQlmbG9hdCB0cmFuc21pc3Npb25BbHBoYTsKCQlmbG9hdCB0aGlja25lc3M7CgkJZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZTsKCQl2ZWMzIGF0dGVudWF0aW9uQ29sb3I7CgkjZW5kaWYKCSNpZmRlZiBVU0VfQU5JU09UUk9QWQoJCWZsb2F0IGFuaXNvdHJvcHk7CgkJZmxvYXQgYWxwaGFUOwoJCXZlYzMgYW5pc290cm9weVQ7CgkJdmVjMyBhbmlzb3Ryb3B5QjsKCSNlbmRpZgp9Owp2ZWMzIGNsZWFyY29hdFNwZWN1bGFyRGlyZWN0ID0gdmVjMyggMC4wICk7CnZlYzMgY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdCA9IHZlYzMoIDAuMCApOwp2ZWMzIHNoZWVuU3BlY3VsYXJEaXJlY3QgPSB2ZWMzKCAwLjAgKTsKdmVjMyBzaGVlblNwZWN1bGFySW5kaXJlY3QgPSB2ZWMzKDAuMCApOwp2ZWMzIFNjaGxpY2tfdG9fRjAoIGNvbnN0IGluIHZlYzMgZiwgY29uc3QgaW4gZmxvYXQgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHsKICAgIGZsb2F0IHggPSBjbGFtcCggMS4wIC0gZG90VkgsIDAuMCwgMS4wICk7CiAgICBmbG9hdCB4MiA9IHggKiB4OwogICAgZmxvYXQgeDUgPSBjbGFtcCggeCAqIHgyICogeDIsIDAuMCwgMC45OTk5ICk7CiAgICByZXR1cm4gKCBmIC0gdmVjMyggZjkwICkgKiB4NSApIC8gKCAxLjAgLSB4NSApOwp9CmZsb2F0IFZfR0dYX1NtaXRoQ29ycmVsYXRlZCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHsKCWZsb2F0IGEyID0gcG93MiggYWxwaGEgKTsKCWZsb2F0IGd2ID0gZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTsKCWZsb2F0IGdsID0gZG90TlYgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTsKCXJldHVybiAwLjUgLyBtYXgoIGd2ICsgZ2wsIEVQU0lMT04gKTsKfQpmbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkgewoJZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApOwoJZmxvYXQgZGVub20gPSBwb3cyKCBkb3ROSCApICogKCBhMiAtIDEuMCApICsgMS4wOwoJcmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7Cn0KI2lmZGVmIFVTRV9BTklTT1RST1BZCglmbG9hdCBWX0dHWF9TbWl0aENvcnJlbGF0ZWRfQW5pc290cm9waWMoIGNvbnN0IGluIGZsb2F0IGFscGhhVCwgY29uc3QgaW4gZmxvYXQgYWxwaGFCLCBjb25zdCBpbiBmbG9hdCBkb3RUViwgY29uc3QgaW4gZmxvYXQgZG90QlYsIGNvbnN0IGluIGZsb2F0IGRvdFRMLCBjb25zdCBpbiBmbG9hdCBkb3RCTCwgY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IGRvdE5MICkgewoJCWZsb2F0IGd2ID0gZG90TkwgKiBsZW5ndGgoIHZlYzMoIGFscGhhVCAqIGRvdFRWLCBhbHBoYUIgKiBkb3RCViwgZG90TlYgKSApOwoJCWZsb2F0IGdsID0gZG90TlYgKiBsZW5ndGgoIHZlYzMoIGFscGhhVCAqIGRvdFRMLCBhbHBoYUIgKiBkb3RCTCwgZG90TkwgKSApOwoJCWZsb2F0IHYgPSAwLjUgLyAoIGd2ICsgZ2wgKTsKCQlyZXR1cm4gc2F0dXJhdGUodik7Cgl9CglmbG9hdCBEX0dHWF9Bbmlzb3Ryb3BpYyggY29uc3QgaW4gZmxvYXQgYWxwaGFULCBjb25zdCBpbiBmbG9hdCBhbHBoYUIsIGNvbnN0IGluIGZsb2F0IGRvdE5ILCBjb25zdCBpbiBmbG9hdCBkb3RUSCwgY29uc3QgaW4gZmxvYXQgZG90QkggKSB7CgkJZmxvYXQgYTIgPSBhbHBoYVQgKiBhbHBoYUI7CgkJaGlnaHAgdmVjMyB2ID0gdmVjMyggYWxwaGFCICogZG90VEgsIGFscGhhVCAqIGRvdEJILCBhMiAqIGRvdE5IICk7CgkJaGlnaHAgZmxvYXQgdjIgPSBkb3QoIHYsIHYgKTsKCQlmbG9hdCB3MiA9IGEyIC8gdjI7CgkJcmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAqIHBvdzIgKCB3MiApOwoJfQojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVQKCXZlYzMgQlJERl9HR1hfQ2xlYXJjb2F0KCBjb25zdCBpbiB2ZWMzIGxpZ2h0RGlyLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsKSB7CgkJdmVjMyBmMCA9IG1hdGVyaWFsLmNsZWFyY29hdEYwOwoJCWZsb2F0IGY5MCA9IG1hdGVyaWFsLmNsZWFyY29hdEY5MDsKCQlmbG9hdCByb3VnaG5lc3MgPSBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3M7CgkJZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTsKCQl2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGxpZ2h0RGlyICsgdmlld0RpciApOwoJCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBsaWdodERpciApICk7CgkJZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApOwoJCWZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTsKCQlmbG9hdCBkb3RWSCA9IHNhdHVyYXRlKCBkb3QoIHZpZXdEaXIsIGhhbGZEaXIgKSApOwoJCXZlYzMgRiA9IEZfU2NobGljayggZjAsIGY5MCwgZG90VkggKTsKCQlmbG9hdCBWID0gVl9HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7CgkJZmxvYXQgRCA9IERfR0dYKCBhbHBoYSwgZG90TkggKTsKCQlyZXR1cm4gRiAqICggViAqIEQgKTsKCX0KI2VuZGlmCnZlYzMgQlJERl9HR1goIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwgKSB7Cgl2ZWMzIGYwID0gbWF0ZXJpYWwuc3BlY3VsYXJDb2xvcjsKCWZsb2F0IGY5MCA9IG1hdGVyaWFsLnNwZWN1bGFyRjkwOwoJZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwucm91Z2huZXNzOwoJZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTsKCXZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggbGlnaHREaXIgKyB2aWV3RGlyICk7CglmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgbGlnaHREaXIgKSApOwoJZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApOwoJZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApOwoJZmxvYXQgZG90VkggPSBzYXR1cmF0ZSggZG90KCB2aWV3RGlyLCBoYWxmRGlyICkgKTsKCXZlYzMgRiA9IEZfU2NobGljayggZjAsIGY5MCwgZG90VkggKTsKCSNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCQlGID0gbWl4KCBGLCBtYXRlcmlhbC5pcmlkZXNjZW5jZUZyZXNuZWwsIG1hdGVyaWFsLmlyaWRlc2NlbmNlICk7CgkjZW5kaWYKCSNpZmRlZiBVU0VfQU5JU09UUk9QWQoJCWZsb2F0IGRvdFRMID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5VCwgbGlnaHREaXIgKTsKCQlmbG9hdCBkb3RUViA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weVQsIHZpZXdEaXIgKTsKCQlmbG9hdCBkb3RUSCA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weVQsIGhhbGZEaXIgKTsKCQlmbG9hdCBkb3RCTCA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weUIsIGxpZ2h0RGlyICk7CgkJZmxvYXQgZG90QlYgPSBkb3QoIG1hdGVyaWFsLmFuaXNvdHJvcHlCLCB2aWV3RGlyICk7CgkJZmxvYXQgZG90QkggPSBkb3QoIG1hdGVyaWFsLmFuaXNvdHJvcHlCLCBoYWxmRGlyICk7CgkJZmxvYXQgViA9IFZfR0dYX1NtaXRoQ29ycmVsYXRlZF9Bbmlzb3Ryb3BpYyggbWF0ZXJpYWwuYWxwaGFULCBhbHBoYSwgZG90VFYsIGRvdEJWLCBkb3RUTCwgZG90QkwsIGRvdE5WLCBkb3ROTCApOwoJCWZsb2F0IEQgPSBEX0dHWF9Bbmlzb3Ryb3BpYyggbWF0ZXJpYWwuYWxwaGFULCBhbHBoYSwgZG90TkgsIGRvdFRILCBkb3RCSCApOwoJI2Vsc2UKCQlmbG9hdCBWID0gVl9HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7CgkJZmxvYXQgRCA9IERfR0dYKCBhbHBoYSwgZG90TkggKTsKCSNlbmRpZgoJcmV0dXJuIEYgKiAoIFYgKiBEICk7Cn0KdmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7Cgljb25zdCBmbG9hdCBMVVRfU0laRSA9IDY0LjA7Cgljb25zdCBmbG9hdCBMVVRfU0NBTEUgPSAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0laRTsKCWNvbnN0IGZsb2F0IExVVF9CSUFTID0gMC41IC8gTFVUX1NJWkU7CglmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIE4sIFYgKSApOwoJdmVjMiB1diA9IHZlYzIoIHJvdWdobmVzcywgc3FydCggMS4wIC0gZG90TlYgKSApOwoJdXYgPSB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTOwoJcmV0dXJuIHV2Owp9CmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkgewoJZmxvYXQgbCA9IGxlbmd0aCggZiApOwoJcmV0dXJuIG1heCggKCBsICogbCArIGYueiApIC8gKCBsICsgMS4wICksIDAuMCApOwp9CnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkgewoJZmxvYXQgeCA9IGRvdCggdjEsIHYyICk7CglmbG9hdCB5ID0gYWJzKCB4ICk7CglmbG9hdCBhID0gMC44NTQzOTg1ICsgKCAwLjQ5NjUxNTUgKyAwLjAxNDUyMDYgKiB5ICkgKiB5OwoJZmxvYXQgYiA9IDMuNDE3NTk0MCArICggNC4xNjE2NzI0ICsgeSApICogeTsKCWZsb2F0IHYgPSBhIC8gYjsKCWZsb2F0IHRoZXRhX3NpbnRoZXRhID0gKCB4ID4gMC4wICkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIG1heCggMS4wIC0geCAqIHgsIDFlLTcgKSApIC0gdjsKCXJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTsKfQp2ZWMzIExUQ19FdmFsdWF0ZSggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIHZlYzMgUCwgY29uc3QgaW4gbWF0MyBtSW52LCBjb25zdCBpbiB2ZWMzIHJlY3RDb29yZHNbIDQgXSApIHsKCXZlYzMgdjEgPSByZWN0Q29vcmRzWyAxIF0gLSByZWN0Q29vcmRzWyAwIF07Cgl2ZWMzIHYyID0gcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdOwoJdmVjMyBsaWdodE5vcm1hbCA9IGNyb3NzKCB2MSwgdjIgKTsKCWlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVjdENvb3Jkc1sgMCBdICkgPCAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7Cgl2ZWMzIFQxLCBUMjsKCVQxID0gbm9ybWFsaXplKCBWIC0gTiAqIGRvdCggViwgTiApICk7CglUMiA9IC0gY3Jvc3MoIE4sIFQxICk7CgltYXQzIG1hdCA9IG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApOwoJdmVjMyBjb29yZHNbIDQgXTsKCWNvb3Jkc1sgMCBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAwIF0gLSBQICk7Cgljb29yZHNbIDEgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApOwoJY29vcmRzWyAyIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDIgXSAtIFAgKTsKCWNvb3Jkc1sgMyBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7Cgljb29yZHNbIDAgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTsKCWNvb3Jkc1sgMSBdID0gbm9ybWFsaXplKCBjb29yZHNbIDEgXSApOwoJY29vcmRzWyAyIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMiBdICk7Cgljb29yZHNbIDMgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTsKCXZlYzMgdmVjdG9yRm9ybUZhY3RvciA9IHZlYzMoIDAuMCApOwoJdmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSApOwoJdmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApOwoJdmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMiBdLCBjb29yZHNbIDMgXSApOwoJdmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAgXSApOwoJZmxvYXQgcmVzdWx0ID0gTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICk7CglyZXR1cm4gdmVjMyggcmVzdWx0ICk7Cn0KI2lmIGRlZmluZWQoIFVTRV9TSEVFTiApCmZsb2F0IERfQ2hhcmxpZSggZmxvYXQgcm91Z2huZXNzLCBmbG9hdCBkb3ROSCApIHsKCWZsb2F0IGFscGhhID0gcG93Miggcm91Z2huZXNzICk7CglmbG9hdCBpbnZBbHBoYSA9IDEuMCAvIGFscGhhOwoJZmxvYXQgY29zMmggPSBkb3ROSCAqIGRvdE5IOwoJZmxvYXQgc2luMmggPSBtYXgoIDEuMCAtIGNvczJoLCAwLjAwNzgxMjUgKTsKCXJldHVybiAoIDIuMCArIGludkFscGhhICkgKiBwb3coIHNpbjJoLCBpbnZBbHBoYSAqIDAuNSApIC8gKCAyLjAgKiBQSSApOwp9CmZsb2F0IFZfTmV1YmVsdCggZmxvYXQgZG90TlYsIGZsb2F0IGRvdE5MICkgewoJcmV0dXJuIHNhdHVyYXRlKCAxLjAgLyAoIDQuMCAqICggZG90TkwgKyBkb3ROViAtIGRvdE5MICogZG90TlYgKSApICk7Cn0KdmVjMyBCUkRGX1NoZWVuKCBjb25zdCBpbiB2ZWMzIGxpZ2h0RGlyLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCB2ZWMzIHNoZWVuQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoZWVuUm91Z2huZXNzICkgewoJdmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTsKCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBsaWdodERpciApICk7CglmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7CglmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaGFsZkRpciApICk7CglmbG9hdCBEID0gRF9DaGFybGllKCBzaGVlblJvdWdobmVzcywgZG90TkggKTsKCWZsb2F0IFYgPSBWX05ldWJlbHQoIGRvdE5WLCBkb3ROTCApOwoJcmV0dXJuIHNoZWVuQ29sb3IgKiAoIEQgKiBWICk7Cn0KI2VuZGlmCmZsb2F0IElCTFNoZWVuQlJERiggY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkgewoJZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApOwoJZmxvYXQgcjIgPSByb3VnaG5lc3MgKiByb3VnaG5lc3M7CglmbG9hdCBhID0gcm91Z2huZXNzIDwgMC4yNSA/IC0zMzkuMiAqIHIyICsgMTYxLjQgKiByb3VnaG5lc3MgLSAyNS45IDogLTguNDggKiByMiArIDE0LjMgKiByb3VnaG5lc3MgLSA5Ljk1OwoJZmxvYXQgYiA9IHJvdWdobmVzcyA8IDAuMjUgPyA0NC4wICogcjIgLSAyMy43ICogcm91Z2huZXNzICsgMy4yNiA6IDEuOTcgKiByMiAtIDMuMjcgKiByb3VnaG5lc3MgKyAwLjcyOwoJZmxvYXQgREcgPSBleHAoIGEgKiBkb3ROViArIGIgKSArICggcm91Z2huZXNzIDwgMC4yNSA/IDAuMCA6IDAuMSAqICggcm91Z2huZXNzIC0gMC4yNSApICk7CglyZXR1cm4gc2F0dXJhdGUoIERHICogUkVDSVBST0NBTF9QSSApOwp9CnZlYzIgREZHQXBwcm94KCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7CglmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7Cgljb25zdCB2ZWM0IGMwID0gdmVjNCggLSAxLCAtIDAuMDI3NSwgLSAwLjU3MiwgMC4wMjIgKTsKCWNvbnN0IHZlYzQgYzEgPSB2ZWM0KCAxLCAwLjA0MjUsIDEuMDQsIC0gMC4wNCApOwoJdmVjNCByID0gcm91Z2huZXNzICogYzAgKyBjMTsKCWZsb2F0IGEwMDQgPSBtaW4oIHIueCAqIHIueCwgZXhwMiggLSA5LjI4ICogZG90TlYgKSApICogci54ICsgci55OwoJdmVjMiBmYWIgPSB2ZWMyKCAtIDEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3OwoJcmV0dXJuIGZhYjsKfQp2ZWMzIEVudmlyb25tZW50QlJERiggY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzcGVjdWxhckY5MCwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkgewoJdmVjMiBmYWIgPSBERkdBcHByb3goIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7CglyZXR1cm4gc3BlY3VsYXJDb2xvciAqIGZhYi54ICsgc3BlY3VsYXJGOTAgKiBmYWIueTsKfQojaWZkZWYgVVNFX0lSSURFU0NFTkNFCnZvaWQgY29tcHV0ZU11bHRpc2NhdHRlcmluZ0lyaWRlc2NlbmNlKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiBmbG9hdCBpcmlkZXNjZW5jZSwgY29uc3QgaW4gdmVjMyBpcmlkZXNjZW5jZUYwLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGlub3V0IHZlYzMgc2luZ2xlU2NhdHRlciwgaW5vdXQgdmVjMyBtdWx0aVNjYXR0ZXIgKSB7CiNlbHNlCnZvaWQgY29tcHV0ZU11bHRpc2NhdHRlcmluZyggY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzcGVjdWxhckY5MCwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBpbm91dCB2ZWMzIHNpbmdsZVNjYXR0ZXIsIGlub3V0IHZlYzMgbXVsdGlTY2F0dGVyICkgewojZW5kaWYKCXZlYzIgZmFiID0gREZHQXBwcm94KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApOwoJI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJCXZlYzMgRnIgPSBtaXgoIHNwZWN1bGFyQ29sb3IsIGlyaWRlc2NlbmNlRjAsIGlyaWRlc2NlbmNlICk7CgkjZWxzZQoJCXZlYzMgRnIgPSBzcGVjdWxhckNvbG9yOwoJI2VuZGlmCgl2ZWMzIEZzc0VzcyA9IEZyICogZmFiLnggKyBzcGVjdWxhckY5MCAqIGZhYi55OwoJZmxvYXQgRXNzID0gZmFiLnggKyBmYWIueTsKCWZsb2F0IEVtcyA9IDEuMCAtIEVzczsKCXZlYzMgRmF2ZyA9IEZyICsgKCAxLjAgLSBGciApICogMC4wNDc2MTk7CXZlYzMgRm1zID0gRnNzRXNzICogRmF2ZyAvICggMS4wIC0gRW1zICogRmF2ZyApOwoJc2luZ2xlU2NhdHRlciArPSBGc3NFc3M7CgltdWx0aVNjYXR0ZXIgKz0gRm1zICogRW1zOwp9CiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAKCXZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJCXZlYzMgbm9ybWFsID0gZ2VvbWV0cnlOb3JtYWw7CgkJdmVjMyB2aWV3RGlyID0gZ2VvbWV0cnlWaWV3RGlyOwoJCXZlYzMgcG9zaXRpb24gPSBnZW9tZXRyeVBvc2l0aW9uOwoJCXZlYzMgbGlnaHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uOwoJCXZlYzMgaGFsZldpZHRoID0gcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7CgkJdmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0OwoJCXZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7CgkJZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwucm91Z2huZXNzOwoJCXZlYzMgcmVjdENvb3Jkc1sgNCBdOwoJCXJlY3RDb29yZHNbIDAgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoIC0gaGFsZkhlaWdodDsJCXJlY3RDb29yZHNbIDEgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDsKCQlyZWN0Q29vcmRzWyAyIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7CgkJcmVjdENvb3Jkc1sgMyBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0OwoJCXZlYzIgdXYgPSBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7CgkJdmVjNCB0MSA9IHRleHR1cmUyRCggbHRjXzEsIHV2ICk7CgkJdmVjNCB0MiA9IHRleHR1cmUyRCggbHRjXzIsIHV2ICk7CgkJbWF0MyBtSW52ID0gbWF0MygKCQkJdmVjMyggdDEueCwgMCwgdDEueSApLAoJCQl2ZWMzKCAgICAwLCAxLCAgICAwICksCgkJCXZlYzMoIHQxLnosIDAsIHQxLncgKQoJCSk7CgkJdmVjMyBmcmVzbmVsID0gKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogdDIueCArICggdmVjMyggMS4wICkgLSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICkgKiB0Mi55ICk7CgkJcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gbGlnaHRDb2xvciAqIGZyZXNuZWwgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTsKCQlyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEuMCApLCByZWN0Q29vcmRzICk7Cgl9CiNlbmRpZgp2b2lkIFJFX0RpcmVjdF9QaHlzaWNhbCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CglmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApOwoJdmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjsKCSNpZmRlZiBVU0VfQ0xFQVJDT0FUCgkJZmxvYXQgZG90TkxjYyA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApOwoJCXZlYzMgY2NJcnJhZGlhbmNlID0gZG90TkxjYyAqIGRpcmVjdExpZ2h0LmNvbG9yOwoJCWNsZWFyY29hdFNwZWN1bGFyRGlyZWN0ICs9IGNjSXJyYWRpYW5jZSAqIEJSREZfR0dYX0NsZWFyY29hdCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbCApOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1NIRUVOCgkJc2hlZW5TcGVjdWxhckRpcmVjdCArPSBpcnJhZGlhbmNlICogQlJERl9TaGVlbiggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbC5zaGVlbkNvbG9yLCBtYXRlcmlhbC5zaGVlblJvdWdobmVzcyApOwoJI2VuZGlmCglyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9HR1goIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeU5vcm1hbCwgbWF0ZXJpYWwgKTsKCXJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7Cn0Kdm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7Cn0Kdm9pZCBSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIHJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgY2xlYXJjb2F0UmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0KSB7CgkjaWZkZWYgVVNFX0NMRUFSQ09BVAoJCWNsZWFyY29hdFNwZWN1bGFySW5kaXJlY3QgKz0gY2xlYXJjb2F0UmFkaWFuY2UgKiBFbnZpcm9ubWVudEJSREYoIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIG1hdGVyaWFsLmNsZWFyY29hdEYwLCBtYXRlcmlhbC5jbGVhcmNvYXRGOTAsIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyApOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1NIRUVOCgkJc2hlZW5TcGVjdWxhckluZGlyZWN0ICs9IGlycmFkaWFuY2UgKiBtYXRlcmlhbC5zaGVlbkNvbG9yICogSUJMU2hlZW5CUkRGKCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBtYXRlcmlhbC5zaGVlblJvdWdobmVzcyApOwoJI2VuZGlmCgl2ZWMzIHNpbmdsZVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgbXVsdGlTY2F0dGVyaW5nID0gdmVjMyggMC4wICk7Cgl2ZWMzIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZSA9IGlycmFkaWFuY2UgKiBSRUNJUFJPQ0FMX1BJOwoJI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJCWNvbXB1dGVNdWx0aXNjYXR0ZXJpbmdJcmlkZXNjZW5jZSggZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsIG1hdGVyaWFsLmlyaWRlc2NlbmNlLCBtYXRlcmlhbC5pcmlkZXNjZW5jZUZyZXNuZWwsIG1hdGVyaWFsLnJvdWdobmVzcywgc2luZ2xlU2NhdHRlcmluZywgbXVsdGlTY2F0dGVyaW5nICk7CgkjZWxzZQoJCWNvbXB1dGVNdWx0aXNjYXR0ZXJpbmcoIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyRjkwLCBtYXRlcmlhbC5yb3VnaG5lc3MsIHNpbmdsZVNjYXR0ZXJpbmcsIG11bHRpU2NhdHRlcmluZyApOwoJI2VuZGlmCgl2ZWMzIHRvdGFsU2NhdHRlcmluZyA9IHNpbmdsZVNjYXR0ZXJpbmcgKyBtdWx0aVNjYXR0ZXJpbmc7Cgl2ZWMzIGRpZmZ1c2UgPSBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiAoIDEuMCAtIG1heCggbWF4KCB0b3RhbFNjYXR0ZXJpbmcuciwgdG90YWxTY2F0dGVyaW5nLmcgKSwgdG90YWxTY2F0dGVyaW5nLmIgKSApOwoJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArPSByYWRpYW5jZSAqIHNpbmdsZVNjYXR0ZXJpbmc7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IG11bHRpU2NhdHRlcmluZyAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBkaWZmdXNlICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlOwp9CiNkZWZpbmUgUkVfRGlyZWN0CQkJCVJFX0RpcmVjdF9QaHlzaWNhbAojZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYQkJUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsCiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlCQlSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwKI2RlZmluZSBSRV9JbmRpcmVjdFNwZWN1bGFyCQlSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsCmZsb2F0IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IGFtYmllbnRPY2NsdXNpb24sIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHsKCXJldHVybiBzYXR1cmF0ZSggcG93KCBkb3ROViArIGFtYmllbnRPY2NsdXNpb24sIGV4cDIoIC0gMTYuMCAqIHJvdWdobmVzcyAtIDEuMCApICkgLSAxLjAgKyBhbWJpZW50T2NjbHVzaW9uICk7Cn1gLGV3PWAKdmVjMyBnZW9tZXRyeVBvc2l0aW9uID0gLSB2Vmlld1Bvc2l0aW9uOwp2ZWMzIGdlb21ldHJ5Tm9ybWFsID0gbm9ybWFsOwp2ZWMzIGdlb21ldHJ5Vmlld0RpciA9ICggaXNPcnRob2dyYXBoaWMgKSA/IHZlYzMoIDAsIDAsIDEgKSA6IG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApOwp2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsID0gdmVjMyggMC4wICk7CiNpZmRlZiBVU0VfQ0xFQVJDT0FUCglnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCA9IGNsZWFyY29hdE5vcm1hbDsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCWZsb2F0IGRvdE5WaSA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyICkgKTsKCWlmICggbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MgPT0gMC4wICkgewoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlID0gMC4wOwoJfSBlbHNlIHsKCQltYXRlcmlhbC5pcmlkZXNjZW5jZSA9IHNhdHVyYXRlKCBtYXRlcmlhbC5pcmlkZXNjZW5jZSApOwoJfQoJaWYgKCBtYXRlcmlhbC5pcmlkZXNjZW5jZSA+IDAuMCApIHsKCQltYXRlcmlhbC5pcmlkZXNjZW5jZUZyZXNuZWwgPSBldmFsSXJpZGVzY2VuY2UoIDEuMCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2VJT1IsIGRvdE5WaSwgbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKTsKCQltYXRlcmlhbC5pcmlkZXNjZW5jZUYwID0gU2NobGlja190b19GMCggbWF0ZXJpYWwuaXJpZGVzY2VuY2VGcmVzbmVsLCAxLjAsIGRvdE5WaSApOwoJfQojZW5kaWYKSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDsKI2lmICggTlVNX1BPSU5UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKQoJUG9pbnRMaWdodCBwb2ludExpZ2h0OwoJI2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAKCVBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodFNoYWRvdzsKCSNlbmRpZgoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHsKCQlwb2ludExpZ2h0ID0gcG9pbnRMaWdodHNbIGkgXTsKCQlnZXRQb2ludExpZ2h0SW5mbyggcG9pbnRMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZGlyZWN0TGlnaHQgKTsKCQkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTICkKCQlwb2ludExpZ2h0U2hhZG93ID0gcG9pbnRMaWdodFNoYWRvd3NbIGkgXTsKCQlkaXJlY3RMaWdodC5jb2xvciAqPSAoIGRpcmVjdExpZ2h0LnZpc2libGUgJiYgcmVjZWl2ZVNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dJbnRlbnNpdHksIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93QmlhcywgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0sIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFGYXIgKSA6IDEuMDsKCQkjZW5kaWYKCQlSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWYKI2lmICggTlVNX1NQT1RfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApCglTcG90TGlnaHQgc3BvdExpZ2h0OwoJdmVjNCBzcG90Q29sb3I7Cgl2ZWMzIHNwb3RMaWdodENvb3JkOwoJYm9vbCBpblNwb3RMaWdodE1hcDsKCSNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDAKCVNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3c7CgkjZW5kaWYKCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHsKCQlzcG90TGlnaHQgPSBzcG90TGlnaHRzWyBpIF07CgkJZ2V0U3BvdExpZ2h0SW5mbyggc3BvdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBkaXJlY3RMaWdodCApOwoJCSNpZiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUyApCgkJI2RlZmluZSBTUE9UX0xJR0hUX01BUF9JTkRFWCBVTlJPTExFRF9MT09QX0lOREVYCgkJI2VsaWYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyApCgkJI2RlZmluZSBTUE9UX0xJR0hUX01BUF9JTkRFWCBOVU1fU1BPVF9MSUdIVF9NQVBTCgkJI2Vsc2UKCQkjZGVmaW5lIFNQT1RfTElHSFRfTUFQX0lOREVYICggVU5ST0xMRURfTE9PUF9JTkRFWCAtIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUyApCgkJI2VuZGlmCgkJI2lmICggU1BPVF9MSUdIVF9NQVBfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9NQVBTICkKCQkJc3BvdExpZ2h0Q29vcmQgPSB2U3BvdExpZ2h0Q29vcmRbIGkgXS54eXogLyB2U3BvdExpZ2h0Q29vcmRbIGkgXS53OwoJCQlpblNwb3RMaWdodE1hcCA9IGFsbCggbGVzc1RoYW4oIGFicyggc3BvdExpZ2h0Q29vcmQgKiAyLiAtIDEuICksIHZlYzMoIDEuMCApICkgKTsKCQkJc3BvdENvbG9yID0gdGV4dHVyZTJEKCBzcG90TGlnaHRNYXBbIFNQT1RfTElHSFRfTUFQX0lOREVYIF0sIHNwb3RMaWdodENvb3JkLnh5ICk7CgkJCWRpcmVjdExpZ2h0LmNvbG9yID0gaW5TcG90TGlnaHRNYXAgPyBkaXJlY3RMaWdodC5jb2xvciAqIHNwb3RDb2xvci5yZ2IgOiBkaXJlY3RMaWdodC5jb2xvcjsKCQkjZW5kaWYKCQkjdW5kZWYgU1BPVF9MSUdIVF9NQVBfSU5ERVgKCQkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKQoJCXNwb3RMaWdodFNoYWRvdyA9IHNwb3RMaWdodFNoYWRvd3NbIGkgXTsKCQlkaXJlY3RMaWdodC5jb2xvciAqPSAoIGRpcmVjdExpZ2h0LnZpc2libGUgJiYgcmVjZWl2ZVNoYWRvdyApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93SW50ZW5zaXR5LCBzcG90TGlnaHRTaGFkb3cuc2hhZG93Qmlhcywgc3BvdExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdlNwb3RMaWdodENvb3JkWyBpIF0gKSA6IDEuMDsKCQkjZW5kaWYKCQlSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWYKI2lmICggTlVNX0RJUl9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0ICkKCURpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDsKCSNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMAoJRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93OwoJI2VuZGlmCgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHsKCQlkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTsKCQlnZXREaXJlY3Rpb25hbExpZ2h0SW5mbyggZGlyZWN0aW9uYWxMaWdodCwgZGlyZWN0TGlnaHQgKTsKCQkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUyApCgkJZGlyZWN0aW9uYWxMaWdodFNoYWRvdyA9IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBpIF07CgkJZGlyZWN0TGlnaHQuY29sb3IgKj0gKCBkaXJlY3RMaWdodC52aXNpYmxlICYmIHJlY2VpdmVTaGFkb3cgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd0ludGVuc2l0eSwgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wOwoJCSNlbmRpZgoJCVJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5UG9zaXRpb24sIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTsKCX0KCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCiNlbmRpZgojaWYgKCBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3RfUmVjdEFyZWEgKQoJUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0OwoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1JFQ1RfQVJFQV9MSUdIVFM7IGkgKysgKSB7CgkJcmVjdEFyZWFMaWdodCA9IHJlY3RBcmVhTGlnaHRzWyBpIF07CgkJUkVfRGlyZWN0X1JlY3RBcmVhKCByZWN0QXJlYUxpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWYKI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApCgl2ZWMzIGlibElycmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgaXJyYWRpYW5jZSA9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7CgkjaWYgZGVmaW5lZCggVVNFX0xJR0hUX1BST0JFUyApCgkJaXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnlOb3JtYWwgKTsKCSNlbmRpZgoJI2lmICggTlVNX0hFTUlfTElHSFRTID4gMCApCgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHsKCQkJaXJyYWRpYW5jZSArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5Tm9ybWFsICk7CgkJfQoJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkjZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyICkKCXZlYzMgcmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgY2xlYXJjb2F0UmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKI2VuZGlmYCxudz1gI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApCgkjaWZkZWYgVVNFX0xJR0hUTUFQCgkJdmVjNCBsaWdodE1hcFRleGVsID0gdGV4dHVyZTJEKCBsaWdodE1hcCwgdkxpZ2h0TWFwVXYgKTsKCQl2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IGxpZ2h0TWFwVGV4ZWwucmdiICogbGlnaHRNYXBJbnRlbnNpdHk7CgkJaXJyYWRpYW5jZSArPSBsaWdodE1hcElycmFkaWFuY2U7CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggU1RBTkRBUkQgKSAmJiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWICkKCQlpYmxJcnJhZGlhbmNlICs9IGdldElCTElycmFkaWFuY2UoIGdlb21ldHJ5Tm9ybWFsICk7CgkjZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApCgkjaWZkZWYgVVNFX0FOSVNPVFJPUFkKCQlyYWRpYW5jZSArPSBnZXRJQkxBbmlzb3Ryb3B5UmFkaWFuY2UoIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnJvdWdobmVzcywgbWF0ZXJpYWwuYW5pc290cm9weUIsIG1hdGVyaWFsLmFuaXNvdHJvcHkgKTsKCSNlbHNlCgkJcmFkaWFuY2UgKz0gZ2V0SUJMUmFkaWFuY2UoIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnJvdWdobmVzcyApOwoJI2VuZGlmCgkjaWZkZWYgVVNFX0NMRUFSQ09BVAoJCWNsZWFyY29hdFJhZGlhbmNlICs9IGdldElCTFJhZGlhbmNlKCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTsKCSNlbmRpZgojZW5kaWZgLGl3PWAjaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlICkKCVJFX0luZGlyZWN0RGlmZnVzZSggaXJyYWRpYW5jZSwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApOwojZW5kaWYKI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKQoJUkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGlibElycmFkaWFuY2UsIGNsZWFyY29hdFJhZGlhbmNlLCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7CiNlbmRpZmAscnc9YCNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKQoJZ2xfRnJhZ0RlcHRoID0gdklzUGVyc3BlY3RpdmUgPT0gMC4wID8gZ2xfRnJhZ0Nvb3JkLnogOiBsb2cyKCB2RnJhZ0RlcHRoICkgKiBsb2dEZXB0aEJ1ZkZDICogMC41OwojZW5kaWZgLHN3PWAjaWYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGICkKCXVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQzsKCXZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDsKCXZhcnlpbmcgZmxvYXQgdklzUGVyc3BlY3RpdmU7CiNlbmRpZmAsb3c9YCNpZmRlZiBVU0VfTE9HREVQVEhCVUYKCXZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDsKCXZhcnlpbmcgZmxvYXQgdklzUGVyc3BlY3RpdmU7CiNlbmRpZmAsYXc9YCNpZmRlZiBVU0VfTE9HREVQVEhCVUYKCXZGcmFnRGVwdGggPSAxLjAgKyBnbF9Qb3NpdGlvbi53OwoJdklzUGVyc3BlY3RpdmUgPSBmbG9hdCggaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApICk7CiNlbmRpZmAsbHc9YCNpZmRlZiBVU0VfTUFQCgl2ZWM0IHNhbXBsZWREaWZmdXNlQ29sb3IgPSB0ZXh0dXJlMkQoIG1hcCwgdk1hcFV2ICk7CgkjaWZkZWYgREVDT0RFX1ZJREVPX1RFWFRVUkUKCQlzYW1wbGVkRGlmZnVzZUNvbG9yID0gdmVjNCggbWl4KCBwb3coIHNhbXBsZWREaWZmdXNlQ29sb3IucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHNhbXBsZWREaWZmdXNlQ29sb3IucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCBzYW1wbGVkRGlmZnVzZUNvbG9yLnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCBzYW1wbGVkRGlmZnVzZUNvbG9yLncgKTsKCQoJI2VuZGlmCglkaWZmdXNlQ29sb3IgKj0gc2FtcGxlZERpZmZ1c2VDb2xvcjsKI2VuZGlmYCxjdz1gI2lmZGVmIFVTRV9NQVAKCXVuaWZvcm0gc2FtcGxlcjJEIG1hcDsKI2VuZGlmYCx1dz1gI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKQoJI2lmIGRlZmluZWQoIFVTRV9QT0lOVFNfVVYgKQoJCXZlYzIgdXYgPSB2VXY7CgkjZWxzZQoJCXZlYzIgdXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnksIDEgKSApLnh5OwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX01BUAoJZGlmZnVzZUNvbG9yICo9IHRleHR1cmUyRCggbWFwLCB1diApOwojZW5kaWYKI2lmZGVmIFVTRV9BTFBIQU1BUAoJZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdXYgKS5nOwojZW5kaWZgLGh3PWAjaWYgZGVmaW5lZCggVVNFX1BPSU5UU19VViApCgl2YXJ5aW5nIHZlYzIgdlV2OwojZWxzZQoJI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKQoJCXVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9NQVAKCXVuaWZvcm0gc2FtcGxlcjJEIG1hcDsKI2VuZGlmCiNpZmRlZiBVU0VfQUxQSEFNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwOwojZW5kaWZgLGZ3PWBmbG9hdCBtZXRhbG5lc3NGYWN0b3IgPSBtZXRhbG5lc3M7CiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQCgl2ZWM0IHRleGVsTWV0YWxuZXNzID0gdGV4dHVyZTJEKCBtZXRhbG5lc3NNYXAsIHZNZXRhbG5lc3NNYXBVdiApOwoJbWV0YWxuZXNzRmFjdG9yICo9IHRleGVsTWV0YWxuZXNzLmI7CiNlbmRpZmAsZHc9YCNpZmRlZiBVU0VfTUVUQUxORVNTTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBtZXRhbG5lc3NNYXA7CiNlbmRpZmAscHc9YCNpZmRlZiBVU0VfSU5TVEFOQ0lOR19NT1JQSAoJZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBNT1JQSFRBUkdFVFNfQ09VTlQgXTsKCWZsb2F0IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZSA9IHRleGVsRmV0Y2goIG1vcnBoVGV4dHVyZSwgaXZlYzIoIDAsIGdsX0luc3RhbmNlSUQgKSwgMCApLnI7Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBNT1JQSFRBUkdFVFNfQ09VTlQ7IGkgKysgKSB7CgkJbW9ycGhUYXJnZXRJbmZsdWVuY2VzW2ldID0gIHRleGVsRmV0Y2goIG1vcnBoVGV4dHVyZSwgaXZlYzIoIGkgKyAxLCBnbF9JbnN0YW5jZUlEICksIDAgKS5yOwoJfQojZW5kaWZgLG13PWAjaWYgZGVmaW5lZCggVVNFX01PUlBIQ09MT1JTICkKCXZDb2xvciAqPSBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBNT1JQSFRBUkdFVFNfQ09VTlQ7IGkgKysgKSB7CgkJI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApCgkJCWlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gIT0gMC4wICkgdkNvbG9yICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07CgkJI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkKCQkJaWYgKCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSAhPSAwLjAgKSB2Q29sb3IgKz0gZ2V0TW9ycGgoIGdsX1ZlcnRleElELCBpLCAyICkucmdiICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07CgkJI2VuZGlmCgl9CiNlbmRpZmAsZ3c9YCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTCglvYmplY3ROb3JtYWwgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlOwoJZm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkgewoJCWlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gIT0gMC4wICkgb2JqZWN0Tm9ybWFsICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMSApLnh5eiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdOwoJfQojZW5kaWZgLHl3PWAjaWZkZWYgVVNFX01PUlBIVEFSR0VUUwoJI2lmbmRlZiBVU0VfSU5TVEFOQ0lOR19NT1JQSAoJCXVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlOwoJCXVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBNT1JQSFRBUkdFVFNfQ09VTlQgXTsKCSNlbmRpZgoJdW5pZm9ybSBzYW1wbGVyMkRBcnJheSBtb3JwaFRhcmdldHNUZXh0dXJlOwoJdW5pZm9ybSBpdmVjMiBtb3JwaFRhcmdldHNUZXh0dXJlU2l6ZTsKCXZlYzQgZ2V0TW9ycGgoIGNvbnN0IGluIGludCB2ZXJ0ZXhJbmRleCwgY29uc3QgaW4gaW50IG1vcnBoVGFyZ2V0SW5kZXgsIGNvbnN0IGluIGludCBvZmZzZXQgKSB7CgkJaW50IHRleGVsSW5kZXggPSB2ZXJ0ZXhJbmRleCAqIE1PUlBIVEFSR0VUU19URVhUVVJFX1NUUklERSArIG9mZnNldDsKCQlpbnQgeSA9IHRleGVsSW5kZXggLyBtb3JwaFRhcmdldHNUZXh0dXJlU2l6ZS54OwoJCWludCB4ID0gdGV4ZWxJbmRleCAtIHkgKiBtb3JwaFRhcmdldHNUZXh0dXJlU2l6ZS54OwoJCWl2ZWMzIG1vcnBoVVYgPSBpdmVjMyggeCwgeSwgbW9ycGhUYXJnZXRJbmRleCApOwoJCXJldHVybiB0ZXhlbEZldGNoKCBtb3JwaFRhcmdldHNUZXh0dXJlLCBtb3JwaFVWLCAwICk7Cgl9CiNlbmRpZmAsdnc9YCNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTCgl0cmFuc2Zvcm1lZCAqPSBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBNT1JQSFRBUkdFVFNfQ09VTlQ7IGkgKysgKSB7CgkJaWYgKCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSAhPSAwLjAgKSB0cmFuc2Zvcm1lZCArPSBnZXRNb3JwaCggZ2xfVmVydGV4SUQsIGksIDAgKS54eXogKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTsKCX0KI2VuZGlmYCxfdz1gZmxvYXQgZmFjZURpcmVjdGlvbiA9IGdsX0Zyb250RmFjaW5nID8gMS4wIDogLSAxLjA7CiNpZmRlZiBGTEFUX1NIQURFRAoJdmVjMyBmZHggPSBkRmR4KCB2Vmlld1Bvc2l0aW9uICk7Cgl2ZWMzIGZkeSA9IGRGZHkoIHZWaWV3UG9zaXRpb24gKTsKCXZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCBjcm9zcyggZmR4LCBmZHkgKSApOwojZWxzZQoJdmVjMyBub3JtYWwgPSBub3JtYWxpemUoIHZOb3JtYWwgKTsKCSNpZmRlZiBET1VCTEVfU0lERUQKCQlub3JtYWwgKj0gZmFjZURpcmVjdGlvbjsKCSNlbmRpZgojZW5kaWYKI2lmIGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFICkgfHwgZGVmaW5lZCggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU5JU09UUk9QWSApCgkjaWZkZWYgVVNFX1RBTkdFTlQKCQltYXQzIHRibiA9IG1hdDMoIG5vcm1hbGl6ZSggdlRhbmdlbnQgKSwgbm9ybWFsaXplKCB2Qml0YW5nZW50ICksIG5vcm1hbCApOwoJI2Vsc2UKCQltYXQzIHRibiA9IGdldFRhbmdlbnRGcmFtZSggLSB2Vmlld1Bvc2l0aW9uLCBub3JtYWwsCgkJI2lmIGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKQoJCQl2Tm9ybWFsTWFwVXYKCQkjZWxpZiBkZWZpbmVkKCBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCApCgkJCXZDbGVhcmNvYXROb3JtYWxNYXBVdgoJCSNlbHNlCgkJCXZVdgoJCSNlbmRpZgoJCSk7CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBET1VCTEVfU0lERUQgKSAmJiAhIGRlZmluZWQoIEZMQVRfU0hBREVEICkKCQl0Ym5bMF0gKj0gZmFjZURpcmVjdGlvbjsKCQl0Ym5bMV0gKj0gZmFjZURpcmVjdGlvbjsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQCgkjaWZkZWYgVVNFX1RBTkdFTlQKCQltYXQzIHRibjIgPSBtYXQzKCBub3JtYWxpemUoIHZUYW5nZW50ICksIG5vcm1hbGl6ZSggdkJpdGFuZ2VudCApLCBub3JtYWwgKTsKCSNlbHNlCgkJbWF0MyB0Ym4yID0gZ2V0VGFuZ2VudEZyYW1lKCAtIHZWaWV3UG9zaXRpb24sIG5vcm1hbCwgdkNsZWFyY29hdE5vcm1hbE1hcFV2ICk7CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBET1VCTEVfU0lERUQgKSAmJiAhIGRlZmluZWQoIEZMQVRfU0hBREVEICkKCQl0Ym4yWzBdICo9IGZhY2VEaXJlY3Rpb247CgkJdGJuMlsxXSAqPSBmYWNlRGlyZWN0aW9uOwoJI2VuZGlmCiNlbmRpZgp2ZWMzIG5vblBlcnR1cmJlZE5vcm1hbCA9IG5vcm1hbDtgLHh3PWAjaWZkZWYgVVNFX05PUk1BTE1BUF9PQkpFQ1RTUEFDRQoJbm9ybWFsID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZOb3JtYWxNYXBVdiApLnh5eiAqIDIuMCAtIDEuMDsKCSNpZmRlZiBGTElQX1NJREVECgkJbm9ybWFsID0gLSBub3JtYWw7CgkjZW5kaWYKCSNpZmRlZiBET1VCTEVfU0lERUQKCQlub3JtYWwgPSBub3JtYWwgKiBmYWNlRGlyZWN0aW9uOwoJI2VuZGlmCglub3JtYWwgPSBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApOwojZWxpZiBkZWZpbmVkKCBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSApCgl2ZWMzIG1hcE4gPSB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdk5vcm1hbE1hcFV2ICkueHl6ICogMi4wIC0gMS4wOwoJbWFwTi54eSAqPSBub3JtYWxTY2FsZTsKCW5vcm1hbCA9IG5vcm1hbGl6ZSggdGJuICogbWFwTiApOwojZWxpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApCglub3JtYWwgPSBwZXJ0dXJiTm9ybWFsQXJiKCAtIHZWaWV3UG9zaXRpb24sIG5vcm1hbCwgZEhkeHlfZndkKCksIGZhY2VEaXJlY3Rpb24gKTsKI2VuZGlmYCxNdz1gI2lmbmRlZiBGTEFUX1NIQURFRAoJdmFyeWluZyB2ZWMzIHZOb3JtYWw7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQl2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7CgkJdmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7CgkjZW5kaWYKI2VuZGlmYCxTdz1gI2lmbmRlZiBGTEFUX1NIQURFRAoJdmFyeWluZyB2ZWMzIHZOb3JtYWw7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQl2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7CgkJdmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7CgkjZW5kaWYKI2VuZGlmYCxidz1gI2lmbmRlZiBGTEFUX1NIQURFRAoJdk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTsKCSNpZmRlZiBVU0VfVEFOR0VOVAoJCXZUYW5nZW50ID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZFRhbmdlbnQgKTsKCQl2Qml0YW5nZW50ID0gbm9ybWFsaXplKCBjcm9zcyggdk5vcm1hbCwgdlRhbmdlbnQgKSAqIHRhbmdlbnQudyApOwoJI2VuZGlmCiNlbmRpZmAsd3c9YCNpZmRlZiBVU0VfTk9STUFMTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxNYXA7Cgl1bmlmb3JtIHZlYzIgbm9ybWFsU2NhbGU7CiNlbmRpZgojaWZkZWYgVVNFX05PUk1BTE1BUF9PQkpFQ1RTUEFDRQoJdW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDsKI2VuZGlmCiNpZiAhIGRlZmluZWQgKCBVU0VfVEFOR0VOVCApICYmICggZGVmaW5lZCAoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFICkgfHwgZGVmaW5lZCAoIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKSApCgltYXQzIGdldFRhbmdlbnRGcmFtZSggdmVjMyBleWVfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiB1diApIHsKCQl2ZWMzIHEwID0gZEZkeCggZXllX3Bvcy54eXogKTsKCQl2ZWMzIHExID0gZEZkeSggZXllX3Bvcy54eXogKTsKCQl2ZWMyIHN0MCA9IGRGZHgoIHV2LnN0ICk7CgkJdmVjMiBzdDEgPSBkRmR5KCB1di5zdCApOwoJCXZlYzMgTiA9IHN1cmZfbm9ybTsKCQl2ZWMzIHExcGVycCA9IGNyb3NzKCBxMSwgTiApOwoJCXZlYzMgcTBwZXJwID0gY3Jvc3MoIE4sIHEwICk7CgkJdmVjMyBUID0gcTFwZXJwICogc3QwLnggKyBxMHBlcnAgKiBzdDEueDsKCQl2ZWMzIEIgPSBxMXBlcnAgKiBzdDAueSArIHEwcGVycCAqIHN0MS55OwoJCWZsb2F0IGRldCA9IG1heCggZG90KCBULCBUICksIGRvdCggQiwgQiApICk7CgkJZmxvYXQgc2NhbGUgPSAoIGRldCA9PSAwLjAgKSA/IDAuMCA6IGludmVyc2VzcXJ0KCBkZXQgKTsKCQlyZXR1cm4gbWF0MyggVCAqIHNjYWxlLCBCICogc2NhbGUsIE4gKTsKCX0KI2VuZGlmYCxBdz1gI2lmZGVmIFVTRV9DTEVBUkNPQVQKCXZlYzMgY2xlYXJjb2F0Tm9ybWFsID0gbm9uUGVydHVyYmVkTm9ybWFsOwojZW5kaWZgLEV3PWAjaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAKCXZlYzMgY2xlYXJjb2F0TWFwTiA9IHRleHR1cmUyRCggY2xlYXJjb2F0Tm9ybWFsTWFwLCB2Q2xlYXJjb2F0Tm9ybWFsTWFwVXYgKS54eXogKiAyLjAgLSAxLjA7CgljbGVhcmNvYXRNYXBOLnh5ICo9IGNsZWFyY29hdE5vcm1hbFNjYWxlOwoJY2xlYXJjb2F0Tm9ybWFsID0gbm9ybWFsaXplKCB0Ym4yICogY2xlYXJjb2F0TWFwTiApOwojZW5kaWZgLFR3PWAjaWZkZWYgVVNFX0NMRUFSQ09BVE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0TWFwOwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXROb3JtYWxNYXA7Cgl1bmlmb3JtIHZlYzIgY2xlYXJjb2F0Tm9ybWFsU2NhbGU7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdFJvdWdobmVzc01hcDsKI2VuZGlmYCxDdz1gI2lmZGVmIFVTRV9JUklERVNDRU5DRU1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgaXJpZGVzY2VuY2VNYXA7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgaXJpZGVzY2VuY2VUaGlja25lc3NNYXA7CiNlbmRpZmAsUnc9YCNpZmRlZiBPUEFRVUUKZGlmZnVzZUNvbG9yLmEgPSAxLjA7CiNlbmRpZgojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgpkaWZmdXNlQ29sb3IuYSAqPSBtYXRlcmlhbC50cmFuc21pc3Npb25BbHBoYTsKI2VuZGlmCmdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7YCxQdz1gdmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkgewoJcmV0dXJuIG5vcm1hbGl6ZSggbm9ybWFsICkgKiAwLjUgKyAwLjU7Cn0KdmVjMyB1bnBhY2tSR0JUb05vcm1hbCggY29uc3QgaW4gdmVjMyByZ2IgKSB7CglyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDsKfQpjb25zdCBmbG9hdCBQYWNrVXBzY2FsZSA9IDI1Ni4gLyAyNTUuO2NvbnN0IGZsb2F0IFVucGFja0Rvd25zY2FsZSA9IDI1NS4gLyAyNTYuO2NvbnN0IGZsb2F0IFNoaWZ0UmlnaHQ4ID0gMS4gLyAyNTYuOwpjb25zdCBmbG9hdCBJbnYyNTUgPSAxLiAvIDI1NS47CmNvbnN0IHZlYzQgUGFja0ZhY3RvcnMgPSB2ZWM0KCAxLjAsIDI1Ni4wLCAyNTYuMCAqIDI1Ni4wLCAyNTYuMCAqIDI1Ni4wICogMjU2LjAgKTsKY29uc3QgdmVjMiBVbnBhY2tGYWN0b3JzMiA9IHZlYzIoIFVucGFja0Rvd25zY2FsZSwgMS4wIC8gUGFja0ZhY3RvcnMuZyApOwpjb25zdCB2ZWMzIFVucGFja0ZhY3RvcnMzID0gdmVjMyggVW5wYWNrRG93bnNjYWxlIC8gUGFja0ZhY3RvcnMucmcsIDEuMCAvIFBhY2tGYWN0b3JzLmIgKTsKY29uc3QgdmVjNCBVbnBhY2tGYWN0b3JzNCA9IHZlYzQoIFVucGFja0Rvd25zY2FsZSAvIFBhY2tGYWN0b3JzLnJnYiwgMS4wIC8gUGFja0ZhY3RvcnMuYSApOwp2ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHsKCWlmKCB2IDw9IDAuMCApCgkJcmV0dXJuIHZlYzQoIDAuLCAwLiwgMC4sIDAuICk7CglpZiggdiA+PSAxLjAgKQoJCXJldHVybiB2ZWM0KCAxLiwgMS4sIDEuLCAxLiApOwoJZmxvYXQgdnVmOwoJZmxvYXQgYWYgPSBtb2RmKCB2ICogUGFja0ZhY3RvcnMuYSwgdnVmICk7CglmbG9hdCBiZiA9IG1vZGYoIHZ1ZiAqIFNoaWZ0UmlnaHQ4LCB2dWYgKTsKCWZsb2F0IGdmID0gbW9kZiggdnVmICogU2hpZnRSaWdodDgsIHZ1ZiApOwoJcmV0dXJuIHZlYzQoIHZ1ZiAqIEludjI1NSwgZ2YgKiBQYWNrVXBzY2FsZSwgYmYgKiBQYWNrVXBzY2FsZSwgYWYgKTsKfQp2ZWMzIHBhY2tEZXB0aFRvUkdCKCBjb25zdCBpbiBmbG9hdCB2ICkgewoJaWYoIHYgPD0gMC4wICkKCQlyZXR1cm4gdmVjMyggMC4sIDAuLCAwLiApOwoJaWYoIHYgPj0gMS4wICkKCQlyZXR1cm4gdmVjMyggMS4sIDEuLCAxLiApOwoJZmxvYXQgdnVmOwoJZmxvYXQgYmYgPSBtb2RmKCB2ICogUGFja0ZhY3RvcnMuYiwgdnVmICk7CglmbG9hdCBnZiA9IG1vZGYoIHZ1ZiAqIFNoaWZ0UmlnaHQ4LCB2dWYgKTsKCXJldHVybiB2ZWMzKCB2dWYgKiBJbnYyNTUsIGdmICogUGFja1Vwc2NhbGUsIGJmICk7Cn0KdmVjMiBwYWNrRGVwdGhUb1JHKCBjb25zdCBpbiBmbG9hdCB2ICkgewoJaWYoIHYgPD0gMC4wICkKCQlyZXR1cm4gdmVjMiggMC4sIDAuICk7CglpZiggdiA+PSAxLjAgKQoJCXJldHVybiB2ZWMyKCAxLiwgMS4gKTsKCWZsb2F0IHZ1ZjsKCWZsb2F0IGdmID0gbW9kZiggdiAqIDI1Ni4sIHZ1ZiApOwoJcmV0dXJuIHZlYzIoIHZ1ZiAqIEludjI1NSwgZ2YgKTsKfQpmbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCggY29uc3QgaW4gdmVjNCB2ICkgewoJcmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9yczQgKTsKfQpmbG9hdCB1bnBhY2tSR0JUb0RlcHRoKCBjb25zdCBpbiB2ZWMzIHYgKSB7CglyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzMyApOwp9CmZsb2F0IHVucGFja1JHVG9EZXB0aCggY29uc3QgaW4gdmVjMiB2ICkgewoJcmV0dXJuIHYuciAqIFVucGFja0ZhY3RvcnMyLnIgKyB2LmcgKiBVbnBhY2tGYWN0b3JzMi5nOwp9CnZlYzQgcGFjazJIYWxmVG9SR0JBKCBjb25zdCBpbiB2ZWMyIHYgKSB7Cgl2ZWM0IHIgPSB2ZWM0KCB2LngsIGZyYWN0KCB2LnggKiAyNTUuMCApLCB2LnksIGZyYWN0KCB2LnkgKiAyNTUuMCApICk7CglyZXR1cm4gdmVjNCggci54IC0gci55IC8gMjU1LjAsIHIueSwgci56IC0gci53IC8gMjU1LjAsIHIudyApOwp9CnZlYzIgdW5wYWNrUkdCQVRvMkhhbGYoIGNvbnN0IGluIHZlYzQgdiApIHsKCXJldHVybiB2ZWMyKCB2LnggKyAoIHYueSAvIDI1NS4wICksIHYueiArICggdi53IC8gMjU1LjAgKSApOwp9CmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHsKCXJldHVybiAoIHZpZXdaICsgbmVhciApIC8gKCBuZWFyIC0gZmFyICk7Cn0KZmxvYXQgb3J0aG9ncmFwaGljRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBkZXB0aCwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkgewoJcmV0dXJuIGRlcHRoICogKCBuZWFyIC0gZmFyICkgLSBuZWFyOwp9CmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkgewoJcmV0dXJuICggKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7Cn0KZmxvYXQgcGVyc3BlY3RpdmVEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGRlcHRoLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7CglyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogZGVwdGggLSBmYXIgKTsKfWAsSXc9YCNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBCglnbF9GcmFnQ29sb3IucmdiICo9IGdsX0ZyYWdDb2xvci5hOwojZW5kaWZgLEx3PWB2ZWM0IG12UG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7CiNpZmRlZiBVU0VfQkFUQ0hJTkcKCW12UG9zaXRpb24gPSBiYXRjaGluZ01hdHJpeCAqIG12UG9zaXRpb247CiNlbmRpZgojaWZkZWYgVVNFX0lOU1RBTkNJTkcKCW12UG9zaXRpb24gPSBpbnN0YW5jZU1hdHJpeCAqIG12UG9zaXRpb247CiNlbmRpZgptdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogbXZQb3NpdGlvbjsKZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtgLER3PWAjaWZkZWYgRElUSEVSSU5HCglnbF9GcmFnQ29sb3IucmdiID0gZGl0aGVyaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7CiNlbmRpZmAsVXc9YCNpZmRlZiBESVRIRVJJTkcKCXZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkgewoJCWZsb2F0IGdyaWRfcG9zaXRpb24gPSByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTsKCQl2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgPSB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApOwoJCWRpdGhlcl9zaGlmdF9SR0IgPSBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7CgkJcmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjsKCX0KI2VuZGlmYCxOdz1gZmxvYXQgcm91Z2huZXNzRmFjdG9yID0gcm91Z2huZXNzOwojaWZkZWYgVVNFX1JPVUdITkVTU01BUAoJdmVjNCB0ZXhlbFJvdWdobmVzcyA9IHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2Um91Z2huZXNzTWFwVXYgKTsKCXJvdWdobmVzc0ZhY3RvciAqPSB0ZXhlbFJvdWdobmVzcy5nOwojZW5kaWZgLEZ3PWAjaWZkZWYgVVNFX1JPVUdITkVTU01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgcm91Z2huZXNzTWFwOwojZW5kaWZgLE93PWAjaWYgTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMAoJdmFyeWluZyB2ZWM0IHZTcG90TGlnaHRDb29yZFsgTlVNX1NQT1RfTElHSFRfQ09PUkRTIF07CiNlbmRpZgojaWYgTlVNX1NQT1RfTElHSFRfTUFQUyA+IDAKCXVuaWZvcm0gc2FtcGxlcjJEIHNwb3RMaWdodE1hcFsgTlVNX1NQT1RfTElHSFRfTUFQUyBdOwojZW5kaWYKI2lmZGVmIFVTRV9TSEFET1dNQVAKCSNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJCXZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07CgkJc3RydWN0IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dJbnRlbnNpdHk7CgkJCWZsb2F0IHNoYWRvd0JpYXM7CgkJCWZsb2F0IHNoYWRvd05vcm1hbEJpYXM7CgkJCWZsb2F0IHNoYWRvd1JhZGl1czsKCQkJdmVjMiBzaGFkb3dNYXBTaXplOwoJCX07CgkJdW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTsKCSNlbmRpZgoJI2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBTcG90TGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dJbnRlbnNpdHk7CgkJCWZsb2F0IHNoYWRvd0JpYXM7CgkJCWZsb2F0IHNoYWRvd05vcm1hbEJpYXM7CgkJCWZsb2F0IHNoYWRvd1JhZGl1czsKCQkJdmVjMiBzaGFkb3dNYXBTaXplOwoJCX07CgkJdW5pZm9ybSBTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93c1sgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCgkjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07CgkJdmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93SW50ZW5zaXR5OwoJCQlmbG9hdCBzaGFkb3dCaWFzOwoJCQlmbG9hdCBzaGFkb3dOb3JtYWxCaWFzOwoJCQlmbG9hdCBzaGFkb3dSYWRpdXM7CgkJCXZlYzIgc2hhZG93TWFwU2l6ZTsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhRmFyOwoJCX07CgkJdW5pZm9ybSBQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3dzWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCglmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkgewoJCXJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApOwoJfQoJdmVjMiB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYgKSB7CgkJcmV0dXJuIHVucGFja1JHQkFUbzJIYWxmKCB0ZXh0dXJlMkQoIHNoYWRvdywgdXYgKSApOwoJfQoJZmxvYXQgVlNNU2hhZG93IChzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICl7CgkJZmxvYXQgb2NjbHVzaW9uID0gMS4wOwoJCXZlYzIgZGlzdHJpYnV0aW9uID0gdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzaGFkb3csIHV2ICk7CgkJZmxvYXQgaGFyZF9zaGFkb3cgPSBzdGVwKCBjb21wYXJlICwgZGlzdHJpYnV0aW9uLnggKTsKCQlpZiAoaGFyZF9zaGFkb3cgIT0gMS4wICkgewoJCQlmbG9hdCBkaXN0YW5jZSA9IGNvbXBhcmUgLSBkaXN0cmlidXRpb24ueCA7CgkJCWZsb2F0IHZhcmlhbmNlID0gbWF4KCAwLjAwMDAwLCBkaXN0cmlidXRpb24ueSAqIGRpc3RyaWJ1dGlvbi55ICk7CgkJCWZsb2F0IHNvZnRuZXNzX3Byb2JhYmlsaXR5ID0gdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkaXN0YW5jZSAqIGRpc3RhbmNlICk7CQkJc29mdG5lc3NfcHJvYmFiaWxpdHkgPSBjbGFtcCggKCBzb2Z0bmVzc19wcm9iYWJpbGl0eSAtIDAuMyApIC8gKCAwLjk1IC0gMC4zICksIDAuMCwgMS4wICk7CQkJb2NjbHVzaW9uID0gY2xhbXAoIG1heCggaGFyZF9zaGFkb3csIHNvZnRuZXNzX3Byb2JhYmlsaXR5ICksIDAuMCwgMS4wICk7CgkJfQoJCXJldHVybiBvY2NsdXNpb247Cgl9CglmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93SW50ZW5zaXR5LCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7CgkJZmxvYXQgc2hhZG93ID0gMS4wOwoJCXNoYWRvd0Nvb3JkLnh5eiAvPSBzaGFkb3dDb29yZC53OwoJCXNoYWRvd0Nvb3JkLnogKz0gc2hhZG93QmlhczsKCQlib29sIGluRnJ1c3R1bSA9IHNoYWRvd0Nvb3JkLnggPj0gMC4wICYmIHNoYWRvd0Nvb3JkLnggPD0gMS4wICYmIHNoYWRvd0Nvb3JkLnkgPj0gMC4wICYmIHNoYWRvd0Nvb3JkLnkgPD0gMS4wOwoJCWJvb2wgZnJ1c3R1bVRlc3QgPSBpbkZydXN0dW0gJiYgc2hhZG93Q29vcmQueiA8PSAxLjA7CgkJaWYgKCBmcnVzdHVtVGVzdCApIHsKCQkjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkKCQkJdmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7CgkJCWZsb2F0IGR4MCA9IC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7CgkJCWZsb2F0IGR5MCA9IC0gdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7CgkJCWZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7CgkJCWZsb2F0IGR5MSA9ICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7CgkJCWZsb2F0IGR4MiA9IGR4MCAvIDIuMDsKCQkJZmxvYXQgZHkyID0gZHkwIC8gMi4wOwoJCQlmbG9hdCBkeDMgPSBkeDEgLyAyLjA7CgkJCWZsb2F0IGR5MyA9IGR5MSAvIDIuMDsKCQkJc2hhZG93ID0gKAoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56ICkKCQkJKSAqICggMS4wIC8gMTcuMCApOwoJCSNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUICkKCQkJdmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7CgkJCWZsb2F0IGR4ID0gdGV4ZWxTaXplLng7CgkJCWZsb2F0IGR5ID0gdGV4ZWxTaXplLnk7CgkJCXZlYzIgdXYgPSBzaGFkb3dDb29yZC54eTsKCQkJdmVjMiBmID0gZnJhY3QoIHV2ICogc2hhZG93TWFwU2l6ZSArIDAuNSApOwoJCQl1diAtPSBmICogdGV4ZWxTaXplOwoJCQlzaGFkb3cgPSAoCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2LCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAwLjAsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdGV4ZWxTaXplLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIGYueCApICsKCQkJCW1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIC1keCwgZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgZi54ICkgKwoJCQkJbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCAtZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIGYueSApICsKCQkJCW1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgZi55ICkgKwoJCQkJbWl4KCBtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJCSAgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCQkgIGYueCApLAoJCQkJCSBtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkJICB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkJICBmLnggKSwKCQkJCQkgZi55ICkKCQkJKSAqICggMS4wIC8gOS4wICk7CgkJI2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNICkKCQkJc2hhZG93ID0gVlNNU2hhZG93KCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7CgkJI2Vsc2UKCQkJc2hhZG93ID0gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApOwoJCSNlbmRpZgoJCX0KCQlyZXR1cm4gbWl4KCAxLjAsIHNoYWRvdywgc2hhZG93SW50ZW5zaXR5ICk7Cgl9Cgl2ZWMyIGN1YmVUb1VWKCB2ZWMzIHYsIGZsb2F0IHRleGVsU2l6ZVkgKSB7CgkJdmVjMyBhYnNWID0gYWJzKCB2ICk7CgkJZmxvYXQgc2NhbGVUb0N1YmUgPSAxLjAgLyBtYXgoIGFic1YueCwgbWF4KCBhYnNWLnksIGFic1YueiApICk7CgkJYWJzViAqPSBzY2FsZVRvQ3ViZTsKCQl2ICo9IHNjYWxlVG9DdWJlICogKCAxLjAgLSAyLjAgKiB0ZXhlbFNpemVZICk7CgkJdmVjMiBwbGFuYXIgPSB2Lnh5OwoJCWZsb2F0IGFsbW9zdEFUZXhlbCA9IDEuNSAqIHRleGVsU2l6ZVk7CgkJZmxvYXQgYWxtb3N0T25lID0gMS4wIC0gYWxtb3N0QVRleGVsOwoJCWlmICggYWJzVi56ID49IGFsbW9zdE9uZSApIHsKCQkJaWYgKCB2LnogPiAwLjAgKQoJCQkJcGxhbmFyLnggPSA0LjAgLSB2Lng7CgkJfSBlbHNlIGlmICggYWJzVi54ID49IGFsbW9zdE9uZSApIHsKCQkJZmxvYXQgc2lnblggPSBzaWduKCB2LnggKTsKCQkJcGxhbmFyLnggPSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YOwoJCX0gZWxzZSBpZiAoIGFic1YueSA+PSBhbG1vc3RPbmUgKSB7CgkJCWZsb2F0IHNpZ25ZID0gc2lnbiggdi55ICk7CgkJCXBsYW5hci54ID0gdi54ICsgMi4wICogc2lnblkgKyAyLjA7CgkJCXBsYW5hci55ID0gdi56ICogc2lnblkgLSAyLjA7CgkJfQoJCXJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTsKCX0KCWZsb2F0IGdldFBvaW50U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0ludGVuc2l0eSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7CgkJZmxvYXQgc2hhZG93ID0gMS4wOwoJCXZlYzMgbGlnaHRUb1Bvc2l0aW9uID0gc2hhZG93Q29vcmQueHl6OwoJCQoJCWZsb2F0IGxpZ2h0VG9Qb3NpdGlvbkxlbmd0aCA9IGxlbmd0aCggbGlnaHRUb1Bvc2l0aW9uICk7CgkJaWYgKCBsaWdodFRvUG9zaXRpb25MZW5ndGggLSBzaGFkb3dDYW1lcmFGYXIgPD0gMC4wICYmIGxpZ2h0VG9Qb3NpdGlvbkxlbmd0aCAtIHNoYWRvd0NhbWVyYU5lYXIgPj0gMC4wICkgewoJCQlmbG9hdCBkcCA9ICggbGlnaHRUb1Bvc2l0aW9uTGVuZ3RoIC0gc2hhZG93Q2FtZXJhTmVhciApIC8gKCBzaGFkb3dDYW1lcmFGYXIgLSBzaGFkb3dDYW1lcmFOZWFyICk7CQkJZHAgKz0gc2hhZG93QmlhczsKCQkJdmVjMyBiZDNEID0gbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTsKCQkJdmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTsKCQkJI2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNICkKCQkJCXZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTsKCQkJCXNoYWRvdyA9ICgKCQkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXksIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh5LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwICkKCQkJCSkgKiAoIDEuMCAvIDkuMCApOwoJCQkjZWxzZQoJCQkJc2hhZG93ID0gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKTsKCQkJI2VuZGlmCgkJfQoJCXJldHVybiBtaXgoIDEuMCwgc2hhZG93LCBzaGFkb3dJbnRlbnNpdHkgKTsKCX0KI2VuZGlmYCxCdz1gI2lmIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyA+IDAKCXVuaWZvcm0gbWF0NCBzcG90TGlnaHRNYXRyaXhbIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyBdOwoJdmFyeWluZyB2ZWM0IHZTcG90TGlnaHRDb29yZFsgTlVNX1NQT1RfTElHSFRfQ09PUkRTIF07CiNlbmRpZgojaWZkZWYgVVNFX1NIQURPV01BUAoJI2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAKCQl1bmlmb3JtIG1hdDQgZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJCXZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07CgkJc3RydWN0IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dJbnRlbnNpdHk7CgkJCWZsb2F0IHNoYWRvd0JpYXM7CgkJCWZsb2F0IHNoYWRvd05vcm1hbEJpYXM7CgkJCWZsb2F0IHNoYWRvd1JhZGl1czsKCQkJdmVjMiBzaGFkb3dNYXBTaXplOwoJCX07CgkJdW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTsKCSNlbmRpZgoJI2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwCgkJc3RydWN0IFNwb3RMaWdodFNoYWRvdyB7CgkJCWZsb2F0IHNoYWRvd0ludGVuc2l0eTsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJfTsKCQl1bmlmb3JtIFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3dzWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07CgkjZW5kaWYKCSNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAKCQl1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07CgkJdmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93SW50ZW5zaXR5OwoJCQlmbG9hdCBzaGFkb3dCaWFzOwoJCQlmbG9hdCBzaGFkb3dOb3JtYWxCaWFzOwoJCQlmbG9hdCBzaGFkb3dSYWRpdXM7CgkJCXZlYzIgc2hhZG93TWFwU2l6ZTsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhRmFyOwoJCX07CgkJdW5pZm9ybSBQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3dzWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCiNlbmRpZmAsenc9YCNpZiAoIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAgfHwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwICkgKSB8fCAoIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyA+IDAgKQoJdmVjMyBzaGFkb3dXb3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7Cgl2ZWM0IHNoYWRvd1dvcmxkUG9zaXRpb247CiNlbmRpZgojaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApCgkjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMAoJCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7CgkJCXNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uICsgdmVjNCggc2hhZG93V29ybGROb3JtYWwgKiBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdLnNoYWRvd05vcm1hbEJpYXMsIDAgKTsKCQkJdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSA9IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBpIF0gKiBzaGFkb3dXb3JsZFBvc2l0aW9uOwoJCX0KCQkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwCgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTOyBpICsrICkgewoJCQlzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbiArIHZlYzQoIHNoYWRvd1dvcmxkTm9ybWFsICogcG9pbnRMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7CgkJCXZQb2ludFNoYWRvd0Nvb3JkWyBpIF0gPSBwb2ludFNoYWRvd01hdHJpeFsgaSBdICogc2hhZG93V29ybGRQb3NpdGlvbjsKCQl9CgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKCSNlbmRpZgojZW5kaWYKI2lmIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyA+IDAKCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUX0NPT1JEUzsgaSArKyApIHsKCQlzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbjsKCQkjaWYgKCBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKQoJCQlzaGFkb3dXb3JsZFBvc2l0aW9uLnh5eiArPSBzaGFkb3dXb3JsZE5vcm1hbCAqIHNwb3RMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzOwoJCSNlbmRpZgoJCXZTcG90TGlnaHRDb29yZFsgaSBdID0gc3BvdExpZ2h0TWF0cml4WyBpIF0gKiBzaGFkb3dXb3JsZFBvc2l0aW9uOwoJfQoJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKI2VuZGlmYCxrdz1gZmxvYXQgZ2V0U2hhZG93TWFzaygpIHsKCWZsb2F0IHNoYWRvdyA9IDEuMDsKCSNpZmRlZiBVU0VfU0hBRE9XTUFQCgkjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMAoJRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0OwoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkgewoJCWRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdOwoJCXNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93SW50ZW5zaXR5LCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDAKCVNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHQ7CgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkgewoJCXNwb3RMaWdodCA9IHNwb3RMaWdodFNoYWRvd3NbIGkgXTsKCQlzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0ludGVuc2l0eSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90TGlnaHRDb29yZFsgaSBdICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwCglQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHQ7CgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHsKCQlwb2ludExpZ2h0ID0gcG9pbnRMaWdodFNoYWRvd3NbIGkgXTsKCQlzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93SW50ZW5zaXR5LCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjZW5kaWYKCXJldHVybiBzaGFkb3c7Cn1gLEd3PWAjaWZkZWYgVVNFX1NLSU5OSU5HCgltYXQ0IGJvbmVNYXRYID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTsKCW1hdDQgYm9uZU1hdFkgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueSApOwoJbWF0NCBib25lTWF0WiA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC56ICk7CgltYXQ0IGJvbmVNYXRXID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTsKI2VuZGlmYCxWdz1gI2lmZGVmIFVTRV9TS0lOTklORwoJdW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7Cgl1bmlmb3JtIG1hdDQgYmluZE1hdHJpeEludmVyc2U7Cgl1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBib25lVGV4dHVyZTsKCW1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHsKCQlpbnQgc2l6ZSA9IHRleHR1cmVTaXplKCBib25lVGV4dHVyZSwgMCApLng7CgkJaW50IGogPSBpbnQoIGkgKSAqIDQ7CgkJaW50IHggPSBqICUgc2l6ZTsKCQlpbnQgeSA9IGogLyBzaXplOwoJCXZlYzQgdjEgPSB0ZXhlbEZldGNoKCBib25lVGV4dHVyZSwgaXZlYzIoIHgsIHkgKSwgMCApOwoJCXZlYzQgdjIgPSB0ZXhlbEZldGNoKCBib25lVGV4dHVyZSwgaXZlYzIoIHggKyAxLCB5ICksIDAgKTsKCQl2ZWM0IHYzID0gdGV4ZWxGZXRjaCggYm9uZVRleHR1cmUsIGl2ZWMyKCB4ICsgMiwgeSApLCAwICk7CgkJdmVjNCB2NCA9IHRleGVsRmV0Y2goIGJvbmVUZXh0dXJlLCBpdmVjMiggeCArIDMsIHkgKSwgMCApOwoJCXJldHVybiBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApOwoJfQojZW5kaWZgLEh3PWAjaWZkZWYgVVNFX1NLSU5OSU5HCgl2ZWM0IHNraW5WZXJ0ZXggPSBiaW5kTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApOwoJdmVjNCBza2lubmVkID0gdmVjNCggMC4wICk7Cglza2lubmVkICs9IGJvbmVNYXRYICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueDsKCXNraW5uZWQgKz0gYm9uZU1hdFkgKiBza2luVmVydGV4ICogc2tpbldlaWdodC55OwoJc2tpbm5lZCArPSBib25lTWF0WiAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lno7Cglza2lubmVkICs9IGJvbmVNYXRXICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQudzsKCXRyYW5zZm9ybWVkID0gKCBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5uZWQgKS54eXo7CiNlbmRpZmAsV3c9YCNpZmRlZiBVU0VfU0tJTk5JTkcKCW1hdDQgc2tpbk1hdHJpeCA9IG1hdDQoIDAuMCApOwoJc2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnggKiBib25lTWF0WDsKCXNraW5NYXRyaXggKz0gc2tpbldlaWdodC55ICogYm9uZU1hdFk7Cglza2luTWF0cml4ICs9IHNraW5XZWlnaHQueiAqIGJvbmVNYXRaOwoJc2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LncgKiBib25lTWF0VzsKCXNraW5NYXRyaXggPSBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5NYXRyaXggKiBiaW5kTWF0cml4OwoJb2JqZWN0Tm9ybWFsID0gdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdE5vcm1hbCwgMC4wICkgKS54eXo7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQlvYmplY3RUYW5nZW50ID0gdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdFRhbmdlbnQsIDAuMCApICkueHl6OwoJI2VuZGlmCiNlbmRpZmAsJHc9YGZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7CiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVAKCXZlYzQgdGV4ZWxTcGVjdWxhciA9IHRleHR1cmUyRCggc3BlY3VsYXJNYXAsIHZTcGVjdWxhck1hcFV2ICk7CglzcGVjdWxhclN0cmVuZ3RoID0gdGV4ZWxTcGVjdWxhci5yOwojZWxzZQoJc3BlY3VsYXJTdHJlbmd0aCA9IDEuMDsKI2VuZGlmYCxYdz1gI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJNYXA7CiNlbmRpZmAscXc9YCNpZiBkZWZpbmVkKCBUT05FX01BUFBJTkcgKQoJZ2xfRnJhZ0NvbG9yLnJnYiA9IHRvbmVNYXBwaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7CiNlbmRpZmAsWXc9YCNpZm5kZWYgc2F0dXJhdGUKI2RlZmluZSBzYXR1cmF0ZSggYSApIGNsYW1wKCBhLCAwLjAsIDEuMCApCiNlbmRpZgp1bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7CnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7CglyZXR1cm4gc2F0dXJhdGUoIHRvbmVNYXBwaW5nRXhwb3N1cmUgKiBjb2xvciApOwp9CnZlYzMgUmVpbmhhcmRUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHsKCWNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7CglyZXR1cm4gc2F0dXJhdGUoIGNvbG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTsKfQp2ZWMzIENpbmVvblRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgewoJY29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTsKCWNvbG9yID0gbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApOwoJcmV0dXJuIHBvdyggKCBjb2xvciAqICggNi4yICogY29sb3IgKyAwLjUgKSApIC8gKCBjb2xvciAqICggNi4yICogY29sb3IgKyAxLjcgKSArIDAuMDYgKSwgdmVjMyggMi4yICkgKTsKfQp2ZWMzIFJSVEFuZE9EVEZpdCggdmVjMyB2ICkgewoJdmVjMyBhID0gdiAqICggdiArIDAuMDI0NTc4NiApIC0gMC4wMDAwOTA1Mzc7Cgl2ZWMzIGIgPSB2ICogKCAwLjk4MzcyOSAqIHYgKyAwLjQzMjk1MTAgKSArIDAuMjM4MDgxOwoJcmV0dXJuIGEgLyBiOwp9CnZlYzMgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgewoJY29uc3QgbWF0MyBBQ0VTSW5wdXRNYXQgPSBtYXQzKAoJCXZlYzMoIDAuNTk3MTksIDAuMDc2MDAsIDAuMDI4NDAgKSwJCXZlYzMoIDAuMzU0NTgsIDAuOTA4MzQsIDAuMTMzODMgKSwKCQl2ZWMzKCAwLjA0ODIzLCAwLjAxNTY2LCAwLjgzNzc3ICkKCSk7Cgljb25zdCBtYXQzIEFDRVNPdXRwdXRNYXQgPSBtYXQzKAoJCXZlYzMoICAxLjYwNDc1LCAtMC4xMDIwOCwgLTAuMDAzMjcgKSwJCXZlYzMoIC0wLjUzMTA4LCAgMS4xMDgxMywgLTAuMDcyNzYgKSwKCQl2ZWMzKCAtMC4wNzM2NywgLTAuMDA2MDUsICAxLjA3NjAyICkKCSk7Cgljb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlIC8gMC42OwoJY29sb3IgPSBBQ0VTSW5wdXRNYXQgKiBjb2xvcjsKCWNvbG9yID0gUlJUQW5kT0RURml0KCBjb2xvciApOwoJY29sb3IgPSBBQ0VTT3V0cHV0TWF0ICogY29sb3I7CglyZXR1cm4gc2F0dXJhdGUoIGNvbG9yICk7Cn0KY29uc3QgbWF0MyBMSU5FQVJfUkVDMjAyMF9UT19MSU5FQVJfU1JHQiA9IG1hdDMoCgl2ZWMzKCAxLjY2MDUsIC0gMC4xMjQ2LCAtIDAuMDE4MiApLAoJdmVjMyggLSAwLjU4NzYsIDEuMTMyOSwgLSAwLjEwMDYgKSwKCXZlYzMoIC0gMC4wNzI4LCAtIDAuMDA4MywgMS4xMTg3ICkKKTsKY29uc3QgbWF0MyBMSU5FQVJfU1JHQl9UT19MSU5FQVJfUkVDMjAyMCA9IG1hdDMoCgl2ZWMzKCAwLjYyNzQsIDAuMDY5MSwgMC4wMTY0ICksCgl2ZWMzKCAwLjMyOTMsIDAuOTE5NSwgMC4wODgwICksCgl2ZWMzKCAwLjA0MzMsIDAuMDExMywgMC44OTU2ICkKKTsKdmVjMyBhZ3hEZWZhdWx0Q29udHJhc3RBcHByb3goIHZlYzMgeCApIHsKCXZlYzMgeDIgPSB4ICogeDsKCXZlYzMgeDQgPSB4MiAqIHgyOwoJcmV0dXJuICsgMTUuNSAqIHg0ICogeDIKCQktIDQwLjE0ICogeDQgKiB4CgkJKyAzMS45NiAqIHg0CgkJLSA2Ljg2OCAqIHgyICogeAoJCSsgMC40Mjk4ICogeDIKCQkrIDAuMTE5MSAqIHgKCQktIDAuMDAyMzI7Cn0KdmVjMyBBZ1hUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHsKCWNvbnN0IG1hdDMgQWdYSW5zZXRNYXRyaXggPSBtYXQzKAoJCXZlYzMoIDAuODU2NjI3MTUzMzE1OTgzLCAwLjEzNzMxODk3MjkyOTg0NywgMC4xMTE4OTgyMTI5OTk5NSApLAoJCXZlYzMoIDAuMDk1MTIxMjQwNTM4MTU4OCwgMC43NjEyNDE5OTA2MDI1OTEsIDAuMDc2Nzk5NDE4NjAzMTkwMyApLAoJCXZlYzMoIDAuMDQ4MjUxNjA2MTQ1ODU4MywgMC4xMDE0MzkwMzY0Njc1NjIsIDAuODExMzAyMzY4Mzk2ODU5ICkKCSk7Cgljb25zdCBtYXQzIEFnWE91dHNldE1hdHJpeCA9IG1hdDMoCgkJdmVjMyggMS4xMjcxMDA1ODE4MTQ0MzY4LCAtIDAuMTQxMzI5NzYzNDk4NDM4MywgLSAwLjE0MTMyOTc2MzQ5ODQzODI2ICksCgkJdmVjMyggLSAwLjExMDYwNjY0MzA5NjYwMzIzLCAxLjE1NzgyMzcwMjIxNjI3MiwgLSAwLjExMDYwNjY0MzA5NjYwMjk0ICksCgkJdmVjMyggLSAwLjAxNjQ5MzkzODcxNzgzNDU3MywgLSAwLjAxNjQ5MzkzODcxNzgzNDI1NywgMS4yNTE5MzY0MDY1OTUwNDA1ICkKCSk7Cgljb25zdCBmbG9hdCBBZ3hNaW5FdiA9IC0gMTIuNDczOTM7CWNvbnN0IGZsb2F0IEFneE1heEV2ID0gNC4wMjYwNjk7Cgljb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlOwoJY29sb3IgPSBMSU5FQVJfU1JHQl9UT19MSU5FQVJfUkVDMjAyMCAqIGNvbG9yOwoJY29sb3IgPSBBZ1hJbnNldE1hdHJpeCAqIGNvbG9yOwoJY29sb3IgPSBtYXgoIGNvbG9yLCAxZS0xMCApOwljb2xvciA9IGxvZzIoIGNvbG9yICk7Cgljb2xvciA9ICggY29sb3IgLSBBZ3hNaW5FdiApIC8gKCBBZ3hNYXhFdiAtIEFneE1pbkV2ICk7Cgljb2xvciA9IGNsYW1wKCBjb2xvciwgMC4wLCAxLjAgKTsKCWNvbG9yID0gYWd4RGVmYXVsdENvbnRyYXN0QXBwcm94KCBjb2xvciApOwoJY29sb3IgPSBBZ1hPdXRzZXRNYXRyaXggKiBjb2xvcjsKCWNvbG9yID0gcG93KCBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciApLCB2ZWMzKCAyLjIgKSApOwoJY29sb3IgPSBMSU5FQVJfUkVDMjAyMF9UT19MSU5FQVJfU1JHQiAqIGNvbG9yOwoJY29sb3IgPSBjbGFtcCggY29sb3IsIDAuMCwgMS4wICk7CglyZXR1cm4gY29sb3I7Cn0KdmVjMyBOZXV0cmFsVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7Cgljb25zdCBmbG9hdCBTdGFydENvbXByZXNzaW9uID0gMC44IC0gMC4wNDsKCWNvbnN0IGZsb2F0IERlc2F0dXJhdGlvbiA9IDAuMTU7Cgljb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlOwoJZmxvYXQgeCA9IG1pbiggY29sb3IuciwgbWluKCBjb2xvci5nLCBjb2xvci5iICkgKTsKCWZsb2F0IG9mZnNldCA9IHggPCAwLjA4ID8geCAtIDYuMjUgKiB4ICogeCA6IDAuMDQ7Cgljb2xvciAtPSBvZmZzZXQ7CglmbG9hdCBwZWFrID0gbWF4KCBjb2xvci5yLCBtYXgoIGNvbG9yLmcsIGNvbG9yLmIgKSApOwoJaWYgKCBwZWFrIDwgU3RhcnRDb21wcmVzc2lvbiApIHJldHVybiBjb2xvcjsKCWZsb2F0IGQgPSAxLiAtIFN0YXJ0Q29tcHJlc3Npb247CglmbG9hdCBuZXdQZWFrID0gMS4gLSBkICogZCAvICggcGVhayArIGQgLSBTdGFydENvbXByZXNzaW9uICk7Cgljb2xvciAqPSBuZXdQZWFrIC8gcGVhazsKCWZsb2F0IGcgPSAxLiAtIDEuIC8gKCBEZXNhdHVyYXRpb24gKiAoIHBlYWsgLSBuZXdQZWFrICkgKyAxLiApOwoJcmV0dXJuIG1peCggY29sb3IsIHZlYzMoIG5ld1BlYWsgKSwgZyApOwp9CnZlYzMgQ3VzdG9tVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7IHJldHVybiBjb2xvcjsgfWAsWnc9YCNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OCgltYXRlcmlhbC50cmFuc21pc3Npb24gPSB0cmFuc21pc3Npb247CgltYXRlcmlhbC50cmFuc21pc3Npb25BbHBoYSA9IDEuMDsKCW1hdGVyaWFsLnRoaWNrbmVzcyA9IHRoaWNrbmVzczsKCW1hdGVyaWFsLmF0dGVudWF0aW9uRGlzdGFuY2UgPSBhdHRlbnVhdGlvbkRpc3RhbmNlOwoJbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciA9IGF0dGVudWF0aW9uQ29sb3I7CgkjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUAoJCW1hdGVyaWFsLnRyYW5zbWlzc2lvbiAqPSB0ZXh0dXJlMkQoIHRyYW5zbWlzc2lvbk1hcCwgdlRyYW5zbWlzc2lvbk1hcFV2ICkucjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9USElDS05FU1NNQVAKCQltYXRlcmlhbC50aGlja25lc3MgKj0gdGV4dHVyZTJEKCB0aGlja25lc3NNYXAsIHZUaGlja25lc3NNYXBVdiApLmc7CgkjZW5kaWYKCXZlYzMgcG9zID0gdldvcmxkUG9zaXRpb247Cgl2ZWMzIHYgPSBub3JtYWxpemUoIGNhbWVyYVBvc2l0aW9uIC0gcG9zICk7Cgl2ZWMzIG4gPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTsKCXZlYzQgdHJhbnNtaXR0ZWQgPSBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKAoJCW4sIHYsIG1hdGVyaWFsLnJvdWdobmVzcywgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCwKCQlwb3MsIG1vZGVsTWF0cml4LCB2aWV3TWF0cml4LCBwcm9qZWN0aW9uTWF0cml4LCBtYXRlcmlhbC5kaXNwZXJzaW9uLCBtYXRlcmlhbC5pb3IsIG1hdGVyaWFsLnRoaWNrbmVzcywKCQltYXRlcmlhbC5hdHRlbnVhdGlvbkNvbG9yLCBtYXRlcmlhbC5hdHRlbnVhdGlvbkRpc3RhbmNlICk7CgltYXRlcmlhbC50cmFuc21pc3Npb25BbHBoYSA9IG1peCggbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEsIHRyYW5zbWl0dGVkLmEsIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiApOwoJdG90YWxEaWZmdXNlID0gbWl4KCB0b3RhbERpZmZ1c2UsIHRyYW5zbWl0dGVkLnJnYiwgbWF0ZXJpYWwudHJhbnNtaXNzaW9uICk7CiNlbmRpZmAsSnc9YCNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OCgl1bmlmb3JtIGZsb2F0IHRyYW5zbWlzc2lvbjsKCXVuaWZvcm0gZmxvYXQgdGhpY2tuZXNzOwoJdW5pZm9ybSBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlOwoJdW5pZm9ybSB2ZWMzIGF0dGVudWF0aW9uQ29sb3I7CgkjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUAoJCXVuaWZvcm0gc2FtcGxlcjJEIHRyYW5zbWlzc2lvbk1hcDsKCSNlbmRpZgoJI2lmZGVmIFVTRV9USElDS05FU1NNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCB0aGlja25lc3NNYXA7CgkjZW5kaWYKCXVuaWZvcm0gdmVjMiB0cmFuc21pc3Npb25TYW1wbGVyU2l6ZTsKCXVuaWZvcm0gc2FtcGxlcjJEIHRyYW5zbWlzc2lvblNhbXBsZXJNYXA7Cgl1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7Cgl1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsKCXZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjsKCWZsb2F0IHcwKCBmbG9hdCBhICkgewoJCXJldHVybiAoIDEuMCAvIDYuMCApICogKCBhICogKCBhICogKCAtIGEgKyAzLjAgKSAtIDMuMCApICsgMS4wICk7Cgl9CglmbG9hdCB3MSggZmxvYXQgYSApIHsKCQlyZXR1cm4gKCAxLjAgLyA2LjAgKSAqICggYSAqICBhICogKCAzLjAgKiBhIC0gNi4wICkgKyA0LjAgKTsKCX0KCWZsb2F0IHcyKCBmbG9hdCBhICl7CgkJcmV0dXJuICggMS4wIC8gNi4wICkgKiAoIGEgKiAoIGEgKiAoIC0gMy4wICogYSArIDMuMCApICsgMy4wICkgKyAxLjAgKTsKCX0KCWZsb2F0IHczKCBmbG9hdCBhICkgewoJCXJldHVybiAoIDEuMCAvIDYuMCApICogKCBhICogYSAqIGEgKTsKCX0KCWZsb2F0IGcwKCBmbG9hdCBhICkgewoJCXJldHVybiB3MCggYSApICsgdzEoIGEgKTsKCX0KCWZsb2F0IGcxKCBmbG9hdCBhICkgewoJCXJldHVybiB3MiggYSApICsgdzMoIGEgKTsKCX0KCWZsb2F0IGgwKCBmbG9hdCBhICkgewoJCXJldHVybiAtIDEuMCArIHcxKCBhICkgLyAoIHcwKCBhICkgKyB3MSggYSApICk7Cgl9CglmbG9hdCBoMSggZmxvYXQgYSApIHsKCQlyZXR1cm4gMS4wICsgdzMoIGEgKSAvICggdzIoIGEgKSArIHczKCBhICkgKTsKCX0KCXZlYzQgYmljdWJpYyggc2FtcGxlcjJEIHRleCwgdmVjMiB1diwgdmVjNCB0ZXhlbFNpemUsIGZsb2F0IGxvZCApIHsKCQl1diA9IHV2ICogdGV4ZWxTaXplLnp3ICsgMC41OwoJCXZlYzIgaXV2ID0gZmxvb3IoIHV2ICk7CgkJdmVjMiBmdXYgPSBmcmFjdCggdXYgKTsKCQlmbG9hdCBnMHggPSBnMCggZnV2LnggKTsKCQlmbG9hdCBnMXggPSBnMSggZnV2LnggKTsKCQlmbG9hdCBoMHggPSBoMCggZnV2LnggKTsKCQlmbG9hdCBoMXggPSBoMSggZnV2LnggKTsKCQlmbG9hdCBoMHkgPSBoMCggZnV2LnkgKTsKCQlmbG9hdCBoMXkgPSBoMSggZnV2LnkgKTsKCQl2ZWMyIHAwID0gKCB2ZWMyKCBpdXYueCArIGgweCwgaXV2LnkgKyBoMHkgKSAtIDAuNSApICogdGV4ZWxTaXplLnh5OwoJCXZlYzIgcDEgPSAoIHZlYzIoIGl1di54ICsgaDF4LCBpdXYueSArIGgweSApIC0gMC41ICkgKiB0ZXhlbFNpemUueHk7CgkJdmVjMiBwMiA9ICggdmVjMiggaXV2LnggKyBoMHgsIGl1di55ICsgaDF5ICkgLSAwLjUgKSAqIHRleGVsU2l6ZS54eTsKCQl2ZWMyIHAzID0gKCB2ZWMyKCBpdXYueCArIGgxeCwgaXV2LnkgKyBoMXkgKSAtIDAuNSApICogdGV4ZWxTaXplLnh5OwoJCXJldHVybiBnMCggZnV2LnkgKSAqICggZzB4ICogdGV4dHVyZUxvZCggdGV4LCBwMCwgbG9kICkgKyBnMXggKiB0ZXh0dXJlTG9kKCB0ZXgsIHAxLCBsb2QgKSApICsKCQkJZzEoIGZ1di55ICkgKiAoIGcweCAqIHRleHR1cmVMb2QoIHRleCwgcDIsIGxvZCApICsgZzF4ICogdGV4dHVyZUxvZCggdGV4LCBwMywgbG9kICkgKTsKCX0KCXZlYzQgdGV4dHVyZUJpY3ViaWMoIHNhbXBsZXIyRCBzYW1wbGVyLCB2ZWMyIHV2LCBmbG9hdCBsb2QgKSB7CgkJdmVjMiBmTG9kU2l6ZSA9IHZlYzIoIHRleHR1cmVTaXplKCBzYW1wbGVyLCBpbnQoIGxvZCApICkgKTsKCQl2ZWMyIGNMb2RTaXplID0gdmVjMiggdGV4dHVyZVNpemUoIHNhbXBsZXIsIGludCggbG9kICsgMS4wICkgKSApOwoJCXZlYzIgZkxvZFNpemVJbnYgPSAxLjAgLyBmTG9kU2l6ZTsKCQl2ZWMyIGNMb2RTaXplSW52ID0gMS4wIC8gY0xvZFNpemU7CgkJdmVjNCBmU2FtcGxlID0gYmljdWJpYyggc2FtcGxlciwgdXYsIHZlYzQoIGZMb2RTaXplSW52LCBmTG9kU2l6ZSApLCBmbG9vciggbG9kICkgKTsKCQl2ZWM0IGNTYW1wbGUgPSBiaWN1YmljKCBzYW1wbGVyLCB1diwgdmVjNCggY0xvZFNpemVJbnYsIGNMb2RTaXplICksIGNlaWwoIGxvZCApICk7CgkJcmV0dXJuIG1peCggZlNhbXBsZSwgY1NhbXBsZSwgZnJhY3QoIGxvZCApICk7Cgl9Cgl2ZWMzIGdldFZvbHVtZVRyYW5zbWlzc2lvblJheSggY29uc3QgaW4gdmVjMyBuLCBjb25zdCBpbiB2ZWMzIHYsIGNvbnN0IGluIGZsb2F0IHRoaWNrbmVzcywgY29uc3QgaW4gZmxvYXQgaW9yLCBjb25zdCBpbiBtYXQ0IG1vZGVsTWF0cml4ICkgewoJCXZlYzMgcmVmcmFjdGlvblZlY3RvciA9IHJlZnJhY3QoIC0gdiwgbm9ybWFsaXplKCBuICksIDEuMCAvIGlvciApOwoJCXZlYzMgbW9kZWxTY2FsZTsKCQltb2RlbFNjYWxlLnggPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAwIF0ueHl6ICkgKTsKCQltb2RlbFNjYWxlLnkgPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueHl6ICkgKTsKCQltb2RlbFNjYWxlLnogPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAyIF0ueHl6ICkgKTsKCQlyZXR1cm4gbm9ybWFsaXplKCByZWZyYWN0aW9uVmVjdG9yICkgKiB0aGlja25lc3MgKiBtb2RlbFNjYWxlOwoJfQoJZmxvYXQgYXBwbHlJb3JUb1JvdWdobmVzcyggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBmbG9hdCBpb3IgKSB7CgkJcmV0dXJuIHJvdWdobmVzcyAqIGNsYW1wKCBpb3IgKiAyLjAgLSAyLjAsIDAuMCwgMS4wICk7Cgl9Cgl2ZWM0IGdldFRyYW5zbWlzc2lvblNhbXBsZSggY29uc3QgaW4gdmVjMiBmcmFnQ29vcmQsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgaW9yICkgewoJCWZsb2F0IGxvZCA9IGxvZzIoIHRyYW5zbWlzc2lvblNhbXBsZXJTaXplLnggKSAqIGFwcGx5SW9yVG9Sb3VnaG5lc3MoIHJvdWdobmVzcywgaW9yICk7CgkJcmV0dXJuIHRleHR1cmVCaWN1YmljKCB0cmFuc21pc3Npb25TYW1wbGVyTWFwLCBmcmFnQ29vcmQueHksIGxvZCApOwoJfQoJdmVjMyB2b2x1bWVBdHRlbnVhdGlvbiggY29uc3QgaW4gZmxvYXQgdHJhbnNtaXNzaW9uRGlzdGFuY2UsIGNvbnN0IGluIHZlYzMgYXR0ZW51YXRpb25Db2xvciwgY29uc3QgaW4gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZSApIHsKCQlpZiAoIGlzaW5mKCBhdHRlbnVhdGlvbkRpc3RhbmNlICkgKSB7CgkJCXJldHVybiB2ZWMzKCAxLjAgKTsKCQl9IGVsc2UgewoJCQl2ZWMzIGF0dGVudWF0aW9uQ29lZmZpY2llbnQgPSAtbG9nKCBhdHRlbnVhdGlvbkNvbG9yICkgLyBhdHRlbnVhdGlvbkRpc3RhbmNlOwoJCQl2ZWMzIHRyYW5zbWl0dGFuY2UgPSBleHAoIC0gYXR0ZW51YXRpb25Db2VmZmljaWVudCAqIHRyYW5zbWlzc2lvbkRpc3RhbmNlICk7CQkJcmV0dXJuIHRyYW5zbWl0dGFuY2U7CgkJfQoJfQoJdmVjNCBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKCBjb25zdCBpbiB2ZWMzIG4sIGNvbnN0IGluIHZlYzMgdiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiB2ZWMzIGRpZmZ1c2VDb2xvciwKCQljb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiB2ZWMzIHBvc2l0aW9uLCBjb25zdCBpbiBtYXQ0IG1vZGVsTWF0cml4LAoJCWNvbnN0IGluIG1hdDQgdmlld01hdHJpeCwgY29uc3QgaW4gbWF0NCBwcm9qTWF0cml4LCBjb25zdCBpbiBmbG9hdCBkaXNwZXJzaW9uLCBjb25zdCBpbiBmbG9hdCBpb3IsIGNvbnN0IGluIGZsb2F0IHRoaWNrbmVzcywKCQljb25zdCBpbiB2ZWMzIGF0dGVudWF0aW9uQ29sb3IsIGNvbnN0IGluIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2UgKSB7CgkJdmVjNCB0cmFuc21pdHRlZExpZ2h0OwoJCXZlYzMgdHJhbnNtaXR0YW5jZTsKCQkjaWZkZWYgVVNFX0RJU1BFUlNJT04KCQkJZmxvYXQgaGFsZlNwcmVhZCA9ICggaW9yIC0gMS4wICkgKiAwLjAyNSAqIGRpc3BlcnNpb247CgkJCXZlYzMgaW9ycyA9IHZlYzMoIGlvciAtIGhhbGZTcHJlYWQsIGlvciwgaW9yICsgaGFsZlNwcmVhZCApOwoJCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCAzOyBpICsrICkgewoJCQkJdmVjMyB0cmFuc21pc3Npb25SYXkgPSBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIG4sIHYsIHRoaWNrbmVzcywgaW9yc1sgaSBdLCBtb2RlbE1hdHJpeCApOwoJCQkJdmVjMyByZWZyYWN0ZWRSYXlFeGl0ID0gcG9zaXRpb24gKyB0cmFuc21pc3Npb25SYXk7CgkJCgkJCQl2ZWM0IG5kY1BvcyA9IHByb2pNYXRyaXggKiB2aWV3TWF0cml4ICogdmVjNCggcmVmcmFjdGVkUmF5RXhpdCwgMS4wICk7CgkJCQl2ZWMyIHJlZnJhY3Rpb25Db29yZHMgPSBuZGNQb3MueHkgLyBuZGNQb3MudzsKCQkJCXJlZnJhY3Rpb25Db29yZHMgKz0gMS4wOwoJCQkJcmVmcmFjdGlvbkNvb3JkcyAvPSAyLjA7CgkJCgkJCQl2ZWM0IHRyYW5zbWlzc2lvblNhbXBsZSA9IGdldFRyYW5zbWlzc2lvblNhbXBsZSggcmVmcmFjdGlvbkNvb3Jkcywgcm91Z2huZXNzLCBpb3JzWyBpIF0gKTsKCQkJCXRyYW5zbWl0dGVkTGlnaHRbIGkgXSA9IHRyYW5zbWlzc2lvblNhbXBsZVsgaSBdOwoJCQkJdHJhbnNtaXR0ZWRMaWdodC5hICs9IHRyYW5zbWlzc2lvblNhbXBsZS5hOwoJCQkJdHJhbnNtaXR0YW5jZVsgaSBdID0gZGlmZnVzZUNvbG9yWyBpIF0gKiB2b2x1bWVBdHRlbnVhdGlvbiggbGVuZ3RoKCB0cmFuc21pc3Npb25SYXkgKSwgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSApWyBpIF07CgkJCX0KCQkJdHJhbnNtaXR0ZWRMaWdodC5hIC89IDMuMDsKCQkKCQkjZWxzZQoJCQoJCQl2ZWMzIHRyYW5zbWlzc2lvblJheSA9IGdldFZvbHVtZVRyYW5zbWlzc2lvblJheSggbiwgdiwgdGhpY2tuZXNzLCBpb3IsIG1vZGVsTWF0cml4ICk7CgkJCXZlYzMgcmVmcmFjdGVkUmF5RXhpdCA9IHBvc2l0aW9uICsgdHJhbnNtaXNzaW9uUmF5OwoJCQl2ZWM0IG5kY1BvcyA9IHByb2pNYXRyaXggKiB2aWV3TWF0cml4ICogdmVjNCggcmVmcmFjdGVkUmF5RXhpdCwgMS4wICk7CgkJCXZlYzIgcmVmcmFjdGlvbkNvb3JkcyA9IG5kY1Bvcy54eSAvIG5kY1Bvcy53OwoJCQlyZWZyYWN0aW9uQ29vcmRzICs9IDEuMDsKCQkJcmVmcmFjdGlvbkNvb3JkcyAvPSAyLjA7CgkJCXRyYW5zbWl0dGVkTGlnaHQgPSBnZXRUcmFuc21pc3Npb25TYW1wbGUoIHJlZnJhY3Rpb25Db29yZHMsIHJvdWdobmVzcywgaW9yICk7CgkJCXRyYW5zbWl0dGFuY2UgPSBkaWZmdXNlQ29sb3IgKiB2b2x1bWVBdHRlbnVhdGlvbiggbGVuZ3RoKCB0cmFuc21pc3Npb25SYXkgKSwgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSApOwoJCQoJCSNlbmRpZgoJCXZlYzMgYXR0ZW51YXRlZENvbG9yID0gdHJhbnNtaXR0YW5jZSAqIHRyYW5zbWl0dGVkTGlnaHQucmdiOwoJCXZlYzMgRiA9IEVudmlyb25tZW50QlJERiggbiwgdiwgc3BlY3VsYXJDb2xvciwgc3BlY3VsYXJGOTAsIHJvdWdobmVzcyApOwoJCWZsb2F0IHRyYW5zbWl0dGFuY2VGYWN0b3IgPSAoIHRyYW5zbWl0dGFuY2UuciArIHRyYW5zbWl0dGFuY2UuZyArIHRyYW5zbWl0dGFuY2UuYiApIC8gMy4wOwoJCXJldHVybiB2ZWM0KCAoIDEuMCAtIEYgKSAqIGF0dGVudWF0ZWRDb2xvciwgMS4wIC0gKCAxLjAgLSB0cmFuc21pdHRlZExpZ2h0LmEgKSAqIHRyYW5zbWl0dGFuY2VGYWN0b3IgKTsKCX0KI2VuZGlmYCxLdz1gI2lmIGRlZmluZWQoIFVTRV9VViApIHx8IGRlZmluZWQoIFVTRV9BTklTT1RST1BZICkKCXZhcnlpbmcgdmVjMiB2VXY7CiNlbmRpZgojaWZkZWYgVVNFX01BUAoJdmFyeWluZyB2ZWMyIHZNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQUxQSEFNQVAKCXZhcnlpbmcgdmVjMiB2QWxwaGFNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTElHSFRNQVAKCXZhcnlpbmcgdmVjMiB2TGlnaHRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQU9NQVAKCXZhcnlpbmcgdmVjMiB2QW9NYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQlVNUE1BUAoJdmFyeWluZyB2ZWMyIHZCdW1wTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX05PUk1BTE1BUAoJdmFyeWluZyB2ZWMyIHZOb3JtYWxNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfRU1JU1NJVkVNQVAKCXZhcnlpbmcgdmVjMiB2RW1pc3NpdmVNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQCgl2YXJ5aW5nIHZlYzIgdk1ldGFsbmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVAKCXZhcnlpbmcgdmVjMiB2Um91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVAKCXZhcnlpbmcgdmVjMiB2QW5pc290cm9weU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVAKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0Tm9ybWFsTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0Um91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFTUFQCgl2YXJ5aW5nIHZlYzIgdklyaWRlc2NlbmNlTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUAoJdmFyeWluZyB2ZWMyIHZJcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUAoJdmFyeWluZyB2ZWMyIHZTaGVlbkNvbG9yTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NIRUVOX1JPVUdITkVTU01BUAoJdmFyeWluZyB2ZWMyIHZTaGVlblJvdWdobmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdmFyeWluZyB2ZWMyIHZTcGVjdWxhck1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUl9DT0xPUk1BUAoJdmFyeWluZyB2ZWMyIHZTcGVjdWxhckNvbG9yTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUAoJdmFyeWluZyB2ZWMyIHZTcGVjdWxhckludGVuc2l0eU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVAKCXVuaWZvcm0gbWF0MyB0cmFuc21pc3Npb25NYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlRyYW5zbWlzc2lvbk1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9USElDS05FU1NNQVAKCXVuaWZvcm0gbWF0MyB0aGlja25lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlRoaWNrbmVzc01hcFV2OwojZW5kaWZgLGp3PWAjaWYgZGVmaW5lZCggVVNFX1VWICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKQoJdmFyeWluZyB2ZWMyIHZVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTUFQCgl1bmlmb3JtIG1hdDMgbWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQUxQSEFNQVAKCXVuaWZvcm0gbWF0MyBhbHBoYU1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2QWxwaGFNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTElHSFRNQVAKCXVuaWZvcm0gbWF0MyBsaWdodE1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2TGlnaHRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQU9NQVAKCXVuaWZvcm0gbWF0MyBhb01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2QW9NYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQlVNUE1BUAoJdW5pZm9ybSBtYXQzIGJ1bXBNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkJ1bXBNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTk9STUFMTUFQCgl1bmlmb3JtIG1hdDMgbm9ybWFsTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZOb3JtYWxNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgl1bmlmb3JtIG1hdDMgZGlzcGxhY2VtZW50TWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZEaXNwbGFjZW1lbnRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfRU1JU1NJVkVNQVAKCXVuaWZvcm0gbWF0MyBlbWlzc2l2ZU1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2RW1pc3NpdmVNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQCgl1bmlmb3JtIG1hdDMgbWV0YWxuZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZNZXRhbG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQCgl1bmlmb3JtIG1hdDMgcm91Z2huZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZSb3VnaG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUAoJdW5pZm9ybSBtYXQzIGFuaXNvdHJvcHlNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkFuaXNvdHJvcHlNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQCgl1bmlmb3JtIG1hdDMgY2xlYXJjb2F0TWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJdW5pZm9ybSBtYXQzIGNsZWFyY29hdE5vcm1hbE1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0Tm9ybWFsTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAKCXVuaWZvcm0gbWF0MyBjbGVhcmNvYXRSb3VnaG5lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkNsZWFyY29hdFJvdWdobmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUAoJdW5pZm9ybSBtYXQzIHNoZWVuQ29sb3JNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNoZWVuQ29sb3JNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgl1bmlmb3JtIG1hdDMgc2hlZW5Sb3VnaG5lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNoZWVuUm91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFTUFQCgl1bmlmb3JtIG1hdDMgaXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdklyaWRlc2NlbmNlTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUAoJdW5pZm9ybSBtYXQzIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZJcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdW5pZm9ybSBtYXQzIHNwZWN1bGFyTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZTcGVjdWxhck1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUl9DT0xPUk1BUAoJdW5pZm9ybSBtYXQzIHNwZWN1bGFyQ29sb3JNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyQ29sb3JNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQCgl1bmlmb3JtIG1hdDMgc3BlY3VsYXJJbnRlbnNpdHlNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFySW50ZW5zaXR5TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUAoJdW5pZm9ybSBtYXQzIHRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2VHJhbnNtaXNzaW9uTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1RISUNLTkVTU01BUAoJdW5pZm9ybSBtYXQzIHRoaWNrbmVzc01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2VGhpY2tuZXNzTWFwVXY7CiNlbmRpZmAsUXc9YCNpZiBkZWZpbmVkKCBVU0VfVVYgKSB8fCBkZWZpbmVkKCBVU0VfQU5JU09UUk9QWSApCgl2VXYgPSB2ZWMzKCB1diwgMSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9NQVAKCXZNYXBVdiA9ICggbWFwVHJhbnNmb3JtICogdmVjMyggTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfQUxQSEFNQVAKCXZBbHBoYU1hcFV2ID0gKCBhbHBoYU1hcFRyYW5zZm9ybSAqIHZlYzMoIEFMUEhBTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfTElHSFRNQVAKCXZMaWdodE1hcFV2ID0gKCBsaWdodE1hcFRyYW5zZm9ybSAqIHZlYzMoIExJR0hUTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfQU9NQVAKCXZBb01hcFV2ID0gKCBhb01hcFRyYW5zZm9ybSAqIHZlYzMoIEFPTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfQlVNUE1BUAoJdkJ1bXBNYXBVdiA9ICggYnVtcE1hcFRyYW5zZm9ybSAqIHZlYzMoIEJVTVBNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9OT1JNQUxNQVAKCXZOb3JtYWxNYXBVdiA9ICggbm9ybWFsTWFwVHJhbnNmb3JtICogdmVjMyggTk9STUFMTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgl2RGlzcGxhY2VtZW50TWFwVXYgPSAoIGRpc3BsYWNlbWVudE1hcFRyYW5zZm9ybSAqIHZlYzMoIERJU1BMQUNFTUVOVE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0VNSVNTSVZFTUFQCgl2RW1pc3NpdmVNYXBVdiA9ICggZW1pc3NpdmVNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBFTUlTU0lWRU1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX01FVEFMTkVTU01BUAoJdk1ldGFsbmVzc01hcFV2ID0gKCBtZXRhbG5lc3NNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBNRVRBTE5FU1NNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVAKCXZSb3VnaG5lc3NNYXBVdiA9ICggcm91Z2huZXNzTWFwVHJhbnNmb3JtICogdmVjMyggUk9VR0hORVNTTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUAoJdkFuaXNvdHJvcHlNYXBVdiA9ICggYW5pc290cm9weU1hcFRyYW5zZm9ybSAqIHZlYzMoIEFOSVNPVFJPUFlNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVAKCXZDbGVhcmNvYXRNYXBVdiA9ICggY2xlYXJjb2F0TWFwVHJhbnNmb3JtICogdmVjMyggQ0xFQVJDT0FUTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJdkNsZWFyY29hdE5vcm1hbE1hcFV2ID0gKCBjbGVhcmNvYXROb3JtYWxNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBDTEVBUkNPQVRfTk9STUFMTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUAoJdkNsZWFyY29hdFJvdWdobmVzc01hcFV2ID0gKCBjbGVhcmNvYXRSb3VnaG5lc3NNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBDTEVBUkNPQVRfUk9VR0hORVNTTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVAKCXZJcmlkZXNjZW5jZU1hcFV2ID0gKCBpcmlkZXNjZW5jZU1hcFRyYW5zZm9ybSAqIHZlYzMoIElSSURFU0NFTkNFTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQCgl2SXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdiA9ICggaXJpZGVzY2VuY2VUaGlja25lc3NNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBJUklERVNDRU5DRV9USElDS05FU1NNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUAoJdlNoZWVuQ29sb3JNYXBVdiA9ICggc2hlZW5Db2xvck1hcFRyYW5zZm9ybSAqIHZlYzMoIFNIRUVOX0NPTE9STUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgl2U2hlZW5Sb3VnaG5lc3NNYXBVdiA9ICggc2hlZW5Sb3VnaG5lc3NNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBTSEVFTl9ST1VHSE5FU1NNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdlNwZWN1bGFyTWFwVXYgPSAoIHNwZWN1bGFyTWFwVHJhbnNmb3JtICogdmVjMyggU1BFQ1VMQVJNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUl9DT0xPUk1BUAoJdlNwZWN1bGFyQ29sb3JNYXBVdiA9ICggc3BlY3VsYXJDb2xvck1hcFRyYW5zZm9ybSAqIHZlYzMoIFNQRUNVTEFSX0NPTE9STUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQCgl2U3BlY3VsYXJJbnRlbnNpdHlNYXBVdiA9ICggc3BlY3VsYXJJbnRlbnNpdHlNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBTUEVDVUxBUl9JTlRFTlNJVFlNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVAKCXZUcmFuc21pc3Npb25NYXBVdiA9ICggdHJhbnNtaXNzaW9uTWFwVHJhbnNmb3JtICogdmVjMyggVFJBTlNNSVNTSU9OTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQCgl2VGhpY2tuZXNzTWFwVXYgPSAoIHRoaWNrbmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIFRISUNLTkVTU01BUF9VViwgMSApICkueHk7CiNlbmRpZmAsdEE9YCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggRElTVEFOQ0UgKSB8fCBkZWZpbmVkICggVVNFX1NIQURPV01BUCApIHx8IGRlZmluZWQgKCBVU0VfVFJBTlNNSVNTSU9OICkgfHwgTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMAoJdmVjNCB3b3JsZFBvc2l0aW9uID0gdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApOwoJI2lmZGVmIFVTRV9CQVRDSElORwoJCXdvcmxkUG9zaXRpb24gPSBiYXRjaGluZ01hdHJpeCAqIHdvcmxkUG9zaXRpb247CgkjZW5kaWYKCSNpZmRlZiBVU0VfSU5TVEFOQ0lORwoJCXdvcmxkUG9zaXRpb24gPSBpbnN0YW5jZU1hdHJpeCAqIHdvcmxkUG9zaXRpb247CgkjZW5kaWYKCXdvcmxkUG9zaXRpb24gPSBtb2RlbE1hdHJpeCAqIHdvcmxkUG9zaXRpb247CiNlbmRpZmA7Y29uc3QgcXQ9e2FscGhhaGFzaF9mcmFnbWVudDpuMSxhbHBoYWhhc2hfcGFyc19mcmFnbWVudDppMSxhbHBoYW1hcF9mcmFnbWVudDpyMSxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50OnMxLGFscGhhdGVzdF9mcmFnbWVudDpvMSxhbHBoYXRlc3RfcGFyc19mcmFnbWVudDphMSxhb21hcF9mcmFnbWVudDpsMSxhb21hcF9wYXJzX2ZyYWdtZW50OmMxLGJhdGNoaW5nX3BhcnNfdmVydGV4OnUxLGJhdGNoaW5nX3ZlcnRleDpoMSxiZWdpbl92ZXJ0ZXg6ZjEsYmVnaW5ub3JtYWxfdmVydGV4OmQxLGJzZGZzOnAxLGlyaWRlc2NlbmNlX2ZyYWdtZW50Om0xLGJ1bXBtYXBfcGFyc19mcmFnbWVudDpnMSxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ6eTEsY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ6djEsY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Ol8xLGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6eDEsY29sb3JfZnJhZ21lbnQ6TTEsY29sb3JfcGFyc19mcmFnbWVudDpTMSxjb2xvcl9wYXJzX3ZlcnRleDpiMSxjb2xvcl92ZXJ0ZXg6dzEsY29tbW9uOkExLGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudDpFMSxkZWZhdWx0bm9ybWFsX3ZlcnRleDpUMSxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg6QzEsZGlzcGxhY2VtZW50bWFwX3ZlcnRleDpSMSxlbWlzc2l2ZW1hcF9mcmFnbWVudDpQMSxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50OkkxLGNvbG9yc3BhY2VfZnJhZ21lbnQ6TDEsY29sb3JzcGFjZV9wYXJzX2ZyYWdtZW50OkQxLGVudm1hcF9mcmFnbWVudDpVMSxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ6TjEsZW52bWFwX3BhcnNfZnJhZ21lbnQ6RjEsZW52bWFwX3BhcnNfdmVydGV4Ok8xLGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50OlkxLGVudm1hcF92ZXJ0ZXg6QjEsZm9nX3ZlcnRleDp6MSxmb2dfcGFyc192ZXJ0ZXg6azEsZm9nX2ZyYWdtZW50OkcxLGZvZ19wYXJzX2ZyYWdtZW50OlYxLGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ6SDEsbGlnaHRtYXBfcGFyc19mcmFnbWVudDpXMSxsaWdodHNfbGFtYmVydF9mcmFnbWVudDokMSxsaWdodHNfbGFtYmVydF9wYXJzX2ZyYWdtZW50OlgxLGxpZ2h0c19wYXJzX2JlZ2luOnExLGxpZ2h0c190b29uX2ZyYWdtZW50OloxLGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQ6SjEsbGlnaHRzX3Bob25nX2ZyYWdtZW50OksxLGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50OmoxLGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudDpRMSxsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudDp0dyxsaWdodHNfZnJhZ21lbnRfYmVnaW46ZXcsbGlnaHRzX2ZyYWdtZW50X21hcHM6bncsbGlnaHRzX2ZyYWdtZW50X2VuZDppdyxsb2dkZXB0aGJ1Zl9mcmFnbWVudDpydyxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50OnN3LGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4Om93LGxvZ2RlcHRoYnVmX3ZlcnRleDphdyxtYXBfZnJhZ21lbnQ6bHcsbWFwX3BhcnNfZnJhZ21lbnQ6Y3csbWFwX3BhcnRpY2xlX2ZyYWdtZW50OnV3LG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50Omh3LG1ldGFsbmVzc21hcF9mcmFnbWVudDpmdyxtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDpkdyxtb3JwaGluc3RhbmNlX3ZlcnRleDpwdyxtb3JwaGNvbG9yX3ZlcnRleDptdyxtb3JwaG5vcm1hbF92ZXJ0ZXg6Z3csbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg6eXcsbW9ycGh0YXJnZXRfdmVydGV4OnZ3LG5vcm1hbF9mcmFnbWVudF9iZWdpbjpfdyxub3JtYWxfZnJhZ21lbnRfbWFwczp4dyxub3JtYWxfcGFyc19mcmFnbWVudDpNdyxub3JtYWxfcGFyc192ZXJ0ZXg6U3csbm9ybWFsX3ZlcnRleDpidyxub3JtYWxtYXBfcGFyc19mcmFnbWVudDp3dyxjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luOkF3LGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwczpFdyxjbGVhcmNvYXRfcGFyc19mcmFnbWVudDpUdyxpcmlkZXNjZW5jZV9wYXJzX2ZyYWdtZW50OkN3LG9wYXF1ZV9mcmFnbWVudDpSdyxwYWNraW5nOlB3LHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ6SXcscHJvamVjdF92ZXJ0ZXg6THcsZGl0aGVyaW5nX2ZyYWdtZW50OkR3LGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50OlV3LHJvdWdobmVzc21hcF9mcmFnbWVudDpOdyxyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudDpGdyxzaGFkb3dtYXBfcGFyc19mcmFnbWVudDpPdyxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg6Qncsc2hhZG93bWFwX3ZlcnRleDp6dyxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ6a3csc2tpbmJhc2VfdmVydGV4Okd3LHNraW5uaW5nX3BhcnNfdmVydGV4OlZ3LHNraW5uaW5nX3ZlcnRleDpIdyxza2lubm9ybWFsX3ZlcnRleDpXdyxzcGVjdWxhcm1hcF9mcmFnbWVudDokdyxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50Olh3LHRvbmVtYXBwaW5nX2ZyYWdtZW50OnF3LHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6WXcsdHJhbnNtaXNzaW9uX2ZyYWdtZW50Olp3LHRyYW5zbWlzc2lvbl9wYXJzX2ZyYWdtZW50Okp3LHV2X3BhcnNfZnJhZ21lbnQ6S3csdXZfcGFyc192ZXJ0ZXg6ancsdXZfdmVydGV4OlF3LHdvcmxkcG9zX3ZlcnRleDp0QSxiYWNrZ3JvdW5kX3ZlcnQ6YHZhcnlpbmcgdmVjMiB2VXY7CnVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTsKdm9pZCBtYWluKCkgewoJdlV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTsKCWdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24ueHksIDEuMCwgMS4wICk7Cn1gLGJhY2tncm91bmRfZnJhZzpgdW5pZm9ybSBzYW1wbGVyMkQgdDJEOwp1bmlmb3JtIGZsb2F0IGJhY2tncm91bmRJbnRlbnNpdHk7CnZhcnlpbmcgdmVjMiB2VXY7CnZvaWQgbWFpbigpIHsKCXZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQoIHQyRCwgdlV2ICk7CgkjaWZkZWYgREVDT0RFX1ZJREVPX1RFWFRVUkUKCQl0ZXhDb2xvciA9IHZlYzQoIG1peCggcG93KCB0ZXhDb2xvci5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdGV4Q29sb3IucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB0ZXhDb2xvci5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdGV4Q29sb3IudyApOwoJI2VuZGlmCgl0ZXhDb2xvci5yZ2IgKj0gYmFja2dyb3VuZEludGVuc2l0eTsKCWdsX0ZyYWdDb2xvciA9IHRleENvbG9yOwoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+Cn1gLGJhY2tncm91bmRDdWJlX3ZlcnQ6YHZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CiNpbmNsdWRlIDxjb21tb24+CnZvaWQgbWFpbigpIHsKCXZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJZ2xfUG9zaXRpb24ueiA9IGdsX1Bvc2l0aW9uLnc7Cn1gLGJhY2tncm91bmRDdWJlX2ZyYWc6YCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFCgl1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDsKI2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApCgl1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7CiNlbmRpZgp1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7CnVuaWZvcm0gZmxvYXQgYmFja2dyb3VuZEJsdXJyaW5lc3M7CnVuaWZvcm0gZmxvYXQgYmFja2dyb3VuZEludGVuc2l0eTsKdW5pZm9ybSBtYXQzIGJhY2tncm91bmRSb3RhdGlvbjsKdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkUKCQl2ZWM0IHRleENvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgYmFja2dyb3VuZFJvdGF0aW9uICogdmVjMyggZmxpcEVudk1hcCAqIHZXb3JsZERpcmVjdGlvbi54LCB2V29ybGREaXJlY3Rpb24ueXogKSApOwoJI2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApCgkJdmVjNCB0ZXhDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgYmFja2dyb3VuZFJvdGF0aW9uICogdldvcmxkRGlyZWN0aW9uLCBiYWNrZ3JvdW5kQmx1cnJpbmVzcyApOwoJI2Vsc2UKCQl2ZWM0IHRleENvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7CgkjZW5kaWYKCXRleENvbG9yLnJnYiAqPSBiYWNrZ3JvdW5kSW50ZW5zaXR5OwoJZ2xfRnJhZ0NvbG9yID0gdGV4Q29sb3I7CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KfWAsY3ViZV92ZXJ0OmB2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgp2b2lkIG1haW4oKSB7Cgl2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApOwoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCWdsX1Bvc2l0aW9uLnogPSBnbF9Qb3NpdGlvbi53Owp9YCxjdWJlX2ZyYWc6YHVuaWZvcm0gc2FtcGxlckN1YmUgdEN1YmU7CnVuaWZvcm0gZmxvYXQgdEZsaXA7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKdm9pZCBtYWluKCkgewoJdmVjNCB0ZXhDb2xvciA9IHRleHR1cmVDdWJlKCB0Q3ViZSwgdmVjMyggdEZsaXAgKiB2V29ybGREaXJlY3Rpb24ueCwgdldvcmxkRGlyZWN0aW9uLnl6ICkgKTsKCWdsX0ZyYWdDb2xvciA9IHRleENvbG9yOwoJZ2xfRnJhZ0NvbG9yLmEgKj0gb3BhY2l0eTsKCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50Pgp9YCxkZXB0aF92ZXJ0OmAjaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4KdmFyeWluZyB2ZWMyIHZIaWdoUHJlY2lzaW9uWlc7CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgkJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNlbmRpZgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+Cgl2SGlnaFByZWNpc2lvblpXID0gZ2xfUG9zaXRpb24uenc7Cn1gLGRlcHRoX2ZyYWc6YCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDAKCXVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2VuZGlmCiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxwYWNraW5nPgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZhcnlpbmcgdmVjMiB2SGlnaFByZWNpc2lvblpXOwp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCSNpZiBERVBUSF9QQUNLSU5HID09IDMyMDAKCQlkaWZmdXNlQ29sb3IuYSA9IG9wYWNpdHk7CgkjZW5kaWYKCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCWZsb2F0IGZyYWdDb29yZFogPSAwLjUgKiB2SGlnaFByZWNpc2lvblpXWzBdIC8gdkhpZ2hQcmVjaXNpb25aV1sxXSArIDAuNTsKCSNpZiBERVBUSF9QQUNLSU5HID09IDMyMDAKCQlnbF9GcmFnQ29sb3IgPSB2ZWM0KCB2ZWMzKCAxLjAgLSBmcmFnQ29vcmRaICksIG9wYWNpdHkgKTsKCSNlbGlmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMQoJCWdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZnJhZ0Nvb3JkWiApOwoJI2VsaWYgREVQVEhfUEFDS0lORyA9PSAzMjAyCgkJZ2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja0RlcHRoVG9SR0IoIGZyYWdDb29yZFogKSwgMS4wICk7CgkjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDMKCQlnbF9GcmFnQ29sb3IgPSB2ZWM0KCBwYWNrRGVwdGhUb1JHKCBmcmFnQ29vcmRaICksIDAuMCwgMS4wICk7CgkjZW5kaWYKfWAsZGlzdGFuY2VSR0JBX3ZlcnQ6YCNkZWZpbmUgRElTVEFOQ0UKdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgkJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNlbmRpZgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+Cgl2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6Owp9YCxkaXN0YW5jZVJHQkFfZnJhZzpgI2RlZmluZSBESVNUQU5DRQp1bmlmb3JtIHZlYzMgcmVmZXJlbmNlUG9zaXRpb247CnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlOwp1bmlmb3JtIGZsb2F0IGZhckRpc3RhbmNlOwp2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxwYWNraW5nPgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluICgpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMS4wICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJZmxvYXQgZGlzdCA9IGxlbmd0aCggdldvcmxkUG9zaXRpb24gLSByZWZlcmVuY2VQb3NpdGlvbiApOwoJZGlzdCA9ICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApOwoJZGlzdCA9IHNhdHVyYXRlKCBkaXN0ICk7CglnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGRpc3QgKTsKfWAsZXF1aXJlY3RfdmVydDpgdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4Kdm9pZCBtYWluKCkgewoJdldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTsKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+Cn1gLGVxdWlyZWN0X2ZyYWc6YHVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDsKdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4Kdm9pZCBtYWluKCkgewoJdmVjMyBkaXJlY3Rpb24gPSBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApOwoJdmVjMiBzYW1wbGVVViA9IGVxdWlyZWN0VXYoIGRpcmVjdGlvbiApOwoJZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KfWAsbGluZWRhc2hlZF92ZXJ0OmB1bmlmb3JtIGZsb2F0IHNjYWxlOwphdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlOwp2YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJdkxpbmVEaXN0YW5jZSA9IHNjYWxlICogbGluZURpc3RhbmNlOwoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCxsaW5lZGFzaGVkX2ZyYWc6YHVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7CnVuaWZvcm0gZmxvYXQgdG90YWxTaXplOwp2YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCWlmICggbW9kKCB2TGluZURpc3RhbmNlLCB0b3RhbFNpemUgKSA+IGRhc2hTaXplICkgewoJCWRpc2NhcmQ7Cgl9Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CglvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjsKCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KfWAsbWVzaGJhc2ljX3ZlcnQ6YCNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpZiBkZWZpbmVkICggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQgKCBVU0VfU0tJTk5JTkcgKQoJCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjZW5kaWYKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCxtZXNoYmFzaWNfZnJhZzpgdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2lmbmRlZiBGTEFUX1NIQURFRAoJdmFyeWluZyB2ZWMzIHZOb3JtYWw7CiNlbmRpZgojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJI2lmZGVmIFVTRV9MSUdIVE1BUAoJCXZlYzQgbGlnaHRNYXBUZXhlbCA9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZMaWdodE1hcFV2ICk7CgkJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGxpZ2h0TWFwVGV4ZWwucmdiICogbGlnaHRNYXBJbnRlbnNpdHkgKiBSRUNJUFJPQ0FMX1BJOwoJI2Vsc2UKCQlyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdmVjMyggMS4wICk7CgkjZW5kaWYKCSNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD4KCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBkaWZmdXNlQ29sb3IucmdiOwoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlOwoJI2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KCSNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+Cn1gLG1lc2hsYW1iZXJ0X3ZlcnQ6YCNkZWZpbmUgTEFNQkVSVAp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsbWVzaGxhbWJlcnRfZnJhZzpgI2RlZmluZSBMQU1CRVJUCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxic2Rmcz4KI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodHNfbGFtYmVydF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCVJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7Cgl2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfbGFtYmVydF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD4KCSNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD4KCXZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7CgkjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD4KfWAsbWVzaG1hdGNhcF92ZXJ0OmAjZGVmaW5lIE1BVENBUAp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4PgoJdlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7Cn1gLG1lc2htYXRjYXBfZnJhZzpgI2RlZmluZSBNQVRDQVAKdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKdW5pZm9ybSBzYW1wbGVyMkQgbWF0Y2FwOwp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPgoJdmVjMyB2aWV3RGlyID0gbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7Cgl2ZWMzIHggPSBub3JtYWxpemUoIHZlYzMoIHZpZXdEaXIueiwgMC4wLCAtIHZpZXdEaXIueCApICk7Cgl2ZWMzIHkgPSBjcm9zcyggdmlld0RpciwgeCApOwoJdmVjMiB1diA9IHZlYzIoIGRvdCggeCwgbm9ybWFsICksIGRvdCggeSwgbm9ybWFsICkgKSAqIDAuNDk1ICsgMC41OwoJI2lmZGVmIFVTRV9NQVRDQVAKCQl2ZWM0IG1hdGNhcENvbG9yID0gdGV4dHVyZTJEKCBtYXRjYXAsIHV2ICk7CgkjZWxzZQoJCXZlYzQgbWF0Y2FwQ29sb3IgPSB2ZWM0KCB2ZWMzKCBtaXgoIDAuMiwgMC44LCB1di55ICkgKSwgMS4wICk7CgkjZW5kaWYKCXZlYzMgb3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2IgKiBtYXRjYXBDb2xvci5yZ2I7CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCxtZXNobm9ybWFsX3ZlcnQ6YCNkZWZpbmUgTk9STUFMCiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKQoJdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNlbmRpZgojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgojaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFICkKCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwojZW5kaWYKfWAsbWVzaG5vcm1hbF9mcmFnOmAjZGVmaW5lIE5PUk1BTAp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKQoJdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNlbmRpZgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPgoJZ2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgZGlmZnVzZUNvbG9yLmEgKTsKCSNpZmRlZiBPUEFRVUUKCQlnbF9GcmFnQ29sb3IuYSA9IDEuMDsKCSNlbmRpZgp9YCxtZXNocGhvbmdfdmVydDpgI2RlZmluZSBQSE9ORwp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsbWVzaHBob25nX2ZyYWc6YCNkZWZpbmUgUEhPTkcKdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTsKdW5pZm9ybSB2ZWMzIHNwZWN1bGFyOwp1bmlmb3JtIGZsb2F0IHNoaW5pbmVzczsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJzZGZzPgojaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCVJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7Cgl2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfcGhvbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+CgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlOwoJI2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KCSNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+Cn1gLG1lc2hwaHlzaWNhbF92ZXJ0OmAjZGVmaW5lIFNUQU5EQVJECnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uOwojZW5kaWYKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+CiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OCgl2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6OwojZW5kaWYKfWAsbWVzaHBoeXNpY2FsX2ZyYWc6YCNkZWZpbmUgU1RBTkRBUkQKI2lmZGVmIFBIWVNJQ0FMCgkjZGVmaW5lIElPUgoJI2RlZmluZSBVU0VfU1BFQ1VMQVIKI2VuZGlmCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzOwp1bmlmb3JtIGZsb2F0IG1ldGFsbmVzczsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaWZkZWYgSU9SCgl1bmlmb3JtIGZsb2F0IGlvcjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVIKCXVuaWZvcm0gZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHk7Cgl1bmlmb3JtIHZlYzMgc3BlY3VsYXJDb2xvcjsKCSNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhckNvbG9yTWFwOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFySW50ZW5zaXR5TWFwOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVAoJdW5pZm9ybSBmbG9hdCBjbGVhcmNvYXQ7Cgl1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzczsKI2VuZGlmCiNpZmRlZiBVU0VfRElTUEVSU0lPTgoJdW5pZm9ybSBmbG9hdCBkaXNwZXJzaW9uOwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJdW5pZm9ybSBmbG9hdCBpcmlkZXNjZW5jZTsKCXVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2VJT1I7Cgl1bmlmb3JtIGZsb2F0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTsKCXVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtOwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTgoJdW5pZm9ybSB2ZWMzIHNoZWVuQ29sb3I7Cgl1bmlmb3JtIGZsb2F0IHNoZWVuUm91Z2huZXNzOwoJI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNoZWVuQ29sb3JNYXA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgkJdW5pZm9ybSBzYW1wbGVyMkQgc2hlZW5Sb3VnaG5lc3NNYXA7CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfQU5JU09UUk9QWQoJdW5pZm9ybSB2ZWMyIGFuaXNvdHJvcHlWZWN0b3I7CgkjaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCBhbmlzb3Ryb3B5TWFwOwoJI2VuZGlmCiNlbmRpZgp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGlyaWRlc2NlbmNlX2ZyYWdtZW50PgojaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHRyYW5zbWlzc2lvbl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8aXJpZGVzY2VuY2VfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCVJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7Cgl2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHJvdWdobmVzc21hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD4KCSNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD4KCXZlYzMgdG90YWxEaWZmdXNlID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTsKCXZlYzMgdG90YWxTcGVjdWxhciA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhcjsKCSNpbmNsdWRlIDx0cmFuc21pc3Npb25fZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSB0b3RhbERpZmZ1c2UgKyB0b3RhbFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlOwoJI2lmZGVmIFVTRV9TSEVFTgoJCWZsb2F0IHNoZWVuRW5lcmd5Q29tcCA9IDEuMCAtIDAuMTU3ICogbWF4MyggbWF0ZXJpYWwuc2hlZW5Db2xvciApOwoJCW91dGdvaW5nTGlnaHQgPSBvdXRnb2luZ0xpZ2h0ICogc2hlZW5FbmVyZ3lDb21wICsgc2hlZW5TcGVjdWxhckRpcmVjdCArIHNoZWVuU3BlY3VsYXJJbmRpcmVjdDsKCSNlbmRpZgoJI2lmZGVmIFVTRV9DTEVBUkNPQVQKCQlmbG9hdCBkb3ROVmNjID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGdlb21ldHJ5Vmlld0RpciApICk7CgkJdmVjMyBGY2MgPSBGX1NjaGxpY2soIG1hdGVyaWFsLmNsZWFyY29hdEYwLCBtYXRlcmlhbC5jbGVhcmNvYXRGOTAsIGRvdE5WY2MgKTsKCQlvdXRnb2luZ0xpZ2h0ID0gb3V0Z29pbmdMaWdodCAqICggMS4wIC0gbWF0ZXJpYWwuY2xlYXJjb2F0ICogRmNjICkgKyAoIGNsZWFyY29hdFNwZWN1bGFyRGlyZWN0ICsgY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdCApICogbWF0ZXJpYWwuY2xlYXJjb2F0OwoJI2VuZGlmCgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCxtZXNodG9vbl92ZXJ0OmAjZGVmaW5lIFRPT04KdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+Cgl2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejsKCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCxtZXNodG9vbl9mcmFnOmAjZGVmaW5lIFRPT04KdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnNkZnM+CiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bGlnaHRzX3Rvb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCVJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7Cgl2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfdG9vbl9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD4KCSNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD4KCXZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCxwb2ludHNfdmVydDpgdW5pZm9ybSBmbG9hdCBzaXplOwp1bmlmb3JtIGZsb2F0IHNjYWxlOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PgojaWZkZWYgVVNFX1BPSU5UU19VVgoJdmFyeWluZyB2ZWMyIHZVdjsKCXVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTsKI2VuZGlmCnZvaWQgbWFpbigpIHsKCSNpZmRlZiBVU0VfUE9JTlRTX1VWCgkJdlV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTsKCSNlbmRpZgoJI2luY2x1ZGUgPGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJZ2xfUG9pbnRTaXplID0gc2l6ZTsKCSNpZmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OCgkJYm9vbCBpc1BlcnNwZWN0aXZlID0gaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApOwoJCWlmICggaXNQZXJzcGVjdGl2ZSApIGdsX1BvaW50U2l6ZSAqPSAoIHNjYWxlIC8gLSBtdlBvc2l0aW9uLnogKTsKCSNlbmRpZgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCxwb2ludHNfZnJhZzpgdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWFwX3BhcnRpY2xlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+CglvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjsKCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KfWAsc2hhZG93X3ZlcnQ6YCNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsc2hhZG93X2ZyYWc6YHVuaWZvcm0gdmVjMyBjb2xvcjsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnNkZnM+CiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNoYWRvd21hc2tfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJZ2xfRnJhZ0NvbG9yID0gdmVjNCggY29sb3IsIG9wYWNpdHkgKiAoIDEuMCAtIGdldFNoYWRvd01hc2soKSApICk7CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+Cn1gLHNwcml0ZV92ZXJ0OmB1bmlmb3JtIGZsb2F0IHJvdGF0aW9uOwp1bmlmb3JtIHZlYzIgY2VudGVyOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCXZlYzQgbXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApOwoJdmVjMiBzY2FsZTsKCXNjYWxlLnggPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAwIF0ueCwgbW9kZWxNYXRyaXhbIDAgXS55LCBtb2RlbE1hdHJpeFsgMCBdLnogKSApOwoJc2NhbGUueSA9IGxlbmd0aCggdmVjMyggbW9kZWxNYXRyaXhbIDEgXS54LCBtb2RlbE1hdHJpeFsgMSBdLnksIG1vZGVsTWF0cml4WyAxIF0ueiApICk7CgkjaWZuZGVmIFVTRV9TSVpFQVRURU5VQVRJT04KCQlib29sIGlzUGVyc3BlY3RpdmUgPSBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICk7CgkJaWYgKCBpc1BlcnNwZWN0aXZlICkgc2NhbGUgKj0gLSBtdlBvc2l0aW9uLno7CgkjZW5kaWYKCXZlYzIgYWxpZ25lZFBvc2l0aW9uID0gKCBwb3NpdGlvbi54eSAtICggY2VudGVyIC0gdmVjMiggMC41ICkgKSApICogc2NhbGU7Cgl2ZWMyIHJvdGF0ZWRQb3NpdGlvbjsKCXJvdGF0ZWRQb3NpdGlvbi54ID0gY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTsKCXJvdGF0ZWRQb3NpdGlvbi55ID0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggKyBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTsKCW12UG9zaXRpb24ueHkgKz0gcm90YXRlZFBvc2l0aW9uOwoJZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCxzcHJpdGVfZnJhZzpgdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCXZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJb3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Pgp9YH0sZHQ9e2NvbW1vbjp7ZGlmZnVzZTp7dmFsdWU6bmV3IHZ0KDE2Nzc3MjE1KX0sb3BhY2l0eTp7dmFsdWU6MX0sbWFwOnt2YWx1ZTpudWxsfSxtYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBYdH0sYWxwaGFNYXA6e3ZhbHVlOm51bGx9LGFscGhhTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWHR9LGFscGhhVGVzdDp7dmFsdWU6MH19LHNwZWN1bGFybWFwOntzcGVjdWxhck1hcDp7dmFsdWU6bnVsbH0sc3BlY3VsYXJNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBYdH19LGVudm1hcDp7ZW52TWFwOnt2YWx1ZTpudWxsfSxlbnZNYXBSb3RhdGlvbjp7dmFsdWU6bmV3IFh0fSxmbGlwRW52TWFwOnt2YWx1ZTotMX0scmVmbGVjdGl2aXR5Ont2YWx1ZToxfSxpb3I6e3ZhbHVlOjEuNX0scmVmcmFjdGlvblJhdGlvOnt2YWx1ZTouOTh9fSxhb21hcDp7YW9NYXA6e3ZhbHVlOm51bGx9LGFvTWFwSW50ZW5zaXR5Ont2YWx1ZToxfSxhb01hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFh0fX0sbGlnaHRtYXA6e2xpZ2h0TWFwOnt2YWx1ZTpudWxsfSxsaWdodE1hcEludGVuc2l0eTp7dmFsdWU6MX0sbGlnaHRNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBYdH19LGJ1bXBtYXA6e2J1bXBNYXA6e3ZhbHVlOm51bGx9LGJ1bXBNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBYdH0sYnVtcFNjYWxlOnt2YWx1ZToxfX0sbm9ybWFsbWFwOntub3JtYWxNYXA6e3ZhbHVlOm51bGx9LG5vcm1hbE1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFh0fSxub3JtYWxTY2FsZTp7dmFsdWU6bmV3IHEoMSwxKX19LGRpc3BsYWNlbWVudG1hcDp7ZGlzcGxhY2VtZW50TWFwOnt2YWx1ZTpudWxsfSxkaXNwbGFjZW1lbnRNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBYdH0sZGlzcGxhY2VtZW50U2NhbGU6e3ZhbHVlOjF9LGRpc3BsYWNlbWVudEJpYXM6e3ZhbHVlOjB9fSxlbWlzc2l2ZW1hcDp7ZW1pc3NpdmVNYXA6e3ZhbHVlOm51bGx9LGVtaXNzaXZlTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWHR9fSxtZXRhbG5lc3NtYXA6e21ldGFsbmVzc01hcDp7dmFsdWU6bnVsbH0sbWV0YWxuZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWHR9fSxyb3VnaG5lc3NtYXA6e3JvdWdobmVzc01hcDp7dmFsdWU6bnVsbH0scm91Z2huZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWHR9fSxncmFkaWVudG1hcDp7Z3JhZGllbnRNYXA6e3ZhbHVlOm51bGx9fSxmb2c6e2ZvZ0RlbnNpdHk6e3ZhbHVlOjI1ZS01fSxmb2dOZWFyOnt2YWx1ZToxfSxmb2dGYXI6e3ZhbHVlOjJlM30sZm9nQ29sb3I6e3ZhbHVlOm5ldyB2dCgxNjc3NzIxNSl9fSxsaWdodHM6e2FtYmllbnRMaWdodENvbG9yOnt2YWx1ZTpbXX0sbGlnaHRQcm9iZTp7dmFsdWU6W119LGRpcmVjdGlvbmFsTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntkaXJlY3Rpb246e30sY29sb3I6e319fSxkaXJlY3Rpb25hbExpZ2h0U2hhZG93czp7dmFsdWU6W10scHJvcGVydGllczp7c2hhZG93SW50ZW5zaXR5OjEsc2hhZG93Qmlhczp7fSxzaGFkb3dOb3JtYWxCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sZGlyZWN0aW9uYWxTaGFkb3dNYXA6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDp7dmFsdWU6W119LHNwb3RMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LGRpcmVjdGlvbjp7fSxkaXN0YW5jZTp7fSxjb25lQ29zOnt9LHBlbnVtYnJhQ29zOnt9LGRlY2F5Ont9fX0sc3BvdExpZ2h0U2hhZG93czp7dmFsdWU6W10scHJvcGVydGllczp7c2hhZG93SW50ZW5zaXR5OjEsc2hhZG93Qmlhczp7fSxzaGFkb3dOb3JtYWxCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sc3BvdExpZ2h0TWFwOnt2YWx1ZTpbXX0sc3BvdFNoYWRvd01hcDp7dmFsdWU6W119LHNwb3RMaWdodE1hdHJpeDp7dmFsdWU6W119LHBvaW50TGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSxkZWNheTp7fSxkaXN0YW5jZTp7fX19LHBvaW50TGlnaHRTaGFkb3dzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntzaGFkb3dJbnRlbnNpdHk6MSxzaGFkb3dCaWFzOnt9LHNoYWRvd05vcm1hbEJpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e30sc2hhZG93Q2FtZXJhTmVhcjp7fSxzaGFkb3dDYW1lcmFGYXI6e319fSxwb2ludFNoYWRvd01hcDp7dmFsdWU6W119LHBvaW50U2hhZG93TWF0cml4Ont2YWx1ZTpbXX0saGVtaXNwaGVyZUxpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7ZGlyZWN0aW9uOnt9LHNreUNvbG9yOnt9LGdyb3VuZENvbG9yOnt9fX0scmVjdEFyZWFMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LHdpZHRoOnt9LGhlaWdodDp7fX19LGx0Y18xOnt2YWx1ZTpudWxsfSxsdGNfMjp7dmFsdWU6bnVsbH19LHBvaW50czp7ZGlmZnVzZTp7dmFsdWU6bmV3IHZ0KDE2Nzc3MjE1KX0sb3BhY2l0eTp7dmFsdWU6MX0sc2l6ZTp7dmFsdWU6MX0sc2NhbGU6e3ZhbHVlOjF9LG1hcDp7dmFsdWU6bnVsbH0sYWxwaGFNYXA6e3ZhbHVlOm51bGx9LGFscGhhTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWHR9LGFscGhhVGVzdDp7dmFsdWU6MH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyBYdH19LHNwcml0ZTp7ZGlmZnVzZTp7dmFsdWU6bmV3IHZ0KDE2Nzc3MjE1KX0sb3BhY2l0eTp7dmFsdWU6MX0sY2VudGVyOnt2YWx1ZTpuZXcgcSguNSwuNSl9LHJvdGF0aW9uOnt2YWx1ZTowfSxtYXA6e3ZhbHVlOm51bGx9LG1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFh0fSxhbHBoYU1hcDp7dmFsdWU6bnVsbH0sYWxwaGFNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBYdH0sYWxwaGFUZXN0Ont2YWx1ZTowfX19LFZuPXtiYXNpYzp7dW5pZm9ybXM6dG4oW2R0LmNvbW1vbixkdC5zcGVjdWxhcm1hcCxkdC5lbnZtYXAsZHQuYW9tYXAsZHQubGlnaHRtYXAsZHQuZm9nXSksdmVydGV4U2hhZGVyOnF0Lm1lc2hiYXNpY192ZXJ0LGZyYWdtZW50U2hhZGVyOnF0Lm1lc2hiYXNpY19mcmFnfSxsYW1iZXJ0Ont1bmlmb3Jtczp0bihbZHQuY29tbW9uLGR0LnNwZWN1bGFybWFwLGR0LmVudm1hcCxkdC5hb21hcCxkdC5saWdodG1hcCxkdC5lbWlzc2l2ZW1hcCxkdC5idW1wbWFwLGR0Lm5vcm1hbG1hcCxkdC5kaXNwbGFjZW1lbnRtYXAsZHQuZm9nLGR0LmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyB2dCgwKX19XSksdmVydGV4U2hhZGVyOnF0Lm1lc2hsYW1iZXJ0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6cXQubWVzaGxhbWJlcnRfZnJhZ30scGhvbmc6e3VuaWZvcm1zOnRuKFtkdC5jb21tb24sZHQuc3BlY3VsYXJtYXAsZHQuZW52bWFwLGR0LmFvbWFwLGR0LmxpZ2h0bWFwLGR0LmVtaXNzaXZlbWFwLGR0LmJ1bXBtYXAsZHQubm9ybWFsbWFwLGR0LmRpc3BsYWNlbWVudG1hcCxkdC5mb2csZHQubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3IHZ0KDApfSxzcGVjdWxhcjp7dmFsdWU6bmV3IHZ0KDExMTg0ODEpfSxzaGluaW5lc3M6e3ZhbHVlOjMwfX1dKSx2ZXJ0ZXhTaGFkZXI6cXQubWVzaHBob25nX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cXQubWVzaHBob25nX2ZyYWd9LHN0YW5kYXJkOnt1bmlmb3Jtczp0bihbZHQuY29tbW9uLGR0LmVudm1hcCxkdC5hb21hcCxkdC5saWdodG1hcCxkdC5lbWlzc2l2ZW1hcCxkdC5idW1wbWFwLGR0Lm5vcm1hbG1hcCxkdC5kaXNwbGFjZW1lbnRtYXAsZHQucm91Z2huZXNzbWFwLGR0Lm1ldGFsbmVzc21hcCxkdC5mb2csZHQubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3IHZ0KDApfSxyb3VnaG5lc3M6e3ZhbHVlOjF9LG1ldGFsbmVzczp7dmFsdWU6MH0sZW52TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6cXQubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cXQubWVzaHBoeXNpY2FsX2ZyYWd9LHRvb246e3VuaWZvcm1zOnRuKFtkdC5jb21tb24sZHQuYW9tYXAsZHQubGlnaHRtYXAsZHQuZW1pc3NpdmVtYXAsZHQuYnVtcG1hcCxkdC5ub3JtYWxtYXAsZHQuZGlzcGxhY2VtZW50bWFwLGR0LmdyYWRpZW50bWFwLGR0LmZvZyxkdC5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgdnQoMCl9fV0pLHZlcnRleFNoYWRlcjpxdC5tZXNodG9vbl92ZXJ0LGZyYWdtZW50U2hhZGVyOnF0Lm1lc2h0b29uX2ZyYWd9LG1hdGNhcDp7dW5pZm9ybXM6dG4oW2R0LmNvbW1vbixkdC5idW1wbWFwLGR0Lm5vcm1hbG1hcCxkdC5kaXNwbGFjZW1lbnRtYXAsZHQuZm9nLHttYXRjYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjpxdC5tZXNobWF0Y2FwX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cXQubWVzaG1hdGNhcF9mcmFnfSxwb2ludHM6e3VuaWZvcm1zOnRuKFtkdC5wb2ludHMsZHQuZm9nXSksdmVydGV4U2hhZGVyOnF0LnBvaW50c192ZXJ0LGZyYWdtZW50U2hhZGVyOnF0LnBvaW50c19mcmFnfSxkYXNoZWQ6e3VuaWZvcm1zOnRuKFtkdC5jb21tb24sZHQuZm9nLHtzY2FsZTp7dmFsdWU6MX0sZGFzaFNpemU6e3ZhbHVlOjF9LHRvdGFsU2l6ZTp7dmFsdWU6Mn19XSksdmVydGV4U2hhZGVyOnF0LmxpbmVkYXNoZWRfdmVydCxmcmFnbWVudFNoYWRlcjpxdC5saW5lZGFzaGVkX2ZyYWd9LGRlcHRoOnt1bmlmb3Jtczp0bihbZHQuY29tbW9uLGR0LmRpc3BsYWNlbWVudG1hcF0pLHZlcnRleFNoYWRlcjpxdC5kZXB0aF92ZXJ0LGZyYWdtZW50U2hhZGVyOnF0LmRlcHRoX2ZyYWd9LG5vcm1hbDp7dW5pZm9ybXM6dG4oW2R0LmNvbW1vbixkdC5idW1wbWFwLGR0Lm5vcm1hbG1hcCxkdC5kaXNwbGFjZW1lbnRtYXAse29wYWNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjpxdC5tZXNobm9ybWFsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cXQubWVzaG5vcm1hbF9mcmFnfSxzcHJpdGU6e3VuaWZvcm1zOnRuKFtkdC5zcHJpdGUsZHQuZm9nXSksdmVydGV4U2hhZGVyOnF0LnNwcml0ZV92ZXJ0LGZyYWdtZW50U2hhZGVyOnF0LnNwcml0ZV9mcmFnfSxiYWNrZ3JvdW5kOnt1bmlmb3Jtczp7dXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyBYdH0sdDJEOnt2YWx1ZTpudWxsfSxiYWNrZ3JvdW5kSW50ZW5zaXR5Ont2YWx1ZToxfX0sdmVydGV4U2hhZGVyOnF0LmJhY2tncm91bmRfdmVydCxmcmFnbWVudFNoYWRlcjpxdC5iYWNrZ3JvdW5kX2ZyYWd9LGJhY2tncm91bmRDdWJlOnt1bmlmb3Jtczp7ZW52TWFwOnt2YWx1ZTpudWxsfSxmbGlwRW52TWFwOnt2YWx1ZTotMX0sYmFja2dyb3VuZEJsdXJyaW5lc3M6e3ZhbHVlOjB9LGJhY2tncm91bmRJbnRlbnNpdHk6e3ZhbHVlOjF9LGJhY2tncm91bmRSb3RhdGlvbjp7dmFsdWU6bmV3IFh0fX0sdmVydGV4U2hhZGVyOnF0LmJhY2tncm91bmRDdWJlX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cXQuYmFja2dyb3VuZEN1YmVfZnJhZ30sY3ViZTp7dW5pZm9ybXM6e3RDdWJlOnt2YWx1ZTpudWxsfSx0RmxpcDp7dmFsdWU6LTF9LG9wYWNpdHk6e3ZhbHVlOjF9fSx2ZXJ0ZXhTaGFkZXI6cXQuY3ViZV92ZXJ0LGZyYWdtZW50U2hhZGVyOnF0LmN1YmVfZnJhZ30sZXF1aXJlY3Q6e3VuaWZvcm1zOnt0RXF1aXJlY3Q6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6cXQuZXF1aXJlY3RfdmVydCxmcmFnbWVudFNoYWRlcjpxdC5lcXVpcmVjdF9mcmFnfSxkaXN0YW5jZVJHQkE6e3VuaWZvcm1zOnRuKFtkdC5jb21tb24sZHQuZGlzcGxhY2VtZW50bWFwLHtyZWZlcmVuY2VQb3NpdGlvbjp7dmFsdWU6bmV3IEx9LG5lYXJEaXN0YW5jZTp7dmFsdWU6MX0sZmFyRGlzdGFuY2U6e3ZhbHVlOjFlM319XSksdmVydGV4U2hhZGVyOnF0LmRpc3RhbmNlUkdCQV92ZXJ0LGZyYWdtZW50U2hhZGVyOnF0LmRpc3RhbmNlUkdCQV9mcmFnfSxzaGFkb3c6e3VuaWZvcm1zOnRuKFtkdC5saWdodHMsZHQuZm9nLHtjb2xvcjp7dmFsdWU6bmV3IHZ0KDApfSxvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6cXQuc2hhZG93X3ZlcnQsZnJhZ21lbnRTaGFkZXI6cXQuc2hhZG93X2ZyYWd9fTtWbi5waHlzaWNhbD17dW5pZm9ybXM6dG4oW1ZuLnN0YW5kYXJkLnVuaWZvcm1zLHtjbGVhcmNvYXQ6e3ZhbHVlOjB9LGNsZWFyY29hdE1hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWHR9LGNsZWFyY29hdE5vcm1hbE1hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWHR9LGNsZWFyY29hdE5vcm1hbFNjYWxlOnt2YWx1ZTpuZXcgcSgxLDEpfSxjbGVhcmNvYXRSb3VnaG5lc3M6e3ZhbHVlOjB9LGNsZWFyY29hdFJvdWdobmVzc01hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0Um91Z2huZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWHR9LGRpc3BlcnNpb246e3ZhbHVlOjB9LGlyaWRlc2NlbmNlOnt2YWx1ZTowfSxpcmlkZXNjZW5jZU1hcDp7dmFsdWU6bnVsbH0saXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBYdH0saXJpZGVzY2VuY2VJT1I6e3ZhbHVlOjEuM30saXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtOnt2YWx1ZToxMDB9LGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTp7dmFsdWU6NDAwfSxpcmlkZXNjZW5jZVRoaWNrbmVzc01hcDp7dmFsdWU6bnVsbH0saXJpZGVzY2VuY2VUaGlja25lc3NNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBYdH0sc2hlZW46e3ZhbHVlOjB9LHNoZWVuQ29sb3I6e3ZhbHVlOm5ldyB2dCgwKX0sc2hlZW5Db2xvck1hcDp7dmFsdWU6bnVsbH0sc2hlZW5Db2xvck1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFh0fSxzaGVlblJvdWdobmVzczp7dmFsdWU6MX0sc2hlZW5Sb3VnaG5lc3NNYXA6e3ZhbHVlOm51bGx9LHNoZWVuUm91Z2huZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWHR9LHRyYW5zbWlzc2lvbjp7dmFsdWU6MH0sdHJhbnNtaXNzaW9uTWFwOnt2YWx1ZTpudWxsfSx0cmFuc21pc3Npb25NYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBYdH0sdHJhbnNtaXNzaW9uU2FtcGxlclNpemU6e3ZhbHVlOm5ldyBxfSx0cmFuc21pc3Npb25TYW1wbGVyTWFwOnt2YWx1ZTpudWxsfSx0aGlja25lc3M6e3ZhbHVlOjB9LHRoaWNrbmVzc01hcDp7dmFsdWU6bnVsbH0sdGhpY2tuZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWHR9LGF0dGVudWF0aW9uRGlzdGFuY2U6e3ZhbHVlOjB9LGF0dGVudWF0aW9uQ29sb3I6e3ZhbHVlOm5ldyB2dCgwKX0sc3BlY3VsYXJDb2xvcjp7dmFsdWU6bmV3IHZ0KDEsMSwxKX0sc3BlY3VsYXJDb2xvck1hcDp7dmFsdWU6bnVsbH0sc3BlY3VsYXJDb2xvck1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFh0fSxzcGVjdWxhckludGVuc2l0eTp7dmFsdWU6MX0sc3BlY3VsYXJJbnRlbnNpdHlNYXA6e3ZhbHVlOm51bGx9LHNwZWN1bGFySW50ZW5zaXR5TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWHR9LGFuaXNvdHJvcHlWZWN0b3I6e3ZhbHVlOm5ldyBxfSxhbmlzb3Ryb3B5TWFwOnt2YWx1ZTpudWxsfSxhbmlzb3Ryb3B5TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWHR9fV0pLHZlcnRleFNoYWRlcjpxdC5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjpxdC5tZXNocGh5c2ljYWxfZnJhZ307Y29uc3QgVmw9e3I6MCxiOjAsZzowfSxicj1uZXcgTW4sZUE9bmV3IEx0O2Z1bmN0aW9uIG5BKGksdCxlLG4scixzLG8pe2NvbnN0IGE9bmV3IHZ0KDApO2xldCBsPXM9PT0hMD8wOjEsYyx1LGg9bnVsbCxmPTAsZD1udWxsO2Z1bmN0aW9uIHAoeCl7bGV0IHY9eC5pc1NjZW5lPT09ITA/eC5iYWNrZ3JvdW5kOm51bGw7cmV0dXJuIHYmJnYuaXNUZXh0dXJlJiYodj0oeC5iYWNrZ3JvdW5kQmx1cnJpbmVzcz4wP2U6dCkuZ2V0KHYpKSx2fWZ1bmN0aW9uIHkoeCl7bGV0IHY9ITE7Y29uc3QgXz1wKHgpO189PT1udWxsP2coYSxsKTpfJiZfLmlzQ29sb3ImJihnKF8sMSksdj0hMCk7Y29uc3QgRT1pLnhyLmdldEVudmlyb25tZW50QmxlbmRNb2RlKCk7RT09PSJhZGRpdGl2ZSI/bi5idWZmZXJzLmNvbG9yLnNldENsZWFyKDAsMCwwLDEsbyk6RT09PSJhbHBoYS1ibGVuZCImJm4uYnVmZmVycy5jb2xvci5zZXRDbGVhcigwLDAsMCwwLG8pLChpLmF1dG9DbGVhcnx8dikmJihuLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCksbi5idWZmZXJzLmRlcHRoLnNldE1hc2soITApLG4uYnVmZmVycy5jb2xvci5zZXRNYXNrKCEwKSxpLmNsZWFyKGkuYXV0b0NsZWFyQ29sb3IsaS5hdXRvQ2xlYXJEZXB0aCxpLmF1dG9DbGVhclN0ZW5jaWwpKX1mdW5jdGlvbiBtKHgsdil7Y29uc3QgXz1wKHYpO18mJihfLmlzQ3ViZVRleHR1cmV8fF8ubWFwcGluZz09PWpyKT8odT09PXZvaWQgMCYmKHU9bmV3IEllKG5ldyBNcigxLDEsMSksbmV3IEduKHtuYW1lOiJCYWNrZ3JvdW5kQ3ViZU1hdGVyaWFsIix1bmlmb3Jtczp4cyhWbi5iYWNrZ3JvdW5kQ3ViZS51bmlmb3JtcyksdmVydGV4U2hhZGVyOlZuLmJhY2tncm91bmRDdWJlLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjpWbi5iYWNrZ3JvdW5kQ3ViZS5mcmFnbWVudFNoYWRlcixzaWRlOktlLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExLGZvZzohMX0pKSx1Lmdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSgibm9ybWFsIiksdS5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoInV2IiksdS5vbkJlZm9yZVJlbmRlcj1mdW5jdGlvbihFLGIsVCl7dGhpcy5tYXRyaXhXb3JsZC5jb3B5UG9zaXRpb24oVC5tYXRyaXhXb3JsZCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1Lm1hdGVyaWFsLCJlbnZNYXAiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5lbnZNYXAudmFsdWV9fSksci51cGRhdGUodSkpLGJyLmNvcHkodi5iYWNrZ3JvdW5kUm90YXRpb24pLGJyLngqPS0xLGJyLnkqPS0xLGJyLnoqPS0xLF8uaXNDdWJlVGV4dHVyZSYmXy5pc1JlbmRlclRhcmdldFRleHR1cmU9PT0hMSYmKGJyLnkqPS0xLGJyLnoqPS0xKSx1Lm1hdGVyaWFsLnVuaWZvcm1zLmVudk1hcC52YWx1ZT1fLHUubWF0ZXJpYWwudW5pZm9ybXMuZmxpcEVudk1hcC52YWx1ZT1fLmlzQ3ViZVRleHR1cmUmJl8uaXNSZW5kZXJUYXJnZXRUZXh0dXJlPT09ITE/LTE6MSx1Lm1hdGVyaWFsLnVuaWZvcm1zLmJhY2tncm91bmRCbHVycmluZXNzLnZhbHVlPXYuYmFja2dyb3VuZEJsdXJyaW5lc3MsdS5tYXRlcmlhbC51bmlmb3Jtcy5iYWNrZ3JvdW5kSW50ZW5zaXR5LnZhbHVlPXYuYmFja2dyb3VuZEludGVuc2l0eSx1Lm1hdGVyaWFsLnVuaWZvcm1zLmJhY2tncm91bmRSb3RhdGlvbi52YWx1ZS5zZXRGcm9tTWF0cml4NChlQS5tYWtlUm90YXRpb25Gcm9tRXVsZXIoYnIpKSx1Lm1hdGVyaWFsLnRvbmVNYXBwZWQ9c2UuZ2V0VHJhbnNmZXIoXy5jb2xvclNwYWNlKSE9PWRlLChoIT09X3x8ZiE9PV8udmVyc2lvbnx8ZCE9PWkudG9uZU1hcHBpbmcpJiYodS5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxoPV8sZj1fLnZlcnNpb24sZD1pLnRvbmVNYXBwaW5nKSx1LmxheWVycy5lbmFibGVBbGwoKSx4LnVuc2hpZnQodSx1Lmdlb21ldHJ5LHUubWF0ZXJpYWwsMCwwLG51bGwpKTpfJiZfLmlzVGV4dHVyZSYmKGM9PT12b2lkIDAmJihjPW5ldyBJZShuZXcgYnMoMiwyKSxuZXcgR24oe25hbWU6IkJhY2tncm91bmRNYXRlcmlhbCIsdW5pZm9ybXM6eHMoVm4uYmFja2dyb3VuZC51bmlmb3JtcyksdmVydGV4U2hhZGVyOlZuLmJhY2tncm91bmQudmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOlZuLmJhY2tncm91bmQuZnJhZ21lbnRTaGFkZXIsc2lkZTpoaSxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSxmb2c6ITF9KSksYy5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoIm5vcm1hbCIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLm1hdGVyaWFsLCJtYXAiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy50MkQudmFsdWV9fSksci51cGRhdGUoYykpLGMubWF0ZXJpYWwudW5pZm9ybXMudDJELnZhbHVlPV8sYy5tYXRlcmlhbC51bmlmb3Jtcy5iYWNrZ3JvdW5kSW50ZW5zaXR5LnZhbHVlPXYuYmFja2dyb3VuZEludGVuc2l0eSxjLm1hdGVyaWFsLnRvbmVNYXBwZWQ9c2UuZ2V0VHJhbnNmZXIoXy5jb2xvclNwYWNlKSE9PWRlLF8ubWF0cml4QXV0b1VwZGF0ZT09PSEwJiZfLnVwZGF0ZU1hdHJpeCgpLGMubWF0ZXJpYWwudW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weShfLm1hdHJpeCksKGghPT1ffHxmIT09Xy52ZXJzaW9ufHxkIT09aS50b25lTWFwcGluZykmJihjLm1hdGVyaWFsLm5lZWRzVXBkYXRlPSEwLGg9XyxmPV8udmVyc2lvbixkPWkudG9uZU1hcHBpbmcpLGMubGF5ZXJzLmVuYWJsZUFsbCgpLHgudW5zaGlmdChjLGMuZ2VvbWV0cnksYy5tYXRlcmlhbCwwLDAsbnVsbCkpfWZ1bmN0aW9uIGcoeCx2KXt4LmdldFJHQihWbCxSZyhpKSksbi5idWZmZXJzLmNvbG9yLnNldENsZWFyKFZsLnIsVmwuZyxWbC5iLHYsbyl9cmV0dXJue2dldENsZWFyQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sc2V0Q2xlYXJDb2xvcjpmdW5jdGlvbih4LHY9MSl7YS5zZXQoeCksbD12LGcoYSxsKX0sZ2V0Q2xlYXJBbHBoYTpmdW5jdGlvbigpe3JldHVybiBsfSxzZXRDbGVhckFscGhhOmZ1bmN0aW9uKHgpe2w9eCxnKGEsbCl9LHJlbmRlcjp5LGFkZFRvUmVuZGVyTGlzdDptfX1mdW5jdGlvbiBpQShpLHQpe2NvbnN0IGU9aS5nZXRQYXJhbWV0ZXIoaS5NQVhfVkVSVEVYX0FUVFJJQlMpLG49e30scj1mKG51bGwpO2xldCBzPXIsbz0hMTtmdW5jdGlvbiBhKE0sQSxGLEQsTil7bGV0IFU9ITE7Y29uc3QgQj1oKEQsRixBKTtzIT09QiYmKHM9QixjKHMub2JqZWN0KSksVT1kKE0sRCxGLE4pLFUmJnAoTSxELEYsTiksTiE9PW51bGwmJnQudXBkYXRlKE4saS5FTEVNRU5UX0FSUkFZX0JVRkZFUiksKFV8fG8pJiYobz0hMSxfKE0sQSxGLEQpLE4hPT1udWxsJiZpLmJpbmRCdWZmZXIoaS5FTEVNRU5UX0FSUkFZX0JVRkZFUix0LmdldChOKS5idWZmZXIpKX1mdW5jdGlvbiBsKCl7cmV0dXJuIGkuY3JlYXRlVmVydGV4QXJyYXkoKX1mdW5jdGlvbiBjKE0pe3JldHVybiBpLmJpbmRWZXJ0ZXhBcnJheShNKX1mdW5jdGlvbiB1KE0pe3JldHVybiBpLmRlbGV0ZVZlcnRleEFycmF5KE0pfWZ1bmN0aW9uIGgoTSxBLEYpe2NvbnN0IEQ9Ri53aXJlZnJhbWU9PT0hMDtsZXQgTj1uW00uaWRdO049PT12b2lkIDAmJihOPXt9LG5bTS5pZF09Tik7bGV0IFU9TltBLmlkXTtVPT09dm9pZCAwJiYoVT17fSxOW0EuaWRdPVUpO2xldCBCPVVbRF07cmV0dXJuIEI9PT12b2lkIDAmJihCPWYobCgpKSxVW0RdPUIpLEJ9ZnVuY3Rpb24gZihNKXtjb25zdCBBPVtdLEY9W10sRD1bXTtmb3IobGV0IE49MDtOPGU7TisrKUFbTl09MCxGW05dPTAsRFtOXT0wO3JldHVybntnZW9tZXRyeTpudWxsLHByb2dyYW06bnVsbCx3aXJlZnJhbWU6ITEsbmV3QXR0cmlidXRlczpBLGVuYWJsZWRBdHRyaWJ1dGVzOkYsYXR0cmlidXRlRGl2aXNvcnM6RCxvYmplY3Q6TSxhdHRyaWJ1dGVzOnt9LGluZGV4Om51bGx9fWZ1bmN0aW9uIGQoTSxBLEYsRCl7Y29uc3QgTj1zLmF0dHJpYnV0ZXMsVT1BLmF0dHJpYnV0ZXM7bGV0IEI9MDtjb25zdCBIPUYuZ2V0QXR0cmlidXRlcygpO2Zvcihjb25zdCBHIGluIEgpaWYoSFtHXS5sb2NhdGlvbj49MCl7Y29uc3QgbHQ9TltHXTtsZXQgaHQ9VVtHXTtpZihodD09PXZvaWQgMCYmKEc9PT0iaW5zdGFuY2VNYXRyaXgiJiZNLmluc3RhbmNlTWF0cml4JiYoaHQ9TS5pbnN0YW5jZU1hdHJpeCksRz09PSJpbnN0YW5jZUNvbG9yIiYmTS5pbnN0YW5jZUNvbG9yJiYoaHQ9TS5pbnN0YW5jZUNvbG9yKSksbHQ9PT12b2lkIDB8fGx0LmF0dHJpYnV0ZSE9PWh0fHxodCYmbHQuZGF0YSE9PWh0LmRhdGEpcmV0dXJuITA7QisrfXJldHVybiBzLmF0dHJpYnV0ZXNOdW0hPT1CfHxzLmluZGV4IT09RH1mdW5jdGlvbiBwKE0sQSxGLEQpe2NvbnN0IE49e30sVT1BLmF0dHJpYnV0ZXM7bGV0IEI9MDtjb25zdCBIPUYuZ2V0QXR0cmlidXRlcygpO2Zvcihjb25zdCBHIGluIEgpaWYoSFtHXS5sb2NhdGlvbj49MCl7bGV0IGx0PVVbR107bHQ9PT12b2lkIDAmJihHPT09Imluc3RhbmNlTWF0cml4IiYmTS5pbnN0YW5jZU1hdHJpeCYmKGx0PU0uaW5zdGFuY2VNYXRyaXgpLEc9PT0iaW5zdGFuY2VDb2xvciImJk0uaW5zdGFuY2VDb2xvciYmKGx0PU0uaW5zdGFuY2VDb2xvcikpO2NvbnN0IGh0PXt9O2h0LmF0dHJpYnV0ZT1sdCxsdCYmbHQuZGF0YSYmKGh0LmRhdGE9bHQuZGF0YSksTltHXT1odCxCKyt9cy5hdHRyaWJ1dGVzPU4scy5hdHRyaWJ1dGVzTnVtPUIscy5pbmRleD1EfWZ1bmN0aW9uIHkoKXtjb25zdCBNPXMubmV3QXR0cmlidXRlcztmb3IobGV0IEE9MCxGPU0ubGVuZ3RoO0E8RjtBKyspTVtBXT0wfWZ1bmN0aW9uIG0oTSl7ZyhNLDApfWZ1bmN0aW9uIGcoTSxBKXtjb25zdCBGPXMubmV3QXR0cmlidXRlcyxEPXMuZW5hYmxlZEF0dHJpYnV0ZXMsTj1zLmF0dHJpYnV0ZURpdmlzb3JzO0ZbTV09MSxEW01dPT09MCYmKGkuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoTSksRFtNXT0xKSxOW01dIT09QSYmKGkudmVydGV4QXR0cmliRGl2aXNvcihNLEEpLE5bTV09QSl9ZnVuY3Rpb24geCgpe2NvbnN0IE09cy5uZXdBdHRyaWJ1dGVzLEE9cy5lbmFibGVkQXR0cmlidXRlcztmb3IobGV0IEY9MCxEPUEubGVuZ3RoO0Y8RDtGKyspQVtGXSE9PU1bRl0mJihpLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShGKSxBW0ZdPTApfWZ1bmN0aW9uIHYoTSxBLEYsRCxOLFUsQil7Qj09PSEwP2kudmVydGV4QXR0cmliSVBvaW50ZXIoTSxBLEYsTixVKTppLnZlcnRleEF0dHJpYlBvaW50ZXIoTSxBLEYsRCxOLFUpfWZ1bmN0aW9uIF8oTSxBLEYsRCl7eSgpO2NvbnN0IE49RC5hdHRyaWJ1dGVzLFU9Ri5nZXRBdHRyaWJ1dGVzKCksQj1BLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7Zm9yKGNvbnN0IEggaW4gVSl7Y29uc3QgRz1VW0hdO2lmKEcubG9jYXRpb24+PTApe2xldCB0dD1OW0hdO2lmKHR0PT09dm9pZCAwJiYoSD09PSJpbnN0YW5jZU1hdHJpeCImJk0uaW5zdGFuY2VNYXRyaXgmJih0dD1NLmluc3RhbmNlTWF0cml4KSxIPT09Imluc3RhbmNlQ29sb3IiJiZNLmluc3RhbmNlQ29sb3ImJih0dD1NLmluc3RhbmNlQ29sb3IpKSx0dCE9PXZvaWQgMCl7Y29uc3QgbHQ9dHQubm9ybWFsaXplZCxodD10dC5pdGVtU2l6ZSxSdD10LmdldCh0dCk7aWYoUnQ9PT12b2lkIDApY29udGludWU7Y29uc3QgVnQ9UnQuYnVmZmVyLEs9UnQudHlwZSxydD1SdC5ieXRlc1BlckVsZW1lbnQsTXQ9Sz09PWkuSU5UfHxLPT09aS5VTlNJR05FRF9JTlR8fHR0LmdwdVR5cGU9PT16YTtpZih0dC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXtjb25zdCBwdD10dC5kYXRhLEl0PXB0LnN0cmlkZSxGdD10dC5vZmZzZXQ7aWYocHQuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcil7Zm9yKGxldCBFdD0wO0V0PEcubG9jYXRpb25TaXplO0V0KyspZyhHLmxvY2F0aW9uK0V0LHB0Lm1lc2hQZXJBdHRyaWJ1dGUpO00uaXNJbnN0YW5jZWRNZXNoIT09ITAmJkQuX21heEluc3RhbmNlQ291bnQ9PT12b2lkIDAmJihELl9tYXhJbnN0YW5jZUNvdW50PXB0Lm1lc2hQZXJBdHRyaWJ1dGUqcHQuY291bnQpfWVsc2UgZm9yKGxldCBFdD0wO0V0PEcubG9jYXRpb25TaXplO0V0KyspbShHLmxvY2F0aW9uK0V0KTtpLmJpbmRCdWZmZXIoaS5BUlJBWV9CVUZGRVIsVnQpO2ZvcihsZXQgRXQ9MDtFdDxHLmxvY2F0aW9uU2l6ZTtFdCsrKXYoRy5sb2NhdGlvbitFdCxodC9HLmxvY2F0aW9uU2l6ZSxLLGx0LEl0KnJ0LChGdCtodC9HLmxvY2F0aW9uU2l6ZSpFdCkqcnQsTXQpfWVsc2V7aWYodHQuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUpe2ZvcihsZXQgcHQ9MDtwdDxHLmxvY2F0aW9uU2l6ZTtwdCsrKWcoRy5sb2NhdGlvbitwdCx0dC5tZXNoUGVyQXR0cmlidXRlKTtNLmlzSW5zdGFuY2VkTWVzaCE9PSEwJiZELl9tYXhJbnN0YW5jZUNvdW50PT09dm9pZCAwJiYoRC5fbWF4SW5zdGFuY2VDb3VudD10dC5tZXNoUGVyQXR0cmlidXRlKnR0LmNvdW50KX1lbHNlIGZvcihsZXQgcHQ9MDtwdDxHLmxvY2F0aW9uU2l6ZTtwdCsrKW0oRy5sb2NhdGlvbitwdCk7aS5iaW5kQnVmZmVyKGkuQVJSQVlfQlVGRkVSLFZ0KTtmb3IobGV0IHB0PTA7cHQ8Ry5sb2NhdGlvblNpemU7cHQrKyl2KEcubG9jYXRpb24rcHQsaHQvRy5sb2NhdGlvblNpemUsSyxsdCxodCpydCxodC9HLmxvY2F0aW9uU2l6ZSpwdCpydCxNdCl9fWVsc2UgaWYoQiE9PXZvaWQgMCl7Y29uc3QgbHQ9QltIXTtpZihsdCE9PXZvaWQgMClzd2l0Y2gobHQubGVuZ3RoKXtjYXNlIDI6aS52ZXJ0ZXhBdHRyaWIyZnYoRy5sb2NhdGlvbixsdCk7YnJlYWs7Y2FzZSAzOmkudmVydGV4QXR0cmliM2Z2KEcubG9jYXRpb24sbHQpO2JyZWFrO2Nhc2UgNDppLnZlcnRleEF0dHJpYjRmdihHLmxvY2F0aW9uLGx0KTticmVhaztkZWZhdWx0OmkudmVydGV4QXR0cmliMWZ2KEcubG9jYXRpb24sbHQpfX19fXgoKX1mdW5jdGlvbiBFKCl7UCgpO2Zvcihjb25zdCBNIGluIG4pe2NvbnN0IEE9bltNXTtmb3IoY29uc3QgRiBpbiBBKXtjb25zdCBEPUFbRl07Zm9yKGNvbnN0IE4gaW4gRCl1KERbTl0ub2JqZWN0KSxkZWxldGUgRFtOXTtkZWxldGUgQVtGXX1kZWxldGUgbltNXX19ZnVuY3Rpb24gYihNKXtpZihuW00uaWRdPT09dm9pZCAwKXJldHVybjtjb25zdCBBPW5bTS5pZF07Zm9yKGNvbnN0IEYgaW4gQSl7Y29uc3QgRD1BW0ZdO2Zvcihjb25zdCBOIGluIEQpdShEW05dLm9iamVjdCksZGVsZXRlIERbTl07ZGVsZXRlIEFbRl19ZGVsZXRlIG5bTS5pZF19ZnVuY3Rpb24gVChNKXtmb3IoY29uc3QgQSBpbiBuKXtjb25zdCBGPW5bQV07aWYoRltNLmlkXT09PXZvaWQgMCljb250aW51ZTtjb25zdCBEPUZbTS5pZF07Zm9yKGNvbnN0IE4gaW4gRCl1KERbTl0ub2JqZWN0KSxkZWxldGUgRFtOXTtkZWxldGUgRltNLmlkXX19ZnVuY3Rpb24gUCgpe3coKSxvPSEwLHMhPT1yJiYocz1yLGMocy5vYmplY3QpKX1mdW5jdGlvbiB3KCl7ci5nZW9tZXRyeT1udWxsLHIucHJvZ3JhbT1udWxsLHIud2lyZWZyYW1lPSExfXJldHVybntzZXR1cDphLHJlc2V0OlAscmVzZXREZWZhdWx0U3RhdGU6dyxkaXNwb3NlOkUscmVsZWFzZVN0YXRlc09mR2VvbWV0cnk6YixyZWxlYXNlU3RhdGVzT2ZQcm9ncmFtOlQsaW5pdEF0dHJpYnV0ZXM6eSxlbmFibGVBdHRyaWJ1dGU6bSxkaXNhYmxlVW51c2VkQXR0cmlidXRlczp4fX1mdW5jdGlvbiByQShpLHQsZSl7bGV0IG47ZnVuY3Rpb24gcihjKXtuPWN9ZnVuY3Rpb24gcyhjLHUpe2kuZHJhd0FycmF5cyhuLGMsdSksZS51cGRhdGUodSxuLDEpfWZ1bmN0aW9uIG8oYyx1LGgpe2ghPT0wJiYoaS5kcmF3QXJyYXlzSW5zdGFuY2VkKG4sYyx1LGgpLGUudXBkYXRlKHUsbixoKSl9ZnVuY3Rpb24gYShjLHUsaCl7aWYoaD09PTApcmV0dXJuO3QuZ2V0KCJXRUJHTF9tdWx0aV9kcmF3IikubXVsdGlEcmF3QXJyYXlzV0VCR0wobixjLDAsdSwwLGgpO2xldCBkPTA7Zm9yKGxldCBwPTA7cDxoO3ArKylkKz11W3BdO2UudXBkYXRlKGQsbiwxKX1mdW5jdGlvbiBsKGMsdSxoLGYpe2lmKGg9PT0wKXJldHVybjtjb25zdCBkPXQuZ2V0KCJXRUJHTF9tdWx0aV9kcmF3Iik7aWYoZD09PW51bGwpZm9yKGxldCBwPTA7cDxjLmxlbmd0aDtwKyspbyhjW3BdLHVbcF0sZltwXSk7ZWxzZXtkLm11bHRpRHJhd0FycmF5c0luc3RhbmNlZFdFQkdMKG4sYywwLHUsMCxmLDAsaCk7bGV0IHA9MDtmb3IobGV0IHk9MDt5PGg7eSsrKXArPXVbeV07Zm9yKGxldCB5PTA7eTxmLmxlbmd0aDt5KyspZS51cGRhdGUocCxuLGZbeV0pfX10aGlzLnNldE1vZGU9cix0aGlzLnJlbmRlcj1zLHRoaXMucmVuZGVySW5zdGFuY2VzPW8sdGhpcy5yZW5kZXJNdWx0aURyYXc9YSx0aGlzLnJlbmRlck11bHRpRHJhd0luc3RhbmNlcz1sfWZ1bmN0aW9uIHNBKGksdCxlLG4pe2xldCByO2Z1bmN0aW9uIHMoKXtpZihyIT09dm9pZCAwKXJldHVybiByO2lmKHQuaGFzKCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKT09PSEwKXtjb25zdCBiPXQuZ2V0KCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTtyPWkuZ2V0UGFyYW1ldGVyKGIuTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUKX1lbHNlIHI9MDtyZXR1cm4gcn1mdW5jdGlvbiBvKGIpe3JldHVybiEoYiE9PWplJiZuLmNvbnZlcnQoYikhPT1pLmdldFBhcmFtZXRlcihpLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUKSl9ZnVuY3Rpb24gYShiKXtjb25zdCBUPWI9PT1lcyYmKHQuaGFzKCJFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQiKXx8dC5oYXMoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKSk7cmV0dXJuIShiIT09UW4mJm4uY29udmVydChiKSE9PWkuZ2V0UGFyYW1ldGVyKGkuSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFKSYmYiE9PWNuJiYhVCl9ZnVuY3Rpb24gbChiKXtpZihiPT09ImhpZ2hwIil7aWYoaS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoaS5WRVJURVhfU0hBREVSLGkuSElHSF9GTE9BVCkucHJlY2lzaW9uPjAmJmkuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KGkuRlJBR01FTlRfU0hBREVSLGkuSElHSF9GTE9BVCkucHJlY2lzaW9uPjApcmV0dXJuImhpZ2hwIjtiPSJtZWRpdW1wIn1yZXR1cm4gYj09PSJtZWRpdW1wIiYmaS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoaS5WRVJURVhfU0hBREVSLGkuTUVESVVNX0ZMT0FUKS5wcmVjaXNpb24+MCYmaS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoaS5GUkFHTUVOVF9TSEFERVIsaS5NRURJVU1fRkxPQVQpLnByZWNpc2lvbj4wPyJtZWRpdW1wIjoibG93cCJ9bGV0IGM9ZS5wcmVjaXNpb24hPT12b2lkIDA/ZS5wcmVjaXNpb246ImhpZ2hwIjtjb25zdCB1PWwoYyk7dSE9PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IixjLCJub3Qgc3VwcG9ydGVkLCB1c2luZyIsdSwiaW5zdGVhZC4iKSxjPXUpO2NvbnN0IGg9ZS5sb2dhcml0aG1pY0RlcHRoQnVmZmVyPT09ITAsZj1pLmdldFBhcmFtZXRlcihpLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKSxkPWkuZ2V0UGFyYW1ldGVyKGkuTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTKSxwPWkuZ2V0UGFyYW1ldGVyKGkuTUFYX1RFWFRVUkVfU0laRSkseT1pLmdldFBhcmFtZXRlcihpLk1BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUpLG09aS5nZXRQYXJhbWV0ZXIoaS5NQVhfVkVSVEVYX0FUVFJJQlMpLGc9aS5nZXRQYXJhbWV0ZXIoaS5NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUykseD1pLmdldFBhcmFtZXRlcihpLk1BWF9WQVJZSU5HX1ZFQ1RPUlMpLHY9aS5nZXRQYXJhbWV0ZXIoaS5NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTKSxfPWQ+MCxFPWkuZ2V0UGFyYW1ldGVyKGkuTUFYX1NBTVBMRVMpO3JldHVybntpc1dlYkdMMjohMCxnZXRNYXhBbmlzb3Ryb3B5OnMsZ2V0TWF4UHJlY2lzaW9uOmwsdGV4dHVyZUZvcm1hdFJlYWRhYmxlOm8sdGV4dHVyZVR5cGVSZWFkYWJsZTphLHByZWNpc2lvbjpjLGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6aCxtYXhUZXh0dXJlczpmLG1heFZlcnRleFRleHR1cmVzOmQsbWF4VGV4dHVyZVNpemU6cCxtYXhDdWJlbWFwU2l6ZTp5LG1heEF0dHJpYnV0ZXM6bSxtYXhWZXJ0ZXhVbmlmb3JtczpnLG1heFZhcnlpbmdzOngsbWF4RnJhZ21lbnRVbmlmb3Jtczp2LHZlcnRleFRleHR1cmVzOl8sbWF4U2FtcGxlczpFfX1mdW5jdGlvbiBvQShpKXtjb25zdCB0PXRoaXM7bGV0IGU9bnVsbCxuPTAscj0hMSxzPSExO2NvbnN0IG89bmV3IFlpLGE9bmV3IFh0LGw9e3ZhbHVlOm51bGwsbmVlZHNVcGRhdGU6ITF9O3RoaXMudW5pZm9ybT1sLHRoaXMubnVtUGxhbmVzPTAsdGhpcy5udW1JbnRlcnNlY3Rpb249MCx0aGlzLmluaXQ9ZnVuY3Rpb24oaCxmKXtjb25zdCBkPWgubGVuZ3RoIT09MHx8Znx8biE9PTB8fHI7cmV0dXJuIHI9ZixuPWgubGVuZ3RoLGR9LHRoaXMuYmVnaW5TaGFkb3dzPWZ1bmN0aW9uKCl7cz0hMCx1KG51bGwpfSx0aGlzLmVuZFNoYWRvd3M9ZnVuY3Rpb24oKXtzPSExfSx0aGlzLnNldEdsb2JhbFN0YXRlPWZ1bmN0aW9uKGgsZil7ZT11KGgsZiwwKX0sdGhpcy5zZXRTdGF0ZT1mdW5jdGlvbihoLGYsZCl7Y29uc3QgcD1oLmNsaXBwaW5nUGxhbmVzLHk9aC5jbGlwSW50ZXJzZWN0aW9uLG09aC5jbGlwU2hhZG93cyxnPWkuZ2V0KGgpO2lmKCFyfHxwPT09bnVsbHx8cC5sZW5ndGg9PT0wfHxzJiYhbSlzP3UobnVsbCk6YygpO2Vsc2V7Y29uc3QgeD1zPzA6bix2PXgqNDtsZXQgXz1nLmNsaXBwaW5nU3RhdGV8fG51bGw7bC52YWx1ZT1fLF89dShwLGYsdixkKTtmb3IobGV0IEU9MDtFIT09djsrK0UpX1tFXT1lW0VdO2cuY2xpcHBpbmdTdGF0ZT1fLHRoaXMubnVtSW50ZXJzZWN0aW9uPXk/dGhpcy5udW1QbGFuZXM6MCx0aGlzLm51bVBsYW5lcys9eH19O2Z1bmN0aW9uIGMoKXtsLnZhbHVlIT09ZSYmKGwudmFsdWU9ZSxsLm5lZWRzVXBkYXRlPW4+MCksdC5udW1QbGFuZXM9bix0Lm51bUludGVyc2VjdGlvbj0wfWZ1bmN0aW9uIHUoaCxmLGQscCl7Y29uc3QgeT1oIT09bnVsbD9oLmxlbmd0aDowO2xldCBtPW51bGw7aWYoeSE9PTApe2lmKG09bC52YWx1ZSxwIT09ITB8fG09PT1udWxsKXtjb25zdCBnPWQreSo0LHg9Zi5tYXRyaXhXb3JsZEludmVyc2U7YS5nZXROb3JtYWxNYXRyaXgoeCksKG09PT1udWxsfHxtLmxlbmd0aDxnKSYmKG09bmV3IEZsb2F0MzJBcnJheShnKSk7Zm9yKGxldCB2PTAsXz1kO3YhPT15OysrdixfKz00KW8uY29weShoW3ZdKS5hcHBseU1hdHJpeDQoeCxhKSxvLm5vcm1hbC50b0FycmF5KG0sXyksbVtfKzNdPW8uY29uc3RhbnR9bC52YWx1ZT1tLGwubmVlZHNVcGRhdGU9ITB9cmV0dXJuIHQubnVtUGxhbmVzPXksdC5udW1JbnRlcnNlY3Rpb249MCxtfX1mdW5jdGlvbiBhQShpKXtsZXQgdD1uZXcgV2Vha01hcDtmdW5jdGlvbiBlKG8sYSl7cmV0dXJuIGE9PT1jbz9vLm1hcHBpbmc9cGk6YT09PXVvJiYoby5tYXBwaW5nPXppKSxvfWZ1bmN0aW9uIG4obyl7aWYobyYmby5pc1RleHR1cmUpe2NvbnN0IGE9by5tYXBwaW5nO2lmKGE9PT1jb3x8YT09PXVvKWlmKHQuaGFzKG8pKXtjb25zdCBsPXQuZ2V0KG8pLnRleHR1cmU7cmV0dXJuIGUobCxvLm1hcHBpbmcpfWVsc2V7Y29uc3QgbD1vLmltYWdlO2lmKGwmJmwuaGVpZ2h0PjApe2NvbnN0IGM9bmV3IFVnKGwuaGVpZ2h0KTtyZXR1cm4gYy5mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZShpLG8pLHQuc2V0KG8sYyksby5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixyKSxlKGMudGV4dHVyZSxvLm1hcHBpbmcpfWVsc2UgcmV0dXJuIG51bGx9fXJldHVybiBvfWZ1bmN0aW9uIHIobyl7Y29uc3QgYT1vLnRhcmdldDthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHIpO2NvbnN0IGw9dC5nZXQoYSk7bCE9PXZvaWQgMCYmKHQuZGVsZXRlKGEpLGwuZGlzcG9zZSgpKX1mdW5jdGlvbiBzKCl7dD1uZXcgV2Vha01hcH1yZXR1cm57Z2V0Om4sZGlzcG9zZTpzfX1jbGFzcyBIbCBleHRlbmRzIGtse2NvbnN0cnVjdG9yKHQ9LTEsZT0xLG49MSxyPS0xLHM9LjEsbz0yZTMpe3N1cGVyKCksdGhpcy5pc09ydGhvZ3JhcGhpY0NhbWVyYT0hMCx0aGlzLnR5cGU9Ik9ydGhvZ3JhcGhpY0NhbWVyYSIsdGhpcy56b29tPTEsdGhpcy52aWV3PW51bGwsdGhpcy5sZWZ0PXQsdGhpcy5yaWdodD1lLHRoaXMudG9wPW4sdGhpcy5ib3R0b209cix0aGlzLm5lYXI9cyx0aGlzLmZhcj1vLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMubGVmdD10LmxlZnQsdGhpcy5yaWdodD10LnJpZ2h0LHRoaXMudG9wPXQudG9wLHRoaXMuYm90dG9tPXQuYm90dG9tLHRoaXMubmVhcj10Lm5lYXIsdGhpcy5mYXI9dC5mYXIsdGhpcy56b29tPXQuem9vbSx0aGlzLnZpZXc9dC52aWV3PT09bnVsbD9udWxsOk9iamVjdC5hc3NpZ24oe30sdC52aWV3KSx0aGlzfXNldFZpZXdPZmZzZXQodCxlLG4scixzLG8pe3RoaXMudmlldz09PW51bGwmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pLHRoaXMudmlldy5lbmFibGVkPSEwLHRoaXMudmlldy5mdWxsV2lkdGg9dCx0aGlzLnZpZXcuZnVsbEhlaWdodD1lLHRoaXMudmlldy5vZmZzZXRYPW4sdGhpcy52aWV3Lm9mZnNldFk9cix0aGlzLnZpZXcud2lkdGg9cyx0aGlzLnZpZXcuaGVpZ2h0PW8sdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y2xlYXJWaWV3T2Zmc2V0KCl7dGhpcy52aWV3IT09bnVsbCYmKHRoaXMudmlldy5lbmFibGVkPSExKSx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX11cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl7Y29uc3QgdD0odGhpcy5yaWdodC10aGlzLmxlZnQpLygyKnRoaXMuem9vbSksZT0odGhpcy50b3AtdGhpcy5ib3R0b20pLygyKnRoaXMuem9vbSksbj0odGhpcy5yaWdodCt0aGlzLmxlZnQpLzIscj0odGhpcy50b3ArdGhpcy5ib3R0b20pLzI7bGV0IHM9bi10LG89bit0LGE9citlLGw9ci1lO2lmKHRoaXMudmlldyE9PW51bGwmJnRoaXMudmlldy5lbmFibGVkKXtjb25zdCBjPSh0aGlzLnJpZ2h0LXRoaXMubGVmdCkvdGhpcy52aWV3LmZ1bGxXaWR0aC90aGlzLnpvb20sdT0odGhpcy50b3AtdGhpcy5ib3R0b20pL3RoaXMudmlldy5mdWxsSGVpZ2h0L3RoaXMuem9vbTtzKz1jKnRoaXMudmlldy5vZmZzZXRYLG89cytjKnRoaXMudmlldy53aWR0aCxhLT11KnRoaXMudmlldy5vZmZzZXRZLGw9YS11KnRoaXMudmlldy5oZWlnaHR9dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VPcnRob2dyYXBoaWMocyxvLGEsbCx0aGlzLm5lYXIsdGhpcy5mYXIsdGhpcy5jb29yZGluYXRlU3lzdGVtKSx0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5wcm9qZWN0aW9uTWF0cml4KS5pbnZlcnQoKX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0Lnpvb209dGhpcy56b29tLGUub2JqZWN0LmxlZnQ9dGhpcy5sZWZ0LGUub2JqZWN0LnJpZ2h0PXRoaXMucmlnaHQsZS5vYmplY3QudG9wPXRoaXMudG9wLGUub2JqZWN0LmJvdHRvbT10aGlzLmJvdHRvbSxlLm9iamVjdC5uZWFyPXRoaXMubmVhcixlLm9iamVjdC5mYXI9dGhpcy5mYXIsdGhpcy52aWV3IT09bnVsbCYmKGUub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKSxlfX1jb25zdCB3cz00LEZnPVsuMTI1LC4yMTUsLjM1LC40NDYsLjUyNiwuNTgyXSx3cj0yMCxqaD1uZXcgSGwsT2c9bmV3IHZ0O2xldCBRaD1udWxsLHRmPTAsZWY9MCxuZj0hMTtjb25zdCBBcj0oMStNYXRoLnNxcnQoNSkpLzIsQXM9MS9BcixCZz1bbmV3IEwoLUFyLEFzLDApLG5ldyBMKEFyLEFzLDApLG5ldyBMKC1BcywwLEFyKSxuZXcgTChBcywwLEFyKSxuZXcgTCgwLEFyLC1BcyksbmV3IEwoMCxBcixBcyksbmV3IEwoLTEsMSwtMSksbmV3IEwoMSwxLC0xKSxuZXcgTCgtMSwxLDEpLG5ldyBMKDEsMSwxKV07Y2xhc3MgcmZ7Y29uc3RydWN0b3IodCl7dGhpcy5fcmVuZGVyZXI9dCx0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldD1udWxsLHRoaXMuX2xvZE1heD0wLHRoaXMuX2N1YmVTaXplPTAsdGhpcy5fbG9kUGxhbmVzPVtdLHRoaXMuX3NpemVMb2RzPVtdLHRoaXMuX3NpZ21hcz1bXSx0aGlzLl9ibHVyTWF0ZXJpYWw9bnVsbCx0aGlzLl9jdWJlbWFwTWF0ZXJpYWw9bnVsbCx0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPW51bGwsdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2JsdXJNYXRlcmlhbCl9ZnJvbVNjZW5lKHQsZT0wLG49LjEscj0xMDApe1FoPXRoaXMuX3JlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpLHRmPXRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZUN1YmVGYWNlKCksZWY9dGhpcy5fcmVuZGVyZXIuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKSxuZj10aGlzLl9yZW5kZXJlci54ci5lbmFibGVkLHRoaXMuX3JlbmRlcmVyLnhyLmVuYWJsZWQ9ITEsdGhpcy5fc2V0U2l6ZSgyNTYpO2NvbnN0IHM9dGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7cmV0dXJuIHMuZGVwdGhCdWZmZXI9ITAsdGhpcy5fc2NlbmVUb0N1YmVVVih0LG4scixzKSxlPjAmJnRoaXMuX2JsdXIocywwLDAsZSksdGhpcy5fYXBwbHlQTVJFTShzKSx0aGlzLl9jbGVhbnVwKHMpLHN9ZnJvbUVxdWlyZWN0YW5ndWxhcih0LGU9bnVsbCl7cmV0dXJuIHRoaXMuX2Zyb21UZXh0dXJlKHQsZSl9ZnJvbUN1YmVtYXAodCxlPW51bGwpe3JldHVybiB0aGlzLl9mcm9tVGV4dHVyZSh0LGUpfWNvbXBpbGVDdWJlbWFwU2hhZGVyKCl7dGhpcy5fY3ViZW1hcE1hdGVyaWFsPT09bnVsbCYmKHRoaXMuX2N1YmVtYXBNYXRlcmlhbD1HZygpLHRoaXMuX2NvbXBpbGVNYXRlcmlhbCh0aGlzLl9jdWJlbWFwTWF0ZXJpYWwpKX1jb21waWxlRXF1aXJlY3Rhbmd1bGFyU2hhZGVyKCl7dGhpcy5fZXF1aXJlY3RNYXRlcmlhbD09PW51bGwmJih0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPWtnKCksdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwpKX1kaXNwb3NlKCl7dGhpcy5fZGlzcG9zZSgpLHRoaXMuX2N1YmVtYXBNYXRlcmlhbCE9PW51bGwmJnRoaXMuX2N1YmVtYXBNYXRlcmlhbC5kaXNwb3NlKCksdGhpcy5fZXF1aXJlY3RNYXRlcmlhbCE9PW51bGwmJnRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwuZGlzcG9zZSgpfV9zZXRTaXplKHQpe3RoaXMuX2xvZE1heD1NYXRoLmZsb29yKE1hdGgubG9nMih0KSksdGhpcy5fY3ViZVNpemU9TWF0aC5wb3coMix0aGlzLl9sb2RNYXgpfV9kaXNwb3NlKCl7dGhpcy5fYmx1ck1hdGVyaWFsIT09bnVsbCYmdGhpcy5fYmx1ck1hdGVyaWFsLmRpc3Bvc2UoKSx0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldCE9PW51bGwmJnRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LmRpc3Bvc2UoKTtmb3IobGV0IHQ9MDt0PHRoaXMuX2xvZFBsYW5lcy5sZW5ndGg7dCsrKXRoaXMuX2xvZFBsYW5lc1t0XS5kaXNwb3NlKCl9X2NsZWFudXAodCl7dGhpcy5fcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KFFoLHRmLGVmKSx0aGlzLl9yZW5kZXJlci54ci5lbmFibGVkPW5mLHQuc2Npc3NvclRlc3Q9ITEsV2wodCwwLDAsdC53aWR0aCx0LmhlaWdodCl9X2Zyb21UZXh0dXJlKHQsZSl7dC5tYXBwaW5nPT09cGl8fHQubWFwcGluZz09PXppP3RoaXMuX3NldFNpemUodC5pbWFnZS5sZW5ndGg9PT0wPzE2OnQuaW1hZ2VbMF0ud2lkdGh8fHQuaW1hZ2VbMF0uaW1hZ2Uud2lkdGgpOnRoaXMuX3NldFNpemUodC5pbWFnZS53aWR0aC80KSxRaD10aGlzLl9yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKSx0Zj10aGlzLl9yZW5kZXJlci5nZXRBY3RpdmVDdWJlRmFjZSgpLGVmPXRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZU1pcG1hcExldmVsKCksbmY9dGhpcy5fcmVuZGVyZXIueHIuZW5hYmxlZCx0aGlzLl9yZW5kZXJlci54ci5lbmFibGVkPSExO2NvbnN0IG49ZXx8dGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7cmV0dXJuIHRoaXMuX3RleHR1cmVUb0N1YmVVVih0LG4pLHRoaXMuX2FwcGx5UE1SRU0obiksdGhpcy5fY2xlYW51cChuKSxufV9hbGxvY2F0ZVRhcmdldHMoKXtjb25zdCB0PTMqTWF0aC5tYXgodGhpcy5fY3ViZVNpemUsMTEyKSxlPTQqdGhpcy5fY3ViZVNpemUsbj17bWFnRmlsdGVyOlJlLG1pbkZpbHRlcjpSZSxnZW5lcmF0ZU1pcG1hcHM6ITEsdHlwZTplcyxmb3JtYXQ6amUsY29sb3JTcGFjZTp5aSxkZXB0aEJ1ZmZlcjohMX0scj16Zyh0LGUsbik7aWYodGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQ9PT1udWxsfHx0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldC53aWR0aCE9PXR8fHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LmhlaWdodCE9PWUpe3RoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0IT09bnVsbCYmdGhpcy5fZGlzcG9zZSgpLHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0PXpnKHQsZSxuKTtjb25zdHtfbG9kTWF4OnN9PXRoaXM7KHtzaXplTG9kczp0aGlzLl9zaXplTG9kcyxsb2RQbGFuZXM6dGhpcy5fbG9kUGxhbmVzLHNpZ21hczp0aGlzLl9zaWdtYXN9PWxBKHMpKSx0aGlzLl9ibHVyTWF0ZXJpYWw9Y0Eocyx0LGUpfXJldHVybiByfV9jb21waWxlTWF0ZXJpYWwodCl7Y29uc3QgZT1uZXcgSWUodGhpcy5fbG9kUGxhbmVzWzBdLHQpO3RoaXMuX3JlbmRlcmVyLmNvbXBpbGUoZSxqaCl9X3NjZW5lVG9DdWJlVVYodCxlLG4scil7Y29uc3QgYT1uZXcga2UoOTAsMSxlLG4pLGw9WzEsLTEsMSwxLDEsMV0sYz1bMSwxLDEsLTEsLTEsLTFdLHU9dGhpcy5fcmVuZGVyZXIsaD11LmF1dG9DbGVhcixmPXUudG9uZU1hcHBpbmc7dS5nZXRDbGVhckNvbG9yKE9nKSx1LnRvbmVNYXBwaW5nPWRpLHUuYXV0b0NsZWFyPSExO2NvbnN0IGQ9bmV3IFhpKHtuYW1lOiJQTVJFTS5CYWNrZ3JvdW5kIixzaWRlOktlLGRlcHRoV3JpdGU6ITEsZGVwdGhUZXN0OiExfSkscD1uZXcgSWUobmV3IE1yLGQpO2xldCB5PSExO2NvbnN0IG09dC5iYWNrZ3JvdW5kO20/bS5pc0NvbG9yJiYoZC5jb2xvci5jb3B5KG0pLHQuYmFja2dyb3VuZD1udWxsLHk9ITApOihkLmNvbG9yLmNvcHkoT2cpLHk9ITApO2ZvcihsZXQgZz0wO2c8NjtnKyspe2NvbnN0IHg9ZyUzO3g9PT0wPyhhLnVwLnNldCgwLGxbZ10sMCksYS5sb29rQXQoY1tnXSwwLDApKTp4PT09MT8oYS51cC5zZXQoMCwwLGxbZ10pLGEubG9va0F0KDAsY1tnXSwwKSk6KGEudXAuc2V0KDAsbFtnXSwwKSxhLmxvb2tBdCgwLDAsY1tnXSkpO2NvbnN0IHY9dGhpcy5fY3ViZVNpemU7V2wocix4KnYsZz4yP3Y6MCx2LHYpLHUuc2V0UmVuZGVyVGFyZ2V0KHIpLHkmJnUucmVuZGVyKHAsYSksdS5yZW5kZXIodCxhKX1wLmdlb21ldHJ5LmRpc3Bvc2UoKSxwLm1hdGVyaWFsLmRpc3Bvc2UoKSx1LnRvbmVNYXBwaW5nPWYsdS5hdXRvQ2xlYXI9aCx0LmJhY2tncm91bmQ9bX1fdGV4dHVyZVRvQ3ViZVVWKHQsZSl7Y29uc3Qgbj10aGlzLl9yZW5kZXJlcixyPXQubWFwcGluZz09PXBpfHx0Lm1hcHBpbmc9PT16aTtyPyh0aGlzLl9jdWJlbWFwTWF0ZXJpYWw9PT1udWxsJiYodGhpcy5fY3ViZW1hcE1hdGVyaWFsPUdnKCkpLHRoaXMuX2N1YmVtYXBNYXRlcmlhbC51bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlPXQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPT09ITE/LTE6MSk6dGhpcy5fZXF1aXJlY3RNYXRlcmlhbD09PW51bGwmJih0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPWtnKCkpO2NvbnN0IHM9cj90aGlzLl9jdWJlbWFwTWF0ZXJpYWw6dGhpcy5fZXF1aXJlY3RNYXRlcmlhbCxvPW5ldyBJZSh0aGlzLl9sb2RQbGFuZXNbMF0scyksYT1zLnVuaWZvcm1zO2EuZW52TWFwLnZhbHVlPXQ7Y29uc3QgbD10aGlzLl9jdWJlU2l6ZTtXbChlLDAsMCwzKmwsMipsKSxuLnNldFJlbmRlclRhcmdldChlKSxuLnJlbmRlcihvLGpoKX1fYXBwbHlQTVJFTSh0KXtjb25zdCBlPXRoaXMuX3JlbmRlcmVyLG49ZS5hdXRvQ2xlYXI7ZS5hdXRvQ2xlYXI9ITE7Y29uc3Qgcj10aGlzLl9sb2RQbGFuZXMubGVuZ3RoO2ZvcihsZXQgcz0xO3M8cjtzKyspe2NvbnN0IG89TWF0aC5zcXJ0KHRoaXMuX3NpZ21hc1tzXSp0aGlzLl9zaWdtYXNbc10tdGhpcy5fc2lnbWFzW3MtMV0qdGhpcy5fc2lnbWFzW3MtMV0pLGE9QmdbKHItcy0xKSVCZy5sZW5ndGhdO3RoaXMuX2JsdXIodCxzLTEscyxvLGEpfWUuYXV0b0NsZWFyPW59X2JsdXIodCxlLG4scixzKXtjb25zdCBvPXRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0O3RoaXMuX2hhbGZCbHVyKHQsbyxlLG4sciwibGF0aXR1ZGluYWwiLHMpLHRoaXMuX2hhbGZCbHVyKG8sdCxuLG4sciwibG9uZ2l0dWRpbmFsIixzKX1faGFsZkJsdXIodCxlLG4scixzLG8sYSl7Y29uc3QgbD10aGlzLl9yZW5kZXJlcixjPXRoaXMuX2JsdXJNYXRlcmlhbDtvIT09ImxhdGl0dWRpbmFsIiYmbyE9PSJsb25naXR1ZGluYWwiJiZjb25zb2xlLmVycm9yKCJibHVyIGRpcmVjdGlvbiBtdXN0IGJlIGVpdGhlciBsYXRpdHVkaW5hbCBvciBsb25naXR1ZGluYWwhIik7Y29uc3QgdT0zLGg9bmV3IEllKHRoaXMuX2xvZFBsYW5lc1tyXSxjKSxmPWMudW5pZm9ybXMsZD10aGlzLl9zaXplTG9kc1tuXS0xLHA9aXNGaW5pdGUocyk/TWF0aC5QSS8oMipkKToyKk1hdGguUEkvKDIqd3ItMSkseT1zL3AsbT1pc0Zpbml0ZShzKT8xK01hdGguZmxvb3IodSp5KTp3cjttPndyJiZjb25zb2xlLndhcm4oYHNpZ21hUmFkaWFucywgJHtzfSwgaXMgdG9vIGxhcmdlIGFuZCB3aWxsIGNsaXAsIGFzIGl0IHJlcXVlc3RlZCAke219IHNhbXBsZXMgd2hlbiB0aGUgbWF4aW11bSBpcyBzZXQgdG8gJHt3cn1gKTtjb25zdCBnPVtdO2xldCB4PTA7Zm9yKGxldCBUPTA7VDx3cjsrK1Qpe2NvbnN0IFA9VC95LHc9TWF0aC5leHAoLVAqUC8yKTtnLnB1c2godyksVD09PTA/eCs9dzpUPG0mJih4Kz0yKncpfWZvcihsZXQgVD0wO1Q8Zy5sZW5ndGg7VCsrKWdbVF09Z1tUXS94O2YuZW52TWFwLnZhbHVlPXQudGV4dHVyZSxmLnNhbXBsZXMudmFsdWU9bSxmLndlaWdodHMudmFsdWU9ZyxmLmxhdGl0dWRpbmFsLnZhbHVlPW89PT0ibGF0aXR1ZGluYWwiLGEmJihmLnBvbGVBeGlzLnZhbHVlPWEpO2NvbnN0e19sb2RNYXg6dn09dGhpcztmLmRUaGV0YS52YWx1ZT1wLGYubWlwSW50LnZhbHVlPXYtbjtjb25zdCBfPXRoaXMuX3NpemVMb2RzW3JdLEU9MypfKihyPnYtd3M/ci12K3dzOjApLGI9NCoodGhpcy5fY3ViZVNpemUtXyk7V2woZSxFLGIsMypfLDIqXyksbC5zZXRSZW5kZXJUYXJnZXQoZSksbC5yZW5kZXIoaCxqaCl9fWZ1bmN0aW9uIGxBKGkpe2NvbnN0IHQ9W10sZT1bXSxuPVtdO2xldCByPWk7Y29uc3Qgcz1pLXdzKzErRmcubGVuZ3RoO2ZvcihsZXQgbz0wO288cztvKyspe2NvbnN0IGE9TWF0aC5wb3coMixyKTtlLnB1c2goYSk7bGV0IGw9MS9hO28+aS13cz9sPUZnW28taSt3cy0xXTpvPT09MCYmKGw9MCksbi5wdXNoKGwpO2NvbnN0IGM9MS8oYS0yKSx1PS1jLGg9MStjLGY9W3UsdSxoLHUsaCxoLHUsdSxoLGgsdSxoXSxkPTYscD02LHk9MyxtPTIsZz0xLHg9bmV3IEZsb2F0MzJBcnJheSh5KnAqZCksdj1uZXcgRmxvYXQzMkFycmF5KG0qcCpkKSxfPW5ldyBGbG9hdDMyQXJyYXkoZypwKmQpO2ZvcihsZXQgYj0wO2I8ZDtiKyspe2NvbnN0IFQ9YiUzKjIvMy0xLFA9Yj4yPzA6LTEsdz1bVCxQLDAsVCsyLzMsUCwwLFQrMi8zLFArMSwwLFQsUCwwLFQrMi8zLFArMSwwLFQsUCsxLDBdO3guc2V0KHcseSpwKmIpLHYuc2V0KGYsbSpwKmIpO2NvbnN0IE09W2IsYixiLGIsYixiXTtfLnNldChNLGcqcCpiKX1jb25zdCBFPW5ldyBOdDtFLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBadCh4LHkpKSxFLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBadCh2LG0pKSxFLnNldEF0dHJpYnV0ZSgiZmFjZUluZGV4IixuZXcgWnQoXyxnKSksdC5wdXNoKEUpLHI+d3MmJnItLX1yZXR1cm57bG9kUGxhbmVzOnQsc2l6ZUxvZHM6ZSxzaWdtYXM6bn19ZnVuY3Rpb24gemcoaSx0LGUpe2NvbnN0IG49bmV3IE9uKGksdCxlKTtyZXR1cm4gbi50ZXh0dXJlLm1hcHBpbmc9anIsbi50ZXh0dXJlLm5hbWU9IlBNUkVNLmN1YmVVdiIsbi5zY2lzc29yVGVzdD0hMCxufWZ1bmN0aW9uIFdsKGksdCxlLG4scil7aS52aWV3cG9ydC5zZXQodCxlLG4sciksaS5zY2lzc29yLnNldCh0LGUsbixyKX1mdW5jdGlvbiBjQShpLHQsZSl7Y29uc3Qgbj1uZXcgRmxvYXQzMkFycmF5KHdyKSxyPW5ldyBMKDAsMSwwKTtyZXR1cm4gbmV3IEduKHtuYW1lOiJTcGhlcmljYWxHYXVzc2lhbkJsdXIiLGRlZmluZXM6e246d3IsQ1VCRVVWX1RFWEVMX1dJRFRIOjEvdCxDVUJFVVZfVEVYRUxfSEVJR0hUOjEvZSxDVUJFVVZfTUFYX01JUDpgJHtpfS4wYH0sdW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH0sc2FtcGxlczp7dmFsdWU6MX0sd2VpZ2h0czp7dmFsdWU6bn0sbGF0aXR1ZGluYWw6e3ZhbHVlOiExfSxkVGhldGE6e3ZhbHVlOjB9LG1pcEludDp7dmFsdWU6MH0scG9sZUF4aXM6e3ZhbHVlOnJ9fSx2ZXJ0ZXhTaGFkZXI6c2YoKSxmcmFnbWVudFNoYWRlcjpgCgoJCQlwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCQkJcHJlY2lzaW9uIG1lZGl1bXAgaW50OwoKCQkJdmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247CgoJCQl1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7CgkJCXVuaWZvcm0gaW50IHNhbXBsZXM7CgkJCXVuaWZvcm0gZmxvYXQgd2VpZ2h0c1sgbiBdOwoJCQl1bmlmb3JtIGJvb2wgbGF0aXR1ZGluYWw7CgkJCXVuaWZvcm0gZmxvYXQgZFRoZXRhOwoJCQl1bmlmb3JtIGZsb2F0IG1pcEludDsKCQkJdW5pZm9ybSB2ZWMzIHBvbGVBeGlzOwoKCQkJI2RlZmluZSBFTlZNQVBfVFlQRV9DVUJFX1VWCgkJCSNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+CgoJCQl2ZWMzIGdldFNhbXBsZSggZmxvYXQgdGhldGEsIHZlYzMgYXhpcyApIHsKCgkJCQlmbG9hdCBjb3NUaGV0YSA9IGNvcyggdGhldGEgKTsKCQkJCS8vIFJvZHJpZ3VlcycgYXhpcy1hbmdsZSByb3RhdGlvbgoJCQkJdmVjMyBzYW1wbGVEaXJlY3Rpb24gPSB2T3V0cHV0RGlyZWN0aW9uICogY29zVGhldGEKCQkJCQkrIGNyb3NzKCBheGlzLCB2T3V0cHV0RGlyZWN0aW9uICkgKiBzaW4oIHRoZXRhICkKCQkJCQkrIGF4aXMgKiBkb3QoIGF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKSAqICggMS4wIC0gY29zVGhldGEgKTsKCgkJCQlyZXR1cm4gYmlsaW5lYXJDdWJlVVYoIGVudk1hcCwgc2FtcGxlRGlyZWN0aW9uLCBtaXBJbnQgKTsKCgkJCX0KCgkJCXZvaWQgbWFpbigpIHsKCgkJCQl2ZWMzIGF4aXMgPSBsYXRpdHVkaW5hbCA/IHBvbGVBeGlzIDogY3Jvc3MoIHBvbGVBeGlzLCB2T3V0cHV0RGlyZWN0aW9uICk7CgoJCQkJaWYgKCBhbGwoIGVxdWFsKCBheGlzLCB2ZWMzKCAwLjAgKSApICkgKSB7CgoJCQkJCWF4aXMgPSB2ZWMzKCB2T3V0cHV0RGlyZWN0aW9uLnosIDAuMCwgLSB2T3V0cHV0RGlyZWN0aW9uLnggKTsKCgkJCQl9CgoJCQkJYXhpcyA9IG5vcm1hbGl6ZSggYXhpcyApOwoKCQkJCWdsX0ZyYWdDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApOwoJCQkJZ2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyAwIF0gKiBnZXRTYW1wbGUoIDAuMCwgYXhpcyApOwoKCQkJCWZvciAoIGludCBpID0gMTsgaSA8IG47IGkrKyApIHsKCgkJCQkJaWYgKCBpID49IHNhbXBsZXMgKSB7CgoJCQkJCQlicmVhazsKCgkJCQkJfQoKCQkJCQlmbG9hdCB0aGV0YSA9IGRUaGV0YSAqIGZsb2F0KCBpICk7CgkJCQkJZ2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyBpIF0gKiBnZXRTYW1wbGUoIC0xLjAgKiB0aGV0YSwgYXhpcyApOwoJCQkJCWdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgaSBdICogZ2V0U2FtcGxlKCB0aGV0YSwgYXhpcyApOwoKCQkJCX0KCgkJCX0KCQlgLGJsZW5kaW5nOmZpLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExfSl9ZnVuY3Rpb24ga2coKXtyZXR1cm4gbmV3IEduKHtuYW1lOiJFcXVpcmVjdGFuZ3VsYXJUb0N1YmVVViIsdW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH19LHZlcnRleFNoYWRlcjpzZigpLGZyYWdtZW50U2hhZGVyOmAKCgkJCXByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoJCQlwcmVjaXNpb24gbWVkaXVtcCBpbnQ7CgoJCQl2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjsKCgkJCXVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDsKCgkJCSNpbmNsdWRlIDxjb21tb24+CgoJCQl2b2lkIG1haW4oKSB7CgoJCQkJdmVjMyBvdXRwdXREaXJlY3Rpb24gPSBub3JtYWxpemUoIHZPdXRwdXREaXJlY3Rpb24gKTsKCQkJCXZlYzIgdXYgPSBlcXVpcmVjdFV2KCBvdXRwdXREaXJlY3Rpb24gKTsKCgkJCQlnbF9GcmFnQ29sb3IgPSB2ZWM0KCB0ZXh0dXJlMkQgKCBlbnZNYXAsIHV2ICkucmdiLCAxLjAgKTsKCgkJCX0KCQlgLGJsZW5kaW5nOmZpLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExfSl9ZnVuY3Rpb24gR2coKXtyZXR1cm4gbmV3IEduKHtuYW1lOiJDdWJlbWFwVG9DdWJlVVYiLHVuaWZvcm1zOntlbnZNYXA6e3ZhbHVlOm51bGx9LGZsaXBFbnZNYXA6e3ZhbHVlOi0xfX0sdmVydGV4U2hhZGVyOnNmKCksZnJhZ21lbnRTaGFkZXI6YAoKCQkJcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7CgkJCXByZWNpc2lvbiBtZWRpdW1wIGludDsKCgkJCXVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDsKCgkJCXZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uOwoKCQkJdW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7CgoJCQl2b2lkIG1haW4oKSB7CgoJCQkJZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggZmxpcEVudk1hcCAqIHZPdXRwdXREaXJlY3Rpb24ueCwgdk91dHB1dERpcmVjdGlvbi55eiApICk7CgoJCQl9CgkJYCxibGVuZGluZzpmaSxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMX0pfWZ1bmN0aW9uIHNmKCl7cmV0dXJuYAoKCQlwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCQlwcmVjaXNpb24gbWVkaXVtcCBpbnQ7CgoJCWF0dHJpYnV0ZSBmbG9hdCBmYWNlSW5kZXg7CgoJCXZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uOwoKCQkvLyBSSCBjb29yZGluYXRlIHN5c3RlbTsgUE1SRU0gZmFjZS1pbmRleGluZyBjb252ZW50aW9uCgkJdmVjMyBnZXREaXJlY3Rpb24oIHZlYzIgdXYsIGZsb2F0IGZhY2UgKSB7CgoJCQl1diA9IDIuMCAqIHV2IC0gMS4wOwoKCQkJdmVjMyBkaXJlY3Rpb24gPSB2ZWMzKCB1diwgMS4wICk7CgoJCQlpZiAoIGZhY2UgPT0gMC4wICkgewoKCQkJCWRpcmVjdGlvbiA9IGRpcmVjdGlvbi56eXg7IC8vICggMSwgdiwgdSApIHBvcyB4CgoJCQl9IGVsc2UgaWYgKCBmYWNlID09IDEuMCApIHsKCgkJCQlkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5OwoJCQkJZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLXUsIDEsIC12ICkgcG9zIHkKCgkJCX0gZWxzZSBpZiAoIGZhY2UgPT0gMi4wICkgewoKCQkJCWRpcmVjdGlvbi54ICo9IC0xLjA7IC8vICggLXUsIHYsIDEgKSBwb3MgegoKCQkJfSBlbHNlIGlmICggZmFjZSA9PSAzLjAgKSB7CgoJCQkJZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDsKCQkJCWRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC0xLCB2LCAtdSApIG5lZyB4CgoJCQl9IGVsc2UgaWYgKCBmYWNlID09IDQuMCApIHsKCgkJCQlkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5OwoJCQkJZGlyZWN0aW9uLnh5ICo9IC0xLjA7IC8vICggLXUsIC0xLCB2ICkgbmVnIHkKCgkJCX0gZWxzZSBpZiAoIGZhY2UgPT0gNS4wICkgewoKCQkJCWRpcmVjdGlvbi56ICo9IC0xLjA7IC8vICggdSwgdiwgLTEgKSBuZWcgegoKCQkJfQoKCQkJcmV0dXJuIGRpcmVjdGlvbjsKCgkJfQoKCQl2b2lkIG1haW4oKSB7CgoJCQl2T3V0cHV0RGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKCB1diwgZmFjZUluZGV4ICk7CgkJCWdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApOwoKCQl9CglgfWZ1bmN0aW9uIHVBKGkpe2xldCB0PW5ldyBXZWFrTWFwLGU9bnVsbDtmdW5jdGlvbiBuKGEpe2lmKGEmJmEuaXNUZXh0dXJlKXtjb25zdCBsPWEubWFwcGluZyxjPWw9PT1jb3x8bD09PXVvLHU9bD09PXBpfHxsPT09emk7aWYoY3x8dSl7bGV0IGg9dC5nZXQoYSk7Y29uc3QgZj1oIT09dm9pZCAwP2gudGV4dHVyZS5wbXJlbVZlcnNpb246MDtpZihhLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSYmYS5wbXJlbVZlcnNpb24hPT1mKXJldHVybiBlPT09bnVsbCYmKGU9bmV3IHJmKGkpKSxoPWM/ZS5mcm9tRXF1aXJlY3Rhbmd1bGFyKGEsaCk6ZS5mcm9tQ3ViZW1hcChhLGgpLGgudGV4dHVyZS5wbXJlbVZlcnNpb249YS5wbXJlbVZlcnNpb24sdC5zZXQoYSxoKSxoLnRleHR1cmU7aWYoaCE9PXZvaWQgMClyZXR1cm4gaC50ZXh0dXJlO3tjb25zdCBkPWEuaW1hZ2U7cmV0dXJuIGMmJmQmJmQuaGVpZ2h0PjB8fHUmJmQmJnIoZCk/KGU9PT1udWxsJiYoZT1uZXcgcmYoaSkpLGg9Yz9lLmZyb21FcXVpcmVjdGFuZ3VsYXIoYSk6ZS5mcm9tQ3ViZW1hcChhKSxoLnRleHR1cmUucG1yZW1WZXJzaW9uPWEucG1yZW1WZXJzaW9uLHQuc2V0KGEsaCksYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixzKSxoLnRleHR1cmUpOm51bGx9fX1yZXR1cm4gYX1mdW5jdGlvbiByKGEpe2xldCBsPTA7Y29uc3QgYz02O2ZvcihsZXQgdT0wO3U8Yzt1KyspYVt1XSE9PXZvaWQgMCYmbCsrO3JldHVybiBsPT09Y31mdW5jdGlvbiBzKGEpe2NvbnN0IGw9YS50YXJnZXQ7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixzKTtjb25zdCBjPXQuZ2V0KGwpO2MhPT12b2lkIDAmJih0LmRlbGV0ZShsKSxjLmRpc3Bvc2UoKSl9ZnVuY3Rpb24gbygpe3Q9bmV3IFdlYWtNYXAsZSE9PW51bGwmJihlLmRpc3Bvc2UoKSxlPW51bGwpfXJldHVybntnZXQ6bixkaXNwb3NlOm99fWZ1bmN0aW9uIGhBKGkpe2NvbnN0IHQ9e307ZnVuY3Rpb24gZShuKXtpZih0W25dIT09dm9pZCAwKXJldHVybiB0W25dO2xldCByO3N3aXRjaChuKXtjYXNlIldFQkdMX2RlcHRoX3RleHR1cmUiOnI9aS5nZXRFeHRlbnNpb24oIldFQkdMX2RlcHRoX3RleHR1cmUiKXx8aS5nZXRFeHRlbnNpb24oIk1PWl9XRUJHTF9kZXB0aF90ZXh0dXJlIil8fGkuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfZGVwdGhfdGV4dHVyZSIpO2JyZWFrO2Nhc2UiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIjpyPWkuZ2V0RXh0ZW5zaW9uKCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8aS5nZXRFeHRlbnNpb24oIk1PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8aS5nZXRFeHRlbnNpb24oIldFQktJVF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTticmVhaztjYXNlIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIjpyPWkuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpfHxpLmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGkuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKTticmVhaztjYXNlIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyI6cj1pLmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil8fGkuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIik7YnJlYWs7ZGVmYXVsdDpyPWkuZ2V0RXh0ZW5zaW9uKG4pfXJldHVybiB0W25dPXIscn1yZXR1cm57aGFzOmZ1bmN0aW9uKG4pe3JldHVybiBlKG4pIT09bnVsbH0saW5pdDpmdW5jdGlvbigpe2UoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKSxlKCJXRUJHTF9jbGlwX2N1bGxfZGlzdGFuY2UiKSxlKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKSxlKCJFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQiKSxlKCJXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiKSxlKCJXRUJHTF9yZW5kZXJfc2hhcmVkX2V4cG9uZW50Iil9LGdldDpmdW5jdGlvbihuKXtjb25zdCByPWUobik7cmV0dXJuIHI9PT1udWxsJiZycygiVEhSRUUuV2ViR0xSZW5kZXJlcjogIituKyIgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQuIikscn19fWZ1bmN0aW9uIGZBKGksdCxlLG4pe2NvbnN0IHI9e30scz1uZXcgV2Vha01hcDtmdW5jdGlvbiBvKGgpe2NvbnN0IGY9aC50YXJnZXQ7Zi5pbmRleCE9PW51bGwmJnQucmVtb3ZlKGYuaW5kZXgpO2Zvcihjb25zdCBwIGluIGYuYXR0cmlidXRlcyl0LnJlbW92ZShmLmF0dHJpYnV0ZXNbcF0pO2Zvcihjb25zdCBwIGluIGYubW9ycGhBdHRyaWJ1dGVzKXtjb25zdCB5PWYubW9ycGhBdHRyaWJ1dGVzW3BdO2ZvcihsZXQgbT0wLGc9eS5sZW5ndGg7bTxnO20rKyl0LnJlbW92ZSh5W21dKX1mLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLG8pLGRlbGV0ZSByW2YuaWRdO2NvbnN0IGQ9cy5nZXQoZik7ZCYmKHQucmVtb3ZlKGQpLHMuZGVsZXRlKGYpKSxuLnJlbGVhc2VTdGF0ZXNPZkdlb21ldHJ5KGYpLGYuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT09PSEwJiZkZWxldGUgZi5fbWF4SW5zdGFuY2VDb3VudCxlLm1lbW9yeS5nZW9tZXRyaWVzLS19ZnVuY3Rpb24gYShoLGYpe3JldHVybiByW2YuaWRdPT09ITB8fChmLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLG8pLHJbZi5pZF09ITAsZS5tZW1vcnkuZ2VvbWV0cmllcysrKSxmfWZ1bmN0aW9uIGwoaCl7Y29uc3QgZj1oLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IHAgaW4gZil0LnVwZGF0ZShmW3BdLGkuQVJSQVlfQlVGRkVSKTtjb25zdCBkPWgubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBwIGluIGQpe2NvbnN0IHk9ZFtwXTtmb3IobGV0IG09MCxnPXkubGVuZ3RoO208ZzttKyspdC51cGRhdGUoeVttXSxpLkFSUkFZX0JVRkZFUil9fWZ1bmN0aW9uIGMoaCl7Y29uc3QgZj1bXSxkPWguaW5kZXgscD1oLmF0dHJpYnV0ZXMucG9zaXRpb247bGV0IHk9MDtpZihkIT09bnVsbCl7Y29uc3QgeD1kLmFycmF5O3k9ZC52ZXJzaW9uO2ZvcihsZXQgdj0wLF89eC5sZW5ndGg7djxfO3YrPTMpe2NvbnN0IEU9eFt2KzBdLGI9eFt2KzFdLFQ9eFt2KzJdO2YucHVzaChFLGIsYixULFQsRSl9fWVsc2UgaWYocCE9PXZvaWQgMCl7Y29uc3QgeD1wLmFycmF5O3k9cC52ZXJzaW9uO2ZvcihsZXQgdj0wLF89eC5sZW5ndGgvMy0xO3Y8Xzt2Kz0zKXtjb25zdCBFPXYrMCxiPXYrMSxUPXYrMjtmLnB1c2goRSxiLGIsVCxULEUpfX1lbHNlIHJldHVybjtjb25zdCBtPW5ldyhhZyhmKT9ZaDpxaCkoZiwxKTttLnZlcnNpb249eTtjb25zdCBnPXMuZ2V0KGgpO2cmJnQucmVtb3ZlKGcpLHMuc2V0KGgsbSl9ZnVuY3Rpb24gdShoKXtjb25zdCBmPXMuZ2V0KGgpO2lmKGYpe2NvbnN0IGQ9aC5pbmRleDtkIT09bnVsbCYmZi52ZXJzaW9uPGQudmVyc2lvbiYmYyhoKX1lbHNlIGMoaCk7cmV0dXJuIHMuZ2V0KGgpfXJldHVybntnZXQ6YSx1cGRhdGU6bCxnZXRXaXJlZnJhbWVBdHRyaWJ1dGU6dX19ZnVuY3Rpb24gZEEoaSx0LGUpe2xldCBuO2Z1bmN0aW9uIHIoZil7bj1mfWxldCBzLG87ZnVuY3Rpb24gYShmKXtzPWYudHlwZSxvPWYuYnl0ZXNQZXJFbGVtZW50fWZ1bmN0aW9uIGwoZixkKXtpLmRyYXdFbGVtZW50cyhuLGQscyxmKm8pLGUudXBkYXRlKGQsbiwxKX1mdW5jdGlvbiBjKGYsZCxwKXtwIT09MCYmKGkuZHJhd0VsZW1lbnRzSW5zdGFuY2VkKG4sZCxzLGYqbyxwKSxlLnVwZGF0ZShkLG4scCkpfWZ1bmN0aW9uIHUoZixkLHApe2lmKHA9PT0wKXJldHVybjt0LmdldCgiV0VCR0xfbXVsdGlfZHJhdyIpLm11bHRpRHJhd0VsZW1lbnRzV0VCR0wobixkLDAscyxmLDAscCk7bGV0IG09MDtmb3IobGV0IGc9MDtnPHA7ZysrKW0rPWRbZ107ZS51cGRhdGUobSxuLDEpfWZ1bmN0aW9uIGgoZixkLHAseSl7aWYocD09PTApcmV0dXJuO2NvbnN0IG09dC5nZXQoIldFQkdMX211bHRpX2RyYXciKTtpZihtPT09bnVsbClmb3IobGV0IGc9MDtnPGYubGVuZ3RoO2crKyljKGZbZ10vbyxkW2ddLHlbZ10pO2Vsc2V7bS5tdWx0aURyYXdFbGVtZW50c0luc3RhbmNlZFdFQkdMKG4sZCwwLHMsZiwwLHksMCxwKTtsZXQgZz0wO2ZvcihsZXQgeD0wO3g8cDt4KyspZys9ZFt4XTtmb3IobGV0IHg9MDt4PHkubGVuZ3RoO3grKyllLnVwZGF0ZShnLG4seVt4XSl9fXRoaXMuc2V0TW9kZT1yLHRoaXMuc2V0SW5kZXg9YSx0aGlzLnJlbmRlcj1sLHRoaXMucmVuZGVySW5zdGFuY2VzPWMsdGhpcy5yZW5kZXJNdWx0aURyYXc9dSx0aGlzLnJlbmRlck11bHRpRHJhd0luc3RhbmNlcz1ofWZ1bmN0aW9uIHBBKGkpe2NvbnN0IHQ9e2dlb21ldHJpZXM6MCx0ZXh0dXJlczowfSxlPXtmcmFtZTowLGNhbGxzOjAsdHJpYW5nbGVzOjAscG9pbnRzOjAsbGluZXM6MH07ZnVuY3Rpb24gbihzLG8sYSl7c3dpdGNoKGUuY2FsbHMrKyxvKXtjYXNlIGkuVFJJQU5HTEVTOmUudHJpYW5nbGVzKz1hKihzLzMpO2JyZWFrO2Nhc2UgaS5MSU5FUzplLmxpbmVzKz1hKihzLzIpO2JyZWFrO2Nhc2UgaS5MSU5FX1NUUklQOmUubGluZXMrPWEqKHMtMSk7YnJlYWs7Y2FzZSBpLkxJTkVfTE9PUDplLmxpbmVzKz1hKnM7YnJlYWs7Y2FzZSBpLlBPSU5UUzplLnBvaW50cys9YSpzO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZToiLG8pO2JyZWFrfX1mdW5jdGlvbiByKCl7ZS5jYWxscz0wLGUudHJpYW5nbGVzPTAsZS5wb2ludHM9MCxlLmxpbmVzPTB9cmV0dXJue21lbW9yeTp0LHJlbmRlcjplLHByb2dyYW1zOm51bGwsYXV0b1Jlc2V0OiEwLHJlc2V0OnIsdXBkYXRlOm59fWZ1bmN0aW9uIG1BKGksdCxlKXtjb25zdCBuPW5ldyBXZWFrTWFwLHI9bmV3IG9lO2Z1bmN0aW9uIHMobyxhLGwpe2NvbnN0IGM9by5tb3JwaFRhcmdldEluZmx1ZW5jZXMsdT1hLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbnx8YS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsfHxhLm1vcnBoQXR0cmlidXRlcy5jb2xvcixoPXUhPT12b2lkIDA/dS5sZW5ndGg6MDtsZXQgZj1uLmdldChhKTtpZihmPT09dm9pZCAwfHxmLmNvdW50IT09aCl7bGV0IHc9ZnVuY3Rpb24oKXtULmRpc3Bvc2UoKSxuLmRlbGV0ZShhKSxhLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHcpfTtmIT09dm9pZCAwJiZmLnRleHR1cmUuZGlzcG9zZSgpO2NvbnN0IGQ9YS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24hPT12b2lkIDAscD1hLm1vcnBoQXR0cmlidXRlcy5ub3JtYWwhPT12b2lkIDAseT1hLm1vcnBoQXR0cmlidXRlcy5jb2xvciE9PXZvaWQgMCxtPWEubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9ufHxbXSxnPWEubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbHx8W10seD1hLm1vcnBoQXR0cmlidXRlcy5jb2xvcnx8W107bGV0IHY9MDtkPT09ITAmJih2PTEpLHA9PT0hMCYmKHY9MikseT09PSEwJiYodj0zKTtsZXQgXz1hLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQqdixFPTE7Xz50Lm1heFRleHR1cmVTaXplJiYoRT1NYXRoLmNlaWwoXy90Lm1heFRleHR1cmVTaXplKSxfPXQubWF4VGV4dHVyZVNpemUpO2NvbnN0IGI9bmV3IEZsb2F0MzJBcnJheShfKkUqNCpoKSxUPW5ldyBNbChiLF8sRSxoKTtULnR5cGU9Y24sVC5uZWVkc1VwZGF0ZT0hMDtjb25zdCBQPXYqNDtmb3IobGV0IE09MDtNPGg7TSsrKXtjb25zdCBBPW1bTV0sRj1nW01dLEQ9eFtNXSxOPV8qRSo0Kk07Zm9yKGxldCBVPTA7VTxBLmNvdW50O1UrKyl7Y29uc3QgQj1VKlA7ZD09PSEwJiYoci5mcm9tQnVmZmVyQXR0cmlidXRlKEEsVSksYltOK0IrMF09ci54LGJbTitCKzFdPXIueSxiW04rQisyXT1yLnosYltOK0IrM109MCkscD09PSEwJiYoci5mcm9tQnVmZmVyQXR0cmlidXRlKEYsVSksYltOK0IrNF09ci54LGJbTitCKzVdPXIueSxiW04rQis2XT1yLnosYltOK0IrN109MCkseT09PSEwJiYoci5mcm9tQnVmZmVyQXR0cmlidXRlKEQsVSksYltOK0IrOF09ci54LGJbTitCKzldPXIueSxiW04rQisxMF09ci56LGJbTitCKzExXT1ELml0ZW1TaXplPT09ND9yLnc6MSl9fWY9e2NvdW50OmgsdGV4dHVyZTpULHNpemU6bmV3IHEoXyxFKX0sbi5zZXQoYSxmKSxhLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHcpfWlmKG8uaXNJbnN0YW5jZWRNZXNoPT09ITAmJm8ubW9ycGhUZXh0dXJlIT09bnVsbClsLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoaSwibW9ycGhUZXh0dXJlIixvLm1vcnBoVGV4dHVyZSxlKTtlbHNle2xldCBkPTA7Zm9yKGxldCB5PTA7eTxjLmxlbmd0aDt5KyspZCs9Y1t5XTtjb25zdCBwPWEubW9ycGhUYXJnZXRzUmVsYXRpdmU/MToxLWQ7bC5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGksIm1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZSIscCksbC5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGksIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIsYyl9bC5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGksIm1vcnBoVGFyZ2V0c1RleHR1cmUiLGYudGV4dHVyZSxlKSxsLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoaSwibW9ycGhUYXJnZXRzVGV4dHVyZVNpemUiLGYuc2l6ZSl9cmV0dXJue3VwZGF0ZTpzfX1mdW5jdGlvbiBnQShpLHQsZSxuKXtsZXQgcj1uZXcgV2Vha01hcDtmdW5jdGlvbiBzKGwpe2NvbnN0IGM9bi5yZW5kZXIuZnJhbWUsdT1sLmdlb21ldHJ5LGg9dC5nZXQobCx1KTtpZihyLmdldChoKSE9PWMmJih0LnVwZGF0ZShoKSxyLnNldChoLGMpKSxsLmlzSW5zdGFuY2VkTWVzaCYmKGwuaGFzRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSk9PT0hMSYmbC5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKSxyLmdldChsKSE9PWMmJihlLnVwZGF0ZShsLmluc3RhbmNlTWF0cml4LGkuQVJSQVlfQlVGRkVSKSxsLmluc3RhbmNlQ29sb3IhPT1udWxsJiZlLnVwZGF0ZShsLmluc3RhbmNlQ29sb3IsaS5BUlJBWV9CVUZGRVIpLHIuc2V0KGwsYykpKSxsLmlzU2tpbm5lZE1lc2gpe2NvbnN0IGY9bC5za2VsZXRvbjtyLmdldChmKSE9PWMmJihmLnVwZGF0ZSgpLHIuc2V0KGYsYykpfXJldHVybiBofWZ1bmN0aW9uIG8oKXtyPW5ldyBXZWFrTWFwfWZ1bmN0aW9uIGEobCl7Y29uc3QgYz1sLnRhcmdldDtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpLGUucmVtb3ZlKGMuaW5zdGFuY2VNYXRyaXgpLGMuaW5zdGFuY2VDb2xvciE9PW51bGwmJmUucmVtb3ZlKGMuaW5zdGFuY2VDb2xvcil9cmV0dXJue3VwZGF0ZTpzLGRpc3Bvc2U6b319Y2xhc3Mgb2YgZXh0ZW5kcyBNZXtjb25zdHJ1Y3Rvcih0LGUsbixyLHMsbyxhLGwsYyx1PWhyKXtpZih1IT09aHImJnUhPT1mcil0aHJvdyBuZXcgRXJyb3IoIkRlcHRoVGV4dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3IgVEhSRUUuRGVwdGhTdGVuY2lsRm9ybWF0Iik7bj09PXZvaWQgMCYmdT09PWhyJiYobj1taSksbj09PXZvaWQgMCYmdT09PWZyJiYobj11ciksc3VwZXIobnVsbCxyLHMsbyxhLGwsdSxuLGMpLHRoaXMuaXNEZXB0aFRleHR1cmU9ITAsdGhpcy5pbWFnZT17d2lkdGg6dCxoZWlnaHQ6ZX0sdGhpcy5tYWdGaWx0ZXI9YSE9PXZvaWQgMD9hOkZlLHRoaXMubWluRmlsdGVyPWwhPT12b2lkIDA/bDpGZSx0aGlzLmZsaXBZPSExLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuY29tcGFyZUZ1bmN0aW9uPW51bGx9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbXBhcmVGdW5jdGlvbj10LmNvbXBhcmVGdW5jdGlvbix0aGlzfXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTtyZXR1cm4gdGhpcy5jb21wYXJlRnVuY3Rpb24hPT1udWxsJiYoZS5jb21wYXJlRnVuY3Rpb249dGhpcy5jb21wYXJlRnVuY3Rpb24pLGV9fWNvbnN0IFZnPW5ldyBNZSxIZz1uZXcgb2YoMSwxKSxXZz1uZXcgTWwsJGc9bmV3IFVoLFhnPW5ldyBPbyxxZz1bXSxZZz1bXSxaZz1uZXcgRmxvYXQzMkFycmF5KDE2KSxKZz1uZXcgRmxvYXQzMkFycmF5KDkpLEtnPW5ldyBGbG9hdDMyQXJyYXkoNCk7ZnVuY3Rpb24gRXMoaSx0LGUpe2NvbnN0IG49aVswXTtpZihuPD0wfHxuPjApcmV0dXJuIGk7Y29uc3Qgcj10KmU7bGV0IHM9cWdbcl07aWYocz09PXZvaWQgMCYmKHM9bmV3IEZsb2F0MzJBcnJheShyKSxxZ1tyXT1zKSx0IT09MCl7bi50b0FycmF5KHMsMCk7Zm9yKGxldCBvPTEsYT0wO28hPT10OysrbylhKz1lLGlbb10udG9BcnJheShzLGEpfXJldHVybiBzfWZ1bmN0aW9uIFVlKGksdCl7aWYoaS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IGU9MCxuPWkubGVuZ3RoO2U8bjtlKyspaWYoaVtlXSE9PXRbZV0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gTmUoaSx0KXtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspaVtlXT10W2VdfWZ1bmN0aW9uICRsKGksdCl7bGV0IGU9WWdbdF07ZT09PXZvaWQgMCYmKGU9bmV3IEludDMyQXJyYXkodCksWWdbdF09ZSk7Zm9yKGxldCBuPTA7biE9PXQ7KytuKWVbbl09aS5hbGxvY2F0ZVRleHR1cmVVbml0KCk7cmV0dXJuIGV9ZnVuY3Rpb24geUEoaSx0KXtjb25zdCBlPXRoaXMuY2FjaGU7ZVswXSE9PXQmJihpLnVuaWZvcm0xZih0aGlzLmFkZHIsdCksZVswXT10KX1mdW5jdGlvbiB2QShpLHQpe2NvbnN0IGU9dGhpcy5jYWNoZTtpZih0LnghPT12b2lkIDApKGVbMF0hPT10Lnh8fGVbMV0hPT10LnkpJiYoaS51bmlmb3JtMmYodGhpcy5hZGRyLHQueCx0LnkpLGVbMF09dC54LGVbMV09dC55KTtlbHNle2lmKFVlKGUsdCkpcmV0dXJuO2kudW5pZm9ybTJmdih0aGlzLmFkZHIsdCksTmUoZSx0KX19ZnVuY3Rpb24gX0EoaSx0KXtjb25zdCBlPXRoaXMuY2FjaGU7aWYodC54IT09dm9pZCAwKShlWzBdIT09dC54fHxlWzFdIT09dC55fHxlWzJdIT09dC56KSYmKGkudW5pZm9ybTNmKHRoaXMuYWRkcix0LngsdC55LHQueiksZVswXT10LngsZVsxXT10LnksZVsyXT10LnopO2Vsc2UgaWYodC5yIT09dm9pZCAwKShlWzBdIT09dC5yfHxlWzFdIT09dC5nfHxlWzJdIT09dC5iKSYmKGkudW5pZm9ybTNmKHRoaXMuYWRkcix0LnIsdC5nLHQuYiksZVswXT10LnIsZVsxXT10LmcsZVsyXT10LmIpO2Vsc2V7aWYoVWUoZSx0KSlyZXR1cm47aS51bmlmb3JtM2Z2KHRoaXMuYWRkcix0KSxOZShlLHQpfX1mdW5jdGlvbiB4QShpLHQpe2NvbnN0IGU9dGhpcy5jYWNoZTtpZih0LnghPT12b2lkIDApKGVbMF0hPT10Lnh8fGVbMV0hPT10Lnl8fGVbMl0hPT10Lnp8fGVbM10hPT10LncpJiYoaS51bmlmb3JtNGYodGhpcy5hZGRyLHQueCx0LnksdC56LHQudyksZVswXT10LngsZVsxXT10LnksZVsyXT10LnosZVszXT10LncpO2Vsc2V7aWYoVWUoZSx0KSlyZXR1cm47aS51bmlmb3JtNGZ2KHRoaXMuYWRkcix0KSxOZShlLHQpfX1mdW5jdGlvbiBNQShpLHQpe2NvbnN0IGU9dGhpcy5jYWNoZSxuPXQuZWxlbWVudHM7aWYobj09PXZvaWQgMCl7aWYoVWUoZSx0KSlyZXR1cm47aS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSx0KSxOZShlLHQpfWVsc2V7aWYoVWUoZSxuKSlyZXR1cm47S2cuc2V0KG4pLGkudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsITEsS2cpLE5lKGUsbil9fWZ1bmN0aW9uIFNBKGksdCl7Y29uc3QgZT10aGlzLmNhY2hlLG49dC5lbGVtZW50cztpZihuPT09dm9pZCAwKXtpZihVZShlLHQpKXJldHVybjtpLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLHQpLE5lKGUsdCl9ZWxzZXtpZihVZShlLG4pKXJldHVybjtKZy5zZXQobiksaS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxKZyksTmUoZSxuKX19ZnVuY3Rpb24gYkEoaSx0KXtjb25zdCBlPXRoaXMuY2FjaGUsbj10LmVsZW1lbnRzO2lmKG49PT12b2lkIDApe2lmKFVlKGUsdCkpcmV0dXJuO2kudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEsdCksTmUoZSx0KX1lbHNle2lmKFVlKGUsbikpcmV0dXJuO1pnLnNldChuKSxpLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLCExLFpnKSxOZShlLG4pfX1mdW5jdGlvbiB3QShpLHQpe2NvbnN0IGU9dGhpcy5jYWNoZTtlWzBdIT09dCYmKGkudW5pZm9ybTFpKHRoaXMuYWRkcix0KSxlWzBdPXQpfWZ1bmN0aW9uIEFBKGksdCl7Y29uc3QgZT10aGlzLmNhY2hlO2lmKHQueCE9PXZvaWQgMCkoZVswXSE9PXQueHx8ZVsxXSE9PXQueSkmJihpLnVuaWZvcm0yaSh0aGlzLmFkZHIsdC54LHQueSksZVswXT10LngsZVsxXT10LnkpO2Vsc2V7aWYoVWUoZSx0KSlyZXR1cm47aS51bmlmb3JtMml2KHRoaXMuYWRkcix0KSxOZShlLHQpfX1mdW5jdGlvbiBFQShpLHQpe2NvbnN0IGU9dGhpcy5jYWNoZTtpZih0LnghPT12b2lkIDApKGVbMF0hPT10Lnh8fGVbMV0hPT10Lnl8fGVbMl0hPT10LnopJiYoaS51bmlmb3JtM2kodGhpcy5hZGRyLHQueCx0LnksdC56KSxlWzBdPXQueCxlWzFdPXQueSxlWzJdPXQueik7ZWxzZXtpZihVZShlLHQpKXJldHVybjtpLnVuaWZvcm0zaXYodGhpcy5hZGRyLHQpLE5lKGUsdCl9fWZ1bmN0aW9uIFRBKGksdCl7Y29uc3QgZT10aGlzLmNhY2hlO2lmKHQueCE9PXZvaWQgMCkoZVswXSE9PXQueHx8ZVsxXSE9PXQueXx8ZVsyXSE9PXQuenx8ZVszXSE9PXQudykmJihpLnVuaWZvcm00aSh0aGlzLmFkZHIsdC54LHQueSx0LnosdC53KSxlWzBdPXQueCxlWzFdPXQueSxlWzJdPXQueixlWzNdPXQudyk7ZWxzZXtpZihVZShlLHQpKXJldHVybjtpLnVuaWZvcm00aXYodGhpcy5hZGRyLHQpLE5lKGUsdCl9fWZ1bmN0aW9uIENBKGksdCl7Y29uc3QgZT10aGlzLmNhY2hlO2VbMF0hPT10JiYoaS51bmlmb3JtMXVpKHRoaXMuYWRkcix0KSxlWzBdPXQpfWZ1bmN0aW9uIFJBKGksdCl7Y29uc3QgZT10aGlzLmNhY2hlO2lmKHQueCE9PXZvaWQgMCkoZVswXSE9PXQueHx8ZVsxXSE9PXQueSkmJihpLnVuaWZvcm0ydWkodGhpcy5hZGRyLHQueCx0LnkpLGVbMF09dC54LGVbMV09dC55KTtlbHNle2lmKFVlKGUsdCkpcmV0dXJuO2kudW5pZm9ybTJ1aXYodGhpcy5hZGRyLHQpLE5lKGUsdCl9fWZ1bmN0aW9uIFBBKGksdCl7Y29uc3QgZT10aGlzLmNhY2hlO2lmKHQueCE9PXZvaWQgMCkoZVswXSE9PXQueHx8ZVsxXSE9PXQueXx8ZVsyXSE9PXQueikmJihpLnVuaWZvcm0zdWkodGhpcy5hZGRyLHQueCx0LnksdC56KSxlWzBdPXQueCxlWzFdPXQueSxlWzJdPXQueik7ZWxzZXtpZihVZShlLHQpKXJldHVybjtpLnVuaWZvcm0zdWl2KHRoaXMuYWRkcix0KSxOZShlLHQpfX1mdW5jdGlvbiBJQShpLHQpe2NvbnN0IGU9dGhpcy5jYWNoZTtpZih0LnghPT12b2lkIDApKGVbMF0hPT10Lnh8fGVbMV0hPT10Lnl8fGVbMl0hPT10Lnp8fGVbM10hPT10LncpJiYoaS51bmlmb3JtNHVpKHRoaXMuYWRkcix0LngsdC55LHQueix0LncpLGVbMF09dC54LGVbMV09dC55LGVbMl09dC56LGVbM109dC53KTtlbHNle2lmKFVlKGUsdCkpcmV0dXJuO2kudW5pZm9ybTR1aXYodGhpcy5hZGRyLHQpLE5lKGUsdCl9fWZ1bmN0aW9uIExBKGksdCxlKXtjb25zdCBuPXRoaXMuY2FjaGUscj1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtuWzBdIT09ciYmKGkudW5pZm9ybTFpKHRoaXMuYWRkcixyKSxuWzBdPXIpO2xldCBzO3RoaXMudHlwZT09PWkuU0FNUExFUl8yRF9TSEFET1c/KEhnLmNvbXBhcmVGdW5jdGlvbj1DaCxzPUhnKTpzPVZnLGUuc2V0VGV4dHVyZTJEKHR8fHMscil9ZnVuY3Rpb24gREEoaSx0LGUpe2NvbnN0IG49dGhpcy5jYWNoZSxyPWUuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO25bMF0hPT1yJiYoaS51bmlmb3JtMWkodGhpcy5hZGRyLHIpLG5bMF09ciksZS5zZXRUZXh0dXJlM0QodHx8JGcscil9ZnVuY3Rpb24gVUEoaSx0LGUpe2NvbnN0IG49dGhpcy5jYWNoZSxyPWUuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO25bMF0hPT1yJiYoaS51bmlmb3JtMWkodGhpcy5hZGRyLHIpLG5bMF09ciksZS5zZXRUZXh0dXJlQ3ViZSh0fHxYZyxyKX1mdW5jdGlvbiBOQShpLHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlLHI9ZS5hbGxvY2F0ZVRleHR1cmVVbml0KCk7blswXSE9PXImJihpLnVuaWZvcm0xaSh0aGlzLmFkZHIsciksblswXT1yKSxlLnNldFRleHR1cmUyREFycmF5KHR8fFdnLHIpfWZ1bmN0aW9uIEZBKGkpe3N3aXRjaChpKXtjYXNlIDUxMjY6cmV0dXJuIHlBO2Nhc2UgMzU2NjQ6cmV0dXJuIHZBO2Nhc2UgMzU2NjU6cmV0dXJuIF9BO2Nhc2UgMzU2NjY6cmV0dXJuIHhBO2Nhc2UgMzU2NzQ6cmV0dXJuIE1BO2Nhc2UgMzU2NzU6cmV0dXJuIFNBO2Nhc2UgMzU2NzY6cmV0dXJuIGJBO2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiB3QTtjYXNlIDM1NjY3OmNhc2UgMzU2NzE6cmV0dXJuIEFBO2Nhc2UgMzU2Njg6Y2FzZSAzNTY3MjpyZXR1cm4gRUE7Y2FzZSAzNTY2OTpjYXNlIDM1NjczOnJldHVybiBUQTtjYXNlIDUxMjU6cmV0dXJuIENBO2Nhc2UgMzYyOTQ6cmV0dXJuIFJBO2Nhc2UgMzYyOTU6cmV0dXJuIFBBO2Nhc2UgMzYyOTY6cmV0dXJuIElBO2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpjYXNlIDM2Mjk4OmNhc2UgMzYzMDY6Y2FzZSAzNTY4MjpyZXR1cm4gTEE7Y2FzZSAzNTY3OTpjYXNlIDM2Mjk5OmNhc2UgMzYzMDc6cmV0dXJuIERBO2Nhc2UgMzU2ODA6Y2FzZSAzNjMwMDpjYXNlIDM2MzA4OmNhc2UgMzYyOTM6cmV0dXJuIFVBO2Nhc2UgMzYyODk6Y2FzZSAzNjMwMzpjYXNlIDM2MzExOmNhc2UgMzYyOTI6cmV0dXJuIE5BfX1mdW5jdGlvbiBPQShpLHQpe2kudW5pZm9ybTFmdih0aGlzLmFkZHIsdCl9ZnVuY3Rpb24gQkEoaSx0KXtjb25zdCBlPUVzKHQsdGhpcy5zaXplLDIpO2kudW5pZm9ybTJmdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gekEoaSx0KXtjb25zdCBlPUVzKHQsdGhpcy5zaXplLDMpO2kudW5pZm9ybTNmdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24ga0EoaSx0KXtjb25zdCBlPUVzKHQsdGhpcy5zaXplLDQpO2kudW5pZm9ybTRmdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gR0EoaSx0KXtjb25zdCBlPUVzKHQsdGhpcy5zaXplLDQpO2kudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsITEsZSl9ZnVuY3Rpb24gVkEoaSx0KXtjb25zdCBlPUVzKHQsdGhpcy5zaXplLDkpO2kudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsITEsZSl9ZnVuY3Rpb24gSEEoaSx0KXtjb25zdCBlPUVzKHQsdGhpcy5zaXplLDE2KTtpLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLCExLGUpfWZ1bmN0aW9uIFdBKGksdCl7aS51bmlmb3JtMWl2KHRoaXMuYWRkcix0KX1mdW5jdGlvbiAkQShpLHQpe2kudW5pZm9ybTJpdih0aGlzLmFkZHIsdCl9ZnVuY3Rpb24gWEEoaSx0KXtpLnVuaWZvcm0zaXYodGhpcy5hZGRyLHQpfWZ1bmN0aW9uIHFBKGksdCl7aS51bmlmb3JtNGl2KHRoaXMuYWRkcix0KX1mdW5jdGlvbiBZQShpLHQpe2kudW5pZm9ybTF1aXYodGhpcy5hZGRyLHQpfWZ1bmN0aW9uIFpBKGksdCl7aS51bmlmb3JtMnVpdih0aGlzLmFkZHIsdCl9ZnVuY3Rpb24gSkEoaSx0KXtpLnVuaWZvcm0zdWl2KHRoaXMuYWRkcix0KX1mdW5jdGlvbiBLQShpLHQpe2kudW5pZm9ybTR1aXYodGhpcy5hZGRyLHQpfWZ1bmN0aW9uIGpBKGksdCxlKXtjb25zdCBuPXRoaXMuY2FjaGUscj10Lmxlbmd0aCxzPSRsKGUscik7VWUobixzKXx8KGkudW5pZm9ybTFpdih0aGlzLmFkZHIscyksTmUobixzKSk7Zm9yKGxldCBvPTA7byE9PXI7KytvKWUuc2V0VGV4dHVyZTJEKHRbb118fFZnLHNbb10pfWZ1bmN0aW9uIFFBKGksdCxlKXtjb25zdCBuPXRoaXMuY2FjaGUscj10Lmxlbmd0aCxzPSRsKGUscik7VWUobixzKXx8KGkudW5pZm9ybTFpdih0aGlzLmFkZHIscyksTmUobixzKSk7Zm9yKGxldCBvPTA7byE9PXI7KytvKWUuc2V0VGV4dHVyZTNEKHRbb118fCRnLHNbb10pfWZ1bmN0aW9uIHRFKGksdCxlKXtjb25zdCBuPXRoaXMuY2FjaGUscj10Lmxlbmd0aCxzPSRsKGUscik7VWUobixzKXx8KGkudW5pZm9ybTFpdih0aGlzLmFkZHIscyksTmUobixzKSk7Zm9yKGxldCBvPTA7byE9PXI7KytvKWUuc2V0VGV4dHVyZUN1YmUodFtvXXx8WGcsc1tvXSl9ZnVuY3Rpb24gZUUoaSx0LGUpe2NvbnN0IG49dGhpcy5jYWNoZSxyPXQubGVuZ3RoLHM9JGwoZSxyKTtVZShuLHMpfHwoaS51bmlmb3JtMWl2KHRoaXMuYWRkcixzKSxOZShuLHMpKTtmb3IobGV0IG89MDtvIT09cjsrK28pZS5zZXRUZXh0dXJlMkRBcnJheSh0W29dfHxXZyxzW29dKX1mdW5jdGlvbiBuRShpKXtzd2l0Y2goaSl7Y2FzZSA1MTI2OnJldHVybiBPQTtjYXNlIDM1NjY0OnJldHVybiBCQTtjYXNlIDM1NjY1OnJldHVybiB6QTtjYXNlIDM1NjY2OnJldHVybiBrQTtjYXNlIDM1Njc0OnJldHVybiBHQTtjYXNlIDM1Njc1OnJldHVybiBWQTtjYXNlIDM1Njc2OnJldHVybiBIQTtjYXNlIDUxMjQ6Y2FzZSAzNTY3MDpyZXR1cm4gV0E7Y2FzZSAzNTY2NzpjYXNlIDM1NjcxOnJldHVybiAkQTtjYXNlIDM1NjY4OmNhc2UgMzU2NzI6cmV0dXJuIFhBO2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gcUE7Y2FzZSA1MTI1OnJldHVybiBZQTtjYXNlIDM2Mjk0OnJldHVybiBaQTtjYXNlIDM2Mjk1OnJldHVybiBKQTtjYXNlIDM2Mjk2OnJldHVybiBLQTtjYXNlIDM1Njc4OmNhc2UgMzYxOTg6Y2FzZSAzNjI5ODpjYXNlIDM2MzA2OmNhc2UgMzU2ODI6cmV0dXJuIGpBO2Nhc2UgMzU2Nzk6Y2FzZSAzNjI5OTpjYXNlIDM2MzA3OnJldHVybiBRQTtjYXNlIDM1NjgwOmNhc2UgMzYzMDA6Y2FzZSAzNjMwODpjYXNlIDM2MjkzOnJldHVybiB0RTtjYXNlIDM2Mjg5OmNhc2UgMzYzMDM6Y2FzZSAzNjMxMTpjYXNlIDM2MjkyOnJldHVybiBlRX19Y2xhc3MgaUV7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuaWQ9dCx0aGlzLmFkZHI9bix0aGlzLmNhY2hlPVtdLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5zZXRWYWx1ZT1GQShlLnR5cGUpfX1jbGFzcyByRXtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5pZD10LHRoaXMuYWRkcj1uLHRoaXMuY2FjaGU9W10sdGhpcy50eXBlPWUudHlwZSx0aGlzLnNpemU9ZS5zaXplLHRoaXMuc2V0VmFsdWU9bkUoZS50eXBlKX19Y2xhc3Mgc0V7Y29uc3RydWN0b3IodCl7dGhpcy5pZD10LHRoaXMuc2VxPVtdLHRoaXMubWFwPXt9fXNldFZhbHVlKHQsZSxuKXtjb25zdCByPXRoaXMuc2VxO2ZvcihsZXQgcz0wLG89ci5sZW5ndGg7cyE9PW87KytzKXtjb25zdCBhPXJbc107YS5zZXRWYWx1ZSh0LGVbYS5pZF0sbil9fX1jb25zdCBhZj0vKFx3KykoXF0pPyhcW3xcLik/L2c7ZnVuY3Rpb24gamcoaSx0KXtpLnNlcS5wdXNoKHQpLGkubWFwW3QuaWRdPXR9ZnVuY3Rpb24gb0UoaSx0LGUpe2NvbnN0IG49aS5uYW1lLHI9bi5sZW5ndGg7Zm9yKGFmLmxhc3RJbmRleD0wOzspe2NvbnN0IHM9YWYuZXhlYyhuKSxvPWFmLmxhc3RJbmRleDtsZXQgYT1zWzFdO2NvbnN0IGw9c1syXT09PSJdIixjPXNbM107aWYobCYmKGE9YXwwKSxjPT09dm9pZCAwfHxjPT09IlsiJiZvKzI9PT1yKXtqZyhlLGM9PT12b2lkIDA/bmV3IGlFKGEsaSx0KTpuZXcgckUoYSxpLHQpKTticmVha31lbHNle2xldCBoPWUubWFwW2FdO2g9PT12b2lkIDAmJihoPW5ldyBzRShhKSxqZyhlLGgpKSxlPWh9fX1jbGFzcyBYbHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuc2VxPVtdLHRoaXMubWFwPXt9O2NvbnN0IG49dC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsdC5BQ1RJVkVfVU5JRk9STVMpO2ZvcihsZXQgcj0wO3I8bjsrK3Ipe2NvbnN0IHM9dC5nZXRBY3RpdmVVbmlmb3JtKGUsciksbz10LmdldFVuaWZvcm1Mb2NhdGlvbihlLHMubmFtZSk7b0UocyxvLHRoaXMpfX1zZXRWYWx1ZSh0LGUsbixyKXtjb25zdCBzPXRoaXMubWFwW2VdO3MhPT12b2lkIDAmJnMuc2V0VmFsdWUodCxuLHIpfXNldE9wdGlvbmFsKHQsZSxuKXtjb25zdCByPWVbbl07ciE9PXZvaWQgMCYmdGhpcy5zZXRWYWx1ZSh0LG4scil9c3RhdGljIHVwbG9hZCh0LGUsbixyKXtmb3IobGV0IHM9MCxvPWUubGVuZ3RoO3MhPT1vOysrcyl7Y29uc3QgYT1lW3NdLGw9blthLmlkXTtsLm5lZWRzVXBkYXRlIT09ITEmJmEuc2V0VmFsdWUodCxsLnZhbHVlLHIpfX1zdGF0aWMgc2VxV2l0aFZhbHVlKHQsZSl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9MCxzPXQubGVuZ3RoO3IhPT1zOysrcil7Y29uc3Qgbz10W3JdO28uaWQgaW4gZSYmbi5wdXNoKG8pfXJldHVybiBufX1mdW5jdGlvbiBRZyhpLHQsZSl7Y29uc3Qgbj1pLmNyZWF0ZVNoYWRlcih0KTtyZXR1cm4gaS5zaGFkZXJTb3VyY2UobixlKSxpLmNvbXBpbGVTaGFkZXIobiksbn1jb25zdCBhRT0zNzI5NztsZXQgbEU9MDtmdW5jdGlvbiBjRShpLHQpe2NvbnN0IGU9aS5zcGxpdChgCmApLG49W10scj1NYXRoLm1heCh0LTYsMCkscz1NYXRoLm1pbih0KzYsZS5sZW5ndGgpO2ZvcihsZXQgbz1yO288cztvKyspe2NvbnN0IGE9bysxO24ucHVzaChgJHthPT09dD8iPiI6IiAifSAke2F9OiAke2Vbb119YCl9cmV0dXJuIG4uam9pbihgCmApfWZ1bmN0aW9uIHVFKGkpe2NvbnN0IHQ9c2UuZ2V0UHJpbWFyaWVzKHNlLndvcmtpbmdDb2xvclNwYWNlKSxlPXNlLmdldFByaW1hcmllcyhpKTtsZXQgbjtzd2l0Y2godD09PWU/bj0iIjp0PT09RW8mJmU9PT1Bbz9uPSJMaW5lYXJEaXNwbGF5UDNUb0xpbmVhclNSR0IiOnQ9PT1BbyYmZT09PUVvJiYobj0iTGluZWFyU1JHQlRvTGluZWFyRGlzcGxheVAzIiksaSl7Y2FzZSB5aTpjYXNlIGJvOnJldHVybltuLCJMaW5lYXJUcmFuc2Zlck9FVEYiXTtjYXNlIExuOmNhc2UgeGw6cmV0dXJuW24sInNSR0JUcmFuc2Zlck9FVEYiXTtkZWZhdWx0OnJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbTogVW5zdXBwb3J0ZWQgY29sb3Igc3BhY2U6IixpKSxbbiwiTGluZWFyVHJhbnNmZXJPRVRGIl19fWZ1bmN0aW9uIHQwKGksdCxlKXtjb25zdCBuPWkuZ2V0U2hhZGVyUGFyYW1ldGVyKHQsaS5DT01QSUxFX1NUQVRVUykscj1pLmdldFNoYWRlckluZm9Mb2codCkudHJpbSgpO2lmKG4mJnI9PT0iIilyZXR1cm4iIjtjb25zdCBzPS9FUlJPUjogMDooXGQrKS8uZXhlYyhyKTtpZihzKXtjb25zdCBvPXBhcnNlSW50KHNbMV0pO3JldHVybiBlLnRvVXBwZXJDYXNlKCkrYAoKYCtyK2AKCmArY0UoaS5nZXRTaGFkZXJTb3VyY2UodCksbyl9ZWxzZSByZXR1cm4gcn1mdW5jdGlvbiBoRShpLHQpe2NvbnN0IGU9dUUodCk7cmV0dXJuYHZlYzQgJHtpfSggdmVjNCB2YWx1ZSApIHsgcmV0dXJuICR7ZVswXX0oICR7ZVsxXX0oIHZhbHVlICkgKTsgfWB9ZnVuY3Rpb24gZkUoaSx0KXtsZXQgZTtzd2l0Y2godCl7Y2FzZSB6bTplPSJMaW5lYXIiO2JyZWFrO2Nhc2Uga206ZT0iUmVpbmhhcmQiO2JyZWFrO2Nhc2UgR206ZT0iQ2luZW9uIjticmVhaztjYXNlIFZtOmU9IkFDRVNGaWxtaWMiO2JyZWFrO2Nhc2UgV206ZT0iQWdYIjticmVhaztjYXNlICRtOmU9Ik5ldXRyYWwiO2JyZWFrO2Nhc2UgSG06ZT0iQ3VzdG9tIjticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtOiBVbnN1cHBvcnRlZCB0b25lTWFwcGluZzoiLHQpLGU9IkxpbmVhciJ9cmV0dXJuInZlYzMgIitpKyIoIHZlYzMgY29sb3IgKSB7IHJldHVybiAiK2UrIlRvbmVNYXBwaW5nKCBjb2xvciApOyB9In1jb25zdCBxbD1uZXcgTDtmdW5jdGlvbiBkRSgpe3NlLmdldEx1bWluYW5jZUNvZWZmaWNpZW50cyhxbCk7Y29uc3QgaT1xbC54LnRvRml4ZWQoNCksdD1xbC55LnRvRml4ZWQoNCksZT1xbC56LnRvRml4ZWQoNCk7cmV0dXJuWyJmbG9hdCBsdW1pbmFuY2UoIGNvbnN0IGluIHZlYzMgcmdiICkgeyIsYAljb25zdCB2ZWMzIHdlaWdodHMgPSB2ZWMzKCAke2l9LCAke3R9LCAke2V9ICk7YCwiCXJldHVybiBkb3QoIHdlaWdodHMsIHJnYiApOyIsIn0iXS5qb2luKGAKYCl9ZnVuY3Rpb24gcEUoaSl7cmV0dXJuW2kuZXh0ZW5zaW9uQ2xpcEN1bGxEaXN0YW5jZT8iI2V4dGVuc2lvbiBHTF9BTkdMRV9jbGlwX2N1bGxfZGlzdGFuY2UgOiByZXF1aXJlIjoiIixpLmV4dGVuc2lvbk11bHRpRHJhdz8iI2V4dGVuc2lvbiBHTF9BTkdMRV9tdWx0aV9kcmF3IDogcmVxdWlyZSI6IiJdLmZpbHRlcih6bykuam9pbihgCmApfWZ1bmN0aW9uIG1FKGkpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IGUgaW4gaSl7Y29uc3Qgbj1pW2VdO24hPT0hMSYmdC5wdXNoKCIjZGVmaW5lICIrZSsiICIrbil9cmV0dXJuIHQuam9pbihgCmApfWZ1bmN0aW9uIGdFKGksdCl7Y29uc3QgZT17fSxuPWkuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0LGkuQUNUSVZFX0FUVFJJQlVURVMpO2ZvcihsZXQgcj0wO3I8bjtyKyspe2NvbnN0IHM9aS5nZXRBY3RpdmVBdHRyaWIodCxyKSxvPXMubmFtZTtsZXQgYT0xO3MudHlwZT09PWkuRkxPQVRfTUFUMiYmKGE9Mikscy50eXBlPT09aS5GTE9BVF9NQVQzJiYoYT0zKSxzLnR5cGU9PT1pLkZMT0FUX01BVDQmJihhPTQpLGVbb109e3R5cGU6cy50eXBlLGxvY2F0aW9uOmkuZ2V0QXR0cmliTG9jYXRpb24odCxvKSxsb2NhdGlvblNpemU6YX19cmV0dXJuIGV9ZnVuY3Rpb24gem8oaSl7cmV0dXJuIGkhPT0iIn1mdW5jdGlvbiBlMChpLHQpe2NvbnN0IGU9dC5udW1TcG90TGlnaHRTaGFkb3dzK3QubnVtU3BvdExpZ2h0TWFwcy10Lm51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwcztyZXR1cm4gaS5yZXBsYWNlKC9OVU1fRElSX0xJR0hUUy9nLHQubnVtRGlyTGlnaHRzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVFMvZyx0Lm51bVNwb3RMaWdodHMpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX01BUFMvZyx0Lm51bVNwb3RMaWdodE1hcHMpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX0NPT1JEUy9nLGUpLnJlcGxhY2UoL05VTV9SRUNUX0FSRUFfTElHSFRTL2csdC5udW1SZWN0QXJlYUxpZ2h0cykucmVwbGFjZSgvTlVNX1BPSU5UX0xJR0hUUy9nLHQubnVtUG9pbnRMaWdodHMpLnJlcGxhY2UoL05VTV9IRU1JX0xJR0hUUy9nLHQubnVtSGVtaUxpZ2h0cykucmVwbGFjZSgvTlVNX0RJUl9MSUdIVF9TSEFET1dTL2csdC5udW1EaXJMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX1NIQURPV1NfV0lUSF9NQVBTL2csdC5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHMpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX1NIQURPV1MvZyx0Lm51bVNwb3RMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVF9TSEFET1dTL2csdC5udW1Qb2ludExpZ2h0U2hhZG93cyl9ZnVuY3Rpb24gbjAoaSx0KXtyZXR1cm4gaS5yZXBsYWNlKC9OVU1fQ0xJUFBJTkdfUExBTkVTL2csdC5udW1DbGlwcGluZ1BsYW5lcykucmVwbGFjZSgvVU5JT05fQ0xJUFBJTkdfUExBTkVTL2csdC5udW1DbGlwcGluZ1BsYW5lcy10Lm51bUNsaXBJbnRlcnNlY3Rpb24pfWNvbnN0IHlFPS9eWyBcdF0qI2luY2x1ZGUgKzwoW1x3XGQuL10rKT4vZ207ZnVuY3Rpb24gbGYoaSl7cmV0dXJuIGkucmVwbGFjZSh5RSxfRSl9Y29uc3QgdkU9bmV3IE1hcDtmdW5jdGlvbiBfRShpLHQpe2xldCBlPXF0W3RdO2lmKGU9PT12b2lkIDApe2NvbnN0IG49dkUuZ2V0KHQpO2lmKG4hPT12b2lkIDApZT1xdFtuXSxjb25zb2xlLndhcm4oJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFNoYWRlciBjaHVuayAiJXMiIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAiJXMiIGluc3RlYWQuJyx0LG4pO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJDYW4gbm90IHJlc29sdmUgI2luY2x1ZGUgPCIrdCsiPiIpfXJldHVybiBsZihlKX1jb25zdCB4RT0vI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxzK2ZvclxzKlwoXHMqaW50XHMraVxzKj1ccyooXGQrKVxzKjtccyppXHMqPFxzKihcZCspXHMqO1xzKmlccypcK1wrXHMqXClccyp7KFtcc1xTXSs/KX1ccysjcHJhZ21hIHVucm9sbF9sb29wX2VuZC9nO2Z1bmN0aW9uIGkwKGkpe3JldHVybiBpLnJlcGxhY2UoeEUsTUUpfWZ1bmN0aW9uIE1FKGksdCxlLG4pe2xldCByPSIiO2ZvcihsZXQgcz1wYXJzZUludCh0KTtzPHBhcnNlSW50KGUpO3MrKylyKz1uLnJlcGxhY2UoL1xbXHMqaVxzKlxdL2csIlsgIitzKyIgXSIpLnJlcGxhY2UoL1VOUk9MTEVEX0xPT1BfSU5ERVgvZyxzKTtyZXR1cm4gcn1mdW5jdGlvbiByMChpKXtsZXQgdD1gcHJlY2lzaW9uICR7aS5wcmVjaXNpb259IGZsb2F0OwoJcHJlY2lzaW9uICR7aS5wcmVjaXNpb259IGludDsKCXByZWNpc2lvbiAke2kucHJlY2lzaW9ufSBzYW1wbGVyMkQ7CglwcmVjaXNpb24gJHtpLnByZWNpc2lvbn0gc2FtcGxlckN1YmU7CglwcmVjaXNpb24gJHtpLnByZWNpc2lvbn0gc2FtcGxlcjNEOwoJcHJlY2lzaW9uICR7aS5wcmVjaXNpb259IHNhbXBsZXIyREFycmF5OwoJcHJlY2lzaW9uICR7aS5wcmVjaXNpb259IHNhbXBsZXIyRFNoYWRvdzsKCXByZWNpc2lvbiAke2kucHJlY2lzaW9ufSBzYW1wbGVyQ3ViZVNoYWRvdzsKCXByZWNpc2lvbiAke2kucHJlY2lzaW9ufSBzYW1wbGVyMkRBcnJheVNoYWRvdzsKCXByZWNpc2lvbiAke2kucHJlY2lzaW9ufSBpc2FtcGxlcjJEOwoJcHJlY2lzaW9uICR7aS5wcmVjaXNpb259IGlzYW1wbGVyM0Q7CglwcmVjaXNpb24gJHtpLnByZWNpc2lvbn0gaXNhbXBsZXJDdWJlOwoJcHJlY2lzaW9uICR7aS5wcmVjaXNpb259IGlzYW1wbGVyMkRBcnJheTsKCXByZWNpc2lvbiAke2kucHJlY2lzaW9ufSB1c2FtcGxlcjJEOwoJcHJlY2lzaW9uICR7aS5wcmVjaXNpb259IHVzYW1wbGVyM0Q7CglwcmVjaXNpb24gJHtpLnByZWNpc2lvbn0gdXNhbXBsZXJDdWJlOwoJcHJlY2lzaW9uICR7aS5wcmVjaXNpb259IHVzYW1wbGVyMkRBcnJheTsKCWA7cmV0dXJuIGkucHJlY2lzaW9uPT09ImhpZ2hwIj90Kz1gCiNkZWZpbmUgSElHSF9QUkVDSVNJT05gOmkucHJlY2lzaW9uPT09Im1lZGl1bXAiP3QrPWAKI2RlZmluZSBNRURJVU1fUFJFQ0lTSU9OYDppLnByZWNpc2lvbj09PSJsb3dwIiYmKHQrPWAKI2RlZmluZSBMT1dfUFJFQ0lTSU9OYCksdH1mdW5jdGlvbiBTRShpKXtsZXQgdD0iU0hBRE9XTUFQX1RZUEVfQkFTSUMiO3JldHVybiBpLnNoYWRvd01hcFR5cGU9PT1sbj90PSJTSEFET1dNQVBfVFlQRV9QQ0YiOmkuc2hhZG93TWFwVHlwZT09PUtyP3Q9IlNIQURPV01BUF9UWVBFX1BDRl9TT0ZUIjppLnNoYWRvd01hcFR5cGU9PT1KbiYmKHQ9IlNIQURPV01BUF9UWVBFX1ZTTSIpLHR9ZnVuY3Rpb24gYkUoaSl7bGV0IHQ9IkVOVk1BUF9UWVBFX0NVQkUiO2lmKGkuZW52TWFwKXN3aXRjaChpLmVudk1hcE1vZGUpe2Nhc2UgcGk6Y2FzZSB6aTp0PSJFTlZNQVBfVFlQRV9DVUJFIjticmVhaztjYXNlIGpyOnQ9IkVOVk1BUF9UWVBFX0NVQkVfVVYiO2JyZWFrfXJldHVybiB0fWZ1bmN0aW9uIHdFKGkpe2xldCB0PSJFTlZNQVBfTU9ERV9SRUZMRUNUSU9OIjtpZihpLmVudk1hcClzd2l0Y2goaS5lbnZNYXBNb2RlKXtjYXNlIHppOnQ9IkVOVk1BUF9NT0RFX1JFRlJBQ1RJT04iO2JyZWFrfXJldHVybiB0fWZ1bmN0aW9uIEFFKGkpe2xldCB0PSJFTlZNQVBfQkxFTkRJTkdfTk9ORSI7aWYoaS5lbnZNYXApc3dpdGNoKGkuY29tYmluZSl7Y2FzZSBsbzp0PSJFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkiO2JyZWFrO2Nhc2UgT206dD0iRU5WTUFQX0JMRU5ESU5HX01JWCI7YnJlYWs7Y2FzZSBCbTp0PSJFTlZNQVBfQkxFTkRJTkdfQUREIjticmVha31yZXR1cm4gdH1mdW5jdGlvbiBFRShpKXtjb25zdCB0PWkuZW52TWFwQ3ViZVVWSGVpZ2h0O2lmKHQ9PT1udWxsKXJldHVybiBudWxsO2NvbnN0IGU9TWF0aC5sb2cyKHQpLTIsbj0xL3Q7cmV0dXJue3RleGVsV2lkdGg6MS8oMypNYXRoLm1heChNYXRoLnBvdygyLGUpLDcqMTYpKSx0ZXhlbEhlaWdodDpuLG1heE1pcDplfX1mdW5jdGlvbiBURShpLHQsZSxuKXtjb25zdCByPWkuZ2V0Q29udGV4dCgpLHM9ZS5kZWZpbmVzO2xldCBvPWUudmVydGV4U2hhZGVyLGE9ZS5mcmFnbWVudFNoYWRlcjtjb25zdCBsPVNFKGUpLGM9YkUoZSksdT13RShlKSxoPUFFKGUpLGY9RUUoZSksZD1wRShlKSxwPW1FKHMpLHk9ci5jcmVhdGVQcm9ncmFtKCk7bGV0IG0sZyx4PWUuZ2xzbFZlcnNpb24/IiN2ZXJzaW9uICIrZS5nbHNsVmVyc2lvbitgCmA6IiI7ZS5pc1Jhd1NoYWRlck1hdGVyaWFsPyhtPVsiI2RlZmluZSBTSEFERVJfVFlQRSAiK2Uuc2hhZGVyVHlwZSwiI2RlZmluZSBTSEFERVJfTkFNRSAiK2Uuc2hhZGVyTmFtZSxwXS5maWx0ZXIoem8pLmpvaW4oYApgKSxtLmxlbmd0aD4wJiYobSs9YApgKSxnPVsiI2RlZmluZSBTSEFERVJfVFlQRSAiK2Uuc2hhZGVyVHlwZSwiI2RlZmluZSBTSEFERVJfTkFNRSAiK2Uuc2hhZGVyTmFtZSxwXS5maWx0ZXIoem8pLmpvaW4oYApgKSxnLmxlbmd0aD4wJiYoZys9YApgKSk6KG09W3IwKGUpLCIjZGVmaW5lIFNIQURFUl9UWVBFICIrZS5zaGFkZXJUeXBlLCIjZGVmaW5lIFNIQURFUl9OQU1FICIrZS5zaGFkZXJOYW1lLHAsZS5leHRlbnNpb25DbGlwQ3VsbERpc3RhbmNlPyIjZGVmaW5lIFVTRV9DTElQX0RJU1RBTkNFIjoiIixlLmJhdGNoaW5nPyIjZGVmaW5lIFVTRV9CQVRDSElORyI6IiIsZS5iYXRjaGluZ0NvbG9yPyIjZGVmaW5lIFVTRV9CQVRDSElOR19DT0xPUiI6IiIsZS5pbnN0YW5jaW5nPyIjZGVmaW5lIFVTRV9JTlNUQU5DSU5HIjoiIixlLmluc3RhbmNpbmdDb2xvcj8iI2RlZmluZSBVU0VfSU5TVEFOQ0lOR19DT0xPUiI6IiIsZS5pbnN0YW5jaW5nTW9ycGg/IiNkZWZpbmUgVVNFX0lOU1RBTkNJTkdfTU9SUEgiOiIiLGUudXNlRm9nJiZlLmZvZz8iI2RlZmluZSBVU0VfRk9HIjoiIixlLnVzZUZvZyYmZS5mb2dFeHAyPyIjZGVmaW5lIEZPR19FWFAyIjoiIixlLm1hcD8iI2RlZmluZSBVU0VfTUFQIjoiIixlLmVudk1hcD8iI2RlZmluZSBVU0VfRU5WTUFQIjoiIixlLmVudk1hcD8iI2RlZmluZSAiK3U6IiIsZS5saWdodE1hcD8iI2RlZmluZSBVU0VfTElHSFRNQVAiOiIiLGUuYW9NYXA/IiNkZWZpbmUgVVNFX0FPTUFQIjoiIixlLmJ1bXBNYXA/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLGUubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLGUubm9ybWFsTWFwT2JqZWN0U3BhY2U/IiNkZWZpbmUgVVNFX05PUk1BTE1BUF9PQkpFQ1RTUEFDRSI6IiIsZS5ub3JtYWxNYXBUYW5nZW50U3BhY2U/IiNkZWZpbmUgVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UiOiIiLGUuZGlzcGxhY2VtZW50TWFwPyIjZGVmaW5lIFVTRV9ESVNQTEFDRU1FTlRNQVAiOiIiLGUuZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIixlLmFuaXNvdHJvcHk/IiNkZWZpbmUgVVNFX0FOSVNPVFJPUFkiOiIiLGUuYW5pc290cm9weU1hcD8iI2RlZmluZSBVU0VfQU5JU09UUk9QWU1BUCI6IiIsZS5jbGVhcmNvYXRNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVE1BUCI6IiIsZS5jbGVhcmNvYXRSb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAiOiIiLGUuY2xlYXJjb2F0Tm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIjoiIixlLmlyaWRlc2NlbmNlTWFwPyIjZGVmaW5lIFVTRV9JUklERVNDRU5DRU1BUCI6IiIsZS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD8iI2RlZmluZSBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQIjoiIixlLnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsZS5zcGVjdWxhckNvbG9yTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUl9DT0xPUk1BUCI6IiIsZS5zcGVjdWxhckludGVuc2l0eU1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQIjoiIixlLnJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQIjoiIixlLm1ldGFsbmVzc01hcD8iI2RlZmluZSBVU0VfTUVUQUxORVNTTUFQIjoiIixlLmFscGhhTWFwPyIjZGVmaW5lIFVTRV9BTFBIQU1BUCI6IiIsZS5hbHBoYUhhc2g/IiNkZWZpbmUgVVNFX0FMUEhBSEFTSCI6IiIsZS50cmFuc21pc3Npb24/IiNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTiI6IiIsZS50cmFuc21pc3Npb25NYXA/IiNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTk1BUCI6IiIsZS50aGlja25lc3NNYXA/IiNkZWZpbmUgVVNFX1RISUNLTkVTU01BUCI6IiIsZS5zaGVlbkNvbG9yTWFwPyIjZGVmaW5lIFVTRV9TSEVFTl9DT0xPUk1BUCI6IiIsZS5zaGVlblJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfU0hFRU5fUk9VR0hORVNTTUFQIjoiIixlLm1hcFV2PyIjZGVmaW5lIE1BUF9VViAiK2UubWFwVXY6IiIsZS5hbHBoYU1hcFV2PyIjZGVmaW5lIEFMUEhBTUFQX1VWICIrZS5hbHBoYU1hcFV2OiIiLGUubGlnaHRNYXBVdj8iI2RlZmluZSBMSUdIVE1BUF9VViAiK2UubGlnaHRNYXBVdjoiIixlLmFvTWFwVXY/IiNkZWZpbmUgQU9NQVBfVVYgIitlLmFvTWFwVXY6IiIsZS5lbWlzc2l2ZU1hcFV2PyIjZGVmaW5lIEVNSVNTSVZFTUFQX1VWICIrZS5lbWlzc2l2ZU1hcFV2OiIiLGUuYnVtcE1hcFV2PyIjZGVmaW5lIEJVTVBNQVBfVVYgIitlLmJ1bXBNYXBVdjoiIixlLm5vcm1hbE1hcFV2PyIjZGVmaW5lIE5PUk1BTE1BUF9VViAiK2Uubm9ybWFsTWFwVXY6IiIsZS5kaXNwbGFjZW1lbnRNYXBVdj8iI2RlZmluZSBESVNQTEFDRU1FTlRNQVBfVVYgIitlLmRpc3BsYWNlbWVudE1hcFV2OiIiLGUubWV0YWxuZXNzTWFwVXY/IiNkZWZpbmUgTUVUQUxORVNTTUFQX1VWICIrZS5tZXRhbG5lc3NNYXBVdjoiIixlLnJvdWdobmVzc01hcFV2PyIjZGVmaW5lIFJPVUdITkVTU01BUF9VViAiK2Uucm91Z2huZXNzTWFwVXY6IiIsZS5hbmlzb3Ryb3B5TWFwVXY/IiNkZWZpbmUgQU5JU09UUk9QWU1BUF9VViAiK2UuYW5pc290cm9weU1hcFV2OiIiLGUuY2xlYXJjb2F0TWFwVXY/IiNkZWZpbmUgQ0xFQVJDT0FUTUFQX1VWICIrZS5jbGVhcmNvYXRNYXBVdjoiIixlLmNsZWFyY29hdE5vcm1hbE1hcFV2PyIjZGVmaW5lIENMRUFSQ09BVF9OT1JNQUxNQVBfVVYgIitlLmNsZWFyY29hdE5vcm1hbE1hcFV2OiIiLGUuY2xlYXJjb2F0Um91Z2huZXNzTWFwVXY/IiNkZWZpbmUgQ0xFQVJDT0FUX1JPVUdITkVTU01BUF9VViAiK2UuY2xlYXJjb2F0Um91Z2huZXNzTWFwVXY6IiIsZS5pcmlkZXNjZW5jZU1hcFV2PyIjZGVmaW5lIElSSURFU0NFTkNFTUFQX1VWICIrZS5pcmlkZXNjZW5jZU1hcFV2OiIiLGUuaXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdj8iI2RlZmluZSBJUklERVNDRU5DRV9USElDS05FU1NNQVBfVVYgIitlLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXY6IiIsZS5zaGVlbkNvbG9yTWFwVXY/IiNkZWZpbmUgU0hFRU5fQ09MT1JNQVBfVVYgIitlLnNoZWVuQ29sb3JNYXBVdjoiIixlLnNoZWVuUm91Z2huZXNzTWFwVXY/IiNkZWZpbmUgU0hFRU5fUk9VR0hORVNTTUFQX1VWICIrZS5zaGVlblJvdWdobmVzc01hcFV2OiIiLGUuc3BlY3VsYXJNYXBVdj8iI2RlZmluZSBTUEVDVUxBUk1BUF9VViAiK2Uuc3BlY3VsYXJNYXBVdjoiIixlLnNwZWN1bGFyQ29sb3JNYXBVdj8iI2RlZmluZSBTUEVDVUxBUl9DT0xPUk1BUF9VViAiK2Uuc3BlY3VsYXJDb2xvck1hcFV2OiIiLGUuc3BlY3VsYXJJbnRlbnNpdHlNYXBVdj8iI2RlZmluZSBTUEVDVUxBUl9JTlRFTlNJVFlNQVBfVVYgIitlLnNwZWN1bGFySW50ZW5zaXR5TWFwVXY6IiIsZS50cmFuc21pc3Npb25NYXBVdj8iI2RlZmluZSBUUkFOU01JU1NJT05NQVBfVVYgIitlLnRyYW5zbWlzc2lvbk1hcFV2OiIiLGUudGhpY2tuZXNzTWFwVXY/IiNkZWZpbmUgVEhJQ0tORVNTTUFQX1VWICIrZS50aGlja25lc3NNYXBVdjoiIixlLnZlcnRleFRhbmdlbnRzJiZlLmZsYXRTaGFkaW5nPT09ITE/IiNkZWZpbmUgVVNFX1RBTkdFTlQiOiIiLGUudmVydGV4Q29sb3JzPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsZS52ZXJ0ZXhBbHBoYXM/IiNkZWZpbmUgVVNFX0NPTE9SX0FMUEhBIjoiIixlLnZlcnRleFV2MXM/IiNkZWZpbmUgVVNFX1VWMSI6IiIsZS52ZXJ0ZXhVdjJzPyIjZGVmaW5lIFVTRV9VVjIiOiIiLGUudmVydGV4VXYzcz8iI2RlZmluZSBVU0VfVVYzIjoiIixlLnBvaW50c1V2cz8iI2RlZmluZSBVU0VfUE9JTlRTX1VWIjoiIixlLmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIixlLnNraW5uaW5nPyIjZGVmaW5lIFVTRV9TS0lOTklORyI6IiIsZS5tb3JwaFRhcmdldHM/IiNkZWZpbmUgVVNFX01PUlBIVEFSR0VUUyI6IiIsZS5tb3JwaE5vcm1hbHMmJmUuZmxhdFNoYWRpbmc9PT0hMT8iI2RlZmluZSBVU0VfTU9SUEhOT1JNQUxTIjoiIixlLm1vcnBoQ29sb3JzPyIjZGVmaW5lIFVTRV9NT1JQSENPTE9SUyI6IiIsZS5tb3JwaFRhcmdldHNDb3VudD4wPyIjZGVmaW5lIE1PUlBIVEFSR0VUU19URVhUVVJFX1NUUklERSAiK2UubW9ycGhUZXh0dXJlU3RyaWRlOiIiLGUubW9ycGhUYXJnZXRzQ291bnQ+MD8iI2RlZmluZSBNT1JQSFRBUkdFVFNfQ09VTlQgIitlLm1vcnBoVGFyZ2V0c0NvdW50OiIiLGUuZG91YmxlU2lkZWQ/IiNkZWZpbmUgRE9VQkxFX1NJREVEIjoiIixlLmZsaXBTaWRlZD8iI2RlZmluZSBGTElQX1NJREVEIjoiIixlLnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgVVNFX1NIQURPV01BUCI6IiIsZS5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lICIrbDoiIixlLnNpemVBdHRlbnVhdGlvbj8iI2RlZmluZSBVU0VfU0laRUFUVEVOVUFUSU9OIjoiIixlLm51bUxpZ2h0UHJvYmVzPjA/IiNkZWZpbmUgVVNFX0xJR0hUX1BST0JFUyI6IiIsZS5sb2dhcml0aG1pY0RlcHRoQnVmZmVyPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRiI6IiIsInVuaWZvcm0gbWF0NCBtb2RlbE1hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4OyIsInVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OyIsInVuaWZvcm0gbWF0NCB2aWV3TWF0cml4OyIsInVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsInVuaWZvcm0gYm9vbCBpc09ydGhvZ3JhcGhpYzsiLCIjaWZkZWYgVVNFX0lOU1RBTkNJTkciLCIJYXR0cmlidXRlIG1hdDQgaW5zdGFuY2VNYXRyaXg7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9JTlNUQU5DSU5HX0NPTE9SIiwiCWF0dHJpYnV0ZSB2ZWMzIGluc3RhbmNlQ29sb3I7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9JTlNUQU5DSU5HX01PUlBIIiwiCXVuaWZvcm0gc2FtcGxlcjJEIG1vcnBoVGV4dHVyZTsiLCIjZW5kaWYiLCJhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjsiLCJhdHRyaWJ1dGUgdmVjMyBub3JtYWw7IiwiYXR0cmlidXRlIHZlYzIgdXY7IiwiI2lmZGVmIFVTRV9VVjEiLCIJYXR0cmlidXRlIHZlYzIgdXYxOyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfVVYyIiwiCWF0dHJpYnV0ZSB2ZWMyIHV2MjsiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1VWMyIsIglhdHRyaWJ1dGUgdmVjMiB1djM7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9UQU5HRU5UIiwiCWF0dHJpYnV0ZSB2ZWM0IHRhbmdlbnQ7IiwiI2VuZGlmIiwiI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApIiwiCWF0dHJpYnV0ZSB2ZWM0IGNvbG9yOyIsIiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApIiwiCWF0dHJpYnV0ZSB2ZWMzIGNvbG9yOyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfU0tJTk5JTkciLCIJYXR0cmlidXRlIHZlYzQgc2tpbkluZGV4OyIsIglhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OyIsIiNlbmRpZiIsYApgXS5maWx0ZXIoem8pLmpvaW4oYApgKSxnPVtyMChlKSwiI2RlZmluZSBTSEFERVJfVFlQRSAiK2Uuc2hhZGVyVHlwZSwiI2RlZmluZSBTSEFERVJfTkFNRSAiK2Uuc2hhZGVyTmFtZSxwLGUudXNlRm9nJiZlLmZvZz8iI2RlZmluZSBVU0VfRk9HIjoiIixlLnVzZUZvZyYmZS5mb2dFeHAyPyIjZGVmaW5lIEZPR19FWFAyIjoiIixlLmFscGhhVG9Db3ZlcmFnZT8iI2RlZmluZSBBTFBIQV9UT19DT1ZFUkFHRSI6IiIsZS5tYXA/IiNkZWZpbmUgVVNFX01BUCI6IiIsZS5tYXRjYXA/IiNkZWZpbmUgVVNFX01BVENBUCI6IiIsZS5lbnZNYXA/IiNkZWZpbmUgVVNFX0VOVk1BUCI6IiIsZS5lbnZNYXA/IiNkZWZpbmUgIitjOiIiLGUuZW52TWFwPyIjZGVmaW5lICIrdToiIixlLmVudk1hcD8iI2RlZmluZSAiK2g6IiIsZj8iI2RlZmluZSBDVUJFVVZfVEVYRUxfV0lEVEggIitmLnRleGVsV2lkdGg6IiIsZj8iI2RlZmluZSBDVUJFVVZfVEVYRUxfSEVJR0hUICIrZi50ZXhlbEhlaWdodDoiIixmPyIjZGVmaW5lIENVQkVVVl9NQVhfTUlQICIrZi5tYXhNaXArIi4wIjoiIixlLmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsZS5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLGUuYnVtcE1hcD8iI2RlZmluZSBVU0VfQlVNUE1BUCI6IiIsZS5ub3JtYWxNYXA/IiNkZWZpbmUgVVNFX05PUk1BTE1BUCI6IiIsZS5ub3JtYWxNYXBPYmplY3RTcGFjZT8iI2RlZmluZSBVU0VfTk9STUFMTUFQX09CSkVDVFNQQUNFIjoiIixlLm5vcm1hbE1hcFRhbmdlbnRTcGFjZT8iI2RlZmluZSBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSI6IiIsZS5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLGUuYW5pc290cm9weT8iI2RlZmluZSBVU0VfQU5JU09UUk9QWSI6IiIsZS5hbmlzb3Ryb3B5TWFwPyIjZGVmaW5lIFVTRV9BTklTT1RST1BZTUFQIjoiIixlLmNsZWFyY29hdD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUIjoiIixlLmNsZWFyY29hdE1hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUTUFQIjoiIixlLmNsZWFyY29hdFJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUCI6IiIsZS5jbGVhcmNvYXROb3JtYWxNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAiOiIiLGUuZGlzcGVyc2lvbj8iI2RlZmluZSBVU0VfRElTUEVSU0lPTiI6IiIsZS5pcmlkZXNjZW5jZT8iI2RlZmluZSBVU0VfSVJJREVTQ0VOQ0UiOiIiLGUuaXJpZGVzY2VuY2VNYXA/IiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFTUFQIjoiIixlLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwPyIjZGVmaW5lIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAiOiIiLGUuc3BlY3VsYXJNYXA/IiNkZWZpbmUgVVNFX1NQRUNVTEFSTUFQIjoiIixlLnNwZWN1bGFyQ29sb3JNYXA/IiNkZWZpbmUgVVNFX1NQRUNVTEFSX0NPTE9STUFQIjoiIixlLnNwZWN1bGFySW50ZW5zaXR5TWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVAiOiIiLGUucm91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAiOiIiLGUubWV0YWxuZXNzTWFwPyIjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAiOiIiLGUuYWxwaGFNYXA/IiNkZWZpbmUgVVNFX0FMUEhBTUFQIjoiIixlLmFscGhhVGVzdD8iI2RlZmluZSBVU0VfQUxQSEFURVNUIjoiIixlLmFscGhhSGFzaD8iI2RlZmluZSBVU0VfQUxQSEFIQVNIIjoiIixlLnNoZWVuPyIjZGVmaW5lIFVTRV9TSEVFTiI6IiIsZS5zaGVlbkNvbG9yTWFwPyIjZGVmaW5lIFVTRV9TSEVFTl9DT0xPUk1BUCI6IiIsZS5zaGVlblJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfU0hFRU5fUk9VR0hORVNTTUFQIjoiIixlLnRyYW5zbWlzc2lvbj8iI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OIjoiIixlLnRyYW5zbWlzc2lvbk1hcD8iI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OTUFQIjoiIixlLnRoaWNrbmVzc01hcD8iI2RlZmluZSBVU0VfVEhJQ0tORVNTTUFQIjoiIixlLnZlcnRleFRhbmdlbnRzJiZlLmZsYXRTaGFkaW5nPT09ITE/IiNkZWZpbmUgVVNFX1RBTkdFTlQiOiIiLGUudmVydGV4Q29sb3JzfHxlLmluc3RhbmNpbmdDb2xvcnx8ZS5iYXRjaGluZ0NvbG9yPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsZS52ZXJ0ZXhBbHBoYXM/IiNkZWZpbmUgVVNFX0NPTE9SX0FMUEhBIjoiIixlLnZlcnRleFV2MXM/IiNkZWZpbmUgVVNFX1VWMSI6IiIsZS52ZXJ0ZXhVdjJzPyIjZGVmaW5lIFVTRV9VVjIiOiIiLGUudmVydGV4VXYzcz8iI2RlZmluZSBVU0VfVVYzIjoiIixlLnBvaW50c1V2cz8iI2RlZmluZSBVU0VfUE9JTlRTX1VWIjoiIixlLmdyYWRpZW50TWFwPyIjZGVmaW5lIFVTRV9HUkFESUVOVE1BUCI6IiIsZS5mbGF0U2hhZGluZz8iI2RlZmluZSBGTEFUX1NIQURFRCI6IiIsZS5kb3VibGVTaWRlZD8iI2RlZmluZSBET1VCTEVfU0lERUQiOiIiLGUuZmxpcFNpZGVkPyIjZGVmaW5lIEZMSVBfU0lERUQiOiIiLGUuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSBVU0VfU0hBRE9XTUFQIjoiIixlLnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgIitsOiIiLGUucHJlbXVsdGlwbGllZEFscGhhPyIjZGVmaW5lIFBSRU1VTFRJUExJRURfQUxQSEEiOiIiLGUubnVtTGlnaHRQcm9iZXM+MD8iI2RlZmluZSBVU0VfTElHSFRfUFJPQkVTIjoiIixlLmRlY29kZVZpZGVvVGV4dHVyZT8iI2RlZmluZSBERUNPREVfVklERU9fVEVYVFVSRSI6IiIsZS5sb2dhcml0aG1pY0RlcHRoQnVmZmVyPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRiI6IiIsInVuaWZvcm0gbWF0NCB2aWV3TWF0cml4OyIsInVuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsiLCJ1bmlmb3JtIGJvb2wgaXNPcnRob2dyYXBoaWM7IixlLnRvbmVNYXBwaW5nIT09ZGk/IiNkZWZpbmUgVE9ORV9NQVBQSU5HIjoiIixlLnRvbmVNYXBwaW5nIT09ZGk/cXQudG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDoiIixlLnRvbmVNYXBwaW5nIT09ZGk/ZkUoInRvbmVNYXBwaW5nIixlLnRvbmVNYXBwaW5nKToiIixlLmRpdGhlcmluZz8iI2RlZmluZSBESVRIRVJJTkciOiIiLGUub3BhcXVlPyIjZGVmaW5lIE9QQVFVRSI6IiIscXQuY29sb3JzcGFjZV9wYXJzX2ZyYWdtZW50LGhFKCJsaW5lYXJUb091dHB1dFRleGVsIixlLm91dHB1dENvbG9yU3BhY2UpLGRFKCksZS51c2VEZXB0aFBhY2tpbmc/IiNkZWZpbmUgREVQVEhfUEFDS0lORyAiK2UuZGVwdGhQYWNraW5nOiIiLGAKYF0uZmlsdGVyKHpvKS5qb2luKGAKYCkpLG89bGYobyksbz1lMChvLGUpLG89bjAobyxlKSxhPWxmKGEpLGE9ZTAoYSxlKSxhPW4wKGEsZSksbz1pMChvKSxhPWkwKGEpLGUuaXNSYXdTaGFkZXJNYXRlcmlhbCE9PSEwJiYoeD1gI3ZlcnNpb24gMzAwIGVzCmAsbT1bZCwiI2RlZmluZSBhdHRyaWJ1dGUgaW4iLCIjZGVmaW5lIHZhcnlpbmcgb3V0IiwiI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZSJdLmpvaW4oYApgKStgCmArbSxnPVsiI2RlZmluZSB2YXJ5aW5nIGluIixlLmdsc2xWZXJzaW9uPT09Umg/IiI6ImxheW91dChsb2NhdGlvbiA9IDApIG91dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsiLGUuZ2xzbFZlcnNpb249PT1SaD8iIjoiI2RlZmluZSBnbF9GcmFnQ29sb3IgcGNfZnJhZ0NvbG9yIiwiI2RlZmluZSBnbF9GcmFnRGVwdGhFWFQgZ2xfRnJhZ0RlcHRoIiwiI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZSIsIiNkZWZpbmUgdGV4dHVyZUN1YmUgdGV4dHVyZSIsIiNkZWZpbmUgdGV4dHVyZTJEUHJvaiB0ZXh0dXJlUHJvaiIsIiNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2QiLCIjZGVmaW5lIHRleHR1cmUyRFByb2pMb2RFWFQgdGV4dHVyZVByb2pMb2QiLCIjZGVmaW5lIHRleHR1cmVDdWJlTG9kRVhUIHRleHR1cmVMb2QiLCIjZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWQiLCIjZGVmaW5lIHRleHR1cmUyRFByb2pHcmFkRVhUIHRleHR1cmVQcm9qR3JhZCIsIiNkZWZpbmUgdGV4dHVyZUN1YmVHcmFkRVhUIHRleHR1cmVHcmFkIl0uam9pbihgCmApK2AKYCtnKTtjb25zdCB2PXgrbStvLF89eCtnK2EsRT1RZyhyLHIuVkVSVEVYX1NIQURFUix2KSxiPVFnKHIsci5GUkFHTUVOVF9TSEFERVIsXyk7ci5hdHRhY2hTaGFkZXIoeSxFKSxyLmF0dGFjaFNoYWRlcih5LGIpLGUuaW5kZXgwQXR0cmlidXRlTmFtZSE9PXZvaWQgMD9yLmJpbmRBdHRyaWJMb2NhdGlvbih5LDAsZS5pbmRleDBBdHRyaWJ1dGVOYW1lKTplLm1vcnBoVGFyZ2V0cz09PSEwJiZyLmJpbmRBdHRyaWJMb2NhdGlvbih5LDAsInBvc2l0aW9uIiksci5saW5rUHJvZ3JhbSh5KTtmdW5jdGlvbiBUKEEpe2lmKGkuZGVidWcuY2hlY2tTaGFkZXJFcnJvcnMpe2NvbnN0IEY9ci5nZXRQcm9ncmFtSW5mb0xvZyh5KS50cmltKCksRD1yLmdldFNoYWRlckluZm9Mb2coRSkudHJpbSgpLE49ci5nZXRTaGFkZXJJbmZvTG9nKGIpLnRyaW0oKTtsZXQgVT0hMCxCPSEwO2lmKHIuZ2V0UHJvZ3JhbVBhcmFtZXRlcih5LHIuTElOS19TVEFUVVMpPT09ITEpaWYoVT0hMSx0eXBlb2YgaS5kZWJ1Zy5vblNoYWRlckVycm9yPT0iZnVuY3Rpb24iKWkuZGVidWcub25TaGFkZXJFcnJvcihyLHksRSxiKTtlbHNle2NvbnN0IEg9dDAocixFLCJ2ZXJ0ZXgiKSxHPXQwKHIsYiwiZnJhZ21lbnQiKTtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFByb2dyYW06IFNoYWRlciBFcnJvciAiK3IuZ2V0RXJyb3IoKSsiIC0gVkFMSURBVEVfU1RBVFVTICIrci5nZXRQcm9ncmFtUGFyYW1ldGVyKHksci5WQUxJREFURV9TVEFUVVMpK2AKCk1hdGVyaWFsIE5hbWU6IGArQS5uYW1lK2AKTWF0ZXJpYWwgVHlwZTogYCtBLnR5cGUrYAoKUHJvZ3JhbSBJbmZvIExvZzogYCtGK2AKYCtIK2AKYCtHKX1lbHNlIEYhPT0iIj9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbTogUHJvZ3JhbSBJbmZvIExvZzoiLEYpOihEPT09IiJ8fE49PT0iIikmJihCPSExKTtCJiYoQS5kaWFnbm9zdGljcz17cnVubmFibGU6VSxwcm9ncmFtTG9nOkYsdmVydGV4U2hhZGVyOntsb2c6RCxwcmVmaXg6bX0sZnJhZ21lbnRTaGFkZXI6e2xvZzpOLHByZWZpeDpnfX0pfXIuZGVsZXRlU2hhZGVyKEUpLHIuZGVsZXRlU2hhZGVyKGIpLFA9bmV3IFhsKHIseSksdz1nRShyLHkpfWxldCBQO3RoaXMuZ2V0VW5pZm9ybXM9ZnVuY3Rpb24oKXtyZXR1cm4gUD09PXZvaWQgMCYmVCh0aGlzKSxQfTtsZXQgdzt0aGlzLmdldEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdz09PXZvaWQgMCYmVCh0aGlzKSx3fTtsZXQgTT1lLnJlbmRlcmVyRXh0ZW5zaW9uUGFyYWxsZWxTaGFkZXJDb21waWxlPT09ITE7cmV0dXJuIHRoaXMuaXNSZWFkeT1mdW5jdGlvbigpe3JldHVybiBNPT09ITEmJihNPXIuZ2V0UHJvZ3JhbVBhcmFtZXRlcih5LGFFKSksTX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7bi5yZWxlYXNlU3RhdGVzT2ZQcm9ncmFtKHRoaXMpLHIuZGVsZXRlUHJvZ3JhbSh5KSx0aGlzLnByb2dyYW09dm9pZCAwfSx0aGlzLnR5cGU9ZS5zaGFkZXJUeXBlLHRoaXMubmFtZT1lLnNoYWRlck5hbWUsdGhpcy5pZD1sRSsrLHRoaXMuY2FjaGVLZXk9dCx0aGlzLnVzZWRUaW1lcz0xLHRoaXMucHJvZ3JhbT15LHRoaXMudmVydGV4U2hhZGVyPUUsdGhpcy5mcmFnbWVudFNoYWRlcj1iLHRoaXN9bGV0IENFPTA7Y2xhc3MgUkV7Y29uc3RydWN0b3IoKXt0aGlzLnNoYWRlckNhY2hlPW5ldyBNYXAsdGhpcy5tYXRlcmlhbENhY2hlPW5ldyBNYXB9dXBkYXRlKHQpe2NvbnN0IGU9dC52ZXJ0ZXhTaGFkZXIsbj10LmZyYWdtZW50U2hhZGVyLHI9dGhpcy5fZ2V0U2hhZGVyU3RhZ2UoZSkscz10aGlzLl9nZXRTaGFkZXJTdGFnZShuKSxvPXRoaXMuX2dldFNoYWRlckNhY2hlRm9yTWF0ZXJpYWwodCk7cmV0dXJuIG8uaGFzKHIpPT09ITEmJihvLmFkZChyKSxyLnVzZWRUaW1lcysrKSxvLmhhcyhzKT09PSExJiYoby5hZGQocykscy51c2VkVGltZXMrKyksdGhpc31yZW1vdmUodCl7Y29uc3QgZT10aGlzLm1hdGVyaWFsQ2FjaGUuZ2V0KHQpO2Zvcihjb25zdCBuIG9mIGUpbi51c2VkVGltZXMtLSxuLnVzZWRUaW1lcz09PTAmJnRoaXMuc2hhZGVyQ2FjaGUuZGVsZXRlKG4uY29kZSk7cmV0dXJuIHRoaXMubWF0ZXJpYWxDYWNoZS5kZWxldGUodCksdGhpc31nZXRWZXJ0ZXhTaGFkZXJJRCh0KXtyZXR1cm4gdGhpcy5fZ2V0U2hhZGVyU3RhZ2UodC52ZXJ0ZXhTaGFkZXIpLmlkfWdldEZyYWdtZW50U2hhZGVySUQodCl7cmV0dXJuIHRoaXMuX2dldFNoYWRlclN0YWdlKHQuZnJhZ21lbnRTaGFkZXIpLmlkfWRpc3Bvc2UoKXt0aGlzLnNoYWRlckNhY2hlLmNsZWFyKCksdGhpcy5tYXRlcmlhbENhY2hlLmNsZWFyKCl9X2dldFNoYWRlckNhY2hlRm9yTWF0ZXJpYWwodCl7Y29uc3QgZT10aGlzLm1hdGVyaWFsQ2FjaGU7bGV0IG49ZS5nZXQodCk7cmV0dXJuIG49PT12b2lkIDAmJihuPW5ldyBTZXQsZS5zZXQodCxuKSksbn1fZ2V0U2hhZGVyU3RhZ2UodCl7Y29uc3QgZT10aGlzLnNoYWRlckNhY2hlO2xldCBuPWUuZ2V0KHQpO3JldHVybiBuPT09dm9pZCAwJiYobj1uZXcgUEUodCksZS5zZXQodCxuKSksbn19Y2xhc3MgUEV7Y29uc3RydWN0b3IodCl7dGhpcy5pZD1DRSsrLHRoaXMuY29kZT10LHRoaXMudXNlZFRpbWVzPTB9fWZ1bmN0aW9uIElFKGksdCxlLG4scixzLG8pe2NvbnN0IGE9bmV3IENsLGw9bmV3IFJFLGM9bmV3IFNldCx1PVtdLGg9ci5sb2dhcml0aG1pY0RlcHRoQnVmZmVyLGY9ci52ZXJ0ZXhUZXh0dXJlcztsZXQgZD1yLnByZWNpc2lvbjtjb25zdCBwPXtNZXNoRGVwdGhNYXRlcmlhbDoiZGVwdGgiLE1lc2hEaXN0YW5jZU1hdGVyaWFsOiJkaXN0YW5jZVJHQkEiLE1lc2hOb3JtYWxNYXRlcmlhbDoibm9ybWFsIixNZXNoQmFzaWNNYXRlcmlhbDoiYmFzaWMiLE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ImxhbWJlcnQiLE1lc2hQaG9uZ01hdGVyaWFsOiJwaG9uZyIsTWVzaFRvb25NYXRlcmlhbDoidG9vbiIsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoUGh5c2ljYWxNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hNYXRjYXBNYXRlcmlhbDoibWF0Y2FwIixMaW5lQmFzaWNNYXRlcmlhbDoiYmFzaWMiLExpbmVEYXNoZWRNYXRlcmlhbDoiZGFzaGVkIixQb2ludHNNYXRlcmlhbDoicG9pbnRzIixTaGFkb3dNYXRlcmlhbDoic2hhZG93IixTcHJpdGVNYXRlcmlhbDoic3ByaXRlIn07ZnVuY3Rpb24geSh3KXtyZXR1cm4gYy5hZGQodyksdz09PTA/InV2IjpgdXYke3d9YH1mdW5jdGlvbiBtKHcsTSxBLEYsRCl7Y29uc3QgTj1GLmZvZyxVPUQuZ2VvbWV0cnksQj13LmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/Ri5lbnZpcm9ubWVudDpudWxsLEg9KHcuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9lOnQpLmdldCh3LmVudk1hcHx8QiksRz1IJiZILm1hcHBpbmc9PT1qcj9ILmltYWdlLmhlaWdodDpudWxsLHR0PXBbdy50eXBlXTt3LnByZWNpc2lvbiE9PW51bGwmJihkPXIuZ2V0TWF4UHJlY2lzaW9uKHcucHJlY2lzaW9uKSxkIT09dy5wcmVjaXNpb24mJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6Iix3LnByZWNpc2lvbiwibm90IHN1cHBvcnRlZCwgdXNpbmciLGQsImluc3RlYWQuIikpO2NvbnN0IGx0PVUubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9ufHxVLm1vcnBoQXR0cmlidXRlcy5ub3JtYWx8fFUubW9ycGhBdHRyaWJ1dGVzLmNvbG9yLGh0PWx0IT09dm9pZCAwP2x0Lmxlbmd0aDowO2xldCBSdD0wO1UubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uIT09dm9pZCAwJiYoUnQ9MSksVS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsIT09dm9pZCAwJiYoUnQ9MiksVS5tb3JwaEF0dHJpYnV0ZXMuY29sb3IhPT12b2lkIDAmJihSdD0zKTtsZXQgVnQsSyxydCxNdDtpZih0dCl7Y29uc3QgbGU9Vm5bdHRdO1Z0PWxlLnZlcnRleFNoYWRlcixLPWxlLmZyYWdtZW50U2hhZGVyfWVsc2UgVnQ9dy52ZXJ0ZXhTaGFkZXIsSz13LmZyYWdtZW50U2hhZGVyLGwudXBkYXRlKHcpLHJ0PWwuZ2V0VmVydGV4U2hhZGVySUQodyksTXQ9bC5nZXRGcmFnbWVudFNoYWRlcklEKHcpO2NvbnN0IHB0PWkuZ2V0UmVuZGVyVGFyZ2V0KCksSXQ9RC5pc0luc3RhbmNlZE1lc2g9PT0hMCxGdD1ELmlzQmF0Y2hlZE1lc2g9PT0hMCxFdD0hIXcubWFwLEp0PSEhdy5tYXRjYXAsST0hIUgsb3Q9ISF3LmFvTWFwLGl0PSEhdy5saWdodE1hcCxtdD0hIXcuYnVtcE1hcCxRPSEhdy5ub3JtYWxNYXAsUHQ9ISF3LmRpc3BsYWNlbWVudE1hcCwkPSEhdy5lbWlzc2l2ZU1hcCxKPSEhdy5tZXRhbG5lc3NNYXAsUj0hIXcucm91Z2huZXNzTWFwLFM9dy5hbmlzb3Ryb3B5PjAsTz13LmNsZWFyY29hdD4wLFk9dy5kaXNwZXJzaW9uPjAsWj13LmlyaWRlc2NlbmNlPjAsaj13LnNoZWVuPjAsX3Q9dy50cmFuc21pc3Npb24+MCxhdD1TJiYhIXcuYW5pc290cm9weU1hcCxndD1PJiYhIXcuY2xlYXJjb2F0TWFwLGt0PU8mJiEhdy5jbGVhcmNvYXROb3JtYWxNYXAsc3Q9TyYmISF3LmNsZWFyY29hdFJvdWdobmVzc01hcCx5dD1aJiYhIXcuaXJpZGVzY2VuY2VNYXAsS3Q9WiYmISF3LmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLFV0PWomJiEhdy5zaGVlbkNvbG9yTWFwLGJ0PWomJiEhdy5zaGVlblJvdWdobmVzc01hcCxIdD0hIXcuc3BlY3VsYXJNYXAsWXQ9ISF3LnNwZWN1bGFyQ29sb3JNYXAsbWU9ISF3LnNwZWN1bGFySW50ZW5zaXR5TWFwLHo9X3QmJiEhdy50cmFuc21pc3Npb25NYXAsY3Q9X3QmJiEhdy50aGlja25lc3NNYXAsZXQ9ISF3LmdyYWRpZW50TWFwLG50PSEhdy5hbHBoYU1hcCxmdD13LmFscGhhVGVzdD4wLE90PSEhdy5hbHBoYUhhc2gscmU9ISF3LmV4dGVuc2lvbnM7bGV0IExlPWRpO3cudG9uZU1hcHBlZCYmKHB0PT09bnVsbHx8cHQuaXNYUlJlbmRlclRhcmdldD09PSEwKSYmKExlPWkudG9uZU1hcHBpbmcpO2NvbnN0IEdlPXtzaGFkZXJJRDp0dCxzaGFkZXJUeXBlOncudHlwZSxzaGFkZXJOYW1lOncubmFtZSx2ZXJ0ZXhTaGFkZXI6VnQsZnJhZ21lbnRTaGFkZXI6SyxkZWZpbmVzOncuZGVmaW5lcyxjdXN0b21WZXJ0ZXhTaGFkZXJJRDpydCxjdXN0b21GcmFnbWVudFNoYWRlcklEOk10LGlzUmF3U2hhZGVyTWF0ZXJpYWw6dy5pc1Jhd1NoYWRlck1hdGVyaWFsPT09ITAsZ2xzbFZlcnNpb246dy5nbHNsVmVyc2lvbixwcmVjaXNpb246ZCxiYXRjaGluZzpGdCxiYXRjaGluZ0NvbG9yOkZ0JiZELl9jb2xvcnNUZXh0dXJlIT09bnVsbCxpbnN0YW5jaW5nOkl0LGluc3RhbmNpbmdDb2xvcjpJdCYmRC5pbnN0YW5jZUNvbG9yIT09bnVsbCxpbnN0YW5jaW5nTW9ycGg6SXQmJkQubW9ycGhUZXh0dXJlIT09bnVsbCxzdXBwb3J0c1ZlcnRleFRleHR1cmVzOmYsb3V0cHV0Q29sb3JTcGFjZTpwdD09PW51bGw/aS5vdXRwdXRDb2xvclNwYWNlOnB0LmlzWFJSZW5kZXJUYXJnZXQ9PT0hMD9wdC50ZXh0dXJlLmNvbG9yU3BhY2U6eWksYWxwaGFUb0NvdmVyYWdlOiEhdy5hbHBoYVRvQ292ZXJhZ2UsbWFwOkV0LG1hdGNhcDpKdCxlbnZNYXA6SSxlbnZNYXBNb2RlOkkmJkgubWFwcGluZyxlbnZNYXBDdWJlVVZIZWlnaHQ6Ryxhb01hcDpvdCxsaWdodE1hcDppdCxidW1wTWFwOm10LG5vcm1hbE1hcDpRLGRpc3BsYWNlbWVudE1hcDpmJiZQdCxlbWlzc2l2ZU1hcDokLG5vcm1hbE1hcE9iamVjdFNwYWNlOlEmJncubm9ybWFsTWFwVHlwZT09PWptLG5vcm1hbE1hcFRhbmdlbnRTcGFjZTpRJiZ3Lm5vcm1hbE1hcFR5cGU9PT1raSxtZXRhbG5lc3NNYXA6Sixyb3VnaG5lc3NNYXA6Uixhbmlzb3Ryb3B5OlMsYW5pc290cm9weU1hcDphdCxjbGVhcmNvYXQ6TyxjbGVhcmNvYXRNYXA6Z3QsY2xlYXJjb2F0Tm9ybWFsTWFwOmt0LGNsZWFyY29hdFJvdWdobmVzc01hcDpzdCxkaXNwZXJzaW9uOlksaXJpZGVzY2VuY2U6WixpcmlkZXNjZW5jZU1hcDp5dCxpcmlkZXNjZW5jZVRoaWNrbmVzc01hcDpLdCxzaGVlbjpqLHNoZWVuQ29sb3JNYXA6VXQsc2hlZW5Sb3VnaG5lc3NNYXA6YnQsc3BlY3VsYXJNYXA6SHQsc3BlY3VsYXJDb2xvck1hcDpZdCxzcGVjdWxhckludGVuc2l0eU1hcDptZSx0cmFuc21pc3Npb246X3QsdHJhbnNtaXNzaW9uTWFwOnosdGhpY2tuZXNzTWFwOmN0LGdyYWRpZW50TWFwOmV0LG9wYXF1ZTp3LnRyYW5zcGFyZW50PT09ITEmJncuYmxlbmRpbmc9PT1jciYmdy5hbHBoYVRvQ292ZXJhZ2U9PT0hMSxhbHBoYU1hcDpudCxhbHBoYVRlc3Q6ZnQsYWxwaGFIYXNoOk90LGNvbWJpbmU6dy5jb21iaW5lLG1hcFV2OkV0JiZ5KHcubWFwLmNoYW5uZWwpLGFvTWFwVXY6b3QmJnkody5hb01hcC5jaGFubmVsKSxsaWdodE1hcFV2Oml0JiZ5KHcubGlnaHRNYXAuY2hhbm5lbCksYnVtcE1hcFV2Om10JiZ5KHcuYnVtcE1hcC5jaGFubmVsKSxub3JtYWxNYXBVdjpRJiZ5KHcubm9ybWFsTWFwLmNoYW5uZWwpLGRpc3BsYWNlbWVudE1hcFV2OlB0JiZ5KHcuZGlzcGxhY2VtZW50TWFwLmNoYW5uZWwpLGVtaXNzaXZlTWFwVXY6JCYmeSh3LmVtaXNzaXZlTWFwLmNoYW5uZWwpLG1ldGFsbmVzc01hcFV2OkomJnkody5tZXRhbG5lc3NNYXAuY2hhbm5lbCkscm91Z2huZXNzTWFwVXY6UiYmeSh3LnJvdWdobmVzc01hcC5jaGFubmVsKSxhbmlzb3Ryb3B5TWFwVXY6YXQmJnkody5hbmlzb3Ryb3B5TWFwLmNoYW5uZWwpLGNsZWFyY29hdE1hcFV2Omd0JiZ5KHcuY2xlYXJjb2F0TWFwLmNoYW5uZWwpLGNsZWFyY29hdE5vcm1hbE1hcFV2Omt0JiZ5KHcuY2xlYXJjb2F0Tm9ybWFsTWFwLmNoYW5uZWwpLGNsZWFyY29hdFJvdWdobmVzc01hcFV2OnN0JiZ5KHcuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmNoYW5uZWwpLGlyaWRlc2NlbmNlTWFwVXY6eXQmJnkody5pcmlkZXNjZW5jZU1hcC5jaGFubmVsKSxpcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2Okt0JiZ5KHcuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuY2hhbm5lbCksc2hlZW5Db2xvck1hcFV2OlV0JiZ5KHcuc2hlZW5Db2xvck1hcC5jaGFubmVsKSxzaGVlblJvdWdobmVzc01hcFV2OmJ0JiZ5KHcuc2hlZW5Sb3VnaG5lc3NNYXAuY2hhbm5lbCksc3BlY3VsYXJNYXBVdjpIdCYmeSh3LnNwZWN1bGFyTWFwLmNoYW5uZWwpLHNwZWN1bGFyQ29sb3JNYXBVdjpZdCYmeSh3LnNwZWN1bGFyQ29sb3JNYXAuY2hhbm5lbCksc3BlY3VsYXJJbnRlbnNpdHlNYXBVdjptZSYmeSh3LnNwZWN1bGFySW50ZW5zaXR5TWFwLmNoYW5uZWwpLHRyYW5zbWlzc2lvbk1hcFV2OnomJnkody50cmFuc21pc3Npb25NYXAuY2hhbm5lbCksdGhpY2tuZXNzTWFwVXY6Y3QmJnkody50aGlja25lc3NNYXAuY2hhbm5lbCksYWxwaGFNYXBVdjpudCYmeSh3LmFscGhhTWFwLmNoYW5uZWwpLHZlcnRleFRhbmdlbnRzOiEhVS5hdHRyaWJ1dGVzLnRhbmdlbnQmJihRfHxTKSx2ZXJ0ZXhDb2xvcnM6dy52ZXJ0ZXhDb2xvcnMsdmVydGV4QWxwaGFzOncudmVydGV4Q29sb3JzPT09ITAmJiEhVS5hdHRyaWJ1dGVzLmNvbG9yJiZVLmF0dHJpYnV0ZXMuY29sb3IuaXRlbVNpemU9PT00LHBvaW50c1V2czpELmlzUG9pbnRzPT09ITAmJiEhVS5hdHRyaWJ1dGVzLnV2JiYoRXR8fG50KSxmb2c6ISFOLHVzZUZvZzp3LmZvZz09PSEwLGZvZ0V4cDI6ISFOJiZOLmlzRm9nRXhwMixmbGF0U2hhZGluZzp3LmZsYXRTaGFkaW5nPT09ITAsc2l6ZUF0dGVudWF0aW9uOncuc2l6ZUF0dGVudWF0aW9uPT09ITAsbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjpoLHNraW5uaW5nOkQuaXNTa2lubmVkTWVzaD09PSEwLG1vcnBoVGFyZ2V0czpVLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiE9PXZvaWQgMCxtb3JwaE5vcm1hbHM6VS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsIT09dm9pZCAwLG1vcnBoQ29sb3JzOlUubW9ycGhBdHRyaWJ1dGVzLmNvbG9yIT09dm9pZCAwLG1vcnBoVGFyZ2V0c0NvdW50Omh0LG1vcnBoVGV4dHVyZVN0cmlkZTpSdCxudW1EaXJMaWdodHM6TS5kaXJlY3Rpb25hbC5sZW5ndGgsbnVtUG9pbnRMaWdodHM6TS5wb2ludC5sZW5ndGgsbnVtU3BvdExpZ2h0czpNLnNwb3QubGVuZ3RoLG51bVNwb3RMaWdodE1hcHM6TS5zcG90TGlnaHRNYXAubGVuZ3RoLG51bVJlY3RBcmVhTGlnaHRzOk0ucmVjdEFyZWEubGVuZ3RoLG51bUhlbWlMaWdodHM6TS5oZW1pLmxlbmd0aCxudW1EaXJMaWdodFNoYWRvd3M6TS5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGgsbnVtUG9pbnRMaWdodFNoYWRvd3M6TS5wb2ludFNoYWRvd01hcC5sZW5ndGgsbnVtU3BvdExpZ2h0U2hhZG93czpNLnNwb3RTaGFkb3dNYXAubGVuZ3RoLG51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwczpNLm51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwcyxudW1MaWdodFByb2JlczpNLm51bUxpZ2h0UHJvYmVzLG51bUNsaXBwaW5nUGxhbmVzOm8ubnVtUGxhbmVzLG51bUNsaXBJbnRlcnNlY3Rpb246by5udW1JbnRlcnNlY3Rpb24sZGl0aGVyaW5nOncuZGl0aGVyaW5nLHNoYWRvd01hcEVuYWJsZWQ6aS5zaGFkb3dNYXAuZW5hYmxlZCYmQS5sZW5ndGg+MCxzaGFkb3dNYXBUeXBlOmkuc2hhZG93TWFwLnR5cGUsdG9uZU1hcHBpbmc6TGUsZGVjb2RlVmlkZW9UZXh0dXJlOkV0JiZ3Lm1hcC5pc1ZpZGVvVGV4dHVyZT09PSEwJiZzZS5nZXRUcmFuc2Zlcih3Lm1hcC5jb2xvclNwYWNlKT09PWRlLHByZW11bHRpcGxpZWRBbHBoYTp3LnByZW11bHRpcGxpZWRBbHBoYSxkb3VibGVTaWRlZDp3LnNpZGU9PT1LbixmbGlwU2lkZWQ6dy5zaWRlPT09S2UsdXNlRGVwdGhQYWNraW5nOncuZGVwdGhQYWNraW5nPj0wLGRlcHRoUGFja2luZzp3LmRlcHRoUGFja2luZ3x8MCxpbmRleDBBdHRyaWJ1dGVOYW1lOncuaW5kZXgwQXR0cmlidXRlTmFtZSxleHRlbnNpb25DbGlwQ3VsbERpc3RhbmNlOnJlJiZ3LmV4dGVuc2lvbnMuY2xpcEN1bGxEaXN0YW5jZT09PSEwJiZuLmhhcygiV0VCR0xfY2xpcF9jdWxsX2Rpc3RhbmNlIiksZXh0ZW5zaW9uTXVsdGlEcmF3OihyZSYmdy5leHRlbnNpb25zLm11bHRpRHJhdz09PSEwfHxGdCkmJm4uaGFzKCJXRUJHTF9tdWx0aV9kcmF3IikscmVuZGVyZXJFeHRlbnNpb25QYXJhbGxlbFNoYWRlckNvbXBpbGU6bi5oYXMoIktIUl9wYXJhbGxlbF9zaGFkZXJfY29tcGlsZSIpLGN1c3RvbVByb2dyYW1DYWNoZUtleTp3LmN1c3RvbVByb2dyYW1DYWNoZUtleSgpfTtyZXR1cm4gR2UudmVydGV4VXYxcz1jLmhhcygxKSxHZS52ZXJ0ZXhVdjJzPWMuaGFzKDIpLEdlLnZlcnRleFV2M3M9Yy5oYXMoMyksYy5jbGVhcigpLEdlfWZ1bmN0aW9uIGcodyl7Y29uc3QgTT1bXTtpZih3LnNoYWRlcklEP00ucHVzaCh3LnNoYWRlcklEKTooTS5wdXNoKHcuY3VzdG9tVmVydGV4U2hhZGVySUQpLE0ucHVzaCh3LmN1c3RvbUZyYWdtZW50U2hhZGVySUQpKSx3LmRlZmluZXMhPT12b2lkIDApZm9yKGNvbnN0IEEgaW4gdy5kZWZpbmVzKU0ucHVzaChBKSxNLnB1c2gody5kZWZpbmVzW0FdKTtyZXR1cm4gdy5pc1Jhd1NoYWRlck1hdGVyaWFsPT09ITEmJih4KE0sdyksdihNLHcpLE0ucHVzaChpLm91dHB1dENvbG9yU3BhY2UpKSxNLnB1c2gody5jdXN0b21Qcm9ncmFtQ2FjaGVLZXkpLE0uam9pbigpfWZ1bmN0aW9uIHgodyxNKXt3LnB1c2goTS5wcmVjaXNpb24pLHcucHVzaChNLm91dHB1dENvbG9yU3BhY2UpLHcucHVzaChNLmVudk1hcE1vZGUpLHcucHVzaChNLmVudk1hcEN1YmVVVkhlaWdodCksdy5wdXNoKE0ubWFwVXYpLHcucHVzaChNLmFscGhhTWFwVXYpLHcucHVzaChNLmxpZ2h0TWFwVXYpLHcucHVzaChNLmFvTWFwVXYpLHcucHVzaChNLmJ1bXBNYXBVdiksdy5wdXNoKE0ubm9ybWFsTWFwVXYpLHcucHVzaChNLmRpc3BsYWNlbWVudE1hcFV2KSx3LnB1c2goTS5lbWlzc2l2ZU1hcFV2KSx3LnB1c2goTS5tZXRhbG5lc3NNYXBVdiksdy5wdXNoKE0ucm91Z2huZXNzTWFwVXYpLHcucHVzaChNLmFuaXNvdHJvcHlNYXBVdiksdy5wdXNoKE0uY2xlYXJjb2F0TWFwVXYpLHcucHVzaChNLmNsZWFyY29hdE5vcm1hbE1hcFV2KSx3LnB1c2goTS5jbGVhcmNvYXRSb3VnaG5lc3NNYXBVdiksdy5wdXNoKE0uaXJpZGVzY2VuY2VNYXBVdiksdy5wdXNoKE0uaXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdiksdy5wdXNoKE0uc2hlZW5Db2xvck1hcFV2KSx3LnB1c2goTS5zaGVlblJvdWdobmVzc01hcFV2KSx3LnB1c2goTS5zcGVjdWxhck1hcFV2KSx3LnB1c2goTS5zcGVjdWxhckNvbG9yTWFwVXYpLHcucHVzaChNLnNwZWN1bGFySW50ZW5zaXR5TWFwVXYpLHcucHVzaChNLnRyYW5zbWlzc2lvbk1hcFV2KSx3LnB1c2goTS50aGlja25lc3NNYXBVdiksdy5wdXNoKE0uY29tYmluZSksdy5wdXNoKE0uZm9nRXhwMiksdy5wdXNoKE0uc2l6ZUF0dGVudWF0aW9uKSx3LnB1c2goTS5tb3JwaFRhcmdldHNDb3VudCksdy5wdXNoKE0ubW9ycGhBdHRyaWJ1dGVDb3VudCksdy5wdXNoKE0ubnVtRGlyTGlnaHRzKSx3LnB1c2goTS5udW1Qb2ludExpZ2h0cyksdy5wdXNoKE0ubnVtU3BvdExpZ2h0cyksdy5wdXNoKE0ubnVtU3BvdExpZ2h0TWFwcyksdy5wdXNoKE0ubnVtSGVtaUxpZ2h0cyksdy5wdXNoKE0ubnVtUmVjdEFyZWFMaWdodHMpLHcucHVzaChNLm51bURpckxpZ2h0U2hhZG93cyksdy5wdXNoKE0ubnVtUG9pbnRMaWdodFNoYWRvd3MpLHcucHVzaChNLm51bVNwb3RMaWdodFNoYWRvd3MpLHcucHVzaChNLm51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwcyksdy5wdXNoKE0ubnVtTGlnaHRQcm9iZXMpLHcucHVzaChNLnNoYWRvd01hcFR5cGUpLHcucHVzaChNLnRvbmVNYXBwaW5nKSx3LnB1c2goTS5udW1DbGlwcGluZ1BsYW5lcyksdy5wdXNoKE0ubnVtQ2xpcEludGVyc2VjdGlvbiksdy5wdXNoKE0uZGVwdGhQYWNraW5nKX1mdW5jdGlvbiB2KHcsTSl7YS5kaXNhYmxlQWxsKCksTS5zdXBwb3J0c1ZlcnRleFRleHR1cmVzJiZhLmVuYWJsZSgwKSxNLmluc3RhbmNpbmcmJmEuZW5hYmxlKDEpLE0uaW5zdGFuY2luZ0NvbG9yJiZhLmVuYWJsZSgyKSxNLmluc3RhbmNpbmdNb3JwaCYmYS5lbmFibGUoMyksTS5tYXRjYXAmJmEuZW5hYmxlKDQpLE0uZW52TWFwJiZhLmVuYWJsZSg1KSxNLm5vcm1hbE1hcE9iamVjdFNwYWNlJiZhLmVuYWJsZSg2KSxNLm5vcm1hbE1hcFRhbmdlbnRTcGFjZSYmYS5lbmFibGUoNyksTS5jbGVhcmNvYXQmJmEuZW5hYmxlKDgpLE0uaXJpZGVzY2VuY2UmJmEuZW5hYmxlKDkpLE0uYWxwaGFUZXN0JiZhLmVuYWJsZSgxMCksTS52ZXJ0ZXhDb2xvcnMmJmEuZW5hYmxlKDExKSxNLnZlcnRleEFscGhhcyYmYS5lbmFibGUoMTIpLE0udmVydGV4VXYxcyYmYS5lbmFibGUoMTMpLE0udmVydGV4VXYycyYmYS5lbmFibGUoMTQpLE0udmVydGV4VXYzcyYmYS5lbmFibGUoMTUpLE0udmVydGV4VGFuZ2VudHMmJmEuZW5hYmxlKDE2KSxNLmFuaXNvdHJvcHkmJmEuZW5hYmxlKDE3KSxNLmFscGhhSGFzaCYmYS5lbmFibGUoMTgpLE0uYmF0Y2hpbmcmJmEuZW5hYmxlKDE5KSxNLmRpc3BlcnNpb24mJmEuZW5hYmxlKDIwKSxNLmJhdGNoaW5nQ29sb3ImJmEuZW5hYmxlKDIxKSx3LnB1c2goYS5tYXNrKSxhLmRpc2FibGVBbGwoKSxNLmZvZyYmYS5lbmFibGUoMCksTS51c2VGb2cmJmEuZW5hYmxlKDEpLE0uZmxhdFNoYWRpbmcmJmEuZW5hYmxlKDIpLE0ubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmYS5lbmFibGUoMyksTS5za2lubmluZyYmYS5lbmFibGUoNCksTS5tb3JwaFRhcmdldHMmJmEuZW5hYmxlKDUpLE0ubW9ycGhOb3JtYWxzJiZhLmVuYWJsZSg2KSxNLm1vcnBoQ29sb3JzJiZhLmVuYWJsZSg3KSxNLnByZW11bHRpcGxpZWRBbHBoYSYmYS5lbmFibGUoOCksTS5zaGFkb3dNYXBFbmFibGVkJiZhLmVuYWJsZSg5KSxNLmRvdWJsZVNpZGVkJiZhLmVuYWJsZSgxMCksTS5mbGlwU2lkZWQmJmEuZW5hYmxlKDExKSxNLnVzZURlcHRoUGFja2luZyYmYS5lbmFibGUoMTIpLE0uZGl0aGVyaW5nJiZhLmVuYWJsZSgxMyksTS50cmFuc21pc3Npb24mJmEuZW5hYmxlKDE0KSxNLnNoZWVuJiZhLmVuYWJsZSgxNSksTS5vcGFxdWUmJmEuZW5hYmxlKDE2KSxNLnBvaW50c1V2cyYmYS5lbmFibGUoMTcpLE0uZGVjb2RlVmlkZW9UZXh0dXJlJiZhLmVuYWJsZSgxOCksTS5hbHBoYVRvQ292ZXJhZ2UmJmEuZW5hYmxlKDE5KSx3LnB1c2goYS5tYXNrKX1mdW5jdGlvbiBfKHcpe2NvbnN0IE09cFt3LnR5cGVdO2xldCBBO2lmKE0pe2NvbnN0IEY9Vm5bTV07QT1QZy5jbG9uZShGLnVuaWZvcm1zKX1lbHNlIEE9dy51bmlmb3JtcztyZXR1cm4gQX1mdW5jdGlvbiBFKHcsTSl7bGV0IEE7Zm9yKGxldCBGPTAsRD11Lmxlbmd0aDtGPEQ7RisrKXtjb25zdCBOPXVbRl07aWYoTi5jYWNoZUtleT09PU0pe0E9TiwrK0EudXNlZFRpbWVzO2JyZWFrfX1yZXR1cm4gQT09PXZvaWQgMCYmKEE9bmV3IFRFKGksTSx3LHMpLHUucHVzaChBKSksQX1mdW5jdGlvbiBiKHcpe2lmKC0tdy51c2VkVGltZXM9PT0wKXtjb25zdCBNPXUuaW5kZXhPZih3KTt1W01dPXVbdS5sZW5ndGgtMV0sdS5wb3AoKSx3LmRlc3Ryb3koKX19ZnVuY3Rpb24gVCh3KXtsLnJlbW92ZSh3KX1mdW5jdGlvbiBQKCl7bC5kaXNwb3NlKCl9cmV0dXJue2dldFBhcmFtZXRlcnM6bSxnZXRQcm9ncmFtQ2FjaGVLZXk6ZyxnZXRVbmlmb3JtczpfLGFjcXVpcmVQcm9ncmFtOkUscmVsZWFzZVByb2dyYW06YixyZWxlYXNlU2hhZGVyQ2FjaGU6VCxwcm9ncmFtczp1LGRpc3Bvc2U6UH19ZnVuY3Rpb24gTEUoKXtsZXQgaT1uZXcgV2Vha01hcDtmdW5jdGlvbiB0KG8pe3JldHVybiBpLmhhcyhvKX1mdW5jdGlvbiBlKG8pe2xldCBhPWkuZ2V0KG8pO3JldHVybiBhPT09dm9pZCAwJiYoYT17fSxpLnNldChvLGEpKSxhfWZ1bmN0aW9uIG4obyl7aS5kZWxldGUobyl9ZnVuY3Rpb24gcihvLGEsbCl7aS5nZXQobylbYV09bH1mdW5jdGlvbiBzKCl7aT1uZXcgV2Vha01hcH1yZXR1cm57aGFzOnQsZ2V0OmUscmVtb3ZlOm4sdXBkYXRlOnIsZGlzcG9zZTpzfX1mdW5jdGlvbiBERShpLHQpe3JldHVybiBpLmdyb3VwT3JkZXIhPT10Lmdyb3VwT3JkZXI/aS5ncm91cE9yZGVyLXQuZ3JvdXBPcmRlcjppLnJlbmRlck9yZGVyIT09dC5yZW5kZXJPcmRlcj9pLnJlbmRlck9yZGVyLXQucmVuZGVyT3JkZXI6aS5tYXRlcmlhbC5pZCE9PXQubWF0ZXJpYWwuaWQ/aS5tYXRlcmlhbC5pZC10Lm1hdGVyaWFsLmlkOmkueiE9PXQuej9pLnotdC56OmkuaWQtdC5pZH1mdW5jdGlvbiBzMChpLHQpe3JldHVybiBpLmdyb3VwT3JkZXIhPT10Lmdyb3VwT3JkZXI/aS5ncm91cE9yZGVyLXQuZ3JvdXBPcmRlcjppLnJlbmRlck9yZGVyIT09dC5yZW5kZXJPcmRlcj9pLnJlbmRlck9yZGVyLXQucmVuZGVyT3JkZXI6aS56IT09dC56P3Quei1pLno6aS5pZC10LmlkfWZ1bmN0aW9uIG8wKCl7Y29uc3QgaT1bXTtsZXQgdD0wO2NvbnN0IGU9W10sbj1bXSxyPVtdO2Z1bmN0aW9uIHMoKXt0PTAsZS5sZW5ndGg9MCxuLmxlbmd0aD0wLHIubGVuZ3RoPTB9ZnVuY3Rpb24gbyhoLGYsZCxwLHksbSl7bGV0IGc9aVt0XTtyZXR1cm4gZz09PXZvaWQgMD8oZz17aWQ6aC5pZCxvYmplY3Q6aCxnZW9tZXRyeTpmLG1hdGVyaWFsOmQsZ3JvdXBPcmRlcjpwLHJlbmRlck9yZGVyOmgucmVuZGVyT3JkZXIsejp5LGdyb3VwOm19LGlbdF09Zyk6KGcuaWQ9aC5pZCxnLm9iamVjdD1oLGcuZ2VvbWV0cnk9ZixnLm1hdGVyaWFsPWQsZy5ncm91cE9yZGVyPXAsZy5yZW5kZXJPcmRlcj1oLnJlbmRlck9yZGVyLGcuej15LGcuZ3JvdXA9bSksdCsrLGd9ZnVuY3Rpb24gYShoLGYsZCxwLHksbSl7Y29uc3QgZz1vKGgsZixkLHAseSxtKTtkLnRyYW5zbWlzc2lvbj4wP24ucHVzaChnKTpkLnRyYW5zcGFyZW50PT09ITA/ci5wdXNoKGcpOmUucHVzaChnKX1mdW5jdGlvbiBsKGgsZixkLHAseSxtKXtjb25zdCBnPW8oaCxmLGQscCx5LG0pO2QudHJhbnNtaXNzaW9uPjA/bi51bnNoaWZ0KGcpOmQudHJhbnNwYXJlbnQ9PT0hMD9yLnVuc2hpZnQoZyk6ZS51bnNoaWZ0KGcpfWZ1bmN0aW9uIGMoaCxmKXtlLmxlbmd0aD4xJiZlLnNvcnQoaHx8REUpLG4ubGVuZ3RoPjEmJm4uc29ydChmfHxzMCksci5sZW5ndGg+MSYmci5zb3J0KGZ8fHMwKX1mdW5jdGlvbiB1KCl7Zm9yKGxldCBoPXQsZj1pLmxlbmd0aDtoPGY7aCsrKXtjb25zdCBkPWlbaF07aWYoZC5pZD09PW51bGwpYnJlYWs7ZC5pZD1udWxsLGQub2JqZWN0PW51bGwsZC5nZW9tZXRyeT1udWxsLGQubWF0ZXJpYWw9bnVsbCxkLmdyb3VwPW51bGx9fXJldHVybntvcGFxdWU6ZSx0cmFuc21pc3NpdmU6bix0cmFuc3BhcmVudDpyLGluaXQ6cyxwdXNoOmEsdW5zaGlmdDpsLGZpbmlzaDp1LHNvcnQ6Y319ZnVuY3Rpb24gVUUoKXtsZXQgaT1uZXcgV2Vha01hcDtmdW5jdGlvbiB0KG4scil7Y29uc3Qgcz1pLmdldChuKTtsZXQgbztyZXR1cm4gcz09PXZvaWQgMD8obz1uZXcgbzAsaS5zZXQobixbb10pKTpyPj1zLmxlbmd0aD8obz1uZXcgbzAscy5wdXNoKG8pKTpvPXNbcl0sb31mdW5jdGlvbiBlKCl7aT1uZXcgV2Vha01hcH1yZXR1cm57Z2V0OnQsZGlzcG9zZTplfX1mdW5jdGlvbiBORSgpe2NvbnN0IGk9e307cmV0dXJue2dldDpmdW5jdGlvbih0KXtpZihpW3QuaWRdIT09dm9pZCAwKXJldHVybiBpW3QuaWRdO2xldCBlO3N3aXRjaCh0LnR5cGUpe2Nhc2UiRGlyZWN0aW9uYWxMaWdodCI6ZT17ZGlyZWN0aW9uOm5ldyBMLGNvbG9yOm5ldyB2dH07YnJlYWs7Y2FzZSJTcG90TGlnaHQiOmU9e3Bvc2l0aW9uOm5ldyBMLGRpcmVjdGlvbjpuZXcgTCxjb2xvcjpuZXcgdnQsZGlzdGFuY2U6MCxjb25lQ29zOjAscGVudW1icmFDb3M6MCxkZWNheTowfTticmVhaztjYXNlIlBvaW50TGlnaHQiOmU9e3Bvc2l0aW9uOm5ldyBMLGNvbG9yOm5ldyB2dCxkaXN0YW5jZTowLGRlY2F5OjB9O2JyZWFrO2Nhc2UiSGVtaXNwaGVyZUxpZ2h0IjplPXtkaXJlY3Rpb246bmV3IEwsc2t5Q29sb3I6bmV3IHZ0LGdyb3VuZENvbG9yOm5ldyB2dH07YnJlYWs7Y2FzZSJSZWN0QXJlYUxpZ2h0IjplPXtjb2xvcjpuZXcgdnQscG9zaXRpb246bmV3IEwsaGFsZldpZHRoOm5ldyBMLGhhbGZIZWlnaHQ6bmV3IEx9O2JyZWFrfXJldHVybiBpW3QuaWRdPWUsZX19fWZ1bmN0aW9uIEZFKCl7Y29uc3QgaT17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKHQpe2lmKGlbdC5pZF0hPT12b2lkIDApcmV0dXJuIGlbdC5pZF07bGV0IGU7c3dpdGNoKHQudHlwZSl7Y2FzZSJEaXJlY3Rpb25hbExpZ2h0IjplPXtzaGFkb3dJbnRlbnNpdHk6MSxzaGFkb3dCaWFzOjAsc2hhZG93Tm9ybWFsQmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IHF9O2JyZWFrO2Nhc2UiU3BvdExpZ2h0IjplPXtzaGFkb3dJbnRlbnNpdHk6MSxzaGFkb3dCaWFzOjAsc2hhZG93Tm9ybWFsQmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IHF9O2JyZWFrO2Nhc2UiUG9pbnRMaWdodCI6ZT17c2hhZG93SW50ZW5zaXR5OjEsc2hhZG93QmlhczowLHNoYWRvd05vcm1hbEJpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBxLHNoYWRvd0NhbWVyYU5lYXI6MSxzaGFkb3dDYW1lcmFGYXI6MWUzfTticmVha31yZXR1cm4gaVt0LmlkXT1lLGV9fX1sZXQgT0U9MDtmdW5jdGlvbiBCRShpLHQpe3JldHVybih0LmNhc3RTaGFkb3c/MjowKS0oaS5jYXN0U2hhZG93PzI6MCkrKHQubWFwPzE6MCktKGkubWFwPzE6MCl9ZnVuY3Rpb24gekUoaSl7Y29uc3QgdD1uZXcgTkUsZT1GRSgpLG49e3ZlcnNpb246MCxoYXNoOntkaXJlY3Rpb25hbExlbmd0aDotMSxwb2ludExlbmd0aDotMSxzcG90TGVuZ3RoOi0xLHJlY3RBcmVhTGVuZ3RoOi0xLGhlbWlMZW5ndGg6LTEsbnVtRGlyZWN0aW9uYWxTaGFkb3dzOi0xLG51bVBvaW50U2hhZG93czotMSxudW1TcG90U2hhZG93czotMSxudW1TcG90TWFwczotMSxudW1MaWdodFByb2JlczotMX0sYW1iaWVudDpbMCwwLDBdLHByb2JlOltdLGRpcmVjdGlvbmFsOltdLGRpcmVjdGlvbmFsU2hhZG93OltdLGRpcmVjdGlvbmFsU2hhZG93TWFwOltdLGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OltdLHNwb3Q6W10sc3BvdExpZ2h0TWFwOltdLHNwb3RTaGFkb3c6W10sc3BvdFNoYWRvd01hcDpbXSxzcG90TGlnaHRNYXRyaXg6W10scmVjdEFyZWE6W10scmVjdEFyZWFMVEMxOm51bGwscmVjdEFyZWFMVEMyOm51bGwscG9pbnQ6W10scG9pbnRTaGFkb3c6W10scG9pbnRTaGFkb3dNYXA6W10scG9pbnRTaGFkb3dNYXRyaXg6W10saGVtaTpbXSxudW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHM6MCxudW1MaWdodFByb2JlczowfTtmb3IobGV0IGM9MDtjPDk7YysrKW4ucHJvYmUucHVzaChuZXcgTCk7Y29uc3Qgcj1uZXcgTCxzPW5ldyBMdCxvPW5ldyBMdDtmdW5jdGlvbiBhKGMpe2xldCB1PTAsaD0wLGY9MDtmb3IobGV0IHc9MDt3PDk7dysrKW4ucHJvYmVbd10uc2V0KDAsMCwwKTtsZXQgZD0wLHA9MCx5PTAsbT0wLGc9MCx4PTAsdj0wLF89MCxFPTAsYj0wLFQ9MDtjLnNvcnQoQkUpO2ZvcihsZXQgdz0wLE09Yy5sZW5ndGg7dzxNO3crKyl7Y29uc3QgQT1jW3ddLEY9QS5jb2xvcixEPUEuaW50ZW5zaXR5LE49QS5kaXN0YW5jZSxVPUEuc2hhZG93JiZBLnNoYWRvdy5tYXA/QS5zaGFkb3cubWFwLnRleHR1cmU6bnVsbDtpZihBLmlzQW1iaWVudExpZ2h0KXUrPUYucipELGgrPUYuZypELGYrPUYuYipEO2Vsc2UgaWYoQS5pc0xpZ2h0UHJvYmUpe2ZvcihsZXQgQj0wO0I8OTtCKyspbi5wcm9iZVtCXS5hZGRTY2FsZWRWZWN0b3IoQS5zaC5jb2VmZmljaWVudHNbQl0sRCk7VCsrfWVsc2UgaWYoQS5pc0RpcmVjdGlvbmFsTGlnaHQpe2NvbnN0IEI9dC5nZXQoQSk7aWYoQi5jb2xvci5jb3B5KEEuY29sb3IpLm11bHRpcGx5U2NhbGFyKEEuaW50ZW5zaXR5KSxBLmNhc3RTaGFkb3cpe2NvbnN0IEg9QS5zaGFkb3csRz1lLmdldChBKTtHLnNoYWRvd0ludGVuc2l0eT1ILmludGVuc2l0eSxHLnNoYWRvd0JpYXM9SC5iaWFzLEcuc2hhZG93Tm9ybWFsQmlhcz1ILm5vcm1hbEJpYXMsRy5zaGFkb3dSYWRpdXM9SC5yYWRpdXMsRy5zaGFkb3dNYXBTaXplPUgubWFwU2l6ZSxuLmRpcmVjdGlvbmFsU2hhZG93W2RdPUcsbi5kaXJlY3Rpb25hbFNoYWRvd01hcFtkXT1VLG4uZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbZF09QS5zaGFkb3cubWF0cml4LHgrK31uLmRpcmVjdGlvbmFsW2RdPUIsZCsrfWVsc2UgaWYoQS5pc1Nwb3RMaWdodCl7Y29uc3QgQj10LmdldChBKTtCLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihBLm1hdHJpeFdvcmxkKSxCLmNvbG9yLmNvcHkoRikubXVsdGlwbHlTY2FsYXIoRCksQi5kaXN0YW5jZT1OLEIuY29uZUNvcz1NYXRoLmNvcyhBLmFuZ2xlKSxCLnBlbnVtYnJhQ29zPU1hdGguY29zKEEuYW5nbGUqKDEtQS5wZW51bWJyYSkpLEIuZGVjYXk9QS5kZWNheSxuLnNwb3RbeV09Qjtjb25zdCBIPUEuc2hhZG93O2lmKEEubWFwJiYobi5zcG90TGlnaHRNYXBbRV09QS5tYXAsRSsrLEgudXBkYXRlTWF0cmljZXMoQSksQS5jYXN0U2hhZG93JiZiKyspLG4uc3BvdExpZ2h0TWF0cml4W3ldPUgubWF0cml4LEEuY2FzdFNoYWRvdyl7Y29uc3QgRz1lLmdldChBKTtHLnNoYWRvd0ludGVuc2l0eT1ILmludGVuc2l0eSxHLnNoYWRvd0JpYXM9SC5iaWFzLEcuc2hhZG93Tm9ybWFsQmlhcz1ILm5vcm1hbEJpYXMsRy5zaGFkb3dSYWRpdXM9SC5yYWRpdXMsRy5zaGFkb3dNYXBTaXplPUgubWFwU2l6ZSxuLnNwb3RTaGFkb3dbeV09RyxuLnNwb3RTaGFkb3dNYXBbeV09VSxfKyt9eSsrfWVsc2UgaWYoQS5pc1JlY3RBcmVhTGlnaHQpe2NvbnN0IEI9dC5nZXQoQSk7Qi5jb2xvci5jb3B5KEYpLm11bHRpcGx5U2NhbGFyKEQpLEIuaGFsZldpZHRoLnNldChBLndpZHRoKi41LDAsMCksQi5oYWxmSGVpZ2h0LnNldCgwLEEuaGVpZ2h0Ki41LDApLG4ucmVjdEFyZWFbbV09QixtKyt9ZWxzZSBpZihBLmlzUG9pbnRMaWdodCl7Y29uc3QgQj10LmdldChBKTtpZihCLmNvbG9yLmNvcHkoQS5jb2xvcikubXVsdGlwbHlTY2FsYXIoQS5pbnRlbnNpdHkpLEIuZGlzdGFuY2U9QS5kaXN0YW5jZSxCLmRlY2F5PUEuZGVjYXksQS5jYXN0U2hhZG93KXtjb25zdCBIPUEuc2hhZG93LEc9ZS5nZXQoQSk7Ry5zaGFkb3dJbnRlbnNpdHk9SC5pbnRlbnNpdHksRy5zaGFkb3dCaWFzPUguYmlhcyxHLnNoYWRvd05vcm1hbEJpYXM9SC5ub3JtYWxCaWFzLEcuc2hhZG93UmFkaXVzPUgucmFkaXVzLEcuc2hhZG93TWFwU2l6ZT1ILm1hcFNpemUsRy5zaGFkb3dDYW1lcmFOZWFyPUguY2FtZXJhLm5lYXIsRy5zaGFkb3dDYW1lcmFGYXI9SC5jYW1lcmEuZmFyLG4ucG9pbnRTaGFkb3dbcF09RyxuLnBvaW50U2hhZG93TWFwW3BdPVUsbi5wb2ludFNoYWRvd01hdHJpeFtwXT1BLnNoYWRvdy5tYXRyaXgsdisrfW4ucG9pbnRbcF09QixwKyt9ZWxzZSBpZihBLmlzSGVtaXNwaGVyZUxpZ2h0KXtjb25zdCBCPXQuZ2V0KEEpO0Iuc2t5Q29sb3IuY29weShBLmNvbG9yKS5tdWx0aXBseVNjYWxhcihEKSxCLmdyb3VuZENvbG9yLmNvcHkoQS5ncm91bmRDb2xvcikubXVsdGlwbHlTY2FsYXIoRCksbi5oZW1pW2ddPUIsZysrfX1tPjAmJihpLmhhcygiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik9PT0hMD8obi5yZWN0QXJlYUxUQzE9ZHQuTFRDX0ZMT0FUXzEsbi5yZWN0QXJlYUxUQzI9ZHQuTFRDX0ZMT0FUXzIpOihuLnJlY3RBcmVhTFRDMT1kdC5MVENfSEFMRl8xLG4ucmVjdEFyZWFMVEMyPWR0LkxUQ19IQUxGXzIpKSxuLmFtYmllbnRbMF09dSxuLmFtYmllbnRbMV09aCxuLmFtYmllbnRbMl09Zjtjb25zdCBQPW4uaGFzaDsoUC5kaXJlY3Rpb25hbExlbmd0aCE9PWR8fFAucG9pbnRMZW5ndGghPT1wfHxQLnNwb3RMZW5ndGghPT15fHxQLnJlY3RBcmVhTGVuZ3RoIT09bXx8UC5oZW1pTGVuZ3RoIT09Z3x8UC5udW1EaXJlY3Rpb25hbFNoYWRvd3MhPT14fHxQLm51bVBvaW50U2hhZG93cyE9PXZ8fFAubnVtU3BvdFNoYWRvd3MhPT1ffHxQLm51bVNwb3RNYXBzIT09RXx8UC5udW1MaWdodFByb2JlcyE9PVQpJiYobi5kaXJlY3Rpb25hbC5sZW5ndGg9ZCxuLnNwb3QubGVuZ3RoPXksbi5yZWN0QXJlYS5sZW5ndGg9bSxuLnBvaW50Lmxlbmd0aD1wLG4uaGVtaS5sZW5ndGg9ZyxuLmRpcmVjdGlvbmFsU2hhZG93Lmxlbmd0aD14LG4uZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoPXgsbi5wb2ludFNoYWRvdy5sZW5ndGg9dixuLnBvaW50U2hhZG93TWFwLmxlbmd0aD12LG4uc3BvdFNoYWRvdy5sZW5ndGg9XyxuLnNwb3RTaGFkb3dNYXAubGVuZ3RoPV8sbi5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGg9eCxuLnBvaW50U2hhZG93TWF0cml4Lmxlbmd0aD12LG4uc3BvdExpZ2h0TWF0cml4Lmxlbmd0aD1fK0UtYixuLnNwb3RMaWdodE1hcC5sZW5ndGg9RSxuLm51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwcz1iLG4ubnVtTGlnaHRQcm9iZXM9VCxQLmRpcmVjdGlvbmFsTGVuZ3RoPWQsUC5wb2ludExlbmd0aD1wLFAuc3BvdExlbmd0aD15LFAucmVjdEFyZWFMZW5ndGg9bSxQLmhlbWlMZW5ndGg9ZyxQLm51bURpcmVjdGlvbmFsU2hhZG93cz14LFAubnVtUG9pbnRTaGFkb3dzPXYsUC5udW1TcG90U2hhZG93cz1fLFAubnVtU3BvdE1hcHM9RSxQLm51bUxpZ2h0UHJvYmVzPVQsbi52ZXJzaW9uPU9FKyspfWZ1bmN0aW9uIGwoYyx1KXtsZXQgaD0wLGY9MCxkPTAscD0wLHk9MDtjb25zdCBtPXUubWF0cml4V29ybGRJbnZlcnNlO2ZvcihsZXQgZz0wLHg9Yy5sZW5ndGg7Zzx4O2crKyl7Y29uc3Qgdj1jW2ddO2lmKHYuaXNEaXJlY3Rpb25hbExpZ2h0KXtjb25zdCBfPW4uZGlyZWN0aW9uYWxbaF07Xy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHYubWF0cml4V29ybGQpLHIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHYudGFyZ2V0Lm1hdHJpeFdvcmxkKSxfLmRpcmVjdGlvbi5zdWIociksXy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKG0pLGgrK31lbHNlIGlmKHYuaXNTcG90TGlnaHQpe2NvbnN0IF89bi5zcG90W2RdO18ucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHYubWF0cml4V29ybGQpLF8ucG9zaXRpb24uYXBwbHlNYXRyaXg0KG0pLF8uZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbih2Lm1hdHJpeFdvcmxkKSxyLnNldEZyb21NYXRyaXhQb3NpdGlvbih2LnRhcmdldC5tYXRyaXhXb3JsZCksXy5kaXJlY3Rpb24uc3ViKHIpLF8uZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihtKSxkKyt9ZWxzZSBpZih2LmlzUmVjdEFyZWFMaWdodCl7Y29uc3QgXz1uLnJlY3RBcmVhW3BdO18ucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHYubWF0cml4V29ybGQpLF8ucG9zaXRpb24uYXBwbHlNYXRyaXg0KG0pLG8uaWRlbnRpdHkoKSxzLmNvcHkodi5tYXRyaXhXb3JsZCkscy5wcmVtdWx0aXBseShtKSxvLmV4dHJhY3RSb3RhdGlvbihzKSxfLmhhbGZXaWR0aC5zZXQodi53aWR0aCouNSwwLDApLF8uaGFsZkhlaWdodC5zZXQoMCx2LmhlaWdodCouNSwwKSxfLmhhbGZXaWR0aC5hcHBseU1hdHJpeDQobyksXy5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NChvKSxwKyt9ZWxzZSBpZih2LmlzUG9pbnRMaWdodCl7Y29uc3QgXz1uLnBvaW50W2ZdO18ucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHYubWF0cml4V29ybGQpLF8ucG9zaXRpb24uYXBwbHlNYXRyaXg0KG0pLGYrK31lbHNlIGlmKHYuaXNIZW1pc3BoZXJlTGlnaHQpe2NvbnN0IF89bi5oZW1pW3ldO18uZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbih2Lm1hdHJpeFdvcmxkKSxfLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24obSkseSsrfX19cmV0dXJue3NldHVwOmEsc2V0dXBWaWV3Omwsc3RhdGU6bn19ZnVuY3Rpb24gYTAoaSl7Y29uc3QgdD1uZXcgekUoaSksZT1bXSxuPVtdO2Z1bmN0aW9uIHIodSl7Yy5jYW1lcmE9dSxlLmxlbmd0aD0wLG4ubGVuZ3RoPTB9ZnVuY3Rpb24gcyh1KXtlLnB1c2godSl9ZnVuY3Rpb24gbyh1KXtuLnB1c2godSl9ZnVuY3Rpb24gYSgpe3Quc2V0dXAoZSl9ZnVuY3Rpb24gbCh1KXt0LnNldHVwVmlldyhlLHUpfWNvbnN0IGM9e2xpZ2h0c0FycmF5OmUsc2hhZG93c0FycmF5Om4sY2FtZXJhOm51bGwsbGlnaHRzOnQsdHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0Ont9fTtyZXR1cm57aW5pdDpyLHN0YXRlOmMsc2V0dXBMaWdodHM6YSxzZXR1cExpZ2h0c1ZpZXc6bCxwdXNoTGlnaHQ6cyxwdXNoU2hhZG93Om99fWZ1bmN0aW9uIGtFKGkpe2xldCB0PW5ldyBXZWFrTWFwO2Z1bmN0aW9uIGUocixzPTApe2NvbnN0IG89dC5nZXQocik7bGV0IGE7cmV0dXJuIG89PT12b2lkIDA/KGE9bmV3IGEwKGkpLHQuc2V0KHIsW2FdKSk6cz49by5sZW5ndGg/KGE9bmV3IGEwKGkpLG8ucHVzaChhKSk6YT1vW3NdLGF9ZnVuY3Rpb24gbigpe3Q9bmV3IFdlYWtNYXB9cmV0dXJue2dldDplLGRpc3Bvc2U6bn19Y2xhc3MgY2YgZXh0ZW5kcyBYZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoRGVwdGhNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hEZXB0aE1hdGVyaWFsIix0aGlzLmRlcHRoUGFja2luZz1KbSx0aGlzLm1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5kZXB0aFBhY2tpbmc9dC5kZXB0aFBhY2tpbmcsdGhpcy5tYXA9dC5tYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXN9fWNsYXNzIHVmIGV4dGVuZHMgWGV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJNZXNoRGlzdGFuY2VNYXRlcmlhbCIsdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLm1hcD10Lm1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpc319Y29uc3QgR0U9YHZvaWQgbWFpbigpIHsKCWdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApOwp9YCxWRT1gdW5pZm9ybSBzYW1wbGVyMkQgc2hhZG93X3Bhc3M7CnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uOwp1bmlmb3JtIGZsb2F0IHJhZGl1czsKI2luY2x1ZGUgPHBhY2tpbmc+CnZvaWQgbWFpbigpIHsKCWNvbnN0IGZsb2F0IHNhbXBsZXMgPSBmbG9hdCggVlNNX1NBTVBMRVMgKTsKCWZsb2F0IG1lYW4gPSAwLjA7CglmbG9hdCBzcXVhcmVkX21lYW4gPSAwLjA7CglmbG9hdCB1dlN0cmlkZSA9IHNhbXBsZXMgPD0gMS4wID8gMC4wIDogMi4wIC8gKCBzYW1wbGVzIC0gMS4wICk7CglmbG9hdCB1dlN0YXJ0ID0gc2FtcGxlcyA8PSAxLjAgPyAwLjAgOiAtIDEuMDsKCWZvciAoIGZsb2F0IGkgPSAwLjA7IGkgPCBzYW1wbGVzOyBpICsrICkgewoJCWZsb2F0IHV2T2Zmc2V0ID0gdXZTdGFydCArIGkgKiB1dlN0cmlkZTsKCQkjaWZkZWYgSE9SSVpPTlRBTF9QQVNTCgkJCXZlYzIgZGlzdHJpYnV0aW9uID0gdW5wYWNrUkdCQVRvMkhhbGYoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggdXZPZmZzZXQsIDAuMCApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTsKCQkJbWVhbiArPSBkaXN0cmlidXRpb24ueDsKCQkJc3F1YXJlZF9tZWFuICs9IGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54OwoJCSNlbHNlCgkJCWZsb2F0IGRlcHRoID0gdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggMC4wLCB1dk9mZnNldCApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTsKCQkJbWVhbiArPSBkZXB0aDsKCQkJc3F1YXJlZF9tZWFuICs9IGRlcHRoICogZGVwdGg7CgkJI2VuZGlmCgl9CgltZWFuID0gbWVhbiAvIHNhbXBsZXM7CglzcXVhcmVkX21lYW4gPSBzcXVhcmVkX21lYW4gLyBzYW1wbGVzOwoJZmxvYXQgc3RkX2RldiA9IHNxcnQoIHNxdWFyZWRfbWVhbiAtIG1lYW4gKiBtZWFuICk7CglnbF9GcmFnQ29sb3IgPSBwYWNrMkhhbGZUb1JHQkEoIHZlYzIoIG1lYW4sIHN0ZF9kZXYgKSApOwp9YDtmdW5jdGlvbiBIRShpLHQsZSl7bGV0IG49bmV3IEJvO2NvbnN0IHI9bmV3IHEscz1uZXcgcSxvPW5ldyBvZSxhPW5ldyBjZih7ZGVwdGhQYWNraW5nOkttfSksbD1uZXcgdWYsYz17fSx1PWUubWF4VGV4dHVyZVNpemUsaD17W2hpXTpLZSxbS2VdOmhpLFtLbl06S259LGY9bmV3IEduKHtkZWZpbmVzOntWU01fU0FNUExFUzo4fSx1bmlmb3Jtczp7c2hhZG93X3Bhc3M6e3ZhbHVlOm51bGx9LHJlc29sdXRpb246e3ZhbHVlOm5ldyBxfSxyYWRpdXM6e3ZhbHVlOjR9fSx2ZXJ0ZXhTaGFkZXI6R0UsZnJhZ21lbnRTaGFkZXI6VkV9KSxkPWYuY2xvbmUoKTtkLmRlZmluZXMuSE9SSVpPTlRBTF9QQVNTPTE7Y29uc3QgcD1uZXcgTnQ7cC5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgWnQobmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLjUsMywtMSwuNSwtMSwzLC41XSksMykpO2NvbnN0IHk9bmV3IEllKHAsZiksbT10aGlzO3RoaXMuZW5hYmxlZD0hMSx0aGlzLmF1dG9VcGRhdGU9ITAsdGhpcy5uZWVkc1VwZGF0ZT0hMSx0aGlzLnR5cGU9bG47bGV0IGc9dGhpcy50eXBlO3RoaXMucmVuZGVyPWZ1bmN0aW9uKGIsVCxQKXtpZihtLmVuYWJsZWQ9PT0hMXx8bS5hdXRvVXBkYXRlPT09ITEmJm0ubmVlZHNVcGRhdGU9PT0hMXx8Yi5sZW5ndGg9PT0wKXJldHVybjtjb25zdCB3PWkuZ2V0UmVuZGVyVGFyZ2V0KCksTT1pLmdldEFjdGl2ZUN1YmVGYWNlKCksQT1pLmdldEFjdGl2ZU1pcG1hcExldmVsKCksRj1pLnN0YXRlO0Yuc2V0QmxlbmRpbmcoZmkpLEYuYnVmZmVycy5jb2xvci5zZXRDbGVhcigxLDEsMSwxKSxGLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCksRi5zZXRTY2lzc29yVGVzdCghMSk7Y29uc3QgRD1nIT09Sm4mJnRoaXMudHlwZT09PUpuLE49Zz09PUpuJiZ0aGlzLnR5cGUhPT1Kbjtmb3IobGV0IFU9MCxCPWIubGVuZ3RoO1U8QjtVKyspe2NvbnN0IEg9YltVXSxHPUguc2hhZG93O2lmKEc9PT12b2lkIDApe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6IixILCJoYXMgbm8gc2hhZG93LiIpO2NvbnRpbnVlfWlmKEcuYXV0b1VwZGF0ZT09PSExJiZHLm5lZWRzVXBkYXRlPT09ITEpY29udGludWU7ci5jb3B5KEcubWFwU2l6ZSk7Y29uc3QgdHQ9Ry5nZXRGcmFtZUV4dGVudHMoKTtpZihyLm11bHRpcGx5KHR0KSxzLmNvcHkoRy5tYXBTaXplKSwoci54PnV8fHIueT51KSYmKHIueD51JiYocy54PU1hdGguZmxvb3IodS90dC54KSxyLng9cy54KnR0LngsRy5tYXBTaXplLng9cy54KSxyLnk+dSYmKHMueT1NYXRoLmZsb29yKHUvdHQueSksci55PXMueSp0dC55LEcubWFwU2l6ZS55PXMueSkpLEcubWFwPT09bnVsbHx8RD09PSEwfHxOPT09ITApe2NvbnN0IGh0PXRoaXMudHlwZSE9PUpuP3ttaW5GaWx0ZXI6RmUsbWFnRmlsdGVyOkZlfTp7fTtHLm1hcCE9PW51bGwmJkcubWFwLmRpc3Bvc2UoKSxHLm1hcD1uZXcgT24oci54LHIueSxodCksRy5tYXAudGV4dHVyZS5uYW1lPUgubmFtZSsiLnNoYWRvd01hcCIsRy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWkuc2V0UmVuZGVyVGFyZ2V0KEcubWFwKSxpLmNsZWFyKCk7Y29uc3QgbHQ9Ry5nZXRWaWV3cG9ydENvdW50KCk7Zm9yKGxldCBodD0wO2h0PGx0O2h0Kyspe2NvbnN0IFJ0PUcuZ2V0Vmlld3BvcnQoaHQpO28uc2V0KHMueCpSdC54LHMueSpSdC55LHMueCpSdC56LHMueSpSdC53KSxGLnZpZXdwb3J0KG8pLEcudXBkYXRlTWF0cmljZXMoSCxodCksbj1HLmdldEZydXN0dW0oKSxfKFQsUCxHLmNhbWVyYSxILHRoaXMudHlwZSl9Ry5pc1BvaW50TGlnaHRTaGFkb3chPT0hMCYmdGhpcy50eXBlPT09Sm4mJngoRyxQKSxHLm5lZWRzVXBkYXRlPSExfWc9dGhpcy50eXBlLG0ubmVlZHNVcGRhdGU9ITEsaS5zZXRSZW5kZXJUYXJnZXQodyxNLEEpfTtmdW5jdGlvbiB4KGIsVCl7Y29uc3QgUD10LnVwZGF0ZSh5KTtmLmRlZmluZXMuVlNNX1NBTVBMRVMhPT1iLmJsdXJTYW1wbGVzJiYoZi5kZWZpbmVzLlZTTV9TQU1QTEVTPWIuYmx1clNhbXBsZXMsZC5kZWZpbmVzLlZTTV9TQU1QTEVTPWIuYmx1clNhbXBsZXMsZi5uZWVkc1VwZGF0ZT0hMCxkLm5lZWRzVXBkYXRlPSEwKSxiLm1hcFBhc3M9PT1udWxsJiYoYi5tYXBQYXNzPW5ldyBPbihyLngsci55KSksZi51bmlmb3Jtcy5zaGFkb3dfcGFzcy52YWx1ZT1iLm1hcC50ZXh0dXJlLGYudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT1iLm1hcFNpemUsZi51bmlmb3Jtcy5yYWRpdXMudmFsdWU9Yi5yYWRpdXMsaS5zZXRSZW5kZXJUYXJnZXQoYi5tYXBQYXNzKSxpLmNsZWFyKCksaS5yZW5kZXJCdWZmZXJEaXJlY3QoVCxudWxsLFAsZix5LG51bGwpLGQudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWU9Yi5tYXBQYXNzLnRleHR1cmUsZC51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlPWIubWFwU2l6ZSxkLnVuaWZvcm1zLnJhZGl1cy52YWx1ZT1iLnJhZGl1cyxpLnNldFJlbmRlclRhcmdldChiLm1hcCksaS5jbGVhcigpLGkucmVuZGVyQnVmZmVyRGlyZWN0KFQsbnVsbCxQLGQseSxudWxsKX1mdW5jdGlvbiB2KGIsVCxQLHcpe2xldCBNPW51bGw7Y29uc3QgQT1QLmlzUG9pbnRMaWdodD09PSEwP2IuY3VzdG9tRGlzdGFuY2VNYXRlcmlhbDpiLmN1c3RvbURlcHRoTWF0ZXJpYWw7aWYoQSE9PXZvaWQgMClNPUE7ZWxzZSBpZihNPVAuaXNQb2ludExpZ2h0PT09ITA/bDphLGkubG9jYWxDbGlwcGluZ0VuYWJsZWQmJlQuY2xpcFNoYWRvd3M9PT0hMCYmQXJyYXkuaXNBcnJheShULmNsaXBwaW5nUGxhbmVzKSYmVC5jbGlwcGluZ1BsYW5lcy5sZW5ndGghPT0wfHxULmRpc3BsYWNlbWVudE1hcCYmVC5kaXNwbGFjZW1lbnRTY2FsZSE9PTB8fFQuYWxwaGFNYXAmJlQuYWxwaGFUZXN0PjB8fFQubWFwJiZULmFscGhhVGVzdD4wKXtjb25zdCBGPU0udXVpZCxEPVQudXVpZDtsZXQgTj1jW0ZdO049PT12b2lkIDAmJihOPXt9LGNbRl09Tik7bGV0IFU9TltEXTtVPT09dm9pZCAwJiYoVT1NLmNsb25lKCksTltEXT1VLFQuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsRSkpLE09VX1pZihNLnZpc2libGU9VC52aXNpYmxlLE0ud2lyZWZyYW1lPVQud2lyZWZyYW1lLHc9PT1Kbj9NLnNpZGU9VC5zaGFkb3dTaWRlIT09bnVsbD9ULnNoYWRvd1NpZGU6VC5zaWRlOk0uc2lkZT1ULnNoYWRvd1NpZGUhPT1udWxsP1Quc2hhZG93U2lkZTpoW1Quc2lkZV0sTS5hbHBoYU1hcD1ULmFscGhhTWFwLE0uYWxwaGFUZXN0PVQuYWxwaGFUZXN0LE0ubWFwPVQubWFwLE0uY2xpcFNoYWRvd3M9VC5jbGlwU2hhZG93cyxNLmNsaXBwaW5nUGxhbmVzPVQuY2xpcHBpbmdQbGFuZXMsTS5jbGlwSW50ZXJzZWN0aW9uPVQuY2xpcEludGVyc2VjdGlvbixNLmRpc3BsYWNlbWVudE1hcD1ULmRpc3BsYWNlbWVudE1hcCxNLmRpc3BsYWNlbWVudFNjYWxlPVQuZGlzcGxhY2VtZW50U2NhbGUsTS5kaXNwbGFjZW1lbnRCaWFzPVQuZGlzcGxhY2VtZW50QmlhcyxNLndpcmVmcmFtZUxpbmV3aWR0aD1ULndpcmVmcmFtZUxpbmV3aWR0aCxNLmxpbmV3aWR0aD1ULmxpbmV3aWR0aCxQLmlzUG9pbnRMaWdodD09PSEwJiZNLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWw9PT0hMCl7Y29uc3QgRj1pLnByb3BlcnRpZXMuZ2V0KE0pO0YubGlnaHQ9UH1yZXR1cm4gTX1mdW5jdGlvbiBfKGIsVCxQLHcsTSl7aWYoYi52aXNpYmxlPT09ITEpcmV0dXJuO2lmKGIubGF5ZXJzLnRlc3QoVC5sYXllcnMpJiYoYi5pc01lc2h8fGIuaXNMaW5lfHxiLmlzUG9pbnRzKSYmKGIuY2FzdFNoYWRvd3x8Yi5yZWNlaXZlU2hhZG93JiZNPT09Sm4pJiYoIWIuZnJ1c3R1bUN1bGxlZHx8bi5pbnRlcnNlY3RzT2JqZWN0KGIpKSl7Yi5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhQLm1hdHJpeFdvcmxkSW52ZXJzZSxiLm1hdHJpeFdvcmxkKTtjb25zdCBEPXQudXBkYXRlKGIpLE49Yi5tYXRlcmlhbDtpZihBcnJheS5pc0FycmF5KE4pKXtjb25zdCBVPUQuZ3JvdXBzO2ZvcihsZXQgQj0wLEg9VS5sZW5ndGg7QjxIO0IrKyl7Y29uc3QgRz1VW0JdLHR0PU5bRy5tYXRlcmlhbEluZGV4XTtpZih0dCYmdHQudmlzaWJsZSl7Y29uc3QgbHQ9dihiLHR0LHcsTSk7Yi5vbkJlZm9yZVNoYWRvdyhpLGIsVCxQLEQsbHQsRyksaS5yZW5kZXJCdWZmZXJEaXJlY3QoUCxudWxsLEQsbHQsYixHKSxiLm9uQWZ0ZXJTaGFkb3coaSxiLFQsUCxELGx0LEcpfX19ZWxzZSBpZihOLnZpc2libGUpe2NvbnN0IFU9dihiLE4sdyxNKTtiLm9uQmVmb3JlU2hhZG93KGksYixULFAsRCxVLG51bGwpLGkucmVuZGVyQnVmZmVyRGlyZWN0KFAsbnVsbCxELFUsYixudWxsKSxiLm9uQWZ0ZXJTaGFkb3coaSxiLFQsUCxELFUsbnVsbCl9fWNvbnN0IEY9Yi5jaGlsZHJlbjtmb3IobGV0IEQ9MCxOPUYubGVuZ3RoO0Q8TjtEKyspXyhGW0RdLFQsUCx3LE0pfWZ1bmN0aW9uIEUoYil7Yi50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsRSk7Zm9yKGNvbnN0IFAgaW4gYyl7Y29uc3Qgdz1jW1BdLE09Yi50YXJnZXQudXVpZDtNIGluIHcmJih3W01dLmRpc3Bvc2UoKSxkZWxldGUgd1tNXSl9fX1mdW5jdGlvbiBXRShpKXtmdW5jdGlvbiB0KCl7bGV0IHo9ITE7Y29uc3QgY3Q9bmV3IG9lO2xldCBldD1udWxsO2NvbnN0IG50PW5ldyBvZSgwLDAsMCwwKTtyZXR1cm57c2V0TWFzazpmdW5jdGlvbihmdCl7ZXQhPT1mdCYmIXomJihpLmNvbG9yTWFzayhmdCxmdCxmdCxmdCksZXQ9ZnQpfSxzZXRMb2NrZWQ6ZnVuY3Rpb24oZnQpe3o9ZnR9LHNldENsZWFyOmZ1bmN0aW9uKGZ0LE90LHJlLExlLEdlKXtHZT09PSEwJiYoZnQqPUxlLE90Kj1MZSxyZSo9TGUpLGN0LnNldChmdCxPdCxyZSxMZSksbnQuZXF1YWxzKGN0KT09PSExJiYoaS5jbGVhckNvbG9yKGZ0LE90LHJlLExlKSxudC5jb3B5KGN0KSl9LHJlc2V0OmZ1bmN0aW9uKCl7ej0hMSxldD1udWxsLG50LnNldCgtMSwwLDAsMCl9fX1mdW5jdGlvbiBlKCl7bGV0IHo9ITEsY3Q9bnVsbCxldD1udWxsLG50PW51bGw7cmV0dXJue3NldFRlc3Q6ZnVuY3Rpb24oZnQpe2Z0P010KGkuREVQVEhfVEVTVCk6cHQoaS5ERVBUSF9URVNUKX0sc2V0TWFzazpmdW5jdGlvbihmdCl7Y3QhPT1mdCYmIXomJihpLmRlcHRoTWFzayhmdCksY3Q9ZnQpfSxzZXRGdW5jOmZ1bmN0aW9uKGZ0KXtpZihldCE9PWZ0KXtzd2l0Y2goZnQpe2Nhc2UgUG06aS5kZXB0aEZ1bmMoaS5ORVZFUik7YnJlYWs7Y2FzZSBJbTppLmRlcHRoRnVuYyhpLkFMV0FZUyk7YnJlYWs7Y2FzZSBMbTppLmRlcHRoRnVuYyhpLkxFU1MpO2JyZWFrO2Nhc2UgYW86aS5kZXB0aEZ1bmMoaS5MRVFVQUwpO2JyZWFrO2Nhc2UgRG06aS5kZXB0aEZ1bmMoaS5FUVVBTCk7YnJlYWs7Y2FzZSBVbTppLmRlcHRoRnVuYyhpLkdFUVVBTCk7YnJlYWs7Y2FzZSBObTppLmRlcHRoRnVuYyhpLkdSRUFURVIpO2JyZWFrO2Nhc2UgRm06aS5kZXB0aEZ1bmMoaS5OT1RFUVVBTCk7YnJlYWs7ZGVmYXVsdDppLmRlcHRoRnVuYyhpLkxFUVVBTCl9ZXQ9ZnR9fSxzZXRMb2NrZWQ6ZnVuY3Rpb24oZnQpe3o9ZnR9LHNldENsZWFyOmZ1bmN0aW9uKGZ0KXtudCE9PWZ0JiYoaS5jbGVhckRlcHRoKGZ0KSxudD1mdCl9LHJlc2V0OmZ1bmN0aW9uKCl7ej0hMSxjdD1udWxsLGV0PW51bGwsbnQ9bnVsbH19fWZ1bmN0aW9uIG4oKXtsZXQgej0hMSxjdD1udWxsLGV0PW51bGwsbnQ9bnVsbCxmdD1udWxsLE90PW51bGwscmU9bnVsbCxMZT1udWxsLEdlPW51bGw7cmV0dXJue3NldFRlc3Q6ZnVuY3Rpb24obGUpe3p8fChsZT9NdChpLlNURU5DSUxfVEVTVCk6cHQoaS5TVEVOQ0lMX1RFU1QpKX0sc2V0TWFzazpmdW5jdGlvbihsZSl7Y3QhPT1sZSYmIXomJihpLnN0ZW5jaWxNYXNrKGxlKSxjdD1sZSl9LHNldEZ1bmM6ZnVuY3Rpb24obGUsRmksY2kpeyhldCE9PWxlfHxudCE9PUZpfHxmdCE9PWNpKSYmKGkuc3RlbmNpbEZ1bmMobGUsRmksY2kpLGV0PWxlLG50PUZpLGZ0PWNpKX0sc2V0T3A6ZnVuY3Rpb24obGUsRmksY2kpeyhPdCE9PWxlfHxyZSE9PUZpfHxMZSE9PWNpKSYmKGkuc3RlbmNpbE9wKGxlLEZpLGNpKSxPdD1sZSxyZT1GaSxMZT1jaSl9LHNldExvY2tlZDpmdW5jdGlvbihsZSl7ej1sZX0sc2V0Q2xlYXI6ZnVuY3Rpb24obGUpe0dlIT09bGUmJihpLmNsZWFyU3RlbmNpbChsZSksR2U9bGUpfSxyZXNldDpmdW5jdGlvbigpe3o9ITEsY3Q9bnVsbCxldD1udWxsLG50PW51bGwsZnQ9bnVsbCxPdD1udWxsLHJlPW51bGwsTGU9bnVsbCxHZT1udWxsfX19Y29uc3Qgcj1uZXcgdCxzPW5ldyBlLG89bmV3IG4sYT1uZXcgV2Vha01hcCxsPW5ldyBXZWFrTWFwO2xldCBjPXt9LHU9e30saD1uZXcgV2Vha01hcCxmPVtdLGQ9bnVsbCxwPSExLHk9bnVsbCxtPW51bGwsZz1udWxsLHg9bnVsbCx2PW51bGwsXz1udWxsLEU9bnVsbCxiPW5ldyB2dCgwLDAsMCksVD0wLFA9ITEsdz1udWxsLE09bnVsbCxBPW51bGwsRj1udWxsLEQ9bnVsbDtjb25zdCBOPWkuZ2V0UGFyYW1ldGVyKGkuTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMpO2xldCBVPSExLEI9MDtjb25zdCBIPWkuZ2V0UGFyYW1ldGVyKGkuVkVSU0lPTik7SC5pbmRleE9mKCJXZWJHTCIpIT09LTE/KEI9cGFyc2VGbG9hdCgvXldlYkdMIChcZCkvLmV4ZWMoSClbMV0pLFU9Qj49MSk6SC5pbmRleE9mKCJPcGVuR0wgRVMiKSE9PS0xJiYoQj1wYXJzZUZsb2F0KC9eT3BlbkdMIEVTIChcZCkvLmV4ZWMoSClbMV0pLFU9Qj49Mik7bGV0IEc9bnVsbCx0dD17fTtjb25zdCBsdD1pLmdldFBhcmFtZXRlcihpLlNDSVNTT1JfQk9YKSxodD1pLmdldFBhcmFtZXRlcihpLlZJRVdQT1JUKSxSdD1uZXcgb2UoKS5mcm9tQXJyYXkobHQpLFZ0PW5ldyBvZSgpLmZyb21BcnJheShodCk7ZnVuY3Rpb24gSyh6LGN0LGV0LG50KXtjb25zdCBmdD1uZXcgVWludDhBcnJheSg0KSxPdD1pLmNyZWF0ZVRleHR1cmUoKTtpLmJpbmRUZXh0dXJlKHosT3QpLGkudGV4UGFyYW1ldGVyaSh6LGkuVEVYVFVSRV9NSU5fRklMVEVSLGkuTkVBUkVTVCksaS50ZXhQYXJhbWV0ZXJpKHosaS5URVhUVVJFX01BR19GSUxURVIsaS5ORUFSRVNUKTtmb3IobGV0IHJlPTA7cmU8ZXQ7cmUrKyl6PT09aS5URVhUVVJFXzNEfHx6PT09aS5URVhUVVJFXzJEX0FSUkFZP2kudGV4SW1hZ2UzRChjdCwwLGkuUkdCQSwxLDEsbnQsMCxpLlJHQkEsaS5VTlNJR05FRF9CWVRFLGZ0KTppLnRleEltYWdlMkQoY3QrcmUsMCxpLlJHQkEsMSwxLDAsaS5SR0JBLGkuVU5TSUdORURfQllURSxmdCk7cmV0dXJuIE90fWNvbnN0IHJ0PXt9O3J0W2kuVEVYVFVSRV8yRF09SyhpLlRFWFRVUkVfMkQsaS5URVhUVVJFXzJELDEpLHJ0W2kuVEVYVFVSRV9DVUJFX01BUF09SyhpLlRFWFRVUkVfQ1VCRV9NQVAsaS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gsNikscnRbaS5URVhUVVJFXzJEX0FSUkFZXT1LKGkuVEVYVFVSRV8yRF9BUlJBWSxpLlRFWFRVUkVfMkRfQVJSQVksMSwxKSxydFtpLlRFWFRVUkVfM0RdPUsoaS5URVhUVVJFXzNELGkuVEVYVFVSRV8zRCwxLDEpLHIuc2V0Q2xlYXIoMCwwLDAsMSkscy5zZXRDbGVhcigxKSxvLnNldENsZWFyKDApLE10KGkuREVQVEhfVEVTVCkscy5zZXRGdW5jKGFvKSxtdCghMSksUSh5biksTXQoaS5DVUxMX0ZBQ0UpLG90KGZpKTtmdW5jdGlvbiBNdCh6KXtjW3pdIT09ITAmJihpLmVuYWJsZSh6KSxjW3pdPSEwKX1mdW5jdGlvbiBwdCh6KXtjW3pdIT09ITEmJihpLmRpc2FibGUoeiksY1t6XT0hMSl9ZnVuY3Rpb24gSXQoeixjdCl7cmV0dXJuIHVbel0hPT1jdD8oaS5iaW5kRnJhbWVidWZmZXIoeixjdCksdVt6XT1jdCx6PT09aS5EUkFXX0ZSQU1FQlVGRkVSJiYodVtpLkZSQU1FQlVGRkVSXT1jdCksej09PWkuRlJBTUVCVUZGRVImJih1W2kuRFJBV19GUkFNRUJVRkZFUl09Y3QpLCEwKTohMX1mdW5jdGlvbiBGdCh6LGN0KXtsZXQgZXQ9ZixudD0hMTtpZih6KXtldD1oLmdldChjdCksZXQ9PT12b2lkIDAmJihldD1bXSxoLnNldChjdCxldCkpO2NvbnN0IGZ0PXoudGV4dHVyZXM7aWYoZXQubGVuZ3RoIT09ZnQubGVuZ3RofHxldFswXSE9PWkuQ09MT1JfQVRUQUNITUVOVDApe2ZvcihsZXQgT3Q9MCxyZT1mdC5sZW5ndGg7T3Q8cmU7T3QrKylldFtPdF09aS5DT0xPUl9BVFRBQ0hNRU5UMCtPdDtldC5sZW5ndGg9ZnQubGVuZ3RoLG50PSEwfX1lbHNlIGV0WzBdIT09aS5CQUNLJiYoZXRbMF09aS5CQUNLLG50PSEwKTtudCYmaS5kcmF3QnVmZmVycyhldCl9ZnVuY3Rpb24gRXQoeil7cmV0dXJuIGQhPT16PyhpLnVzZVByb2dyYW0oeiksZD16LCEwKTohMX1jb25zdCBKdD17W0JpXTppLkZVTkNfQURELFtkbV06aS5GVU5DX1NVQlRSQUNULFtwbV06aS5GVU5DX1JFVkVSU0VfU1VCVFJBQ1R9O0p0W21tXT1pLk1JTixKdFtnbV09aS5NQVg7Y29uc3QgST17W3ltXTppLlpFUk8sW3ZtXTppLk9ORSxbX21dOmkuU1JDX0NPTE9SLFtGYV06aS5TUkNfQUxQSEEsW0FtXTppLlNSQ19BTFBIQV9TQVRVUkFURSxbYm1dOmkuRFNUX0NPTE9SLFtNbV06aS5EU1RfQUxQSEEsW3htXTppLk9ORV9NSU5VU19TUkNfQ09MT1IsW09hXTppLk9ORV9NSU5VU19TUkNfQUxQSEEsW3dtXTppLk9ORV9NSU5VU19EU1RfQ09MT1IsW1NtXTppLk9ORV9NSU5VU19EU1RfQUxQSEEsW0VtXTppLkNPTlNUQU5UX0NPTE9SLFtUbV06aS5PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IsW0NtXTppLkNPTlNUQU5UX0FMUEhBLFtSbV06aS5PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEF9O2Z1bmN0aW9uIG90KHosY3QsZXQsbnQsZnQsT3QscmUsTGUsR2UsbGUpe2lmKHo9PT1maSl7cD09PSEwJiYocHQoaS5CTEVORCkscD0hMSk7cmV0dXJufWlmKHA9PT0hMSYmKE10KGkuQkxFTkQpLHA9ITApLHohPT1mbSl7aWYoeiE9PXl8fGxlIT09UCl7aWYoKG0hPT1CaXx8diE9PUJpKSYmKGkuYmxlbmRFcXVhdGlvbihpLkZVTkNfQUREKSxtPUJpLHY9QmkpLGxlKXN3aXRjaCh6KXtjYXNlIGNyOmkuYmxlbmRGdW5jU2VwYXJhdGUoaS5PTkUsaS5PTkVfTUlOVVNfU1JDX0FMUEhBLGkuT05FLGkuT05FX01JTlVTX1NSQ19BTFBIQSk7YnJlYWs7Y2FzZSBmaDppLmJsZW5kRnVuYyhpLk9ORSxpLk9ORSk7YnJlYWs7Y2FzZSBkaDppLmJsZW5kRnVuY1NlcGFyYXRlKGkuWkVSTyxpLk9ORV9NSU5VU19TUkNfQ09MT1IsaS5aRVJPLGkuT05FKTticmVhaztjYXNlIHBoOmkuYmxlbmRGdW5jU2VwYXJhdGUoaS5aRVJPLGkuU1JDX0NPTE9SLGkuWkVSTyxpLlNSQ19BTFBIQSk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLHopO2JyZWFrfWVsc2Ugc3dpdGNoKHope2Nhc2UgY3I6aS5ibGVuZEZ1bmNTZXBhcmF0ZShpLlNSQ19BTFBIQSxpLk9ORV9NSU5VU19TUkNfQUxQSEEsaS5PTkUsaS5PTkVfTUlOVVNfU1JDX0FMUEhBKTticmVhaztjYXNlIGZoOmkuYmxlbmRGdW5jKGkuU1JDX0FMUEhBLGkuT05FKTticmVhaztjYXNlIGRoOmkuYmxlbmRGdW5jU2VwYXJhdGUoaS5aRVJPLGkuT05FX01JTlVTX1NSQ19DT0xPUixpLlpFUk8saS5PTkUpO2JyZWFrO2Nhc2UgcGg6aS5ibGVuZEZ1bmMoaS5aRVJPLGkuU1JDX0NPTE9SKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIseik7YnJlYWt9Zz1udWxsLHg9bnVsbCxfPW51bGwsRT1udWxsLGIuc2V0KDAsMCwwKSxUPTAseT16LFA9bGV9cmV0dXJufWZ0PWZ0fHxjdCxPdD1PdHx8ZXQscmU9cmV8fG50LChjdCE9PW18fGZ0IT09dikmJihpLmJsZW5kRXF1YXRpb25TZXBhcmF0ZShKdFtjdF0sSnRbZnRdKSxtPWN0LHY9ZnQpLChldCE9PWd8fG50IT09eHx8T3QhPT1ffHxyZSE9PUUpJiYoaS5ibGVuZEZ1bmNTZXBhcmF0ZShJW2V0XSxJW250XSxJW090XSxJW3JlXSksZz1ldCx4PW50LF89T3QsRT1yZSksKExlLmVxdWFscyhiKT09PSExfHxHZSE9PVQpJiYoaS5ibGVuZENvbG9yKExlLnIsTGUuZyxMZS5iLEdlKSxiLmNvcHkoTGUpLFQ9R2UpLHk9eixQPSExfWZ1bmN0aW9uIGl0KHosY3Qpe3ouc2lkZT09PUtuP3B0KGkuQ1VMTF9GQUNFKTpNdChpLkNVTExfRkFDRSk7bGV0IGV0PXouc2lkZT09PUtlO2N0JiYoZXQ9IWV0KSxtdChldCksei5ibGVuZGluZz09PWNyJiZ6LnRyYW5zcGFyZW50PT09ITE/b3QoZmkpOm90KHouYmxlbmRpbmcsei5ibGVuZEVxdWF0aW9uLHouYmxlbmRTcmMsei5ibGVuZERzdCx6LmJsZW5kRXF1YXRpb25BbHBoYSx6LmJsZW5kU3JjQWxwaGEsei5ibGVuZERzdEFscGhhLHouYmxlbmRDb2xvcix6LmJsZW5kQWxwaGEsei5wcmVtdWx0aXBsaWVkQWxwaGEpLHMuc2V0RnVuYyh6LmRlcHRoRnVuYykscy5zZXRUZXN0KHouZGVwdGhUZXN0KSxzLnNldE1hc2soei5kZXB0aFdyaXRlKSxyLnNldE1hc2soei5jb2xvcldyaXRlKTtjb25zdCBudD16LnN0ZW5jaWxXcml0ZTtvLnNldFRlc3QobnQpLG50JiYoby5zZXRNYXNrKHouc3RlbmNpbFdyaXRlTWFzayksby5zZXRGdW5jKHouc3RlbmNpbEZ1bmMsei5zdGVuY2lsUmVmLHouc3RlbmNpbEZ1bmNNYXNrKSxvLnNldE9wKHouc3RlbmNpbEZhaWwsei5zdGVuY2lsWkZhaWwsei5zdGVuY2lsWlBhc3MpKSwkKHoucG9seWdvbk9mZnNldCx6LnBvbHlnb25PZmZzZXRGYWN0b3Isei5wb2x5Z29uT2Zmc2V0VW5pdHMpLHouYWxwaGFUb0NvdmVyYWdlPT09ITA/TXQoaS5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpOnB0KGkuU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKX1mdW5jdGlvbiBtdCh6KXt3IT09eiYmKHo/aS5mcm9udEZhY2UoaS5DVyk6aS5mcm9udEZhY2UoaS5DQ1cpLHc9eil9ZnVuY3Rpb24gUSh6KXt6IT09Q2U/KE10KGkuQ1VMTF9GQUNFKSx6IT09TSYmKHo9PT15bj9pLmN1bGxGYWNlKGkuQkFDSyk6ej09PXZuP2kuY3VsbEZhY2UoaS5GUk9OVCk6aS5jdWxsRmFjZShpLkZST05UX0FORF9CQUNLKSkpOnB0KGkuQ1VMTF9GQUNFKSxNPXp9ZnVuY3Rpb24gUHQoeil7eiE9PUEmJihVJiZpLmxpbmVXaWR0aCh6KSxBPXopfWZ1bmN0aW9uICQoeixjdCxldCl7ej8oTXQoaS5QT0xZR09OX09GRlNFVF9GSUxMKSwoRiE9PWN0fHxEIT09ZXQpJiYoaS5wb2x5Z29uT2Zmc2V0KGN0LGV0KSxGPWN0LEQ9ZXQpKTpwdChpLlBPTFlHT05fT0ZGU0VUX0ZJTEwpfWZ1bmN0aW9uIEooeil7ej9NdChpLlNDSVNTT1JfVEVTVCk6cHQoaS5TQ0lTU09SX1RFU1QpfWZ1bmN0aW9uIFIoeil7ej09PXZvaWQgMCYmKHo9aS5URVhUVVJFMCtOLTEpLEchPT16JiYoaS5hY3RpdmVUZXh0dXJlKHopLEc9eil9ZnVuY3Rpb24gUyh6LGN0LGV0KXtldD09PXZvaWQgMCYmKEc9PT1udWxsP2V0PWkuVEVYVFVSRTArTi0xOmV0PUcpO2xldCBudD10dFtldF07bnQ9PT12b2lkIDAmJihudD17dHlwZTp2b2lkIDAsdGV4dHVyZTp2b2lkIDB9LHR0W2V0XT1udCksKG50LnR5cGUhPT16fHxudC50ZXh0dXJlIT09Y3QpJiYoRyE9PWV0JiYoaS5hY3RpdmVUZXh0dXJlKGV0KSxHPWV0KSxpLmJpbmRUZXh0dXJlKHosY3R8fHJ0W3pdKSxudC50eXBlPXosbnQudGV4dHVyZT1jdCl9ZnVuY3Rpb24gTygpe2NvbnN0IHo9dHRbR107eiE9PXZvaWQgMCYmei50eXBlIT09dm9pZCAwJiYoaS5iaW5kVGV4dHVyZSh6LnR5cGUsbnVsbCksei50eXBlPXZvaWQgMCx6LnRleHR1cmU9dm9pZCAwKX1mdW5jdGlvbiBZKCl7dHJ5e2kuY29tcHJlc3NlZFRleEltYWdlMkQuYXBwbHkoaSxhcmd1bWVudHMpfWNhdGNoKHope2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iix6KX19ZnVuY3Rpb24gWigpe3RyeXtpLmNvbXByZXNzZWRUZXhJbWFnZTNELmFwcGx5KGksYXJndW1lbnRzKX1jYXRjaCh6KXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIseil9fWZ1bmN0aW9uIGooKXt0cnl7aS50ZXhTdWJJbWFnZTJELmFwcGx5KGksYXJndW1lbnRzKX1jYXRjaCh6KXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIseil9fWZ1bmN0aW9uIF90KCl7dHJ5e2kudGV4U3ViSW1hZ2UzRC5hcHBseShpLGFyZ3VtZW50cyl9Y2F0Y2goeil7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLHopfX1mdW5jdGlvbiBhdCgpe3RyeXtpLmNvbXByZXNzZWRUZXhTdWJJbWFnZTJELmFwcGx5KGksYXJndW1lbnRzKX1jYXRjaCh6KXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIseil9fWZ1bmN0aW9uIGd0KCl7dHJ5e2kuY29tcHJlc3NlZFRleFN1YkltYWdlM0QuYXBwbHkoaSxhcmd1bWVudHMpfWNhdGNoKHope2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iix6KX19ZnVuY3Rpb24ga3QoKXt0cnl7aS50ZXhTdG9yYWdlMkQuYXBwbHkoaSxhcmd1bWVudHMpfWNhdGNoKHope2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iix6KX19ZnVuY3Rpb24gc3QoKXt0cnl7aS50ZXhTdG9yYWdlM0QuYXBwbHkoaSxhcmd1bWVudHMpfWNhdGNoKHope2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iix6KX19ZnVuY3Rpb24geXQoKXt0cnl7aS50ZXhJbWFnZTJELmFwcGx5KGksYXJndW1lbnRzKX1jYXRjaCh6KXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIseil9fWZ1bmN0aW9uIEt0KCl7dHJ5e2kudGV4SW1hZ2UzRC5hcHBseShpLGFyZ3VtZW50cyl9Y2F0Y2goeil7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLHopfX1mdW5jdGlvbiBVdCh6KXtSdC5lcXVhbHMoeik9PT0hMSYmKGkuc2Npc3Nvcih6Lngsei55LHoueix6LncpLFJ0LmNvcHkoeikpfWZ1bmN0aW9uIGJ0KHope1Z0LmVxdWFscyh6KT09PSExJiYoaS52aWV3cG9ydCh6Lngsei55LHoueix6LncpLFZ0LmNvcHkoeikpfWZ1bmN0aW9uIEh0KHosY3Qpe2xldCBldD1sLmdldChjdCk7ZXQ9PT12b2lkIDAmJihldD1uZXcgV2Vha01hcCxsLnNldChjdCxldCkpO2xldCBudD1ldC5nZXQoeik7bnQ9PT12b2lkIDAmJihudD1pLmdldFVuaWZvcm1CbG9ja0luZGV4KGN0LHoubmFtZSksZXQuc2V0KHosbnQpKX1mdW5jdGlvbiBZdCh6LGN0KXtjb25zdCBudD1sLmdldChjdCkuZ2V0KHopO2EuZ2V0KGN0KSE9PW50JiYoaS51bmlmb3JtQmxvY2tCaW5kaW5nKGN0LG50LHouX19iaW5kaW5nUG9pbnRJbmRleCksYS5zZXQoY3QsbnQpKX1mdW5jdGlvbiBtZSgpe2kuZGlzYWJsZShpLkJMRU5EKSxpLmRpc2FibGUoaS5DVUxMX0ZBQ0UpLGkuZGlzYWJsZShpLkRFUFRIX1RFU1QpLGkuZGlzYWJsZShpLlBPTFlHT05fT0ZGU0VUX0ZJTEwpLGkuZGlzYWJsZShpLlNDSVNTT1JfVEVTVCksaS5kaXNhYmxlKGkuU1RFTkNJTF9URVNUKSxpLmRpc2FibGUoaS5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLGkuYmxlbmRFcXVhdGlvbihpLkZVTkNfQUREKSxpLmJsZW5kRnVuYyhpLk9ORSxpLlpFUk8pLGkuYmxlbmRGdW5jU2VwYXJhdGUoaS5PTkUsaS5aRVJPLGkuT05FLGkuWkVSTyksaS5ibGVuZENvbG9yKDAsMCwwLDApLGkuY29sb3JNYXNrKCEwLCEwLCEwLCEwKSxpLmNsZWFyQ29sb3IoMCwwLDAsMCksaS5kZXB0aE1hc2soITApLGkuZGVwdGhGdW5jKGkuTEVTUyksaS5jbGVhckRlcHRoKDEpLGkuc3RlbmNpbE1hc2soNDI5NDk2NzI5NSksaS5zdGVuY2lsRnVuYyhpLkFMV0FZUywwLDQyOTQ5NjcyOTUpLGkuc3RlbmNpbE9wKGkuS0VFUCxpLktFRVAsaS5LRUVQKSxpLmNsZWFyU3RlbmNpbCgwKSxpLmN1bGxGYWNlKGkuQkFDSyksaS5mcm9udEZhY2UoaS5DQ1cpLGkucG9seWdvbk9mZnNldCgwLDApLGkuYWN0aXZlVGV4dHVyZShpLlRFWFRVUkUwKSxpLmJpbmRGcmFtZWJ1ZmZlcihpLkZSQU1FQlVGRkVSLG51bGwpLGkuYmluZEZyYW1lYnVmZmVyKGkuRFJBV19GUkFNRUJVRkZFUixudWxsKSxpLmJpbmRGcmFtZWJ1ZmZlcihpLlJFQURfRlJBTUVCVUZGRVIsbnVsbCksaS51c2VQcm9ncmFtKG51bGwpLGkubGluZVdpZHRoKDEpLGkuc2Npc3NvcigwLDAsaS5jYW52YXMud2lkdGgsaS5jYW52YXMuaGVpZ2h0KSxpLnZpZXdwb3J0KDAsMCxpLmNhbnZhcy53aWR0aCxpLmNhbnZhcy5oZWlnaHQpLGM9e30sRz1udWxsLHR0PXt9LHU9e30saD1uZXcgV2Vha01hcCxmPVtdLGQ9bnVsbCxwPSExLHk9bnVsbCxtPW51bGwsZz1udWxsLHg9bnVsbCx2PW51bGwsXz1udWxsLEU9bnVsbCxiPW5ldyB2dCgwLDAsMCksVD0wLFA9ITEsdz1udWxsLE09bnVsbCxBPW51bGwsRj1udWxsLEQ9bnVsbCxSdC5zZXQoMCwwLGkuY2FudmFzLndpZHRoLGkuY2FudmFzLmhlaWdodCksVnQuc2V0KDAsMCxpLmNhbnZhcy53aWR0aCxpLmNhbnZhcy5oZWlnaHQpLHIucmVzZXQoKSxzLnJlc2V0KCksby5yZXNldCgpfXJldHVybntidWZmZXJzOntjb2xvcjpyLGRlcHRoOnMsc3RlbmNpbDpvfSxlbmFibGU6TXQsZGlzYWJsZTpwdCxiaW5kRnJhbWVidWZmZXI6SXQsZHJhd0J1ZmZlcnM6RnQsdXNlUHJvZ3JhbTpFdCxzZXRCbGVuZGluZzpvdCxzZXRNYXRlcmlhbDppdCxzZXRGbGlwU2lkZWQ6bXQsc2V0Q3VsbEZhY2U6USxzZXRMaW5lV2lkdGg6UHQsc2V0UG9seWdvbk9mZnNldDokLHNldFNjaXNzb3JUZXN0OkosYWN0aXZlVGV4dHVyZTpSLGJpbmRUZXh0dXJlOlMsdW5iaW5kVGV4dHVyZTpPLGNvbXByZXNzZWRUZXhJbWFnZTJEOlksY29tcHJlc3NlZFRleEltYWdlM0Q6Wix0ZXhJbWFnZTJEOnl0LHRleEltYWdlM0Q6S3QsdXBkYXRlVUJPTWFwcGluZzpIdCx1bmlmb3JtQmxvY2tCaW5kaW5nOll0LHRleFN0b3JhZ2UyRDprdCx0ZXhTdG9yYWdlM0Q6c3QsdGV4U3ViSW1hZ2UyRDpqLHRleFN1YkltYWdlM0Q6X3QsY29tcHJlc3NlZFRleFN1YkltYWdlMkQ6YXQsY29tcHJlc3NlZFRleFN1YkltYWdlM0Q6Z3Qsc2Npc3NvcjpVdCx2aWV3cG9ydDpidCxyZXNldDptZX19ZnVuY3Rpb24gJEUoaSx0KXtjb25zdCBlPWkuaW1hZ2UmJmkuaW1hZ2Uud2lkdGg/aS5pbWFnZS53aWR0aC9pLmltYWdlLmhlaWdodDoxO3JldHVybiBlPnQ/KGkucmVwZWF0Lng9MSxpLnJlcGVhdC55PWUvdCxpLm9mZnNldC54PTAsaS5vZmZzZXQueT0oMS1pLnJlcGVhdC55KS8yKTooaS5yZXBlYXQueD10L2UsaS5yZXBlYXQueT0xLGkub2Zmc2V0Lng9KDEtaS5yZXBlYXQueCkvMixpLm9mZnNldC55PTApLGl9ZnVuY3Rpb24gWEUoaSx0KXtjb25zdCBlPWkuaW1hZ2UmJmkuaW1hZ2Uud2lkdGg/aS5pbWFnZS53aWR0aC9pLmltYWdlLmhlaWdodDoxO3JldHVybiBlPnQ/KGkucmVwZWF0Lng9dC9lLGkucmVwZWF0Lnk9MSxpLm9mZnNldC54PSgxLWkucmVwZWF0LngpLzIsaS5vZmZzZXQueT0wKTooaS5yZXBlYXQueD0xLGkucmVwZWF0Lnk9ZS90LGkub2Zmc2V0Lng9MCxpLm9mZnNldC55PSgxLWkucmVwZWF0LnkpLzIpLGl9ZnVuY3Rpb24gcUUoaSl7cmV0dXJuIGkucmVwZWF0Lng9MSxpLnJlcGVhdC55PTEsaS5vZmZzZXQueD0wLGkub2Zmc2V0Lnk9MCxpfWZ1bmN0aW9uIGhmKGksdCxlLG4pe2NvbnN0IHI9WUUobik7c3dpdGNoKGUpe2Nhc2UgeGg6cmV0dXJuIGkqdDtjYXNlIFNoOnJldHVybiBpKnQ7Y2FzZSBiaDpyZXR1cm4gaSp0KjI7Y2FzZSBWYTpyZXR1cm4gaSp0L3IuY29tcG9uZW50cypyLmJ5dGVMZW5ndGg7Y2FzZSBtbzpyZXR1cm4gaSp0L3IuY29tcG9uZW50cypyLmJ5dGVMZW5ndGg7Y2FzZSB3aDpyZXR1cm4gaSp0KjIvci5jb21wb25lbnRzKnIuYnl0ZUxlbmd0aDtjYXNlIEhhOnJldHVybiBpKnQqMi9yLmNvbXBvbmVudHMqci5ieXRlTGVuZ3RoO2Nhc2UgTWg6cmV0dXJuIGkqdCozL3IuY29tcG9uZW50cypyLmJ5dGVMZW5ndGg7Y2FzZSBqZTpyZXR1cm4gaSp0KjQvci5jb21wb25lbnRzKnIuYnl0ZUxlbmd0aDtjYXNlIFdhOnJldHVybiBpKnQqNC9yLmNvbXBvbmVudHMqci5ieXRlTGVuZ3RoO2Nhc2UgZ286Y2FzZSB5bzpyZXR1cm4gTWF0aC5mbG9vcigoaSszKS80KSpNYXRoLmZsb29yKCh0KzMpLzQpKjg7Y2FzZSB2bzpjYXNlIF9vOnJldHVybiBNYXRoLmZsb29yKChpKzMpLzQpKk1hdGguZmxvb3IoKHQrMykvNCkqMTY7Y2FzZSBYYTpjYXNlIFlhOnJldHVybiBNYXRoLm1heChpLDE2KSpNYXRoLm1heCh0LDgpLzQ7Y2FzZSAkYTpjYXNlIHFhOnJldHVybiBNYXRoLm1heChpLDgpKk1hdGgubWF4KHQsOCkvMjtjYXNlIFphOmNhc2UgSmE6cmV0dXJuIE1hdGguZmxvb3IoKGkrMykvNCkqTWF0aC5mbG9vcigodCszKS80KSo4O2Nhc2UgS2E6cmV0dXJuIE1hdGguZmxvb3IoKGkrMykvNCkqTWF0aC5mbG9vcigodCszKS80KSoxNjtjYXNlIGphOnJldHVybiBNYXRoLmZsb29yKChpKzMpLzQpKk1hdGguZmxvb3IoKHQrMykvNCkqMTY7Y2FzZSBRYTpyZXR1cm4gTWF0aC5mbG9vcigoaSs0KS81KSpNYXRoLmZsb29yKCh0KzMpLzQpKjE2O2Nhc2UgdGw6cmV0dXJuIE1hdGguZmxvb3IoKGkrNCkvNSkqTWF0aC5mbG9vcigodCs0KS81KSoxNjtjYXNlIGVsOnJldHVybiBNYXRoLmZsb29yKChpKzUpLzYpKk1hdGguZmxvb3IoKHQrNCkvNSkqMTY7Y2FzZSBubDpyZXR1cm4gTWF0aC5mbG9vcigoaSs1KS82KSpNYXRoLmZsb29yKCh0KzUpLzYpKjE2O2Nhc2UgaWw6cmV0dXJuIE1hdGguZmxvb3IoKGkrNykvOCkqTWF0aC5mbG9vcigodCs0KS81KSoxNjtjYXNlIHJsOnJldHVybiBNYXRoLmZsb29yKChpKzcpLzgpKk1hdGguZmxvb3IoKHQrNSkvNikqMTY7Y2FzZSBzbDpyZXR1cm4gTWF0aC5mbG9vcigoaSs3KS84KSpNYXRoLmZsb29yKCh0KzcpLzgpKjE2O2Nhc2Ugb2w6cmV0dXJuIE1hdGguZmxvb3IoKGkrOSkvMTApKk1hdGguZmxvb3IoKHQrNCkvNSkqMTY7Y2FzZSBhbDpyZXR1cm4gTWF0aC5mbG9vcigoaSs5KS8xMCkqTWF0aC5mbG9vcigodCs1KS82KSoxNjtjYXNlIGxsOnJldHVybiBNYXRoLmZsb29yKChpKzkpLzEwKSpNYXRoLmZsb29yKCh0KzcpLzgpKjE2O2Nhc2UgY2w6cmV0dXJuIE1hdGguZmxvb3IoKGkrOSkvMTApKk1hdGguZmxvb3IoKHQrOSkvMTApKjE2O2Nhc2UgdWw6cmV0dXJuIE1hdGguZmxvb3IoKGkrMTEpLzEyKSpNYXRoLmZsb29yKCh0KzkpLzEwKSoxNjtjYXNlIGhsOnJldHVybiBNYXRoLmZsb29yKChpKzExKS8xMikqTWF0aC5mbG9vcigodCsxMSkvMTIpKjE2O2Nhc2UgeG86Y2FzZSBmbDpjYXNlIGRsOnJldHVybiBNYXRoLmNlaWwoaS80KSpNYXRoLmNlaWwodC80KSoxNjtjYXNlIEFoOmNhc2UgcGw6cmV0dXJuIE1hdGguY2VpbChpLzQpKk1hdGguY2VpbCh0LzQpKjg7Y2FzZSBtbDpjYXNlIGdsOnJldHVybiBNYXRoLmNlaWwoaS80KSpNYXRoLmNlaWwodC80KSoxNn10aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkZXRlcm1pbmUgdGV4dHVyZSBieXRlIGxlbmd0aCBmb3IgJHtlfSBmb3JtYXQuYCl9ZnVuY3Rpb24gWUUoaSl7c3dpdGNoKGkpe2Nhc2UgUW46Y2FzZSB5aDpyZXR1cm57Ynl0ZUxlbmd0aDoxLGNvbXBvbmVudHM6MX07Y2FzZSB0czpjYXNlIHZoOmNhc2UgZXM6cmV0dXJue2J5dGVMZW5ndGg6Mixjb21wb25lbnRzOjF9O2Nhc2Uga2E6Y2FzZSBHYTpyZXR1cm57Ynl0ZUxlbmd0aDoyLGNvbXBvbmVudHM6NH07Y2FzZSBtaTpjYXNlIHphOmNhc2UgY246cmV0dXJue2J5dGVMZW5ndGg6NCxjb21wb25lbnRzOjF9O2Nhc2UgX2g6cmV0dXJue2J5dGVMZW5ndGg6NCxjb21wb25lbnRzOjN9fXRocm93IG5ldyBFcnJvcihgVW5rbm93biB0ZXh0dXJlIHR5cGUgJHtpfS5gKX1jb25zdCBaRT17Y29udGFpbjokRSxjb3ZlcjpYRSxmaWxsOnFFLGdldEJ5dGVMZW5ndGg6aGZ9O2Z1bmN0aW9uIEpFKGksdCxlLG4scixzLG8pe2NvbnN0IGE9dC5oYXMoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpP3QuZ2V0KCJXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiKTpudWxsLGw9dHlwZW9mIG5hdmlnYXRvcj09InVuZGVmaW5lZCI/ITE6L09jdWx1c0Jyb3dzZXIvZy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGM9bmV3IHEsdT1uZXcgV2Vha01hcDtsZXQgaDtjb25zdCBmPW5ldyBXZWFrTWFwO2xldCBkPSExO3RyeXtkPXR5cGVvZiBPZmZzY3JlZW5DYW52YXMhPSJ1bmRlZmluZWQiJiZuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSkuZ2V0Q29udGV4dCgiMmQiKSE9PW51bGx9Y2F0Y2goUil7fWZ1bmN0aW9uIHAoUixTKXtyZXR1cm4gZD9uZXcgT2Zmc2NyZWVuQ2FudmFzKFIsUyk6UG8oImNhbnZhcyIpfWZ1bmN0aW9uIHkoUixTLE8pe2xldCBZPTE7Y29uc3QgWj1KKFIpO2lmKChaLndpZHRoPk98fFouaGVpZ2h0Pk8pJiYoWT1PL01hdGgubWF4KFoud2lkdGgsWi5oZWlnaHQpKSxZPDEpaWYodHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQhPSJ1bmRlZmluZWQiJiZSIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50IT0idW5kZWZpbmVkIiYmUiBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHx0eXBlb2YgSW1hZ2VCaXRtYXAhPSJ1bmRlZmluZWQiJiZSIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXB8fHR5cGVvZiBWaWRlb0ZyYW1lIT0idW5kZWZpbmVkIiYmUiBpbnN0YW5jZW9mIFZpZGVvRnJhbWUpe2NvbnN0IGo9TWF0aC5mbG9vcihZKloud2lkdGgpLF90PU1hdGguZmxvb3IoWSpaLmhlaWdodCk7aD09PXZvaWQgMCYmKGg9cChqLF90KSk7Y29uc3QgYXQ9Uz9wKGosX3QpOmg7cmV0dXJuIGF0LndpZHRoPWosYXQuaGVpZ2h0PV90LGF0LmdldENvbnRleHQoIjJkIikuZHJhd0ltYWdlKFIsMCwwLGosX3QpLGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBoYXMgYmVlbiByZXNpemVkIGZyb20gKCIrWi53aWR0aCsieCIrWi5oZWlnaHQrIikgdG8gKCIraisieCIrX3QrIikuIiksYXR9ZWxzZSByZXR1cm4iZGF0YSJpbiBSJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEltYWdlIGluIERhdGFUZXh0dXJlIGlzIHRvbyBiaWcgKCIrWi53aWR0aCsieCIrWi5oZWlnaHQrIikuIiksUjtyZXR1cm4gUn1mdW5jdGlvbiBtKFIpe3JldHVybiBSLmdlbmVyYXRlTWlwbWFwcyYmUi5taW5GaWx0ZXIhPT1GZSYmUi5taW5GaWx0ZXIhPT1SZX1mdW5jdGlvbiBnKFIpe2kuZ2VuZXJhdGVNaXBtYXAoUil9ZnVuY3Rpb24geChSLFMsTyxZLFo9ITEpe2lmKFIhPT1udWxsKXtpZihpW1JdIT09dm9pZCAwKXJldHVybiBpW1JdO2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byB1c2Ugbm9uLWV4aXN0aW5nIFdlYkdMIGludGVybmFsIGZvcm1hdCAnIitSKyInIil9bGV0IGo9UztpZihTPT09aS5SRUQmJihPPT09aS5GTE9BVCYmKGo9aS5SMzJGKSxPPT09aS5IQUxGX0ZMT0FUJiYoaj1pLlIxNkYpLE89PT1pLlVOU0lHTkVEX0JZVEUmJihqPWkuUjgpKSxTPT09aS5SRURfSU5URUdFUiYmKE89PT1pLlVOU0lHTkVEX0JZVEUmJihqPWkuUjhVSSksTz09PWkuVU5TSUdORURfU0hPUlQmJihqPWkuUjE2VUkpLE89PT1pLlVOU0lHTkVEX0lOVCYmKGo9aS5SMzJVSSksTz09PWkuQllURSYmKGo9aS5SOEkpLE89PT1pLlNIT1JUJiYoaj1pLlIxNkkpLE89PT1pLklOVCYmKGo9aS5SMzJJKSksUz09PWkuUkcmJihPPT09aS5GTE9BVCYmKGo9aS5SRzMyRiksTz09PWkuSEFMRl9GTE9BVCYmKGo9aS5SRzE2RiksTz09PWkuVU5TSUdORURfQllURSYmKGo9aS5SRzgpKSxTPT09aS5SR19JTlRFR0VSJiYoTz09PWkuVU5TSUdORURfQllURSYmKGo9aS5SRzhVSSksTz09PWkuVU5TSUdORURfU0hPUlQmJihqPWkuUkcxNlVJKSxPPT09aS5VTlNJR05FRF9JTlQmJihqPWkuUkczMlVJKSxPPT09aS5CWVRFJiYoaj1pLlJHOEkpLE89PT1pLlNIT1JUJiYoaj1pLlJHMTZJKSxPPT09aS5JTlQmJihqPWkuUkczMkkpKSxTPT09aS5SR0ImJk89PT1pLlVOU0lHTkVEX0lOVF81XzlfOV85X1JFViYmKGo9aS5SR0I5X0U1KSxTPT09aS5SR0JBKXtjb25zdCBfdD1aP3dvOnNlLmdldFRyYW5zZmVyKFkpO089PT1pLkZMT0FUJiYoaj1pLlJHQkEzMkYpLE89PT1pLkhBTEZfRkxPQVQmJihqPWkuUkdCQTE2RiksTz09PWkuVU5TSUdORURfQllURSYmKGo9X3Q9PT1kZT9pLlNSR0I4X0FMUEhBODppLlJHQkE4KSxPPT09aS5VTlNJR05FRF9TSE9SVF80XzRfNF80JiYoaj1pLlJHQkE0KSxPPT09aS5VTlNJR05FRF9TSE9SVF81XzVfNV8xJiYoaj1pLlJHQjVfQTEpfXJldHVybihqPT09aS5SMTZGfHxqPT09aS5SMzJGfHxqPT09aS5SRzE2Rnx8aj09PWkuUkczMkZ8fGo9PT1pLlJHQkExNkZ8fGo9PT1pLlJHQkEzMkYpJiZ0LmdldCgiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIpLGp9ZnVuY3Rpb24gdihSLFMpe2xldCBPO3JldHVybiBSP1M9PT1udWxsfHxTPT09bWl8fFM9PT11cj9PPWkuREVQVEgyNF9TVEVOQ0lMODpTPT09Y24/Tz1pLkRFUFRIMzJGX1NURU5DSUw4OlM9PT10cyYmKE89aS5ERVBUSDI0X1NURU5DSUw4LGNvbnNvbGUud2FybigiRGVwdGhUZXh0dXJlOiAxNiBiaXQgZGVwdGggYXR0YWNobWVudCBpcyBub3Qgc3VwcG9ydGVkIHdpdGggc3RlbmNpbC4gVXNpbmcgMjQtYml0IGF0dGFjaG1lbnQuIikpOlM9PT1udWxsfHxTPT09bWl8fFM9PT11cj9PPWkuREVQVEhfQ09NUE9ORU5UMjQ6Uz09PWNuP089aS5ERVBUSF9DT01QT05FTlQzMkY6Uz09PXRzJiYoTz1pLkRFUFRIX0NPTVBPTkVOVDE2KSxPfWZ1bmN0aW9uIF8oUixTKXtyZXR1cm4gbShSKT09PSEwfHxSLmlzRnJhbWVidWZmZXJUZXh0dXJlJiZSLm1pbkZpbHRlciE9PUZlJiZSLm1pbkZpbHRlciE9PVJlP01hdGgubG9nMihNYXRoLm1heChTLndpZHRoLFMuaGVpZ2h0KSkrMTpSLm1pcG1hcHMhPT12b2lkIDAmJlIubWlwbWFwcy5sZW5ndGg+MD9SLm1pcG1hcHMubGVuZ3RoOlIuaXNDb21wcmVzc2VkVGV4dHVyZSYmQXJyYXkuaXNBcnJheShSLmltYWdlKT9TLm1pcG1hcHMubGVuZ3RoOjF9ZnVuY3Rpb24gRShSKXtjb25zdCBTPVIudGFyZ2V0O1MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsRSksVChTKSxTLmlzVmlkZW9UZXh0dXJlJiZ1LmRlbGV0ZShTKX1mdW5jdGlvbiBiKFIpe2NvbnN0IFM9Ui50YXJnZXQ7Uy5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixiKSx3KFMpfWZ1bmN0aW9uIFQoUil7Y29uc3QgUz1uLmdldChSKTtpZihTLl9fd2ViZ2xJbml0PT09dm9pZCAwKXJldHVybjtjb25zdCBPPVIuc291cmNlLFk9Zi5nZXQoTyk7aWYoWSl7Y29uc3QgWj1ZW1MuX19jYWNoZUtleV07Wi51c2VkVGltZXMtLSxaLnVzZWRUaW1lcz09PTAmJlAoUiksT2JqZWN0LmtleXMoWSkubGVuZ3RoPT09MCYmZi5kZWxldGUoTyl9bi5yZW1vdmUoUil9ZnVuY3Rpb24gUChSKXtjb25zdCBTPW4uZ2V0KFIpO2kuZGVsZXRlVGV4dHVyZShTLl9fd2ViZ2xUZXh0dXJlKTtjb25zdCBPPVIuc291cmNlLFk9Zi5nZXQoTyk7ZGVsZXRlIFlbUy5fX2NhY2hlS2V5XSxvLm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIHcoUil7Y29uc3QgUz1uLmdldChSKTtpZihSLmRlcHRoVGV4dHVyZSYmUi5kZXB0aFRleHR1cmUuZGlzcG9zZSgpLFIuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQpZm9yKGxldCBZPTA7WTw2O1krKyl7aWYoQXJyYXkuaXNBcnJheShTLl9fd2ViZ2xGcmFtZWJ1ZmZlcltZXSkpZm9yKGxldCBaPTA7WjxTLl9fd2ViZ2xGcmFtZWJ1ZmZlcltZXS5sZW5ndGg7WisrKWkuZGVsZXRlRnJhbWVidWZmZXIoUy5fX3dlYmdsRnJhbWVidWZmZXJbWV1bWl0pO2Vsc2UgaS5kZWxldGVGcmFtZWJ1ZmZlcihTLl9fd2ViZ2xGcmFtZWJ1ZmZlcltZXSk7Uy5fX3dlYmdsRGVwdGhidWZmZXImJmkuZGVsZXRlUmVuZGVyYnVmZmVyKFMuX193ZWJnbERlcHRoYnVmZmVyW1ldKX1lbHNle2lmKEFycmF5LmlzQXJyYXkoUy5fX3dlYmdsRnJhbWVidWZmZXIpKWZvcihsZXQgWT0wO1k8Uy5fX3dlYmdsRnJhbWVidWZmZXIubGVuZ3RoO1krKylpLmRlbGV0ZUZyYW1lYnVmZmVyKFMuX193ZWJnbEZyYW1lYnVmZmVyW1ldKTtlbHNlIGkuZGVsZXRlRnJhbWVidWZmZXIoUy5fX3dlYmdsRnJhbWVidWZmZXIpO2lmKFMuX193ZWJnbERlcHRoYnVmZmVyJiZpLmRlbGV0ZVJlbmRlcmJ1ZmZlcihTLl9fd2ViZ2xEZXB0aGJ1ZmZlciksUy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXImJmkuZGVsZXRlRnJhbWVidWZmZXIoUy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpLFMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyKWZvcihsZXQgWT0wO1k8Uy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIubGVuZ3RoO1krKylTLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltZXSYmaS5kZWxldGVSZW5kZXJidWZmZXIoUy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbWV0pO1MuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyJiZpLmRlbGV0ZVJlbmRlcmJ1ZmZlcihTLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcil9Y29uc3QgTz1SLnRleHR1cmVzO2ZvcihsZXQgWT0wLFo9Ty5sZW5ndGg7WTxaO1krKyl7Y29uc3Qgaj1uLmdldChPW1ldKTtqLl9fd2ViZ2xUZXh0dXJlJiYoaS5kZWxldGVUZXh0dXJlKGouX193ZWJnbFRleHR1cmUpLG8ubWVtb3J5LnRleHR1cmVzLS0pLG4ucmVtb3ZlKE9bWV0pfW4ucmVtb3ZlKFIpfWxldCBNPTA7ZnVuY3Rpb24gQSgpe009MH1mdW5jdGlvbiBGKCl7Y29uc3QgUj1NO3JldHVybiBSPj1yLm1heFRleHR1cmVzJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXM6IFRyeWluZyB0byB1c2UgIitSKyIgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICIrci5tYXhUZXh0dXJlcyksTSs9MSxSfWZ1bmN0aW9uIEQoUil7Y29uc3QgUz1bXTtyZXR1cm4gUy5wdXNoKFIud3JhcFMpLFMucHVzaChSLndyYXBUKSxTLnB1c2goUi53cmFwUnx8MCksUy5wdXNoKFIubWFnRmlsdGVyKSxTLnB1c2goUi5taW5GaWx0ZXIpLFMucHVzaChSLmFuaXNvdHJvcHkpLFMucHVzaChSLmludGVybmFsRm9ybWF0KSxTLnB1c2goUi5mb3JtYXQpLFMucHVzaChSLnR5cGUpLFMucHVzaChSLmdlbmVyYXRlTWlwbWFwcyksUy5wdXNoKFIucHJlbXVsdGlwbHlBbHBoYSksUy5wdXNoKFIuZmxpcFkpLFMucHVzaChSLnVucGFja0FsaWdubWVudCksUy5wdXNoKFIuY29sb3JTcGFjZSksUy5qb2luKCl9ZnVuY3Rpb24gTihSLFMpe2NvbnN0IE89bi5nZXQoUik7aWYoUi5pc1ZpZGVvVGV4dHVyZSYmUHQoUiksUi5pc1JlbmRlclRhcmdldFRleHR1cmU9PT0hMSYmUi52ZXJzaW9uPjAmJk8uX192ZXJzaW9uIT09Ui52ZXJzaW9uKXtjb25zdCBZPVIuaW1hZ2U7aWYoWT09PW51bGwpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBubyBpbWFnZSBkYXRhIGZvdW5kLiIpO2Vsc2UgaWYoWS5jb21wbGV0ZT09PSExKWNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZSIpO2Vsc2V7VnQoTyxSLFMpO3JldHVybn19ZS5iaW5kVGV4dHVyZShpLlRFWFRVUkVfMkQsTy5fX3dlYmdsVGV4dHVyZSxpLlRFWFRVUkUwK1MpfWZ1bmN0aW9uIFUoUixTKXtjb25zdCBPPW4uZ2V0KFIpO2lmKFIudmVyc2lvbj4wJiZPLl9fdmVyc2lvbiE9PVIudmVyc2lvbil7VnQoTyxSLFMpO3JldHVybn1lLmJpbmRUZXh0dXJlKGkuVEVYVFVSRV8yRF9BUlJBWSxPLl9fd2ViZ2xUZXh0dXJlLGkuVEVYVFVSRTArUyl9ZnVuY3Rpb24gQihSLFMpe2NvbnN0IE89bi5nZXQoUik7aWYoUi52ZXJzaW9uPjAmJk8uX192ZXJzaW9uIT09Ui52ZXJzaW9uKXtWdChPLFIsUyk7cmV0dXJufWUuYmluZFRleHR1cmUoaS5URVhUVVJFXzNELE8uX193ZWJnbFRleHR1cmUsaS5URVhUVVJFMCtTKX1mdW5jdGlvbiBIKFIsUyl7Y29uc3QgTz1uLmdldChSKTtpZihSLnZlcnNpb24+MCYmTy5fX3ZlcnNpb24hPT1SLnZlcnNpb24pe0soTyxSLFMpO3JldHVybn1lLmJpbmRUZXh0dXJlKGkuVEVYVFVSRV9DVUJFX01BUCxPLl9fd2ViZ2xUZXh0dXJlLGkuVEVYVFVSRTArUyl9Y29uc3QgRz17W2hvXTppLlJFUEVBVCxbSW5dOmkuQ0xBTVBfVE9fRURHRSxbZm9dOmkuTUlSUk9SRURfUkVQRUFUfSx0dD17W0ZlXTppLk5FQVJFU1QsW2doXTppLk5FQVJFU1RfTUlQTUFQX05FQVJFU1QsW1FyXTppLk5FQVJFU1RfTUlQTUFQX0xJTkVBUixbUmVdOmkuTElORUFSLFtwb106aS5MSU5FQVJfTUlQTUFQX05FQVJFU1QsW2puXTppLkxJTkVBUl9NSVBNQVBfTElORUFSfSxsdD17W1FtXTppLk5FVkVSLFtzZ106aS5BTFdBWVMsW3RnXTppLkxFU1MsW0NoXTppLkxFUVVBTCxbZWddOmkuRVFVQUwsW3JnXTppLkdFUVVBTCxbbmddOmkuR1JFQVRFUixbaWddOmkuTk9URVFVQUx9O2Z1bmN0aW9uIGh0KFIsUyl7aWYoUy50eXBlPT09Y24mJnQuaGFzKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKT09PSExJiYoUy5tYWdGaWx0ZXI9PT1SZXx8Uy5tYWdGaWx0ZXI9PT1wb3x8Uy5tYWdGaWx0ZXI9PT1Rcnx8Uy5tYWdGaWx0ZXI9PT1qbnx8Uy5taW5GaWx0ZXI9PT1SZXx8Uy5taW5GaWx0ZXI9PT1wb3x8Uy5taW5GaWx0ZXI9PT1Rcnx8Uy5taW5GaWx0ZXI9PT1qbikmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVW5hYmxlIHRvIHVzZSBsaW5lYXIgZmlsdGVyaW5nIHdpdGggZmxvYXRpbmcgcG9pbnQgdGV4dHVyZXMuIE9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLiIpLGkudGV4UGFyYW1ldGVyaShSLGkuVEVYVFVSRV9XUkFQX1MsR1tTLndyYXBTXSksaS50ZXhQYXJhbWV0ZXJpKFIsaS5URVhUVVJFX1dSQVBfVCxHW1Mud3JhcFRdKSwoUj09PWkuVEVYVFVSRV8zRHx8Uj09PWkuVEVYVFVSRV8yRF9BUlJBWSkmJmkudGV4UGFyYW1ldGVyaShSLGkuVEVYVFVSRV9XUkFQX1IsR1tTLndyYXBSXSksaS50ZXhQYXJhbWV0ZXJpKFIsaS5URVhUVVJFX01BR19GSUxURVIsdHRbUy5tYWdGaWx0ZXJdKSxpLnRleFBhcmFtZXRlcmkoUixpLlRFWFRVUkVfTUlOX0ZJTFRFUix0dFtTLm1pbkZpbHRlcl0pLFMuY29tcGFyZUZ1bmN0aW9uJiYoaS50ZXhQYXJhbWV0ZXJpKFIsaS5URVhUVVJFX0NPTVBBUkVfTU9ERSxpLkNPTVBBUkVfUkVGX1RPX1RFWFRVUkUpLGkudGV4UGFyYW1ldGVyaShSLGkuVEVYVFVSRV9DT01QQVJFX0ZVTkMsbHRbUy5jb21wYXJlRnVuY3Rpb25dKSksdC5oYXMoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpPT09ITApe2lmKFMubWFnRmlsdGVyPT09RmV8fFMubWluRmlsdGVyIT09UXImJlMubWluRmlsdGVyIT09am58fFMudHlwZT09PWNuJiZ0LmhhcygiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik9PT0hMSlyZXR1cm47aWYoUy5hbmlzb3Ryb3B5PjF8fG4uZ2V0KFMpLl9fY3VycmVudEFuaXNvdHJvcHkpe2NvbnN0IE89dC5nZXQoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO2kudGV4UGFyYW1ldGVyZihSLE8uVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsTWF0aC5taW4oUy5hbmlzb3Ryb3B5LHIuZ2V0TWF4QW5pc290cm9weSgpKSksbi5nZXQoUykuX19jdXJyZW50QW5pc290cm9weT1TLmFuaXNvdHJvcHl9fX1mdW5jdGlvbiBSdChSLFMpe2xldCBPPSExO1IuX193ZWJnbEluaXQ9PT12b2lkIDAmJihSLl9fd2ViZ2xJbml0PSEwLFMuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsRSkpO2NvbnN0IFk9Uy5zb3VyY2U7bGV0IFo9Zi5nZXQoWSk7Wj09PXZvaWQgMCYmKFo9e30sZi5zZXQoWSxaKSk7Y29uc3Qgaj1EKFMpO2lmKGohPT1SLl9fY2FjaGVLZXkpe1pbal09PT12b2lkIDAmJihaW2pdPXt0ZXh0dXJlOmkuY3JlYXRlVGV4dHVyZSgpLHVzZWRUaW1lczowfSxvLm1lbW9yeS50ZXh0dXJlcysrLE89ITApLFpbal0udXNlZFRpbWVzKys7Y29uc3QgX3Q9WltSLl9fY2FjaGVLZXldO190IT09dm9pZCAwJiYoWltSLl9fY2FjaGVLZXldLnVzZWRUaW1lcy0tLF90LnVzZWRUaW1lcz09PTAmJlAoUykpLFIuX19jYWNoZUtleT1qLFIuX193ZWJnbFRleHR1cmU9WltqXS50ZXh0dXJlfXJldHVybiBPfWZ1bmN0aW9uIFZ0KFIsUyxPKXtsZXQgWT1pLlRFWFRVUkVfMkQ7KFMuaXNEYXRhQXJyYXlUZXh0dXJlfHxTLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSkmJihZPWkuVEVYVFVSRV8yRF9BUlJBWSksUy5pc0RhdGEzRFRleHR1cmUmJihZPWkuVEVYVFVSRV8zRCk7Y29uc3QgWj1SdChSLFMpLGo9Uy5zb3VyY2U7ZS5iaW5kVGV4dHVyZShZLFIuX193ZWJnbFRleHR1cmUsaS5URVhUVVJFMCtPKTtjb25zdCBfdD1uLmdldChqKTtpZihqLnZlcnNpb24hPT1fdC5fX3ZlcnNpb258fFo9PT0hMCl7ZS5hY3RpdmVUZXh0dXJlKGkuVEVYVFVSRTArTyk7Y29uc3QgYXQ9c2UuZ2V0UHJpbWFyaWVzKHNlLndvcmtpbmdDb2xvclNwYWNlKSxndD1TLmNvbG9yU3BhY2U9PT1naT9udWxsOnNlLmdldFByaW1hcmllcyhTLmNvbG9yU3BhY2UpLGt0PVMuY29sb3JTcGFjZT09PWdpfHxhdD09PWd0P2kuTk9ORTppLkJST1dTRVJfREVGQVVMVF9XRUJHTDtpLnBpeGVsU3RvcmVpKGkuVU5QQUNLX0ZMSVBfWV9XRUJHTCxTLmZsaXBZKSxpLnBpeGVsU3RvcmVpKGkuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLFMucHJlbXVsdGlwbHlBbHBoYSksaS5waXhlbFN0b3JlaShpLlVOUEFDS19BTElHTk1FTlQsUy51bnBhY2tBbGlnbm1lbnQpLGkucGl4ZWxTdG9yZWkoaS5VTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMLGt0KTtsZXQgc3Q9eShTLmltYWdlLCExLHIubWF4VGV4dHVyZVNpemUpO3N0PSQoUyxzdCk7Y29uc3QgeXQ9cy5jb252ZXJ0KFMuZm9ybWF0LFMuY29sb3JTcGFjZSksS3Q9cy5jb252ZXJ0KFMudHlwZSk7bGV0IFV0PXgoUy5pbnRlcm5hbEZvcm1hdCx5dCxLdCxTLmNvbG9yU3BhY2UsUy5pc1ZpZGVvVGV4dHVyZSk7aHQoWSxTKTtsZXQgYnQ7Y29uc3QgSHQ9Uy5taXBtYXBzLFl0PVMuaXNWaWRlb1RleHR1cmUhPT0hMCxtZT1fdC5fX3ZlcnNpb249PT12b2lkIDB8fFo9PT0hMCx6PWouZGF0YVJlYWR5LGN0PV8oUyxzdCk7aWYoUy5pc0RlcHRoVGV4dHVyZSlVdD12KFMuZm9ybWF0PT09ZnIsUy50eXBlKSxtZSYmKFl0P2UudGV4U3RvcmFnZTJEKGkuVEVYVFVSRV8yRCwxLFV0LHN0LndpZHRoLHN0LmhlaWdodCk6ZS50ZXhJbWFnZTJEKGkuVEVYVFVSRV8yRCwwLFV0LHN0LndpZHRoLHN0LmhlaWdodCwwLHl0LEt0LG51bGwpKTtlbHNlIGlmKFMuaXNEYXRhVGV4dHVyZSlpZihIdC5sZW5ndGg+MCl7WXQmJm1lJiZlLnRleFN0b3JhZ2UyRChpLlRFWFRVUkVfMkQsY3QsVXQsSHRbMF0ud2lkdGgsSHRbMF0uaGVpZ2h0KTtmb3IobGV0IGV0PTAsbnQ9SHQubGVuZ3RoO2V0PG50O2V0KyspYnQ9SHRbZXRdLFl0P3omJmUudGV4U3ViSW1hZ2UyRChpLlRFWFRVUkVfMkQsZXQsMCwwLGJ0LndpZHRoLGJ0LmhlaWdodCx5dCxLdCxidC5kYXRhKTplLnRleEltYWdlMkQoaS5URVhUVVJFXzJELGV0LFV0LGJ0LndpZHRoLGJ0LmhlaWdodCwwLHl0LEt0LGJ0LmRhdGEpO1MuZ2VuZXJhdGVNaXBtYXBzPSExfWVsc2UgWXQ/KG1lJiZlLnRleFN0b3JhZ2UyRChpLlRFWFRVUkVfMkQsY3QsVXQsc3Qud2lkdGgsc3QuaGVpZ2h0KSx6JiZlLnRleFN1YkltYWdlMkQoaS5URVhUVVJFXzJELDAsMCwwLHN0LndpZHRoLHN0LmhlaWdodCx5dCxLdCxzdC5kYXRhKSk6ZS50ZXhJbWFnZTJEKGkuVEVYVFVSRV8yRCwwLFV0LHN0LndpZHRoLHN0LmhlaWdodCwwLHl0LEt0LHN0LmRhdGEpO2Vsc2UgaWYoUy5pc0NvbXByZXNzZWRUZXh0dXJlKWlmKFMuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlKXtZdCYmbWUmJmUudGV4U3RvcmFnZTNEKGkuVEVYVFVSRV8yRF9BUlJBWSxjdCxVdCxIdFswXS53aWR0aCxIdFswXS5oZWlnaHQsc3QuZGVwdGgpO2ZvcihsZXQgZXQ9MCxudD1IdC5sZW5ndGg7ZXQ8bnQ7ZXQrKylpZihidD1IdFtldF0sUy5mb3JtYXQhPT1qZSlpZih5dCE9PW51bGwpaWYoWXQpe2lmKHopaWYoUy5sYXllclVwZGF0ZXMuc2l6ZT4wKXtjb25zdCBmdD1oZihidC53aWR0aCxidC5oZWlnaHQsUy5mb3JtYXQsUy50eXBlKTtmb3IoY29uc3QgT3Qgb2YgUy5sYXllclVwZGF0ZXMpe2NvbnN0IHJlPWJ0LmRhdGEuc3ViYXJyYXkoT3QqZnQvYnQuZGF0YS5CWVRFU19QRVJfRUxFTUVOVCwoT3QrMSkqZnQvYnQuZGF0YS5CWVRFU19QRVJfRUxFTUVOVCk7ZS5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRChpLlRFWFRVUkVfMkRfQVJSQVksZXQsMCwwLE90LGJ0LndpZHRoLGJ0LmhlaWdodCwxLHl0LHJlLDAsMCl9Uy5jbGVhckxheWVyVXBkYXRlcygpfWVsc2UgZS5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRChpLlRFWFRVUkVfMkRfQVJSQVksZXQsMCwwLDAsYnQud2lkdGgsYnQuaGVpZ2h0LHN0LmRlcHRoLHl0LGJ0LmRhdGEsMCwwKX1lbHNlIGUuY29tcHJlc3NlZFRleEltYWdlM0QoaS5URVhUVVJFXzJEX0FSUkFZLGV0LFV0LGJ0LndpZHRoLGJ0LmhlaWdodCxzdC5kZXB0aCwwLGJ0LmRhdGEsMCwwKTtlbHNlIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnVwbG9hZFRleHR1cmUoKSIpO2Vsc2UgWXQ/eiYmZS50ZXhTdWJJbWFnZTNEKGkuVEVYVFVSRV8yRF9BUlJBWSxldCwwLDAsMCxidC53aWR0aCxidC5oZWlnaHQsc3QuZGVwdGgseXQsS3QsYnQuZGF0YSk6ZS50ZXhJbWFnZTNEKGkuVEVYVFVSRV8yRF9BUlJBWSxldCxVdCxidC53aWR0aCxidC5oZWlnaHQsc3QuZGVwdGgsMCx5dCxLdCxidC5kYXRhKX1lbHNle1l0JiZtZSYmZS50ZXhTdG9yYWdlMkQoaS5URVhUVVJFXzJELGN0LFV0LEh0WzBdLndpZHRoLEh0WzBdLmhlaWdodCk7Zm9yKGxldCBldD0wLG50PUh0Lmxlbmd0aDtldDxudDtldCsrKWJ0PUh0W2V0XSxTLmZvcm1hdCE9PWplP3l0IT09bnVsbD9ZdD96JiZlLmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKGkuVEVYVFVSRV8yRCxldCwwLDAsYnQud2lkdGgsYnQuaGVpZ2h0LHl0LGJ0LmRhdGEpOmUuY29tcHJlc3NlZFRleEltYWdlMkQoaS5URVhUVVJFXzJELGV0LFV0LGJ0LndpZHRoLGJ0LmhlaWdodCwwLGJ0LmRhdGEpOmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnVwbG9hZFRleHR1cmUoKSIpOll0P3omJmUudGV4U3ViSW1hZ2UyRChpLlRFWFRVUkVfMkQsZXQsMCwwLGJ0LndpZHRoLGJ0LmhlaWdodCx5dCxLdCxidC5kYXRhKTplLnRleEltYWdlMkQoaS5URVhUVVJFXzJELGV0LFV0LGJ0LndpZHRoLGJ0LmhlaWdodCwwLHl0LEt0LGJ0LmRhdGEpfWVsc2UgaWYoUy5pc0RhdGFBcnJheVRleHR1cmUpaWYoWXQpe2lmKG1lJiZlLnRleFN0b3JhZ2UzRChpLlRFWFRVUkVfMkRfQVJSQVksY3QsVXQsc3Qud2lkdGgsc3QuaGVpZ2h0LHN0LmRlcHRoKSx6KWlmKFMubGF5ZXJVcGRhdGVzLnNpemU+MCl7Y29uc3QgZXQ9aGYoc3Qud2lkdGgsc3QuaGVpZ2h0LFMuZm9ybWF0LFMudHlwZSk7Zm9yKGNvbnN0IG50IG9mIFMubGF5ZXJVcGRhdGVzKXtjb25zdCBmdD1zdC5kYXRhLnN1YmFycmF5KG50KmV0L3N0LmRhdGEuQllURVNfUEVSX0VMRU1FTlQsKG50KzEpKmV0L3N0LmRhdGEuQllURVNfUEVSX0VMRU1FTlQpO2UudGV4U3ViSW1hZ2UzRChpLlRFWFRVUkVfMkRfQVJSQVksMCwwLDAsbnQsc3Qud2lkdGgsc3QuaGVpZ2h0LDEseXQsS3QsZnQpfVMuY2xlYXJMYXllclVwZGF0ZXMoKX1lbHNlIGUudGV4U3ViSW1hZ2UzRChpLlRFWFRVUkVfMkRfQVJSQVksMCwwLDAsMCxzdC53aWR0aCxzdC5oZWlnaHQsc3QuZGVwdGgseXQsS3Qsc3QuZGF0YSl9ZWxzZSBlLnRleEltYWdlM0QoaS5URVhUVVJFXzJEX0FSUkFZLDAsVXQsc3Qud2lkdGgsc3QuaGVpZ2h0LHN0LmRlcHRoLDAseXQsS3Qsc3QuZGF0YSk7ZWxzZSBpZihTLmlzRGF0YTNEVGV4dHVyZSlZdD8obWUmJmUudGV4U3RvcmFnZTNEKGkuVEVYVFVSRV8zRCxjdCxVdCxzdC53aWR0aCxzdC5oZWlnaHQsc3QuZGVwdGgpLHomJmUudGV4U3ViSW1hZ2UzRChpLlRFWFRVUkVfM0QsMCwwLDAsMCxzdC53aWR0aCxzdC5oZWlnaHQsc3QuZGVwdGgseXQsS3Qsc3QuZGF0YSkpOmUudGV4SW1hZ2UzRChpLlRFWFRVUkVfM0QsMCxVdCxzdC53aWR0aCxzdC5oZWlnaHQsc3QuZGVwdGgsMCx5dCxLdCxzdC5kYXRhKTtlbHNlIGlmKFMuaXNGcmFtZWJ1ZmZlclRleHR1cmUpe2lmKG1lKWlmKFl0KWUudGV4U3RvcmFnZTJEKGkuVEVYVFVSRV8yRCxjdCxVdCxzdC53aWR0aCxzdC5oZWlnaHQpO2Vsc2V7bGV0IGV0PXN0LndpZHRoLG50PXN0LmhlaWdodDtmb3IobGV0IGZ0PTA7ZnQ8Y3Q7ZnQrKyllLnRleEltYWdlMkQoaS5URVhUVVJFXzJELGZ0LFV0LGV0LG50LDAseXQsS3QsbnVsbCksZXQ+Pj0xLG50Pj49MX19ZWxzZSBpZihIdC5sZW5ndGg+MCl7aWYoWXQmJm1lKXtjb25zdCBldD1KKEh0WzBdKTtlLnRleFN0b3JhZ2UyRChpLlRFWFRVUkVfMkQsY3QsVXQsZXQud2lkdGgsZXQuaGVpZ2h0KX1mb3IobGV0IGV0PTAsbnQ9SHQubGVuZ3RoO2V0PG50O2V0KyspYnQ9SHRbZXRdLFl0P3omJmUudGV4U3ViSW1hZ2UyRChpLlRFWFRVUkVfMkQsZXQsMCwwLHl0LEt0LGJ0KTplLnRleEltYWdlMkQoaS5URVhUVVJFXzJELGV0LFV0LHl0LEt0LGJ0KTtTLmdlbmVyYXRlTWlwbWFwcz0hMX1lbHNlIGlmKFl0KXtpZihtZSl7Y29uc3QgZXQ9SihzdCk7ZS50ZXhTdG9yYWdlMkQoaS5URVhUVVJFXzJELGN0LFV0LGV0LndpZHRoLGV0LmhlaWdodCl9eiYmZS50ZXhTdWJJbWFnZTJEKGkuVEVYVFVSRV8yRCwwLDAsMCx5dCxLdCxzdCl9ZWxzZSBlLnRleEltYWdlMkQoaS5URVhUVVJFXzJELDAsVXQseXQsS3Qsc3QpO20oUykmJmcoWSksX3QuX192ZXJzaW9uPWoudmVyc2lvbixTLm9uVXBkYXRlJiZTLm9uVXBkYXRlKFMpfVIuX192ZXJzaW9uPVMudmVyc2lvbn1mdW5jdGlvbiBLKFIsUyxPKXtpZihTLmltYWdlLmxlbmd0aCE9PTYpcmV0dXJuO2NvbnN0IFk9UnQoUixTKSxaPVMuc291cmNlO2UuYmluZFRleHR1cmUoaS5URVhUVVJFX0NVQkVfTUFQLFIuX193ZWJnbFRleHR1cmUsaS5URVhUVVJFMCtPKTtjb25zdCBqPW4uZ2V0KFopO2lmKFoudmVyc2lvbiE9PWouX192ZXJzaW9ufHxZPT09ITApe2UuYWN0aXZlVGV4dHVyZShpLlRFWFRVUkUwK08pO2NvbnN0IF90PXNlLmdldFByaW1hcmllcyhzZS53b3JraW5nQ29sb3JTcGFjZSksYXQ9Uy5jb2xvclNwYWNlPT09Z2k/bnVsbDpzZS5nZXRQcmltYXJpZXMoUy5jb2xvclNwYWNlKSxndD1TLmNvbG9yU3BhY2U9PT1naXx8X3Q9PT1hdD9pLk5PTkU6aS5CUk9XU0VSX0RFRkFVTFRfV0VCR0w7aS5waXhlbFN0b3JlaShpLlVOUEFDS19GTElQX1lfV0VCR0wsUy5mbGlwWSksaS5waXhlbFN0b3JlaShpLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCxTLnByZW11bHRpcGx5QWxwaGEpLGkucGl4ZWxTdG9yZWkoaS5VTlBBQ0tfQUxJR05NRU5ULFMudW5wYWNrQWxpZ25tZW50KSxpLnBpeGVsU3RvcmVpKGkuVU5QQUNLX0NPTE9SU1BBQ0VfQ09OVkVSU0lPTl9XRUJHTCxndCk7Y29uc3Qga3Q9Uy5pc0NvbXByZXNzZWRUZXh0dXJlfHxTLmltYWdlWzBdLmlzQ29tcHJlc3NlZFRleHR1cmUsc3Q9Uy5pbWFnZVswXSYmUy5pbWFnZVswXS5pc0RhdGFUZXh0dXJlLHl0PVtdO2ZvcihsZXQgbnQ9MDtudDw2O250KyspIWt0JiYhc3Q/eXRbbnRdPXkoUy5pbWFnZVtudF0sITAsci5tYXhDdWJlbWFwU2l6ZSk6eXRbbnRdPXN0P1MuaW1hZ2VbbnRdLmltYWdlOlMuaW1hZ2VbbnRdLHl0W250XT0kKFMseXRbbnRdKTtjb25zdCBLdD15dFswXSxVdD1zLmNvbnZlcnQoUy5mb3JtYXQsUy5jb2xvclNwYWNlKSxidD1zLmNvbnZlcnQoUy50eXBlKSxIdD14KFMuaW50ZXJuYWxGb3JtYXQsVXQsYnQsUy5jb2xvclNwYWNlKSxZdD1TLmlzVmlkZW9UZXh0dXJlIT09ITAsbWU9ai5fX3ZlcnNpb249PT12b2lkIDB8fFk9PT0hMCx6PVouZGF0YVJlYWR5O2xldCBjdD1fKFMsS3QpO2h0KGkuVEVYVFVSRV9DVUJFX01BUCxTKTtsZXQgZXQ7aWYoa3Qpe1l0JiZtZSYmZS50ZXhTdG9yYWdlMkQoaS5URVhUVVJFX0NVQkVfTUFQLGN0LEh0LEt0LndpZHRoLEt0LmhlaWdodCk7Zm9yKGxldCBudD0wO250PDY7bnQrKyl7ZXQ9eXRbbnRdLm1pcG1hcHM7Zm9yKGxldCBmdD0wO2Z0PGV0Lmxlbmd0aDtmdCsrKXtjb25zdCBPdD1ldFtmdF07Uy5mb3JtYXQhPT1qZT9VdCE9PW51bGw/WXQ/eiYmZS5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRChpLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtudCxmdCwwLDAsT3Qud2lkdGgsT3QuaGVpZ2h0LFV0LE90LmRhdGEpOmUuY29tcHJlc3NlZFRleEltYWdlMkQoaS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1grbnQsZnQsSHQsT3Qud2lkdGgsT3QuaGVpZ2h0LDAsT3QuZGF0YSk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAuc2V0VGV4dHVyZUN1YmUoKSIpOll0P3omJmUudGV4U3ViSW1hZ2UyRChpLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtudCxmdCwwLDAsT3Qud2lkdGgsT3QuaGVpZ2h0LFV0LGJ0LE90LmRhdGEpOmUudGV4SW1hZ2UyRChpLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtudCxmdCxIdCxPdC53aWR0aCxPdC5oZWlnaHQsMCxVdCxidCxPdC5kYXRhKX19fWVsc2V7aWYoZXQ9Uy5taXBtYXBzLFl0JiZtZSl7ZXQubGVuZ3RoPjAmJmN0Kys7Y29uc3QgbnQ9Sih5dFswXSk7ZS50ZXhTdG9yYWdlMkQoaS5URVhUVVJFX0NVQkVfTUFQLGN0LEh0LG50LndpZHRoLG50LmhlaWdodCl9Zm9yKGxldCBudD0wO250PDY7bnQrKylpZihzdCl7WXQ/eiYmZS50ZXhTdWJJbWFnZTJEKGkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK250LDAsMCwwLHl0W250XS53aWR0aCx5dFtudF0uaGVpZ2h0LFV0LGJ0LHl0W250XS5kYXRhKTplLnRleEltYWdlMkQoaS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1grbnQsMCxIdCx5dFtudF0ud2lkdGgseXRbbnRdLmhlaWdodCwwLFV0LGJ0LHl0W250XS5kYXRhKTtmb3IobGV0IGZ0PTA7ZnQ8ZXQubGVuZ3RoO2Z0Kyspe2NvbnN0IHJlPWV0W2Z0XS5pbWFnZVtudF0uaW1hZ2U7WXQ/eiYmZS50ZXhTdWJJbWFnZTJEKGkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK250LGZ0KzEsMCwwLHJlLndpZHRoLHJlLmhlaWdodCxVdCxidCxyZS5kYXRhKTplLnRleEltYWdlMkQoaS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1grbnQsZnQrMSxIdCxyZS53aWR0aCxyZS5oZWlnaHQsMCxVdCxidCxyZS5kYXRhKX19ZWxzZXtZdD96JiZlLnRleFN1YkltYWdlMkQoaS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1grbnQsMCwwLDAsVXQsYnQseXRbbnRdKTplLnRleEltYWdlMkQoaS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1grbnQsMCxIdCxVdCxidCx5dFtudF0pO2ZvcihsZXQgZnQ9MDtmdDxldC5sZW5ndGg7ZnQrKyl7Y29uc3QgT3Q9ZXRbZnRdO1l0P3omJmUudGV4U3ViSW1hZ2UyRChpLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtudCxmdCsxLDAsMCxVdCxidCxPdC5pbWFnZVtudF0pOmUudGV4SW1hZ2UyRChpLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtudCxmdCsxLEh0LFV0LGJ0LE90LmltYWdlW250XSl9fX1tKFMpJiZnKGkuVEVYVFVSRV9DVUJFX01BUCksai5fX3ZlcnNpb249Wi52ZXJzaW9uLFMub25VcGRhdGUmJlMub25VcGRhdGUoUyl9Ui5fX3ZlcnNpb249Uy52ZXJzaW9ufWZ1bmN0aW9uIHJ0KFIsUyxPLFksWixqKXtjb25zdCBfdD1zLmNvbnZlcnQoTy5mb3JtYXQsTy5jb2xvclNwYWNlKSxhdD1zLmNvbnZlcnQoTy50eXBlKSxndD14KE8uaW50ZXJuYWxGb3JtYXQsX3QsYXQsTy5jb2xvclNwYWNlKTtpZighbi5nZXQoUykuX19oYXNFeHRlcm5hbFRleHR1cmVzKXtjb25zdCBzdD1NYXRoLm1heCgxLFMud2lkdGg+PmopLHl0PU1hdGgubWF4KDEsUy5oZWlnaHQ+PmopO1o9PT1pLlRFWFRVUkVfM0R8fFo9PT1pLlRFWFRVUkVfMkRfQVJSQVk/ZS50ZXhJbWFnZTNEKFosaixndCxzdCx5dCxTLmRlcHRoLDAsX3QsYXQsbnVsbCk6ZS50ZXhJbWFnZTJEKFosaixndCxzdCx5dCwwLF90LGF0LG51bGwpfWUuYmluZEZyYW1lYnVmZmVyKGkuRlJBTUVCVUZGRVIsUiksUShTKT9hLmZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQoaS5GUkFNRUJVRkZFUixZLFosbi5nZXQoTykuX193ZWJnbFRleHR1cmUsMCxtdChTKSk6KFo9PT1pLlRFWFRVUkVfMkR8fFo+PWkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YJiZaPD1pLlRFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWikmJmkuZnJhbWVidWZmZXJUZXh0dXJlMkQoaS5GUkFNRUJVRkZFUixZLFosbi5nZXQoTykuX193ZWJnbFRleHR1cmUsaiksZS5iaW5kRnJhbWVidWZmZXIoaS5GUkFNRUJVRkZFUixudWxsKX1mdW5jdGlvbiBNdChSLFMsTyl7aWYoaS5iaW5kUmVuZGVyYnVmZmVyKGkuUkVOREVSQlVGRkVSLFIpLFMuZGVwdGhCdWZmZXIpe2NvbnN0IFk9Uy5kZXB0aFRleHR1cmUsWj1ZJiZZLmlzRGVwdGhUZXh0dXJlP1kudHlwZTpudWxsLGo9dihTLnN0ZW5jaWxCdWZmZXIsWiksX3Q9Uy5zdGVuY2lsQnVmZmVyP2kuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UOmkuREVQVEhfQVRUQUNITUVOVCxhdD1tdChTKTtRKFMpP2EucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKGkuUkVOREVSQlVGRkVSLGF0LGosUy53aWR0aCxTLmhlaWdodCk6Tz9pLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZShpLlJFTkRFUkJVRkZFUixhdCxqLFMud2lkdGgsUy5oZWlnaHQpOmkucmVuZGVyYnVmZmVyU3RvcmFnZShpLlJFTkRFUkJVRkZFUixqLFMud2lkdGgsUy5oZWlnaHQpLGkuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoaS5GUkFNRUJVRkZFUixfdCxpLlJFTkRFUkJVRkZFUixSKX1lbHNle2NvbnN0IFk9Uy50ZXh0dXJlcztmb3IobGV0IFo9MDtaPFkubGVuZ3RoO1orKyl7Y29uc3Qgaj1ZW1pdLF90PXMuY29udmVydChqLmZvcm1hdCxqLmNvbG9yU3BhY2UpLGF0PXMuY29udmVydChqLnR5cGUpLGd0PXgoai5pbnRlcm5hbEZvcm1hdCxfdCxhdCxqLmNvbG9yU3BhY2UpLGt0PW10KFMpO08mJlEoUyk9PT0hMT9pLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZShpLlJFTkRFUkJVRkZFUixrdCxndCxTLndpZHRoLFMuaGVpZ2h0KTpRKFMpP2EucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKGkuUkVOREVSQlVGRkVSLGt0LGd0LFMud2lkdGgsUy5oZWlnaHQpOmkucmVuZGVyYnVmZmVyU3RvcmFnZShpLlJFTkRFUkJVRkZFUixndCxTLndpZHRoLFMuaGVpZ2h0KX19aS5iaW5kUmVuZGVyYnVmZmVyKGkuUkVOREVSQlVGRkVSLG51bGwpfWZ1bmN0aW9uIHB0KFIsUyl7aWYoUyYmUy5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCl0aHJvdyBuZXcgRXJyb3IoIkRlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQiKTtpZihlLmJpbmRGcmFtZWJ1ZmZlcihpLkZSQU1FQlVGRkVSLFIpLCEoUy5kZXB0aFRleHR1cmUmJlMuZGVwdGhUZXh0dXJlLmlzRGVwdGhUZXh0dXJlKSl0aHJvdyBuZXcgRXJyb3IoInJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUiKTsoIW4uZ2V0KFMuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZXx8Uy5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGghPT1TLndpZHRofHxTLmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQhPT1TLmhlaWdodCkmJihTLmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aD1TLndpZHRoLFMuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1TLmhlaWdodCxTLmRlcHRoVGV4dHVyZS5uZWVkc1VwZGF0ZT0hMCksTihTLmRlcHRoVGV4dHVyZSwwKTtjb25zdCBZPW4uZ2V0KFMuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSxaPW10KFMpO2lmKFMuZGVwdGhUZXh0dXJlLmZvcm1hdD09PWhyKVEoUyk/YS5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKGkuRlJBTUVCVUZGRVIsaS5ERVBUSF9BVFRBQ0hNRU5ULGkuVEVYVFVSRV8yRCxZLDAsWik6aS5mcmFtZWJ1ZmZlclRleHR1cmUyRChpLkZSQU1FQlVGRkVSLGkuREVQVEhfQVRUQUNITUVOVCxpLlRFWFRVUkVfMkQsWSwwKTtlbHNlIGlmKFMuZGVwdGhUZXh0dXJlLmZvcm1hdD09PWZyKVEoUyk/YS5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKGkuRlJBTUVCVUZGRVIsaS5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsaS5URVhUVVJFXzJELFksMCxaKTppLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGkuRlJBTUVCVUZGRVIsaS5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsaS5URVhUVVJFXzJELFksMCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZGVwdGhUZXh0dXJlIGZvcm1hdCIpfWZ1bmN0aW9uIEl0KFIpe2NvbnN0IFM9bi5nZXQoUiksTz1SLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0PT09ITA7aWYoUy5fX2JvdW5kRGVwdGhUZXh0dXJlIT09Ui5kZXB0aFRleHR1cmUpe2NvbnN0IFk9Ui5kZXB0aFRleHR1cmU7aWYoUy5fX2RlcHRoRGlzcG9zZUNhbGxiYWNrJiZTLl9fZGVwdGhEaXNwb3NlQ2FsbGJhY2soKSxZKXtjb25zdCBaPSgpPT57ZGVsZXRlIFMuX19ib3VuZERlcHRoVGV4dHVyZSxkZWxldGUgUy5fX2RlcHRoRGlzcG9zZUNhbGxiYWNrLFkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsWil9O1kuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsWiksUy5fX2RlcHRoRGlzcG9zZUNhbGxiYWNrPVp9Uy5fX2JvdW5kRGVwdGhUZXh0dXJlPVl9aWYoUi5kZXB0aFRleHR1cmUmJiFTLl9fYXV0b0FsbG9jYXRlRGVwdGhCdWZmZXIpe2lmKE8pdGhyb3cgbmV3IEVycm9yKCJ0YXJnZXQuZGVwdGhUZXh0dXJlIG5vdCBzdXBwb3J0ZWQgaW4gQ3ViZSByZW5kZXIgdGFyZ2V0cyIpO3B0KFMuX193ZWJnbEZyYW1lYnVmZmVyLFIpfWVsc2UgaWYoTyl7Uy5fX3dlYmdsRGVwdGhidWZmZXI9W107Zm9yKGxldCBZPTA7WTw2O1krKylpZihlLmJpbmRGcmFtZWJ1ZmZlcihpLkZSQU1FQlVGRkVSLFMuX193ZWJnbEZyYW1lYnVmZmVyW1ldKSxTLl9fd2ViZ2xEZXB0aGJ1ZmZlcltZXT09PXZvaWQgMClTLl9fd2ViZ2xEZXB0aGJ1ZmZlcltZXT1pLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLE10KFMuX193ZWJnbERlcHRoYnVmZmVyW1ldLFIsITEpO2Vsc2V7Y29uc3QgWj1SLnN0ZW5jaWxCdWZmZXI/aS5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQ6aS5ERVBUSF9BVFRBQ0hNRU5ULGo9Uy5fX3dlYmdsRGVwdGhidWZmZXJbWV07aS5iaW5kUmVuZGVyYnVmZmVyKGkuUkVOREVSQlVGRkVSLGopLGkuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoaS5GUkFNRUJVRkZFUixaLGkuUkVOREVSQlVGRkVSLGopfX1lbHNlIGlmKGUuYmluZEZyYW1lYnVmZmVyKGkuRlJBTUVCVUZGRVIsUy5fX3dlYmdsRnJhbWVidWZmZXIpLFMuX193ZWJnbERlcHRoYnVmZmVyPT09dm9pZCAwKVMuX193ZWJnbERlcHRoYnVmZmVyPWkuY3JlYXRlUmVuZGVyYnVmZmVyKCksTXQoUy5fX3dlYmdsRGVwdGhidWZmZXIsUiwhMSk7ZWxzZXtjb25zdCBZPVIuc3RlbmNpbEJ1ZmZlcj9pLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVDppLkRFUFRIX0FUVEFDSE1FTlQsWj1TLl9fd2ViZ2xEZXB0aGJ1ZmZlcjtpLmJpbmRSZW5kZXJidWZmZXIoaS5SRU5ERVJCVUZGRVIsWiksaS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihpLkZSQU1FQlVGRkVSLFksaS5SRU5ERVJCVUZGRVIsWil9ZS5iaW5kRnJhbWVidWZmZXIoaS5GUkFNRUJVRkZFUixudWxsKX1mdW5jdGlvbiBGdChSLFMsTyl7Y29uc3QgWT1uLmdldChSKTtTIT09dm9pZCAwJiZydChZLl9fd2ViZ2xGcmFtZWJ1ZmZlcixSLFIudGV4dHVyZSxpLkNPTE9SX0FUVEFDSE1FTlQwLGkuVEVYVFVSRV8yRCwwKSxPIT09dm9pZCAwJiZJdChSKX1mdW5jdGlvbiBFdChSKXtjb25zdCBTPVIudGV4dHVyZSxPPW4uZ2V0KFIpLFk9bi5nZXQoUyk7Ui5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixiKTtjb25zdCBaPVIudGV4dHVyZXMsaj1SLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0PT09ITAsX3Q9Wi5sZW5ndGg+MTtpZihfdHx8KFkuX193ZWJnbFRleHR1cmU9PT12b2lkIDAmJihZLl9fd2ViZ2xUZXh0dXJlPWkuY3JlYXRlVGV4dHVyZSgpKSxZLl9fdmVyc2lvbj1TLnZlcnNpb24sby5tZW1vcnkudGV4dHVyZXMrKyksail7Ty5fX3dlYmdsRnJhbWVidWZmZXI9W107Zm9yKGxldCBhdD0wO2F0PDY7YXQrKylpZihTLm1pcG1hcHMmJlMubWlwbWFwcy5sZW5ndGg+MCl7Ty5fX3dlYmdsRnJhbWVidWZmZXJbYXRdPVtdO2ZvcihsZXQgZ3Q9MDtndDxTLm1pcG1hcHMubGVuZ3RoO2d0KyspTy5fX3dlYmdsRnJhbWVidWZmZXJbYXRdW2d0XT1pLmNyZWF0ZUZyYW1lYnVmZmVyKCl9ZWxzZSBPLl9fd2ViZ2xGcmFtZWJ1ZmZlclthdF09aS5jcmVhdGVGcmFtZWJ1ZmZlcigpfWVsc2V7aWYoUy5taXBtYXBzJiZTLm1pcG1hcHMubGVuZ3RoPjApe08uX193ZWJnbEZyYW1lYnVmZmVyPVtdO2ZvcihsZXQgYXQ9MDthdDxTLm1pcG1hcHMubGVuZ3RoO2F0KyspTy5fX3dlYmdsRnJhbWVidWZmZXJbYXRdPWkuY3JlYXRlRnJhbWVidWZmZXIoKX1lbHNlIE8uX193ZWJnbEZyYW1lYnVmZmVyPWkuY3JlYXRlRnJhbWVidWZmZXIoKTtpZihfdClmb3IobGV0IGF0PTAsZ3Q9Wi5sZW5ndGg7YXQ8Z3Q7YXQrKyl7Y29uc3Qga3Q9bi5nZXQoWlthdF0pO2t0Ll9fd2ViZ2xUZXh0dXJlPT09dm9pZCAwJiYoa3QuX193ZWJnbFRleHR1cmU9aS5jcmVhdGVUZXh0dXJlKCksby5tZW1vcnkudGV4dHVyZXMrKyl9aWYoUi5zYW1wbGVzPjAmJlEoUik9PT0hMSl7Ty5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI9aS5jcmVhdGVGcmFtZWJ1ZmZlcigpLE8uX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyPVtdLGUuYmluZEZyYW1lYnVmZmVyKGkuRlJBTUVCVUZGRVIsTy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpO2ZvcihsZXQgYXQ9MDthdDxaLmxlbmd0aDthdCsrKXtjb25zdCBndD1aW2F0XTtPLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlclthdF09aS5jcmVhdGVSZW5kZXJidWZmZXIoKSxpLmJpbmRSZW5kZXJidWZmZXIoaS5SRU5ERVJCVUZGRVIsTy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbYXRdKTtjb25zdCBrdD1zLmNvbnZlcnQoZ3QuZm9ybWF0LGd0LmNvbG9yU3BhY2UpLHN0PXMuY29udmVydChndC50eXBlKSx5dD14KGd0LmludGVybmFsRm9ybWF0LGt0LHN0LGd0LmNvbG9yU3BhY2UsUi5pc1hSUmVuZGVyVGFyZ2V0PT09ITApLEt0PW10KFIpO2kucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKGkuUkVOREVSQlVGRkVSLEt0LHl0LFIud2lkdGgsUi5oZWlnaHQpLGkuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoaS5GUkFNRUJVRkZFUixpLkNPTE9SX0FUVEFDSE1FTlQwK2F0LGkuUkVOREVSQlVGRkVSLE8uX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW2F0XSl9aS5iaW5kUmVuZGVyYnVmZmVyKGkuUkVOREVSQlVGRkVSLG51bGwpLFIuZGVwdGhCdWZmZXImJihPLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj1pLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLE10KE8uX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyLFIsITApKSxlLmJpbmRGcmFtZWJ1ZmZlcihpLkZSQU1FQlVGRkVSLG51bGwpfX1pZihqKXtlLmJpbmRUZXh0dXJlKGkuVEVYVFVSRV9DVUJFX01BUCxZLl9fd2ViZ2xUZXh0dXJlKSxodChpLlRFWFRVUkVfQ1VCRV9NQVAsUyk7Zm9yKGxldCBhdD0wO2F0PDY7YXQrKylpZihTLm1pcG1hcHMmJlMubWlwbWFwcy5sZW5ndGg+MClmb3IobGV0IGd0PTA7Z3Q8Uy5taXBtYXBzLmxlbmd0aDtndCsrKXJ0KE8uX193ZWJnbEZyYW1lYnVmZmVyW2F0XVtndF0sUixTLGkuQ09MT1JfQVRUQUNITUVOVDAsaS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1grYXQsZ3QpO2Vsc2UgcnQoTy5fX3dlYmdsRnJhbWVidWZmZXJbYXRdLFIsUyxpLkNPTE9SX0FUVEFDSE1FTlQwLGkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2F0LDApO20oUykmJmcoaS5URVhUVVJFX0NVQkVfTUFQKSxlLnVuYmluZFRleHR1cmUoKX1lbHNlIGlmKF90KXtmb3IobGV0IGF0PTAsZ3Q9Wi5sZW5ndGg7YXQ8Z3Q7YXQrKyl7Y29uc3Qga3Q9WlthdF0sc3Q9bi5nZXQoa3QpO2UuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELHN0Ll9fd2ViZ2xUZXh0dXJlKSxodChpLlRFWFRVUkVfMkQsa3QpLHJ0KE8uX193ZWJnbEZyYW1lYnVmZmVyLFIsa3QsaS5DT0xPUl9BVFRBQ0hNRU5UMCthdCxpLlRFWFRVUkVfMkQsMCksbShrdCkmJmcoaS5URVhUVVJFXzJEKX1lLnVuYmluZFRleHR1cmUoKX1lbHNle2xldCBhdD1pLlRFWFRVUkVfMkQ7aWYoKFIuaXNXZWJHTDNEUmVuZGVyVGFyZ2V0fHxSLmlzV2ViR0xBcnJheVJlbmRlclRhcmdldCkmJihhdD1SLmlzV2ViR0wzRFJlbmRlclRhcmdldD9pLlRFWFRVUkVfM0Q6aS5URVhUVVJFXzJEX0FSUkFZKSxlLmJpbmRUZXh0dXJlKGF0LFkuX193ZWJnbFRleHR1cmUpLGh0KGF0LFMpLFMubWlwbWFwcyYmUy5taXBtYXBzLmxlbmd0aD4wKWZvcihsZXQgZ3Q9MDtndDxTLm1pcG1hcHMubGVuZ3RoO2d0KyspcnQoTy5fX3dlYmdsRnJhbWVidWZmZXJbZ3RdLFIsUyxpLkNPTE9SX0FUVEFDSE1FTlQwLGF0LGd0KTtlbHNlIHJ0KE8uX193ZWJnbEZyYW1lYnVmZmVyLFIsUyxpLkNPTE9SX0FUVEFDSE1FTlQwLGF0LDApO20oUykmJmcoYXQpLGUudW5iaW5kVGV4dHVyZSgpfVIuZGVwdGhCdWZmZXImJkl0KFIpfWZ1bmN0aW9uIEp0KFIpe2NvbnN0IFM9Ui50ZXh0dXJlcztmb3IobGV0IE89MCxZPVMubGVuZ3RoO088WTtPKyspe2NvbnN0IFo9U1tPXTtpZihtKFopKXtjb25zdCBqPVIuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQ/aS5URVhUVVJFX0NVQkVfTUFQOmkuVEVYVFVSRV8yRCxfdD1uLmdldChaKS5fX3dlYmdsVGV4dHVyZTtlLmJpbmRUZXh0dXJlKGosX3QpLGcoaiksZS51bmJpbmRUZXh0dXJlKCl9fX1jb25zdCBJPVtdLG90PVtdO2Z1bmN0aW9uIGl0KFIpe2lmKFIuc2FtcGxlcz4wKXtpZihRKFIpPT09ITEpe2NvbnN0IFM9Ui50ZXh0dXJlcyxPPVIud2lkdGgsWT1SLmhlaWdodDtsZXQgWj1pLkNPTE9SX0JVRkZFUl9CSVQ7Y29uc3Qgaj1SLnN0ZW5jaWxCdWZmZXI/aS5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQ6aS5ERVBUSF9BVFRBQ0hNRU5ULF90PW4uZ2V0KFIpLGF0PVMubGVuZ3RoPjE7aWYoYXQpZm9yKGxldCBndD0wO2d0PFMubGVuZ3RoO2d0KyspZS5iaW5kRnJhbWVidWZmZXIoaS5GUkFNRUJVRkZFUixfdC5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpLGkuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoaS5GUkFNRUJVRkZFUixpLkNPTE9SX0FUVEFDSE1FTlQwK2d0LGkuUkVOREVSQlVGRkVSLG51bGwpLGUuYmluZEZyYW1lYnVmZmVyKGkuRlJBTUVCVUZGRVIsX3QuX193ZWJnbEZyYW1lYnVmZmVyKSxpLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGkuRFJBV19GUkFNRUJVRkZFUixpLkNPTE9SX0FUVEFDSE1FTlQwK2d0LGkuVEVYVFVSRV8yRCxudWxsLDApO2UuYmluZEZyYW1lYnVmZmVyKGkuUkVBRF9GUkFNRUJVRkZFUixfdC5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpLGUuYmluZEZyYW1lYnVmZmVyKGkuRFJBV19GUkFNRUJVRkZFUixfdC5fX3dlYmdsRnJhbWVidWZmZXIpO2ZvcihsZXQgZ3Q9MDtndDxTLmxlbmd0aDtndCsrKXtpZihSLnJlc29sdmVEZXB0aEJ1ZmZlciYmKFIuZGVwdGhCdWZmZXImJihafD1pLkRFUFRIX0JVRkZFUl9CSVQpLFIuc3RlbmNpbEJ1ZmZlciYmUi5yZXNvbHZlU3RlbmNpbEJ1ZmZlciYmKFp8PWkuU1RFTkNJTF9CVUZGRVJfQklUKSksYXQpe2kuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoaS5SRUFEX0ZSQU1FQlVGRkVSLGkuQ09MT1JfQVRUQUNITUVOVDAsaS5SRU5ERVJCVUZGRVIsX3QuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW2d0XSk7Y29uc3Qga3Q9bi5nZXQoU1tndF0pLl9fd2ViZ2xUZXh0dXJlO2kuZnJhbWVidWZmZXJUZXh0dXJlMkQoaS5EUkFXX0ZSQU1FQlVGRkVSLGkuQ09MT1JfQVRUQUNITUVOVDAsaS5URVhUVVJFXzJELGt0LDApfWkuYmxpdEZyYW1lYnVmZmVyKDAsMCxPLFksMCwwLE8sWSxaLGkuTkVBUkVTVCksbD09PSEwJiYoSS5sZW5ndGg9MCxvdC5sZW5ndGg9MCxJLnB1c2goaS5DT0xPUl9BVFRBQ0hNRU5UMCtndCksUi5kZXB0aEJ1ZmZlciYmUi5yZXNvbHZlRGVwdGhCdWZmZXI9PT0hMSYmKEkucHVzaChqKSxvdC5wdXNoKGopLGkuaW52YWxpZGF0ZUZyYW1lYnVmZmVyKGkuRFJBV19GUkFNRUJVRkZFUixvdCkpLGkuaW52YWxpZGF0ZUZyYW1lYnVmZmVyKGkuUkVBRF9GUkFNRUJVRkZFUixJKSl9aWYoZS5iaW5kRnJhbWVidWZmZXIoaS5SRUFEX0ZSQU1FQlVGRkVSLG51bGwpLGUuYmluZEZyYW1lYnVmZmVyKGkuRFJBV19GUkFNRUJVRkZFUixudWxsKSxhdClmb3IobGV0IGd0PTA7Z3Q8Uy5sZW5ndGg7Z3QrKyl7ZS5iaW5kRnJhbWVidWZmZXIoaS5GUkFNRUJVRkZFUixfdC5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpLGkuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoaS5GUkFNRUJVRkZFUixpLkNPTE9SX0FUVEFDSE1FTlQwK2d0LGkuUkVOREVSQlVGRkVSLF90Ll9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltndF0pO2NvbnN0IGt0PW4uZ2V0KFNbZ3RdKS5fX3dlYmdsVGV4dHVyZTtlLmJpbmRGcmFtZWJ1ZmZlcihpLkZSQU1FQlVGRkVSLF90Ll9fd2ViZ2xGcmFtZWJ1ZmZlciksaS5mcmFtZWJ1ZmZlclRleHR1cmUyRChpLkRSQVdfRlJBTUVCVUZGRVIsaS5DT0xPUl9BVFRBQ0hNRU5UMCtndCxpLlRFWFRVUkVfMkQsa3QsMCl9ZS5iaW5kRnJhbWVidWZmZXIoaS5EUkFXX0ZSQU1FQlVGRkVSLF90Ll9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcil9ZWxzZSBpZihSLmRlcHRoQnVmZmVyJiZSLnJlc29sdmVEZXB0aEJ1ZmZlcj09PSExJiZsKXtjb25zdCBTPVIuc3RlbmNpbEJ1ZmZlcj9pLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVDppLkRFUFRIX0FUVEFDSE1FTlQ7aS5pbnZhbGlkYXRlRnJhbWVidWZmZXIoaS5EUkFXX0ZSQU1FQlVGRkVSLFtTXSl9fX1mdW5jdGlvbiBtdChSKXtyZXR1cm4gTWF0aC5taW4oci5tYXhTYW1wbGVzLFIuc2FtcGxlcyl9ZnVuY3Rpb24gUShSKXtjb25zdCBTPW4uZ2V0KFIpO3JldHVybiBSLnNhbXBsZXM+MCYmdC5oYXMoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpPT09ITAmJlMuX191c2VSZW5kZXJUb1RleHR1cmUhPT0hMX1mdW5jdGlvbiBQdChSKXtjb25zdCBTPW8ucmVuZGVyLmZyYW1lO3UuZ2V0KFIpIT09UyYmKHUuc2V0KFIsUyksUi51cGRhdGUoKSl9ZnVuY3Rpb24gJChSLFMpe2NvbnN0IE89Ui5jb2xvclNwYWNlLFk9Ui5mb3JtYXQsWj1SLnR5cGU7cmV0dXJuIFIuaXNDb21wcmVzc2VkVGV4dHVyZT09PSEwfHxSLmlzVmlkZW9UZXh0dXJlPT09ITB8fE8hPT15aSYmTyE9PWdpJiYoc2UuZ2V0VHJhbnNmZXIoTyk9PT1kZT8oWSE9PWplfHxaIT09UW4pJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXM6IHNSR0IgZW5jb2RlZCB0ZXh0dXJlcyBoYXZlIHRvIHVzZSBSR0JBRm9ybWF0IGFuZCBVbnNpZ25lZEJ5dGVUeXBlLiIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMVGV4dHVyZXM6IFVuc3VwcG9ydGVkIHRleHR1cmUgY29sb3Igc3BhY2U6IixPKSksU31mdW5jdGlvbiBKKFIpe3JldHVybiB0eXBlb2YgSFRNTEltYWdlRWxlbWVudCE9InVuZGVmaW5lZCImJlIgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50PyhjLndpZHRoPVIubmF0dXJhbFdpZHRofHxSLndpZHRoLGMuaGVpZ2h0PVIubmF0dXJhbEhlaWdodHx8Ui5oZWlnaHQpOnR5cGVvZiBWaWRlb0ZyYW1lIT0idW5kZWZpbmVkIiYmUiBpbnN0YW5jZW9mIFZpZGVvRnJhbWU/KGMud2lkdGg9Ui5kaXNwbGF5V2lkdGgsYy5oZWlnaHQ9Ui5kaXNwbGF5SGVpZ2h0KTooYy53aWR0aD1SLndpZHRoLGMuaGVpZ2h0PVIuaGVpZ2h0KSxjfXRoaXMuYWxsb2NhdGVUZXh0dXJlVW5pdD1GLHRoaXMucmVzZXRUZXh0dXJlVW5pdHM9QSx0aGlzLnNldFRleHR1cmUyRD1OLHRoaXMuc2V0VGV4dHVyZTJEQXJyYXk9VSx0aGlzLnNldFRleHR1cmUzRD1CLHRoaXMuc2V0VGV4dHVyZUN1YmU9SCx0aGlzLnJlYmluZFRleHR1cmVzPUZ0LHRoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9RXQsdGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9SnQsdGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1pdCx0aGlzLnNldHVwRGVwdGhSZW5kZXJidWZmZXI9SXQsdGhpcy5zZXR1cEZyYW1lQnVmZmVyVGV4dHVyZT1ydCx0aGlzLnVzZU11bHRpc2FtcGxlZFJUVD1RfWZ1bmN0aW9uIGwwKGksdCl7ZnVuY3Rpb24gZShuLHI9Z2kpe2xldCBzO2NvbnN0IG89c2UuZ2V0VHJhbnNmZXIocik7aWYobj09PVFuKXJldHVybiBpLlVOU0lHTkVEX0JZVEU7aWYobj09PWthKXJldHVybiBpLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ7aWYobj09PUdhKXJldHVybiBpLlVOU0lHTkVEX1NIT1JUXzVfNV81XzE7aWYobj09PV9oKXJldHVybiBpLlVOU0lHTkVEX0lOVF81XzlfOV85X1JFVjtpZihuPT09eWgpcmV0dXJuIGkuQllURTtpZihuPT09dmgpcmV0dXJuIGkuU0hPUlQ7aWYobj09PXRzKXJldHVybiBpLlVOU0lHTkVEX1NIT1JUO2lmKG49PT16YSlyZXR1cm4gaS5JTlQ7aWYobj09PW1pKXJldHVybiBpLlVOU0lHTkVEX0lOVDtpZihuPT09Y24pcmV0dXJuIGkuRkxPQVQ7aWYobj09PWVzKXJldHVybiBpLkhBTEZfRkxPQVQ7aWYobj09PXhoKXJldHVybiBpLkFMUEhBO2lmKG49PT1NaClyZXR1cm4gaS5SR0I7aWYobj09PWplKXJldHVybiBpLlJHQkE7aWYobj09PVNoKXJldHVybiBpLkxVTUlOQU5DRTtpZihuPT09YmgpcmV0dXJuIGkuTFVNSU5BTkNFX0FMUEhBO2lmKG49PT1ocilyZXR1cm4gaS5ERVBUSF9DT01QT05FTlQ7aWYobj09PWZyKXJldHVybiBpLkRFUFRIX1NURU5DSUw7aWYobj09PVZhKXJldHVybiBpLlJFRDtpZihuPT09bW8pcmV0dXJuIGkuUkVEX0lOVEVHRVI7aWYobj09PXdoKXJldHVybiBpLlJHO2lmKG49PT1IYSlyZXR1cm4gaS5SR19JTlRFR0VSO2lmKG49PT1XYSlyZXR1cm4gaS5SR0JBX0lOVEVHRVI7aWYobj09PWdvfHxuPT09eW98fG49PT12b3x8bj09PV9vKWlmKG89PT1kZSlpZihzPXQuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Y19zcmdiIikscyE9PW51bGwpe2lmKG49PT1nbylyZXR1cm4gcy5DT01QUkVTU0VEX1NSR0JfUzNUQ19EWFQxX0VYVDtpZihuPT09eW8pcmV0dXJuIHMuQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUMV9FWFQ7aWYobj09PXZvKXJldHVybiBzLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDNfRVhUO2lmKG49PT1fbylyZXR1cm4gcy5DT01QUkVTU0VEX1NSR0JfQUxQSEFfUzNUQ19EWFQ1X0VYVH1lbHNlIHJldHVybiBudWxsO2Vsc2UgaWYocz10LmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKSxzIT09bnVsbCl7aWYobj09PWdvKXJldHVybiBzLkNPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ7aWYobj09PXlvKXJldHVybiBzLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUO2lmKG49PT12bylyZXR1cm4gcy5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDtpZihuPT09X28pcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFR9ZWxzZSByZXR1cm4gbnVsbDtpZihuPT09JGF8fG49PT1YYXx8bj09PXFhfHxuPT09WWEpaWYocz10LmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIikscyE9PW51bGwpe2lmKG49PT0kYSlyZXR1cm4gcy5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO2lmKG49PT1YYSlyZXR1cm4gcy5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO2lmKG49PT1xYSlyZXR1cm4gcy5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZihuPT09WWEpcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUd9ZWxzZSByZXR1cm4gbnVsbDtpZihuPT09WmF8fG49PT1KYXx8bj09PUthKWlmKHM9dC5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMiKSxzIT09bnVsbCl7aWYobj09PVphfHxuPT09SmEpcmV0dXJuIG89PT1kZT9zLkNPTVBSRVNTRURfU1JHQjhfRVRDMjpzLkNPTVBSRVNTRURfUkdCOF9FVEMyO2lmKG49PT1LYSlyZXR1cm4gbz09PWRlP3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfRVRDMl9FQUM6cy5DT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDfWVsc2UgcmV0dXJuIG51bGw7aWYobj09PWphfHxuPT09UWF8fG49PT10bHx8bj09PWVsfHxuPT09bmx8fG49PT1pbHx8bj09PXJsfHxuPT09c2x8fG49PT1vbHx8bj09PWFsfHxuPT09bGx8fG49PT1jbHx8bj09PXVsfHxuPT09aGwpaWYocz10LmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSxzIT09bnVsbCl7aWYobj09PWphKXJldHVybiBvPT09ZGU/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzR4NF9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ180eDRfS0hSO2lmKG49PT1RYSlyZXR1cm4gbz09PWRlP3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ181eDRfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfNXg0X0tIUjtpZihuPT09dGwpcmV0dXJuIG89PT1kZT9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNXg1X0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzV4NV9LSFI7aWYobj09PWVsKXJldHVybiBvPT09ZGU/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzZ4NV9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ182eDVfS0hSO2lmKG49PT1ubClyZXR1cm4gbz09PWRlP3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ182eDZfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfNng2X0tIUjtpZihuPT09aWwpcmV0dXJuIG89PT1kZT9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOHg1X0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzh4NV9LSFI7aWYobj09PXJsKXJldHVybiBvPT09ZGU/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzh4Nl9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDZfS0hSO2lmKG49PT1zbClyZXR1cm4gbz09PWRlP3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ184eDhfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfOHg4X0tIUjtpZihuPT09b2wpcmV0dXJuIG89PT1kZT9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4NV9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHg1X0tIUjtpZihuPT09YWwpcmV0dXJuIG89PT1kZT9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4Nl9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHg2X0tIUjtpZihuPT09bGwpcmV0dXJuIG89PT1kZT9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4OF9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHg4X0tIUjtpZihuPT09Y2wpcmV0dXJuIG89PT1kZT9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4MTBfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4MTBfS0hSO2lmKG49PT11bClyZXR1cm4gbz09PWRlP3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMngxMF9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMngxMF9LSFI7aWYobj09PWhsKXJldHVybiBvPT09ZGU/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEyeDEyX0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEyeDEyX0tIUn1lbHNlIHJldHVybiBudWxsO2lmKG49PT14b3x8bj09PWZsfHxuPT09ZGwpaWYocz10LmdldCgiRVhUX3RleHR1cmVfY29tcHJlc3Npb25fYnB0YyIpLHMhPT1udWxsKXtpZihuPT09eG8pcmV0dXJuIG89PT1kZT9zLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9CUFRDX1VOT1JNX0VYVDpzLkNPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNX0VYVDtpZihuPT09ZmwpcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JfQlBUQ19TSUdORURfRkxPQVRfRVhUO2lmKG49PT1kbClyZXR1cm4gcy5DT01QUkVTU0VEX1JHQl9CUFRDX1VOU0lHTkVEX0ZMT0FUX0VYVH1lbHNlIHJldHVybiBudWxsO2lmKG49PT1BaHx8bj09PXBsfHxuPT09bWx8fG49PT1nbClpZihzPXQuZ2V0KCJFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9yZ3RjIikscyE9PW51bGwpe2lmKG49PT14bylyZXR1cm4gcy5DT01QUkVTU0VEX1JFRF9SR1RDMV9FWFQ7aWYobj09PXBsKXJldHVybiBzLkNPTVBSRVNTRURfU0lHTkVEX1JFRF9SR1RDMV9FWFQ7aWYobj09PW1sKXJldHVybiBzLkNPTVBSRVNTRURfUkVEX0dSRUVOX1JHVEMyX0VYVDtpZihuPT09Z2wpcmV0dXJuIHMuQ09NUFJFU1NFRF9TSUdORURfUkVEX0dSRUVOX1JHVEMyX0VYVH1lbHNlIHJldHVybiBudWxsO3JldHVybiBuPT09dXI/aS5VTlNJR05FRF9JTlRfMjRfODppW25dIT09dm9pZCAwP2lbbl06bnVsbH1yZXR1cm57Y29udmVydDplfX1jbGFzcyBjMCBleHRlbmRzIGtle2NvbnN0cnVjdG9yKHQ9W10pe3N1cGVyKCksdGhpcy5pc0FycmF5Q2FtZXJhPSEwLHRoaXMuY2FtZXJhcz10fX1jbGFzcyBUcyBleHRlbmRzIG5le2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzR3JvdXA9ITAsdGhpcy50eXBlPSJHcm91cCJ9fWNvbnN0IEtFPXt0eXBlOiJtb3ZlIn07Y2xhc3MgZmZ7Y29uc3RydWN0b3IoKXt0aGlzLl90YXJnZXRSYXk9bnVsbCx0aGlzLl9ncmlwPW51bGwsdGhpcy5faGFuZD1udWxsfWdldEhhbmRTcGFjZSgpe3JldHVybiB0aGlzLl9oYW5kPT09bnVsbCYmKHRoaXMuX2hhbmQ9bmV3IFRzLHRoaXMuX2hhbmQubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLl9oYW5kLnZpc2libGU9ITEsdGhpcy5faGFuZC5qb2ludHM9e30sdGhpcy5faGFuZC5pbnB1dFN0YXRlPXtwaW5jaGluZzohMX0pLHRoaXMuX2hhbmR9Z2V0VGFyZ2V0UmF5U3BhY2UoKXtyZXR1cm4gdGhpcy5fdGFyZ2V0UmF5PT09bnVsbCYmKHRoaXMuX3RhcmdldFJheT1uZXcgVHMsdGhpcy5fdGFyZ2V0UmF5Lm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5fdGFyZ2V0UmF5LnZpc2libGU9ITEsdGhpcy5fdGFyZ2V0UmF5Lmhhc0xpbmVhclZlbG9jaXR5PSExLHRoaXMuX3RhcmdldFJheS5saW5lYXJWZWxvY2l0eT1uZXcgTCx0aGlzLl90YXJnZXRSYXkuaGFzQW5ndWxhclZlbG9jaXR5PSExLHRoaXMuX3RhcmdldFJheS5hbmd1bGFyVmVsb2NpdHk9bmV3IEwpLHRoaXMuX3RhcmdldFJheX1nZXRHcmlwU3BhY2UoKXtyZXR1cm4gdGhpcy5fZ3JpcD09PW51bGwmJih0aGlzLl9ncmlwPW5ldyBUcyx0aGlzLl9ncmlwLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5fZ3JpcC52aXNpYmxlPSExLHRoaXMuX2dyaXAuaGFzTGluZWFyVmVsb2NpdHk9ITEsdGhpcy5fZ3JpcC5saW5lYXJWZWxvY2l0eT1uZXcgTCx0aGlzLl9ncmlwLmhhc0FuZ3VsYXJWZWxvY2l0eT0hMSx0aGlzLl9ncmlwLmFuZ3VsYXJWZWxvY2l0eT1uZXcgTCksdGhpcy5fZ3JpcH1kaXNwYXRjaEV2ZW50KHQpe3JldHVybiB0aGlzLl90YXJnZXRSYXkhPT1udWxsJiZ0aGlzLl90YXJnZXRSYXkuZGlzcGF0Y2hFdmVudCh0KSx0aGlzLl9ncmlwIT09bnVsbCYmdGhpcy5fZ3JpcC5kaXNwYXRjaEV2ZW50KHQpLHRoaXMuX2hhbmQhPT1udWxsJiZ0aGlzLl9oYW5kLmRpc3BhdGNoRXZlbnQodCksdGhpc31jb25uZWN0KHQpe2lmKHQmJnQuaGFuZCl7Y29uc3QgZT10aGlzLl9oYW5kO2lmKGUpZm9yKGNvbnN0IG4gb2YgdC5oYW5kLnZhbHVlcygpKXRoaXMuX2dldEhhbmRKb2ludChlLG4pfXJldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImNvbm5lY3RlZCIsZGF0YTp0fSksdGhpc31kaXNjb25uZWN0KHQpe3JldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc2Nvbm5lY3RlZCIsZGF0YTp0fSksdGhpcy5fdGFyZ2V0UmF5IT09bnVsbCYmKHRoaXMuX3RhcmdldFJheS52aXNpYmxlPSExKSx0aGlzLl9ncmlwIT09bnVsbCYmKHRoaXMuX2dyaXAudmlzaWJsZT0hMSksdGhpcy5faGFuZCE9PW51bGwmJih0aGlzLl9oYW5kLnZpc2libGU9ITEpLHRoaXN9dXBkYXRlKHQsZSxuKXtsZXQgcj1udWxsLHM9bnVsbCxvPW51bGw7Y29uc3QgYT10aGlzLl90YXJnZXRSYXksbD10aGlzLl9ncmlwLGM9dGhpcy5faGFuZDtpZih0JiZlLnNlc3Npb24udmlzaWJpbGl0eVN0YXRlIT09InZpc2libGUtYmx1cnJlZCIpe2lmKGMmJnQuaGFuZCl7bz0hMDtmb3IoY29uc3QgeSBvZiB0LmhhbmQudmFsdWVzKCkpe2NvbnN0IG09ZS5nZXRKb2ludFBvc2UoeSxuKSxnPXRoaXMuX2dldEhhbmRKb2ludChjLHkpO20hPT1udWxsJiYoZy5tYXRyaXguZnJvbUFycmF5KG0udHJhbnNmb3JtLm1hdHJpeCksZy5tYXRyaXguZGVjb21wb3NlKGcucG9zaXRpb24sZy5yb3RhdGlvbixnLnNjYWxlKSxnLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITAsZy5qb2ludFJhZGl1cz1tLnJhZGl1cyksZy52aXNpYmxlPW0hPT1udWxsfWNvbnN0IHU9Yy5qb2ludHNbImluZGV4LWZpbmdlci10aXAiXSxoPWMuam9pbnRzWyJ0aHVtYi10aXAiXSxmPXUucG9zaXRpb24uZGlzdGFuY2VUbyhoLnBvc2l0aW9uKSxkPS4wMixwPS4wMDU7Yy5pbnB1dFN0YXRlLnBpbmNoaW5nJiZmPmQrcD8oYy5pbnB1dFN0YXRlLnBpbmNoaW5nPSExLHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToicGluY2hlbmQiLGhhbmRlZG5lc3M6dC5oYW5kZWRuZXNzLHRhcmdldDp0aGlzfSkpOiFjLmlucHV0U3RhdGUucGluY2hpbmcmJmY8PWQtcCYmKGMuaW5wdXRTdGF0ZS5waW5jaGluZz0hMCx0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6InBpbmNoc3RhcnQiLGhhbmRlZG5lc3M6dC5oYW5kZWRuZXNzLHRhcmdldDp0aGlzfSkpfWVsc2UgbCE9PW51bGwmJnQuZ3JpcFNwYWNlJiYocz1lLmdldFBvc2UodC5ncmlwU3BhY2UsbikscyE9PW51bGwmJihsLm1hdHJpeC5mcm9tQXJyYXkocy50cmFuc2Zvcm0ubWF0cml4KSxsLm1hdHJpeC5kZWNvbXBvc2UobC5wb3NpdGlvbixsLnJvdGF0aW9uLGwuc2NhbGUpLGwubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMCxzLmxpbmVhclZlbG9jaXR5PyhsLmhhc0xpbmVhclZlbG9jaXR5PSEwLGwubGluZWFyVmVsb2NpdHkuY29weShzLmxpbmVhclZlbG9jaXR5KSk6bC5oYXNMaW5lYXJWZWxvY2l0eT0hMSxzLmFuZ3VsYXJWZWxvY2l0eT8obC5oYXNBbmd1bGFyVmVsb2NpdHk9ITAsbC5hbmd1bGFyVmVsb2NpdHkuY29weShzLmFuZ3VsYXJWZWxvY2l0eSkpOmwuaGFzQW5ndWxhclZlbG9jaXR5PSExKSk7YSE9PW51bGwmJihyPWUuZ2V0UG9zZSh0LnRhcmdldFJheVNwYWNlLG4pLHI9PT1udWxsJiZzIT09bnVsbCYmKHI9cyksciE9PW51bGwmJihhLm1hdHJpeC5mcm9tQXJyYXkoci50cmFuc2Zvcm0ubWF0cml4KSxhLm1hdHJpeC5kZWNvbXBvc2UoYS5wb3NpdGlvbixhLnJvdGF0aW9uLGEuc2NhbGUpLGEubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMCxyLmxpbmVhclZlbG9jaXR5PyhhLmhhc0xpbmVhclZlbG9jaXR5PSEwLGEubGluZWFyVmVsb2NpdHkuY29weShyLmxpbmVhclZlbG9jaXR5KSk6YS5oYXNMaW5lYXJWZWxvY2l0eT0hMSxyLmFuZ3VsYXJWZWxvY2l0eT8oYS5oYXNBbmd1bGFyVmVsb2NpdHk9ITAsYS5hbmd1bGFyVmVsb2NpdHkuY29weShyLmFuZ3VsYXJWZWxvY2l0eSkpOmEuaGFzQW5ndWxhclZlbG9jaXR5PSExLHRoaXMuZGlzcGF0Y2hFdmVudChLRSkpKX1yZXR1cm4gYSE9PW51bGwmJihhLnZpc2libGU9ciE9PW51bGwpLGwhPT1udWxsJiYobC52aXNpYmxlPXMhPT1udWxsKSxjIT09bnVsbCYmKGMudmlzaWJsZT1vIT09bnVsbCksdGhpc31fZ2V0SGFuZEpvaW50KHQsZSl7aWYodC5qb2ludHNbZS5qb2ludE5hbWVdPT09dm9pZCAwKXtjb25zdCBuPW5ldyBUcztuLm1hdHJpeEF1dG9VcGRhdGU9ITEsbi52aXNpYmxlPSExLHQuam9pbnRzW2Uuam9pbnROYW1lXT1uLHQuYWRkKG4pfXJldHVybiB0LmpvaW50c1tlLmpvaW50TmFtZV19fWNvbnN0IGpFPWAKdm9pZCBtYWluKCkgewoKCWdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApOwoKfWAsUUU9YAp1bmlmb3JtIHNhbXBsZXIyREFycmF5IGRlcHRoQ29sb3I7CnVuaWZvcm0gZmxvYXQgZGVwdGhXaWR0aDsKdW5pZm9ybSBmbG9hdCBkZXB0aEhlaWdodDsKCnZvaWQgbWFpbigpIHsKCgl2ZWMyIGNvb3JkID0gdmVjMiggZ2xfRnJhZ0Nvb3JkLnggLyBkZXB0aFdpZHRoLCBnbF9GcmFnQ29vcmQueSAvIGRlcHRoSGVpZ2h0ICk7CgoJaWYgKCBjb29yZC54ID49IDEuMCApIHsKCgkJZ2xfRnJhZ0RlcHRoID0gdGV4dHVyZSggZGVwdGhDb2xvciwgdmVjMyggY29vcmQueCAtIDEuMCwgY29vcmQueSwgMSApICkucjsKCgl9IGVsc2UgewoKCQlnbF9GcmFnRGVwdGggPSB0ZXh0dXJlKCBkZXB0aENvbG9yLCB2ZWMzKCBjb29yZC54LCBjb29yZC55LCAwICkgKS5yOwoKCX0KCn1gO2NsYXNzIHRUe2NvbnN0cnVjdG9yKCl7dGhpcy50ZXh0dXJlPW51bGwsdGhpcy5tZXNoPW51bGwsdGhpcy5kZXB0aE5lYXI9MCx0aGlzLmRlcHRoRmFyPTB9aW5pdCh0LGUsbil7aWYodGhpcy50ZXh0dXJlPT09bnVsbCl7Y29uc3Qgcj1uZXcgTWUscz10LnByb3BlcnRpZXMuZ2V0KHIpO3MuX193ZWJnbFRleHR1cmU9ZS50ZXh0dXJlLChlLmRlcHRoTmVhciE9bi5kZXB0aE5lYXJ8fGUuZGVwdGhGYXIhPW4uZGVwdGhGYXIpJiYodGhpcy5kZXB0aE5lYXI9ZS5kZXB0aE5lYXIsdGhpcy5kZXB0aEZhcj1lLmRlcHRoRmFyKSx0aGlzLnRleHR1cmU9cn19Z2V0TWVzaCh0KXtpZih0aGlzLnRleHR1cmUhPT1udWxsJiZ0aGlzLm1lc2g9PT1udWxsKXtjb25zdCBlPXQuY2FtZXJhc1swXS52aWV3cG9ydCxuPW5ldyBHbih7dmVydGV4U2hhZGVyOmpFLGZyYWdtZW50U2hhZGVyOlFFLHVuaWZvcm1zOntkZXB0aENvbG9yOnt2YWx1ZTp0aGlzLnRleHR1cmV9LGRlcHRoV2lkdGg6e3ZhbHVlOmUuen0sZGVwdGhIZWlnaHQ6e3ZhbHVlOmUud319fSk7dGhpcy5tZXNoPW5ldyBJZShuZXcgYnMoMjAsMjApLG4pfXJldHVybiB0aGlzLm1lc2h9cmVzZXQoKXt0aGlzLnRleHR1cmU9bnVsbCx0aGlzLm1lc2g9bnVsbH1nZXREZXB0aFRleHR1cmUoKXtyZXR1cm4gdGhpcy50ZXh0dXJlfX1jbGFzcyBlVCBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKTtjb25zdCBuPXRoaXM7bGV0IHI9bnVsbCxzPTEsbz1udWxsLGE9ImxvY2FsLWZsb29yIixsPTEsYz1udWxsLHU9bnVsbCxoPW51bGwsZj1udWxsLGQ9bnVsbCxwPW51bGw7Y29uc3QgeT1uZXcgdFQsbT1lLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7bGV0IGc9bnVsbCx4PW51bGw7Y29uc3Qgdj1bXSxfPVtdLEU9bmV3IHE7bGV0IGI9bnVsbDtjb25zdCBUPW5ldyBrZTtULmxheWVycy5lbmFibGUoMSksVC52aWV3cG9ydD1uZXcgb2U7Y29uc3QgUD1uZXcga2U7UC5sYXllcnMuZW5hYmxlKDIpLFAudmlld3BvcnQ9bmV3IG9lO2NvbnN0IHc9W1QsUF0sTT1uZXcgYzA7TS5sYXllcnMuZW5hYmxlKDEpLE0ubGF5ZXJzLmVuYWJsZSgyKTtsZXQgQT1udWxsLEY9bnVsbDt0aGlzLmNhbWVyYUF1dG9VcGRhdGU9ITAsdGhpcy5lbmFibGVkPSExLHRoaXMuaXNQcmVzZW50aW5nPSExLHRoaXMuZ2V0Q29udHJvbGxlcj1mdW5jdGlvbihLKXtsZXQgcnQ9dltLXTtyZXR1cm4gcnQ9PT12b2lkIDAmJihydD1uZXcgZmYsdltLXT1ydCkscnQuZ2V0VGFyZ2V0UmF5U3BhY2UoKX0sdGhpcy5nZXRDb250cm9sbGVyR3JpcD1mdW5jdGlvbihLKXtsZXQgcnQ9dltLXTtyZXR1cm4gcnQ9PT12b2lkIDAmJihydD1uZXcgZmYsdltLXT1ydCkscnQuZ2V0R3JpcFNwYWNlKCl9LHRoaXMuZ2V0SGFuZD1mdW5jdGlvbihLKXtsZXQgcnQ9dltLXTtyZXR1cm4gcnQ9PT12b2lkIDAmJihydD1uZXcgZmYsdltLXT1ydCkscnQuZ2V0SGFuZFNwYWNlKCl9O2Z1bmN0aW9uIEQoSyl7Y29uc3QgcnQ9Xy5pbmRleE9mKEsuaW5wdXRTb3VyY2UpO2lmKHJ0PT09LTEpcmV0dXJuO2NvbnN0IE10PXZbcnRdO010IT09dm9pZCAwJiYoTXQudXBkYXRlKEsuaW5wdXRTb3VyY2UsSy5mcmFtZSxjfHxvKSxNdC5kaXNwYXRjaEV2ZW50KHt0eXBlOksudHlwZSxkYXRhOksuaW5wdXRTb3VyY2V9KSl9ZnVuY3Rpb24gTigpe3IucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0IixEKSxyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlbGVjdHN0YXJ0IixEKSxyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlbGVjdGVuZCIsRCksci5yZW1vdmVFdmVudExpc3RlbmVyKCJzcXVlZXplIixEKSxyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNxdWVlemVzdGFydCIsRCksci5yZW1vdmVFdmVudExpc3RlbmVyKCJzcXVlZXplZW5kIixEKSxyLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZCIsTiksci5yZW1vdmVFdmVudExpc3RlbmVyKCJpbnB1dHNvdXJjZXNjaGFuZ2UiLFUpO2ZvcihsZXQgSz0wO0s8di5sZW5ndGg7SysrKXtjb25zdCBydD1fW0tdO3J0IT09bnVsbCYmKF9bS109bnVsbCx2W0tdLmRpc2Nvbm5lY3QocnQpKX1BPW51bGwsRj1udWxsLHkucmVzZXQoKSx0LnNldFJlbmRlclRhcmdldChnKSxkPW51bGwsZj1udWxsLGg9bnVsbCxyPW51bGwseD1udWxsLFZ0LnN0b3AoKSxuLmlzUHJlc2VudGluZz0hMSx0LnNldFBpeGVsUmF0aW8oYiksdC5zZXRTaXplKEUud2lkdGgsRS5oZWlnaHQsITEpLG4uZGlzcGF0Y2hFdmVudCh7dHlwZToic2Vzc2lvbmVuZCJ9KX10aGlzLnNldEZyYW1lYnVmZmVyU2NhbGVGYWN0b3I9ZnVuY3Rpb24oSyl7cz1LLG4uaXNQcmVzZW50aW5nPT09ITAmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViWFJNYW5hZ2VyOiBDYW5ub3QgY2hhbmdlIGZyYW1lYnVmZmVyIHNjYWxlIHdoaWxlIHByZXNlbnRpbmcuIil9LHRoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKEspe2E9SyxuLmlzUHJlc2VudGluZz09PSEwJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYlhSTWFuYWdlcjogQ2Fubm90IGNoYW5nZSByZWZlcmVuY2Ugc3BhY2UgdHlwZSB3aGlsZSBwcmVzZW50aW5nLiIpfSx0aGlzLmdldFJlZmVyZW5jZVNwYWNlPWZ1bmN0aW9uKCl7cmV0dXJuIGN8fG99LHRoaXMuc2V0UmVmZXJlbmNlU3BhY2U9ZnVuY3Rpb24oSyl7Yz1LfSx0aGlzLmdldEJhc2VMYXllcj1mdW5jdGlvbigpe3JldHVybiBmIT09bnVsbD9mOmR9LHRoaXMuZ2V0QmluZGluZz1mdW5jdGlvbigpe3JldHVybiBofSx0aGlzLmdldEZyYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHB9LHRoaXMuZ2V0U2Vzc2lvbj1mdW5jdGlvbigpe3JldHVybiByfSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oSyl7cmV0dXJuIEpyKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtpZihyPUssciE9PW51bGwpe2lmKGc9dC5nZXRSZW5kZXJUYXJnZXQoKSxyLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdCIsRCksci5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3RzdGFydCIsRCksci5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3RlbmQiLEQpLHIuYWRkRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZSIsRCksci5hZGRFdmVudExpc3RlbmVyKCJzcXVlZXplc3RhcnQiLEQpLHIuYWRkRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZWVuZCIsRCksci5hZGRFdmVudExpc3RlbmVyKCJlbmQiLE4pLHIuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXRzb3VyY2VzY2hhbmdlIixVKSxtLnhyQ29tcGF0aWJsZSE9PSEwJiYoeWllbGQgZS5tYWtlWFJDb21wYXRpYmxlKCkpLGI9dC5nZXRQaXhlbFJhdGlvKCksdC5nZXRTaXplKEUpLHIucmVuZGVyU3RhdGUubGF5ZXJzPT09dm9pZCAwKXtjb25zdCBydD17YW50aWFsaWFzOm0uYW50aWFsaWFzLGFscGhhOiEwLGRlcHRoOm0uZGVwdGgsc3RlbmNpbDptLnN0ZW5jaWwsZnJhbWVidWZmZXJTY2FsZUZhY3RvcjpzfTtkPW5ldyBYUldlYkdMTGF5ZXIocixlLHJ0KSxyLnVwZGF0ZVJlbmRlclN0YXRlKHtiYXNlTGF5ZXI6ZH0pLHQuc2V0UGl4ZWxSYXRpbygxKSx0LnNldFNpemUoZC5mcmFtZWJ1ZmZlcldpZHRoLGQuZnJhbWVidWZmZXJIZWlnaHQsITEpLHg9bmV3IE9uKGQuZnJhbWVidWZmZXJXaWR0aCxkLmZyYW1lYnVmZmVySGVpZ2h0LHtmb3JtYXQ6amUsdHlwZTpRbixjb2xvclNwYWNlOnQub3V0cHV0Q29sb3JTcGFjZSxzdGVuY2lsQnVmZmVyOm0uc3RlbmNpbH0pfWVsc2V7bGV0IHJ0PW51bGwsTXQ9bnVsbCxwdD1udWxsO20uZGVwdGgmJihwdD1tLnN0ZW5jaWw/ZS5ERVBUSDI0X1NURU5DSUw4OmUuREVQVEhfQ09NUE9ORU5UMjQscnQ9bS5zdGVuY2lsP2ZyOmhyLE10PW0uc3RlbmNpbD91cjptaSk7Y29uc3QgSXQ9e2NvbG9yRm9ybWF0OmUuUkdCQTgsZGVwdGhGb3JtYXQ6cHQsc2NhbGVGYWN0b3I6c307aD1uZXcgWFJXZWJHTEJpbmRpbmcocixlKSxmPWguY3JlYXRlUHJvamVjdGlvbkxheWVyKEl0KSxyLnVwZGF0ZVJlbmRlclN0YXRlKHtsYXllcnM6W2ZdfSksdC5zZXRQaXhlbFJhdGlvKDEpLHQuc2V0U2l6ZShmLnRleHR1cmVXaWR0aCxmLnRleHR1cmVIZWlnaHQsITEpLHg9bmV3IE9uKGYudGV4dHVyZVdpZHRoLGYudGV4dHVyZUhlaWdodCx7Zm9ybWF0OmplLHR5cGU6UW4sZGVwdGhUZXh0dXJlOm5ldyBvZihmLnRleHR1cmVXaWR0aCxmLnRleHR1cmVIZWlnaHQsTXQsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAscnQpLHN0ZW5jaWxCdWZmZXI6bS5zdGVuY2lsLGNvbG9yU3BhY2U6dC5vdXRwdXRDb2xvclNwYWNlLHNhbXBsZXM6bS5hbnRpYWxpYXM/NDowLHJlc29sdmVEZXB0aEJ1ZmZlcjpmLmlnbm9yZURlcHRoVmFsdWVzPT09ITF9KX14LmlzWFJSZW5kZXJUYXJnZXQ9ITAsdGhpcy5zZXRGb3ZlYXRpb24obCksYz1udWxsLG89eWllbGQgci5yZXF1ZXN0UmVmZXJlbmNlU3BhY2UoYSksVnQuc2V0Q29udGV4dChyKSxWdC5zdGFydCgpLG4uaXNQcmVzZW50aW5nPSEwLG4uZGlzcGF0Y2hFdmVudCh7dHlwZToic2Vzc2lvbnN0YXJ0In0pfX0pfSx0aGlzLmdldEVudmlyb25tZW50QmxlbmRNb2RlPWZ1bmN0aW9uKCl7aWYociE9PW51bGwpcmV0dXJuIHIuZW52aXJvbm1lbnRCbGVuZE1vZGV9LHRoaXMuZ2V0RGVwdGhUZXh0dXJlPWZ1bmN0aW9uKCl7cmV0dXJuIHkuZ2V0RGVwdGhUZXh0dXJlKCl9O2Z1bmN0aW9uIFUoSyl7Zm9yKGxldCBydD0wO3J0PEsucmVtb3ZlZC5sZW5ndGg7cnQrKyl7Y29uc3QgTXQ9Sy5yZW1vdmVkW3J0XSxwdD1fLmluZGV4T2YoTXQpO3B0Pj0wJiYoX1twdF09bnVsbCx2W3B0XS5kaXNjb25uZWN0KE10KSl9Zm9yKGxldCBydD0wO3J0PEsuYWRkZWQubGVuZ3RoO3J0Kyspe2NvbnN0IE10PUsuYWRkZWRbcnRdO2xldCBwdD1fLmluZGV4T2YoTXQpO2lmKHB0PT09LTEpe2ZvcihsZXQgRnQ9MDtGdDx2Lmxlbmd0aDtGdCsrKWlmKEZ0Pj1fLmxlbmd0aCl7Xy5wdXNoKE10KSxwdD1GdDticmVha31lbHNlIGlmKF9bRnRdPT09bnVsbCl7X1tGdF09TXQscHQ9RnQ7YnJlYWt9aWYocHQ9PT0tMSlicmVha31jb25zdCBJdD12W3B0XTtJdCYmSXQuY29ubmVjdChNdCl9fWNvbnN0IEI9bmV3IEwsSD1uZXcgTDtmdW5jdGlvbiBHKEsscnQsTXQpe0Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHJ0Lm1hdHJpeFdvcmxkKSxILnNldEZyb21NYXRyaXhQb3NpdGlvbihNdC5tYXRyaXhXb3JsZCk7Y29uc3QgcHQ9Qi5kaXN0YW5jZVRvKEgpLEl0PXJ0LnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsRnQ9TXQucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cyxFdD1JdFsxNF0vKEl0WzEwXS0xKSxKdD1JdFsxNF0vKEl0WzEwXSsxKSxJPShJdFs5XSsxKS9JdFs1XSxvdD0oSXRbOV0tMSkvSXRbNV0saXQ9KEl0WzhdLTEpL0l0WzBdLG10PShGdFs4XSsxKS9GdFswXSxRPUV0Kml0LFB0PUV0Km10LCQ9cHQvKC1pdCttdCksSj0kKi1pdDtpZihydC5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoSy5wb3NpdGlvbixLLnF1YXRlcm5pb24sSy5zY2FsZSksSy50cmFuc2xhdGVYKEopLEsudHJhbnNsYXRlWigkKSxLLm1hdHJpeFdvcmxkLmNvbXBvc2UoSy5wb3NpdGlvbixLLnF1YXRlcm5pb24sSy5zY2FsZSksSy5tYXRyaXhXb3JsZEludmVyc2UuY29weShLLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSxJdFsxMF09PT0tMSlLLnByb2plY3Rpb25NYXRyaXguY29weShydC5wcm9qZWN0aW9uTWF0cml4KSxLLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkocnQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpO2Vsc2V7Y29uc3QgUj1FdCskLFM9SnQrJCxPPVEtSixZPVB0KyhwdC1KKSxaPUkqSnQvUypSLGo9b3QqSnQvUypSO0sucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoTyxZLFosaixSLFMpLEsucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weShLLnByb2plY3Rpb25NYXRyaXgpLmludmVydCgpfX1mdW5jdGlvbiB0dChLLHJ0KXtydD09PW51bGw/Sy5tYXRyaXhXb3JsZC5jb3B5KEsubWF0cml4KTpLLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXMocnQubWF0cml4V29ybGQsSy5tYXRyaXgpLEsubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoSy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9dGhpcy51cGRhdGVDYW1lcmE9ZnVuY3Rpb24oSyl7aWYocj09PW51bGwpcmV0dXJuO2xldCBydD1LLm5lYXIsTXQ9Sy5mYXI7eS50ZXh0dXJlIT09bnVsbCYmKHkuZGVwdGhOZWFyPjAmJihydD15LmRlcHRoTmVhcikseS5kZXB0aEZhcj4wJiYoTXQ9eS5kZXB0aEZhcikpLE0ubmVhcj1QLm5lYXI9VC5uZWFyPXJ0LE0uZmFyPVAuZmFyPVQuZmFyPU10LChBIT09TS5uZWFyfHxGIT09TS5mYXIpJiYoci51cGRhdGVSZW5kZXJTdGF0ZSh7ZGVwdGhOZWFyOk0ubmVhcixkZXB0aEZhcjpNLmZhcn0pLEE9TS5uZWFyLEY9TS5mYXIpO2NvbnN0IHB0PUsucGFyZW50LEl0PU0uY2FtZXJhczt0dChNLHB0KTtmb3IobGV0IEZ0PTA7RnQ8SXQubGVuZ3RoO0Z0KyspdHQoSXRbRnRdLHB0KTtJdC5sZW5ndGg9PT0yP0coTSxULFApOk0ucHJvamVjdGlvbk1hdHJpeC5jb3B5KFQucHJvamVjdGlvbk1hdHJpeCksbHQoSyxNLHB0KX07ZnVuY3Rpb24gbHQoSyxydCxNdCl7TXQ9PT1udWxsP0subWF0cml4LmNvcHkocnQubWF0cml4V29ybGQpOihLLm1hdHJpeC5jb3B5KE10Lm1hdHJpeFdvcmxkKSxLLm1hdHJpeC5pbnZlcnQoKSxLLm1hdHJpeC5tdWx0aXBseShydC5tYXRyaXhXb3JsZCkpLEsubWF0cml4LmRlY29tcG9zZShLLnBvc2l0aW9uLEsucXVhdGVybmlvbixLLnNjYWxlKSxLLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKSxLLnByb2plY3Rpb25NYXRyaXguY29weShydC5wcm9qZWN0aW9uTWF0cml4KSxLLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkocnQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLEsuaXNQZXJzcGVjdGl2ZUNhbWVyYSYmKEsuZm92PW5zKjIqTWF0aC5hdGFuKDEvSy5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWzVdKSxLLnpvb209MSl9dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24oKXtyZXR1cm4gTX0sdGhpcy5nZXRGb3ZlYXRpb249ZnVuY3Rpb24oKXtpZighKGY9PT1udWxsJiZkPT09bnVsbCkpcmV0dXJuIGx9LHRoaXMuc2V0Rm92ZWF0aW9uPWZ1bmN0aW9uKEspe2w9SyxmIT09bnVsbCYmKGYuZml4ZWRGb3ZlYXRpb249SyksZCE9PW51bGwmJmQuZml4ZWRGb3ZlYXRpb24hPT12b2lkIDAmJihkLmZpeGVkRm92ZWF0aW9uPUspfSx0aGlzLmhhc0RlcHRoU2Vuc2luZz1mdW5jdGlvbigpe3JldHVybiB5LnRleHR1cmUhPT1udWxsfSx0aGlzLmdldERlcHRoU2Vuc2luZ01lc2g9ZnVuY3Rpb24oKXtyZXR1cm4geS5nZXRNZXNoKE0pfTtsZXQgaHQ9bnVsbDtmdW5jdGlvbiBSdChLLHJ0KXtpZih1PXJ0LmdldFZpZXdlclBvc2UoY3x8bykscD1ydCx1IT09bnVsbCl7Y29uc3QgTXQ9dS52aWV3cztkIT09bnVsbCYmKHQuc2V0UmVuZGVyVGFyZ2V0RnJhbWVidWZmZXIoeCxkLmZyYW1lYnVmZmVyKSx0LnNldFJlbmRlclRhcmdldCh4KSk7bGV0IHB0PSExO010Lmxlbmd0aCE9PU0uY2FtZXJhcy5sZW5ndGgmJihNLmNhbWVyYXMubGVuZ3RoPTAscHQ9ITApO2ZvcihsZXQgRnQ9MDtGdDxNdC5sZW5ndGg7RnQrKyl7Y29uc3QgRXQ9TXRbRnRdO2xldCBKdD1udWxsO2lmKGQhPT1udWxsKUp0PWQuZ2V0Vmlld3BvcnQoRXQpO2Vsc2V7Y29uc3Qgb3Q9aC5nZXRWaWV3U3ViSW1hZ2UoZixFdCk7SnQ9b3Qudmlld3BvcnQsRnQ9PT0wJiYodC5zZXRSZW5kZXJUYXJnZXRUZXh0dXJlcyh4LG90LmNvbG9yVGV4dHVyZSxmLmlnbm9yZURlcHRoVmFsdWVzP3ZvaWQgMDpvdC5kZXB0aFN0ZW5jaWxUZXh0dXJlKSx0LnNldFJlbmRlclRhcmdldCh4KSl9bGV0IEk9d1tGdF07ST09PXZvaWQgMCYmKEk9bmV3IGtlLEkubGF5ZXJzLmVuYWJsZShGdCksSS52aWV3cG9ydD1uZXcgb2Usd1tGdF09SSksSS5tYXRyaXguZnJvbUFycmF5KEV0LnRyYW5zZm9ybS5tYXRyaXgpLEkubWF0cml4LmRlY29tcG9zZShJLnBvc2l0aW9uLEkucXVhdGVybmlvbixJLnNjYWxlKSxJLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KEV0LnByb2plY3Rpb25NYXRyaXgpLEkucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weShJLnByb2plY3Rpb25NYXRyaXgpLmludmVydCgpLEkudmlld3BvcnQuc2V0KEp0LngsSnQueSxKdC53aWR0aCxKdC5oZWlnaHQpLEZ0PT09MCYmKE0ubWF0cml4LmNvcHkoSS5tYXRyaXgpLE0ubWF0cml4LmRlY29tcG9zZShNLnBvc2l0aW9uLE0ucXVhdGVybmlvbixNLnNjYWxlKSkscHQ9PT0hMCYmTS5jYW1lcmFzLnB1c2goSSl9Y29uc3QgSXQ9ci5lbmFibGVkRmVhdHVyZXM7aWYoSXQmJkl0LmluY2x1ZGVzKCJkZXB0aC1zZW5zaW5nIikpe2NvbnN0IEZ0PWguZ2V0RGVwdGhJbmZvcm1hdGlvbihNdFswXSk7RnQmJkZ0LmlzVmFsaWQmJkZ0LnRleHR1cmUmJnkuaW5pdCh0LEZ0LHIucmVuZGVyU3RhdGUpfX1mb3IobGV0IE10PTA7TXQ8di5sZW5ndGg7TXQrKyl7Y29uc3QgcHQ9X1tNdF0sSXQ9dltNdF07cHQhPT1udWxsJiZJdCE9PXZvaWQgMCYmSXQudXBkYXRlKHB0LHJ0LGN8fG8pfWh0JiZodChLLHJ0KSxydC5kZXRlY3RlZFBsYW5lcyYmbi5kaXNwYXRjaEV2ZW50KHt0eXBlOiJwbGFuZXNkZXRlY3RlZCIsZGF0YTpydH0pLHA9bnVsbH1jb25zdCBWdD1uZXcgTmc7VnQuc2V0QW5pbWF0aW9uTG9vcChSdCksdGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKEspe2h0PUt9LHRoaXMuZGlzcG9zZT1mdW5jdGlvbigpe319fWNvbnN0IEVyPW5ldyBNbixuVD1uZXcgTHQ7ZnVuY3Rpb24gaVQoaSx0KXtmdW5jdGlvbiBlKG0sZyl7bS5tYXRyaXhBdXRvVXBkYXRlPT09ITAmJm0udXBkYXRlTWF0cml4KCksZy52YWx1ZS5jb3B5KG0ubWF0cml4KX1mdW5jdGlvbiBuKG0sZyl7Zy5jb2xvci5nZXRSR0IobS5mb2dDb2xvci52YWx1ZSxSZyhpKSksZy5pc0ZvZz8obS5mb2dOZWFyLnZhbHVlPWcubmVhcixtLmZvZ0Zhci52YWx1ZT1nLmZhcik6Zy5pc0ZvZ0V4cDImJihtLmZvZ0RlbnNpdHkudmFsdWU9Zy5kZW5zaXR5KX1mdW5jdGlvbiByKG0sZyx4LHYsXyl7Zy5pc01lc2hCYXNpY01hdGVyaWFsfHxnLmlzTWVzaExhbWJlcnRNYXRlcmlhbD9zKG0sZyk6Zy5pc01lc2hUb29uTWF0ZXJpYWw/KHMobSxnKSxoKG0sZykpOmcuaXNNZXNoUGhvbmdNYXRlcmlhbD8ocyhtLGcpLHUobSxnKSk6Zy5pc01lc2hTdGFuZGFyZE1hdGVyaWFsPyhzKG0sZyksZihtLGcpLGcuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCYmZChtLGcsXykpOmcuaXNNZXNoTWF0Y2FwTWF0ZXJpYWw/KHMobSxnKSxwKG0sZykpOmcuaXNNZXNoRGVwdGhNYXRlcmlhbD9zKG0sZyk6Zy5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPyhzKG0sZykseShtLGcpKTpnLmlzTWVzaE5vcm1hbE1hdGVyaWFsP3MobSxnKTpnLmlzTGluZUJhc2ljTWF0ZXJpYWw/KG8obSxnKSxnLmlzTGluZURhc2hlZE1hdGVyaWFsJiZhKG0sZykpOmcuaXNQb2ludHNNYXRlcmlhbD9sKG0sZyx4LHYpOmcuaXNTcHJpdGVNYXRlcmlhbD9jKG0sZyk6Zy5pc1NoYWRvd01hdGVyaWFsPyhtLmNvbG9yLnZhbHVlLmNvcHkoZy5jb2xvciksbS5vcGFjaXR5LnZhbHVlPWcub3BhY2l0eSk6Zy5pc1NoYWRlck1hdGVyaWFsJiYoZy51bmlmb3Jtc05lZWRVcGRhdGU9ITEpfWZ1bmN0aW9uIHMobSxnKXttLm9wYWNpdHkudmFsdWU9Zy5vcGFjaXR5LGcuY29sb3ImJm0uZGlmZnVzZS52YWx1ZS5jb3B5KGcuY29sb3IpLGcuZW1pc3NpdmUmJm0uZW1pc3NpdmUudmFsdWUuY29weShnLmVtaXNzaXZlKS5tdWx0aXBseVNjYWxhcihnLmVtaXNzaXZlSW50ZW5zaXR5KSxnLm1hcCYmKG0ubWFwLnZhbHVlPWcubWFwLGUoZy5tYXAsbS5tYXBUcmFuc2Zvcm0pKSxnLmFscGhhTWFwJiYobS5hbHBoYU1hcC52YWx1ZT1nLmFscGhhTWFwLGUoZy5hbHBoYU1hcCxtLmFscGhhTWFwVHJhbnNmb3JtKSksZy5idW1wTWFwJiYobS5idW1wTWFwLnZhbHVlPWcuYnVtcE1hcCxlKGcuYnVtcE1hcCxtLmJ1bXBNYXBUcmFuc2Zvcm0pLG0uYnVtcFNjYWxlLnZhbHVlPWcuYnVtcFNjYWxlLGcuc2lkZT09PUtlJiYobS5idW1wU2NhbGUudmFsdWUqPS0xKSksZy5ub3JtYWxNYXAmJihtLm5vcm1hbE1hcC52YWx1ZT1nLm5vcm1hbE1hcCxlKGcubm9ybWFsTWFwLG0ubm9ybWFsTWFwVHJhbnNmb3JtKSxtLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZy5ub3JtYWxTY2FsZSksZy5zaWRlPT09S2UmJm0ubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpLGcuZGlzcGxhY2VtZW50TWFwJiYobS5kaXNwbGFjZW1lbnRNYXAudmFsdWU9Zy5kaXNwbGFjZW1lbnRNYXAsZShnLmRpc3BsYWNlbWVudE1hcCxtLmRpc3BsYWNlbWVudE1hcFRyYW5zZm9ybSksbS5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1nLmRpc3BsYWNlbWVudFNjYWxlLG0uZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1nLmRpc3BsYWNlbWVudEJpYXMpLGcuZW1pc3NpdmVNYXAmJihtLmVtaXNzaXZlTWFwLnZhbHVlPWcuZW1pc3NpdmVNYXAsZShnLmVtaXNzaXZlTWFwLG0uZW1pc3NpdmVNYXBUcmFuc2Zvcm0pKSxnLnNwZWN1bGFyTWFwJiYobS5zcGVjdWxhck1hcC52YWx1ZT1nLnNwZWN1bGFyTWFwLGUoZy5zcGVjdWxhck1hcCxtLnNwZWN1bGFyTWFwVHJhbnNmb3JtKSksZy5hbHBoYVRlc3Q+MCYmKG0uYWxwaGFUZXN0LnZhbHVlPWcuYWxwaGFUZXN0KTtjb25zdCB4PXQuZ2V0KGcpLHY9eC5lbnZNYXAsXz14LmVudk1hcFJvdGF0aW9uO3YmJihtLmVudk1hcC52YWx1ZT12LEVyLmNvcHkoXyksRXIueCo9LTEsRXIueSo9LTEsRXIueio9LTEsdi5pc0N1YmVUZXh0dXJlJiZ2LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT09PSExJiYoRXIueSo9LTEsRXIueio9LTEpLG0uZW52TWFwUm90YXRpb24udmFsdWUuc2V0RnJvbU1hdHJpeDQoblQubWFrZVJvdGF0aW9uRnJvbUV1bGVyKEVyKSksbS5mbGlwRW52TWFwLnZhbHVlPXYuaXNDdWJlVGV4dHVyZSYmdi5pc1JlbmRlclRhcmdldFRleHR1cmU9PT0hMT8tMToxLG0ucmVmbGVjdGl2aXR5LnZhbHVlPWcucmVmbGVjdGl2aXR5LG0uaW9yLnZhbHVlPWcuaW9yLG0ucmVmcmFjdGlvblJhdGlvLnZhbHVlPWcucmVmcmFjdGlvblJhdGlvKSxnLmxpZ2h0TWFwJiYobS5saWdodE1hcC52YWx1ZT1nLmxpZ2h0TWFwLG0ubGlnaHRNYXBJbnRlbnNpdHkudmFsdWU9Zy5saWdodE1hcEludGVuc2l0eSxlKGcubGlnaHRNYXAsbS5saWdodE1hcFRyYW5zZm9ybSkpLGcuYW9NYXAmJihtLmFvTWFwLnZhbHVlPWcuYW9NYXAsbS5hb01hcEludGVuc2l0eS52YWx1ZT1nLmFvTWFwSW50ZW5zaXR5LGUoZy5hb01hcCxtLmFvTWFwVHJhbnNmb3JtKSl9ZnVuY3Rpb24gbyhtLGcpe20uZGlmZnVzZS52YWx1ZS5jb3B5KGcuY29sb3IpLG0ub3BhY2l0eS52YWx1ZT1nLm9wYWNpdHksZy5tYXAmJihtLm1hcC52YWx1ZT1nLm1hcCxlKGcubWFwLG0ubWFwVHJhbnNmb3JtKSl9ZnVuY3Rpb24gYShtLGcpe20uZGFzaFNpemUudmFsdWU9Zy5kYXNoU2l6ZSxtLnRvdGFsU2l6ZS52YWx1ZT1nLmRhc2hTaXplK2cuZ2FwU2l6ZSxtLnNjYWxlLnZhbHVlPWcuc2NhbGV9ZnVuY3Rpb24gbChtLGcseCx2KXttLmRpZmZ1c2UudmFsdWUuY29weShnLmNvbG9yKSxtLm9wYWNpdHkudmFsdWU9Zy5vcGFjaXR5LG0uc2l6ZS52YWx1ZT1nLnNpemUqeCxtLnNjYWxlLnZhbHVlPXYqLjUsZy5tYXAmJihtLm1hcC52YWx1ZT1nLm1hcCxlKGcubWFwLG0udXZUcmFuc2Zvcm0pKSxnLmFscGhhTWFwJiYobS5hbHBoYU1hcC52YWx1ZT1nLmFscGhhTWFwLGUoZy5hbHBoYU1hcCxtLmFscGhhTWFwVHJhbnNmb3JtKSksZy5hbHBoYVRlc3Q+MCYmKG0uYWxwaGFUZXN0LnZhbHVlPWcuYWxwaGFUZXN0KX1mdW5jdGlvbiBjKG0sZyl7bS5kaWZmdXNlLnZhbHVlLmNvcHkoZy5jb2xvciksbS5vcGFjaXR5LnZhbHVlPWcub3BhY2l0eSxtLnJvdGF0aW9uLnZhbHVlPWcucm90YXRpb24sZy5tYXAmJihtLm1hcC52YWx1ZT1nLm1hcCxlKGcubWFwLG0ubWFwVHJhbnNmb3JtKSksZy5hbHBoYU1hcCYmKG0uYWxwaGFNYXAudmFsdWU9Zy5hbHBoYU1hcCxlKGcuYWxwaGFNYXAsbS5hbHBoYU1hcFRyYW5zZm9ybSkpLGcuYWxwaGFUZXN0PjAmJihtLmFscGhhVGVzdC52YWx1ZT1nLmFscGhhVGVzdCl9ZnVuY3Rpb24gdShtLGcpe20uc3BlY3VsYXIudmFsdWUuY29weShnLnNwZWN1bGFyKSxtLnNoaW5pbmVzcy52YWx1ZT1NYXRoLm1heChnLnNoaW5pbmVzcywxZS00KX1mdW5jdGlvbiBoKG0sZyl7Zy5ncmFkaWVudE1hcCYmKG0uZ3JhZGllbnRNYXAudmFsdWU9Zy5ncmFkaWVudE1hcCl9ZnVuY3Rpb24gZihtLGcpe20ubWV0YWxuZXNzLnZhbHVlPWcubWV0YWxuZXNzLGcubWV0YWxuZXNzTWFwJiYobS5tZXRhbG5lc3NNYXAudmFsdWU9Zy5tZXRhbG5lc3NNYXAsZShnLm1ldGFsbmVzc01hcCxtLm1ldGFsbmVzc01hcFRyYW5zZm9ybSkpLG0ucm91Z2huZXNzLnZhbHVlPWcucm91Z2huZXNzLGcucm91Z2huZXNzTWFwJiYobS5yb3VnaG5lc3NNYXAudmFsdWU9Zy5yb3VnaG5lc3NNYXAsZShnLnJvdWdobmVzc01hcCxtLnJvdWdobmVzc01hcFRyYW5zZm9ybSkpLGcuZW52TWFwJiYobS5lbnZNYXBJbnRlbnNpdHkudmFsdWU9Zy5lbnZNYXBJbnRlbnNpdHkpfWZ1bmN0aW9uIGQobSxnLHgpe20uaW9yLnZhbHVlPWcuaW9yLGcuc2hlZW4+MCYmKG0uc2hlZW5Db2xvci52YWx1ZS5jb3B5KGcuc2hlZW5Db2xvcikubXVsdGlwbHlTY2FsYXIoZy5zaGVlbiksbS5zaGVlblJvdWdobmVzcy52YWx1ZT1nLnNoZWVuUm91Z2huZXNzLGcuc2hlZW5Db2xvck1hcCYmKG0uc2hlZW5Db2xvck1hcC52YWx1ZT1nLnNoZWVuQ29sb3JNYXAsZShnLnNoZWVuQ29sb3JNYXAsbS5zaGVlbkNvbG9yTWFwVHJhbnNmb3JtKSksZy5zaGVlblJvdWdobmVzc01hcCYmKG0uc2hlZW5Sb3VnaG5lc3NNYXAudmFsdWU9Zy5zaGVlblJvdWdobmVzc01hcCxlKGcuc2hlZW5Sb3VnaG5lc3NNYXAsbS5zaGVlblJvdWdobmVzc01hcFRyYW5zZm9ybSkpKSxnLmNsZWFyY29hdD4wJiYobS5jbGVhcmNvYXQudmFsdWU9Zy5jbGVhcmNvYXQsbS5jbGVhcmNvYXRSb3VnaG5lc3MudmFsdWU9Zy5jbGVhcmNvYXRSb3VnaG5lc3MsZy5jbGVhcmNvYXRNYXAmJihtLmNsZWFyY29hdE1hcC52YWx1ZT1nLmNsZWFyY29hdE1hcCxlKGcuY2xlYXJjb2F0TWFwLG0uY2xlYXJjb2F0TWFwVHJhbnNmb3JtKSksZy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJihtLmNsZWFyY29hdFJvdWdobmVzc01hcC52YWx1ZT1nLmNsZWFyY29hdFJvdWdobmVzc01hcCxlKGcuY2xlYXJjb2F0Um91Z2huZXNzTWFwLG0uY2xlYXJjb2F0Um91Z2huZXNzTWFwVHJhbnNmb3JtKSksZy5jbGVhcmNvYXROb3JtYWxNYXAmJihtLmNsZWFyY29hdE5vcm1hbE1hcC52YWx1ZT1nLmNsZWFyY29hdE5vcm1hbE1hcCxlKGcuY2xlYXJjb2F0Tm9ybWFsTWFwLG0uY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtKSxtLmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZy5jbGVhcmNvYXROb3JtYWxTY2FsZSksZy5zaWRlPT09S2UmJm0uY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpKSxnLmRpc3BlcnNpb24+MCYmKG0uZGlzcGVyc2lvbi52YWx1ZT1nLmRpc3BlcnNpb24pLGcuaXJpZGVzY2VuY2U+MCYmKG0uaXJpZGVzY2VuY2UudmFsdWU9Zy5pcmlkZXNjZW5jZSxtLmlyaWRlc2NlbmNlSU9SLnZhbHVlPWcuaXJpZGVzY2VuY2VJT1IsbS5pcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW0udmFsdWU9Zy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlWzBdLG0uaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtLnZhbHVlPWcuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZVsxXSxnLmlyaWRlc2NlbmNlTWFwJiYobS5pcmlkZXNjZW5jZU1hcC52YWx1ZT1nLmlyaWRlc2NlbmNlTWFwLGUoZy5pcmlkZXNjZW5jZU1hcCxtLmlyaWRlc2NlbmNlTWFwVHJhbnNmb3JtKSksZy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCYmKG0uaXJpZGVzY2VuY2VUaGlja25lc3NNYXAudmFsdWU9Zy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCxlKGcuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAsbS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcFRyYW5zZm9ybSkpKSxnLnRyYW5zbWlzc2lvbj4wJiYobS50cmFuc21pc3Npb24udmFsdWU9Zy50cmFuc21pc3Npb24sbS50cmFuc21pc3Npb25TYW1wbGVyTWFwLnZhbHVlPXgudGV4dHVyZSxtLnRyYW5zbWlzc2lvblNhbXBsZXJTaXplLnZhbHVlLnNldCh4LndpZHRoLHguaGVpZ2h0KSxnLnRyYW5zbWlzc2lvbk1hcCYmKG0udHJhbnNtaXNzaW9uTWFwLnZhbHVlPWcudHJhbnNtaXNzaW9uTWFwLGUoZy50cmFuc21pc3Npb25NYXAsbS50cmFuc21pc3Npb25NYXBUcmFuc2Zvcm0pKSxtLnRoaWNrbmVzcy52YWx1ZT1nLnRoaWNrbmVzcyxnLnRoaWNrbmVzc01hcCYmKG0udGhpY2tuZXNzTWFwLnZhbHVlPWcudGhpY2tuZXNzTWFwLGUoZy50aGlja25lc3NNYXAsbS50aGlja25lc3NNYXBUcmFuc2Zvcm0pKSxtLmF0dGVudWF0aW9uRGlzdGFuY2UudmFsdWU9Zy5hdHRlbnVhdGlvbkRpc3RhbmNlLG0uYXR0ZW51YXRpb25Db2xvci52YWx1ZS5jb3B5KGcuYXR0ZW51YXRpb25Db2xvcikpLGcuYW5pc290cm9weT4wJiYobS5hbmlzb3Ryb3B5VmVjdG9yLnZhbHVlLnNldChnLmFuaXNvdHJvcHkqTWF0aC5jb3MoZy5hbmlzb3Ryb3B5Um90YXRpb24pLGcuYW5pc290cm9weSpNYXRoLnNpbihnLmFuaXNvdHJvcHlSb3RhdGlvbikpLGcuYW5pc290cm9weU1hcCYmKG0uYW5pc290cm9weU1hcC52YWx1ZT1nLmFuaXNvdHJvcHlNYXAsZShnLmFuaXNvdHJvcHlNYXAsbS5hbmlzb3Ryb3B5TWFwVHJhbnNmb3JtKSkpLG0uc3BlY3VsYXJJbnRlbnNpdHkudmFsdWU9Zy5zcGVjdWxhckludGVuc2l0eSxtLnNwZWN1bGFyQ29sb3IudmFsdWUuY29weShnLnNwZWN1bGFyQ29sb3IpLGcuc3BlY3VsYXJDb2xvck1hcCYmKG0uc3BlY3VsYXJDb2xvck1hcC52YWx1ZT1nLnNwZWN1bGFyQ29sb3JNYXAsZShnLnNwZWN1bGFyQ29sb3JNYXAsbS5zcGVjdWxhckNvbG9yTWFwVHJhbnNmb3JtKSksZy5zcGVjdWxhckludGVuc2l0eU1hcCYmKG0uc3BlY3VsYXJJbnRlbnNpdHlNYXAudmFsdWU9Zy5zcGVjdWxhckludGVuc2l0eU1hcCxlKGcuc3BlY3VsYXJJbnRlbnNpdHlNYXAsbS5zcGVjdWxhckludGVuc2l0eU1hcFRyYW5zZm9ybSkpfWZ1bmN0aW9uIHAobSxnKXtnLm1hdGNhcCYmKG0ubWF0Y2FwLnZhbHVlPWcubWF0Y2FwKX1mdW5jdGlvbiB5KG0sZyl7Y29uc3QgeD10LmdldChnKS5saWdodDttLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLnNldEZyb21NYXRyaXhQb3NpdGlvbih4Lm1hdHJpeFdvcmxkKSxtLm5lYXJEaXN0YW5jZS52YWx1ZT14LnNoYWRvdy5jYW1lcmEubmVhcixtLmZhckRpc3RhbmNlLnZhbHVlPXguc2hhZG93LmNhbWVyYS5mYXJ9cmV0dXJue3JlZnJlc2hGb2dVbmlmb3JtczpuLHJlZnJlc2hNYXRlcmlhbFVuaWZvcm1zOnJ9fWZ1bmN0aW9uIHJUKGksdCxlLG4pe2xldCByPXt9LHM9e30sbz1bXTtjb25zdCBhPWkuZ2V0UGFyYW1ldGVyKGkuTUFYX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdTKTtmdW5jdGlvbiBsKHgsdil7Y29uc3QgXz12LnByb2dyYW07bi51bmlmb3JtQmxvY2tCaW5kaW5nKHgsXyl9ZnVuY3Rpb24gYyh4LHYpe2xldCBfPXJbeC5pZF07Xz09PXZvaWQgMCYmKHAoeCksXz11KHgpLHJbeC5pZF09Xyx4LmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLG0pKTtjb25zdCBFPXYucHJvZ3JhbTtuLnVwZGF0ZVVCT01hcHBpbmcoeCxFKTtjb25zdCBiPXQucmVuZGVyLmZyYW1lO3NbeC5pZF0hPT1iJiYoZih4KSxzW3guaWRdPWIpfWZ1bmN0aW9uIHUoeCl7Y29uc3Qgdj1oKCk7eC5fX2JpbmRpbmdQb2ludEluZGV4PXY7Y29uc3QgXz1pLmNyZWF0ZUJ1ZmZlcigpLEU9eC5fX3NpemUsYj14LnVzYWdlO3JldHVybiBpLmJpbmRCdWZmZXIoaS5VTklGT1JNX0JVRkZFUixfKSxpLmJ1ZmZlckRhdGEoaS5VTklGT1JNX0JVRkZFUixFLGIpLGkuYmluZEJ1ZmZlcihpLlVOSUZPUk1fQlVGRkVSLG51bGwpLGkuYmluZEJ1ZmZlckJhc2UoaS5VTklGT1JNX0JVRkZFUix2LF8pLF99ZnVuY3Rpb24gaCgpe2ZvcihsZXQgeD0wO3g8YTt4KyspaWYoby5pbmRleE9mKHgpPT09LTEpcmV0dXJuIG8ucHVzaCh4KSx4O3JldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBNYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXNseSB1c2FibGUgdW5pZm9ybXMgZ3JvdXBzIHJlYWNoZWQuIiksMH1mdW5jdGlvbiBmKHgpe2NvbnN0IHY9clt4LmlkXSxfPXgudW5pZm9ybXMsRT14Ll9fY2FjaGU7aS5iaW5kQnVmZmVyKGkuVU5JRk9STV9CVUZGRVIsdik7Zm9yKGxldCBiPTAsVD1fLmxlbmd0aDtiPFQ7YisrKXtjb25zdCBQPUFycmF5LmlzQXJyYXkoX1tiXSk/X1tiXTpbX1tiXV07Zm9yKGxldCB3PTAsTT1QLmxlbmd0aDt3PE07dysrKXtjb25zdCBBPVBbd107aWYoZChBLGIsdyxFKT09PSEwKXtjb25zdCBGPUEuX19vZmZzZXQsRD1BcnJheS5pc0FycmF5KEEudmFsdWUpP0EudmFsdWU6W0EudmFsdWVdO2xldCBOPTA7Zm9yKGxldCBVPTA7VTxELmxlbmd0aDtVKyspe2NvbnN0IEI9RFtVXSxIPXkoQik7dHlwZW9mIEI9PSJudW1iZXIifHx0eXBlb2YgQj09ImJvb2xlYW4iPyhBLl9fZGF0YVswXT1CLGkuYnVmZmVyU3ViRGF0YShpLlVOSUZPUk1fQlVGRkVSLEYrTixBLl9fZGF0YSkpOkIuaXNNYXRyaXgzPyhBLl9fZGF0YVswXT1CLmVsZW1lbnRzWzBdLEEuX19kYXRhWzFdPUIuZWxlbWVudHNbMV0sQS5fX2RhdGFbMl09Qi5lbGVtZW50c1syXSxBLl9fZGF0YVszXT0wLEEuX19kYXRhWzRdPUIuZWxlbWVudHNbM10sQS5fX2RhdGFbNV09Qi5lbGVtZW50c1s0XSxBLl9fZGF0YVs2XT1CLmVsZW1lbnRzWzVdLEEuX19kYXRhWzddPTAsQS5fX2RhdGFbOF09Qi5lbGVtZW50c1s2XSxBLl9fZGF0YVs5XT1CLmVsZW1lbnRzWzddLEEuX19kYXRhWzEwXT1CLmVsZW1lbnRzWzhdLEEuX19kYXRhWzExXT0wKTooQi50b0FycmF5KEEuX19kYXRhLE4pLE4rPUguc3RvcmFnZS9GbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpfWkuYnVmZmVyU3ViRGF0YShpLlVOSUZPUk1fQlVGRkVSLEYsQS5fX2RhdGEpfX19aS5iaW5kQnVmZmVyKGkuVU5JRk9STV9CVUZGRVIsbnVsbCl9ZnVuY3Rpb24gZCh4LHYsXyxFKXtjb25zdCBiPXgudmFsdWUsVD12KyJfIitfO2lmKEVbVF09PT12b2lkIDApcmV0dXJuIHR5cGVvZiBiPT0ibnVtYmVyInx8dHlwZW9mIGI9PSJib29sZWFuIj9FW1RdPWI6RVtUXT1iLmNsb25lKCksITA7e2NvbnN0IFA9RVtUXTtpZih0eXBlb2YgYj09Im51bWJlciJ8fHR5cGVvZiBiPT0iYm9vbGVhbiIpe2lmKFAhPT1iKXJldHVybiBFW1RdPWIsITB9ZWxzZSBpZihQLmVxdWFscyhiKT09PSExKXJldHVybiBQLmNvcHkoYiksITB9cmV0dXJuITF9ZnVuY3Rpb24gcCh4KXtjb25zdCB2PXgudW5pZm9ybXM7bGV0IF89MDtjb25zdCBFPTE2O2ZvcihsZXQgVD0wLFA9di5sZW5ndGg7VDxQO1QrKyl7Y29uc3Qgdz1BcnJheS5pc0FycmF5KHZbVF0pP3ZbVF06W3ZbVF1dO2ZvcihsZXQgTT0wLEE9dy5sZW5ndGg7TTxBO00rKyl7Y29uc3QgRj13W01dLEQ9QXJyYXkuaXNBcnJheShGLnZhbHVlKT9GLnZhbHVlOltGLnZhbHVlXTtmb3IobGV0IE49MCxVPUQubGVuZ3RoO048VTtOKyspe2NvbnN0IEI9RFtOXSxIPXkoQiksRz1fJUUsdHQ9RyVILmJvdW5kYXJ5LGx0PUcrdHQ7Xys9dHQsbHQhPT0wJiZFLWx0PEguc3RvcmFnZSYmKF8rPUUtbHQpLEYuX19kYXRhPW5ldyBGbG9hdDMyQXJyYXkoSC5zdG9yYWdlL0Zsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCksRi5fX29mZnNldD1fLF8rPUguc3RvcmFnZX19fWNvbnN0IGI9XyVFO3JldHVybiBiPjAmJihfKz1FLWIpLHguX19zaXplPV8seC5fX2NhY2hlPXt9LHRoaXN9ZnVuY3Rpb24geSh4KXtjb25zdCB2PXtib3VuZGFyeTowLHN0b3JhZ2U6MH07cmV0dXJuIHR5cGVvZiB4PT0ibnVtYmVyInx8dHlwZW9mIHg9PSJib29sZWFuIj8odi5ib3VuZGFyeT00LHYuc3RvcmFnZT00KTp4LmlzVmVjdG9yMj8odi5ib3VuZGFyeT04LHYuc3RvcmFnZT04KTp4LmlzVmVjdG9yM3x8eC5pc0NvbG9yPyh2LmJvdW5kYXJ5PTE2LHYuc3RvcmFnZT0xMik6eC5pc1ZlY3RvcjQ/KHYuYm91bmRhcnk9MTYsdi5zdG9yYWdlPTE2KTp4LmlzTWF0cml4Mz8odi5ib3VuZGFyeT00OCx2LnN0b3JhZ2U9NDgpOnguaXNNYXRyaXg0Pyh2LmJvdW5kYXJ5PTY0LHYuc3RvcmFnZT02NCk6eC5pc1RleHR1cmU/Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIHNhbXBsZXJzIGNhbiBub3QgYmUgcGFydCBvZiBhbiB1bmlmb3JtcyBncm91cC4iKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVuc3VwcG9ydGVkIHVuaWZvcm0gdmFsdWUgdHlwZS4iLHgpLHZ9ZnVuY3Rpb24gbSh4KXtjb25zdCB2PXgudGFyZ2V0O3YucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsbSk7Y29uc3QgXz1vLmluZGV4T2Yodi5fX2JpbmRpbmdQb2ludEluZGV4KTtvLnNwbGljZShfLDEpLGkuZGVsZXRlQnVmZmVyKHJbdi5pZF0pLGRlbGV0ZSByW3YuaWRdLGRlbGV0ZSBzW3YuaWRdfWZ1bmN0aW9uIGcoKXtmb3IoY29uc3QgeCBpbiByKWkuZGVsZXRlQnVmZmVyKHJbeF0pO289W10scj17fSxzPXt9fXJldHVybntiaW5kOmwsdXBkYXRlOmMsZGlzcG9zZTpnfX1jbGFzcyBzVHtjb25zdHJ1Y3Rvcih0PXt9KXtjb25zdHtjYW52YXM6ZT1sZygpLGNvbnRleHQ6bj1udWxsLGRlcHRoOnI9ITAsc3RlbmNpbDpzPSExLGFscGhhOm89ITEsYW50aWFsaWFzOmE9ITEscHJlbXVsdGlwbGllZEFscGhhOmw9ITAscHJlc2VydmVEcmF3aW5nQnVmZmVyOmM9ITEscG93ZXJQcmVmZXJlbmNlOnU9ImRlZmF1bHQiLGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6aD0hMX09dDt0aGlzLmlzV2ViR0xSZW5kZXJlcj0hMDtsZXQgZjtpZihuIT09bnVsbCl7aWYodHlwZW9mIFdlYkdMUmVuZGVyaW5nQ29udGV4dCE9InVuZGVmaW5lZCImJm4gaW5zdGFuY2VvZiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTCAxIGlzIG5vdCBzdXBwb3J0ZWQgc2luY2UgcjE2My4iKTtmPW4uZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKS5hbHBoYX1lbHNlIGY9bztjb25zdCBkPW5ldyBVaW50MzJBcnJheSg0KSxwPW5ldyBJbnQzMkFycmF5KDQpO2xldCB5PW51bGwsbT1udWxsO2NvbnN0IGc9W10seD1bXTt0aGlzLmRvbUVsZW1lbnQ9ZSx0aGlzLmRlYnVnPXtjaGVja1NoYWRlckVycm9yczohMCxvblNoYWRlckVycm9yOm51bGx9LHRoaXMuYXV0b0NsZWFyPSEwLHRoaXMuYXV0b0NsZWFyQ29sb3I9ITAsdGhpcy5hdXRvQ2xlYXJEZXB0aD0hMCx0aGlzLmF1dG9DbGVhclN0ZW5jaWw9ITAsdGhpcy5zb3J0T2JqZWN0cz0hMCx0aGlzLmNsaXBwaW5nUGxhbmVzPVtdLHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQ9ITEsdGhpcy5fb3V0cHV0Q29sb3JTcGFjZT1Mbix0aGlzLnRvbmVNYXBwaW5nPWRpLHRoaXMudG9uZU1hcHBpbmdFeHBvc3VyZT0xO2NvbnN0IHY9dGhpcztsZXQgXz0hMSxFPTAsYj0wLFQ9bnVsbCxQPS0xLHc9bnVsbDtjb25zdCBNPW5ldyBvZSxBPW5ldyBvZTtsZXQgRj1udWxsO2NvbnN0IEQ9bmV3IHZ0KDApO2xldCBOPTAsVT1lLndpZHRoLEI9ZS5oZWlnaHQsSD0xLEc9bnVsbCx0dD1udWxsO2NvbnN0IGx0PW5ldyBvZSgwLDAsVSxCKSxodD1uZXcgb2UoMCwwLFUsQik7bGV0IFJ0PSExO2NvbnN0IFZ0PW5ldyBCbztsZXQgSz0hMSxydD0hMTtjb25zdCBNdD1uZXcgTHQscHQ9bmV3IEwsSXQ9bmV3IG9lLEZ0PXtiYWNrZ3JvdW5kOm51bGwsZm9nOm51bGwsZW52aXJvbm1lbnQ6bnVsbCxvdmVycmlkZU1hdGVyaWFsOm51bGwsaXNTY2VuZTohMH07bGV0IEV0PSExO2Z1bmN0aW9uIEp0KCl7cmV0dXJuIFQ9PT1udWxsP0g6MX1sZXQgST1uO2Z1bmN0aW9uIG90KEMsayl7cmV0dXJuIGUuZ2V0Q29udGV4dChDLGspfXRyeXtjb25zdCBDPXthbHBoYTohMCxkZXB0aDpyLHN0ZW5jaWw6cyxhbnRpYWxpYXM6YSxwcmVtdWx0aXBsaWVkQWxwaGE6bCxwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6Yyxwb3dlclByZWZlcmVuY2U6dSxmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0Omh9O2lmKCJzZXRBdHRyaWJ1dGUiaW4gZSYmZS5zZXRBdHRyaWJ1dGUoImRhdGEtZW5naW5lIixgdGhyZWUuanMgciR7UXR9YCksZS5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0IixldCwhMSksZS5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsbnQsITEpLGUuYWRkRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0Y3JlYXRpb25lcnJvciIsZnQsITEpLEk9PT1udWxsKXtjb25zdCBrPSJ3ZWJnbDIiO2lmKEk9b3QoayxDKSxJPT09bnVsbCl0aHJvdyBvdChrKT9uZXcgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIik6bmV3IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0LiIpfX1jYXRjaChDKXt0aHJvdyBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK0MubWVzc2FnZSksQ31sZXQgaXQsbXQsUSxQdCwkLEosUixTLE8sWSxaLGosX3QsYXQsZ3Qsa3Qsc3QseXQsS3QsVXQsYnQsSHQsWXQsbWU7ZnVuY3Rpb24geigpe2l0PW5ldyBoQShJKSxpdC5pbml0KCksSHQ9bmV3IGwwKEksaXQpLG10PW5ldyBzQShJLGl0LHQsSHQpLFE9bmV3IFdFKEkpLFB0PW5ldyBwQShJKSwkPW5ldyBMRSxKPW5ldyBKRShJLGl0LFEsJCxtdCxIdCxQdCksUj1uZXcgYUEodiksUz1uZXcgdUEodiksTz1uZXcgZTEoSSksWXQ9bmV3IGlBKEksTyksWT1uZXcgZkEoSSxPLFB0LFl0KSxaPW5ldyBnQShJLFksTyxQdCksS3Q9bmV3IG1BKEksbXQsSiksa3Q9bmV3IG9BKCQpLGo9bmV3IElFKHYsUixTLGl0LG10LFl0LGt0KSxfdD1uZXcgaVQodiwkKSxhdD1uZXcgVUUsZ3Q9bmV3IGtFKGl0KSx5dD1uZXcgbkEodixSLFMsUSxaLGYsbCksc3Q9bmV3IEhFKHYsWixtdCksbWU9bmV3IHJUKEksUHQsbXQsUSksVXQ9bmV3IHJBKEksaXQsUHQpLGJ0PW5ldyBkQShJLGl0LFB0KSxQdC5wcm9ncmFtcz1qLnByb2dyYW1zLHYuY2FwYWJpbGl0aWVzPW10LHYuZXh0ZW5zaW9ucz1pdCx2LnByb3BlcnRpZXM9JCx2LnJlbmRlckxpc3RzPWF0LHYuc2hhZG93TWFwPXN0LHYuc3RhdGU9USx2LmluZm89UHR9eigpO2NvbnN0IGN0PW5ldyBlVCh2LEkpO3RoaXMueHI9Y3QsdGhpcy5nZXRDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIEl9LHRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gSS5nZXRDb250ZXh0QXR0cmlidXRlcygpfSx0aGlzLmZvcmNlQ29udGV4dExvc3M9ZnVuY3Rpb24oKXtjb25zdCBDPWl0LmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7QyYmQy5sb3NlQ29udGV4dCgpfSx0aGlzLmZvcmNlQ29udGV4dFJlc3RvcmU9ZnVuY3Rpb24oKXtjb25zdCBDPWl0LmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7QyYmQy5yZXN0b3JlQ29udGV4dCgpfSx0aGlzLmdldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXtyZXR1cm4gSH0sdGhpcy5zZXRQaXhlbFJhdGlvPWZ1bmN0aW9uKEMpe0MhPT12b2lkIDAmJihIPUMsdGhpcy5zZXRTaXplKFUsQiwhMSkpfSx0aGlzLmdldFNpemU9ZnVuY3Rpb24oQyl7cmV0dXJuIEMuc2V0KFUsQil9LHRoaXMuc2V0U2l6ZT1mdW5jdGlvbihDLGssVz0hMCl7aWYoY3QuaXNQcmVzZW50aW5nKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IENhbid0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLiIpO3JldHVybn1VPUMsQj1rLGUud2lkdGg9TWF0aC5mbG9vcihDKkgpLGUuaGVpZ2h0PU1hdGguZmxvb3IoaypIKSxXPT09ITAmJihlLnN0eWxlLndpZHRoPUMrInB4IixlLnN0eWxlLmhlaWdodD1rKyJweCIpLHRoaXMuc2V0Vmlld3BvcnQoMCwwLEMsayl9LHRoaXMuZ2V0RHJhd2luZ0J1ZmZlclNpemU9ZnVuY3Rpb24oQyl7cmV0dXJuIEMuc2V0KFUqSCxCKkgpLmZsb29yKCl9LHRoaXMuc2V0RHJhd2luZ0J1ZmZlclNpemU9ZnVuY3Rpb24oQyxrLFcpe1U9QyxCPWssSD1XLGUud2lkdGg9TWF0aC5mbG9vcihDKlcpLGUuaGVpZ2h0PU1hdGguZmxvb3IoaypXKSx0aGlzLnNldFZpZXdwb3J0KDAsMCxDLGspfSx0aGlzLmdldEN1cnJlbnRWaWV3cG9ydD1mdW5jdGlvbihDKXtyZXR1cm4gQy5jb3B5KE0pfSx0aGlzLmdldFZpZXdwb3J0PWZ1bmN0aW9uKEMpe3JldHVybiBDLmNvcHkobHQpfSx0aGlzLnNldFZpZXdwb3J0PWZ1bmN0aW9uKEMsayxXLFgpe0MuaXNWZWN0b3I0P2x0LnNldChDLngsQy55LEMueixDLncpOmx0LnNldChDLGssVyxYKSxRLnZpZXdwb3J0KE0uY29weShsdCkubXVsdGlwbHlTY2FsYXIoSCkucm91bmQoKSl9LHRoaXMuZ2V0U2Npc3Nvcj1mdW5jdGlvbihDKXtyZXR1cm4gQy5jb3B5KGh0KX0sdGhpcy5zZXRTY2lzc29yPWZ1bmN0aW9uKEMsayxXLFgpe0MuaXNWZWN0b3I0P2h0LnNldChDLngsQy55LEMueixDLncpOmh0LnNldChDLGssVyxYKSxRLnNjaXNzb3IoQS5jb3B5KGh0KS5tdWx0aXBseVNjYWxhcihIKS5yb3VuZCgpKX0sdGhpcy5nZXRTY2lzc29yVGVzdD1mdW5jdGlvbigpe3JldHVybiBSdH0sdGhpcy5zZXRTY2lzc29yVGVzdD1mdW5jdGlvbihDKXtRLnNldFNjaXNzb3JUZXN0KFJ0PUMpfSx0aGlzLnNldE9wYXF1ZVNvcnQ9ZnVuY3Rpb24oQyl7Rz1DfSx0aGlzLnNldFRyYW5zcGFyZW50U29ydD1mdW5jdGlvbihDKXt0dD1DfSx0aGlzLmdldENsZWFyQ29sb3I9ZnVuY3Rpb24oQyl7cmV0dXJuIEMuY29weSh5dC5nZXRDbGVhckNvbG9yKCkpfSx0aGlzLnNldENsZWFyQ29sb3I9ZnVuY3Rpb24oKXt5dC5zZXRDbGVhckNvbG9yLmFwcGx5KHl0LGFyZ3VtZW50cyl9LHRoaXMuZ2V0Q2xlYXJBbHBoYT1mdW5jdGlvbigpe3JldHVybiB5dC5nZXRDbGVhckFscGhhKCl9LHRoaXMuc2V0Q2xlYXJBbHBoYT1mdW5jdGlvbigpe3l0LnNldENsZWFyQWxwaGEuYXBwbHkoeXQsYXJndW1lbnRzKX0sdGhpcy5jbGVhcj1mdW5jdGlvbihDPSEwLGs9ITAsVz0hMCl7bGV0IFg9MDtpZihDKXtsZXQgVj0hMTtpZihUIT09bnVsbCl7Y29uc3QgdXQ9VC50ZXh0dXJlLmZvcm1hdDtWPXV0PT09V2F8fHV0PT09SGF8fHV0PT09bW99aWYoVil7Y29uc3QgdXQ9VC50ZXh0dXJlLnR5cGUseHQ9dXQ9PT1Rbnx8dXQ9PT1taXx8dXQ9PT10c3x8dXQ9PT11cnx8dXQ9PT1rYXx8dXQ9PT1HYSx3dD15dC5nZXRDbGVhckNvbG9yKCksQXQ9eXQuZ2V0Q2xlYXJBbHBoYSgpLEJ0PXd0LnIsR3Q9d3QuZyxUdD13dC5iO3h0PyhkWzBdPUJ0LGRbMV09R3QsZFsyXT1UdCxkWzNdPUF0LEkuY2xlYXJCdWZmZXJ1aXYoSS5DT0xPUiwwLGQpKToocFswXT1CdCxwWzFdPUd0LHBbMl09VHQscFszXT1BdCxJLmNsZWFyQnVmZmVyaXYoSS5DT0xPUiwwLHApKX1lbHNlIFh8PUkuQ09MT1JfQlVGRkVSX0JJVH1rJiYoWHw9SS5ERVBUSF9CVUZGRVJfQklUKSxXJiYoWHw9SS5TVEVOQ0lMX0JVRkZFUl9CSVQsdGhpcy5zdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0TWFzayg0Mjk0OTY3Mjk1KSksSS5jbGVhcihYKX0sdGhpcy5jbGVhckNvbG9yPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMCwhMSwhMSl9LHRoaXMuY2xlYXJEZXB0aD1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITEsITAsITEpfSx0aGlzLmNsZWFyU3RlbmNpbD1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITEsITEsITApfSx0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLGV0LCExKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIixudCwhMSksZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yIixmdCwhMSksYXQuZGlzcG9zZSgpLGd0LmRpc3Bvc2UoKSwkLmRpc3Bvc2UoKSxSLmRpc3Bvc2UoKSxTLmRpc3Bvc2UoKSxaLmRpc3Bvc2UoKSxZdC5kaXNwb3NlKCksbWUuZGlzcG9zZSgpLGouZGlzcG9zZSgpLGN0LmRpc3Bvc2UoKSxjdC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZXNzaW9uc3RhcnQiLGNpKSxjdC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZXNzaW9uZW5kIixnUyksWnIuc3RvcCgpfTtmdW5jdGlvbiBldChDKXtDLnByZXZlbnREZWZhdWx0KCksY29uc29sZS5sb2coIlRIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgTG9zdC4iKSxfPSEwfWZ1bmN0aW9uIG50KCl7Y29uc29sZS5sb2coIlRIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuIiksXz0hMTtjb25zdCBDPVB0LmF1dG9SZXNldCxrPXN0LmVuYWJsZWQsVz1zdC5hdXRvVXBkYXRlLFg9c3QubmVlZHNVcGRhdGUsVj1zdC50eXBlO3ooKSxQdC5hdXRvUmVzZXQ9QyxzdC5lbmFibGVkPWssc3QuYXV0b1VwZGF0ZT1XLHN0Lm5lZWRzVXBkYXRlPVgsc3QudHlwZT1WfWZ1bmN0aW9uIGZ0KEMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6IEEgV2ViR0wgY29udGV4dCBjb3VsZCBub3QgYmUgY3JlYXRlZC4gUmVhc29uOiAiLEMuc3RhdHVzTWVzc2FnZSl9ZnVuY3Rpb24gT3QoQyl7Y29uc3Qgaz1DLnRhcmdldDtrLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLE90KSxyZShrKX1mdW5jdGlvbiByZShDKXtMZShDKSwkLnJlbW92ZShDKX1mdW5jdGlvbiBMZShDKXtjb25zdCBrPSQuZ2V0KEMpLnByb2dyYW1zO2shPT12b2lkIDAmJihrLmZvckVhY2goZnVuY3Rpb24oVyl7ai5yZWxlYXNlUHJvZ3JhbShXKX0pLEMuaXNTaGFkZXJNYXRlcmlhbCYmai5yZWxlYXNlU2hhZGVyQ2FjaGUoQykpfXRoaXMucmVuZGVyQnVmZmVyRGlyZWN0PWZ1bmN0aW9uKEMsayxXLFgsVix1dCl7az09PW51bGwmJihrPUZ0KTtjb25zdCB4dD1WLmlzTWVzaCYmVi5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpPDAsd3Q9Vk4oQyxrLFcsWCxWKTtRLnNldE1hdGVyaWFsKFgseHQpO2xldCBBdD1XLmluZGV4LEJ0PTE7aWYoWC53aXJlZnJhbWU9PT0hMCl7aWYoQXQ9WS5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUoVyksQXQ9PT12b2lkIDApcmV0dXJuO0J0PTJ9Y29uc3QgR3Q9Vy5kcmF3UmFuZ2UsVHQ9Vy5hdHRyaWJ1dGVzLnBvc2l0aW9uO2xldCBjZT1HdC5zdGFydCpCdCxBZT0oR3Quc3RhcnQrR3QuY291bnQpKkJ0O3V0IT09bnVsbCYmKGNlPU1hdGgubWF4KGNlLHV0LnN0YXJ0KkJ0KSxBZT1NYXRoLm1pbihBZSwodXQuc3RhcnQrdXQuY291bnQpKkJ0KSksQXQhPT1udWxsPyhjZT1NYXRoLm1heChjZSwwKSxBZT1NYXRoLm1pbihBZSxBdC5jb3VudCkpOlR0IT1udWxsJiYoY2U9TWF0aC5tYXgoY2UsMCksQWU9TWF0aC5taW4oQWUsVHQuY291bnQpKTtjb25zdCBFZT1BZS1jZTtpZihFZTwwfHxFZT09PTEvMClyZXR1cm47WXQuc2V0dXAoVixYLHd0LFcsQXQpO2xldCBSbix1ZT1VdDtpZihBdCE9PW51bGwmJihSbj1PLmdldChBdCksdWU9YnQsdWUuc2V0SW5kZXgoUm4pKSxWLmlzTWVzaClYLndpcmVmcmFtZT09PSEwPyhRLnNldExpbmVXaWR0aChYLndpcmVmcmFtZUxpbmV3aWR0aCpKdCgpKSx1ZS5zZXRNb2RlKEkuTElORVMpKTp1ZS5zZXRNb2RlKEkuVFJJQU5HTEVTKTtlbHNlIGlmKFYuaXNMaW5lKXtsZXQgQ3Q9WC5saW5ld2lkdGg7Q3Q9PT12b2lkIDAmJihDdD0xKSxRLnNldExpbmVXaWR0aChDdCpKdCgpKSxWLmlzTGluZVNlZ21lbnRzP3VlLnNldE1vZGUoSS5MSU5FUyk6Vi5pc0xpbmVMb29wP3VlLnNldE1vZGUoSS5MSU5FX0xPT1ApOnVlLnNldE1vZGUoSS5MSU5FX1NUUklQKX1lbHNlIFYuaXNQb2ludHM/dWUuc2V0TW9kZShJLlBPSU5UUyk6Vi5pc1Nwcml0ZSYmdWUuc2V0TW9kZShJLlRSSUFOR0xFUyk7aWYoVi5pc0JhdGNoZWRNZXNoKWlmKFYuX211bHRpRHJhd0luc3RhbmNlcyE9PW51bGwpdWUucmVuZGVyTXVsdGlEcmF3SW5zdGFuY2VzKFYuX211bHRpRHJhd1N0YXJ0cyxWLl9tdWx0aURyYXdDb3VudHMsVi5fbXVsdGlEcmF3Q291bnQsVi5fbXVsdGlEcmF3SW5zdGFuY2VzKTtlbHNlIGlmKGl0LmdldCgiV0VCR0xfbXVsdGlfZHJhdyIpKXVlLnJlbmRlck11bHRpRHJhdyhWLl9tdWx0aURyYXdTdGFydHMsVi5fbXVsdGlEcmF3Q291bnRzLFYuX211bHRpRHJhd0NvdW50KTtlbHNle2NvbnN0IEN0PVYuX211bHRpRHJhd1N0YXJ0cyxWZT1WLl9tdWx0aURyYXdDb3VudHMsaGU9Vi5fbXVsdGlEcmF3Q291bnQsWm49QXQ/Ty5nZXQoQXQpLmJ5dGVzUGVyRWxlbWVudDoxLHNvPSQuZ2V0KFgpLmN1cnJlbnRQcm9ncmFtLmdldFVuaWZvcm1zKCk7Zm9yKGxldCBQbj0wO1BuPGhlO1BuKyspc28uc2V0VmFsdWUoSSwiX2dsX0RyYXdJRCIsUG4pLHVlLnJlbmRlcihDdFtQbl0vWm4sVmVbUG5dKX1lbHNlIGlmKFYuaXNJbnN0YW5jZWRNZXNoKXVlLnJlbmRlckluc3RhbmNlcyhjZSxFZSxWLmNvdW50KTtlbHNlIGlmKFcuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSl7Y29uc3QgQ3Q9Vy5fbWF4SW5zdGFuY2VDb3VudCE9PXZvaWQgMD9XLl9tYXhJbnN0YW5jZUNvdW50OjEvMCxWZT1NYXRoLm1pbihXLmluc3RhbmNlQ291bnQsQ3QpO3VlLnJlbmRlckluc3RhbmNlcyhjZSxFZSxWZSl9ZWxzZSB1ZS5yZW5kZXIoY2UsRWUpfTtmdW5jdGlvbiBHZShDLGssVyl7Qy50cmFuc3BhcmVudD09PSEwJiZDLnNpZGU9PT1LbiYmQy5mb3JjZVNpbmdsZVBhc3M9PT0hMT8oQy5zaWRlPUtlLEMubmVlZHNVcGRhdGU9ITAsY2goQyxrLFcpLEMuc2lkZT1oaSxDLm5lZWRzVXBkYXRlPSEwLGNoKEMsayxXKSxDLnNpZGU9S24pOmNoKEMsayxXKX10aGlzLmNvbXBpbGU9ZnVuY3Rpb24oQyxrLFc9bnVsbCl7Vz09PW51bGwmJihXPUMpLG09Z3QuZ2V0KFcpLG0uaW5pdChrKSx4LnB1c2gobSksVy50cmF2ZXJzZVZpc2libGUoZnVuY3Rpb24oVil7Vi5pc0xpZ2h0JiZWLmxheWVycy50ZXN0KGsubGF5ZXJzKSYmKG0ucHVzaExpZ2h0KFYpLFYuY2FzdFNoYWRvdyYmbS5wdXNoU2hhZG93KFYpKX0pLEMhPT1XJiZDLnRyYXZlcnNlVmlzaWJsZShmdW5jdGlvbihWKXtWLmlzTGlnaHQmJlYubGF5ZXJzLnRlc3Qoay5sYXllcnMpJiYobS5wdXNoTGlnaHQoViksVi5jYXN0U2hhZG93JiZtLnB1c2hTaGFkb3coVikpfSksbS5zZXR1cExpZ2h0cygpO2NvbnN0IFg9bmV3IFNldDtyZXR1cm4gQy50cmF2ZXJzZShmdW5jdGlvbihWKXtjb25zdCB1dD1WLm1hdGVyaWFsO2lmKHV0KWlmKEFycmF5LmlzQXJyYXkodXQpKWZvcihsZXQgeHQ9MDt4dDx1dC5sZW5ndGg7eHQrKyl7Y29uc3Qgd3Q9dXRbeHRdO0dlKHd0LFcsViksWC5hZGQod3QpfWVsc2UgR2UodXQsVyxWKSxYLmFkZCh1dCl9KSx4LnBvcCgpLG09bnVsbCxYfSx0aGlzLmNvbXBpbGVBc3luYz1mdW5jdGlvbihDLGssVz1udWxsKXtjb25zdCBYPXRoaXMuY29tcGlsZShDLGssVyk7cmV0dXJuIG5ldyBQcm9taXNlKFY9PntmdW5jdGlvbiB1dCgpe2lmKFguZm9yRWFjaChmdW5jdGlvbih4dCl7JC5nZXQoeHQpLmN1cnJlbnRQcm9ncmFtLmlzUmVhZHkoKSYmWC5kZWxldGUoeHQpfSksWC5zaXplPT09MCl7VihDKTtyZXR1cm59c2V0VGltZW91dCh1dCwxMCl9aXQuZ2V0KCJLSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGUiKSE9PW51bGw/dXQoKTpzZXRUaW1lb3V0KHV0LDEwKX0pfTtsZXQgbGU9bnVsbDtmdW5jdGlvbiBGaShDKXtsZSYmbGUoQyl9ZnVuY3Rpb24gY2koKXtaci5zdG9wKCl9ZnVuY3Rpb24gZ1MoKXtaci5zdGFydCgpfWNvbnN0IFpyPW5ldyBOZztaci5zZXRBbmltYXRpb25Mb29wKEZpKSx0eXBlb2Ygc2VsZiE9InVuZGVmaW5lZCImJlpyLnNldENvbnRleHQoc2VsZiksdGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKEMpe2xlPUMsY3Quc2V0QW5pbWF0aW9uTG9vcChDKSxDPT09bnVsbD9aci5zdG9wKCk6WnIuc3RhcnQoKX0sY3QuYWRkRXZlbnRMaXN0ZW5lcigic2Vzc2lvbnN0YXJ0IixjaSksY3QuYWRkRXZlbnRMaXN0ZW5lcigic2Vzc2lvbmVuZCIsZ1MpLHRoaXMucmVuZGVyPWZ1bmN0aW9uKEMsayl7aWYoayE9PXZvaWQgMCYmay5pc0NhbWVyYSE9PSEwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcjogY2FtZXJhIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5DYW1lcmEuIik7cmV0dXJufWlmKF89PT0hMClyZXR1cm47aWYoQy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmQy51cGRhdGVNYXRyaXhXb3JsZCgpLGsucGFyZW50PT09bnVsbCYmay5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmay51cGRhdGVNYXRyaXhXb3JsZCgpLGN0LmVuYWJsZWQ9PT0hMCYmY3QuaXNQcmVzZW50aW5nPT09ITAmJihjdC5jYW1lcmFBdXRvVXBkYXRlPT09ITAmJmN0LnVwZGF0ZUNhbWVyYShrKSxrPWN0LmdldENhbWVyYSgpKSxDLmlzU2NlbmU9PT0hMCYmQy5vbkJlZm9yZVJlbmRlcih2LEMsayxUKSxtPWd0LmdldChDLHgubGVuZ3RoKSxtLmluaXQoaykseC5wdXNoKG0pLE10Lm11bHRpcGx5TWF0cmljZXMoay5wcm9qZWN0aW9uTWF0cml4LGsubWF0cml4V29ybGRJbnZlcnNlKSxWdC5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChNdCkscnQ9dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCxLPWt0LmluaXQodGhpcy5jbGlwcGluZ1BsYW5lcyxydCkseT1hdC5nZXQoQyxnLmxlbmd0aCkseS5pbml0KCksZy5wdXNoKHkpLGN0LmVuYWJsZWQ9PT0hMCYmY3QuaXNQcmVzZW50aW5nPT09ITApe2NvbnN0IHV0PXYueHIuZ2V0RGVwdGhTZW5zaW5nTWVzaCgpO3V0IT09bnVsbCYmYW0odXQsaywtMS8wLHYuc29ydE9iamVjdHMpfWFtKEMsaywwLHYuc29ydE9iamVjdHMpLHkuZmluaXNoKCksdi5zb3J0T2JqZWN0cz09PSEwJiZ5LnNvcnQoRyx0dCksRXQ9Y3QuZW5hYmxlZD09PSExfHxjdC5pc1ByZXNlbnRpbmc9PT0hMXx8Y3QuaGFzRGVwdGhTZW5zaW5nKCk9PT0hMSxFdCYmeXQuYWRkVG9SZW5kZXJMaXN0KHksQyksdGhpcy5pbmZvLnJlbmRlci5mcmFtZSsrLEs9PT0hMCYma3QuYmVnaW5TaGFkb3dzKCk7Y29uc3QgVz1tLnN0YXRlLnNoYWRvd3NBcnJheTtzdC5yZW5kZXIoVyxDLGspLEs9PT0hMCYma3QuZW5kU2hhZG93cygpLHRoaXMuaW5mby5hdXRvUmVzZXQ9PT0hMCYmdGhpcy5pbmZvLnJlc2V0KCk7Y29uc3QgWD15Lm9wYXF1ZSxWPXkudHJhbnNtaXNzaXZlO2lmKG0uc2V0dXBMaWdodHMoKSxrLmlzQXJyYXlDYW1lcmEpe2NvbnN0IHV0PWsuY2FtZXJhcztpZihWLmxlbmd0aD4wKWZvcihsZXQgeHQ9MCx3dD11dC5sZW5ndGg7eHQ8d3Q7eHQrKyl7Y29uc3QgQXQ9dXRbeHRdO3ZTKFgsVixDLEF0KX1FdCYmeXQucmVuZGVyKEMpO2ZvcihsZXQgeHQ9MCx3dD11dC5sZW5ndGg7eHQ8d3Q7eHQrKyl7Y29uc3QgQXQ9dXRbeHRdO3lTKHksQyxBdCxBdC52aWV3cG9ydCl9fWVsc2UgVi5sZW5ndGg+MCYmdlMoWCxWLEMsayksRXQmJnl0LnJlbmRlcihDKSx5Uyh5LEMsayk7VCE9PW51bGwmJihKLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KFQpLEoudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKFQpKSxDLmlzU2NlbmU9PT0hMCYmQy5vbkFmdGVyUmVuZGVyKHYsQyxrKSxZdC5yZXNldERlZmF1bHRTdGF0ZSgpLFA9LTEsdz1udWxsLHgucG9wKCkseC5sZW5ndGg+MD8obT14W3gubGVuZ3RoLTFdLEs9PT0hMCYma3Quc2V0R2xvYmFsU3RhdGUodi5jbGlwcGluZ1BsYW5lcyxtLnN0YXRlLmNhbWVyYSkpOm09bnVsbCxnLnBvcCgpLGcubGVuZ3RoPjA/eT1nW2cubGVuZ3RoLTFdOnk9bnVsbH07ZnVuY3Rpb24gYW0oQyxrLFcsWCl7aWYoQy52aXNpYmxlPT09ITEpcmV0dXJuO2lmKEMubGF5ZXJzLnRlc3Qoay5sYXllcnMpKXtpZihDLmlzR3JvdXApVz1DLnJlbmRlck9yZGVyO2Vsc2UgaWYoQy5pc0xPRClDLmF1dG9VcGRhdGU9PT0hMCYmQy51cGRhdGUoayk7ZWxzZSBpZihDLmlzTGlnaHQpbS5wdXNoTGlnaHQoQyksQy5jYXN0U2hhZG93JiZtLnB1c2hTaGFkb3coQyk7ZWxzZSBpZihDLmlzU3ByaXRlKXtpZighQy5mcnVzdHVtQ3VsbGVkfHxWdC5pbnRlcnNlY3RzU3ByaXRlKEMpKXtYJiZJdC5zZXRGcm9tTWF0cml4UG9zaXRpb24oQy5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KE10KTtjb25zdCB4dD1aLnVwZGF0ZShDKSx3dD1DLm1hdGVyaWFsO3d0LnZpc2libGUmJnkucHVzaChDLHh0LHd0LFcsSXQueixudWxsKX19ZWxzZSBpZigoQy5pc01lc2h8fEMuaXNMaW5lfHxDLmlzUG9pbnRzKSYmKCFDLmZydXN0dW1DdWxsZWR8fFZ0LmludGVyc2VjdHNPYmplY3QoQykpKXtjb25zdCB4dD1aLnVwZGF0ZShDKSx3dD1DLm1hdGVyaWFsO2lmKFgmJihDLmJvdW5kaW5nU3BoZXJlIT09dm9pZCAwPyhDLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmQy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxJdC5jb3B5KEMuYm91bmRpbmdTcGhlcmUuY2VudGVyKSk6KHh0LmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmeHQuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksSXQuY29weSh4dC5ib3VuZGluZ1NwaGVyZS5jZW50ZXIpKSxJdC5hcHBseU1hdHJpeDQoQy5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KE10KSksQXJyYXkuaXNBcnJheSh3dCkpe2NvbnN0IEF0PXh0Lmdyb3Vwcztmb3IobGV0IEJ0PTAsR3Q9QXQubGVuZ3RoO0J0PEd0O0J0Kyspe2NvbnN0IFR0PUF0W0J0XSxjZT13dFtUdC5tYXRlcmlhbEluZGV4XTtjZSYmY2UudmlzaWJsZSYmeS5wdXNoKEMseHQsY2UsVyxJdC56LFR0KX19ZWxzZSB3dC52aXNpYmxlJiZ5LnB1c2goQyx4dCx3dCxXLEl0LnosbnVsbCl9fWNvbnN0IHV0PUMuY2hpbGRyZW47Zm9yKGxldCB4dD0wLHd0PXV0Lmxlbmd0aDt4dDx3dDt4dCsrKWFtKHV0W3h0XSxrLFcsWCl9ZnVuY3Rpb24geVMoQyxrLFcsWCl7Y29uc3QgVj1DLm9wYXF1ZSx1dD1DLnRyYW5zbWlzc2l2ZSx4dD1DLnRyYW5zcGFyZW50O20uc2V0dXBMaWdodHNWaWV3KFcpLEs9PT0hMCYma3Quc2V0R2xvYmFsU3RhdGUodi5jbGlwcGluZ1BsYW5lcyxXKSxYJiZRLnZpZXdwb3J0KE0uY29weShYKSksVi5sZW5ndGg+MCYmbGgoVixrLFcpLHV0Lmxlbmd0aD4wJiZsaCh1dCxrLFcpLHh0Lmxlbmd0aD4wJiZsaCh4dCxrLFcpLFEuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCEwKSxRLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayghMCksUS5idWZmZXJzLmNvbG9yLnNldE1hc2soITApLFEuc2V0UG9seWdvbk9mZnNldCghMSl9ZnVuY3Rpb24gdlMoQyxrLFcsWCl7aWYoKFcuaXNTY2VuZT09PSEwP1cub3ZlcnJpZGVNYXRlcmlhbDpudWxsKSE9PW51bGwpcmV0dXJuO20uc3RhdGUudHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0W1guaWRdPT09dm9pZCAwJiYobS5zdGF0ZS50cmFuc21pc3Npb25SZW5kZXJUYXJnZXRbWC5pZF09bmV3IE9uKDEsMSx7Z2VuZXJhdGVNaXBtYXBzOiEwLHR5cGU6aXQuaGFzKCJFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQiKXx8aXQuaGFzKCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0Iik/ZXM6UW4sbWluRmlsdGVyOmpuLHNhbXBsZXM6NCxzdGVuY2lsQnVmZmVyOnMscmVzb2x2ZURlcHRoQnVmZmVyOiExLHJlc29sdmVTdGVuY2lsQnVmZmVyOiExLGNvbG9yU3BhY2U6c2Uud29ya2luZ0NvbG9yU3BhY2V9KSk7Y29uc3QgdXQ9bS5zdGF0ZS50cmFuc21pc3Npb25SZW5kZXJUYXJnZXRbWC5pZF0seHQ9WC52aWV3cG9ydHx8TTt1dC5zZXRTaXplKHh0LnoseHQudyk7Y29uc3Qgd3Q9di5nZXRSZW5kZXJUYXJnZXQoKTt2LnNldFJlbmRlclRhcmdldCh1dCksdi5nZXRDbGVhckNvbG9yKEQpLE49di5nZXRDbGVhckFscGhhKCksTjwxJiZ2LnNldENsZWFyQ29sb3IoMTY3NzcyMTUsLjUpLHYuY2xlYXIoKSxFdCYmeXQucmVuZGVyKFcpO2NvbnN0IEF0PXYudG9uZU1hcHBpbmc7di50b25lTWFwcGluZz1kaTtjb25zdCBCdD1YLnZpZXdwb3J0O2lmKFgudmlld3BvcnQhPT12b2lkIDAmJihYLnZpZXdwb3J0PXZvaWQgMCksbS5zZXR1cExpZ2h0c1ZpZXcoWCksSz09PSEwJiZrdC5zZXRHbG9iYWxTdGF0ZSh2LmNsaXBwaW5nUGxhbmVzLFgpLGxoKEMsVyxYKSxKLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KHV0KSxKLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCh1dCksaXQuaGFzKCJXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiKT09PSExKXtsZXQgR3Q9ITE7Zm9yKGxldCBUdD0wLGNlPWsubGVuZ3RoO1R0PGNlO1R0Kyspe2NvbnN0IEFlPWtbVHRdLEVlPUFlLm9iamVjdCxSbj1BZS5nZW9tZXRyeSx1ZT1BZS5tYXRlcmlhbCxDdD1BZS5ncm91cDtpZih1ZS5zaWRlPT09S24mJkVlLmxheWVycy50ZXN0KFgubGF5ZXJzKSl7Y29uc3QgVmU9dWUuc2lkZTt1ZS5zaWRlPUtlLHVlLm5lZWRzVXBkYXRlPSEwLF9TKEVlLFcsWCxSbix1ZSxDdCksdWUuc2lkZT1WZSx1ZS5uZWVkc1VwZGF0ZT0hMCxHdD0hMH19R3Q9PT0hMCYmKEoudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQodXQpLEoudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKHV0KSl9di5zZXRSZW5kZXJUYXJnZXQod3QpLHYuc2V0Q2xlYXJDb2xvcihELE4pLEJ0IT09dm9pZCAwJiYoWC52aWV3cG9ydD1CdCksdi50b25lTWFwcGluZz1BdH1mdW5jdGlvbiBsaChDLGssVyl7Y29uc3QgWD1rLmlzU2NlbmU9PT0hMD9rLm92ZXJyaWRlTWF0ZXJpYWw6bnVsbDtmb3IobGV0IFY9MCx1dD1DLmxlbmd0aDtWPHV0O1YrKyl7Y29uc3QgeHQ9Q1tWXSx3dD14dC5vYmplY3QsQXQ9eHQuZ2VvbWV0cnksQnQ9WD09PW51bGw/eHQubWF0ZXJpYWw6WCxHdD14dC5ncm91cDt3dC5sYXllcnMudGVzdChXLmxheWVycykmJl9TKHd0LGssVyxBdCxCdCxHdCl9fWZ1bmN0aW9uIF9TKEMsayxXLFgsVix1dCl7Qy5vbkJlZm9yZVJlbmRlcih2LGssVyxYLFYsdXQpLEMubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoVy5tYXRyaXhXb3JsZEludmVyc2UsQy5tYXRyaXhXb3JsZCksQy5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KEMubW9kZWxWaWV3TWF0cml4KSxWLm9uQmVmb3JlUmVuZGVyKHYsayxXLFgsQyx1dCksVi50cmFuc3BhcmVudD09PSEwJiZWLnNpZGU9PT1LbiYmVi5mb3JjZVNpbmdsZVBhc3M9PT0hMT8oVi5zaWRlPUtlLFYubmVlZHNVcGRhdGU9ITAsdi5yZW5kZXJCdWZmZXJEaXJlY3QoVyxrLFgsVixDLHV0KSxWLnNpZGU9aGksVi5uZWVkc1VwZGF0ZT0hMCx2LnJlbmRlckJ1ZmZlckRpcmVjdChXLGssWCxWLEMsdXQpLFYuc2lkZT1Lbik6di5yZW5kZXJCdWZmZXJEaXJlY3QoVyxrLFgsVixDLHV0KSxDLm9uQWZ0ZXJSZW5kZXIodixrLFcsWCxWLHV0KX1mdW5jdGlvbiBjaChDLGssVyl7ay5pc1NjZW5lIT09ITAmJihrPUZ0KTtjb25zdCBYPSQuZ2V0KEMpLFY9bS5zdGF0ZS5saWdodHMsdXQ9bS5zdGF0ZS5zaGFkb3dzQXJyYXkseHQ9Vi5zdGF0ZS52ZXJzaW9uLHd0PWouZ2V0UGFyYW1ldGVycyhDLFYuc3RhdGUsdXQsayxXKSxBdD1qLmdldFByb2dyYW1DYWNoZUtleSh3dCk7bGV0IEJ0PVgucHJvZ3JhbXM7WC5lbnZpcm9ubWVudD1DLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/ay5lbnZpcm9ubWVudDpudWxsLFguZm9nPWsuZm9nLFguZW52TWFwPShDLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/UzpSKS5nZXQoQy5lbnZNYXB8fFguZW52aXJvbm1lbnQpLFguZW52TWFwUm90YXRpb249WC5lbnZpcm9ubWVudCE9PW51bGwmJkMuZW52TWFwPT09bnVsbD9rLmVudmlyb25tZW50Um90YXRpb246Qy5lbnZNYXBSb3RhdGlvbixCdD09PXZvaWQgMCYmKEMuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsT3QpLEJ0PW5ldyBNYXAsWC5wcm9ncmFtcz1CdCk7bGV0IEd0PUJ0LmdldChBdCk7aWYoR3QhPT12b2lkIDApe2lmKFguY3VycmVudFByb2dyYW09PT1HdCYmWC5saWdodHNTdGF0ZVZlcnNpb249PT14dClyZXR1cm4gTVMoQyx3dCksR3R9ZWxzZSB3dC51bmlmb3Jtcz1qLmdldFVuaWZvcm1zKEMpLEMub25CZWZvcmVDb21waWxlKHd0LHYpLEd0PWouYWNxdWlyZVByb2dyYW0od3QsQXQpLEJ0LnNldChBdCxHdCksWC51bmlmb3Jtcz13dC51bmlmb3Jtcztjb25zdCBUdD1YLnVuaWZvcm1zO3JldHVybighQy5pc1NoYWRlck1hdGVyaWFsJiYhQy5pc1Jhd1NoYWRlck1hdGVyaWFsfHxDLmNsaXBwaW5nPT09ITApJiYoVHQuY2xpcHBpbmdQbGFuZXM9a3QudW5pZm9ybSksTVMoQyx3dCksWC5uZWVkc0xpZ2h0cz1XTihDKSxYLmxpZ2h0c1N0YXRlVmVyc2lvbj14dCxYLm5lZWRzTGlnaHRzJiYoVHQuYW1iaWVudExpZ2h0Q29sb3IudmFsdWU9Vi5zdGF0ZS5hbWJpZW50LFR0LmxpZ2h0UHJvYmUudmFsdWU9Vi5zdGF0ZS5wcm9iZSxUdC5kaXJlY3Rpb25hbExpZ2h0cy52YWx1ZT1WLnN0YXRlLmRpcmVjdGlvbmFsLFR0LmRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzLnZhbHVlPVYuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3csVHQuc3BvdExpZ2h0cy52YWx1ZT1WLnN0YXRlLnNwb3QsVHQuc3BvdExpZ2h0U2hhZG93cy52YWx1ZT1WLnN0YXRlLnNwb3RTaGFkb3csVHQucmVjdEFyZWFMaWdodHMudmFsdWU9Vi5zdGF0ZS5yZWN0QXJlYSxUdC5sdGNfMS52YWx1ZT1WLnN0YXRlLnJlY3RBcmVhTFRDMSxUdC5sdGNfMi52YWx1ZT1WLnN0YXRlLnJlY3RBcmVhTFRDMixUdC5wb2ludExpZ2h0cy52YWx1ZT1WLnN0YXRlLnBvaW50LFR0LnBvaW50TGlnaHRTaGFkb3dzLnZhbHVlPVYuc3RhdGUucG9pbnRTaGFkb3csVHQuaGVtaXNwaGVyZUxpZ2h0cy52YWx1ZT1WLnN0YXRlLmhlbWksVHQuZGlyZWN0aW9uYWxTaGFkb3dNYXAudmFsdWU9Vi5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcCxUdC5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1ZT1WLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LFR0LnNwb3RTaGFkb3dNYXAudmFsdWU9Vi5zdGF0ZS5zcG90U2hhZG93TWFwLFR0LnNwb3RMaWdodE1hdHJpeC52YWx1ZT1WLnN0YXRlLnNwb3RMaWdodE1hdHJpeCxUdC5zcG90TGlnaHRNYXAudmFsdWU9Vi5zdGF0ZS5zcG90TGlnaHRNYXAsVHQucG9pbnRTaGFkb3dNYXAudmFsdWU9Vi5zdGF0ZS5wb2ludFNoYWRvd01hcCxUdC5wb2ludFNoYWRvd01hdHJpeC52YWx1ZT1WLnN0YXRlLnBvaW50U2hhZG93TWF0cml4KSxYLmN1cnJlbnRQcm9ncmFtPUd0LFgudW5pZm9ybXNMaXN0PW51bGwsR3R9ZnVuY3Rpb24geFMoQyl7aWYoQy51bmlmb3Jtc0xpc3Q9PT1udWxsKXtjb25zdCBrPUMuY3VycmVudFByb2dyYW0uZ2V0VW5pZm9ybXMoKTtDLnVuaWZvcm1zTGlzdD1YbC5zZXFXaXRoVmFsdWUoay5zZXEsQy51bmlmb3Jtcyl9cmV0dXJuIEMudW5pZm9ybXNMaXN0fWZ1bmN0aW9uIE1TKEMsayl7Y29uc3QgVz0kLmdldChDKTtXLm91dHB1dENvbG9yU3BhY2U9ay5vdXRwdXRDb2xvclNwYWNlLFcuYmF0Y2hpbmc9ay5iYXRjaGluZyxXLmJhdGNoaW5nQ29sb3I9ay5iYXRjaGluZ0NvbG9yLFcuaW5zdGFuY2luZz1rLmluc3RhbmNpbmcsVy5pbnN0YW5jaW5nQ29sb3I9ay5pbnN0YW5jaW5nQ29sb3IsVy5pbnN0YW5jaW5nTW9ycGg9ay5pbnN0YW5jaW5nTW9ycGgsVy5za2lubmluZz1rLnNraW5uaW5nLFcubW9ycGhUYXJnZXRzPWsubW9ycGhUYXJnZXRzLFcubW9ycGhOb3JtYWxzPWsubW9ycGhOb3JtYWxzLFcubW9ycGhDb2xvcnM9ay5tb3JwaENvbG9ycyxXLm1vcnBoVGFyZ2V0c0NvdW50PWsubW9ycGhUYXJnZXRzQ291bnQsVy5udW1DbGlwcGluZ1BsYW5lcz1rLm51bUNsaXBwaW5nUGxhbmVzLFcubnVtSW50ZXJzZWN0aW9uPWsubnVtQ2xpcEludGVyc2VjdGlvbixXLnZlcnRleEFscGhhcz1rLnZlcnRleEFscGhhcyxXLnZlcnRleFRhbmdlbnRzPWsudmVydGV4VGFuZ2VudHMsVy50b25lTWFwcGluZz1rLnRvbmVNYXBwaW5nfWZ1bmN0aW9uIFZOKEMsayxXLFgsVil7ay5pc1NjZW5lIT09ITAmJihrPUZ0KSxKLnJlc2V0VGV4dHVyZVVuaXRzKCk7Y29uc3QgdXQ9ay5mb2cseHQ9WC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP2suZW52aXJvbm1lbnQ6bnVsbCx3dD1UPT09bnVsbD92Lm91dHB1dENvbG9yU3BhY2U6VC5pc1hSUmVuZGVyVGFyZ2V0PT09ITA/VC50ZXh0dXJlLmNvbG9yU3BhY2U6eWksQXQ9KFguaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9TOlIpLmdldChYLmVudk1hcHx8eHQpLEJ0PVgudmVydGV4Q29sb3JzPT09ITAmJiEhVy5hdHRyaWJ1dGVzLmNvbG9yJiZXLmF0dHJpYnV0ZXMuY29sb3IuaXRlbVNpemU9PT00LEd0PSEhVy5hdHRyaWJ1dGVzLnRhbmdlbnQmJighIVgubm9ybWFsTWFwfHxYLmFuaXNvdHJvcHk+MCksVHQ9ISFXLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixjZT0hIVcubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCxBZT0hIVcubW9ycGhBdHRyaWJ1dGVzLmNvbG9yO2xldCBFZT1kaTtYLnRvbmVNYXBwZWQmJihUPT09bnVsbHx8VC5pc1hSUmVuZGVyVGFyZ2V0PT09ITApJiYoRWU9di50b25lTWFwcGluZyk7Y29uc3QgUm49Vy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb258fFcubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbHx8Vy5tb3JwaEF0dHJpYnV0ZXMuY29sb3IsdWU9Um4hPT12b2lkIDA/Um4ubGVuZ3RoOjAsQ3Q9JC5nZXQoWCksVmU9bS5zdGF0ZS5saWdodHM7aWYoSz09PSEwJiYocnQ9PT0hMHx8QyE9PXcpKXtjb25zdCBGbj1DPT09dyYmWC5pZD09PVA7a3Quc2V0U3RhdGUoWCxDLEZuKX1sZXQgaGU9ITE7WC52ZXJzaW9uPT09Q3QuX192ZXJzaW9uPyhDdC5uZWVkc0xpZ2h0cyYmQ3QubGlnaHRzU3RhdGVWZXJzaW9uIT09VmUuc3RhdGUudmVyc2lvbnx8Q3Qub3V0cHV0Q29sb3JTcGFjZSE9PXd0fHxWLmlzQmF0Y2hlZE1lc2gmJkN0LmJhdGNoaW5nPT09ITF8fCFWLmlzQmF0Y2hlZE1lc2gmJkN0LmJhdGNoaW5nPT09ITB8fFYuaXNCYXRjaGVkTWVzaCYmQ3QuYmF0Y2hpbmdDb2xvcj09PSEwJiZWLmNvbG9yVGV4dHVyZT09PW51bGx8fFYuaXNCYXRjaGVkTWVzaCYmQ3QuYmF0Y2hpbmdDb2xvcj09PSExJiZWLmNvbG9yVGV4dHVyZSE9PW51bGx8fFYuaXNJbnN0YW5jZWRNZXNoJiZDdC5pbnN0YW5jaW5nPT09ITF8fCFWLmlzSW5zdGFuY2VkTWVzaCYmQ3QuaW5zdGFuY2luZz09PSEwfHxWLmlzU2tpbm5lZE1lc2gmJkN0LnNraW5uaW5nPT09ITF8fCFWLmlzU2tpbm5lZE1lc2gmJkN0LnNraW5uaW5nPT09ITB8fFYuaXNJbnN0YW5jZWRNZXNoJiZDdC5pbnN0YW5jaW5nQ29sb3I9PT0hMCYmVi5pbnN0YW5jZUNvbG9yPT09bnVsbHx8Vi5pc0luc3RhbmNlZE1lc2gmJkN0Lmluc3RhbmNpbmdDb2xvcj09PSExJiZWLmluc3RhbmNlQ29sb3IhPT1udWxsfHxWLmlzSW5zdGFuY2VkTWVzaCYmQ3QuaW5zdGFuY2luZ01vcnBoPT09ITAmJlYubW9ycGhUZXh0dXJlPT09bnVsbHx8Vi5pc0luc3RhbmNlZE1lc2gmJkN0Lmluc3RhbmNpbmdNb3JwaD09PSExJiZWLm1vcnBoVGV4dHVyZSE9PW51bGx8fEN0LmVudk1hcCE9PUF0fHxYLmZvZz09PSEwJiZDdC5mb2chPT11dHx8Q3QubnVtQ2xpcHBpbmdQbGFuZXMhPT12b2lkIDAmJihDdC5udW1DbGlwcGluZ1BsYW5lcyE9PWt0Lm51bVBsYW5lc3x8Q3QubnVtSW50ZXJzZWN0aW9uIT09a3QubnVtSW50ZXJzZWN0aW9uKXx8Q3QudmVydGV4QWxwaGFzIT09QnR8fEN0LnZlcnRleFRhbmdlbnRzIT09R3R8fEN0Lm1vcnBoVGFyZ2V0cyE9PVR0fHxDdC5tb3JwaE5vcm1hbHMhPT1jZXx8Q3QubW9ycGhDb2xvcnMhPT1BZXx8Q3QudG9uZU1hcHBpbmchPT1FZXx8Q3QubW9ycGhUYXJnZXRzQ291bnQhPT11ZSkmJihoZT0hMCk6KGhlPSEwLEN0Ll9fdmVyc2lvbj1YLnZlcnNpb24pO2xldCBabj1DdC5jdXJyZW50UHJvZ3JhbTtoZT09PSEwJiYoWm49Y2goWCxrLFYpKTtsZXQgc289ITEsUG49ITEsbG09ITE7Y29uc3QgRGU9Wm4uZ2V0VW5pZm9ybXMoKSxhcj1DdC51bmlmb3JtcztpZihRLnVzZVByb2dyYW0oWm4ucHJvZ3JhbSkmJihzbz0hMCxQbj0hMCxsbT0hMCksWC5pZCE9PVAmJihQPVguaWQsUG49ITApLHNvfHx3IT09Qyl7RGUuc2V0VmFsdWUoSSwicHJvamVjdGlvbk1hdHJpeCIsQy5wcm9qZWN0aW9uTWF0cml4KSxEZS5zZXRWYWx1ZShJLCJ2aWV3TWF0cml4IixDLm1hdHJpeFdvcmxkSW52ZXJzZSk7Y29uc3QgRm49RGUubWFwLmNhbWVyYVBvc2l0aW9uO0ZuIT09dm9pZCAwJiZGbi5zZXRWYWx1ZShJLHB0LnNldEZyb21NYXRyaXhQb3NpdGlvbihDLm1hdHJpeFdvcmxkKSksbXQubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmRGUuc2V0VmFsdWUoSSwibG9nRGVwdGhCdWZGQyIsMi8oTWF0aC5sb2coQy5mYXIrMSkvTWF0aC5MTjIpKSwoWC5pc01lc2hQaG9uZ01hdGVyaWFsfHxYLmlzTWVzaFRvb25NYXRlcmlhbHx8WC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWx8fFguaXNNZXNoQmFzaWNNYXRlcmlhbHx8WC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxYLmlzU2hhZGVyTWF0ZXJpYWwpJiZEZS5zZXRWYWx1ZShJLCJpc09ydGhvZ3JhcGhpYyIsQy5pc09ydGhvZ3JhcGhpY0NhbWVyYT09PSEwKSx3IT09QyYmKHc9QyxQbj0hMCxsbT0hMCl9aWYoVi5pc1NraW5uZWRNZXNoKXtEZS5zZXRPcHRpb25hbChJLFYsImJpbmRNYXRyaXgiKSxEZS5zZXRPcHRpb25hbChJLFYsImJpbmRNYXRyaXhJbnZlcnNlIik7Y29uc3QgRm49Vi5za2VsZXRvbjtGbiYmKEZuLmJvbmVUZXh0dXJlPT09bnVsbCYmRm4uY29tcHV0ZUJvbmVUZXh0dXJlKCksRGUuc2V0VmFsdWUoSSwiYm9uZVRleHR1cmUiLEZuLmJvbmVUZXh0dXJlLEopKX1WLmlzQmF0Y2hlZE1lc2gmJihEZS5zZXRPcHRpb25hbChJLFYsImJhdGNoaW5nVGV4dHVyZSIpLERlLnNldFZhbHVlKEksImJhdGNoaW5nVGV4dHVyZSIsVi5fbWF0cmljZXNUZXh0dXJlLEopLERlLnNldE9wdGlvbmFsKEksViwiYmF0Y2hpbmdJZFRleHR1cmUiKSxEZS5zZXRWYWx1ZShJLCJiYXRjaGluZ0lkVGV4dHVyZSIsVi5faW5kaXJlY3RUZXh0dXJlLEopLERlLnNldE9wdGlvbmFsKEksViwiYmF0Y2hpbmdDb2xvclRleHR1cmUiKSxWLl9jb2xvcnNUZXh0dXJlIT09bnVsbCYmRGUuc2V0VmFsdWUoSSwiYmF0Y2hpbmdDb2xvclRleHR1cmUiLFYuX2NvbG9yc1RleHR1cmUsSikpO2NvbnN0IGNtPVcubW9ycGhBdHRyaWJ1dGVzO2lmKChjbS5wb3NpdGlvbiE9PXZvaWQgMHx8Y20ubm9ybWFsIT09dm9pZCAwfHxjbS5jb2xvciE9PXZvaWQgMCkmJkt0LnVwZGF0ZShWLFcsWm4pLChQbnx8Q3QucmVjZWl2ZVNoYWRvdyE9PVYucmVjZWl2ZVNoYWRvdykmJihDdC5yZWNlaXZlU2hhZG93PVYucmVjZWl2ZVNoYWRvdyxEZS5zZXRWYWx1ZShJLCJyZWNlaXZlU2hhZG93IixWLnJlY2VpdmVTaGFkb3cpKSxYLmlzTWVzaEdvdXJhdWRNYXRlcmlhbCYmWC5lbnZNYXAhPT1udWxsJiYoYXIuZW52TWFwLnZhbHVlPUF0LGFyLmZsaXBFbnZNYXAudmFsdWU9QXQuaXNDdWJlVGV4dHVyZSYmQXQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPT09ITE/LTE6MSksWC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsJiZYLmVudk1hcD09PW51bGwmJmsuZW52aXJvbm1lbnQhPT1udWxsJiYoYXIuZW52TWFwSW50ZW5zaXR5LnZhbHVlPWsuZW52aXJvbm1lbnRJbnRlbnNpdHkpLFBuJiYoRGUuc2V0VmFsdWUoSSwidG9uZU1hcHBpbmdFeHBvc3VyZSIsdi50b25lTWFwcGluZ0V4cG9zdXJlKSxDdC5uZWVkc0xpZ2h0cyYmSE4oYXIsbG0pLHV0JiZYLmZvZz09PSEwJiZfdC5yZWZyZXNoRm9nVW5pZm9ybXMoYXIsdXQpLF90LnJlZnJlc2hNYXRlcmlhbFVuaWZvcm1zKGFyLFgsSCxCLG0uc3RhdGUudHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0W0MuaWRdKSxYbC51cGxvYWQoSSx4UyhDdCksYXIsSikpLFguaXNTaGFkZXJNYXRlcmlhbCYmWC51bmlmb3Jtc05lZWRVcGRhdGU9PT0hMCYmKFhsLnVwbG9hZChJLHhTKEN0KSxhcixKKSxYLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMSksWC5pc1Nwcml0ZU1hdGVyaWFsJiZEZS5zZXRWYWx1ZShJLCJjZW50ZXIiLFYuY2VudGVyKSxEZS5zZXRWYWx1ZShJLCJtb2RlbFZpZXdNYXRyaXgiLFYubW9kZWxWaWV3TWF0cml4KSxEZS5zZXRWYWx1ZShJLCJub3JtYWxNYXRyaXgiLFYubm9ybWFsTWF0cml4KSxEZS5zZXRWYWx1ZShJLCJtb2RlbE1hdHJpeCIsVi5tYXRyaXhXb3JsZCksWC5pc1NoYWRlck1hdGVyaWFsfHxYLmlzUmF3U2hhZGVyTWF0ZXJpYWwpe2NvbnN0IEZuPVgudW5pZm9ybXNHcm91cHM7Zm9yKGxldCB1bT0wLCROPUZuLmxlbmd0aDt1bTwkTjt1bSsrKXtjb25zdCBTUz1Gblt1bV07bWUudXBkYXRlKFNTLFpuKSxtZS5iaW5kKFNTLFpuKX19cmV0dXJuIFpufWZ1bmN0aW9uIEhOKEMsayl7Qy5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0ZT1rLEMubGlnaHRQcm9iZS5uZWVkc1VwZGF0ZT1rLEMuZGlyZWN0aW9uYWxMaWdodHMubmVlZHNVcGRhdGU9ayxDLmRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzLm5lZWRzVXBkYXRlPWssQy5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZT1rLEMucG9pbnRMaWdodFNoYWRvd3MubmVlZHNVcGRhdGU9ayxDLnNwb3RMaWdodHMubmVlZHNVcGRhdGU9ayxDLnNwb3RMaWdodFNoYWRvd3MubmVlZHNVcGRhdGU9ayxDLnJlY3RBcmVhTGlnaHRzLm5lZWRzVXBkYXRlPWssQy5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlPWt9ZnVuY3Rpb24gV04oQyl7cmV0dXJuIEMuaXNNZXNoTGFtYmVydE1hdGVyaWFsfHxDLmlzTWVzaFRvb25NYXRlcmlhbHx8Qy5pc01lc2hQaG9uZ01hdGVyaWFsfHxDLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWx8fEMuaXNTaGFkb3dNYXRlcmlhbHx8Qy5pc1NoYWRlck1hdGVyaWFsJiZDLmxpZ2h0cz09PSEwfXRoaXMuZ2V0QWN0aXZlQ3ViZUZhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gRX0sdGhpcy5nZXRBY3RpdmVNaXBtYXBMZXZlbD1mdW5jdGlvbigpe3JldHVybiBifSx0aGlzLmdldFJlbmRlclRhcmdldD1mdW5jdGlvbigpe3JldHVybiBUfSx0aGlzLnNldFJlbmRlclRhcmdldFRleHR1cmVzPWZ1bmN0aW9uKEMsayxXKXskLmdldChDLnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlPWssJC5nZXQoQy5kZXB0aFRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlPVc7Y29uc3QgWD0kLmdldChDKTtYLl9faGFzRXh0ZXJuYWxUZXh0dXJlcz0hMCxYLl9fYXV0b0FsbG9jYXRlRGVwdGhCdWZmZXI9Vz09PXZvaWQgMCxYLl9fYXV0b0FsbG9jYXRlRGVwdGhCdWZmZXJ8fGl0LmhhcygiV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIik9PT0hMCYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogUmVuZGVyLXRvLXRleHR1cmUgZXh0ZW5zaW9uIHdhcyBkaXNhYmxlZCBiZWNhdXNlIGFuIGV4dGVybmFsIHRleHR1cmUgd2FzIHByb3ZpZGVkIiksWC5fX3VzZVJlbmRlclRvVGV4dHVyZT0hMSl9LHRoaXMuc2V0UmVuZGVyVGFyZ2V0RnJhbWVidWZmZXI9ZnVuY3Rpb24oQyxrKXtjb25zdCBXPSQuZ2V0KEMpO1cuX193ZWJnbEZyYW1lYnVmZmVyPWssVy5fX3VzZURlZmF1bHRGcmFtZWJ1ZmZlcj1rPT09dm9pZCAwfSx0aGlzLnNldFJlbmRlclRhcmdldD1mdW5jdGlvbihDLGs9MCxXPTApe1Q9QyxFPWssYj1XO2xldCBYPSEwLFY9bnVsbCx1dD0hMSx4dD0hMTtpZihDKXtjb25zdCBBdD0kLmdldChDKTtpZihBdC5fX3VzZURlZmF1bHRGcmFtZWJ1ZmZlciE9PXZvaWQgMClRLmJpbmRGcmFtZWJ1ZmZlcihJLkZSQU1FQlVGRkVSLG51bGwpLFg9ITE7ZWxzZSBpZihBdC5fX3dlYmdsRnJhbWVidWZmZXI9PT12b2lkIDApSi5zZXR1cFJlbmRlclRhcmdldChDKTtlbHNlIGlmKEF0Ll9faGFzRXh0ZXJuYWxUZXh0dXJlcylKLnJlYmluZFRleHR1cmVzKEMsJC5nZXQoQy50ZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSwkLmdldChDLmRlcHRoVGV4dHVyZSkuX193ZWJnbFRleHR1cmUpO2Vsc2UgaWYoQy5kZXB0aEJ1ZmZlcil7Y29uc3QgVHQ9Qy5kZXB0aFRleHR1cmU7aWYoQXQuX19ib3VuZERlcHRoVGV4dHVyZSE9PVR0KXtpZihUdCE9PW51bGwmJiQuaGFzKFR0KSYmKEMud2lkdGghPT1UdC5pbWFnZS53aWR0aHx8Qy5oZWlnaHQhPT1UdC5pbWFnZS5oZWlnaHQpKXRocm93IG5ldyBFcnJvcigiV2ViR0xSZW5kZXJUYXJnZXQ6IEF0dGFjaGVkIERlcHRoVGV4dHVyZSBpcyBpbml0aWFsaXplZCB0byB0aGUgaW5jb3JyZWN0IHNpemUuIik7Si5zZXR1cERlcHRoUmVuZGVyYnVmZmVyKEMpfX1jb25zdCBCdD1DLnRleHR1cmU7KEJ0LmlzRGF0YTNEVGV4dHVyZXx8QnQuaXNEYXRhQXJyYXlUZXh0dXJlfHxCdC5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUpJiYoeHQ9ITApO2NvbnN0IEd0PSQuZ2V0KEMpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtDLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0PyhBcnJheS5pc0FycmF5KEd0W2tdKT9WPUd0W2tdW1ddOlY9R3Rba10sdXQ9ITApOkMuc2FtcGxlcz4wJiZKLnVzZU11bHRpc2FtcGxlZFJUVChDKT09PSExP1Y9JC5nZXQoQykuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyOkFycmF5LmlzQXJyYXkoR3QpP1Y9R3RbV106Vj1HdCxNLmNvcHkoQy52aWV3cG9ydCksQS5jb3B5KEMuc2Npc3NvciksRj1DLnNjaXNzb3JUZXN0fWVsc2UgTS5jb3B5KGx0KS5tdWx0aXBseVNjYWxhcihIKS5mbG9vcigpLEEuY29weShodCkubXVsdGlwbHlTY2FsYXIoSCkuZmxvb3IoKSxGPVJ0O2lmKFEuYmluZEZyYW1lYnVmZmVyKEkuRlJBTUVCVUZGRVIsVikmJlgmJlEuZHJhd0J1ZmZlcnMoQyxWKSxRLnZpZXdwb3J0KE0pLFEuc2Npc3NvcihBKSxRLnNldFNjaXNzb3JUZXN0KEYpLHV0KXtjb25zdCBBdD0kLmdldChDLnRleHR1cmUpO0kuZnJhbWVidWZmZXJUZXh0dXJlMkQoSS5GUkFNRUJVRkZFUixJLkNPTE9SX0FUVEFDSE1FTlQwLEkuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2ssQXQuX193ZWJnbFRleHR1cmUsVyl9ZWxzZSBpZih4dCl7Y29uc3QgQXQ9JC5nZXQoQy50ZXh0dXJlKSxCdD1rfHwwO0kuZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIoSS5GUkFNRUJVRkZFUixJLkNPTE9SX0FUVEFDSE1FTlQwLEF0Ll9fd2ViZ2xUZXh0dXJlLFd8fDAsQnQpfVA9LTF9LHRoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscz1mdW5jdGlvbihDLGssVyxYLFYsdXQseHQpe2lmKCEoQyYmQy5pc1dlYkdMUmVuZGVyVGFyZ2V0KSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LiIpO3JldHVybn1sZXQgd3Q9JC5nZXQoQykuX193ZWJnbEZyYW1lYnVmZmVyO2lmKEMuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQmJnh0IT09dm9pZCAwJiYod3Q9d3RbeHRdKSx3dCl7US5iaW5kRnJhbWVidWZmZXIoSS5GUkFNRUJVRkZFUix3dCk7dHJ5e2NvbnN0IEF0PUMudGV4dHVyZSxCdD1BdC5mb3JtYXQsR3Q9QXQudHlwZTtpZighbXQudGV4dHVyZUZvcm1hdFJlYWRhYmxlKEJ0KSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFJHQkEgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBmb3JtYXQuIik7cmV0dXJufWlmKCFtdC50ZXh0dXJlVHlwZVJlYWRhYmxlKEd0KSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFVuc2lnbmVkQnl0ZVR5cGUgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlLiIpO3JldHVybn1rPj0wJiZrPD1DLndpZHRoLVgmJlc+PTAmJlc8PUMuaGVpZ2h0LVYmJkkucmVhZFBpeGVscyhrLFcsWCxWLEh0LmNvbnZlcnQoQnQpLEh0LmNvbnZlcnQoR3QpLHV0KX1maW5hbGx5e2NvbnN0IEF0PVQhPT1udWxsPyQuZ2V0KFQpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjpudWxsO1EuYmluZEZyYW1lYnVmZmVyKEkuRlJBTUVCVUZGRVIsQXQpfX19LHRoaXMucmVhZFJlbmRlclRhcmdldFBpeGVsc0FzeW5jPWZ1bmN0aW9uKEMsayxXLFgsVix1dCx4dCl7cmV0dXJuIEpyKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtpZighKEMmJkMuaXNXZWJHTFJlbmRlclRhcmdldCkpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQuIik7bGV0IHd0PSQuZ2V0KEMpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtpZihDLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0JiZ4dCE9PXZvaWQgMCYmKHd0PXd0W3h0XSksd3Qpe1EuYmluZEZyYW1lYnVmZmVyKEkuRlJBTUVCVUZGRVIsd3QpO3RyeXtjb25zdCBBdD1DLnRleHR1cmUsQnQ9QXQuZm9ybWF0LEd0PUF0LnR5cGU7aWYoIW10LnRleHR1cmVGb3JtYXRSZWFkYWJsZShCdCkpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHNBc3luYzogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LiIpO2lmKCFtdC50ZXh0dXJlVHlwZVJlYWRhYmxlKEd0KSl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsc0FzeW5jOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFVuc2lnbmVkQnl0ZVR5cGUgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlLiIpO2lmKGs+PTAmJms8PUMud2lkdGgtWCYmVz49MCYmVzw9Qy5oZWlnaHQtVil7Y29uc3QgVHQ9SS5jcmVhdGVCdWZmZXIoKTtJLmJpbmRCdWZmZXIoSS5QSVhFTF9QQUNLX0JVRkZFUixUdCksSS5idWZmZXJEYXRhKEkuUElYRUxfUEFDS19CVUZGRVIsdXQuYnl0ZUxlbmd0aCxJLlNUUkVBTV9SRUFEKSxJLnJlYWRQaXhlbHMoayxXLFgsVixIdC5jb252ZXJ0KEJ0KSxIdC5jb252ZXJ0KEd0KSwwKSxJLmZsdXNoKCk7Y29uc3QgY2U9SS5mZW5jZVN5bmMoSS5TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURSwwKTt5aWVsZCBFYihJLGNlLDQpO3RyeXtJLmJpbmRCdWZmZXIoSS5QSVhFTF9QQUNLX0JVRkZFUixUdCksSS5nZXRCdWZmZXJTdWJEYXRhKEkuUElYRUxfUEFDS19CVUZGRVIsMCx1dCl9ZmluYWxseXtJLmRlbGV0ZUJ1ZmZlcihUdCksSS5kZWxldGVTeW5jKGNlKX1yZXR1cm4gdXR9fWZpbmFsbHl7Y29uc3QgQXQ9VCE9PW51bGw/JC5nZXQoVCkuX193ZWJnbEZyYW1lYnVmZmVyOm51bGw7US5iaW5kRnJhbWVidWZmZXIoSS5GUkFNRUJVRkZFUixBdCl9fX0pfSx0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZT1mdW5jdGlvbihDLGs9bnVsbCxXPTApe0MuaXNUZXh0dXJlIT09ITAmJihycygiV2ViR0xSZW5kZXJlcjogY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlIGZ1bmN0aW9uIHNpZ25hdHVyZSBoYXMgY2hhbmdlZC4iKSxrPWFyZ3VtZW50c1swXXx8bnVsbCxDPWFyZ3VtZW50c1sxXSk7Y29uc3QgWD1NYXRoLnBvdygyLC1XKSxWPU1hdGguZmxvb3IoQy5pbWFnZS53aWR0aCpYKSx1dD1NYXRoLmZsb29yKEMuaW1hZ2UuaGVpZ2h0KlgpLHh0PWshPT1udWxsP2sueDowLHd0PWshPT1udWxsP2sueTowO0ouc2V0VGV4dHVyZTJEKEMsMCksSS5jb3B5VGV4U3ViSW1hZ2UyRChJLlRFWFRVUkVfMkQsVywwLDAseHQsd3QsVix1dCksUS51bmJpbmRUZXh0dXJlKCl9LHRoaXMuY29weVRleHR1cmVUb1RleHR1cmU9ZnVuY3Rpb24oQyxrLFc9bnVsbCxYPW51bGwsVj0wKXtDLmlzVGV4dHVyZSE9PSEwJiYocnMoIldlYkdMUmVuZGVyZXI6IGNvcHlUZXh0dXJlVG9UZXh0dXJlIGZ1bmN0aW9uIHNpZ25hdHVyZSBoYXMgY2hhbmdlZC4iKSxYPWFyZ3VtZW50c1swXXx8bnVsbCxDPWFyZ3VtZW50c1sxXSxrPWFyZ3VtZW50c1syXSxWPWFyZ3VtZW50c1szXXx8MCxXPW51bGwpO2xldCB1dCx4dCx3dCxBdCxCdCxHdDtXIT09bnVsbD8odXQ9Vy5tYXgueC1XLm1pbi54LHh0PVcubWF4LnktVy5taW4ueSx3dD1XLm1pbi54LEF0PVcubWluLnkpOih1dD1DLmltYWdlLndpZHRoLHh0PUMuaW1hZ2UuaGVpZ2h0LHd0PTAsQXQ9MCksWCE9PW51bGw/KEJ0PVgueCxHdD1YLnkpOihCdD0wLEd0PTApO2NvbnN0IFR0PUh0LmNvbnZlcnQoay5mb3JtYXQpLGNlPUh0LmNvbnZlcnQoay50eXBlKTtKLnNldFRleHR1cmUyRChrLDApLEkucGl4ZWxTdG9yZWkoSS5VTlBBQ0tfRkxJUF9ZX1dFQkdMLGsuZmxpcFkpLEkucGl4ZWxTdG9yZWkoSS5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsay5wcmVtdWx0aXBseUFscGhhKSxJLnBpeGVsU3RvcmVpKEkuVU5QQUNLX0FMSUdOTUVOVCxrLnVucGFja0FsaWdubWVudCk7Y29uc3QgQWU9SS5nZXRQYXJhbWV0ZXIoSS5VTlBBQ0tfUk9XX0xFTkdUSCksRWU9SS5nZXRQYXJhbWV0ZXIoSS5VTlBBQ0tfSU1BR0VfSEVJR0hUKSxSbj1JLmdldFBhcmFtZXRlcihJLlVOUEFDS19TS0lQX1BJWEVMUyksdWU9SS5nZXRQYXJhbWV0ZXIoSS5VTlBBQ0tfU0tJUF9ST1dTKSxDdD1JLmdldFBhcmFtZXRlcihJLlVOUEFDS19TS0lQX0lNQUdFUyksVmU9Qy5pc0NvbXByZXNzZWRUZXh0dXJlP0MubWlwbWFwc1tWXTpDLmltYWdlO0kucGl4ZWxTdG9yZWkoSS5VTlBBQ0tfUk9XX0xFTkdUSCxWZS53aWR0aCksSS5waXhlbFN0b3JlaShJLlVOUEFDS19JTUFHRV9IRUlHSFQsVmUuaGVpZ2h0KSxJLnBpeGVsU3RvcmVpKEkuVU5QQUNLX1NLSVBfUElYRUxTLHd0KSxJLnBpeGVsU3RvcmVpKEkuVU5QQUNLX1NLSVBfUk9XUyxBdCksQy5pc0RhdGFUZXh0dXJlP0kudGV4U3ViSW1hZ2UyRChJLlRFWFRVUkVfMkQsVixCdCxHdCx1dCx4dCxUdCxjZSxWZS5kYXRhKTpDLmlzQ29tcHJlc3NlZFRleHR1cmU/SS5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRChJLlRFWFRVUkVfMkQsVixCdCxHdCxWZS53aWR0aCxWZS5oZWlnaHQsVHQsVmUuZGF0YSk6SS50ZXhTdWJJbWFnZTJEKEkuVEVYVFVSRV8yRCxWLEJ0LEd0LHV0LHh0LFR0LGNlLFZlKSxJLnBpeGVsU3RvcmVpKEkuVU5QQUNLX1JPV19MRU5HVEgsQWUpLEkucGl4ZWxTdG9yZWkoSS5VTlBBQ0tfSU1BR0VfSEVJR0hULEVlKSxJLnBpeGVsU3RvcmVpKEkuVU5QQUNLX1NLSVBfUElYRUxTLFJuKSxJLnBpeGVsU3RvcmVpKEkuVU5QQUNLX1NLSVBfUk9XUyx1ZSksSS5waXhlbFN0b3JlaShJLlVOUEFDS19TS0lQX0lNQUdFUyxDdCksVj09PTAmJmsuZ2VuZXJhdGVNaXBtYXBzJiZJLmdlbmVyYXRlTWlwbWFwKEkuVEVYVFVSRV8yRCksUS51bmJpbmRUZXh0dXJlKCl9LHRoaXMuY29weVRleHR1cmVUb1RleHR1cmUzRD1mdW5jdGlvbihDLGssVz1udWxsLFg9bnVsbCxWPTApe0MuaXNUZXh0dXJlIT09ITAmJihycygiV2ViR0xSZW5kZXJlcjogY29weVRleHR1cmVUb1RleHR1cmUzRCBmdW5jdGlvbiBzaWduYXR1cmUgaGFzIGNoYW5nZWQuIiksVz1hcmd1bWVudHNbMF18fG51bGwsWD1hcmd1bWVudHNbMV18fG51bGwsQz1hcmd1bWVudHNbMl0saz1hcmd1bWVudHNbM10sVj1hcmd1bWVudHNbNF18fDApO2xldCB1dCx4dCx3dCxBdCxCdCxHdCxUdCxjZSxBZTtjb25zdCBFZT1DLmlzQ29tcHJlc3NlZFRleHR1cmU/Qy5taXBtYXBzW1ZdOkMuaW1hZ2U7VyE9PW51bGw/KHV0PVcubWF4LngtVy5taW4ueCx4dD1XLm1heC55LVcubWluLnksd3Q9Vy5tYXguei1XLm1pbi56LEF0PVcubWluLngsQnQ9Vy5taW4ueSxHdD1XLm1pbi56KToodXQ9RWUud2lkdGgseHQ9RWUuaGVpZ2h0LHd0PUVlLmRlcHRoLEF0PTAsQnQ9MCxHdD0wKSxYIT09bnVsbD8oVHQ9WC54LGNlPVgueSxBZT1YLnopOihUdD0wLGNlPTAsQWU9MCk7Y29uc3QgUm49SHQuY29udmVydChrLmZvcm1hdCksdWU9SHQuY29udmVydChrLnR5cGUpO2xldCBDdDtpZihrLmlzRGF0YTNEVGV4dHVyZSlKLnNldFRleHR1cmUzRChrLDApLEN0PUkuVEVYVFVSRV8zRDtlbHNlIGlmKGsuaXNEYXRhQXJyYXlUZXh0dXJlfHxrLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSlKLnNldFRleHR1cmUyREFycmF5KGssMCksQ3Q9SS5URVhUVVJFXzJEX0FSUkFZO2Vsc2V7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q6IG9ubHkgc3VwcG9ydHMgVEhSRUUuRGF0YVRleHR1cmUzRCBhbmQgVEhSRUUuRGF0YVRleHR1cmUyREFycmF5LiIpO3JldHVybn1JLnBpeGVsU3RvcmVpKEkuVU5QQUNLX0ZMSVBfWV9XRUJHTCxrLmZsaXBZKSxJLnBpeGVsU3RvcmVpKEkuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLGsucHJlbXVsdGlwbHlBbHBoYSksSS5waXhlbFN0b3JlaShJLlVOUEFDS19BTElHTk1FTlQsay51bnBhY2tBbGlnbm1lbnQpO2NvbnN0IFZlPUkuZ2V0UGFyYW1ldGVyKEkuVU5QQUNLX1JPV19MRU5HVEgpLGhlPUkuZ2V0UGFyYW1ldGVyKEkuVU5QQUNLX0lNQUdFX0hFSUdIVCksWm49SS5nZXRQYXJhbWV0ZXIoSS5VTlBBQ0tfU0tJUF9QSVhFTFMpLHNvPUkuZ2V0UGFyYW1ldGVyKEkuVU5QQUNLX1NLSVBfUk9XUyksUG49SS5nZXRQYXJhbWV0ZXIoSS5VTlBBQ0tfU0tJUF9JTUFHRVMpO0kucGl4ZWxTdG9yZWkoSS5VTlBBQ0tfUk9XX0xFTkdUSCxFZS53aWR0aCksSS5waXhlbFN0b3JlaShJLlVOUEFDS19JTUFHRV9IRUlHSFQsRWUuaGVpZ2h0KSxJLnBpeGVsU3RvcmVpKEkuVU5QQUNLX1NLSVBfUElYRUxTLEF0KSxJLnBpeGVsU3RvcmVpKEkuVU5QQUNLX1NLSVBfUk9XUyxCdCksSS5waXhlbFN0b3JlaShJLlVOUEFDS19TS0lQX0lNQUdFUyxHdCksQy5pc0RhdGFUZXh0dXJlfHxDLmlzRGF0YTNEVGV4dHVyZT9JLnRleFN1YkltYWdlM0QoQ3QsVixUdCxjZSxBZSx1dCx4dCx3dCxSbix1ZSxFZS5kYXRhKTprLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZT9JLmNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKEN0LFYsVHQsY2UsQWUsdXQseHQsd3QsUm4sRWUuZGF0YSk6SS50ZXhTdWJJbWFnZTNEKEN0LFYsVHQsY2UsQWUsdXQseHQsd3QsUm4sdWUsRWUpLEkucGl4ZWxTdG9yZWkoSS5VTlBBQ0tfUk9XX0xFTkdUSCxWZSksSS5waXhlbFN0b3JlaShJLlVOUEFDS19JTUFHRV9IRUlHSFQsaGUpLEkucGl4ZWxTdG9yZWkoSS5VTlBBQ0tfU0tJUF9QSVhFTFMsWm4pLEkucGl4ZWxTdG9yZWkoSS5VTlBBQ0tfU0tJUF9ST1dTLHNvKSxJLnBpeGVsU3RvcmVpKEkuVU5QQUNLX1NLSVBfSU1BR0VTLFBuKSxWPT09MCYmay5nZW5lcmF0ZU1pcG1hcHMmJkkuZ2VuZXJhdGVNaXBtYXAoQ3QpLFEudW5iaW5kVGV4dHVyZSgpfSx0aGlzLmluaXRSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oQyl7JC5nZXQoQykuX193ZWJnbEZyYW1lYnVmZmVyPT09dm9pZCAwJiZKLnNldHVwUmVuZGVyVGFyZ2V0KEMpfSx0aGlzLmluaXRUZXh0dXJlPWZ1bmN0aW9uKEMpe0MuaXNDdWJlVGV4dHVyZT9KLnNldFRleHR1cmVDdWJlKEMsMCk6Qy5pc0RhdGEzRFRleHR1cmU/Si5zZXRUZXh0dXJlM0QoQywwKTpDLmlzRGF0YUFycmF5VGV4dHVyZXx8Qy5pc0NvbXByZXNzZWRBcnJheVRleHR1cmU/Si5zZXRUZXh0dXJlMkRBcnJheShDLDApOkouc2V0VGV4dHVyZTJEKEMsMCksUS51bmJpbmRUZXh0dXJlKCl9LHRoaXMucmVzZXRTdGF0ZT1mdW5jdGlvbigpe0U9MCxiPTAsVD1udWxsLFEucmVzZXQoKSxZdC5yZXNldCgpfSx0eXBlb2YgX19USFJFRV9ERVZUT09MU19fIT0idW5kZWZpbmVkIiYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIix7ZGV0YWlsOnRoaXN9KSl9Z2V0IGNvb3JkaW5hdGVTeXN0ZW0oKXtyZXR1cm4gdGl9Z2V0IG91dHB1dENvbG9yU3BhY2UoKXtyZXR1cm4gdGhpcy5fb3V0cHV0Q29sb3JTcGFjZX1zZXQgb3V0cHV0Q29sb3JTcGFjZSh0KXt0aGlzLl9vdXRwdXRDb2xvclNwYWNlPXQ7Y29uc3QgZT10aGlzLmdldENvbnRleHQoKTtlLmRyYXdpbmdCdWZmZXJDb2xvclNwYWNlPXQ9PT14bD8iZGlzcGxheS1wMyI6InNyZ2IiLGUudW5wYWNrQ29sb3JTcGFjZT1zZS53b3JraW5nQ29sb3JTcGFjZT09PWJvPyJkaXNwbGF5LXAzIjoic3JnYiJ9fWNsYXNzIFlse2NvbnN0cnVjdG9yKHQsZT0yNWUtNSl7dGhpcy5pc0ZvZ0V4cDI9ITAsdGhpcy5uYW1lPSIiLHRoaXMuY29sb3I9bmV3IHZ0KHQpLHRoaXMuZGVuc2l0eT1lfWNsb25lKCl7cmV0dXJuIG5ldyBZbCh0aGlzLmNvbG9yLHRoaXMuZGVuc2l0eSl9dG9KU09OKCl7cmV0dXJue3R5cGU6IkZvZ0V4cDIiLG5hbWU6dGhpcy5uYW1lLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksZGVuc2l0eTp0aGlzLmRlbnNpdHl9fX1jbGFzcyBabHtjb25zdHJ1Y3Rvcih0LGU9MSxuPTFlMyl7dGhpcy5pc0ZvZz0hMCx0aGlzLm5hbWU9IiIsdGhpcy5jb2xvcj1uZXcgdnQodCksdGhpcy5uZWFyPWUsdGhpcy5mYXI9bn1jbG9uZSgpe3JldHVybiBuZXcgWmwodGhpcy5jb2xvcix0aGlzLm5lYXIsdGhpcy5mYXIpfXRvSlNPTigpe3JldHVybnt0eXBlOiJGb2ciLG5hbWU6dGhpcy5uYW1lLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksbmVhcjp0aGlzLm5lYXIsZmFyOnRoaXMuZmFyfX19Y2xhc3MgdTAgZXh0ZW5kcyBuZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc1NjZW5lPSEwLHRoaXMudHlwZT0iU2NlbmUiLHRoaXMuYmFja2dyb3VuZD1udWxsLHRoaXMuZW52aXJvbm1lbnQ9bnVsbCx0aGlzLmZvZz1udWxsLHRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3M9MCx0aGlzLmJhY2tncm91bmRJbnRlbnNpdHk9MSx0aGlzLmJhY2tncm91bmRSb3RhdGlvbj1uZXcgTW4sdGhpcy5lbnZpcm9ubWVudEludGVuc2l0eT0xLHRoaXMuZW52aXJvbm1lbnRSb3RhdGlvbj1uZXcgTW4sdGhpcy5vdmVycmlkZU1hdGVyaWFsPW51bGwsdHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyE9InVuZGVmaW5lZCImJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgib2JzZXJ2ZSIse2RldGFpbDp0aGlzfSkpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHQuYmFja2dyb3VuZCE9PW51bGwmJih0aGlzLmJhY2tncm91bmQ9dC5iYWNrZ3JvdW5kLmNsb25lKCkpLHQuZW52aXJvbm1lbnQhPT1udWxsJiYodGhpcy5lbnZpcm9ubWVudD10LmVudmlyb25tZW50LmNsb25lKCkpLHQuZm9nIT09bnVsbCYmKHRoaXMuZm9nPXQuZm9nLmNsb25lKCkpLHRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3M9dC5iYWNrZ3JvdW5kQmx1cnJpbmVzcyx0aGlzLmJhY2tncm91bmRJbnRlbnNpdHk9dC5iYWNrZ3JvdW5kSW50ZW5zaXR5LHRoaXMuYmFja2dyb3VuZFJvdGF0aW9uLmNvcHkodC5iYWNrZ3JvdW5kUm90YXRpb24pLHRoaXMuZW52aXJvbm1lbnRJbnRlbnNpdHk9dC5lbnZpcm9ubWVudEludGVuc2l0eSx0aGlzLmVudmlyb25tZW50Um90YXRpb24uY29weSh0LmVudmlyb25tZW50Um90YXRpb24pLHQub3ZlcnJpZGVNYXRlcmlhbCE9PW51bGwmJih0aGlzLm92ZXJyaWRlTWF0ZXJpYWw9dC5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCkpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIHRoaXMuZm9nIT09bnVsbCYmKGUub2JqZWN0LmZvZz10aGlzLmZvZy50b0pTT04oKSksdGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcz4wJiYoZS5vYmplY3QuYmFja2dyb3VuZEJsdXJyaW5lc3M9dGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcyksdGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5IT09MSYmKGUub2JqZWN0LmJhY2tncm91bmRJbnRlbnNpdHk9dGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5KSxlLm9iamVjdC5iYWNrZ3JvdW5kUm90YXRpb249dGhpcy5iYWNrZ3JvdW5kUm90YXRpb24udG9BcnJheSgpLHRoaXMuZW52aXJvbm1lbnRJbnRlbnNpdHkhPT0xJiYoZS5vYmplY3QuZW52aXJvbm1lbnRJbnRlbnNpdHk9dGhpcy5lbnZpcm9ubWVudEludGVuc2l0eSksZS5vYmplY3QuZW52aXJvbm1lbnRSb3RhdGlvbj10aGlzLmVudmlyb25tZW50Um90YXRpb24udG9BcnJheSgpLGV9fWNsYXNzIEpse2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5pc0ludGVybGVhdmVkQnVmZmVyPSEwLHRoaXMuYXJyYXk9dCx0aGlzLnN0cmlkZT1lLHRoaXMuY291bnQ9dCE9PXZvaWQgMD90Lmxlbmd0aC9lOjAsdGhpcy51c2FnZT1Ubyx0aGlzLl91cGRhdGVSYW5nZT17b2Zmc2V0OjAsY291bnQ6LTF9LHRoaXMudXBkYXRlUmFuZ2VzPVtdLHRoaXMudmVyc2lvbj0wLHRoaXMudXVpZD1fbigpfW9uVXBsb2FkQ2FsbGJhY2soKXt9c2V0IG5lZWRzVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy52ZXJzaW9uKyt9Z2V0IHVwZGF0ZVJhbmdlKCl7cmV0dXJuIHJzKCJUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlcjogdXBkYXRlUmFuZ2UoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gcjE2OS4gVXNlIGFkZFVwZGF0ZVJhbmdlKCkgaW5zdGVhZC4iKSx0aGlzLl91cGRhdGVSYW5nZX1zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNvcHkodCl7cmV0dXJuIHRoaXMuYXJyYXk9bmV3IHQuYXJyYXkuY29uc3RydWN0b3IodC5hcnJheSksdGhpcy5jb3VudD10LmNvdW50LHRoaXMuc3RyaWRlPXQuc3RyaWRlLHRoaXMudXNhZ2U9dC51c2FnZSx0aGlzfWNvcHlBdCh0LGUsbil7dCo9dGhpcy5zdHJpZGUsbio9ZS5zdHJpZGU7Zm9yKGxldCByPTAscz10aGlzLnN0cmlkZTtyPHM7cisrKXRoaXMuYXJyYXlbdCtyXT1lLmFycmF5W24rcl07cmV0dXJuIHRoaXN9c2V0KHQsZT0wKXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCxlKSx0aGlzfWNsb25lKHQpe3QuYXJyYXlCdWZmZXJzPT09dm9pZCAwJiYodC5hcnJheUJ1ZmZlcnM9e30pLHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkPT09dm9pZCAwJiYodGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9X24oKSksdC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPT09dm9pZCAwJiYodC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPXRoaXMuYXJyYXkuc2xpY2UoMCkuYnVmZmVyKTtjb25zdCBlPW5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKHQuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXSksbj1uZXcgdGhpcy5jb25zdHJ1Y3RvcihlLHRoaXMuc3RyaWRlKTtyZXR1cm4gbi5zZXRVc2FnZSh0aGlzLnVzYWdlKSxufW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfXRvSlNPTih0KXtyZXR1cm4gdC5hcnJheUJ1ZmZlcnM9PT12b2lkIDAmJih0LmFycmF5QnVmZmVycz17fSksdGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9PT12b2lkIDAmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1fbigpKSx0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09PT12b2lkIDAmJih0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09QXJyYXkuZnJvbShuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheS5idWZmZXIpKSkse3V1aWQ6dGhpcy51dWlkLGJ1ZmZlcjp0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxzdHJpZGU6dGhpcy5zdHJpZGV9fX1jb25zdCBlbj1uZXcgTDtjbGFzcyBUcntjb25zdHJ1Y3Rvcih0LGUsbixyPSExKXt0aGlzLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU9ITAsdGhpcy5uYW1lPSIiLHRoaXMuZGF0YT10LHRoaXMuaXRlbVNpemU9ZSx0aGlzLm9mZnNldD1uLHRoaXMubm9ybWFsaXplZD1yfWdldCBjb3VudCgpe3JldHVybiB0aGlzLmRhdGEuY291bnR9Z2V0IGFycmF5KCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheX1zZXQgbmVlZHNVcGRhdGUodCl7dGhpcy5kYXRhLm5lZWRzVXBkYXRlPXR9YXBwbHlNYXRyaXg0KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5kYXRhLmNvdW50O2U8bjtlKyspZW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLGVuLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldFhZWihlLGVuLngsZW4ueSxlbi56KTtyZXR1cm4gdGhpc31hcHBseU5vcm1hbE1hdHJpeCh0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKyllbi5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksZW4uYXBwbHlOb3JtYWxNYXRyaXgodCksdGhpcy5zZXRYWVooZSxlbi54LGVuLnksZW4ueik7cmV0dXJuIHRoaXN9dHJhbnNmb3JtRGlyZWN0aW9uKHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKWVuLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxlbi50cmFuc2Zvcm1EaXJlY3Rpb24odCksdGhpcy5zZXRYWVooZSxlbi54LGVuLnksZW4ueik7cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQsZSl7bGV0IG49dGhpcy5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKG49UWUobix0aGlzLmFycmF5KSksbn1zZXRDb21wb25lbnQodCxlLG4pe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihuPSR0KG4sdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrZV09bix0aGlzfXNldFgodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT0kdChlLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0XT1lLHRoaXN9c2V0WSh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPSR0KGUsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV09ZSx0aGlzfXNldFoodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT0kdChlLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzJdPWUsdGhpc31zZXRXKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9JHQoZSx0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXT1lLHRoaXN9Z2V0WCh0KXtsZXQgZT10aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0XTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1RZShlLHRoaXMuYXJyYXkpKSxlfWdldFkodCl7bGV0IGU9dGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsxXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1RZShlLHRoaXMuYXJyYXkpKSxlfWdldFoodCl7bGV0IGU9dGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsyXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1RZShlLHRoaXMuYXJyYXkpKSxlfWdldFcodCl7bGV0IGU9dGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1RZShlLHRoaXMuYXJyYXkpKSxlfXNldFhZKHQsZSxuKXtyZXR1cm4gdD10KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQsdGhpcy5ub3JtYWxpemVkJiYoZT0kdChlLHRoaXMuYXJyYXkpLG49JHQobix0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QrMF09ZSx0aGlzLmRhdGEuYXJyYXlbdCsxXT1uLHRoaXN9c2V0WFlaKHQsZSxuLHIpe3JldHVybiB0PXQqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCx0aGlzLm5vcm1hbGl6ZWQmJihlPSR0KGUsdGhpcy5hcnJheSksbj0kdChuLHRoaXMuYXJyYXkpLHI9JHQocix0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QrMF09ZSx0aGlzLmRhdGEuYXJyYXlbdCsxXT1uLHRoaXMuZGF0YS5hcnJheVt0KzJdPXIsdGhpc31zZXRYWVpXKHQsZSxuLHIscyl7cmV0dXJuIHQ9dCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCYmKGU9JHQoZSx0aGlzLmFycmF5KSxuPSR0KG4sdGhpcy5hcnJheSkscj0kdChyLHRoaXMuYXJyYXkpLHM9JHQocyx0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QrMF09ZSx0aGlzLmRhdGEuYXJyYXlbdCsxXT1uLHRoaXMuZGF0YS5hcnJheVt0KzJdPXIsdGhpcy5kYXRhLmFycmF5W3QrM109cyx0aGlzfWNsb25lKHQpe2lmKHQ9PT12b2lkIDApe2NvbnNvbGUubG9nKCJUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5jbG9uZSgpOiBDbG9uaW5nIGFuIGludGVybGVhdmVkIGJ1ZmZlciBhdHRyaWJ1dGUgd2lsbCBkZS1pbnRlcmxlYXZlIGJ1ZmZlciBkYXRhLiIpO2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjx0aGlzLmNvdW50O24rKyl7Y29uc3Qgcj1uKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7Zm9yKGxldCBzPTA7czx0aGlzLml0ZW1TaXplO3MrKyllLnB1c2godGhpcy5kYXRhLmFycmF5W3Irc10pfXJldHVybiBuZXcgWnQobmV3IHRoaXMuYXJyYXkuY29uc3RydWN0b3IoZSksdGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQpfWVsc2UgcmV0dXJuIHQuaW50ZXJsZWF2ZWRCdWZmZXJzPT09dm9pZCAwJiYodC5pbnRlcmxlYXZlZEJ1ZmZlcnM9e30pLHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXT09PXZvaWQgMCYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXT10aGlzLmRhdGEuY2xvbmUodCkpLG5ldyBUcih0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF0sdGhpcy5pdGVtU2l6ZSx0aGlzLm9mZnNldCx0aGlzLm5vcm1hbGl6ZWQpfXRvSlNPTih0KXtpZih0PT09dm9pZCAwKXtjb25zb2xlLmxvZygiVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUudG9KU09OKCk6IFNlcmlhbGl6aW5nIGFuIGludGVybGVhdmVkIGJ1ZmZlciBhdHRyaWJ1dGUgd2lsbCBkZS1pbnRlcmxlYXZlIGJ1ZmZlciBkYXRhLiIpO2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjx0aGlzLmNvdW50O24rKyl7Y29uc3Qgcj1uKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7Zm9yKGxldCBzPTA7czx0aGlzLml0ZW1TaXplO3MrKyllLnB1c2godGhpcy5kYXRhLmFycmF5W3Irc10pfXJldHVybntpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OmUsbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9fWVsc2UgcmV0dXJuIHQuaW50ZXJsZWF2ZWRCdWZmZXJzPT09dm9pZCAwJiYodC5pbnRlcmxlYXZlZEJ1ZmZlcnM9e30pLHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXT09PXZvaWQgMCYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXT10aGlzLmRhdGEudG9KU09OKHQpKSx7aXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZTohMCxpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLGRhdGE6dGhpcy5kYXRhLnV1aWQsb2Zmc2V0OnRoaXMub2Zmc2V0LG5vcm1hbGl6ZWQ6dGhpcy5ub3JtYWxpemVkfX19Y2xhc3MgZGYgZXh0ZW5kcyBYZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNTcHJpdGVNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IlNwcml0ZU1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB2dCgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5yb3RhdGlvbj0wLHRoaXMuc2l6ZUF0dGVudWF0aW9uPSEwLHRoaXMudHJhbnNwYXJlbnQ9ITAsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMucm90YXRpb249dC5yb3RhdGlvbix0aGlzLnNpemVBdHRlbnVhdGlvbj10LnNpemVBdHRlbnVhdGlvbix0aGlzLmZvZz10LmZvZyx0aGlzfX1sZXQgQ3M7Y29uc3Qga289bmV3IEwsUnM9bmV3IEwsUHM9bmV3IEwsSXM9bmV3IHEsR289bmV3IHEsaDA9bmV3IEx0LEtsPW5ldyBMLFZvPW5ldyBMLGpsPW5ldyBMLGYwPW5ldyBxLHBmPW5ldyBxLGQwPW5ldyBxO2NsYXNzIHAwIGV4dGVuZHMgbmV7Y29uc3RydWN0b3IodD1uZXcgZGYpe2lmKHN1cGVyKCksdGhpcy5pc1Nwcml0ZT0hMCx0aGlzLnR5cGU9IlNwcml0ZSIsQ3M9PT12b2lkIDApe0NzPW5ldyBOdDtjb25zdCBlPW5ldyBGbG9hdDMyQXJyYXkoWy0uNSwtLjUsMCwwLDAsLjUsLS41LDAsMSwwLC41LC41LDAsMSwxLC0uNSwuNSwwLDAsMV0pLG49bmV3IEpsKGUsNSk7Q3Muc2V0SW5kZXgoWzAsMSwyLDAsMiwzXSksQ3Muc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFRyKG4sMywwLCExKSksQ3Muc2V0QXR0cmlidXRlKCJ1diIsbmV3IFRyKG4sMiwzLCExKSl9dGhpcy5nZW9tZXRyeT1Dcyx0aGlzLm1hdGVyaWFsPXQsdGhpcy5jZW50ZXI9bmV3IHEoLjUsLjUpfXJheWNhc3QodCxlKXt0LmNhbWVyYT09PW51bGwmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLlNwcml0ZTogIlJheWNhc3Rlci5jYW1lcmEiIG5lZWRzIHRvIGJlIHNldCBpbiBvcmRlciB0byByYXljYXN0IGFnYWluc3Qgc3ByaXRlcy4nKSxScy5zZXRGcm9tTWF0cml4U2NhbGUodGhpcy5tYXRyaXhXb3JsZCksaDAuY29weSh0LmNhbWVyYS5tYXRyaXhXb3JsZCksdGhpcy5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyh0LmNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsdGhpcy5tYXRyaXhXb3JsZCksUHMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubW9kZWxWaWV3TWF0cml4KSx0LmNhbWVyYS5pc1BlcnNwZWN0aXZlQ2FtZXJhJiZ0aGlzLm1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbj09PSExJiZScy5tdWx0aXBseVNjYWxhcigtUHMueik7Y29uc3Qgbj10aGlzLm1hdGVyaWFsLnJvdGF0aW9uO2xldCByLHM7biE9PTAmJihzPU1hdGguY29zKG4pLHI9TWF0aC5zaW4obikpO2NvbnN0IG89dGhpcy5jZW50ZXI7UWwoS2wuc2V0KC0uNSwtLjUsMCksUHMsbyxScyxyLHMpLFFsKFZvLnNldCguNSwtLjUsMCksUHMsbyxScyxyLHMpLFFsKGpsLnNldCguNSwuNSwwKSxQcyxvLFJzLHIscyksZjAuc2V0KDAsMCkscGYuc2V0KDEsMCksZDAuc2V0KDEsMSk7bGV0IGE9dC5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoS2wsVm8samwsITEsa28pO2lmKGE9PT1udWxsJiYoUWwoVm8uc2V0KC0uNSwuNSwwKSxQcyxvLFJzLHIscykscGYuc2V0KDAsMSksYT10LnJheS5pbnRlcnNlY3RUcmlhbmdsZShLbCxqbCxWbywhMSxrbyksYT09PW51bGwpKXJldHVybjtjb25zdCBsPXQucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKGtvKTtsPHQubmVhcnx8bD50LmZhcnx8ZS5wdXNoKHtkaXN0YW5jZTpsLHBvaW50OmtvLmNsb25lKCksdXY6U24uZ2V0SW50ZXJwb2xhdGlvbihrbyxLbCxWbyxqbCxmMCxwZixkMCxuZXcgcSksZmFjZTpudWxsLG9iamVjdDp0aGlzfSl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdC5jZW50ZXIhPT12b2lkIDAmJnRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMubWF0ZXJpYWw9dC5tYXRlcmlhbCx0aGlzfX1mdW5jdGlvbiBRbChpLHQsZSxuLHIscyl7SXMuc3ViVmVjdG9ycyhpLGUpLmFkZFNjYWxhciguNSkubXVsdGlwbHkobiksciE9PXZvaWQgMD8oR28ueD1zKklzLngtcipJcy55LEdvLnk9cipJcy54K3MqSXMueSk6R28uY29weShJcyksaS5jb3B5KHQpLGkueCs9R28ueCxpLnkrPUdvLnksaS5hcHBseU1hdHJpeDQoaDApfWNvbnN0IHRjPW5ldyBMLG0wPW5ldyBMO2NsYXNzIGcwIGV4dGVuZHMgbmV7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX2N1cnJlbnRMZXZlbD0wLHRoaXMudHlwZT0iTE9EIixPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtsZXZlbHM6e2VudW1lcmFibGU6ITAsdmFsdWU6W119LGlzTE9EOnt2YWx1ZTohMH19KSx0aGlzLmF1dG9VcGRhdGU9ITB9Y29weSh0KXtzdXBlci5jb3B5KHQsITEpO2NvbnN0IGU9dC5sZXZlbHM7Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXtjb25zdCBzPWVbbl07dGhpcy5hZGRMZXZlbChzLm9iamVjdC5jbG9uZSgpLHMuZGlzdGFuY2Uscy5oeXN0ZXJlc2lzKX1yZXR1cm4gdGhpcy5hdXRvVXBkYXRlPXQuYXV0b1VwZGF0ZSx0aGlzfWFkZExldmVsKHQsZT0wLG49MCl7ZT1NYXRoLmFicyhlKTtjb25zdCByPXRoaXMubGV2ZWxzO2xldCBzO2ZvcihzPTA7czxyLmxlbmd0aCYmIShlPHJbc10uZGlzdGFuY2UpO3MrKyk7cmV0dXJuIHIuc3BsaWNlKHMsMCx7ZGlzdGFuY2U6ZSxoeXN0ZXJlc2lzOm4sb2JqZWN0OnR9KSx0aGlzLmFkZCh0KSx0aGlzfWdldEN1cnJlbnRMZXZlbCgpe3JldHVybiB0aGlzLl9jdXJyZW50TGV2ZWx9Z2V0T2JqZWN0Rm9yRGlzdGFuY2UodCl7Y29uc3QgZT10aGlzLmxldmVscztpZihlLmxlbmd0aD4wKXtsZXQgbixyO2ZvcihuPTEscj1lLmxlbmd0aDtuPHI7bisrKXtsZXQgcz1lW25dLmRpc3RhbmNlO2lmKGVbbl0ub2JqZWN0LnZpc2libGUmJihzLT1zKmVbbl0uaHlzdGVyZXNpcyksdDxzKWJyZWFrfXJldHVybiBlW24tMV0ub2JqZWN0fXJldHVybiBudWxsfXJheWNhc3QodCxlKXtpZih0aGlzLmxldmVscy5sZW5ndGg+MCl7dGMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpO2NvbnN0IHI9dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8odGMpO3RoaXMuZ2V0T2JqZWN0Rm9yRGlzdGFuY2UocikucmF5Y2FzdCh0LGUpfX11cGRhdGUodCl7Y29uc3QgZT10aGlzLmxldmVscztpZihlLmxlbmd0aD4xKXt0Yy5zZXRGcm9tTWF0cml4UG9zaXRpb24odC5tYXRyaXhXb3JsZCksbTAuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpO2NvbnN0IG49dGMuZGlzdGFuY2VUbyhtMCkvdC56b29tO2VbMF0ub2JqZWN0LnZpc2libGU9ITA7bGV0IHIscztmb3Iocj0xLHM9ZS5sZW5ndGg7cjxzO3IrKyl7bGV0IG89ZVtyXS5kaXN0YW5jZTtpZihlW3JdLm9iamVjdC52aXNpYmxlJiYoby09byplW3JdLmh5c3RlcmVzaXMpLG4+PW8pZVtyLTFdLm9iamVjdC52aXNpYmxlPSExLGVbcl0ub2JqZWN0LnZpc2libGU9ITA7ZWxzZSBicmVha31mb3IodGhpcy5fY3VycmVudExldmVsPXItMTtyPHM7cisrKWVbcl0ub2JqZWN0LnZpc2libGU9ITF9fXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTt0aGlzLmF1dG9VcGRhdGU9PT0hMSYmKGUub2JqZWN0LmF1dG9VcGRhdGU9ITEpLGUub2JqZWN0LmxldmVscz1bXTtjb25zdCBuPXRoaXMubGV2ZWxzO2ZvcihsZXQgcj0wLHM9bi5sZW5ndGg7cjxzO3IrKyl7Y29uc3Qgbz1uW3JdO2Uub2JqZWN0LmxldmVscy5wdXNoKHtvYmplY3Q6by5vYmplY3QudXVpZCxkaXN0YW5jZTpvLmRpc3RhbmNlLGh5c3RlcmVzaXM6by5oeXN0ZXJlc2lzfSl9cmV0dXJuIGV9fWNvbnN0IHkwPW5ldyBMLHYwPW5ldyBvZSxfMD1uZXcgb2Usb1Q9bmV3IEwseDA9bmV3IEx0LGVjPW5ldyBMLG1mPW5ldyBXZSxNMD1uZXcgTHQsZ2Y9bmV3IHVzO2NsYXNzIFMwIGV4dGVuZHMgSWV7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMuaXNTa2lubmVkTWVzaD0hMCx0aGlzLnR5cGU9IlNraW5uZWRNZXNoIix0aGlzLmJpbmRNb2RlPW1oLHRoaXMuYmluZE1hdHJpeD1uZXcgTHQsdGhpcy5iaW5kTWF0cml4SW52ZXJzZT1uZXcgTHQsdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbH1jb21wdXRlQm91bmRpbmdCb3goKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7dGhpcy5ib3VuZGluZ0JveD09PW51bGwmJih0aGlzLmJvdW5kaW5nQm94PW5ldyBPZSksdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTtjb25zdCBlPXQuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2ZvcihsZXQgbj0wO248ZS5jb3VudDtuKyspdGhpcy5nZXRWZXJ0ZXhQb3NpdGlvbihuLGVjKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoZWMpfWNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeTt0aGlzLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3IFdlKSx0aGlzLmJvdW5kaW5nU3BoZXJlLm1ha2VFbXB0eSgpO2NvbnN0IGU9dC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7Zm9yKGxldCBuPTA7bjxlLmNvdW50O24rKyl0aGlzLmdldFZlcnRleFBvc2l0aW9uKG4sZWMpLHRoaXMuYm91bmRpbmdTcGhlcmUuZXhwYW5kQnlQb2ludChlYyl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5iaW5kTW9kZT10LmJpbmRNb2RlLHRoaXMuYmluZE1hdHJpeC5jb3B5KHQuYmluZE1hdHJpeCksdGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KHQuYmluZE1hdHJpeEludmVyc2UpLHRoaXMuc2tlbGV0b249dC5za2VsZXRvbix0LmJvdW5kaW5nQm94IT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9dC5ib3VuZGluZ0JveC5jbG9uZSgpKSx0LmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9dC5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKSx0aGlzfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMubWF0ZXJpYWwscj10aGlzLm1hdHJpeFdvcmxkO24hPT12b2lkIDAmJih0aGlzLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxtZi5jb3B5KHRoaXMuYm91bmRpbmdTcGhlcmUpLG1mLmFwcGx5TWF0cml4NChyKSx0LnJheS5pbnRlcnNlY3RzU3BoZXJlKG1mKSE9PSExJiYoTTAuY29weShyKS5pbnZlcnQoKSxnZi5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoTTApLCEodGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJmdmLmludGVyc2VjdHNCb3godGhpcy5ib3VuZGluZ0JveCk9PT0hMSkmJnRoaXMuX2NvbXB1dGVJbnRlcnNlY3Rpb25zKHQsZSxnZikpKX1nZXRWZXJ0ZXhQb3NpdGlvbih0LGUpe3JldHVybiBzdXBlci5nZXRWZXJ0ZXhQb3NpdGlvbih0LGUpLHRoaXMuYXBwbHlCb25lVHJhbnNmb3JtKHQsZSksZX1iaW5kKHQsZSl7dGhpcy5za2VsZXRvbj10LGU9PT12b2lkIDAmJih0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKSx0aGlzLnNrZWxldG9uLmNhbGN1bGF0ZUludmVyc2VzKCksZT10aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmJpbmRNYXRyaXguY29weShlKSx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkoZSkuaW52ZXJ0KCl9cG9zZSgpe3RoaXMuc2tlbGV0b24ucG9zZSgpfW5vcm1hbGl6ZVNraW5XZWlnaHRzKCl7Y29uc3QgdD1uZXcgb2UsZT10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMuc2tpbldlaWdodDtmb3IobGV0IG49MCxyPWUuY291bnQ7bjxyO24rKyl7dC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsbik7Y29uc3Qgcz0xL3QubWFuaGF0dGFuTGVuZ3RoKCk7cyE9PTEvMD90Lm11bHRpcGx5U2NhbGFyKHMpOnQuc2V0KDEsMCwwLDApLGUuc2V0WFlaVyhuLHQueCx0LnksdC56LHQudyl9fXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3N1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpLHRoaXMuYmluZE1vZGU9PT1taD90aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk6dGhpcy5iaW5kTW9kZT09PVhtP3RoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSh0aGlzLmJpbmRNYXRyaXgpLmludmVydCgpOmNvbnNvbGUud2FybigiVEhSRUUuU2tpbm5lZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTogIit0aGlzLmJpbmRNb2RlKX1hcHBseUJvbmVUcmFuc2Zvcm0odCxlKXtjb25zdCBuPXRoaXMuc2tlbGV0b24scj10aGlzLmdlb21ldHJ5O3YwLmZyb21CdWZmZXJBdHRyaWJ1dGUoci5hdHRyaWJ1dGVzLnNraW5JbmRleCx0KSxfMC5mcm9tQnVmZmVyQXR0cmlidXRlKHIuYXR0cmlidXRlcy5za2luV2VpZ2h0LHQpLHkwLmNvcHkoZSkuYXBwbHlNYXRyaXg0KHRoaXMuYmluZE1hdHJpeCksZS5zZXQoMCwwLDApO2ZvcihsZXQgcz0wO3M8NDtzKyspe2NvbnN0IG89XzAuZ2V0Q29tcG9uZW50KHMpO2lmKG8hPT0wKXtjb25zdCBhPXYwLmdldENvbXBvbmVudChzKTt4MC5tdWx0aXBseU1hdHJpY2VzKG4uYm9uZXNbYV0ubWF0cml4V29ybGQsbi5ib25lSW52ZXJzZXNbYV0pLGUuYWRkU2NhbGVkVmVjdG9yKG9ULmNvcHkoeTApLmFwcGx5TWF0cml4NCh4MCksbyl9fXJldHVybiBlLmFwcGx5TWF0cml4NCh0aGlzLmJpbmRNYXRyaXhJbnZlcnNlKX19Y2xhc3MgeWYgZXh0ZW5kcyBuZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc0JvbmU9ITAsdGhpcy50eXBlPSJCb25lIn19Y2xhc3MgbmkgZXh0ZW5kcyBNZXtjb25zdHJ1Y3Rvcih0PW51bGwsZT0xLG49MSxyLHMsbyxhLGwsYz1GZSx1PUZlLGgsZil7c3VwZXIobnVsbCxvLGEsbCxjLHUscixzLGgsZiksdGhpcy5pc0RhdGFUZXh0dXJlPSEwLHRoaXMuaW1hZ2U9e2RhdGE6dCx3aWR0aDplLGhlaWdodDpufSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMSx0aGlzLmZsaXBZPSExLHRoaXMudW5wYWNrQWxpZ25tZW50PTF9fWNvbnN0IGIwPW5ldyBMdCxhVD1uZXcgTHQ7Y2xhc3MgbmN7Y29uc3RydWN0b3IodD1bXSxlPVtdKXt0aGlzLnV1aWQ9X24oKSx0aGlzLmJvbmVzPXQuc2xpY2UoMCksdGhpcy5ib25lSW52ZXJzZXM9ZSx0aGlzLmJvbmVNYXRyaWNlcz1udWxsLHRoaXMuYm9uZVRleHR1cmU9bnVsbCx0aGlzLmluaXQoKX1pbml0KCl7Y29uc3QgdD10aGlzLmJvbmVzLGU9dGhpcy5ib25lSW52ZXJzZXM7aWYodGhpcy5ib25lTWF0cmljZXM9bmV3IEZsb2F0MzJBcnJheSh0Lmxlbmd0aCoxNiksZS5sZW5ndGg9PT0wKXRoaXMuY2FsY3VsYXRlSW52ZXJzZXMoKTtlbHNlIGlmKHQubGVuZ3RoIT09ZS5sZW5ndGgpe2NvbnNvbGUud2FybigiVEhSRUUuU2tlbGV0b246IE51bWJlciBvZiBpbnZlcnNlIGJvbmUgbWF0cmljZXMgZG9lcyBub3QgbWF0Y2ggYW1vdW50IG9mIGJvbmVzLiIpLHRoaXMuYm9uZUludmVyc2VzPVtdO2ZvcihsZXQgbj0wLHI9dGhpcy5ib25lcy5sZW5ndGg7bjxyO24rKyl0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyBMdCl9fWNhbGN1bGF0ZUludmVyc2VzKCl7dGhpcy5ib25lSW52ZXJzZXMubGVuZ3RoPTA7Zm9yKGxldCB0PTAsZT10aGlzLmJvbmVzLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBuPW5ldyBMdDt0aGlzLmJvbmVzW3RdJiZuLmNvcHkodGhpcy5ib25lc1t0XS5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksdGhpcy5ib25lSW52ZXJzZXMucHVzaChuKX19cG9zZSgpe2ZvcihsZXQgdD0wLGU9dGhpcy5ib25lcy5sZW5ndGg7dDxlO3QrKyl7Y29uc3Qgbj10aGlzLmJvbmVzW3RdO24mJm4ubWF0cml4V29ybGQuY29weSh0aGlzLmJvbmVJbnZlcnNlc1t0XSkuaW52ZXJ0KCl9Zm9yKGxldCB0PTAsZT10aGlzLmJvbmVzLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBuPXRoaXMuYm9uZXNbdF07biYmKG4ucGFyZW50JiZuLnBhcmVudC5pc0JvbmU/KG4ubWF0cml4LmNvcHkobi5wYXJlbnQubWF0cml4V29ybGQpLmludmVydCgpLG4ubWF0cml4Lm11bHRpcGx5KG4ubWF0cml4V29ybGQpKTpuLm1hdHJpeC5jb3B5KG4ubWF0cml4V29ybGQpLG4ubWF0cml4LmRlY29tcG9zZShuLnBvc2l0aW9uLG4ucXVhdGVybmlvbixuLnNjYWxlKSl9fXVwZGF0ZSgpe2NvbnN0IHQ9dGhpcy5ib25lcyxlPXRoaXMuYm9uZUludmVyc2VzLG49dGhpcy5ib25lTWF0cmljZXMscj10aGlzLmJvbmVUZXh0dXJlO2ZvcihsZXQgcz0wLG89dC5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT10W3NdP3Rbc10ubWF0cml4V29ybGQ6YVQ7YjAubXVsdGlwbHlNYXRyaWNlcyhhLGVbc10pLGIwLnRvQXJyYXkobixzKjE2KX1yIT09bnVsbCYmKHIubmVlZHNVcGRhdGU9ITApfWNsb25lKCl7cmV0dXJuIG5ldyBuYyh0aGlzLmJvbmVzLHRoaXMuYm9uZUludmVyc2VzKX1jb21wdXRlQm9uZVRleHR1cmUoKXtsZXQgdD1NYXRoLnNxcnQodGhpcy5ib25lcy5sZW5ndGgqNCk7dD1NYXRoLmNlaWwodC80KSo0LHQ9TWF0aC5tYXgodCw0KTtjb25zdCBlPW5ldyBGbG9hdDMyQXJyYXkodCp0KjQpO2Uuc2V0KHRoaXMuYm9uZU1hdHJpY2VzKTtjb25zdCBuPW5ldyBuaShlLHQsdCxqZSxjbik7cmV0dXJuIG4ubmVlZHNVcGRhdGU9ITAsdGhpcy5ib25lTWF0cmljZXM9ZSx0aGlzLmJvbmVUZXh0dXJlPW4sdGhpc31nZXRCb25lQnlOYW1lKHQpe2ZvcihsZXQgZT0wLG49dGhpcy5ib25lcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcj10aGlzLmJvbmVzW2VdO2lmKHIubmFtZT09PXQpcmV0dXJuIHJ9fWRpc3Bvc2UoKXt0aGlzLmJvbmVUZXh0dXJlIT09bnVsbCYmKHRoaXMuYm9uZVRleHR1cmUuZGlzcG9zZSgpLHRoaXMuYm9uZVRleHR1cmU9bnVsbCl9ZnJvbUpTT04odCxlKXt0aGlzLnV1aWQ9dC51dWlkO2ZvcihsZXQgbj0wLHI9dC5ib25lcy5sZW5ndGg7bjxyO24rKyl7Y29uc3Qgcz10LmJvbmVzW25dO2xldCBvPWVbc107bz09PXZvaWQgMCYmKGNvbnNvbGUud2FybigiVEhSRUUuU2tlbGV0b246IE5vIGJvbmUgZm91bmQgd2l0aCBVVUlEOiIscyksbz1uZXcgeWYpLHRoaXMuYm9uZXMucHVzaChvKSx0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyBMdCgpLmZyb21BcnJheSh0LmJvbmVJbnZlcnNlc1tuXSkpfXJldHVybiB0aGlzLmluaXQoKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJTa2VsZXRvbiIsZ2VuZXJhdG9yOiJTa2VsZXRvbi50b0pTT04ifSxib25lczpbXSxib25lSW52ZXJzZXM6W119O3QudXVpZD10aGlzLnV1aWQ7Y29uc3QgZT10aGlzLmJvbmVzLG49dGhpcy5ib25lSW52ZXJzZXM7Zm9yKGxldCByPTAscz1lLmxlbmd0aDtyPHM7cisrKXtjb25zdCBvPWVbcl07dC5ib25lcy5wdXNoKG8udXVpZCk7Y29uc3QgYT1uW3JdO3QuYm9uZUludmVyc2VzLnB1c2goYS50b0FycmF5KCkpfXJldHVybiB0fX1jbGFzcyBMcyBleHRlbmRzIFp0e2NvbnN0cnVjdG9yKHQsZSxuLHI9MSl7c3VwZXIodCxlLG4pLHRoaXMuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9ITAsdGhpcy5tZXNoUGVyQXR0cmlidXRlPXJ9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9dC5tZXNoUGVyQXR0cmlidXRlLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5tZXNoUGVyQXR0cmlidXRlPXRoaXMubWVzaFBlckF0dHJpYnV0ZSx0LmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPSEwLHR9fWNvbnN0IERzPW5ldyBMdCx3MD1uZXcgTHQsaWM9W10sQTA9bmV3IE9lLGxUPW5ldyBMdCxIbz1uZXcgSWUsV289bmV3IFdlO2NsYXNzIEUwIGV4dGVuZHMgSWV7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQsZSksdGhpcy5pc0luc3RhbmNlZE1lc2g9ITAsdGhpcy5pbnN0YW5jZU1hdHJpeD1uZXcgTHMobmV3IEZsb2F0MzJBcnJheShuKjE2KSwxNiksdGhpcy5pbnN0YW5jZUNvbG9yPW51bGwsdGhpcy5tb3JwaFRleHR1cmU9bnVsbCx0aGlzLmNvdW50PW4sdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbDtmb3IobGV0IHI9MDtyPG47cisrKXRoaXMuc2V0TWF0cml4QXQocixsVCl9Y29tcHV0ZUJvdW5kaW5nQm94KCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5LGU9dGhpcy5jb3VudDt0aGlzLmJvdW5kaW5nQm94PT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IE9lKSx0LmJvdW5kaW5nQm94PT09bnVsbCYmdC5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpO2ZvcihsZXQgbj0wO248ZTtuKyspdGhpcy5nZXRNYXRyaXhBdChuLERzKSxBMC5jb3B5KHQuYm91bmRpbmdCb3gpLmFwcGx5TWF0cml4NChEcyksdGhpcy5ib3VuZGluZ0JveC51bmlvbihBMCl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5LGU9dGhpcy5jb3VudDt0aGlzLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3IFdlKSx0LmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmdC5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSx0aGlzLmJvdW5kaW5nU3BoZXJlLm1ha2VFbXB0eSgpO2ZvcihsZXQgbj0wO248ZTtuKyspdGhpcy5nZXRNYXRyaXhBdChuLERzKSxXby5jb3B5KHQuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NChEcyksdGhpcy5ib3VuZGluZ1NwaGVyZS51bmlvbihXbyl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5pbnN0YW5jZU1hdHJpeC5jb3B5KHQuaW5zdGFuY2VNYXRyaXgpLHQubW9ycGhUZXh0dXJlIT09bnVsbCYmKHRoaXMubW9ycGhUZXh0dXJlPXQubW9ycGhUZXh0dXJlLmNsb25lKCkpLHQuaW5zdGFuY2VDb2xvciE9PW51bGwmJih0aGlzLmluc3RhbmNlQ29sb3I9dC5pbnN0YW5jZUNvbG9yLmNsb25lKCkpLHRoaXMuY291bnQ9dC5jb3VudCx0LmJvdW5kaW5nQm94IT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9dC5ib3VuZGluZ0JveC5jbG9uZSgpKSx0LmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9dC5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKSx0aGlzfWdldENvbG9yQXQodCxlKXtlLmZyb21BcnJheSh0aGlzLmluc3RhbmNlQ29sb3IuYXJyYXksdCozKX1nZXRNYXRyaXhBdCh0LGUpe2UuZnJvbUFycmF5KHRoaXMuaW5zdGFuY2VNYXRyaXguYXJyYXksdCoxNil9Z2V0TW9ycGhBdCh0LGUpe2NvbnN0IG49ZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMscj10aGlzLm1vcnBoVGV4dHVyZS5zb3VyY2UuZGF0YS5kYXRhLHM9bi5sZW5ndGgrMSxvPXQqcysxO2ZvcihsZXQgYT0wO2E8bi5sZW5ndGg7YSsrKW5bYV09cltvK2FdfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMubWF0cml4V29ybGQscj10aGlzLmNvdW50O2lmKEhvLmdlb21ldHJ5PXRoaXMuZ2VvbWV0cnksSG8ubWF0ZXJpYWw9dGhpcy5tYXRlcmlhbCxIby5tYXRlcmlhbCE9PXZvaWQgMCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLFdvLmNvcHkodGhpcy5ib3VuZGluZ1NwaGVyZSksV28uYXBwbHlNYXRyaXg0KG4pLHQucmF5LmludGVyc2VjdHNTcGhlcmUoV28pIT09ITEpKWZvcihsZXQgcz0wO3M8cjtzKyspe3RoaXMuZ2V0TWF0cml4QXQocyxEcyksdzAubXVsdGlwbHlNYXRyaWNlcyhuLERzKSxIby5tYXRyaXhXb3JsZD13MCxIby5yYXljYXN0KHQsaWMpO2ZvcihsZXQgbz0wLGE9aWMubGVuZ3RoO288YTtvKyspe2NvbnN0IGw9aWNbb107bC5pbnN0YW5jZUlkPXMsbC5vYmplY3Q9dGhpcyxlLnB1c2gobCl9aWMubGVuZ3RoPTB9fXNldENvbG9yQXQodCxlKXt0aGlzLmluc3RhbmNlQ29sb3I9PT1udWxsJiYodGhpcy5pbnN0YW5jZUNvbG9yPW5ldyBMcyhuZXcgRmxvYXQzMkFycmF5KHRoaXMuaW5zdGFuY2VNYXRyaXguY291bnQqMykuZmlsbCgxKSwzKSksZS50b0FycmF5KHRoaXMuaW5zdGFuY2VDb2xvci5hcnJheSx0KjMpfXNldE1hdHJpeEF0KHQsZSl7ZS50b0FycmF5KHRoaXMuaW5zdGFuY2VNYXRyaXguYXJyYXksdCoxNil9c2V0TW9ycGhBdCh0LGUpe2NvbnN0IG49ZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMscj1uLmxlbmd0aCsxO3RoaXMubW9ycGhUZXh0dXJlPT09bnVsbCYmKHRoaXMubW9ycGhUZXh0dXJlPW5ldyBuaShuZXcgRmxvYXQzMkFycmF5KHIqdGhpcy5jb3VudCkscix0aGlzLmNvdW50LFZhLGNuKSk7Y29uc3Qgcz10aGlzLm1vcnBoVGV4dHVyZS5zb3VyY2UuZGF0YS5kYXRhO2xldCBvPTA7Zm9yKGxldCBjPTA7YzxuLmxlbmd0aDtjKyspbys9bltjXTtjb25zdCBhPXRoaXMuZ2VvbWV0cnkubW9ycGhUYXJnZXRzUmVsYXRpdmU/MToxLW8sbD1yKnQ7c1tsXT1hLHMuc2V0KG4sbCsxKX11cGRhdGVNb3JwaFRhcmdldHMoKXt9ZGlzcG9zZSgpe3JldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSksdGhpcy5tb3JwaFRleHR1cmUhPT1udWxsJiYodGhpcy5tb3JwaFRleHR1cmUuZGlzcG9zZSgpLHRoaXMubW9ycGhUZXh0dXJlPW51bGwpLHRoaXN9fWZ1bmN0aW9uIGNUKGksdCl7cmV0dXJuIGkuei10Lnp9ZnVuY3Rpb24gdVQoaSx0KXtyZXR1cm4gdC56LWkuen1jbGFzcyBoVHtjb25zdHJ1Y3Rvcigpe3RoaXMuaW5kZXg9MCx0aGlzLnBvb2w9W10sdGhpcy5saXN0PVtdfXB1c2godCxlLG4pe2NvbnN0IHI9dGhpcy5wb29sLHM9dGhpcy5saXN0O3RoaXMuaW5kZXg+PXIubGVuZ3RoJiZyLnB1c2goe3N0YXJ0Oi0xLGNvdW50Oi0xLHo6LTEsaW5kZXg6LTF9KTtjb25zdCBvPXJbdGhpcy5pbmRleF07cy5wdXNoKG8pLHRoaXMuaW5kZXgrKyxvLnN0YXJ0PXQuc3RhcnQsby5jb3VudD10LmNvdW50LG8uej1lLG8uaW5kZXg9bn1yZXNldCgpe3RoaXMubGlzdC5sZW5ndGg9MCx0aGlzLmluZGV4PTB9fWNvbnN0IFppPW5ldyBMdCx2Zj1uZXcgTHQsZlQ9bmV3IEx0LGRUPW5ldyB2dCgxLDEsMSksVDA9bmV3IEx0LF9mPW5ldyBCbyxyYz1uZXcgT2UsQ3I9bmV3IFdlLCRvPW5ldyBMLEMwPW5ldyBMLHBUPW5ldyBMLHhmPW5ldyBoVCxxZT1uZXcgSWUsc2M9W107ZnVuY3Rpb24gbVQoaSx0LGU9MCl7Y29uc3Qgbj10Lml0ZW1TaXplO2lmKGkuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZXx8aS5hcnJheS5jb25zdHJ1Y3RvciE9PXQuYXJyYXkuY29uc3RydWN0b3Ipe2NvbnN0IHI9aS5jb3VudDtmb3IobGV0IHM9MDtzPHI7cysrKWZvcihsZXQgbz0wO288bjtvKyspdC5zZXRDb21wb25lbnQocytlLG8saS5nZXRDb21wb25lbnQocyxvKSl9ZWxzZSB0LmFycmF5LnNldChpLmFycmF5LGUqbik7dC5uZWVkc1VwZGF0ZT0hMH1jbGFzcyBSMCBleHRlbmRzIElle2dldCBtYXhJbnN0YW5jZUNvdW50KCl7cmV0dXJuIHRoaXMuX21heEluc3RhbmNlQ291bnR9Y29uc3RydWN0b3IodCxlLG49ZSoyLHIpe3N1cGVyKG5ldyBOdCxyKSx0aGlzLmlzQmF0Y2hlZE1lc2g9ITAsdGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkPSEwLHRoaXMuc29ydE9iamVjdHM9ITAsdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbCx0aGlzLmN1c3RvbVNvcnQ9bnVsbCx0aGlzLl9kcmF3SW5mbz1bXSx0aGlzLl9kcmF3UmFuZ2VzPVtdLHRoaXMuX3Jlc2VydmVkUmFuZ2VzPVtdLHRoaXMuX2JvdW5kcz1bXSx0aGlzLl9tYXhJbnN0YW5jZUNvdW50PXQsdGhpcy5fbWF4VmVydGV4Q291bnQ9ZSx0aGlzLl9tYXhJbmRleENvdW50PW4sdGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZD0hMSx0aGlzLl9nZW9tZXRyeUNvdW50PTAsdGhpcy5fbXVsdGlEcmF3Q291bnRzPW5ldyBJbnQzMkFycmF5KHQpLHRoaXMuX211bHRpRHJhd1N0YXJ0cz1uZXcgSW50MzJBcnJheSh0KSx0aGlzLl9tdWx0aURyYXdDb3VudD0wLHRoaXMuX211bHRpRHJhd0luc3RhbmNlcz1udWxsLHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkPSEwLHRoaXMuX21hdHJpY2VzVGV4dHVyZT1udWxsLHRoaXMuX2luZGlyZWN0VGV4dHVyZT1udWxsLHRoaXMuX2NvbG9yc1RleHR1cmU9bnVsbCx0aGlzLl9pbml0TWF0cmljZXNUZXh0dXJlKCksdGhpcy5faW5pdEluZGlyZWN0VGV4dHVyZSgpfV9pbml0TWF0cmljZXNUZXh0dXJlKCl7bGV0IHQ9TWF0aC5zcXJ0KHRoaXMuX21heEluc3RhbmNlQ291bnQqNCk7dD1NYXRoLmNlaWwodC80KSo0LHQ9TWF0aC5tYXgodCw0KTtjb25zdCBlPW5ldyBGbG9hdDMyQXJyYXkodCp0KjQpLG49bmV3IG5pKGUsdCx0LGplLGNuKTt0aGlzLl9tYXRyaWNlc1RleHR1cmU9bn1faW5pdEluZGlyZWN0VGV4dHVyZSgpe2xldCB0PU1hdGguc3FydCh0aGlzLl9tYXhJbnN0YW5jZUNvdW50KTt0PU1hdGguY2VpbCh0KTtjb25zdCBlPW5ldyBVaW50MzJBcnJheSh0KnQpLG49bmV3IG5pKGUsdCx0LG1vLG1pKTt0aGlzLl9pbmRpcmVjdFRleHR1cmU9bn1faW5pdENvbG9yc1RleHR1cmUoKXtsZXQgdD1NYXRoLnNxcnQodGhpcy5fbWF4SW5zdGFuY2VDb3VudCk7dD1NYXRoLmNlaWwodCk7Y29uc3QgZT1uZXcgRmxvYXQzMkFycmF5KHQqdCo0KS5maWxsKDEpLG49bmV3IG5pKGUsdCx0LGplLGNuKTtuLmNvbG9yU3BhY2U9c2Uud29ya2luZ0NvbG9yU3BhY2UsdGhpcy5fY29sb3JzVGV4dHVyZT1ufV9pbml0aWFsaXplR2VvbWV0cnkodCl7Y29uc3QgZT10aGlzLmdlb21ldHJ5LG49dGhpcy5fbWF4VmVydGV4Q291bnQscj10aGlzLl9tYXhJbmRleENvdW50O2lmKHRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQ9PT0hMSl7Zm9yKGNvbnN0IHMgaW4gdC5hdHRyaWJ1dGVzKXtjb25zdCBvPXQuZ2V0QXR0cmlidXRlKHMpLHthcnJheTphLGl0ZW1TaXplOmwsbm9ybWFsaXplZDpjfT1vLHU9bmV3IGEuY29uc3RydWN0b3IobipsKSxoPW5ldyBadCh1LGwsYyk7ZS5zZXRBdHRyaWJ1dGUocyxoKX1pZih0LmdldEluZGV4KCkhPT1udWxsKXtjb25zdCBzPW4+NjU1MzU/bmV3IFVpbnQzMkFycmF5KHIpOm5ldyBVaW50MTZBcnJheShyKTtlLnNldEluZGV4KG5ldyBadChzLDEpKX10aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkPSEwfX1fdmFsaWRhdGVHZW9tZXRyeSh0KXtjb25zdCBlPXRoaXMuZ2VvbWV0cnk7aWYoISF0LmdldEluZGV4KCkhPSEhZS5nZXRJbmRleCgpKXRocm93IG5ldyBFcnJvcignQmF0Y2hlZE1lc2g6IEFsbCBnZW9tZXRyaWVzIG11c3QgY29uc2lzdGVudGx5IGhhdmUgImluZGV4Ii4nKTtmb3IoY29uc3QgbiBpbiBlLmF0dHJpYnV0ZXMpe2lmKCF0Lmhhc0F0dHJpYnV0ZShuKSl0aHJvdyBuZXcgRXJyb3IoYEJhdGNoZWRNZXNoOiBBZGRlZCBnZW9tZXRyeSBtaXNzaW5nICIke259Ii4gQWxsIGdlb21ldHJpZXMgbXVzdCBoYXZlIGNvbnNpc3RlbnQgYXR0cmlidXRlcy5gKTtjb25zdCByPXQuZ2V0QXR0cmlidXRlKG4pLHM9ZS5nZXRBdHRyaWJ1dGUobik7aWYoci5pdGVtU2l6ZSE9PXMuaXRlbVNpemV8fHIubm9ybWFsaXplZCE9PXMubm9ybWFsaXplZCl0aHJvdyBuZXcgRXJyb3IoIkJhdGNoZWRNZXNoOiBBbGwgYXR0cmlidXRlcyBtdXN0IGhhdmUgYSBjb25zaXN0ZW50IGl0ZW1TaXplIGFuZCBub3JtYWxpemVkIHZhbHVlLiIpfX1zZXRDdXN0b21Tb3J0KHQpe3JldHVybiB0aGlzLmN1c3RvbVNvcnQ9dCx0aGlzfWNvbXB1dGVCb3VuZGluZ0JveCgpe3RoaXMuYm91bmRpbmdCb3g9PT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1uZXcgT2UpO2NvbnN0IHQ9dGhpcy5ib3VuZGluZ0JveCxlPXRoaXMuX2RyYXdJbmZvO3QubWFrZUVtcHR5KCk7Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXtpZihlW25dLmFjdGl2ZT09PSExKWNvbnRpbnVlO2NvbnN0IHM9ZVtuXS5nZW9tZXRyeUluZGV4O3RoaXMuZ2V0TWF0cml4QXQobixaaSksdGhpcy5nZXRCb3VuZGluZ0JveEF0KHMscmMpLmFwcGx5TWF0cml4NChaaSksdC51bmlvbihyYyl9fWNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpe3RoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgV2UpO2NvbnN0IHQ9dGhpcy5ib3VuZGluZ1NwaGVyZSxlPXRoaXMuX2RyYXdJbmZvO3QubWFrZUVtcHR5KCk7Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXtpZihlW25dLmFjdGl2ZT09PSExKWNvbnRpbnVlO2NvbnN0IHM9ZVtuXS5nZW9tZXRyeUluZGV4O3RoaXMuZ2V0TWF0cml4QXQobixaaSksdGhpcy5nZXRCb3VuZGluZ1NwaGVyZUF0KHMsQ3IpLmFwcGx5TWF0cml4NChaaSksdC51bmlvbihDcil9fWFkZEluc3RhbmNlKHQpe2lmKHRoaXMuX2RyYXdJbmZvLmxlbmd0aD49dGhpcy5fbWF4SW5zdGFuY2VDb3VudCl0aHJvdyBuZXcgRXJyb3IoIkJhdGNoZWRNZXNoOiBNYXhpbXVtIGl0ZW0gY291bnQgcmVhY2hlZC4iKTt0aGlzLl9kcmF3SW5mby5wdXNoKHt2aXNpYmxlOiEwLGFjdGl2ZTohMCxnZW9tZXRyeUluZGV4OnR9KTtjb25zdCBlPXRoaXMuX2RyYXdJbmZvLmxlbmd0aC0xLG49dGhpcy5fbWF0cmljZXNUZXh0dXJlLHI9bi5pbWFnZS5kYXRhO2ZULnRvQXJyYXkocixlKjE2KSxuLm5lZWRzVXBkYXRlPSEwO2NvbnN0IHM9dGhpcy5fY29sb3JzVGV4dHVyZTtyZXR1cm4gcyYmKGRULnRvQXJyYXkocy5pbWFnZS5kYXRhLGUqNCkscy5uZWVkc1VwZGF0ZT0hMCksZX1hZGRHZW9tZXRyeSh0LGU9LTEsbj0tMSl7aWYodGhpcy5faW5pdGlhbGl6ZUdlb21ldHJ5KHQpLHRoaXMuX3ZhbGlkYXRlR2VvbWV0cnkodCksdGhpcy5fZHJhd0luZm8ubGVuZ3RoPj10aGlzLl9tYXhJbnN0YW5jZUNvdW50KXRocm93IG5ldyBFcnJvcigiQmF0Y2hlZE1lc2g6IE1heGltdW0gaXRlbSBjb3VudCByZWFjaGVkLiIpO2NvbnN0IHI9e3ZlcnRleFN0YXJ0Oi0xLHZlcnRleENvdW50Oi0xLGluZGV4U3RhcnQ6LTEsaW5kZXhDb3VudDotMX07bGV0IHM9bnVsbDtjb25zdCBvPXRoaXMuX3Jlc2VydmVkUmFuZ2VzLGE9dGhpcy5fZHJhd1JhbmdlcyxsPXRoaXMuX2JvdW5kczt0aGlzLl9nZW9tZXRyeUNvdW50IT09MCYmKHM9b1tvLmxlbmd0aC0xXSksZT09PS0xP3IudmVydGV4Q291bnQ9dC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikuY291bnQ6ci52ZXJ0ZXhDb3VudD1lLHM9PT1udWxsP3IudmVydGV4U3RhcnQ9MDpyLnZlcnRleFN0YXJ0PXMudmVydGV4U3RhcnQrcy52ZXJ0ZXhDb3VudDtjb25zdCBjPXQuZ2V0SW5kZXgoKSx1PWMhPT1udWxsO2lmKHUmJihuPT09LTE/ci5pbmRleENvdW50PWMuY291bnQ6ci5pbmRleENvdW50PW4scz09PW51bGw/ci5pbmRleFN0YXJ0PTA6ci5pbmRleFN0YXJ0PXMuaW5kZXhTdGFydCtzLmluZGV4Q291bnQpLHIuaW5kZXhTdGFydCE9PS0xJiZyLmluZGV4U3RhcnQrci5pbmRleENvdW50PnRoaXMuX21heEluZGV4Q291bnR8fHIudmVydGV4U3RhcnQrci52ZXJ0ZXhDb3VudD50aGlzLl9tYXhWZXJ0ZXhDb3VudCl0aHJvdyBuZXcgRXJyb3IoIkJhdGNoZWRNZXNoOiBSZXNlcnZlZCBzcGFjZSByZXF1ZXN0IGV4Y2VlZHMgdGhlIG1heGltdW0gYnVmZmVyIHNpemUuIik7Y29uc3QgaD10aGlzLl9nZW9tZXRyeUNvdW50O3JldHVybiB0aGlzLl9nZW9tZXRyeUNvdW50Kyssby5wdXNoKHIpLGEucHVzaCh7c3RhcnQ6dT9yLmluZGV4U3RhcnQ6ci52ZXJ0ZXhTdGFydCxjb3VudDotMX0pLGwucHVzaCh7Ym94SW5pdGlhbGl6ZWQ6ITEsYm94Om5ldyBPZSxzcGhlcmVJbml0aWFsaXplZDohMSxzcGhlcmU6bmV3IFdlfSksdGhpcy5zZXRHZW9tZXRyeUF0KGgsdCksaH1zZXRHZW9tZXRyeUF0KHQsZSl7aWYodD49dGhpcy5fZ2VvbWV0cnlDb3VudCl0aHJvdyBuZXcgRXJyb3IoIkJhdGNoZWRNZXNoOiBNYXhpbXVtIGdlb21ldHJ5IGNvdW50IHJlYWNoZWQuIik7dGhpcy5fdmFsaWRhdGVHZW9tZXRyeShlKTtjb25zdCBuPXRoaXMuZ2VvbWV0cnkscj1uLmdldEluZGV4KCkhPT1udWxsLHM9bi5nZXRJbmRleCgpLG89ZS5nZXRJbmRleCgpLGE9dGhpcy5fcmVzZXJ2ZWRSYW5nZXNbdF07aWYociYmby5jb3VudD5hLmluZGV4Q291bnR8fGUuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudD5hLnZlcnRleENvdW50KXRocm93IG5ldyBFcnJvcigiQmF0Y2hlZE1lc2g6IFJlc2VydmVkIHNwYWNlIG5vdCBsYXJnZSBlbm91Z2ggZm9yIHByb3ZpZGVkIGdlb21ldHJ5LiIpO2NvbnN0IGw9YS52ZXJ0ZXhTdGFydCxjPWEudmVydGV4Q291bnQ7Zm9yKGNvbnN0IGQgaW4gbi5hdHRyaWJ1dGVzKXtjb25zdCBwPWUuZ2V0QXR0cmlidXRlKGQpLHk9bi5nZXRBdHRyaWJ1dGUoZCk7bVQocCx5LGwpO2NvbnN0IG09cC5pdGVtU2l6ZTtmb3IobGV0IGc9cC5jb3VudCx4PWM7Zzx4O2crKyl7Y29uc3Qgdj1sK2c7Zm9yKGxldCBfPTA7XzxtO18rKyl5LnNldENvbXBvbmVudCh2LF8sMCl9eS5uZWVkc1VwZGF0ZT0hMCx5LmFkZFVwZGF0ZVJhbmdlKGwqbSxjKm0pfWlmKHIpe2NvbnN0IGQ9YS5pbmRleFN0YXJ0O2ZvcihsZXQgcD0wO3A8by5jb3VudDtwKyspcy5zZXRYKGQrcCxsK28uZ2V0WChwKSk7Zm9yKGxldCBwPW8uY291bnQseT1hLmluZGV4Q291bnQ7cDx5O3ArKylzLnNldFgoZCtwLGwpO3MubmVlZHNVcGRhdGU9ITAscy5hZGRVcGRhdGVSYW5nZShkLGEuaW5kZXhDb3VudCl9Y29uc3QgdT10aGlzLl9ib3VuZHNbdF07ZS5ib3VuZGluZ0JveCE9PW51bGw/KHUuYm94LmNvcHkoZS5ib3VuZGluZ0JveCksdS5ib3hJbml0aWFsaXplZD0hMCk6dS5ib3hJbml0aWFsaXplZD0hMSxlLmJvdW5kaW5nU3BoZXJlIT09bnVsbD8odS5zcGhlcmUuY29weShlLmJvdW5kaW5nU3BoZXJlKSx1LnNwaGVyZUluaXRpYWxpemVkPSEwKTp1LnNwaGVyZUluaXRpYWxpemVkPSExO2NvbnN0IGg9dGhpcy5fZHJhd1Jhbmdlc1t0XSxmPWUuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO3JldHVybiBoLmNvdW50PXI/by5jb3VudDpmLmNvdW50LHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkPSEwLHR9Z2V0Qm91bmRpbmdCb3hBdCh0LGUpe2lmKHQ+PXRoaXMuX2dlb21ldHJ5Q291bnQpcmV0dXJuIG51bGw7Y29uc3Qgbj10aGlzLl9ib3VuZHNbdF0scj1uLmJveCxzPXRoaXMuZ2VvbWV0cnk7aWYobi5ib3hJbml0aWFsaXplZD09PSExKXtyLm1ha2VFbXB0eSgpO2NvbnN0IG89cy5pbmRleCxhPXMuYXR0cmlidXRlcy5wb3NpdGlvbixsPXRoaXMuX2RyYXdSYW5nZXNbdF07Zm9yKGxldCBjPWwuc3RhcnQsdT1sLnN0YXJ0K2wuY291bnQ7Yzx1O2MrKyl7bGV0IGg9YztvJiYoaD1vLmdldFgoaCkpLHIuZXhwYW5kQnlQb2ludCgkby5mcm9tQnVmZmVyQXR0cmlidXRlKGEsaCkpfW4uYm94SW5pdGlhbGl6ZWQ9ITB9cmV0dXJuIGUuY29weShyKSxlfWdldEJvdW5kaW5nU3BoZXJlQXQodCxlKXtpZih0Pj10aGlzLl9nZW9tZXRyeUNvdW50KXJldHVybiBudWxsO2NvbnN0IG49dGhpcy5fYm91bmRzW3RdLHI9bi5zcGhlcmUscz10aGlzLmdlb21ldHJ5O2lmKG4uc3BoZXJlSW5pdGlhbGl6ZWQ9PT0hMSl7ci5tYWtlRW1wdHkoKSx0aGlzLmdldEJvdW5kaW5nQm94QXQodCxyYykscmMuZ2V0Q2VudGVyKHIuY2VudGVyKTtjb25zdCBvPXMuaW5kZXgsYT1zLmF0dHJpYnV0ZXMucG9zaXRpb24sbD10aGlzLl9kcmF3UmFuZ2VzW3RdO2xldCBjPTA7Zm9yKGxldCB1PWwuc3RhcnQsaD1sLnN0YXJ0K2wuY291bnQ7dTxoO3UrKyl7bGV0IGY9dTtvJiYoZj1vLmdldFgoZikpLCRvLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxmKSxjPU1hdGgubWF4KGMsci5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoJG8pKX1yLnJhZGl1cz1NYXRoLnNxcnQoYyksbi5zcGhlcmVJbml0aWFsaXplZD0hMH1yZXR1cm4gZS5jb3B5KHIpLGV9c2V0TWF0cml4QXQodCxlKXtjb25zdCBuPXRoaXMuX2RyYXdJbmZvLHI9dGhpcy5fbWF0cmljZXNUZXh0dXJlLHM9dGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGE7cmV0dXJuIHQ+PW4ubGVuZ3RofHxuW3RdLmFjdGl2ZT09PSExP3RoaXM6KGUudG9BcnJheShzLHQqMTYpLHIubmVlZHNVcGRhdGU9ITAsdGhpcyl9Z2V0TWF0cml4QXQodCxlKXtjb25zdCBuPXRoaXMuX2RyYXdJbmZvLHI9dGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGE7cmV0dXJuIHQ+PW4ubGVuZ3RofHxuW3RdLmFjdGl2ZT09PSExP251bGw6ZS5mcm9tQXJyYXkocix0KjE2KX1zZXRDb2xvckF0KHQsZSl7dGhpcy5fY29sb3JzVGV4dHVyZT09PW51bGwmJnRoaXMuX2luaXRDb2xvcnNUZXh0dXJlKCk7Y29uc3Qgbj10aGlzLl9jb2xvcnNUZXh0dXJlLHI9dGhpcy5fY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhLHM9dGhpcy5fZHJhd0luZm87cmV0dXJuIHQ+PXMubGVuZ3RofHxzW3RdLmFjdGl2ZT09PSExP3RoaXM6KGUudG9BcnJheShyLHQqNCksbi5uZWVkc1VwZGF0ZT0hMCx0aGlzKX1nZXRDb2xvckF0KHQsZSl7Y29uc3Qgbj10aGlzLl9jb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEscj10aGlzLl9kcmF3SW5mbztyZXR1cm4gdD49ci5sZW5ndGh8fHJbdF0uYWN0aXZlPT09ITE/bnVsbDplLmZyb21BcnJheShuLHQqNCl9c2V0VmlzaWJsZUF0KHQsZSl7Y29uc3Qgbj10aGlzLl9kcmF3SW5mbztyZXR1cm4gdD49bi5sZW5ndGh8fG5bdF0uYWN0aXZlPT09ITF8fG5bdF0udmlzaWJsZT09PWU/dGhpczooblt0XS52aXNpYmxlPWUsdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQ9ITAsdGhpcyl9Z2V0VmlzaWJsZUF0KHQpe2NvbnN0IGU9dGhpcy5fZHJhd0luZm87cmV0dXJuIHQ+PWUubGVuZ3RofHxlW3RdLmFjdGl2ZT09PSExPyExOmVbdF0udmlzaWJsZX1yYXljYXN0KHQsZSl7Y29uc3Qgbj10aGlzLl9kcmF3SW5mbyxyPXRoaXMuX2RyYXdSYW5nZXMscz10aGlzLm1hdHJpeFdvcmxkLG89dGhpcy5nZW9tZXRyeTtxZS5tYXRlcmlhbD10aGlzLm1hdGVyaWFsLHFlLmdlb21ldHJ5LmluZGV4PW8uaW5kZXgscWUuZ2VvbWV0cnkuYXR0cmlidXRlcz1vLmF0dHJpYnV0ZXMscWUuZ2VvbWV0cnkuYm91bmRpbmdCb3g9PT1udWxsJiYocWUuZ2VvbWV0cnkuYm91bmRpbmdCb3g9bmV3IE9lKSxxZS5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZT09PW51bGwmJihxZS5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZT1uZXcgV2UpO2ZvcihsZXQgYT0wLGw9bi5sZW5ndGg7YTxsO2ErKyl7aWYoIW5bYV0udmlzaWJsZXx8IW5bYV0uYWN0aXZlKWNvbnRpbnVlO2NvbnN0IGM9blthXS5nZW9tZXRyeUluZGV4LHU9cltjXTtxZS5nZW9tZXRyeS5zZXREcmF3UmFuZ2UodS5zdGFydCx1LmNvdW50KSx0aGlzLmdldE1hdHJpeEF0KGEscWUubWF0cml4V29ybGQpLnByZW11bHRpcGx5KHMpLHRoaXMuZ2V0Qm91bmRpbmdCb3hBdChjLHFlLmdlb21ldHJ5LmJvdW5kaW5nQm94KSx0aGlzLmdldEJvdW5kaW5nU3BoZXJlQXQoYyxxZS5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSkscWUucmF5Y2FzdCh0LHNjKTtmb3IobGV0IGg9MCxmPXNjLmxlbmd0aDtoPGY7aCsrKXtjb25zdCBkPXNjW2hdO2Qub2JqZWN0PXRoaXMsZC5iYXRjaElkPWEsZS5wdXNoKGQpfXNjLmxlbmd0aD0wfXFlLm1hdGVyaWFsPW51bGwscWUuZ2VvbWV0cnkuaW5kZXg9bnVsbCxxZS5nZW9tZXRyeS5hdHRyaWJ1dGVzPXt9LHFlLmdlb21ldHJ5LnNldERyYXdSYW5nZSgwLDEvMCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnkuY2xvbmUoKSx0aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQ9dC5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkLHRoaXMuc29ydE9iamVjdHM9dC5zb3J0T2JqZWN0cyx0aGlzLmJvdW5kaW5nQm94PXQuYm91bmRpbmdCb3ghPT1udWxsP3QuYm91bmRpbmdCb3guY2xvbmUoKTpudWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9dC5ib3VuZGluZ1NwaGVyZSE9PW51bGw/dC5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpOm51bGwsdGhpcy5fZHJhd1Jhbmdlcz10Ll9kcmF3UmFuZ2VzLm1hcChlPT5PaSh7fSxlKSksdGhpcy5fcmVzZXJ2ZWRSYW5nZXM9dC5fcmVzZXJ2ZWRSYW5nZXMubWFwKGU9Pk9pKHt9LGUpKSx0aGlzLl9kcmF3SW5mbz10Ll9kcmF3SW5mby5tYXAoZT0+T2koe30sZSkpLHRoaXMuX2JvdW5kcz10Ll9ib3VuZHMubWFwKGU9Pih7Ym94SW5pdGlhbGl6ZWQ6ZS5ib3hJbml0aWFsaXplZCxib3g6ZS5ib3guY2xvbmUoKSxzcGhlcmVJbml0aWFsaXplZDplLnNwaGVyZUluaXRpYWxpemVkLHNwaGVyZTplLnNwaGVyZS5jbG9uZSgpfSkpLHRoaXMuX21heEluc3RhbmNlQ291bnQ9dC5fbWF4SW5zdGFuY2VDb3VudCx0aGlzLl9tYXhWZXJ0ZXhDb3VudD10Ll9tYXhWZXJ0ZXhDb3VudCx0aGlzLl9tYXhJbmRleENvdW50PXQuX21heEluZGV4Q291bnQsdGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZD10Ll9nZW9tZXRyeUluaXRpYWxpemVkLHRoaXMuX2dlb21ldHJ5Q291bnQ9dC5fZ2VvbWV0cnlDb3VudCx0aGlzLl9tdWx0aURyYXdDb3VudHM9dC5fbXVsdGlEcmF3Q291bnRzLnNsaWNlKCksdGhpcy5fbXVsdGlEcmF3U3RhcnRzPXQuX211bHRpRHJhd1N0YXJ0cy5zbGljZSgpLHRoaXMuX21hdHJpY2VzVGV4dHVyZT10Ll9tYXRyaWNlc1RleHR1cmUuY2xvbmUoKSx0aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YT10aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YS5zbGljZSgpLHRoaXMuX2NvbG9yc1RleHR1cmUhPT1udWxsJiYodGhpcy5fY29sb3JzVGV4dHVyZT10Ll9jb2xvcnNUZXh0dXJlLmNsb25lKCksdGhpcy5fY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhPXRoaXMuX2NvbG9yc1RleHR1cmUuaW1hZ2UuZGF0YS5zbGljZSgpKSx0aGlzfWRpc3Bvc2UoKXtyZXR1cm4gdGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5fbWF0cmljZXNUZXh0dXJlLmRpc3Bvc2UoKSx0aGlzLl9tYXRyaWNlc1RleHR1cmU9bnVsbCx0aGlzLl9pbmRpcmVjdFRleHR1cmUuZGlzcG9zZSgpLHRoaXMuX2luZGlyZWN0VGV4dHVyZT1udWxsLHRoaXMuX2NvbG9yc1RleHR1cmUhPT1udWxsJiYodGhpcy5fY29sb3JzVGV4dHVyZS5kaXNwb3NlKCksdGhpcy5fY29sb3JzVGV4dHVyZT1udWxsKSx0aGlzfW9uQmVmb3JlUmVuZGVyKHQsZSxuLHIscyl7aWYoIXRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkJiYhdGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkJiYhdGhpcy5zb3J0T2JqZWN0cylyZXR1cm47Y29uc3Qgbz1yLmdldEluZGV4KCksYT1vPT09bnVsbD8xOm8uYXJyYXkuQllURVNfUEVSX0VMRU1FTlQsbD10aGlzLl9kcmF3SW5mbyxjPXRoaXMuX211bHRpRHJhd1N0YXJ0cyx1PXRoaXMuX211bHRpRHJhd0NvdW50cyxoPXRoaXMuX2RyYXdSYW5nZXMsZj10aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQsZD10aGlzLl9pbmRpcmVjdFRleHR1cmUscD1kLmltYWdlLmRhdGE7ZiYmKFQwLm11bHRpcGx5TWF0cmljZXMobi5wcm9qZWN0aW9uTWF0cml4LG4ubWF0cml4V29ybGRJbnZlcnNlKS5tdWx0aXBseSh0aGlzLm1hdHJpeFdvcmxkKSxfZi5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChUMCx0LmNvb3JkaW5hdGVTeXN0ZW0pKTtsZXQgeT0wO2lmKHRoaXMuc29ydE9iamVjdHMpe3ZmLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksJG8uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG4ubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NCh2ZiksQzAuc2V0KDAsMCwtMSkudHJhbnNmb3JtRGlyZWN0aW9uKG4ubWF0cml4V29ybGQpLnRyYW5zZm9ybURpcmVjdGlvbih2Zik7Zm9yKGxldCB4PTAsdj1sLmxlbmd0aDt4PHY7eCsrKWlmKGxbeF0udmlzaWJsZSYmbFt4XS5hY3RpdmUpe2NvbnN0IF89bFt4XS5nZW9tZXRyeUluZGV4O3RoaXMuZ2V0TWF0cml4QXQoeCxaaSksdGhpcy5nZXRCb3VuZGluZ1NwaGVyZUF0KF8sQ3IpLmFwcGx5TWF0cml4NChaaSk7bGV0IEU9ITE7aWYoZiYmKEU9IV9mLmludGVyc2VjdHNTcGhlcmUoQ3IpKSwhRSl7Y29uc3QgYj1wVC5zdWJWZWN0b3JzKENyLmNlbnRlciwkbykuZG90KEMwKTt4Zi5wdXNoKGhbX10sYix4KX19Y29uc3QgbT14Zi5saXN0LGc9dGhpcy5jdXN0b21Tb3J0O2c9PT1udWxsP20uc29ydChzLnRyYW5zcGFyZW50P3VUOmNUKTpnLmNhbGwodGhpcyxtLG4pO2ZvcihsZXQgeD0wLHY9bS5sZW5ndGg7eDx2O3grKyl7Y29uc3QgXz1tW3hdO2NbeV09Xy5zdGFydCphLHVbeV09Xy5jb3VudCxwW3ldPV8uaW5kZXgseSsrfXhmLnJlc2V0KCl9ZWxzZSBmb3IobGV0IG09MCxnPWwubGVuZ3RoO208ZzttKyspaWYobFttXS52aXNpYmxlJiZsW21dLmFjdGl2ZSl7Y29uc3QgeD1sW21dLmdlb21ldHJ5SW5kZXg7bGV0IHY9ITE7aWYoZiYmKHRoaXMuZ2V0TWF0cml4QXQobSxaaSksdGhpcy5nZXRCb3VuZGluZ1NwaGVyZUF0KHgsQ3IpLmFwcGx5TWF0cml4NChaaSksdj0hX2YuaW50ZXJzZWN0c1NwaGVyZShDcikpLCF2KXtjb25zdCBfPWhbeF07Y1t5XT1fLnN0YXJ0KmEsdVt5XT1fLmNvdW50LHBbeV09bSx5Kyt9fWQubmVlZHNVcGRhdGU9ITAsdGhpcy5fbXVsdGlEcmF3Q291bnQ9eSx0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZD0hMX1vbkJlZm9yZVNoYWRvdyh0LGUsbixyLHMsbyl7dGhpcy5vbkJlZm9yZVJlbmRlcih0LG51bGwscixzLG8pfX1jbGFzcyBubiBleHRlbmRzIFhle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc0xpbmVCYXNpY01hdGVyaWFsPSEwLHRoaXMudHlwZT0iTGluZUJhc2ljTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHZ0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMubGluZXdpZHRoPTEsdGhpcy5saW5lY2FwPSJyb3VuZCIsdGhpcy5saW5lam9pbj0icm91bmQiLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMubGluZXdpZHRoPXQubGluZXdpZHRoLHRoaXMubGluZWNhcD10LmxpbmVjYXAsdGhpcy5saW5lam9pbj10LmxpbmVqb2luLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNvbnN0IG9jPW5ldyBMLGFjPW5ldyBMLFAwPW5ldyBMdCxYbz1uZXcgdXMsbGM9bmV3IFdlLE1mPW5ldyBMLEkwPW5ldyBMO2NsYXNzIEppIGV4dGVuZHMgbmV7Y29uc3RydWN0b3IodD1uZXcgTnQsZT1uZXcgbm4pe3N1cGVyKCksdGhpcy5pc0xpbmU9ITAsdGhpcy50eXBlPSJMaW5lIix0aGlzLmdlb21ldHJ5PXQsdGhpcy5tYXRlcmlhbD1lLHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5tYXRlcmlhbD1BcnJheS5pc0FycmF5KHQubWF0ZXJpYWwpP3QubWF0ZXJpYWwuc2xpY2UoKTp0Lm1hdGVyaWFsLHRoaXMuZ2VvbWV0cnk9dC5nZW9tZXRyeSx0aGlzfWNvbXB1dGVMaW5lRGlzdGFuY2VzKCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5O2lmKHQuaW5kZXg9PT1udWxsKXtjb25zdCBlPXQuYXR0cmlidXRlcy5wb3NpdGlvbixuPVswXTtmb3IobGV0IHI9MSxzPWUuY291bnQ7cjxzO3IrKylvYy5mcm9tQnVmZmVyQXR0cmlidXRlKGUsci0xKSxhYy5mcm9tQnVmZmVyQXR0cmlidXRlKGUsciksbltyXT1uW3ItMV0sbltyXSs9b2MuZGlzdGFuY2VUbyhhYyk7dC5zZXRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IFN0KG4sMSkpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5MaW5lLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtyZXR1cm4gdGhpc31yYXljYXN0KHQsZSl7Y29uc3Qgbj10aGlzLmdlb21ldHJ5LHI9dGhpcy5tYXRyaXhXb3JsZCxzPXQucGFyYW1zLkxpbmUudGhyZXNob2xkLG89bi5kcmF3UmFuZ2U7aWYobi5ib3VuZGluZ1NwaGVyZT09PW51bGwmJm4uY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksbGMuY29weShuLmJvdW5kaW5nU3BoZXJlKSxsYy5hcHBseU1hdHJpeDQociksbGMucmFkaXVzKz1zLHQucmF5LmludGVyc2VjdHNTcGhlcmUobGMpPT09ITEpcmV0dXJuO1AwLmNvcHkocikuaW52ZXJ0KCksWG8uY29weSh0LnJheSkuYXBwbHlNYXRyaXg0KFAwKTtjb25zdCBhPXMvKCh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMyksbD1hKmEsYz10aGlzLmlzTGluZVNlZ21lbnRzPzI6MSx1PW4uaW5kZXgsZj1uLmF0dHJpYnV0ZXMucG9zaXRpb247aWYodSE9PW51bGwpe2NvbnN0IGQ9TWF0aC5tYXgoMCxvLnN0YXJ0KSxwPU1hdGgubWluKHUuY291bnQsby5zdGFydCtvLmNvdW50KTtmb3IobGV0IHk9ZCxtPXAtMTt5PG07eSs9Yyl7Y29uc3QgZz11LmdldFgoeSkseD11LmdldFgoeSsxKSx2PWNjKHRoaXMsdCxYbyxsLGcseCk7diYmZS5wdXNoKHYpfWlmKHRoaXMuaXNMaW5lTG9vcCl7Y29uc3QgeT11LmdldFgocC0xKSxtPXUuZ2V0WChkKSxnPWNjKHRoaXMsdCxYbyxsLHksbSk7ZyYmZS5wdXNoKGcpfX1lbHNle2NvbnN0IGQ9TWF0aC5tYXgoMCxvLnN0YXJ0KSxwPU1hdGgubWluKGYuY291bnQsby5zdGFydCtvLmNvdW50KTtmb3IobGV0IHk9ZCxtPXAtMTt5PG07eSs9Yyl7Y29uc3QgZz1jYyh0aGlzLHQsWG8sbCx5LHkrMSk7ZyYmZS5wdXNoKGcpfWlmKHRoaXMuaXNMaW5lTG9vcCl7Y29uc3QgeT1jYyh0aGlzLHQsWG8sbCxwLTEsZCk7eSYmZS5wdXNoKHkpfX19dXBkYXRlTW9ycGhUYXJnZXRzKCl7Y29uc3QgZT10aGlzLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyxuPU9iamVjdC5rZXlzKGUpO2lmKG4ubGVuZ3RoPjApe2NvbnN0IHI9ZVtuWzBdXTtpZihyIT09dm9pZCAwKXt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT17fTtmb3IobGV0IHM9MCxvPXIubGVuZ3RoO3M8bztzKyspe2NvbnN0IGE9cltzXS5uYW1lfHxTdHJpbmcocyk7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVthXT1zfX19fX1mdW5jdGlvbiBjYyhpLHQsZSxuLHIscyl7Y29uc3Qgbz1pLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247aWYob2MuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLHIpLGFjLmZyb21CdWZmZXJBdHRyaWJ1dGUobyxzKSxlLmRpc3RhbmNlU3FUb1NlZ21lbnQob2MsYWMsTWYsSTApPm4pcmV0dXJuO01mLmFwcGx5TWF0cml4NChpLm1hdHJpeFdvcmxkKTtjb25zdCBsPXQucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKE1mKTtpZighKGw8dC5uZWFyfHxsPnQuZmFyKSlyZXR1cm57ZGlzdGFuY2U6bCxwb2ludDpJMC5jbG9uZSgpLmFwcGx5TWF0cml4NChpLm1hdHJpeFdvcmxkKSxpbmRleDpyLGZhY2U6bnVsbCxmYWNlSW5kZXg6bnVsbCxvYmplY3Q6aX19Y29uc3QgTDA9bmV3IEwsRDA9bmV3IEw7Y2xhc3MgaWkgZXh0ZW5kcyBKaXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5pc0xpbmVTZWdtZW50cz0hMCx0aGlzLnR5cGU9IkxpbmVTZWdtZW50cyJ9Y29tcHV0ZUxpbmVEaXN0YW5jZXMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7aWYodC5pbmRleD09PW51bGwpe2NvbnN0IGU9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLG49W107Zm9yKGxldCByPTAscz1lLmNvdW50O3I8cztyKz0yKUwwLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxyKSxEMC5mcm9tQnVmZmVyQXR0cmlidXRlKGUscisxKSxuW3JdPXI9PT0wPzA6bltyLTFdLG5bcisxXT1uW3JdK0wwLmRpc3RhbmNlVG8oRDApO3Quc2V0QXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBTdChuLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtyZXR1cm4gdGhpc319Y2xhc3MgVTAgZXh0ZW5kcyBKaXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5pc0xpbmVMb29wPSEwLHRoaXMudHlwZT0iTGluZUxvb3AifX1jbGFzcyBTZiBleHRlbmRzIFhle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc1BvaW50c01hdGVyaWFsPSEwLHRoaXMudHlwZT0iUG9pbnRzTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHZ0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLnNpemU9MSx0aGlzLnNpemVBdHRlbnVhdGlvbj0hMCx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hcD10Lm1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5zaXplPXQuc2l6ZSx0aGlzLnNpemVBdHRlbnVhdGlvbj10LnNpemVBdHRlbnVhdGlvbix0aGlzLmZvZz10LmZvZyx0aGlzfX1jb25zdCBOMD1uZXcgTHQsYmY9bmV3IHVzLHVjPW5ldyBXZSxoYz1uZXcgTDtjbGFzcyBGMCBleHRlbmRzIG5le2NvbnN0cnVjdG9yKHQ9bmV3IE50LGU9bmV3IFNmKXtzdXBlcigpLHRoaXMuaXNQb2ludHM9ITAsdGhpcy50eXBlPSJQb2ludHMiLHRoaXMuZ2VvbWV0cnk9dCx0aGlzLm1hdGVyaWFsPWUsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLm1hdGVyaWFsPUFycmF5LmlzQXJyYXkodC5tYXRlcmlhbCk/dC5tYXRlcmlhbC5zbGljZSgpOnQubWF0ZXJpYWwsdGhpcy5nZW9tZXRyeT10Lmdlb21ldHJ5LHRoaXN9cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxyPXRoaXMubWF0cml4V29ybGQscz10LnBhcmFtcy5Qb2ludHMudGhyZXNob2xkLG89bi5kcmF3UmFuZ2U7aWYobi5ib3VuZGluZ1NwaGVyZT09PW51bGwmJm4uY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdWMuY29weShuLmJvdW5kaW5nU3BoZXJlKSx1Yy5hcHBseU1hdHJpeDQociksdWMucmFkaXVzKz1zLHQucmF5LmludGVyc2VjdHNTcGhlcmUodWMpPT09ITEpcmV0dXJuO04wLmNvcHkocikuaW52ZXJ0KCksYmYuY29weSh0LnJheSkuYXBwbHlNYXRyaXg0KE4wKTtjb25zdCBhPXMvKCh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMyksbD1hKmEsYz1uLmluZGV4LGg9bi5hdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKGMhPT1udWxsKXtjb25zdCBmPU1hdGgubWF4KDAsby5zdGFydCksZD1NYXRoLm1pbihjLmNvdW50LG8uc3RhcnQrby5jb3VudCk7Zm9yKGxldCBwPWYseT1kO3A8eTtwKyspe2NvbnN0IG09Yy5nZXRYKHApO2hjLmZyb21CdWZmZXJBdHRyaWJ1dGUoaCxtKSxPMChoYyxtLGwscix0LGUsdGhpcyl9fWVsc2V7Y29uc3QgZj1NYXRoLm1heCgwLG8uc3RhcnQpLGQ9TWF0aC5taW4oaC5jb3VudCxvLnN0YXJ0K28uY291bnQpO2ZvcihsZXQgcD1mLHk9ZDtwPHk7cCsrKWhjLmZyb21CdWZmZXJBdHRyaWJ1dGUoaCxwKSxPMChoYyxwLGwscix0LGUsdGhpcyl9fXVwZGF0ZU1vcnBoVGFyZ2V0cygpe2NvbnN0IGU9dGhpcy5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMsbj1PYmplY3Qua2V5cyhlKTtpZihuLmxlbmd0aD4wKXtjb25zdCByPWVbblswXV07aWYociE9PXZvaWQgMCl7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e307Zm9yKGxldCBzPTAsbz1yLmxlbmd0aDtzPG87cysrKXtjb25zdCBhPXJbc10ubmFtZXx8U3RyaW5nKHMpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCksdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbYV09c319fX19ZnVuY3Rpb24gTzAoaSx0LGUsbixyLHMsbyl7Y29uc3QgYT1iZi5kaXN0YW5jZVNxVG9Qb2ludChpKTtpZihhPGUpe2NvbnN0IGw9bmV3IEw7YmYuY2xvc2VzdFBvaW50VG9Qb2ludChpLGwpLGwuYXBwbHlNYXRyaXg0KG4pO2NvbnN0IGM9ci5yYXkub3JpZ2luLmRpc3RhbmNlVG8obCk7aWYoYzxyLm5lYXJ8fGM+ci5mYXIpcmV0dXJuO3MucHVzaCh7ZGlzdGFuY2U6YyxkaXN0YW5jZVRvUmF5Ok1hdGguc3FydChhKSxwb2ludDpsLGluZGV4OnQsZmFjZTpudWxsLG9iamVjdDpvfSl9fWNsYXNzIGdUIGV4dGVuZHMgTWV7Y29uc3RydWN0b3IodCxlLG4scixzLG8sYSxsLGMpe3N1cGVyKHQsZSxuLHIscyxvLGEsbCxjKSx0aGlzLmlzVmlkZW9UZXh0dXJlPSEwLHRoaXMubWluRmlsdGVyPW8hPT12b2lkIDA/bzpSZSx0aGlzLm1hZ0ZpbHRlcj1zIT09dm9pZCAwP3M6UmUsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITE7Y29uc3QgdT10aGlzO2Z1bmN0aW9uIGgoKXt1Lm5lZWRzVXBkYXRlPSEwLHQucmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjayhoKX0icmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjayJpbiB0JiZ0LnJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2soaCl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5pbWFnZSkuY29weSh0aGlzKX11cGRhdGUoKXtjb25zdCB0PXRoaXMuaW1hZ2U7InJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2siaW4gdD09PSExJiZ0LnJlYWR5U3RhdGU+PXQuSEFWRV9DVVJSRU5UX0RBVEEmJih0aGlzLm5lZWRzVXBkYXRlPSEwKX19Y2xhc3MgeVQgZXh0ZW5kcyBNZXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHt3aWR0aDp0LGhlaWdodDplfSksdGhpcy5pc0ZyYW1lYnVmZmVyVGV4dHVyZT0hMCx0aGlzLm1hZ0ZpbHRlcj1GZSx0aGlzLm1pbkZpbHRlcj1GZSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMSx0aGlzLm5lZWRzVXBkYXRlPSEwfX1jbGFzcyBmYyBleHRlbmRzIE1le2NvbnN0cnVjdG9yKHQsZSxuLHIscyxvLGEsbCxjLHUsaCxmKXtzdXBlcihudWxsLG8sYSxsLGMsdSxyLHMsaCxmKSx0aGlzLmlzQ29tcHJlc3NlZFRleHR1cmU9ITAsdGhpcy5pbWFnZT17d2lkdGg6ZSxoZWlnaHQ6bn0sdGhpcy5taXBtYXBzPXQsdGhpcy5mbGlwWT0hMSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX19Y2xhc3MgdlQgZXh0ZW5kcyBmY3tjb25zdHJ1Y3Rvcih0LGUsbixyLHMsbyl7c3VwZXIodCxlLG4scyxvKSx0aGlzLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZT0hMCx0aGlzLmltYWdlLmRlcHRoPXIsdGhpcy53cmFwUj1Jbix0aGlzLmxheWVyVXBkYXRlcz1uZXcgU2V0fWFkZExheWVyVXBkYXRlKHQpe3RoaXMubGF5ZXJVcGRhdGVzLmFkZCh0KX1jbGVhckxheWVyVXBkYXRlcygpe3RoaXMubGF5ZXJVcGRhdGVzLmNsZWFyKCl9fWNsYXNzIF9UIGV4dGVuZHMgZmN7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHZvaWQgMCx0WzBdLndpZHRoLHRbMF0uaGVpZ2h0LGUsbixwaSksdGhpcy5pc0NvbXByZXNzZWRDdWJlVGV4dHVyZT0hMCx0aGlzLmlzQ3ViZVRleHR1cmU9ITAsdGhpcy5pbWFnZT10fX1jbGFzcyB4VCBleHRlbmRzIE1le2NvbnN0cnVjdG9yKHQsZSxuLHIscyxvLGEsbCxjKXtzdXBlcih0LGUsbixyLHMsbyxhLGwsYyksdGhpcy5pc0NhbnZhc1RleHR1cmU9ITAsdGhpcy5uZWVkc1VwZGF0ZT0hMH19Y2xhc3MgSG57Y29uc3RydWN0b3IoKXt0aGlzLnR5cGU9IkN1cnZlIix0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz0yMDB9Z2V0UG9pbnQoKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZTogLmdldFBvaW50KCkgbm90IGltcGxlbWVudGVkLiIpLG51bGx9Z2V0UG9pbnRBdCh0LGUpe2NvbnN0IG49dGhpcy5nZXRVdG9UbWFwcGluZyh0KTtyZXR1cm4gdGhpcy5nZXRQb2ludChuLGUpfWdldFBvaW50cyh0PTUpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnQobi90KSk7cmV0dXJuIGV9Z2V0U3BhY2VkUG9pbnRzKHQ9NSl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPD10O24rKyllLnB1c2godGhpcy5nZXRQb2ludEF0KG4vdCkpO3JldHVybiBlfWdldExlbmd0aCgpe2NvbnN0IHQ9dGhpcy5nZXRMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19Z2V0TGVuZ3Rocyh0PXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zKXtpZih0aGlzLmNhY2hlQXJjTGVuZ3RocyYmdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoPT09dCsxJiYhdGhpcy5uZWVkc1VwZGF0ZSlyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7dGhpcy5uZWVkc1VwZGF0ZT0hMTtjb25zdCBlPVtdO2xldCBuLHI9dGhpcy5nZXRQb2ludCgwKSxzPTA7ZS5wdXNoKDApO2ZvcihsZXQgbz0xO288PXQ7bysrKW49dGhpcy5nZXRQb2ludChvL3QpLHMrPW4uZGlzdGFuY2VUbyhyKSxlLnB1c2gocykscj1uO3JldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3Rocz1lLGV9dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5nZXRMZW5ndGhzKCl9Z2V0VXRvVG1hcHBpbmcodCxlKXtjb25zdCBuPXRoaXMuZ2V0TGVuZ3RocygpO2xldCByPTA7Y29uc3Qgcz1uLmxlbmd0aDtsZXQgbztlP289ZTpvPXQqbltzLTFdO2xldCBhPTAsbD1zLTEsYztmb3IoO2E8PWw7KWlmKHI9TWF0aC5mbG9vcihhKyhsLWEpLzIpLGM9bltyXS1vLGM8MClhPXIrMTtlbHNlIGlmKGM+MClsPXItMTtlbHNle2w9cjticmVha31pZihyPWwsbltyXT09PW8pcmV0dXJuIHIvKHMtMSk7Y29uc3QgdT1uW3JdLGY9bltyKzFdLXUsZD0oby11KS9mO3JldHVybihyK2QpLyhzLTEpfWdldFRhbmdlbnQodCxlKXtsZXQgcj10LTFlLTQscz10KzFlLTQ7cjwwJiYocj0wKSxzPjEmJihzPTEpO2NvbnN0IG89dGhpcy5nZXRQb2ludChyKSxhPXRoaXMuZ2V0UG9pbnQocyksbD1lfHwoby5pc1ZlY3RvcjI/bmV3IHE6bmV3IEwpO3JldHVybiBsLmNvcHkoYSkuc3ViKG8pLm5vcm1hbGl6ZSgpLGx9Z2V0VGFuZ2VudEF0KHQsZSl7Y29uc3Qgbj10aGlzLmdldFV0b1RtYXBwaW5nKHQpO3JldHVybiB0aGlzLmdldFRhbmdlbnQobixlKX1jb21wdXRlRnJlbmV0RnJhbWVzKHQsZSl7Y29uc3Qgbj1uZXcgTCxyPVtdLHM9W10sbz1bXSxhPW5ldyBMLGw9bmV3IEx0O2ZvcihsZXQgZD0wO2Q8PXQ7ZCsrKXtjb25zdCBwPWQvdDtyW2RdPXRoaXMuZ2V0VGFuZ2VudEF0KHAsbmV3IEwpfXNbMF09bmV3IEwsb1swXT1uZXcgTDtsZXQgYz1OdW1iZXIuTUFYX1ZBTFVFO2NvbnN0IHU9TWF0aC5hYnMoclswXS54KSxoPU1hdGguYWJzKHJbMF0ueSksZj1NYXRoLmFicyhyWzBdLnopO3U8PWMmJihjPXUsbi5zZXQoMSwwLDApKSxoPD1jJiYoYz1oLG4uc2V0KDAsMSwwKSksZjw9YyYmbi5zZXQoMCwwLDEpLGEuY3Jvc3NWZWN0b3JzKHJbMF0sbikubm9ybWFsaXplKCksc1swXS5jcm9zc1ZlY3RvcnMoclswXSxhKSxvWzBdLmNyb3NzVmVjdG9ycyhyWzBdLHNbMF0pO2ZvcihsZXQgZD0xO2Q8PXQ7ZCsrKXtpZihzW2RdPXNbZC0xXS5jbG9uZSgpLG9bZF09b1tkLTFdLmNsb25lKCksYS5jcm9zc1ZlY3RvcnMocltkLTFdLHJbZF0pLGEubGVuZ3RoKCk+TnVtYmVyLkVQU0lMT04pe2Eubm9ybWFsaXplKCk7Y29uc3QgcD1NYXRoLmFjb3MoeGUocltkLTFdLmRvdChyW2RdKSwtMSwxKSk7c1tkXS5hcHBseU1hdHJpeDQobC5tYWtlUm90YXRpb25BeGlzKGEscCkpfW9bZF0uY3Jvc3NWZWN0b3JzKHJbZF0sc1tkXSl9aWYoZT09PSEwKXtsZXQgZD1NYXRoLmFjb3MoeGUoc1swXS5kb3Qoc1t0XSksLTEsMSkpO2QvPXQsclswXS5kb3QoYS5jcm9zc1ZlY3RvcnMoc1swXSxzW3RdKSk+MCYmKGQ9LWQpO2ZvcihsZXQgcD0xO3A8PXQ7cCsrKXNbcF0uYXBwbHlNYXRyaXg0KGwubWFrZVJvdGF0aW9uQXhpcyhyW3BdLGQqcCkpLG9bcF0uY3Jvc3NWZWN0b3JzKHJbcF0sc1twXSl9cmV0dXJue3RhbmdlbnRzOnIsbm9ybWFsczpzLGJpbm9ybWFsczpvfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9dC5hcmNMZW5ndGhEaXZpc2lvbnMsdGhpc310b0pTT04oKXtjb25zdCB0PXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiQ3VydmUiLGdlbmVyYXRvcjoiQ3VydmUudG9KU09OIn19O3JldHVybiB0LmFyY0xlbmd0aERpdmlzaW9ucz10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyx0LnR5cGU9dGhpcy50eXBlLHR9ZnJvbUpTT04odCl7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPXQuYXJjTGVuZ3RoRGl2aXNpb25zLHRoaXN9fWNsYXNzIGRjIGV4dGVuZHMgSG57Y29uc3RydWN0b3IodD0wLGU9MCxuPTEscj0xLHM9MCxvPU1hdGguUEkqMixhPSExLGw9MCl7c3VwZXIoKSx0aGlzLmlzRWxsaXBzZUN1cnZlPSEwLHRoaXMudHlwZT0iRWxsaXBzZUN1cnZlIix0aGlzLmFYPXQsdGhpcy5hWT1lLHRoaXMueFJhZGl1cz1uLHRoaXMueVJhZGl1cz1yLHRoaXMuYVN0YXJ0QW5nbGU9cyx0aGlzLmFFbmRBbmdsZT1vLHRoaXMuYUNsb2Nrd2lzZT1hLHRoaXMuYVJvdGF0aW9uPWx9Z2V0UG9pbnQodCxlPW5ldyBxKXtjb25zdCBuPWUscj1NYXRoLlBJKjI7bGV0IHM9dGhpcy5hRW5kQW5nbGUtdGhpcy5hU3RhcnRBbmdsZTtjb25zdCBvPU1hdGguYWJzKHMpPE51bWJlci5FUFNJTE9OO2Zvcig7czwwOylzKz1yO2Zvcig7cz5yOylzLT1yO3M8TnVtYmVyLkVQU0lMT04mJihvP3M9MDpzPXIpLHRoaXMuYUNsb2Nrd2lzZT09PSEwJiYhbyYmKHM9PT1yP3M9LXI6cz1zLXIpO2NvbnN0IGE9dGhpcy5hU3RhcnRBbmdsZSt0KnM7bGV0IGw9dGhpcy5hWCt0aGlzLnhSYWRpdXMqTWF0aC5jb3MoYSksYz10aGlzLmFZK3RoaXMueVJhZGl1cypNYXRoLnNpbihhKTtpZih0aGlzLmFSb3RhdGlvbiE9PTApe2NvbnN0IHU9TWF0aC5jb3ModGhpcy5hUm90YXRpb24pLGg9TWF0aC5zaW4odGhpcy5hUm90YXRpb24pLGY9bC10aGlzLmFYLGQ9Yy10aGlzLmFZO2w9Zip1LWQqaCt0aGlzLmFYLGM9ZipoK2QqdSt0aGlzLmFZfXJldHVybiBuLnNldChsLGMpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5hWD10LmFYLHRoaXMuYVk9dC5hWSx0aGlzLnhSYWRpdXM9dC54UmFkaXVzLHRoaXMueVJhZGl1cz10LnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT10LmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPXQuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT10LmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249dC5hUm90YXRpb24sdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LmFYPXRoaXMuYVgsdC5hWT10aGlzLmFZLHQueFJhZGl1cz10aGlzLnhSYWRpdXMsdC55UmFkaXVzPXRoaXMueVJhZGl1cyx0LmFTdGFydEFuZ2xlPXRoaXMuYVN0YXJ0QW5nbGUsdC5hRW5kQW5nbGU9dGhpcy5hRW5kQW5nbGUsdC5hQ2xvY2t3aXNlPXRoaXMuYUNsb2Nrd2lzZSx0LmFSb3RhdGlvbj10aGlzLmFSb3RhdGlvbix0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLmFYPXQuYVgsdGhpcy5hWT10LmFZLHRoaXMueFJhZGl1cz10LnhSYWRpdXMsdGhpcy55UmFkaXVzPXQueVJhZGl1cyx0aGlzLmFTdGFydEFuZ2xlPXQuYVN0YXJ0QW5nbGUsdGhpcy5hRW5kQW5nbGU9dC5hRW5kQW5nbGUsdGhpcy5hQ2xvY2t3aXNlPXQuYUNsb2Nrd2lzZSx0aGlzLmFSb3RhdGlvbj10LmFSb3RhdGlvbix0aGlzfX1jbGFzcyBCMCBleHRlbmRzIGRje2NvbnN0cnVjdG9yKHQsZSxuLHIscyxvKXtzdXBlcih0LGUsbixuLHIscyxvKSx0aGlzLmlzQXJjQ3VydmU9ITAsdGhpcy50eXBlPSJBcmNDdXJ2ZSJ9fWZ1bmN0aW9uIHdmKCl7bGV0IGk9MCx0PTAsZT0wLG49MDtmdW5jdGlvbiByKHMsbyxhLGwpe2k9cyx0PWEsZT0tMypzKzMqby0yKmEtbCxuPTIqcy0yKm8rYStsfXJldHVybntpbml0Q2F0bXVsbFJvbTpmdW5jdGlvbihzLG8sYSxsLGMpe3IobyxhLGMqKGEtcyksYyoobC1vKSl9LGluaXROb251bmlmb3JtQ2F0bXVsbFJvbTpmdW5jdGlvbihzLG8sYSxsLGMsdSxoKXtsZXQgZj0oby1zKS9jLShhLXMpLyhjK3UpKyhhLW8pL3UsZD0oYS1vKS91LShsLW8pLyh1K2gpKyhsLWEpL2g7Zio9dSxkKj11LHIobyxhLGYsZCl9LGNhbGM6ZnVuY3Rpb24ocyl7Y29uc3Qgbz1zKnMsYT1vKnM7cmV0dXJuIGkrdCpzK2UqbytuKmF9fX1jb25zdCBwYz1uZXcgTCxBZj1uZXcgd2YsRWY9bmV3IHdmLFRmPW5ldyB3ZjtjbGFzcyB6MCBleHRlbmRzIEhue2NvbnN0cnVjdG9yKHQ9W10sZT0hMSxuPSJjZW50cmlwZXRhbCIscj0uNSl7c3VwZXIoKSx0aGlzLmlzQ2F0bXVsbFJvbUN1cnZlMz0hMCx0aGlzLnR5cGU9IkNhdG11bGxSb21DdXJ2ZTMiLHRoaXMucG9pbnRzPXQsdGhpcy5jbG9zZWQ9ZSx0aGlzLmN1cnZlVHlwZT1uLHRoaXMudGVuc2lvbj1yfWdldFBvaW50KHQsZT1uZXcgTCl7Y29uc3Qgbj1lLHI9dGhpcy5wb2ludHMscz1yLmxlbmd0aCxvPShzLSh0aGlzLmNsb3NlZD8wOjEpKSp0O2xldCBhPU1hdGguZmxvb3IobyksbD1vLWE7dGhpcy5jbG9zZWQ/YSs9YT4wPzA6KE1hdGguZmxvb3IoTWF0aC5hYnMoYSkvcykrMSkqczpsPT09MCYmYT09PXMtMSYmKGE9cy0yLGw9MSk7bGV0IGMsdTt0aGlzLmNsb3NlZHx8YT4wP2M9clsoYS0xKSVzXToocGMuc3ViVmVjdG9ycyhyWzBdLHJbMV0pLmFkZChyWzBdKSxjPXBjKTtjb25zdCBoPXJbYSVzXSxmPXJbKGErMSklc107aWYodGhpcy5jbG9zZWR8fGErMjxzP3U9clsoYSsyKSVzXToocGMuc3ViVmVjdG9ycyhyW3MtMV0scltzLTJdKS5hZGQocltzLTFdKSx1PXBjKSx0aGlzLmN1cnZlVHlwZT09PSJjZW50cmlwZXRhbCJ8fHRoaXMuY3VydmVUeXBlPT09ImNob3JkYWwiKXtjb25zdCBkPXRoaXMuY3VydmVUeXBlPT09ImNob3JkYWwiPy41Oi4yNTtsZXQgcD1NYXRoLnBvdyhjLmRpc3RhbmNlVG9TcXVhcmVkKGgpLGQpLHk9TWF0aC5wb3coaC5kaXN0YW5jZVRvU3F1YXJlZChmKSxkKSxtPU1hdGgucG93KGYuZGlzdGFuY2VUb1NxdWFyZWQodSksZCk7eTwxZS00JiYoeT0xKSxwPDFlLTQmJihwPXkpLG08MWUtNCYmKG09eSksQWYuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKGMueCxoLngsZi54LHUueCxwLHksbSksRWYuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKGMueSxoLnksZi55LHUueSxwLHksbSksVGYuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKGMueixoLnosZi56LHUueixwLHksbSl9ZWxzZSB0aGlzLmN1cnZlVHlwZT09PSJjYXRtdWxscm9tIiYmKEFmLmluaXRDYXRtdWxsUm9tKGMueCxoLngsZi54LHUueCx0aGlzLnRlbnNpb24pLEVmLmluaXRDYXRtdWxsUm9tKGMueSxoLnksZi55LHUueSx0aGlzLnRlbnNpb24pLFRmLmluaXRDYXRtdWxsUm9tKGMueixoLnosZi56LHUueix0aGlzLnRlbnNpb24pKTtyZXR1cm4gbi5zZXQoQWYuY2FsYyhsKSxFZi5jYWxjKGwpLFRmLmNhbGMobCkpLG59Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHI9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChyLmNsb25lKCkpfXJldHVybiB0aGlzLmNsb3NlZD10LmNsb3NlZCx0aGlzLmN1cnZlVHlwZT10LmN1cnZlVHlwZSx0aGlzLnRlbnNpb249dC50ZW5zaW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXRoaXMucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCByPXRoaXMucG9pbnRzW2VdO3QucG9pbnRzLnB1c2goci50b0FycmF5KCkpfXJldHVybiB0LmNsb3NlZD10aGlzLmNsb3NlZCx0LmN1cnZlVHlwZT10aGlzLmN1cnZlVHlwZSx0LnRlbnNpb249dGhpcy50ZW5zaW9uLHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10LnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcj10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKG5ldyBMKCkuZnJvbUFycmF5KHIpKX1yZXR1cm4gdGhpcy5jbG9zZWQ9dC5jbG9zZWQsdGhpcy5jdXJ2ZVR5cGU9dC5jdXJ2ZVR5cGUsdGhpcy50ZW5zaW9uPXQudGVuc2lvbix0aGlzfX1mdW5jdGlvbiBrMChpLHQsZSxuLHIpe2NvbnN0IHM9KG4tdCkqLjUsbz0oci1lKSouNSxhPWkqaSxsPWkqYTtyZXR1cm4oMiplLTIqbitzK28pKmwrKC0zKmUrMypuLTIqcy1vKSphK3MqaStlfWZ1bmN0aW9uIE1UKGksdCl7Y29uc3QgZT0xLWk7cmV0dXJuIGUqZSp0fWZ1bmN0aW9uIFNUKGksdCl7cmV0dXJuIDIqKDEtaSkqaSp0fWZ1bmN0aW9uIGJUKGksdCl7cmV0dXJuIGkqaSp0fWZ1bmN0aW9uIHFvKGksdCxlLG4pe3JldHVybiBNVChpLHQpK1NUKGksZSkrYlQoaSxuKX1mdW5jdGlvbiB3VChpLHQpe2NvbnN0IGU9MS1pO3JldHVybiBlKmUqZSp0fWZ1bmN0aW9uIEFUKGksdCl7Y29uc3QgZT0xLWk7cmV0dXJuIDMqZSplKmkqdH1mdW5jdGlvbiBFVChpLHQpe3JldHVybiAzKigxLWkpKmkqaSp0fWZ1bmN0aW9uIFRUKGksdCl7cmV0dXJuIGkqaSppKnR9ZnVuY3Rpb24gWW8oaSx0LGUsbixyKXtyZXR1cm4gd1QoaSx0KStBVChpLGUpK0VUKGksbikrVFQoaSxyKX1jbGFzcyBDZiBleHRlbmRzIEhue2NvbnN0cnVjdG9yKHQ9bmV3IHEsZT1uZXcgcSxuPW5ldyBxLHI9bmV3IHEpe3N1cGVyKCksdGhpcy5pc0N1YmljQmV6aWVyQ3VydmU9ITAsdGhpcy50eXBlPSJDdWJpY0JlemllckN1cnZlIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9bix0aGlzLnYzPXJ9Z2V0UG9pbnQodCxlPW5ldyBxKXtjb25zdCBuPWUscj10aGlzLnYwLHM9dGhpcy52MSxvPXRoaXMudjIsYT10aGlzLnYzO3JldHVybiBuLnNldChZbyh0LHIueCxzLngsby54LGEueCksWW8odCxyLnkscy55LG8ueSxhLnkpKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpcy52My5jb3B5KHQudjMpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MD10aGlzLnYwLnRvQXJyYXkoKSx0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdC52Mz10aGlzLnYzLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzLnYzLmZyb21BcnJheSh0LnYzKSx0aGlzfX1jbGFzcyBHMCBleHRlbmRzIEhue2NvbnN0cnVjdG9yKHQ9bmV3IEwsZT1uZXcgTCxuPW5ldyBMLHI9bmV3IEwpe3N1cGVyKCksdGhpcy5pc0N1YmljQmV6aWVyQ3VydmUzPSEwLHRoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1uLHRoaXMudjM9cn1nZXRQb2ludCh0LGU9bmV3IEwpe2NvbnN0IG49ZSxyPXRoaXMudjAscz10aGlzLnYxLG89dGhpcy52MixhPXRoaXMudjM7cmV0dXJuIG4uc2V0KFlvKHQsci54LHMueCxvLngsYS54KSxZbyh0LHIueSxzLnksby55LGEueSksWW8odCxyLnoscy56LG8ueixhLnopKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpcy52My5jb3B5KHQudjMpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MD10aGlzLnYwLnRvQXJyYXkoKSx0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdC52Mz10aGlzLnYzLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzLnYzLmZyb21BcnJheSh0LnYzKSx0aGlzfX1jbGFzcyBSZiBleHRlbmRzIEhue2NvbnN0cnVjdG9yKHQ9bmV3IHEsZT1uZXcgcSl7c3VwZXIoKSx0aGlzLmlzTGluZUN1cnZlPSEwLHRoaXMudHlwZT0iTGluZUN1cnZlIix0aGlzLnYxPXQsdGhpcy52Mj1lfWdldFBvaW50KHQsZT1uZXcgcSl7Y29uc3Qgbj1lO3JldHVybiB0PT09MT9uLmNvcHkodGhpcy52Mik6KG4uY29weSh0aGlzLnYyKS5zdWIodGhpcy52MSksbi5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy52MSkpLG59Z2V0UG9pbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFBvaW50KHQsZSl9Z2V0VGFuZ2VudCh0LGU9bmV3IHEpe3JldHVybiBlLnN1YlZlY3RvcnModGhpcy52Mix0aGlzLnYxKS5ub3JtYWxpemUoKX1nZXRUYW5nZW50QXQodCxlKXtyZXR1cm4gdGhpcy5nZXRUYW5nZW50KHQsZSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fWNsYXNzIFYwIGV4dGVuZHMgSG57Y29uc3RydWN0b3IodD1uZXcgTCxlPW5ldyBMKXtzdXBlcigpLHRoaXMuaXNMaW5lQ3VydmUzPSEwLHRoaXMudHlwZT0iTGluZUN1cnZlMyIsdGhpcy52MT10LHRoaXMudjI9ZX1nZXRQb2ludCh0LGU9bmV3IEwpe2NvbnN0IG49ZTtyZXR1cm4gdD09PTE/bi5jb3B5KHRoaXMudjIpOihuLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLG4ubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMudjEpKSxufWdldFBvaW50QXQodCxlKXtyZXR1cm4gdGhpcy5nZXRQb2ludCh0LGUpfWdldFRhbmdlbnQodCxlPW5ldyBMKXtyZXR1cm4gZS5zdWJWZWN0b3JzKHRoaXMudjIsdGhpcy52MSkubm9ybWFsaXplKCl9Z2V0VGFuZ2VudEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCh0LGUpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBQZiBleHRlbmRzIEhue2NvbnN0cnVjdG9yKHQ9bmV3IHEsZT1uZXcgcSxuPW5ldyBxKXtzdXBlcigpLHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZT0hMCx0aGlzLnR5cGU9IlF1YWRyYXRpY0JlemllckN1cnZlIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9bn1nZXRQb2ludCh0LGU9bmV3IHEpe2NvbnN0IG49ZSxyPXRoaXMudjAscz10aGlzLnYxLG89dGhpcy52MjtyZXR1cm4gbi5zZXQocW8odCxyLngscy54LG8ueCkscW8odCxyLnkscy55LG8ueSkpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fWNsYXNzIElmIGV4dGVuZHMgSG57Y29uc3RydWN0b3IodD1uZXcgTCxlPW5ldyBMLG49bmV3IEwpe3N1cGVyKCksdGhpcy5pc1F1YWRyYXRpY0JlemllckN1cnZlMz0hMCx0aGlzLnR5cGU9IlF1YWRyYXRpY0JlemllckN1cnZlMyIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW59Z2V0UG9pbnQodCxlPW5ldyBMKXtjb25zdCBuPWUscj10aGlzLnYwLHM9dGhpcy52MSxvPXRoaXMudjI7cmV0dXJuIG4uc2V0KHFvKHQsci54LHMueCxvLngpLHFvKHQsci55LHMueSxvLnkpLHFvKHQsci56LHMueixvLnopKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBMZiBleHRlbmRzIEhue2NvbnN0cnVjdG9yKHQ9W10pe3N1cGVyKCksdGhpcy5pc1NwbGluZUN1cnZlPSEwLHRoaXMudHlwZT0iU3BsaW5lQ3VydmUiLHRoaXMucG9pbnRzPXR9Z2V0UG9pbnQodCxlPW5ldyBxKXtjb25zdCBuPWUscj10aGlzLnBvaW50cyxzPShyLmxlbmd0aC0xKSp0LG89TWF0aC5mbG9vcihzKSxhPXMtbyxsPXJbbz09PTA/bzpvLTFdLGM9cltvXSx1PXJbbz5yLmxlbmd0aC0yP3IubGVuZ3RoLTE6bysxXSxoPXJbbz5yLmxlbmd0aC0zP3IubGVuZ3RoLTE6bysyXTtyZXR1cm4gbi5zZXQoazAoYSxsLngsYy54LHUueCxoLngpLGswKGEsbC55LGMueSx1LnksaC55KSksbn1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10LnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcj10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKHIuY2xvbmUoKSl9cmV0dXJuIHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXRoaXMucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCByPXRoaXMucG9pbnRzW2VdO3QucG9pbnRzLnB1c2goci50b0FycmF5KCkpfXJldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHI9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChuZXcgcSgpLmZyb21BcnJheShyKSl9cmV0dXJuIHRoaXN9fXZhciBtYz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxBcmNDdXJ2ZTpCMCxDYXRtdWxsUm9tQ3VydmUzOnowLEN1YmljQmV6aWVyQ3VydmU6Q2YsQ3ViaWNCZXppZXJDdXJ2ZTM6RzAsRWxsaXBzZUN1cnZlOmRjLExpbmVDdXJ2ZTpSZixMaW5lQ3VydmUzOlYwLFF1YWRyYXRpY0JlemllckN1cnZlOlBmLFF1YWRyYXRpY0JlemllckN1cnZlMzpJZixTcGxpbmVDdXJ2ZTpMZn0pO2NsYXNzIEgwIGV4dGVuZHMgSG57Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iQ3VydmVQYXRoIix0aGlzLmN1cnZlcz1bXSx0aGlzLmF1dG9DbG9zZT0hMX1hZGQodCl7dGhpcy5jdXJ2ZXMucHVzaCh0KX1jbG9zZVBhdGgoKXtjb25zdCB0PXRoaXMuY3VydmVzWzBdLmdldFBvaW50KDApLGU9dGhpcy5jdXJ2ZXNbdGhpcy5jdXJ2ZXMubGVuZ3RoLTFdLmdldFBvaW50KDEpO2lmKCF0LmVxdWFscyhlKSl7Y29uc3Qgbj10LmlzVmVjdG9yMj09PSEwPyJMaW5lQ3VydmUiOiJMaW5lQ3VydmUzIjt0aGlzLmN1cnZlcy5wdXNoKG5ldyBtY1tuXShlLHQpKX1yZXR1cm4gdGhpc31nZXRQb2ludCh0LGUpe2NvbnN0IG49dCp0aGlzLmdldExlbmd0aCgpLHI9dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtsZXQgcz0wO2Zvcig7czxyLmxlbmd0aDspe2lmKHJbc10+PW4pe2NvbnN0IG89cltzXS1uLGE9dGhpcy5jdXJ2ZXNbc10sbD1hLmdldExlbmd0aCgpLGM9bD09PTA/MDoxLW8vbDtyZXR1cm4gYS5nZXRQb2ludEF0KGMsZSl9cysrfXJldHVybiBudWxsfWdldExlbmd0aCgpe2NvbnN0IHQ9dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtyZXR1cm4gdFt0Lmxlbmd0aC0xXX11cGRhdGVBcmNMZW5ndGhzKCl7dGhpcy5uZWVkc1VwZGF0ZT0hMCx0aGlzLmNhY2hlTGVuZ3Rocz1udWxsLHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCl9Z2V0Q3VydmVMZW5ndGhzKCl7aWYodGhpcy5jYWNoZUxlbmd0aHMmJnRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aD09PXRoaXMuY3VydmVzLmxlbmd0aClyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7Y29uc3QgdD1bXTtsZXQgZT0wO2ZvcihsZXQgbj0wLHI9dGhpcy5jdXJ2ZXMubGVuZ3RoO248cjtuKyspZSs9dGhpcy5jdXJ2ZXNbbl0uZ2V0TGVuZ3RoKCksdC5wdXNoKGUpO3JldHVybiB0aGlzLmNhY2hlTGVuZ3Rocz10LHR9Z2V0U3BhY2VkUG9pbnRzKHQ9NDApe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnQobi90KSk7cmV0dXJuIHRoaXMuYXV0b0Nsb3NlJiZlLnB1c2goZVswXSksZX1nZXRQb2ludHModD0xMil7Y29uc3QgZT1bXTtsZXQgbjtmb3IobGV0IHI9MCxzPXRoaXMuY3VydmVzO3I8cy5sZW5ndGg7cisrKXtjb25zdCBvPXNbcl0sYT1vLmlzRWxsaXBzZUN1cnZlP3QqMjpvLmlzTGluZUN1cnZlfHxvLmlzTGluZUN1cnZlMz8xOm8uaXNTcGxpbmVDdXJ2ZT90Km8ucG9pbnRzLmxlbmd0aDp0LGw9by5nZXRQb2ludHMoYSk7Zm9yKGxldCBjPTA7YzxsLmxlbmd0aDtjKyspe2NvbnN0IHU9bFtjXTtuJiZuLmVxdWFscyh1KXx8KGUucHVzaCh1KSxuPXUpfX1yZXR1cm4gdGhpcy5hdXRvQ2xvc2UmJmUubGVuZ3RoPjEmJiFlW2UubGVuZ3RoLTFdLmVxdWFscyhlWzBdKSYmZS5wdXNoKGVbMF0pLGV9Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMuY3VydmVzPVtdO2ZvcihsZXQgZT0wLG49dC5jdXJ2ZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHI9dC5jdXJ2ZXNbZV07dGhpcy5jdXJ2ZXMucHVzaChyLmNsb25lKCkpfXJldHVybiB0aGlzLmF1dG9DbG9zZT10LmF1dG9DbG9zZSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5hdXRvQ2xvc2U9dGhpcy5hdXRvQ2xvc2UsdC5jdXJ2ZXM9W107Zm9yKGxldCBlPTAsbj10aGlzLmN1cnZlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcj10aGlzLmN1cnZlc1tlXTt0LmN1cnZlcy5wdXNoKHIudG9KU09OKCkpfXJldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMuYXV0b0Nsb3NlPXQuYXV0b0Nsb3NlLHRoaXMuY3VydmVzPVtdO2ZvcihsZXQgZT0wLG49dC5jdXJ2ZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHI9dC5jdXJ2ZXNbZV07dGhpcy5jdXJ2ZXMucHVzaChuZXcgbWNbci50eXBlXSgpLmZyb21KU09OKHIpKX1yZXR1cm4gdGhpc319bGV0IFpvPWNsYXNzIGV4dGVuZHMgSDB7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IlBhdGgiLHRoaXMuY3VycmVudFBvaW50PW5ldyBxLHQmJnRoaXMuc2V0RnJvbVBvaW50cyh0KX1zZXRGcm9tUG9pbnRzKHQpe3RoaXMubW92ZVRvKHRbMF0ueCx0WzBdLnkpO2ZvcihsZXQgZT0xLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmxpbmVUbyh0W2VdLngsdFtlXS55KTtyZXR1cm4gdGhpc31tb3ZlVG8odCxlKXtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuc2V0KHQsZSksdGhpc31saW5lVG8odCxlKXtjb25zdCBuPW5ldyBSZih0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBxKHQsZSkpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKG4pLHRoaXMuY3VycmVudFBvaW50LnNldCh0LGUpLHRoaXN9cXVhZHJhdGljQ3VydmVUbyh0LGUsbixyKXtjb25zdCBzPW5ldyBQZih0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBxKHQsZSksbmV3IHEobixyKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2gocyksdGhpcy5jdXJyZW50UG9pbnQuc2V0KG4sciksdGhpc31iZXppZXJDdXJ2ZVRvKHQsZSxuLHIscyxvKXtjb25zdCBhPW5ldyBDZih0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBxKHQsZSksbmV3IHEobixyKSxuZXcgcShzLG8pKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChhKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQocyxvKSx0aGlzfXNwbGluZVRocnUodCl7Y29uc3QgZT1bdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKV0uY29uY2F0KHQpLG49bmV3IExmKGUpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKG4pLHRoaXMuY3VycmVudFBvaW50LmNvcHkodFt0Lmxlbmd0aC0xXSksdGhpc31hcmModCxlLG4scixzLG8pe2NvbnN0IGE9dGhpcy5jdXJyZW50UG9pbnQueCxsPXRoaXMuY3VycmVudFBvaW50Lnk7cmV0dXJuIHRoaXMuYWJzYXJjKHQrYSxlK2wsbixyLHMsbyksdGhpc31hYnNhcmModCxlLG4scixzLG8pe3JldHVybiB0aGlzLmFic2VsbGlwc2UodCxlLG4sbixyLHMsbyksdGhpc31lbGxpcHNlKHQsZSxuLHIscyxvLGEsbCl7Y29uc3QgYz10aGlzLmN1cnJlbnRQb2ludC54LHU9dGhpcy5jdXJyZW50UG9pbnQueTtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKHQrYyxlK3UsbixyLHMsbyxhLGwpLHRoaXN9YWJzZWxsaXBzZSh0LGUsbixyLHMsbyxhLGwpe2NvbnN0IGM9bmV3IGRjKHQsZSxuLHIscyxvLGEsbCk7aWYodGhpcy5jdXJ2ZXMubGVuZ3RoPjApe2NvbnN0IGg9Yy5nZXRQb2ludCgwKTtoLmVxdWFscyh0aGlzLmN1cnJlbnRQb2ludCl8fHRoaXMubGluZVRvKGgueCxoLnkpfXRoaXMuY3VydmVzLnB1c2goYyk7Y29uc3QgdT1jLmdldFBvaW50KDEpO3JldHVybiB0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHUpLHRoaXN9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHQuY3VycmVudFBvaW50KSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQuY3VycmVudFBvaW50PXRoaXMuY3VycmVudFBvaW50LnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLmN1cnJlbnRQb2ludC5mcm9tQXJyYXkodC5jdXJyZW50UG9pbnQpLHRoaXN9fTtjbGFzcyBKbyBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9W25ldyBxKDAsLS41KSxuZXcgcSguNSwwKSxuZXcgcSgwLC41KV0sZT0xMixuPTAscj1NYXRoLlBJKjIpe3N1cGVyKCksdGhpcy50eXBlPSJMYXRoZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3BvaW50czp0LHNlZ21lbnRzOmUscGhpU3RhcnQ6bixwaGlMZW5ndGg6cn0sZT1NYXRoLmZsb29yKGUpLHI9eGUociwwLE1hdGguUEkqMik7Y29uc3Qgcz1bXSxvPVtdLGE9W10sbD1bXSxjPVtdLHU9MS9lLGg9bmV3IEwsZj1uZXcgcSxkPW5ldyBMLHA9bmV3IEwseT1uZXcgTDtsZXQgbT0wLGc9MDtmb3IobGV0IHg9MDt4PD10Lmxlbmd0aC0xO3grKylzd2l0Y2goeCl7Y2FzZSAwOm09dFt4KzFdLngtdFt4XS54LGc9dFt4KzFdLnktdFt4XS55LGQueD1nKjEsZC55PS1tLGQuej1nKjAseS5jb3B5KGQpLGQubm9ybWFsaXplKCksbC5wdXNoKGQueCxkLnksZC56KTticmVhaztjYXNlIHQubGVuZ3RoLTE6bC5wdXNoKHkueCx5LnkseS56KTticmVhaztkZWZhdWx0Om09dFt4KzFdLngtdFt4XS54LGc9dFt4KzFdLnktdFt4XS55LGQueD1nKjEsZC55PS1tLGQuej1nKjAscC5jb3B5KGQpLGQueCs9eS54LGQueSs9eS55LGQueis9eS56LGQubm9ybWFsaXplKCksbC5wdXNoKGQueCxkLnksZC56KSx5LmNvcHkocCl9Zm9yKGxldCB4PTA7eDw9ZTt4Kyspe2NvbnN0IHY9bit4KnUqcixfPU1hdGguc2luKHYpLEU9TWF0aC5jb3Modik7Zm9yKGxldCBiPTA7Yjw9dC5sZW5ndGgtMTtiKyspe2gueD10W2JdLngqXyxoLnk9dFtiXS55LGguej10W2JdLngqRSxvLnB1c2goaC54LGgueSxoLnopLGYueD14L2UsZi55PWIvKHQubGVuZ3RoLTEpLGEucHVzaChmLngsZi55KTtjb25zdCBUPWxbMypiKzBdKl8sUD1sWzMqYisxXSx3PWxbMypiKzBdKkU7Yy5wdXNoKFQsUCx3KX19Zm9yKGxldCB4PTA7eDxlO3grKylmb3IobGV0IHY9MDt2PHQubGVuZ3RoLTE7disrKXtjb25zdCBfPXYreCp0Lmxlbmd0aCxFPV8sYj1fK3QubGVuZ3RoLFQ9Xyt0Lmxlbmd0aCsxLFA9XysxO3MucHVzaChFLGIsUCkscy5wdXNoKFQsUCxiKX10aGlzLnNldEluZGV4KHMpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFN0KG8sMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFN0KGEsMikpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBTdChjLDMpKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc31zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBKbyh0LnBvaW50cyx0LnNlZ21lbnRzLHQucGhpU3RhcnQsdC5waGlMZW5ndGgpfX1jbGFzcyBnYyBleHRlbmRzIEpve2NvbnN0cnVjdG9yKHQ9MSxlPTEsbj00LHI9OCl7Y29uc3Qgcz1uZXcgWm87cy5hYnNhcmMoMCwtZS8yLHQsTWF0aC5QSSoxLjUsMCkscy5hYnNhcmMoMCxlLzIsdCwwLE1hdGguUEkqLjUpLHN1cGVyKHMuZ2V0UG9pbnRzKG4pLHIpLHRoaXMudHlwZT0iQ2Fwc3VsZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LGxlbmd0aDplLGNhcFNlZ21lbnRzOm4scmFkaWFsU2VnbWVudHM6cn19c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgZ2ModC5yYWRpdXMsdC5sZW5ndGgsdC5jYXBTZWdtZW50cyx0LnJhZGlhbFNlZ21lbnRzKX19Y2xhc3MgeWMgZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcih0PTEsZT0zMixuPTAscj1NYXRoLlBJKjIpe3N1cGVyKCksdGhpcy50eXBlPSJDaXJjbGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxzZWdtZW50czplLHRoZXRhU3RhcnQ6bix0aGV0YUxlbmd0aDpyfSxlPU1hdGgubWF4KDMsZSk7Y29uc3Qgcz1bXSxvPVtdLGE9W10sbD1bXSxjPW5ldyBMLHU9bmV3IHE7by5wdXNoKDAsMCwwKSxhLnB1c2goMCwwLDEpLGwucHVzaCguNSwuNSk7Zm9yKGxldCBoPTAsZj0zO2g8PWU7aCsrLGYrPTMpe2NvbnN0IGQ9bitoL2UqcjtjLng9dCpNYXRoLmNvcyhkKSxjLnk9dCpNYXRoLnNpbihkKSxvLnB1c2goYy54LGMueSxjLnopLGEucHVzaCgwLDAsMSksdS54PShvW2ZdL3QrMSkvMix1Lnk9KG9bZisxXS90KzEpLzIsbC5wdXNoKHUueCx1LnkpfWZvcihsZXQgaD0xO2g8PWU7aCsrKXMucHVzaChoLGgrMSwwKTt0aGlzLnNldEluZGV4KHMpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFN0KG8sMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBTdChhLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBTdChsLDIpKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc31zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyB5Yyh0LnJhZGl1cyx0LnNlZ21lbnRzLHQudGhldGFTdGFydCx0LnRoZXRhTGVuZ3RoKX19Y2xhc3MgVXMgZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxyPTMyLHM9MSxvPSExLGE9MCxsPU1hdGguUEkqMil7c3VwZXIoKSx0aGlzLnR5cGU9IkN5bGluZGVyR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzVG9wOnQscmFkaXVzQm90dG9tOmUsaGVpZ2h0Om4scmFkaWFsU2VnbWVudHM6cixoZWlnaHRTZWdtZW50czpzLG9wZW5FbmRlZDpvLHRoZXRhU3RhcnQ6YSx0aGV0YUxlbmd0aDpsfTtjb25zdCBjPXRoaXM7cj1NYXRoLmZsb29yKHIpLHM9TWF0aC5mbG9vcihzKTtjb25zdCB1PVtdLGg9W10sZj1bXSxkPVtdO2xldCBwPTA7Y29uc3QgeT1bXSxtPW4vMjtsZXQgZz0wO3goKSxvPT09ITEmJih0PjAmJnYoITApLGU+MCYmdighMSkpLHRoaXMuc2V0SW5kZXgodSksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU3QoaCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFN0KGYsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFN0KGQsMikpO2Z1bmN0aW9uIHgoKXtjb25zdCBfPW5ldyBMLEU9bmV3IEw7bGV0IGI9MDtjb25zdCBUPShlLXQpL247Zm9yKGxldCBQPTA7UDw9cztQKyspe2NvbnN0IHc9W10sTT1QL3MsQT1NKihlLXQpK3Q7Zm9yKGxldCBGPTA7Rjw9cjtGKyspe2NvbnN0IEQ9Ri9yLE49RCpsK2EsVT1NYXRoLnNpbihOKSxCPU1hdGguY29zKE4pO0UueD1BKlUsRS55PS1NKm4rbSxFLno9QSpCLGgucHVzaChFLngsRS55LEUueiksXy5zZXQoVSxULEIpLm5vcm1hbGl6ZSgpLGYucHVzaChfLngsXy55LF8ueiksZC5wdXNoKEQsMS1NKSx3LnB1c2gocCsrKX15LnB1c2godyl9Zm9yKGxldCBQPTA7UDxyO1ArKylmb3IobGV0IHc9MDt3PHM7dysrKXtjb25zdCBNPXlbd11bUF0sQT15W3crMV1bUF0sRj15W3crMV1bUCsxXSxEPXlbd11bUCsxXTt1LnB1c2goTSxBLEQpLHUucHVzaChBLEYsRCksYis9Nn1jLmFkZEdyb3VwKGcsYiwwKSxnKz1ifWZ1bmN0aW9uIHYoXyl7Y29uc3QgRT1wLGI9bmV3IHEsVD1uZXcgTDtsZXQgUD0wO2NvbnN0IHc9Xz09PSEwP3Q6ZSxNPV89PT0hMD8xOi0xO2ZvcihsZXQgRj0xO0Y8PXI7RisrKWgucHVzaCgwLG0qTSwwKSxmLnB1c2goMCxNLDApLGQucHVzaCguNSwuNSkscCsrO2NvbnN0IEE9cDtmb3IobGV0IEY9MDtGPD1yO0YrKyl7Y29uc3QgTj1GL3IqbCthLFU9TWF0aC5jb3MoTiksQj1NYXRoLnNpbihOKTtULng9dypCLFQueT1tKk0sVC56PXcqVSxoLnB1c2goVC54LFQueSxULnopLGYucHVzaCgwLE0sMCksYi54PVUqLjUrLjUsYi55PUIqLjUqTSsuNSxkLnB1c2goYi54LGIueSkscCsrfWZvcihsZXQgRj0wO0Y8cjtGKyspe2NvbnN0IEQ9RStGLE49QStGO189PT0hMD91LnB1c2goTixOKzEsRCk6dS5wdXNoKE4rMSxOLEQpLFArPTN9Yy5hZGRHcm91cChnLFAsXz09PSEwPzE6MiksZys9UH19Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgVXModC5yYWRpdXNUb3AsdC5yYWRpdXNCb3R0b20sdC5oZWlnaHQsdC5yYWRpYWxTZWdtZW50cyx0LmhlaWdodFNlZ21lbnRzLHQub3BlbkVuZGVkLHQudGhldGFTdGFydCx0LnRoZXRhTGVuZ3RoKX19Y2xhc3MgdmMgZXh0ZW5kcyBVc3tjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MzIscj0xLHM9ITEsbz0wLGE9TWF0aC5QSSoyKXtzdXBlcigwLHQsZSxuLHIscyxvLGEpLHRoaXMudHlwZT0iQ29uZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LGhlaWdodDplLHJhZGlhbFNlZ21lbnRzOm4saGVpZ2h0U2VnbWVudHM6cixvcGVuRW5kZWQ6cyx0aGV0YVN0YXJ0Om8sdGhldGFMZW5ndGg6YX19c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgdmModC5yYWRpdXMsdC5oZWlnaHQsdC5yYWRpYWxTZWdtZW50cyx0LmhlaWdodFNlZ21lbnRzLHQub3BlbkVuZGVkLHQudGhldGFTdGFydCx0LnRoZXRhTGVuZ3RoKX19Y2xhc3MgS2kgZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcih0PVtdLGU9W10sbj0xLHI9MCl7c3VwZXIoKSx0aGlzLnR5cGU9IlBvbHloZWRyb25HZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXt2ZXJ0aWNlczp0LGluZGljZXM6ZSxyYWRpdXM6bixkZXRhaWw6cn07Y29uc3Qgcz1bXSxvPVtdO2EociksYyhuKSx1KCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU3QocywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFN0KHMuc2xpY2UoKSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgU3QobywyKSkscj09PTA/dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOnRoaXMubm9ybWFsaXplTm9ybWFscygpO2Z1bmN0aW9uIGEoeCl7Y29uc3Qgdj1uZXcgTCxfPW5ldyBMLEU9bmV3IEw7Zm9yKGxldCBiPTA7YjxlLmxlbmd0aDtiKz0zKWQoZVtiKzBdLHYpLGQoZVtiKzFdLF8pLGQoZVtiKzJdLEUpLGwodixfLEUseCl9ZnVuY3Rpb24gbCh4LHYsXyxFKXtjb25zdCBiPUUrMSxUPVtdO2ZvcihsZXQgUD0wO1A8PWI7UCsrKXtUW1BdPVtdO2NvbnN0IHc9eC5jbG9uZSgpLmxlcnAoXyxQL2IpLE09di5jbG9uZSgpLmxlcnAoXyxQL2IpLEE9Yi1QO2ZvcihsZXQgRj0wO0Y8PUE7RisrKUY9PT0wJiZQPT09Yj9UW1BdW0ZdPXc6VFtQXVtGXT13LmNsb25lKCkubGVycChNLEYvQSl9Zm9yKGxldCBQPTA7UDxiO1ArKylmb3IobGV0IHc9MDt3PDIqKGItUCktMTt3Kyspe2NvbnN0IE09TWF0aC5mbG9vcih3LzIpO3clMj09PTA/KGYoVFtQXVtNKzFdKSxmKFRbUCsxXVtNXSksZihUW1BdW01dKSk6KGYoVFtQXVtNKzFdKSxmKFRbUCsxXVtNKzFdKSxmKFRbUCsxXVtNXSkpfX1mdW5jdGlvbiBjKHgpe2NvbnN0IHY9bmV3IEw7Zm9yKGxldCBfPTA7XzxzLmxlbmd0aDtfKz0zKXYueD1zW18rMF0sdi55PXNbXysxXSx2Lno9c1tfKzJdLHYubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoeCksc1tfKzBdPXYueCxzW18rMV09di55LHNbXysyXT12Lnp9ZnVuY3Rpb24gdSgpe2NvbnN0IHg9bmV3IEw7Zm9yKGxldCB2PTA7djxzLmxlbmd0aDt2Kz0zKXt4Lng9c1t2KzBdLHgueT1zW3YrMV0seC56PXNbdisyXTtjb25zdCBfPW0oeCkvMi9NYXRoLlBJKy41LEU9Zyh4KS9NYXRoLlBJKy41O28ucHVzaChfLDEtRSl9cCgpLGgoKX1mdW5jdGlvbiBoKCl7Zm9yKGxldCB4PTA7eDxvLmxlbmd0aDt4Kz02KXtjb25zdCB2PW9beCswXSxfPW9beCsyXSxFPW9beCs0XSxiPU1hdGgubWF4KHYsXyxFKSxUPU1hdGgubWluKHYsXyxFKTtiPi45JiZUPC4xJiYodjwuMiYmKG9beCswXSs9MSksXzwuMiYmKG9beCsyXSs9MSksRTwuMiYmKG9beCs0XSs9MSkpfX1mdW5jdGlvbiBmKHgpe3MucHVzaCh4LngseC55LHgueil9ZnVuY3Rpb24gZCh4LHYpe2NvbnN0IF89eCozO3YueD10W18rMF0sdi55PXRbXysxXSx2Lno9dFtfKzJdfWZ1bmN0aW9uIHAoKXtjb25zdCB4PW5ldyBMLHY9bmV3IEwsXz1uZXcgTCxFPW5ldyBMLGI9bmV3IHEsVD1uZXcgcSxQPW5ldyBxO2ZvcihsZXQgdz0wLE09MDt3PHMubGVuZ3RoO3crPTksTSs9Nil7eC5zZXQoc1t3KzBdLHNbdysxXSxzW3crMl0pLHYuc2V0KHNbdyszXSxzW3crNF0sc1t3KzVdKSxfLnNldChzW3crNl0sc1t3KzddLHNbdys4XSksYi5zZXQob1tNKzBdLG9bTSsxXSksVC5zZXQob1tNKzJdLG9bTSszXSksUC5zZXQob1tNKzRdLG9bTSs1XSksRS5jb3B5KHgpLmFkZCh2KS5hZGQoXykuZGl2aWRlU2NhbGFyKDMpO2NvbnN0IEE9bShFKTt5KGIsTSswLHgsQSkseShULE0rMix2LEEpLHkoUCxNKzQsXyxBKX19ZnVuY3Rpb24geSh4LHYsXyxFKXtFPDAmJngueD09PTEmJihvW3ZdPXgueC0xKSxfLng9PT0wJiZfLno9PT0wJiYob1t2XT1FLzIvTWF0aC5QSSsuNSl9ZnVuY3Rpb24gbSh4KXtyZXR1cm4gTWF0aC5hdGFuMih4LnosLXgueCl9ZnVuY3Rpb24gZyh4KXtyZXR1cm4gTWF0aC5hdGFuMigteC55LE1hdGguc3FydCh4LngqeC54K3gueip4LnopKX19Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgS2kodC52ZXJ0aWNlcyx0LmluZGljZXMsdC5yYWRpdXMsdC5kZXRhaWxzKX19Y2xhc3MgX2MgZXh0ZW5kcyBLaXtjb25zdHJ1Y3Rvcih0PTEsZT0wKXtjb25zdCBuPSgxK01hdGguc3FydCg1KSkvMixyPTEvbixzPVstMSwtMSwtMSwtMSwtMSwxLC0xLDEsLTEsLTEsMSwxLDEsLTEsLTEsMSwtMSwxLDEsMSwtMSwxLDEsMSwwLC1yLC1uLDAsLXIsbiwwLHIsLW4sMCxyLG4sLXIsLW4sMCwtcixuLDAsciwtbiwwLHIsbiwwLC1uLDAsLXIsbiwwLC1yLC1uLDAscixuLDAscl0sbz1bMywxMSw3LDMsNywxNSwzLDE1LDEzLDcsMTksMTcsNywxNyw2LDcsNiwxNSwxNyw0LDgsMTcsOCwxMCwxNywxMCw2LDgsMCwxNiw4LDE2LDIsOCwyLDEwLDAsMTIsMSwwLDEsMTgsMCwxOCwxNiw2LDEwLDIsNiwyLDEzLDYsMTMsMTUsMiwxNiwxOCwyLDE4LDMsMiwzLDEzLDE4LDEsOSwxOCw5LDExLDE4LDExLDMsNCwxNCwxMiw0LDEyLDAsNCwwLDgsMTEsOSw1LDExLDUsMTksMTEsMTksNywxOSw1LDE0LDE5LDE0LDQsMTksNCwxNywxLDEyLDE0LDEsMTQsNSwxLDUsOV07c3VwZXIocyxvLHQsZSksdGhpcy50eXBlPSJEb2RlY2FoZWRyb25HZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxkZXRhaWw6ZX19c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgX2ModC5yYWRpdXMsdC5kZXRhaWwpfX1jb25zdCB4Yz1uZXcgTCxNYz1uZXcgTCxEZj1uZXcgTCxTYz1uZXcgU247Y2xhc3MgVzAgZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcih0PW51bGwsZT0xKXtpZihzdXBlcigpLHRoaXMudHlwZT0iRWRnZXNHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtnZW9tZXRyeTp0LHRocmVzaG9sZEFuZ2xlOmV9LHQhPT1udWxsKXtjb25zdCByPU1hdGgucG93KDEwLDQpLHM9TWF0aC5jb3MoZ3IqZSksbz10LmdldEluZGV4KCksYT10LmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxsPW8/by5jb3VudDphLmNvdW50LGM9WzAsMCwwXSx1PVsiYSIsImIiLCJjIl0saD1uZXcgQXJyYXkoMyksZj17fSxkPVtdO2ZvcihsZXQgcD0wO3A8bDtwKz0zKXtvPyhjWzBdPW8uZ2V0WChwKSxjWzFdPW8uZ2V0WChwKzEpLGNbMl09by5nZXRYKHArMikpOihjWzBdPXAsY1sxXT1wKzEsY1syXT1wKzIpO2NvbnN0e2E6eSxiOm0sYzpnfT1TYztpZih5LmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxjWzBdKSxtLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxjWzFdKSxnLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxjWzJdKSxTYy5nZXROb3JtYWwoRGYpLGhbMF09YCR7TWF0aC5yb3VuZCh5Lngqcil9LCR7TWF0aC5yb3VuZCh5Lnkqcil9LCR7TWF0aC5yb3VuZCh5Lnoqcil9YCxoWzFdPWAke01hdGgucm91bmQobS54KnIpfSwke01hdGgucm91bmQobS55KnIpfSwke01hdGgucm91bmQobS56KnIpfWAsaFsyXT1gJHtNYXRoLnJvdW5kKGcueCpyKX0sJHtNYXRoLnJvdW5kKGcueSpyKX0sJHtNYXRoLnJvdW5kKGcueipyKX1gLCEoaFswXT09PWhbMV18fGhbMV09PT1oWzJdfHxoWzJdPT09aFswXSkpZm9yKGxldCB4PTA7eDwzO3grKyl7Y29uc3Qgdj0oeCsxKSUzLF89aFt4XSxFPWhbdl0sYj1TY1t1W3hdXSxUPVNjW3Vbdl1dLFA9YCR7X31fJHtFfWAsdz1gJHtFfV8ke199YDt3IGluIGYmJmZbd10/KERmLmRvdChmW3ddLm5vcm1hbCk8PXMmJihkLnB1c2goYi54LGIueSxiLnopLGQucHVzaChULngsVC55LFQueikpLGZbd109bnVsbCk6UCBpbiBmfHwoZltQXT17aW5kZXgwOmNbeF0saW5kZXgxOmNbdl0sbm9ybWFsOkRmLmNsb25lKCl9KX19Zm9yKGNvbnN0IHAgaW4gZilpZihmW3BdKXtjb25zdHtpbmRleDA6eSxpbmRleDE6bX09ZltwXTt4Yy5mcm9tQnVmZmVyQXR0cmlidXRlKGEseSksTWMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLG0pLGQucHVzaCh4Yy54LHhjLnkseGMueiksZC5wdXNoKE1jLngsTWMueSxNYy56KX10aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTdChkLDMpKX19Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9fWNsYXNzIHdpIGV4dGVuZHMgWm97Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy51dWlkPV9uKCksdGhpcy50eXBlPSJTaGFwZSIsdGhpcy5ob2xlcz1bXX1nZXRQb2ludHNIb2xlcyh0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wLHI9dGhpcy5ob2xlcy5sZW5ndGg7bjxyO24rKyllW25dPXRoaXMuaG9sZXNbbl0uZ2V0UG9pbnRzKHQpO3JldHVybiBlfWV4dHJhY3RQb2ludHModCl7cmV0dXJue3NoYXBlOnRoaXMuZ2V0UG9pbnRzKHQpLGhvbGVzOnRoaXMuZ2V0UG9pbnRzSG9sZXModCl9fWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLmhvbGVzPVtdO2ZvcihsZXQgZT0wLG49dC5ob2xlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcj10LmhvbGVzW2VdO3RoaXMuaG9sZXMucHVzaChyLmNsb25lKCkpfXJldHVybiB0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC51dWlkPXRoaXMudXVpZCx0LmhvbGVzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5ob2xlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcj10aGlzLmhvbGVzW2VdO3QuaG9sZXMucHVzaChyLnRvSlNPTigpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnV1aWQ9dC51dWlkLHRoaXMuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10LmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCByPXQuaG9sZXNbZV07dGhpcy5ob2xlcy5wdXNoKG5ldyBabygpLmZyb21KU09OKHIpKX1yZXR1cm4gdGhpc319Y29uc3QgQ1Q9e3RyaWFuZ3VsYXRlOmZ1bmN0aW9uKGksdCxlPTIpe2NvbnN0IG49dCYmdC5sZW5ndGgscj1uP3RbMF0qZTppLmxlbmd0aDtsZXQgcz0kMChpLDAscixlLCEwKTtjb25zdCBvPVtdO2lmKCFzfHxzLm5leHQ9PT1zLnByZXYpcmV0dXJuIG87bGV0IGEsbCxjLHUsaCxmLGQ7aWYobiYmKHM9RFQoaSx0LHMsZSkpLGkubGVuZ3RoPjgwKmUpe2E9Yz1pWzBdLGw9dT1pWzFdO2ZvcihsZXQgcD1lO3A8cjtwKz1lKWg9aVtwXSxmPWlbcCsxXSxoPGEmJihhPWgpLGY8bCYmKGw9ZiksaD5jJiYoYz1oKSxmPnUmJih1PWYpO2Q9TWF0aC5tYXgoYy1hLHUtbCksZD1kIT09MD8zMjc2Ny9kOjB9cmV0dXJuIEtvKHMsbyxlLGEsbCxkLDApLG99fTtmdW5jdGlvbiAkMChpLHQsZSxuLHIpe2xldCBzLG87aWYocj09PVdUKGksdCxlLG4pPjApZm9yKHM9dDtzPGU7cys9bilvPVkwKHMsaVtzXSxpW3MrMV0sbyk7ZWxzZSBmb3Iocz1lLW47cz49dDtzLT1uKW89WTAocyxpW3NdLGlbcysxXSxvKTtyZXR1cm4gbyYmYmMobyxvLm5leHQpJiYoUW8obyksbz1vLm5leHQpLG99ZnVuY3Rpb24gUnIoaSx0KXtpZighaSlyZXR1cm4gaTt0fHwodD1pKTtsZXQgZT1pLG47ZG8gaWYobj0hMSwhZS5zdGVpbmVyJiYoYmMoZSxlLm5leHQpfHx5ZShlLnByZXYsZSxlLm5leHQpPT09MCkpe2lmKFFvKGUpLGU9dD1lLnByZXYsZT09PWUubmV4dClicmVhaztuPSEwfWVsc2UgZT1lLm5leHQ7d2hpbGUobnx8ZSE9PXQpO3JldHVybiB0fWZ1bmN0aW9uIEtvKGksdCxlLG4scixzLG8pe2lmKCFpKXJldHVybjshbyYmcyYmQlQoaSxuLHIscyk7bGV0IGE9aSxsLGM7Zm9yKDtpLnByZXYhPT1pLm5leHQ7KXtpZihsPWkucHJldixjPWkubmV4dCxzP1BUKGksbixyLHMpOlJUKGkpKXt0LnB1c2gobC5pL2V8MCksdC5wdXNoKGkuaS9lfDApLHQucHVzaChjLmkvZXwwKSxRbyhpKSxpPWMubmV4dCxhPWMubmV4dDtjb250aW51ZX1pZihpPWMsaT09PWEpe28/bz09PTE/KGk9SVQoUnIoaSksdCxlKSxLbyhpLHQsZSxuLHIscywyKSk6bz09PTImJkxUKGksdCxlLG4scixzKTpLbyhScihpKSx0LGUsbixyLHMsMSk7YnJlYWt9fX1mdW5jdGlvbiBSVChpKXtjb25zdCB0PWkucHJldixlPWksbj1pLm5leHQ7aWYoeWUodCxlLG4pPj0wKXJldHVybiExO2NvbnN0IHI9dC54LHM9ZS54LG89bi54LGE9dC55LGw9ZS55LGM9bi55LHU9cjxzP3I8bz9yOm86czxvP3M6byxoPWE8bD9hPGM/YTpjOmw8Yz9sOmMsZj1yPnM/cj5vP3I6bzpzPm8/czpvLGQ9YT5sP2E+Yz9hOmM6bD5jP2w6YztsZXQgcD1uLm5leHQ7Zm9yKDtwIT09dDspe2lmKHAueD49dSYmcC54PD1mJiZwLnk+PWgmJnAueTw9ZCYmTnMocixhLHMsbCxvLGMscC54LHAueSkmJnllKHAucHJldixwLHAubmV4dCk+PTApcmV0dXJuITE7cD1wLm5leHR9cmV0dXJuITB9ZnVuY3Rpb24gUFQoaSx0LGUsbil7Y29uc3Qgcj1pLnByZXYscz1pLG89aS5uZXh0O2lmKHllKHIscyxvKT49MClyZXR1cm4hMTtjb25zdCBhPXIueCxsPXMueCxjPW8ueCx1PXIueSxoPXMueSxmPW8ueSxkPWE8bD9hPGM/YTpjOmw8Yz9sOmMscD11PGg/dTxmP3U6ZjpoPGY/aDpmLHk9YT5sP2E+Yz9hOmM6bD5jP2w6YyxtPXU+aD91PmY/dTpmOmg+Zj9oOmYsZz1VZihkLHAsdCxlLG4pLHg9VWYoeSxtLHQsZSxuKTtsZXQgdj1pLnByZXZaLF89aS5uZXh0Wjtmb3IoO3YmJnYuej49ZyYmXyYmXy56PD14Oyl7aWYodi54Pj1kJiZ2Lng8PXkmJnYueT49cCYmdi55PD1tJiZ2IT09ciYmdiE9PW8mJk5zKGEsdSxsLGgsYyxmLHYueCx2LnkpJiZ5ZSh2LnByZXYsdix2Lm5leHQpPj0wfHwodj12LnByZXZaLF8ueD49ZCYmXy54PD15JiZfLnk+PXAmJl8ueTw9bSYmXyE9PXImJl8hPT1vJiZOcyhhLHUsbCxoLGMsZixfLngsXy55KSYmeWUoXy5wcmV2LF8sXy5uZXh0KT49MCkpcmV0dXJuITE7Xz1fLm5leHRafWZvcig7diYmdi56Pj1nOyl7aWYodi54Pj1kJiZ2Lng8PXkmJnYueT49cCYmdi55PD1tJiZ2IT09ciYmdiE9PW8mJk5zKGEsdSxsLGgsYyxmLHYueCx2LnkpJiZ5ZSh2LnByZXYsdix2Lm5leHQpPj0wKXJldHVybiExO3Y9di5wcmV2Wn1mb3IoO18mJl8uejw9eDspe2lmKF8ueD49ZCYmXy54PD15JiZfLnk+PXAmJl8ueTw9bSYmXyE9PXImJl8hPT1vJiZOcyhhLHUsbCxoLGMsZixfLngsXy55KSYmeWUoXy5wcmV2LF8sXy5uZXh0KT49MClyZXR1cm4hMTtfPV8ubmV4dFp9cmV0dXJuITB9ZnVuY3Rpb24gSVQoaSx0LGUpe2xldCBuPWk7ZG97Y29uc3Qgcj1uLnByZXYscz1uLm5leHQubmV4dDshYmMocixzKSYmWDAocixuLG4ubmV4dCxzKSYmam8ocixzKSYmam8ocyxyKSYmKHQucHVzaChyLmkvZXwwKSx0LnB1c2gobi5pL2V8MCksdC5wdXNoKHMuaS9lfDApLFFvKG4pLFFvKG4ubmV4dCksbj1pPXMpLG49bi5uZXh0fXdoaWxlKG4hPT1pKTtyZXR1cm4gUnIobil9ZnVuY3Rpb24gTFQoaSx0LGUsbixyLHMpe2xldCBvPWk7ZG97bGV0IGE9by5uZXh0Lm5leHQ7Zm9yKDthIT09by5wcmV2Oyl7aWYoby5pIT09YS5pJiZHVChvLGEpKXtsZXQgbD1xMChvLGEpO289UnIobyxvLm5leHQpLGw9UnIobCxsLm5leHQpLEtvKG8sdCxlLG4scixzLDApLEtvKGwsdCxlLG4scixzLDApO3JldHVybn1hPWEubmV4dH1vPW8ubmV4dH13aGlsZShvIT09aSl9ZnVuY3Rpb24gRFQoaSx0LGUsbil7Y29uc3Qgcj1bXTtsZXQgcyxvLGEsbCxjO2ZvcihzPTAsbz10Lmxlbmd0aDtzPG87cysrKWE9dFtzXSpuLGw9czxvLTE/dFtzKzFdKm46aS5sZW5ndGgsYz0kMChpLGEsbCxuLCExKSxjPT09Yy5uZXh0JiYoYy5zdGVpbmVyPSEwKSxyLnB1c2goa1QoYykpO2ZvcihyLnNvcnQoVVQpLHM9MDtzPHIubGVuZ3RoO3MrKyllPU5UKHJbc10sZSk7cmV0dXJuIGV9ZnVuY3Rpb24gVVQoaSx0KXtyZXR1cm4gaS54LXQueH1mdW5jdGlvbiBOVChpLHQpe2NvbnN0IGU9RlQoaSx0KTtpZighZSlyZXR1cm4gdDtjb25zdCBuPXEwKGUsaSk7cmV0dXJuIFJyKG4sbi5uZXh0KSxScihlLGUubmV4dCl9ZnVuY3Rpb24gRlQoaSx0KXtsZXQgZT10LG49LTEvMCxyO2NvbnN0IHM9aS54LG89aS55O2Rve2lmKG88PWUueSYmbz49ZS5uZXh0LnkmJmUubmV4dC55IT09ZS55KXtjb25zdCBmPWUueCsoby1lLnkpKihlLm5leHQueC1lLngpLyhlLm5leHQueS1lLnkpO2lmKGY8PXMmJmY+biYmKG49ZixyPWUueDxlLm5leHQueD9lOmUubmV4dCxmPT09cykpcmV0dXJuIHJ9ZT1lLm5leHR9d2hpbGUoZSE9PXQpO2lmKCFyKXJldHVybiBudWxsO2NvbnN0IGE9cixsPXIueCxjPXIueTtsZXQgdT0xLzAsaDtlPXI7ZG8gcz49ZS54JiZlLng+PWwmJnMhPT1lLngmJk5zKG88Yz9zOm4sbyxsLGMsbzxjP246cyxvLGUueCxlLnkpJiYoaD1NYXRoLmFicyhvLWUueSkvKHMtZS54KSxqbyhlLGkpJiYoaDx1fHxoPT09dSYmKGUueD5yLnh8fGUueD09PXIueCYmT1QocixlKSkpJiYocj1lLHU9aCkpLGU9ZS5uZXh0O3doaWxlKGUhPT1hKTtyZXR1cm4gcn1mdW5jdGlvbiBPVChpLHQpe3JldHVybiB5ZShpLnByZXYsaSx0LnByZXYpPDAmJnllKHQubmV4dCxpLGkubmV4dCk8MH1mdW5jdGlvbiBCVChpLHQsZSxuKXtsZXQgcj1pO2RvIHIuej09PTAmJihyLno9VWYoci54LHIueSx0LGUsbikpLHIucHJldlo9ci5wcmV2LHIubmV4dFo9ci5uZXh0LHI9ci5uZXh0O3doaWxlKHIhPT1pKTtyLnByZXZaLm5leHRaPW51bGwsci5wcmV2Wj1udWxsLHpUKHIpfWZ1bmN0aW9uIHpUKGkpe2xldCB0LGUsbixyLHMsbyxhLGwsYz0xO2Rve2ZvcihlPWksaT1udWxsLHM9bnVsbCxvPTA7ZTspe2ZvcihvKyssbj1lLGE9MCx0PTA7dDxjJiYoYSsrLG49bi5uZXh0WiwhIW4pO3QrKyk7Zm9yKGw9YzthPjB8fGw+MCYmbjspYSE9PTAmJihsPT09MHx8IW58fGUuejw9bi56KT8ocj1lLGU9ZS5uZXh0WixhLS0pOihyPW4sbj1uLm5leHRaLGwtLSkscz9zLm5leHRaPXI6aT1yLHIucHJldlo9cyxzPXI7ZT1ufXMubmV4dFo9bnVsbCxjKj0yfXdoaWxlKG8+MSk7cmV0dXJuIGl9ZnVuY3Rpb24gVWYoaSx0LGUsbixyKXtyZXR1cm4gaT0oaS1lKSpyfDAsdD0odC1uKSpyfDAsaT0oaXxpPDw4KSYxNjcxMTkzNSxpPShpfGk8PDQpJjI1MjY0NTEzNSxpPShpfGk8PDIpJjg1ODk5MzQ1OSxpPShpfGk8PDEpJjE0MzE2NTU3NjUsdD0odHx0PDw4KSYxNjcxMTkzNSx0PSh0fHQ8PDQpJjI1MjY0NTEzNSx0PSh0fHQ8PDIpJjg1ODk5MzQ1OSx0PSh0fHQ8PDEpJjE0MzE2NTU3NjUsaXx0PDwxfWZ1bmN0aW9uIGtUKGkpe2xldCB0PWksZT1pO2RvKHQueDxlLnh8fHQueD09PWUueCYmdC55PGUueSkmJihlPXQpLHQ9dC5uZXh0O3doaWxlKHQhPT1pKTtyZXR1cm4gZX1mdW5jdGlvbiBOcyhpLHQsZSxuLHIscyxvLGEpe3JldHVybihyLW8pKih0LWEpPj0oaS1vKSoocy1hKSYmKGktbykqKG4tYSk+PShlLW8pKih0LWEpJiYoZS1vKSoocy1hKT49KHItbykqKG4tYSl9ZnVuY3Rpb24gR1QoaSx0KXtyZXR1cm4gaS5uZXh0LmkhPT10LmkmJmkucHJldi5pIT09dC5pJiYhVlQoaSx0KSYmKGpvKGksdCkmJmpvKHQsaSkmJkhUKGksdCkmJih5ZShpLnByZXYsaSx0LnByZXYpfHx5ZShpLHQucHJldix0KSl8fGJjKGksdCkmJnllKGkucHJldixpLGkubmV4dCk+MCYmeWUodC5wcmV2LHQsdC5uZXh0KT4wKX1mdW5jdGlvbiB5ZShpLHQsZSl7cmV0dXJuKHQueS1pLnkpKihlLngtdC54KS0odC54LWkueCkqKGUueS10LnkpfWZ1bmN0aW9uIGJjKGksdCl7cmV0dXJuIGkueD09PXQueCYmaS55PT09dC55fWZ1bmN0aW9uIFgwKGksdCxlLG4pe2NvbnN0IHI9QWMoeWUoaSx0LGUpKSxzPUFjKHllKGksdCxuKSksbz1BYyh5ZShlLG4saSkpLGE9QWMoeWUoZSxuLHQpKTtyZXR1cm4hIShyIT09cyYmbyE9PWF8fHI9PT0wJiZ3YyhpLGUsdCl8fHM9PT0wJiZ3YyhpLG4sdCl8fG89PT0wJiZ3YyhlLGksbil8fGE9PT0wJiZ3YyhlLHQsbikpfWZ1bmN0aW9uIHdjKGksdCxlKXtyZXR1cm4gdC54PD1NYXRoLm1heChpLngsZS54KSYmdC54Pj1NYXRoLm1pbihpLngsZS54KSYmdC55PD1NYXRoLm1heChpLnksZS55KSYmdC55Pj1NYXRoLm1pbihpLnksZS55KX1mdW5jdGlvbiBBYyhpKXtyZXR1cm4gaT4wPzE6aTwwPy0xOjB9ZnVuY3Rpb24gVlQoaSx0KXtsZXQgZT1pO2Rve2lmKGUuaSE9PWkuaSYmZS5uZXh0LmkhPT1pLmkmJmUuaSE9PXQuaSYmZS5uZXh0LmkhPT10LmkmJlgwKGUsZS5uZXh0LGksdCkpcmV0dXJuITA7ZT1lLm5leHR9d2hpbGUoZSE9PWkpO3JldHVybiExfWZ1bmN0aW9uIGpvKGksdCl7cmV0dXJuIHllKGkucHJldixpLGkubmV4dCk8MD95ZShpLHQsaS5uZXh0KT49MCYmeWUoaSxpLnByZXYsdCk+PTA6eWUoaSx0LGkucHJldik8MHx8eWUoaSxpLm5leHQsdCk8MH1mdW5jdGlvbiBIVChpLHQpe2xldCBlPWksbj0hMTtjb25zdCByPShpLngrdC54KS8yLHM9KGkueSt0LnkpLzI7ZG8gZS55PnMhPWUubmV4dC55PnMmJmUubmV4dC55IT09ZS55JiZyPChlLm5leHQueC1lLngpKihzLWUueSkvKGUubmV4dC55LWUueSkrZS54JiYobj0hbiksZT1lLm5leHQ7d2hpbGUoZSE9PWkpO3JldHVybiBufWZ1bmN0aW9uIHEwKGksdCl7Y29uc3QgZT1uZXcgTmYoaS5pLGkueCxpLnkpLG49bmV3IE5mKHQuaSx0LngsdC55KSxyPWkubmV4dCxzPXQucHJldjtyZXR1cm4gaS5uZXh0PXQsdC5wcmV2PWksZS5uZXh0PXIsci5wcmV2PWUsbi5uZXh0PWUsZS5wcmV2PW4scy5uZXh0PW4sbi5wcmV2PXMsbn1mdW5jdGlvbiBZMChpLHQsZSxuKXtjb25zdCByPW5ldyBOZihpLHQsZSk7cmV0dXJuIG4/KHIubmV4dD1uLm5leHQsci5wcmV2PW4sbi5uZXh0LnByZXY9cixuLm5leHQ9cik6KHIucHJldj1yLHIubmV4dD1yKSxyfWZ1bmN0aW9uIFFvKGkpe2kubmV4dC5wcmV2PWkucHJldixpLnByZXYubmV4dD1pLm5leHQsaS5wcmV2WiYmKGkucHJldloubmV4dFo9aS5uZXh0WiksaS5uZXh0WiYmKGkubmV4dFoucHJldlo9aS5wcmV2Wil9ZnVuY3Rpb24gTmYoaSx0LGUpe3RoaXMuaT1pLHRoaXMueD10LHRoaXMueT1lLHRoaXMucHJldj1udWxsLHRoaXMubmV4dD1udWxsLHRoaXMuej0wLHRoaXMucHJldlo9bnVsbCx0aGlzLm5leHRaPW51bGwsdGhpcy5zdGVpbmVyPSExfWZ1bmN0aW9uIFdUKGksdCxlLG4pe2xldCByPTA7Zm9yKGxldCBzPXQsbz1lLW47czxlO3MrPW4pcis9KGlbb10taVtzXSkqKGlbcysxXStpW28rMV0pLG89cztyZXR1cm4gcn1jbGFzcyB3bntzdGF0aWMgYXJlYSh0KXtjb25zdCBlPXQubGVuZ3RoO2xldCBuPTA7Zm9yKGxldCByPWUtMSxzPTA7czxlO3I9cysrKW4rPXRbcl0ueCp0W3NdLnktdFtzXS54KnRbcl0ueTtyZXR1cm4gbiouNX1zdGF0aWMgaXNDbG9ja1dpc2UodCl7cmV0dXJuIHduLmFyZWEodCk8MH1zdGF0aWMgdHJpYW5ndWxhdGVTaGFwZSh0LGUpe2NvbnN0IG49W10scj1bXSxzPVtdO1owKHQpLEowKG4sdCk7bGV0IG89dC5sZW5ndGg7ZS5mb3JFYWNoKFowKTtmb3IobGV0IGw9MDtsPGUubGVuZ3RoO2wrKylyLnB1c2gobyksbys9ZVtsXS5sZW5ndGgsSjAobixlW2xdKTtjb25zdCBhPUNULnRyaWFuZ3VsYXRlKG4scik7Zm9yKGxldCBsPTA7bDxhLmxlbmd0aDtsKz0zKXMucHVzaChhLnNsaWNlKGwsbCszKSk7cmV0dXJuIHN9fWZ1bmN0aW9uIFowKGkpe2NvbnN0IHQ9aS5sZW5ndGg7dD4yJiZpW3QtMV0uZXF1YWxzKGlbMF0pJiZpLnBvcCgpfWZ1bmN0aW9uIEowKGksdCl7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaS5wdXNoKHRbZV0ueCksaS5wdXNoKHRbZV0ueSl9bGV0IEswPWNsYXNzIENTIGV4dGVuZHMgTnR7Y29uc3RydWN0b3IodD1uZXcgd2koW25ldyBxKC41LC41KSxuZXcgcSgtLjUsLjUpLG5ldyBxKC0uNSwtLjUpLG5ldyBxKC41LC0uNSldKSxlPXt9KXtzdXBlcigpLHRoaXMudHlwZT0iRXh0cnVkZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczp0LG9wdGlvbnM6ZX0sdD1BcnJheS5pc0FycmF5KHQpP3Q6W3RdO2NvbnN0IG49dGhpcyxyPVtdLHM9W107Zm9yKGxldCBhPTAsbD10Lmxlbmd0aDthPGw7YSsrKXtjb25zdCBjPXRbYV07byhjKX10aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTdChyLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBTdChzLDIpKSx0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7ZnVuY3Rpb24gbyhhKXtjb25zdCBsPVtdLGM9ZS5jdXJ2ZVNlZ21lbnRzIT09dm9pZCAwP2UuY3VydmVTZWdtZW50czoxMix1PWUuc3RlcHMhPT12b2lkIDA/ZS5zdGVwczoxLGg9ZS5kZXB0aCE9PXZvaWQgMD9lLmRlcHRoOjE7bGV0IGY9ZS5iZXZlbEVuYWJsZWQhPT12b2lkIDA/ZS5iZXZlbEVuYWJsZWQ6ITAsZD1lLmJldmVsVGhpY2tuZXNzIT09dm9pZCAwP2UuYmV2ZWxUaGlja25lc3M6LjIscD1lLmJldmVsU2l6ZSE9PXZvaWQgMD9lLmJldmVsU2l6ZTpkLS4xLHk9ZS5iZXZlbE9mZnNldCE9PXZvaWQgMD9lLmJldmVsT2Zmc2V0OjAsbT1lLmJldmVsU2VnbWVudHMhPT12b2lkIDA/ZS5iZXZlbFNlZ21lbnRzOjM7Y29uc3QgZz1lLmV4dHJ1ZGVQYXRoLHg9ZS5VVkdlbmVyYXRvciE9PXZvaWQgMD9lLlVWR2VuZXJhdG9yOiRUO2xldCB2LF89ITEsRSxiLFQsUDtnJiYodj1nLmdldFNwYWNlZFBvaW50cyh1KSxfPSEwLGY9ITEsRT1nLmNvbXB1dGVGcmVuZXRGcmFtZXModSwhMSksYj1uZXcgTCxUPW5ldyBMLFA9bmV3IEwpLGZ8fChtPTAsZD0wLHA9MCx5PTApO2NvbnN0IHc9YS5leHRyYWN0UG9pbnRzKGMpO2xldCBNPXcuc2hhcGU7Y29uc3QgQT13LmhvbGVzO2lmKCF3bi5pc0Nsb2NrV2lzZShNKSl7TT1NLnJldmVyc2UoKTtmb3IobGV0IEk9MCxvdD1BLmxlbmd0aDtJPG90O0krKyl7Y29uc3QgaXQ9QVtJXTt3bi5pc0Nsb2NrV2lzZShpdCkmJihBW0ldPWl0LnJldmVyc2UoKSl9fWNvbnN0IEQ9d24udHJpYW5ndWxhdGVTaGFwZShNLEEpLE49TTtmb3IobGV0IEk9MCxvdD1BLmxlbmd0aDtJPG90O0krKyl7Y29uc3QgaXQ9QVtJXTtNPU0uY29uY2F0KGl0KX1mdW5jdGlvbiBVKEksb3QsaXQpe3JldHVybiBvdHx8Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3QiKSxJLmNsb25lKCkuYWRkU2NhbGVkVmVjdG9yKG90LGl0KX1jb25zdCBCPU0ubGVuZ3RoLEg9RC5sZW5ndGg7ZnVuY3Rpb24gRyhJLG90LGl0KXtsZXQgbXQsUSxQdDtjb25zdCAkPUkueC1vdC54LEo9SS55LW90LnksUj1pdC54LUkueCxTPWl0LnktSS55LE89JCokK0oqSixZPSQqUy1KKlI7aWYoTWF0aC5hYnMoWSk+TnVtYmVyLkVQU0lMT04pe2NvbnN0IFo9TWF0aC5zcXJ0KE8pLGo9TWF0aC5zcXJ0KFIqUitTKlMpLF90PW90LngtSi9aLGF0PW90LnkrJC9aLGd0PWl0LngtUy9qLGt0PWl0LnkrUi9qLHN0PSgoZ3QtX3QpKlMtKGt0LWF0KSpSKS8oJCpTLUoqUik7bXQ9X3QrJCpzdC1JLngsUT1hdCtKKnN0LUkueTtjb25zdCB5dD1tdCptdCtRKlE7aWYoeXQ8PTIpcmV0dXJuIG5ldyBxKG10LFEpO1B0PU1hdGguc3FydCh5dC8yKX1lbHNle2xldCBaPSExOyQ+TnVtYmVyLkVQU0lMT04/Uj5OdW1iZXIuRVBTSUxPTiYmKFo9ITApOiQ8LU51bWJlci5FUFNJTE9OP1I8LU51bWJlci5FUFNJTE9OJiYoWj0hMCk6TWF0aC5zaWduKEopPT09TWF0aC5zaWduKFMpJiYoWj0hMCksWj8obXQ9LUosUT0kLFB0PU1hdGguc3FydChPKSk6KG10PSQsUT1KLFB0PU1hdGguc3FydChPLzIpKX1yZXR1cm4gbmV3IHEobXQvUHQsUS9QdCl9Y29uc3QgdHQ9W107Zm9yKGxldCBJPTAsb3Q9Ti5sZW5ndGgsaXQ9b3QtMSxtdD1JKzE7STxvdDtJKyssaXQrKyxtdCsrKWl0PT09b3QmJihpdD0wKSxtdD09PW90JiYobXQ9MCksdHRbSV09RyhOW0ldLE5baXRdLE5bbXRdKTtjb25zdCBsdD1bXTtsZXQgaHQsUnQ9dHQuY29uY2F0KCk7Zm9yKGxldCBJPTAsb3Q9QS5sZW5ndGg7STxvdDtJKyspe2NvbnN0IGl0PUFbSV07aHQ9W107Zm9yKGxldCBtdD0wLFE9aXQubGVuZ3RoLFB0PVEtMSwkPW10KzE7bXQ8UTttdCsrLFB0KyssJCsrKVB0PT09USYmKFB0PTApLCQ9PT1RJiYoJD0wKSxodFttdF09RyhpdFttdF0saXRbUHRdLGl0WyRdKTtsdC5wdXNoKGh0KSxSdD1SdC5jb25jYXQoaHQpfWZvcihsZXQgST0wO0k8bTtJKyspe2NvbnN0IG90PUkvbSxpdD1kKk1hdGguY29zKG90Kk1hdGguUEkvMiksbXQ9cCpNYXRoLnNpbihvdCpNYXRoLlBJLzIpK3k7Zm9yKGxldCBRPTAsUHQ9Ti5sZW5ndGg7UTxQdDtRKyspe2NvbnN0ICQ9VShOW1FdLHR0W1FdLG10KTtwdCgkLngsJC55LC1pdCl9Zm9yKGxldCBRPTAsUHQ9QS5sZW5ndGg7UTxQdDtRKyspe2NvbnN0ICQ9QVtRXTtodD1sdFtRXTtmb3IobGV0IEo9MCxSPSQubGVuZ3RoO0o8UjtKKyspe2NvbnN0IFM9VSgkW0pdLGh0W0pdLG10KTtwdChTLngsUy55LC1pdCl9fX1jb25zdCBWdD1wK3k7Zm9yKGxldCBJPTA7STxCO0krKyl7Y29uc3Qgb3Q9Zj9VKE1bSV0sUnRbSV0sVnQpOk1bSV07Xz8oVC5jb3B5KEUubm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIob3QueCksYi5jb3B5KEUuYmlub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihvdC55KSxQLmNvcHkodlswXSkuYWRkKFQpLmFkZChiKSxwdChQLngsUC55LFAueikpOnB0KG90Lngsb3QueSwwKX1mb3IobGV0IEk9MTtJPD11O0krKylmb3IobGV0IG90PTA7b3Q8QjtvdCsrKXtjb25zdCBpdD1mP1UoTVtvdF0sUnRbb3RdLFZ0KTpNW290XTtfPyhULmNvcHkoRS5ub3JtYWxzW0ldKS5tdWx0aXBseVNjYWxhcihpdC54KSxiLmNvcHkoRS5iaW5vcm1hbHNbSV0pLm11bHRpcGx5U2NhbGFyKGl0LnkpLFAuY29weSh2W0ldKS5hZGQoVCkuYWRkKGIpLHB0KFAueCxQLnksUC56KSk6cHQoaXQueCxpdC55LGgvdSpJKX1mb3IobGV0IEk9bS0xO0k+PTA7SS0tKXtjb25zdCBvdD1JL20saXQ9ZCpNYXRoLmNvcyhvdCpNYXRoLlBJLzIpLG10PXAqTWF0aC5zaW4ob3QqTWF0aC5QSS8yKSt5O2ZvcihsZXQgUT0wLFB0PU4ubGVuZ3RoO1E8UHQ7USsrKXtjb25zdCAkPVUoTltRXSx0dFtRXSxtdCk7cHQoJC54LCQueSxoK2l0KX1mb3IobGV0IFE9MCxQdD1BLmxlbmd0aDtRPFB0O1ErKyl7Y29uc3QgJD1BW1FdO2h0PWx0W1FdO2ZvcihsZXQgSj0wLFI9JC5sZW5ndGg7SjxSO0orKyl7Y29uc3QgUz1VKCRbSl0saHRbSl0sbXQpO18/cHQoUy54LFMueSt2W3UtMV0ueSx2W3UtMV0ueCtpdCk6cHQoUy54LFMueSxoK2l0KX19fUsoKSxydCgpO2Z1bmN0aW9uIEsoKXtjb25zdCBJPXIubGVuZ3RoLzM7aWYoZil7bGV0IG90PTAsaXQ9QipvdDtmb3IobGV0IG10PTA7bXQ8SDttdCsrKXtjb25zdCBRPURbbXRdO0l0KFFbMl0raXQsUVsxXStpdCxRWzBdK2l0KX1vdD11K20qMixpdD1CKm90O2ZvcihsZXQgbXQ9MDttdDxIO210Kyspe2NvbnN0IFE9RFttdF07SXQoUVswXStpdCxRWzFdK2l0LFFbMl0raXQpfX1lbHNle2ZvcihsZXQgb3Q9MDtvdDxIO290Kyspe2NvbnN0IGl0PURbb3RdO0l0KGl0WzJdLGl0WzFdLGl0WzBdKX1mb3IobGV0IG90PTA7b3Q8SDtvdCsrKXtjb25zdCBpdD1EW290XTtJdChpdFswXStCKnUsaXRbMV0rQip1LGl0WzJdK0IqdSl9fW4uYWRkR3JvdXAoSSxyLmxlbmd0aC8zLUksMCl9ZnVuY3Rpb24gcnQoKXtjb25zdCBJPXIubGVuZ3RoLzM7bGV0IG90PTA7TXQoTixvdCksb3QrPU4ubGVuZ3RoO2ZvcihsZXQgaXQ9MCxtdD1BLmxlbmd0aDtpdDxtdDtpdCsrKXtjb25zdCBRPUFbaXRdO010KFEsb3QpLG90Kz1RLmxlbmd0aH1uLmFkZEdyb3VwKEksci5sZW5ndGgvMy1JLDEpfWZ1bmN0aW9uIE10KEksb3Qpe2xldCBpdD1JLmxlbmd0aDtmb3IoOy0taXQ+PTA7KXtjb25zdCBtdD1pdDtsZXQgUT1pdC0xO1E8MCYmKFE9SS5sZW5ndGgtMSk7Zm9yKGxldCBQdD0wLCQ9dSttKjI7UHQ8JDtQdCsrKXtjb25zdCBKPUIqUHQsUj1CKihQdCsxKSxTPW90K210K0osTz1vdCtRK0osWT1vdCtRK1IsWj1vdCttdCtSO0Z0KFMsTyxZLFopfX19ZnVuY3Rpb24gcHQoSSxvdCxpdCl7bC5wdXNoKEkpLGwucHVzaChvdCksbC5wdXNoKGl0KX1mdW5jdGlvbiBJdChJLG90LGl0KXtFdChJKSxFdChvdCksRXQoaXQpO2NvbnN0IG10PXIubGVuZ3RoLzMsUT14LmdlbmVyYXRlVG9wVVYobixyLG10LTMsbXQtMixtdC0xKTtKdChRWzBdKSxKdChRWzFdKSxKdChRWzJdKX1mdW5jdGlvbiBGdChJLG90LGl0LG10KXtFdChJKSxFdChvdCksRXQobXQpLEV0KG90KSxFdChpdCksRXQobXQpO2NvbnN0IFE9ci5sZW5ndGgvMyxQdD14LmdlbmVyYXRlU2lkZVdhbGxVVihuLHIsUS02LFEtMyxRLTIsUS0xKTtKdChQdFswXSksSnQoUHRbMV0pLEp0KFB0WzNdKSxKdChQdFsxXSksSnQoUHRbMl0pLEp0KFB0WzNdKX1mdW5jdGlvbiBFdChJKXtyLnB1c2gobFtJKjMrMF0pLHIucHVzaChsW0kqMysxXSksci5wdXNoKGxbSSozKzJdKX1mdW5jdGlvbiBKdChJKXtzLnB1c2goSS54KSxzLnB1c2goSS55KX19fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCksZT10aGlzLnBhcmFtZXRlcnMuc2hhcGVzLG49dGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnM7cmV0dXJuIFhUKGUsbix0KX1zdGF0aWMgZnJvbUpTT04odCxlKXtjb25zdCBuPVtdO2ZvcihsZXQgcz0wLG89dC5zaGFwZXMubGVuZ3RoO3M8bztzKyspe2NvbnN0IGE9ZVt0LnNoYXBlc1tzXV07bi5wdXNoKGEpfWNvbnN0IHI9dC5vcHRpb25zLmV4dHJ1ZGVQYXRoO3JldHVybiByIT09dm9pZCAwJiYodC5vcHRpb25zLmV4dHJ1ZGVQYXRoPW5ldyBtY1tyLnR5cGVdKCkuZnJvbUpTT04ocikpLG5ldyBDUyhuLHQub3B0aW9ucyl9fTtjb25zdCAkVD17Z2VuZXJhdGVUb3BVVjpmdW5jdGlvbihpLHQsZSxuLHIpe2NvbnN0IHM9dFtlKjNdLG89dFtlKjMrMV0sYT10W24qM10sbD10W24qMysxXSxjPXRbciozXSx1PXRbciozKzFdO3JldHVybltuZXcgcShzLG8pLG5ldyBxKGEsbCksbmV3IHEoYyx1KV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbihpLHQsZSxuLHIscyl7Y29uc3Qgbz10W2UqM10sYT10W2UqMysxXSxsPXRbZSozKzJdLGM9dFtuKjNdLHU9dFtuKjMrMV0saD10W24qMysyXSxmPXRbciozXSxkPXRbciozKzFdLHA9dFtyKjMrMl0seT10W3MqM10sbT10W3MqMysxXSxnPXRbcyozKzJdO3JldHVybiBNYXRoLmFicyhhLXUpPE1hdGguYWJzKG8tYyk/W25ldyBxKG8sMS1sKSxuZXcgcShjLDEtaCksbmV3IHEoZiwxLXApLG5ldyBxKHksMS1nKV06W25ldyBxKGEsMS1sKSxuZXcgcSh1LDEtaCksbmV3IHEoZCwxLXApLG5ldyBxKG0sMS1nKV19fTtmdW5jdGlvbiBYVChpLHQsZSl7aWYoZS5zaGFwZXM9W10sQXJyYXkuaXNBcnJheShpKSlmb3IobGV0IG49MCxyPWkubGVuZ3RoO248cjtuKyspe2NvbnN0IHM9aVtuXTtlLnNoYXBlcy5wdXNoKHMudXVpZCl9ZWxzZSBlLnNoYXBlcy5wdXNoKGkudXVpZCk7cmV0dXJuIGUub3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LHQpLHQuZXh0cnVkZVBhdGghPT12b2lkIDAmJihlLm9wdGlvbnMuZXh0cnVkZVBhdGg9dC5leHRydWRlUGF0aC50b0pTT04oKSksZX1jbGFzcyBFYyBleHRlbmRzIEtpe2NvbnN0cnVjdG9yKHQ9MSxlPTApe2NvbnN0IG49KDErTWF0aC5zcXJ0KDUpKS8yLHI9Wy0xLG4sMCwxLG4sMCwtMSwtbiwwLDEsLW4sMCwwLC0xLG4sMCwxLG4sMCwtMSwtbiwwLDEsLW4sbiwwLC0xLG4sMCwxLC1uLDAsLTEsLW4sMCwxXSxzPVswLDExLDUsMCw1LDEsMCwxLDcsMCw3LDEwLDAsMTAsMTEsMSw1LDksNSwxMSw0LDExLDEwLDIsMTAsNyw2LDcsMSw4LDMsOSw0LDMsNCwyLDMsMiw2LDMsNiw4LDMsOCw5LDQsOSw1LDIsNCwxMSw2LDIsMTAsOCw2LDcsOSw4LDFdO3N1cGVyKHIscyx0LGUpLHRoaXMudHlwZT0iSWNvc2FoZWRyb25HZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxkZXRhaWw6ZX19c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgRWModC5yYWRpdXMsdC5kZXRhaWwpfX1jbGFzcyB0YSBleHRlbmRzIEtpe2NvbnN0cnVjdG9yKHQ9MSxlPTApe2NvbnN0IG49WzEsMCwwLC0xLDAsMCwwLDEsMCwwLC0xLDAsMCwwLDEsMCwwLC0xXSxyPVswLDIsNCwwLDQsMywwLDMsNSwwLDUsMiwxLDIsNSwxLDUsMywxLDMsNCwxLDQsMl07c3VwZXIobixyLHQsZSksdGhpcy50eXBlPSJPY3RhaGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsZGV0YWlsOmV9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IHRhKHQucmFkaXVzLHQuZGV0YWlsKX19Y2xhc3MgVGMgZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcih0PS41LGU9MSxuPTMyLHI9MSxzPTAsbz1NYXRoLlBJKjIpe3N1cGVyKCksdGhpcy50eXBlPSJSaW5nR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17aW5uZXJSYWRpdXM6dCxvdXRlclJhZGl1czplLHRoZXRhU2VnbWVudHM6bixwaGlTZWdtZW50czpyLHRoZXRhU3RhcnQ6cyx0aGV0YUxlbmd0aDpvfSxuPU1hdGgubWF4KDMsbikscj1NYXRoLm1heCgxLHIpO2NvbnN0IGE9W10sbD1bXSxjPVtdLHU9W107bGV0IGg9dDtjb25zdCBmPShlLXQpL3IsZD1uZXcgTCxwPW5ldyBxO2ZvcihsZXQgeT0wO3k8PXI7eSsrKXtmb3IobGV0IG09MDttPD1uO20rKyl7Y29uc3QgZz1zK20vbipvO2QueD1oKk1hdGguY29zKGcpLGQueT1oKk1hdGguc2luKGcpLGwucHVzaChkLngsZC55LGQueiksYy5wdXNoKDAsMCwxKSxwLng9KGQueC9lKzEpLzIscC55PShkLnkvZSsxKS8yLHUucHVzaChwLngscC55KX1oKz1mfWZvcihsZXQgeT0wO3k8cjt5Kyspe2NvbnN0IG09eSoobisxKTtmb3IobGV0IGc9MDtnPG47ZysrKXtjb25zdCB4PWcrbSx2PXgsXz14K24rMSxFPXgrbisyLGI9eCsxO2EucHVzaCh2LF8sYiksYS5wdXNoKF8sRSxiKX19dGhpcy5zZXRJbmRleChhKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTdChsLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgU3QoYywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgU3QodSwyKSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgVGModC5pbm5lclJhZGl1cyx0Lm91dGVyUmFkaXVzLHQudGhldGFTZWdtZW50cyx0LnBoaVNlZ21lbnRzLHQudGhldGFTdGFydCx0LnRoZXRhTGVuZ3RoKX19Y2xhc3MgQ2MgZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcih0PW5ldyB3aShbbmV3IHEoMCwuNSksbmV3IHEoLS41LC0uNSksbmV3IHEoLjUsLS41KV0pLGU9MTIpe3N1cGVyKCksdGhpcy50eXBlPSJTaGFwZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczp0LGN1cnZlU2VnbWVudHM6ZX07Y29uc3Qgbj1bXSxyPVtdLHM9W10sbz1bXTtsZXQgYT0wLGw9MDtpZihBcnJheS5pc0FycmF5KHQpPT09ITEpYyh0KTtlbHNlIGZvcihsZXQgdT0wO3U8dC5sZW5ndGg7dSsrKWModFt1XSksdGhpcy5hZGRHcm91cChhLGwsdSksYSs9bCxsPTA7dGhpcy5zZXRJbmRleChuKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTdChyLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgU3QocywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgU3QobywyKSk7ZnVuY3Rpb24gYyh1KXtjb25zdCBoPXIubGVuZ3RoLzMsZj11LmV4dHJhY3RQb2ludHMoZSk7bGV0IGQ9Zi5zaGFwZTtjb25zdCBwPWYuaG9sZXM7d24uaXNDbG9ja1dpc2UoZCk9PT0hMSYmKGQ9ZC5yZXZlcnNlKCkpO2ZvcihsZXQgbT0wLGc9cC5sZW5ndGg7bTxnO20rKyl7Y29uc3QgeD1wW21dO3duLmlzQ2xvY2tXaXNlKHgpPT09ITAmJihwW21dPXgucmV2ZXJzZSgpKX1jb25zdCB5PXduLnRyaWFuZ3VsYXRlU2hhcGUoZCxwKTtmb3IobGV0IG09MCxnPXAubGVuZ3RoO208ZzttKyspe2NvbnN0IHg9cFttXTtkPWQuY29uY2F0KHgpfWZvcihsZXQgbT0wLGc9ZC5sZW5ndGg7bTxnO20rKyl7Y29uc3QgeD1kW21dO3IucHVzaCh4LngseC55LDApLHMucHVzaCgwLDAsMSksby5wdXNoKHgueCx4LnkpfWZvcihsZXQgbT0wLGc9eS5sZW5ndGg7bTxnO20rKyl7Y29uc3QgeD15W21dLHY9eFswXStoLF89eFsxXStoLEU9eFsyXStoO24ucHVzaCh2LF8sRSksbCs9M319fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCksZT10aGlzLnBhcmFtZXRlcnMuc2hhcGVzO3JldHVybiBxVChlLHQpfXN0YXRpYyBmcm9tSlNPTih0LGUpe2NvbnN0IG49W107Zm9yKGxldCByPTAscz10LnNoYXBlcy5sZW5ndGg7cjxzO3IrKyl7Y29uc3Qgbz1lW3Quc2hhcGVzW3JdXTtuLnB1c2gobyl9cmV0dXJuIG5ldyBDYyhuLHQuY3VydmVTZWdtZW50cyl9fWZ1bmN0aW9uIHFUKGksdCl7aWYodC5zaGFwZXM9W10sQXJyYXkuaXNBcnJheShpKSlmb3IobGV0IGU9MCxuPWkubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHI9aVtlXTt0LnNoYXBlcy5wdXNoKHIudXVpZCl9ZWxzZSB0LnNoYXBlcy5wdXNoKGkudXVpZCk7cmV0dXJuIHR9Y2xhc3MgZWEgZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcih0PTEsZT0zMixuPTE2LHI9MCxzPU1hdGguUEkqMixvPTAsYT1NYXRoLlBJKXtzdXBlcigpLHRoaXMudHlwZT0iU3BoZXJlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsd2lkdGhTZWdtZW50czplLGhlaWdodFNlZ21lbnRzOm4scGhpU3RhcnQ6cixwaGlMZW5ndGg6cyx0aGV0YVN0YXJ0Om8sdGhldGFMZW5ndGg6YX0sZT1NYXRoLm1heCgzLE1hdGguZmxvb3IoZSkpLG49TWF0aC5tYXgoMixNYXRoLmZsb29yKG4pKTtjb25zdCBsPU1hdGgubWluKG8rYSxNYXRoLlBJKTtsZXQgYz0wO2NvbnN0IHU9W10saD1uZXcgTCxmPW5ldyBMLGQ9W10scD1bXSx5PVtdLG09W107Zm9yKGxldCBnPTA7Zzw9bjtnKyspe2NvbnN0IHg9W10sdj1nL247bGV0IF89MDtnPT09MCYmbz09PTA/Xz0uNS9lOmc9PT1uJiZsPT09TWF0aC5QSSYmKF89LS41L2UpO2ZvcihsZXQgRT0wO0U8PWU7RSsrKXtjb25zdCBiPUUvZTtoLng9LXQqTWF0aC5jb3MocitiKnMpKk1hdGguc2luKG8rdiphKSxoLnk9dCpNYXRoLmNvcyhvK3YqYSksaC56PXQqTWF0aC5zaW4ocitiKnMpKk1hdGguc2luKG8rdiphKSxwLnB1c2goaC54LGgueSxoLnopLGYuY29weShoKS5ub3JtYWxpemUoKSx5LnB1c2goZi54LGYueSxmLnopLG0ucHVzaChiK18sMS12KSx4LnB1c2goYysrKX11LnB1c2goeCl9Zm9yKGxldCBnPTA7ZzxuO2crKylmb3IobGV0IHg9MDt4PGU7eCsrKXtjb25zdCB2PXVbZ11beCsxXSxfPXVbZ11beF0sRT11W2crMV1beF0sYj11W2crMV1beCsxXTsoZyE9PTB8fG8+MCkmJmQucHVzaCh2LF8sYiksKGchPT1uLTF8fGw8TWF0aC5QSSkmJmQucHVzaChfLEUsYil9dGhpcy5zZXRJbmRleChkKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTdChwLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgU3QoeSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgU3QobSwyKSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgZWEodC5yYWRpdXMsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMsdC5waGlTdGFydCx0LnBoaUxlbmd0aCx0LnRoZXRhU3RhcnQsdC50aGV0YUxlbmd0aCl9fWNsYXNzIFJjIGV4dGVuZHMgS2l7Y29uc3RydWN0b3IodD0xLGU9MCl7Y29uc3Qgbj1bMSwxLDEsLTEsLTEsMSwtMSwxLC0xLDEsLTEsLTFdLHI9WzIsMSwwLDAsMywyLDEsMywwLDIsMywxXTtzdXBlcihuLHIsdCxlKSx0aGlzLnR5cGU9IlRldHJhaGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsZGV0YWlsOmV9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IFJjKHQucmFkaXVzLHQuZGV0YWlsKX19Y2xhc3MgUGMgZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcih0PTEsZT0uNCxuPTEyLHI9NDgscz1NYXRoLlBJKjIpe3N1cGVyKCksdGhpcy50eXBlPSJUb3J1c0dlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LHR1YmU6ZSxyYWRpYWxTZWdtZW50czpuLHR1YnVsYXJTZWdtZW50czpyLGFyYzpzfSxuPU1hdGguZmxvb3Iobikscj1NYXRoLmZsb29yKHIpO2NvbnN0IG89W10sYT1bXSxsPVtdLGM9W10sdT1uZXcgTCxoPW5ldyBMLGY9bmV3IEw7Zm9yKGxldCBkPTA7ZDw9bjtkKyspZm9yKGxldCBwPTA7cDw9cjtwKyspe2NvbnN0IHk9cC9yKnMsbT1kL24qTWF0aC5QSSoyO2gueD0odCtlKk1hdGguY29zKG0pKSpNYXRoLmNvcyh5KSxoLnk9KHQrZSpNYXRoLmNvcyhtKSkqTWF0aC5zaW4oeSksaC56PWUqTWF0aC5zaW4obSksYS5wdXNoKGgueCxoLnksaC56KSx1Lng9dCpNYXRoLmNvcyh5KSx1Lnk9dCpNYXRoLnNpbih5KSxmLnN1YlZlY3RvcnMoaCx1KS5ub3JtYWxpemUoKSxsLnB1c2goZi54LGYueSxmLnopLGMucHVzaChwL3IpLGMucHVzaChkL24pfWZvcihsZXQgZD0xO2Q8PW47ZCsrKWZvcihsZXQgcD0xO3A8PXI7cCsrKXtjb25zdCB5PShyKzEpKmQrcC0xLG09KHIrMSkqKGQtMSkrcC0xLGc9KHIrMSkqKGQtMSkrcCx4PShyKzEpKmQrcDtvLnB1c2goeSxtLHgpLG8ucHVzaChtLGcseCl9dGhpcy5zZXRJbmRleChvKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTdChhLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgU3QobCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgU3QoYywyKSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgUGModC5yYWRpdXMsdC50dWJlLHQucmFkaWFsU2VnbWVudHMsdC50dWJ1bGFyU2VnbWVudHMsdC5hcmMpfX1jbGFzcyBJYyBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9MSxlPS40LG49NjQscj04LHM9MixvPTMpe3N1cGVyKCksdGhpcy50eXBlPSJUb3J1c0tub3RHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCx0dWJlOmUsdHVidWxhclNlZ21lbnRzOm4scmFkaWFsU2VnbWVudHM6cixwOnMscTpvfSxuPU1hdGguZmxvb3Iobikscj1NYXRoLmZsb29yKHIpO2NvbnN0IGE9W10sbD1bXSxjPVtdLHU9W10saD1uZXcgTCxmPW5ldyBMLGQ9bmV3IEwscD1uZXcgTCx5PW5ldyBMLG09bmV3IEwsZz1uZXcgTDtmb3IobGV0IHY9MDt2PD1uOysrdil7Y29uc3QgXz12L24qcypNYXRoLlBJKjI7eChfLHMsbyx0LGQpLHgoXysuMDEscyxvLHQscCksbS5zdWJWZWN0b3JzKHAsZCksZy5hZGRWZWN0b3JzKHAsZCkseS5jcm9zc1ZlY3RvcnMobSxnKSxnLmNyb3NzVmVjdG9ycyh5LG0pLHkubm9ybWFsaXplKCksZy5ub3JtYWxpemUoKTtmb3IobGV0IEU9MDtFPD1yOysrRSl7Y29uc3QgYj1FL3IqTWF0aC5QSSoyLFQ9LWUqTWF0aC5jb3MoYiksUD1lKk1hdGguc2luKGIpO2gueD1kLngrKFQqZy54K1AqeS54KSxoLnk9ZC55KyhUKmcueStQKnkueSksaC56PWQueisoVCpnLnorUCp5LnopLGwucHVzaChoLngsaC55LGgueiksZi5zdWJWZWN0b3JzKGgsZCkubm9ybWFsaXplKCksYy5wdXNoKGYueCxmLnksZi56KSx1LnB1c2godi9uKSx1LnB1c2goRS9yKX19Zm9yKGxldCB2PTE7djw9bjt2KyspZm9yKGxldCBfPTE7Xzw9cjtfKyspe2NvbnN0IEU9KHIrMSkqKHYtMSkrKF8tMSksYj0ocisxKSp2KyhfLTEpLFQ9KHIrMSkqditfLFA9KHIrMSkqKHYtMSkrXzthLnB1c2goRSxiLFApLGEucHVzaChiLFQsUCl9dGhpcy5zZXRJbmRleChhKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTdChsLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgU3QoYywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgU3QodSwyKSk7ZnVuY3Rpb24geCh2LF8sRSxiLFQpe2NvbnN0IFA9TWF0aC5jb3Modiksdz1NYXRoLnNpbih2KSxNPUUvXyp2LEE9TWF0aC5jb3MoTSk7VC54PWIqKDIrQSkqLjUqUCxULnk9YiooMitBKSp3Ki41LFQuej1iKk1hdGguc2luKE0pKi41fX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc31zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBJYyh0LnJhZGl1cyx0LnR1YmUsdC50dWJ1bGFyU2VnbWVudHMsdC5yYWRpYWxTZWdtZW50cyx0LnAsdC5xKX19Y2xhc3MgTGMgZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcih0PW5ldyBJZihuZXcgTCgtMSwtMSwwKSxuZXcgTCgtMSwxLDApLG5ldyBMKDEsMSwwKSksZT02NCxuPTEscj04LHM9ITEpe3N1cGVyKCksdGhpcy50eXBlPSJUdWJlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cGF0aDp0LHR1YnVsYXJTZWdtZW50czplLHJhZGl1czpuLHJhZGlhbFNlZ21lbnRzOnIsY2xvc2VkOnN9O2NvbnN0IG89dC5jb21wdXRlRnJlbmV0RnJhbWVzKGUscyk7dGhpcy50YW5nZW50cz1vLnRhbmdlbnRzLHRoaXMubm9ybWFscz1vLm5vcm1hbHMsdGhpcy5iaW5vcm1hbHM9by5iaW5vcm1hbHM7Y29uc3QgYT1uZXcgTCxsPW5ldyBMLGM9bmV3IHE7bGV0IHU9bmV3IEw7Y29uc3QgaD1bXSxmPVtdLGQ9W10scD1bXTt5KCksdGhpcy5zZXRJbmRleChwKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTdChoLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgU3QoZiwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgU3QoZCwyKSk7ZnVuY3Rpb24geSgpe2ZvcihsZXQgdj0wO3Y8ZTt2KyspbSh2KTttKHM9PT0hMT9lOjApLHgoKSxnKCl9ZnVuY3Rpb24gbSh2KXt1PXQuZ2V0UG9pbnRBdCh2L2UsdSk7Y29uc3QgXz1vLm5vcm1hbHNbdl0sRT1vLmJpbm9ybWFsc1t2XTtmb3IobGV0IGI9MDtiPD1yO2IrKyl7Y29uc3QgVD1iL3IqTWF0aC5QSSoyLFA9TWF0aC5zaW4oVCksdz0tTWF0aC5jb3MoVCk7bC54PXcqXy54K1AqRS54LGwueT13Kl8ueStQKkUueSxsLno9dypfLnorUCpFLnosbC5ub3JtYWxpemUoKSxmLnB1c2gobC54LGwueSxsLnopLGEueD11LngrbipsLngsYS55PXUueStuKmwueSxhLno9dS56K24qbC56LGgucHVzaChhLngsYS55LGEueil9fWZ1bmN0aW9uIGcoKXtmb3IobGV0IHY9MTt2PD1lO3YrKylmb3IobGV0IF89MTtfPD1yO18rKyl7Y29uc3QgRT0ocisxKSoodi0xKSsoXy0xKSxiPShyKzEpKnYrKF8tMSksVD0ocisxKSp2K18sUD0ocisxKSoodi0xKStfO3AucHVzaChFLGIsUCkscC5wdXNoKGIsVCxQKX19ZnVuY3Rpb24geCgpe2ZvcihsZXQgdj0wO3Y8PWU7disrKWZvcihsZXQgXz0wO188PXI7XysrKWMueD12L2UsYy55PV8vcixkLnB1c2goYy54LGMueSl9fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQucGF0aD10aGlzLnBhcmFtZXRlcnMucGF0aC50b0pTT04oKSx0fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IExjKG5ldyBtY1t0LnBhdGgudHlwZV0oKS5mcm9tSlNPTih0LnBhdGgpLHQudHVidWxhclNlZ21lbnRzLHQucmFkaXVzLHQucmFkaWFsU2VnbWVudHMsdC5jbG9zZWQpfX1jbGFzcyBqMCBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9bnVsbCl7aWYoc3VwZXIoKSx0aGlzLnR5cGU9IldpcmVmcmFtZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e2dlb21ldHJ5OnR9LHQhPT1udWxsKXtjb25zdCBlPVtdLG49bmV3IFNldCxyPW5ldyBMLHM9bmV3IEw7aWYodC5pbmRleCE9PW51bGwpe2NvbnN0IG89dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGE9dC5pbmRleDtsZXQgbD10Lmdyb3VwcztsLmxlbmd0aD09PTAmJihsPVt7c3RhcnQ6MCxjb3VudDphLmNvdW50LG1hdGVyaWFsSW5kZXg6MH1dKTtmb3IobGV0IGM9MCx1PWwubGVuZ3RoO2M8dTsrK2Mpe2NvbnN0IGg9bFtjXSxmPWguc3RhcnQsZD1oLmNvdW50O2ZvcihsZXQgcD1mLHk9ZitkO3A8eTtwKz0zKWZvcihsZXQgbT0wO208MzttKyspe2NvbnN0IGc9YS5nZXRYKHArbSkseD1hLmdldFgocCsobSsxKSUzKTtyLmZyb21CdWZmZXJBdHRyaWJ1dGUobyxnKSxzLmZyb21CdWZmZXJBdHRyaWJ1dGUobyx4KSxRMChyLHMsbik9PT0hMCYmKGUucHVzaChyLngsci55LHIueiksZS5wdXNoKHMueCxzLnkscy56KSl9fX1lbHNle2NvbnN0IG89dC5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgYT0wLGw9by5jb3VudC8zO2E8bDthKyspZm9yKGxldCBjPTA7YzwzO2MrKyl7Y29uc3QgdT0zKmErYyxoPTMqYSsoYysxKSUzO3IuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLHUpLHMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLGgpLFEwKHIscyxuKT09PSEwJiYoZS5wdXNoKHIueCxyLnksci56KSxlLnB1c2gocy54LHMueSxzLnopKX19dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU3QoZSwzKSl9fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfX1mdW5jdGlvbiBRMChpLHQsZSl7Y29uc3Qgbj1gJHtpLnh9LCR7aS55fSwke2kuen0tJHt0Lnh9LCR7dC55fSwke3Quen1gLHI9YCR7dC54fSwke3QueX0sJHt0Lnp9LSR7aS54fSwke2kueX0sJHtpLnp9YDtyZXR1cm4gZS5oYXMobik9PT0hMHx8ZS5oYXMocik9PT0hMD8hMTooZS5hZGQobiksZS5hZGQociksITApfXZhciB0eT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxCb3hHZW9tZXRyeTpNcixDYXBzdWxlR2VvbWV0cnk6Z2MsQ2lyY2xlR2VvbWV0cnk6eWMsQ29uZUdlb21ldHJ5OnZjLEN5bGluZGVyR2VvbWV0cnk6VXMsRG9kZWNhaGVkcm9uR2VvbWV0cnk6X2MsRWRnZXNHZW9tZXRyeTpXMCxFeHRydWRlR2VvbWV0cnk6SzAsSWNvc2FoZWRyb25HZW9tZXRyeTpFYyxMYXRoZUdlb21ldHJ5OkpvLE9jdGFoZWRyb25HZW9tZXRyeTp0YSxQbGFuZUdlb21ldHJ5OmJzLFBvbHloZWRyb25HZW9tZXRyeTpLaSxSaW5nR2VvbWV0cnk6VGMsU2hhcGVHZW9tZXRyeTpDYyxTcGhlcmVHZW9tZXRyeTplYSxUZXRyYWhlZHJvbkdlb21ldHJ5OlJjLFRvcnVzR2VvbWV0cnk6UGMsVG9ydXNLbm90R2VvbWV0cnk6SWMsVHViZUdlb21ldHJ5OkxjLFdpcmVmcmFtZUdlb21ldHJ5OmowfSk7Y2xhc3MgZXkgZXh0ZW5kcyBYZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNTaGFkb3dNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IlNoYWRvd01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB2dCgwKSx0aGlzLnRyYW5zcGFyZW50PSEwLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNsYXNzIG55IGV4dGVuZHMgR257Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5pc1Jhd1NoYWRlck1hdGVyaWFsPSEwLHRoaXMudHlwZT0iUmF3U2hhZGVyTWF0ZXJpYWwifX1jbGFzcyBGZiBleHRlbmRzIFhle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc01lc2hTdGFuZGFyZE1hdGVyaWFsPSEwLHRoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiJ9LHRoaXMudHlwZT0iTWVzaFN0YW5kYXJkTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHZ0KDE2Nzc3MjE1KSx0aGlzLnJvdWdobmVzcz0xLHRoaXMubWV0YWxuZXNzPTAsdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZT1uZXcgdnQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPWtpLHRoaXMubm9ybWFsU2NhbGU9bmV3IHEoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLnJvdWdobmVzc01hcD1udWxsLHRoaXMubWV0YWxuZXNzTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5lbnZNYXBSb3RhdGlvbj1uZXcgTW4sdGhpcy5lbnZNYXBJbnRlbnNpdHk9MSx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiLHRoaXMud2lyZWZyYW1lTGluZWpvaW49InJvdW5kIix0aGlzLmZsYXRTaGFkaW5nPSExLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIn0sdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMucm91Z2huZXNzPXQucm91Z2huZXNzLHRoaXMubWV0YWxuZXNzPXQubWV0YWxuZXNzLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLmVtaXNzaXZlLmNvcHkodC5lbWlzc2l2ZSksdGhpcy5lbWlzc2l2ZU1hcD10LmVtaXNzaXZlTWFwLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9dC5lbWlzc2l2ZUludGVuc2l0eSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMucm91Z2huZXNzTWFwPXQucm91Z2huZXNzTWFwLHRoaXMubWV0YWxuZXNzTWFwPXQubWV0YWxuZXNzTWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmVudk1hcD10LmVudk1hcCx0aGlzLmVudk1hcFJvdGF0aW9uLmNvcHkodC5lbnZNYXBSb3RhdGlvbiksdGhpcy5lbnZNYXBJbnRlbnNpdHk9dC5lbnZNYXBJbnRlbnNpdHksdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNsYXNzIGl5IGV4dGVuZHMgRmZ7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw9ITAsdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn0sdGhpcy50eXBlPSJNZXNoUGh5c2ljYWxNYXRlcmlhbCIsdGhpcy5hbmlzb3Ryb3B5Um90YXRpb249MCx0aGlzLmFuaXNvdHJvcHlNYXA9bnVsbCx0aGlzLmNsZWFyY29hdE1hcD1udWxsLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzPTAsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9bnVsbCx0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlPW5ldyBxKDEsMSksdGhpcy5jbGVhcmNvYXROb3JtYWxNYXA9bnVsbCx0aGlzLmlvcj0xLjUsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInJlZmxlY3Rpdml0eSIse2dldDpmdW5jdGlvbigpe3JldHVybiB4ZSgyLjUqKHRoaXMuaW9yLTEpLyh0aGlzLmlvcisxKSwwLDEpfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5pb3I9KDErLjQqZSkvKDEtLjQqZSl9fSksdGhpcy5pcmlkZXNjZW5jZU1hcD1udWxsLHRoaXMuaXJpZGVzY2VuY2VJT1I9MS4zLHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZT1bMTAwLDQwMF0sdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD1udWxsLHRoaXMuc2hlZW5Db2xvcj1uZXcgdnQoMCksdGhpcy5zaGVlbkNvbG9yTWFwPW51bGwsdGhpcy5zaGVlblJvdWdobmVzcz0xLHRoaXMuc2hlZW5Sb3VnaG5lc3NNYXA9bnVsbCx0aGlzLnRyYW5zbWlzc2lvbk1hcD1udWxsLHRoaXMudGhpY2tuZXNzPTAsdGhpcy50aGlja25lc3NNYXA9bnVsbCx0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2U9MS8wLHRoaXMuYXR0ZW51YXRpb25Db2xvcj1uZXcgdnQoMSwxLDEpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHk9MSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwPW51bGwsdGhpcy5zcGVjdWxhckNvbG9yPW5ldyB2dCgxLDEsMSksdGhpcy5zcGVjdWxhckNvbG9yTWFwPW51bGwsdGhpcy5fYW5pc290cm9weT0wLHRoaXMuX2NsZWFyY29hdD0wLHRoaXMuX2Rpc3BlcnNpb249MCx0aGlzLl9pcmlkZXNjZW5jZT0wLHRoaXMuX3NoZWVuPTAsdGhpcy5fdHJhbnNtaXNzaW9uPTAsdGhpcy5zZXRWYWx1ZXModCl9Z2V0IGFuaXNvdHJvcHkoKXtyZXR1cm4gdGhpcy5fYW5pc290cm9weX1zZXQgYW5pc290cm9weSh0KXt0aGlzLl9hbmlzb3Ryb3B5PjAhPXQ+MCYmdGhpcy52ZXJzaW9uKyssdGhpcy5fYW5pc290cm9weT10fWdldCBjbGVhcmNvYXQoKXtyZXR1cm4gdGhpcy5fY2xlYXJjb2F0fXNldCBjbGVhcmNvYXQodCl7dGhpcy5fY2xlYXJjb2F0PjAhPXQ+MCYmdGhpcy52ZXJzaW9uKyssdGhpcy5fY2xlYXJjb2F0PXR9Z2V0IGlyaWRlc2NlbmNlKCl7cmV0dXJuIHRoaXMuX2lyaWRlc2NlbmNlfXNldCBpcmlkZXNjZW5jZSh0KXt0aGlzLl9pcmlkZXNjZW5jZT4wIT10PjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX2lyaWRlc2NlbmNlPXR9Z2V0IGRpc3BlcnNpb24oKXtyZXR1cm4gdGhpcy5fZGlzcGVyc2lvbn1zZXQgZGlzcGVyc2lvbih0KXt0aGlzLl9kaXNwZXJzaW9uPjAhPXQ+MCYmdGhpcy52ZXJzaW9uKyssdGhpcy5fZGlzcGVyc2lvbj10fWdldCBzaGVlbigpe3JldHVybiB0aGlzLl9zaGVlbn1zZXQgc2hlZW4odCl7dGhpcy5fc2hlZW4+MCE9dD4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl9zaGVlbj10fWdldCB0cmFuc21pc3Npb24oKXtyZXR1cm4gdGhpcy5fdHJhbnNtaXNzaW9ufXNldCB0cmFuc21pc3Npb24odCl7dGhpcy5fdHJhbnNtaXNzaW9uPjAhPXQ+MCYmdGhpcy52ZXJzaW9uKyssdGhpcy5fdHJhbnNtaXNzaW9uPXR9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIiLFBIWVNJQ0FMOiIifSx0aGlzLmFuaXNvdHJvcHk9dC5hbmlzb3Ryb3B5LHRoaXMuYW5pc290cm9weVJvdGF0aW9uPXQuYW5pc290cm9weVJvdGF0aW9uLHRoaXMuYW5pc290cm9weU1hcD10LmFuaXNvdHJvcHlNYXAsdGhpcy5jbGVhcmNvYXQ9dC5jbGVhcmNvYXQsdGhpcy5jbGVhcmNvYXRNYXA9dC5jbGVhcmNvYXRNYXAsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9dC5jbGVhcmNvYXRSb3VnaG5lc3MsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9dC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAsdGhpcy5jbGVhcmNvYXROb3JtYWxNYXA9dC5jbGVhcmNvYXROb3JtYWxNYXAsdGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZS5jb3B5KHQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpLHRoaXMuZGlzcGVyc2lvbj10LmRpc3BlcnNpb24sdGhpcy5pb3I9dC5pb3IsdGhpcy5pcmlkZXNjZW5jZT10LmlyaWRlc2NlbmNlLHRoaXMuaXJpZGVzY2VuY2VNYXA9dC5pcmlkZXNjZW5jZU1hcCx0aGlzLmlyaWRlc2NlbmNlSU9SPXQuaXJpZGVzY2VuY2VJT1IsdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPVsuLi50LmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2VdLHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXA9dC5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCx0aGlzLnNoZWVuPXQuc2hlZW4sdGhpcy5zaGVlbkNvbG9yLmNvcHkodC5zaGVlbkNvbG9yKSx0aGlzLnNoZWVuQ29sb3JNYXA9dC5zaGVlbkNvbG9yTWFwLHRoaXMuc2hlZW5Sb3VnaG5lc3M9dC5zaGVlblJvdWdobmVzcyx0aGlzLnNoZWVuUm91Z2huZXNzTWFwPXQuc2hlZW5Sb3VnaG5lc3NNYXAsdGhpcy50cmFuc21pc3Npb249dC50cmFuc21pc3Npb24sdGhpcy50cmFuc21pc3Npb25NYXA9dC50cmFuc21pc3Npb25NYXAsdGhpcy50aGlja25lc3M9dC50aGlja25lc3MsdGhpcy50aGlja25lc3NNYXA9dC50aGlja25lc3NNYXAsdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlPXQuYXR0ZW51YXRpb25EaXN0YW5jZSx0aGlzLmF0dGVudWF0aW9uQ29sb3IuY29weSh0LmF0dGVudWF0aW9uQ29sb3IpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHk9dC5zcGVjdWxhckludGVuc2l0eSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwPXQuc3BlY3VsYXJJbnRlbnNpdHlNYXAsdGhpcy5zcGVjdWxhckNvbG9yLmNvcHkodC5zcGVjdWxhckNvbG9yKSx0aGlzLnNwZWN1bGFyQ29sb3JNYXA9dC5zcGVjdWxhckNvbG9yTWFwLHRoaXN9fWNsYXNzIHJ5IGV4dGVuZHMgWGV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaFBob25nTWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJNZXNoUGhvbmdNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgdnQoMTY3NzcyMTUpLHRoaXMuc3BlY3VsYXI9bmV3IHZ0KDExMTg0ODEpLHRoaXMuc2hpbmluZXNzPTMwLHRoaXMubWFwPW51bGwsdGhpcy5saWdodE1hcD1udWxsLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9MSx0aGlzLmFvTWFwPW51bGwsdGhpcy5hb01hcEludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmU9bmV3IHZ0KDApLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlTWFwPW51bGwsdGhpcy5idW1wTWFwPW51bGwsdGhpcy5idW1wU2NhbGU9MSx0aGlzLm5vcm1hbE1hcD1udWxsLHRoaXMubm9ybWFsTWFwVHlwZT1raSx0aGlzLm5vcm1hbFNjYWxlPW5ldyBxKDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuZW52TWFwUm90YXRpb249bmV3IE1uLHRoaXMuY29tYmluZT1sbyx0aGlzLnJlZmxlY3Rpdml0eT0xLHRoaXMucmVmcmFjdGlvblJhdGlvPS45OCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiLHRoaXMud2lyZWZyYW1lTGluZWpvaW49InJvdW5kIix0aGlzLmZsYXRTaGFkaW5nPSExLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMuc3BlY3VsYXIuY29weSh0LnNwZWN1bGFyKSx0aGlzLnNoaW5pbmVzcz10LnNoaW5pbmVzcyx0aGlzLm1hcD10Lm1hcCx0aGlzLmxpZ2h0TWFwPXQubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT10LmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9dC5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PXQuYW9NYXBJbnRlbnNpdHksdGhpcy5lbWlzc2l2ZS5jb3B5KHQuZW1pc3NpdmUpLHRoaXMuZW1pc3NpdmVNYXA9dC5lbWlzc2l2ZU1hcCx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PXQuZW1pc3NpdmVJbnRlbnNpdHksdGhpcy5idW1wTWFwPXQuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD10Lm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLnNwZWN1bGFyTWFwPXQuc3BlY3VsYXJNYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZW52TWFwPXQuZW52TWFwLHRoaXMuZW52TWFwUm90YXRpb24uY29weSh0LmVudk1hcFJvdGF0aW9uKSx0aGlzLmNvbWJpbmU9dC5jb21iaW5lLHRoaXMucmVmbGVjdGl2aXR5PXQucmVmbGVjdGl2aXR5LHRoaXMucmVmcmFjdGlvblJhdGlvPXQucmVmcmFjdGlvblJhdGlvLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMud2lyZWZyYW1lTGluZWNhcD10LndpcmVmcmFtZUxpbmVjYXAsdGhpcy53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luLHRoaXMuZmxhdFNoYWRpbmc9dC5mbGF0U2hhZGluZyx0aGlzLmZvZz10LmZvZyx0aGlzfX1jbGFzcyBzeSBleHRlbmRzIFhle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc01lc2hUb29uTWF0ZXJpYWw9ITAsdGhpcy5kZWZpbmVzPXtUT09OOiIifSx0aGlzLnR5cGU9Ik1lc2hUb29uTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHZ0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMuZ3JhZGllbnRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZT1uZXcgdnQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPWtpLHRoaXMubm9ybWFsU2NhbGU9bmV3IHEoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5ncmFkaWVudE1hcD10LmdyYWRpZW50TWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLmVtaXNzaXZlLmNvcHkodC5lbWlzc2l2ZSksdGhpcy5lbWlzc2l2ZU1hcD10LmVtaXNzaXZlTWFwLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9dC5lbWlzc2l2ZUludGVuc2l0eSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZvZz10LmZvZyx0aGlzfX1jbGFzcyBveSBleHRlbmRzIFhle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc01lc2hOb3JtYWxNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hOb3JtYWxNYXRlcmlhbCIsdGhpcy5idW1wTWFwPW51bGwsdGhpcy5idW1wU2NhbGU9MSx0aGlzLm5vcm1hbE1hcD1udWxsLHRoaXMubm9ybWFsTWFwVHlwZT1raSx0aGlzLm5vcm1hbFNjYWxlPW5ldyBxKDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLmZsYXRTaGFkaW5nPSExLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5idW1wTWFwPXQuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD10Lm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpc319Y2xhc3MgYXkgZXh0ZW5kcyBYZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoTGFtYmVydE1hdGVyaWFsPSEwLHRoaXMudHlwZT0iTWVzaExhbWJlcnRNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgdnQoMTY3NzcyMTUpLHRoaXMubWFwPW51bGwsdGhpcy5saWdodE1hcD1udWxsLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9MSx0aGlzLmFvTWFwPW51bGwsdGhpcy5hb01hcEludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmU9bmV3IHZ0KDApLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlTWFwPW51bGwsdGhpcy5idW1wTWFwPW51bGwsdGhpcy5idW1wU2NhbGU9MSx0aGlzLm5vcm1hbE1hcD1udWxsLHRoaXMubm9ybWFsTWFwVHlwZT1raSx0aGlzLm5vcm1hbFNjYWxlPW5ldyBxKDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuZW52TWFwUm90YXRpb249bmV3IE1uLHRoaXMuY29tYmluZT1sbyx0aGlzLnJlZmxlY3Rpdml0eT0xLHRoaXMucmVmcmFjdGlvblJhdGlvPS45OCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiLHRoaXMud2lyZWZyYW1lTGluZWpvaW49InJvdW5kIix0aGlzLmZsYXRTaGFkaW5nPSExLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLmVtaXNzaXZlLmNvcHkodC5lbWlzc2l2ZSksdGhpcy5lbWlzc2l2ZU1hcD10LmVtaXNzaXZlTWFwLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9dC5lbWlzc2l2ZUludGVuc2l0eSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5lbnZNYXBSb3RhdGlvbi5jb3B5KHQuZW52TWFwUm90YXRpb24pLHRoaXMuY29tYmluZT10LmNvbWJpbmUsdGhpcy5yZWZsZWN0aXZpdHk9dC5yZWZsZWN0aXZpdHksdGhpcy5yZWZyYWN0aW9uUmF0aW89dC5yZWZyYWN0aW9uUmF0aW8sdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNsYXNzIGx5IGV4dGVuZHMgWGV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaE1hdGNhcE1hdGVyaWFsPSEwLHRoaXMuZGVmaW5lcz17TUFUQ0FQOiIifSx0aGlzLnR5cGU9Ik1lc2hNYXRjYXBNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgdnQoMTY3NzcyMTUpLHRoaXMubWF0Y2FwPW51bGwsdGhpcy5tYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPWtpLHRoaXMubm9ybWFsU2NhbGU9bmV3IHEoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZGVmaW5lcz17TUFUQ0FQOiIifSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXRjYXA9dC5tYXRjYXAsdGhpcy5tYXA9dC5tYXAsdGhpcy5idW1wTWFwPXQuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD10Lm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNsYXNzIGN5IGV4dGVuZHMgbm57Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTGluZURhc2hlZE1hdGVyaWFsPSEwLHRoaXMudHlwZT0iTGluZURhc2hlZE1hdGVyaWFsIix0aGlzLnNjYWxlPTEsdGhpcy5kYXNoU2l6ZT0zLHRoaXMuZ2FwU2l6ZT0xLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5zY2FsZT10LnNjYWxlLHRoaXMuZGFzaFNpemU9dC5kYXNoU2l6ZSx0aGlzLmdhcFNpemU9dC5nYXBTaXplLHRoaXN9fWZ1bmN0aW9uIFByKGksdCxlKXtyZXR1cm4haXx8IWUmJmkuY29uc3RydWN0b3I9PT10P2k6dHlwZW9mIHQuQllURVNfUEVSX0VMRU1FTlQ9PSJudW1iZXIiP25ldyB0KGkpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGkpfWZ1bmN0aW9uIHV5KGkpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoaSkmJiEoaSBpbnN0YW5jZW9mIERhdGFWaWV3KX1mdW5jdGlvbiBoeShpKXtmdW5jdGlvbiB0KHIscyl7cmV0dXJuIGlbcl0taVtzXX1jb25zdCBlPWkubGVuZ3RoLG49bmV3IEFycmF5KGUpO2ZvcihsZXQgcj0wO3IhPT1lOysrciluW3JdPXI7cmV0dXJuIG4uc29ydCh0KSxufWZ1bmN0aW9uIE9mKGksdCxlKXtjb25zdCBuPWkubGVuZ3RoLHI9bmV3IGkuY29uc3RydWN0b3Iobik7Zm9yKGxldCBzPTAsbz0wO28hPT1uOysrcyl7Y29uc3QgYT1lW3NdKnQ7Zm9yKGxldCBsPTA7bCE9PXQ7KytsKXJbbysrXT1pW2ErbF19cmV0dXJuIHJ9ZnVuY3Rpb24gQmYoaSx0LGUsbil7bGV0IHI9MSxzPWlbMF07Zm9yKDtzIT09dm9pZCAwJiZzW25dPT09dm9pZCAwOylzPWlbcisrXTtpZihzPT09dm9pZCAwKXJldHVybjtsZXQgbz1zW25dO2lmKG8hPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheShvKSlkbyBvPXNbbl0sbyE9PXZvaWQgMCYmKHQucHVzaChzLnRpbWUpLGUucHVzaC5hcHBseShlLG8pKSxzPWlbcisrXTt3aGlsZShzIT09dm9pZCAwKTtlbHNlIGlmKG8udG9BcnJheSE9PXZvaWQgMClkbyBvPXNbbl0sbyE9PXZvaWQgMCYmKHQucHVzaChzLnRpbWUpLG8udG9BcnJheShlLGUubGVuZ3RoKSkscz1pW3IrK107d2hpbGUocyE9PXZvaWQgMCk7ZWxzZSBkbyBvPXNbbl0sbyE9PXZvaWQgMCYmKHQucHVzaChzLnRpbWUpLGUucHVzaChvKSkscz1pW3IrK107d2hpbGUocyE9PXZvaWQgMCl9ZnVuY3Rpb24gWVQoaSx0LGUsbixyPTMwKXtjb25zdCBzPWkuY2xvbmUoKTtzLm5hbWU9dDtjb25zdCBvPVtdO2ZvcihsZXQgbD0wO2w8cy50cmFja3MubGVuZ3RoOysrbCl7Y29uc3QgYz1zLnRyYWNrc1tsXSx1PWMuZ2V0VmFsdWVTaXplKCksaD1bXSxmPVtdO2ZvcihsZXQgZD0wO2Q8Yy50aW1lcy5sZW5ndGg7KytkKXtjb25zdCBwPWMudGltZXNbZF0qcjtpZighKHA8ZXx8cD49bikpe2gucHVzaChjLnRpbWVzW2RdKTtmb3IobGV0IHk9MDt5PHU7Kyt5KWYucHVzaChjLnZhbHVlc1tkKnUreV0pfX1oLmxlbmd0aCE9PTAmJihjLnRpbWVzPVByKGgsYy50aW1lcy5jb25zdHJ1Y3RvciksYy52YWx1ZXM9UHIoZixjLnZhbHVlcy5jb25zdHJ1Y3Rvciksby5wdXNoKGMpKX1zLnRyYWNrcz1vO2xldCBhPTEvMDtmb3IobGV0IGw9MDtsPHMudHJhY2tzLmxlbmd0aDsrK2wpYT5zLnRyYWNrc1tsXS50aW1lc1swXSYmKGE9cy50cmFja3NbbF0udGltZXNbMF0pO2ZvcihsZXQgbD0wO2w8cy50cmFja3MubGVuZ3RoOysrbClzLnRyYWNrc1tsXS5zaGlmdCgtMSphKTtyZXR1cm4gcy5yZXNldER1cmF0aW9uKCksc31mdW5jdGlvbiBaVChpLHQ9MCxlPWksbj0zMCl7bjw9MCYmKG49MzApO2NvbnN0IHI9ZS50cmFja3MubGVuZ3RoLHM9dC9uO2ZvcihsZXQgbz0wO288cjsrK28pe2NvbnN0IGE9ZS50cmFja3Nbb10sbD1hLlZhbHVlVHlwZU5hbWU7aWYobD09PSJib29sInx8bD09PSJzdHJpbmciKWNvbnRpbnVlO2NvbnN0IGM9aS50cmFja3MuZmluZChmdW5jdGlvbihnKXtyZXR1cm4gZy5uYW1lPT09YS5uYW1lJiZnLlZhbHVlVHlwZU5hbWU9PT1sfSk7aWYoYz09PXZvaWQgMCljb250aW51ZTtsZXQgdT0wO2NvbnN0IGg9YS5nZXRWYWx1ZVNpemUoKTthLmNyZWF0ZUludGVycG9sYW50LmlzSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kR0xURkN1YmljU3BsaW5lJiYodT1oLzMpO2xldCBmPTA7Y29uc3QgZD1jLmdldFZhbHVlU2l6ZSgpO2MuY3JlYXRlSW50ZXJwb2xhbnQuaXNJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUmJihmPWQvMyk7Y29uc3QgcD1hLnRpbWVzLmxlbmd0aC0xO2xldCB5O2lmKHM8PWEudGltZXNbMF0pe2NvbnN0IGc9dSx4PWgtdTt5PWEudmFsdWVzLnNsaWNlKGcseCl9ZWxzZSBpZihzPj1hLnRpbWVzW3BdKXtjb25zdCBnPXAqaCt1LHg9ZytoLXU7eT1hLnZhbHVlcy5zbGljZShnLHgpfWVsc2V7Y29uc3QgZz1hLmNyZWF0ZUludGVycG9sYW50KCkseD11LHY9aC11O2cuZXZhbHVhdGUocykseT1nLnJlc3VsdEJ1ZmZlci5zbGljZSh4LHYpfWw9PT0icXVhdGVybmlvbiImJm5ldyB1bigpLmZyb21BcnJheSh5KS5ub3JtYWxpemUoKS5jb25qdWdhdGUoKS50b0FycmF5KHkpO2NvbnN0IG09Yy50aW1lcy5sZW5ndGg7Zm9yKGxldCBnPTA7ZzxtOysrZyl7Y29uc3QgeD1nKmQrZjtpZihsPT09InF1YXRlcm5pb24iKXVuLm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KGMudmFsdWVzLHgseSwwLGMudmFsdWVzLHgpO2Vsc2V7Y29uc3Qgdj1kLWYqMjtmb3IobGV0IF89MDtfPHY7KytfKWMudmFsdWVzW3grX10tPXlbX119fX1yZXR1cm4gaS5ibGVuZE1vZGU9RWgsaX1jb25zdCBKVD17Y29udmVydEFycmF5OlByLGlzVHlwZWRBcnJheTp1eSxnZXRLZXlmcmFtZU9yZGVyOmh5LHNvcnRlZEFycmF5Ok9mLGZsYXR0ZW5KU09OOkJmLHN1YmNsaXA6WVQsbWFrZUNsaXBBZGRpdGl2ZTpaVH07Y2xhc3MgbmF7Y29uc3RydWN0b3IodCxlLG4scil7dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM9dCx0aGlzLl9jYWNoZWRJbmRleD0wLHRoaXMucmVzdWx0QnVmZmVyPXIhPT12b2lkIDA/cjpuZXcgZS5jb25zdHJ1Y3RvcihuKSx0aGlzLnNhbXBsZVZhbHVlcz1lLHRoaXMudmFsdWVTaXplPW4sdGhpcy5zZXR0aW5ncz1udWxsLHRoaXMuRGVmYXVsdFNldHRpbmdzXz17fX1ldmFsdWF0ZSh0KXtjb25zdCBlPXRoaXMucGFyYW1ldGVyUG9zaXRpb25zO2xldCBuPXRoaXMuX2NhY2hlZEluZGV4LHI9ZVtuXSxzPWVbbi0xXTt0OntlOntsZXQgbztuOntpOmlmKCEodDxyKSl7Zm9yKGxldCBhPW4rMjs7KXtpZihyPT09dm9pZCAwKXtpZih0PHMpYnJlYWsgaTtyZXR1cm4gbj1lLmxlbmd0aCx0aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuY29weVNhbXBsZVZhbHVlXyhuLTEpfWlmKG49PT1hKWJyZWFrO2lmKHM9cixyPWVbKytuXSx0PHIpYnJlYWsgZX1vPWUubGVuZ3RoO2JyZWFrIG59aWYoISh0Pj1zKSl7Y29uc3QgYT1lWzFdO3Q8YSYmKG49MixzPWEpO2ZvcihsZXQgbD1uLTI7Oyl7aWYocz09PXZvaWQgMClyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oMCk7aWYobj09PWwpYnJlYWs7aWYocj1zLHM9ZVstLW4tMV0sdD49cylicmVhayBlfW89bixuPTA7YnJlYWsgbn1icmVhayB0fWZvcig7bjxvOyl7Y29uc3QgYT1uK28+Pj4xO3Q8ZVthXT9vPWE6bj1hKzF9aWYocj1lW25dLHM9ZVtuLTFdLHM9PT12b2lkIDApcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5jb3B5U2FtcGxlVmFsdWVfKDApO2lmKHI9PT12b2lkIDApcmV0dXJuIG49ZS5sZW5ndGgsdGhpcy5fY2FjaGVkSW5kZXg9bix0aGlzLmNvcHlTYW1wbGVWYWx1ZV8obi0xKX10aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuaW50ZXJ2YWxDaGFuZ2VkXyhuLHMscil9cmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVfKG4scyx0LHIpfWdldFNldHRpbmdzXygpe3JldHVybiB0aGlzLnNldHRpbmdzfHx0aGlzLkRlZmF1bHRTZXR0aW5nc199Y29weVNhbXBsZVZhbHVlXyh0KXtjb25zdCBlPXRoaXMucmVzdWx0QnVmZmVyLG49dGhpcy5zYW1wbGVWYWx1ZXMscj10aGlzLnZhbHVlU2l6ZSxzPXQqcjtmb3IobGV0IG89MDtvIT09cjsrK28pZVtvXT1uW3Mrb107cmV0dXJuIGV9aW50ZXJwb2xhdGVfKCl7dGhyb3cgbmV3IEVycm9yKCJjYWxsIHRvIGFic3RyYWN0IG1ldGhvZCIpfWludGVydmFsQ2hhbmdlZF8oKXt9fWNsYXNzIGZ5IGV4dGVuZHMgbmF7Y29uc3RydWN0b3IodCxlLG4scil7c3VwZXIodCxlLG4sciksdGhpcy5fd2VpZ2h0UHJldj0tMCx0aGlzLl9vZmZzZXRQcmV2PS0wLHRoaXMuX3dlaWdodE5leHQ9LTAsdGhpcy5fb2Zmc2V0TmV4dD0tMCx0aGlzLkRlZmF1bHRTZXR0aW5nc189e2VuZGluZ1N0YXJ0OmRyLGVuZGluZ0VuZDpkcn19aW50ZXJ2YWxDaGFuZ2VkXyh0LGUsbil7Y29uc3Qgcj10aGlzLnBhcmFtZXRlclBvc2l0aW9ucztsZXQgcz10LTIsbz10KzEsYT1yW3NdLGw9cltvXTtpZihhPT09dm9pZCAwKXN3aXRjaCh0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0KXtjYXNlIHByOnM9dCxhPTIqZS1uO2JyZWFrO2Nhc2UgU286cz1yLmxlbmd0aC0yLGE9ZStyW3NdLXJbcysxXTticmVhaztkZWZhdWx0OnM9dCxhPW59aWYobD09PXZvaWQgMClzd2l0Y2godGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQpe2Nhc2UgcHI6bz10LGw9MipuLWU7YnJlYWs7Y2FzZSBTbzpvPTEsbD1uK3JbMV0tclswXTticmVhaztkZWZhdWx0Om89dC0xLGw9ZX1jb25zdCBjPShuLWUpKi41LHU9dGhpcy52YWx1ZVNpemU7dGhpcy5fd2VpZ2h0UHJldj1jLyhlLWEpLHRoaXMuX3dlaWdodE5leHQ9Yy8obC1uKSx0aGlzLl9vZmZzZXRQcmV2PXMqdSx0aGlzLl9vZmZzZXROZXh0PW8qdX1pbnRlcnBvbGF0ZV8odCxlLG4scil7Y29uc3Qgcz10aGlzLnJlc3VsdEJ1ZmZlcixvPXRoaXMuc2FtcGxlVmFsdWVzLGE9dGhpcy52YWx1ZVNpemUsbD10KmEsYz1sLWEsdT10aGlzLl9vZmZzZXRQcmV2LGg9dGhpcy5fb2Zmc2V0TmV4dCxmPXRoaXMuX3dlaWdodFByZXYsZD10aGlzLl93ZWlnaHROZXh0LHA9KG4tZSkvKHItZSkseT1wKnAsbT15KnAsZz0tZiptKzIqZip5LWYqcCx4PSgxK2YpKm0rKC0xLjUtMipmKSp5KygtLjUrZikqcCsxLHY9KC0xLWQpKm0rKDEuNStkKSp5Ky41KnAsXz1kKm0tZCp5O2ZvcihsZXQgRT0wO0UhPT1hOysrRSlzW0VdPWcqb1t1K0VdK3gqb1tjK0VdK3Yqb1tsK0VdK18qb1toK0VdO3JldHVybiBzfX1jbGFzcyB6ZiBleHRlbmRzIG5he2NvbnN0cnVjdG9yKHQsZSxuLHIpe3N1cGVyKHQsZSxuLHIpfWludGVycG9sYXRlXyh0LGUsbixyKXtjb25zdCBzPXRoaXMucmVzdWx0QnVmZmVyLG89dGhpcy5zYW1wbGVWYWx1ZXMsYT10aGlzLnZhbHVlU2l6ZSxsPXQqYSxjPWwtYSx1PShuLWUpLyhyLWUpLGg9MS11O2ZvcihsZXQgZj0wO2YhPT1hOysrZilzW2ZdPW9bYytmXSpoK29bbCtmXSp1O3JldHVybiBzfX1jbGFzcyBkeSBleHRlbmRzIG5he2NvbnN0cnVjdG9yKHQsZSxuLHIpe3N1cGVyKHQsZSxuLHIpfWludGVycG9sYXRlXyh0KXtyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKHQtMSl9fWNsYXNzIFdue2NvbnN0cnVjdG9yKHQsZSxuLHIpe2lmKHQ9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayBuYW1lIGlzIHVuZGVmaW5lZCIpO2lmKGU9PT12b2lkIDB8fGUubGVuZ3RoPT09MCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IG5vIGtleWZyYW1lcyBpbiB0cmFjayBuYW1lZCAiK3QpO3RoaXMubmFtZT10LHRoaXMudGltZXM9UHIoZSx0aGlzLlRpbWVCdWZmZXJUeXBlKSx0aGlzLnZhbHVlcz1QcihuLHRoaXMuVmFsdWVCdWZmZXJUeXBlKSx0aGlzLnNldEludGVycG9sYXRpb24ocnx8dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9c3RhdGljIHRvSlNPTih0KXtjb25zdCBlPXQuY29uc3RydWN0b3I7bGV0IG47aWYoZS50b0pTT04hPT10aGlzLnRvSlNPTiluPWUudG9KU09OKHQpO2Vsc2V7bj17bmFtZTp0Lm5hbWUsdGltZXM6UHIodC50aW1lcyxBcnJheSksdmFsdWVzOlByKHQudmFsdWVzLEFycmF5KX07Y29uc3Qgcj10LmdldEludGVycG9sYXRpb24oKTtyIT09dC5EZWZhdWx0SW50ZXJwb2xhdGlvbiYmKG4uaW50ZXJwb2xhdGlvbj1yKX1yZXR1cm4gbi50eXBlPXQuVmFsdWVUeXBlTmFtZSxufUludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlKHQpe3JldHVybiBuZXcgZHkodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLHQpfUludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcih0KXtyZXR1cm4gbmV3IHpmKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSx0KX1JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGgodCl7cmV0dXJuIG5ldyBmeSh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksdCl9c2V0SW50ZXJwb2xhdGlvbih0KXtsZXQgZTtzd2l0Y2godCl7Y2FzZSBNbzplPXRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU7YnJlYWs7Y2FzZSB5bDplPXRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyO2JyZWFrO2Nhc2Ugdmw6ZT10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDticmVha31pZihlPT09dm9pZCAwKXtjb25zdCBuPSJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAiK3RoaXMuVmFsdWVUeXBlTmFtZSsiIGtleWZyYW1lIHRyYWNrIG5hbWVkICIrdGhpcy5uYW1lO2lmKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ9PT12b2lkIDApaWYodCE9PXRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pdGhpcy5zZXRJbnRlcnBvbGF0aW9uKHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pO2Vsc2UgdGhyb3cgbmV3IEVycm9yKG4pO3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLktleWZyYW1lVHJhY2s6IixuKSx0aGlzfXJldHVybiB0aGlzLmNyZWF0ZUludGVycG9sYW50PWUsdGhpc31nZXRJbnRlcnBvbGF0aW9uKCl7c3dpdGNoKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpe2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpyZXR1cm4gTW87Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpyZXR1cm4geWw7Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpyZXR1cm4gdmx9fWdldFZhbHVlU2l6ZSgpe3JldHVybiB0aGlzLnZhbHVlcy5sZW5ndGgvdGhpcy50aW1lcy5sZW5ndGh9c2hpZnQodCl7aWYodCE9PTApe2NvbnN0IGU9dGhpcy50aW1lcztmb3IobGV0IG49MCxyPWUubGVuZ3RoO24hPT1yOysrbillW25dKz10fXJldHVybiB0aGlzfXNjYWxlKHQpe2lmKHQhPT0xKXtjb25zdCBlPXRoaXMudGltZXM7Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuIT09cjsrK24pZVtuXSo9dH1yZXR1cm4gdGhpc310cmltKHQsZSl7Y29uc3Qgbj10aGlzLnRpbWVzLHI9bi5sZW5ndGg7bGV0IHM9MCxvPXItMTtmb3IoO3MhPT1yJiZuW3NdPHQ7KSsrcztmb3IoO28hPT0tMSYmbltvXT5lOyktLW87aWYoKytvLHMhPT0wfHxvIT09cil7cz49byYmKG89TWF0aC5tYXgobywxKSxzPW8tMSk7Y29uc3QgYT10aGlzLmdldFZhbHVlU2l6ZSgpO3RoaXMudGltZXM9bi5zbGljZShzLG8pLHRoaXMudmFsdWVzPXRoaXMudmFsdWVzLnNsaWNlKHMqYSxvKmEpfXJldHVybiB0aGlzfXZhbGlkYXRlKCl7bGV0IHQ9ITA7Y29uc3QgZT10aGlzLmdldFZhbHVlU2l6ZSgpO2UtTWF0aC5mbG9vcihlKSE9PTAmJihjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBJbnZhbGlkIHZhbHVlIHNpemUgaW4gdHJhY2suIix0aGlzKSx0PSExKTtjb25zdCBuPXRoaXMudGltZXMscj10aGlzLnZhbHVlcyxzPW4ubGVuZ3RoO3M9PT0wJiYoY29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuIix0aGlzKSx0PSExKTtsZXQgbz1udWxsO2ZvcihsZXQgYT0wO2EhPT1zO2ErKyl7Y29uc3QgbD1uW2FdO2lmKHR5cGVvZiBsPT0ibnVtYmVyIiYmaXNOYU4obCkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFRpbWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLiIsdGhpcyxhLGwpLHQ9ITE7YnJlYWt9aWYobyE9PW51bGwmJm8+bCl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuIix0aGlzLGEsbCxvKSx0PSExO2JyZWFrfW89bH1pZihyIT09dm9pZCAwJiZ1eShyKSlmb3IobGV0IGE9MCxsPXIubGVuZ3RoO2EhPT1sOysrYSl7Y29uc3QgYz1yW2FdO2lmKGlzTmFOKGMpKXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBWYWx1ZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIix0aGlzLGEsYyksdD0hMTticmVha319cmV0dXJuIHR9b3B0aW1pemUoKXtjb25zdCB0PXRoaXMudGltZXMuc2xpY2UoKSxlPXRoaXMudmFsdWVzLnNsaWNlKCksbj10aGlzLmdldFZhbHVlU2l6ZSgpLHI9dGhpcy5nZXRJbnRlcnBvbGF0aW9uKCk9PT12bCxzPXQubGVuZ3RoLTE7bGV0IG89MTtmb3IobGV0IGE9MTthPHM7KythKXtsZXQgbD0hMTtjb25zdCBjPXRbYV0sdT10W2ErMV07aWYoYyE9PXUmJihhIT09MXx8YyE9PXRbMF0pKWlmKHIpbD0hMDtlbHNle2NvbnN0IGg9YSpuLGY9aC1uLGQ9aCtuO2ZvcihsZXQgcD0wO3AhPT1uOysrcCl7Y29uc3QgeT1lW2grcF07aWYoeSE9PWVbZitwXXx8eSE9PWVbZCtwXSl7bD0hMDticmVha319fWlmKGwpe2lmKGEhPT1vKXt0W29dPXRbYV07Y29uc3QgaD1hKm4sZj1vKm47Zm9yKGxldCBkPTA7ZCE9PW47KytkKWVbZitkXT1lW2grZF19KytvfX1pZihzPjApe3Rbb109dFtzXTtmb3IobGV0IGE9cypuLGw9bypuLGM9MDtjIT09bjsrK2MpZVtsK2NdPWVbYStjXTsrK299cmV0dXJuIG8hPT10Lmxlbmd0aD8odGhpcy50aW1lcz10LnNsaWNlKDAsbyksdGhpcy52YWx1ZXM9ZS5zbGljZSgwLG8qbikpOih0aGlzLnRpbWVzPXQsdGhpcy52YWx1ZXM9ZSksdGhpc31jbG9uZSgpe2NvbnN0IHQ9dGhpcy50aW1lcy5zbGljZSgpLGU9dGhpcy52YWx1ZXMuc2xpY2UoKSxuPXRoaXMuY29uc3RydWN0b3Iscj1uZXcgbih0aGlzLm5hbWUsdCxlKTtyZXR1cm4gci5jcmVhdGVJbnRlcnBvbGFudD10aGlzLmNyZWF0ZUludGVycG9sYW50LHJ9fVduLnByb3RvdHlwZS5UaW1lQnVmZmVyVHlwZT1GbG9hdDMyQXJyYXksV24ucHJvdG90eXBlLlZhbHVlQnVmZmVyVHlwZT1GbG9hdDMyQXJyYXksV24ucHJvdG90eXBlLkRlZmF1bHRJbnRlcnBvbGF0aW9uPXlsO2NsYXNzIElyIGV4dGVuZHMgV257Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQsZSxuKX19SXIucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9ImJvb2wiLElyLnByb3RvdHlwZS5WYWx1ZUJ1ZmZlclR5cGU9QXJyYXksSXIucHJvdG90eXBlLkRlZmF1bHRJbnRlcnBvbGF0aW9uPU1vLElyLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI9dm9pZCAwLElyLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg9dm9pZCAwO2NsYXNzIGtmIGV4dGVuZHMgV257fWtmLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJjb2xvciI7Y2xhc3MgaWEgZXh0ZW5kcyBXbnt9aWEucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9Im51bWJlciI7Y2xhc3MgcHkgZXh0ZW5kcyBuYXtjb25zdHJ1Y3Rvcih0LGUsbixyKXtzdXBlcih0LGUsbixyKX1pbnRlcnBvbGF0ZV8odCxlLG4scil7Y29uc3Qgcz10aGlzLnJlc3VsdEJ1ZmZlcixvPXRoaXMuc2FtcGxlVmFsdWVzLGE9dGhpcy52YWx1ZVNpemUsbD0obi1lKS8oci1lKTtsZXQgYz10KmE7Zm9yKGxldCB1PWMrYTtjIT09dTtjKz00KXVuLnNsZXJwRmxhdChzLDAsbyxjLWEsbyxjLGwpO3JldHVybiBzfX1jbGFzcyByYSBleHRlbmRzIFdue0ludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcih0KXtyZXR1cm4gbmV3IHB5KHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSx0KX19cmEucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9InF1YXRlcm5pb24iLHJhLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg9dm9pZCAwO2NsYXNzIExyIGV4dGVuZHMgV257Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQsZSxuKX19THIucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9InN0cmluZyIsTHIucHJvdG90eXBlLlZhbHVlQnVmZmVyVHlwZT1BcnJheSxMci5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb249TW8sTHIucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcj12b2lkIDAsTHIucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aD12b2lkIDA7Y2xhc3Mgc2EgZXh0ZW5kcyBXbnt9c2EucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9InZlY3RvciI7Y2xhc3Mgb2F7Y29uc3RydWN0b3IodD0iIixlPS0xLG49W10scj1fbCl7dGhpcy5uYW1lPXQsdGhpcy50cmFja3M9bix0aGlzLmR1cmF0aW9uPWUsdGhpcy5ibGVuZE1vZGU9cix0aGlzLnV1aWQ9X24oKSx0aGlzLmR1cmF0aW9uPDAmJnRoaXMucmVzZXREdXJhdGlvbigpfXN0YXRpYyBwYXJzZSh0KXtjb25zdCBlPVtdLG49dC50cmFja3Mscj0xLyh0LmZwc3x8MSk7Zm9yKGxldCBvPTAsYT1uLmxlbmd0aDtvIT09YTsrK28pZS5wdXNoKGpUKG5bb10pLnNjYWxlKHIpKTtjb25zdCBzPW5ldyB0aGlzKHQubmFtZSx0LmR1cmF0aW9uLGUsdC5ibGVuZE1vZGUpO3JldHVybiBzLnV1aWQ9dC51dWlkLHN9c3RhdGljIHRvSlNPTih0KXtjb25zdCBlPVtdLG49dC50cmFja3Mscj17bmFtZTp0Lm5hbWUsZHVyYXRpb246dC5kdXJhdGlvbix0cmFja3M6ZSx1dWlkOnQudXVpZCxibGVuZE1vZGU6dC5ibGVuZE1vZGV9O2ZvcihsZXQgcz0wLG89bi5sZW5ndGg7cyE9PW87KytzKWUucHVzaChXbi50b0pTT04obltzXSkpO3JldHVybiByfXN0YXRpYyBDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZSh0LGUsbixyKXtjb25zdCBzPWUubGVuZ3RoLG89W107Zm9yKGxldCBhPTA7YTxzO2ErKyl7bGV0IGw9W10sYz1bXTtsLnB1c2goKGErcy0xKSVzLGEsKGErMSklcyksYy5wdXNoKDAsMSwwKTtjb25zdCB1PWh5KGwpO2w9T2YobCwxLHUpLGM9T2YoYywxLHUpLCFyJiZsWzBdPT09MCYmKGwucHVzaChzKSxjLnB1c2goY1swXSkpLG8ucHVzaChuZXcgaWEoIi5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIitlW2FdLm5hbWUrIl0iLGwsYykuc2NhbGUoMS9uKSl9cmV0dXJuIG5ldyB0aGlzKHQsLTEsbyl9c3RhdGljIGZpbmRCeU5hbWUodCxlKXtsZXQgbj10O2lmKCFBcnJheS5pc0FycmF5KHQpKXtjb25zdCByPXQ7bj1yLmdlb21ldHJ5JiZyLmdlb21ldHJ5LmFuaW1hdGlvbnN8fHIuYW5pbWF0aW9uc31mb3IobGV0IHI9MDtyPG4ubGVuZ3RoO3IrKylpZihuW3JdLm5hbWU9PT1lKXJldHVybiBuW3JdO3JldHVybiBudWxsfXN0YXRpYyBDcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlcyh0LGUsbil7Y29uc3Qgcj17fSxzPS9eKFtcdy1dKj8pKFtcZF0rKSQvO2ZvcihsZXQgYT0wLGw9dC5sZW5ndGg7YTxsO2ErKyl7Y29uc3QgYz10W2FdLHU9Yy5uYW1lLm1hdGNoKHMpO2lmKHUmJnUubGVuZ3RoPjEpe2NvbnN0IGg9dVsxXTtsZXQgZj1yW2hdO2Z8fChyW2hdPWY9W10pLGYucHVzaChjKX19Y29uc3Qgbz1bXTtmb3IoY29uc3QgYSBpbiByKW8ucHVzaCh0aGlzLkNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKGEsclthXSxlLG4pKTtyZXR1cm4gb31zdGF0aWMgcGFyc2VBbmltYXRpb24odCxlKXtpZighdClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uQ2xpcDogTm8gYW5pbWF0aW9uIGluIEpTT05Mb2FkZXIgZGF0YS4iKSxudWxsO2NvbnN0IG49ZnVuY3Rpb24oaCxmLGQscCx5KXtpZihkLmxlbmd0aCE9PTApe2NvbnN0IG09W10sZz1bXTtCZihkLG0sZyxwKSxtLmxlbmd0aCE9PTAmJnkucHVzaChuZXcgaChmLG0sZykpfX0scj1bXSxzPXQubmFtZXx8ImRlZmF1bHQiLG89dC5mcHN8fDMwLGE9dC5ibGVuZE1vZGU7bGV0IGw9dC5sZW5ndGh8fC0xO2NvbnN0IGM9dC5oaWVyYXJjaHl8fFtdO2ZvcihsZXQgaD0wO2g8Yy5sZW5ndGg7aCsrKXtjb25zdCBmPWNbaF0ua2V5cztpZighKCFmfHxmLmxlbmd0aD09PTApKWlmKGZbMF0ubW9ycGhUYXJnZXRzKXtjb25zdCBkPXt9O2xldCBwO2ZvcihwPTA7cDxmLmxlbmd0aDtwKyspaWYoZltwXS5tb3JwaFRhcmdldHMpZm9yKGxldCB5PTA7eTxmW3BdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7eSsrKWRbZltwXS5tb3JwaFRhcmdldHNbeV1dPS0xO2Zvcihjb25zdCB5IGluIGQpe2NvbnN0IG09W10sZz1bXTtmb3IobGV0IHg9MDt4IT09ZltwXS5tb3JwaFRhcmdldHMubGVuZ3RoOysreCl7Y29uc3Qgdj1mW3BdO20ucHVzaCh2LnRpbWUpLGcucHVzaCh2Lm1vcnBoVGFyZ2V0PT09eT8xOjApfXIucHVzaChuZXcgaWEoIi5tb3JwaFRhcmdldEluZmx1ZW5jZVsiK3krIl0iLG0sZykpfWw9ZC5sZW5ndGgqb31lbHNle2NvbnN0IGQ9Ii5ib25lc1siK2VbaF0ubmFtZSsiXSI7bihzYSxkKyIucG9zaXRpb24iLGYsInBvcyIsciksbihyYSxkKyIucXVhdGVybmlvbiIsZiwicm90IixyKSxuKHNhLGQrIi5zY2FsZSIsZiwic2NsIixyKX19cmV0dXJuIHIubGVuZ3RoPT09MD9udWxsOm5ldyB0aGlzKHMsbCxyLGEpfXJlc2V0RHVyYXRpb24oKXtjb25zdCB0PXRoaXMudHJhY2tzO2xldCBlPTA7Zm9yKGxldCBuPTAscj10Lmxlbmd0aDtuIT09cjsrK24pe2NvbnN0IHM9dGhpcy50cmFja3Nbbl07ZT1NYXRoLm1heChlLHMudGltZXNbcy50aW1lcy5sZW5ndGgtMV0pfXJldHVybiB0aGlzLmR1cmF0aW9uPWUsdGhpc310cmltKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnRyYWNrcy5sZW5ndGg7dCsrKXRoaXMudHJhY2tzW3RdLnRyaW0oMCx0aGlzLmR1cmF0aW9uKTtyZXR1cm4gdGhpc312YWxpZGF0ZSgpe2xldCB0PSEwO2ZvcihsZXQgZT0wO2U8dGhpcy50cmFja3MubGVuZ3RoO2UrKyl0PXQmJnRoaXMudHJhY2tzW2VdLnZhbGlkYXRlKCk7cmV0dXJuIHR9b3B0aW1pemUoKXtmb3IobGV0IHQ9MDt0PHRoaXMudHJhY2tzLmxlbmd0aDt0KyspdGhpcy50cmFja3NbdF0ub3B0aW1pemUoKTtyZXR1cm4gdGhpc31jbG9uZSgpe2NvbnN0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnRyYWNrcy5sZW5ndGg7ZSsrKXQucHVzaCh0aGlzLnRyYWNrc1tlXS5jbG9uZSgpKTtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5uYW1lLHRoaXMuZHVyYXRpb24sdCx0aGlzLmJsZW5kTW9kZSl9dG9KU09OKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9KU09OKHRoaXMpfX1mdW5jdGlvbiBLVChpKXtzd2l0Y2goaS50b0xvd2VyQ2FzZSgpKXtjYXNlInNjYWxhciI6Y2FzZSJkb3VibGUiOmNhc2UiZmxvYXQiOmNhc2UibnVtYmVyIjpjYXNlImludGVnZXIiOnJldHVybiBpYTtjYXNlInZlY3RvciI6Y2FzZSJ2ZWN0b3IyIjpjYXNlInZlY3RvcjMiOmNhc2UidmVjdG9yNCI6cmV0dXJuIHNhO2Nhc2UiY29sb3IiOnJldHVybiBrZjtjYXNlInF1YXRlcm5pb24iOnJldHVybiByYTtjYXNlImJvb2wiOmNhc2UiYm9vbGVhbiI6cmV0dXJuIElyO2Nhc2Uic3RyaW5nIjpyZXR1cm4gTHJ9dGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIitpKX1mdW5jdGlvbiBqVChpKXtpZihpLnR5cGU9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayB0eXBlIHVuZGVmaW5lZCwgY2FuIG5vdCBwYXJzZSIpO2NvbnN0IHQ9S1QoaS50eXBlKTtpZihpLnRpbWVzPT09dm9pZCAwKXtjb25zdCBlPVtdLG49W107QmYoaS5rZXlzLGUsbiwidmFsdWUiKSxpLnRpbWVzPWUsaS52YWx1ZXM9bn1yZXR1cm4gdC5wYXJzZSE9PXZvaWQgMD90LnBhcnNlKGkpOm5ldyB0KGkubmFtZSxpLnRpbWVzLGkudmFsdWVzLGkuaW50ZXJwb2xhdGlvbil9Y29uc3QgQWk9e2VuYWJsZWQ6ITEsZmlsZXM6e30sYWRkOmZ1bmN0aW9uKGksdCl7dGhpcy5lbmFibGVkIT09ITEmJih0aGlzLmZpbGVzW2ldPXQpfSxnZXQ6ZnVuY3Rpb24oaSl7aWYodGhpcy5lbmFibGVkIT09ITEpcmV0dXJuIHRoaXMuZmlsZXNbaV19LHJlbW92ZTpmdW5jdGlvbihpKXtkZWxldGUgdGhpcy5maWxlc1tpXX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmZpbGVzPXt9fX07Y2xhc3MgR2Z7Y29uc3RydWN0b3IodCxlLG4pe2NvbnN0IHI9dGhpcztsZXQgcz0hMSxvPTAsYT0wLGw7Y29uc3QgYz1bXTt0aGlzLm9uU3RhcnQ9dm9pZCAwLHRoaXMub25Mb2FkPXQsdGhpcy5vblByb2dyZXNzPWUsdGhpcy5vbkVycm9yPW4sdGhpcy5pdGVtU3RhcnQ9ZnVuY3Rpb24odSl7YSsrLHM9PT0hMSYmci5vblN0YXJ0IT09dm9pZCAwJiZyLm9uU3RhcnQodSxvLGEpLHM9ITB9LHRoaXMuaXRlbUVuZD1mdW5jdGlvbih1KXtvKyssci5vblByb2dyZXNzIT09dm9pZCAwJiZyLm9uUHJvZ3Jlc3ModSxvLGEpLG89PT1hJiYocz0hMSxyLm9uTG9hZCE9PXZvaWQgMCYmci5vbkxvYWQoKSl9LHRoaXMuaXRlbUVycm9yPWZ1bmN0aW9uKHUpe3Iub25FcnJvciE9PXZvaWQgMCYmci5vbkVycm9yKHUpfSx0aGlzLnJlc29sdmVVUkw9ZnVuY3Rpb24odSl7cmV0dXJuIGw/bCh1KTp1fSx0aGlzLnNldFVSTE1vZGlmaWVyPWZ1bmN0aW9uKHUpe3JldHVybiBsPXUsdGhpc30sdGhpcy5hZGRIYW5kbGVyPWZ1bmN0aW9uKHUsaCl7cmV0dXJuIGMucHVzaCh1LGgpLHRoaXN9LHRoaXMucmVtb3ZlSGFuZGxlcj1mdW5jdGlvbih1KXtjb25zdCBoPWMuaW5kZXhPZih1KTtyZXR1cm4gaCE9PS0xJiZjLnNwbGljZShoLDIpLHRoaXN9LHRoaXMuZ2V0SGFuZGxlcj1mdW5jdGlvbih1KXtmb3IobGV0IGg9MCxmPWMubGVuZ3RoO2g8ZjtoKz0yKXtjb25zdCBkPWNbaF0scD1jW2grMV07aWYoZC5nbG9iYWwmJihkLmxhc3RJbmRleD0wKSxkLnRlc3QodSkpcmV0dXJuIHB9cmV0dXJuIG51bGx9fX1jb25zdCBteT1uZXcgR2Y7Y2xhc3MgZm57Y29uc3RydWN0b3IodCl7dGhpcy5tYW5hZ2VyPXQhPT12b2lkIDA/dDpteSx0aGlzLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLHRoaXMud2l0aENyZWRlbnRpYWxzPSExLHRoaXMucGF0aD0iIix0aGlzLnJlc291cmNlUGF0aD0iIix0aGlzLnJlcXVlc3RIZWFkZXI9e319bG9hZCgpe31sb2FkQXN5bmModCxlKXtjb25zdCBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHIscyl7bi5sb2FkKHQscixlLHMpfSl9cGFyc2UoKXt9c2V0Q3Jvc3NPcmlnaW4odCl7cmV0dXJuIHRoaXMuY3Jvc3NPcmlnaW49dCx0aGlzfXNldFdpdGhDcmVkZW50aWFscyh0KXtyZXR1cm4gdGhpcy53aXRoQ3JlZGVudGlhbHM9dCx0aGlzfXNldFBhdGgodCl7cmV0dXJuIHRoaXMucGF0aD10LHRoaXN9c2V0UmVzb3VyY2VQYXRoKHQpe3JldHVybiB0aGlzLnJlc291cmNlUGF0aD10LHRoaXN9c2V0UmVxdWVzdEhlYWRlcih0KXtyZXR1cm4gdGhpcy5yZXF1ZXN0SGVhZGVyPXQsdGhpc319Zm4uREVGQVVMVF9NQVRFUklBTF9OQU1FPSJfX0RFRkFVTFQiO2NvbnN0IEVpPXt9O2NsYXNzIFFUIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0KSx0aGlzLnJlc3BvbnNlPWV9fWNsYXNzIFRpIGV4dGVuZHMgZm57Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsbixyKXt0PT09dm9pZCAwJiYodD0iIiksdGhpcy5wYXRoIT09dm9pZCAwJiYodD10aGlzLnBhdGgrdCksdD10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCh0KTtjb25zdCBzPUFpLmdldCh0KTtpZihzIT09dm9pZCAwKXJldHVybiB0aGlzLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLHNldFRpbWVvdXQoKCk9PntlJiZlKHMpLHRoaXMubWFuYWdlci5pdGVtRW5kKHQpfSwwKSxzO2lmKEVpW3RdIT09dm9pZCAwKXtFaVt0XS5wdXNoKHtvbkxvYWQ6ZSxvblByb2dyZXNzOm4sb25FcnJvcjpyfSk7cmV0dXJufUVpW3RdPVtdLEVpW3RdLnB1c2goe29uTG9hZDplLG9uUHJvZ3Jlc3M6bixvbkVycm9yOnJ9KTtjb25zdCBvPW5ldyBSZXF1ZXN0KHQse2hlYWRlcnM6bmV3IEhlYWRlcnModGhpcy5yZXF1ZXN0SGVhZGVyKSxjcmVkZW50aWFsczp0aGlzLndpdGhDcmVkZW50aWFscz8iaW5jbHVkZSI6InNhbWUtb3JpZ2luIn0pLGE9dGhpcy5taW1lVHlwZSxsPXRoaXMucmVzcG9uc2VUeXBlO2ZldGNoKG8pLnRoZW4oYz0+e2lmKGMuc3RhdHVzPT09MjAwfHxjLnN0YXR1cz09PTApe2lmKGMuc3RhdHVzPT09MCYmY29uc29sZS53YXJuKCJUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLiIpLHR5cGVvZiBSZWFkYWJsZVN0cmVhbT09InVuZGVmaW5lZCJ8fGMuYm9keT09PXZvaWQgMHx8Yy5ib2R5LmdldFJlYWRlcj09PXZvaWQgMClyZXR1cm4gYztjb25zdCB1PUVpW3RdLGg9Yy5ib2R5LmdldFJlYWRlcigpLGY9Yy5oZWFkZXJzLmdldCgiWC1GaWxlLVNpemUiKXx8Yy5oZWFkZXJzLmdldCgiQ29udGVudC1MZW5ndGgiKSxkPWY/cGFyc2VJbnQoZik6MCxwPWQhPT0wO2xldCB5PTA7Y29uc3QgbT1uZXcgUmVhZGFibGVTdHJlYW0oe3N0YXJ0KGcpe3goKTtmdW5jdGlvbiB4KCl7aC5yZWFkKCkudGhlbigoe2RvbmU6dix2YWx1ZTpffSk9PntpZih2KWcuY2xvc2UoKTtlbHNle3krPV8uYnl0ZUxlbmd0aDtjb25zdCBFPW5ldyBQcm9ncmVzc0V2ZW50KCJwcm9ncmVzcyIse2xlbmd0aENvbXB1dGFibGU6cCxsb2FkZWQ6eSx0b3RhbDpkfSk7Zm9yKGxldCBiPTAsVD11Lmxlbmd0aDtiPFQ7YisrKXtjb25zdCBQPXVbYl07UC5vblByb2dyZXNzJiZQLm9uUHJvZ3Jlc3MoRSl9Zy5lbnF1ZXVlKF8pLHgoKX19LHY9PntnLmVycm9yKHYpfSl9fX0pO3JldHVybiBuZXcgUmVzcG9uc2UobSl9ZWxzZSB0aHJvdyBuZXcgUVQoYGZldGNoIGZvciAiJHtjLnVybH0iIHJlc3BvbmRlZCB3aXRoICR7Yy5zdGF0dXN9OiAke2Muc3RhdHVzVGV4dH1gLGMpfSkudGhlbihjPT57c3dpdGNoKGwpe2Nhc2UiYXJyYXlidWZmZXIiOnJldHVybiBjLmFycmF5QnVmZmVyKCk7Y2FzZSJibG9iIjpyZXR1cm4gYy5ibG9iKCk7Y2FzZSJkb2N1bWVudCI6cmV0dXJuIGMudGV4dCgpLnRoZW4odT0+bmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh1LGEpKTtjYXNlImpzb24iOnJldHVybiBjLmpzb24oKTtkZWZhdWx0OmlmKGE9PT12b2lkIDApcmV0dXJuIGMudGV4dCgpO3tjb25zdCBoPS9jaGFyc2V0PSI/KFteOyJcc10qKSI/L2kuZXhlYyhhKSxmPWgmJmhbMV0/aFsxXS50b0xvd2VyQ2FzZSgpOnZvaWQgMCxkPW5ldyBUZXh0RGVjb2RlcihmKTtyZXR1cm4gYy5hcnJheUJ1ZmZlcigpLnRoZW4ocD0+ZC5kZWNvZGUocCkpfX19KS50aGVuKGM9PntBaS5hZGQodCxjKTtjb25zdCB1PUVpW3RdO2RlbGV0ZSBFaVt0XTtmb3IobGV0IGg9MCxmPXUubGVuZ3RoO2g8ZjtoKyspe2NvbnN0IGQ9dVtoXTtkLm9uTG9hZCYmZC5vbkxvYWQoYyl9fSkuY2F0Y2goYz0+e2NvbnN0IHU9RWlbdF07aWYodT09PXZvaWQgMCl0aHJvdyB0aGlzLm1hbmFnZXIuaXRlbUVycm9yKHQpLGM7ZGVsZXRlIEVpW3RdO2ZvcihsZXQgaD0wLGY9dS5sZW5ndGg7aDxmO2grKyl7Y29uc3QgZD11W2hdO2Qub25FcnJvciYmZC5vbkVycm9yKGMpfXRoaXMubWFuYWdlci5pdGVtRXJyb3IodCl9KS5maW5hbGx5KCgpPT57dGhpcy5tYW5hZ2VyLml0ZW1FbmQodCl9KSx0aGlzLm1hbmFnZXIuaXRlbVN0YXJ0KHQpfXNldFJlc3BvbnNlVHlwZSh0KXtyZXR1cm4gdGhpcy5yZXNwb25zZVR5cGU9dCx0aGlzfXNldE1pbWVUeXBlKHQpe3JldHVybiB0aGlzLm1pbWVUeXBlPXQsdGhpc319Y2xhc3MgdEMgZXh0ZW5kcyBmbntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLHIpe2NvbnN0IHM9dGhpcyxvPW5ldyBUaSh0aGlzLm1hbmFnZXIpO28uc2V0UGF0aCh0aGlzLnBhdGgpLG8uc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLG8uc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKSxvLmxvYWQodCxmdW5jdGlvbihhKXt0cnl7ZShzLnBhcnNlKEpTT04ucGFyc2UoYSkpKX1jYXRjaChsKXtyP3IobCk6Y29uc29sZS5lcnJvcihsKSxzLm1hbmFnZXIuaXRlbUVycm9yKHQpfX0sbixyKX1wYXJzZSh0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCByPW9hLnBhcnNlKHRbbl0pO2UucHVzaChyKX1yZXR1cm4gZX19Y2xhc3MgZUMgZXh0ZW5kcyBmbntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLHIpe2NvbnN0IHM9dGhpcyxvPVtdLGE9bmV3IGZjLGw9bmV3IFRpKHRoaXMubWFuYWdlcik7bC5zZXRQYXRoKHRoaXMucGF0aCksbC5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIiksbC5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksbC5zZXRXaXRoQ3JlZGVudGlhbHMocy53aXRoQ3JlZGVudGlhbHMpO2xldCBjPTA7ZnVuY3Rpb24gdShoKXtsLmxvYWQodFtoXSxmdW5jdGlvbihmKXtjb25zdCBkPXMucGFyc2UoZiwhMCk7b1toXT17d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHQsZm9ybWF0OmQuZm9ybWF0LG1pcG1hcHM6ZC5taXBtYXBzfSxjKz0xLGM9PT02JiYoZC5taXBtYXBDb3VudD09PTEmJihhLm1pbkZpbHRlcj1SZSksYS5pbWFnZT1vLGEuZm9ybWF0PWQuZm9ybWF0LGEubmVlZHNVcGRhdGU9ITAsZSYmZShhKSl9LG4scil9aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IobGV0IGg9MCxmPXQubGVuZ3RoO2g8ZjsrK2gpdShoKTtlbHNlIGwubG9hZCh0LGZ1bmN0aW9uKGgpe2NvbnN0IGY9cy5wYXJzZShoLCEwKTtpZihmLmlzQ3ViZW1hcCl7Y29uc3QgZD1mLm1pcG1hcHMubGVuZ3RoL2YubWlwbWFwQ291bnQ7Zm9yKGxldCBwPTA7cDxkO3ArKyl7b1twXT17bWlwbWFwczpbXX07Zm9yKGxldCB5PTA7eTxmLm1pcG1hcENvdW50O3krKylvW3BdLm1pcG1hcHMucHVzaChmLm1pcG1hcHNbcCpmLm1pcG1hcENvdW50K3ldKSxvW3BdLmZvcm1hdD1mLmZvcm1hdCxvW3BdLndpZHRoPWYud2lkdGgsb1twXS5oZWlnaHQ9Zi5oZWlnaHR9YS5pbWFnZT1vfWVsc2UgYS5pbWFnZS53aWR0aD1mLndpZHRoLGEuaW1hZ2UuaGVpZ2h0PWYuaGVpZ2h0LGEubWlwbWFwcz1mLm1pcG1hcHM7Zi5taXBtYXBDb3VudD09PTEmJihhLm1pbkZpbHRlcj1SZSksYS5mb3JtYXQ9Zi5mb3JtYXQsYS5uZWVkc1VwZGF0ZT0hMCxlJiZlKGEpfSxuLHIpO3JldHVybiBhfX1jbGFzcyBhYSBleHRlbmRzIGZue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4scil7dGhpcy5wYXRoIT09dm9pZCAwJiYodD10aGlzLnBhdGgrdCksdD10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCh0KTtjb25zdCBzPXRoaXMsbz1BaS5nZXQodCk7aWYobyE9PXZvaWQgMClyZXR1cm4gcy5tYW5hZ2VyLml0ZW1TdGFydCh0KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSYmZShvKSxzLm1hbmFnZXIuaXRlbUVuZCh0KX0sMCksbztjb25zdCBhPVBvKCJpbWciKTtmdW5jdGlvbiBsKCl7dSgpLEFpLmFkZCh0LHRoaXMpLGUmJmUodGhpcykscy5tYW5hZ2VyLml0ZW1FbmQodCl9ZnVuY3Rpb24gYyhoKXt1KCksciYmcihoKSxzLm1hbmFnZXIuaXRlbUVycm9yKHQpLHMubWFuYWdlci5pdGVtRW5kKHQpfWZ1bmN0aW9uIHUoKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLGwsITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGMsITEpfXJldHVybiBhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGwsITEpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGMsITEpLHQuc2xpY2UoMCw1KSE9PSJkYXRhOiImJnRoaXMuY3Jvc3NPcmlnaW4hPT12b2lkIDAmJihhLmNyb3NzT3JpZ2luPXRoaXMuY3Jvc3NPcmlnaW4pLHMubWFuYWdlci5pdGVtU3RhcnQodCksYS5zcmM9dCxhfX1jbGFzcyBuQyBleHRlbmRzIGZue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4scil7Y29uc3Qgcz1uZXcgT287cy5jb2xvclNwYWNlPUxuO2NvbnN0IG89bmV3IGFhKHRoaXMubWFuYWdlcik7by5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKSxvLnNldFBhdGgodGhpcy5wYXRoKTtsZXQgYT0wO2Z1bmN0aW9uIGwoYyl7by5sb2FkKHRbY10sZnVuY3Rpb24odSl7cy5pbWFnZXNbY109dSxhKyssYT09PTYmJihzLm5lZWRzVXBkYXRlPSEwLGUmJmUocykpfSx2b2lkIDAscil9Zm9yKGxldCBjPTA7Yzx0Lmxlbmd0aDsrK2MpbChjKTtyZXR1cm4gc319Y2xhc3MgaUMgZXh0ZW5kcyBmbntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLHIpe2NvbnN0IHM9dGhpcyxvPW5ldyBuaSxhPW5ldyBUaSh0aGlzLm1hbmFnZXIpO3JldHVybiBhLnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKSxhLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxhLnNldFBhdGgodGhpcy5wYXRoKSxhLnNldFdpdGhDcmVkZW50aWFscyhzLndpdGhDcmVkZW50aWFscyksYS5sb2FkKHQsZnVuY3Rpb24obCl7bGV0IGM7dHJ5e2M9cy5wYXJzZShsKX1jYXRjaCh1KXtpZihyIT09dm9pZCAwKXIodSk7ZWxzZXtjb25zb2xlLmVycm9yKHUpO3JldHVybn19Yy5pbWFnZSE9PXZvaWQgMD9vLmltYWdlPWMuaW1hZ2U6Yy5kYXRhIT09dm9pZCAwJiYoby5pbWFnZS53aWR0aD1jLndpZHRoLG8uaW1hZ2UuaGVpZ2h0PWMuaGVpZ2h0LG8uaW1hZ2UuZGF0YT1jLmRhdGEpLG8ud3JhcFM9Yy53cmFwUyE9PXZvaWQgMD9jLndyYXBTOkluLG8ud3JhcFQ9Yy53cmFwVCE9PXZvaWQgMD9jLndyYXBUOkluLG8ubWFnRmlsdGVyPWMubWFnRmlsdGVyIT09dm9pZCAwP2MubWFnRmlsdGVyOlJlLG8ubWluRmlsdGVyPWMubWluRmlsdGVyIT09dm9pZCAwP2MubWluRmlsdGVyOlJlLG8uYW5pc290cm9weT1jLmFuaXNvdHJvcHkhPT12b2lkIDA/Yy5hbmlzb3Ryb3B5OjEsYy5jb2xvclNwYWNlIT09dm9pZCAwJiYoby5jb2xvclNwYWNlPWMuY29sb3JTcGFjZSksYy5mbGlwWSE9PXZvaWQgMCYmKG8uZmxpcFk9Yy5mbGlwWSksYy5mb3JtYXQhPT12b2lkIDAmJihvLmZvcm1hdD1jLmZvcm1hdCksYy50eXBlIT09dm9pZCAwJiYoby50eXBlPWMudHlwZSksYy5taXBtYXBzIT09dm9pZCAwJiYoby5taXBtYXBzPWMubWlwbWFwcyxvLm1pbkZpbHRlcj1qbiksYy5taXBtYXBDb3VudD09PTEmJihvLm1pbkZpbHRlcj1SZSksYy5nZW5lcmF0ZU1pcG1hcHMhPT12b2lkIDAmJihvLmdlbmVyYXRlTWlwbWFwcz1jLmdlbmVyYXRlTWlwbWFwcyksby5uZWVkc1VwZGF0ZT0hMCxlJiZlKG8sYyl9LG4sciksb319Y2xhc3MgckMgZXh0ZW5kcyBmbntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLHIpe2NvbnN0IHM9bmV3IE1lLG89bmV3IGFhKHRoaXMubWFuYWdlcik7cmV0dXJuIG8uc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbiksby5zZXRQYXRoKHRoaXMucGF0aCksby5sb2FkKHQsZnVuY3Rpb24oYSl7cy5pbWFnZT1hLHMubmVlZHNVcGRhdGU9ITAsZSE9PXZvaWQgMCYmZShzKX0sbixyKSxzfX1jbGFzcyBqaSBleHRlbmRzIG5le2NvbnN0cnVjdG9yKHQsZT0xKXtzdXBlcigpLHRoaXMuaXNMaWdodD0hMCx0aGlzLnR5cGU9IkxpZ2h0Iix0aGlzLmNvbG9yPW5ldyB2dCh0KSx0aGlzLmludGVuc2l0eT1lfWRpc3Bvc2UoKXt9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMuaW50ZW5zaXR5PXQuaW50ZW5zaXR5LHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBlLm9iamVjdC5jb2xvcj10aGlzLmNvbG9yLmdldEhleCgpLGUub2JqZWN0LmludGVuc2l0eT10aGlzLmludGVuc2l0eSx0aGlzLmdyb3VuZENvbG9yIT09dm9pZCAwJiYoZS5vYmplY3QuZ3JvdW5kQ29sb3I9dGhpcy5ncm91bmRDb2xvci5nZXRIZXgoKSksdGhpcy5kaXN0YW5jZSE9PXZvaWQgMCYmKGUub2JqZWN0LmRpc3RhbmNlPXRoaXMuZGlzdGFuY2UpLHRoaXMuYW5nbGUhPT12b2lkIDAmJihlLm9iamVjdC5hbmdsZT10aGlzLmFuZ2xlKSx0aGlzLmRlY2F5IT09dm9pZCAwJiYoZS5vYmplY3QuZGVjYXk9dGhpcy5kZWNheSksdGhpcy5wZW51bWJyYSE9PXZvaWQgMCYmKGUub2JqZWN0LnBlbnVtYnJhPXRoaXMucGVudW1icmEpLHRoaXMuc2hhZG93IT09dm9pZCAwJiYoZS5vYmplY3Quc2hhZG93PXRoaXMuc2hhZG93LnRvSlNPTigpKSx0aGlzLnRhcmdldCE9PXZvaWQgMCYmKGUub2JqZWN0LnRhcmdldD10aGlzLnRhcmdldC51dWlkKSxlfX1jbGFzcyBneSBleHRlbmRzIGppe2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0LG4pLHRoaXMuaXNIZW1pc3BoZXJlTGlnaHQ9ITAsdGhpcy50eXBlPSJIZW1pc3BoZXJlTGlnaHQiLHRoaXMucG9zaXRpb24uY29weShuZS5ERUZBVUxUX1VQKSx0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMuZ3JvdW5kQ29sb3I9bmV3IHZ0KGUpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMuZ3JvdW5kQ29sb3IuY29weSh0Lmdyb3VuZENvbG9yKSx0aGlzfX1jb25zdCBWZj1uZXcgTHQseXk9bmV3IEwsdnk9bmV3IEw7Y2xhc3MgSGZ7Y29uc3RydWN0b3IodCl7dGhpcy5jYW1lcmE9dCx0aGlzLmludGVuc2l0eT0xLHRoaXMuYmlhcz0wLHRoaXMubm9ybWFsQmlhcz0wLHRoaXMucmFkaXVzPTEsdGhpcy5ibHVyU2FtcGxlcz04LHRoaXMubWFwU2l6ZT1uZXcgcSg1MTIsNTEyKSx0aGlzLm1hcD1udWxsLHRoaXMubWFwUGFzcz1udWxsLHRoaXMubWF0cml4PW5ldyBMdCx0aGlzLmF1dG9VcGRhdGU9ITAsdGhpcy5uZWVkc1VwZGF0ZT0hMSx0aGlzLl9mcnVzdHVtPW5ldyBCbyx0aGlzLl9mcmFtZUV4dGVudHM9bmV3IHEoMSwxKSx0aGlzLl92aWV3cG9ydENvdW50PTEsdGhpcy5fdmlld3BvcnRzPVtuZXcgb2UoMCwwLDEsMSldfWdldFZpZXdwb3J0Q291bnQoKXtyZXR1cm4gdGhpcy5fdmlld3BvcnRDb3VudH1nZXRGcnVzdHVtKCl7cmV0dXJuIHRoaXMuX2ZydXN0dW19dXBkYXRlTWF0cmljZXModCl7Y29uc3QgZT10aGlzLmNhbWVyYSxuPXRoaXMubWF0cml4O3l5LnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSxlLnBvc2l0aW9uLmNvcHkoeXkpLHZ5LnNldEZyb21NYXRyaXhQb3NpdGlvbih0LnRhcmdldC5tYXRyaXhXb3JsZCksZS5sb29rQXQodnkpLGUudXBkYXRlTWF0cml4V29ybGQoKSxWZi5tdWx0aXBseU1hdHJpY2VzKGUucHJvamVjdGlvbk1hdHJpeCxlLm1hdHJpeFdvcmxkSW52ZXJzZSksdGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChWZiksbi5zZXQoLjUsMCwwLC41LDAsLjUsMCwuNSwwLDAsLjUsLjUsMCwwLDAsMSksbi5tdWx0aXBseShWZil9Z2V0Vmlld3BvcnQodCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1t0XX1nZXRGcmFtZUV4dGVudHMoKXtyZXR1cm4gdGhpcy5fZnJhbWVFeHRlbnRzfWRpc3Bvc2UoKXt0aGlzLm1hcCYmdGhpcy5tYXAuZGlzcG9zZSgpLHRoaXMubWFwUGFzcyYmdGhpcy5tYXBQYXNzLmRpc3Bvc2UoKX1jb3B5KHQpe3JldHVybiB0aGlzLmNhbWVyYT10LmNhbWVyYS5jbG9uZSgpLHRoaXMuaW50ZW5zaXR5PXQuaW50ZW5zaXR5LHRoaXMuYmlhcz10LmJpYXMsdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpcy5tYXBTaXplLmNvcHkodC5tYXBTaXplKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX10b0pTT04oKXtjb25zdCB0PXt9O3JldHVybiB0aGlzLmludGVuc2l0eSE9PTEmJih0LmludGVuc2l0eT10aGlzLmludGVuc2l0eSksdGhpcy5iaWFzIT09MCYmKHQuYmlhcz10aGlzLmJpYXMpLHRoaXMubm9ybWFsQmlhcyE9PTAmJih0Lm5vcm1hbEJpYXM9dGhpcy5ub3JtYWxCaWFzKSx0aGlzLnJhZGl1cyE9PTEmJih0LnJhZGl1cz10aGlzLnJhZGl1cyksKHRoaXMubWFwU2l6ZS54IT09NTEyfHx0aGlzLm1hcFNpemUueSE9PTUxMikmJih0Lm1hcFNpemU9dGhpcy5tYXBTaXplLnRvQXJyYXkoKSksdC5jYW1lcmE9dGhpcy5jYW1lcmEudG9KU09OKCExKS5vYmplY3QsZGVsZXRlIHQuY2FtZXJhLm1hdHJpeCx0fX1jbGFzcyBzQyBleHRlbmRzIEhme2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IGtlKDUwLDEsLjUsNTAwKSksdGhpcy5pc1Nwb3RMaWdodFNoYWRvdz0hMCx0aGlzLmZvY3VzPTF9dXBkYXRlTWF0cmljZXModCl7Y29uc3QgZT10aGlzLmNhbWVyYSxuPW5zKjIqdC5hbmdsZSp0aGlzLmZvY3VzLHI9dGhpcy5tYXBTaXplLndpZHRoL3RoaXMubWFwU2l6ZS5oZWlnaHQscz10LmRpc3RhbmNlfHxlLmZhcjsobiE9PWUuZm92fHxyIT09ZS5hc3BlY3R8fHMhPT1lLmZhcikmJihlLmZvdj1uLGUuYXNwZWN0PXIsZS5mYXI9cyxlLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSksc3VwZXIudXBkYXRlTWF0cmljZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmZvY3VzPXQuZm9jdXMsdGhpc319Y2xhc3MgX3kgZXh0ZW5kcyBqaXtjb25zdHJ1Y3Rvcih0LGUsbj0wLHI9TWF0aC5QSS8zLHM9MCxvPTIpe3N1cGVyKHQsZSksdGhpcy5pc1Nwb3RMaWdodD0hMCx0aGlzLnR5cGU9IlNwb3RMaWdodCIsdGhpcy5wb3NpdGlvbi5jb3B5KG5lLkRFRkFVTFRfVVApLHRoaXMudXBkYXRlTWF0cml4KCksdGhpcy50YXJnZXQ9bmV3IG5lLHRoaXMuZGlzdGFuY2U9bix0aGlzLmFuZ2xlPXIsdGhpcy5wZW51bWJyYT1zLHRoaXMuZGVjYXk9byx0aGlzLm1hcD1udWxsLHRoaXMuc2hhZG93PW5ldyBzQ31nZXQgcG93ZXIoKXtyZXR1cm4gdGhpcy5pbnRlbnNpdHkqTWF0aC5QSX1zZXQgcG93ZXIodCl7dGhpcy5pbnRlbnNpdHk9dC9NYXRoLlBJfWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5kaXN0YW5jZT10LmRpc3RhbmNlLHRoaXMuYW5nbGU9dC5hbmdsZSx0aGlzLnBlbnVtYnJhPXQucGVudW1icmEsdGhpcy5kZWNheT10LmRlY2F5LHRoaXMudGFyZ2V0PXQudGFyZ2V0LmNsb25lKCksdGhpcy5zaGFkb3c9dC5zaGFkb3cuY2xvbmUoKSx0aGlzfX1jb25zdCB4eT1uZXcgTHQsbGE9bmV3IEwsV2Y9bmV3IEw7Y2xhc3Mgb0MgZXh0ZW5kcyBIZntjb25zdHJ1Y3Rvcigpe3N1cGVyKG5ldyBrZSg5MCwxLC41LDUwMCkpLHRoaXMuaXNQb2ludExpZ2h0U2hhZG93PSEwLHRoaXMuX2ZyYW1lRXh0ZW50cz1uZXcgcSg0LDIpLHRoaXMuX3ZpZXdwb3J0Q291bnQ9Nix0aGlzLl92aWV3cG9ydHM9W25ldyBvZSgyLDEsMSwxKSxuZXcgb2UoMCwxLDEsMSksbmV3IG9lKDMsMSwxLDEpLG5ldyBvZSgxLDEsMSwxKSxuZXcgb2UoMywwLDEsMSksbmV3IG9lKDEsMCwxLDEpXSx0aGlzLl9jdWJlRGlyZWN0aW9ucz1bbmV3IEwoMSwwLDApLG5ldyBMKC0xLDAsMCksbmV3IEwoMCwwLDEpLG5ldyBMKDAsMCwtMSksbmV3IEwoMCwxLDApLG5ldyBMKDAsLTEsMCldLHRoaXMuX2N1YmVVcHM9W25ldyBMKDAsMSwwKSxuZXcgTCgwLDEsMCksbmV3IEwoMCwxLDApLG5ldyBMKDAsMSwwKSxuZXcgTCgwLDAsMSksbmV3IEwoMCwwLC0xKV19dXBkYXRlTWF0cmljZXModCxlPTApe2NvbnN0IG49dGhpcy5jYW1lcmEscj10aGlzLm1hdHJpeCxzPXQuZGlzdGFuY2V8fG4uZmFyO3MhPT1uLmZhciYmKG4uZmFyPXMsbi51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCkpLGxhLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSxuLnBvc2l0aW9uLmNvcHkobGEpLFdmLmNvcHkobi5wb3NpdGlvbiksV2YuYWRkKHRoaXMuX2N1YmVEaXJlY3Rpb25zW2VdKSxuLnVwLmNvcHkodGhpcy5fY3ViZVVwc1tlXSksbi5sb29rQXQoV2YpLG4udXBkYXRlTWF0cml4V29ybGQoKSxyLm1ha2VUcmFuc2xhdGlvbigtbGEueCwtbGEueSwtbGEueikseHkubXVsdGlwbHlNYXRyaWNlcyhuLnByb2plY3Rpb25NYXRyaXgsbi5tYXRyaXhXb3JsZEludmVyc2UpLHRoaXMuX2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoeHkpfX1jbGFzcyBNeSBleHRlbmRzIGppe2NvbnN0cnVjdG9yKHQsZSxuPTAscj0yKXtzdXBlcih0LGUpLHRoaXMuaXNQb2ludExpZ2h0PSEwLHRoaXMudHlwZT0iUG9pbnRMaWdodCIsdGhpcy5kaXN0YW5jZT1uLHRoaXMuZGVjYXk9cix0aGlzLnNoYWRvdz1uZXcgb0N9Z2V0IHBvd2VyKCl7cmV0dXJuIHRoaXMuaW50ZW5zaXR5KjQqTWF0aC5QSX1zZXQgcG93ZXIodCl7dGhpcy5pbnRlbnNpdHk9dC8oNCpNYXRoLlBJKX1kaXNwb3NlKCl7dGhpcy5zaGFkb3cuZGlzcG9zZSgpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMuZGlzdGFuY2U9dC5kaXN0YW5jZSx0aGlzLmRlY2F5PXQuZGVjYXksdGhpcy5zaGFkb3c9dC5zaGFkb3cuY2xvbmUoKSx0aGlzfX1jbGFzcyBhQyBleHRlbmRzIEhme2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IEhsKC01LDUsNSwtNSwuNSw1MDApKSx0aGlzLmlzRGlyZWN0aW9uYWxMaWdodFNoYWRvdz0hMH19Y2xhc3MgU3kgZXh0ZW5kcyBqaXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5pc0RpcmVjdGlvbmFsTGlnaHQ9ITAsdGhpcy50eXBlPSJEaXJlY3Rpb25hbExpZ2h0Iix0aGlzLnBvc2l0aW9uLmNvcHkobmUuREVGQVVMVF9VUCksdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLnRhcmdldD1uZXcgbmUsdGhpcy5zaGFkb3c9bmV3IGFDfWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnRhcmdldD10LnRhcmdldC5jbG9uZSgpLHRoaXMuc2hhZG93PXQuc2hhZG93LmNsb25lKCksdGhpc319Y2xhc3MgYnkgZXh0ZW5kcyBqaXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5pc0FtYmllbnRMaWdodD0hMCx0aGlzLnR5cGU9IkFtYmllbnRMaWdodCJ9fWNsYXNzIHd5IGV4dGVuZHMgaml7Y29uc3RydWN0b3IodCxlLG49MTAscj0xMCl7c3VwZXIodCxlKSx0aGlzLmlzUmVjdEFyZWFMaWdodD0hMCx0aGlzLnR5cGU9IlJlY3RBcmVhTGlnaHQiLHRoaXMud2lkdGg9bix0aGlzLmhlaWdodD1yfWdldCBwb3dlcigpe3JldHVybiB0aGlzLmludGVuc2l0eSp0aGlzLndpZHRoKnRoaXMuaGVpZ2h0Kk1hdGguUEl9c2V0IHBvd2VyKHQpe3RoaXMuaW50ZW5zaXR5PXQvKHRoaXMud2lkdGgqdGhpcy5oZWlnaHQqTWF0aC5QSSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLndpZHRoPXQud2lkdGgsdGhpcy5oZWlnaHQ9dC5oZWlnaHQsdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0LndpZHRoPXRoaXMud2lkdGgsZS5vYmplY3QuaGVpZ2h0PXRoaXMuaGVpZ2h0LGV9fWNsYXNzIEF5e2NvbnN0cnVjdG9yKCl7dGhpcy5pc1NwaGVyaWNhbEhhcm1vbmljczM9ITAsdGhpcy5jb2VmZmljaWVudHM9W107Zm9yKGxldCB0PTA7dDw5O3QrKyl0aGlzLmNvZWZmaWNpZW50cy5wdXNoKG5ldyBMKX1zZXQodCl7Zm9yKGxldCBlPTA7ZTw5O2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5jb3B5KHRbZV0pO3JldHVybiB0aGlzfXplcm8oKXtmb3IobGV0IHQ9MDt0PDk7dCsrKXRoaXMuY29lZmZpY2llbnRzW3RdLnNldCgwLDAsMCk7cmV0dXJuIHRoaXN9Z2V0QXQodCxlKXtjb25zdCBuPXQueCxyPXQueSxzPXQueixvPXRoaXMuY29lZmZpY2llbnRzO3JldHVybiBlLmNvcHkob1swXSkubXVsdGlwbHlTY2FsYXIoLjI4MjA5NSksZS5hZGRTY2FsZWRWZWN0b3Iob1sxXSwuNDg4NjAzKnIpLGUuYWRkU2NhbGVkVmVjdG9yKG9bMl0sLjQ4ODYwMypzKSxlLmFkZFNjYWxlZFZlY3RvcihvWzNdLC40ODg2MDMqbiksZS5hZGRTY2FsZWRWZWN0b3Iob1s0XSwxLjA5MjU0OCoobipyKSksZS5hZGRTY2FsZWRWZWN0b3Iob1s1XSwxLjA5MjU0OCoocipzKSksZS5hZGRTY2FsZWRWZWN0b3Iob1s2XSwuMzE1MzkyKigzKnMqcy0xKSksZS5hZGRTY2FsZWRWZWN0b3Iob1s3XSwxLjA5MjU0OCoobipzKSksZS5hZGRTY2FsZWRWZWN0b3Iob1s4XSwuNTQ2Mjc0KihuKm4tcipyKSksZX1nZXRJcnJhZGlhbmNlQXQodCxlKXtjb25zdCBuPXQueCxyPXQueSxzPXQueixvPXRoaXMuY29lZmZpY2llbnRzO3JldHVybiBlLmNvcHkob1swXSkubXVsdGlwbHlTY2FsYXIoLjg4NjIyNyksZS5hZGRTY2FsZWRWZWN0b3Iob1sxXSwyKi41MTE2NjQqciksZS5hZGRTY2FsZWRWZWN0b3Iob1syXSwyKi41MTE2NjQqcyksZS5hZGRTY2FsZWRWZWN0b3Iob1szXSwyKi41MTE2NjQqbiksZS5hZGRTY2FsZWRWZWN0b3Iob1s0XSwyKi40MjkwNDMqbipyKSxlLmFkZFNjYWxlZFZlY3RvcihvWzVdLDIqLjQyOTA0MypyKnMpLGUuYWRkU2NhbGVkVmVjdG9yKG9bNl0sLjc0MzEyNSpzKnMtLjI0NzcwOCksZS5hZGRTY2FsZWRWZWN0b3Iob1s3XSwyKi40MjkwNDMqbipzKSxlLmFkZFNjYWxlZFZlY3RvcihvWzhdLC40MjkwNDMqKG4qbi1yKnIpKSxlfWFkZCh0KXtmb3IobGV0IGU9MDtlPDk7ZSsrKXRoaXMuY29lZmZpY2llbnRzW2VdLmFkZCh0LmNvZWZmaWNpZW50c1tlXSk7cmV0dXJuIHRoaXN9YWRkU2NhbGVkU0godCxlKXtmb3IobGV0IG49MDtuPDk7bisrKXRoaXMuY29lZmZpY2llbnRzW25dLmFkZFNjYWxlZFZlY3Rvcih0LmNvZWZmaWNpZW50c1tuXSxlKTtyZXR1cm4gdGhpc31zY2FsZSh0KXtmb3IobGV0IGU9MDtlPDk7ZSsrKXRoaXMuY29lZmZpY2llbnRzW2VdLm11bHRpcGx5U2NhbGFyKHQpO3JldHVybiB0aGlzfWxlcnAodCxlKXtmb3IobGV0IG49MDtuPDk7bisrKXRoaXMuY29lZmZpY2llbnRzW25dLmxlcnAodC5jb2VmZmljaWVudHNbbl0sZSk7cmV0dXJuIHRoaXN9ZXF1YWxzKHQpe2ZvcihsZXQgZT0wO2U8OTtlKyspaWYoIXRoaXMuY29lZmZpY2llbnRzW2VdLmVxdWFscyh0LmNvZWZmaWNpZW50c1tlXSkpcmV0dXJuITE7cmV0dXJuITB9Y29weSh0KXtyZXR1cm4gdGhpcy5zZXQodC5jb2VmZmljaWVudHMpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1mcm9tQXJyYXkodCxlPTApe2NvbnN0IG49dGhpcy5jb2VmZmljaWVudHM7Zm9yKGxldCByPTA7cjw5O3IrKyluW3JdLmZyb21BcnJheSh0LGUrciozKTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuY29lZmZpY2llbnRzO2ZvcihsZXQgcj0wO3I8OTtyKyspbltyXS50b0FycmF5KHQsZStyKjMpO3JldHVybiB0fXN0YXRpYyBnZXRCYXNpc0F0KHQsZSl7Y29uc3Qgbj10Lngscj10Lnkscz10Lno7ZVswXT0uMjgyMDk1LGVbMV09LjQ4ODYwMypyLGVbMl09LjQ4ODYwMypzLGVbM109LjQ4ODYwMypuLGVbNF09MS4wOTI1NDgqbipyLGVbNV09MS4wOTI1NDgqcipzLGVbNl09LjMxNTM5MiooMypzKnMtMSksZVs3XT0xLjA5MjU0OCpuKnMsZVs4XT0uNTQ2Mjc0KihuKm4tcipyKX19Y2xhc3MgRXkgZXh0ZW5kcyBqaXtjb25zdHJ1Y3Rvcih0PW5ldyBBeSxlPTEpe3N1cGVyKHZvaWQgMCxlKSx0aGlzLmlzTGlnaHRQcm9iZT0hMCx0aGlzLnNoPXR9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnNoLmNvcHkodC5zaCksdGhpc31mcm9tSlNPTih0KXtyZXR1cm4gdGhpcy5pbnRlbnNpdHk9dC5pbnRlbnNpdHksdGhpcy5zaC5mcm9tQXJyYXkodC5zaCksdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0LnNoPXRoaXMuc2gudG9BcnJheSgpLGV9fWNsYXNzIERjIGV4dGVuZHMgZm57Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy50ZXh0dXJlcz17fX1sb2FkKHQsZSxuLHIpe2NvbnN0IHM9dGhpcyxvPW5ldyBUaShzLm1hbmFnZXIpO28uc2V0UGF0aChzLnBhdGgpLG8uc2V0UmVxdWVzdEhlYWRlcihzLnJlcXVlc3RIZWFkZXIpLG8uc2V0V2l0aENyZWRlbnRpYWxzKHMud2l0aENyZWRlbnRpYWxzKSxvLmxvYWQodCxmdW5jdGlvbihhKXt0cnl7ZShzLnBhcnNlKEpTT04ucGFyc2UoYSkpKX1jYXRjaChsKXtyP3IobCk6Y29uc29sZS5lcnJvcihsKSxzLm1hbmFnZXIuaXRlbUVycm9yKHQpfX0sbixyKX1wYXJzZSh0KXtjb25zdCBlPXRoaXMudGV4dHVyZXM7ZnVuY3Rpb24gbihzKXtyZXR1cm4gZVtzXT09PXZvaWQgMCYmY29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbExvYWRlcjogVW5kZWZpbmVkIHRleHR1cmUiLHMpLGVbc119Y29uc3Qgcj1EYy5jcmVhdGVNYXRlcmlhbEZyb21UeXBlKHQudHlwZSk7aWYodC51dWlkIT09dm9pZCAwJiYoci51dWlkPXQudXVpZCksdC5uYW1lIT09dm9pZCAwJiYoci5uYW1lPXQubmFtZSksdC5jb2xvciE9PXZvaWQgMCYmci5jb2xvciE9PXZvaWQgMCYmci5jb2xvci5zZXRIZXgodC5jb2xvciksdC5yb3VnaG5lc3MhPT12b2lkIDAmJihyLnJvdWdobmVzcz10LnJvdWdobmVzcyksdC5tZXRhbG5lc3MhPT12b2lkIDAmJihyLm1ldGFsbmVzcz10Lm1ldGFsbmVzcyksdC5zaGVlbiE9PXZvaWQgMCYmKHIuc2hlZW49dC5zaGVlbiksdC5zaGVlbkNvbG9yIT09dm9pZCAwJiYoci5zaGVlbkNvbG9yPW5ldyB2dCgpLnNldEhleCh0LnNoZWVuQ29sb3IpKSx0LnNoZWVuUm91Z2huZXNzIT09dm9pZCAwJiYoci5zaGVlblJvdWdobmVzcz10LnNoZWVuUm91Z2huZXNzKSx0LmVtaXNzaXZlIT09dm9pZCAwJiZyLmVtaXNzaXZlIT09dm9pZCAwJiZyLmVtaXNzaXZlLnNldEhleCh0LmVtaXNzaXZlKSx0LnNwZWN1bGFyIT09dm9pZCAwJiZyLnNwZWN1bGFyIT09dm9pZCAwJiZyLnNwZWN1bGFyLnNldEhleCh0LnNwZWN1bGFyKSx0LnNwZWN1bGFySW50ZW5zaXR5IT09dm9pZCAwJiYoci5zcGVjdWxhckludGVuc2l0eT10LnNwZWN1bGFySW50ZW5zaXR5KSx0LnNwZWN1bGFyQ29sb3IhPT12b2lkIDAmJnIuc3BlY3VsYXJDb2xvciE9PXZvaWQgMCYmci5zcGVjdWxhckNvbG9yLnNldEhleCh0LnNwZWN1bGFyQ29sb3IpLHQuc2hpbmluZXNzIT09dm9pZCAwJiYoci5zaGluaW5lc3M9dC5zaGluaW5lc3MpLHQuY2xlYXJjb2F0IT09dm9pZCAwJiYoci5jbGVhcmNvYXQ9dC5jbGVhcmNvYXQpLHQuY2xlYXJjb2F0Um91Z2huZXNzIT09dm9pZCAwJiYoci5jbGVhcmNvYXRSb3VnaG5lc3M9dC5jbGVhcmNvYXRSb3VnaG5lc3MpLHQuZGlzcGVyc2lvbiE9PXZvaWQgMCYmKHIuZGlzcGVyc2lvbj10LmRpc3BlcnNpb24pLHQuaXJpZGVzY2VuY2UhPT12b2lkIDAmJihyLmlyaWRlc2NlbmNlPXQuaXJpZGVzY2VuY2UpLHQuaXJpZGVzY2VuY2VJT1IhPT12b2lkIDAmJihyLmlyaWRlc2NlbmNlSU9SPXQuaXJpZGVzY2VuY2VJT1IpLHQuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSE9PXZvaWQgMCYmKHIuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZT10LmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UpLHQudHJhbnNtaXNzaW9uIT09dm9pZCAwJiYoci50cmFuc21pc3Npb249dC50cmFuc21pc3Npb24pLHQudGhpY2tuZXNzIT09dm9pZCAwJiYoci50aGlja25lc3M9dC50aGlja25lc3MpLHQuYXR0ZW51YXRpb25EaXN0YW5jZSE9PXZvaWQgMCYmKHIuYXR0ZW51YXRpb25EaXN0YW5jZT10LmF0dGVudWF0aW9uRGlzdGFuY2UpLHQuYXR0ZW51YXRpb25Db2xvciE9PXZvaWQgMCYmci5hdHRlbnVhdGlvbkNvbG9yIT09dm9pZCAwJiZyLmF0dGVudWF0aW9uQ29sb3Iuc2V0SGV4KHQuYXR0ZW51YXRpb25Db2xvciksdC5hbmlzb3Ryb3B5IT09dm9pZCAwJiYoci5hbmlzb3Ryb3B5PXQuYW5pc290cm9weSksdC5hbmlzb3Ryb3B5Um90YXRpb24hPT12b2lkIDAmJihyLmFuaXNvdHJvcHlSb3RhdGlvbj10LmFuaXNvdHJvcHlSb3RhdGlvbiksdC5mb2chPT12b2lkIDAmJihyLmZvZz10LmZvZyksdC5mbGF0U2hhZGluZyE9PXZvaWQgMCYmKHIuZmxhdFNoYWRpbmc9dC5mbGF0U2hhZGluZyksdC5ibGVuZGluZyE9PXZvaWQgMCYmKHIuYmxlbmRpbmc9dC5ibGVuZGluZyksdC5jb21iaW5lIT09dm9pZCAwJiYoci5jb21iaW5lPXQuY29tYmluZSksdC5zaWRlIT09dm9pZCAwJiYoci5zaWRlPXQuc2lkZSksdC5zaGFkb3dTaWRlIT09dm9pZCAwJiYoci5zaGFkb3dTaWRlPXQuc2hhZG93U2lkZSksdC5vcGFjaXR5IT09dm9pZCAwJiYoci5vcGFjaXR5PXQub3BhY2l0eSksdC50cmFuc3BhcmVudCE9PXZvaWQgMCYmKHIudHJhbnNwYXJlbnQ9dC50cmFuc3BhcmVudCksdC5hbHBoYVRlc3QhPT12b2lkIDAmJihyLmFscGhhVGVzdD10LmFscGhhVGVzdCksdC5hbHBoYUhhc2ghPT12b2lkIDAmJihyLmFscGhhSGFzaD10LmFscGhhSGFzaCksdC5kZXB0aEZ1bmMhPT12b2lkIDAmJihyLmRlcHRoRnVuYz10LmRlcHRoRnVuYyksdC5kZXB0aFRlc3QhPT12b2lkIDAmJihyLmRlcHRoVGVzdD10LmRlcHRoVGVzdCksdC5kZXB0aFdyaXRlIT09dm9pZCAwJiYoci5kZXB0aFdyaXRlPXQuZGVwdGhXcml0ZSksdC5jb2xvcldyaXRlIT09dm9pZCAwJiYoci5jb2xvcldyaXRlPXQuY29sb3JXcml0ZSksdC5ibGVuZFNyYyE9PXZvaWQgMCYmKHIuYmxlbmRTcmM9dC5ibGVuZFNyYyksdC5ibGVuZERzdCE9PXZvaWQgMCYmKHIuYmxlbmREc3Q9dC5ibGVuZERzdCksdC5ibGVuZEVxdWF0aW9uIT09dm9pZCAwJiYoci5ibGVuZEVxdWF0aW9uPXQuYmxlbmRFcXVhdGlvbiksdC5ibGVuZFNyY0FscGhhIT09dm9pZCAwJiYoci5ibGVuZFNyY0FscGhhPXQuYmxlbmRTcmNBbHBoYSksdC5ibGVuZERzdEFscGhhIT09dm9pZCAwJiYoci5ibGVuZERzdEFscGhhPXQuYmxlbmREc3RBbHBoYSksdC5ibGVuZEVxdWF0aW9uQWxwaGEhPT12b2lkIDAmJihyLmJsZW5kRXF1YXRpb25BbHBoYT10LmJsZW5kRXF1YXRpb25BbHBoYSksdC5ibGVuZENvbG9yIT09dm9pZCAwJiZyLmJsZW5kQ29sb3IhPT12b2lkIDAmJnIuYmxlbmRDb2xvci5zZXRIZXgodC5ibGVuZENvbG9yKSx0LmJsZW5kQWxwaGEhPT12b2lkIDAmJihyLmJsZW5kQWxwaGE9dC5ibGVuZEFscGhhKSx0LnN0ZW5jaWxXcml0ZU1hc2shPT12b2lkIDAmJihyLnN0ZW5jaWxXcml0ZU1hc2s9dC5zdGVuY2lsV3JpdGVNYXNrKSx0LnN0ZW5jaWxGdW5jIT09dm9pZCAwJiYoci5zdGVuY2lsRnVuYz10LnN0ZW5jaWxGdW5jKSx0LnN0ZW5jaWxSZWYhPT12b2lkIDAmJihyLnN0ZW5jaWxSZWY9dC5zdGVuY2lsUmVmKSx0LnN0ZW5jaWxGdW5jTWFzayE9PXZvaWQgMCYmKHIuc3RlbmNpbEZ1bmNNYXNrPXQuc3RlbmNpbEZ1bmNNYXNrKSx0LnN0ZW5jaWxGYWlsIT09dm9pZCAwJiYoci5zdGVuY2lsRmFpbD10LnN0ZW5jaWxGYWlsKSx0LnN0ZW5jaWxaRmFpbCE9PXZvaWQgMCYmKHIuc3RlbmNpbFpGYWlsPXQuc3RlbmNpbFpGYWlsKSx0LnN0ZW5jaWxaUGFzcyE9PXZvaWQgMCYmKHIuc3RlbmNpbFpQYXNzPXQuc3RlbmNpbFpQYXNzKSx0LnN0ZW5jaWxXcml0ZSE9PXZvaWQgMCYmKHIuc3RlbmNpbFdyaXRlPXQuc3RlbmNpbFdyaXRlKSx0LndpcmVmcmFtZSE9PXZvaWQgMCYmKHIud2lyZWZyYW1lPXQud2lyZWZyYW1lKSx0LndpcmVmcmFtZUxpbmV3aWR0aCE9PXZvaWQgMCYmKHIud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoKSx0LndpcmVmcmFtZUxpbmVjYXAhPT12b2lkIDAmJihyLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwKSx0LndpcmVmcmFtZUxpbmVqb2luIT09dm9pZCAwJiYoci53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luKSx0LnJvdGF0aW9uIT09dm9pZCAwJiYoci5yb3RhdGlvbj10LnJvdGF0aW9uKSx0LmxpbmV3aWR0aCE9PXZvaWQgMCYmKHIubGluZXdpZHRoPXQubGluZXdpZHRoKSx0LmRhc2hTaXplIT09dm9pZCAwJiYoci5kYXNoU2l6ZT10LmRhc2hTaXplKSx0LmdhcFNpemUhPT12b2lkIDAmJihyLmdhcFNpemU9dC5nYXBTaXplKSx0LnNjYWxlIT09dm9pZCAwJiYoci5zY2FsZT10LnNjYWxlKSx0LnBvbHlnb25PZmZzZXQhPT12b2lkIDAmJihyLnBvbHlnb25PZmZzZXQ9dC5wb2x5Z29uT2Zmc2V0KSx0LnBvbHlnb25PZmZzZXRGYWN0b3IhPT12b2lkIDAmJihyLnBvbHlnb25PZmZzZXRGYWN0b3I9dC5wb2x5Z29uT2Zmc2V0RmFjdG9yKSx0LnBvbHlnb25PZmZzZXRVbml0cyE9PXZvaWQgMCYmKHIucG9seWdvbk9mZnNldFVuaXRzPXQucG9seWdvbk9mZnNldFVuaXRzKSx0LmRpdGhlcmluZyE9PXZvaWQgMCYmKHIuZGl0aGVyaW5nPXQuZGl0aGVyaW5nKSx0LmFscGhhVG9Db3ZlcmFnZSE9PXZvaWQgMCYmKHIuYWxwaGFUb0NvdmVyYWdlPXQuYWxwaGFUb0NvdmVyYWdlKSx0LnByZW11bHRpcGxpZWRBbHBoYSE9PXZvaWQgMCYmKHIucHJlbXVsdGlwbGllZEFscGhhPXQucHJlbXVsdGlwbGllZEFscGhhKSx0LmZvcmNlU2luZ2xlUGFzcyE9PXZvaWQgMCYmKHIuZm9yY2VTaW5nbGVQYXNzPXQuZm9yY2VTaW5nbGVQYXNzKSx0LnZpc2libGUhPT12b2lkIDAmJihyLnZpc2libGU9dC52aXNpYmxlKSx0LnRvbmVNYXBwZWQhPT12b2lkIDAmJihyLnRvbmVNYXBwZWQ9dC50b25lTWFwcGVkKSx0LnVzZXJEYXRhIT09dm9pZCAwJiYoci51c2VyRGF0YT10LnVzZXJEYXRhKSx0LnZlcnRleENvbG9ycyE9PXZvaWQgMCYmKHR5cGVvZiB0LnZlcnRleENvbG9ycz09Im51bWJlciI/ci52ZXJ0ZXhDb2xvcnM9dC52ZXJ0ZXhDb2xvcnM+MDpyLnZlcnRleENvbG9ycz10LnZlcnRleENvbG9ycyksdC51bmlmb3JtcyE9PXZvaWQgMClmb3IoY29uc3QgcyBpbiB0LnVuaWZvcm1zKXtjb25zdCBvPXQudW5pZm9ybXNbc107c3dpdGNoKHIudW5pZm9ybXNbc109e30sby50eXBlKXtjYXNlInQiOnIudW5pZm9ybXNbc10udmFsdWU9bihvLnZhbHVlKTticmVhaztjYXNlImMiOnIudW5pZm9ybXNbc10udmFsdWU9bmV3IHZ0KCkuc2V0SGV4KG8udmFsdWUpO2JyZWFrO2Nhc2UidjIiOnIudW5pZm9ybXNbc10udmFsdWU9bmV3IHEoKS5mcm9tQXJyYXkoby52YWx1ZSk7YnJlYWs7Y2FzZSJ2MyI6ci51bmlmb3Jtc1tzXS52YWx1ZT1uZXcgTCgpLmZyb21BcnJheShvLnZhbHVlKTticmVhaztjYXNlInY0IjpyLnVuaWZvcm1zW3NdLnZhbHVlPW5ldyBvZSgpLmZyb21BcnJheShvLnZhbHVlKTticmVhaztjYXNlIm0zIjpyLnVuaWZvcm1zW3NdLnZhbHVlPW5ldyBYdCgpLmZyb21BcnJheShvLnZhbHVlKTticmVhaztjYXNlIm00IjpyLnVuaWZvcm1zW3NdLnZhbHVlPW5ldyBMdCgpLmZyb21BcnJheShvLnZhbHVlKTticmVhaztkZWZhdWx0OnIudW5pZm9ybXNbc10udmFsdWU9by52YWx1ZX19aWYodC5kZWZpbmVzIT09dm9pZCAwJiYoci5kZWZpbmVzPXQuZGVmaW5lcyksdC52ZXJ0ZXhTaGFkZXIhPT12b2lkIDAmJihyLnZlcnRleFNoYWRlcj10LnZlcnRleFNoYWRlciksdC5mcmFnbWVudFNoYWRlciE9PXZvaWQgMCYmKHIuZnJhZ21lbnRTaGFkZXI9dC5mcmFnbWVudFNoYWRlciksdC5nbHNsVmVyc2lvbiE9PXZvaWQgMCYmKHIuZ2xzbFZlcnNpb249dC5nbHNsVmVyc2lvbiksdC5leHRlbnNpb25zIT09dm9pZCAwKWZvcihjb25zdCBzIGluIHQuZXh0ZW5zaW9ucylyLmV4dGVuc2lvbnNbc109dC5leHRlbnNpb25zW3NdO2lmKHQubGlnaHRzIT09dm9pZCAwJiYoci5saWdodHM9dC5saWdodHMpLHQuY2xpcHBpbmchPT12b2lkIDAmJihyLmNsaXBwaW5nPXQuY2xpcHBpbmcpLHQuc2l6ZSE9PXZvaWQgMCYmKHIuc2l6ZT10LnNpemUpLHQuc2l6ZUF0dGVudWF0aW9uIT09dm9pZCAwJiYoci5zaXplQXR0ZW51YXRpb249dC5zaXplQXR0ZW51YXRpb24pLHQubWFwIT09dm9pZCAwJiYoci5tYXA9bih0Lm1hcCkpLHQubWF0Y2FwIT09dm9pZCAwJiYoci5tYXRjYXA9bih0Lm1hdGNhcCkpLHQuYWxwaGFNYXAhPT12b2lkIDAmJihyLmFscGhhTWFwPW4odC5hbHBoYU1hcCkpLHQuYnVtcE1hcCE9PXZvaWQgMCYmKHIuYnVtcE1hcD1uKHQuYnVtcE1hcCkpLHQuYnVtcFNjYWxlIT09dm9pZCAwJiYoci5idW1wU2NhbGU9dC5idW1wU2NhbGUpLHQubm9ybWFsTWFwIT09dm9pZCAwJiYoci5ub3JtYWxNYXA9bih0Lm5vcm1hbE1hcCkpLHQubm9ybWFsTWFwVHlwZSE9PXZvaWQgMCYmKHIubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUpLHQubm9ybWFsU2NhbGUhPT12b2lkIDApe2xldCBzPXQubm9ybWFsU2NhbGU7QXJyYXkuaXNBcnJheShzKT09PSExJiYocz1bcyxzXSksci5ub3JtYWxTY2FsZT1uZXcgcSgpLmZyb21BcnJheShzKX1yZXR1cm4gdC5kaXNwbGFjZW1lbnRNYXAhPT12b2lkIDAmJihyLmRpc3BsYWNlbWVudE1hcD1uKHQuZGlzcGxhY2VtZW50TWFwKSksdC5kaXNwbGFjZW1lbnRTY2FsZSE9PXZvaWQgMCYmKHIuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSksdC5kaXNwbGFjZW1lbnRCaWFzIT09dm9pZCAwJiYoci5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50QmlhcyksdC5yb3VnaG5lc3NNYXAhPT12b2lkIDAmJihyLnJvdWdobmVzc01hcD1uKHQucm91Z2huZXNzTWFwKSksdC5tZXRhbG5lc3NNYXAhPT12b2lkIDAmJihyLm1ldGFsbmVzc01hcD1uKHQubWV0YWxuZXNzTWFwKSksdC5lbWlzc2l2ZU1hcCE9PXZvaWQgMCYmKHIuZW1pc3NpdmVNYXA9bih0LmVtaXNzaXZlTWFwKSksdC5lbWlzc2l2ZUludGVuc2l0eSE9PXZvaWQgMCYmKHIuZW1pc3NpdmVJbnRlbnNpdHk9dC5lbWlzc2l2ZUludGVuc2l0eSksdC5zcGVjdWxhck1hcCE9PXZvaWQgMCYmKHIuc3BlY3VsYXJNYXA9bih0LnNwZWN1bGFyTWFwKSksdC5zcGVjdWxhckludGVuc2l0eU1hcCE9PXZvaWQgMCYmKHIuc3BlY3VsYXJJbnRlbnNpdHlNYXA9bih0LnNwZWN1bGFySW50ZW5zaXR5TWFwKSksdC5zcGVjdWxhckNvbG9yTWFwIT09dm9pZCAwJiYoci5zcGVjdWxhckNvbG9yTWFwPW4odC5zcGVjdWxhckNvbG9yTWFwKSksdC5lbnZNYXAhPT12b2lkIDAmJihyLmVudk1hcD1uKHQuZW52TWFwKSksdC5lbnZNYXBSb3RhdGlvbiE9PXZvaWQgMCYmci5lbnZNYXBSb3RhdGlvbi5mcm9tQXJyYXkodC5lbnZNYXBSb3RhdGlvbiksdC5lbnZNYXBJbnRlbnNpdHkhPT12b2lkIDAmJihyLmVudk1hcEludGVuc2l0eT10LmVudk1hcEludGVuc2l0eSksdC5yZWZsZWN0aXZpdHkhPT12b2lkIDAmJihyLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSksdC5yZWZyYWN0aW9uUmF0aW8hPT12b2lkIDAmJihyLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyksdC5saWdodE1hcCE9PXZvaWQgMCYmKHIubGlnaHRNYXA9bih0LmxpZ2h0TWFwKSksdC5saWdodE1hcEludGVuc2l0eSE9PXZvaWQgMCYmKHIubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSksdC5hb01hcCE9PXZvaWQgMCYmKHIuYW9NYXA9bih0LmFvTWFwKSksdC5hb01hcEludGVuc2l0eSE9PXZvaWQgMCYmKHIuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSksdC5ncmFkaWVudE1hcCE9PXZvaWQgMCYmKHIuZ3JhZGllbnRNYXA9bih0LmdyYWRpZW50TWFwKSksdC5jbGVhcmNvYXRNYXAhPT12b2lkIDAmJihyLmNsZWFyY29hdE1hcD1uKHQuY2xlYXJjb2F0TWFwKSksdC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAhPT12b2lkIDAmJihyLmNsZWFyY29hdFJvdWdobmVzc01hcD1uKHQuY2xlYXJjb2F0Um91Z2huZXNzTWFwKSksdC5jbGVhcmNvYXROb3JtYWxNYXAhPT12b2lkIDAmJihyLmNsZWFyY29hdE5vcm1hbE1hcD1uKHQuY2xlYXJjb2F0Tm9ybWFsTWFwKSksdC5jbGVhcmNvYXROb3JtYWxTY2FsZSE9PXZvaWQgMCYmKHIuY2xlYXJjb2F0Tm9ybWFsU2NhbGU9bmV3IHEoKS5mcm9tQXJyYXkodC5jbGVhcmNvYXROb3JtYWxTY2FsZSkpLHQuaXJpZGVzY2VuY2VNYXAhPT12b2lkIDAmJihyLmlyaWRlc2NlbmNlTWFwPW4odC5pcmlkZXNjZW5jZU1hcCkpLHQuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAhPT12b2lkIDAmJihyLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwPW4odC5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCkpLHQudHJhbnNtaXNzaW9uTWFwIT09dm9pZCAwJiYoci50cmFuc21pc3Npb25NYXA9bih0LnRyYW5zbWlzc2lvbk1hcCkpLHQudGhpY2tuZXNzTWFwIT09dm9pZCAwJiYoci50aGlja25lc3NNYXA9bih0LnRoaWNrbmVzc01hcCkpLHQuYW5pc290cm9weU1hcCE9PXZvaWQgMCYmKHIuYW5pc290cm9weU1hcD1uKHQuYW5pc290cm9weU1hcCkpLHQuc2hlZW5Db2xvck1hcCE9PXZvaWQgMCYmKHIuc2hlZW5Db2xvck1hcD1uKHQuc2hlZW5Db2xvck1hcCkpLHQuc2hlZW5Sb3VnaG5lc3NNYXAhPT12b2lkIDAmJihyLnNoZWVuUm91Z2huZXNzTWFwPW4odC5zaGVlblJvdWdobmVzc01hcCkpLHJ9c2V0VGV4dHVyZXModCl7cmV0dXJuIHRoaXMudGV4dHVyZXM9dCx0aGlzfXN0YXRpYyBjcmVhdGVNYXRlcmlhbEZyb21UeXBlKHQpe2NvbnN0IGU9e1NoYWRvd01hdGVyaWFsOmV5LFNwcml0ZU1hdGVyaWFsOmRmLFJhd1NoYWRlck1hdGVyaWFsOm55LFNoYWRlck1hdGVyaWFsOkduLFBvaW50c01hdGVyaWFsOlNmLE1lc2hQaHlzaWNhbE1hdGVyaWFsOml5LE1lc2hTdGFuZGFyZE1hdGVyaWFsOkZmLE1lc2hQaG9uZ01hdGVyaWFsOnJ5LE1lc2hUb29uTWF0ZXJpYWw6c3ksTWVzaE5vcm1hbE1hdGVyaWFsOm95LE1lc2hMYW1iZXJ0TWF0ZXJpYWw6YXksTWVzaERlcHRoTWF0ZXJpYWw6Y2YsTWVzaERpc3RhbmNlTWF0ZXJpYWw6dWYsTWVzaEJhc2ljTWF0ZXJpYWw6WGksTWVzaE1hdGNhcE1hdGVyaWFsOmx5LExpbmVEYXNoZWRNYXRlcmlhbDpjeSxMaW5lQmFzaWNNYXRlcmlhbDpubixNYXRlcmlhbDpYZX07cmV0dXJuIG5ldyBlW3RdfX1jbGFzcyAkZntzdGF0aWMgZGVjb2RlVGV4dCh0KXtpZihjb25zb2xlLndhcm4oIlRIUkVFLkxvYWRlclV0aWxzOiBkZWNvZGVUZXh0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZCB3aXRoIHIxNjUgYW5kIHdpbGwgYmUgcmVtb3ZlZCB3aXRoIHIxNzUuIFVzZSBUZXh0RGVjb2RlciBpbnN0ZWFkLiIpLHR5cGVvZiBUZXh0RGVjb2RlciE9InVuZGVmaW5lZCIpcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZSh0KTtsZXQgZT0iIjtmb3IobGV0IG49MCxyPXQubGVuZ3RoO248cjtuKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSh0W25dKTt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoZSkpfWNhdGNoKG4pe3JldHVybiBlfX1zdGF0aWMgZXh0cmFjdFVybEJhc2UodCl7Y29uc3QgZT10Lmxhc3RJbmRleE9mKCIvIik7cmV0dXJuIGU9PT0tMT8iLi8iOnQuc2xpY2UoMCxlKzEpfXN0YXRpYyByZXNvbHZlVVJMKHQsZSl7cmV0dXJuIHR5cGVvZiB0IT0ic3RyaW5nInx8dD09PSIiPyIiOigvXmh0dHBzPzpcL1wvL2kudGVzdChlKSYmL15cLy8udGVzdCh0KSYmKGU9ZS5yZXBsYWNlKC8oXmh0dHBzPzpcL1wvW15cL10rKS4qL2ksIiQxIikpLC9eKGh0dHBzPzopP1wvXC8vaS50ZXN0KHQpfHwvXmRhdGE6LiosLiokL2kudGVzdCh0KXx8L15ibG9iOi4qJC9pLnRlc3QodCk/dDplK3QpfX1jbGFzcyBUeSBleHRlbmRzIE50e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk9ITAsdGhpcy50eXBlPSJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSIsdGhpcy5pbnN0YW5jZUNvdW50PTEvMH1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuaW5zdGFuY2VDb3VudD10Lmluc3RhbmNlQ291bnQsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0Lmluc3RhbmNlQ291bnQ9dGhpcy5pbnN0YW5jZUNvdW50LHQuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT0hMCx0fX1jbGFzcyBDeSBleHRlbmRzIGZue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4scil7Y29uc3Qgcz10aGlzLG89bmV3IFRpKHMubWFuYWdlcik7by5zZXRQYXRoKHMucGF0aCksby5zZXRSZXF1ZXN0SGVhZGVyKHMucmVxdWVzdEhlYWRlciksby5zZXRXaXRoQ3JlZGVudGlhbHMocy53aXRoQ3JlZGVudGlhbHMpLG8ubG9hZCh0LGZ1bmN0aW9uKGEpe3RyeXtlKHMucGFyc2UoSlNPTi5wYXJzZShhKSkpfWNhdGNoKGwpe3I/cihsKTpjb25zb2xlLmVycm9yKGwpLHMubWFuYWdlci5pdGVtRXJyb3IodCl9fSxuLHIpfXBhcnNlKHQpe2NvbnN0IGU9e30sbj17fTtmdW5jdGlvbiByKGQscCl7aWYoZVtwXSE9PXZvaWQgMClyZXR1cm4gZVtwXTtjb25zdCBtPWQuaW50ZXJsZWF2ZWRCdWZmZXJzW3BdLGc9cyhkLG0uYnVmZmVyKSx4PWlzKG0udHlwZSxnKSx2PW5ldyBKbCh4LG0uc3RyaWRlKTtyZXR1cm4gdi51dWlkPW0udXVpZCxlW3BdPXYsdn1mdW5jdGlvbiBzKGQscCl7aWYobltwXSE9PXZvaWQgMClyZXR1cm4gbltwXTtjb25zdCBtPWQuYXJyYXlCdWZmZXJzW3BdLGc9bmV3IFVpbnQzMkFycmF5KG0pLmJ1ZmZlcjtyZXR1cm4gbltwXT1nLGd9Y29uc3Qgbz10LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk/bmV3IFR5Om5ldyBOdCxhPXQuZGF0YS5pbmRleDtpZihhIT09dm9pZCAwKXtjb25zdCBkPWlzKGEudHlwZSxhLmFycmF5KTtvLnNldEluZGV4KG5ldyBadChkLDEpKX1jb25zdCBsPXQuZGF0YS5hdHRyaWJ1dGVzO2Zvcihjb25zdCBkIGluIGwpe2NvbnN0IHA9bFtkXTtsZXQgeTtpZihwLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IG09cih0LmRhdGEscC5kYXRhKTt5PW5ldyBUcihtLHAuaXRlbVNpemUscC5vZmZzZXQscC5ub3JtYWxpemVkKX1lbHNle2NvbnN0IG09aXMocC50eXBlLHAuYXJyYXkpLGc9cC5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT9MczpadDt5PW5ldyBnKG0scC5pdGVtU2l6ZSxwLm5vcm1hbGl6ZWQpfXAubmFtZSE9PXZvaWQgMCYmKHkubmFtZT1wLm5hbWUpLHAudXNhZ2UhPT12b2lkIDAmJnkuc2V0VXNhZ2UocC51c2FnZSksby5zZXRBdHRyaWJ1dGUoZCx5KX1jb25zdCBjPXQuZGF0YS5tb3JwaEF0dHJpYnV0ZXM7aWYoYylmb3IoY29uc3QgZCBpbiBjKXtjb25zdCBwPWNbZF0seT1bXTtmb3IobGV0IG09MCxnPXAubGVuZ3RoO208ZzttKyspe2NvbnN0IHg9cFttXTtsZXQgdjtpZih4LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IF89cih0LmRhdGEseC5kYXRhKTt2PW5ldyBUcihfLHguaXRlbVNpemUseC5vZmZzZXQseC5ub3JtYWxpemVkKX1lbHNle2NvbnN0IF89aXMoeC50eXBlLHguYXJyYXkpO3Y9bmV3IFp0KF8seC5pdGVtU2l6ZSx4Lm5vcm1hbGl6ZWQpfXgubmFtZSE9PXZvaWQgMCYmKHYubmFtZT14Lm5hbWUpLHkucHVzaCh2KX1vLm1vcnBoQXR0cmlidXRlc1tkXT15fXQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZSYmKG8ubW9ycGhUYXJnZXRzUmVsYXRpdmU9ITApO2NvbnN0IGg9dC5kYXRhLmdyb3Vwc3x8dC5kYXRhLmRyYXdjYWxsc3x8dC5kYXRhLm9mZnNldHM7aWYoaCE9PXZvaWQgMClmb3IobGV0IGQ9MCxwPWgubGVuZ3RoO2QhPT1wOysrZCl7Y29uc3QgeT1oW2RdO28uYWRkR3JvdXAoeS5zdGFydCx5LmNvdW50LHkubWF0ZXJpYWxJbmRleCl9Y29uc3QgZj10LmRhdGEuYm91bmRpbmdTcGhlcmU7aWYoZiE9PXZvaWQgMCl7Y29uc3QgZD1uZXcgTDtmLmNlbnRlciE9PXZvaWQgMCYmZC5mcm9tQXJyYXkoZi5jZW50ZXIpLG8uYm91bmRpbmdTcGhlcmU9bmV3IFdlKGQsZi5yYWRpdXMpfXJldHVybiB0Lm5hbWUmJihvLm5hbWU9dC5uYW1lKSx0LnVzZXJEYXRhJiYoby51c2VyRGF0YT10LnVzZXJEYXRhKSxvfX1jbGFzcyBsQyBleHRlbmRzIGZue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4scil7Y29uc3Qgcz10aGlzLG89dGhpcy5wYXRoPT09IiI/JGYuZXh0cmFjdFVybEJhc2UodCk6dGhpcy5wYXRoO3RoaXMucmVzb3VyY2VQYXRoPXRoaXMucmVzb3VyY2VQYXRofHxvO2NvbnN0IGE9bmV3IFRpKHRoaXMubWFuYWdlcik7YS5zZXRQYXRoKHRoaXMucGF0aCksYS5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksYS5zZXRXaXRoQ3JlZGVudGlhbHModGhpcy53aXRoQ3JlZGVudGlhbHMpLGEubG9hZCh0LGZ1bmN0aW9uKGwpe2xldCBjPW51bGw7dHJ5e2M9SlNPTi5wYXJzZShsKX1jYXRjaChoKXtyIT09dm9pZCAwJiZyKGgpLGNvbnNvbGUuZXJyb3IoIlRIUkVFOk9iamVjdExvYWRlcjogQ2FuJ3QgcGFyc2UgIit0KyIuIixoLm1lc3NhZ2UpO3JldHVybn1jb25zdCB1PWMubWV0YWRhdGE7aWYodT09PXZvaWQgMHx8dS50eXBlPT09dm9pZCAwfHx1LnR5cGUudG9Mb3dlckNhc2UoKT09PSJnZW9tZXRyeSIpe3IhPT12b2lkIDAmJnIobmV3IEVycm9yKCJUSFJFRS5PYmplY3RMb2FkZXI6IENhbid0IGxvYWQgIit0KSksY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW4ndCBsb2FkICIrdCk7cmV0dXJufXMucGFyc2UoYyxlKX0sbixyKX1sb2FkQXN5bmModCxlKXtyZXR1cm4gSnIodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49dGhpcyxyPXRoaXMucGF0aD09PSIiPyRmLmV4dHJhY3RVcmxCYXNlKHQpOnRoaXMucGF0aDt0aGlzLnJlc291cmNlUGF0aD10aGlzLnJlc291cmNlUGF0aHx8cjtjb25zdCBzPW5ldyBUaSh0aGlzLm1hbmFnZXIpO3Muc2V0UGF0aCh0aGlzLnBhdGgpLHMuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLHMuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKTtjb25zdCBvPXlpZWxkIHMubG9hZEFzeW5jKHQsZSksYT1KU09OLnBhcnNlKG8pLGw9YS5tZXRhZGF0YTtpZihsPT09dm9pZCAwfHxsLnR5cGU9PT12b2lkIDB8fGwudHlwZS50b0xvd2VyQ2FzZSgpPT09Imdlb21ldHJ5Iil0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk9iamVjdExvYWRlcjogQ2FuJ3QgbG9hZCAiK3QpO3JldHVybiB5aWVsZCBuLnBhcnNlQXN5bmMoYSl9KX1wYXJzZSh0LGUpe2NvbnN0IG49dGhpcy5wYXJzZUFuaW1hdGlvbnModC5hbmltYXRpb25zKSxyPXRoaXMucGFyc2VTaGFwZXModC5zaGFwZXMpLHM9dGhpcy5wYXJzZUdlb21ldHJpZXModC5nZW9tZXRyaWVzLHIpLG89dGhpcy5wYXJzZUltYWdlcyh0LmltYWdlcyxmdW5jdGlvbigpe2UhPT12b2lkIDAmJmUoYyl9KSxhPXRoaXMucGFyc2VUZXh0dXJlcyh0LnRleHR1cmVzLG8pLGw9dGhpcy5wYXJzZU1hdGVyaWFscyh0Lm1hdGVyaWFscyxhKSxjPXRoaXMucGFyc2VPYmplY3QodC5vYmplY3QscyxsLGEsbiksdT10aGlzLnBhcnNlU2tlbGV0b25zKHQuc2tlbGV0b25zLGMpO2lmKHRoaXMuYmluZFNrZWxldG9ucyhjLHUpLHRoaXMuYmluZExpZ2h0VGFyZ2V0cyhjKSxlIT09dm9pZCAwKXtsZXQgaD0hMTtmb3IoY29uc3QgZiBpbiBvKWlmKG9bZl0uZGF0YSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpe2g9ITA7YnJlYWt9aD09PSExJiZlKGMpfXJldHVybiBjfXBhcnNlQXN5bmModCl7cmV0dXJuIEpyKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBlPXRoaXMucGFyc2VBbmltYXRpb25zKHQuYW5pbWF0aW9ucyksbj10aGlzLnBhcnNlU2hhcGVzKHQuc2hhcGVzKSxyPXRoaXMucGFyc2VHZW9tZXRyaWVzKHQuZ2VvbWV0cmllcyxuKSxzPXlpZWxkIHRoaXMucGFyc2VJbWFnZXNBc3luYyh0LmltYWdlcyksbz10aGlzLnBhcnNlVGV4dHVyZXModC50ZXh0dXJlcyxzKSxhPXRoaXMucGFyc2VNYXRlcmlhbHModC5tYXRlcmlhbHMsbyksbD10aGlzLnBhcnNlT2JqZWN0KHQub2JqZWN0LHIsYSxvLGUpLGM9dGhpcy5wYXJzZVNrZWxldG9ucyh0LnNrZWxldG9ucyxsKTtyZXR1cm4gdGhpcy5iaW5kU2tlbGV0b25zKGwsYyksdGhpcy5iaW5kTGlnaHRUYXJnZXRzKGwpLGx9KX1wYXJzZVNoYXBlcyh0KXtjb25zdCBlPXt9O2lmKHQhPT12b2lkIDApZm9yKGxldCBuPTAscj10Lmxlbmd0aDtuPHI7bisrKXtjb25zdCBzPW5ldyB3aSgpLmZyb21KU09OKHRbbl0pO2Vbcy51dWlkXT1zfXJldHVybiBlfXBhcnNlU2tlbGV0b25zKHQsZSl7Y29uc3Qgbj17fSxyPXt9O2lmKGUudHJhdmVyc2UoZnVuY3Rpb24ocyl7cy5pc0JvbmUmJihyW3MudXVpZF09cyl9KSx0IT09dm9pZCAwKWZvcihsZXQgcz0wLG89dC5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT1uZXcgbmMoKS5mcm9tSlNPTih0W3NdLHIpO25bYS51dWlkXT1hfXJldHVybiBufXBhcnNlR2VvbWV0cmllcyh0LGUpe2NvbnN0IG49e307aWYodCE9PXZvaWQgMCl7Y29uc3Qgcj1uZXcgQ3k7Zm9yKGxldCBzPTAsbz10Lmxlbmd0aDtzPG87cysrKXtsZXQgYTtjb25zdCBsPXRbc107c3dpdGNoKGwudHlwZSl7Y2FzZSJCdWZmZXJHZW9tZXRyeSI6Y2FzZSJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSI6YT1yLnBhcnNlKGwpO2JyZWFrO2RlZmF1bHQ6bC50eXBlIGluIHR5P2E9dHlbbC50eXBlXS5mcm9tSlNPTihsLGUpOmNvbnNvbGUud2FybihgVEhSRUUuT2JqZWN0TG9hZGVyOiBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlICIke2wudHlwZX0iYCl9YS51dWlkPWwudXVpZCxsLm5hbWUhPT12b2lkIDAmJihhLm5hbWU9bC5uYW1lKSxsLnVzZXJEYXRhIT09dm9pZCAwJiYoYS51c2VyRGF0YT1sLnVzZXJEYXRhKSxuW2wudXVpZF09YX19cmV0dXJuIG59cGFyc2VNYXRlcmlhbHModCxlKXtjb25zdCBuPXt9LHI9e307aWYodCE9PXZvaWQgMCl7Y29uc3Qgcz1uZXcgRGM7cy5zZXRUZXh0dXJlcyhlKTtmb3IobGV0IG89MCxhPXQubGVuZ3RoO288YTtvKyspe2NvbnN0IGw9dFtvXTtuW2wudXVpZF09PT12b2lkIDAmJihuW2wudXVpZF09cy5wYXJzZShsKSkscltsLnV1aWRdPW5bbC51dWlkXX19cmV0dXJuIHJ9cGFyc2VBbmltYXRpb25zKHQpe2NvbnN0IGU9e307aWYodCE9PXZvaWQgMClmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgcj10W25dLHM9b2EucGFyc2Uocik7ZVtzLnV1aWRdPXN9cmV0dXJuIGV9cGFyc2VJbWFnZXModCxlKXtjb25zdCBuPXRoaXMscj17fTtsZXQgcztmdW5jdGlvbiBvKGwpe3JldHVybiBuLm1hbmFnZXIuaXRlbVN0YXJ0KGwpLHMubG9hZChsLGZ1bmN0aW9uKCl7bi5tYW5hZ2VyLml0ZW1FbmQobCl9LHZvaWQgMCxmdW5jdGlvbigpe24ubWFuYWdlci5pdGVtRXJyb3IobCksbi5tYW5hZ2VyLml0ZW1FbmQobCl9KX1mdW5jdGlvbiBhKGwpe2lmKHR5cGVvZiBsPT0ic3RyaW5nIil7Y29uc3QgYz1sLHU9L14oXC9cLyl8KFthLXpdKzooXC9cLyk/KS9pLnRlc3QoYyk/YzpuLnJlc291cmNlUGF0aCtjO3JldHVybiBvKHUpfWVsc2UgcmV0dXJuIGwuZGF0YT97ZGF0YTppcyhsLnR5cGUsbC5kYXRhKSx3aWR0aDpsLndpZHRoLGhlaWdodDpsLmhlaWdodH06bnVsbH1pZih0IT09dm9pZCAwJiZ0Lmxlbmd0aD4wKXtjb25zdCBsPW5ldyBHZihlKTtzPW5ldyBhYShsKSxzLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pO2ZvcihsZXQgYz0wLHU9dC5sZW5ndGg7Yzx1O2MrKyl7Y29uc3QgaD10W2NdLGY9aC51cmw7aWYoQXJyYXkuaXNBcnJheShmKSl7Y29uc3QgZD1bXTtmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IG09ZltwXSxnPWEobSk7ZyE9PW51bGwmJihnIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudD9kLnB1c2goZyk6ZC5wdXNoKG5ldyBuaShnLmRhdGEsZy53aWR0aCxnLmhlaWdodCkpKX1yW2gudXVpZF09bmV3IHlyKGQpfWVsc2V7Y29uc3QgZD1hKGgudXJsKTtyW2gudXVpZF09bmV3IHlyKGQpfX19cmV0dXJuIHJ9cGFyc2VJbWFnZXNBc3luYyh0KXtyZXR1cm4gSnIodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IGU9dGhpcyxuPXt9O2xldCByO2Z1bmN0aW9uIHMobyl7cmV0dXJuIEpyKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtpZih0eXBlb2Ygbz09InN0cmluZyIpe2NvbnN0IGE9byxsPS9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KGEpP2E6ZS5yZXNvdXJjZVBhdGgrYTtyZXR1cm4geWllbGQgci5sb2FkQXN5bmMobCl9ZWxzZSByZXR1cm4gby5kYXRhP3tkYXRhOmlzKG8udHlwZSxvLmRhdGEpLHdpZHRoOm8ud2lkdGgsaGVpZ2h0Om8uaGVpZ2h0fTpudWxsfSl9aWYodCE9PXZvaWQgMCYmdC5sZW5ndGg+MCl7cj1uZXcgYWEodGhpcy5tYW5hZ2VyKSxyLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pO2ZvcihsZXQgbz0wLGE9dC5sZW5ndGg7bzxhO28rKyl7Y29uc3QgbD10W29dLGM9bC51cmw7aWYoQXJyYXkuaXNBcnJheShjKSl7Y29uc3QgdT1bXTtmb3IobGV0IGg9MCxmPWMubGVuZ3RoO2g8ZjtoKyspe2NvbnN0IGQ9Y1toXSxwPXlpZWxkIHMoZCk7cCE9PW51bGwmJihwIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudD91LnB1c2gocCk6dS5wdXNoKG5ldyBuaShwLmRhdGEscC53aWR0aCxwLmhlaWdodCkpKX1uW2wudXVpZF09bmV3IHlyKHUpfWVsc2V7Y29uc3QgdT15aWVsZCBzKGwudXJsKTtuW2wudXVpZF09bmV3IHlyKHUpfX19cmV0dXJuIG59KX1wYXJzZVRleHR1cmVzKHQsZSl7ZnVuY3Rpb24gbihzLG8pe3JldHVybiB0eXBlb2Ygcz09Im51bWJlciI/czooY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLiIscyksb1tzXSl9Y29uc3Qgcj17fTtpZih0IT09dm9pZCAwKWZvcihsZXQgcz0wLG89dC5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT10W3NdO2EuaW1hZ2U9PT12b2lkIDAmJmNvbnNvbGUud2FybignVEhSRUUuT2JqZWN0TG9hZGVyOiBObyAiaW1hZ2UiIHNwZWNpZmllZCBmb3InLGEudXVpZCksZVthLmltYWdlXT09PXZvaWQgMCYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZSIsYS5pbWFnZSk7Y29uc3QgbD1lW2EuaW1hZ2VdLGM9bC5kYXRhO2xldCB1O0FycmF5LmlzQXJyYXkoYyk/KHU9bmV3IE9vLGMubGVuZ3RoPT09NiYmKHUubmVlZHNVcGRhdGU9ITApKTooYyYmYy5kYXRhP3U9bmV3IG5pOnU9bmV3IE1lLGMmJih1Lm5lZWRzVXBkYXRlPSEwKSksdS5zb3VyY2U9bCx1LnV1aWQ9YS51dWlkLGEubmFtZSE9PXZvaWQgMCYmKHUubmFtZT1hLm5hbWUpLGEubWFwcGluZyE9PXZvaWQgMCYmKHUubWFwcGluZz1uKGEubWFwcGluZyxjQykpLGEuY2hhbm5lbCE9PXZvaWQgMCYmKHUuY2hhbm5lbD1hLmNoYW5uZWwpLGEub2Zmc2V0IT09dm9pZCAwJiZ1Lm9mZnNldC5mcm9tQXJyYXkoYS5vZmZzZXQpLGEucmVwZWF0IT09dm9pZCAwJiZ1LnJlcGVhdC5mcm9tQXJyYXkoYS5yZXBlYXQpLGEuY2VudGVyIT09dm9pZCAwJiZ1LmNlbnRlci5mcm9tQXJyYXkoYS5jZW50ZXIpLGEucm90YXRpb24hPT12b2lkIDAmJih1LnJvdGF0aW9uPWEucm90YXRpb24pLGEud3JhcCE9PXZvaWQgMCYmKHUud3JhcFM9bihhLndyYXBbMF0sUnkpLHUud3JhcFQ9bihhLndyYXBbMV0sUnkpKSxhLmZvcm1hdCE9PXZvaWQgMCYmKHUuZm9ybWF0PWEuZm9ybWF0KSxhLmludGVybmFsRm9ybWF0IT09dm9pZCAwJiYodS5pbnRlcm5hbEZvcm1hdD1hLmludGVybmFsRm9ybWF0KSxhLnR5cGUhPT12b2lkIDAmJih1LnR5cGU9YS50eXBlKSxhLmNvbG9yU3BhY2UhPT12b2lkIDAmJih1LmNvbG9yU3BhY2U9YS5jb2xvclNwYWNlKSxhLm1pbkZpbHRlciE9PXZvaWQgMCYmKHUubWluRmlsdGVyPW4oYS5taW5GaWx0ZXIsUHkpKSxhLm1hZ0ZpbHRlciE9PXZvaWQgMCYmKHUubWFnRmlsdGVyPW4oYS5tYWdGaWx0ZXIsUHkpKSxhLmFuaXNvdHJvcHkhPT12b2lkIDAmJih1LmFuaXNvdHJvcHk9YS5hbmlzb3Ryb3B5KSxhLmZsaXBZIT09dm9pZCAwJiYodS5mbGlwWT1hLmZsaXBZKSxhLmdlbmVyYXRlTWlwbWFwcyE9PXZvaWQgMCYmKHUuZ2VuZXJhdGVNaXBtYXBzPWEuZ2VuZXJhdGVNaXBtYXBzKSxhLnByZW11bHRpcGx5QWxwaGEhPT12b2lkIDAmJih1LnByZW11bHRpcGx5QWxwaGE9YS5wcmVtdWx0aXBseUFscGhhKSxhLnVucGFja0FsaWdubWVudCE9PXZvaWQgMCYmKHUudW5wYWNrQWxpZ25tZW50PWEudW5wYWNrQWxpZ25tZW50KSxhLmNvbXBhcmVGdW5jdGlvbiE9PXZvaWQgMCYmKHUuY29tcGFyZUZ1bmN0aW9uPWEuY29tcGFyZUZ1bmN0aW9uKSxhLnVzZXJEYXRhIT09dm9pZCAwJiYodS51c2VyRGF0YT1hLnVzZXJEYXRhKSxyW2EudXVpZF09dX1yZXR1cm4gcn1wYXJzZU9iamVjdCh0LGUsbixyLHMpe2xldCBvO2Z1bmN0aW9uIGEoZil7cmV0dXJuIGVbZl09PT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgZ2VvbWV0cnkiLGYpLGVbZl19ZnVuY3Rpb24gbChmKXtpZihmIT09dm9pZCAwKXtpZihBcnJheS5pc0FycmF5KGYpKXtjb25zdCBkPVtdO2ZvcihsZXQgcD0wLHk9Zi5sZW5ndGg7cDx5O3ArKyl7Y29uc3QgbT1mW3BdO25bbV09PT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLG0pLGQucHVzaChuW21dKX1yZXR1cm4gZH1yZXR1cm4gbltmXT09PXZvaWQgMCYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCIsZiksbltmXX19ZnVuY3Rpb24gYyhmKXtyZXR1cm4gcltmXT09PXZvaWQgMCYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlIixmKSxyW2ZdfWxldCB1LGg7c3dpdGNoKHQudHlwZSl7Y2FzZSJTY2VuZSI6bz1uZXcgdTAsdC5iYWNrZ3JvdW5kIT09dm9pZCAwJiYoTnVtYmVyLmlzSW50ZWdlcih0LmJhY2tncm91bmQpP28uYmFja2dyb3VuZD1uZXcgdnQodC5iYWNrZ3JvdW5kKTpvLmJhY2tncm91bmQ9Yyh0LmJhY2tncm91bmQpKSx0LmVudmlyb25tZW50IT09dm9pZCAwJiYoby5lbnZpcm9ubWVudD1jKHQuZW52aXJvbm1lbnQpKSx0LmZvZyE9PXZvaWQgMCYmKHQuZm9nLnR5cGU9PT0iRm9nIj9vLmZvZz1uZXcgWmwodC5mb2cuY29sb3IsdC5mb2cubmVhcix0LmZvZy5mYXIpOnQuZm9nLnR5cGU9PT0iRm9nRXhwMiImJihvLmZvZz1uZXcgWWwodC5mb2cuY29sb3IsdC5mb2cuZGVuc2l0eSkpLHQuZm9nLm5hbWUhPT0iIiYmKG8uZm9nLm5hbWU9dC5mb2cubmFtZSkpLHQuYmFja2dyb3VuZEJsdXJyaW5lc3MhPT12b2lkIDAmJihvLmJhY2tncm91bmRCbHVycmluZXNzPXQuYmFja2dyb3VuZEJsdXJyaW5lc3MpLHQuYmFja2dyb3VuZEludGVuc2l0eSE9PXZvaWQgMCYmKG8uYmFja2dyb3VuZEludGVuc2l0eT10LmJhY2tncm91bmRJbnRlbnNpdHkpLHQuYmFja2dyb3VuZFJvdGF0aW9uIT09dm9pZCAwJiZvLmJhY2tncm91bmRSb3RhdGlvbi5mcm9tQXJyYXkodC5iYWNrZ3JvdW5kUm90YXRpb24pLHQuZW52aXJvbm1lbnRJbnRlbnNpdHkhPT12b2lkIDAmJihvLmVudmlyb25tZW50SW50ZW5zaXR5PXQuZW52aXJvbm1lbnRJbnRlbnNpdHkpLHQuZW52aXJvbm1lbnRSb3RhdGlvbiE9PXZvaWQgMCYmby5lbnZpcm9ubWVudFJvdGF0aW9uLmZyb21BcnJheSh0LmVudmlyb25tZW50Um90YXRpb24pO2JyZWFrO2Nhc2UiUGVyc3BlY3RpdmVDYW1lcmEiOm89bmV3IGtlKHQuZm92LHQuYXNwZWN0LHQubmVhcix0LmZhciksdC5mb2N1cyE9PXZvaWQgMCYmKG8uZm9jdXM9dC5mb2N1cyksdC56b29tIT09dm9pZCAwJiYoby56b29tPXQuem9vbSksdC5maWxtR2F1Z2UhPT12b2lkIDAmJihvLmZpbG1HYXVnZT10LmZpbG1HYXVnZSksdC5maWxtT2Zmc2V0IT09dm9pZCAwJiYoby5maWxtT2Zmc2V0PXQuZmlsbU9mZnNldCksdC52aWV3IT09dm9pZCAwJiYoby52aWV3PU9iamVjdC5hc3NpZ24oe30sdC52aWV3KSk7YnJlYWs7Y2FzZSJPcnRob2dyYXBoaWNDYW1lcmEiOm89bmV3IEhsKHQubGVmdCx0LnJpZ2h0LHQudG9wLHQuYm90dG9tLHQubmVhcix0LmZhciksdC56b29tIT09dm9pZCAwJiYoby56b29tPXQuem9vbSksdC52aWV3IT09dm9pZCAwJiYoby52aWV3PU9iamVjdC5hc3NpZ24oe30sdC52aWV3KSk7YnJlYWs7Y2FzZSJBbWJpZW50TGlnaHQiOm89bmV3IGJ5KHQuY29sb3IsdC5pbnRlbnNpdHkpO2JyZWFrO2Nhc2UiRGlyZWN0aW9uYWxMaWdodCI6bz1uZXcgU3kodC5jb2xvcix0LmludGVuc2l0eSksby50YXJnZXQ9dC50YXJnZXR8fCIiO2JyZWFrO2Nhc2UiUG9pbnRMaWdodCI6bz1uZXcgTXkodC5jb2xvcix0LmludGVuc2l0eSx0LmRpc3RhbmNlLHQuZGVjYXkpO2JyZWFrO2Nhc2UiUmVjdEFyZWFMaWdodCI6bz1uZXcgd3kodC5jb2xvcix0LmludGVuc2l0eSx0LndpZHRoLHQuaGVpZ2h0KTticmVhaztjYXNlIlNwb3RMaWdodCI6bz1uZXcgX3kodC5jb2xvcix0LmludGVuc2l0eSx0LmRpc3RhbmNlLHQuYW5nbGUsdC5wZW51bWJyYSx0LmRlY2F5KSxvLnRhcmdldD10LnRhcmdldHx8IiI7YnJlYWs7Y2FzZSJIZW1pc3BoZXJlTGlnaHQiOm89bmV3IGd5KHQuY29sb3IsdC5ncm91bmRDb2xvcix0LmludGVuc2l0eSk7YnJlYWs7Y2FzZSJMaWdodFByb2JlIjpvPW5ldyBFeSgpLmZyb21KU09OKHQpO2JyZWFrO2Nhc2UiU2tpbm5lZE1lc2giOnU9YSh0Lmdlb21ldHJ5KSxoPWwodC5tYXRlcmlhbCksbz1uZXcgUzAodSxoKSx0LmJpbmRNb2RlIT09dm9pZCAwJiYoby5iaW5kTW9kZT10LmJpbmRNb2RlKSx0LmJpbmRNYXRyaXghPT12b2lkIDAmJm8uYmluZE1hdHJpeC5mcm9tQXJyYXkodC5iaW5kTWF0cml4KSx0LnNrZWxldG9uIT09dm9pZCAwJiYoby5za2VsZXRvbj10LnNrZWxldG9uKTticmVhaztjYXNlIk1lc2giOnU9YSh0Lmdlb21ldHJ5KSxoPWwodC5tYXRlcmlhbCksbz1uZXcgSWUodSxoKTticmVhaztjYXNlIkluc3RhbmNlZE1lc2giOnU9YSh0Lmdlb21ldHJ5KSxoPWwodC5tYXRlcmlhbCk7Y29uc3QgZj10LmNvdW50LGQ9dC5pbnN0YW5jZU1hdHJpeCxwPXQuaW5zdGFuY2VDb2xvcjtvPW5ldyBFMCh1LGgsZiksby5pbnN0YW5jZU1hdHJpeD1uZXcgTHMobmV3IEZsb2F0MzJBcnJheShkLmFycmF5KSwxNikscCE9PXZvaWQgMCYmKG8uaW5zdGFuY2VDb2xvcj1uZXcgTHMobmV3IEZsb2F0MzJBcnJheShwLmFycmF5KSxwLml0ZW1TaXplKSk7YnJlYWs7Y2FzZSJCYXRjaGVkTWVzaCI6dT1hKHQuZ2VvbWV0cnkpLGg9bCh0Lm1hdGVyaWFsKSxvPW5ldyBSMCh0Lm1heEluc3RhbmNlQ291bnQsdC5tYXhWZXJ0ZXhDb3VudCx0Lm1heEluZGV4Q291bnQsaCksby5nZW9tZXRyeT11LG8ucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD10LnBlck9iamVjdEZydXN0dW1DdWxsZWQsby5zb3J0T2JqZWN0cz10LnNvcnRPYmplY3RzLG8uX2RyYXdSYW5nZXM9dC5kcmF3UmFuZ2VzLG8uX3Jlc2VydmVkUmFuZ2VzPXQucmVzZXJ2ZWRSYW5nZXMsby5fdmlzaWJpbGl0eT10LnZpc2liaWxpdHksby5fYWN0aXZlPXQuYWN0aXZlLG8uX2JvdW5kcz10LmJvdW5kcy5tYXAoeT0+e2NvbnN0IG09bmV3IE9lO20ubWluLmZyb21BcnJheSh5LmJveE1pbiksbS5tYXguZnJvbUFycmF5KHkuYm94TWF4KTtjb25zdCBnPW5ldyBXZTtyZXR1cm4gZy5yYWRpdXM9eS5zcGhlcmVSYWRpdXMsZy5jZW50ZXIuZnJvbUFycmF5KHkuc3BoZXJlQ2VudGVyKSx7Ym94SW5pdGlhbGl6ZWQ6eS5ib3hJbml0aWFsaXplZCxib3g6bSxzcGhlcmVJbml0aWFsaXplZDp5LnNwaGVyZUluaXRpYWxpemVkLHNwaGVyZTpnfX0pLG8uX21heEluc3RhbmNlQ291bnQ9dC5tYXhJbnN0YW5jZUNvdW50LG8uX21heFZlcnRleENvdW50PXQubWF4VmVydGV4Q291bnQsby5fbWF4SW5kZXhDb3VudD10Lm1heEluZGV4Q291bnQsby5fZ2VvbWV0cnlJbml0aWFsaXplZD10Lmdlb21ldHJ5SW5pdGlhbGl6ZWQsby5fZ2VvbWV0cnlDb3VudD10Lmdlb21ldHJ5Q291bnQsby5fbWF0cmljZXNUZXh0dXJlPWModC5tYXRyaWNlc1RleHR1cmUudXVpZCksdC5jb2xvcnNUZXh0dXJlIT09dm9pZCAwJiYoby5fY29sb3JzVGV4dHVyZT1jKHQuY29sb3JzVGV4dHVyZS51dWlkKSk7YnJlYWs7Y2FzZSJMT0QiOm89bmV3IGcwO2JyZWFrO2Nhc2UiTGluZSI6bz1uZXcgSmkoYSh0Lmdlb21ldHJ5KSxsKHQubWF0ZXJpYWwpKTticmVhaztjYXNlIkxpbmVMb29wIjpvPW5ldyBVMChhKHQuZ2VvbWV0cnkpLGwodC5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UiTGluZVNlZ21lbnRzIjpvPW5ldyBpaShhKHQuZ2VvbWV0cnkpLGwodC5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UiUG9pbnRDbG91ZCI6Y2FzZSJQb2ludHMiOm89bmV3IEYwKGEodC5nZW9tZXRyeSksbCh0Lm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSJTcHJpdGUiOm89bmV3IHAwKGwodC5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UiR3JvdXAiOm89bmV3IFRzO2JyZWFrO2Nhc2UiQm9uZSI6bz1uZXcgeWY7YnJlYWs7ZGVmYXVsdDpvPW5ldyBuZX1pZihvLnV1aWQ9dC51dWlkLHQubmFtZSE9PXZvaWQgMCYmKG8ubmFtZT10Lm5hbWUpLHQubWF0cml4IT09dm9pZCAwPyhvLm1hdHJpeC5mcm9tQXJyYXkodC5tYXRyaXgpLHQubWF0cml4QXV0b1VwZGF0ZSE9PXZvaWQgMCYmKG8ubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUpLG8ubWF0cml4QXV0b1VwZGF0ZSYmby5tYXRyaXguZGVjb21wb3NlKG8ucG9zaXRpb24sby5xdWF0ZXJuaW9uLG8uc2NhbGUpKToodC5wb3NpdGlvbiE9PXZvaWQgMCYmby5wb3NpdGlvbi5mcm9tQXJyYXkodC5wb3NpdGlvbiksdC5yb3RhdGlvbiE9PXZvaWQgMCYmby5yb3RhdGlvbi5mcm9tQXJyYXkodC5yb3RhdGlvbiksdC5xdWF0ZXJuaW9uIT09dm9pZCAwJiZvLnF1YXRlcm5pb24uZnJvbUFycmF5KHQucXVhdGVybmlvbiksdC5zY2FsZSE9PXZvaWQgMCYmby5zY2FsZS5mcm9tQXJyYXkodC5zY2FsZSkpLHQudXAhPT12b2lkIDAmJm8udXAuZnJvbUFycmF5KHQudXApLHQuY2FzdFNoYWRvdyE9PXZvaWQgMCYmKG8uY2FzdFNoYWRvdz10LmNhc3RTaGFkb3cpLHQucmVjZWl2ZVNoYWRvdyE9PXZvaWQgMCYmKG8ucmVjZWl2ZVNoYWRvdz10LnJlY2VpdmVTaGFkb3cpLHQuc2hhZG93JiYodC5zaGFkb3cuaW50ZW5zaXR5IT09dm9pZCAwJiYoby5zaGFkb3cuaW50ZW5zaXR5PXQuc2hhZG93LmludGVuc2l0eSksdC5zaGFkb3cuYmlhcyE9PXZvaWQgMCYmKG8uc2hhZG93LmJpYXM9dC5zaGFkb3cuYmlhcyksdC5zaGFkb3cubm9ybWFsQmlhcyE9PXZvaWQgMCYmKG8uc2hhZG93Lm5vcm1hbEJpYXM9dC5zaGFkb3cubm9ybWFsQmlhcyksdC5zaGFkb3cucmFkaXVzIT09dm9pZCAwJiYoby5zaGFkb3cucmFkaXVzPXQuc2hhZG93LnJhZGl1cyksdC5zaGFkb3cubWFwU2l6ZSE9PXZvaWQgMCYmby5zaGFkb3cubWFwU2l6ZS5mcm9tQXJyYXkodC5zaGFkb3cubWFwU2l6ZSksdC5zaGFkb3cuY2FtZXJhIT09dm9pZCAwJiYoby5zaGFkb3cuY2FtZXJhPXRoaXMucGFyc2VPYmplY3QodC5zaGFkb3cuY2FtZXJhKSkpLHQudmlzaWJsZSE9PXZvaWQgMCYmKG8udmlzaWJsZT10LnZpc2libGUpLHQuZnJ1c3R1bUN1bGxlZCE9PXZvaWQgMCYmKG8uZnJ1c3R1bUN1bGxlZD10LmZydXN0dW1DdWxsZWQpLHQucmVuZGVyT3JkZXIhPT12b2lkIDAmJihvLnJlbmRlck9yZGVyPXQucmVuZGVyT3JkZXIpLHQudXNlckRhdGEhPT12b2lkIDAmJihvLnVzZXJEYXRhPXQudXNlckRhdGEpLHQubGF5ZXJzIT09dm9pZCAwJiYoby5sYXllcnMubWFzaz10LmxheWVycyksdC5jaGlsZHJlbiE9PXZvaWQgMCl7Y29uc3QgZj10LmNoaWxkcmVuO2ZvcihsZXQgZD0wO2Q8Zi5sZW5ndGg7ZCsrKW8uYWRkKHRoaXMucGFyc2VPYmplY3QoZltkXSxlLG4scixzKSl9aWYodC5hbmltYXRpb25zIT09dm9pZCAwKXtjb25zdCBmPXQuYW5pbWF0aW9ucztmb3IobGV0IGQ9MDtkPGYubGVuZ3RoO2QrKyl7Y29uc3QgcD1mW2RdO28uYW5pbWF0aW9ucy5wdXNoKHNbcF0pfX1pZih0LnR5cGU9PT0iTE9EIil7dC5hdXRvVXBkYXRlIT09dm9pZCAwJiYoby5hdXRvVXBkYXRlPXQuYXV0b1VwZGF0ZSk7Y29uc3QgZj10LmxldmVscztmb3IobGV0IGQ9MDtkPGYubGVuZ3RoO2QrKyl7Y29uc3QgcD1mW2RdLHk9by5nZXRPYmplY3RCeVByb3BlcnR5KCJ1dWlkIixwLm9iamVjdCk7eSE9PXZvaWQgMCYmby5hZGRMZXZlbCh5LHAuZGlzdGFuY2UscC5oeXN0ZXJlc2lzKX19cmV0dXJuIG99YmluZFNrZWxldG9ucyh0LGUpe09iamVjdC5rZXlzKGUpLmxlbmd0aCE9PTAmJnQudHJhdmVyc2UoZnVuY3Rpb24obil7aWYobi5pc1NraW5uZWRNZXNoPT09ITAmJm4uc2tlbGV0b24hPT12b2lkIDApe2NvbnN0IHI9ZVtuLnNrZWxldG9uXTtyPT09dm9pZCAwP2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBObyBza2VsZXRvbiBmb3VuZCB3aXRoIFVVSUQ6IixuLnNrZWxldG9uKTpuLmJpbmQocixuLmJpbmRNYXRyaXgpfX0pfWJpbmRMaWdodFRhcmdldHModCl7dC50cmF2ZXJzZShmdW5jdGlvbihlKXtpZihlLmlzRGlyZWN0aW9uYWxMaWdodHx8ZS5pc1Nwb3RMaWdodCl7Y29uc3Qgbj1lLnRhcmdldCxyPXQuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgidXVpZCIsbik7ciE9PXZvaWQgMD9lLnRhcmdldD1yOmUudGFyZ2V0PW5ldyBuZX19KX19Y29uc3QgY0M9e1VWTWFwcGluZzpCYSxDdWJlUmVmbGVjdGlvbk1hcHBpbmc6cGksQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOnppLEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOmNvLEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOnVvLEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nOmpyfSxSeT17UmVwZWF0V3JhcHBpbmc6aG8sQ2xhbXBUb0VkZ2VXcmFwcGluZzpJbixNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOmZvfSxQeT17TmVhcmVzdEZpbHRlcjpGZSxOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcjpnaCxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOlFyLExpbmVhckZpbHRlcjpSZSxMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyOnBvLExpbmVhck1pcG1hcExpbmVhckZpbHRlcjpqbn07Y2xhc3MgdUMgZXh0ZW5kcyBmbntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLmlzSW1hZ2VCaXRtYXBMb2FkZXI9ITAsdHlwZW9mIGNyZWF0ZUltYWdlQml0bWFwPT0idW5kZWZpbmVkIiYmY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLiIpLHR5cGVvZiBmZXRjaD09InVuZGVmaW5lZCImJmNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGZldGNoKCkgbm90IHN1cHBvcnRlZC4iKSx0aGlzLm9wdGlvbnM9e3ByZW11bHRpcGx5QWxwaGE6Im5vbmUifX1zZXRPcHRpb25zKHQpe3JldHVybiB0aGlzLm9wdGlvbnM9dCx0aGlzfWxvYWQodCxlLG4scil7dD09PXZvaWQgMCYmKHQ9IiIpLHRoaXMucGF0aCE9PXZvaWQgMCYmKHQ9dGhpcy5wYXRoK3QpLHQ9dGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwodCk7Y29uc3Qgcz10aGlzLG89QWkuZ2V0KHQpO2lmKG8hPT12b2lkIDApe2lmKHMubWFuYWdlci5pdGVtU3RhcnQodCksby50aGVuKXtvLnRoZW4oYz0+e2UmJmUoYykscy5tYW5hZ2VyLml0ZW1FbmQodCl9KS5jYXRjaChjPT57ciYmcihjKX0pO3JldHVybn1yZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe2UmJmUobykscy5tYW5hZ2VyLml0ZW1FbmQodCl9LDApLG99Y29uc3QgYT17fTthLmNyZWRlbnRpYWxzPXRoaXMuY3Jvc3NPcmlnaW49PT0iYW5vbnltb3VzIj8ic2FtZS1vcmlnaW4iOiJpbmNsdWRlIixhLmhlYWRlcnM9dGhpcy5yZXF1ZXN0SGVhZGVyO2NvbnN0IGw9ZmV0Y2godCxhKS50aGVuKGZ1bmN0aW9uKGMpe3JldHVybiBjLmJsb2IoKX0pLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKGMsT2JqZWN0LmFzc2lnbihzLm9wdGlvbnMse2NvbG9yU3BhY2VDb252ZXJzaW9uOiJub25lIn0pKX0pLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIEFpLmFkZCh0LGMpLGUmJmUoYykscy5tYW5hZ2VyLml0ZW1FbmQodCksY30pLmNhdGNoKGZ1bmN0aW9uKGMpe3ImJnIoYyksQWkucmVtb3ZlKHQpLHMubWFuYWdlci5pdGVtRXJyb3IodCkscy5tYW5hZ2VyLml0ZW1FbmQodCl9KTtBaS5hZGQodCxsKSxzLm1hbmFnZXIuaXRlbVN0YXJ0KHQpfX1sZXQgVWM7Y2xhc3MgWGZ7c3RhdGljIGdldENvbnRleHQoKXtyZXR1cm4gVWM9PT12b2lkIDAmJihVYz1uZXcod2luZG93LkF1ZGlvQ29udGV4dHx8d2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCkpLFVjfXN0YXRpYyBzZXRDb250ZXh0KHQpe1VjPXR9fWNsYXNzIGhDIGV4dGVuZHMgZm57Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsbixyKXtjb25zdCBzPXRoaXMsbz1uZXcgVGkodGhpcy5tYW5hZ2VyKTtvLnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKSxvLnNldFBhdGgodGhpcy5wYXRoKSxvLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxvLnNldFdpdGhDcmVkZW50aWFscyh0aGlzLndpdGhDcmVkZW50aWFscyksby5sb2FkKHQsZnVuY3Rpb24obCl7dHJ5e2NvbnN0IGM9bC5zbGljZSgwKTtYZi5nZXRDb250ZXh0KCkuZGVjb2RlQXVkaW9EYXRhKGMsZnVuY3Rpb24oaCl7ZShoKX0pLmNhdGNoKGEpfWNhdGNoKGMpe2EoYyl9fSxuLHIpO2Z1bmN0aW9uIGEobCl7cj9yKGwpOmNvbnNvbGUuZXJyb3IobCkscy5tYW5hZ2VyLml0ZW1FcnJvcih0KX19fWNvbnN0IEl5PW5ldyBMdCxMeT1uZXcgTHQsRHI9bmV3IEx0O2NsYXNzIGZDe2NvbnN0cnVjdG9yKCl7dGhpcy50eXBlPSJTdGVyZW9DYW1lcmEiLHRoaXMuYXNwZWN0PTEsdGhpcy5leWVTZXA9LjA2NCx0aGlzLmNhbWVyYUw9bmV3IGtlLHRoaXMuY2FtZXJhTC5sYXllcnMuZW5hYmxlKDEpLHRoaXMuY2FtZXJhTC5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuY2FtZXJhUj1uZXcga2UsdGhpcy5jYW1lcmFSLmxheWVycy5lbmFibGUoMiksdGhpcy5jYW1lcmFSLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5fY2FjaGU9e2ZvY3VzOm51bGwsZm92Om51bGwsYXNwZWN0Om51bGwsbmVhcjpudWxsLGZhcjpudWxsLHpvb206bnVsbCxleWVTZXA6bnVsbH19dXBkYXRlKHQpe2NvbnN0IGU9dGhpcy5fY2FjaGU7aWYoZS5mb2N1cyE9PXQuZm9jdXN8fGUuZm92IT09dC5mb3Z8fGUuYXNwZWN0IT09dC5hc3BlY3QqdGhpcy5hc3BlY3R8fGUubmVhciE9PXQubmVhcnx8ZS5mYXIhPT10LmZhcnx8ZS56b29tIT09dC56b29tfHxlLmV5ZVNlcCE9PXRoaXMuZXllU2VwKXtlLmZvY3VzPXQuZm9jdXMsZS5mb3Y9dC5mb3YsZS5hc3BlY3Q9dC5hc3BlY3QqdGhpcy5hc3BlY3QsZS5uZWFyPXQubmVhcixlLmZhcj10LmZhcixlLnpvb209dC56b29tLGUuZXllU2VwPXRoaXMuZXllU2VwLERyLmNvcHkodC5wcm9qZWN0aW9uTWF0cml4KTtjb25zdCByPWUuZXllU2VwLzIscz1yKmUubmVhci9lLmZvY3VzLG89ZS5uZWFyKk1hdGgudGFuKGdyKmUuZm92Ki41KS9lLnpvb207bGV0IGEsbDtMeS5lbGVtZW50c1sxMl09LXIsSXkuZWxlbWVudHNbMTJdPXIsYT0tbyplLmFzcGVjdCtzLGw9byplLmFzcGVjdCtzLERyLmVsZW1lbnRzWzBdPTIqZS5uZWFyLyhsLWEpLERyLmVsZW1lbnRzWzhdPShsK2EpLyhsLWEpLHRoaXMuY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmNvcHkoRHIpLGE9LW8qZS5hc3BlY3QtcyxsPW8qZS5hc3BlY3QtcyxEci5lbGVtZW50c1swXT0yKmUubmVhci8obC1hKSxEci5lbGVtZW50c1s4XT0obCthKS8obC1hKSx0aGlzLmNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5jb3B5KERyKX10aGlzLmNhbWVyYUwubWF0cml4V29ybGQuY29weSh0Lm1hdHJpeFdvcmxkKS5tdWx0aXBseShMeSksdGhpcy5jYW1lcmFSLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCkubXVsdGlwbHkoSXkpfX1jbGFzcyBEeXtjb25zdHJ1Y3Rvcih0PSEwKXt0aGlzLmF1dG9TdGFydD10LHRoaXMuc3RhcnRUaW1lPTAsdGhpcy5vbGRUaW1lPTAsdGhpcy5lbGFwc2VkVGltZT0wLHRoaXMucnVubmluZz0hMX1zdGFydCgpe3RoaXMuc3RhcnRUaW1lPVV5KCksdGhpcy5vbGRUaW1lPXRoaXMuc3RhcnRUaW1lLHRoaXMuZWxhcHNlZFRpbWU9MCx0aGlzLnJ1bm5pbmc9ITB9c3RvcCgpe3RoaXMuZ2V0RWxhcHNlZFRpbWUoKSx0aGlzLnJ1bm5pbmc9ITEsdGhpcy5hdXRvU3RhcnQ9ITF9Z2V0RWxhcHNlZFRpbWUoKXtyZXR1cm4gdGhpcy5nZXREZWx0YSgpLHRoaXMuZWxhcHNlZFRpbWV9Z2V0RGVsdGEoKXtsZXQgdD0wO2lmKHRoaXMuYXV0b1N0YXJ0JiYhdGhpcy5ydW5uaW5nKXJldHVybiB0aGlzLnN0YXJ0KCksMDtpZih0aGlzLnJ1bm5pbmcpe2NvbnN0IGU9VXkoKTt0PShlLXRoaXMub2xkVGltZSkvMWUzLHRoaXMub2xkVGltZT1lLHRoaXMuZWxhcHNlZFRpbWUrPXR9cmV0dXJuIHR9fWZ1bmN0aW9uIFV5KCl7cmV0dXJuKHR5cGVvZiBwZXJmb3JtYW5jZT09InVuZGVmaW5lZCI/RGF0ZTpwZXJmb3JtYW5jZSkubm93KCl9Y29uc3QgVXI9bmV3IEwsTnk9bmV3IHVuLGRDPW5ldyBMLE5yPW5ldyBMO2NsYXNzIHBDIGV4dGVuZHMgbmV7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iQXVkaW9MaXN0ZW5lciIsdGhpcy5jb250ZXh0PVhmLmdldENvbnRleHQoKSx0aGlzLmdhaW49dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKSx0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPW51bGwsdGhpcy50aW1lRGVsdGE9MCx0aGlzLl9jbG9jaz1uZXcgRHl9Z2V0SW5wdXQoKXtyZXR1cm4gdGhpcy5nYWlufXJlbW92ZUZpbHRlcigpe3JldHVybiB0aGlzLmZpbHRlciE9PW51bGwmJih0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksdGhpcy5maWx0ZXI9bnVsbCksdGhpc31nZXRGaWx0ZXIoKXtyZXR1cm4gdGhpcy5maWx0ZXJ9c2V0RmlsdGVyKHQpe3JldHVybiB0aGlzLmZpbHRlciE9PW51bGw/KHRoaXMuZ2Fpbi5kaXNjb25uZWN0KHRoaXMuZmlsdGVyKSx0aGlzLmZpbHRlci5kaXNjb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbikpOnRoaXMuZ2Fpbi5kaXNjb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksdGhpcy5maWx0ZXI9dCx0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXN9Z2V0TWFzdGVyVm9sdW1lKCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlfXNldE1hc3RlclZvbHVtZSh0KXtyZXR1cm4gdGhpcy5nYWluLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKHQsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSksdGhpc311cGRhdGVNYXRyaXhXb3JsZCh0KXtzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KTtjb25zdCBlPXRoaXMuY29udGV4dC5saXN0ZW5lcixuPXRoaXMudXA7aWYodGhpcy50aW1lRGVsdGE9dGhpcy5fY2xvY2suZ2V0RGVsdGEoKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShVcixOeSxkQyksTnIuc2V0KDAsMCwtMSkuYXBwbHlRdWF0ZXJuaW9uKE55KSxlLnBvc2l0aW9uWCl7Y29uc3Qgcj10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy50aW1lRGVsdGE7ZS5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoVXIueCxyKSxlLnBvc2l0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShVci55LHIpLGUucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKFVyLnosciksZS5mb3J3YXJkWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShOci54LHIpLGUuZm9yd2FyZFkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoTnIueSxyKSxlLmZvcndhcmRaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKE5yLnosciksZS51cFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobi54LHIpLGUudXBZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG4ueSxyKSxlLnVwWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShuLnoscil9ZWxzZSBlLnNldFBvc2l0aW9uKFVyLngsVXIueSxVci56KSxlLnNldE9yaWVudGF0aW9uKE5yLngsTnIueSxOci56LG4ueCxuLnksbi56KX19Y2xhc3MgRnkgZXh0ZW5kcyBuZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iQXVkaW8iLHRoaXMubGlzdGVuZXI9dCx0aGlzLmNvbnRleHQ9dC5jb250ZXh0LHRoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpLHRoaXMuZ2Fpbi5jb25uZWN0KHQuZ2V0SW5wdXQoKSksdGhpcy5hdXRvcGxheT0hMSx0aGlzLmJ1ZmZlcj1udWxsLHRoaXMuZGV0dW5lPTAsdGhpcy5sb29wPSExLHRoaXMubG9vcFN0YXJ0PTAsdGhpcy5sb29wRW5kPTAsdGhpcy5vZmZzZXQ9MCx0aGlzLmR1cmF0aW9uPXZvaWQgMCx0aGlzLnBsYXliYWNrUmF0ZT0xLHRoaXMuaXNQbGF5aW5nPSExLHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSEwLHRoaXMuc291cmNlPW51bGwsdGhpcy5zb3VyY2VUeXBlPSJlbXB0eSIsdGhpcy5fc3RhcnRlZEF0PTAsdGhpcy5fcHJvZ3Jlc3M9MCx0aGlzLl9jb25uZWN0ZWQ9ITEsdGhpcy5maWx0ZXJzPVtdfWdldE91dHB1dCgpe3JldHVybiB0aGlzLmdhaW59c2V0Tm9kZVNvdXJjZSh0KXtyZXR1cm4gdGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9ITEsdGhpcy5zb3VyY2VUeXBlPSJhdWRpb05vZGUiLHRoaXMuc291cmNlPXQsdGhpcy5jb25uZWN0KCksdGhpc31zZXRNZWRpYUVsZW1lbnRTb3VyY2UodCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSExLHRoaXMuc291cmNlVHlwZT0ibWVkaWFOb2RlIix0aGlzLnNvdXJjZT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKHQpLHRoaXMuY29ubmVjdCgpLHRoaXN9c2V0TWVkaWFTdHJlYW1Tb3VyY2UodCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSExLHRoaXMuc291cmNlVHlwZT0ibWVkaWFTdHJlYW1Ob2RlIix0aGlzLnNvdXJjZT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2UodCksdGhpcy5jb25uZWN0KCksdGhpc31zZXRCdWZmZXIodCl7cmV0dXJuIHRoaXMuYnVmZmVyPXQsdGhpcy5zb3VyY2VUeXBlPSJidWZmZXIiLHRoaXMuYXV0b3BsYXkmJnRoaXMucGxheSgpLHRoaXN9cGxheSh0PTApe2lmKHRoaXMuaXNQbGF5aW5nPT09ITApe2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IEF1ZGlvIGlzIGFscmVhZHkgcGxheWluZy4iKTtyZXR1cm59aWYodGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9PT0hMSl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtyZXR1cm59dGhpcy5fc3RhcnRlZEF0PXRoaXMuY29udGV4dC5jdXJyZW50VGltZSt0O2NvbnN0IGU9dGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO3JldHVybiBlLmJ1ZmZlcj10aGlzLmJ1ZmZlcixlLmxvb3A9dGhpcy5sb29wLGUubG9vcFN0YXJ0PXRoaXMubG9vcFN0YXJ0LGUubG9vcEVuZD10aGlzLmxvb3BFbmQsZS5vbmVuZGVkPXRoaXMub25FbmRlZC5iaW5kKHRoaXMpLGUuc3RhcnQodGhpcy5fc3RhcnRlZEF0LHRoaXMuX3Byb2dyZXNzK3RoaXMub2Zmc2V0LHRoaXMuZHVyYXRpb24pLHRoaXMuaXNQbGF5aW5nPSEwLHRoaXMuc291cmNlPWUsdGhpcy5zZXREZXR1bmUodGhpcy5kZXR1bmUpLHRoaXMuc2V0UGxheWJhY2tSYXRlKHRoaXMucGxheWJhY2tSYXRlKSx0aGlzLmNvbm5lY3QoKX1wYXVzZSgpe2lmKHRoaXMuaGFzUGxheWJhY2tDb250cm9sPT09ITEpe2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7cmV0dXJufXJldHVybiB0aGlzLmlzUGxheWluZz09PSEwJiYodGhpcy5fcHJvZ3Jlc3MrPU1hdGgubWF4KHRoaXMuY29udGV4dC5jdXJyZW50VGltZS10aGlzLl9zdGFydGVkQXQsMCkqdGhpcy5wbGF5YmFja1JhdGUsdGhpcy5sb29wPT09ITAmJih0aGlzLl9wcm9ncmVzcz10aGlzLl9wcm9ncmVzcyUodGhpcy5kdXJhdGlvbnx8dGhpcy5idWZmZXIuZHVyYXRpb24pKSx0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMuaXNQbGF5aW5nPSExKSx0aGlzfXN0b3AoKXtpZih0aGlzLmhhc1BsYXliYWNrQ29udHJvbD09PSExKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO3JldHVybn1yZXR1cm4gdGhpcy5fcHJvZ3Jlc3M9MCx0aGlzLnNvdXJjZSE9PW51bGwmJih0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsKSx0aGlzLmlzUGxheWluZz0hMSx0aGlzfWNvbm5lY3QoKXtpZih0aGlzLmZpbHRlcnMubGVuZ3RoPjApe3RoaXMuc291cmNlLmNvbm5lY3QodGhpcy5maWx0ZXJzWzBdKTtmb3IobGV0IHQ9MSxlPXRoaXMuZmlsdGVycy5sZW5ndGg7dDxlO3QrKyl0aGlzLmZpbHRlcnNbdC0xXS5jb25uZWN0KHRoaXMuZmlsdGVyc1t0XSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmNvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXMuX2Nvbm5lY3RlZD0hMCx0aGlzfWRpc2Nvbm5lY3QoKXtpZih0aGlzLl9jb25uZWN0ZWQhPT0hMSl7aWYodGhpcy5maWx0ZXJzLmxlbmd0aD4wKXt0aGlzLnNvdXJjZS5kaXNjb25uZWN0KHRoaXMuZmlsdGVyc1swXSk7Zm9yKGxldCB0PTEsZT10aGlzLmZpbHRlcnMubGVuZ3RoO3Q8ZTt0KyspdGhpcy5maWx0ZXJzW3QtMV0uZGlzY29ubmVjdCh0aGlzLmZpbHRlcnNbdF0pO3RoaXMuZmlsdGVyc1t0aGlzLmZpbHRlcnMubGVuZ3RoLTFdLmRpc2Nvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSl9ZWxzZSB0aGlzLnNvdXJjZS5kaXNjb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpO3JldHVybiB0aGlzLl9jb25uZWN0ZWQ9ITEsdGhpc319Z2V0RmlsdGVycygpe3JldHVybiB0aGlzLmZpbHRlcnN9c2V0RmlsdGVycyh0KXtyZXR1cm4gdHx8KHQ9W10pLHRoaXMuX2Nvbm5lY3RlZD09PSEwPyh0aGlzLmRpc2Nvbm5lY3QoKSx0aGlzLmZpbHRlcnM9dC5zbGljZSgpLHRoaXMuY29ubmVjdCgpKTp0aGlzLmZpbHRlcnM9dC5zbGljZSgpLHRoaXN9c2V0RGV0dW5lKHQpe3JldHVybiB0aGlzLmRldHVuZT10LHRoaXMuaXNQbGF5aW5nPT09ITAmJnRoaXMuc291cmNlLmRldHVuZSE9PXZvaWQgMCYmdGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSh0aGlzLmRldHVuZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfWdldERldHVuZSgpe3JldHVybiB0aGlzLmRldHVuZX1nZXRGaWx0ZXIoKXtyZXR1cm4gdGhpcy5nZXRGaWx0ZXJzKClbMF19c2V0RmlsdGVyKHQpe3JldHVybiB0aGlzLnNldEZpbHRlcnModD9bdF06W10pfXNldFBsYXliYWNrUmF0ZSh0KXtpZih0aGlzLmhhc1BsYXliYWNrQ29udHJvbD09PSExKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO3JldHVybn1yZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU9dCx0aGlzLmlzUGxheWluZz09PSEwJiZ0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMucGxheWJhY2tSYXRlLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9Z2V0UGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMucGxheWJhY2tSYXRlfW9uRW5kZWQoKXt0aGlzLmlzUGxheWluZz0hMX1nZXRMb29wKCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPT09ITE/KGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIiksITEpOnRoaXMubG9vcH1zZXRMb29wKHQpe2lmKHRoaXMuaGFzUGxheWJhY2tDb250cm9sPT09ITEpe2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7cmV0dXJufXJldHVybiB0aGlzLmxvb3A9dCx0aGlzLmlzUGxheWluZz09PSEwJiYodGhpcy5zb3VyY2UubG9vcD10aGlzLmxvb3ApLHRoaXN9c2V0TG9vcFN0YXJ0KHQpe3JldHVybiB0aGlzLmxvb3BTdGFydD10LHRoaXN9c2V0TG9vcEVuZCh0KXtyZXR1cm4gdGhpcy5sb29wRW5kPXQsdGhpc31nZXRWb2x1bWUoKXtyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWV9c2V0Vm9sdW1lKHQpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUodCx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfX1jb25zdCBGcj1uZXcgTCxPeT1uZXcgdW4sbUM9bmV3IEwsT3I9bmV3IEw7Y2xhc3MgZ0MgZXh0ZW5kcyBGeXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnBhbm5lcj10aGlzLmNvbnRleHQuY3JlYXRlUGFubmVyKCksdGhpcy5wYW5uZXIucGFubmluZ01vZGVsPSJIUlRGIix0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbil9Y29ubmVjdCgpe3N1cGVyLmNvbm5lY3QoKSx0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbil9ZGlzY29ubmVjdCgpe3N1cGVyLmRpc2Nvbm5lY3QoKSx0aGlzLnBhbm5lci5kaXNjb25uZWN0KHRoaXMuZ2Fpbil9Z2V0T3V0cHV0KCl7cmV0dXJuIHRoaXMucGFubmVyfWdldFJlZkRpc3RhbmNlKCl7cmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlfXNldFJlZkRpc3RhbmNlKHQpe3JldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZT10LHRoaXN9Z2V0Um9sbG9mZkZhY3Rvcigpe3JldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yfXNldFJvbGxvZmZGYWN0b3IodCl7cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I9dCx0aGlzfWdldERpc3RhbmNlTW9kZWwoKXtyZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbH1zZXREaXN0YW5jZU1vZGVsKHQpe3JldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsPXQsdGhpc31nZXRNYXhEaXN0YW5jZSgpe3JldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZX1zZXRNYXhEaXN0YW5jZSh0KXtyZXR1cm4gdGhpcy5wYW5uZXIubWF4RGlzdGFuY2U9dCx0aGlzfXNldERpcmVjdGlvbmFsQ29uZSh0LGUsbil7cmV0dXJuIHRoaXMucGFubmVyLmNvbmVJbm5lckFuZ2xlPXQsdGhpcy5wYW5uZXIuY29uZU91dGVyQW5nbGU9ZSx0aGlzLnBhbm5lci5jb25lT3V0ZXJHYWluPW4sdGhpc311cGRhdGVNYXRyaXhXb3JsZCh0KXtpZihzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KSx0aGlzLmhhc1BsYXliYWNrQ29udHJvbD09PSEwJiZ0aGlzLmlzUGxheWluZz09PSExKXJldHVybjt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShGcixPeSxtQyksT3Iuc2V0KDAsMCwxKS5hcHBseVF1YXRlcm5pb24oT3kpO2NvbnN0IGU9dGhpcy5wYW5uZXI7aWYoZS5wb3NpdGlvblgpe2NvbnN0IG49dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3RoaXMubGlzdGVuZXIudGltZURlbHRhO2UucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKEZyLngsbiksZS5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoRnIueSxuKSxlLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShGci56LG4pLGUub3JpZW50YXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKE9yLngsbiksZS5vcmllbnRhdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoT3IueSxuKSxlLm9yaWVudGF0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShPci56LG4pfWVsc2UgZS5zZXRQb3NpdGlvbihGci54LEZyLnksRnIueiksZS5zZXRPcmllbnRhdGlvbihPci54LE9yLnksT3Iueil9fWNsYXNzIHlDe2NvbnN0cnVjdG9yKHQsZT0yMDQ4KXt0aGlzLmFuYWx5c2VyPXQuY29udGV4dC5jcmVhdGVBbmFseXNlcigpLHRoaXMuYW5hbHlzZXIuZmZ0U2l6ZT1lLHRoaXMuZGF0YT1uZXcgVWludDhBcnJheSh0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50KSx0LmdldE91dHB1dCgpLmNvbm5lY3QodGhpcy5hbmFseXNlcil9Z2V0RnJlcXVlbmN5RGF0YSgpe3JldHVybiB0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKHRoaXMuZGF0YSksdGhpcy5kYXRhfWdldEF2ZXJhZ2VGcmVxdWVuY3koKXtsZXQgdD0wO2NvbnN0IGU9dGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdCs9ZVtuXTtyZXR1cm4gdC9lLmxlbmd0aH19Y2xhc3MgQnl7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuYmluZGluZz10LHRoaXMudmFsdWVTaXplPW47bGV0IHIscyxvO3N3aXRjaChlKXtjYXNlInF1YXRlcm5pb24iOnI9dGhpcy5fc2xlcnAscz10aGlzLl9zbGVycEFkZGl0aXZlLG89dGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb24sdGhpcy5idWZmZXI9bmV3IEZsb2F0NjRBcnJheShuKjYpLHRoaXMuX3dvcmtJbmRleD01O2JyZWFrO2Nhc2Uic3RyaW5nIjpjYXNlImJvb2wiOnI9dGhpcy5fc2VsZWN0LHM9dGhpcy5fc2VsZWN0LG89dGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eU90aGVyLHRoaXMuYnVmZmVyPW5ldyBBcnJheShuKjUpO2JyZWFrO2RlZmF1bHQ6cj10aGlzLl9sZXJwLHM9dGhpcy5fbGVycEFkZGl0aXZlLG89dGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eU51bWVyaWMsdGhpcy5idWZmZXI9bmV3IEZsb2F0NjRBcnJheShuKjUpfXRoaXMuX21peEJ1ZmZlclJlZ2lvbj1yLHRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlPXMsdGhpcy5fc2V0SWRlbnRpdHk9byx0aGlzLl9vcmlnSW5kZXg9Myx0aGlzLl9hZGRJbmRleD00LHRoaXMuY3VtdWxhdGl2ZVdlaWdodD0wLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPTAsdGhpcy51c2VDb3VudD0wLHRoaXMucmVmZXJlbmNlQ291bnQ9MH1hY2N1bXVsYXRlKHQsZSl7Y29uc3Qgbj10aGlzLmJ1ZmZlcixyPXRoaXMudmFsdWVTaXplLHM9dCpyK3I7bGV0IG89dGhpcy5jdW11bGF0aXZlV2VpZ2h0O2lmKG89PT0wKXtmb3IobGV0IGE9MDthIT09cjsrK2EpbltzK2FdPW5bYV07bz1lfWVsc2V7bys9ZTtjb25zdCBhPWUvbzt0aGlzLl9taXhCdWZmZXJSZWdpb24obixzLDAsYSxyKX10aGlzLmN1bXVsYXRpdmVXZWlnaHQ9b31hY2N1bXVsYXRlQWRkaXRpdmUodCl7Y29uc3QgZT10aGlzLmJ1ZmZlcixuPXRoaXMudmFsdWVTaXplLHI9bip0aGlzLl9hZGRJbmRleDt0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZT09PTAmJnRoaXMuX3NldElkZW50aXR5KCksdGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmUoZSxyLDAsdCxuKSx0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSs9dH1hcHBseSh0KXtjb25zdCBlPXRoaXMudmFsdWVTaXplLG49dGhpcy5idWZmZXIscj10KmUrZSxzPXRoaXMuY3VtdWxhdGl2ZVdlaWdodCxvPXRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlLGE9dGhpcy5iaW5kaW5nO2lmKHRoaXMuY3VtdWxhdGl2ZVdlaWdodD0wLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPTAsczwxKXtjb25zdCBsPWUqdGhpcy5fb3JpZ0luZGV4O3RoaXMuX21peEJ1ZmZlclJlZ2lvbihuLHIsbCwxLXMsZSl9bz4wJiZ0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZShuLHIsdGhpcy5fYWRkSW5kZXgqZSwxLGUpO2ZvcihsZXQgbD1lLGM9ZStlO2whPT1jOysrbClpZihuW2xdIT09bltsK2VdKXthLnNldFZhbHVlKG4scik7YnJlYWt9fXNhdmVPcmlnaW5hbFN0YXRlKCl7Y29uc3QgdD10aGlzLmJpbmRpbmcsZT10aGlzLmJ1ZmZlcixuPXRoaXMudmFsdWVTaXplLHI9bip0aGlzLl9vcmlnSW5kZXg7dC5nZXRWYWx1ZShlLHIpO2ZvcihsZXQgcz1uLG89cjtzIT09bzsrK3MpZVtzXT1lW3IrcyVuXTt0aGlzLl9zZXRJZGVudGl0eSgpLHRoaXMuY3VtdWxhdGl2ZVdlaWdodD0wLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPTB9cmVzdG9yZU9yaWdpbmFsU3RhdGUoKXtjb25zdCB0PXRoaXMudmFsdWVTaXplKjM7dGhpcy5iaW5kaW5nLnNldFZhbHVlKHRoaXMuYnVmZmVyLHQpfV9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpe2NvbnN0IHQ9dGhpcy5fYWRkSW5kZXgqdGhpcy52YWx1ZVNpemUsZT10K3RoaXMudmFsdWVTaXplO2ZvcihsZXQgbj10O248ZTtuKyspdGhpcy5idWZmZXJbbl09MH1fc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb24oKXt0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpLHRoaXMuYnVmZmVyW3RoaXMuX2FkZEluZGV4KnRoaXMudmFsdWVTaXplKzNdPTF9X3NldEFkZGl0aXZlSWRlbnRpdHlPdGhlcigpe2NvbnN0IHQ9dGhpcy5fb3JpZ0luZGV4KnRoaXMudmFsdWVTaXplLGU9dGhpcy5fYWRkSW5kZXgqdGhpcy52YWx1ZVNpemU7Zm9yKGxldCBuPTA7bjx0aGlzLnZhbHVlU2l6ZTtuKyspdGhpcy5idWZmZXJbZStuXT10aGlzLmJ1ZmZlclt0K25dfV9zZWxlY3QodCxlLG4scixzKXtpZihyPj0uNSlmb3IobGV0IG89MDtvIT09czsrK28pdFtlK29dPXRbbitvXX1fc2xlcnAodCxlLG4scil7dW4uc2xlcnBGbGF0KHQsZSx0LGUsdCxuLHIpfV9zbGVycEFkZGl0aXZlKHQsZSxuLHIscyl7Y29uc3Qgbz10aGlzLl93b3JrSW5kZXgqczt1bi5tdWx0aXBseVF1YXRlcm5pb25zRmxhdCh0LG8sdCxlLHQsbiksdW4uc2xlcnBGbGF0KHQsZSx0LGUsdCxvLHIpfV9sZXJwKHQsZSxuLHIscyl7Y29uc3Qgbz0xLXI7Zm9yKGxldCBhPTA7YSE9PXM7KythKXtjb25zdCBsPWUrYTt0W2xdPXRbbF0qbyt0W24rYV0qcn19X2xlcnBBZGRpdGl2ZSh0LGUsbixyLHMpe2ZvcihsZXQgbz0wO28hPT1zOysrbyl7Y29uc3QgYT1lK287dFthXT10W2FdK3RbbitvXSpyfX19Y29uc3QgcWY9IlxcW1xcXVxcLjpcXC8iLHZDPW5ldyBSZWdFeHAoIlsiK3FmKyJdIiwiZyIpLFlmPSJbXiIrcWYrIl0iLF9DPSJbXiIrcWYucmVwbGFjZSgiXFwuIiwiIikrIl0iLHhDPS8oKD86V0MrW1wvOl0pKikvLnNvdXJjZS5yZXBsYWNlKCJXQyIsWWYpLE1DPS8oV0NPRCspPy8uc291cmNlLnJlcGxhY2UoIldDT0QiLF9DKSxTQz0vKD86XC4oV0MrKSg/OlxbKC4rKVxdKT8pPy8uc291cmNlLnJlcGxhY2UoIldDIixZZiksYkM9L1wuKFdDKykoPzpcWyguKylcXSk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLFlmKSx3Qz1uZXcgUmVnRXhwKCJeIit4QytNQytTQytiQysiJCIpLEFDPVsibWF0ZXJpYWwiLCJtYXRlcmlhbHMiLCJib25lcyIsIm1hcCJdO2NsYXNzIEVDe2NvbnN0cnVjdG9yKHQsZSxuKXtjb25zdCByPW58fGllLnBhcnNlVHJhY2tOYW1lKGUpO3RoaXMuX3RhcmdldEdyb3VwPXQsdGhpcy5fYmluZGluZ3M9dC5zdWJzY3JpYmVfKGUscil9Z2V0VmFsdWUodCxlKXt0aGlzLmJpbmQoKTtjb25zdCBuPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxyPXRoaXMuX2JpbmRpbmdzW25dO3IhPT12b2lkIDAmJnIuZ2V0VmFsdWUodCxlKX1zZXRWYWx1ZSh0LGUpe2NvbnN0IG49dGhpcy5fYmluZGluZ3M7Zm9yKGxldCByPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxzPW4ubGVuZ3RoO3IhPT1zOysrciluW3JdLnNldFZhbHVlKHQsZSl9YmluZCgpe2NvbnN0IHQ9dGhpcy5fYmluZGluZ3M7Zm9yKGxldCBlPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxuPXQubGVuZ3RoO2UhPT1uOysrZSl0W2VdLmJpbmQoKX11bmJpbmQoKXtjb25zdCB0PXRoaXMuX2JpbmRpbmdzO2ZvcihsZXQgZT10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sbj10Lmxlbmd0aDtlIT09bjsrK2UpdFtlXS51bmJpbmQoKX19Y2xhc3MgaWV7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMucGF0aD1lLHRoaXMucGFyc2VkUGF0aD1ufHxpZS5wYXJzZVRyYWNrTmFtZShlKSx0aGlzLm5vZGU9aWUuZmluZE5vZGUodCx0aGlzLnBhcnNlZFBhdGgubm9kZU5hbWUpLHRoaXMucm9vdE5vZGU9dCx0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYm91bmQsdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmJvdW5kfXN0YXRpYyBjcmVhdGUodCxlLG4pe3JldHVybiB0JiZ0LmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA/bmV3IGllLkNvbXBvc2l0ZSh0LGUsbik6bmV3IGllKHQsZSxuKX1zdGF0aWMgc2FuaXRpemVOb2RlTmFtZSh0KXtyZXR1cm4gdC5yZXBsYWNlKC9ccy9nLCJfIikucmVwbGFjZSh2QywiIil9c3RhdGljIHBhcnNlVHJhY2tOYW1lKHQpe2NvbnN0IGU9d0MuZXhlYyh0KTtpZihlPT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoIlByb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogIit0KTtjb25zdCBuPXtub2RlTmFtZTplWzJdLG9iamVjdE5hbWU6ZVszXSxvYmplY3RJbmRleDplWzRdLHByb3BlcnR5TmFtZTplWzVdLHByb3BlcnR5SW5kZXg6ZVs2XX0scj1uLm5vZGVOYW1lJiZuLm5vZGVOYW1lLmxhc3RJbmRleE9mKCIuIik7aWYociE9PXZvaWQgMCYmciE9PS0xKXtjb25zdCBzPW4ubm9kZU5hbWUuc3Vic3RyaW5nKHIrMSk7QUMuaW5kZXhPZihzKSE9PS0xJiYobi5ub2RlTmFtZT1uLm5vZGVOYW1lLnN1YnN0cmluZygwLHIpLG4ub2JqZWN0TmFtZT1zKX1pZihuLnByb3BlcnR5TmFtZT09PW51bGx8fG4ucHJvcGVydHlOYW1lLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCJQcm9wZXJ0eUJpbmRpbmc6IGNhbiBub3QgcGFyc2UgcHJvcGVydHlOYW1lIGZyb20gdHJhY2tOYW1lOiAiK3QpO3JldHVybiBufXN0YXRpYyBmaW5kTm9kZSh0LGUpe2lmKGU9PT12b2lkIDB8fGU9PT0iInx8ZT09PSIuInx8ZT09PS0xfHxlPT09dC5uYW1lfHxlPT09dC51dWlkKXJldHVybiB0O2lmKHQuc2tlbGV0b24pe2NvbnN0IG49dC5za2VsZXRvbi5nZXRCb25lQnlOYW1lKGUpO2lmKG4hPT12b2lkIDApcmV0dXJuIG59aWYodC5jaGlsZHJlbil7Y29uc3Qgbj1mdW5jdGlvbihzKXtmb3IobGV0IG89MDtvPHMubGVuZ3RoO28rKyl7Y29uc3QgYT1zW29dO2lmKGEubmFtZT09PWV8fGEudXVpZD09PWUpcmV0dXJuIGE7Y29uc3QgbD1uKGEuY2hpbGRyZW4pO2lmKGwpcmV0dXJuIGx9cmV0dXJuIG51bGx9LHI9bih0LmNoaWxkcmVuKTtpZihyKXJldHVybiByfXJldHVybiBudWxsfV9nZXRWYWx1ZV91bmF2YWlsYWJsZSgpe31fc2V0VmFsdWVfdW5hdmFpbGFibGUoKXt9X2dldFZhbHVlX2RpcmVjdCh0LGUpe3RbZV09dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdfV9nZXRWYWx1ZV9hcnJheSh0LGUpe2NvbnN0IG49dGhpcy5yZXNvbHZlZFByb3BlcnR5O2ZvcihsZXQgcj0wLHM9bi5sZW5ndGg7ciE9PXM7KytyKXRbZSsrXT1uW3JdfV9nZXRWYWx1ZV9hcnJheUVsZW1lbnQodCxlKXt0W2VdPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdfV9nZXRWYWx1ZV90b0FycmF5KHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LnRvQXJyYXkodCxlKX1fc2V0VmFsdWVfZGlyZWN0KHQsZSl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPXRbZV19X3NldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZSh0LGUpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT10W2VdLHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSh0LGUpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT10W2VdLHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2FycmF5KHQsZSl7Y29uc3Qgbj10aGlzLnJlc29sdmVkUHJvcGVydHk7Zm9yKGxldCByPTAscz1uLmxlbmd0aDtyIT09czsrK3IpbltyXT10W2UrK119X3NldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlKHQsZSl7Y29uc3Qgbj10aGlzLnJlc29sdmVkUHJvcGVydHk7Zm9yKGxldCByPTAscz1uLmxlbmd0aDtyIT09czsrK3IpbltyXT10W2UrK107dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2FycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUodCxlKXtjb25zdCBuPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtmb3IobGV0IHI9MCxzPW4ubGVuZ3RoO3IhPT1zOysrciluW3JdPXRbZSsrXTt0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheUVsZW1lbnQodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT10W2VdfV9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT10W2VdLHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPXRbZV0sdGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfZnJvbUFycmF5KHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSh0LGUpfV9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KHQsZSksdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSh0LGUpLHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9X2dldFZhbHVlX3VuYm91bmQodCxlKXt0aGlzLmJpbmQoKSx0aGlzLmdldFZhbHVlKHQsZSl9X3NldFZhbHVlX3VuYm91bmQodCxlKXt0aGlzLmJpbmQoKSx0aGlzLnNldFZhbHVlKHQsZSl9YmluZCgpe2xldCB0PXRoaXMubm9kZTtjb25zdCBlPXRoaXMucGFyc2VkUGF0aCxuPWUub2JqZWN0TmFtZSxyPWUucHJvcGVydHlOYW1lO2xldCBzPWUucHJvcGVydHlJbmRleDtpZih0fHwodD1pZS5maW5kTm9kZSh0aGlzLnJvb3ROb2RlLGUubm9kZU5hbWUpLHRoaXMubm9kZT10KSx0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYXZhaWxhYmxlLHRoaXMuc2V0VmFsdWU9dGhpcy5fc2V0VmFsdWVfdW5hdmFpbGFibGUsIXQpe2NvbnNvbGUud2FybigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBObyB0YXJnZXQgbm9kZSBmb3VuZCBmb3IgdHJhY2s6ICIrdGhpcy5wYXRoKyIuIik7cmV0dXJufWlmKG4pe2xldCBjPWUub2JqZWN0SW5kZXg7c3dpdGNoKG4pe2Nhc2UibWF0ZXJpYWxzIjppZighdC5tYXRlcmlhbCl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuIix0aGlzKTtyZXR1cm59aWYoIXQubWF0ZXJpYWwubWF0ZXJpYWxzKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXRlcmlhbHMgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWxzIGFycmF5LiIsdGhpcyk7cmV0dXJufXQ9dC5tYXRlcmlhbC5tYXRlcmlhbHM7YnJlYWs7Y2FzZSJib25lcyI6aWYoIXQuc2tlbGV0b24pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLiIsdGhpcyk7cmV0dXJufXQ9dC5za2VsZXRvbi5ib25lcztmb3IobGV0IHU9MDt1PHQubGVuZ3RoO3UrKylpZih0W3VdLm5hbWU9PT1jKXtjPXU7YnJlYWt9YnJlYWs7Y2FzZSJtYXAiOmlmKCJtYXAiaW4gdCl7dD10Lm1hcDticmVha31pZighdC5tYXRlcmlhbCl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuIix0aGlzKTtyZXR1cm59aWYoIXQubWF0ZXJpYWwubWFwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXAgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWFwLiIsdGhpcyk7cmV0dXJufXQ9dC5tYXRlcmlhbC5tYXA7YnJlYWs7ZGVmYXVsdDppZih0W25dPT09dm9pZCAwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLiIsdGhpcyk7cmV0dXJufXQ9dFtuXX1pZihjIT09dm9pZCAwKXtpZih0W2NdPT09dm9pZCAwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuIix0aGlzLHQpO3JldHVybn10PXRbY119fWNvbnN0IG89dFtyXTtpZihvPT09dm9pZCAwKXtjb25zdCBjPWUubm9kZU5hbWU7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogIitjKyIuIityKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iLHQpO3JldHVybn1sZXQgYT10aGlzLlZlcnNpb25pbmcuTm9uZTt0aGlzLnRhcmdldE9iamVjdD10LHQubmVlZHNVcGRhdGUhPT12b2lkIDA/YT10aGlzLlZlcnNpb25pbmcuTmVlZHNVcGRhdGU6dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlIT09dm9pZCAwJiYoYT10aGlzLlZlcnNpb25pbmcuTWF0cml4V29ybGROZWVkc1VwZGF0ZSk7bGV0IGw9dGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7aWYocyE9PXZvaWQgMCl7aWYocj09PSJtb3JwaFRhcmdldEluZmx1ZW5jZXMiKXtpZighdC5nZW9tZXRyeSl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkuIix0aGlzKTtyZXR1cm59aWYoIXQuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuIix0aGlzKTtyZXR1cm59dC5tb3JwaFRhcmdldERpY3Rpb25hcnlbc10hPT12b2lkIDAmJihzPXQubW9ycGhUYXJnZXREaWN0aW9uYXJ5W3NdKX1sPXRoaXMuQmluZGluZ1R5cGUuQXJyYXlFbGVtZW50LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT1vLHRoaXMucHJvcGVydHlJbmRleD1zfWVsc2Ugby5mcm9tQXJyYXkhPT12b2lkIDAmJm8udG9BcnJheSE9PXZvaWQgMD8obD10aGlzLkJpbmRpbmdUeXBlLkhhc0Zyb21Ub0FycmF5LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT1vKTpBcnJheS5pc0FycmF5KG8pPyhsPXRoaXMuQmluZGluZ1R5cGUuRW50aXJlQXJyYXksdGhpcy5yZXNvbHZlZFByb3BlcnR5PW8pOnRoaXMucHJvcGVydHlOYW1lPXI7dGhpcy5nZXRWYWx1ZT10aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbbF0sdGhpcy5zZXRWYWx1ZT10aGlzLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nW2xdW2FdfXVuYmluZCgpe3RoaXMubm9kZT1udWxsLHRoaXMuZ2V0VmFsdWU9dGhpcy5fZ2V0VmFsdWVfdW5ib3VuZCx0aGlzLnNldFZhbHVlPXRoaXMuX3NldFZhbHVlX3VuYm91bmR9fWllLkNvbXBvc2l0ZT1FQyxpZS5wcm90b3R5cGUuQmluZGluZ1R5cGU9e0RpcmVjdDowLEVudGlyZUFycmF5OjEsQXJyYXlFbGVtZW50OjIsSGFzRnJvbVRvQXJyYXk6M30saWUucHJvdG90eXBlLlZlcnNpb25pbmc9e05vbmU6MCxOZWVkc1VwZGF0ZToxLE1hdHJpeFdvcmxkTmVlZHNVcGRhdGU6Mn0saWUucHJvdG90eXBlLkdldHRlckJ5QmluZGluZ1R5cGU9W2llLnByb3RvdHlwZS5fZ2V0VmFsdWVfZGlyZWN0LGllLnByb3RvdHlwZS5fZ2V0VmFsdWVfYXJyYXksaWUucHJvdG90eXBlLl9nZXRWYWx1ZV9hcnJheUVsZW1lbnQsaWUucHJvdG90eXBlLl9nZXRWYWx1ZV90b0FycmF5XSxpZS5wcm90b3R5cGUuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc9W1tpZS5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdCxpZS5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZSxpZS5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlXSxbaWUucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheSxpZS5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlLGllLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZV0sW2llLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50LGllLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlLGllLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGVdLFtpZS5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheSxpZS5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheV9zZXROZWVkc1VwZGF0ZSxpZS5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlXV07Y2xhc3MgVEN7Y29uc3RydWN0b3IoKXt0aGlzLmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA9ITAsdGhpcy51dWlkPV9uKCksdGhpcy5fb2JqZWN0cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLHRoaXMubkNhY2hlZE9iamVjdHNfPTA7Y29uc3QgdD17fTt0aGlzLl9pbmRpY2VzQnlVVUlEPXQ7Zm9yKGxldCBuPTAscj1hcmd1bWVudHMubGVuZ3RoO24hPT1yOysrbil0W2FyZ3VtZW50c1tuXS51dWlkXT1uO3RoaXMuX3BhdGhzPVtdLHRoaXMuX3BhcnNlZFBhdGhzPVtdLHRoaXMuX2JpbmRpbmdzPVtdLHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aD17fTtjb25zdCBlPXRoaXM7dGhpcy5zdGF0cz17b2JqZWN0czp7Z2V0IHRvdGFsKCl7cmV0dXJuIGUuX29iamVjdHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdGhpcy50b3RhbC1lLm5DYWNoZWRPYmplY3RzX319LGdldCBiaW5kaW5nc1Blck9iamVjdCgpe3JldHVybiBlLl9iaW5kaW5ncy5sZW5ndGh9fX1hZGQoKXtjb25zdCB0PXRoaXMuX29iamVjdHMsZT10aGlzLl9pbmRpY2VzQnlVVUlELG49dGhpcy5fcGF0aHMscj10aGlzLl9wYXJzZWRQYXRocyxzPXRoaXMuX2JpbmRpbmdzLG89cy5sZW5ndGg7bGV0IGEsbD10Lmxlbmd0aCxjPXRoaXMubkNhY2hlZE9iamVjdHNfO2ZvcihsZXQgdT0wLGg9YXJndW1lbnRzLmxlbmd0aDt1IT09aDsrK3Upe2NvbnN0IGY9YXJndW1lbnRzW3VdLGQ9Zi51dWlkO2xldCBwPWVbZF07aWYocD09PXZvaWQgMCl7cD1sKyssZVtkXT1wLHQucHVzaChmKTtmb3IobGV0IHk9MCxtPW87eSE9PW07Kyt5KXNbeV0ucHVzaChuZXcgaWUoZixuW3ldLHJbeV0pKX1lbHNlIGlmKHA8Yyl7YT10W3BdO2NvbnN0IHk9LS1jLG09dFt5XTtlW20udXVpZF09cCx0W3BdPW0sZVtkXT15LHRbeV09Zjtmb3IobGV0IGc9MCx4PW87ZyE9PXg7KytnKXtjb25zdCB2PXNbZ10sXz12W3ldO2xldCBFPXZbcF07dltwXT1fLEU9PT12b2lkIDAmJihFPW5ldyBpZShmLG5bZ10scltnXSkpLHZbeV09RX19ZWxzZSB0W3BdIT09YSYmY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uT2JqZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCBkZXRlY3RlZC4gQ2xlYW4gdGhlIGNhY2hlcyBvciByZWNyZWF0ZSB5b3VyIGluZnJhc3RydWN0dXJlIHdoZW4gcmVsb2FkaW5nIHNjZW5lcy4iKX10aGlzLm5DYWNoZWRPYmplY3RzXz1jfXJlbW92ZSgpe2NvbnN0IHQ9dGhpcy5fb2JqZWN0cyxlPXRoaXMuX2luZGljZXNCeVVVSUQsbj10aGlzLl9iaW5kaW5ncyxyPW4ubGVuZ3RoO2xldCBzPXRoaXMubkNhY2hlZE9iamVjdHNfO2ZvcihsZXQgbz0wLGE9YXJndW1lbnRzLmxlbmd0aDtvIT09YTsrK28pe2NvbnN0IGw9YXJndW1lbnRzW29dLGM9bC51dWlkLHU9ZVtjXTtpZih1IT09dm9pZCAwJiZ1Pj1zKXtjb25zdCBoPXMrKyxmPXRbaF07ZVtmLnV1aWRdPXUsdFt1XT1mLGVbY109aCx0W2hdPWw7Zm9yKGxldCBkPTAscD1yO2QhPT1wOysrZCl7Y29uc3QgeT1uW2RdLG09eVtoXSxnPXlbdV07eVt1XT1tLHlbaF09Z319fXRoaXMubkNhY2hlZE9iamVjdHNfPXN9dW5jYWNoZSgpe2NvbnN0IHQ9dGhpcy5fb2JqZWN0cyxlPXRoaXMuX2luZGljZXNCeVVVSUQsbj10aGlzLl9iaW5kaW5ncyxyPW4ubGVuZ3RoO2xldCBzPXRoaXMubkNhY2hlZE9iamVjdHNfLG89dC5sZW5ndGg7Zm9yKGxldCBhPTAsbD1hcmd1bWVudHMubGVuZ3RoO2EhPT1sOysrYSl7Y29uc3QgYz1hcmd1bWVudHNbYV0sdT1jLnV1aWQsaD1lW3VdO2lmKGghPT12b2lkIDApaWYoZGVsZXRlIGVbdV0saDxzKXtjb25zdCBmPS0tcyxkPXRbZl0scD0tLW8seT10W3BdO2VbZC51dWlkXT1oLHRbaF09ZCxlW3kudXVpZF09Zix0W2ZdPXksdC5wb3AoKTtmb3IobGV0IG09MCxnPXI7bSE9PWc7KyttKXtjb25zdCB4PW5bbV0sdj14W2ZdLF89eFtwXTt4W2hdPXYseFtmXT1fLHgucG9wKCl9fWVsc2V7Y29uc3QgZj0tLW8sZD10W2ZdO2Y+MCYmKGVbZC51dWlkXT1oKSx0W2hdPWQsdC5wb3AoKTtmb3IobGV0IHA9MCx5PXI7cCE9PXk7KytwKXtjb25zdCBtPW5bcF07bVtoXT1tW2ZdLG0ucG9wKCl9fX10aGlzLm5DYWNoZWRPYmplY3RzXz1zfXN1YnNjcmliZV8odCxlKXtjb25zdCBuPXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aDtsZXQgcj1uW3RdO2NvbnN0IHM9dGhpcy5fYmluZGluZ3M7aWYociE9PXZvaWQgMClyZXR1cm4gc1tyXTtjb25zdCBvPXRoaXMuX3BhdGhzLGE9dGhpcy5fcGFyc2VkUGF0aHMsbD10aGlzLl9vYmplY3RzLGM9bC5sZW5ndGgsdT10aGlzLm5DYWNoZWRPYmplY3RzXyxoPW5ldyBBcnJheShjKTtyPXMubGVuZ3RoLG5bdF09cixvLnB1c2godCksYS5wdXNoKGUpLHMucHVzaChoKTtmb3IobGV0IGY9dSxkPWwubGVuZ3RoO2YhPT1kOysrZil7Y29uc3QgcD1sW2ZdO2hbZl09bmV3IGllKHAsdCxlKX1yZXR1cm4gaH11bnN1YnNjcmliZV8odCl7Y29uc3QgZT10aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsbj1lW3RdO2lmKG4hPT12b2lkIDApe2NvbnN0IHI9dGhpcy5fcGF0aHMscz10aGlzLl9wYXJzZWRQYXRocyxvPXRoaXMuX2JpbmRpbmdzLGE9by5sZW5ndGgtMSxsPW9bYV0sYz10W2FdO2VbY109bixvW25dPWwsby5wb3AoKSxzW25dPXNbYV0scy5wb3AoKSxyW25dPXJbYV0sci5wb3AoKX19fWNsYXNzIHp5e2NvbnN0cnVjdG9yKHQsZSxuPW51bGwscj1lLmJsZW5kTW9kZSl7dGhpcy5fbWl4ZXI9dCx0aGlzLl9jbGlwPWUsdGhpcy5fbG9jYWxSb290PW4sdGhpcy5ibGVuZE1vZGU9cjtjb25zdCBzPWUudHJhY2tzLG89cy5sZW5ndGgsYT1uZXcgQXJyYXkobyksbD17ZW5kaW5nU3RhcnQ6ZHIsZW5kaW5nRW5kOmRyfTtmb3IobGV0IGM9MDtjIT09bzsrK2Mpe2NvbnN0IHU9c1tjXS5jcmVhdGVJbnRlcnBvbGFudChudWxsKTthW2NdPXUsdS5zZXR0aW5ncz1sfXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M9bCx0aGlzLl9pbnRlcnBvbGFudHM9YSx0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzPW5ldyBBcnJheShvKSx0aGlzLl9jYWNoZUluZGV4PW51bGwsdGhpcy5fYnlDbGlwQ2FjaGVJbmRleD1udWxsLHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PW51bGwsdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLmxvb3A9WW0sdGhpcy5fbG9vcENvdW50PS0xLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMudGltZT0wLHRoaXMudGltZVNjYWxlPTEsdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPTEsdGhpcy53ZWlnaHQ9MSx0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9MSx0aGlzLnJlcGV0aXRpb25zPTEvMCx0aGlzLnBhdXNlZD0hMSx0aGlzLmVuYWJsZWQ9ITAsdGhpcy5jbGFtcFdoZW5GaW5pc2hlZD0hMSx0aGlzLnplcm9TbG9wZUF0U3RhcnQ9ITAsdGhpcy56ZXJvU2xvcGVBdEVuZD0hMH1wbGF5KCl7cmV0dXJuIHRoaXMuX21peGVyLl9hY3RpdmF0ZUFjdGlvbih0aGlzKSx0aGlzfXN0b3AoKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2RlYWN0aXZhdGVBY3Rpb24odGhpcyksdGhpcy5yZXNldCgpfXJlc2V0KCl7cmV0dXJuIHRoaXMucGF1c2VkPSExLHRoaXMuZW5hYmxlZD0hMCx0aGlzLnRpbWU9MCx0aGlzLl9sb29wQ291bnQ9LTEsdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKX1pc1J1bm5pbmcoKXtyZXR1cm4gdGhpcy5lbmFibGVkJiYhdGhpcy5wYXVzZWQmJnRoaXMudGltZVNjYWxlIT09MCYmdGhpcy5fc3RhcnRUaW1lPT09bnVsbCYmdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfWlzU2NoZWR1bGVkKCl7cmV0dXJuIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbih0aGlzKX1zdGFydEF0KHQpe3JldHVybiB0aGlzLl9zdGFydFRpbWU9dCx0aGlzfXNldExvb3AodCxlKXtyZXR1cm4gdGhpcy5sb29wPXQsdGhpcy5yZXBldGl0aW9ucz1lLHRoaXN9c2V0RWZmZWN0aXZlV2VpZ2h0KHQpe3JldHVybiB0aGlzLndlaWdodD10LHRoaXMuX2VmZmVjdGl2ZVdlaWdodD10aGlzLmVuYWJsZWQ/dDowLHRoaXMuc3RvcEZhZGluZygpfWdldEVmZmVjdGl2ZVdlaWdodCgpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHR9ZmFkZUluKHQpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyh0LDAsMSl9ZmFkZU91dCh0KXtyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcodCwxLDApfWNyb3NzRmFkZUZyb20odCxlLG4pe2lmKHQuZmFkZU91dChlKSx0aGlzLmZhZGVJbihlKSxuKXtjb25zdCByPXRoaXMuX2NsaXAuZHVyYXRpb24scz10Ll9jbGlwLmR1cmF0aW9uLG89cy9yLGE9ci9zO3Qud2FycCgxLG8sZSksdGhpcy53YXJwKGEsMSxlKX1yZXR1cm4gdGhpc31jcm9zc0ZhZGVUbyh0LGUsbil7cmV0dXJuIHQuY3Jvc3NGYWRlRnJvbSh0aGlzLGUsbil9c3RvcEZhZGluZygpe2NvbnN0IHQ9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7cmV0dXJuIHQhPT1udWxsJiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQodCkpLHRoaXN9c2V0RWZmZWN0aXZlVGltZVNjYWxlKHQpe3JldHVybiB0aGlzLnRpbWVTY2FsZT10LHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT10aGlzLnBhdXNlZD8wOnQsdGhpcy5zdG9wV2FycGluZygpfWdldEVmZmVjdGl2ZVRpbWVTY2FsZSgpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGV9c2V0RHVyYXRpb24odCl7cmV0dXJuIHRoaXMudGltZVNjYWxlPXRoaXMuX2NsaXAuZHVyYXRpb24vdCx0aGlzLnN0b3BXYXJwaW5nKCl9c3luY1dpdGgodCl7cmV0dXJuIHRoaXMudGltZT10LnRpbWUsdGhpcy50aW1lU2NhbGU9dC50aW1lU2NhbGUsdGhpcy5zdG9wV2FycGluZygpfWhhbHQodCl7cmV0dXJuIHRoaXMud2FycCh0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsMCx0KX13YXJwKHQsZSxuKXtjb25zdCByPXRoaXMuX21peGVyLHM9ci50aW1lLG89dGhpcy50aW1lU2NhbGU7bGV0IGE9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7YT09PW51bGwmJihhPXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSx0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD1hKTtjb25zdCBsPWEucGFyYW1ldGVyUG9zaXRpb25zLGM9YS5zYW1wbGVWYWx1ZXM7cmV0dXJuIGxbMF09cyxsWzFdPXMrbixjWzBdPXQvbyxjWzFdPWUvbyx0aGlzfXN0b3BXYXJwaW5nKCl7Y29uc3QgdD10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtyZXR1cm4gdCE9PW51bGwmJih0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD1udWxsLHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCh0KSksdGhpc31nZXRNaXhlcigpe3JldHVybiB0aGlzLl9taXhlcn1nZXRDbGlwKCl7cmV0dXJuIHRoaXMuX2NsaXB9Z2V0Um9vdCgpe3JldHVybiB0aGlzLl9sb2NhbFJvb3R8fHRoaXMuX21peGVyLl9yb290fV91cGRhdGUodCxlLG4scil7aWYoIXRoaXMuZW5hYmxlZCl7dGhpcy5fdXBkYXRlV2VpZ2h0KHQpO3JldHVybn1jb25zdCBzPXRoaXMuX3N0YXJ0VGltZTtpZihzIT09bnVsbCl7Y29uc3QgbD0odC1zKSpuO2w8MHx8bj09PTA/ZT0wOih0aGlzLl9zdGFydFRpbWU9bnVsbCxlPW4qbCl9ZSo9dGhpcy5fdXBkYXRlVGltZVNjYWxlKHQpO2NvbnN0IG89dGhpcy5fdXBkYXRlVGltZShlKSxhPXRoaXMuX3VwZGF0ZVdlaWdodCh0KTtpZihhPjApe2NvbnN0IGw9dGhpcy5faW50ZXJwb2xhbnRzLGM9dGhpcy5fcHJvcGVydHlCaW5kaW5ncztzd2l0Y2godGhpcy5ibGVuZE1vZGUpe2Nhc2UgRWg6Zm9yKGxldCB1PTAsaD1sLmxlbmd0aDt1IT09aDsrK3UpbFt1XS5ldmFsdWF0ZShvKSxjW3VdLmFjY3VtdWxhdGVBZGRpdGl2ZShhKTticmVhaztjYXNlIF9sOmRlZmF1bHQ6Zm9yKGxldCB1PTAsaD1sLmxlbmd0aDt1IT09aDsrK3UpbFt1XS5ldmFsdWF0ZShvKSxjW3VdLmFjY3VtdWxhdGUocixhKX19fV91cGRhdGVXZWlnaHQodCl7bGV0IGU9MDtpZih0aGlzLmVuYWJsZWQpe2U9dGhpcy53ZWlnaHQ7Y29uc3Qgbj10aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtpZihuIT09bnVsbCl7Y29uc3Qgcj1uLmV2YWx1YXRlKHQpWzBdO2UqPXIsdD5uLnBhcmFtZXRlclBvc2l0aW9uc1sxXSYmKHRoaXMuc3RvcEZhZGluZygpLHI9PT0wJiYodGhpcy5lbmFibGVkPSExKSl9fXJldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9ZSxlfV91cGRhdGVUaW1lU2NhbGUodCl7bGV0IGU9MDtpZighdGhpcy5wYXVzZWQpe2U9dGhpcy50aW1lU2NhbGU7Y29uc3Qgbj10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtpZihuIT09bnVsbCl7Y29uc3Qgcj1uLmV2YWx1YXRlKHQpWzBdO2UqPXIsdD5uLnBhcmFtZXRlclBvc2l0aW9uc1sxXSYmKHRoaXMuc3RvcFdhcnBpbmcoKSxlPT09MD90aGlzLnBhdXNlZD0hMDp0aGlzLnRpbWVTY2FsZT1lKX19cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT1lLGV9X3VwZGF0ZVRpbWUodCl7Y29uc3QgZT10aGlzLl9jbGlwLmR1cmF0aW9uLG49dGhpcy5sb29wO2xldCByPXRoaXMudGltZSt0LHM9dGhpcy5fbG9vcENvdW50O2NvbnN0IG89bj09PVptO2lmKHQ9PT0wKXJldHVybiBzPT09LTE/cjpvJiYocyYxKT09PTE/ZS1yOnI7aWYobj09PXFtKXtzPT09LTEmJih0aGlzLl9sb29wQ291bnQ9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLCEwLCExKSk7dDp7aWYocj49ZSlyPWU7ZWxzZSBpZihyPDApcj0wO2Vsc2V7dGhpcy50aW1lPXI7YnJlYWsgdH10aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMSx0aGlzLnRpbWU9cix0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHt0eXBlOiJmaW5pc2hlZCIsYWN0aW9uOnRoaXMsZGlyZWN0aW9uOnQ8MD8tMToxfSl9fWVsc2V7aWYocz09PS0xJiYodD49MD8ocz0wLHRoaXMuX3NldEVuZGluZ3MoITAsdGhpcy5yZXBldGl0aW9ucz09PTAsbykpOnRoaXMuX3NldEVuZGluZ3ModGhpcy5yZXBldGl0aW9ucz09PTAsITAsbykpLHI+PWV8fHI8MCl7Y29uc3QgYT1NYXRoLmZsb29yKHIvZSk7ci09ZSphLHMrPU1hdGguYWJzKGEpO2NvbnN0IGw9dGhpcy5yZXBldGl0aW9ucy1zO2lmKGw8PTApdGhpcy5jbGFtcFdoZW5GaW5pc2hlZD90aGlzLnBhdXNlZD0hMDp0aGlzLmVuYWJsZWQ9ITEscj10PjA/ZTowLHRoaXMudGltZT1yLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImZpbmlzaGVkIixhY3Rpb246dGhpcyxkaXJlY3Rpb246dD4wPzE6LTF9KTtlbHNle2lmKGw9PT0xKXtjb25zdCBjPXQ8MDt0aGlzLl9zZXRFbmRpbmdzKGMsIWMsbyl9ZWxzZSB0aGlzLl9zZXRFbmRpbmdzKCExLCExLG8pO3RoaXMuX2xvb3BDb3VudD1zLHRoaXMudGltZT1yLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6Imxvb3AiLGFjdGlvbjp0aGlzLGxvb3BEZWx0YTphfSl9fWVsc2UgdGhpcy50aW1lPXI7aWYobyYmKHMmMSk9PT0xKXJldHVybiBlLXJ9cmV0dXJuIHJ9X3NldEVuZGluZ3ModCxlLG4pe2NvbnN0IHI9dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncztuPyhyLmVuZGluZ1N0YXJ0PXByLHIuZW5kaW5nRW5kPXByKToodD9yLmVuZGluZ1N0YXJ0PXRoaXMuemVyb1Nsb3BlQXRTdGFydD9wcjpkcjpyLmVuZGluZ1N0YXJ0PVNvLGU/ci5lbmRpbmdFbmQ9dGhpcy56ZXJvU2xvcGVBdEVuZD9wcjpkcjpyLmVuZGluZ0VuZD1Tbyl9X3NjaGVkdWxlRmFkaW5nKHQsZSxuKXtjb25zdCByPXRoaXMuX21peGVyLHM9ci50aW1lO2xldCBvPXRoaXMuX3dlaWdodEludGVycG9sYW50O289PT1udWxsJiYobz1yLl9sZW5kQ29udHJvbEludGVycG9sYW50KCksdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9byk7Y29uc3QgYT1vLnBhcmFtZXRlclBvc2l0aW9ucyxsPW8uc2FtcGxlVmFsdWVzO3JldHVybiBhWzBdPXMsbFswXT1lLGFbMV09cyt0LGxbMV09bix0aGlzfX1jb25zdCBDQz1uZXcgRmxvYXQzMkFycmF5KDEpO2NsYXNzIFJDIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLl9yb290PXQsdGhpcy5faW5pdE1lbW9yeU1hbmFnZXIoKSx0aGlzLl9hY2N1SW5kZXg9MCx0aGlzLnRpbWU9MCx0aGlzLnRpbWVTY2FsZT0xfV9iaW5kQWN0aW9uKHQsZSl7Y29uc3Qgbj10Ll9sb2NhbFJvb3R8fHRoaXMuX3Jvb3Qscj10Ll9jbGlwLnRyYWNrcyxzPXIubGVuZ3RoLG89dC5fcHJvcGVydHlCaW5kaW5ncyxhPXQuX2ludGVycG9sYW50cyxsPW4udXVpZCxjPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZTtsZXQgdT1jW2xdO3U9PT12b2lkIDAmJih1PXt9LGNbbF09dSk7Zm9yKGxldCBoPTA7aCE9PXM7KytoKXtjb25zdCBmPXJbaF0sZD1mLm5hbWU7bGV0IHA9dVtkXTtpZihwIT09dm9pZCAwKSsrcC5yZWZlcmVuY2VDb3VudCxvW2hdPXA7ZWxzZXtpZihwPW9baF0scCE9PXZvaWQgMCl7cC5fY2FjaGVJbmRleD09PW51bGwmJigrK3AucmVmZXJlbmNlQ291bnQsdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKHAsbCxkKSk7Y29udGludWV9Y29uc3QgeT1lJiZlLl9wcm9wZXJ0eUJpbmRpbmdzW2hdLmJpbmRpbmcucGFyc2VkUGF0aDtwPW5ldyBCeShpZS5jcmVhdGUobixkLHkpLGYuVmFsdWVUeXBlTmFtZSxmLmdldFZhbHVlU2l6ZSgpKSwrK3AucmVmZXJlbmNlQ291bnQsdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKHAsbCxkKSxvW2hdPXB9YVtoXS5yZXN1bHRCdWZmZXI9cC5idWZmZXJ9fV9hY3RpdmF0ZUFjdGlvbih0KXtpZighdGhpcy5faXNBY3RpdmVBY3Rpb24odCkpe2lmKHQuX2NhY2hlSW5kZXg9PT1udWxsKXtjb25zdCBuPSh0Ll9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QpLnV1aWQscj10Ll9jbGlwLnV1aWQscz10aGlzLl9hY3Rpb25zQnlDbGlwW3JdO3RoaXMuX2JpbmRBY3Rpb24odCxzJiZzLmtub3duQWN0aW9uc1swXSksdGhpcy5fYWRkSW5hY3RpdmVBY3Rpb24odCxyLG4pfWNvbnN0IGU9dC5fcHJvcGVydHlCaW5kaW5ncztmb3IobGV0IG49MCxyPWUubGVuZ3RoO24hPT1yOysrbil7Y29uc3Qgcz1lW25dO3MudXNlQ291bnQrKz09PTAmJih0aGlzLl9sZW5kQmluZGluZyhzKSxzLnNhdmVPcmlnaW5hbFN0YXRlKCkpfXRoaXMuX2xlbmRBY3Rpb24odCl9fV9kZWFjdGl2YXRlQWN0aW9uKHQpe2lmKHRoaXMuX2lzQWN0aXZlQWN0aW9uKHQpKXtjb25zdCBlPXQuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuIT09cjsrK24pe2NvbnN0IHM9ZVtuXTstLXMudXNlQ291bnQ9PT0wJiYocy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpLHRoaXMuX3Rha2VCYWNrQmluZGluZyhzKSl9dGhpcy5fdGFrZUJhY2tBY3Rpb24odCl9fV9pbml0TWVtb3J5TWFuYWdlcigpe3RoaXMuX2FjdGlvbnM9W10sdGhpcy5fbkFjdGl2ZUFjdGlvbnM9MCx0aGlzLl9hY3Rpb25zQnlDbGlwPXt9LHRoaXMuX2JpbmRpbmdzPVtdLHRoaXMuX25BY3RpdmVCaW5kaW5ncz0wLHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZT17fSx0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzPVtdLHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzPTA7Y29uc3QgdD10aGlzO3RoaXMuc3RhdHM9e2FjdGlvbnM6e2dldCB0b3RhbCgpe3JldHVybiB0Ll9hY3Rpb25zLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIHQuX25BY3RpdmVBY3Rpb25zfX0sYmluZGluZ3M6e2dldCB0b3RhbCgpe3JldHVybiB0Ll9iaW5kaW5ncy5sZW5ndGh9LGdldCBpblVzZSgpe3JldHVybiB0Ll9uQWN0aXZlQmluZGluZ3N9fSxjb250cm9sSW50ZXJwb2xhbnRzOntnZXQgdG90YWwoKXtyZXR1cm4gdC5fY29udHJvbEludGVycG9sYW50cy5sZW5ndGh9LGdldCBpblVzZSgpe3JldHVybiB0Ll9uQWN0aXZlQ29udHJvbEludGVycG9sYW50c319fX1faXNBY3RpdmVBY3Rpb24odCl7Y29uc3QgZT10Ll9jYWNoZUluZGV4O3JldHVybiBlIT09bnVsbCYmZTx0aGlzLl9uQWN0aXZlQWN0aW9uc31fYWRkSW5hY3RpdmVBY3Rpb24odCxlLG4pe2NvbnN0IHI9dGhpcy5fYWN0aW9ucyxzPXRoaXMuX2FjdGlvbnNCeUNsaXA7bGV0IG89c1tlXTtpZihvPT09dm9pZCAwKW89e2tub3duQWN0aW9uczpbdF0sYWN0aW9uQnlSb290Ont9fSx0Ll9ieUNsaXBDYWNoZUluZGV4PTAsc1tlXT1vO2Vsc2V7Y29uc3QgYT1vLmtub3duQWN0aW9uczt0Ll9ieUNsaXBDYWNoZUluZGV4PWEubGVuZ3RoLGEucHVzaCh0KX10Ll9jYWNoZUluZGV4PXIubGVuZ3RoLHIucHVzaCh0KSxvLmFjdGlvbkJ5Um9vdFtuXT10fV9yZW1vdmVJbmFjdGl2ZUFjdGlvbih0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj1lW2UubGVuZ3RoLTFdLHI9dC5fY2FjaGVJbmRleDtuLl9jYWNoZUluZGV4PXIsZVtyXT1uLGUucG9wKCksdC5fY2FjaGVJbmRleD1udWxsO2NvbnN0IHM9dC5fY2xpcC51dWlkLG89dGhpcy5fYWN0aW9uc0J5Q2xpcCxhPW9bc10sbD1hLmtub3duQWN0aW9ucyxjPWxbbC5sZW5ndGgtMV0sdT10Ll9ieUNsaXBDYWNoZUluZGV4O2MuX2J5Q2xpcENhY2hlSW5kZXg9dSxsW3VdPWMsbC5wb3AoKSx0Ll9ieUNsaXBDYWNoZUluZGV4PW51bGw7Y29uc3QgaD1hLmFjdGlvbkJ5Um9vdCxmPSh0Ll9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QpLnV1aWQ7ZGVsZXRlIGhbZl0sbC5sZW5ndGg9PT0wJiZkZWxldGUgb1tzXSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHQpfV9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHQpe2NvbnN0IGU9dC5fcHJvcGVydHlCaW5kaW5ncztmb3IobGV0IG49MCxyPWUubGVuZ3RoO24hPT1yOysrbil7Y29uc3Qgcz1lW25dOy0tcy5yZWZlcmVuY2VDb3VudD09PTAmJnRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyhzKX19X2xlbmRBY3Rpb24odCl7Y29uc3QgZT10aGlzLl9hY3Rpb25zLG49dC5fY2FjaGVJbmRleCxyPXRoaXMuX25BY3RpdmVBY3Rpb25zKysscz1lW3JdO3QuX2NhY2hlSW5kZXg9cixlW3JdPXQscy5fY2FjaGVJbmRleD1uLGVbbl09c31fdGFrZUJhY2tBY3Rpb24odCl7Y29uc3QgZT10aGlzLl9hY3Rpb25zLG49dC5fY2FjaGVJbmRleCxyPS0tdGhpcy5fbkFjdGl2ZUFjdGlvbnMscz1lW3JdO3QuX2NhY2hlSW5kZXg9cixlW3JdPXQscy5fY2FjaGVJbmRleD1uLGVbbl09c31fYWRkSW5hY3RpdmVCaW5kaW5nKHQsZSxuKXtjb25zdCByPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxzPXRoaXMuX2JpbmRpbmdzO2xldCBvPXJbZV07bz09PXZvaWQgMCYmKG89e30scltlXT1vKSxvW25dPXQsdC5fY2FjaGVJbmRleD1zLmxlbmd0aCxzLnB1c2godCl9X3JlbW92ZUluYWN0aXZlQmluZGluZyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzLG49dC5iaW5kaW5nLHI9bi5yb290Tm9kZS51dWlkLHM9bi5wYXRoLG89dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLGE9b1tyXSxsPWVbZS5sZW5ndGgtMV0sYz10Ll9jYWNoZUluZGV4O2wuX2NhY2hlSW5kZXg9YyxlW2NdPWwsZS5wb3AoKSxkZWxldGUgYVtzXSxPYmplY3Qua2V5cyhhKS5sZW5ndGg9PT0wJiZkZWxldGUgb1tyXX1fbGVuZEJpbmRpbmcodCl7Y29uc3QgZT10aGlzLl9iaW5kaW5ncyxuPXQuX2NhY2hlSW5kZXgscj10aGlzLl9uQWN0aXZlQmluZGluZ3MrKyxzPWVbcl07dC5fY2FjaGVJbmRleD1yLGVbcl09dCxzLl9jYWNoZUluZGV4PW4sZVtuXT1zfV90YWtlQmFja0JpbmRpbmcodCl7Y29uc3QgZT10aGlzLl9iaW5kaW5ncyxuPXQuX2NhY2hlSW5kZXgscj0tLXRoaXMuX25BY3RpdmVCaW5kaW5ncyxzPWVbcl07dC5fY2FjaGVJbmRleD1yLGVbcl09dCxzLl9jYWNoZUluZGV4PW4sZVtuXT1zfV9sZW5kQ29udHJvbEludGVycG9sYW50KCl7Y29uc3QgdD10aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLGU9dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMrKztsZXQgbj10W2VdO3JldHVybiBuPT09dm9pZCAwJiYobj1uZXcgemYobmV3IEZsb2F0MzJBcnJheSgyKSxuZXcgRmxvYXQzMkFycmF5KDIpLDEsQ0MpLG4uX19jYWNoZUluZGV4PWUsdFtlXT1uKSxufV90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCh0KXtjb25zdCBlPXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsbj10Ll9fY2FjaGVJbmRleCxyPS0tdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMscz1lW3JdO3QuX19jYWNoZUluZGV4PXIsZVtyXT10LHMuX19jYWNoZUluZGV4PW4sZVtuXT1zfWNsaXBBY3Rpb24odCxlLG4pe2NvbnN0IHI9ZXx8dGhpcy5fcm9vdCxzPXIudXVpZDtsZXQgbz10eXBlb2YgdD09InN0cmluZyI/b2EuZmluZEJ5TmFtZShyLHQpOnQ7Y29uc3QgYT1vIT09bnVsbD9vLnV1aWQ6dCxsPXRoaXMuX2FjdGlvbnNCeUNsaXBbYV07bGV0IGM9bnVsbDtpZihuPT09dm9pZCAwJiYobyE9PW51bGw/bj1vLmJsZW5kTW9kZTpuPV9sKSxsIT09dm9pZCAwKXtjb25zdCBoPWwuYWN0aW9uQnlSb290W3NdO2lmKGghPT12b2lkIDAmJmguYmxlbmRNb2RlPT09bilyZXR1cm4gaDtjPWwua25vd25BY3Rpb25zWzBdLG89PT1udWxsJiYobz1jLl9jbGlwKX1pZihvPT09bnVsbClyZXR1cm4gbnVsbDtjb25zdCB1PW5ldyB6eSh0aGlzLG8sZSxuKTtyZXR1cm4gdGhpcy5fYmluZEFjdGlvbih1LGMpLHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKHUsYSxzKSx1fWV4aXN0aW5nQWN0aW9uKHQsZSl7Y29uc3Qgbj1lfHx0aGlzLl9yb290LHI9bi51dWlkLHM9dHlwZW9mIHQ9PSJzdHJpbmciP29hLmZpbmRCeU5hbWUobix0KTp0LG89cz9zLnV1aWQ6dCxhPXRoaXMuX2FjdGlvbnNCeUNsaXBbb107cmV0dXJuIGEhPT12b2lkIDAmJmEuYWN0aW9uQnlSb290W3JdfHxudWxsfXN0b3BBbGxBY3Rpb24oKXtjb25zdCB0PXRoaXMuX2FjdGlvbnMsZT10aGlzLl9uQWN0aXZlQWN0aW9ucztmb3IobGV0IG49ZS0xO24+PTA7LS1uKXRbbl0uc3RvcCgpO3JldHVybiB0aGlzfXVwZGF0ZSh0KXt0Kj10aGlzLnRpbWVTY2FsZTtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10aGlzLl9uQWN0aXZlQWN0aW9ucyxyPXRoaXMudGltZSs9dCxzPU1hdGguc2lnbih0KSxvPXRoaXMuX2FjY3VJbmRleF49MTtmb3IobGV0IGM9MDtjIT09bjsrK2MpZVtjXS5fdXBkYXRlKHIsdCxzLG8pO2NvbnN0IGE9dGhpcy5fYmluZGluZ3MsbD10aGlzLl9uQWN0aXZlQmluZGluZ3M7Zm9yKGxldCBjPTA7YyE9PWw7KytjKWFbY10uYXBwbHkobyk7cmV0dXJuIHRoaXN9c2V0VGltZSh0KXt0aGlzLnRpbWU9MDtmb3IobGV0IGU9MDtlPHRoaXMuX2FjdGlvbnMubGVuZ3RoO2UrKyl0aGlzLl9hY3Rpb25zW2VdLnRpbWU9MDtyZXR1cm4gdGhpcy51cGRhdGUodCl9Z2V0Um9vdCgpe3JldHVybiB0aGlzLl9yb290fXVuY2FjaGVDbGlwKHQpe2NvbnN0IGU9dGhpcy5fYWN0aW9ucyxuPXQudXVpZCxyPXRoaXMuX2FjdGlvbnNCeUNsaXAscz1yW25dO2lmKHMhPT12b2lkIDApe2NvbnN0IG89cy5rbm93bkFjdGlvbnM7Zm9yKGxldCBhPTAsbD1vLmxlbmd0aDthIT09bDsrK2Epe2NvbnN0IGM9b1thXTt0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGMpO2NvbnN0IHU9Yy5fY2FjaGVJbmRleCxoPWVbZS5sZW5ndGgtMV07Yy5fY2FjaGVJbmRleD1udWxsLGMuX2J5Q2xpcENhY2hlSW5kZXg9bnVsbCxoLl9jYWNoZUluZGV4PXUsZVt1XT1oLGUucG9wKCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbihjKX1kZWxldGUgcltuXX19dW5jYWNoZVJvb3QodCl7Y29uc3QgZT10LnV1aWQsbj10aGlzLl9hY3Rpb25zQnlDbGlwO2Zvcihjb25zdCBvIGluIG4pe2NvbnN0IGE9bltvXS5hY3Rpb25CeVJvb3QsbD1hW2VdO2whPT12b2lkIDAmJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGwpLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKGwpKX1jb25zdCByPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxzPXJbZV07aWYocyE9PXZvaWQgMClmb3IoY29uc3QgbyBpbiBzKXtjb25zdCBhPXNbb107YS5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpLHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyhhKX19dW5jYWNoZUFjdGlvbih0LGUpe2NvbnN0IG49dGhpcy5leGlzdGluZ0FjdGlvbih0LGUpO24hPT1udWxsJiYodGhpcy5fZGVhY3RpdmF0ZUFjdGlvbihuKSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbihuKSl9fWNsYXNzIFpme2NvbnN0cnVjdG9yKHQpe3RoaXMudmFsdWU9dH1jbG9uZSgpe3JldHVybiBuZXcgWmYodGhpcy52YWx1ZS5jbG9uZT09PXZvaWQgMD90aGlzLnZhbHVlOnRoaXMudmFsdWUuY2xvbmUoKSl9fWxldCBQQz0wO2NsYXNzIElDIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNVbmlmb3Jtc0dyb3VwPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOlBDKyt9KSx0aGlzLm5hbWU9IiIsdGhpcy51c2FnZT1Ubyx0aGlzLnVuaWZvcm1zPVtdfWFkZCh0KXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5wdXNoKHQpLHRoaXN9cmVtb3ZlKHQpe2NvbnN0IGU9dGhpcy51bmlmb3Jtcy5pbmRleE9mKHQpO3JldHVybiBlIT09LTEmJnRoaXMudW5pZm9ybXMuc3BsaWNlKGUsMSksdGhpc31zZXROYW1lKHQpe3JldHVybiB0aGlzLm5hbWU9dCx0aGlzfXNldFVzYWdlKHQpe3JldHVybiB0aGlzLnVzYWdlPXQsdGhpc31kaXNwb3NlKCl7cmV0dXJuIHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KSx0aGlzfWNvcHkodCl7dGhpcy5uYW1lPXQubmFtZSx0aGlzLnVzYWdlPXQudXNhZ2U7Y29uc3QgZT10LnVuaWZvcm1zO3RoaXMudW5pZm9ybXMubGVuZ3RoPTA7Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXtjb25zdCBzPUFycmF5LmlzQXJyYXkoZVtuXSk/ZVtuXTpbZVtuXV07Zm9yKGxldCBvPTA7bzxzLmxlbmd0aDtvKyspdGhpcy51bmlmb3Jtcy5wdXNoKHNbb10uY2xvbmUoKSl9cmV0dXJuIHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jbGFzcyBMQyBleHRlbmRzIEpse2NvbnN0cnVjdG9yKHQsZSxuPTEpe3N1cGVyKHQsZSksdGhpcy5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPSEwLHRoaXMubWVzaFBlckF0dHJpYnV0ZT1ufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5tZXNoUGVyQXR0cmlidXRlPXQubWVzaFBlckF0dHJpYnV0ZSx0aGlzfWNsb25lKHQpe2NvbnN0IGU9c3VwZXIuY2xvbmUodCk7cmV0dXJuIGUubWVzaFBlckF0dHJpYnV0ZT10aGlzLm1lc2hQZXJBdHRyaWJ1dGUsZX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj0hMCxlLm1lc2hQZXJBdHRyaWJ1dGU9dGhpcy5tZXNoUGVyQXR0cmlidXRlLGV9fWNsYXNzIERDe2NvbnN0cnVjdG9yKHQsZSxuLHIscyl7dGhpcy5pc0dMQnVmZmVyQXR0cmlidXRlPSEwLHRoaXMubmFtZT0iIix0aGlzLmJ1ZmZlcj10LHRoaXMudHlwZT1lLHRoaXMuaXRlbVNpemU9bix0aGlzLmVsZW1lbnRTaXplPXIsdGhpcy5jb3VudD1zLHRoaXMudmVyc2lvbj0wfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfXNldEJ1ZmZlcih0KXtyZXR1cm4gdGhpcy5idWZmZXI9dCx0aGlzfXNldFR5cGUodCxlKXtyZXR1cm4gdGhpcy50eXBlPXQsdGhpcy5lbGVtZW50U2l6ZT1lLHRoaXN9c2V0SXRlbVNpemUodCl7cmV0dXJuIHRoaXMuaXRlbVNpemU9dCx0aGlzfXNldENvdW50KHQpe3JldHVybiB0aGlzLmNvdW50PXQsdGhpc319Y29uc3Qga3k9bmV3IEx0O2NsYXNzIFVDe2NvbnN0cnVjdG9yKHQsZSxuPTAscj0xLzApe3RoaXMucmF5PW5ldyB1cyh0LGUpLHRoaXMubmVhcj1uLHRoaXMuZmFyPXIsdGhpcy5jYW1lcmE9bnVsbCx0aGlzLmxheWVycz1uZXcgQ2wsdGhpcy5wYXJhbXM9e01lc2g6e30sTGluZTp7dGhyZXNob2xkOjF9LExPRDp7fSxQb2ludHM6e3RocmVzaG9sZDoxfSxTcHJpdGU6e319fXNldCh0LGUpe3RoaXMucmF5LnNldCh0LGUpfXNldEZyb21DYW1lcmEodCxlKXtlLmlzUGVyc3BlY3RpdmVDYW1lcmE/KHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCh0LngsdC55LC41KS51bnByb2plY3QoZSkuc3ViKHRoaXMucmF5Lm9yaWdpbikubm9ybWFsaXplKCksdGhpcy5jYW1lcmE9ZSk6ZS5pc09ydGhvZ3JhcGhpY0NhbWVyYT8odGhpcy5yYXkub3JpZ2luLnNldCh0LngsdC55LChlLm5lYXIrZS5mYXIpLyhlLm5lYXItZS5mYXIpKS51bnByb2plY3QoZSksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCgwLDAsLTEpLnRyYW5zZm9ybURpcmVjdGlvbihlLm1hdHJpeFdvcmxkKSx0aGlzLmNhbWVyYT1lKTpjb25zb2xlLmVycm9yKCJUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlOiAiK2UudHlwZSl9c2V0RnJvbVhSQ29udHJvbGxlcih0KXtyZXR1cm4ga3kuaWRlbnRpdHkoKS5leHRyYWN0Um90YXRpb24odC5tYXRyaXhXb3JsZCksdGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSx0aGlzLnJheS5kaXJlY3Rpb24uc2V0KDAsMCwtMSkuYXBwbHlNYXRyaXg0KGt5KSx0aGlzfWludGVyc2VjdE9iamVjdCh0LGU9ITAsbj1bXSl7cmV0dXJuIEpmKHQsdGhpcyxuLGUpLG4uc29ydChHeSksbn1pbnRlcnNlY3RPYmplY3RzKHQsZT0hMCxuPVtdKXtmb3IobGV0IHI9MCxzPXQubGVuZ3RoO3I8cztyKyspSmYodFtyXSx0aGlzLG4sZSk7cmV0dXJuIG4uc29ydChHeSksbn19ZnVuY3Rpb24gR3koaSx0KXtyZXR1cm4gaS5kaXN0YW5jZS10LmRpc3RhbmNlfWZ1bmN0aW9uIEpmKGksdCxlLG4pe2xldCByPSEwO2lmKGkubGF5ZXJzLnRlc3QodC5sYXllcnMpJiZpLnJheWNhc3QodCxlKT09PSExJiYocj0hMSkscj09PSEwJiZuPT09ITApe2NvbnN0IHM9aS5jaGlsZHJlbjtmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YTtvKyspSmYoc1tvXSx0LGUsITApfX1jbGFzcyBOQ3tjb25zdHJ1Y3Rvcih0PTEsZT0wLG49MCl7cmV0dXJuIHRoaXMucmFkaXVzPXQsdGhpcy5waGk9ZSx0aGlzLnRoZXRhPW4sdGhpc31zZXQodCxlLG4pe3JldHVybiB0aGlzLnJhZGl1cz10LHRoaXMucGhpPWUsdGhpcy50aGV0YT1uLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpcy5waGk9dC5waGksdGhpcy50aGV0YT10LnRoZXRhLHRoaXN9bWFrZVNhZmUoKXtyZXR1cm4gdGhpcy5waGk9TWF0aC5tYXgoMWUtNixNYXRoLm1pbihNYXRoLlBJLTFlLTYsdGhpcy5waGkpKSx0aGlzfXNldEZyb21WZWN0b3IzKHQpe3JldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHModC54LHQueSx0LnopfXNldEZyb21DYXJ0ZXNpYW5Db29yZHModCxlLG4pe3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQodCp0K2UqZStuKm4pLHRoaXMucmFkaXVzPT09MD8odGhpcy50aGV0YT0wLHRoaXMucGhpPTApOih0aGlzLnRoZXRhPU1hdGguYXRhbjIodCxuKSx0aGlzLnBoaT1NYXRoLmFjb3MoeGUoZS90aGlzLnJhZGl1cywtMSwxKSkpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jbGFzcyBGQ3tjb25zdHJ1Y3Rvcih0PTEsZT0wLG49MCl7cmV0dXJuIHRoaXMucmFkaXVzPXQsdGhpcy50aGV0YT1lLHRoaXMueT1uLHRoaXN9c2V0KHQsZSxuKXtyZXR1cm4gdGhpcy5yYWRpdXM9dCx0aGlzLnRoZXRhPWUsdGhpcy55PW4sdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzLnRoZXRhPXQudGhldGEsdGhpcy55PXQueSx0aGlzfXNldEZyb21WZWN0b3IzKHQpe3JldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHModC54LHQueSx0LnopfXNldEZyb21DYXJ0ZXNpYW5Db29yZHModCxlLG4pe3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQodCp0K24qbiksdGhpcy50aGV0YT1NYXRoLmF0YW4yKHQsbiksdGhpcy55PWUsdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNsYXNzIEtme2NvbnN0cnVjdG9yKHQsZSxuLHIpe0tmLnByb3RvdHlwZS5pc01hdHJpeDI9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMV0sdCE9PXZvaWQgMCYmdGhpcy5zZXQodCxlLG4scil9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMSksdGhpc31mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgbj0wO248NDtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9c2V0KHQsZSxuLHIpe2NvbnN0IHM9dGhpcy5lbGVtZW50cztyZXR1cm4gc1swXT10LHNbMl09ZSxzWzFdPW4sc1szXT1yLHRoaXN9fWNvbnN0IFZ5PW5ldyBxO2NsYXNzIE9De2NvbnN0cnVjdG9yKHQ9bmV3IHEoMS8wLDEvMCksZT1uZXcgcSgtMS8wLC0xLzApKXt0aGlzLmlzQm94Mj0hMCx0aGlzLm1pbj10LHRoaXMubWF4PWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzfXNldEZyb21Qb2ludHModCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5leHBhbmRCeVBvaW50KHRbZV0pO3JldHVybiB0aGlzfXNldEZyb21DZW50ZXJBbmRTaXplKHQsZSl7Y29uc3Qgbj1WeS5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKC41KTtyZXR1cm4gdGhpcy5taW4uY29weSh0KS5zdWIobiksdGhpcy5tYXguY29weSh0KS5hZGQobiksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PTEvMCx0aGlzLm1heC54PXRoaXMubWF4Lnk9LTEvMCx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5tYXgueDx0aGlzLm1pbi54fHx0aGlzLm1heC55PHRoaXMubWluLnl9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDApOnQuYWRkVmVjdG9ycyh0aGlzLm1pbix0aGlzLm1heCkubXVsdGlwbHlTY2FsYXIoLjUpfWdldFNpemUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCk6dC5zdWJWZWN0b3JzKHRoaXMubWF4LHRoaXMubWluKX1leHBhbmRCeVBvaW50KHQpe3JldHVybiB0aGlzLm1pbi5taW4odCksdGhpcy5tYXgubWF4KHQpLHRoaXN9ZXhwYW5kQnlWZWN0b3IodCl7cmV0dXJuIHRoaXMubWluLnN1Yih0KSx0aGlzLm1heC5hZGQodCksdGhpc31leHBhbmRCeVNjYWxhcih0KXtyZXR1cm4gdGhpcy5taW4uYWRkU2NhbGFyKC10KSx0aGlzLm1heC5hZGRTY2FsYXIodCksdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiB0Lng+PXRoaXMubWluLngmJnQueDw9dGhpcy5tYXgueCYmdC55Pj10aGlzLm1pbi55JiZ0Lnk8PXRoaXMubWF4Lnl9Y29udGFpbnNCb3godCl7cmV0dXJuIHRoaXMubWluLng8PXQubWluLngmJnQubWF4Lng8PXRoaXMubWF4LngmJnRoaXMubWluLnk8PXQubWluLnkmJnQubWF4Lnk8PXRoaXMubWF4Lnl9Z2V0UGFyYW1ldGVyKHQsZSl7cmV0dXJuIGUuc2V0KCh0LngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKHQueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5tYXgueD49dGhpcy5taW4ueCYmdC5taW4ueDw9dGhpcy5tYXgueCYmdC5tYXgueT49dGhpcy5taW4ueSYmdC5taW4ueTw9dGhpcy5tYXgueX1jbGFtcFBvaW50KHQsZSl7cmV0dXJuIGUuY29weSh0KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodCxWeSkuZGlzdGFuY2VUbyh0KX1pbnRlcnNlY3QodCl7cmV0dXJuIHRoaXMubWluLm1heCh0Lm1pbiksdGhpcy5tYXgubWluKHQubWF4KSx0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKSx0aGlzfXVuaW9uKHQpe3JldHVybiB0aGlzLm1pbi5taW4odC5taW4pLHRoaXMubWF4Lm1heCh0Lm1heCksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMubWluLmFkZCh0KSx0aGlzLm1heC5hZGQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubWluLmVxdWFscyh0aGlzLm1pbikmJnQubWF4LmVxdWFscyh0aGlzLm1heCl9fWNvbnN0IEh5PW5ldyBMLE5jPW5ldyBMO2NsYXNzIEJDe2NvbnN0cnVjdG9yKHQ9bmV3IEwsZT1uZXcgTCl7dGhpcy5zdGFydD10LHRoaXMuZW5kPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuc3RhcnQuY29weSh0KSx0aGlzLmVuZC5jb3B5KGUpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5zdGFydC5jb3B5KHQuc3RhcnQpLHRoaXMuZW5kLmNvcHkodC5lbmQpLHRoaXN9Z2V0Q2VudGVyKHQpe3JldHVybiB0LmFkZFZlY3RvcnModGhpcy5zdGFydCx0aGlzLmVuZCkubXVsdGlwbHlTY2FsYXIoLjUpfWRlbHRhKHQpe3JldHVybiB0LnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCl9ZGlzdGFuY2VTcSgpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuZW5kKX1kaXN0YW5jZSgpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8odGhpcy5lbmQpfWF0KHQsZSl7cmV0dXJuIHRoaXMuZGVsdGEoZSkubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMuc3RhcnQpfWNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIodCxlKXtIeS5zdWJWZWN0b3JzKHQsdGhpcy5zdGFydCksTmMuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KTtjb25zdCBuPU5jLmRvdChOYyk7bGV0IHM9TmMuZG90KEh5KS9uO3JldHVybiBlJiYocz14ZShzLDAsMSkpLHN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUsbil7Y29uc3Qgcj10aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIodCxlKTtyZXR1cm4gdGhpcy5kZWx0YShuKS5tdWx0aXBseVNjYWxhcihyKS5hZGQodGhpcy5zdGFydCl9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NCh0KSx0aGlzLmVuZC5hcHBseU1hdHJpeDQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQuc3RhcnQuZXF1YWxzKHRoaXMuc3RhcnQpJiZ0LmVuZC5lcXVhbHModGhpcy5lbmQpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y29uc3QgV3k9bmV3IEw7Y2xhc3MgekMgZXh0ZW5kcyBuZXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5saWdodD10LHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmNvbG9yPWUsdGhpcy50eXBlPSJTcG90TGlnaHRIZWxwZXIiO2NvbnN0IG49bmV3IE50LHI9WzAsMCwwLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLC0xLDAsMSwwLDAsMCwwLDEsMSwwLDAsMCwwLC0xLDFdO2ZvcihsZXQgbz0wLGE9MSxsPTMyO288bDtvKyssYSsrKXtjb25zdCBjPW8vbCpNYXRoLlBJKjIsdT1hL2wqTWF0aC5QSSoyO3IucHVzaChNYXRoLmNvcyhjKSxNYXRoLnNpbihjKSwxLE1hdGguY29zKHUpLE1hdGguc2luKHUpLDEpfW4uc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFN0KHIsMykpO2NvbnN0IHM9bmV3IG5uKHtmb2c6ITEsdG9uZU1hcHBlZDohMX0pO3RoaXMuY29uZT1uZXcgaWkobixzKSx0aGlzLmFkZCh0aGlzLmNvbmUpLHRoaXMudXBkYXRlKCl9ZGlzcG9zZSgpe3RoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKX11cGRhdGUoKXt0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLmxpZ2h0LnRhcmdldC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5wYXJlbnQ/KHRoaXMucGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCEwKSx0aGlzLm1hdHJpeC5jb3B5KHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKS5tdWx0aXBseSh0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKSk6dGhpcy5tYXRyaXguY29weSh0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKSx0aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5saWdodC5tYXRyaXhXb3JsZCk7Y29uc3QgdD10aGlzLmxpZ2h0LmRpc3RhbmNlP3RoaXMubGlnaHQuZGlzdGFuY2U6MWUzLGU9dCpNYXRoLnRhbih0aGlzLmxpZ2h0LmFuZ2xlKTt0aGlzLmNvbmUuc2NhbGUuc2V0KGUsZSx0KSxXeS5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQpLHRoaXMuY29uZS5sb29rQXQoV3kpLHRoaXMuY29sb3IhPT12b2lkIDA/dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTp0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKX19Y29uc3QgUWk9bmV3IEwsRmM9bmV3IEx0LGpmPW5ldyBMdDtjbGFzcyBrQyBleHRlbmRzIGlpe2NvbnN0cnVjdG9yKHQpe2NvbnN0IGU9JHkodCksbj1uZXcgTnQscj1bXSxzPVtdLG89bmV3IHZ0KDAsMCwxKSxhPW5ldyB2dCgwLDEsMCk7Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDtjKyspe2NvbnN0IHU9ZVtjXTt1LnBhcmVudCYmdS5wYXJlbnQuaXNCb25lJiYoci5wdXNoKDAsMCwwKSxyLnB1c2goMCwwLDApLHMucHVzaChvLnIsby5nLG8uYikscy5wdXNoKGEucixhLmcsYS5iKSl9bi5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU3QociwzKSksbi5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgU3QocywzKSk7Y29uc3QgbD1uZXcgbm4oe3ZlcnRleENvbG9yczohMCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSx0b25lTWFwcGVkOiExLHRyYW5zcGFyZW50OiEwfSk7c3VwZXIobixsKSx0aGlzLmlzU2tlbGV0b25IZWxwZXI9ITAsdGhpcy50eXBlPSJTa2VsZXRvbkhlbHBlciIsdGhpcy5yb290PXQsdGhpcy5ib25lcz1lLHRoaXMubWF0cml4PXQubWF0cml4V29ybGQsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe2NvbnN0IGU9dGhpcy5ib25lcyxuPXRoaXMuZ2VvbWV0cnkscj1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtqZi5jb3B5KHRoaXMucm9vdC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk7Zm9yKGxldCBzPTAsbz0wO3M8ZS5sZW5ndGg7cysrKXtjb25zdCBhPWVbc107YS5wYXJlbnQmJmEucGFyZW50LmlzQm9uZSYmKEZjLm11bHRpcGx5TWF0cmljZXMoamYsYS5tYXRyaXhXb3JsZCksUWkuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKEZjKSxyLnNldFhZWihvLFFpLngsUWkueSxRaS56KSxGYy5tdWx0aXBseU1hdHJpY2VzKGpmLGEucGFyZW50Lm1hdHJpeFdvcmxkKSxRaS5zZXRGcm9tTWF0cml4UG9zaXRpb24oRmMpLHIuc2V0WFlaKG8rMSxRaS54LFFpLnksUWkueiksbys9Mil9bi5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikubmVlZHNVcGRhdGU9ITAsc3VwZXIudXBkYXRlTWF0cml4V29ybGQodCl9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfX1mdW5jdGlvbiAkeShpKXtjb25zdCB0PVtdO2kuaXNCb25lPT09ITAmJnQucHVzaChpKTtmb3IobGV0IGU9MDtlPGkuY2hpbGRyZW4ubGVuZ3RoO2UrKyl0LnB1c2guYXBwbHkodCwkeShpLmNoaWxkcmVuW2VdKSk7cmV0dXJuIHR9Y2xhc3MgR0MgZXh0ZW5kcyBJZXtjb25zdHJ1Y3Rvcih0LGUsbil7Y29uc3Qgcj1uZXcgZWEoZSw0LDIpLHM9bmV3IFhpKHt3aXJlZnJhbWU6ITAsZm9nOiExLHRvbmVNYXBwZWQ6ITF9KTtzdXBlcihyLHMpLHRoaXMubGlnaHQ9dCx0aGlzLmNvbG9yPW4sdGhpcy50eXBlPSJQb2ludExpZ2h0SGVscGVyIix0aGlzLm1hdHJpeD10aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX11cGRhdGUoKXt0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLmNvbG9yIT09dm9pZCAwP3RoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOnRoaXMubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKX19Y29uc3QgVkM9bmV3IEwsWHk9bmV3IHZ0LHF5PW5ldyB2dDtjbGFzcyBIQyBleHRlbmRzIG5le2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcigpLHRoaXMubGlnaHQ9dCx0aGlzLm1hdHJpeD10Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmNvbG9yPW4sdGhpcy50eXBlPSJIZW1pc3BoZXJlTGlnaHRIZWxwZXIiO2NvbnN0IHI9bmV3IHRhKGUpO3Iucm90YXRlWShNYXRoLlBJKi41KSx0aGlzLm1hdGVyaWFsPW5ldyBYaSh7d2lyZWZyYW1lOiEwLGZvZzohMSx0b25lTWFwcGVkOiExfSksdGhpcy5jb2xvcj09PXZvaWQgMCYmKHRoaXMubWF0ZXJpYWwudmVydGV4Q29sb3JzPSEwKTtjb25zdCBzPXIuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLG89bmV3IEZsb2F0MzJBcnJheShzLmNvdW50KjMpO3Iuc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IFp0KG8sMykpLHRoaXMuYWRkKG5ldyBJZShyLHRoaXMubWF0ZXJpYWwpKSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmNoaWxkcmVuWzBdLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLmNoaWxkcmVuWzBdLm1hdGVyaWFsLmRpc3Bvc2UoKX11cGRhdGUoKXtjb25zdCB0PXRoaXMuY2hpbGRyZW5bMF07aWYodGhpcy5jb2xvciE9PXZvaWQgMCl0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTtlbHNle2NvbnN0IGU9dC5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoImNvbG9yIik7WHkuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSxxeS5jb3B5KHRoaXMubGlnaHQuZ3JvdW5kQ29sb3IpO2ZvcihsZXQgbj0wLHI9ZS5jb3VudDtuPHI7bisrKXtjb25zdCBzPW48ci8yP1h5OnF5O2Uuc2V0WFlaKG4scy5yLHMuZyxzLmIpfWUubmVlZHNVcGRhdGU9ITB9dGhpcy5saWdodC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5sb29rQXQoVkMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQubWF0cml4V29ybGQpLm5lZ2F0ZSgpKX19Y2xhc3MgV0MgZXh0ZW5kcyBpaXtjb25zdHJ1Y3Rvcih0PTEwLGU9MTAsbj00NDczOTI0LHI9ODk0Nzg0OCl7bj1uZXcgdnQobikscj1uZXcgdnQocik7Y29uc3Qgcz1lLzIsbz10L2UsYT10LzIsbD1bXSxjPVtdO2ZvcihsZXQgZj0wLGQ9MCxwPS1hO2Y8PWU7ZisrLHArPW8pe2wucHVzaCgtYSwwLHAsYSwwLHApLGwucHVzaChwLDAsLWEscCwwLGEpO2NvbnN0IHk9Zj09PXM/bjpyO3kudG9BcnJheShjLGQpLGQrPTMseS50b0FycmF5KGMsZCksZCs9Myx5LnRvQXJyYXkoYyxkKSxkKz0zLHkudG9BcnJheShjLGQpLGQrPTN9Y29uc3QgdT1uZXcgTnQ7dS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU3QobCwzKSksdS5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgU3QoYywzKSk7Y29uc3QgaD1uZXcgbm4oe3ZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSk7c3VwZXIodSxoKSx0aGlzLnR5cGU9IkdyaWRIZWxwZXIifWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19Y2xhc3MgJEMgZXh0ZW5kcyBpaXtjb25zdHJ1Y3Rvcih0PTEwLGU9MTYsbj04LHI9NjQscz00NDczOTI0LG89ODk0Nzg0OCl7cz1uZXcgdnQocyksbz1uZXcgdnQobyk7Y29uc3QgYT1bXSxsPVtdO2lmKGU+MSlmb3IobGV0IGg9MDtoPGU7aCsrKXtjb25zdCBmPWgvZSooTWF0aC5QSSoyKSxkPU1hdGguc2luKGYpKnQscD1NYXRoLmNvcyhmKSp0O2EucHVzaCgwLDAsMCksYS5wdXNoKGQsMCxwKTtjb25zdCB5PWgmMT9zOm87bC5wdXNoKHkucix5LmcseS5iKSxsLnB1c2goeS5yLHkuZyx5LmIpfWZvcihsZXQgaD0wO2g8bjtoKyspe2NvbnN0IGY9aCYxP3M6byxkPXQtdC9uKmg7Zm9yKGxldCBwPTA7cDxyO3ArKyl7bGV0IHk9cC9yKihNYXRoLlBJKjIpLG09TWF0aC5zaW4oeSkqZCxnPU1hdGguY29zKHkpKmQ7YS5wdXNoKG0sMCxnKSxsLnB1c2goZi5yLGYuZyxmLmIpLHk9KHArMSkvciooTWF0aC5QSSoyKSxtPU1hdGguc2luKHkpKmQsZz1NYXRoLmNvcyh5KSpkLGEucHVzaChtLDAsZyksbC5wdXNoKGYucixmLmcsZi5iKX19Y29uc3QgYz1uZXcgTnQ7Yy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU3QoYSwzKSksYy5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgU3QobCwzKSk7Y29uc3QgdT1uZXcgbm4oe3ZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSk7c3VwZXIoYyx1KSx0aGlzLnR5cGU9IlBvbGFyR3JpZEhlbHBlciJ9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfX1jb25zdCBZeT1uZXcgTCxPYz1uZXcgTCxaeT1uZXcgTDtjbGFzcyBYQyBleHRlbmRzIG5le2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcigpLHRoaXMubGlnaHQ9dCx0aGlzLm1hdHJpeD10Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmNvbG9yPW4sdGhpcy50eXBlPSJEaXJlY3Rpb25hbExpZ2h0SGVscGVyIixlPT09dm9pZCAwJiYoZT0xKTtsZXQgcj1uZXcgTnQ7ci5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU3QoWy1lLGUsMCxlLGUsMCxlLC1lLDAsLWUsLWUsMCwtZSxlLDBdLDMpKTtjb25zdCBzPW5ldyBubih7Zm9nOiExLHRvbmVNYXBwZWQ6ITF9KTt0aGlzLmxpZ2h0UGxhbmU9bmV3IEppKHIscyksdGhpcy5hZGQodGhpcy5saWdodFBsYW5lKSxyPW5ldyBOdCxyLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTdChbMCwwLDAsMCwwLDFdLDMpKSx0aGlzLnRhcmdldExpbmU9bmV3IEppKHIscyksdGhpcy5hZGQodGhpcy50YXJnZXRMaW5lKSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCksdGhpcy50YXJnZXRMaW5lLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuZGlzcG9zZSgpfXVwZGF0ZSgpe3RoaXMubGlnaHQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubGlnaHQudGFyZ2V0LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxZeS5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCksT2Muc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKSxaeS5zdWJWZWN0b3JzKE9jLFl5KSx0aGlzLmxpZ2h0UGxhbmUubG9va0F0KE9jKSx0aGlzLmNvbG9yIT09dm9pZCAwPyh0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcikpOih0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSksdGhpcy50YXJnZXRMaW5lLmxvb2tBdChPYyksdGhpcy50YXJnZXRMaW5lLnNjYWxlLno9WnkubGVuZ3RoKCl9fWNvbnN0IEJjPW5ldyBMLFNlPW5ldyBrbDtjbGFzcyBxQyBleHRlbmRzIGlpe2NvbnN0cnVjdG9yKHQpe2NvbnN0IGU9bmV3IE50LG49bmV3IG5uKHtjb2xvcjoxNjc3NzIxNSx2ZXJ0ZXhDb2xvcnM6ITAsdG9uZU1hcHBlZDohMX0pLHI9W10scz1bXSxvPXt9O2EoIm4xIiwibjIiKSxhKCJuMiIsIm40IiksYSgibjQiLCJuMyIpLGEoIm4zIiwibjEiKSxhKCJmMSIsImYyIiksYSgiZjIiLCJmNCIpLGEoImY0IiwiZjMiKSxhKCJmMyIsImYxIiksYSgibjEiLCJmMSIpLGEoIm4yIiwiZjIiKSxhKCJuMyIsImYzIiksYSgibjQiLCJmNCIpLGEoInAiLCJuMSIpLGEoInAiLCJuMiIpLGEoInAiLCJuMyIpLGEoInAiLCJuNCIpLGEoInUxIiwidTIiKSxhKCJ1MiIsInUzIiksYSgidTMiLCJ1MSIpLGEoImMiLCJ0IiksYSgicCIsImMiKSxhKCJjbjEiLCJjbjIiKSxhKCJjbjMiLCJjbjQiKSxhKCJjZjEiLCJjZjIiKSxhKCJjZjMiLCJjZjQiKTtmdW5jdGlvbiBhKHAseSl7bChwKSxsKHkpfWZ1bmN0aW9uIGwocCl7ci5wdXNoKDAsMCwwKSxzLnB1c2goMCwwLDApLG9bcF09PT12b2lkIDAmJihvW3BdPVtdKSxvW3BdLnB1c2goci5sZW5ndGgvMy0xKX1lLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTdChyLDMpKSxlLnNldEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBTdChzLDMpKSxzdXBlcihlLG4pLHRoaXMudHlwZT0iQ2FtZXJhSGVscGVyIix0aGlzLmNhbWVyYT10LHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgmJnRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSx0aGlzLm1hdHJpeD10Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLnBvaW50TWFwPW8sdGhpcy51cGRhdGUoKTtjb25zdCBjPW5ldyB2dCgxNjc1NTIwMCksdT1uZXcgdnQoMTY3MTE2ODApLGg9bmV3IHZ0KDQzNzc1KSxmPW5ldyB2dCgxNjc3NzIxNSksZD1uZXcgdnQoMzM1NTQ0Myk7dGhpcy5zZXRDb2xvcnMoYyx1LGgsZixkKX1zZXRDb2xvcnModCxlLG4scixzKXtjb25zdCBhPXRoaXMuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJjb2xvciIpO2Euc2V0WFlaKDAsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDEsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDIsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDMsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDQsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDUsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDYsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDcsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDgsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDksdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDEwLHQucix0LmcsdC5iKSxhLnNldFhZWigxMSx0LnIsdC5nLHQuYiksYS5zZXRYWVooMTIsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDEzLHQucix0LmcsdC5iKSxhLnNldFhZWigxNCx0LnIsdC5nLHQuYiksYS5zZXRYWVooMTUsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDE2LHQucix0LmcsdC5iKSxhLnNldFhZWigxNyx0LnIsdC5nLHQuYiksYS5zZXRYWVooMTgsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDE5LHQucix0LmcsdC5iKSxhLnNldFhZWigyMCx0LnIsdC5nLHQuYiksYS5zZXRYWVooMjEsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDIyLHQucix0LmcsdC5iKSxhLnNldFhZWigyMyx0LnIsdC5nLHQuYiksYS5zZXRYWVooMjQsZS5yLGUuZyxlLmIpLGEuc2V0WFlaKDI1LGUucixlLmcsZS5iKSxhLnNldFhZWigyNixlLnIsZS5nLGUuYiksYS5zZXRYWVooMjcsZS5yLGUuZyxlLmIpLGEuc2V0WFlaKDI4LGUucixlLmcsZS5iKSxhLnNldFhZWigyOSxlLnIsZS5nLGUuYiksYS5zZXRYWVooMzAsZS5yLGUuZyxlLmIpLGEuc2V0WFlaKDMxLGUucixlLmcsZS5iKSxhLnNldFhZWigzMixuLnIsbi5nLG4uYiksYS5zZXRYWVooMzMsbi5yLG4uZyxuLmIpLGEuc2V0WFlaKDM0LG4ucixuLmcsbi5iKSxhLnNldFhZWigzNSxuLnIsbi5nLG4uYiksYS5zZXRYWVooMzYsbi5yLG4uZyxuLmIpLGEuc2V0WFlaKDM3LG4ucixuLmcsbi5iKSxhLnNldFhZWigzOCxyLnIsci5nLHIuYiksYS5zZXRYWVooMzksci5yLHIuZyxyLmIpLGEuc2V0WFlaKDQwLHMucixzLmcscy5iKSxhLnNldFhZWig0MSxzLnIscy5nLHMuYiksYS5zZXRYWVooNDIscy5yLHMuZyxzLmIpLGEuc2V0WFlaKDQzLHMucixzLmcscy5iKSxhLnNldFhZWig0NCxzLnIscy5nLHMuYiksYS5zZXRYWVooNDUscy5yLHMuZyxzLmIpLGEuc2V0WFlaKDQ2LHMucixzLmcscy5iKSxhLnNldFhZWig0NyxzLnIscy5nLHMuYiksYS5zZXRYWVooNDgscy5yLHMuZyxzLmIpLGEuc2V0WFlaKDQ5LHMucixzLmcscy5iKSxhLm5lZWRzVXBkYXRlPSEwfXVwZGF0ZSgpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeSxlPXRoaXMucG9pbnRNYXAsbj0xLHI9MTtTZS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKSxUZSgiYyIsZSx0LFNlLDAsMCwtMSksVGUoInQiLGUsdCxTZSwwLDAsMSksVGUoIm4xIixlLHQsU2UsLW4sLXIsLTEpLFRlKCJuMiIsZSx0LFNlLG4sLXIsLTEpLFRlKCJuMyIsZSx0LFNlLC1uLHIsLTEpLFRlKCJuNCIsZSx0LFNlLG4sciwtMSksVGUoImYxIixlLHQsU2UsLW4sLXIsMSksVGUoImYyIixlLHQsU2UsbiwtciwxKSxUZSgiZjMiLGUsdCxTZSwtbixyLDEpLFRlKCJmNCIsZSx0LFNlLG4sciwxKSxUZSgidTEiLGUsdCxTZSxuKi43LHIqMS4xLC0xKSxUZSgidTIiLGUsdCxTZSwtbiouNyxyKjEuMSwtMSksVGUoInUzIixlLHQsU2UsMCxyKjIsLTEpLFRlKCJjZjEiLGUsdCxTZSwtbiwwLDEpLFRlKCJjZjIiLGUsdCxTZSxuLDAsMSksVGUoImNmMyIsZSx0LFNlLDAsLXIsMSksVGUoImNmNCIsZSx0LFNlLDAsciwxKSxUZSgiY24xIixlLHQsU2UsLW4sMCwtMSksVGUoImNuMiIsZSx0LFNlLG4sMCwtMSksVGUoImNuMyIsZSx0LFNlLDAsLXIsLTEpLFRlKCJjbjQiLGUsdCxTZSwwLHIsLTEpLHQuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLm5lZWRzVXBkYXRlPSEwfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19ZnVuY3Rpb24gVGUoaSx0LGUsbixyLHMsbyl7QmMuc2V0KHIscyxvKS51bnByb2plY3Qobik7Y29uc3QgYT10W2ldO2lmKGEhPT12b2lkIDApe2NvbnN0IGw9ZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7Zm9yKGxldCBjPTAsdT1hLmxlbmd0aDtjPHU7YysrKWwuc2V0WFlaKGFbY10sQmMueCxCYy55LEJjLnopfX1jb25zdCB6Yz1uZXcgT2U7Y2xhc3MgWUMgZXh0ZW5kcyBpaXtjb25zdHJ1Y3Rvcih0LGU9MTY3NzY5NjApe2NvbnN0IG49bmV3IFVpbnQxNkFycmF5KFswLDEsMSwyLDIsMywzLDAsNCw1LDUsNiw2LDcsNyw0LDAsNCwxLDUsMiw2LDMsN10pLHI9bmV3IEZsb2F0MzJBcnJheSg4KjMpLHM9bmV3IE50O3Muc2V0SW5kZXgobmV3IFp0KG4sMSkpLHMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFp0KHIsMykpLHN1cGVyKHMsbmV3IG5uKHtjb2xvcjplLHRvbmVNYXBwZWQ6ITF9KSksdGhpcy5vYmplY3Q9dCx0aGlzLnR5cGU9IkJveEhlbHBlciIsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMudXBkYXRlKCl9dXBkYXRlKHQpe2lmKHQhPT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuQm94SGVscGVyOiAudXBkYXRlKCkgaGFzIG5vIGxvbmdlciBhcmd1bWVudHMuIiksdGhpcy5vYmplY3QhPT12b2lkIDAmJnpjLnNldEZyb21PYmplY3QodGhpcy5vYmplY3QpLHpjLmlzRW1wdHkoKSlyZXR1cm47Y29uc3QgZT16Yy5taW4sbj16Yy5tYXgscj10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24scz1yLmFycmF5O3NbMF09bi54LHNbMV09bi55LHNbMl09bi56LHNbM109ZS54LHNbNF09bi55LHNbNV09bi56LHNbNl09ZS54LHNbN109ZS55LHNbOF09bi56LHNbOV09bi54LHNbMTBdPWUueSxzWzExXT1uLnosc1sxMl09bi54LHNbMTNdPW4ueSxzWzE0XT1lLnosc1sxNV09ZS54LHNbMTZdPW4ueSxzWzE3XT1lLnosc1sxOF09ZS54LHNbMTldPWUueSxzWzIwXT1lLnosc1syMV09bi54LHNbMjJdPWUueSxzWzIzXT1lLnosci5uZWVkc1VwZGF0ZT0hMCx0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpfXNldEZyb21PYmplY3QodCl7cmV0dXJuIHRoaXMub2JqZWN0PXQsdGhpcy51cGRhdGUoKSx0aGlzfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMub2JqZWN0PXQub2JqZWN0LHRoaXN9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfX1jbGFzcyBaQyBleHRlbmRzIGlpe2NvbnN0cnVjdG9yKHQsZT0xNjc3Njk2MCl7Y29uc3Qgbj1uZXcgVWludDE2QXJyYXkoWzAsMSwxLDIsMiwzLDMsMCw0LDUsNSw2LDYsNyw3LDQsMCw0LDEsNSwyLDYsMyw3XSkscj1bMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwtMSwtMSwxLC0xLC0xLC0xLC0xLDEsLTEsLTFdLHM9bmV3IE50O3Muc2V0SW5kZXgobmV3IFp0KG4sMSkpLHMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFN0KHIsMykpLHN1cGVyKHMsbmV3IG5uKHtjb2xvcjplLHRvbmVNYXBwZWQ6ITF9KSksdGhpcy5ib3g9dCx0aGlzLnR5cGU9IkJveDNIZWxwZXIiLHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl9dXBkYXRlTWF0cml4V29ybGQodCl7Y29uc3QgZT10aGlzLmJveDtlLmlzRW1wdHkoKXx8KGUuZ2V0Q2VudGVyKHRoaXMucG9zaXRpb24pLGUuZ2V0U2l6ZSh0aGlzLnNjYWxlKSx0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKC41KSxzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KSl9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfX1jbGFzcyBKQyBleHRlbmRzIEppe2NvbnN0cnVjdG9yKHQsZT0xLG49MTY3NzY5NjApe2NvbnN0IHI9bixzPVsxLC0xLDAsLTEsMSwwLC0xLC0xLDAsMSwxLDAsLTEsMSwwLC0xLC0xLDAsMSwtMSwwLDEsMSwwXSxvPW5ldyBOdDtvLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTdChzLDMpKSxvLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHN1cGVyKG8sbmV3IG5uKHtjb2xvcjpyLHRvbmVNYXBwZWQ6ITF9KSksdGhpcy50eXBlPSJQbGFuZUhlbHBlciIsdGhpcy5wbGFuZT10LHRoaXMuc2l6ZT1lO2NvbnN0IGE9WzEsMSwwLC0xLDEsMCwtMSwtMSwwLDEsMSwwLC0xLC0xLDAsMSwtMSwwXSxsPW5ldyBOdDtsLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTdChhLDMpKSxsLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXMuYWRkKG5ldyBJZShsLG5ldyBYaSh7Y29sb3I6cixvcGFjaXR5Oi4yLHRyYW5zcGFyZW50OiEwLGRlcHRoV3JpdGU6ITEsdG9uZU1hcHBlZDohMX0pKSl9dXBkYXRlTWF0cml4V29ybGQodCl7dGhpcy5wb3NpdGlvbi5zZXQoMCwwLDApLHRoaXMuc2NhbGUuc2V0KC41KnRoaXMuc2l6ZSwuNSp0aGlzLnNpemUsMSksdGhpcy5sb29rQXQodGhpcy5wbGFuZS5ub3JtYWwpLHRoaXMudHJhbnNsYXRlWigtdGhpcy5wbGFuZS5jb25zdGFudCksc3VwZXIudXBkYXRlTWF0cml4V29ybGQodCl9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpLHRoaXMuY2hpbGRyZW5bMF0uZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuZGlzcG9zZSgpfX1jb25zdCBKeT1uZXcgTDtsZXQga2MsUWY7Y2xhc3MgS0MgZXh0ZW5kcyBuZXtjb25zdHJ1Y3Rvcih0PW5ldyBMKDAsMCwxKSxlPW5ldyBMKDAsMCwwKSxuPTEscj0xNjc3Njk2MCxzPW4qLjIsbz1zKi4yKXtzdXBlcigpLHRoaXMudHlwZT0iQXJyb3dIZWxwZXIiLGtjPT09dm9pZCAwJiYoa2M9bmV3IE50LGtjLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTdChbMCwwLDAsMCwxLDBdLDMpKSxRZj1uZXcgVXMoMCwuNSwxLDUsMSksUWYudHJhbnNsYXRlKDAsLS41LDApKSx0aGlzLnBvc2l0aW9uLmNvcHkoZSksdGhpcy5saW5lPW5ldyBKaShrYyxuZXcgbm4oe2NvbG9yOnIsdG9uZU1hcHBlZDohMX0pKSx0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmFkZCh0aGlzLmxpbmUpLHRoaXMuY29uZT1uZXcgSWUoUWYsbmV3IFhpKHtjb2xvcjpyLHRvbmVNYXBwZWQ6ITF9KSksdGhpcy5jb25lLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5hZGQodGhpcy5jb25lKSx0aGlzLnNldERpcmVjdGlvbih0KSx0aGlzLnNldExlbmd0aChuLHMsbyl9c2V0RGlyZWN0aW9uKHQpe2lmKHQueT4uOTk5OTkpdGhpcy5xdWF0ZXJuaW9uLnNldCgwLDAsMCwxKTtlbHNlIGlmKHQueTwtLjk5OTk5KXRoaXMucXVhdGVybmlvbi5zZXQoMSwwLDAsMCk7ZWxzZXtKeS5zZXQodC56LDAsLXQueCkubm9ybWFsaXplKCk7Y29uc3QgZT1NYXRoLmFjb3ModC55KTt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZShKeSxlKX19c2V0TGVuZ3RoKHQsZT10Ki4yLG49ZSouMil7dGhpcy5saW5lLnNjYWxlLnNldCgxLE1hdGgubWF4KDFlLTQsdC1lKSwxKSx0aGlzLmxpbmUudXBkYXRlTWF0cml4KCksdGhpcy5jb25lLnNjYWxlLnNldChuLGUsbiksdGhpcy5jb25lLnBvc2l0aW9uLnk9dCx0aGlzLmNvbmUudXBkYXRlTWF0cml4KCl9c2V0Q29sb3IodCl7dGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLnNldCh0KSx0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCwhMSksdGhpcy5saW5lLmNvcHkodC5saW5lKSx0aGlzLmNvbmUuY29weSh0LmNvbmUpLHRoaXN9ZGlzcG9zZSgpe3RoaXMubGluZS5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5saW5lLm1hdGVyaWFsLmRpc3Bvc2UoKSx0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCl9fWNsYXNzIGpDIGV4dGVuZHMgaWl7Y29uc3RydWN0b3IodD0xKXtjb25zdCBlPVswLDAsMCx0LDAsMCwwLDAsMCwwLHQsMCwwLDAsMCwwLDAsdF0sbj1bMSwwLDAsMSwuNiwwLDAsMSwwLC42LDEsMCwwLDAsMSwwLC42LDFdLHI9bmV3IE50O3Iuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFN0KGUsMykpLHIuc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IFN0KG4sMykpO2NvbnN0IHM9bmV3IG5uKHt2ZXJ0ZXhDb2xvcnM6ITAsdG9uZU1hcHBlZDohMX0pO3N1cGVyKHIscyksdGhpcy50eXBlPSJBeGVzSGVscGVyIn1zZXRDb2xvcnModCxlLG4pe2NvbnN0IHI9bmV3IHZ0LHM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yLmFycmF5O3JldHVybiByLnNldCh0KSxyLnRvQXJyYXkocywwKSxyLnRvQXJyYXkocywzKSxyLnNldChlKSxyLnRvQXJyYXkocyw2KSxyLnRvQXJyYXkocyw5KSxyLnNldChuKSxyLnRvQXJyYXkocywxMiksci50b0FycmF5KHMsMTUpLHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5uZWVkc1VwZGF0ZT0hMCx0aGlzfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19Y2xhc3MgUUN7Y29uc3RydWN0b3IoKXt0aGlzLnR5cGU9IlNoYXBlUGF0aCIsdGhpcy5jb2xvcj1uZXcgdnQsdGhpcy5zdWJQYXRocz1bXSx0aGlzLmN1cnJlbnRQYXRoPW51bGx9bW92ZVRvKHQsZSl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGg9bmV3IFpvLHRoaXMuc3ViUGF0aHMucHVzaCh0aGlzLmN1cnJlbnRQYXRoKSx0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyh0LGUpLHRoaXN9bGluZVRvKHQsZSl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGgubGluZVRvKHQsZSksdGhpc31xdWFkcmF0aWNDdXJ2ZVRvKHQsZSxuLHIpe3JldHVybiB0aGlzLmN1cnJlbnRQYXRoLnF1YWRyYXRpY0N1cnZlVG8odCxlLG4sciksdGhpc31iZXppZXJDdXJ2ZVRvKHQsZSxuLHIscyxvKXtyZXR1cm4gdGhpcy5jdXJyZW50UGF0aC5iZXppZXJDdXJ2ZVRvKHQsZSxuLHIscyxvKSx0aGlzfXNwbGluZVRocnUodCl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGguc3BsaW5lVGhydSh0KSx0aGlzfXRvU2hhcGVzKHQpe2Z1bmN0aW9uIGUoZyl7Y29uc3QgeD1bXTtmb3IobGV0IHY9MCxfPWcubGVuZ3RoO3Y8Xzt2Kyspe2NvbnN0IEU9Z1t2XSxiPW5ldyB3aTtiLmN1cnZlcz1FLmN1cnZlcyx4LnB1c2goYil9cmV0dXJuIHh9ZnVuY3Rpb24gbihnLHgpe2NvbnN0IHY9eC5sZW5ndGg7bGV0IF89ITE7Zm9yKGxldCBFPXYtMSxiPTA7Yjx2O0U9YisrKXtsZXQgVD14W0VdLFA9eFtiXSx3PVAueC1ULngsTT1QLnktVC55O2lmKE1hdGguYWJzKE0pPk51bWJlci5FUFNJTE9OKXtpZihNPDAmJihUPXhbYl0sdz0tdyxQPXhbRV0sTT0tTSksZy55PFQueXx8Zy55PlAueSljb250aW51ZTtpZihnLnk9PT1ULnkpe2lmKGcueD09PVQueClyZXR1cm4hMH1lbHNle2NvbnN0IEE9TSooZy54LVQueCktdyooZy55LVQueSk7aWYoQT09PTApcmV0dXJuITA7aWYoQTwwKWNvbnRpbnVlO189IV99fWVsc2V7aWYoZy55IT09VC55KWNvbnRpbnVlO2lmKFAueDw9Zy54JiZnLng8PVQueHx8VC54PD1nLngmJmcueDw9UC54KXJldHVybiEwfX1yZXR1cm4gX31jb25zdCByPXduLmlzQ2xvY2tXaXNlLHM9dGhpcy5zdWJQYXRocztpZihzLmxlbmd0aD09PTApcmV0dXJuW107bGV0IG8sYSxsO2NvbnN0IGM9W107aWYocy5sZW5ndGg9PT0xKXJldHVybiBhPXNbMF0sbD1uZXcgd2ksbC5jdXJ2ZXM9YS5jdXJ2ZXMsYy5wdXNoKGwpLGM7bGV0IHU9IXIoc1swXS5nZXRQb2ludHMoKSk7dT10PyF1OnU7Y29uc3QgaD1bXSxmPVtdO2xldCBkPVtdLHA9MCx5O2ZbcF09dm9pZCAwLGRbcF09W107Zm9yKGxldCBnPTAseD1zLmxlbmd0aDtnPHg7ZysrKWE9c1tnXSx5PWEuZ2V0UG9pbnRzKCksbz1yKHkpLG89dD8hbzpvLG8/KCF1JiZmW3BdJiZwKyssZltwXT17czpuZXcgd2kscDp5fSxmW3BdLnMuY3VydmVzPWEuY3VydmVzLHUmJnArKyxkW3BdPVtdKTpkW3BdLnB1c2goe2g6YSxwOnlbMF19KTtpZighZlswXSlyZXR1cm4gZShzKTtpZihmLmxlbmd0aD4xKXtsZXQgZz0hMSx4PTA7Zm9yKGxldCB2PTAsXz1mLmxlbmd0aDt2PF87disrKWhbdl09W107Zm9yKGxldCB2PTAsXz1mLmxlbmd0aDt2PF87disrKXtjb25zdCBFPWRbdl07Zm9yKGxldCBiPTA7YjxFLmxlbmd0aDtiKyspe2NvbnN0IFQ9RVtiXTtsZXQgUD0hMDtmb3IobGV0IHc9MDt3PGYubGVuZ3RoO3crKyluKFQucCxmW3ddLnApJiYodiE9PXcmJngrKyxQPyhQPSExLGhbd10ucHVzaChUKSk6Zz0hMCk7UCYmaFt2XS5wdXNoKFQpfX14PjAmJmc9PT0hMSYmKGQ9aCl9bGV0IG07Zm9yKGxldCBnPTAseD1mLmxlbmd0aDtnPHg7ZysrKXtsPWZbZ10ucyxjLnB1c2gobCksbT1kW2ddO2ZvcihsZXQgdj0wLF89bS5sZW5ndGg7djxfO3YrKylsLmhvbGVzLnB1c2gobVt2XS5oKX1yZXR1cm4gY319Y2xhc3MgdFIgZXh0ZW5kcyBlaXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5vYmplY3Q9dCx0aGlzLmRvbUVsZW1lbnQ9ZSx0aGlzLmVuYWJsZWQ9ITAsdGhpcy5zdGF0ZT0tMSx0aGlzLmtleXM9e30sdGhpcy5tb3VzZUJ1dHRvbnM9e0xFRlQ6bnVsbCxNSURETEU6bnVsbCxSSUdIVDpudWxsfSx0aGlzLnRvdWNoZXM9e09ORTpudWxsLFRXTzpudWxsfX1jb25uZWN0KCl7fWRpc2Nvbm5lY3QoKXt9ZGlzcG9zZSgpe311cGRhdGUoKXt9fWNsYXNzIGVSIGV4dGVuZHMgT257Y29uc3RydWN0b3IodD0xLGU9MSxuPTEscj17fSl7Y29uc29sZS53YXJuKCdUSFJFRS5XZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cyBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gcjE3Mi4gVXNlIFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0IGFuZCBzZXQgdGhlICJjb3VudCIgcGFyYW1ldGVyIHRvIGVuYWJsZSBNUlQuJyksc3VwZXIodCxlLGhoKE9pKHt9LHIpLHtjb3VudDpufSkpLHRoaXMuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cz0hMH1nZXQgdGV4dHVyZSgpe3JldHVybiB0aGlzLnRleHR1cmVzfX10eXBlb2YgX19USFJFRV9ERVZUT09MU19fIT0idW5kZWZpbmVkIiYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJyZWdpc3RlciIse2RldGFpbDp7cmV2aXNpb246UXR9fSkpLHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiYod2luZG93Ll9fVEhSRUVfXz9jb25zb2xlLndhcm4oIldBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4iKTp3aW5kb3cuX19USFJFRV9fPVF0KTt2YXIgblI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQUNFU0ZpbG1pY1RvbmVNYXBwaW5nOlZtLEFkZEVxdWF0aW9uOkJpLEFkZE9wZXJhdGlvbjpCbSxBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZTpFaCxBZGRpdGl2ZUJsZW5kaW5nOmZoLEFnWFRvbmVNYXBwaW5nOldtLEFscGhhRm9ybWF0OnhoLEFsd2F5c0NvbXBhcmU6c2csQWx3YXlzRGVwdGg6SW0sQWx3YXlzU3RlbmNpbEZ1bmM6VGgsQW1iaWVudExpZ2h0OmJ5LEFuaW1hdGlvbkFjdGlvbjp6eSxBbmltYXRpb25DbGlwOm9hLEFuaW1hdGlvbkxvYWRlcjp0QyxBbmltYXRpb25NaXhlcjpSQyxBbmltYXRpb25PYmplY3RHcm91cDpUQyxBbmltYXRpb25VdGlsczpKVCxBcmNDdXJ2ZTpCMCxBcnJheUNhbWVyYTpjMCxBcnJvd0hlbHBlcjpLQyxBdHRhY2hlZEJpbmRNb2RlOm1oLEF1ZGlvOkZ5LEF1ZGlvQW5hbHlzZXI6eUMsQXVkaW9Db250ZXh0OlhmLEF1ZGlvTGlzdGVuZXI6cEMsQXVkaW9Mb2FkZXI6aEMsQXhlc0hlbHBlcjpqQyxCYWNrU2lkZTpLZSxCYXNpY0RlcHRoUGFja2luZzpKbSxCYXNpY1NoYWRvd01hcDpscixCYXRjaGVkTWVzaDpSMCxCb25lOnlmLEJvb2xlYW5LZXlmcmFtZVRyYWNrOklyLEJveDI6T0MsQm94MzpPZSxCb3gzSGVscGVyOlpDLEJveEdlb21ldHJ5Ok1yLEJveEhlbHBlcjpZQyxCdWZmZXJBdHRyaWJ1dGU6WnQsQnVmZmVyR2VvbWV0cnk6TnQsQnVmZmVyR2VvbWV0cnlMb2FkZXI6Q3ksQnl0ZVR5cGU6eWgsQ2FjaGU6QWksQ2FtZXJhOmtsLENhbWVyYUhlbHBlcjpxQyxDYW52YXNUZXh0dXJlOnhULENhcHN1bGVHZW9tZXRyeTpnYyxDYXRtdWxsUm9tQ3VydmUzOnowLENpbmVvblRvbmVNYXBwaW5nOkdtLENpcmNsZUdlb21ldHJ5OnljLENsYW1wVG9FZGdlV3JhcHBpbmc6SW4sQ2xvY2s6RHksQ29sb3I6dnQsQ29sb3JLZXlmcmFtZVRyYWNrOmtmLENvbG9yTWFuYWdlbWVudDpzZSxDb21wcmVzc2VkQXJyYXlUZXh0dXJlOnZULENvbXByZXNzZWRDdWJlVGV4dHVyZTpfVCxDb21wcmVzc2VkVGV4dHVyZTpmYyxDb21wcmVzc2VkVGV4dHVyZUxvYWRlcjplQyxDb25lR2VvbWV0cnk6dmMsQ29uc3RhbnRBbHBoYUZhY3RvcjpDbSxDb25zdGFudENvbG9yRmFjdG9yOkVtLENvbnRyb2xzOnRSLEN1YmVDYW1lcmE6RGcsQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOnBpLEN1YmVSZWZyYWN0aW9uTWFwcGluZzp6aSxDdWJlVGV4dHVyZTpPbyxDdWJlVGV4dHVyZUxvYWRlcjpuQyxDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzpqcixDdWJpY0JlemllckN1cnZlOkNmLEN1YmljQmV6aWVyQ3VydmUzOkcwLEN1YmljSW50ZXJwb2xhbnQ6ZnksQ3VsbEZhY2VCYWNrOnluLEN1bGxGYWNlRnJvbnQ6dm4sQ3VsbEZhY2VGcm9udEJhY2s6dWksQ3VsbEZhY2VOb25lOkNlLEN1cnZlOkhuLEN1cnZlUGF0aDpIMCxDdXN0b21CbGVuZGluZzpmbSxDdXN0b21Ub25lTWFwcGluZzpIbSxDeWxpbmRlckdlb21ldHJ5OlVzLEN5bGluZHJpY2FsOkZDLERhdGEzRFRleHR1cmU6VWgsRGF0YUFycmF5VGV4dHVyZTpNbCxEYXRhVGV4dHVyZTpuaSxEYXRhVGV4dHVyZUxvYWRlcjppQyxEYXRhVXRpbHM6R2IsRGVjcmVtZW50U3RlbmNpbE9wOlZTLERlY3JlbWVudFdyYXBTdGVuY2lsT3A6V1MsRGVmYXVsdExvYWRpbmdNYW5hZ2VyOm15LERlcHRoRm9ybWF0OmhyLERlcHRoU3RlbmNpbEZvcm1hdDpmcixEZXB0aFRleHR1cmU6b2YsRGV0YWNoZWRCaW5kTW9kZTpYbSxEaXJlY3Rpb25hbExpZ2h0OlN5LERpcmVjdGlvbmFsTGlnaHRIZWxwZXI6WEMsRGlzY3JldGVJbnRlcnBvbGFudDpkeSxEaXNwbGF5UDNDb2xvclNwYWNlOnhsLERvZGVjYWhlZHJvbkdlb21ldHJ5Ol9jLERvdWJsZVNpZGU6S24sRHN0QWxwaGFGYWN0b3I6TW0sRHN0Q29sb3JGYWN0b3I6Ym0sRHluYW1pY0NvcHlVc2FnZTpzYixEeW5hbWljRHJhd1VzYWdlOlFTLER5bmFtaWNSZWFkVXNhZ2U6bmIsRWRnZXNHZW9tZXRyeTpXMCxFbGxpcHNlQ3VydmU6ZGMsRXF1YWxDb21wYXJlOmVnLEVxdWFsRGVwdGg6RG0sRXF1YWxTdGVuY2lsRnVuYzpZUyxFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzpjbyxFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzp1byxFdWxlcjpNbixFdmVudERpc3BhdGNoZXI6ZWksRXh0cnVkZUdlb21ldHJ5OkswLEZpbGVMb2FkZXI6VGksRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZTpxYixGbG9hdDMyQnVmZmVyQXR0cmlidXRlOlN0LEZsb2F0VHlwZTpjbixGb2c6WmwsRm9nRXhwMjpZbCxGcmFtZWJ1ZmZlclRleHR1cmU6eVQsRnJvbnRTaWRlOmhpLEZydXN0dW06Qm8sR0xCdWZmZXJBdHRyaWJ1dGU6REMsR0xTTDE6YWIsR0xTTDM6UmgsR3JlYXRlckNvbXBhcmU6bmcsR3JlYXRlckRlcHRoOk5tLEdyZWF0ZXJFcXVhbENvbXBhcmU6cmcsR3JlYXRlckVxdWFsRGVwdGg6VW0sR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmM6alMsR3JlYXRlclN0ZW5jaWxGdW5jOkpTLEdyaWRIZWxwZXI6V0MsR3JvdXA6VHMsSGFsZkZsb2F0VHlwZTplcyxIZW1pc3BoZXJlTGlnaHQ6Z3ksSGVtaXNwaGVyZUxpZ2h0SGVscGVyOkhDLEljb3NhaGVkcm9uR2VvbWV0cnk6RWMsSW1hZ2VCaXRtYXBMb2FkZXI6dUMsSW1hZ2VMb2FkZXI6YWEsSW1hZ2VVdGlsczpmZyxJbmNyZW1lbnRTdGVuY2lsT3A6R1MsSW5jcmVtZW50V3JhcFN0ZW5jaWxPcDpIUyxJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6THMsSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk6VHksSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI6TEMsSW5zdGFuY2VkTWVzaDpFMCxJbnQxNkJ1ZmZlckF0dHJpYnV0ZTokYixJbnQzMkJ1ZmZlckF0dHJpYnV0ZTpYYixJbnQ4QnVmZmVyQXR0cmlidXRlOlZiLEludFR5cGU6emEsSW50ZXJsZWF2ZWRCdWZmZXI6SmwsSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6VHIsSW50ZXJwb2xhbnQ6bmEsSW50ZXJwb2xhdGVEaXNjcmV0ZTpNbyxJbnRlcnBvbGF0ZUxpbmVhcjp5bCxJbnRlcnBvbGF0ZVNtb290aDp2bCxJbnZlcnRTdGVuY2lsT3A6JFMsS2VlcFN0ZW5jaWxPcDptcixLZXlmcmFtZVRyYWNrOlduLExPRDpnMCxMYXRoZUdlb21ldHJ5OkpvLExheWVyczpDbCxMZXNzQ29tcGFyZTp0ZyxMZXNzRGVwdGg6TG0sTGVzc0VxdWFsQ29tcGFyZTpDaCxMZXNzRXF1YWxEZXB0aDphbyxMZXNzRXF1YWxTdGVuY2lsRnVuYzpaUyxMZXNzU3RlbmNpbEZ1bmM6cVMsTGlnaHQ6amksTGlnaHRQcm9iZTpFeSxMaW5lOkppLExpbmUzOkJDLExpbmVCYXNpY01hdGVyaWFsOm5uLExpbmVDdXJ2ZTpSZixMaW5lQ3VydmUzOlYwLExpbmVEYXNoZWRNYXRlcmlhbDpjeSxMaW5lTG9vcDpVMCxMaW5lU2VnbWVudHM6aWksTGluZWFyRGlzcGxheVAzQ29sb3JTcGFjZTpibyxMaW5lYXJGaWx0ZXI6UmUsTGluZWFySW50ZXJwb2xhbnQ6emYsTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyOkxTLExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXI6SVMsTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOmpuLExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6cG8sTGluZWFyU1JHQkNvbG9yU3BhY2U6eWksTGluZWFyVG9uZU1hcHBpbmc6em0sTGluZWFyVHJhbnNmZXI6d28sTG9hZGVyOmZuLExvYWRlclV0aWxzOiRmLExvYWRpbmdNYW5hZ2VyOkdmLExvb3BPbmNlOnFtLExvb3BQaW5nUG9uZzpabSxMb29wUmVwZWF0OlltLEx1bWluYW5jZUFscGhhRm9ybWF0OmJoLEx1bWluYW5jZUZvcm1hdDpTaCxNT1VTRTplZSxNYXRlcmlhbDpYZSxNYXRlcmlhbExvYWRlcjpEYyxNYXRoVXRpbHM6d2IsTWF0cml4MjpLZixNYXRyaXgzOlh0LE1hdHJpeDQ6THQsTWF4RXF1YXRpb246Z20sTWVzaDpJZSxNZXNoQmFzaWNNYXRlcmlhbDpYaSxNZXNoRGVwdGhNYXRlcmlhbDpjZixNZXNoRGlzdGFuY2VNYXRlcmlhbDp1ZixNZXNoTGFtYmVydE1hdGVyaWFsOmF5LE1lc2hNYXRjYXBNYXRlcmlhbDpseSxNZXNoTm9ybWFsTWF0ZXJpYWw6b3ksTWVzaFBob25nTWF0ZXJpYWw6cnksTWVzaFBoeXNpY2FsTWF0ZXJpYWw6aXksTWVzaFN0YW5kYXJkTWF0ZXJpYWw6RmYsTWVzaFRvb25NYXRlcmlhbDpzeSxNaW5FcXVhdGlvbjptbSxNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOmZvLE1peE9wZXJhdGlvbjpPbSxNdWx0aXBseUJsZW5kaW5nOnBoLE11bHRpcGx5T3BlcmF0aW9uOmxvLE5lYXJlc3RGaWx0ZXI6RmUsTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlcjpQUyxOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcjpSUyxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOlFyLE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyOmdoLE5ldXRyYWxUb25lTWFwcGluZzokbSxOZXZlckNvbXBhcmU6UW0sTmV2ZXJEZXB0aDpQbSxOZXZlclN0ZW5jaWxGdW5jOlhTLE5vQmxlbmRpbmc6ZmksTm9Db2xvclNwYWNlOmdpLE5vVG9uZU1hcHBpbmc6ZGksTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlOl9sLE5vcm1hbEJsZW5kaW5nOmNyLE5vdEVxdWFsQ29tcGFyZTppZyxOb3RFcXVhbERlcHRoOkZtLE5vdEVxdWFsU3RlbmNpbEZ1bmM6S1MsTnVtYmVyS2V5ZnJhbWVUcmFjazppYSxPYmplY3QzRDpuZSxPYmplY3RMb2FkZXI6bEMsT2JqZWN0U3BhY2VOb3JtYWxNYXA6am0sT2N0YWhlZHJvbkdlb21ldHJ5OnRhLE9uZUZhY3Rvcjp2bSxPbmVNaW51c0NvbnN0YW50QWxwaGFGYWN0b3I6Um0sT25lTWludXNDb25zdGFudENvbG9yRmFjdG9yOlRtLE9uZU1pbnVzRHN0QWxwaGFGYWN0b3I6U20sT25lTWludXNEc3RDb2xvckZhY3Rvcjp3bSxPbmVNaW51c1NyY0FscGhhRmFjdG9yOk9hLE9uZU1pbnVzU3JjQ29sb3JGYWN0b3I6eG0sT3J0aG9ncmFwaGljQ2FtZXJhOkhsLFAzUHJpbWFyaWVzOkVvLFBDRlNoYWRvd01hcDpsbixQQ0ZTb2Z0U2hhZG93TWFwOktyLFBNUkVNR2VuZXJhdG9yOnJmLFBhdGg6Wm8sUGVyc3BlY3RpdmVDYW1lcmE6a2UsUGxhbmU6WWksUGxhbmVHZW9tZXRyeTpicyxQbGFuZUhlbHBlcjpKQyxQb2ludExpZ2h0Ok15LFBvaW50TGlnaHRIZWxwZXI6R0MsUG9pbnRzOkYwLFBvaW50c01hdGVyaWFsOlNmLFBvbGFyR3JpZEhlbHBlcjokQyxQb2x5aGVkcm9uR2VvbWV0cnk6S2ksUG9zaXRpb25hbEF1ZGlvOmdDLFByb3BlcnR5QmluZGluZzppZSxQcm9wZXJ0eU1peGVyOkJ5LFF1YWRyYXRpY0JlemllckN1cnZlOlBmLFF1YWRyYXRpY0JlemllckN1cnZlMzpJZixRdWF0ZXJuaW9uOnVuLFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrOnJhLFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudDpweSxSRURfR1JFRU5fUkdUQzJfRm9ybWF0Om1sLFJFRF9SR1RDMV9Gb3JtYXQ6QWgsUkVWSVNJT046UXQsUkdCQURlcHRoUGFja2luZzpLbSxSR0JBRm9ybWF0OmplLFJHQkFJbnRlZ2VyRm9ybWF0OldhLFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ6Y2wsUkdCQV9BU1RDXzEweDVfRm9ybWF0Om9sLFJHQkFfQVNUQ18xMHg2X0Zvcm1hdDphbCxSR0JBX0FTVENfMTB4OF9Gb3JtYXQ6bGwsUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdDp1bCxSR0JBX0FTVENfMTJ4MTJfRm9ybWF0OmhsLFJHQkFfQVNUQ180eDRfRm9ybWF0OmphLFJHQkFfQVNUQ181eDRfRm9ybWF0OlFhLFJHQkFfQVNUQ181eDVfRm9ybWF0OnRsLFJHQkFfQVNUQ182eDVfRm9ybWF0OmVsLFJHQkFfQVNUQ182eDZfRm9ybWF0Om5sLFJHQkFfQVNUQ184eDVfRm9ybWF0OmlsLFJHQkFfQVNUQ184eDZfRm9ybWF0OnJsLFJHQkFfQVNUQ184eDhfRm9ybWF0OnNsLFJHQkFfQlBUQ19Gb3JtYXQ6eG8sUkdCQV9FVEMyX0VBQ19Gb3JtYXQ6S2EsUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0OllhLFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdDpxYSxSR0JBX1MzVENfRFhUMV9Gb3JtYXQ6eW8sUkdCQV9TM1RDX0RYVDNfRm9ybWF0OnZvLFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdDpfbyxSR0JEZXB0aFBhY2tpbmc6T1MsUkdCRm9ybWF0Ok1oLFJHQkludGVnZXJGb3JtYXQ6RFMsUkdCX0JQVENfU0lHTkVEX0Zvcm1hdDpmbCxSR0JfQlBUQ19VTlNJR05FRF9Gb3JtYXQ6ZGwsUkdCX0VUQzFfRm9ybWF0OlphLFJHQl9FVEMyX0Zvcm1hdDpKYSxSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdDpYYSxSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdDokYSxSR0JfUzNUQ19EWFQxX0Zvcm1hdDpnbyxSR0RlcHRoUGFja2luZzpCUyxSR0Zvcm1hdDp3aCxSR0ludGVnZXJGb3JtYXQ6SGEsUmF3U2hhZGVyTWF0ZXJpYWw6bnksUmF5OnVzLFJheWNhc3RlcjpVQyxSZWM3MDlQcmltYXJpZXM6QW8sUmVjdEFyZWFMaWdodDp3eSxSZWRGb3JtYXQ6VmEsUmVkSW50ZWdlckZvcm1hdDptbyxSZWluaGFyZFRvbmVNYXBwaW5nOmttLFJlbmRlclRhcmdldDpkZyxSZXBlYXRXcmFwcGluZzpobyxSZXBsYWNlU3RlbmNpbE9wOmtTLFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uOnBtLFJpbmdHZW9tZXRyeTpUYyxTSUdORURfUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdDpnbCxTSUdORURfUkVEX1JHVEMxX0Zvcm1hdDpwbCxTUkdCQ29sb3JTcGFjZTpMbixTUkdCVHJhbnNmZXI6ZGUsU2NlbmU6dTAsU2hhZGVyQ2h1bms6cXQsU2hhZGVyTGliOlZuLFNoYWRlck1hdGVyaWFsOkduLFNoYWRvd01hdGVyaWFsOmV5LFNoYXBlOndpLFNoYXBlR2VvbWV0cnk6Q2MsU2hhcGVQYXRoOlFDLFNoYXBlVXRpbHM6d24sU2hvcnRUeXBlOnZoLFNrZWxldG9uOm5jLFNrZWxldG9uSGVscGVyOmtDLFNraW5uZWRNZXNoOlMwLFNvdXJjZTp5cixTcGhlcmU6V2UsU3BoZXJlR2VvbWV0cnk6ZWEsU3BoZXJpY2FsOk5DLFNwaGVyaWNhbEhhcm1vbmljczM6QXksU3BsaW5lQ3VydmU6TGYsU3BvdExpZ2h0Ol95LFNwb3RMaWdodEhlbHBlcjp6QyxTcHJpdGU6cDAsU3ByaXRlTWF0ZXJpYWw6ZGYsU3JjQWxwaGFGYWN0b3I6RmEsU3JjQWxwaGFTYXR1cmF0ZUZhY3RvcjpBbSxTcmNDb2xvckZhY3RvcjpfbSxTdGF0aWNDb3B5VXNhZ2U6cmIsU3RhdGljRHJhd1VzYWdlOlRvLFN0YXRpY1JlYWRVc2FnZTplYixTdGVyZW9DYW1lcmE6ZkMsU3RyZWFtQ29weVVzYWdlOm9iLFN0cmVhbURyYXdVc2FnZTp0YixTdHJlYW1SZWFkVXNhZ2U6aWIsU3RyaW5nS2V5ZnJhbWVUcmFjazpMcixTdWJ0cmFjdEVxdWF0aW9uOmRtLFN1YnRyYWN0aXZlQmxlbmRpbmc6ZGgsVE9VQ0g6Z2UsVGFuZ2VudFNwYWNlTm9ybWFsTWFwOmtpLFRldHJhaGVkcm9uR2VvbWV0cnk6UmMsVGV4dHVyZTpNZSxUZXh0dXJlTG9hZGVyOnJDLFRleHR1cmVVdGlsczpaRSxUb3J1c0dlb21ldHJ5OlBjLFRvcnVzS25vdEdlb21ldHJ5OkljLFRyaWFuZ2xlOlNuLFRyaWFuZ2xlRmFuRHJhd01vZGU6RlMsVHJpYW5nbGVTdHJpcERyYXdNb2RlOk5TLFRyaWFuZ2xlc0RyYXdNb2RlOlVTLFR1YmVHZW9tZXRyeTpMYyxVVk1hcHBpbmc6QmEsVWludDE2QnVmZmVyQXR0cmlidXRlOnFoLFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZTpZaCxVaW50OEJ1ZmZlckF0dHJpYnV0ZTpIYixVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU6V2IsVW5pZm9ybTpaZixVbmlmb3Jtc0dyb3VwOklDLFVuaWZvcm1zTGliOmR0LFVuaWZvcm1zVXRpbHM6UGcsVW5zaWduZWRCeXRlVHlwZTpRbixVbnNpZ25lZEludDI0OFR5cGU6dXIsVW5zaWduZWRJbnQ1OTk5VHlwZTpfaCxVbnNpZ25lZEludFR5cGU6bWksVW5zaWduZWRTaG9ydDQ0NDRUeXBlOmthLFVuc2lnbmVkU2hvcnQ1NTUxVHlwZTpHYSxVbnNpZ25lZFNob3J0VHlwZTp0cyxWU01TaGFkb3dNYXA6Sm4sVmVjdG9yMjpxLFZlY3RvcjM6TCxWZWN0b3I0Om9lLFZlY3RvcktleWZyYW1lVHJhY2s6c2EsVmlkZW9UZXh0dXJlOmdULFdlYkdMM0RSZW5kZXJUYXJnZXQ6SWIsV2ViR0xBcnJheVJlbmRlclRhcmdldDpQYixXZWJHTENvb3JkaW5hdGVTeXN0ZW06dGksV2ViR0xDdWJlUmVuZGVyVGFyZ2V0OlVnLFdlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzOmVSLFdlYkdMUmVuZGVyVGFyZ2V0Ok9uLFdlYkdMUmVuZGVyZXI6c1QsV2ViR0xVdGlsczpsMCxXZWJHUFVDb29yZGluYXRlU3lzdGVtOkNvLFdpcmVmcmFtZUdlb21ldHJ5OmowLFdyYXBBcm91bmRFbmRpbmc6U28sWmVyb0N1cnZhdHVyZUVuZGluZzpkcixaZXJvRmFjdG9yOnltLFplcm9TbG9wZUVuZGluZzpwcixaZXJvU3RlbmNpbE9wOnpTLGNyZWF0ZUNhbnZhc0VsZW1lbnQ6bGd9KTtjb25zdCBCcj1uZXcgTWFwLGlSPShpPXt9KT0+KHtnZW5lcmF0ZVRvcFVWKHQsZSxuLHIscyl7Y29uc3Qgbz1lW24qM10sYT1lW24qMysxXSxsPWVbciozXSxjPWVbciozKzFdLHU9ZVtzKjNdLGg9ZVtzKjMrMV07bGV0IGY7aWYoQnIuaGFzKHQpKWY9QnIuZ2V0KHQpO2Vsc2V7bGV0IG09aS5ib3gzO2lmKCFtKXttPW5ldyBPZTtjb25zdCB2PXQucGFyYW1ldGVycy5zaGFwZXMuZ2V0UG9pbnRzKCkubWFwKF89PltfLngsXy55LDBdKS5mbGF0KCk7bS5zZXRGcm9tQXJyYXkodil9Y29uc3QgZz1tLmdldFNpemUobmV3IEwpO2kuc3BsaXQmJihnLnkvPWkuc3BsaXQpLGY9e2JveDptLHNpemU6Z30sQnIuc2V0KHQsZil9Y29uc3R7Ym94OmQsc2l6ZTpwfT1mLHk9aS5zcGxpdD8xLWkuc3BsaXQ6MDtyZXR1cm5bbmV3IHEoKG8tZC5taW4ueCkvcC54LChhLWQubWluLnkpL3AueSt5KSxuZXcgcSgobC1kLm1pbi54KS9wLngsKGMtZC5taW4ueSkvcC55K3kpLG5ldyBxKCh1LWQubWluLngpL3AueCwoaC1kLm1pbi55KS9wLnkreSldfSxnZW5lcmF0ZVNpZGVXYWxsVVYodCxlLG4scixzLG8pe2NvbnN0IGE9ZVtuKjNdLGw9ZVtuKjMrMV0sYz1lW24qMysyXSx1PWVbciozXSxoPWVbciozKzFdLGY9ZVtyKjMrMl0sZD1lW3MqM10scD1lW3MqMysxXSx5PWVbcyozKzJdLG09ZVtvKjNdLGc9ZVtvKjMrMV0seD1lW28qMysyXTtsZXQgdjtpZihCci5oYXMoZSkpdj1Cci5nZXQoZSk7ZWxzZXtjb25zdCBiPW5ldyBPZTtiLnNldEZyb21BcnJheShlKTtjb25zdCBUPWIuZ2V0U2l6ZShuZXcgTCk7aS5zcGxpdCYmKFQuei89MS1pLnNwbGl0KSxpLnNpZGVSZXBlYXQmJihULnovPWkuc2lkZVJlcGVhdCksdj17Ym94OmIsc2l6ZTpUfSxCci5zZXQoZSx2KX1jb25zdHtib3g6XyxzaXplOkV9PXY7cmV0dXJuIE1hdGguYWJzKGwtaCk8TWF0aC5hYnMoYS11KT9bbmV3IHEoKGEtXy5taW4ueCkvRS54LChjLV8ubWluLnopL0UueiksbmV3IHEoKHUtXy5taW4ueCkvRS54LChmLV8ubWluLnopL0UueiksbmV3IHEoKGQtXy5taW4ueCkvRS54LCh5LV8ubWluLnopL0UueiksbmV3IHEoKG0tXy5taW4ueCkvRS54LCh4LV8ubWluLnopL0UueildOltuZXcgcSgobC1fLm1pbi55KS9FLnksKGMtXy5taW4ueikvRS56KSxuZXcgcSgoaC1fLm1pbi55KS9FLnksKGYtXy5taW4ueikvRS56KSxuZXcgcSgocC1fLm1pbi55KS9FLnksKHktXy5taW4ueikvRS56KSxuZXcgcSgoZy1fLm1pbi55KS9FLnksKHgtXy5taW4ueikvRS56KV19fSksclI9KCk9PntCci5jbGVhcigpfTtjbGFzcyB0ZCBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9bmV3IHdpKFtuZXcgcSguNSwuNSksbmV3IHEoLS41LC41KSxuZXcgcSgtLjUsLS41KSxuZXcgcSguNSwtLjUpXSksZT17fSl7c3VwZXIoKSx0aGlzLnR5cGU9IkV4dHJ1ZGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6dCxvcHRpb25zOmV9LHQ9QXJyYXkuaXNBcnJheSh0KT90Olt0XTtjb25zdCBuPXRoaXMscj1bXSxzPVtdO2ZvcihsZXQgYT0wLGw9dC5sZW5ndGg7YTxsO2ErKyl7Y29uc3QgYz10W2FdO28oYyl9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU3QociwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgU3QocywyKSksdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO2Z1bmN0aW9uIG8oYSl7dmFyIG10LFEsUHQ7Y29uc3QgbD1bXSxjPWUuY3VydmVTZWdtZW50cyE9PXZvaWQgMD9lLmN1cnZlU2VnbWVudHM6MTIsdT1lLnN0ZXBzIT09dm9pZCAwP2Uuc3RlcHM6MSxoPWUuZGVwdGghPT12b2lkIDA/ZS5kZXB0aDoxO2xldCBmPWUuYmV2ZWxFbmFibGVkIT09dm9pZCAwP2UuYmV2ZWxFbmFibGVkOiEwLGQ9ZS5iZXZlbFRoaWNrbmVzcyE9PXZvaWQgMD9lLmJldmVsVGhpY2tuZXNzOi4yLHA9ZS5iZXZlbFNpemUhPT12b2lkIDA/ZS5iZXZlbFNpemU6ZC0uMSx5PWUuYmV2ZWxPZmZzZXQhPT12b2lkIDA/ZS5iZXZlbE9mZnNldDowLG09ZS5iZXZlbFNlZ21lbnRzIT09dm9pZCAwP2UuYmV2ZWxTZWdtZW50czozO2NvbnN0IGc9ZS5leHRydWRlUGF0aCx4PWUuVVZHZW5lcmF0b3IhPT12b2lkIDA/ZS5VVkdlbmVyYXRvcjpzUix2PShtdD1lLmhhc1RvcCkhPW51bGw/bXQ6ITAsXz0oUT1lLmhhc0JvdHRvbSkhPW51bGw/UTohMCxFPShQdD1lLmhhc1NpZGUpIT1udWxsP1B0OiEwO2xldCBiLFQ9ITEsUCx3LE0sQTtnJiYoYj1nLmdldFNwYWNlZFBvaW50cyh1KSxUPSEwLGY9ITEsUD1nLmNvbXB1dGVGcmVuZXRGcmFtZXModSwhMSksdz1uZXcgTCxNPW5ldyBMLEE9bmV3IEwpLGZ8fChtPTAsZD0wLHA9MCx5PTApO2NvbnN0IEY9YS5leHRyYWN0UG9pbnRzKGMpO2xldCBEPUYuc2hhcGU7Y29uc3QgTj1GLmhvbGVzO2lmKCF3bi5pc0Nsb2NrV2lzZShEKSl7RD1ELnJldmVyc2UoKTtmb3IobGV0ICQ9MCxKPU4ubGVuZ3RoOyQ8SjskKyspe2NvbnN0IFI9TlskXTt3bi5pc0Nsb2NrV2lzZShSKSYmKE5bJF09Ui5yZXZlcnNlKCkpfX1jb25zdCBCPXduLnRyaWFuZ3VsYXRlU2hhcGUoRCxOKSxIPUQ7Zm9yKGxldCAkPTAsSj1OLmxlbmd0aDskPEo7JCsrKXtjb25zdCBSPU5bJF07RD1ELmNvbmNhdChSKX1mdW5jdGlvbiBHKCQsSixSKXtyZXR1cm4gSnx8Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3QiKSwkLmNsb25lKCkuYWRkU2NhbGVkVmVjdG9yKEosUil9Y29uc3QgdHQ9RC5sZW5ndGgsbHQ9Qi5sZW5ndGg7ZnVuY3Rpb24gaHQoJCxKLFIpe2xldCBTLE8sWTtjb25zdCBaPSQueC1KLngsaj0kLnktSi55LF90PVIueC0kLngsYXQ9Ui55LSQueSxndD1aKloraipqLGt0PVoqYXQtaipfdDtpZihNYXRoLmFicyhrdCk+TnVtYmVyLkVQU0lMT04pe2NvbnN0IHN0PU1hdGguc3FydChndCkseXQ9TWF0aC5zcXJ0KF90Kl90K2F0KmF0KSxLdD1KLngtai9zdCxVdD1KLnkrWi9zdCxidD1SLngtYXQveXQsSHQ9Ui55K190L3l0LFl0PSgoYnQtS3QpKmF0LShIdC1VdCkqX3QpLyhaKmF0LWoqX3QpO1M9S3QrWipZdC0kLngsTz1VdCtqKll0LSQueTtjb25zdCBtZT1TKlMrTypPO2lmKG1lPD0yKXJldHVybiBuZXcgcShTLE8pO1k9TWF0aC5zcXJ0KG1lLzIpfWVsc2V7bGV0IHN0PSExO1o+TnVtYmVyLkVQU0lMT04/X3Q+TnVtYmVyLkVQU0lMT04mJihzdD0hMCk6WjwtTnVtYmVyLkVQU0lMT04/X3Q8LU51bWJlci5FUFNJTE9OJiYoc3Q9ITApOk1hdGguc2lnbihqKT09PU1hdGguc2lnbihhdCkmJihzdD0hMCksc3Q/KFM9LWosTz1aLFk9TWF0aC5zcXJ0KGd0KSk6KFM9WixPPWosWT1NYXRoLnNxcnQoZ3QvMikpfXJldHVybiBuZXcgcShTL1ksTy9ZKX1jb25zdCBSdD1bXTtmb3IobGV0ICQ9MCxKPUgubGVuZ3RoLFI9Si0xLFM9JCsxOyQ8SjskKyssUisrLFMrKylSPT09SiYmKFI9MCksUz09PUomJihTPTApLFJ0WyRdPWh0KEhbJF0sSFtSXSxIW1NdKTtjb25zdCBWdD1bXTtsZXQgSyxydD1SdC5jb25jYXQoKTtmb3IobGV0ICQ9MCxKPU4ubGVuZ3RoOyQ8SjskKyspe2NvbnN0IFI9TlskXTtLPVtdO2ZvcihsZXQgUz0wLE89Ui5sZW5ndGgsWT1PLTEsWj1TKzE7UzxPO1MrKyxZKyssWisrKVk9PT1PJiYoWT0wKSxaPT09TyYmKFo9MCksS1tTXT1odChSW1NdLFJbWV0sUltaXSk7VnQucHVzaChLKSxydD1ydC5jb25jYXQoSyl9Zm9yKGxldCAkPTA7JDxtOyQrKyl7Y29uc3QgSj0kL20sUj1kKk1hdGguY29zKEoqTWF0aC5QSS8yKSxTPXAqTWF0aC5zaW4oSipNYXRoLlBJLzIpK3k7Zm9yKGxldCBPPTAsWT1ILmxlbmd0aDtPPFk7TysrKXtjb25zdCBaPUcoSFtPXSxSdFtPXSxTKTtFdChaLngsWi55LC1SKX1mb3IobGV0IE89MCxZPU4ubGVuZ3RoO088WTtPKyspe2NvbnN0IFo9TltPXTtLPVZ0W09dO2ZvcihsZXQgaj0wLF90PVoubGVuZ3RoO2o8X3Q7aisrKXtjb25zdCBhdD1HKFpbal0sS1tqXSxTKTtFdChhdC54LGF0LnksLVIpfX19Y29uc3QgTXQ9cCt5O2ZvcihsZXQgJD0wOyQ8dHQ7JCsrKXtjb25zdCBKPWY/RyhEWyRdLHJ0WyRdLE10KTpEWyRdO1Q/KE0uY29weShQLm5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKEoueCksdy5jb3B5KFAuYmlub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihKLnkpLEEuY29weShiWzBdKS5hZGQoTSkuYWRkKHcpLEV0KEEueCxBLnksQS56KSk6RXQoSi54LEoueSwwKX1mb3IobGV0ICQ9MTskPD11OyQrKylmb3IobGV0IEo9MDtKPHR0O0orKyl7Y29uc3QgUj1mP0coRFtKXSxydFtKXSxNdCk6RFtKXTtUPyhNLmNvcHkoUC5ub3JtYWxzWyRdKS5tdWx0aXBseVNjYWxhcihSLngpLHcuY29weShQLmJpbm9ybWFsc1skXSkubXVsdGlwbHlTY2FsYXIoUi55KSxBLmNvcHkoYlskXSkuYWRkKE0pLmFkZCh3KSxFdChBLngsQS55LEEueikpOkV0KFIueCxSLnksaC91KiQpfWZvcihsZXQgJD1tLTE7JD49MDskLS0pe2NvbnN0IEo9JC9tLFI9ZCpNYXRoLmNvcyhKKk1hdGguUEkvMiksUz1wKk1hdGguc2luKEoqTWF0aC5QSS8yKSt5O2ZvcihsZXQgTz0wLFk9SC5sZW5ndGg7TzxZO08rKyl7Y29uc3QgWj1HKEhbT10sUnRbT10sUyk7RXQoWi54LFoueSxoK1IpfWZvcihsZXQgTz0wLFk9Ti5sZW5ndGg7TzxZO08rKyl7Y29uc3QgWj1OW09dO0s9VnRbT107Zm9yKGxldCBqPTAsX3Q9Wi5sZW5ndGg7ajxfdDtqKyspe2NvbnN0IGF0PUcoWltqXSxLW2pdLFMpO1Q/RXQoYXQueCxhdC55K2JbdS0xXS55LGJbdS0xXS54K1IpOkV0KGF0LngsYXQueSxoK1IpfX19cHQoKSxFJiZJdCgpO2Z1bmN0aW9uIHB0KCl7Y29uc3QgJD1yLmxlbmd0aC8zO2lmKGYpe2xldCBKPTAsUj10dCpKO2lmKF8pZm9yKGxldCBTPTA7UzxsdDtTKyspe2NvbnN0IE89QltTXTtKdChPWzJdK1IsT1sxXStSLE9bMF0rUil9aWYoSj11K20qMixSPXR0Kkosdilmb3IobGV0IFM9MDtTPGx0O1MrKyl7Y29uc3QgTz1CW1NdO0p0KE9bMF0rUixPWzFdK1IsT1syXStSKX19ZWxzZXtpZihfKWZvcihsZXQgSj0wO0o8bHQ7SisrKXtjb25zdCBSPUJbSl07SnQoUlsyXSxSWzFdLFJbMF0pfWlmKHYpZm9yKGxldCBKPTA7SjxsdDtKKyspe2NvbnN0IFI9QltKXTtKdChSWzBdK3R0KnUsUlsxXSt0dCp1LFJbMl0rdHQqdSl9fW4uYWRkR3JvdXAoJCxyLmxlbmd0aC8zLSQsMCl9ZnVuY3Rpb24gSXQoKXtjb25zdCAkPXIubGVuZ3RoLzM7bGV0IEo9MDtGdChILEopLEorPUgubGVuZ3RoO2ZvcihsZXQgUj0wLFM9Ti5sZW5ndGg7UjxTO1IrKyl7Y29uc3QgTz1OW1JdO0Z0KE8sSiksSis9Ty5sZW5ndGh9bi5hZGRHcm91cCgkLHIubGVuZ3RoLzMtJCwxKX1mdW5jdGlvbiBGdCgkLEope2xldCBSPSQubGVuZ3RoO2Zvcig7LS1SPj0wOyl7Y29uc3QgUz1SO2xldCBPPVItMTtPPDAmJihPPSQubGVuZ3RoLTEpO2ZvcihsZXQgWT0wLFo9dSttKjI7WTxaO1krKyl7Y29uc3Qgaj10dCpZLF90PXR0KihZKzEpLGF0PUorUytqLGd0PUorTytqLGt0PUorTytfdCxzdD1KK1MrX3Q7SShhdCxndCxrdCxzdCl9fX1mdW5jdGlvbiBFdCgkLEosUil7bC5wdXNoKCQpLGwucHVzaChKKSxsLnB1c2goUil9ZnVuY3Rpb24gSnQoJCxKLFIpe290KCQpLG90KEopLG90KFIpO2NvbnN0IFM9ci5sZW5ndGgvMyxPPXguZ2VuZXJhdGVUb3BVVihuLHIsUy0zLFMtMixTLTEpO2l0KE9bMF0pLGl0KE9bMV0pLGl0KE9bMl0pfWZ1bmN0aW9uIEkoJCxKLFIsUyl7b3QoJCksb3QoSiksb3QoUyksb3QoSiksb3QoUiksb3QoUyk7Y29uc3QgTz1yLmxlbmd0aC8zLFk9eC5nZW5lcmF0ZVNpZGVXYWxsVVYobixyLE8tNixPLTMsTy0yLE8tMSk7aXQoWVswXSksaXQoWVsxXSksaXQoWVszXSksaXQoWVsxXSksaXQoWVsyXSksaXQoWVszXSl9ZnVuY3Rpb24gb3QoJCl7ci5wdXNoKGxbJCozKzBdKSxyLnB1c2gobFskKjMrMV0pLHIucHVzaChsWyQqMysyXSl9ZnVuY3Rpb24gaXQoJCl7cy5wdXNoKCQueCkscy5wdXNoKCQueSl9fX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpLGU9dGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyxuPXRoaXMucGFyYW1ldGVycy5vcHRpb25zO3JldHVybiBvUihlLG4sdCl9c3RhdGljIGZyb21KU09OKHQsZSl7Y29uc3Qgbj1bXTtmb3IobGV0IHM9MCxvPXQuc2hhcGVzLmxlbmd0aDtzPG87cysrKXtjb25zdCBhPWVbdC5zaGFwZXNbc11dO24ucHVzaChhKX1jb25zdCByPXQub3B0aW9ucy5leHRydWRlUGF0aDtyZXR1cm4gY29uc29sZS5sb2coci50eXBlKSxyIT09dm9pZCAwJiYodC5vcHRpb25zLmV4dHJ1ZGVQYXRoPW5ldyBuUltgJHtyLnR5cGV9Q3VydmVgXSgpLmZyb21KU09OKHIpKSxuZXcgdGQobix0Lm9wdGlvbnMpfX1jb25zdCBzUj17Z2VuZXJhdGVUb3BVVjpmdW5jdGlvbihpLHQsZSxuLHIpe2NvbnN0IHM9dFtlKjNdLG89dFtlKjMrMV0sYT10W24qM10sbD10W24qMysxXSxjPXRbciozXSx1PXRbciozKzFdO3JldHVybltuZXcgcShzLG8pLG5ldyBxKGEsbCksbmV3IHEoYyx1KV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbihpLHQsZSxuLHIscyl7Y29uc3Qgbz10W2UqM10sYT10W2UqMysxXSxsPXRbZSozKzJdLGM9dFtuKjNdLHU9dFtuKjMrMV0saD10W24qMysyXSxmPXRbciozXSxkPXRbciozKzFdLHA9dFtyKjMrMl0seT10W3MqM10sbT10W3MqMysxXSxnPXRbcyozKzJdO3JldHVybiBNYXRoLmFicyhhLXUpPE1hdGguYWJzKG8tYyk/W25ldyBxKG8sMS1sKSxuZXcgcShjLDEtaCksbmV3IHEoZiwxLXApLG5ldyBxKHksMS1nKV06W25ldyBxKGEsMS1sKSxuZXcgcSh1LDEtaCksbmV3IHEoZCwxLXApLG5ldyBxKG0sMS1nKV19fTtmdW5jdGlvbiBvUihpLHQsZSl7aWYoZS5zaGFwZXM9W10sQXJyYXkuaXNBcnJheShpKSlmb3IobGV0IG49MCxyPWkubGVuZ3RoO248cjtuKyspe2NvbnN0IHM9aVtuXTtlLnNoYXBlcy5wdXNoKHMudXVpZCl9ZWxzZSBlLnNoYXBlcy5wdXNoKGkudXVpZCk7cmV0dXJuIGUub3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LHQpLHQuZXh0cnVkZVBhdGghPT12b2lkIDAmJihlLm9wdGlvbnMuZXh0cnVkZVBhdGg9dC5leHRydWRlUGF0aC50b0pTT04oKSksZX12YXIgYVI9aT0+e2NvbnN0e3NwbGl0OnQsZGVwdGg6ZSxwb2ludHM6bixib3gzOnIsaGFzVG9wOnMsaGFzQm90dG9tOm8saGFzU2lkZTphLHNpZGVSZXBlYXQ6bH09aSxjPW5ldyB0ZChuZXcgd2kobikse2RlcHRoOmUsYmV2ZWxFbmFibGVkOiExLFVWR2VuZXJhdG9yOmlSKHtzcGxpdDp0LGJveDM6cixzaWRlUmVwZWF0Omx9KSxoYXNUb3A6cyxoYXNCb3R0b206byxoYXNTaWRlOmF9KTtyZXR1cm4gclIoKSxjfTtmdW5jdGlvbiBsUihpLHQsZT0wKXtjb25zdCBuPSg5MC10KSpNYXRoLlBJLzE4MCxyPSg5MC1pKSpNYXRoLlBJLzE4MDtyZXR1cm5bZSpNYXRoLnNpbihuKSpNYXRoLmNvcyhyKSxlKk1hdGguY29zKG4pLGUqTWF0aC5zaW4obikqTWF0aC5zaW4ocildfXZhciBjUj0oaSx0LGUpPT5uZXcgUHJvbWlzZSgobixyKT0+e3ZhciBzPWw9Pnt0cnl7YShlLm5leHQobCkpfWNhdGNoKGMpe3IoYyl9fSxvPWw9Pnt0cnl7YShlLnRocm93KGwpKX1jYXRjaChjKXtyKGMpfX0sYT1sPT5sLmRvbmU/bihsLnZhbHVlKTpQcm9taXNlLnJlc29sdmUobC52YWx1ZSkudGhlbihzLG8pO2EoKGU9ZS5hcHBseShpLHQpKS5uZXh0KCkpfSk7ZnVuY3Rpb24gZWQoaSl7dGhpcy5tZXNzYWdlPWl8fCJwcm9taXNlIGNhbmNlbGxlZCIsdGhpcy5zdGFjaz1uZXcgRXJyb3IoKS5zdGFja31lZC5wcm90b3R5cGU9bmV3IEVycm9yLGVkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1FcnJvcixlZC5wcm90b3R5cGUubmFtZT0iQ2FuY2VsbGF0aW9uRXJyb3IiO2Z1bmN0aW9uIG5kKGkpe3RoaXMubWVzc2FnZT1pfHwidGltZW91dCBleGNlZWRlZCIsdGhpcy5zdGFjaz1uZXcgRXJyb3IoKS5zdGFja31uZC5wcm90b3R5cGU9bmV3IEVycm9yLG5kLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1FcnJvcixuZC5wcm90b3R5cGUubmFtZT0iVGltZW91dEVycm9yIjtmdW5jdGlvbiBLeShpKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaSkucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOmlbZV0sZW51bWVyYWJsZTohMH0pfSx7fSl9bGV0IGlkPW51bGw7Y29uc3QgdVI9aT0+e2NvbnN0IHQ9e3J1bihlLG4pe2NvbnN0IHI9bmV3IEZ1bmN0aW9uKCJyZXR1cm4gKCIrZSsiKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyIpO3JldHVybiByLmFwcGx5KHIsbil9LG1ldGhvZHMoKXtyZXR1cm4gT2JqZWN0LmtleXModCl9fTthZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixlPT5jUih2b2lkIDAsW2VdLGZ1bmN0aW9uKih7ZGF0YTpufSl7dHJ5e2NvbnN0IHI9dFtuLm1ldGhvZF07aWYocil7aWQ9bi5pZDt0cnl7Y29uc3Qgcz15aWVsZCByLmFwcGx5KHIsbi5wYXJhbXMpO3MudHJhbnNmZXImJnMubWVzc2FnZT9wb3N0TWVzc2FnZSh7aWQ6bi5pZCxyZXN1bHQ6cy5tZXNzYWdlLGVycm9yOm51bGx9LHMudHJhbnNmZXIpOnBvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpzLGVycm9yOm51bGx9KSxpZD1udWxsfWNhdGNoKHMpe3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpudWxsLGVycm9yOkt5KHMpfSksaWQ9bnVsbH19ZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbWV0aG9kICInK24ubWV0aG9kKyciJyl9Y2F0Y2gocil7cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0Om51bGwsZXJyb3I6S3kocil9KX19KSksT2JqZWN0LmtleXMoaSkuZm9yRWFjaChlPT57dFtlXT1pW2VdfSkscG9zdE1lc3NhZ2UoInJlYWR5Iil9O2Z1bmN0aW9uIEdjKGksdCl7cmV0dXJuIGk9PW51bGx8fHQ9PW51bGw/TmFOOmk8dD8tMTppPnQ/MTppPj10PzA6TmFOfWZ1bmN0aW9uIGhSKGksdCl7cmV0dXJuIGk9PW51bGx8fHQ9PW51bGw/TmFOOnQ8aT8tMTp0Pmk/MTp0Pj1pPzA6TmFOfWZ1bmN0aW9uIGp5KGkpe2xldCB0LGUsbjtpLmxlbmd0aCE9PTI/KHQ9R2MsZT0oYSxsKT0+R2MoaShhKSxsKSxuPShhLGwpPT5pKGEpLWwpOih0PWk9PT1HY3x8aT09PWhSP2k6ZlIsZT1pLG49aSk7ZnVuY3Rpb24gcihhLGwsYz0wLHU9YS5sZW5ndGgpe2lmKGM8dSl7aWYodChsLGwpIT09MClyZXR1cm4gdTtkb3tjb25zdCBoPWMrdT4+PjE7ZShhW2hdLGwpPDA/Yz1oKzE6dT1ofXdoaWxlKGM8dSl9cmV0dXJuIGN9ZnVuY3Rpb24gcyhhLGwsYz0wLHU9YS5sZW5ndGgpe2lmKGM8dSl7aWYodChsLGwpIT09MClyZXR1cm4gdTtkb3tjb25zdCBoPWMrdT4+PjE7ZShhW2hdLGwpPD0wP2M9aCsxOnU9aH13aGlsZShjPHUpfXJldHVybiBjfWZ1bmN0aW9uIG8oYSxsLGM9MCx1PWEubGVuZ3RoKXtjb25zdCBoPXIoYSxsLGMsdS0xKTtyZXR1cm4gaD5jJiZuKGFbaC0xXSxsKT4tbihhW2hdLGwpP2gtMTpofXJldHVybntsZWZ0OnIsY2VudGVyOm8scmlnaHQ6c319ZnVuY3Rpb24gZlIoKXtyZXR1cm4gMH1mdW5jdGlvbiBkUihpKXtyZXR1cm4gaT09PW51bGw/TmFOOitpfWNvbnN0IHBSPWp5KEdjKS5yaWdodDtqeShkUikuY2VudGVyO2Z1bmN0aW9uIFZjKGksdCl7bGV0IGUsbjtpZih0PT09dm9pZCAwKWZvcihjb25zdCByIG9mIGkpciE9bnVsbCYmKGU9PT12b2lkIDA/cj49ciYmKGU9bj1yKTooZT5yJiYoZT1yKSxuPHImJihuPXIpKSk7ZWxzZXtsZXQgcj0tMTtmb3IobGV0IHMgb2YgaSkocz10KHMsKytyLGkpKSE9bnVsbCYmKGU9PT12b2lkIDA/cz49cyYmKGU9bj1zKTooZT5zJiYoZT1zKSxuPHMmJihuPXMpKSl9cmV0dXJuW2Usbl19Y2xhc3MgQ2l7Y29uc3RydWN0b3IoKXt0aGlzLl9wYXJ0aWFscz1uZXcgRmxvYXQ2NEFycmF5KDMyKSx0aGlzLl9uPTB9YWRkKHQpe2NvbnN0IGU9dGhpcy5fcGFydGlhbHM7bGV0IG49MDtmb3IobGV0IHI9MDtyPHRoaXMuX24mJnI8MzI7cisrKXtjb25zdCBzPWVbcl0sbz10K3MsYT1NYXRoLmFicyh0KTxNYXRoLmFicyhzKT90LShvLXMpOnMtKG8tdCk7YSYmKGVbbisrXT1hKSx0PW99cmV0dXJuIGVbbl09dCx0aGlzLl9uPW4rMSx0aGlzfXZhbHVlT2YoKXtjb25zdCB0PXRoaXMuX3BhcnRpYWxzO2xldCBlPXRoaXMuX24sbixyLHMsbz0wO2lmKGU+MCl7Zm9yKG89dFstLWVdO2U+MCYmKG49byxyPXRbLS1lXSxvPW4rcixzPXItKG8tbiksIXMpOyk7ZT4wJiYoczwwJiZ0W2UtMV08MHx8cz4wJiZ0W2UtMV0+MCkmJihyPXMqMixuPW8rcixyPT1uLW8mJihvPW4pKX1yZXR1cm4gb319Y29uc3QgbVI9TWF0aC5zcXJ0KDUwKSxnUj1NYXRoLnNxcnQoMTApLHlSPU1hdGguc3FydCgyKTtmdW5jdGlvbiBIYyhpLHQsZSl7Y29uc3Qgbj0odC1pKS9NYXRoLm1heCgwLGUpLHI9TWF0aC5mbG9vcihNYXRoLmxvZzEwKG4pKSxzPW4vTWF0aC5wb3coMTAsciksbz1zPj1tUj8xMDpzPj1nUj81OnM+PXlSPzI6MTtsZXQgYSxsLGM7cmV0dXJuIHI8MD8oYz1NYXRoLnBvdygxMCwtcikvbyxhPU1hdGgucm91bmQoaSpjKSxsPU1hdGgucm91bmQodCpjKSxhL2M8aSYmKythLGwvYz50JiYtLWwsYz0tYyk6KGM9TWF0aC5wb3coMTAscikqbyxhPU1hdGgucm91bmQoaS9jKSxsPU1hdGgucm91bmQodC9jKSxhKmM8aSYmKythLGwqYz50JiYtLWwpLGw8YSYmLjU8PWUmJmU8Mj9IYyhpLHQsZSoyKTpbYSxsLGNdfWZ1bmN0aW9uIHZSKGksdCxlKXtpZih0PSt0LGk9K2ksZT0rZSwhKGU+MCkpcmV0dXJuW107aWYoaT09PXQpcmV0dXJuW2ldO2NvbnN0IG49dDxpLFtyLHMsb109bj9IYyh0LGksZSk6SGMoaSx0LGUpO2lmKCEocz49cikpcmV0dXJuW107Y29uc3QgYT1zLXIrMSxsPW5ldyBBcnJheShhKTtpZihuKWlmKG88MClmb3IobGV0IGM9MDtjPGE7KytjKWxbY109KHMtYykvLW87ZWxzZSBmb3IobGV0IGM9MDtjPGE7KytjKWxbY109KHMtYykqbztlbHNlIGlmKG88MClmb3IobGV0IGM9MDtjPGE7KytjKWxbY109KHIrYykvLW87ZWxzZSBmb3IobGV0IGM9MDtjPGE7KytjKWxbY109KHIrYykqbztyZXR1cm4gbH1mdW5jdGlvbiByZChpLHQsZSl7cmV0dXJuIHQ9K3QsaT0raSxlPStlLEhjKGksdCxlKVsyXX1mdW5jdGlvbiBfUihpLHQsZSl7dD0rdCxpPStpLGU9K2U7Y29uc3Qgbj10PGkscj1uP3JkKHQsaSxlKTpyZChpLHQsZSk7cmV0dXJuKG4/LTE6MSkqKHI8MD8xLy1yOnIpfWZ1bmN0aW9uIHhSKGksdCl7bGV0IGU9MCxuPTA7aWYodD09PXZvaWQgMClmb3IobGV0IHIgb2YgaSlyIT1udWxsJiYocj0rcik+PXImJigrK2Usbis9cik7ZWxzZXtsZXQgcj0tMTtmb3IobGV0IHMgb2YgaSkocz10KHMsKytyLGkpKSE9bnVsbCYmKHM9K3MpPj1zJiYoKytlLG4rPXMpfWlmKGUpcmV0dXJuIG4vZX1mdW5jdGlvbipNUihpKXtmb3IoY29uc3QgdCBvZiBpKXlpZWxkKlRTKHQpfWZ1bmN0aW9uIGNhKGkpe3JldHVybiBBcnJheS5mcm9tKE1SKGkpKX12YXIgYWU9MWUtNixXYz0xZS0xMix0ZT1NYXRoLlBJLGRuPXRlLzIsJGM9dGUvNCxwbj10ZSoyLGJlPTE4MC90ZSx6dD10ZS8xODAscGU9TWF0aC5hYnMsc2Q9TWF0aC5hdGFuLFVuPU1hdGguYXRhbjIsV3Q9TWF0aC5jb3MsU1I9TWF0aC5leHAsb2Q9TWF0aC5oeXBvdCxiUj1NYXRoLmxvZyxEdD1NYXRoLnNpbix3Uj1NYXRoLnNpZ258fGZ1bmN0aW9uKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH0sUmk9TWF0aC5zcXJ0LEFSPU1hdGgudGFuO2Z1bmN0aW9uIEVSKGkpe3JldHVybiBpPjE/MDppPC0xP3RlOk1hdGguYWNvcyhpKX1mdW5jdGlvbiBQaShpKXtyZXR1cm4gaT4xP2RuOmk8LTE/LWRuOk1hdGguYXNpbihpKX1mdW5jdGlvbiBReShpKXtyZXR1cm4oaT1EdChpLzIpKSppfWZ1bmN0aW9uIFllKCl7fWZ1bmN0aW9uIFhjKGksdCl7aSYmZXYuaGFzT3duUHJvcGVydHkoaS50eXBlKSYmZXZbaS50eXBlXShpLHQpfXZhciB0dj17RmVhdHVyZTpmdW5jdGlvbihpLHQpe1hjKGkuZ2VvbWV0cnksdCl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuZmVhdHVyZXMsbj0tMSxyPWUubGVuZ3RoOysrbjxyOylYYyhlW25dLmdlb21ldHJ5LHQpfX0sZXY9e1NwaGVyZTpmdW5jdGlvbihpLHQpe3Quc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKGksdCl7aT1pLmNvb3JkaW5hdGVzLHQucG9pbnQoaVswXSxpWzFdLGlbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxyPWUubGVuZ3RoOysrbjxyOylpPWVbbl0sdC5wb2ludChpWzBdLGlbMV0saVsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24oaSx0KXthZChpLmNvb3JkaW5hdGVzLHQsMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscj1lLmxlbmd0aDsrK248cjspYWQoZVtuXSx0LDApfSxQb2x5Z29uOmZ1bmN0aW9uKGksdCl7bnYoaS5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxyPWUubGVuZ3RoOysrbjxyOyludihlW25dLHQpfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5nZW9tZXRyaWVzLG49LTEscj1lLmxlbmd0aDsrK248cjspWGMoZVtuXSx0KX19O2Z1bmN0aW9uIGFkKGksdCxlKXt2YXIgbj0tMSxyPWkubGVuZ3RoLWUscztmb3IodC5saW5lU3RhcnQoKTsrK248cjspcz1pW25dLHQucG9pbnQoc1swXSxzWzFdLHNbMl0pO3QubGluZUVuZCgpfWZ1bmN0aW9uIG52KGksdCl7dmFyIGU9LTEsbj1pLmxlbmd0aDtmb3IodC5wb2x5Z29uU3RhcnQoKTsrK2U8bjspYWQoaVtlXSx0LDEpO3QucG9seWdvbkVuZCgpfWZ1bmN0aW9uIHFjKGksdCl7aSYmdHYuaGFzT3duUHJvcGVydHkoaS50eXBlKT90dltpLnR5cGVdKGksdCk6WGMoaSx0KX12YXIgWWM9bmV3IENpLGl2PW5ldyBDaSxydixzdixsZCxjZCx1ZCxJaT17cG9pbnQ6WWUsbGluZVN0YXJ0OlllLGxpbmVFbmQ6WWUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WWM9bmV3IENpLElpLmxpbmVTdGFydD1UUixJaS5saW5lRW5kPUNSfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIGk9K1ljO2l2LmFkZChpPDA/cG4raTppKSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1ZZX0sc3BoZXJlOmZ1bmN0aW9uKCl7aXYuYWRkKHBuKX19O2Z1bmN0aW9uIFRSKCl7SWkucG9pbnQ9UlJ9ZnVuY3Rpb24gQ1IoKXtvdihydixzdil9ZnVuY3Rpb24gUlIoaSx0KXtJaS5wb2ludD1vdixydj1pLHN2PXQsaSo9enQsdCo9enQsbGQ9aSxjZD1XdCh0PXQvMiskYyksdWQ9RHQodCl9ZnVuY3Rpb24gb3YoaSx0KXtpKj16dCx0Kj16dCx0PXQvMiskYzt2YXIgZT1pLWxkLG49ZT49MD8xOi0xLHI9biplLHM9V3QodCksbz1EdCh0KSxhPXVkKm8sbD1jZCpzK2EqV3QociksYz1hKm4qRHQocik7WWMuYWRkKFVuKGMsbCkpLGxkPWksY2Q9cyx1ZD1vfWZ1bmN0aW9uIFpjKGkpe3JldHVybltVbihpWzFdLGlbMF0pLFBpKGlbMl0pXX1mdW5jdGlvbiB6cihpKXt2YXIgdD1pWzBdLGU9aVsxXSxuPVd0KGUpO3JldHVybltuKld0KHQpLG4qRHQodCksRHQoZSldfWZ1bmN0aW9uIEpjKGksdCl7cmV0dXJuIGlbMF0qdFswXStpWzFdKnRbMV0raVsyXSp0WzJdfWZ1bmN0aW9uIEZzKGksdCl7cmV0dXJuW2lbMV0qdFsyXS1pWzJdKnRbMV0saVsyXSp0WzBdLWlbMF0qdFsyXSxpWzBdKnRbMV0taVsxXSp0WzBdXX1mdW5jdGlvbiBoZChpLHQpe2lbMF0rPXRbMF0saVsxXSs9dFsxXSxpWzJdKz10WzJdfWZ1bmN0aW9uIEtjKGksdCl7cmV0dXJuW2lbMF0qdCxpWzFdKnQsaVsyXSp0XX1mdW5jdGlvbiBqYyhpKXt2YXIgdD1SaShpWzBdKmlbMF0raVsxXSppWzFdK2lbMl0qaVsyXSk7aVswXS89dCxpWzFdLz10LGlbMl0vPXR9dmFyIHZlLG1uLHdlLEFuLGtyLGF2LGx2LE9zLHVhLHRyLExpLERpPXtwb2ludDpmZCxsaW5lU3RhcnQ6dXYsbGluZUVuZDpodixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtEaS5wb2ludD1mdixEaS5saW5lU3RhcnQ9UFIsRGkubGluZUVuZD1JUix1YT1uZXcgQ2ksSWkucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtJaS5wb2x5Z29uRW5kKCksRGkucG9pbnQ9ZmQsRGkubGluZVN0YXJ0PXV2LERpLmxpbmVFbmQ9aHYsWWM8MD8odmU9LSh3ZT0xODApLG1uPS0oQW49OTApKTp1YT5hZT9Bbj05MDp1YTwtYWUmJihtbj0tOTApLExpWzBdPXZlLExpWzFdPXdlfSxzcGhlcmU6ZnVuY3Rpb24oKXt2ZT0tKHdlPTE4MCksbW49LShBbj05MCl9fTtmdW5jdGlvbiBmZChpLHQpe3RyLnB1c2goTGk9W3ZlPWksd2U9aV0pLHQ8bW4mJihtbj10KSx0PkFuJiYoQW49dCl9ZnVuY3Rpb24gY3YoaSx0KXt2YXIgZT16cihbaSp6dCx0Knp0XSk7aWYoT3Mpe3ZhciBuPUZzKE9zLGUpLHI9W25bMV0sLW5bMF0sMF0scz1GcyhyLG4pO2pjKHMpLHM9WmMocyk7dmFyIG89aS1rcixhPW8+MD8xOi0xLGw9c1swXSpiZSphLGMsdT1wZShvKT4xODA7dV4oYSprcjxsJiZsPGEqaSk/KGM9c1sxXSpiZSxjPkFuJiYoQW49YykpOihsPShsKzM2MCklMzYwLTE4MCx1XihhKmtyPGwmJmw8YSppKT8oYz0tc1sxXSpiZSxjPG1uJiYobW49YykpOih0PG1uJiYobW49dCksdD5BbiYmKEFuPXQpKSksdT9pPGtyP0VuKHZlLGkpPkVuKHZlLHdlKSYmKHdlPWkpOkVuKGksd2UpPkVuKHZlLHdlKSYmKHZlPWkpOndlPj12ZT8oaTx2ZSYmKHZlPWkpLGk+d2UmJih3ZT1pKSk6aT5rcj9Fbih2ZSxpKT5Fbih2ZSx3ZSkmJih3ZT1pKTpFbihpLHdlKT5Fbih2ZSx3ZSkmJih2ZT1pKX1lbHNlIHRyLnB1c2goTGk9W3ZlPWksd2U9aV0pO3Q8bW4mJihtbj10KSx0PkFuJiYoQW49dCksT3M9ZSxrcj1pfWZ1bmN0aW9uIHV2KCl7RGkucG9pbnQ9Y3Z9ZnVuY3Rpb24gaHYoKXtMaVswXT12ZSxMaVsxXT13ZSxEaS5wb2ludD1mZCxPcz1udWxsfWZ1bmN0aW9uIGZ2KGksdCl7aWYoT3Mpe3ZhciBlPWkta3I7dWEuYWRkKHBlKGUpPjE4MD9lKyhlPjA/MzYwOi0zNjApOmUpfWVsc2UgYXY9aSxsdj10O0lpLnBvaW50KGksdCksY3YoaSx0KX1mdW5jdGlvbiBQUigpe0lpLmxpbmVTdGFydCgpfWZ1bmN0aW9uIElSKCl7ZnYoYXYsbHYpLElpLmxpbmVFbmQoKSxwZSh1YSk+YWUmJih2ZT0tKHdlPTE4MCkpLExpWzBdPXZlLExpWzFdPXdlLE9zPW51bGx9ZnVuY3Rpb24gRW4oaSx0KXtyZXR1cm4odC09aSk8MD90KzM2MDp0fWZ1bmN0aW9uIExSKGksdCl7cmV0dXJuIGlbMF0tdFswXX1mdW5jdGlvbiBkdihpLHQpe3JldHVybiBpWzBdPD1pWzFdP2lbMF08PXQmJnQ8PWlbMV06dDxpWzBdfHxpWzFdPHR9ZnVuY3Rpb24gcHYoaSl7dmFyIHQsZSxuLHIscyxvLGE7aWYoQW49d2U9LSh2ZT1tbj0xLzApLHRyPVtdLHFjKGksRGkpLGU9dHIubGVuZ3RoKXtmb3IodHIuc29ydChMUiksdD0xLG49dHJbMF0scz1bbl07dDxlOysrdClyPXRyW3RdLGR2KG4sclswXSl8fGR2KG4sclsxXSk/KEVuKG5bMF0sclsxXSk+RW4oblswXSxuWzFdKSYmKG5bMV09clsxXSksRW4oclswXSxuWzFdKT5FbihuWzBdLG5bMV0pJiYoblswXT1yWzBdKSk6cy5wdXNoKG49cik7Zm9yKG89LTEvMCxlPXMubGVuZ3RoLTEsdD0wLG49c1tlXTt0PD1lO249ciwrK3Qpcj1zW3RdLChhPUVuKG5bMV0sclswXSkpPm8mJihvPWEsdmU9clswXSx3ZT1uWzFdKX1yZXR1cm4gdHI9TGk9bnVsbCx2ZT09PTEvMHx8bW49PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbdmUsbW5dLFt3ZSxBbl1dfXZhciBoYSxRYyx0dSxldSxudSxpdSxydSxzdSxkZCxwZCxtZCxtdixndixybixzbixvbiwkbj17c3BoZXJlOlllLHBvaW50OmdkLGxpbmVTdGFydDp5dixsaW5lRW5kOnZ2LHBvbHlnb25TdGFydDpmdW5jdGlvbigpeyRuLmxpbmVTdGFydD1OUiwkbi5saW5lRW5kPUZSfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7JG4ubGluZVN0YXJ0PXl2LCRuLmxpbmVFbmQ9dnZ9fTtmdW5jdGlvbiBnZChpLHQpe2kqPXp0LHQqPXp0O3ZhciBlPVd0KHQpO2ZhKGUqV3QoaSksZSpEdChpKSxEdCh0KSl9ZnVuY3Rpb24gZmEoaSx0LGUpeysraGEsdHUrPShpLXR1KS9oYSxldSs9KHQtZXUpL2hhLG51Kz0oZS1udSkvaGF9ZnVuY3Rpb24geXYoKXskbi5wb2ludD1EUn1mdW5jdGlvbiBEUihpLHQpe2kqPXp0LHQqPXp0O3ZhciBlPVd0KHQpO3JuPWUqV3QoaSksc249ZSpEdChpKSxvbj1EdCh0KSwkbi5wb2ludD1VUixmYShybixzbixvbil9ZnVuY3Rpb24gVVIoaSx0KXtpKj16dCx0Kj16dDt2YXIgZT1XdCh0KSxuPWUqV3QoaSkscj1lKkR0KGkpLHM9RHQodCksbz1VbihSaSgobz1zbipzLW9uKnIpKm8rKG89b24qbi1ybipzKSpvKyhvPXJuKnItc24qbikqbykscm4qbitzbipyK29uKnMpO1FjKz1vLGl1Kz1vKihybisocm49bikpLHJ1Kz1vKihzbisoc249cikpLHN1Kz1vKihvbisob249cykpLGZhKHJuLHNuLG9uKX1mdW5jdGlvbiB2digpeyRuLnBvaW50PWdkfWZ1bmN0aW9uIE5SKCl7JG4ucG9pbnQ9T1J9ZnVuY3Rpb24gRlIoKXtfdihtdixndiksJG4ucG9pbnQ9Z2R9ZnVuY3Rpb24gT1IoaSx0KXttdj1pLGd2PXQsaSo9enQsdCo9enQsJG4ucG9pbnQ9X3Y7dmFyIGU9V3QodCk7cm49ZSpXdChpKSxzbj1lKkR0KGkpLG9uPUR0KHQpLGZhKHJuLHNuLG9uKX1mdW5jdGlvbiBfdihpLHQpe2kqPXp0LHQqPXp0O3ZhciBlPVd0KHQpLG49ZSpXdChpKSxyPWUqRHQoaSkscz1EdCh0KSxvPXNuKnMtb24qcixhPW9uKm4tcm4qcyxsPXJuKnItc24qbixjPW9kKG8sYSxsKSx1PVBpKGMpLGg9YyYmLXUvYztkZC5hZGQoaCpvKSxwZC5hZGQoaCphKSxtZC5hZGQoaCpsKSxRYys9dSxpdSs9dSoocm4rKHJuPW4pKSxydSs9dSooc24rKHNuPXIpKSxzdSs9dSoob24rKG9uPXMpKSxmYShybixzbixvbil9ZnVuY3Rpb24geHYoaSl7aGE9UWM9dHU9ZXU9bnU9aXU9cnU9c3U9MCxkZD1uZXcgQ2kscGQ9bmV3IENpLG1kPW5ldyBDaSxxYyhpLCRuKTt2YXIgdD0rZGQsZT0rcGQsbj0rbWQscj1vZCh0LGUsbik7cmV0dXJuIHI8V2MmJih0PWl1LGU9cnUsbj1zdSxRYzxhZSYmKHQ9dHUsZT1ldSxuPW51KSxyPW9kKHQsZSxuKSxyPFdjKT9bTmFOLE5hTl06W1VuKGUsdCkqYmUsUGkobi9yKSpiZV19ZnVuY3Rpb24geWQoaSx0KXtmdW5jdGlvbiBlKG4scil7cmV0dXJuIG49aShuLHIpLHQoblswXSxuWzFdKX1yZXR1cm4gaS5pbnZlcnQmJnQuaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gbj10LmludmVydChuLHIpLG4mJmkuaW52ZXJ0KG5bMF0sblsxXSl9KSxlfWZ1bmN0aW9uIHZkKGksdCl7cmV0dXJuIHBlKGkpPnRlJiYoaS09TWF0aC5yb3VuZChpL3BuKSpwbiksW2ksdF19dmQuaW52ZXJ0PXZkO2Z1bmN0aW9uIE12KGksdCxlKXtyZXR1cm4oaSU9cG4pP3R8fGU/eWQoYnYoaSksd3YodCxlKSk6YnYoaSk6dHx8ZT93dih0LGUpOnZkfWZ1bmN0aW9uIFN2KGkpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0Kz1pLHBlKHQpPnRlJiYodC09TWF0aC5yb3VuZCh0L3BuKSpwbiksW3QsZV19fWZ1bmN0aW9uIGJ2KGkpe3ZhciB0PVN2KGkpO3JldHVybiB0LmludmVydD1TdigtaSksdH1mdW5jdGlvbiB3dihpLHQpe3ZhciBlPVd0KGkpLG49RHQoaSkscj1XdCh0KSxzPUR0KHQpO2Z1bmN0aW9uIG8oYSxsKXt2YXIgYz1XdChsKSx1PVd0KGEpKmMsaD1EdChhKSpjLGY9RHQobCksZD1mKmUrdSpuO3JldHVybltVbihoKnItZCpzLHUqZS1mKm4pLFBpKGQqcitoKnMpXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24oYSxsKXt2YXIgYz1XdChsKSx1PVd0KGEpKmMsaD1EdChhKSpjLGY9RHQobCksZD1mKnItaCpzO3JldHVybltVbihoKnIrZipzLHUqZStkKm4pLFBpKGQqZS11Km4pXX0sb31mdW5jdGlvbiBBdihpKXtpPU12KGlbMF0qenQsaVsxXSp6dCxpLmxlbmd0aD4yP2lbMl0qenQ6MCk7ZnVuY3Rpb24gdChlKXtyZXR1cm4gZT1pKGVbMF0qenQsZVsxXSp6dCksZVswXSo9YmUsZVsxXSo9YmUsZX1yZXR1cm4gdC5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9aS5pbnZlcnQoZVswXSp6dCxlWzFdKnp0KSxlWzBdKj1iZSxlWzFdKj1iZSxlfSx0fWZ1bmN0aW9uIEJSKGksdCxlLG4scixzKXtpZihlKXt2YXIgbz1XdCh0KSxhPUR0KHQpLGw9biplO3I9PW51bGw/KHI9dCtuKnBuLHM9dC1sLzIpOihyPUV2KG8scikscz1FdihvLHMpLChuPjA/cjxzOnI+cykmJihyKz1uKnBuKSk7Zm9yKHZhciBjLHU9cjtuPjA/dT5zOnU8czt1LT1sKWM9WmMoW28sLWEqV3QodSksLWEqRHQodSldKSxpLnBvaW50KGNbMF0sY1sxXSl9fWZ1bmN0aW9uIEV2KGksdCl7dD16cih0KSx0WzBdLT1pLGpjKHQpO3ZhciBlPUVSKC10WzFdKTtyZXR1cm4oKC10WzJdPDA/LWU6ZSkrcG4tYWUpJXBufWZ1bmN0aW9uIFR2KCl7dmFyIGk9W10sdDtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24oZSxuLHIpe3QucHVzaChbZSxuLHJdKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7aS5wdXNoKHQ9W10pfSxsaW5lRW5kOlllLHJlam9pbjpmdW5jdGlvbigpe2kubGVuZ3RoPjEmJmkucHVzaChpLnBvcCgpLmNvbmNhdChpLnNoaWZ0KCkpKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIGU9aTtyZXR1cm4gaT1bXSx0PW51bGwsZX19fWZ1bmN0aW9uIG91KGksdCl7cmV0dXJuIHBlKGlbMF0tdFswXSk8YWUmJnBlKGlbMV0tdFsxXSk8YWV9ZnVuY3Rpb24gYXUoaSx0LGUsbil7dGhpcy54PWksdGhpcy56PXQsdGhpcy5vPWUsdGhpcy5lPW4sdGhpcy52PSExLHRoaXMubj10aGlzLnA9bnVsbH1mdW5jdGlvbiBDdihpLHQsZSxuLHIpe3ZhciBzPVtdLG89W10sYSxsO2lmKGkuZm9yRWFjaChmdW5jdGlvbihwKXtpZighKCh5PXAubGVuZ3RoLTEpPD0wKSl7dmFyIHksbT1wWzBdLGc9cFt5XSx4O2lmKG91KG0sZykpe2lmKCFtWzJdJiYhZ1syXSl7Zm9yKHIubGluZVN0YXJ0KCksYT0wO2E8eTsrK2Epci5wb2ludCgobT1wW2FdKVswXSxtWzFdKTtyLmxpbmVFbmQoKTtyZXR1cm59Z1swXSs9MiphZX1zLnB1c2goeD1uZXcgYXUobSxwLG51bGwsITApKSxvLnB1c2goeC5vPW5ldyBhdShtLG51bGwseCwhMSkpLHMucHVzaCh4PW5ldyBhdShnLHAsbnVsbCwhMSkpLG8ucHVzaCh4Lm89bmV3IGF1KGcsbnVsbCx4LCEwKSl9fSksISFzLmxlbmd0aCl7Zm9yKG8uc29ydCh0KSxSdihzKSxSdihvKSxhPTAsbD1vLmxlbmd0aDthPGw7KythKW9bYV0uZT1lPSFlO2Zvcih2YXIgYz1zWzBdLHUsaDs7KXtmb3IodmFyIGY9YyxkPSEwO2YudjspaWYoKGY9Zi5uKT09PWMpcmV0dXJuO3U9Zi56LHIubGluZVN0YXJ0KCk7ZG97aWYoZi52PWYuby52PSEwLGYuZSl7aWYoZClmb3IoYT0wLGw9dS5sZW5ndGg7YTxsOysrYSlyLnBvaW50KChoPXVbYV0pWzBdLGhbMV0pO2Vsc2UgbihmLngsZi5uLngsMSxyKTtmPWYubn1lbHNle2lmKGQpZm9yKHU9Zi5wLnosYT11Lmxlbmd0aC0xO2E+PTA7LS1hKXIucG9pbnQoKGg9dVthXSlbMF0saFsxXSk7ZWxzZSBuKGYueCxmLnAueCwtMSxyKTtmPWYucH1mPWYubyx1PWYueixkPSFkfXdoaWxlKCFmLnYpO3IubGluZUVuZCgpfX19ZnVuY3Rpb24gUnYoaSl7aWYodD1pLmxlbmd0aCl7Zm9yKHZhciB0LGU9MCxuPWlbMF0scjsrK2U8dDspbi5uPXI9aVtlXSxyLnA9bixuPXI7bi5uPXI9aVswXSxyLnA9bn19ZnVuY3Rpb24gX2QoaSl7cmV0dXJuIHBlKGlbMF0pPD10ZT9pWzBdOndSKGlbMF0pKigocGUoaVswXSkrdGUpJXBuLXRlKX1mdW5jdGlvbiBQdihpLHQpe3ZhciBlPV9kKHQpLG49dFsxXSxyPUR0KG4pLHM9W0R0KGUpLC1XdChlKSwwXSxvPTAsYT0wLGw9bmV3IENpO3I9PT0xP249ZG4rYWU6cj09PS0xJiYobj0tZG4tYWUpO2Zvcih2YXIgYz0wLHU9aS5sZW5ndGg7Yzx1OysrYylpZihmPShoPWlbY10pLmxlbmd0aClmb3IodmFyIGgsZixkPWhbZi0xXSxwPV9kKGQpLHk9ZFsxXS8yKyRjLG09RHQoeSksZz1XdCh5KSx4PTA7eDxmOysreCxwPV8sbT1iLGc9VCxkPXYpe3ZhciB2PWhbeF0sXz1fZCh2KSxFPXZbMV0vMiskYyxiPUR0KEUpLFQ9V3QoRSksUD1fLXAsdz1QPj0wPzE6LTEsTT13KlAsQT1NPnRlLEY9bSpiO2lmKGwuYWRkKFVuKEYqdypEdChNKSxnKlQrRipXdChNKSkpLG8rPUE/UCt3KnBuOlAsQV5wPj1lXl8+PWUpe3ZhciBEPUZzKHpyKGQpLHpyKHYpKTtqYyhEKTt2YXIgTj1GcyhzLEQpO2pjKE4pO3ZhciBVPShBXlA+PTA/LTE6MSkqUGkoTlsyXSk7KG4+VXx8bj09PVUmJihEWzBdfHxEWzFdKSkmJihhKz1BXlA+PTA/MTotMSl9fXJldHVybihvPC1hZXx8bzxhZSYmbDwtV2MpXmEmMX1mdW5jdGlvbiBJdihpLHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIHM9dChyKSxvPVR2KCksYT10KG8pLGw9ITEsYyx1LGgsZj17cG9pbnQ6ZCxsaW5lU3RhcnQ6eSxsaW5lRW5kOm0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zi5wb2ludD1nLGYubGluZVN0YXJ0PXgsZi5saW5lRW5kPXYsdT1bXSxjPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zi5wb2ludD1kLGYubGluZVN0YXJ0PXksZi5saW5lRW5kPW0sdT1jYSh1KTt2YXIgXz1QdihjLG4pO3UubGVuZ3RoPyhsfHwoci5wb2x5Z29uU3RhcnQoKSxsPSEwKSxDdih1LGtSLF8sZSxyKSk6XyYmKGx8fChyLnBvbHlnb25TdGFydCgpLGw9ITApLHIubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxyKSxyLmxpbmVFbmQoKSksbCYmKHIucG9seWdvbkVuZCgpLGw9ITEpLHU9Yz1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtyLnBvbHlnb25TdGFydCgpLHIubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxyKSxyLmxpbmVFbmQoKSxyLnBvbHlnb25FbmQoKX19O2Z1bmN0aW9uIGQoXyxFKXtpKF8sRSkmJnIucG9pbnQoXyxFKX1mdW5jdGlvbiBwKF8sRSl7cy5wb2ludChfLEUpfWZ1bmN0aW9uIHkoKXtmLnBvaW50PXAscy5saW5lU3RhcnQoKX1mdW5jdGlvbiBtKCl7Zi5wb2ludD1kLHMubGluZUVuZCgpfWZ1bmN0aW9uIGcoXyxFKXtoLnB1c2goW18sRV0pLGEucG9pbnQoXyxFKX1mdW5jdGlvbiB4KCl7YS5saW5lU3RhcnQoKSxoPVtdfWZ1bmN0aW9uIHYoKXtnKGhbMF1bMF0saFswXVsxXSksYS5saW5lRW5kKCk7dmFyIF89YS5jbGVhbigpLEU9by5yZXN1bHQoKSxiLFQ9RS5sZW5ndGgsUCx3LE07aWYoaC5wb3AoKSxjLnB1c2goaCksaD1udWxsLCEhVCl7aWYoXyYxKXtpZih3PUVbMF0sKFA9dy5sZW5ndGgtMSk+MCl7Zm9yKGx8fChyLnBvbHlnb25TdGFydCgpLGw9ITApLHIubGluZVN0YXJ0KCksYj0wO2I8UDsrK2Ipci5wb2ludCgoTT13W2JdKVswXSxNWzFdKTtyLmxpbmVFbmQoKX1yZXR1cm59VD4xJiZfJjImJkUucHVzaChFLnBvcCgpLmNvbmNhdChFLnNoaWZ0KCkpKSx1LnB1c2goRS5maWx0ZXIoelIpKX19cmV0dXJuIGZ9fWZ1bmN0aW9uIHpSKGkpe3JldHVybiBpLmxlbmd0aD4xfWZ1bmN0aW9uIGtSKGksdCl7cmV0dXJuKChpPWkueClbMF08MD9pWzFdLWRuLWFlOmRuLWlbMV0pLSgodD10LngpWzBdPDA/dFsxXS1kbi1hZTpkbi10WzFdKX12YXIgTHY9SXYoZnVuY3Rpb24oKXtyZXR1cm4hMH0sR1IsSFIsWy10ZSwtZG5dKTtmdW5jdGlvbiBHUihpKXt2YXIgdD1OYU4sZT1OYU4sbj1OYU4scjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7aS5saW5lU3RhcnQoKSxyPTF9LHBvaW50OmZ1bmN0aW9uKHMsbyl7dmFyIGE9cz4wP3RlOi10ZSxsPXBlKHMtdCk7cGUobC10ZSk8YWU/KGkucG9pbnQodCxlPShlK28pLzI+MD9kbjotZG4pLGkucG9pbnQobixlKSxpLmxpbmVFbmQoKSxpLmxpbmVTdGFydCgpLGkucG9pbnQoYSxlKSxpLnBvaW50KHMsZSkscj0wKTpuIT09YSYmbD49dGUmJihwZSh0LW4pPGFlJiYodC09biphZSkscGUocy1hKTxhZSYmKHMtPWEqYWUpLGU9VlIodCxlLHMsbyksaS5wb2ludChuLGUpLGkubGluZUVuZCgpLGkubGluZVN0YXJ0KCksaS5wb2ludChhLGUpLHI9MCksaS5wb2ludCh0PXMsZT1vKSxuPWF9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtpLmxpbmVFbmQoKSx0PWU9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLXJ9fX1mdW5jdGlvbiBWUihpLHQsZSxuKXt2YXIgcixzLG89RHQoaS1lKTtyZXR1cm4gcGUobyk+YWU/c2QoKER0KHQpKihzPVd0KG4pKSpEdChlKS1EdChuKSoocj1XdCh0KSkqRHQoaSkpLyhyKnMqbykpOih0K24pLzJ9ZnVuY3Rpb24gSFIoaSx0LGUsbil7dmFyIHI7aWYoaT09bnVsbClyPWUqZG4sbi5wb2ludCgtdGUsciksbi5wb2ludCgwLHIpLG4ucG9pbnQodGUsciksbi5wb2ludCh0ZSwwKSxuLnBvaW50KHRlLC1yKSxuLnBvaW50KDAsLXIpLG4ucG9pbnQoLXRlLC1yKSxuLnBvaW50KC10ZSwwKSxuLnBvaW50KC10ZSxyKTtlbHNlIGlmKHBlKGlbMF0tdFswXSk+YWUpe3ZhciBzPWlbMF08dFswXT90ZTotdGU7cj1lKnMvMixuLnBvaW50KC1zLHIpLG4ucG9pbnQoMCxyKSxuLnBvaW50KHMscil9ZWxzZSBuLnBvaW50KHRbMF0sdFsxXSl9ZnVuY3Rpb24gV1IoaSl7dmFyIHQ9V3QoaSksZT02Knp0LG49dD4wLHI9cGUodCk+YWU7ZnVuY3Rpb24gcyh1LGgsZixkKXtCUihkLGksZSxmLHUsaCl9ZnVuY3Rpb24gbyh1LGgpe3JldHVybiBXdCh1KSpXdChoKT50fWZ1bmN0aW9uIGEodSl7dmFyIGgsZixkLHAseTtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7cD1kPSExLHk9MX0scG9pbnQ6ZnVuY3Rpb24obSxnKXt2YXIgeD1bbSxnXSx2LF89byhtLGcpLEU9bj9fPzA6YyhtLGcpOl8/YyhtKyhtPDA/dGU6LXRlKSxnKTowO2lmKCFoJiYocD1kPV8pJiZ1LmxpbmVTdGFydCgpLF8hPT1kJiYodj1sKGgseCksKCF2fHxvdShoLHYpfHxvdSh4LHYpKSYmKHhbMl09MSkpLF8hPT1kKXk9MCxfPyh1LmxpbmVTdGFydCgpLHY9bCh4LGgpLHUucG9pbnQodlswXSx2WzFdKSk6KHY9bChoLHgpLHUucG9pbnQodlswXSx2WzFdLDIpLHUubGluZUVuZCgpKSxoPXY7ZWxzZSBpZihyJiZoJiZuXl8pe3ZhciBiOyEoRSZmKSYmKGI9bCh4LGgsITApKSYmKHk9MCxuPyh1LmxpbmVTdGFydCgpLHUucG9pbnQoYlswXVswXSxiWzBdWzFdKSx1LnBvaW50KGJbMV1bMF0sYlsxXVsxXSksdS5saW5lRW5kKCkpOih1LnBvaW50KGJbMV1bMF0sYlsxXVsxXSksdS5saW5lRW5kKCksdS5saW5lU3RhcnQoKSx1LnBvaW50KGJbMF1bMF0sYlswXVsxXSwzKSkpfV8mJighaHx8IW91KGgseCkpJiZ1LnBvaW50KHhbMF0seFsxXSksaD14LGQ9XyxmPUV9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtkJiZ1LmxpbmVFbmQoKSxoPW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIHl8KHAmJmQpPDwxfX19ZnVuY3Rpb24gbCh1LGgsZil7dmFyIGQ9enIodSkscD16cihoKSx5PVsxLDAsMF0sbT1GcyhkLHApLGc9SmMobSxtKSx4PW1bMF0sdj1nLXgqeDtpZighdilyZXR1cm4hZiYmdTt2YXIgXz10KmcvdixFPS10KngvdixiPUZzKHksbSksVD1LYyh5LF8pLFA9S2MobSxFKTtoZChULFApO3ZhciB3PWIsTT1KYyhULHcpLEE9SmModyx3KSxGPU0qTS1BKihKYyhULFQpLTEpO2lmKCEoRjwwKSl7dmFyIEQ9UmkoRiksTj1LYyh3LCgtTS1EKS9BKTtpZihoZChOLFQpLE49WmMoTiksIWYpcmV0dXJuIE47dmFyIFU9dVswXSxCPWhbMF0sSD11WzFdLEc9aFsxXSx0dDtCPFUmJih0dD1VLFU9QixCPXR0KTt2YXIgbHQ9Qi1VLGh0PXBlKGx0LXRlKTxhZSxSdD1odHx8bHQ8YWU7aWYoIWh0JiZHPEgmJih0dD1ILEg9RyxHPXR0KSxSdD9odD9IK0c+MF5OWzFdPChwZShOWzBdLVUpPGFlP0g6Ryk6SDw9TlsxXSYmTlsxXTw9RzpsdD50ZV4oVTw9TlswXSYmTlswXTw9Qikpe3ZhciBWdD1LYyh3LCgtTStEKS9BKTtyZXR1cm4gaGQoVnQsVCksW04sWmMoVnQpXX19fWZ1bmN0aW9uIGModSxoKXt2YXIgZj1uP2k6dGUtaSxkPTA7cmV0dXJuIHU8LWY/ZHw9MTp1PmYmJihkfD0yKSxoPC1mP2R8PTQ6aD5mJiYoZHw9OCksZH1yZXR1cm4gSXYobyxhLHMsbj9bMCwtaV06Wy10ZSxpLXRlXSl9ZnVuY3Rpb24gJFIoaSx0LGUsbixyLHMpe3ZhciBvPWlbMF0sYT1pWzFdLGw9dFswXSxjPXRbMV0sdT0wLGg9MSxmPWwtbyxkPWMtYSxwO2lmKHA9ZS1vLCEoIWYmJnA+MCkpe2lmKHAvPWYsZjwwKXtpZihwPHUpcmV0dXJuO3A8aCYmKGg9cCl9ZWxzZSBpZihmPjApe2lmKHA+aClyZXR1cm47cD51JiYodT1wKX1pZihwPXItbywhKCFmJiZwPDApKXtpZihwLz1mLGY8MCl7aWYocD5oKXJldHVybjtwPnUmJih1PXApfWVsc2UgaWYoZj4wKXtpZihwPHUpcmV0dXJuO3A8aCYmKGg9cCl9aWYocD1uLWEsISghZCYmcD4wKSl7aWYocC89ZCxkPDApe2lmKHA8dSlyZXR1cm47cDxoJiYoaD1wKX1lbHNlIGlmKGQ+MCl7aWYocD5oKXJldHVybjtwPnUmJih1PXApfWlmKHA9cy1hLCEoIWQmJnA8MCkpe2lmKHAvPWQsZDwwKXtpZihwPmgpcmV0dXJuO3A+dSYmKHU9cCl9ZWxzZSBpZihkPjApe2lmKHA8dSlyZXR1cm47cDxoJiYoaD1wKX1yZXR1cm4gdT4wJiYoaVswXT1vK3UqZixpWzFdPWErdSpkKSxoPDEmJih0WzBdPW8raCpmLHRbMV09YStoKmQpLCEwfX19fX12YXIgZGE9MWU5LGx1PS1kYTtmdW5jdGlvbiBYUihpLHQsZSxuKXtmdW5jdGlvbiByKGMsdSl7cmV0dXJuIGk8PWMmJmM8PWUmJnQ8PXUmJnU8PW59ZnVuY3Rpb24gcyhjLHUsaCxmKXt2YXIgZD0wLHA9MDtpZihjPT1udWxsfHwoZD1vKGMsaCkpIT09KHA9byh1LGgpKXx8bChjLHUpPDBeaD4wKWRvIGYucG9pbnQoZD09PTB8fGQ9PT0zP2k6ZSxkPjE/bjp0KTt3aGlsZSgoZD0oZCtoKzQpJTQpIT09cCk7ZWxzZSBmLnBvaW50KHVbMF0sdVsxXSl9ZnVuY3Rpb24gbyhjLHUpe3JldHVybiBwZShjWzBdLWkpPGFlP3U+MD8wOjM6cGUoY1swXS1lKTxhZT91PjA/MjoxOnBlKGNbMV0tdCk8YWU/dT4wPzE6MDp1PjA/MzoyfWZ1bmN0aW9uIGEoYyx1KXtyZXR1cm4gbChjLngsdS54KX1mdW5jdGlvbiBsKGMsdSl7dmFyIGg9byhjLDEpLGY9byh1LDEpO3JldHVybiBoIT09Zj9oLWY6aD09PTA/dVsxXS1jWzFdOmg9PT0xP2NbMF0tdVswXTpoPT09Mj9jWzFdLXVbMV06dVswXS1jWzBdfXJldHVybiBmdW5jdGlvbihjKXt2YXIgdT1jLGg9VHYoKSxmLGQscCx5LG0sZyx4LHYsXyxFLGIsVD17cG9pbnQ6UCxsaW5lU3RhcnQ6RixsaW5lRW5kOkQscG9seWdvblN0YXJ0Ok0scG9seWdvbkVuZDpBfTtmdW5jdGlvbiBQKFUsQil7cihVLEIpJiZ1LnBvaW50KFUsQil9ZnVuY3Rpb24gdygpe2Zvcih2YXIgVT0wLEI9MCxIPWQubGVuZ3RoO0I8SDsrK0IpZm9yKHZhciBHPWRbQl0sdHQ9MSxsdD1HLmxlbmd0aCxodD1HWzBdLFJ0LFZ0LEs9aHRbMF0scnQ9aHRbMV07dHQ8bHQ7Kyt0dClSdD1LLFZ0PXJ0LGh0PUdbdHRdLEs9aHRbMF0scnQ9aHRbMV0sVnQ8PW4/cnQ+biYmKEstUnQpKihuLVZ0KT4ocnQtVnQpKihpLVJ0KSYmKytVOnJ0PD1uJiYoSy1SdCkqKG4tVnQpPChydC1WdCkqKGktUnQpJiYtLVU7cmV0dXJuIFV9ZnVuY3Rpb24gTSgpe3U9aCxmPVtdLGQ9W10sYj0hMH1mdW5jdGlvbiBBKCl7dmFyIFU9dygpLEI9YiYmVSxIPShmPWNhKGYpKS5sZW5ndGg7KEJ8fEgpJiYoYy5wb2x5Z29uU3RhcnQoKSxCJiYoYy5saW5lU3RhcnQoKSxzKG51bGwsbnVsbCwxLGMpLGMubGluZUVuZCgpKSxIJiZDdihmLGEsVSxzLGMpLGMucG9seWdvbkVuZCgpKSx1PWMsZj1kPXA9bnVsbH1mdW5jdGlvbiBGKCl7VC5wb2ludD1OLGQmJmQucHVzaChwPVtdKSxFPSEwLF89ITEseD12PU5hTn1mdW5jdGlvbiBEKCl7ZiYmKE4oeSxtKSxnJiZfJiZoLnJlam9pbigpLGYucHVzaChoLnJlc3VsdCgpKSksVC5wb2ludD1QLF8mJnUubGluZUVuZCgpfWZ1bmN0aW9uIE4oVSxCKXt2YXIgSD1yKFUsQik7aWYoZCYmcC5wdXNoKFtVLEJdKSxFKXk9VSxtPUIsZz1ILEU9ITEsSCYmKHUubGluZVN0YXJ0KCksdS5wb2ludChVLEIpKTtlbHNlIGlmKEgmJl8pdS5wb2ludChVLEIpO2Vsc2V7dmFyIEc9W3g9TWF0aC5tYXgobHUsTWF0aC5taW4oZGEseCkpLHY9TWF0aC5tYXgobHUsTWF0aC5taW4oZGEsdikpXSx0dD1bVT1NYXRoLm1heChsdSxNYXRoLm1pbihkYSxVKSksQj1NYXRoLm1heChsdSxNYXRoLm1pbihkYSxCKSldOyRSKEcsdHQsaSx0LGUsbik/KF98fCh1LmxpbmVTdGFydCgpLHUucG9pbnQoR1swXSxHWzFdKSksdS5wb2ludCh0dFswXSx0dFsxXSksSHx8dS5saW5lRW5kKCksYj0hMSk6SCYmKHUubGluZVN0YXJ0KCksdS5wb2ludChVLEIpLGI9ITEpfXg9VSx2PUIsXz1IfXJldHVybiBUfX12YXIgeGQsTWQsY3UsdXUsQnM9e3NwaGVyZTpZZSxwb2ludDpZZSxsaW5lU3RhcnQ6cVIsbGluZUVuZDpZZSxwb2x5Z29uU3RhcnQ6WWUscG9seWdvbkVuZDpZZX07ZnVuY3Rpb24gcVIoKXtCcy5wb2ludD1aUixCcy5saW5lRW5kPVlSfWZ1bmN0aW9uIFlSKCl7QnMucG9pbnQ9QnMubGluZUVuZD1ZZX1mdW5jdGlvbiBaUihpLHQpe2kqPXp0LHQqPXp0LE1kPWksY3U9RHQodCksdXU9V3QodCksQnMucG9pbnQ9SlJ9ZnVuY3Rpb24gSlIoaSx0KXtpKj16dCx0Kj16dDt2YXIgZT1EdCh0KSxuPVd0KHQpLHI9cGUoaS1NZCkscz1XdChyKSxvPUR0KHIpLGE9bipvLGw9dXUqZS1jdSpuKnMsYz1jdSplK3V1Km4qczt4ZC5hZGQoVW4oUmkoYSphK2wqbCksYykpLE1kPWksY3U9ZSx1dT1ufWZ1bmN0aW9uIEtSKGkpe3JldHVybiB4ZD1uZXcgQ2kscWMoaSxCcyksK3hkfXZhciBTZD1bbnVsbCxudWxsXSxqUj17dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6U2R9O2Z1bmN0aW9uIHpzKGksdCl7cmV0dXJuIFNkWzBdPWksU2RbMV09dCxLUihqUil9dmFyIER2PXtGZWF0dXJlOmZ1bmN0aW9uKGksdCl7cmV0dXJuIGh1KGkuZ2VvbWV0cnksdCl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuZmVhdHVyZXMsbj0tMSxyPWUubGVuZ3RoOysrbjxyOylpZihodShlW25dLmdlb21ldHJ5LHQpKXJldHVybiEwO3JldHVybiExfX0sVXY9e1NwaGVyZTpmdW5jdGlvbigpe3JldHVybiEwfSxQb2ludDpmdW5jdGlvbihpLHQpe3JldHVybiBOdihpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvaW50OmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxyPWUubGVuZ3RoOysrbjxyOylpZihOdihlW25dLHQpKXJldHVybiEwO3JldHVybiExfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKGksdCl7cmV0dXJuIEZ2KGkuY29vcmRpbmF0ZXMsdCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscj1lLmxlbmd0aDsrK248cjspaWYoRnYoZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX0sUG9seWdvbjpmdW5jdGlvbihpLHQpe3JldHVybiBPdihpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHI9ZS5sZW5ndGg7KytuPHI7KWlmKE92KGVbbl0sdCkpcmV0dXJuITA7cmV0dXJuITF9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmdlb21ldHJpZXMsbj0tMSxyPWUubGVuZ3RoOysrbjxyOylpZihodShlW25dLHQpKXJldHVybiEwO3JldHVybiExfX07ZnVuY3Rpb24gaHUoaSx0KXtyZXR1cm4gaSYmVXYuaGFzT3duUHJvcGVydHkoaS50eXBlKT9VdltpLnR5cGVdKGksdCk6ITF9ZnVuY3Rpb24gTnYoaSx0KXtyZXR1cm4genMoaSx0KT09PTB9ZnVuY3Rpb24gRnYoaSx0KXtmb3IodmFyIGUsbixyLHM9MCxvPWkubGVuZ3RoO3M8bztzKyspe2lmKG49enMoaVtzXSx0KSxuPT09MHx8cz4wJiYocj16cyhpW3NdLGlbcy0xXSkscj4wJiZlPD1yJiZuPD1yJiYoZStuLXIpKigxLU1hdGgucG93KChlLW4pL3IsMikpPFdjKnIpKXJldHVybiEwO2U9bn1yZXR1cm4hMX1mdW5jdGlvbiBPdihpLHQpe3JldHVybiEhUHYoaS5tYXAoUVIpLEJ2KHQpKX1mdW5jdGlvbiBRUihpKXtyZXR1cm4gaT1pLm1hcChCdiksaS5wb3AoKSxpfWZ1bmN0aW9uIEJ2KGkpe3JldHVybltpWzBdKnp0LGlbMV0qenRdfWZ1bmN0aW9uIHRQKGksdCl7cmV0dXJuKGkmJkR2Lmhhc093blByb3BlcnR5KGkudHlwZSk/RHZbaS50eXBlXTpodSkoaSx0KX1mdW5jdGlvbiBlUChpLHQpe3ZhciBlPWlbMF0qenQsbj1pWzFdKnp0LHI9dFswXSp6dCxzPXRbMV0qenQsbz1XdChuKSxhPUR0KG4pLGw9V3QocyksYz1EdChzKSx1PW8qV3QoZSksaD1vKkR0KGUpLGY9bCpXdChyKSxkPWwqRHQocikscD0yKlBpKFJpKFF5KHMtbikrbypsKlF5KHItZSkpKSx5PUR0KHApLG09cD9mdW5jdGlvbihnKXt2YXIgeD1EdChnKj1wKS95LHY9RHQocC1nKS95LF89dip1K3gqZixFPXYqaCt4KmQsYj12KmEreCpjO3JldHVybltVbihFLF8pKmJlLFVuKGIsUmkoXypfK0UqRSkpKmJlXX06ZnVuY3Rpb24oKXtyZXR1cm5bZSpiZSxuKmJlXX07cmV0dXJuIG0uZGlzdGFuY2U9cCxtfXZhciB6dj1pPT5pLGtzPTEvMCxmdT1rcyxwYT0ta3MsZHU9cGEsa3Y9e3BvaW50Om5QLGxpbmVTdGFydDpZZSxsaW5lRW5kOlllLHBvbHlnb25TdGFydDpZZSxwb2x5Z29uRW5kOlllLHJlc3VsdDpmdW5jdGlvbigpe3ZhciBpPVtba3MsZnVdLFtwYSxkdV1dO3JldHVybiBwYT1kdT0tKGZ1PWtzPTEvMCksaX19O2Z1bmN0aW9uIG5QKGksdCl7aTxrcyYmKGtzPWkpLGk+cGEmJihwYT1pKSx0PGZ1JiYoZnU9dCksdD5kdSYmKGR1PXQpfWZ1bmN0aW9uIGJkKGkpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1uZXcgd2Q7Zm9yKHZhciBuIGluIGkpZVtuXT1pW25dO3JldHVybiBlLnN0cmVhbT10LGV9fWZ1bmN0aW9uIHdkKCl7fXdkLnByb3RvdHlwZT17Y29uc3RydWN0b3I6d2QscG9pbnQ6ZnVuY3Rpb24oaSx0KXt0aGlzLnN0cmVhbS5wb2ludChpLHQpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07ZnVuY3Rpb24gQWQoaSx0LGUpe3ZhciBuPWkuY2xpcEV4dGVudCYmaS5jbGlwRXh0ZW50KCk7cmV0dXJuIGkuc2NhbGUoMTUwKS50cmFuc2xhdGUoWzAsMF0pLG4hPW51bGwmJmkuY2xpcEV4dGVudChudWxsKSxxYyhlLGkuc3RyZWFtKGt2KSksdChrdi5yZXN1bHQoKSksbiE9bnVsbCYmaS5jbGlwRXh0ZW50KG4pLGl9ZnVuY3Rpb24gR3YoaSx0LGUpe3JldHVybiBBZChpLGZ1bmN0aW9uKG4pe3ZhciByPXRbMV1bMF0tdFswXVswXSxzPXRbMV1bMV0tdFswXVsxXSxvPU1hdGgubWluKHIvKG5bMV1bMF0tblswXVswXSkscy8oblsxXVsxXS1uWzBdWzFdKSksYT0rdFswXVswXSsoci1vKihuWzFdWzBdK25bMF1bMF0pKS8yLGw9K3RbMF1bMV0rKHMtbyooblsxXVsxXStuWzBdWzFdKSkvMjtpLnNjYWxlKDE1MCpvKS50cmFuc2xhdGUoW2EsbF0pfSxlKX1mdW5jdGlvbiBpUChpLHQsZSl7cmV0dXJuIEd2KGksW1swLDBdLHRdLGUpfWZ1bmN0aW9uIHJQKGksdCxlKXtyZXR1cm4gQWQoaSxmdW5jdGlvbihuKXt2YXIgcj0rdCxzPXIvKG5bMV1bMF0tblswXVswXSksbz0oci1zKihuWzFdWzBdK25bMF1bMF0pKS8yLGE9LXMqblswXVsxXTtpLnNjYWxlKDE1MCpzKS50cmFuc2xhdGUoW28sYV0pfSxlKX1mdW5jdGlvbiBzUChpLHQsZSl7cmV0dXJuIEFkKGksZnVuY3Rpb24obil7dmFyIHI9K3Qscz1yLyhuWzFdWzFdLW5bMF1bMV0pLG89LXMqblswXVswXSxhPShyLXMqKG5bMV1bMV0rblswXVsxXSkpLzI7aS5zY2FsZSgxNTAqcykudHJhbnNsYXRlKFtvLGFdKX0sZSl9dmFyIFZ2PTE2LG9QPVd0KDMwKnp0KTtmdW5jdGlvbiBIdihpLHQpe3JldHVybit0P2xQKGksdCk6YVAoaSl9ZnVuY3Rpb24gYVAoaSl7cmV0dXJuIGJkKHtwb2ludDpmdW5jdGlvbih0LGUpe3Q9aSh0LGUpLHRoaXMuc3RyZWFtLnBvaW50KHRbMF0sdFsxXSl9fSl9ZnVuY3Rpb24gbFAoaSx0KXtmdW5jdGlvbiBlKG4scixzLG8sYSxsLGMsdSxoLGYsZCxwLHksbSl7dmFyIGc9Yy1uLHg9dS1yLHY9ZypnK3gqeDtpZih2PjQqdCYmeS0tKXt2YXIgXz1vK2YsRT1hK2QsYj1sK3AsVD1SaShfKl8rRSpFK2IqYiksUD1QaShiLz1UKSx3PXBlKHBlKGIpLTEpPGFlfHxwZShzLWgpPGFlPyhzK2gpLzI6VW4oRSxfKSxNPWkodyxQKSxBPU1bMF0sRj1NWzFdLEQ9QS1uLE49Ri1yLFU9eCpELWcqTjsoVSpVL3Y+dHx8cGUoKGcqRCt4Kk4pL3YtLjUpPi4zfHxvKmYrYSpkK2wqcDxvUCkmJihlKG4scixzLG8sYSxsLEEsRix3LF8vPVQsRS89VCxiLHksbSksbS5wb2ludChBLEYpLGUoQSxGLHcsXyxFLGIsYyx1LGgsZixkLHAseSxtKSl9fXJldHVybiBmdW5jdGlvbihuKXt2YXIgcixzLG8sYSxsLGMsdSxoLGYsZCxwLHksbT17cG9pbnQ6ZyxsaW5lU3RhcnQ6eCxsaW5lRW5kOl8scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKSxtLmxpbmVTdGFydD1FfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCksbS5saW5lU3RhcnQ9eH19O2Z1bmN0aW9uIGcoUCx3KXtQPWkoUCx3KSxuLnBvaW50KFBbMF0sUFsxXSl9ZnVuY3Rpb24geCgpe2g9TmFOLG0ucG9pbnQ9dixuLmxpbmVTdGFydCgpfWZ1bmN0aW9uIHYoUCx3KXt2YXIgTT16cihbUCx3XSksQT1pKFAsdyk7ZShoLGYsdSxkLHAseSxoPUFbMF0sZj1BWzFdLHU9UCxkPU1bMF0scD1NWzFdLHk9TVsyXSxWdixuKSxuLnBvaW50KGgsZil9ZnVuY3Rpb24gXygpe20ucG9pbnQ9ZyxuLmxpbmVFbmQoKX1mdW5jdGlvbiBFKCl7eCgpLG0ucG9pbnQ9YixtLmxpbmVFbmQ9VH1mdW5jdGlvbiBiKFAsdyl7dihyPVAsdykscz1oLG89ZixhPWQsbD1wLGM9eSxtLnBvaW50PXZ9ZnVuY3Rpb24gVCgpe2UoaCxmLHUsZCxwLHkscyxvLHIsYSxsLGMsVnYsbiksbS5saW5lRW5kPV8sXygpfXJldHVybiBtfX12YXIgY1A9YmQoe3BvaW50OmZ1bmN0aW9uKGksdCl7dGhpcy5zdHJlYW0ucG9pbnQoaSp6dCx0Knp0KX19KTtmdW5jdGlvbiB1UChpKXtyZXR1cm4gYmQoe3BvaW50OmZ1bmN0aW9uKHQsZSl7dmFyIG49aSh0LGUpO3JldHVybiB0aGlzLnN0cmVhbS5wb2ludChuWzBdLG5bMV0pfX0pfWZ1bmN0aW9uIGhQKGksdCxlLG4scil7ZnVuY3Rpb24gcyhvLGEpe3JldHVybiBvKj1uLGEqPXIsW3QraSpvLGUtaSphXX1yZXR1cm4gcy5pbnZlcnQ9ZnVuY3Rpb24obyxhKXtyZXR1cm5bKG8tdCkvaSpuLChlLWEpL2kqcl19LHN9ZnVuY3Rpb24gV3YoaSx0LGUsbixyLHMpe2lmKCFzKXJldHVybiBoUChpLHQsZSxuLHIpO3ZhciBvPVd0KHMpLGE9RHQocyksbD1vKmksYz1hKmksdT1vL2ksaD1hL2ksZj0oYSplLW8qdCkvaSxkPShhKnQrbyplKS9pO2Z1bmN0aW9uIHAoeSxtKXtyZXR1cm4geSo9bixtKj1yLFtsKnktYyptK3QsZS1jKnktbCptXX1yZXR1cm4gcC5pbnZlcnQ9ZnVuY3Rpb24oeSxtKXtyZXR1cm5bbioodSp5LWgqbStmKSxyKihkLWgqeS11Km0pXX0scH1mdW5jdGlvbiBFZChpKXtyZXR1cm4gZlAoZnVuY3Rpb24oKXtyZXR1cm4gaX0pKCl9ZnVuY3Rpb24gZlAoaSl7dmFyIHQsZT0xNTAsbj00ODAscj0yNTAscz0wLG89MCxhPTAsbD0wLGM9MCx1LGg9MCxmPTEsZD0xLHA9bnVsbCx5PUx2LG09bnVsbCxnLHgsdixfPXp2LEU9LjUsYixULFAsdyxNO2Z1bmN0aW9uIEEoVSl7cmV0dXJuIFAoVVswXSp6dCxVWzFdKnp0KX1mdW5jdGlvbiBGKFUpe3JldHVybiBVPVAuaW52ZXJ0KFVbMF0sVVsxXSksVSYmW1VbMF0qYmUsVVsxXSpiZV19QS5zdHJlYW09ZnVuY3Rpb24oVSl7cmV0dXJuIHcmJk09PT1VP3c6dz1jUCh1UCh1KSh5KGIoXyhNPVUpKSkpKX0sQS5wcmVjbGlwPWZ1bmN0aW9uKFUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PVUscD12b2lkIDAsTigpKTp5fSxBLnBvc3RjbGlwPWZ1bmN0aW9uKFUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPVUsbT1nPXg9dj1udWxsLE4oKSk6X30sQS5jbGlwQW5nbGU9ZnVuY3Rpb24oVSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K1U/V1IocD1VKnp0KToocD1udWxsLEx2KSxOKCkpOnAqYmV9LEEuY2xpcEV4dGVudD1mdW5jdGlvbihVKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz1VPT1udWxsPyhtPWc9eD12PW51bGwsenYpOlhSKG09K1VbMF1bMF0sZz0rVVswXVsxXSx4PStVWzFdWzBdLHY9K1VbMV1bMV0pLE4oKSk6bT09bnVsbD9udWxsOltbbSxnXSxbeCx2XV19LEEuc2NhbGU9ZnVuY3Rpb24oVSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K1UsRCgpKTplfSxBLnRyYW5zbGF0ZT1mdW5jdGlvbihVKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rVVswXSxyPStVWzFdLEQoKSk6W24scl19LEEuY2VudGVyPWZ1bmN0aW9uKFUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPVVbMF0lMzYwKnp0LG89VVsxXSUzNjAqenQsRCgpKTpbcypiZSxvKmJlXX0sQS5yb3RhdGU9ZnVuY3Rpb24oVSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9VVswXSUzNjAqenQsbD1VWzFdJTM2MCp6dCxjPVUubGVuZ3RoPjI/VVsyXSUzNjAqenQ6MCxEKCkpOlthKmJlLGwqYmUsYypiZV19LEEuYW5nbGU9ZnVuY3Rpb24oVSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9VSUzNjAqenQsRCgpKTpoKmJlfSxBLnJlZmxlY3RYPWZ1bmN0aW9uKFUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPVU/LTE6MSxEKCkpOmY8MH0sQS5yZWZsZWN0WT1mdW5jdGlvbihVKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1VPy0xOjEsRCgpKTpkPDB9LEEucHJlY2lzaW9uPWZ1bmN0aW9uKFUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPUh2KFQsRT1VKlUpLE4oKSk6UmkoRSl9LEEuZml0RXh0ZW50PWZ1bmN0aW9uKFUsQil7cmV0dXJuIEd2KEEsVSxCKX0sQS5maXRTaXplPWZ1bmN0aW9uKFUsQil7cmV0dXJuIGlQKEEsVSxCKX0sQS5maXRXaWR0aD1mdW5jdGlvbihVLEIpe3JldHVybiByUChBLFUsQil9LEEuZml0SGVpZ2h0PWZ1bmN0aW9uKFUsQil7cmV0dXJuIHNQKEEsVSxCKX07ZnVuY3Rpb24gRCgpe3ZhciBVPVd2KGUsMCwwLGYsZCxoKS5hcHBseShudWxsLHQocyxvKSksQj1XdihlLG4tVVswXSxyLVVbMV0sZixkLGgpO3JldHVybiB1PU12KGEsbCxjKSxUPXlkKHQsQiksUD15ZCh1LFQpLGI9SHYoVCxFKSxOKCl9ZnVuY3Rpb24gTigpe3JldHVybiB3PU09bnVsbCxBfXJldHVybiBmdW5jdGlvbigpe3JldHVybiB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLEEuaW52ZXJ0PXQuaW52ZXJ0JiZGLEQoKX19ZnVuY3Rpb24gZFAoaSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49UmkodCp0K2UqZSkscj1pKG4pLHM9RHQociksbz1XdChyKTtyZXR1cm5bVW4odCpzLG4qbyksUGkobiYmZSpzL24pXX19ZnVuY3Rpb24gVGQoaSx0KXtyZXR1cm5baSxiUihBUigoZG4rdCkvMikpXX1UZC5pbnZlcnQ9ZnVuY3Rpb24oaSx0KXtyZXR1cm5baSwyKnNkKFNSKHQpKS1kbl19O2Z1bmN0aW9uIHBQKCl7cmV0dXJuIG1QKFRkKS5zY2FsZSg5NjEvcG4pfWZ1bmN0aW9uIG1QKGkpe3ZhciB0PUVkKGkpLGU9dC5jZW50ZXIsbj10LnNjYWxlLHI9dC50cmFuc2xhdGUscz10LmNsaXBFeHRlbnQsbz1udWxsLGEsbCxjO3Quc2NhbGU9ZnVuY3Rpb24oaCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4oaCksdSgpKTpuKCl9LHQudHJhbnNsYXRlPWZ1bmN0aW9uKGgpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKGgpLHUoKSk6cigpfSx0LmNlbnRlcj1mdW5jdGlvbihoKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZShoKSx1KCkpOmUoKX0sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKGgpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPT1udWxsP289YT1sPWM9bnVsbDoobz0raFswXVswXSxhPStoWzBdWzFdLGw9K2hbMV1bMF0sYz0raFsxXVsxXSksdSgpKTpvPT1udWxsP251bGw6W1tvLGFdLFtsLGNdXX07ZnVuY3Rpb24gdSgpe3ZhciBoPXRlKm4oKSxmPXQoQXYodC5yb3RhdGUoKSkuaW52ZXJ0KFswLDBdKSk7cmV0dXJuIHMobz09bnVsbD9bW2ZbMF0taCxmWzFdLWhdLFtmWzBdK2gsZlsxXStoXV06aT09PVRkP1tbTWF0aC5tYXgoZlswXS1oLG8pLGFdLFtNYXRoLm1pbihmWzBdK2gsbCksY11dOltbbyxNYXRoLm1heChmWzFdLWgsYSldLFtsLE1hdGgubWluKGZbMV0raCxjKV1dKX1yZXR1cm4gdSgpfWZ1bmN0aW9uIENkKGksdCl7cmV0dXJuW2ksdF19Q2QuaW52ZXJ0PUNkO2Z1bmN0aW9uIGdQKCl7cmV0dXJuIEVkKENkKS5zY2FsZSgxNTIuNjMpfWZ1bmN0aW9uICR2KGksdCl7dmFyIGU9V3QodCksbj0xK1d0KGkpKmU7cmV0dXJuW2UqRHQoaSkvbixEdCh0KS9uXX0kdi5pbnZlcnQ9ZFAoZnVuY3Rpb24oaSl7cmV0dXJuIDIqc2QoaSl9KTtmdW5jdGlvbiB5UCgpe3JldHVybiBFZCgkdikuc2NhbGUoMjUwKS5jbGlwQW5nbGUoMTQyKX1jb25zdCBSZD17fSxtYT1pPT57dmFyIG4scjtjb25zdCB0PUpTT04uc3RyaW5naWZ5KGkpO2lmKFJkW3RdKXJldHVybiBSZFt0XTtjb25zdCBlPShpLmVxdWlyZWN0YW5ndWxhcj9nUCgpOnBQKCkpLmNlbnRlcihpLmNlbnRlcikuc2NhbGUoaS5zY2FsZSkudHJhbnNsYXRlKChuPWkudHJhbnNsYXRlKSE9bnVsbD9uOlswLDBdKS5wcmVjaXNpb24oKHI9aS5wcmVjaXNpb24pIT1udWxsP3I6LjEpO3JldHVybiBpLnJvdGF0ZSYmZS5yb3RhdGUoaS5yb3RhdGUpLFJkW3RdPWUsZX0scHU9KGksdCk9PmkubWFwKChbZSxuXSk9PntsZXQgcjtpZih0KXtjb25zdFtzLG9dPXQoW2Usbl0pO3I9bmV3IHEocywtbyl9ZWxzZSByPW5ldyBxKGUsbik7cmV0dXJuIHJ9KTtmdW5jdGlvbiB2UChpLHQ9MCl7Y29uc3QgZT1pWzBdLmluZGV4IT09bnVsbCxuPW5ldyBTZXQoT2JqZWN0LmtleXMoaVswXS5hdHRyaWJ1dGVzKSkscj1uZXcgU2V0KE9iamVjdC5rZXlzKGlbMF0ubW9ycGhBdHRyaWJ1dGVzKSkscz17fSxvPXt9LGE9aVswXS5tb3JwaFRhcmdldHNSZWxhdGl2ZSxsPW5ldyBOdDtsZXQgYz0wO2ZvcihsZXQgdT0wO3U8aS5sZW5ndGg7Kyt1KXtjb25zdCBoPWlbdV07bGV0IGY9MDtpZihlIT09KGguaW5kZXghPT1udWxsKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIrdSsiLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29tcGF0aWJsZSBhdHRyaWJ1dGVzOyBtYWtlIHN1cmUgaW5kZXggYXR0cmlidXRlIGV4aXN0cyBhbW9uZyBhbGwgZ2VvbWV0cmllcywgb3IgaW4gbm9uZSBvZiB0aGVtLiIpLG51bGw7Zm9yKGNvbnN0IGQgaW4gaC5hdHRyaWJ1dGVzKXtpZighbi5oYXMoZCkpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK3UrJy4gQWxsIGdlb21ldHJpZXMgbXVzdCBoYXZlIGNvbXBhdGlibGUgYXR0cmlidXRlczsgbWFrZSBzdXJlICInK2QrJyIgYXR0cmlidXRlIGV4aXN0cyBhbW9uZyBhbGwgZ2VvbWV0cmllcywgb3IgaW4gbm9uZSBvZiB0aGVtLicpLG51bGw7c1tkXT09PXZvaWQgMCYmKHNbZF09W10pLHNbZF0ucHVzaChoLmF0dHJpYnV0ZXNbZF0pLGYrK31pZihmIT09bi5zaXplKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIit1KyIuIE1ha2Ugc3VyZSBhbGwgZ2VvbWV0cmllcyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhdHRyaWJ1dGVzLiIpLG51bGw7aWYoYSE9PWgubW9ycGhUYXJnZXRzUmVsYXRpdmUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK3UrIi4gLm1vcnBoVGFyZ2V0c1JlbGF0aXZlIG11c3QgYmUgY29uc2lzdGVudCB0aHJvdWdob3V0IGFsbCBnZW9tZXRyaWVzLiIpLG51bGw7Zm9yKGNvbnN0IGQgaW4gaC5tb3JwaEF0dHJpYnV0ZXMpe2lmKCFyLmhhcyhkKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIrdSsiLiAgLm1vcnBoQXR0cmlidXRlcyBtdXN0IGJlIGNvbnNpc3RlbnQgdGhyb3VnaG91dCBhbGwgZ2VvbWV0cmllcy4iKSxudWxsO29bZF09PT12b2lkIDAmJihvW2RdPVtdKSxvW2RdLnB1c2goaC5tb3JwaEF0dHJpYnV0ZXNbZF0pfWlmKHQpe2xldCBkO2lmKGUpZD1oLmluZGV4LmNvdW50O2Vsc2UgaWYoaC5hdHRyaWJ1dGVzLnBvc2l0aW9uIT09dm9pZCAwKWQ9aC5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50O2Vsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK3UrIi4gVGhlIGdlb21ldHJ5IG11c3QgaGF2ZSBlaXRoZXIgYW4gaW5kZXggb3IgYSBwb3NpdGlvbiBhdHRyaWJ1dGUiKSxudWxsO2lmKHQ9PT0xKWwuYWRkR3JvdXAoYyxkLHUpO2Vsc2UgaWYodD09PTImJmguZ3JvdXBzLmxlbmd0aD4wKWZvcihsZXQgcCBvZiBoLmdyb3Vwcyl7bGV0IHk9cC5tYXRlcmlhbEluZGV4O2wuYWRkR3JvdXAoYytwLnN0YXJ0LE1hdGgubWluKHAuY291bnQsZCkseSl9Yys9ZH19aWYoZSl7bGV0IHU9MDtjb25zdCBoPVtdO2ZvcihsZXQgZj0wO2Y8aS5sZW5ndGg7KytmKXtjb25zdCBkPWlbZl0uaW5kZXg7Zm9yKGxldCBwPTA7cDxkLmNvdW50OysrcCloLnB1c2goZC5nZXRYKHApK3UpO3UrPWlbZl0uYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1sLnNldEluZGV4KGgpfWZvcihjb25zdCB1IGluIHMpe2NvbnN0IGg9WHYoc1t1XSk7aWYoIWgpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2hpbGUgdHJ5aW5nIHRvIG1lcmdlIHRoZSAiK3UrIiBhdHRyaWJ1dGUuIiksbnVsbDtsLnNldEF0dHJpYnV0ZSh1LGgpfWZvcihjb25zdCB1IGluIG8pe2NvbnN0IGg9b1t1XVswXS5sZW5ndGg7aWYoaD09PTApYnJlYWs7bC5tb3JwaEF0dHJpYnV0ZXM9bC5tb3JwaEF0dHJpYnV0ZXN8fHt9LGwubW9ycGhBdHRyaWJ1dGVzW3VdPVtdO2ZvcihsZXQgZj0wO2Y8aDsrK2Ype2NvbnN0IGQ9W107Zm9yKGxldCB5PTA7eTxvW3VdLmxlbmd0aDsrK3kpZC5wdXNoKG9bdV1beV1bZl0pO2NvbnN0IHA9WHYoZCk7aWYoIXApcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2hpbGUgdHJ5aW5nIHRvIG1lcmdlIHRoZSAiK3UrIiBtb3JwaEF0dHJpYnV0ZS4iKSxudWxsO2wubW9ycGhBdHRyaWJ1dGVzW3VdLnB1c2gocCl9fXJldHVybiB0PT09Mj9fUChsKTpsfWZ1bmN0aW9uIFh2KGkpe2xldCB0LGUsbixyPS0xLHM9MDtmb3IobGV0IGM9MDtjPGkubGVuZ3RoOysrYyl7Y29uc3QgdT1pW2NdO2lmKHQ9PT12b2lkIDAmJih0PXUuYXJyYXkuY29uc3RydWN0b3IpLHQhPT11LmFycmF5LmNvbnN0cnVjdG9yKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUuYXJyYXkgbXVzdCBiZSBvZiBjb25zaXN0ZW50IGFycmF5IHR5cGVzIGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7aWYoZT09PXZvaWQgMCYmKGU9dS5pdGVtU2l6ZSksZSE9PXUuaXRlbVNpemUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5pdGVtU2l6ZSBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihuPT09dm9pZCAwJiYobj11Lm5vcm1hbGl6ZWQpLG4hPT11Lm5vcm1hbGl6ZWQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5ub3JtYWxpemVkIG11c3QgYmUgY29uc2lzdGVudCBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO2lmKHI9PT0tMSYmKHI9dS5ncHVUeXBlKSxyIT09dS5ncHVUeXBlKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUuZ3B1VHlwZSBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtzKz11LmNvdW50KmV9Y29uc3Qgbz1uZXcgdChzKSxhPW5ldyBadChvLGUsbik7bGV0IGw9MDtmb3IobGV0IGM9MDtjPGkubGVuZ3RoOysrYyl7Y29uc3QgdT1pW2NdO2lmKHUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc3QgaD1sL2U7Zm9yKGxldCBmPTAsZD11LmNvdW50O2Y8ZDtmKyspZm9yKGxldCBwPTA7cDxlO3ArKyl7Y29uc3QgeT11LmdldENvbXBvbmVudChmLHApO2Euc2V0Q29tcG9uZW50KGYraCxwLHkpfX1lbHNlIG8uc2V0KHUuYXJyYXksbCk7bCs9dS5jb3VudCplfXJldHVybiByIT09dm9pZCAwJiYoYS5ncHVUeXBlPXIpLGF9ZnVuY3Rpb24gX1AoaSl7aWYoaS5ncm91cHMubGVuZ3RoPT09MClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzLm1lcmdlR3JvdXBzKCk6IE5vIGdyb3VwcyBhcmUgZGVmaW5lZC4gTm90aGluZyB0byBtZXJnZS4iKSxpO2xldCB0PWkuZ3JvdXBzO2lmKHQ9dC5zb3J0KChvLGEpPT5vLm1hdGVyaWFsSW5kZXghPT1hLm1hdGVyaWFsSW5kZXg/by5tYXRlcmlhbEluZGV4LWEubWF0ZXJpYWxJbmRleDpvLnN0YXJ0LWEuc3RhcnQpLGkuZ2V0SW5kZXgoKT09PW51bGwpe2NvbnN0IG89aS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksYT1bXTtmb3IobGV0IGw9MDtsPG8uY291bnQ7bCs9MylhLnB1c2gobCxsKzEsbCsyKTtpLnNldEluZGV4KGEpfWNvbnN0IGU9aS5nZXRJbmRleCgpLG49W107Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGE9dFtvXSxsPWEuc3RhcnQsYz1sK2EuY291bnQ7Zm9yKGxldCB1PWw7dTxjO3UrKyluLnB1c2goZS5nZXRYKHUpKX1pLmRpc3Bvc2UoKSxpLnNldEluZGV4KG4pO2xldCByPTA7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGE9dFtvXTthLnN0YXJ0PXIscis9YS5jb3VudH1sZXQgcz10WzBdO2kuZ3JvdXBzPVtzXTtmb3IobGV0IG89MTtvPHQubGVuZ3RoO28rKyl7Y29uc3QgYT10W29dO3MubWF0ZXJpYWxJbmRleD09PWEubWF0ZXJpYWxJbmRleD9zLmNvdW50Kz1hLmNvdW50OihzPWEsaS5ncm91cHMucHVzaChzKSl9cmV0dXJuIGl9dmFyIGdhPShpLHQpPT57Y29uc3QgZT12UChpLHQhPW51bGw/dDowKSxuPXt9LHI9W10scz1PYmplY3Qua2V5cyhlLmF0dHJpYnV0ZXMpO3JldHVybiBlLmluZGV4JiZzLnB1c2goImluZGV4Iikscy5mb3JFYWNoKG89Pntjb25zdCBhPW89PT0iaW5kZXgiP2UuaW5kZXg6ZS5hdHRyaWJ1dGVzW29dO25bb109e2FycmF5OmEuYXJyYXksaXRlbVNpemU6YS5pdGVtU2l6ZX0sci5wdXNoKGEuYXJyYXkuYnVmZmVyKX0pLHQmJihuLmdyb3Vwcz1lLmdyb3VwcyksZS5kaXNwb3NlKCksaS5mb3JFYWNoKG89PntvLmRpc3Bvc2UoKX0pLHttZXNzYWdlOm4sdHJhbnNmZXI6cn19LFBkPShpLHQ9MzAwKT0+e2NvbnN0IGU9W107cmV0dXJuIGkuZm9yRWFjaChuPT57bGV0IHI9ITE7Zm9yKGxldCBzPTE7czxuLmxlbmd0aDtzKyspaWYoTWF0aC5hYnMobltzXS54LW5bcy0xXS54KT50KXtyPSEwO2JyZWFrfWlmKHIpe2NvbnN0IHM9W10sbz1bXTtuLmZvckVhY2goYT0+e2EueDwwP3MucHVzaChhKTpvLnB1c2goYSl9KSxlLnB1c2gocyxvKX1lbHNlIGUucHVzaChuKX0pLGV9O2NvbnN0IHhQPSh7Y29vcmRpbmF0ZXNBcnI6aSxzcGxpdDp0LHNpZGVSZXBlYXQ6ZSxiYm94Om4sYmJveE9mZnNldDpyLGRlcHRoOnMscHJvamVjdGlvbjpvLHVzZUdyb3VwczphLGhhc1RvcDpsLGhhc0JvdHRvbTpjLGhhc1NpZGU6dSxzcGxpdFBvbHlnb25zOmh9KT0+e2NvbnN0IGY9byYmbWEobyk7bGV0IGQ9aS5tYXAobT0+cHUobSxmKSk7aCYmKGQ9UGQoZCxoKSk7bGV0IHA7aWYobil7Y29uc3RbbSxnXT1wdShbW25bMF0sblsxXV0sW25bMl0sblszXV1dLG8hPW51bGwmJm8ucm90YXRlP21hKGhoKE9pKHt9LG8pLHtyb3RhdGU6dm9pZCAwfSkpOmYpO3ImJihtLngrPXJbMF0sbS55Kz1yWzFdLGcueCs9clsyXSxnLnkrPXJbM10pLHA9bmV3IE9lKG5ldyBMKG0ueCxtLnksMCksbmV3IEwoZy54LGcueSwwKSl9Y29uc3QgeT1kLm1hcCgobSxnKT0+e3ZhciB4O3JldHVybiBhUih7cG9pbnRzOm0sc3BsaXQ6dCxzaWRlUmVwZWF0OmUsZGVwdGg6KHg9c1tnXSkhPW51bGw/eDpzWzBdLGhhc1RvcDpsLGhhc0JvdHRvbTpjLGhhc1NpZGU6dSxib3gzOnB9KX0pO3JldHVybiBnYSh5LGEpfTtmdW5jdGlvbiBJZChpLHQsZSxuLHIpe2xldCBzO2lmKGk9aS5zdWJhcnJheXx8aS5zbGljZT9pOmkuYnVmZmVyLGU9ZS5zdWJhcnJheXx8ZS5zbGljZT9lOmUuYnVmZmVyLGk9dD9pLnN1YmFycmF5P2kuc3ViYXJyYXkodCxyJiZ0K3IpOmkuc2xpY2UodCxyJiZ0K3IpOmksZS5zZXQpZS5zZXQoaSxuKTtlbHNlIGZvcihzPTA7czxpLmxlbmd0aDtzKyspZVtzK25dPWlbc107cmV0dXJuIGV9ZnVuY3Rpb24gTVAoaSl7cmV0dXJuIGkgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXk/aTppIGluc3RhbmNlb2YgTnQ/aS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikuYXJyYXk6aS5tYXAodD0+e2NvbnN0IGU9QXJyYXkuaXNBcnJheSh0KTtyZXR1cm4gdCBpbnN0YW5jZW9mIEw/W3QueCx0LnksdC56XTp0IGluc3RhbmNlb2YgcT9bdC54LHQueSwwXTplJiZ0Lmxlbmd0aD09PTM/W3RbMF0sdFsxXSx0WzJdXTplJiZ0Lmxlbmd0aD09PTI/W3RbMF0sdFsxXSwwXTp0fSkuZmxhdCgpfWNsYXNzIFNQIGV4dGVuZHMgTnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaExpbmUiLHRoaXMuaXNNZXNoTGluZT0hMCx0aGlzLnBvc2l0aW9ucz1bXSx0aGlzLnByZXZpb3VzPVtdLHRoaXMubmV4dD1bXSx0aGlzLnNpZGU9W10sdGhpcy53aWR0aD1bXSx0aGlzLmluZGljZXNfYXJyYXk9W10sdGhpcy51dnM9W10sdGhpcy5jb3VudGVycz1bXSx0aGlzLndpZHRoQ2FsbGJhY2s9bnVsbCx0aGlzLl9wb2ludHM9W10sdGhpcy5tYXRyaXhXb3JsZD1uZXcgTHQsT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cG9pbnRzOntlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiB0aGlzLl9wb2ludHN9LHNldCh0KXt0aGlzLnNldFBvaW50cyh0LHRoaXMud2lkdGhDYWxsYmFjayl9fX0pfXNldE1hdHJpeFdvcmxkKHQpe3RoaXMubWF0cml4V29ybGQ9dH1zZXRQb2ludHModCxlKXtpZih0PU1QKHQpLHRoaXMuX3BvaW50cz10LHRoaXMud2lkdGhDYWxsYmFjaz1lIT1udWxsP2U6bnVsbCx0aGlzLnBvc2l0aW9ucz1bXSx0aGlzLmNvdW50ZXJzPVtdLHQubGVuZ3RoJiZ0WzBdaW5zdGFuY2VvZiBMKWZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCByPXRbbl0scz1uLyh0Lmxlbmd0aC0xKTt0aGlzLnBvc2l0aW9ucy5wdXNoKHIueCxyLnksci56KSx0aGlzLnBvc2l0aW9ucy5wdXNoKHIueCxyLnksci56KSx0aGlzLmNvdW50ZXJzLnB1c2gocyksdGhpcy5jb3VudGVycy5wdXNoKHMpfWVsc2UgZm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKz0zKXtjb25zdCByPW4vKHQubGVuZ3RoLTEpO3RoaXMucG9zaXRpb25zLnB1c2godFtuXSx0W24rMV0sdFtuKzJdKSx0aGlzLnBvc2l0aW9ucy5wdXNoKHRbbl0sdFtuKzFdLHRbbisyXSksdGhpcy5jb3VudGVycy5wdXNoKHIpLHRoaXMuY291bnRlcnMucHVzaChyKX10aGlzLnByb2Nlc3MoKX1jb21wYXJlVjModCxlKXtjb25zdCBuPXQqNixyPWUqNjtyZXR1cm4gdGhpcy5wb3NpdGlvbnNbbl09PT10aGlzLnBvc2l0aW9uc1tyXSYmdGhpcy5wb3NpdGlvbnNbbisxXT09PXRoaXMucG9zaXRpb25zW3IrMV0mJnRoaXMucG9zaXRpb25zW24rMl09PT10aGlzLnBvc2l0aW9uc1tyKzJdfWNvcHlWMyh0KXtjb25zdCBlPXQqNjtyZXR1cm5bdGhpcy5wb3NpdGlvbnNbZV0sdGhpcy5wb3NpdGlvbnNbZSsxXSx0aGlzLnBvc2l0aW9uc1tlKzJdXX1wcm9jZXNzKCl7Y29uc3QgdD10aGlzLnBvc2l0aW9ucy5sZW5ndGgvNjt0aGlzLnByZXZpb3VzPVtdLHRoaXMubmV4dD1bXSx0aGlzLnNpZGU9W10sdGhpcy53aWR0aD1bXSx0aGlzLmluZGljZXNfYXJyYXk9W10sdGhpcy51dnM9W107bGV0IGUsbjt0aGlzLmNvbXBhcmVWMygwLHQtMSk/bj10aGlzLmNvcHlWMyh0LTIpOm49dGhpcy5jb3B5VjMoMCksdGhpcy5wcmV2aW91cy5wdXNoKG5bMF0sblsxXSxuWzJdKSx0aGlzLnByZXZpb3VzLnB1c2goblswXSxuWzFdLG5bMl0pO2ZvcihsZXQgcj0wO3I8dDtyKyspe2lmKHRoaXMuc2lkZS5wdXNoKDEpLHRoaXMuc2lkZS5wdXNoKC0xKSx0aGlzLndpZHRoQ2FsbGJhY2s/ZT10aGlzLndpZHRoQ2FsbGJhY2soci8odC0xKSk6ZT0xLHRoaXMud2lkdGgucHVzaChlKSx0aGlzLndpZHRoLnB1c2goZSksdGhpcy51dnMucHVzaChyLyh0LTEpLDApLHRoaXMudXZzLnB1c2goci8odC0xKSwxKSxyPHQtMSl7bj10aGlzLmNvcHlWMyhyKSx0aGlzLnByZXZpb3VzLnB1c2goblswXSxuWzFdLG5bMl0pLHRoaXMucHJldmlvdXMucHVzaChuWzBdLG5bMV0sblsyXSk7Y29uc3Qgcz1yKjI7dGhpcy5pbmRpY2VzX2FycmF5LnB1c2gocyxzKzEscysyKSx0aGlzLmluZGljZXNfYXJyYXkucHVzaChzKzIscysxLHMrMyl9cj4wJiYobj10aGlzLmNvcHlWMyhyKSx0aGlzLm5leHQucHVzaChuWzBdLG5bMV0sblsyXSksdGhpcy5uZXh0LnB1c2goblswXSxuWzFdLG5bMl0pKX10aGlzLmNvbXBhcmVWMyh0LTEsMCk/bj10aGlzLmNvcHlWMygxKTpuPXRoaXMuY29weVYzKHQtMSksdGhpcy5uZXh0LnB1c2goblswXSxuWzFdLG5bMl0pLHRoaXMubmV4dC5wdXNoKG5bMF0sblsxXSxuWzJdKSwhdGhpcy5fYXR0cmlidXRlc3x8dGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCE9PXRoaXMuY291bnRlcnMubGVuZ3RoP3RoaXMuX2F0dHJpYnV0ZXM9e3Bvc2l0aW9uOm5ldyBadChuZXcgRmxvYXQzMkFycmF5KHRoaXMucG9zaXRpb25zKSwzKSxwcmV2aW91czpuZXcgWnQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnByZXZpb3VzKSwzKSxuZXh0Om5ldyBadChuZXcgRmxvYXQzMkFycmF5KHRoaXMubmV4dCksMyksc2lkZTpuZXcgWnQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnNpZGUpLDEpLHdpZHRoOm5ldyBadChuZXcgRmxvYXQzMkFycmF5KHRoaXMud2lkdGgpLDEpLHV2Om5ldyBadChuZXcgRmxvYXQzMkFycmF5KHRoaXMudXZzKSwyKSxpbmRleDpuZXcgWnQobmV3IFVpbnQxNkFycmF5KHRoaXMuaW5kaWNlc19hcnJheSksMSksY291bnRlcnM6bmV3IFp0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5jb3VudGVycyksMSl9Oih0aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvcHlBcnJheShuZXcgRmxvYXQzMkFycmF5KHRoaXMucG9zaXRpb25zKSksdGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbi5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzLmNvcHlBcnJheShuZXcgRmxvYXQzMkFycmF5KHRoaXMucHJldmlvdXMpKSx0aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzLm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMubmV4dC5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLm5leHQpKSx0aGlzLl9hdHRyaWJ1dGVzLm5leHQubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5zaWRlLmNvcHlBcnJheShuZXcgRmxvYXQzMkFycmF5KHRoaXMuc2lkZSkpLHRoaXMuX2F0dHJpYnV0ZXMuc2lkZS5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLndpZHRoLmNvcHlBcnJheShuZXcgRmxvYXQzMkFycmF5KHRoaXMud2lkdGgpKSx0aGlzLl9hdHRyaWJ1dGVzLndpZHRoLm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMudXYuY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy51dnMpKSx0aGlzLl9hdHRyaWJ1dGVzLnV2Lm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMuaW5kZXguY29weUFycmF5KG5ldyBVaW50MTZBcnJheSh0aGlzLmluZGljZXNfYXJyYXkpKSx0aGlzLl9hdHRyaWJ1dGVzLmluZGV4Lm5lZWRzVXBkYXRlPSEwKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLHRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24pLHRoaXMuc2V0QXR0cmlidXRlKCJwcmV2aW91cyIsdGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cyksdGhpcy5zZXRBdHRyaWJ1dGUoIm5leHQiLHRoaXMuX2F0dHJpYnV0ZXMubmV4dCksdGhpcy5zZXRBdHRyaWJ1dGUoInNpZGUiLHRoaXMuX2F0dHJpYnV0ZXMuc2lkZSksdGhpcy5zZXRBdHRyaWJ1dGUoIndpZHRoIix0aGlzLl9hdHRyaWJ1dGVzLndpZHRoKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLHRoaXMuX2F0dHJpYnV0ZXMudXYpLHRoaXMuc2V0QXR0cmlidXRlKCJjb3VudGVycyIsdGhpcy5fYXR0cmlidXRlcy5jb3VudGVycyksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIix0aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uKSx0aGlzLnNldEF0dHJpYnV0ZSgicHJldmlvdXMiLHRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMpLHRoaXMuc2V0QXR0cmlidXRlKCJuZXh0Iix0aGlzLl9hdHRyaWJ1dGVzLm5leHQpLHRoaXMuc2V0QXR0cmlidXRlKCJzaWRlIix0aGlzLl9hdHRyaWJ1dGVzLnNpZGUpLHRoaXMuc2V0QXR0cmlidXRlKCJ3aWR0aCIsdGhpcy5fYXR0cmlidXRlcy53aWR0aCksdGhpcy5zZXRBdHRyaWJ1dGUoInV2Iix0aGlzLl9hdHRyaWJ1dGVzLnV2KSx0aGlzLnNldEF0dHJpYnV0ZSgiY291bnRlcnMiLHRoaXMuX2F0dHJpYnV0ZXMuY291bnRlcnMpLHRoaXMuc2V0SW5kZXgodGhpcy5fYXR0cmlidXRlcy5pbmRleCksdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSx0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpfWFkdmFuY2Uoe3g6dCx5OmUsejpufSl7Y29uc3Qgcj10aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5LHM9dGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cy5hcnJheSxvPXRoaXMuX2F0dHJpYnV0ZXMubmV4dC5hcnJheSxhPXIubGVuZ3RoO0lkKHIsMCxzLDAsYSksSWQociw2LHIsMCxhLTYpLHJbYS02XT10LHJbYS01XT1lLHJbYS00XT1uLHJbYS0zXT10LHJbYS0yXT1lLHJbYS0xXT1uLElkKHIsNixvLDAsYS02KSxvW2EtNl09dCxvW2EtNV09ZSxvW2EtNF09bixvW2EtM109dCxvW2EtMl09ZSxvW2EtMV09bix0aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uLm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5uZXh0Lm5lZWRzVXBkYXRlPSEwfX12YXIgcXY9aT0+e2NvbnN0e3NldFBvaW50V2lkdGg6dCxub2RlczplfT1pLG49bmV3IFNQO3JldHVybiBuLnNldFBvaW50cyhlLHQpLG59O2NvbnN0IGJQPSh7Y29vcmRpbmF0ZXNBcnI6aSxwcm9qZWN0aW9uOnQsbGluZVdpZHRoOmUsdXNlR3JvdXBzOm4sc3BsaXRQb2x5Z29uczpyfSk9Pntjb25zdCBzPXQmJm1hKHQpO2xldCBvPWkubWFwKGw9PnB1KGwscykpO3ImJihvPVBkKG8scikpO2NvbnN0IGE9by5tYXAoKGwsYyk9Pnt2YXIgaDtjb25zdCB1PShoPWVbY10pIT1udWxsP2g6ZVswXTtyZXR1cm4gcXYoe25vZGVzOmwsc2V0UG9pbnRXaWR0aDooKT0+dX0pfSk7cmV0dXJuIGdhKGEsbil9O3ZhciB3UD1pPT57Y29uc3R7cG9pbnRzOnR9PWksZT10LnJlZHVjZSgocixzLG8pPT4obzx0Lmxlbmd0aC0xJiZyLnB1c2gocyx0W28rMV0pLHIpLFtdKTtyZXR1cm4gbmV3IE50KCkuc2V0RnJvbVBvaW50cyhlKX07Y29uc3QgQVA9KHtjb29yZGluYXRlc0FycjppLHByb2plY3Rpb246dCxsaW5lV2lkdGg6ZSx1c2VHcm91cHM6bixzcGxpdFBvbHlnb25zOnJ9KT0+e2NvbnN0IHM9dCYmbWEodCk7bGV0IG89aS5tYXAobD0+cHUobCxzKSk7ciYmKG89UGQobyxyKSk7Y29uc3QgYT1vLm1hcCgobCxjKT0+d1Aoe3BvaW50czpsLm1hcCh1PT5uZXcgTCh1LngsdS55LDApKX0pKTtyZXR1cm4gZ2EoYSxuKX07dmFyIG11PXR5cGVvZiBnbG9iYWxUaGlzIT0idW5kZWZpbmVkIj9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT0idW5kZWZpbmVkIj9nbG9iYWw6dHlwZW9mIHNlbGYhPSJ1bmRlZmluZWQiP3NlbGY6e307ZnVuY3Rpb24gWXYoaSl7cmV0dXJuIGkmJmkuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGksImRlZmF1bHQiKT9pLmRlZmF1bHQ6aX1mdW5jdGlvbiBFUChpKXtpZihpLl9fZXNNb2R1bGUpcmV0dXJuIGk7dmFyIHQ9aS5kZWZhdWx0O2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXt2YXIgZT1mdW5jdGlvbiBuKCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBuP1JlZmxlY3QuY29uc3RydWN0KHQsYXJndW1lbnRzLHRoaXMuY29uc3RydWN0b3IpOnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtlLnByb3RvdHlwZT10LnByb3RvdHlwZX1lbHNlIGU9e307cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxuKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHIuZ2V0P3I6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGlbbl19fSl9KSxlfXZhciBMZD17ZXhwb3J0czp7fX07TGQuZXhwb3J0cz1ndSxMZC5leHBvcnRzLmRlZmF1bHQ9Z3U7ZnVuY3Rpb24gZ3UoaSx0LGUpe2U9ZXx8Mjt2YXIgbj10JiZ0Lmxlbmd0aCxyPW4/dFswXSplOmkubGVuZ3RoLHM9WnYoaSwwLHIsZSwhMCksbz1bXTtpZighc3x8cy5uZXh0PT09cy5wcmV2KXJldHVybiBvO3ZhciBhLGwsYyx1LGgsZixkO2lmKG4mJihzPUlQKGksdCxzLGUpKSxpLmxlbmd0aD44MCplKXthPWM9aVswXSxsPXU9aVsxXTtmb3IodmFyIHA9ZTtwPHI7cCs9ZSloPWlbcF0sZj1pW3ArMV0saDxhJiYoYT1oKSxmPGwmJihsPWYpLGg+YyYmKGM9aCksZj51JiYodT1mKTtkPU1hdGgubWF4KGMtYSx1LWwpLGQ9ZCE9PTA/MzI3NjcvZDowfXJldHVybiB5YShzLG8sZSxhLGwsZCwwKSxvfWZ1bmN0aW9uIFp2KGksdCxlLG4scil7dmFyIHMsbztpZihyPT09TmQoaSx0LGUsbik+MClmb3Iocz10O3M8ZTtzKz1uKW89anYocyxpW3NdLGlbcysxXSxvKTtlbHNlIGZvcihzPWUtbjtzPj10O3MtPW4pbz1qdihzLGlbc10saVtzKzFdLG8pO3JldHVybiBvJiZ5dShvLG8ubmV4dCkmJihfYShvKSxvPW8ubmV4dCksb31mdW5jdGlvbiBHcihpLHQpe2lmKCFpKXJldHVybiBpO3R8fCh0PWkpO3ZhciBlPWksbjtkbyBpZihuPSExLCFlLnN0ZWluZXImJih5dShlLGUubmV4dCl8fF9lKGUucHJldixlLGUubmV4dCk9PT0wKSl7aWYoX2EoZSksZT10PWUucHJldixlPT09ZS5uZXh0KWJyZWFrO249ITB9ZWxzZSBlPWUubmV4dDt3aGlsZShufHxlIT09dCk7cmV0dXJuIHR9ZnVuY3Rpb24geWEoaSx0LGUsbixyLHMsbyl7aWYoaSl7IW8mJnMmJkZQKGksbixyLHMpO2Zvcih2YXIgYT1pLGwsYztpLnByZXYhPT1pLm5leHQ7KXtpZihsPWkucHJldixjPWkubmV4dCxzP0NQKGksbixyLHMpOlRQKGkpKXt0LnB1c2gobC5pL2V8MCksdC5wdXNoKGkuaS9lfDApLHQucHVzaChjLmkvZXwwKSxfYShpKSxpPWMubmV4dCxhPWMubmV4dDtjb250aW51ZX1pZihpPWMsaT09PWEpe28/bz09PTE/KGk9UlAoR3IoaSksdCxlKSx5YShpLHQsZSxuLHIscywyKSk6bz09PTImJlBQKGksdCxlLG4scixzKTp5YShHcihpKSx0LGUsbixyLHMsMSk7YnJlYWt9fX19ZnVuY3Rpb24gVFAoaSl7dmFyIHQ9aS5wcmV2LGU9aSxuPWkubmV4dDtpZihfZSh0LGUsbik+PTApcmV0dXJuITE7Zm9yKHZhciByPXQueCxzPWUueCxvPW4ueCxhPXQueSxsPWUueSxjPW4ueSx1PXI8cz9yPG8/cjpvOnM8bz9zOm8saD1hPGw/YTxjP2E6YzpsPGM/bDpjLGY9cj5zP3I+bz9yOm86cz5vP3M6byxkPWE+bD9hPmM/YTpjOmw+Yz9sOmMscD1uLm5leHQ7cCE9PXQ7KXtpZihwLng+PXUmJnAueDw9ZiYmcC55Pj1oJiZwLnk8PWQmJkdzKHIsYSxzLGwsbyxjLHAueCxwLnkpJiZfZShwLnByZXYscCxwLm5leHQpPj0wKXJldHVybiExO3A9cC5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIENQKGksdCxlLG4pe3ZhciByPWkucHJldixzPWksbz1pLm5leHQ7aWYoX2UocixzLG8pPj0wKXJldHVybiExO2Zvcih2YXIgYT1yLngsbD1zLngsYz1vLngsdT1yLnksaD1zLnksZj1vLnksZD1hPGw/YTxjP2E6YzpsPGM/bDpjLHA9dTxoP3U8Zj91OmY6aDxmP2g6Zix5PWE+bD9hPmM/YTpjOmw+Yz9sOmMsbT11Pmg/dT5mP3U6ZjpoPmY/aDpmLGc9RGQoZCxwLHQsZSxuKSx4PURkKHksbSx0LGUsbiksdj1pLnByZXZaLF89aS5uZXh0Wjt2JiZ2Lno+PWcmJl8mJl8uejw9eDspe2lmKHYueD49ZCYmdi54PD15JiZ2Lnk+PXAmJnYueTw9bSYmdiE9PXImJnYhPT1vJiZHcyhhLHUsbCxoLGMsZix2Lngsdi55KSYmX2Uodi5wcmV2LHYsdi5uZXh0KT49MHx8KHY9di5wcmV2WixfLng+PWQmJl8ueDw9eSYmXy55Pj1wJiZfLnk8PW0mJl8hPT1yJiZfIT09byYmR3MoYSx1LGwsaCxjLGYsXy54LF8ueSkmJl9lKF8ucHJldixfLF8ubmV4dCk+PTApKXJldHVybiExO189Xy5uZXh0Wn1mb3IoO3YmJnYuej49Zzspe2lmKHYueD49ZCYmdi54PD15JiZ2Lnk+PXAmJnYueTw9bSYmdiE9PXImJnYhPT1vJiZHcyhhLHUsbCxoLGMsZix2Lngsdi55KSYmX2Uodi5wcmV2LHYsdi5uZXh0KT49MClyZXR1cm4hMTt2PXYucHJldlp9Zm9yKDtfJiZfLno8PXg7KXtpZihfLng+PWQmJl8ueDw9eSYmXy55Pj1wJiZfLnk8PW0mJl8hPT1yJiZfIT09byYmR3MoYSx1LGwsaCxjLGYsXy54LF8ueSkmJl9lKF8ucHJldixfLF8ubmV4dCk+PTApcmV0dXJuITE7Xz1fLm5leHRafXJldHVybiEwfWZ1bmN0aW9uIFJQKGksdCxlKXt2YXIgbj1pO2Rve3ZhciByPW4ucHJldixzPW4ubmV4dC5uZXh0OyF5dShyLHMpJiZKdihyLG4sbi5uZXh0LHMpJiZ2YShyLHMpJiZ2YShzLHIpJiYodC5wdXNoKHIuaS9lfDApLHQucHVzaChuLmkvZXwwKSx0LnB1c2gocy5pL2V8MCksX2EobiksX2Eobi5uZXh0KSxuPWk9cyksbj1uLm5leHR9d2hpbGUobiE9PWkpO3JldHVybiBHcihuKX1mdW5jdGlvbiBQUChpLHQsZSxuLHIscyl7dmFyIG89aTtkb3tmb3IodmFyIGE9by5uZXh0Lm5leHQ7YSE9PW8ucHJldjspe2lmKG8uaSE9PWEuaSYmelAobyxhKSl7dmFyIGw9S3YobyxhKTtvPUdyKG8sby5uZXh0KSxsPUdyKGwsbC5uZXh0KSx5YShvLHQsZSxuLHIscywwKSx5YShsLHQsZSxuLHIscywwKTtyZXR1cm59YT1hLm5leHR9bz1vLm5leHR9d2hpbGUobyE9PWkpfWZ1bmN0aW9uIElQKGksdCxlLG4pe3ZhciByPVtdLHMsbyxhLGwsYztmb3Iocz0wLG89dC5sZW5ndGg7czxvO3MrKylhPXRbc10qbixsPXM8by0xP3RbcysxXSpuOmkubGVuZ3RoLGM9WnYoaSxhLGwsbiwhMSksYz09PWMubmV4dCYmKGMuc3RlaW5lcj0hMCksci5wdXNoKEJQKGMpKTtmb3Ioci5zb3J0KExQKSxzPTA7czxyLmxlbmd0aDtzKyspZT1EUChyW3NdLGUpO3JldHVybiBlfWZ1bmN0aW9uIExQKGksdCl7cmV0dXJuIGkueC10Lnh9ZnVuY3Rpb24gRFAoaSx0KXt2YXIgZT1VUChpLHQpO2lmKCFlKXJldHVybiB0O3ZhciBuPUt2KGUsaSk7cmV0dXJuIEdyKG4sbi5uZXh0KSxHcihlLGUubmV4dCl9ZnVuY3Rpb24gVVAoaSx0KXt2YXIgZT10LG49aS54LHI9aS55LHM9LTEvMCxvO2Rve2lmKHI8PWUueSYmcj49ZS5uZXh0LnkmJmUubmV4dC55IT09ZS55KXt2YXIgYT1lLngrKHItZS55KSooZS5uZXh0LngtZS54KS8oZS5uZXh0LnktZS55KTtpZihhPD1uJiZhPnMmJihzPWEsbz1lLng8ZS5uZXh0Lng/ZTplLm5leHQsYT09PW4pKXJldHVybiBvfWU9ZS5uZXh0fXdoaWxlKGUhPT10KTtpZighbylyZXR1cm4gbnVsbDt2YXIgbD1vLGM9by54LHU9by55LGg9MS8wLGY7ZT1vO2RvIG4+PWUueCYmZS54Pj1jJiZuIT09ZS54JiZHcyhyPHU/bjpzLHIsYyx1LHI8dT9zOm4scixlLngsZS55KSYmKGY9TWF0aC5hYnMoci1lLnkpLyhuLWUueCksdmEoZSxpKSYmKGY8aHx8Zj09PWgmJihlLng+by54fHxlLng9PT1vLngmJk5QKG8sZSkpKSYmKG89ZSxoPWYpKSxlPWUubmV4dDt3aGlsZShlIT09bCk7cmV0dXJuIG99ZnVuY3Rpb24gTlAoaSx0KXtyZXR1cm4gX2UoaS5wcmV2LGksdC5wcmV2KTwwJiZfZSh0Lm5leHQsaSxpLm5leHQpPDB9ZnVuY3Rpb24gRlAoaSx0LGUsbil7dmFyIHI9aTtkbyByLno9PT0wJiYoci56PURkKHIueCxyLnksdCxlLG4pKSxyLnByZXZaPXIucHJldixyLm5leHRaPXIubmV4dCxyPXIubmV4dDt3aGlsZShyIT09aSk7ci5wcmV2Wi5uZXh0Wj1udWxsLHIucHJldlo9bnVsbCxPUChyKX1mdW5jdGlvbiBPUChpKXt2YXIgdCxlLG4scixzLG8sYSxsLGM9MTtkb3tmb3IoZT1pLGk9bnVsbCxzPW51bGwsbz0wO2U7KXtmb3IobysrLG49ZSxhPTAsdD0wO3Q8YyYmKGErKyxuPW4ubmV4dFosISFuKTt0KyspO2ZvcihsPWM7YT4wfHxsPjAmJm47KWEhPT0wJiYobD09PTB8fCFufHxlLno8PW4ueik/KHI9ZSxlPWUubmV4dFosYS0tKToocj1uLG49bi5uZXh0WixsLS0pLHM/cy5uZXh0Wj1yOmk9cixyLnByZXZaPXMscz1yO2U9bn1zLm5leHRaPW51bGwsYyo9Mn13aGlsZShvPjEpO3JldHVybiBpfWZ1bmN0aW9uIERkKGksdCxlLG4scil7cmV0dXJuIGk9KGktZSkqcnwwLHQ9KHQtbikqcnwwLGk9KGl8aTw8OCkmMTY3MTE5MzUsaT0oaXxpPDw0KSYyNTI2NDUxMzUsaT0oaXxpPDwyKSY4NTg5OTM0NTksaT0oaXxpPDwxKSYxNDMxNjU1NzY1LHQ9KHR8dDw8OCkmMTY3MTE5MzUsdD0odHx0PDw0KSYyNTI2NDUxMzUsdD0odHx0PDwyKSY4NTg5OTM0NTksdD0odHx0PDwxKSYxNDMxNjU1NzY1LGl8dDw8MX1mdW5jdGlvbiBCUChpKXt2YXIgdD1pLGU9aTtkbyh0Lng8ZS54fHx0Lng9PT1lLngmJnQueTxlLnkpJiYoZT10KSx0PXQubmV4dDt3aGlsZSh0IT09aSk7cmV0dXJuIGV9ZnVuY3Rpb24gR3MoaSx0LGUsbixyLHMsbyxhKXtyZXR1cm4oci1vKSoodC1hKT49KGktbykqKHMtYSkmJihpLW8pKihuLWEpPj0oZS1vKSoodC1hKSYmKGUtbykqKHMtYSk+PShyLW8pKihuLWEpfWZ1bmN0aW9uIHpQKGksdCl7cmV0dXJuIGkubmV4dC5pIT09dC5pJiZpLnByZXYuaSE9PXQuaSYmIWtQKGksdCkmJih2YShpLHQpJiZ2YSh0LGkpJiZHUChpLHQpJiYoX2UoaS5wcmV2LGksdC5wcmV2KXx8X2UoaSx0LnByZXYsdCkpfHx5dShpLHQpJiZfZShpLnByZXYsaSxpLm5leHQpPjAmJl9lKHQucHJldix0LHQubmV4dCk+MCl9ZnVuY3Rpb24gX2UoaSx0LGUpe3JldHVybih0LnktaS55KSooZS54LXQueCktKHQueC1pLngpKihlLnktdC55KX1mdW5jdGlvbiB5dShpLHQpe3JldHVybiBpLng9PT10LngmJmkueT09PXQueX1mdW5jdGlvbiBKdihpLHQsZSxuKXt2YXIgcj1fdShfZShpLHQsZSkpLHM9X3UoX2UoaSx0LG4pKSxvPV91KF9lKGUsbixpKSksYT1fdShfZShlLG4sdCkpO3JldHVybiEhKHIhPT1zJiZvIT09YXx8cj09PTAmJnZ1KGksZSx0KXx8cz09PTAmJnZ1KGksbix0KXx8bz09PTAmJnZ1KGUsaSxuKXx8YT09PTAmJnZ1KGUsdCxuKSl9ZnVuY3Rpb24gdnUoaSx0LGUpe3JldHVybiB0Lng8PU1hdGgubWF4KGkueCxlLngpJiZ0Lng+PU1hdGgubWluKGkueCxlLngpJiZ0Lnk8PU1hdGgubWF4KGkueSxlLnkpJiZ0Lnk+PU1hdGgubWluKGkueSxlLnkpfWZ1bmN0aW9uIF91KGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH1mdW5jdGlvbiBrUChpLHQpe3ZhciBlPWk7ZG97aWYoZS5pIT09aS5pJiZlLm5leHQuaSE9PWkuaSYmZS5pIT09dC5pJiZlLm5leHQuaSE9PXQuaSYmSnYoZSxlLm5leHQsaSx0KSlyZXR1cm4hMDtlPWUubmV4dH13aGlsZShlIT09aSk7cmV0dXJuITF9ZnVuY3Rpb24gdmEoaSx0KXtyZXR1cm4gX2UoaS5wcmV2LGksaS5uZXh0KTwwP19lKGksdCxpLm5leHQpPj0wJiZfZShpLGkucHJldix0KT49MDpfZShpLHQsaS5wcmV2KTwwfHxfZShpLGkubmV4dCx0KTwwfWZ1bmN0aW9uIEdQKGksdCl7dmFyIGU9aSxuPSExLHI9KGkueCt0LngpLzIscz0oaS55K3QueSkvMjtkbyBlLnk+cyE9ZS5uZXh0Lnk+cyYmZS5uZXh0LnkhPT1lLnkmJnI8KGUubmV4dC54LWUueCkqKHMtZS55KS8oZS5uZXh0LnktZS55KStlLngmJihuPSFuKSxlPWUubmV4dDt3aGlsZShlIT09aSk7cmV0dXJuIG59ZnVuY3Rpb24gS3YoaSx0KXt2YXIgZT1uZXcgVWQoaS5pLGkueCxpLnkpLG49bmV3IFVkKHQuaSx0LngsdC55KSxyPWkubmV4dCxzPXQucHJldjtyZXR1cm4gaS5uZXh0PXQsdC5wcmV2PWksZS5uZXh0PXIsci5wcmV2PWUsbi5uZXh0PWUsZS5wcmV2PW4scy5uZXh0PW4sbi5wcmV2PXMsbn1mdW5jdGlvbiBqdihpLHQsZSxuKXt2YXIgcj1uZXcgVWQoaSx0LGUpO3JldHVybiBuPyhyLm5leHQ9bi5uZXh0LHIucHJldj1uLG4ubmV4dC5wcmV2PXIsbi5uZXh0PXIpOihyLnByZXY9cixyLm5leHQ9cikscn1mdW5jdGlvbiBfYShpKXtpLm5leHQucHJldj1pLnByZXYsaS5wcmV2Lm5leHQ9aS5uZXh0LGkucHJldlomJihpLnByZXZaLm5leHRaPWkubmV4dFopLGkubmV4dFomJihpLm5leHRaLnByZXZaPWkucHJldlopfWZ1bmN0aW9uIFVkKGksdCxlKXt0aGlzLmk9aSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLnByZXY9bnVsbCx0aGlzLm5leHQ9bnVsbCx0aGlzLno9MCx0aGlzLnByZXZaPW51bGwsdGhpcy5uZXh0Wj1udWxsLHRoaXMuc3RlaW5lcj0hMX1ndS5kZXZpYXRpb249ZnVuY3Rpb24oaSx0LGUsbil7dmFyIHI9dCYmdC5sZW5ndGgscz1yP3RbMF0qZTppLmxlbmd0aCxvPU1hdGguYWJzKE5kKGksMCxzLGUpKTtpZihyKWZvcih2YXIgYT0wLGw9dC5sZW5ndGg7YTxsO2ErKyl7dmFyIGM9dFthXSplLHU9YTxsLTE/dFthKzFdKmU6aS5sZW5ndGg7by09TWF0aC5hYnMoTmQoaSxjLHUsZSkpfXZhciBoPTA7Zm9yKGE9MDthPG4ubGVuZ3RoO2ErPTMpe3ZhciBmPW5bYV0qZSxkPW5bYSsxXSplLHA9blthKzJdKmU7aCs9TWF0aC5hYnMoKGlbZl0taVtwXSkqKGlbZCsxXS1pW2YrMV0pLShpW2ZdLWlbZF0pKihpW3ArMV0taVtmKzFdKSl9cmV0dXJuIG89PT0wJiZoPT09MD8wOk1hdGguYWJzKChoLW8pL28pfTtmdW5jdGlvbiBOZChpLHQsZSxuKXtmb3IodmFyIHI9MCxzPXQsbz1lLW47czxlO3MrPW4pcis9KGlbb10taVtzXSkqKGlbcysxXStpW28rMV0pLG89cztyZXR1cm4gcn1ndS5mbGF0dGVuPWZ1bmN0aW9uKGkpe2Zvcih2YXIgdD1pWzBdWzBdLmxlbmd0aCxlPXt2ZXJ0aWNlczpbXSxob2xlczpbXSxkaW1lbnNpb25zOnR9LG49MCxyPTA7cjxpLmxlbmd0aDtyKyspe2Zvcih2YXIgcz0wO3M8aVtyXS5sZW5ndGg7cysrKWZvcih2YXIgbz0wO288dDtvKyspZS52ZXJ0aWNlcy5wdXNoKGlbcl1bc11bb10pO3I+MCYmKG4rPWlbci0xXS5sZW5ndGgsZS5ob2xlcy5wdXNoKG4pKX1yZXR1cm4gZX07dmFyIFZQPUxkLmV4cG9ydHMsRmQ9WXYoVlApLFF2PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsdF89ZnVuY3Rpb24odCl7dmFyIGU9UXYuY2FsbCh0KSxuPWU9PT0iW29iamVjdCBBcmd1bWVudHNdIjtyZXR1cm4gbnx8KG49ZSE9PSJbb2JqZWN0IEFycmF5XSImJnQhPT1udWxsJiZ0eXBlb2YgdD09Im9iamVjdCImJnR5cGVvZiB0Lmxlbmd0aD09Im51bWJlciImJnQubGVuZ3RoPj0wJiZRdi5jYWxsKHQuY2FsbGVlKT09PSJbb2JqZWN0IEZ1bmN0aW9uXSIpLG59LE9kLGVfO2Z1bmN0aW9uIEhQKCl7aWYoZV8pcmV0dXJuIE9kO2VfPTE7dmFyIGk7aWYoIU9iamVjdC5rZXlzKXt2YXIgdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxuPXRfLHI9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxzPSFyLmNhbGwoe3RvU3RyaW5nOm51bGx9LCJ0b1N0cmluZyIpLG89ci5jYWxsKGZ1bmN0aW9uKCl7fSwicHJvdG90eXBlIiksYT1bInRvU3RyaW5nIiwidG9Mb2NhbGVTdHJpbmciLCJ2YWx1ZU9mIiwiaGFzT3duUHJvcGVydHkiLCJpc1Byb3RvdHlwZU9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJjb25zdHJ1Y3RvciJdLGw9ZnVuY3Rpb24oZil7dmFyIGQ9Zi5jb25zdHJ1Y3RvcjtyZXR1cm4gZCYmZC5wcm90b3R5cGU9PT1mfSxjPXskYXBwbGljYXRpb25DYWNoZTohMCwkY29uc29sZTohMCwkZXh0ZXJuYWw6ITAsJGZyYW1lOiEwLCRmcmFtZUVsZW1lbnQ6ITAsJGZyYW1lczohMCwkaW5uZXJIZWlnaHQ6ITAsJGlubmVyV2lkdGg6ITAsJG9ubW96ZnVsbHNjcmVlbmNoYW5nZTohMCwkb25tb3pmdWxsc2NyZWVuZXJyb3I6ITAsJG91dGVySGVpZ2h0OiEwLCRvdXRlcldpZHRoOiEwLCRwYWdlWE9mZnNldDohMCwkcGFnZVlPZmZzZXQ6ITAsJHBhcmVudDohMCwkc2Nyb2xsTGVmdDohMCwkc2Nyb2xsVG9wOiEwLCRzY3JvbGxYOiEwLCRzY3JvbGxZOiEwLCRzZWxmOiEwLCR3ZWJraXRJbmRleGVkREI6ITAsJHdlYmtpdFN0b3JhZ2VJbmZvOiEwLCR3aW5kb3c6ITB9LHU9ZnVuY3Rpb24oKXtpZih0eXBlb2Ygd2luZG93PT0idW5kZWZpbmVkIilyZXR1cm4hMTtmb3IodmFyIGYgaW4gd2luZG93KXRyeXtpZighY1siJCIrZl0mJnQuY2FsbCh3aW5kb3csZikmJndpbmRvd1tmXSE9PW51bGwmJnR5cGVvZiB3aW5kb3dbZl09PSJvYmplY3QiKXRyeXtsKHdpbmRvd1tmXSl9Y2F0Y2goZCl7cmV0dXJuITB9fWNhdGNoKGQpe3JldHVybiEwfXJldHVybiExfSgpLGg9ZnVuY3Rpb24oZil7aWYodHlwZW9mIHdpbmRvdz09InVuZGVmaW5lZCJ8fCF1KXJldHVybiBsKGYpO3RyeXtyZXR1cm4gbChmKX1jYXRjaChkKXtyZXR1cm4hMX19O2k9ZnVuY3Rpb24oZCl7dmFyIHA9ZCE9PW51bGwmJnR5cGVvZiBkPT0ib2JqZWN0Iix5PWUuY2FsbChkKT09PSJbb2JqZWN0IEZ1bmN0aW9uXSIsbT1uKGQpLGc9cCYmZS5jYWxsKGQpPT09IltvYmplY3QgU3RyaW5nXSIseD1bXTtpZighcCYmIXkmJiFtKXRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTt2YXIgdj1vJiZ5O2lmKGcmJmQubGVuZ3RoPjAmJiF0LmNhbGwoZCwwKSlmb3IodmFyIF89MDtfPGQubGVuZ3RoOysrXyl4LnB1c2goU3RyaW5nKF8pKTtpZihtJiZkLmxlbmd0aD4wKWZvcih2YXIgRT0wO0U8ZC5sZW5ndGg7KytFKXgucHVzaChTdHJpbmcoRSkpO2Vsc2UgZm9yKHZhciBiIGluIGQpISh2JiZiPT09InByb3RvdHlwZSIpJiZ0LmNhbGwoZCxiKSYmeC5wdXNoKFN0cmluZyhiKSk7aWYocylmb3IodmFyIFQ9aChkKSxQPTA7UDxhLmxlbmd0aDsrK1ApIShUJiZhW1BdPT09ImNvbnN0cnVjdG9yIikmJnQuY2FsbChkLGFbUF0pJiZ4LnB1c2goYVtQXSk7cmV0dXJuIHh9fXJldHVybiBPZD1pLE9kfXZhciBXUD1BcnJheS5wcm90b3R5cGUuc2xpY2UsJFA9dF8sbl89T2JqZWN0LmtleXMseHU9bl8/ZnVuY3Rpb24odCl7cmV0dXJuIG5fKHQpfTpIUCgpLGlfPU9iamVjdC5rZXlzO3h1LnNoaW09ZnVuY3Rpb24oKXtpZihPYmplY3Qua2V5cyl7dmFyIHQ9ZnVuY3Rpb24oKXt2YXIgZT1PYmplY3Qua2V5cyhhcmd1bWVudHMpO3JldHVybiBlJiZlLmxlbmd0aD09PWFyZ3VtZW50cy5sZW5ndGh9KDEsMik7dHx8KE9iamVjdC5rZXlzPWZ1bmN0aW9uKG4pe3JldHVybiAkUChuKT9pXyhXUC5jYWxsKG4pKTppXyhuKX0pfWVsc2UgT2JqZWN0LmtleXM9eHU7cmV0dXJuIE9iamVjdC5rZXlzfHx4dX07dmFyIEJkPXh1LFhQPUVycm9yLHFQPUV2YWxFcnJvcixZUD1SYW5nZUVycm9yLFpQPVJlZmVyZW5jZUVycm9yLHJfPVN5bnRheEVycm9yLGVyPVR5cGVFcnJvcixKUD1VUklFcnJvcixNdT1mdW5jdGlvbigpe2lmKHR5cGVvZiBTeW1ib2whPSJmdW5jdGlvbiJ8fHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzIT0iZnVuY3Rpb24iKXJldHVybiExO2lmKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJzeW1ib2wiKXJldHVybiEwO3ZhciB0PXt9LGU9U3ltYm9sKCJ0ZXN0Iiksbj1PYmplY3QoZSk7aWYodHlwZW9mIGU9PSJzdHJpbmcifHxPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkhPT0iW29iamVjdCBTeW1ib2xdInx8T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG4pIT09IltvYmplY3QgU3ltYm9sXSIpcmV0dXJuITE7dmFyIHI9NDI7dFtlXT1yO2ZvcihlIGluIHQpcmV0dXJuITE7aWYodHlwZW9mIE9iamVjdC5rZXlzPT0iZnVuY3Rpb24iJiZPYmplY3Qua2V5cyh0KS5sZW5ndGghPT0wfHx0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM9PSJmdW5jdGlvbiImJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpLmxlbmd0aCE9PTApcmV0dXJuITE7dmFyIHM9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtpZihzLmxlbmd0aCE9PTF8fHNbMF0hPT1lfHwhT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsZSkpcmV0dXJuITE7aWYodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I9PSJmdW5jdGlvbiIpe3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKTtpZihvLnZhbHVlIT09cnx8by5lbnVtZXJhYmxlIT09ITApcmV0dXJuITF9cmV0dXJuITB9LHNfPXR5cGVvZiBTeW1ib2whPSJ1bmRlZmluZWQiJiZTeW1ib2wsS1A9TXUsemQ9ZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIHNfIT0iZnVuY3Rpb24ifHx0eXBlb2YgU3ltYm9sIT0iZnVuY3Rpb24ifHx0eXBlb2Ygc18oImZvbyIpIT0ic3ltYm9sInx8dHlwZW9mIFN5bWJvbCgiYmFyIikhPSJzeW1ib2wiPyExOktQKCl9LGtkPXtfX3Byb3RvX186bnVsbCxmb286e319LGpQPU9iamVjdCxRUD1mdW5jdGlvbigpe3JldHVybntfX3Byb3RvX186a2R9LmZvbz09PWtkLmZvbyYmIShrZCBpbnN0YW5jZW9mIGpQKX0sdDI9IkZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgIixlMj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLG4yPU1hdGgubWF4LGkyPSJbb2JqZWN0IEZ1bmN0aW9uXSIsb189ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0wO3I8dC5sZW5ndGg7cis9MSluW3JdPXRbcl07Zm9yKHZhciBzPTA7czxlLmxlbmd0aDtzKz0xKW5bcyt0Lmxlbmd0aF09ZVtzXTtyZXR1cm4gbn0scjI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj1lLHM9MDtyPHQubGVuZ3RoO3IrPTEscys9MSluW3NdPXRbcl07cmV0dXJuIG59LHMyPWZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPSIiLG49MDtuPGkubGVuZ3RoO24rPTEpZSs9aVtuXSxuKzE8aS5sZW5ndGgmJihlKz10KTtyZXR1cm4gZX0sbzI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih0eXBlb2YgZSE9ImZ1bmN0aW9uInx8ZTIuYXBwbHkoZSkhPT1pMil0aHJvdyBuZXcgVHlwZUVycm9yKHQyK2UpO2Zvcih2YXIgbj1yMihhcmd1bWVudHMsMSkscixzPWZ1bmN0aW9uKCl7aWYodGhpcyBpbnN0YW5jZW9mIHIpe3ZhciB1PWUuYXBwbHkodGhpcyxvXyhuLGFyZ3VtZW50cykpO3JldHVybiBPYmplY3QodSk9PT11P3U6dGhpc31yZXR1cm4gZS5hcHBseSh0LG9fKG4sYXJndW1lbnRzKSl9LG89bjIoMCxlLmxlbmd0aC1uLmxlbmd0aCksYT1bXSxsPTA7bDxvO2wrKylhW2xdPSIkIitsO2lmKHI9RnVuY3Rpb24oImJpbmRlciIsInJldHVybiBmdW5jdGlvbiAoIitzMihhLCIsIikrIil7IHJldHVybiBiaW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOyB9IikocyksZS5wcm90b3R5cGUpe3ZhciBjPWZ1bmN0aW9uKCl7fTtjLnByb3RvdHlwZT1lLnByb3RvdHlwZSxyLnByb3RvdHlwZT1uZXcgYyxjLnByb3RvdHlwZT1udWxsfXJldHVybiByfSxhMj1vMixHZD1GdW5jdGlvbi5wcm90b3R5cGUuYmluZHx8YTIsbDI9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsYzI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx1Mj1HZCxhXz11Mi5jYWxsKGwyLGMyKSxqdCxoMj1YUCxmMj1xUCxkMj1ZUCxwMj1aUCxWcz1yXyxIcz1lcixtMj1KUCxsXz1GdW5jdGlvbixWZD1mdW5jdGlvbihpKXt0cnl7cmV0dXJuIGxfKCcidXNlIHN0cmljdCI7IHJldHVybiAoJytpKyIpLmNvbnN0cnVjdG9yOyIpKCl9Y2F0Y2godCl7fX0sVnI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtpZihWcil0cnl7VnIoe30sIiIpfWNhdGNoKGkpe1ZyPW51bGx9dmFyIEhkPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEhzfSxnMj1Wcj9mdW5jdGlvbigpe3RyeXtyZXR1cm4gYXJndW1lbnRzLmNhbGxlZSxIZH1jYXRjaChpKXt0cnl7cmV0dXJuIFZyKGFyZ3VtZW50cywiY2FsbGVlIikuZ2V0fWNhdGNoKHQpe3JldHVybiBIZH19fSgpOkhkLFdzPXpkKCkseTI9UVAoKSx6ZT1PYmplY3QuZ2V0UHJvdG90eXBlT2Z8fCh5Mj9mdW5jdGlvbihpKXtyZXR1cm4gaS5fX3Byb3RvX199Om51bGwpLCRzPXt9LHYyPXR5cGVvZiBVaW50OEFycmF5PT0idW5kZWZpbmVkInx8IXplP2p0OnplKFVpbnQ4QXJyYXkpLEhyPXtfX3Byb3RvX186bnVsbCwiJUFnZ3JlZ2F0ZUVycm9yJSI6dHlwZW9mIEFnZ3JlZ2F0ZUVycm9yPT0idW5kZWZpbmVkIj9qdDpBZ2dyZWdhdGVFcnJvciwiJUFycmF5JSI6QXJyYXksIiVBcnJheUJ1ZmZlciUiOnR5cGVvZiBBcnJheUJ1ZmZlcj09InVuZGVmaW5lZCI/anQ6QXJyYXlCdWZmZXIsIiVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSI6V3MmJnplP3plKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSk6anQsIiVBc3luY0Zyb21TeW5jSXRlcmF0b3JQcm90b3R5cGUlIjpqdCwiJUFzeW5jRnVuY3Rpb24lIjokcywiJUFzeW5jR2VuZXJhdG9yJSI6JHMsIiVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSI6JHMsIiVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJSI6JHMsIiVBdG9taWNzJSI6dHlwZW9mIEF0b21pY3M9PSJ1bmRlZmluZWQiP2p0OkF0b21pY3MsIiVCaWdJbnQlIjp0eXBlb2YgQmlnSW50PT0idW5kZWZpbmVkIj9qdDpCaWdJbnQsIiVCaWdJbnQ2NEFycmF5JSI6dHlwZW9mIEJpZ0ludDY0QXJyYXk9PSJ1bmRlZmluZWQiP2p0OkJpZ0ludDY0QXJyYXksIiVCaWdVaW50NjRBcnJheSUiOnR5cGVvZiBCaWdVaW50NjRBcnJheT09InVuZGVmaW5lZCI/anQ6QmlnVWludDY0QXJyYXksIiVCb29sZWFuJSI6Qm9vbGVhbiwiJURhdGFWaWV3JSI6dHlwZW9mIERhdGFWaWV3PT0idW5kZWZpbmVkIj9qdDpEYXRhVmlldywiJURhdGUlIjpEYXRlLCIlZGVjb2RlVVJJJSI6ZGVjb2RlVVJJLCIlZGVjb2RlVVJJQ29tcG9uZW50JSI6ZGVjb2RlVVJJQ29tcG9uZW50LCIlZW5jb2RlVVJJJSI6ZW5jb2RlVVJJLCIlZW5jb2RlVVJJQ29tcG9uZW50JSI6ZW5jb2RlVVJJQ29tcG9uZW50LCIlRXJyb3IlIjpoMiwiJWV2YWwlIjpldmFsLCIlRXZhbEVycm9yJSI6ZjIsIiVGbG9hdDMyQXJyYXklIjp0eXBlb2YgRmxvYXQzMkFycmF5PT0idW5kZWZpbmVkIj9qdDpGbG9hdDMyQXJyYXksIiVGbG9hdDY0QXJyYXklIjp0eXBlb2YgRmxvYXQ2NEFycmF5PT0idW5kZWZpbmVkIj9qdDpGbG9hdDY0QXJyYXksIiVGaW5hbGl6YXRpb25SZWdpc3RyeSUiOnR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT09InVuZGVmaW5lZCI/anQ6RmluYWxpemF0aW9uUmVnaXN0cnksIiVGdW5jdGlvbiUiOmxfLCIlR2VuZXJhdG9yRnVuY3Rpb24lIjokcywiJUludDhBcnJheSUiOnR5cGVvZiBJbnQ4QXJyYXk9PSJ1bmRlZmluZWQiP2p0OkludDhBcnJheSwiJUludDE2QXJyYXklIjp0eXBlb2YgSW50MTZBcnJheT09InVuZGVmaW5lZCI/anQ6SW50MTZBcnJheSwiJUludDMyQXJyYXklIjp0eXBlb2YgSW50MzJBcnJheT09InVuZGVmaW5lZCI/anQ6SW50MzJBcnJheSwiJWlzRmluaXRlJSI6aXNGaW5pdGUsIiVpc05hTiUiOmlzTmFOLCIlSXRlcmF0b3JQcm90b3R5cGUlIjpXcyYmemU/emUoemUoW11bU3ltYm9sLml0ZXJhdG9yXSgpKSk6anQsIiVKU09OJSI6dHlwZW9mIEpTT049PSJvYmplY3QiP0pTT046anQsIiVNYXAlIjp0eXBlb2YgTWFwPT0idW5kZWZpbmVkIj9qdDpNYXAsIiVNYXBJdGVyYXRvclByb3RvdHlwZSUiOnR5cGVvZiBNYXA9PSJ1bmRlZmluZWQifHwhV3N8fCF6ZT9qdDp6ZShuZXcgTWFwKClbU3ltYm9sLml0ZXJhdG9yXSgpKSwiJU1hdGglIjpNYXRoLCIlTnVtYmVyJSI6TnVtYmVyLCIlT2JqZWN0JSI6T2JqZWN0LCIlcGFyc2VGbG9hdCUiOnBhcnNlRmxvYXQsIiVwYXJzZUludCUiOnBhcnNlSW50LCIlUHJvbWlzZSUiOnR5cGVvZiBQcm9taXNlPT0idW5kZWZpbmVkIj9qdDpQcm9taXNlLCIlUHJveHklIjp0eXBlb2YgUHJveHk9PSJ1bmRlZmluZWQiP2p0OlByb3h5LCIlUmFuZ2VFcnJvciUiOmQyLCIlUmVmZXJlbmNlRXJyb3IlIjpwMiwiJVJlZmxlY3QlIjp0eXBlb2YgUmVmbGVjdD09InVuZGVmaW5lZCI/anQ6UmVmbGVjdCwiJVJlZ0V4cCUiOlJlZ0V4cCwiJVNldCUiOnR5cGVvZiBTZXQ9PSJ1bmRlZmluZWQiP2p0OlNldCwiJVNldEl0ZXJhdG9yUHJvdG90eXBlJSI6dHlwZW9mIFNldD09InVuZGVmaW5lZCJ8fCFXc3x8IXplP2p0OnplKG5ldyBTZXQoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLCIlU2hhcmVkQXJyYXlCdWZmZXIlIjp0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXI9PSJ1bmRlZmluZWQiP2p0OlNoYXJlZEFycmF5QnVmZmVyLCIlU3RyaW5nJSI6U3RyaW5nLCIlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlIjpXcyYmemU/emUoIiJbU3ltYm9sLml0ZXJhdG9yXSgpKTpqdCwiJVN5bWJvbCUiOldzP1N5bWJvbDpqdCwiJVN5bnRheEVycm9yJSI6VnMsIiVUaHJvd1R5cGVFcnJvciUiOmcyLCIlVHlwZWRBcnJheSUiOnYyLCIlVHlwZUVycm9yJSI6SHMsIiVVaW50OEFycmF5JSI6dHlwZW9mIFVpbnQ4QXJyYXk9PSJ1bmRlZmluZWQiP2p0OlVpbnQ4QXJyYXksIiVVaW50OENsYW1wZWRBcnJheSUiOnR5cGVvZiBVaW50OENsYW1wZWRBcnJheT09InVuZGVmaW5lZCI/anQ6VWludDhDbGFtcGVkQXJyYXksIiVVaW50MTZBcnJheSUiOnR5cGVvZiBVaW50MTZBcnJheT09InVuZGVmaW5lZCI/anQ6VWludDE2QXJyYXksIiVVaW50MzJBcnJheSUiOnR5cGVvZiBVaW50MzJBcnJheT09InVuZGVmaW5lZCI/anQ6VWludDMyQXJyYXksIiVVUklFcnJvciUiOm0yLCIlV2Vha01hcCUiOnR5cGVvZiBXZWFrTWFwPT0idW5kZWZpbmVkIj9qdDpXZWFrTWFwLCIlV2Vha1JlZiUiOnR5cGVvZiBXZWFrUmVmPT0idW5kZWZpbmVkIj9qdDpXZWFrUmVmLCIlV2Vha1NldCUiOnR5cGVvZiBXZWFrU2V0PT0idW5kZWZpbmVkIj9qdDpXZWFrU2V0fTtpZih6ZSl0cnl7bnVsbC5lcnJvcn1jYXRjaChpKXt2YXIgXzI9emUoemUoaSkpO0hyWyIlRXJyb3IucHJvdG90eXBlJSJdPV8yfXZhciB4Mj1mdW5jdGlvbiBpKHQpe3ZhciBlO2lmKHQ9PT0iJUFzeW5jRnVuY3Rpb24lIillPVZkKCJhc3luYyBmdW5jdGlvbiAoKSB7fSIpO2Vsc2UgaWYodD09PSIlR2VuZXJhdG9yRnVuY3Rpb24lIillPVZkKCJmdW5jdGlvbiogKCkge30iKTtlbHNlIGlmKHQ9PT0iJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lIillPVZkKCJhc3luYyBmdW5jdGlvbiogKCkge30iKTtlbHNlIGlmKHQ9PT0iJUFzeW5jR2VuZXJhdG9yJSIpe3ZhciBuPWkoIiVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSIpO24mJihlPW4ucHJvdG90eXBlKX1lbHNlIGlmKHQ9PT0iJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlIil7dmFyIHI9aSgiJUFzeW5jR2VuZXJhdG9yJSIpO3ImJnplJiYoZT16ZShyLnByb3RvdHlwZSkpfXJldHVybiBIclt0XT1lLGV9LGNfPXtfX3Byb3RvX186bnVsbCwiJUFycmF5QnVmZmVyUHJvdG90eXBlJSI6WyJBcnJheUJ1ZmZlciIsInByb3RvdHlwZSJdLCIlQXJyYXlQcm90b3R5cGUlIjpbIkFycmF5IiwicHJvdG90eXBlIl0sIiVBcnJheVByb3RvX2VudHJpZXMlIjpbIkFycmF5IiwicHJvdG90eXBlIiwiZW50cmllcyJdLCIlQXJyYXlQcm90b19mb3JFYWNoJSI6WyJBcnJheSIsInByb3RvdHlwZSIsImZvckVhY2giXSwiJUFycmF5UHJvdG9fa2V5cyUiOlsiQXJyYXkiLCJwcm90b3R5cGUiLCJrZXlzIl0sIiVBcnJheVByb3RvX3ZhbHVlcyUiOlsiQXJyYXkiLCJwcm90b3R5cGUiLCJ2YWx1ZXMiXSwiJUFzeW5jRnVuY3Rpb25Qcm90b3R5cGUlIjpbIkFzeW5jRnVuY3Rpb24iLCJwcm90b3R5cGUiXSwiJUFzeW5jR2VuZXJhdG9yJSI6WyJBc3luY0dlbmVyYXRvckZ1bmN0aW9uIiwicHJvdG90eXBlIl0sIiVBc3luY0dlbmVyYXRvclByb3RvdHlwZSUiOlsiQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiIsInByb3RvdHlwZSIsInByb3RvdHlwZSJdLCIlQm9vbGVhblByb3RvdHlwZSUiOlsiQm9vbGVhbiIsInByb3RvdHlwZSJdLCIlRGF0YVZpZXdQcm90b3R5cGUlIjpbIkRhdGFWaWV3IiwicHJvdG90eXBlIl0sIiVEYXRlUHJvdG90eXBlJSI6WyJEYXRlIiwicHJvdG90eXBlIl0sIiVFcnJvclByb3RvdHlwZSUiOlsiRXJyb3IiLCJwcm90b3R5cGUiXSwiJUV2YWxFcnJvclByb3RvdHlwZSUiOlsiRXZhbEVycm9yIiwicHJvdG90eXBlIl0sIiVGbG9hdDMyQXJyYXlQcm90b3R5cGUlIjpbIkZsb2F0MzJBcnJheSIsInByb3RvdHlwZSJdLCIlRmxvYXQ2NEFycmF5UHJvdG90eXBlJSI6WyJGbG9hdDY0QXJyYXkiLCJwcm90b3R5cGUiXSwiJUZ1bmN0aW9uUHJvdG90eXBlJSI6WyJGdW5jdGlvbiIsInByb3RvdHlwZSJdLCIlR2VuZXJhdG9yJSI6WyJHZW5lcmF0b3JGdW5jdGlvbiIsInByb3RvdHlwZSJdLCIlR2VuZXJhdG9yUHJvdG90eXBlJSI6WyJHZW5lcmF0b3JGdW5jdGlvbiIsInByb3RvdHlwZSIsInByb3RvdHlwZSJdLCIlSW50OEFycmF5UHJvdG90eXBlJSI6WyJJbnQ4QXJyYXkiLCJwcm90b3R5cGUiXSwiJUludDE2QXJyYXlQcm90b3R5cGUlIjpbIkludDE2QXJyYXkiLCJwcm90b3R5cGUiXSwiJUludDMyQXJyYXlQcm90b3R5cGUlIjpbIkludDMyQXJyYXkiLCJwcm90b3R5cGUiXSwiJUpTT05QYXJzZSUiOlsiSlNPTiIsInBhcnNlIl0sIiVKU09OU3RyaW5naWZ5JSI6WyJKU09OIiwic3RyaW5naWZ5Il0sIiVNYXBQcm90b3R5cGUlIjpbIk1hcCIsInByb3RvdHlwZSJdLCIlTnVtYmVyUHJvdG90eXBlJSI6WyJOdW1iZXIiLCJwcm90b3R5cGUiXSwiJU9iamVjdFByb3RvdHlwZSUiOlsiT2JqZWN0IiwicHJvdG90eXBlIl0sIiVPYmpQcm90b190b1N0cmluZyUiOlsiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciXSwiJU9ialByb3RvX3ZhbHVlT2YlIjpbIk9iamVjdCIsInByb3RvdHlwZSIsInZhbHVlT2YiXSwiJVByb21pc2VQcm90b3R5cGUlIjpbIlByb21pc2UiLCJwcm90b3R5cGUiXSwiJVByb21pc2VQcm90b190aGVuJSI6WyJQcm9taXNlIiwicHJvdG90eXBlIiwidGhlbiJdLCIlUHJvbWlzZV9hbGwlIjpbIlByb21pc2UiLCJhbGwiXSwiJVByb21pc2VfcmVqZWN0JSI6WyJQcm9taXNlIiwicmVqZWN0Il0sIiVQcm9taXNlX3Jlc29sdmUlIjpbIlByb21pc2UiLCJyZXNvbHZlIl0sIiVSYW5nZUVycm9yUHJvdG90eXBlJSI6WyJSYW5nZUVycm9yIiwicHJvdG90eXBlIl0sIiVSZWZlcmVuY2VFcnJvclByb3RvdHlwZSUiOlsiUmVmZXJlbmNlRXJyb3IiLCJwcm90b3R5cGUiXSwiJVJlZ0V4cFByb3RvdHlwZSUiOlsiUmVnRXhwIiwicHJvdG90eXBlIl0sIiVTZXRQcm90b3R5cGUlIjpbIlNldCIsInByb3RvdHlwZSJdLCIlU2hhcmVkQXJyYXlCdWZmZXJQcm90b3R5cGUlIjpbIlNoYXJlZEFycmF5QnVmZmVyIiwicHJvdG90eXBlIl0sIiVTdHJpbmdQcm90b3R5cGUlIjpbIlN0cmluZyIsInByb3RvdHlwZSJdLCIlU3ltYm9sUHJvdG90eXBlJSI6WyJTeW1ib2wiLCJwcm90b3R5cGUiXSwiJVN5bnRheEVycm9yUHJvdG90eXBlJSI6WyJTeW50YXhFcnJvciIsInByb3RvdHlwZSJdLCIlVHlwZWRBcnJheVByb3RvdHlwZSUiOlsiVHlwZWRBcnJheSIsInByb3RvdHlwZSJdLCIlVHlwZUVycm9yUHJvdG90eXBlJSI6WyJUeXBlRXJyb3IiLCJwcm90b3R5cGUiXSwiJVVpbnQ4QXJyYXlQcm90b3R5cGUlIjpbIlVpbnQ4QXJyYXkiLCJwcm90b3R5cGUiXSwiJVVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlJSI6WyJVaW50OENsYW1wZWRBcnJheSIsInByb3RvdHlwZSJdLCIlVWludDE2QXJyYXlQcm90b3R5cGUlIjpbIlVpbnQxNkFycmF5IiwicHJvdG90eXBlIl0sIiVVaW50MzJBcnJheVByb3RvdHlwZSUiOlsiVWludDMyQXJyYXkiLCJwcm90b3R5cGUiXSwiJVVSSUVycm9yUHJvdG90eXBlJSI6WyJVUklFcnJvciIsInByb3RvdHlwZSJdLCIlV2Vha01hcFByb3RvdHlwZSUiOlsiV2Vha01hcCIsInByb3RvdHlwZSJdLCIlV2Vha1NldFByb3RvdHlwZSUiOlsiV2Vha1NldCIsInByb3RvdHlwZSJdfSx4YT1HZCxTdT1hXyxNMj14YS5jYWxsKEZ1bmN0aW9uLmNhbGwsQXJyYXkucHJvdG90eXBlLmNvbmNhdCksUzI9eGEuY2FsbChGdW5jdGlvbi5hcHBseSxBcnJheS5wcm90b3R5cGUuc3BsaWNlKSx1Xz14YS5jYWxsKEZ1bmN0aW9uLmNhbGwsU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKSxidT14YS5jYWxsKEZ1bmN0aW9uLmNhbGwsU3RyaW5nLnByb3RvdHlwZS5zbGljZSksYjI9eGEuY2FsbChGdW5jdGlvbi5jYWxsLFJlZ0V4cC5wcm90b3R5cGUuZXhlYyksdzI9L1teJS5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCUkKSkvZyxBMj0vXFwoXFwpPy9nLEUyPWZ1bmN0aW9uKHQpe3ZhciBlPWJ1KHQsMCwxKSxuPWJ1KHQsLTEpO2lmKGU9PT0iJSImJm4hPT0iJSIpdGhyb3cgbmV3IFZzKCJpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIGNsb3NpbmcgYCVgIik7aWYobj09PSIlIiYmZSE9PSIlIil0aHJvdyBuZXcgVnMoImludmFsaWQgaW50cmluc2ljIHN5bnRheCwgZXhwZWN0ZWQgb3BlbmluZyBgJWAiKTt2YXIgcj1bXTtyZXR1cm4gdV8odCx3MixmdW5jdGlvbihzLG8sYSxsKXtyW3IubGVuZ3RoXT1hP3VfKGwsQTIsIiQxIik6b3x8c30pLHJ9LFQyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dCxyO2lmKFN1KGNfLG4pJiYocj1jX1tuXSxuPSIlIityWzBdKyIlIiksU3UoSHIsbikpe3ZhciBzPUhyW25dO2lmKHM9PT0kcyYmKHM9eDIobikpLHR5cGVvZiBzPT0idW5kZWZpbmVkIiYmIWUpdGhyb3cgbmV3IEhzKCJpbnRyaW5zaWMgIit0KyIgZXhpc3RzLCBidXQgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGZpbGUgYW4gaXNzdWUhIik7cmV0dXJue2FsaWFzOnIsbmFtZTpuLHZhbHVlOnN9fXRocm93IG5ldyBWcygiaW50cmluc2ljICIrdCsiIGRvZXMgbm90IGV4aXN0ISIpfSxyaT1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiB0IT0ic3RyaW5nInx8dC5sZW5ndGg9PT0wKXRocm93IG5ldyBIcygiaW50cmluc2ljIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmciKTtpZihhcmd1bWVudHMubGVuZ3RoPjEmJnR5cGVvZiBlIT0iYm9vbGVhbiIpdGhyb3cgbmV3IEhzKCciYWxsb3dNaXNzaW5nIiBhcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbicpO2lmKGIyKC9eJT9bXiVdKiU/JC8sdCk9PT1udWxsKXRocm93IG5ldyBWcygiYCVgIG1heSBub3QgYmUgcHJlc2VudCBhbnl3aGVyZSBidXQgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBpbnRyaW5zaWMgbmFtZSIpO3ZhciBuPUUyKHQpLHI9bi5sZW5ndGg+MD9uWzBdOiIiLHM9VDIoIiUiK3IrIiUiLGUpLG89cy5uYW1lLGE9cy52YWx1ZSxsPSExLGM9cy5hbGlhcztjJiYocj1jWzBdLFMyKG4sTTIoWzAsMV0sYykpKTtmb3IodmFyIHU9MSxoPSEwO3U8bi5sZW5ndGg7dSs9MSl7dmFyIGY9blt1XSxkPWJ1KGYsMCwxKSxwPWJ1KGYsLTEpO2lmKChkPT09JyInfHxkPT09IicifHxkPT09ImAifHxwPT09JyInfHxwPT09IicifHxwPT09ImAiKSYmZCE9PXApdGhyb3cgbmV3IFZzKCJwcm9wZXJ0eSBuYW1lcyB3aXRoIHF1b3RlcyBtdXN0IGhhdmUgbWF0Y2hpbmcgcXVvdGVzIik7aWYoKGY9PT0iY29uc3RydWN0b3IifHwhaCkmJihsPSEwKSxyKz0iLiIrZixvPSIlIityKyIlIixTdShIcixvKSlhPUhyW29dO2Vsc2UgaWYoYSE9bnVsbCl7aWYoIShmIGluIGEpKXtpZighZSl0aHJvdyBuZXcgSHMoImJhc2UgaW50cmluc2ljIGZvciAiK3QrIiBleGlzdHMsIGJ1dCB0aGUgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZS4iKTtyZXR1cm59aWYoVnImJnUrMT49bi5sZW5ndGgpe3ZhciB5PVZyKGEsZik7aD0hIXksaCYmImdldCJpbiB5JiYhKCJvcmlnaW5hbFZhbHVlImluIHkuZ2V0KT9hPXkuZ2V0OmE9YVtmXX1lbHNlIGg9U3UoYSxmKSxhPWFbZl07aCYmIWwmJihIcltvXT1hKX19cmV0dXJuIGF9LEMyPXJpLHd1PUMyKCIlT2JqZWN0LmRlZmluZVByb3BlcnR5JSIsITApfHwhMTtpZih3dSl0cnl7d3Uoe30sImEiLHt2YWx1ZToxfSl9Y2F0Y2goaSl7d3U9ITF9dmFyIFdkPXd1LFIyPXJpLEF1PVIyKCIlT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciUiLCEwKTtpZihBdSl0cnl7QXUoW10sImxlbmd0aCIpfWNhdGNoKGkpe0F1PW51bGx9dmFyICRkPUF1LGhfPVdkLFAyPXJfLFhzPWVyLGZfPSRkLFhkPWZ1bmN0aW9uKHQsZSxuKXtpZighdHx8dHlwZW9mIHQhPSJvYmplY3QiJiZ0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgWHMoImBvYmpgIG11c3QgYmUgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb25gIik7aWYodHlwZW9mIGUhPSJzdHJpbmciJiZ0eXBlb2YgZSE9InN5bWJvbCIpdGhyb3cgbmV3IFhzKCJgcHJvcGVydHlgIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2xgIik7aWYoYXJndW1lbnRzLmxlbmd0aD4zJiZ0eXBlb2YgYXJndW1lbnRzWzNdIT0iYm9vbGVhbiImJmFyZ3VtZW50c1szXSE9PW51bGwpdGhyb3cgbmV3IFhzKCJgbm9uRW51bWVyYWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsIik7aWYoYXJndW1lbnRzLmxlbmd0aD40JiZ0eXBlb2YgYXJndW1lbnRzWzRdIT0iYm9vbGVhbiImJmFyZ3VtZW50c1s0XSE9PW51bGwpdGhyb3cgbmV3IFhzKCJgbm9uV3JpdGFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCIpO2lmKGFyZ3VtZW50cy5sZW5ndGg+NSYmdHlwZW9mIGFyZ3VtZW50c1s1XSE9ImJvb2xlYW4iJiZhcmd1bWVudHNbNV0hPT1udWxsKXRocm93IG5ldyBYcygiYG5vbkNvbmZpZ3VyYWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsIik7aWYoYXJndW1lbnRzLmxlbmd0aD42JiZ0eXBlb2YgYXJndW1lbnRzWzZdIT0iYm9vbGVhbiIpdGhyb3cgbmV3IFhzKCJgbG9vc2VgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4iKTt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjM/YXJndW1lbnRzWzNdOm51bGwscz1hcmd1bWVudHMubGVuZ3RoPjQ/YXJndW1lbnRzWzRdOm51bGwsbz1hcmd1bWVudHMubGVuZ3RoPjU/YXJndW1lbnRzWzVdOm51bGwsYT1hcmd1bWVudHMubGVuZ3RoPjY/YXJndW1lbnRzWzZdOiExLGw9ISFmXyYmZl8odCxlKTtpZihoXyloXyh0LGUse2NvbmZpZ3VyYWJsZTpvPT09bnVsbCYmbD9sLmNvbmZpZ3VyYWJsZTohbyxlbnVtZXJhYmxlOnI9PT1udWxsJiZsP2wuZW51bWVyYWJsZTohcix2YWx1ZTpuLHdyaXRhYmxlOnM9PT1udWxsJiZsP2wud3JpdGFibGU6IXN9KTtlbHNlIGlmKGF8fCFyJiYhcyYmIW8pdFtlXT1uO2Vsc2UgdGhyb3cgbmV3IFAyKCJUaGlzIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgZGVmaW5pbmcgYSBwcm9wZXJ0eSBhcyBub24tY29uZmlndXJhYmxlLCBub24td3JpdGFibGUsIG9yIG5vbi1lbnVtZXJhYmxlLiIpfSxxZD1XZCxkXz1mdW5jdGlvbigpe3JldHVybiEhcWR9O2RfLmhhc0FycmF5TGVuZ3RoRGVmaW5lQnVnPWZ1bmN0aW9uKCl7aWYoIXFkKXJldHVybiBudWxsO3RyeXtyZXR1cm4gcWQoW10sImxlbmd0aCIse3ZhbHVlOjF9KS5sZW5ndGghPT0xfWNhdGNoKHQpe3JldHVybiEwfX07dmFyIFlkPWRfLEkyPUJkLEwyPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2woImZvbyIpPT0ic3ltYm9sIixEMj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLFUyPUFycmF5LnByb3RvdHlwZS5jb25jYXQscF89WGQsTjI9ZnVuY3Rpb24oaSl7cmV0dXJuIHR5cGVvZiBpPT0iZnVuY3Rpb24iJiZEMi5jYWxsKGkpPT09IltvYmplY3QgRnVuY3Rpb25dIn0sbV89WWQoKSxGMj1mdW5jdGlvbihpLHQsZSxuKXtpZih0IGluIGkpe2lmKG49PT0hMCl7aWYoaVt0XT09PWUpcmV0dXJufWVsc2UgaWYoIU4yKG4pfHwhbigpKXJldHVybn1tXz9wXyhpLHQsZSwhMCk6cF8oaSx0LGUpfSxnXz1mdW5jdGlvbihpLHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06e30sbj1JMih0KTtMMiYmKG49VTIuY2FsbChuLE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCkpKTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrPTEpRjIoaSxuW3JdLHRbbltyXV0sZVtuW3JdXSl9O2dfLnN1cHBvcnRzRGVzY3JpcHRvcnM9ISFtXzt2YXIgV3I9Z18seV89e2V4cG9ydHM6e319LE8yPXJpLHZfPVhkLEIyPVlkKCksX189JGQseF89ZXIsejI9TzIoIiVNYXRoLmZsb29yJSIpLGsyPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IHhfKCJgZm5gIGlzIG5vdCBhIGZ1bmN0aW9uIik7aWYodHlwZW9mIGUhPSJudW1iZXIifHxlPDB8fGU+NDI5NDk2NzI5NXx8ejIoZSkhPT1lKXRocm93IG5ldyB4XygiYGxlbmd0aGAgbXVzdCBiZSBhIHBvc2l0aXZlIDMyLWJpdCBpbnRlZ2VyIik7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiYhIWFyZ3VtZW50c1syXSxyPSEwLHM9ITA7aWYoImxlbmd0aCJpbiB0JiZfXyl7dmFyIG89X18odCwibGVuZ3RoIik7byYmIW8uY29uZmlndXJhYmxlJiYocj0hMSksbyYmIW8ud3JpdGFibGUmJihzPSExKX1yZXR1cm4ocnx8c3x8IW4pJiYoQjI/dl8odCwibGVuZ3RoIixlLCEwLCEwKTp2Xyh0LCJsZW5ndGgiLGUpKSx0fTsoZnVuY3Rpb24oaSl7dmFyIHQ9R2QsZT1yaSxuPWsyLHI9ZXIscz1lKCIlRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5JSIpLG89ZSgiJUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsJSIpLGE9ZSgiJVJlZmxlY3QuYXBwbHklIiwhMCl8fHQuY2FsbChvLHMpLGw9V2QsYz1lKCIlTWF0aC5tYXglIik7aS5leHBvcnRzPWZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBmIT0iZnVuY3Rpb24iKXRocm93IG5ldyByKCJhIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIik7dmFyIGQ9YSh0LG8sYXJndW1lbnRzKTtyZXR1cm4gbihkLDErYygwLGYubGVuZ3RoLShhcmd1bWVudHMubGVuZ3RoLTEpKSwhMCl9O3ZhciB1PWZ1bmN0aW9uKCl7cmV0dXJuIGEodCxzLGFyZ3VtZW50cyl9O2w/bChpLmV4cG9ydHMsImFwcGx5Iix7dmFsdWU6dX0pOmkuZXhwb3J0cy5hcHBseT11fSkoeV8pO3ZhciBxcz15Xy5leHBvcnRzLE1fPXJpLFNfPXFzLEcyPVNfKE1fKCJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiKSksTm49ZnVuY3Rpb24odCxlKXt2YXIgbj1NXyh0LCEhZSk7cmV0dXJuIHR5cGVvZiBuPT0iZnVuY3Rpb24iJiZHMih0LCIucHJvdG90eXBlLiIpPi0xP1NfKG4pOm59LFYyPUJkLGJfPU11KCksd189Tm4sQV89T2JqZWN0LEgyPXdfKCJBcnJheS5wcm90b3R5cGUucHVzaCIpLEVfPXdfKCJPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlIiksVzI9Yl8/T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sczpudWxsLFRfPWZ1bmN0aW9uKHQsZSl7aWYodD09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJ0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3QiKTt2YXIgbj1BXyh0KTtpZihhcmd1bWVudHMubGVuZ3RoPT09MSlyZXR1cm4gbjtmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7KytyKXt2YXIgcz1BXyhhcmd1bWVudHNbcl0pLG89VjIocyksYT1iXyYmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHN8fFcyKTtpZihhKWZvcih2YXIgbD1hKHMpLGM9MDtjPGwubGVuZ3RoOysrYyl7dmFyIHU9bFtjXTtFXyhzLHUpJiZIMihvLHUpfWZvcih2YXIgaD0wO2g8by5sZW5ndGg7KytoKXt2YXIgZj1vW2hdO2lmKEVfKHMsZikpe3ZhciBkPXNbZl07bltmXT1kfX19cmV0dXJuIG59LFpkPVRfLCQyPWZ1bmN0aW9uKCl7aWYoIU9iamVjdC5hc3NpZ24pcmV0dXJuITE7Zm9yKHZhciBpPSJhYmNkZWZnaGlqa2xtbm9wcXJzdCIsdD1pLnNwbGl0KCIiKSxlPXt9LG49MDtuPHQubGVuZ3RoOysrbillW3Rbbl1dPXRbbl07dmFyIHI9T2JqZWN0LmFzc2lnbih7fSxlKSxzPSIiO2Zvcih2YXIgbyBpbiByKXMrPW87cmV0dXJuIGkhPT1zfSxYMj1mdW5jdGlvbigpe2lmKCFPYmplY3QuYXNzaWdufHwhT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKXJldHVybiExO3ZhciBpPU9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7MToyfSk7dHJ5e09iamVjdC5hc3NpZ24oaSwieHkiKX1jYXRjaCh0KXtyZXR1cm4gaVsxXT09PSJ5In1yZXR1cm4hMX0sQ189ZnVuY3Rpb24oKXtyZXR1cm4hT2JqZWN0LmFzc2lnbnx8JDIoKXx8WDIoKT9aZDpPYmplY3QuYXNzaWdufSxxMj1XcixZMj1DXyxaMj1mdW5jdGlvbigpe3ZhciB0PVkyKCk7cmV0dXJuIHEyKE9iamVjdCx7YXNzaWduOnR9LHthc3NpZ246ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmFzc2lnbiE9PXR9fSksdH0sSjI9V3IsSzI9cXMsajI9VF8sUl89Q18sUTI9WjIsdEk9SzIuYXBwbHkoUl8oKSksUF89ZnVuY3Rpb24odCxlKXtyZXR1cm4gdEkoT2JqZWN0LGFyZ3VtZW50cyl9O0oyKFBfLHtnZXRQb2x5ZmlsbDpSXyxpbXBsZW1lbnRhdGlvbjpqMixzaGltOlEyfSk7dmFyIGVJPVBfLE1hPWZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiBmdW5jdGlvbigpe30ubmFtZT09InN0cmluZyJ9LFNhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7aWYoU2EpdHJ5e1NhKFtdLCJsZW5ndGgiKX1jYXRjaChpKXtTYT1udWxsfU1hLmZ1bmN0aW9uc0hhdmVDb25maWd1cmFibGVOYW1lcz1mdW5jdGlvbigpe2lmKCFNYSgpfHwhU2EpcmV0dXJuITE7dmFyIHQ9U2EoZnVuY3Rpb24oKXt9LCJuYW1lIik7cmV0dXJuISF0JiYhIXQuY29uZmlndXJhYmxlfTt2YXIgbkk9RnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ7TWEuYm91bmRGdW5jdGlvbnNIYXZlTmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gTWEoKSYmdHlwZW9mIG5JPT0iZnVuY3Rpb24iJiZmdW5jdGlvbigpe30uYmluZCgpLm5hbWUhPT0iIn07dmFyIGlJPU1hLElfPVhkLHJJPVlkKCksc0k9aUkuZnVuY3Rpb25zSGF2ZUNvbmZpZ3VyYWJsZU5hbWVzKCksb0k9ZXIsYUk9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgb0koImBmbmAgaXMgbm90IGEgZnVuY3Rpb24iKTt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjImJiEhYXJndW1lbnRzWzJdO3JldHVybighbnx8c0kpJiYockk/SV8odCwibmFtZSIsZSwhMCwhMCk6SV8odCwibmFtZSIsZSkpLHR9LGxJPWFJLGNJPWVyLHVJPU9iamVjdCxMXz1sSShmdW5jdGlvbigpe2lmKHRoaXM9PW51bGx8fHRoaXMhPT11SSh0aGlzKSl0aHJvdyBuZXcgY0koIlJlZ0V4cC5wcm90b3R5cGUuZmxhZ3MgZ2V0dGVyIGNhbGxlZCBvbiBub24tb2JqZWN0Iik7dmFyIHQ9IiI7cmV0dXJuIHRoaXMuaGFzSW5kaWNlcyYmKHQrPSJkIiksdGhpcy5nbG9iYWwmJih0Kz0iZyIpLHRoaXMuaWdub3JlQ2FzZSYmKHQrPSJpIiksdGhpcy5tdWx0aWxpbmUmJih0Kz0ibSIpLHRoaXMuZG90QWxsJiYodCs9InMiKSx0aGlzLnVuaWNvZGUmJih0Kz0idSIpLHRoaXMudW5pY29kZVNldHMmJih0Kz0idiIpLHRoaXMuc3RpY2t5JiYodCs9InkiKSx0fSwiZ2V0IGZsYWdzIiwhMCksaEk9TF8sZkk9V3Iuc3VwcG9ydHNEZXNjcmlwdG9ycyxkST1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLERfPWZ1bmN0aW9uKCl7aWYoZkkmJi9hL21pZy5mbGFncz09PSJnaW0iKXt2YXIgdD1kSShSZWdFeHAucHJvdG90eXBlLCJmbGFncyIpO2lmKHQmJnR5cGVvZiB0LmdldD09ImZ1bmN0aW9uIiYmdHlwZW9mIFJlZ0V4cC5wcm90b3R5cGUuZG90QWxsPT0iYm9vbGVhbiImJnR5cGVvZiBSZWdFeHAucHJvdG90eXBlLmhhc0luZGljZXM9PSJib29sZWFuIil7dmFyIGU9IiIsbj17fTtpZihPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiaGFzSW5kaWNlcyIse2dldDpmdW5jdGlvbigpe2UrPSJkIn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwic3RpY2t5Iix7Z2V0OmZ1bmN0aW9uKCl7ZSs9InkifX0pLGU9PT0iZHkiKXJldHVybiB0LmdldH19cmV0dXJuIGhJfSxwST1Xci5zdXBwb3J0c0Rlc2NyaXB0b3JzLG1JPURfLGdJPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IseUk9T2JqZWN0LmRlZmluZVByb3BlcnR5LHZJPVR5cGVFcnJvcixVXz1PYmplY3QuZ2V0UHJvdG90eXBlT2YsX0k9L2EvLHhJPWZ1bmN0aW9uKCl7aWYoIXBJfHwhVV8pdGhyb3cgbmV3IHZJKCJSZWdFeHAucHJvdG90eXBlLmZsYWdzIHJlcXVpcmVzIGEgdHJ1ZSBFUzUgZW52aXJvbm1lbnQgdGhhdCBzdXBwb3J0cyBwcm9wZXJ0eSBkZXNjcmlwdG9ycyIpO3ZhciB0PW1JKCksZT1VXyhfSSksbj1nSShlLCJmbGFncyIpO3JldHVybighbnx8bi5nZXQhPT10KSYmeUkoZSwiZmxhZ3MiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSxnZXQ6dH0pLHR9LE1JPVdyLFNJPXFzLGJJPUxfLE5fPURfLHdJPXhJLEZfPVNJKE5fKCkpO01JKEZfLHtnZXRQb2x5ZmlsbDpOXyxpbXBsZW1lbnRhdGlvbjpiSSxzaGltOndJfSk7dmFyIEFJPUZfLEV1PXtleHBvcnRzOnt9fSxFST1NdSwkcj1mdW5jdGlvbigpe3JldHVybiBFSSgpJiYhIVN5bWJvbC50b1N0cmluZ1RhZ30sVEk9JHIoKSxDST1ObixKZD1DSSgiT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyIpLFR1PWZ1bmN0aW9uKHQpe3JldHVybiBUSSYmdCYmdHlwZW9mIHQ9PSJvYmplY3QiJiZTeW1ib2wudG9TdHJpbmdUYWcgaW4gdD8hMTpKZCh0KT09PSJbb2JqZWN0IEFyZ3VtZW50c10ifSxPXz1mdW5jdGlvbih0KXtyZXR1cm4gVHUodCk/ITA6dCE9PW51bGwmJnR5cGVvZiB0PT0ib2JqZWN0IiYmdHlwZW9mIHQubGVuZ3RoPT0ibnVtYmVyIiYmdC5sZW5ndGg+PTAmJkpkKHQpIT09IltvYmplY3QgQXJyYXldIiYmSmQodC5jYWxsZWUpPT09IltvYmplY3QgRnVuY3Rpb25dIn0sUkk9ZnVuY3Rpb24oKXtyZXR1cm4gVHUoYXJndW1lbnRzKX0oKTtUdS5pc0xlZ2FjeUFyZ3VtZW50cz1PXzt2YXIgQl89Ukk/VHU6T18sUEk9e30sSUk9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZGVmYXVsdDpQSX0pLExJPUVQKElJKSxLZD10eXBlb2YgTWFwPT0iZnVuY3Rpb24iJiZNYXAucHJvdG90eXBlLGpkPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3ImJktkP09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTWFwLnByb3RvdHlwZSwic2l6ZSIpOm51bGwsQ3U9S2QmJmpkJiZ0eXBlb2YgamQuZ2V0PT0iZnVuY3Rpb24iP2pkLmdldDpudWxsLHpfPUtkJiZNYXAucHJvdG90eXBlLmZvckVhY2gsUWQ9dHlwZW9mIFNldD09ImZ1bmN0aW9uIiYmU2V0LnByb3RvdHlwZSx0cD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJiZRZD9PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNldC5wcm90b3R5cGUsInNpemUiKTpudWxsLFJ1PVFkJiZ0cCYmdHlwZW9mIHRwLmdldD09ImZ1bmN0aW9uIj90cC5nZXQ6bnVsbCxrXz1RZCYmU2V0LnByb3RvdHlwZS5mb3JFYWNoLERJPXR5cGVvZiBXZWFrTWFwPT0iZnVuY3Rpb24iJiZXZWFrTWFwLnByb3RvdHlwZSxiYT1EST9XZWFrTWFwLnByb3RvdHlwZS5oYXM6bnVsbCxVST10eXBlb2YgV2Vha1NldD09ImZ1bmN0aW9uIiYmV2Vha1NldC5wcm90b3R5cGUsd2E9VUk/V2Vha1NldC5wcm90b3R5cGUuaGFzOm51bGwsTkk9dHlwZW9mIFdlYWtSZWY9PSJmdW5jdGlvbiImJldlYWtSZWYucHJvdG90eXBlLEdfPU5JP1dlYWtSZWYucHJvdG90eXBlLmRlcmVmOm51bGwsRkk9Qm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZixPST1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLEJJPUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyx6ST1TdHJpbmcucHJvdG90eXBlLm1hdGNoLGVwPVN0cmluZy5wcm90b3R5cGUuc2xpY2UsbnI9U3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLGtJPVN0cmluZy5wcm90b3R5cGUudG9VcHBlckNhc2UsVl89U3RyaW5nLnByb3RvdHlwZS50b0xvd2VyQ2FzZSxIXz1SZWdFeHAucHJvdG90eXBlLnRlc3QsV189QXJyYXkucHJvdG90eXBlLmNvbmNhdCxzaT1BcnJheS5wcm90b3R5cGUuam9pbixHST1BcnJheS5wcm90b3R5cGUuc2xpY2UsJF89TWF0aC5mbG9vcixucD10eXBlb2YgQmlnSW50PT0iZnVuY3Rpb24iP0JpZ0ludC5wcm90b3R5cGUudmFsdWVPZjpudWxsLGlwPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMscnA9dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdHlwZW9mIFN5bWJvbC5pdGVyYXRvcj09InN5bWJvbCI/U3ltYm9sLnByb3RvdHlwZS50b1N0cmluZzpudWxsLFlzPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJvYmplY3QiLFplPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJlN5bWJvbC50b1N0cmluZ1RhZyYmKHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWc9PT1Zc3x8ITApP1N5bWJvbC50b1N0cmluZ1RhZzpudWxsLFhfPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUscV89KHR5cGVvZiBSZWZsZWN0PT0iZnVuY3Rpb24iP1JlZmxlY3QuZ2V0UHJvdG90eXBlT2Y6T2JqZWN0LmdldFByb3RvdHlwZU9mKXx8KFtdLl9fcHJvdG9fXz09PUFycmF5LnByb3RvdHlwZT9mdW5jdGlvbihpKXtyZXR1cm4gaS5fX3Byb3RvX199Om51bGwpO2Z1bmN0aW9uIFlfKGksdCl7aWYoaT09PTEvMHx8aT09PS0xLzB8fGkhPT1pfHxpJiZpPi0xZTMmJmk8MWUzfHxIXy5jYWxsKC9lLyx0KSlyZXR1cm4gdDt2YXIgZT0vWzAtOV0oPz0oPzpbMC05XXszfSkrKD8hWzAtOV0pKS9nO2lmKHR5cGVvZiBpPT0ibnVtYmVyIil7dmFyIG49aTwwPy0kXygtaSk6JF8oaSk7aWYobiE9PWkpe3ZhciByPVN0cmluZyhuKSxzPWVwLmNhbGwodCxyLmxlbmd0aCsxKTtyZXR1cm4gbnIuY2FsbChyLGUsIiQmXyIpKyIuIituci5jYWxsKG5yLmNhbGwocywvKFswLTldezN9KS9nLCIkJl8iKSwvXyQvLCIiKX19cmV0dXJuIG5yLmNhbGwodCxlLCIkJl8iKX12YXIgc3A9TEksWl89c3AuY3VzdG9tLEpfPVFfKFpfKT9aXzpudWxsLFZJPWZ1bmN0aW9uIGkodCxlLG4scil7dmFyIHM9ZXx8e307aWYoaXIocywicXVvdGVTdHlsZSIpJiZzLnF1b3RlU3R5bGUhPT0ic2luZ2xlIiYmcy5xdW90ZVN0eWxlIT09ImRvdWJsZSIpdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uICJxdW90ZVN0eWxlIiBtdXN0IGJlICJzaW5nbGUiIG9yICJkb3VibGUiJyk7aWYoaXIocywibWF4U3RyaW5nTGVuZ3RoIikmJih0eXBlb2Ygcy5tYXhTdHJpbmdMZW5ndGg9PSJudW1iZXIiP3MubWF4U3RyaW5nTGVuZ3RoPDAmJnMubWF4U3RyaW5nTGVuZ3RoIT09MS8wOnMubWF4U3RyaW5nTGVuZ3RoIT09bnVsbCkpdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uICJtYXhTdHJpbmdMZW5ndGgiLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIsIEluZmluaXR5LCBvciBgbnVsbGAnKTt2YXIgbz1pcihzLCJjdXN0b21JbnNwZWN0Iik/cy5jdXN0b21JbnNwZWN0OiEwO2lmKHR5cGVvZiBvIT0iYm9vbGVhbiImJm8hPT0ic3ltYm9sIil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb24gXCJjdXN0b21JbnNwZWN0XCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGB0cnVlYCwgYGZhbHNlYCwgb3IgYCdzeW1ib2wnYCIpO2lmKGlyKHMsImluZGVudCIpJiZzLmluZGVudCE9PW51bGwmJnMuaW5kZW50IT09IgkiJiYhKHBhcnNlSW50KHMuaW5kZW50LDEwKT09PXMuaW5kZW50JiZzLmluZGVudD4wKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gImluZGVudCIgbXVzdCBiZSAiXFx0IiwgYW4gaW50ZWdlciA+IDAsIG9yIGBudWxsYCcpO2lmKGlyKHMsIm51bWVyaWNTZXBhcmF0b3IiKSYmdHlwZW9mIHMubnVtZXJpY1NlcGFyYXRvciE9ImJvb2xlYW4iKXRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiAibnVtZXJpY1NlcGFyYXRvciIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGB0cnVlYCBvciBgZmFsc2VgJyk7dmFyIGE9cy5udW1lcmljU2VwYXJhdG9yO2lmKHR5cGVvZiB0PT0idW5kZWZpbmVkIilyZXR1cm4idW5kZWZpbmVkIjtpZih0PT09bnVsbClyZXR1cm4ibnVsbCI7aWYodHlwZW9mIHQ9PSJib29sZWFuIilyZXR1cm4gdD8idHJ1ZSI6ImZhbHNlIjtpZih0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIGV4KHQscyk7aWYodHlwZW9mIHQ9PSJudW1iZXIiKXtpZih0PT09MClyZXR1cm4gMS8wL3Q+MD8iMCI6Ii0wIjt2YXIgbD1TdHJpbmcodCk7cmV0dXJuIGE/WV8odCxsKTpsfWlmKHR5cGVvZiB0PT0iYmlnaW50Iil7dmFyIGM9U3RyaW5nKHQpKyJuIjtyZXR1cm4gYT9ZXyh0LGMpOmN9dmFyIHU9dHlwZW9mIHMuZGVwdGg9PSJ1bmRlZmluZWQiPzU6cy5kZXB0aDtpZih0eXBlb2Ygbj09InVuZGVmaW5lZCImJihuPTApLG4+PXUmJnU+MCYmdHlwZW9mIHQ9PSJvYmplY3QiKXJldHVybiBvcCh0KT8iW0FycmF5XSI6IltPYmplY3RdIjt2YXIgaD1vTChzLG4pO2lmKHR5cGVvZiByPT0idW5kZWZpbmVkIilyPVtdO2Vsc2UgaWYodHgocix0KT49MClyZXR1cm4iW0NpcmN1bGFyXSI7ZnVuY3Rpb24gZihELE4sVSl7aWYoTiYmKHI9R0kuY2FsbChyKSxyLnB1c2goTikpLFUpe3ZhciBCPXtkZXB0aDpzLmRlcHRofTtyZXR1cm4gaXIocywicXVvdGVTdHlsZSIpJiYoQi5xdW90ZVN0eWxlPXMucXVvdGVTdHlsZSksaShELEIsbisxLHIpfXJldHVybiBpKEQscyxuKzEscil9aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiImJiFqXyh0KSl7dmFyIGQ9S0kodCkscD1QdSh0LGYpO3JldHVybiJbRnVuY3Rpb24iKyhkPyI6ICIrZDoiIChhbm9ueW1vdXMpIikrIl0iKyhwLmxlbmd0aD4wPyIgeyAiK3NpLmNhbGwocCwiLCAiKSsiIH0iOiIiKX1pZihRXyh0KSl7dmFyIHk9WXM/bnIuY2FsbChTdHJpbmcodCksL14oU3ltYm9sXCguKlwpKV9bXildKiQvLCIkMSIpOnJwLmNhbGwodCk7cmV0dXJuIHR5cGVvZiB0PT0ib2JqZWN0IiYmIVlzP0FhKHkpOnl9aWYoaUwodCkpe2Zvcih2YXIgbT0iPCIrVl8uY2FsbChTdHJpbmcodC5ub2RlTmFtZSkpLGc9dC5hdHRyaWJ1dGVzfHxbXSx4PTA7eDxnLmxlbmd0aDt4KyspbSs9IiAiK2dbeF0ubmFtZSsiPSIrS18oSEkoZ1t4XS52YWx1ZSksImRvdWJsZSIscyk7cmV0dXJuIG0rPSI+Iix0LmNoaWxkTm9kZXMmJnQuY2hpbGROb2Rlcy5sZW5ndGgmJihtKz0iLi4uIiksbSs9IjwvIitWXy5jYWxsKFN0cmluZyh0Lm5vZGVOYW1lKSkrIj4iLG19aWYob3AodCkpe2lmKHQubGVuZ3RoPT09MClyZXR1cm4iW10iO3ZhciB2PVB1KHQsZik7cmV0dXJuIGgmJiFzTCh2KT8iWyIrbHAodixoKSsiXSI6IlsgIitzaS5jYWxsKHYsIiwgIikrIiBdIn1pZigkSSh0KSl7dmFyIF89UHUodCxmKTtyZXR1cm4hKCJjYXVzZSJpbiBFcnJvci5wcm90b3R5cGUpJiYiY2F1c2UiaW4gdCYmIVhfLmNhbGwodCwiY2F1c2UiKT8ieyBbIitTdHJpbmcodCkrIl0gIitzaS5jYWxsKFdfLmNhbGwoIltjYXVzZV06ICIrZih0LmNhdXNlKSxfKSwiLCAiKSsiIH0iOl8ubGVuZ3RoPT09MD8iWyIrU3RyaW5nKHQpKyJdIjoieyBbIitTdHJpbmcodCkrIl0gIitzaS5jYWxsKF8sIiwgIikrIiB9In1pZih0eXBlb2YgdD09Im9iamVjdCImJm8pe2lmKEpfJiZ0eXBlb2YgdFtKX109PSJmdW5jdGlvbiImJnNwKXJldHVybiBzcCh0LHtkZXB0aDp1LW59KTtpZihvIT09InN5bWJvbCImJnR5cGVvZiB0Lmluc3BlY3Q9PSJmdW5jdGlvbiIpcmV0dXJuIHQuaW5zcGVjdCgpfWlmKGpJKHQpKXt2YXIgRT1bXTtyZXR1cm4gel8mJnpfLmNhbGwodCxmdW5jdGlvbihELE4pe0UucHVzaChmKE4sdCwhMCkrIiA9PiAiK2YoRCx0KSl9KSxueCgiTWFwIixDdS5jYWxsKHQpLEUsaCl9aWYoZUwodCkpe3ZhciBiPVtdO3JldHVybiBrXyYma18uY2FsbCh0LGZ1bmN0aW9uKEQpe2IucHVzaChmKEQsdCkpfSksbngoIlNldCIsUnUuY2FsbCh0KSxiLGgpfWlmKFFJKHQpKXJldHVybiBhcCgiV2Vha01hcCIpO2lmKG5MKHQpKXJldHVybiBhcCgiV2Vha1NldCIpO2lmKHRMKHQpKXJldHVybiBhcCgiV2Vha1JlZiIpO2lmKHFJKHQpKXJldHVybiBBYShmKE51bWJlcih0KSkpO2lmKFpJKHQpKXJldHVybiBBYShmKG5wLmNhbGwodCkpKTtpZihZSSh0KSlyZXR1cm4gQWEoRkkuY2FsbCh0KSk7aWYoWEkodCkpcmV0dXJuIEFhKGYoU3RyaW5nKHQpKSk7aWYodHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJnQ9PT13aW5kb3cpcmV0dXJuInsgW29iamVjdCBXaW5kb3ddIH0iO2lmKHR5cGVvZiBnbG9iYWxUaGlzIT0idW5kZWZpbmVkIiYmdD09PWdsb2JhbFRoaXN8fHR5cGVvZiBtdSE9InVuZGVmaW5lZCImJnQ9PT1tdSlyZXR1cm4ieyBbb2JqZWN0IGdsb2JhbFRoaXNdIH0iO2lmKCFXSSh0KSYmIWpfKHQpKXt2YXIgVD1QdSh0LGYpLFA9cV8/cV8odCk9PT1PYmplY3QucHJvdG90eXBlOnQgaW5zdGFuY2VvZiBPYmplY3R8fHQuY29uc3RydWN0b3I9PT1PYmplY3Qsdz10IGluc3RhbmNlb2YgT2JqZWN0PyIiOiJudWxsIHByb3RvdHlwZSIsTT0hUCYmWmUmJk9iamVjdCh0KT09PXQmJlplIGluIHQ/ZXAuY2FsbChycih0KSw4LC0xKTp3PyJPYmplY3QiOiIiLEE9UHx8dHlwZW9mIHQuY29uc3RydWN0b3IhPSJmdW5jdGlvbiI/IiI6dC5jb25zdHJ1Y3Rvci5uYW1lP3QuY29uc3RydWN0b3IubmFtZSsiICI6IiIsRj1BKyhNfHx3PyJbIitzaS5jYWxsKFdfLmNhbGwoW10sTXx8W10sd3x8W10pLCI6ICIpKyJdICI6IiIpO3JldHVybiBULmxlbmd0aD09PTA/Risie30iOmg/RisieyIrbHAoVCxoKSsifSI6RisieyAiK3NpLmNhbGwoVCwiLCAiKSsiIH0ifXJldHVybiBTdHJpbmcodCl9O2Z1bmN0aW9uIEtfKGksdCxlKXt2YXIgbj0oZS5xdW90ZVN0eWxlfHx0KT09PSJkb3VibGUiPyciJzoiJyI7cmV0dXJuIG4raStufWZ1bmN0aW9uIEhJKGkpe3JldHVybiBuci5jYWxsKFN0cmluZyhpKSwvIi9nLCImcXVvdDsiKX1mdW5jdGlvbiBvcChpKXtyZXR1cm4gcnIoaSk9PT0iW29iamVjdCBBcnJheV0iJiYoIVplfHwhKHR5cGVvZiBpPT0ib2JqZWN0IiYmWmUgaW4gaSkpfWZ1bmN0aW9uIFdJKGkpe3JldHVybiBycihpKT09PSJbb2JqZWN0IERhdGVdIiYmKCFaZXx8ISh0eXBlb2YgaT09Im9iamVjdCImJlplIGluIGkpKX1mdW5jdGlvbiBqXyhpKXtyZXR1cm4gcnIoaSk9PT0iW29iamVjdCBSZWdFeHBdIiYmKCFaZXx8ISh0eXBlb2YgaT09Im9iamVjdCImJlplIGluIGkpKX1mdW5jdGlvbiAkSShpKXtyZXR1cm4gcnIoaSk9PT0iW29iamVjdCBFcnJvcl0iJiYoIVplfHwhKHR5cGVvZiBpPT0ib2JqZWN0IiYmWmUgaW4gaSkpfWZ1bmN0aW9uIFhJKGkpe3JldHVybiBycihpKT09PSJbb2JqZWN0IFN0cmluZ10iJiYoIVplfHwhKHR5cGVvZiBpPT0ib2JqZWN0IiYmWmUgaW4gaSkpfWZ1bmN0aW9uIHFJKGkpe3JldHVybiBycihpKT09PSJbb2JqZWN0IE51bWJlcl0iJiYoIVplfHwhKHR5cGVvZiBpPT0ib2JqZWN0IiYmWmUgaW4gaSkpfWZ1bmN0aW9uIFlJKGkpe3JldHVybiBycihpKT09PSJbb2JqZWN0IEJvb2xlYW5dIiYmKCFaZXx8ISh0eXBlb2YgaT09Im9iamVjdCImJlplIGluIGkpKX1mdW5jdGlvbiBRXyhpKXtpZihZcylyZXR1cm4gaSYmdHlwZW9mIGk9PSJvYmplY3QiJiZpIGluc3RhbmNlb2YgU3ltYm9sO2lmKHR5cGVvZiBpPT0ic3ltYm9sIilyZXR1cm4hMDtpZighaXx8dHlwZW9mIGkhPSJvYmplY3QifHwhcnApcmV0dXJuITE7dHJ5e3JldHVybiBycC5jYWxsKGkpLCEwfWNhdGNoKHQpe31yZXR1cm4hMX1mdW5jdGlvbiBaSShpKXtpZighaXx8dHlwZW9mIGkhPSJvYmplY3QifHwhbnApcmV0dXJuITE7dHJ5e3JldHVybiBucC5jYWxsKGkpLCEwfWNhdGNoKHQpe31yZXR1cm4hMX12YXIgSkk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eXx8ZnVuY3Rpb24oaSl7cmV0dXJuIGkgaW4gdGhpc307ZnVuY3Rpb24gaXIoaSx0KXtyZXR1cm4gSkkuY2FsbChpLHQpfWZ1bmN0aW9uIHJyKGkpe3JldHVybiBPSS5jYWxsKGkpfWZ1bmN0aW9uIEtJKGkpe2lmKGkubmFtZSlyZXR1cm4gaS5uYW1lO3ZhciB0PXpJLmNhbGwoQkkuY2FsbChpKSwvXmZ1bmN0aW9uXHMqKFtcdyRdKykvKTtyZXR1cm4gdD90WzFdOm51bGx9ZnVuY3Rpb24gdHgoaSx0KXtpZihpLmluZGV4T2YpcmV0dXJuIGkuaW5kZXhPZih0KTtmb3IodmFyIGU9MCxuPWkubGVuZ3RoO2U8bjtlKyspaWYoaVtlXT09PXQpcmV0dXJuIGU7cmV0dXJuLTF9ZnVuY3Rpb24gakkoaSl7aWYoIUN1fHwhaXx8dHlwZW9mIGkhPSJvYmplY3QiKXJldHVybiExO3RyeXtDdS5jYWxsKGkpO3RyeXtSdS5jYWxsKGkpfWNhdGNoKHQpe3JldHVybiEwfXJldHVybiBpIGluc3RhbmNlb2YgTWFwfWNhdGNoKHQpe31yZXR1cm4hMX1mdW5jdGlvbiBRSShpKXtpZighYmF8fCFpfHx0eXBlb2YgaSE9Im9iamVjdCIpcmV0dXJuITE7dHJ5e2JhLmNhbGwoaSxiYSk7dHJ5e3dhLmNhbGwoaSx3YSl9Y2F0Y2godCl7cmV0dXJuITB9cmV0dXJuIGkgaW5zdGFuY2VvZiBXZWFrTWFwfWNhdGNoKHQpe31yZXR1cm4hMX1mdW5jdGlvbiB0TChpKXtpZighR198fCFpfHx0eXBlb2YgaSE9Im9iamVjdCIpcmV0dXJuITE7dHJ5e3JldHVybiBHXy5jYWxsKGkpLCEwfWNhdGNoKHQpe31yZXR1cm4hMX1mdW5jdGlvbiBlTChpKXtpZighUnV8fCFpfHx0eXBlb2YgaSE9Im9iamVjdCIpcmV0dXJuITE7dHJ5e1J1LmNhbGwoaSk7dHJ5e0N1LmNhbGwoaSl9Y2F0Y2godCl7cmV0dXJuITB9cmV0dXJuIGkgaW5zdGFuY2VvZiBTZXR9Y2F0Y2godCl7fXJldHVybiExfWZ1bmN0aW9uIG5MKGkpe2lmKCF3YXx8IWl8fHR5cGVvZiBpIT0ib2JqZWN0IilyZXR1cm4hMTt0cnl7d2EuY2FsbChpLHdhKTt0cnl7YmEuY2FsbChpLGJhKX1jYXRjaCh0KXtyZXR1cm4hMH1yZXR1cm4gaSBpbnN0YW5jZW9mIFdlYWtTZXR9Y2F0Y2godCl7fXJldHVybiExfWZ1bmN0aW9uIGlMKGkpe3JldHVybiFpfHx0eXBlb2YgaSE9Im9iamVjdCI/ITE6dHlwZW9mIEhUTUxFbGVtZW50IT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50PyEwOnR5cGVvZiBpLm5vZGVOYW1lPT0ic3RyaW5nIiYmdHlwZW9mIGkuZ2V0QXR0cmlidXRlPT0iZnVuY3Rpb24ifWZ1bmN0aW9uIGV4KGksdCl7aWYoaS5sZW5ndGg+dC5tYXhTdHJpbmdMZW5ndGgpe3ZhciBlPWkubGVuZ3RoLXQubWF4U3RyaW5nTGVuZ3RoLG49Ii4uLiAiK2UrIiBtb3JlIGNoYXJhY3RlciIrKGU+MT8icyI6IiIpO3JldHVybiBleChlcC5jYWxsKGksMCx0Lm1heFN0cmluZ0xlbmd0aCksdCkrbn12YXIgcj1uci5jYWxsKG5yLmNhbGwoaSwvKFsnXFxdKS9nLCJcXCQxIiksL1tceDAwLVx4MWZdL2csckwpO3JldHVybiBLXyhyLCJzaW5nbGUiLHQpfWZ1bmN0aW9uIHJMKGkpe3ZhciB0PWkuY2hhckNvZGVBdCgwKSxlPXs4OiJiIiw5OiJ0IiwxMDoibiIsMTI6ImYiLDEzOiJyIn1bdF07cmV0dXJuIGU/IlxcIitlOiJcXHgiKyh0PDE2PyIwIjoiIikra0kuY2FsbCh0LnRvU3RyaW5nKDE2KSl9ZnVuY3Rpb24gQWEoaSl7cmV0dXJuIk9iamVjdCgiK2krIikifWZ1bmN0aW9uIGFwKGkpe3JldHVybiBpKyIgeyA/IH0ifWZ1bmN0aW9uIG54KGksdCxlLG4pe3ZhciByPW4/bHAoZSxuKTpzaS5jYWxsKGUsIiwgIik7cmV0dXJuIGkrIiAoIit0KyIpIHsiK3IrIn0ifWZ1bmN0aW9uIHNMKGkpe2Zvcih2YXIgdD0wO3Q8aS5sZW5ndGg7dCsrKWlmKHR4KGlbdF0sYApgKT49MClyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBvTChpLHQpe3ZhciBlO2lmKGkuaW5kZW50PT09IgkiKWU9IgkiO2Vsc2UgaWYodHlwZW9mIGkuaW5kZW50PT0ibnVtYmVyIiYmaS5pbmRlbnQ+MCllPXNpLmNhbGwoQXJyYXkoaS5pbmRlbnQrMSksIiAiKTtlbHNlIHJldHVybiBudWxsO3JldHVybntiYXNlOmUscHJldjpzaS5jYWxsKEFycmF5KHQrMSksZSl9fWZ1bmN0aW9uIGxwKGksdCl7aWYoaS5sZW5ndGg9PT0wKXJldHVybiIiO3ZhciBlPWAKYCt0LnByZXYrdC5iYXNlO3JldHVybiBlK3NpLmNhbGwoaSwiLCIrZSkrYApgK3QucHJldn1mdW5jdGlvbiBQdShpLHQpe3ZhciBlPW9wKGkpLG49W107aWYoZSl7bi5sZW5ndGg9aS5sZW5ndGg7Zm9yKHZhciByPTA7cjxpLmxlbmd0aDtyKyspbltyXT1pcihpLHIpP3QoaVtyXSxpKToiIn12YXIgcz10eXBlb2YgaXA9PSJmdW5jdGlvbiI/aXAoaSk6W10sbztpZihZcyl7bz17fTtmb3IodmFyIGE9MDthPHMubGVuZ3RoO2ErKylvWyIkIitzW2FdXT1zW2FdfWZvcih2YXIgbCBpbiBpKWlyKGksbCkmJihlJiZTdHJpbmcoTnVtYmVyKGwpKT09PWwmJmw8aS5sZW5ndGh8fFlzJiZvWyIkIitsXWluc3RhbmNlb2YgU3ltYm9sfHwoSF8uY2FsbCgvW15cdyRdLyxsKT9uLnB1c2godChsLGkpKyI6ICIrdChpW2xdLGkpKTpuLnB1c2gobCsiOiAiK3QoaVtsXSxpKSkpKTtpZih0eXBlb2YgaXA9PSJmdW5jdGlvbiIpZm9yKHZhciBjPTA7YzxzLmxlbmd0aDtjKyspWF8uY2FsbChpLHNbY10pJiZuLnB1c2goIlsiK3Qoc1tjXSkrIl06ICIrdChpW3NbY11dLGkpKTtyZXR1cm4gbn12YXIgaXg9cmksWnM9Tm4sYUw9VkksbEw9ZXIsSXU9aXgoIiVXZWFrTWFwJSIsITApLEx1PWl4KCIlTWFwJSIsITApLGNMPVpzKCJXZWFrTWFwLnByb3RvdHlwZS5nZXQiLCEwKSx1TD1acygiV2Vha01hcC5wcm90b3R5cGUuc2V0IiwhMCksaEw9WnMoIldlYWtNYXAucHJvdG90eXBlLmhhcyIsITApLGZMPVpzKCJNYXAucHJvdG90eXBlLmdldCIsITApLGRMPVpzKCJNYXAucHJvdG90eXBlLnNldCIsITApLHBMPVpzKCJNYXAucHJvdG90eXBlLmhhcyIsITApLGNwPWZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWksbjsobj1lLm5leHQpIT09bnVsbDtlPW4paWYobi5rZXk9PT10KXJldHVybiBlLm5leHQ9bi5uZXh0LG4ubmV4dD1pLm5leHQsaS5uZXh0PW4sbn0sbUw9ZnVuY3Rpb24oaSx0KXt2YXIgZT1jcChpLHQpO3JldHVybiBlJiZlLnZhbHVlfSxnTD1mdW5jdGlvbihpLHQsZSl7dmFyIG49Y3AoaSx0KTtuP24udmFsdWU9ZTppLm5leHQ9e2tleTp0LG5leHQ6aS5uZXh0LHZhbHVlOmV9fSx5TD1mdW5jdGlvbihpLHQpe3JldHVybiEhY3AoaSx0KX0scng9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scj17YXNzZXJ0OmZ1bmN0aW9uKHMpe2lmKCFyLmhhcyhzKSl0aHJvdyBuZXcgbEwoIlNpZGUgY2hhbm5lbCBkb2VzIG5vdCBjb250YWluICIrYUwocykpfSxnZXQ6ZnVuY3Rpb24ocyl7aWYoSXUmJnMmJih0eXBlb2Ygcz09Im9iamVjdCJ8fHR5cGVvZiBzPT0iZnVuY3Rpb24iKSl7aWYodClyZXR1cm4gY0wodCxzKX1lbHNlIGlmKEx1KXtpZihlKXJldHVybiBmTChlLHMpfWVsc2UgaWYobilyZXR1cm4gbUwobixzKX0saGFzOmZ1bmN0aW9uKHMpe2lmKEl1JiZzJiYodHlwZW9mIHM9PSJvYmplY3QifHx0eXBlb2Ygcz09ImZ1bmN0aW9uIikpe2lmKHQpcmV0dXJuIGhMKHQscyl9ZWxzZSBpZihMdSl7aWYoZSlyZXR1cm4gcEwoZSxzKX1lbHNlIGlmKG4pcmV0dXJuIHlMKG4scyk7cmV0dXJuITF9LHNldDpmdW5jdGlvbihzLG8pe0l1JiZzJiYodHlwZW9mIHM9PSJvYmplY3QifHx0eXBlb2Ygcz09ImZ1bmN0aW9uIik/KHR8fCh0PW5ldyBJdSksdUwodCxzLG8pKTpMdT8oZXx8KGU9bmV3IEx1KSxkTChlLHMsbykpOihufHwobj17a2V5Ont9LG5leHQ6bnVsbH0pLGdMKG4scyxvKSl9fTtyZXR1cm4gcn0sdkw9YV8sRWE9cngoKSxVaT1lcix1cD17YXNzZXJ0OmZ1bmN0aW9uKGksdCl7aWYoIWl8fHR5cGVvZiBpIT0ib2JqZWN0IiYmdHlwZW9mIGkhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFVpKCJgT2AgaXMgbm90IGFuIG9iamVjdCIpO2lmKHR5cGVvZiB0IT0ic3RyaW5nIil0aHJvdyBuZXcgVWkoImBzbG90YCBtdXN0IGJlIGEgc3RyaW5nIik7aWYoRWEuYXNzZXJ0KGkpLCF1cC5oYXMoaSx0KSl0aHJvdyBuZXcgVWkoImAiK3QrImAgaXMgbm90IHByZXNlbnQgb24gYE9gIil9LGdldDpmdW5jdGlvbihpLHQpe2lmKCFpfHx0eXBlb2YgaSE9Im9iamVjdCImJnR5cGVvZiBpIT0iZnVuY3Rpb24iKXRocm93IG5ldyBVaSgiYE9gIGlzIG5vdCBhbiBvYmplY3QiKTtpZih0eXBlb2YgdCE9InN0cmluZyIpdGhyb3cgbmV3IFVpKCJgc2xvdGAgbXVzdCBiZSBhIHN0cmluZyIpO3ZhciBlPUVhLmdldChpKTtyZXR1cm4gZSYmZVsiJCIrdF19LGhhczpmdW5jdGlvbihpLHQpe2lmKCFpfHx0eXBlb2YgaSE9Im9iamVjdCImJnR5cGVvZiBpIT0iZnVuY3Rpb24iKXRocm93IG5ldyBVaSgiYE9gIGlzIG5vdCBhbiBvYmplY3QiKTtpZih0eXBlb2YgdCE9InN0cmluZyIpdGhyb3cgbmV3IFVpKCJgc2xvdGAgbXVzdCBiZSBhIHN0cmluZyIpO3ZhciBlPUVhLmdldChpKTtyZXR1cm4hIWUmJnZMKGUsIiQiK3QpfSxzZXQ6ZnVuY3Rpb24oaSx0LGUpe2lmKCFpfHx0eXBlb2YgaSE9Im9iamVjdCImJnR5cGVvZiBpIT0iZnVuY3Rpb24iKXRocm93IG5ldyBVaSgiYE9gIGlzIG5vdCBhbiBvYmplY3QiKTtpZih0eXBlb2YgdCE9InN0cmluZyIpdGhyb3cgbmV3IFVpKCJgc2xvdGAgbXVzdCBiZSBhIHN0cmluZyIpO3ZhciBuPUVhLmdldChpKTtufHwobj17fSxFYS5zZXQoaSxuKSksblsiJCIrdF09ZX19O09iamVjdC5mcmVlemUmJk9iamVjdC5mcmVlemUodXApO3ZhciBfTD11cCxUYT1fTCx4TD1TeW50YXhFcnJvcixzeD10eXBlb2YgU3RvcEl0ZXJhdGlvbj09Im9iamVjdCI/U3RvcEl0ZXJhdGlvbjpudWxsLE1MPWZ1bmN0aW9uKHQpe2lmKCFzeCl0aHJvdyBuZXcgeEwoInRoaXMgZW52aXJvbm1lbnQgbGFja3MgU3RvcEl0ZXJhdGlvbiIpO1RhLnNldCh0LCJbW0RvbmVdXSIsITEpO3ZhciBlPXtuZXh0OmZ1bmN0aW9uKCl7dmFyIHI9VGEuZ2V0KHRoaXMsIltbSXRlcmF0b3JdXSIpLHM9VGEuZ2V0KHIsIltbRG9uZV1dIik7dHJ5e3JldHVybntkb25lOnMsdmFsdWU6cz92b2lkIDA6ci5uZXh0KCl9fWNhdGNoKG8pe2lmKFRhLnNldChyLCJbW0RvbmVdXSIsITApLG8hPT1zeCl0aHJvdyBvO3JldHVybntkb25lOiEwLHZhbHVlOnZvaWQgMH19fX07cmV0dXJuIFRhLnNldChlLCJbW0l0ZXJhdG9yXV0iLHQpLGV9LFNMPXt9LnRvU3RyaW5nLG94PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGkpe3JldHVybiBTTC5jYWxsKGkpPT0iW29iamVjdCBBcnJheV0ifSxiTD1TdHJpbmcucHJvdG90eXBlLnZhbHVlT2Ysd0w9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBiTC5jYWxsKHQpLCEwfWNhdGNoKGUpe3JldHVybiExfX0sQUw9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxFTD0iW29iamVjdCBTdHJpbmddIixUTD0kcigpLGF4PWZ1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/ITA6dHlwZW9mIHQhPSJvYmplY3QiPyExOlRMP3dMKHQpOkFMLmNhbGwodCk9PT1FTH0saHA9dHlwZW9mIE1hcD09ImZ1bmN0aW9uIiYmTWFwLnByb3RvdHlwZT9NYXA6bnVsbCxDTD10eXBlb2YgU2V0PT0iZnVuY3Rpb24iJiZTZXQucHJvdG90eXBlP1NldDpudWxsLER1O2hwfHwoRHU9ZnVuY3Rpb24odCl7cmV0dXJuITF9KTt2YXIgbHg9aHA/TWFwLnByb3RvdHlwZS5oYXM6bnVsbCxjeD1DTD9TZXQucHJvdG90eXBlLmhhczpudWxsOyFEdSYmIWx4JiYoRHU9ZnVuY3Rpb24odCl7cmV0dXJuITF9KTt2YXIgdXg9RHV8fGZ1bmN0aW9uKHQpe2lmKCF0fHx0eXBlb2YgdCE9Im9iamVjdCIpcmV0dXJuITE7dHJ5e2lmKGx4LmNhbGwodCksY3gpdHJ5e2N4LmNhbGwodCl9Y2F0Y2goZSl7cmV0dXJuITB9cmV0dXJuIHQgaW5zdGFuY2VvZiBocH1jYXRjaChlKXt9cmV0dXJuITF9LFJMPXR5cGVvZiBNYXA9PSJmdW5jdGlvbiImJk1hcC5wcm90b3R5cGU/TWFwOm51bGwsZnA9dHlwZW9mIFNldD09ImZ1bmN0aW9uIiYmU2V0LnByb3RvdHlwZT9TZXQ6bnVsbCxVdTtmcHx8KFV1PWZ1bmN0aW9uKHQpe3JldHVybiExfSk7dmFyIGh4PVJMP01hcC5wcm90b3R5cGUuaGFzOm51bGwsZng9ZnA/U2V0LnByb3RvdHlwZS5oYXM6bnVsbDshVXUmJiFmeCYmKFV1PWZ1bmN0aW9uKHQpe3JldHVybiExfSk7dmFyIGR4PVV1fHxmdW5jdGlvbih0KXtpZighdHx8dHlwZW9mIHQhPSJvYmplY3QiKXJldHVybiExO3RyeXtpZihmeC5jYWxsKHQpLGh4KXRyeXtoeC5jYWxsKHQpfWNhdGNoKGUpe3JldHVybiEwfXJldHVybiB0IGluc3RhbmNlb2YgZnB9Y2F0Y2goZSl7fXJldHVybiExfSxweD1CXyxteD1NTDtpZih6ZCgpfHxNdSgpKXt2YXIgZHA9U3ltYm9sLml0ZXJhdG9yO0V1LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYodCE9bnVsbCYmdHlwZW9mIHRbZHBdIT0idW5kZWZpbmVkIilyZXR1cm4gdFtkcF0oKTtpZihweCh0KSlyZXR1cm4gQXJyYXkucHJvdG90eXBlW2RwXS5jYWxsKHQpfX1lbHNle3ZhciBQTD1veCxJTD1heCxneD1yaSxMTD1neCgiJU1hcCUiLCEwKSxETD1neCgiJVNldCUiLCEwKSxYbj1Obix5eD1YbigiQXJyYXkucHJvdG90eXBlLnB1c2giKSx2eD1YbigiU3RyaW5nLnByb3RvdHlwZS5jaGFyQ29kZUF0IiksVUw9WG4oIlN0cmluZy5wcm90b3R5cGUuc2xpY2UiKSxOTD1mdW5jdGlvbih0LGUpe3ZhciBuPXQubGVuZ3RoO2lmKGUrMT49bilyZXR1cm4gZSsxO3ZhciByPXZ4KHQsZSk7aWYocjw1NTI5Nnx8cj41NjMxOSlyZXR1cm4gZSsxO3ZhciBzPXZ4KHQsZSsxKTtyZXR1cm4gczw1NjMyMHx8cz41NzM0Mz9lKzE6ZSsyfSxwcD1mdW5jdGlvbih0KXt2YXIgZT0wO3JldHVybntuZXh0OmZ1bmN0aW9uKCl7dmFyIHI9ZT49dC5sZW5ndGgscztyZXR1cm4gcnx8KHM9dFtlXSxlKz0xKSx7ZG9uZTpyLHZhbHVlOnN9fX19LF94PWZ1bmN0aW9uKHQsZSl7aWYoUEwodCl8fHB4KHQpKXJldHVybiBwcCh0KTtpZihJTCh0KSl7dmFyIG49MDtyZXR1cm57bmV4dDpmdW5jdGlvbigpe3ZhciBzPU5MKHQsbiksbz1VTCh0LG4scyk7cmV0dXJuIG49cyx7ZG9uZTpzPnQubGVuZ3RoLHZhbHVlOm99fX19aWYoZSYmdHlwZW9mIHRbIl9lczYtc2hpbSBpdGVyYXRvcl8iXSE9InVuZGVmaW5lZCIpcmV0dXJuIHRbIl9lczYtc2hpbSBpdGVyYXRvcl8iXSgpfTtpZighTEwmJiFETClFdS5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHQhPW51bGwpcmV0dXJuIF94KHQsITApfTtlbHNle3ZhciBGTD11eCxPTD1keCx4eD1YbigiTWFwLnByb3RvdHlwZS5mb3JFYWNoIiwhMCksTXg9WG4oIlNldC5wcm90b3R5cGUuZm9yRWFjaCIsITApO2lmKHR5cGVvZiBwcm9jZXNzPT0idW5kZWZpbmVkInx8IXByb2Nlc3MudmVyc2lvbnN8fCFwcm9jZXNzLnZlcnNpb25zLm5vZGUpdmFyIFN4PVhuKCJNYXAucHJvdG90eXBlLml0ZXJhdG9yIiwhMCksYng9WG4oIlNldC5wcm90b3R5cGUuaXRlcmF0b3IiLCEwKTt2YXIgd3g9WG4oIk1hcC5wcm90b3R5cGUuQEBpdGVyYXRvciIsITApfHxYbigiTWFwLnByb3RvdHlwZS5fZXM2LXNoaW0gaXRlcmF0b3JfIiwhMCksQXg9WG4oIlNldC5wcm90b3R5cGUuQEBpdGVyYXRvciIsITApfHxYbigiU2V0LnByb3RvdHlwZS5fZXM2LXNoaW0gaXRlcmF0b3JfIiwhMCksQkw9ZnVuY3Rpb24odCl7aWYoRkwodCkpe2lmKFN4KXJldHVybiBteChTeCh0KSk7aWYod3gpcmV0dXJuIHd4KHQpO2lmKHh4KXt2YXIgZT1bXTtyZXR1cm4geHgodCxmdW5jdGlvbihyLHMpe3l4KGUsW3Mscl0pfSkscHAoZSl9fWlmKE9MKHQpKXtpZihieClyZXR1cm4gbXgoYngodCkpO2lmKEF4KXJldHVybiBBeCh0KTtpZihNeCl7dmFyIG49W107cmV0dXJuIE14KHQsZnVuY3Rpb24ocil7eXgobixyKX0pLHBwKG4pfX19O0V1LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIEJMKHQpfHxfeCh0KX19fXZhciB6TD1FdS5leHBvcnRzLEV4PWZ1bmN0aW9uKGkpe3JldHVybiBpIT09aX0sVHg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PTAmJmU9PT0wPzEvdD09PTEvZTohISh0PT09ZXx8RXgodCkmJkV4KGUpKX0sa0w9VHgsQ3g9ZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIE9iamVjdC5pcz09ImZ1bmN0aW9uIj9PYmplY3QuaXM6a0x9LEdMPUN4LFZMPVdyLEhMPWZ1bmN0aW9uKCl7dmFyIHQ9R0woKTtyZXR1cm4gVkwoT2JqZWN0LHtpczp0fSx7aXM6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmlzIT09dH19KSx0fSxXTD1XciwkTD1xcyxYTD1UeCxSeD1DeCxxTD1ITCxQeD0kTChSeCgpLE9iamVjdCk7V0woUHgse2dldFBvbHlmaWxsOlJ4LGltcGxlbWVudGF0aW9uOlhMLHNoaW06cUx9KTt2YXIgWUw9UHgsWkw9cXMsSXg9Tm4sSkw9cmksbXA9SkwoIiVBcnJheUJ1ZmZlciUiLCEwKSxOdT1JeCgiQXJyYXlCdWZmZXIucHJvdG90eXBlLmJ5dGVMZW5ndGgiLCEwKSxLTD1JeCgiT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyIpLEx4PSEhbXAmJiFOdSYmbmV3IG1wKDApLnNsaWNlLER4PSEhTHgmJlpMKEx4KSxVeD1OdXx8RHg/ZnVuY3Rpb24odCl7aWYoIXR8fHR5cGVvZiB0IT0ib2JqZWN0IilyZXR1cm4hMTt0cnl7cmV0dXJuIE51P051KHQpOkR4KHQsMCksITB9Y2F0Y2goZSl7cmV0dXJuITF9fTptcD9mdW5jdGlvbih0KXtyZXR1cm4gS0wodCk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0ifTpmdW5jdGlvbih0KXtyZXR1cm4hMX0sakw9RGF0ZS5wcm90b3R5cGUuZ2V0RGF5LFFMPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gakwuY2FsbCh0KSwhMH1jYXRjaChlKXtyZXR1cm4hMX19LHQzPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsZTM9IltvYmplY3QgRGF0ZV0iLG4zPSRyKCksaTM9ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0IT0ib2JqZWN0Inx8dD09PW51bGw/ITE6bjM/UUwodCk6dDMuY2FsbCh0KT09PWUzfSxncD1ObixOeD0kcigpLEZ4LE94LHlwLHZwO2lmKE54KXtGeD1ncCgiT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSIpLE94PWdwKCJSZWdFeHAucHJvdG90eXBlLmV4ZWMiKSx5cD17fTt2YXIgX3A9ZnVuY3Rpb24oKXt0aHJvdyB5cH07dnA9e3RvU3RyaW5nOl9wLHZhbHVlT2Y6X3B9LHR5cGVvZiBTeW1ib2wudG9QcmltaXRpdmU9PSJzeW1ib2wiJiYodnBbU3ltYm9sLnRvUHJpbWl0aXZlXT1fcCl9dmFyIHIzPWdwKCJPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIiksczM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixvMz0iW29iamVjdCBSZWdFeHBdIixhMz1OeD9mdW5jdGlvbih0KXtpZighdHx8dHlwZW9mIHQhPSJvYmplY3QiKXJldHVybiExO3ZhciBlPXMzKHQsImxhc3RJbmRleCIpLG49ZSYmRngoZSwidmFsdWUiKTtpZighbilyZXR1cm4hMTt0cnl7T3godCx2cCl9Y2F0Y2gocil7cmV0dXJuIHI9PT15cH19OmZ1bmN0aW9uKHQpe3JldHVybiF0fHx0eXBlb2YgdCE9Im9iamVjdCImJnR5cGVvZiB0IT0iZnVuY3Rpb24iPyExOnIzKHQpPT09bzN9LGwzPU5uLEJ4PWwzKCJTaGFyZWRBcnJheUJ1ZmZlci5wcm90b3R5cGUuYnl0ZUxlbmd0aCIsITApLGMzPUJ4P2Z1bmN0aW9uKHQpe2lmKCF0fHx0eXBlb2YgdCE9Im9iamVjdCIpcmV0dXJuITE7dHJ5e3JldHVybiBCeCh0KSwhMH1jYXRjaChlKXtyZXR1cm4hMX19OmZ1bmN0aW9uKHQpe3JldHVybiExfSx1Mz1OdW1iZXIucHJvdG90eXBlLnRvU3RyaW5nLGgzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gdTMuY2FsbCh0KSwhMH1jYXRjaChlKXtyZXR1cm4hMX19LGYzPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsZDM9IltvYmplY3QgTnVtYmVyXSIscDM9JHIoKSxtMz1mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiPyEwOnR5cGVvZiB0IT0ib2JqZWN0Ij8hMTpwMz9oMyh0KTpmMy5jYWxsKHQpPT09ZDN9LHp4PU5uLGczPXp4KCJCb29sZWFuLnByb3RvdHlwZS50b1N0cmluZyIpLHkzPXp4KCJPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIiksdjM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBnMyh0KSwhMH1jYXRjaChlKXtyZXR1cm4hMX19LF8zPSJbb2JqZWN0IEJvb2xlYW5dIix4Mz0kcigpLE0zPWZ1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdD09ImJvb2xlYW4iPyEwOnQ9PT1udWxsfHx0eXBlb2YgdCE9Im9iamVjdCI/ITE6eDMmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiB0P3YzKHQpOnkzKHQpPT09XzN9LHhwPXtleHBvcnRzOnt9fSxTMz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGIzPXpkKCk7aWYoYjMpe3ZhciB3Mz1TeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nLEEzPS9eU3ltYm9sXCguKlwpJC8sRTM9ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0LnZhbHVlT2YoKSE9InN5bWJvbCI/ITE6QTMudGVzdCh3My5jYWxsKHQpKX07eHAuZXhwb3J0cz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdD09InN5bWJvbCIpcmV0dXJuITA7aWYoUzMuY2FsbCh0KSE9PSJbb2JqZWN0IFN5bWJvbF0iKXJldHVybiExO3RyeXtyZXR1cm4gRTModCl9Y2F0Y2goZSl7cmV0dXJuITF9fX1lbHNlIHhwLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuITF9O3ZhciBUMz14cC5leHBvcnRzLE1wPXtleHBvcnRzOnt9fSxreD10eXBlb2YgQmlnSW50IT0idW5kZWZpbmVkIiYmQmlnSW50LEMzPWZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiBreD09ImZ1bmN0aW9uIiYmdHlwZW9mIEJpZ0ludD09ImZ1bmN0aW9uIiYmdHlwZW9mIGt4KDQyKT09ImJpZ2ludCImJnR5cGVvZiBCaWdJbnQoNDIpPT0iYmlnaW50In0sUjM9QzMoKTtpZihSMyl7dmFyIFAzPUJpZ0ludC5wcm90b3R5cGUudmFsdWVPZixJMz1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIFAzLmNhbGwodCksITB9Y2F0Y2goZSl7fXJldHVybiExfTtNcC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09bnVsbHx8dHlwZW9mIHQ9PSJ1bmRlZmluZWQifHx0eXBlb2YgdD09ImJvb2xlYW4ifHx0eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0PT0ibnVtYmVyInx8dHlwZW9mIHQ9PSJzeW1ib2wifHx0eXBlb2YgdD09ImZ1bmN0aW9uIj8hMTp0eXBlb2YgdD09ImJpZ2ludCI/ITA6STModCl9fWVsc2UgTXAuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4hMX07dmFyIEwzPU1wLmV4cG9ydHMsRDM9YXgsVTM9bTMsTjM9TTMsRjM9VDMsTzM9TDMsQjM9ZnVuY3Rpb24odCl7aWYodD09bnVsbHx8dHlwZW9mIHQhPSJvYmplY3QiJiZ0eXBlb2YgdCE9ImZ1bmN0aW9uIilyZXR1cm4gbnVsbDtpZihEMyh0KSlyZXR1cm4iU3RyaW5nIjtpZihVMyh0KSlyZXR1cm4iTnVtYmVyIjtpZihOMyh0KSlyZXR1cm4iQm9vbGVhbiI7aWYoRjModCkpcmV0dXJuIlN5bWJvbCI7aWYoTzModCkpcmV0dXJuIkJpZ0ludCJ9LEZ1PXR5cGVvZiBXZWFrTWFwPT0iZnVuY3Rpb24iJiZXZWFrTWFwLnByb3RvdHlwZT9XZWFrTWFwOm51bGwsR3g9dHlwZW9mIFdlYWtTZXQ9PSJmdW5jdGlvbiImJldlYWtTZXQucHJvdG90eXBlP1dlYWtTZXQ6bnVsbCxPdTtGdXx8KE91PWZ1bmN0aW9uKHQpe3JldHVybiExfSk7dmFyIFNwPUZ1P0Z1LnByb3RvdHlwZS5oYXM6bnVsbCxicD1HeD9HeC5wcm90b3R5cGUuaGFzOm51bGw7IU91JiYhU3AmJihPdT1mdW5jdGlvbih0KXtyZXR1cm4hMX0pO3ZhciB6Mz1PdXx8ZnVuY3Rpb24odCl7aWYoIXR8fHR5cGVvZiB0IT0ib2JqZWN0IilyZXR1cm4hMTt0cnl7aWYoU3AuY2FsbCh0LFNwKSxicCl0cnl7YnAuY2FsbCh0LGJwKX1jYXRjaChlKXtyZXR1cm4hMH1yZXR1cm4gdCBpbnN0YW5jZW9mIEZ1fWNhdGNoKGUpe31yZXR1cm4hMX0sd3A9e2V4cG9ydHM6e319LGszPXJpLFZ4PU5uLEczPWszKCIlV2Vha1NldCUiLCEwKSxBcD1WeCgiV2Vha1NldC5wcm90b3R5cGUuaGFzIiwhMCk7aWYoQXApe3ZhciBFcD1WeCgiV2Vha01hcC5wcm90b3R5cGUuaGFzIiwhMCk7d3AuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighdHx8dHlwZW9mIHQhPSJvYmplY3QiKXJldHVybiExO3RyeXtpZihBcCh0LEFwKSxFcCl0cnl7RXAodCxFcCl9Y2F0Y2goZSl7cmV0dXJuITB9cmV0dXJuIHQgaW5zdGFuY2VvZiBHM31jYXRjaChlKXt9cmV0dXJuITF9fWVsc2Ugd3AuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4hMX07dmFyIFYzPXdwLmV4cG9ydHMsSDM9dXgsVzM9ZHgsJDM9ejMsWDM9VjMscTM9ZnVuY3Rpb24odCl7aWYodCYmdHlwZW9mIHQ9PSJvYmplY3QiKXtpZihIMyh0KSlyZXR1cm4iTWFwIjtpZihXMyh0KSlyZXR1cm4iU2V0IjtpZigkMyh0KSlyZXR1cm4iV2Vha01hcCI7aWYoWDModCkpcmV0dXJuIldlYWtTZXQifXJldHVybiExfSxIeD1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsSnM9dHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiJiZSZWZsZWN0IT09bnVsbCYmUmVmbGVjdC5hcHBseSxUcCxCdTtpZih0eXBlb2YgSnM9PSJmdW5jdGlvbiImJnR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHk9PSJmdW5jdGlvbiIpdHJ5e1RwPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwibGVuZ3RoIix7Z2V0OmZ1bmN0aW9uKCl7dGhyb3cgQnV9fSksQnU9e30sSnMoZnVuY3Rpb24oKXt0aHJvdyA0Mn0sbnVsbCxUcCl9Y2F0Y2goaSl7aSE9PUJ1JiYoSnM9bnVsbCl9ZWxzZSBKcz1udWxsO3ZhciBZMz0vXlxzKmNsYXNzXGIvLENwPWZ1bmN0aW9uKHQpe3RyeXt2YXIgZT1IeC5jYWxsKHQpO3JldHVybiBZMy50ZXN0KGUpfWNhdGNoKG4pe3JldHVybiExfX0sUnA9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBDcCh0KT8hMTooSHguY2FsbCh0KSwhMCl9Y2F0Y2goZSl7cmV0dXJuITF9fSx6dT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLFozPSJbb2JqZWN0IE9iamVjdF0iLEozPSJbb2JqZWN0IEZ1bmN0aW9uXSIsSzM9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixqMz0iW29iamVjdCBIVE1MQWxsQ29sbGVjdGlvbl0iLFEzPSJbb2JqZWN0IEhUTUwgZG9jdW1lbnQuYWxsIGNsYXNzXSIsdEQ9IltvYmplY3QgSFRNTENvbGxlY3Rpb25dIixlRD10eXBlb2YgU3ltYm9sPT0iZnVuY3Rpb24iJiYhIVN5bWJvbC50b1N0cmluZ1RhZyxuRD0hKDAgaW5bLF0pLFBwPWZ1bmN0aW9uKCl7cmV0dXJuITF9O2lmKHR5cGVvZiBkb2N1bWVudD09Im9iamVjdCIpe3ZhciBpRD1kb2N1bWVudC5hbGw7enUuY2FsbChpRCk9PT16dS5jYWxsKGRvY3VtZW50LmFsbCkmJihQcD1mdW5jdGlvbih0KXtpZigobkR8fCF0KSYmKHR5cGVvZiB0PT0idW5kZWZpbmVkInx8dHlwZW9mIHQ9PSJvYmplY3QiKSl0cnl7dmFyIGU9enUuY2FsbCh0KTtyZXR1cm4oZT09PWozfHxlPT09UTN8fGU9PT10RHx8ZT09PVozKSYmdCgiIik9PW51bGx9Y2F0Y2gobil7fXJldHVybiExfSl9dmFyIHJEPUpzP2Z1bmN0aW9uKHQpe2lmKFBwKHQpKXJldHVybiEwO2lmKCF0fHx0eXBlb2YgdCE9ImZ1bmN0aW9uIiYmdHlwZW9mIHQhPSJvYmplY3QiKXJldHVybiExO3RyeXtKcyh0LG51bGwsVHApfWNhdGNoKGUpe2lmKGUhPT1CdSlyZXR1cm4hMX1yZXR1cm4hQ3AodCkmJlJwKHQpfTpmdW5jdGlvbih0KXtpZihQcCh0KSlyZXR1cm4hMDtpZighdHx8dHlwZW9mIHQhPSJmdW5jdGlvbiImJnR5cGVvZiB0IT0ib2JqZWN0IilyZXR1cm4hMTtpZihlRClyZXR1cm4gUnAodCk7aWYoQ3AodCkpcmV0dXJuITE7dmFyIGU9enUuY2FsbCh0KTtyZXR1cm4gZSE9PUozJiZlIT09SzMmJiEvXlxbb2JqZWN0IEhUTUwvLnRlc3QoZSk/ITE6UnAodCl9LHNEPXJELG9EPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsV3g9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxhRD1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTAscz10Lmxlbmd0aDtyPHM7cisrKVd4LmNhbGwodCxyKSYmKG49PW51bGw/ZSh0W3JdLHIsdCk6ZS5jYWxsKG4sdFtyXSxyLHQpKX0sbEQ9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0wLHM9dC5sZW5ndGg7cjxzO3IrKyluPT1udWxsP2UodC5jaGFyQXQocikscix0KTplLmNhbGwobix0LmNoYXJBdChyKSxyLHQpfSxjRD1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByIGluIHQpV3guY2FsbCh0LHIpJiYobj09bnVsbD9lKHRbcl0scix0KTplLmNhbGwobix0W3JdLHIsdCkpfSx1RD1mdW5jdGlvbih0LGUsbil7aWYoIXNEKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIG11c3QgYmUgYSBmdW5jdGlvbiIpO3ZhciByO2FyZ3VtZW50cy5sZW5ndGg+PTMmJihyPW4pLG9ELmNhbGwodCk9PT0iW29iamVjdCBBcnJheV0iP2FEKHQsZSxyKTp0eXBlb2YgdD09InN0cmluZyI/bEQodCxlLHIpOmNEKHQsZSxyKX0saEQ9dUQsZkQ9WyJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJJbnQ4QXJyYXkiLCJJbnQxNkFycmF5IiwiSW50MzJBcnJheSIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIlVpbnQxNkFycmF5IiwiVWludDMyQXJyYXkiLCJCaWdJbnQ2NEFycmF5IiwiQmlnVWludDY0QXJyYXkiXSxJcD1mRCxkRD10eXBlb2YgZ2xvYmFsVGhpcz09InVuZGVmaW5lZCI/bXU6Z2xvYmFsVGhpcyxwRD1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxJcC5sZW5ndGg7ZSsrKXR5cGVvZiBkRFtJcFtlXV09PSJmdW5jdGlvbiImJih0W3QubGVuZ3RoXT1JcFtlXSk7cmV0dXJuIHR9LGt1PWhELG1EPXBELCR4PXFzLExwPU5uLEd1PSRkLGdEPUxwKCJPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIiksWHg9JHIoKSxxeD10eXBlb2YgZ2xvYmFsVGhpcz09InVuZGVmaW5lZCI/bXU6Z2xvYmFsVGhpcyxEcD1tRCgpLFVwPUxwKCJTdHJpbmcucHJvdG90eXBlLnNsaWNlIiksTnA9T2JqZWN0LmdldFByb3RvdHlwZU9mLHlEPUxwKCJBcnJheS5wcm90b3R5cGUuaW5kZXhPZiIsITApfHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bis9MSlpZih0W25dPT09ZSlyZXR1cm4gbjtyZXR1cm4tMX0sVnU9e19fcHJvdG9fXzpudWxsfTtYeCYmR3UmJk5wP2t1KERwLGZ1bmN0aW9uKGkpe3ZhciB0PW5ldyBxeFtpXTtpZihTeW1ib2wudG9TdHJpbmdUYWcgaW4gdCl7dmFyIGU9TnAodCksbj1HdShlLFN5bWJvbC50b1N0cmluZ1RhZyk7aWYoIW4pe3ZhciByPU5wKGUpO249R3UocixTeW1ib2wudG9TdHJpbmdUYWcpfVZ1WyIkIitpXT0keChuLmdldCl9fSk6a3UoRHAsZnVuY3Rpb24oaSl7dmFyIHQ9bmV3IHF4W2ldLGU9dC5zbGljZXx8dC5zZXQ7ZSYmKFZ1WyIkIitpXT0keChlKSl9KTt2YXIgdkQ9ZnVuY3Rpb24odCl7dmFyIGU9ITE7cmV0dXJuIGt1KFZ1LGZ1bmN0aW9uKG4scil7aWYoIWUpdHJ5eyIkIituKHQpPT09ciYmKGU9VXAociwxKSl9Y2F0Y2gocyl7fX0pLGV9LF9EPWZ1bmN0aW9uKHQpe3ZhciBlPSExO3JldHVybiBrdShWdSxmdW5jdGlvbihuLHIpe2lmKCFlKXRyeXtuKHQpLGU9VXAociwxKX1jYXRjaChzKXt9fSksZX0seEQ9ZnVuY3Rpb24odCl7aWYoIXR8fHR5cGVvZiB0IT0ib2JqZWN0IilyZXR1cm4hMTtpZighWHgpe3ZhciBlPVVwKGdEKHQpLDgsLTEpO3JldHVybiB5RChEcCxlKT4tMT9lOmUhPT0iT2JqZWN0Ij8hMTpfRCh0KX1yZXR1cm4gR3U/dkQodCk6bnVsbH0sTUQ9Tm4sWXg9TUQoIkFycmF5QnVmZmVyLnByb3RvdHlwZS5ieXRlTGVuZ3RoIiwhMCksU0Q9VXgsYkQ9ZnVuY3Rpb24odCl7cmV0dXJuIFNEKHQpP1l4P1l4KHQpOnQuYnl0ZUxlbmd0aDpOYU59LFp4PWVJLG9pPU5uLEp4PUFJLHdEPXJpLEtzPXpMLEFEPXJ4LEt4PVlMLGp4PUJfLFF4PW94LHRNPVV4LGVNPWkzLG5NPWEzLGlNPWMzLHJNPUJkLHNNPUIzLG9NPXEzLGFNPXhELGxNPWJELGNNPW9pKCJTaGFyZWRBcnJheUJ1ZmZlci5wcm90b3R5cGUuYnl0ZUxlbmd0aCIsITApLHVNPW9pKCJEYXRlLnByb3RvdHlwZS5nZXRUaW1lIiksRnA9T2JqZWN0LmdldFByb3RvdHlwZU9mLGhNPW9pKCJPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIiksSHU9d0QoIiVTZXQlIiwhMCksT3A9b2koIk1hcC5wcm90b3R5cGUuaGFzIiwhMCksV3U9b2koIk1hcC5wcm90b3R5cGUuZ2V0IiwhMCksZk09b2koIk1hcC5wcm90b3R5cGUuc2l6ZSIsITApLCR1PW9pKCJTZXQucHJvdG90eXBlLmFkZCIsITApLGRNPW9pKCJTZXQucHJvdG90eXBlLmRlbGV0ZSIsITApLFh1PW9pKCJTZXQucHJvdG90eXBlLmhhcyIsITApLHF1PW9pKCJTZXQucHJvdG90eXBlLnNpemUiLCEwKTtmdW5jdGlvbiBwTShpLHQsZSxuKXtmb3IodmFyIHI9S3MoaSksczsocz1yLm5leHQoKSkmJiFzLmRvbmU7KWlmKHFuKHQscy52YWx1ZSxlLG4pKXJldHVybiBkTShpLHMudmFsdWUpLCEwO3JldHVybiExfWZ1bmN0aW9uIG1NKGkpe2lmKHR5cGVvZiBpPT0idW5kZWZpbmVkIilyZXR1cm4gbnVsbDtpZih0eXBlb2YgaSE9Im9iamVjdCIpcmV0dXJuIHR5cGVvZiBpPT0ic3ltYm9sIj8hMTp0eXBlb2YgaT09InN0cmluZyJ8fHR5cGVvZiBpPT0ibnVtYmVyIj8raT09K2k6ITB9ZnVuY3Rpb24gRUQoaSx0LGUsbixyLHMpe3ZhciBvPW1NKGUpO2lmKG8hPW51bGwpcmV0dXJuIG87dmFyIGE9V3UodCxvKSxsPVp4KHt9LHIse3N0cmljdDohMX0pO3JldHVybiB0eXBlb2YgYT09InVuZGVmaW5lZCImJiFPcCh0LG8pfHwhcW4obixhLGwscyk/ITE6IU9wKGksbykmJnFuKG4sYSxsLHMpfWZ1bmN0aW9uIFREKGksdCxlKXt2YXIgbj1tTShlKTtyZXR1cm4gbiE9bnVsbD9uOlh1KHQsbikmJiFYdShpLG4pfWZ1bmN0aW9uIGdNKGksdCxlLG4scixzKXtmb3IodmFyIG89S3MoaSksYSxsOyhhPW8ubmV4dCgpKSYmIWEuZG9uZTspaWYobD1hLnZhbHVlLHFuKGUsbCxyLHMpJiZxbihuLFd1KHQsbCkscixzKSlyZXR1cm4gZE0oaSxsKSwhMDtyZXR1cm4hMX1mdW5jdGlvbiBxbihpLHQsZSxuKXt2YXIgcj1lfHx7fTtpZihyLnN0cmljdD9LeChpLHQpOmk9PT10KXJldHVybiEwO3ZhciBzPXNNKGkpLG89c00odCk7aWYocyE9PW8pcmV0dXJuITE7aWYoIWl8fCF0fHx0eXBlb2YgaSE9Im9iamVjdCImJnR5cGVvZiB0IT0ib2JqZWN0IilyZXR1cm4gci5zdHJpY3Q/S3goaSx0KTppPT10O3ZhciBhPW4uaGFzKGkpLGw9bi5oYXModCksYztpZihhJiZsKXtpZihuLmdldChpKT09PW4uZ2V0KHQpKXJldHVybiEwfWVsc2UgYz17fTtyZXR1cm4gYXx8bi5zZXQoaSxjKSxsfHxuLnNldCh0LGMpLFBEKGksdCxyLG4pfWZ1bmN0aW9uIHlNKGkpe3JldHVybiFpfHx0eXBlb2YgaSE9Im9iamVjdCJ8fHR5cGVvZiBpLmxlbmd0aCE9Im51bWJlciJ8fHR5cGVvZiBpLmNvcHkhPSJmdW5jdGlvbiJ8fHR5cGVvZiBpLnNsaWNlIT0iZnVuY3Rpb24ifHxpLmxlbmd0aD4wJiZ0eXBlb2YgaVswXSE9Im51bWJlciI/ITE6ISEoaS5jb25zdHJ1Y3RvciYmaS5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmaS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihpKSl9ZnVuY3Rpb24gQ0QoaSx0LGUsbil7aWYocXUoaSkhPT1xdSh0KSlyZXR1cm4hMTtmb3IodmFyIHI9S3MoaSkscz1Lcyh0KSxvLGEsbDsobz1yLm5leHQoKSkmJiFvLmRvbmU7KWlmKG8udmFsdWUmJnR5cGVvZiBvLnZhbHVlPT0ib2JqZWN0IilsfHwobD1uZXcgSHUpLCR1KGwsby52YWx1ZSk7ZWxzZSBpZighWHUodCxvLnZhbHVlKSl7aWYoZS5zdHJpY3R8fCFURChpLHQsby52YWx1ZSkpcmV0dXJuITE7bHx8KGw9bmV3IEh1KSwkdShsLG8udmFsdWUpfWlmKGwpe2Zvcig7KGE9cy5uZXh0KCkpJiYhYS5kb25lOylpZihhLnZhbHVlJiZ0eXBlb2YgYS52YWx1ZT09Im9iamVjdCIpe2lmKCFwTShsLGEudmFsdWUsZS5zdHJpY3QsbikpcmV0dXJuITF9ZWxzZSBpZighZS5zdHJpY3QmJiFYdShpLGEudmFsdWUpJiYhcE0obCxhLnZhbHVlLGUuc3RyaWN0LG4pKXJldHVybiExO3JldHVybiBxdShsKT09PTB9cmV0dXJuITB9ZnVuY3Rpb24gUkQoaSx0LGUsbil7aWYoZk0oaSkhPT1mTSh0KSlyZXR1cm4hMTtmb3IodmFyIHI9S3MoaSkscz1Lcyh0KSxvLGEsbCxjLHUsaDsobz1yLm5leHQoKSkmJiFvLmRvbmU7KWlmKGM9by52YWx1ZVswXSx1PW8udmFsdWVbMV0sYyYmdHlwZW9mIGM9PSJvYmplY3QiKWx8fChsPW5ldyBIdSksJHUobCxjKTtlbHNlIGlmKGg9V3UodCxjKSx0eXBlb2YgaD09InVuZGVmaW5lZCImJiFPcCh0LGMpfHwhcW4odSxoLGUsbikpe2lmKGUuc3RyaWN0fHwhRUQoaSx0LGMsdSxlLG4pKXJldHVybiExO2x8fChsPW5ldyBIdSksJHUobCxjKX1pZihsKXtmb3IoOyhhPXMubmV4dCgpKSYmIWEuZG9uZTspaWYoYz1hLnZhbHVlWzBdLGg9YS52YWx1ZVsxXSxjJiZ0eXBlb2YgYz09Im9iamVjdCIpe2lmKCFnTShsLGksYyxoLGUsbikpcmV0dXJuITF9ZWxzZSBpZighZS5zdHJpY3QmJighaS5oYXMoYyl8fCFxbihXdShpLGMpLGgsZSxuKSkmJiFnTShsLGksYyxoLFp4KHt9LGUse3N0cmljdDohMX0pLG4pKXJldHVybiExO3JldHVybiBxdShsKT09PTB9cmV0dXJuITB9ZnVuY3Rpb24gUEQoaSx0LGUsbil7dmFyIHIscztpZih0eXBlb2YgaSE9dHlwZW9mIHR8fGk9PW51bGx8fHQ9PW51bGx8fGhNKGkpIT09aE0odCl8fGp4KGkpIT09angodCkpcmV0dXJuITE7dmFyIG89UXgoaSksYT1ReCh0KTtpZihvIT09YSlyZXR1cm4hMTt2YXIgbD1pIGluc3RhbmNlb2YgRXJyb3IsYz10IGluc3RhbmNlb2YgRXJyb3I7aWYobCE9PWN8fChsfHxjKSYmKGkubmFtZSE9PXQubmFtZXx8aS5tZXNzYWdlIT09dC5tZXNzYWdlKSlyZXR1cm4hMTt2YXIgdT1uTShpKSxoPW5NKHQpO2lmKHUhPT1ofHwodXx8aCkmJihpLnNvdXJjZSE9PXQuc291cmNlfHxKeChpKSE9PUp4KHQpKSlyZXR1cm4hMTt2YXIgZj1lTShpKSxkPWVNKHQpO2lmKGYhPT1kfHwoZnx8ZCkmJnVNKGkpIT09dU0odCl8fGUuc3RyaWN0JiZGcCYmRnAoaSkhPT1GcCh0KSlyZXR1cm4hMTt2YXIgcD1hTShpKSx5PWFNKHQpO2lmKHAhPT15KXJldHVybiExO2lmKHB8fHkpe2lmKGkubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKHI9MDtyPGkubGVuZ3RoO3IrKylpZihpW3JdIT09dFtyXSlyZXR1cm4hMTtyZXR1cm4hMH12YXIgbT15TShpKSxnPXlNKHQpO2lmKG0hPT1nKXJldHVybiExO2lmKG18fGcpe2lmKGkubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKHI9MDtyPGkubGVuZ3RoO3IrKylpZihpW3JdIT09dFtyXSlyZXR1cm4hMTtyZXR1cm4hMH12YXIgeD10TShpKSx2PXRNKHQpO2lmKHghPT12KXJldHVybiExO2lmKHh8fHYpcmV0dXJuIGxNKGkpIT09bE0odCk/ITE6dHlwZW9mIFVpbnQ4QXJyYXk9PSJmdW5jdGlvbiImJnFuKG5ldyBVaW50OEFycmF5KGkpLG5ldyBVaW50OEFycmF5KHQpLGUsbik7dmFyIF89aU0oaSksRT1pTSh0KTtpZihfIT09RSlyZXR1cm4hMTtpZihffHxFKXJldHVybiBjTShpKSE9PWNNKHQpPyExOnR5cGVvZiBVaW50OEFycmF5PT0iZnVuY3Rpb24iJiZxbihuZXcgVWludDhBcnJheShpKSxuZXcgVWludDhBcnJheSh0KSxlLG4pO2lmKHR5cGVvZiBpIT10eXBlb2YgdClyZXR1cm4hMTt2YXIgYj1yTShpKSxUPXJNKHQpO2lmKGIubGVuZ3RoIT09VC5sZW5ndGgpcmV0dXJuITE7Zm9yKGIuc29ydCgpLFQuc29ydCgpLHI9Yi5sZW5ndGgtMTtyPj0wO3ItLSlpZihiW3JdIT1UW3JdKXJldHVybiExO2ZvcihyPWIubGVuZ3RoLTE7cj49MDtyLS0paWYocz1iW3JdLCFxbihpW3NdLHRbc10sZSxuKSlyZXR1cm4hMTt2YXIgUD1vTShpKSx3PW9NKHQpO3JldHVybiBQIT09dz8hMTpQPT09IlNldCJ8fHc9PT0iU2V0Ij9DRChpLHQsZSxuKTpQPT09Ik1hcCI/UkQoaSx0LGUsbik6ITB9dmFyIElEPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcW4odCxlLG4sQUQoKSl9LExEPVl2KElEKSxERD1PYmplY3QuZGVmaW5lUHJvcGVydHksZmU9KGksdCk9PkREKGksIm5hbWUiLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pLFVEPWNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMuZGlyZWN0aW9uPSExLHRoaXMuY29tcGFyZVByb3BlcnRpZXM9ITA7dmFyIGUsbixyO3RoaXMucHJlY2lzaW9uPW9vKDEwLC0oKGU9dD09bnVsbD92b2lkIDA6dC5wcmVjaXNpb24pIT1udWxsP2U6MTcpKSx0aGlzLmRpcmVjdGlvbj0obj10PT1udWxsP3ZvaWQgMDp0LmRpcmVjdGlvbikhPW51bGw/bjohMSx0aGlzLmNvbXBhcmVQcm9wZXJ0aWVzPShyPXQ9PW51bGw/dm9pZCAwOnQuY29tcGFyZVByb3BlcnRpZXMpIT1udWxsP3I6ITB9Y29tcGFyZSh0LGUpe2lmKHQudHlwZSE9PWUudHlwZXx8IUNhKHQsZSkpcmV0dXJuITE7c3dpdGNoKHQudHlwZSl7Y2FzZSJQb2ludCI6cmV0dXJuIHRoaXMuY29tcGFyZUNvb3JkKHQuY29vcmRpbmF0ZXMsZS5jb29yZGluYXRlcyk7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4gdGhpcy5jb21wYXJlTGluZSh0LmNvb3JkaW5hdGVzLGUuY29vcmRpbmF0ZXMpO2Nhc2UiUG9seWdvbiI6cmV0dXJuIHRoaXMuY29tcGFyZVBvbHlnb24odCxlKTtjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6cmV0dXJuIHRoaXMuY29tcGFyZUdlb21ldHJ5Q29sbGVjdGlvbih0LGUpO2Nhc2UiRmVhdHVyZSI6cmV0dXJuIHRoaXMuY29tcGFyZUZlYXR1cmUodCxlKTtjYXNlIkZlYXR1cmVDb2xsZWN0aW9uIjpyZXR1cm4gdGhpcy5jb21wYXJlRmVhdHVyZUNvbGxlY3Rpb24odCxlKTtkZWZhdWx0OmlmKHQudHlwZS5zdGFydHNXaXRoKCJNdWx0aSIpKXtjb25zdCBuPUJwKHQpLHI9QnAoZSk7cmV0dXJuIG4uZXZlcnkocz0+ci5zb21lKG89PnRoaXMuY29tcGFyZShzLG8pKSl9fXJldHVybiExfWNvbXBhcmVDb29yZCh0LGUpe3JldHVybiB0Lmxlbmd0aD09PWUubGVuZ3RoJiZ0LmV2ZXJ5KChuLHIpPT5NYXRoLmFicyhuLWVbcl0pPHRoaXMucHJlY2lzaW9uKX1jb21wYXJlTGluZSh0LGUsbj0wLHI9ITEpe2lmKCFDYSh0LGUpKXJldHVybiExO2NvbnN0IHM9dDtsZXQgbz1lO2lmKHImJiF0aGlzLmNvbXBhcmVDb29yZChzWzBdLG9bMF0pKXtjb25zdCBsPXRoaXMuZml4U3RhcnRJbmRleChvLHMpO2lmKGwpbz1sO2Vsc2UgcmV0dXJuITF9Y29uc3QgYT10aGlzLmNvbXBhcmVDb29yZChzW25dLG9bbl0pO3JldHVybiB0aGlzLmRpcmVjdGlvbnx8YT90aGlzLmNvbXBhcmVQYXRoKHMsbyk6dGhpcy5jb21wYXJlQ29vcmQoc1tuXSxvW28ubGVuZ3RoLSgxK24pXSk/dGhpcy5jb21wYXJlUGF0aChzLnNsaWNlKCkucmV2ZXJzZSgpLG8pOiExfWZpeFN0YXJ0SW5kZXgodCxlKXtsZXQgbixyPS0xO2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKWlmKHRoaXMuY29tcGFyZUNvb3JkKHRbc10sZVswXSkpe3I9czticmVha31yZXR1cm4gcj49MCYmKG49W10uY29uY2F0KHQuc2xpY2Uocix0Lmxlbmd0aCksdC5zbGljZSgxLHIrMSkpKSxufWNvbXBhcmVQYXRoKHQsZSl7cmV0dXJuIHQuZXZlcnkoKG4scik9PnRoaXMuY29tcGFyZUNvb3JkKG4sZVtyXSkpfWNvbXBhcmVQb2x5Z29uKHQsZSl7aWYodGhpcy5jb21wYXJlTGluZSh0LmNvb3JkaW5hdGVzWzBdLGUuY29vcmRpbmF0ZXNbMF0sMSwhMCkpe2NvbnN0IG49dC5jb29yZGluYXRlcy5zbGljZSgxLHQuY29vcmRpbmF0ZXMubGVuZ3RoKSxyPWUuY29vcmRpbmF0ZXMuc2xpY2UoMSxlLmNvb3JkaW5hdGVzLmxlbmd0aCk7cmV0dXJuIG4uZXZlcnkocz0+ci5zb21lKG89PnRoaXMuY29tcGFyZUxpbmUocyxvLDEsITApKSl9cmV0dXJuITF9Y29tcGFyZUdlb21ldHJ5Q29sbGVjdGlvbih0LGUpe3JldHVybiBDYSh0Lmdlb21ldHJpZXMsZS5nZW9tZXRyaWVzKSYmdGhpcy5jb21wYXJlQkJveCh0LGUpJiZ0Lmdlb21ldHJpZXMuZXZlcnkoKG4scik9PnRoaXMuY29tcGFyZShuLGUuZ2VvbWV0cmllc1tyXSkpfWNvbXBhcmVGZWF0dXJlKHQsZSl7cmV0dXJuIHQuaWQ9PT1lLmlkJiYodGhpcy5jb21wYXJlUHJvcGVydGllcz9MRCh0LnByb3BlcnRpZXMsZS5wcm9wZXJ0aWVzKTohMCkmJnRoaXMuY29tcGFyZUJCb3godCxlKSYmdGhpcy5jb21wYXJlKHQuZ2VvbWV0cnksZS5nZW9tZXRyeSl9Y29tcGFyZUZlYXR1cmVDb2xsZWN0aW9uKHQsZSl7cmV0dXJuIENhKHQuZmVhdHVyZXMsZS5mZWF0dXJlcykmJnRoaXMuY29tcGFyZUJCb3godCxlKSYmdC5mZWF0dXJlcy5ldmVyeSgobixyKT0+dGhpcy5jb21wYXJlKG4sZS5mZWF0dXJlc1tyXSkpfWNvbXBhcmVCQm94KHQsZSl7cmV0dXJuIXQuYmJveCYmIWUuYmJveHx8KHQuYmJveCYmZS5iYm94P3RoaXMuY29tcGFyZUNvb3JkKHQuYmJveCxlLmJib3gpOiExKX19O2ZlKFVELCJHZW9qc29uRXF1YWxpdHkiKTtmdW5jdGlvbiBDYShpLHQpe3JldHVybiBpLmNvb3JkaW5hdGVzP2kuY29vcmRpbmF0ZXMubGVuZ3RoPT09dC5jb29yZGluYXRlcy5sZW5ndGg6aS5sZW5ndGg9PT10Lmxlbmd0aH1mZShDYSwic2FtZUxlbmd0aCIpO2Z1bmN0aW9uIEJwKGkpe3JldHVybiBpLmNvb3JkaW5hdGVzLm1hcCh0PT4oe3R5cGU6aS50eXBlLnJlcGxhY2UoIk11bHRpIiwiIiksY29vcmRpbmF0ZXM6dH0pKX1mZShCcCwiZXhwbG9kZSIpO3ZhciBUbj02MzcxMDA4OGUtMSx2TT17Y2VudGltZXRlcnM6VG4qMTAwLGNlbnRpbWV0cmVzOlRuKjEwMCxkZWdyZWVzOjM2MC8oMipNYXRoLlBJKSxmZWV0OlRuKjMuMjgwODQsaW5jaGVzOlRuKjM5LjM3LGtpbG9tZXRlcnM6VG4vMWUzLGtpbG9tZXRyZXM6VG4vMWUzLG1ldGVyczpUbixtZXRyZXM6VG4sbWlsZXM6VG4vMTYwOS4zNDQsbWlsbGltZXRlcnM6VG4qMWUzLG1pbGxpbWV0cmVzOlRuKjFlMyxuYXV0aWNhbG1pbGVzOlRuLzE4NTIscmFkaWFuczoxLHlhcmRzOlRuKjEuMDkzNn0sX009e2FjcmVzOjI0NzEwNWUtOSxjZW50aW1ldGVyczoxZTQsY2VudGltZXRyZXM6MWU0LGZlZXQ6MTAuNzYzOTEwNDE3LGhlY3RhcmVzOjFlLTQsaW5jaGVzOjE1NTAuMDAzMTAwMDA2LGtpbG9tZXRlcnM6MWUtNixraWxvbWV0cmVzOjFlLTYsbWV0ZXJzOjEsbWV0cmVzOjEsbWlsZXM6Mzg2ZS05LG5hdXRpY2FsbWlsZXM6MjkxNTUzMzQ5NTk4MTIyODVlLTIzLG1pbGxpbWV0ZXJzOjFlNixtaWxsaW1ldHJlczoxZTYseWFyZHM6MS4xOTU5OTAwNDZ9O2Z1bmN0aW9uIHNyKGksdCxlPXt9KXtjb25zdCBuPXt0eXBlOiJGZWF0dXJlIn07cmV0dXJuKGUuaWQ9PT0wfHxlLmlkKSYmKG4uaWQ9ZS5pZCksZS5iYm94JiYobi5iYm94PWUuYmJveCksbi5wcm9wZXJ0aWVzPXR8fHt9LG4uZ2VvbWV0cnk9aSxufWZlKHNyLCJmZWF0dXJlIik7ZnVuY3Rpb24gTkQoaSx0LGU9e30pe3N3aXRjaChpKXtjYXNlIlBvaW50IjpyZXR1cm4genAodCkuZ2VvbWV0cnk7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4gR3AodCkuZ2VvbWV0cnk7Y2FzZSJQb2x5Z29uIjpyZXR1cm4ga3AodCkuZ2VvbWV0cnk7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gTU0odCkuZ2VvbWV0cnk7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnJldHVybiB4TSh0KS5nZW9tZXRyeTtjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIFNNKHQpLmdlb21ldHJ5O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGkrIiBpcyBpbnZhbGlkIil9fWZlKE5ELCJnZW9tZXRyeSIpO2Z1bmN0aW9uIHpwKGksdCxlPXt9KXtpZighaSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkoaSkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5Iik7aWYoaS5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYXQgbGVhc3QgMiBudW1iZXJzIGxvbmciKTtpZighanMoaVswXSl8fCFqcyhpWzFdKSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgY29udGFpbiBudW1iZXJzIik7cmV0dXJuIHNyKHt0eXBlOiJQb2ludCIsY29vcmRpbmF0ZXM6aX0sdCxlKX1mZSh6cCwicG9pbnQiKTtmdW5jdGlvbiBGRChpLHQsZT17fSl7cmV0dXJuIFl1KGkubWFwKG49PnpwKG4sdCkpLGUpfWZlKEZELCJwb2ludHMiKTtmdW5jdGlvbiBrcChpLHQsZT17fSl7Zm9yKGNvbnN0IHIgb2YgaSl7aWYoci5sZW5ndGg8NCl0aHJvdyBuZXcgRXJyb3IoIkVhY2ggTGluZWFyUmluZyBvZiBhIFBvbHlnb24gbXVzdCBoYXZlIDQgb3IgbW9yZSBQb3NpdGlvbnMuIik7aWYocltyLmxlbmd0aC0xXS5sZW5ndGghPT1yWzBdLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkZpcnN0IGFuZCBsYXN0IFBvc2l0aW9uIGFyZSBub3QgZXF1aXZhbGVudC4iKTtmb3IobGV0IHM9MDtzPHJbci5sZW5ndGgtMV0ubGVuZ3RoO3MrKylpZihyW3IubGVuZ3RoLTFdW3NdIT09clswXVtzXSl0aHJvdyBuZXcgRXJyb3IoIkZpcnN0IGFuZCBsYXN0IFBvc2l0aW9uIGFyZSBub3QgZXF1aXZhbGVudC4iKX1yZXR1cm4gc3Ioe3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOml9LHQsZSl9ZmUoa3AsInBvbHlnb24iKTtmdW5jdGlvbiBPRChpLHQsZT17fSl7cmV0dXJuIFl1KGkubWFwKG49PmtwKG4sdCkpLGUpfWZlKE9ELCJwb2x5Z29ucyIpO2Z1bmN0aW9uIEdwKGksdCxlPXt9KXtpZihpLmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBhcnJheSBvZiB0d28gb3IgbW9yZSBwb3NpdGlvbnMiKTtyZXR1cm4gc3Ioe3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOml9LHQsZSl9ZmUoR3AsImxpbmVTdHJpbmciKTtmdW5jdGlvbiBCRChpLHQsZT17fSl7cmV0dXJuIFl1KGkubWFwKG49PkdwKG4sdCkpLGUpfWZlKEJELCJsaW5lU3RyaW5ncyIpO2Z1bmN0aW9uIFl1KGksdD17fSl7Y29uc3QgZT17dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24ifTtyZXR1cm4gdC5pZCYmKGUuaWQ9dC5pZCksdC5iYm94JiYoZS5iYm94PXQuYmJveCksZS5mZWF0dXJlcz1pLGV9ZmUoWXUsImZlYXR1cmVDb2xsZWN0aW9uIik7ZnVuY3Rpb24geE0oaSx0LGU9e30pe3JldHVybiBzcih7dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczppfSx0LGUpfWZlKHhNLCJtdWx0aUxpbmVTdHJpbmciKTtmdW5jdGlvbiBNTShpLHQsZT17fSl7cmV0dXJuIHNyKHt0eXBlOiJNdWx0aVBvaW50Iixjb29yZGluYXRlczppfSx0LGUpfWZlKE1NLCJtdWx0aVBvaW50Iik7ZnVuY3Rpb24gU00oaSx0LGU9e30pe3JldHVybiBzcih7dHlwZToiTXVsdGlQb2x5Z29uIixjb29yZGluYXRlczppfSx0LGUpfWZlKFNNLCJtdWx0aVBvbHlnb24iKTtmdW5jdGlvbiB6RChpLHQsZT17fSl7cmV0dXJuIHNyKHt0eXBlOiJHZW9tZXRyeUNvbGxlY3Rpb24iLGdlb21ldHJpZXM6aX0sdCxlKX1mZSh6RCwiZ2VvbWV0cnlDb2xsZWN0aW9uIik7ZnVuY3Rpb24ga0QoaSx0PTApe2lmKHQmJiEodD49MCkpdGhyb3cgbmV3IEVycm9yKCJwcmVjaXNpb24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciIpO2NvbnN0IGU9TWF0aC5wb3coMTAsdHx8MCk7cmV0dXJuIE1hdGgucm91bmQoaSplKS9lfWZlKGtELCJyb3VuZCIpO2Z1bmN0aW9uIGJNKGksdD0ia2lsb21ldGVycyIpe2NvbnN0IGU9dk1bdF07aWYoIWUpdGhyb3cgbmV3IEVycm9yKHQrIiB1bml0cyBpcyBpbnZhbGlkIik7cmV0dXJuIGkqZX1mZShiTSwicmFkaWFuc1RvTGVuZ3RoIik7ZnVuY3Rpb24gVnAoaSx0PSJraWxvbWV0ZXJzIil7Y29uc3QgZT12TVt0XTtpZighZSl0aHJvdyBuZXcgRXJyb3IodCsiIHVuaXRzIGlzIGludmFsaWQiKTtyZXR1cm4gaS9lfWZlKFZwLCJsZW5ndGhUb1JhZGlhbnMiKTtmdW5jdGlvbiBHRChpLHQpe3JldHVybiB3TShWcChpLHQpKX1mZShHRCwibGVuZ3RoVG9EZWdyZWVzIik7ZnVuY3Rpb24gVkQoaSl7bGV0IHQ9aSUzNjA7cmV0dXJuIHQ8MCYmKHQrPTM2MCksdH1mZShWRCwiYmVhcmluZ1RvQXppbXV0aCIpO2Z1bmN0aW9uIHdNKGkpe3JldHVybiBpJSgyKk1hdGguUEkpKjE4MC9NYXRoLlBJfWZlKHdNLCJyYWRpYW5zVG9EZWdyZWVzIik7ZnVuY3Rpb24gSEQoaSl7cmV0dXJuIGklMzYwKk1hdGguUEkvMTgwfWZlKEhELCJkZWdyZWVzVG9SYWRpYW5zIik7ZnVuY3Rpb24gV0QoaSx0PSJraWxvbWV0ZXJzIixlPSJraWxvbWV0ZXJzIil7aWYoIShpPj0wKSl0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIGJNKFZwKGksdCksZSl9ZmUoV0QsImNvbnZlcnRMZW5ndGgiKTtmdW5jdGlvbiAkRChpLHQ9Im1ldGVycyIsZT0ia2lsb21ldGVycyIpe2lmKCEoaT49MCkpdGhyb3cgbmV3IEVycm9yKCJhcmVhIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTtjb25zdCBuPV9NW3RdO2lmKCFuKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBvcmlnaW5hbCB1bml0cyIpO2NvbnN0IHI9X01bZV07aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZpbmFsIHVuaXRzIik7cmV0dXJuIGkvbipyfWZlKCRELCJjb252ZXJ0QXJlYSIpO2Z1bmN0aW9uIGpzKGkpe3JldHVybiFpc05hTihpKSYmaSE9PW51bGwmJiFBcnJheS5pc0FycmF5KGkpfWZlKGpzLCJpc051bWJlciIpO2Z1bmN0aW9uIFhEKGkpe3JldHVybiBpIT09bnVsbCYmdHlwZW9mIGk9PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheShpKX1mZShYRCwiaXNPYmplY3QiKTtmdW5jdGlvbiBxRChpKXtpZighaSl0aHJvdyBuZXcgRXJyb3IoImJib3ggaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheShpKSl0aHJvdyBuZXcgRXJyb3IoImJib3ggbXVzdCBiZSBhbiBBcnJheSIpO2lmKGkubGVuZ3RoIT09NCYmaS5sZW5ndGghPT02KXRocm93IG5ldyBFcnJvcigiYmJveCBtdXN0IGJlIGFuIEFycmF5IG9mIDQgb3IgNiBudW1iZXJzIik7aS5mb3JFYWNoKHQ9PntpZighanModCkpdGhyb3cgbmV3IEVycm9yKCJiYm94IG11c3Qgb25seSBjb250YWluIG51bWJlcnMiKX0pfWZlKHFELCJ2YWxpZGF0ZUJCb3giKTtmdW5jdGlvbiBZRChpKXtpZighaSl0aHJvdyBuZXcgRXJyb3IoImlkIGlzIHJlcXVpcmVkIik7aWYoWyJzdHJpbmciLCJudW1iZXIiXS5pbmRleE9mKHR5cGVvZiBpKT09PS0xKXRocm93IG5ldyBFcnJvcigiaWQgbXVzdCBiZSBhIG51bWJlciBvciBhIHN0cmluZyIpfWZlKFlELCJ2YWxpZGF0ZUlkIik7dmFyIFpEPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxvcj0oaSx0KT0+WkQoaSwibmFtZSIse3ZhbHVlOnQsY29uZmlndXJhYmxlOiEwfSk7ZnVuY3Rpb24gQU0oaSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJjb29yZCBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KGkpKXtpZihpLnR5cGU9PT0iRmVhdHVyZSImJmkuZ2VvbWV0cnkhPT1udWxsJiZpLmdlb21ldHJ5LnR5cGU9PT0iUG9pbnQiKXJldHVyblsuLi5pLmdlb21ldHJ5LmNvb3JkaW5hdGVzXTtpZihpLnR5cGU9PT0iUG9pbnQiKXJldHVyblsuLi5pLmNvb3JkaW5hdGVzXX1pZihBcnJheS5pc0FycmF5KGkpJiZpLmxlbmd0aD49MiYmIUFycmF5LmlzQXJyYXkoaVswXSkmJiFBcnJheS5pc0FycmF5KGlbMV0pKXJldHVyblsuLi5pXTt0aHJvdyBuZXcgRXJyb3IoImNvb3JkIG11c3QgYmUgR2VvSlNPTiBQb2ludCBvciBhbiBBcnJheSBvZiBudW1iZXJzIil9b3IoQU0sImdldENvb3JkIik7ZnVuY3Rpb24gRU0oaSl7aWYoQXJyYXkuaXNBcnJheShpKSlyZXR1cm4gaTtpZihpLnR5cGU9PT0iRmVhdHVyZSIpe2lmKGkuZ2VvbWV0cnkhPT1udWxsKXJldHVybiBpLmdlb21ldHJ5LmNvb3JkaW5hdGVzfWVsc2UgaWYoaS5jb29yZGluYXRlcylyZXR1cm4gaS5jb29yZGluYXRlczt0aHJvdyBuZXcgRXJyb3IoImNvb3JkcyBtdXN0IGJlIEdlb0pTT04gRmVhdHVyZSwgR2VvbWV0cnkgT2JqZWN0IG9yIGFuIEFycmF5Iil9b3IoRU0sImdldENvb3JkcyIpO2Z1bmN0aW9uIFRNKGkpe2lmKGkubGVuZ3RoPjEmJmpzKGlbMF0pJiZqcyhpWzFdKSlyZXR1cm4hMDtpZihBcnJheS5pc0FycmF5KGlbMF0pJiZpWzBdLmxlbmd0aClyZXR1cm4gVE0oaVswXSk7dGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IG9ubHkgY29udGFpbiBudW1iZXJzIil9b3IoVE0sImNvbnRhaW5zTnVtYmVyIik7ZnVuY3Rpb24gSkQoaSx0LGUpe2lmKCF0fHwhZSl0aHJvdyBuZXcgRXJyb3IoInR5cGUgYW5kIG5hbWUgcmVxdWlyZWQiKTtpZighaXx8aS50eXBlIT09dCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIitlKyI6IG11c3QgYmUgYSAiK3QrIiwgZ2l2ZW4gIitpLnR5cGUpfW9yKEpELCJnZW9qc29uVHlwZSIpO2Z1bmN0aW9uIEtEKGksdCxlKXtpZighaSl0aHJvdyBuZXcgRXJyb3IoIk5vIGZlYXR1cmUgcGFzc2VkIik7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCIuZmVhdHVyZU9mKCkgcmVxdWlyZXMgYSBuYW1lIik7aWYoIWl8fGkudHlwZSE9PSJGZWF0dXJlInx8IWkuZ2VvbWV0cnkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrZSsiLCBGZWF0dXJlIHdpdGggZ2VvbWV0cnkgcmVxdWlyZWQiKTtpZighaS5nZW9tZXRyeXx8aS5nZW9tZXRyeS50eXBlIT09dCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIitlKyI6IG11c3QgYmUgYSAiK3QrIiwgZ2l2ZW4gIitpLmdlb21ldHJ5LnR5cGUpfW9yKEtELCJmZWF0dXJlT2YiKTtmdW5jdGlvbiBqRChpLHQsZSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJObyBmZWF0dXJlQ29sbGVjdGlvbiBwYXNzZWQiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIi5jb2xsZWN0aW9uT2YoKSByZXF1aXJlcyBhIG5hbWUiKTtpZighaXx8aS50eXBlIT09IkZlYXR1cmVDb2xsZWN0aW9uIil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIitlKyIsIEZlYXR1cmVDb2xsZWN0aW9uIHJlcXVpcmVkIik7Zm9yKGNvbnN0IG4gb2YgaS5mZWF0dXJlcyl7aWYoIW58fG4udHlwZSE9PSJGZWF0dXJlInx8IW4uZ2VvbWV0cnkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrZSsiLCBGZWF0dXJlIHdpdGggZ2VvbWV0cnkgcmVxdWlyZWQiKTtpZighbi5nZW9tZXRyeXx8bi5nZW9tZXRyeS50eXBlIT09dCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIitlKyI6IG11c3QgYmUgYSAiK3QrIiwgZ2l2ZW4gIituLmdlb21ldHJ5LnR5cGUpfX1vcihqRCwiY29sbGVjdGlvbk9mIik7ZnVuY3Rpb24gQ00oaSl7cmV0dXJuIGkudHlwZT09PSJGZWF0dXJlIj9pLmdlb21ldHJ5Oml9b3IoQ00sImdldEdlb20iKTtmdW5jdGlvbiBRRChpLHQpe3JldHVybiBpLnR5cGU9PT0iRmVhdHVyZUNvbGxlY3Rpb24iPyJGZWF0dXJlQ29sbGVjdGlvbiI6aS50eXBlPT09Ikdlb21ldHJ5Q29sbGVjdGlvbiI/Ikdlb21ldHJ5Q29sbGVjdGlvbiI6aS50eXBlPT09IkZlYXR1cmUiJiZpLmdlb21ldHJ5IT09bnVsbD9pLmdlb21ldHJ5LnR5cGU6aS50eXBlfW9yKFFELCJnZXRUeXBlIik7dmFyIHRVPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxlVT0oaSx0KT0+dFUoaSwibmFtZSIse3ZhbHVlOnQsY29uZmlndXJhYmxlOiEwfSk7ZnVuY3Rpb24gUk0oaSl7Y29uc3QgdD1FTShpKTtsZXQgZT0wLG49MSxyLHM7Zm9yKDtuPHQubGVuZ3RoOylyPXN8fHRbMF0scz10W25dLGUrPShzWzBdLXJbMF0pKihzWzFdK3JbMV0pLG4rKztyZXR1cm4gZT4wfWVVKFJNLCJib29sZWFuQ2xvY2t3aXNlIik7dmFyIG5VPVJNO2NvbnN0IE5pPTExMTAyMjMwMjQ2MjUxNTY1ZS0zMixKZT0xMzQyMTc3MjksaVU9KDMrOCpOaSkqTmk7ZnVuY3Rpb24gSHAoaSx0LGUsbixyKXtsZXQgcyxvLGEsbCxjPXRbMF0sdT1uWzBdLGg9MCxmPTA7dT5jPT11Pi1jPyhzPWMsYz10WysraF0pOihzPXUsdT1uWysrZl0pO2xldCBkPTA7aWYoaDxpJiZmPGUpZm9yKHU+Yz09dT4tYz8obz1jK3MsYT1zLShvLWMpLGM9dFsrK2hdKToobz11K3MsYT1zLShvLXUpLHU9blsrK2ZdKSxzPW8sYSE9PTAmJihyW2QrK109YSk7aDxpJiZmPGU7KXU+Yz09dT4tYz8obz1zK2MsbD1vLXMsYT1zLShvLWwpKyhjLWwpLGM9dFsrK2hdKToobz1zK3UsbD1vLXMsYT1zLShvLWwpKyh1LWwpLHU9blsrK2ZdKSxzPW8sYSE9PTAmJihyW2QrK109YSk7Zm9yKDtoPGk7KW89cytjLGw9by1zLGE9cy0oby1sKSsoYy1sKSxjPXRbKytoXSxzPW8sYSE9PTAmJihyW2QrK109YSk7Zm9yKDtmPGU7KW89cyt1LGw9by1zLGE9cy0oby1sKSsodS1sKSx1PW5bKytmXSxzPW8sYSE9PTAmJihyW2QrK109YSk7cmV0dXJuKHMhPT0wfHxkPT09MCkmJihyW2QrK109cyksZH1mdW5jdGlvbiByVShpLHQpe2xldCBlPXRbMF07Zm9yKGxldCBuPTE7bjxpO24rKyllKz10W25dO3JldHVybiBlfWZ1bmN0aW9uIFJhKGkpe3JldHVybiBuZXcgRmxvYXQ2NEFycmF5KGkpfWNvbnN0IHNVPSgzKzE2Kk5pKSpOaSxvVT0oMisxMipOaSkqTmksYVU9KDkrNjQqTmkpKk5pKk5pLFFzPVJhKDQpLFBNPVJhKDgpLElNPVJhKDEyKSxMTT1SYSgxNiksYW49UmEoNCk7ZnVuY3Rpb24gbFUoaSx0LGUsbixyLHMsbyl7bGV0IGEsbCxjLHUsaCxmLGQscCx5LG0sZyx4LHYsXyxFLGIsVCxQO2NvbnN0IHc9aS1yLE09ZS1yLEE9dC1zLEY9bi1zO189dypGLGY9SmUqdyxkPWYtKGYtdykscD13LWQsZj1KZSpGLHk9Zi0oZi1GKSxtPUYteSxFPXAqbS0oXy1kKnktcCp5LWQqbSksYj1BKk0sZj1KZSpBLGQ9Zi0oZi1BKSxwPUEtZCxmPUplKk0seT1mLShmLU0pLG09TS15LFQ9cCptLShiLWQqeS1wKnktZCptKSxnPUUtVCxoPUUtZyxRc1swXT1FLShnK2gpKyhoLVQpLHg9XytnLGg9eC1fLHY9Xy0oeC1oKSsoZy1oKSxnPXYtYixoPXYtZyxRc1sxXT12LShnK2gpKyhoLWIpLFA9eCtnLGg9UC14LFFzWzJdPXgtKFAtaCkrKGctaCksUXNbM109UDtsZXQgRD1yVSg0LFFzKSxOPW9VKm87aWYoRD49Tnx8LUQ+PU58fChoPWktdyxhPWktKHcraCkrKGgtciksaD1lLU0sYz1lLShNK2gpKyhoLXIpLGg9dC1BLGw9dC0oQStoKSsoaC1zKSxoPW4tRix1PW4tKEYraCkrKGgtcyksYT09PTAmJmw9PT0wJiZjPT09MCYmdT09PTApfHwoTj1hVSpvK2lVKk1hdGguYWJzKEQpLEQrPXcqdStGKmEtKEEqYytNKmwpLEQ+PU58fC1EPj1OKSlyZXR1cm4gRDtfPWEqRixmPUplKmEsZD1mLShmLWEpLHA9YS1kLGY9SmUqRix5PWYtKGYtRiksbT1GLXksRT1wKm0tKF8tZCp5LXAqeS1kKm0pLGI9bCpNLGY9SmUqbCxkPWYtKGYtbCkscD1sLWQsZj1KZSpNLHk9Zi0oZi1NKSxtPU0teSxUPXAqbS0oYi1kKnktcCp5LWQqbSksZz1FLVQsaD1FLWcsYW5bMF09RS0oZytoKSsoaC1UKSx4PV8rZyxoPXgtXyx2PV8tKHgtaCkrKGctaCksZz12LWIsaD12LWcsYW5bMV09di0oZytoKSsoaC1iKSxQPXgrZyxoPVAteCxhblsyXT14LShQLWgpKyhnLWgpLGFuWzNdPVA7Y29uc3QgVT1IcCg0LFFzLDQsYW4sUE0pO189dyp1LGY9SmUqdyxkPWYtKGYtdykscD13LWQsZj1KZSp1LHk9Zi0oZi11KSxtPXUteSxFPXAqbS0oXy1kKnktcCp5LWQqbSksYj1BKmMsZj1KZSpBLGQ9Zi0oZi1BKSxwPUEtZCxmPUplKmMseT1mLShmLWMpLG09Yy15LFQ9cCptLShiLWQqeS1wKnktZCptKSxnPUUtVCxoPUUtZyxhblswXT1FLShnK2gpKyhoLVQpLHg9XytnLGg9eC1fLHY9Xy0oeC1oKSsoZy1oKSxnPXYtYixoPXYtZyxhblsxXT12LShnK2gpKyhoLWIpLFA9eCtnLGg9UC14LGFuWzJdPXgtKFAtaCkrKGctaCksYW5bM109UDtjb25zdCBCPUhwKFUsUE0sNCxhbixJTSk7Xz1hKnUsZj1KZSphLGQ9Zi0oZi1hKSxwPWEtZCxmPUplKnUseT1mLShmLXUpLG09dS15LEU9cCptLShfLWQqeS1wKnktZCptKSxiPWwqYyxmPUplKmwsZD1mLShmLWwpLHA9bC1kLGY9SmUqYyx5PWYtKGYtYyksbT1jLXksVD1wKm0tKGItZCp5LXAqeS1kKm0pLGc9RS1ULGg9RS1nLGFuWzBdPUUtKGcraCkrKGgtVCkseD1fK2csaD14LV8sdj1fLSh4LWgpKyhnLWgpLGc9di1iLGg9di1nLGFuWzFdPXYtKGcraCkrKGgtYiksUD14K2csaD1QLXgsYW5bMl09eC0oUC1oKSsoZy1oKSxhblszXT1QO2NvbnN0IEg9SHAoQixJTSw0LGFuLExNKTtyZXR1cm4gTE1bSC0xXX1mdW5jdGlvbiBadShpLHQsZSxuLHIscyl7Y29uc3Qgbz0odC1zKSooZS1yKSxhPShpLXIpKihuLXMpLGw9by1hO2lmKG89PT0wfHxhPT09MHx8bz4wIT1hPjApcmV0dXJuIGw7Y29uc3QgYz1NYXRoLmFicyhvK2EpO3JldHVybiBNYXRoLmFicyhsKT49c1UqYz9sOi1sVShpLHQsZSxuLHIscyxjKX1jb25zdCBETT1NYXRoLnBvdygyLC01MiksSnU9bmV3IFVpbnQzMkFycmF5KDUxMik7Y2xhc3MgUGF7c3RhdGljIGZyb20odCxlPWRVLG49cFUpe2NvbnN0IHI9dC5sZW5ndGgscz1uZXcgRmxvYXQ2NEFycmF5KHIqMik7Zm9yKGxldCBvPTA7bzxyO28rKyl7Y29uc3QgYT10W29dO3NbMipvXT1lKGEpLHNbMipvKzFdPW4oYSl9cmV0dXJuIG5ldyBQYShzKX1jb25zdHJ1Y3Rvcih0KXtjb25zdCBlPXQubGVuZ3RoPj4xO2lmKGU+MCYmdHlwZW9mIHRbMF0hPSJudW1iZXIiKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgY29vcmRzIHRvIGNvbnRhaW4gbnVtYmVycy4iKTt0aGlzLmNvb3Jkcz10O2NvbnN0IG49TWF0aC5tYXgoMiplLTUsMCk7dGhpcy5fdHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheShuKjMpLHRoaXMuX2hhbGZlZGdlcz1uZXcgSW50MzJBcnJheShuKjMpLHRoaXMuX2hhc2hTaXplPU1hdGguY2VpbChNYXRoLnNxcnQoZSkpLHRoaXMuX2h1bGxQcmV2PW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9odWxsTmV4dD1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbFRyaT1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbEhhc2g9bmV3IEludDMyQXJyYXkodGhpcy5faGFzaFNpemUpLmZpbGwoLTEpLHRoaXMuX2lkcz1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5fZGlzdHM9bmV3IEZsb2F0NjRBcnJheShlKSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSgpe2NvbnN0e2Nvb3Jkczp0LF9odWxsUHJldjplLF9odWxsTmV4dDpuLF9odWxsVHJpOnIsX2h1bGxIYXNoOnN9PXRoaXMsbz10Lmxlbmd0aD4+MTtsZXQgYT0xLzAsbD0xLzAsYz0tMS8wLHU9LTEvMDtmb3IobGV0IE09MDtNPG87TSsrKXtjb25zdCBBPXRbMipNXSxGPXRbMipNKzFdO0E8YSYmKGE9QSksRjxsJiYobD1GKSxBPmMmJihjPUEpLEY+dSYmKHU9RiksdGhpcy5faWRzW01dPU19Y29uc3QgaD0oYStjKS8yLGY9KGwrdSkvMjtsZXQgZD0xLzAscCx5LG07Zm9yKGxldCBNPTA7TTxvO00rKyl7Y29uc3QgQT1XcChoLGYsdFsyKk1dLHRbMipNKzFdKTtBPGQmJihwPU0sZD1BKX1jb25zdCBnPXRbMipwXSx4PXRbMipwKzFdO2Q9MS8wO2ZvcihsZXQgTT0wO008bztNKyspe2lmKE09PT1wKWNvbnRpbnVlO2NvbnN0IEE9V3AoZyx4LHRbMipNXSx0WzIqTSsxXSk7QTxkJiZBPjAmJih5PU0sZD1BKX1sZXQgdj10WzIqeV0sXz10WzIqeSsxXSxFPTEvMDtmb3IobGV0IE09MDtNPG87TSsrKXtpZihNPT09cHx8TT09PXkpY29udGludWU7Y29uc3QgQT1oVShnLHgsdixfLHRbMipNXSx0WzIqTSsxXSk7QTxFJiYobT1NLEU9QSl9bGV0IGI9dFsyKm1dLFQ9dFsyKm0rMV07aWYoRT09PTEvMCl7Zm9yKGxldCBGPTA7RjxvO0YrKyl0aGlzLl9kaXN0c1tGXT10WzIqRl0tdFswXXx8dFsyKkYrMV0tdFsxXTt0byh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpO2NvbnN0IE09bmV3IFVpbnQzMkFycmF5KG8pO2xldCBBPTA7Zm9yKGxldCBGPTAsRD0tMS8wO0Y8bztGKyspe2NvbnN0IE49dGhpcy5faWRzW0ZdO3RoaXMuX2Rpc3RzW05dPkQmJihNW0ErK109TixEPXRoaXMuX2Rpc3RzW05dKX10aGlzLmh1bGw9TS5zdWJhcnJheSgwLEEpLHRoaXMudHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheSgwKSx0aGlzLmhhbGZlZGdlcz1uZXcgVWludDMyQXJyYXkoMCk7cmV0dXJufWlmKFp1KGcseCx2LF8sYixUKTwwKXtjb25zdCBNPXksQT12LEY9Xzt5PW0sdj1iLF89VCxtPU0sYj1BLFQ9Rn1jb25zdCBQPWZVKGcseCx2LF8sYixUKTt0aGlzLl9jeD1QLngsdGhpcy5fY3k9UC55O2ZvcihsZXQgTT0wO008bztNKyspdGhpcy5fZGlzdHNbTV09V3AodFsyKk1dLHRbMipNKzFdLFAueCxQLnkpO3RvKHRoaXMuX2lkcyx0aGlzLl9kaXN0cywwLG8tMSksdGhpcy5faHVsbFN0YXJ0PXA7bGV0IHc9MztuW3BdPWVbbV09eSxuW3ldPWVbcF09bSxuW21dPWVbeV09cCxyW3BdPTAsclt5XT0xLHJbbV09MixzLmZpbGwoLTEpLHNbdGhpcy5faGFzaEtleShnLHgpXT1wLHNbdGhpcy5faGFzaEtleSh2LF8pXT15LHNbdGhpcy5faGFzaEtleShiLFQpXT1tLHRoaXMudHJpYW5nbGVzTGVuPTAsdGhpcy5fYWRkVHJpYW5nbGUocCx5LG0sLTEsLTEsLTEpO2ZvcihsZXQgTT0wLEEsRjtNPHRoaXMuX2lkcy5sZW5ndGg7TSsrKXtjb25zdCBEPXRoaXMuX2lkc1tNXSxOPXRbMipEXSxVPXRbMipEKzFdO2lmKE0+MCYmTWF0aC5hYnMoTi1BKTw9RE0mJk1hdGguYWJzKFUtRik8PURNfHwoQT1OLEY9VSxEPT09cHx8RD09PXl8fEQ9PT1tKSljb250aW51ZTtsZXQgQj0wO2ZvcihsZXQgaHQ9MCxSdD10aGlzLl9oYXNoS2V5KE4sVSk7aHQ8dGhpcy5faGFzaFNpemUmJihCPXNbKFJ0K2h0KSV0aGlzLl9oYXNoU2l6ZV0sIShCIT09LTEmJkIhPT1uW0JdKSk7aHQrKyk7Qj1lW0JdO2xldCBIPUIsRztmb3IoO0c9bltIXSxadShOLFUsdFsyKkhdLHRbMipIKzFdLHRbMipHXSx0WzIqRysxXSk+PTA7KWlmKEg9RyxIPT09Qil7SD0tMTticmVha31pZihIPT09LTEpY29udGludWU7bGV0IHR0PXRoaXMuX2FkZFRyaWFuZ2xlKEgsRCxuW0hdLC0xLC0xLHJbSF0pO3JbRF09dGhpcy5fbGVnYWxpemUodHQrMikscltIXT10dCx3Kys7bGV0IGx0PW5bSF07Zm9yKDtHPW5bbHRdLFp1KE4sVSx0WzIqbHRdLHRbMipsdCsxXSx0WzIqR10sdFsyKkcrMV0pPDA7KXR0PXRoaXMuX2FkZFRyaWFuZ2xlKGx0LEQsRyxyW0RdLC0xLHJbbHRdKSxyW0RdPXRoaXMuX2xlZ2FsaXplKHR0KzIpLG5bbHRdPWx0LHctLSxsdD1HO2lmKEg9PT1CKWZvcig7Rz1lW0hdLFp1KE4sVSx0WzIqR10sdFsyKkcrMV0sdFsyKkhdLHRbMipIKzFdKTwwOyl0dD10aGlzLl9hZGRUcmlhbmdsZShHLEQsSCwtMSxyW0hdLHJbR10pLHRoaXMuX2xlZ2FsaXplKHR0KzIpLHJbR109dHQsbltIXT1ILHctLSxIPUc7dGhpcy5faHVsbFN0YXJ0PWVbRF09SCxuW0hdPWVbbHRdPUQsbltEXT1sdCxzW3RoaXMuX2hhc2hLZXkoTixVKV09RCxzW3RoaXMuX2hhc2hLZXkodFsyKkhdLHRbMipIKzFdKV09SH10aGlzLmh1bGw9bmV3IFVpbnQzMkFycmF5KHcpO2ZvcihsZXQgTT0wLEE9dGhpcy5faHVsbFN0YXJ0O008dztNKyspdGhpcy5odWxsW01dPUEsQT1uW0FdO3RoaXMudHJpYW5nbGVzPXRoaXMuX3RyaWFuZ2xlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKSx0aGlzLmhhbGZlZGdlcz10aGlzLl9oYWxmZWRnZXMuc3ViYXJyYXkoMCx0aGlzLnRyaWFuZ2xlc0xlbil9X2hhc2hLZXkodCxlKXtyZXR1cm4gTWF0aC5mbG9vcihjVSh0LXRoaXMuX2N4LGUtdGhpcy5fY3kpKnRoaXMuX2hhc2hTaXplKSV0aGlzLl9oYXNoU2l6ZX1fbGVnYWxpemUodCl7Y29uc3R7X3RyaWFuZ2xlczplLF9oYWxmZWRnZXM6bixjb29yZHM6cn09dGhpcztsZXQgcz0wLG89MDtmb3IoOzspe2NvbnN0IGE9blt0XSxsPXQtdCUzO2lmKG89bCsodCsyKSUzLGE9PT0tMSl7aWYocz09PTApYnJlYWs7dD1KdVstLXNdO2NvbnRpbnVlfWNvbnN0IGM9YS1hJTMsdT1sKyh0KzEpJTMsaD1jKyhhKzIpJTMsZj1lW29dLGQ9ZVt0XSxwPWVbdV0seT1lW2hdO2lmKHVVKHJbMipmXSxyWzIqZisxXSxyWzIqZF0sclsyKmQrMV0sclsyKnBdLHJbMipwKzFdLHJbMip5XSxyWzIqeSsxXSkpe2VbdF09eSxlW2FdPWY7Y29uc3QgZz1uW2hdO2lmKGc9PT0tMSl7bGV0IHY9dGhpcy5faHVsbFN0YXJ0O2Rve2lmKHRoaXMuX2h1bGxUcmlbdl09PT1oKXt0aGlzLl9odWxsVHJpW3ZdPXQ7YnJlYWt9dj10aGlzLl9odWxsUHJldlt2XX13aGlsZSh2IT09dGhpcy5faHVsbFN0YXJ0KX10aGlzLl9saW5rKHQsZyksdGhpcy5fbGluayhhLG5bb10pLHRoaXMuX2xpbmsobyxoKTtjb25zdCB4PWMrKGErMSklMztzPEp1Lmxlbmd0aCYmKEp1W3MrK109eCl9ZWxzZXtpZihzPT09MClicmVhazt0PUp1Wy0tc119fXJldHVybiBvfV9saW5rKHQsZSl7dGhpcy5faGFsZmVkZ2VzW3RdPWUsZSE9PS0xJiYodGhpcy5faGFsZmVkZ2VzW2VdPXQpfV9hZGRUcmlhbmdsZSh0LGUsbixyLHMsbyl7Y29uc3QgYT10aGlzLnRyaWFuZ2xlc0xlbjtyZXR1cm4gdGhpcy5fdHJpYW5nbGVzW2FdPXQsdGhpcy5fdHJpYW5nbGVzW2ErMV09ZSx0aGlzLl90cmlhbmdsZXNbYSsyXT1uLHRoaXMuX2xpbmsoYSxyKSx0aGlzLl9saW5rKGErMSxzKSx0aGlzLl9saW5rKGErMixvKSx0aGlzLnRyaWFuZ2xlc0xlbis9MyxhfX1mdW5jdGlvbiBjVShpLHQpe2NvbnN0IGU9aS8oTWF0aC5hYnMoaSkrTWF0aC5hYnModCkpO3JldHVybih0PjA/My1lOjErZSkvNH1mdW5jdGlvbiBXcChpLHQsZSxuKXtjb25zdCByPWktZSxzPXQtbjtyZXR1cm4gcipyK3Mqc31mdW5jdGlvbiB1VShpLHQsZSxuLHIscyxvLGEpe2NvbnN0IGw9aS1vLGM9dC1hLHU9ZS1vLGg9bi1hLGY9ci1vLGQ9cy1hLHA9bCpsK2MqYyx5PXUqdStoKmgsbT1mKmYrZCpkO3JldHVybiBsKihoKm0teSpkKS1jKih1Km0teSpmKStwKih1KmQtaCpmKTwwfWZ1bmN0aW9uIGhVKGksdCxlLG4scixzKXtjb25zdCBvPWUtaSxhPW4tdCxsPXItaSxjPXMtdCx1PW8qbythKmEsaD1sKmwrYypjLGY9LjUvKG8qYy1hKmwpLGQ9KGMqdS1hKmgpKmYscD0obypoLWwqdSkqZjtyZXR1cm4gZCpkK3AqcH1mdW5jdGlvbiBmVShpLHQsZSxuLHIscyl7Y29uc3Qgbz1lLWksYT1uLXQsbD1yLWksYz1zLXQsdT1vKm8rYSphLGg9bCpsK2MqYyxmPS41LyhvKmMtYSpsKSxkPWkrKGMqdS1hKmgpKmYscD10KyhvKmgtbCp1KSpmO3JldHVybnt4OmQseTpwfX1mdW5jdGlvbiB0byhpLHQsZSxuKXtpZihuLWU8PTIwKWZvcihsZXQgcj1lKzE7cjw9bjtyKyspe2NvbnN0IHM9aVtyXSxvPXRbc107bGV0IGE9ci0xO2Zvcig7YT49ZSYmdFtpW2FdXT5vOylpW2ErMV09aVthLS1dO2lbYSsxXT1zfWVsc2V7Y29uc3Qgcj1lK24+PjE7bGV0IHM9ZSsxLG89bjtJYShpLHIscyksdFtpW2VdXT50W2lbbl1dJiZJYShpLGUsbiksdFtpW3NdXT50W2lbbl1dJiZJYShpLHMsbiksdFtpW2VdXT50W2lbc11dJiZJYShpLGUscyk7Y29uc3QgYT1pW3NdLGw9dFthXTtmb3IoOzspe2RvIHMrKzt3aGlsZSh0W2lbc11dPGwpO2RvIG8tLTt3aGlsZSh0W2lbb11dPmwpO2lmKG88cylicmVhaztJYShpLHMsbyl9aVtlKzFdPWlbb10saVtvXT1hLG4tcysxPj1vLWU/KHRvKGksdCxzLG4pLHRvKGksdCxlLG8tMSkpOih0byhpLHQsZSxvLTEpLHRvKGksdCxzLG4pKX19ZnVuY3Rpb24gSWEoaSx0LGUpe2NvbnN0IG49aVt0XTtpW3RdPWlbZV0saVtlXT1ufWZ1bmN0aW9uIGRVKGkpe3JldHVybiBpWzBdfWZ1bmN0aW9uIHBVKGkpe3JldHVybiBpWzFdfWZ1bmN0aW9uIG1VKGksdCl7dmFyIGU9MCxuPTAscj0wLHM9MCxvPTAsYT0wLGw9MCxjPTAsdT1udWxsLGg9bnVsbCxmPWlbMF0sZD1pWzFdLHA9dC5sZW5ndGg7Zm9yKGU7ZTxwO2UrKyl7bj0wO3ZhciB5PXRbZV0ubGVuZ3RoLTEsbT10W2VdO2lmKHU9bVswXSx1WzBdIT09bVt5XVswXSYmdVsxXSE9PW1beV1bMV0pdGhyb3cgbmV3IEVycm9yKCJGaXJzdCBhbmQgbGFzdCBjb29yZGluYXRlcyBpbiBhIHJpbmcgbXVzdCBiZSB0aGUgc2FtZSIpO2ZvcihvPXVbMF0tZixhPXVbMV0tZCxuO248eTtuKyspe2lmKGg9bVtuKzFdLGM9aFsxXS1kLGE8MCYmYzwwfHxhPjAmJmM+MCl7dT1oLGE9YyxvPXVbMF0tZjtjb250aW51ZX1pZihsPWhbMF0taVswXSxjPjAmJmE8PTApe2lmKHM9bypjLWwqYSxzPjApcj1yKzE7ZWxzZSBpZihzPT09MClyZXR1cm4gMH1lbHNlIGlmKGE+MCYmYzw9MCl7aWYocz1vKmMtbCphLHM8MClyPXIrMTtlbHNlIGlmKHM9PT0wKXJldHVybiAwfWVsc2UgaWYoYz09PTAmJmE8MCl7aWYocz1vKmMtbCphLHM9PT0wKXJldHVybiAwfWVsc2UgaWYoYT09PTAmJmM8MCl7aWYocz1vKmMtbCphLHM9PT0wKXJldHVybiAwfWVsc2UgaWYoYT09PTAmJmM9PT0wKXtpZihsPD0wJiZvPj0wKXJldHVybiAwO2lmKG88PTAmJmw+PTApcmV0dXJuIDB9dT1oLGE9YyxvPWx9fXJldHVybiByJTIhPT0wfXZhciBnVT1PYmplY3QuZGVmaW5lUHJvcGVydHksVU09KGksdCk9PmdVKGksIm5hbWUiLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pO2Z1bmN0aW9uIE5NKGksdCxlPXt9KXtpZighaSl0aHJvdyBuZXcgRXJyb3IoInBvaW50IGlzIHJlcXVpcmVkIik7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJwb2x5Z29uIGlzIHJlcXVpcmVkIik7Y29uc3Qgbj1BTShpKSxyPUNNKHQpLHM9ci50eXBlLG89dC5iYm94O2xldCBhPXIuY29vcmRpbmF0ZXM7aWYobyYmRk0obixvKT09PSExKXJldHVybiExO3M9PT0iUG9seWdvbiImJihhPVthXSk7bGV0IGw9ITE7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDsrK2Mpe2NvbnN0IHU9bVUobixhW2NdKTtpZih1PT09MClyZXR1cm4hZS5pZ25vcmVCb3VuZGFyeTt1JiYobD0hMCl9cmV0dXJuIGx9VU0oTk0sImJvb2xlYW5Qb2ludEluUG9seWdvbiIpO2Z1bmN0aW9uIEZNKGksdCl7cmV0dXJuIHRbMF08PWlbMF0mJnRbMV08PWlbMV0mJnRbMl0+PWlbMF0mJnRbM10+PWlbMV19VU0oRk0sImluQkJveCIpO3ZhciB5VT1OTTtjb25zdCBPTT0xZS02O2NsYXNzIFhye2NvbnN0cnVjdG9yKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9bW92ZVRvKHQsZSl7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K2V9YH1jbG9zZVBhdGgoKXt0aGlzLl94MSE9PW51bGwmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9bGluZVRvKHQsZSl7dGhpcy5fKz1gTCR7dGhpcy5feDE9K3R9LCR7dGhpcy5feTE9K2V9YH1hcmModCxlLG4pe3Q9K3QsZT0rZSxuPStuO2NvbnN0IHI9dCtuLHM9ZTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXMiKTt0aGlzLl94MT09PW51bGw/dGhpcy5fKz1gTSR7cn0sJHtzfWA6KE1hdGguYWJzKHRoaXMuX3gxLXIpPk9NfHxNYXRoLmFicyh0aGlzLl95MS1zKT5PTSkmJih0aGlzLl8rPSJMIityKyIsIitzKSxuJiYodGhpcy5fKz1gQSR7bn0sJHtufSwwLDEsMSwke3Qtbn0sJHtlfUEke259LCR7bn0sMCwxLDEsJHt0aGlzLl94MT1yfSwke3RoaXMuX3kxPXN9YCl9cmVjdCh0LGUsbixyKXt0aGlzLl8rPWBNJHt0aGlzLl94MD10aGlzLl94MT0rdH0sJHt0aGlzLl95MD10aGlzLl95MT0rZX1oJHsrbn12JHsrcn1oJHstbn1aYH12YWx1ZSgpe3JldHVybiB0aGlzLl98fG51bGx9fWNsYXNzICRwe2NvbnN0cnVjdG9yKCl7dGhpcy5fPVtdfW1vdmVUbyh0LGUpe3RoaXMuXy5wdXNoKFt0LGVdKX1jbG9zZVBhdGgoKXt0aGlzLl8ucHVzaCh0aGlzLl9bMF0uc2xpY2UoKSl9bGluZVRvKHQsZSl7dGhpcy5fLnB1c2goW3QsZV0pfXZhbHVlKCl7cmV0dXJuIHRoaXMuXy5sZW5ndGg/dGhpcy5fOm51bGx9fWNsYXNzIHZVe2NvbnN0cnVjdG9yKHQsW2UsbixyLHNdPVswLDAsOTYwLDUwMF0pe2lmKCEoKHI9K3IpPj0oZT0rZSkpfHwhKChzPStzKT49KG49K24pKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYm91bmRzIik7dGhpcy5kZWxhdW5heT10LHRoaXMuX2NpcmN1bWNlbnRlcnM9bmV3IEZsb2F0NjRBcnJheSh0LnBvaW50cy5sZW5ndGgqMiksdGhpcy52ZWN0b3JzPW5ldyBGbG9hdDY0QXJyYXkodC5wb2ludHMubGVuZ3RoKjIpLHRoaXMueG1heD1yLHRoaXMueG1pbj1lLHRoaXMueW1heD1zLHRoaXMueW1pbj1uLHRoaXMuX2luaXQoKX11cGRhdGUoKXtyZXR1cm4gdGhpcy5kZWxhdW5heS51cGRhdGUoKSx0aGlzLl9pbml0KCksdGhpc31faW5pdCgpe2NvbnN0e2RlbGF1bmF5Ontwb2ludHM6dCxodWxsOmUsdHJpYW5nbGVzOm59LHZlY3RvcnM6cn09dGhpcyxzPXRoaXMuY2lyY3VtY2VudGVycz10aGlzLl9jaXJjdW1jZW50ZXJzLnN1YmFycmF5KDAsbi5sZW5ndGgvMyoyKTtmb3IobGV0IGQ9MCxwPTAseT1uLmxlbmd0aCxtLGc7ZDx5O2QrPTMscCs9Mil7Y29uc3QgeD1uW2RdKjIsdj1uW2QrMV0qMixfPW5bZCsyXSoyLEU9dFt4XSxiPXRbeCsxXSxUPXRbdl0sUD10W3YrMV0sdz10W19dLE09dFtfKzFdLEE9VC1FLEY9UC1iLEQ9dy1FLE49TS1iLFU9KEEqTi1GKkQpKjI7aWYoTWF0aC5hYnMoVSk8MWUtOSl7bGV0IEI9MWU5O2NvbnN0IEg9blswXSoyO0IqPU1hdGguc2lnbigodFtIXS1FKSpOLSh0W0grMV0tYikqRCksbT0oRSt3KS8yLUIqTixnPShiK00pLzIrQipEfWVsc2V7Y29uc3QgQj0xL1UsSD1BKkErRipGLEc9RCpEK04qTjttPUUrKE4qSC1GKkcpKkIsZz1iKyhBKkctRCpIKSpCfXNbcF09bSxzW3ArMV09Z31sZXQgbz1lW2UubGVuZ3RoLTFdLGEsbD1vKjQsYyx1PXRbMipvXSxoLGY9dFsyKm8rMV07ci5maWxsKDApO2ZvcihsZXQgZD0wO2Q8ZS5sZW5ndGg7KytkKW89ZVtkXSxhPWwsYz11LGg9ZixsPW8qNCx1PXRbMipvXSxmPXRbMipvKzFdLHJbYSsyXT1yW2xdPWgtZixyW2ErM109cltsKzFdPXUtY31yZW5kZXIodCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IFhyOnZvaWQgMCx7ZGVsYXVuYXk6e2hhbGZlZGdlczpuLGluZWRnZXM6cixodWxsOnN9LGNpcmN1bWNlbnRlcnM6byx2ZWN0b3JzOmF9PXRoaXM7aWYocy5sZW5ndGg8PTEpcmV0dXJuIG51bGw7Zm9yKGxldCB1PTAsaD1uLmxlbmd0aDt1PGg7Kyt1KXtjb25zdCBmPW5bdV07aWYoZjx1KWNvbnRpbnVlO2NvbnN0IGQ9TWF0aC5mbG9vcih1LzMpKjIscD1NYXRoLmZsb29yKGYvMykqMix5PW9bZF0sbT1vW2QrMV0sZz1vW3BdLHg9b1twKzFdO3RoaXMuX3JlbmRlclNlZ21lbnQoeSxtLGcseCx0KX1sZXQgbCxjPXNbcy5sZW5ndGgtMV07Zm9yKGxldCB1PTA7dTxzLmxlbmd0aDsrK3Upe2w9YyxjPXNbdV07Y29uc3QgaD1NYXRoLmZsb29yKHJbY10vMykqMixmPW9baF0sZD1vW2grMV0scD1sKjQseT10aGlzLl9wcm9qZWN0KGYsZCxhW3ArMl0sYVtwKzNdKTt5JiZ0aGlzLl9yZW5kZXJTZWdtZW50KGYsZCx5WzBdLHlbMV0sdCl9cmV0dXJuIGUmJmUudmFsdWUoKX1yZW5kZXJCb3VuZHModCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IFhyOnZvaWQgMDtyZXR1cm4gdC5yZWN0KHRoaXMueG1pbix0aGlzLnltaW4sdGhpcy54bWF4LXRoaXMueG1pbix0aGlzLnltYXgtdGhpcy55bWluKSxlJiZlLnZhbHVlKCl9cmVuZGVyQ2VsbCh0LGUpe2NvbnN0IG49ZT09bnVsbD9lPW5ldyBYcjp2b2lkIDAscj10aGlzLl9jbGlwKHQpO2lmKHI9PT1udWxsfHwhci5sZW5ndGgpcmV0dXJuO2UubW92ZVRvKHJbMF0sclsxXSk7bGV0IHM9ci5sZW5ndGg7Zm9yKDtyWzBdPT09cltzLTJdJiZyWzFdPT09cltzLTFdJiZzPjE7KXMtPTI7Zm9yKGxldCBvPTI7bzxzO28rPTIpKHJbb10hPT1yW28tMl18fHJbbysxXSE9PXJbby0xXSkmJmUubGluZVRvKHJbb10scltvKzFdKTtyZXR1cm4gZS5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9KmNlbGxQb2x5Z29ucygpe2NvbnN0e2RlbGF1bmF5Ontwb2ludHM6dH19PXRoaXM7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aC8yO2U8bjsrK2Upe2NvbnN0IHI9dGhpcy5jZWxsUG9seWdvbihlKTtyJiYoci5pbmRleD1lLHlpZWxkIHIpfX1jZWxsUG9seWdvbih0KXtjb25zdCBlPW5ldyAkcDtyZXR1cm4gdGhpcy5yZW5kZXJDZWxsKHQsZSksZS52YWx1ZSgpfV9yZW5kZXJTZWdtZW50KHQsZSxuLHIscyl7bGV0IG87Y29uc3QgYT10aGlzLl9yZWdpb25jb2RlKHQsZSksbD10aGlzLl9yZWdpb25jb2RlKG4scik7YT09PTAmJmw9PT0wPyhzLm1vdmVUbyh0LGUpLHMubGluZVRvKG4scikpOihvPXRoaXMuX2NsaXBTZWdtZW50KHQsZSxuLHIsYSxsKSkmJihzLm1vdmVUbyhvWzBdLG9bMV0pLHMubGluZVRvKG9bMl0sb1szXSkpfWNvbnRhaW5zKHQsZSxuKXtyZXR1cm4gZT0rZSxlIT09ZXx8KG49K24sbiE9PW4pPyExOnRoaXMuZGVsYXVuYXkuX3N0ZXAodCxlLG4pPT09dH0qbmVpZ2hib3JzKHQpe2NvbnN0IGU9dGhpcy5fY2xpcCh0KTtpZihlKWZvcihjb25zdCBuIG9mIHRoaXMuZGVsYXVuYXkubmVpZ2hib3JzKHQpKXtjb25zdCByPXRoaXMuX2NsaXAobik7aWYocil7dDpmb3IobGV0IHM9MCxvPWUubGVuZ3RoO3M8bztzKz0yKWZvcihsZXQgYT0wLGw9ci5sZW5ndGg7YTxsO2ErPTIpaWYoZVtzXT09clthXSYmZVtzKzFdPT1yW2ErMV0mJmVbKHMrMiklb109PXJbKGErbC0yKSVsXSYmZVsocyszKSVvXT09clsoYStsLTEpJWxdKXt5aWVsZCBuO2JyZWFrIHR9fX19X2NlbGwodCl7Y29uc3R7Y2lyY3VtY2VudGVyczplLGRlbGF1bmF5OntpbmVkZ2VzOm4saGFsZmVkZ2VzOnIsdHJpYW5nbGVzOnN9fT10aGlzLG89blt0XTtpZihvPT09LTEpcmV0dXJuIG51bGw7Y29uc3QgYT1bXTtsZXQgbD1vO2Rve2NvbnN0IGM9TWF0aC5mbG9vcihsLzMpO2lmKGEucHVzaChlW2MqMl0sZVtjKjIrMV0pLGw9bCUzPT09Mj9sLTI6bCsxLHNbbF0hPT10KWJyZWFrO2w9cltsXX13aGlsZShsIT09byYmbCE9PS0xKTtyZXR1cm4gYX1fY2xpcCh0KXtpZih0PT09MCYmdGhpcy5kZWxhdW5heS5odWxsLmxlbmd0aD09PTEpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO2NvbnN0IGU9dGhpcy5fY2VsbCh0KTtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtjb25zdHt2ZWN0b3JzOm59PXRoaXMscj10KjQ7cmV0dXJuIG5bcl18fG5bcisxXT90aGlzLl9jbGlwSW5maW5pdGUodCxlLG5bcl0sbltyKzFdLG5bcisyXSxuW3IrM10pOnRoaXMuX2NsaXBGaW5pdGUodCxlKX1fY2xpcEZpbml0ZSh0LGUpe2NvbnN0IG49ZS5sZW5ndGg7bGV0IHI9bnVsbCxzLG8sYT1lW24tMl0sbD1lW24tMV0sYyx1PXRoaXMuX3JlZ2lvbmNvZGUoYSxsKSxoLGY9MDtmb3IobGV0IGQ9MDtkPG47ZCs9MilpZihzPWEsbz1sLGE9ZVtkXSxsPWVbZCsxXSxjPXUsdT10aGlzLl9yZWdpb25jb2RlKGEsbCksYz09PTAmJnU9PT0wKWg9ZixmPTAscj9yLnB1c2goYSxsKTpyPVthLGxdO2Vsc2V7bGV0IHAseSxtLGcseDtpZihjPT09MCl7aWYoKHA9dGhpcy5fY2xpcFNlZ21lbnQocyxvLGEsbCxjLHUpKT09PW51bGwpY29udGludWU7W3ksbSxnLHhdPXB9ZWxzZXtpZigocD10aGlzLl9jbGlwU2VnbWVudChhLGwscyxvLHUsYykpPT09bnVsbCljb250aW51ZTtbZyx4LHksbV09cCxoPWYsZj10aGlzLl9lZGdlY29kZSh5LG0pLGgmJmYmJnRoaXMuX2VkZ2UodCxoLGYscixyLmxlbmd0aCkscj9yLnB1c2goeSxtKTpyPVt5LG1dfWg9ZixmPXRoaXMuX2VkZ2Vjb2RlKGcseCksaCYmZiYmdGhpcy5fZWRnZSh0LGgsZixyLHIubGVuZ3RoKSxyP3IucHVzaChnLHgpOnI9W2cseF19aWYociloPWYsZj10aGlzLl9lZGdlY29kZShyWzBdLHJbMV0pLGgmJmYmJnRoaXMuX2VkZ2UodCxoLGYscixyLmxlbmd0aCk7ZWxzZSBpZih0aGlzLmNvbnRhaW5zKHQsKHRoaXMueG1pbit0aGlzLnhtYXgpLzIsKHRoaXMueW1pbit0aGlzLnltYXgpLzIpKXJldHVyblt0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWluXTtyZXR1cm4gcn1fY2xpcFNlZ21lbnQodCxlLG4scixzLG8pe2Zvcig7Oyl7aWYocz09PTAmJm89PT0wKXJldHVyblt0LGUsbixyXTtpZihzJm8pcmV0dXJuIG51bGw7bGV0IGEsbCxjPXN8fG87YyY4PyhhPXQrKG4tdCkqKHRoaXMueW1heC1lKS8oci1lKSxsPXRoaXMueW1heCk6YyY0PyhhPXQrKG4tdCkqKHRoaXMueW1pbi1lKS8oci1lKSxsPXRoaXMueW1pbik6YyYyPyhsPWUrKHItZSkqKHRoaXMueG1heC10KS8obi10KSxhPXRoaXMueG1heCk6KGw9ZSsoci1lKSoodGhpcy54bWluLXQpLyhuLXQpLGE9dGhpcy54bWluKSxzPyh0PWEsZT1sLHM9dGhpcy5fcmVnaW9uY29kZSh0LGUpKToobj1hLHI9bCxvPXRoaXMuX3JlZ2lvbmNvZGUobixyKSl9fV9jbGlwSW5maW5pdGUodCxlLG4scixzLG8pe2xldCBhPUFycmF5LmZyb20oZSksbDtpZigobD10aGlzLl9wcm9qZWN0KGFbMF0sYVsxXSxuLHIpKSYmYS51bnNoaWZ0KGxbMF0sbFsxXSksKGw9dGhpcy5fcHJvamVjdChhW2EubGVuZ3RoLTJdLGFbYS5sZW5ndGgtMV0scyxvKSkmJmEucHVzaChsWzBdLGxbMV0pLGE9dGhpcy5fY2xpcEZpbml0ZSh0LGEpKWZvcihsZXQgYz0wLHU9YS5sZW5ndGgsaCxmPXRoaXMuX2VkZ2Vjb2RlKGFbdS0yXSxhW3UtMV0pO2M8dTtjKz0yKWg9ZixmPXRoaXMuX2VkZ2Vjb2RlKGFbY10sYVtjKzFdKSxoJiZmJiYoYz10aGlzLl9lZGdlKHQsaCxmLGEsYyksdT1hLmxlbmd0aCk7ZWxzZSB0aGlzLmNvbnRhaW5zKHQsKHRoaXMueG1pbit0aGlzLnhtYXgpLzIsKHRoaXMueW1pbit0aGlzLnltYXgpLzIpJiYoYT1bdGhpcy54bWluLHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heF0pO3JldHVybiBhfV9lZGdlKHQsZSxuLHIscyl7Zm9yKDtlIT09bjspe2xldCBvLGE7c3dpdGNoKGUpe2Nhc2UgNTplPTQ7Y29udGludWU7Y2FzZSA0OmU9NixvPXRoaXMueG1heCxhPXRoaXMueW1pbjticmVhaztjYXNlIDY6ZT0yO2NvbnRpbnVlO2Nhc2UgMjplPTEwLG89dGhpcy54bWF4LGE9dGhpcy55bWF4O2JyZWFrO2Nhc2UgMTA6ZT04O2NvbnRpbnVlO2Nhc2UgODplPTksbz10aGlzLnhtaW4sYT10aGlzLnltYXg7YnJlYWs7Y2FzZSA5OmU9MTtjb250aW51ZTtjYXNlIDE6ZT01LG89dGhpcy54bWluLGE9dGhpcy55bWluO2JyZWFrfShyW3NdIT09b3x8cltzKzFdIT09YSkmJnRoaXMuY29udGFpbnModCxvLGEpJiYoci5zcGxpY2UocywwLG8sYSkscys9Mil9aWYoci5sZW5ndGg+NClmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rPTIpe2NvbnN0IGE9KG8rMiklci5sZW5ndGgsbD0obys0KSVyLmxlbmd0aDsocltvXT09PXJbYV0mJnJbYV09PT1yW2xdfHxyW28rMV09PT1yW2ErMV0mJnJbYSsxXT09PXJbbCsxXSkmJihyLnNwbGljZShhLDIpLG8tPTIpfXJldHVybiBzfV9wcm9qZWN0KHQsZSxuLHIpe2xldCBzPTEvMCxvLGEsbDtpZihyPDApe2lmKGU8PXRoaXMueW1pbilyZXR1cm4gbnVsbDsobz0odGhpcy55bWluLWUpL3IpPHMmJihsPXRoaXMueW1pbixhPXQrKHM9bykqbil9ZWxzZSBpZihyPjApe2lmKGU+PXRoaXMueW1heClyZXR1cm4gbnVsbDsobz0odGhpcy55bWF4LWUpL3IpPHMmJihsPXRoaXMueW1heCxhPXQrKHM9bykqbil9aWYobj4wKXtpZih0Pj10aGlzLnhtYXgpcmV0dXJuIG51bGw7KG89KHRoaXMueG1heC10KS9uKTxzJiYoYT10aGlzLnhtYXgsbD1lKyhzPW8pKnIpfWVsc2UgaWYobjwwKXtpZih0PD10aGlzLnhtaW4pcmV0dXJuIG51bGw7KG89KHRoaXMueG1pbi10KS9uKTxzJiYoYT10aGlzLnhtaW4sbD1lKyhzPW8pKnIpfXJldHVyblthLGxdfV9lZGdlY29kZSh0LGUpe3JldHVybih0PT09dGhpcy54bWluPzE6dD09PXRoaXMueG1heD8yOjApfChlPT09dGhpcy55bWluPzQ6ZT09PXRoaXMueW1heD84OjApfV9yZWdpb25jb2RlKHQsZSl7cmV0dXJuKHQ8dGhpcy54bWluPzE6dD50aGlzLnhtYXg/MjowKXwoZTx0aGlzLnltaW4/NDplPnRoaXMueW1heD84OjApfX1jb25zdCBfVT0yKk1hdGguUEksZW89TWF0aC5wb3c7ZnVuY3Rpb24geFUoaSl7cmV0dXJuIGlbMF19ZnVuY3Rpb24gTVUoaSl7cmV0dXJuIGlbMV19ZnVuY3Rpb24gU1UoaSl7Y29uc3R7dHJpYW5nbGVzOnQsY29vcmRzOmV9PWk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKz0zKXtjb25zdCByPTIqdFtuXSxzPTIqdFtuKzFdLG89Mip0W24rMl07aWYoKGVbb10tZVtyXSkqKGVbcysxXS1lW3IrMV0pLShlW3NdLWVbcl0pKihlW28rMV0tZVtyKzFdKT4xZS0xMClyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBiVShpLHQsZSl7cmV0dXJuW2krTWF0aC5zaW4oaSt0KSplLHQrTWF0aC5jb3MoaS10KSplXX1jbGFzcyBYcHtzdGF0aWMgZnJvbSh0LGU9eFUsbj1NVSxyKXtyZXR1cm4gbmV3IFhwKCJsZW5ndGgiaW4gdD93VSh0LGUsbixyKTpGbG9hdDY0QXJyYXkuZnJvbShBVSh0LGUsbixyKSkpfWNvbnN0cnVjdG9yKHQpe3RoaXMuX2RlbGF1bmF0b3I9bmV3IFBhKHQpLHRoaXMuaW5lZGdlcz1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aC8yKSx0aGlzLl9odWxsSW5kZXg9bmV3IEludDMyQXJyYXkodC5sZW5ndGgvMiksdGhpcy5wb2ludHM9dGhpcy5fZGVsYXVuYXRvci5jb29yZHMsdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLl9kZWxhdW5hdG9yLnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3QgdD10aGlzLl9kZWxhdW5hdG9yLGU9dGhpcy5wb2ludHM7aWYodC5odWxsJiZ0Lmh1bGwubGVuZ3RoPjImJlNVKHQpKXt0aGlzLmNvbGxpbmVhcj1JbnQzMkFycmF5LmZyb20oe2xlbmd0aDplLmxlbmd0aC8yfSwoZixkKT0+ZCkuc29ydCgoZixkKT0+ZVsyKmZdLWVbMipkXXx8ZVsyKmYrMV0tZVsyKmQrMV0pO2NvbnN0IGw9dGhpcy5jb2xsaW5lYXJbMF0sYz10aGlzLmNvbGxpbmVhclt0aGlzLmNvbGxpbmVhci5sZW5ndGgtMV0sdT1bZVsyKmxdLGVbMipsKzFdLGVbMipjXSxlWzIqYysxXV0saD0xZS04Kk1hdGguaHlwb3QodVszXS11WzFdLHVbMl0tdVswXSk7Zm9yKGxldCBmPTAsZD1lLmxlbmd0aC8yO2Y8ZDsrK2Ype2NvbnN0IHA9YlUoZVsyKmZdLGVbMipmKzFdLGgpO2VbMipmXT1wWzBdLGVbMipmKzFdPXBbMV19dGhpcy5fZGVsYXVuYXRvcj1uZXcgUGEoZSl9ZWxzZSBkZWxldGUgdGhpcy5jb2xsaW5lYXI7Y29uc3Qgbj10aGlzLmhhbGZlZGdlcz10aGlzLl9kZWxhdW5hdG9yLmhhbGZlZGdlcyxyPXRoaXMuaHVsbD10aGlzLl9kZWxhdW5hdG9yLmh1bGwscz10aGlzLnRyaWFuZ2xlcz10aGlzLl9kZWxhdW5hdG9yLnRyaWFuZ2xlcyxvPXRoaXMuaW5lZGdlcy5maWxsKC0xKSxhPXRoaXMuX2h1bGxJbmRleC5maWxsKC0xKTtmb3IobGV0IGw9MCxjPW4ubGVuZ3RoO2w8YzsrK2wpe2NvbnN0IHU9c1tsJTM9PT0yP2wtMjpsKzFdOyhuW2xdPT09LTF8fG9bdV09PT0tMSkmJihvW3VdPWwpfWZvcihsZXQgbD0wLGM9ci5sZW5ndGg7bDxjOysrbClhW3JbbF1dPWw7ci5sZW5ndGg8PTImJnIubGVuZ3RoPjAmJih0aGlzLnRyaWFuZ2xlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLmhhbGZlZGdlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLnRyaWFuZ2xlc1swXT1yWzBdLG9bclswXV09MSxyLmxlbmd0aD09PTImJihvW3JbMV1dPTAsdGhpcy50cmlhbmdsZXNbMV09clsxXSx0aGlzLnRyaWFuZ2xlc1syXT1yWzFdKSl9dm9yb25vaSh0KXtyZXR1cm4gbmV3IHZVKHRoaXMsdCl9Km5laWdoYm9ycyh0KXtjb25zdHtpbmVkZ2VzOmUsaHVsbDpuLF9odWxsSW5kZXg6cixoYWxmZWRnZXM6cyx0cmlhbmdsZXM6byxjb2xsaW5lYXI6YX09dGhpcztpZihhKXtjb25zdCBoPWEuaW5kZXhPZih0KTtoPjAmJih5aWVsZCBhW2gtMV0pLGg8YS5sZW5ndGgtMSYmKHlpZWxkIGFbaCsxXSk7cmV0dXJufWNvbnN0IGw9ZVt0XTtpZihsPT09LTEpcmV0dXJuO2xldCBjPWwsdT0tMTtkb3tpZih5aWVsZCB1PW9bY10sYz1jJTM9PT0yP2MtMjpjKzEsb1tjXSE9PXQpcmV0dXJuO2lmKGM9c1tjXSxjPT09LTEpe2NvbnN0IGg9blsoclt0XSsxKSVuLmxlbmd0aF07aCE9PXUmJih5aWVsZCBoKTtyZXR1cm59fXdoaWxlKGMhPT1sKX1maW5kKHQsZSxuPTApe2lmKHQ9K3QsdCE9PXR8fChlPStlLGUhPT1lKSlyZXR1cm4tMTtjb25zdCByPW47bGV0IHM7Zm9yKDsocz10aGlzLl9zdGVwKG4sdCxlKSk+PTAmJnMhPT1uJiZzIT09cjspbj1zO3JldHVybiBzfV9zdGVwKHQsZSxuKXtjb25zdHtpbmVkZ2VzOnIsaHVsbDpzLF9odWxsSW5kZXg6byxoYWxmZWRnZXM6YSx0cmlhbmdsZXM6bCxwb2ludHM6Y309dGhpcztpZihyW3RdPT09LTF8fCFjLmxlbmd0aClyZXR1cm4odCsxKSUoYy5sZW5ndGg+PjEpO2xldCB1PXQsaD1lbyhlLWNbdCoyXSwyKStlbyhuLWNbdCoyKzFdLDIpO2NvbnN0IGY9clt0XTtsZXQgZD1mO2Rve2xldCBwPWxbZF07Y29uc3QgeT1lbyhlLWNbcCoyXSwyKStlbyhuLWNbcCoyKzFdLDIpO2lmKHk8aCYmKGg9eSx1PXApLGQ9ZCUzPT09Mj9kLTI6ZCsxLGxbZF0hPT10KWJyZWFrO2lmKGQ9YVtkXSxkPT09LTEpe2lmKGQ9c1sob1t0XSsxKSVzLmxlbmd0aF0sZCE9PXAmJmVvKGUtY1tkKjJdLDIpK2VvKG4tY1tkKjIrMV0sMik8aClyZXR1cm4gZDticmVha319d2hpbGUoZCE9PWYpO3JldHVybiB1fXJlbmRlcih0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgWHI6dm9pZCAwLHtwb2ludHM6bixoYWxmZWRnZXM6cix0cmlhbmdsZXM6c309dGhpcztmb3IobGV0IG89MCxhPXIubGVuZ3RoO288YTsrK28pe2NvbnN0IGw9cltvXTtpZihsPG8pY29udGludWU7Y29uc3QgYz1zW29dKjIsdT1zW2xdKjI7dC5tb3ZlVG8obltjXSxuW2MrMV0pLHQubGluZVRvKG5bdV0sblt1KzFdKX1yZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLGUmJmUudmFsdWUoKX1yZW5kZXJQb2ludHModCxlKXtlPT09dm9pZCAwJiYoIXR8fHR5cGVvZiB0Lm1vdmVUbyE9ImZ1bmN0aW9uIikmJihlPXQsdD1udWxsKSxlPWU9PW51bGw/MjorZTtjb25zdCBuPXQ9PW51bGw/dD1uZXcgWHI6dm9pZCAwLHtwb2ludHM6cn09dGhpcztmb3IobGV0IHM9MCxvPXIubGVuZ3RoO3M8bztzKz0yKXtjb25zdCBhPXJbc10sbD1yW3MrMV07dC5tb3ZlVG8oYStlLGwpLHQuYXJjKGEsbCxlLDAsX1UpfXJldHVybiBuJiZuLnZhbHVlKCl9cmVuZGVySHVsbCh0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgWHI6dm9pZCAwLHtodWxsOm4scG9pbnRzOnJ9PXRoaXMscz1uWzBdKjIsbz1uLmxlbmd0aDt0Lm1vdmVUbyhyW3NdLHJbcysxXSk7Zm9yKGxldCBhPTE7YTxvOysrYSl7Y29uc3QgbD0yKm5bYV07dC5saW5lVG8ocltsXSxyW2wrMV0pfXJldHVybiB0LmNsb3NlUGF0aCgpLGUmJmUudmFsdWUoKX1odWxsUG9seWdvbigpe2NvbnN0IHQ9bmV3ICRwO3JldHVybiB0aGlzLnJlbmRlckh1bGwodCksdC52YWx1ZSgpfXJlbmRlclRyaWFuZ2xlKHQsZSl7Y29uc3Qgbj1lPT1udWxsP2U9bmV3IFhyOnZvaWQgMCx7cG9pbnRzOnIsdHJpYW5nbGVzOnN9PXRoaXMsbz1zW3QqPTNdKjIsYT1zW3QrMV0qMixsPXNbdCsyXSoyO3JldHVybiBlLm1vdmVUbyhyW29dLHJbbysxXSksZS5saW5lVG8oclthXSxyW2ErMV0pLGUubGluZVRvKHJbbF0scltsKzFdKSxlLmNsb3NlUGF0aCgpLG4mJm4udmFsdWUoKX0qdHJpYW5nbGVQb2x5Z29ucygpe2NvbnN0e3RyaWFuZ2xlczp0fT10aGlzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGgvMztlPG47KytlKXlpZWxkIHRoaXMudHJpYW5nbGVQb2x5Z29uKGUpfXRyaWFuZ2xlUG9seWdvbih0KXtjb25zdCBlPW5ldyAkcDtyZXR1cm4gdGhpcy5yZW5kZXJUcmlhbmdsZSh0LGUpLGUudmFsdWUoKX19ZnVuY3Rpb24gd1UoaSx0LGUsbil7Y29uc3Qgcj1pLmxlbmd0aCxzPW5ldyBGbG9hdDY0QXJyYXkocioyKTtmb3IobGV0IG89MDtvPHI7KytvKXtjb25zdCBhPWlbb107c1tvKjJdPXQuY2FsbChuLGEsbyxpKSxzW28qMisxXT1lLmNhbGwobixhLG8saSl9cmV0dXJuIHN9ZnVuY3Rpb24qQVUoaSx0LGUsbil7bGV0IHI9MDtmb3IoY29uc3QgcyBvZiBpKXlpZWxkIHQuY2FsbChuLHMscixpKSx5aWVsZCBlLmNhbGwobixzLHIsaSksKytyfWNvbnN0IHFwPU1hdGguUEksQk09cXAvMix6TT0xODAvcXAsa009cXAvMTgwLEVVPU1hdGguYXRhbjIsR009TWF0aC5jb3MsVFU9TWF0aC5tYXgsQ1U9TWF0aC5taW4sVk09TWF0aC5zaW4sUlU9TWF0aC5zaWdufHxmdW5jdGlvbihpKXtyZXR1cm4gaT4wPzE6aTwwPy0xOjB9LEhNPU1hdGguc3FydDtmdW5jdGlvbiBQVShpKXtyZXR1cm4gaT4xP0JNOmk8LTE/LUJNOk1hdGguYXNpbihpKX1mdW5jdGlvbiBXTShpLHQpe3JldHVybiBpWzBdKnRbMF0raVsxXSp0WzFdK2lbMl0qdFsyXX1mdW5jdGlvbiBDbihpLHQpe3JldHVybltpWzFdKnRbMl0taVsyXSp0WzFdLGlbMl0qdFswXS1pWzBdKnRbMl0saVswXSp0WzFdLWlbMV0qdFswXV19ZnVuY3Rpb24gS3UoaSx0KXtyZXR1cm5baVswXSt0WzBdLGlbMV0rdFsxXSxpWzJdK3RbMl1dfWZ1bmN0aW9uIGp1KGkpe3ZhciB0PUhNKGlbMF0qaVswXStpWzFdKmlbMV0raVsyXSppWzJdKTtyZXR1cm5baVswXS90LGlbMV0vdCxpWzJdL3RdfWZ1bmN0aW9uIFlwKGkpe3JldHVybltFVShpWzFdLGlbMF0pKnpNLFBVKFRVKC0xLENVKDEsaVsyXSkpKSp6TV19ZnVuY3Rpb24gYWkoaSl7Y29uc3QgdD1pWzBdKmtNLGU9aVsxXSprTSxuPUdNKGUpO3JldHVybltuKkdNKHQpLG4qVk0odCksVk0oZSldfWZ1bmN0aW9uIFpwKGkpe3JldHVybiBpPWkubWFwKHQ9PmFpKHQpKSxXTShpWzBdLENuKGlbMl0saVsxXSkpfWZ1bmN0aW9uIElVKGkpe2NvbnN0IHQ9RFUoaSksZT1OVSh0KSxuPVVVKGUsaSkscj1PVShlLGkubGVuZ3RoKSxzPUxVKHIsaSksbz1GVShlLGkpLHtwb2x5Z29uczphLGNlbnRlcnM6bH09QlUobyxlLGkpLGM9elUoYSksdT1HVShlLGkpLGg9a1UobixlKTtyZXR1cm57ZGVsYXVuYXk6dCxlZGdlczpuLHRyaWFuZ2xlczplLGNlbnRlcnM6bCxuZWlnaGJvcnM6cixwb2x5Z29uczphLG1lc2g6YyxodWxsOnUsdXJxdWhhcnQ6aCxmaW5kOnN9fWZ1bmN0aW9uIExVKGksdCl7ZnVuY3Rpb24gZShuLHIpe2xldCBzPW5bMF0tclswXSxvPW5bMV0tclsxXSxhPW5bMl0tclsyXTtyZXR1cm4gcypzK28qbythKmF9cmV0dXJuIGZ1bmN0aW9uKHIscyxvKXtvPT09dm9pZCAwJiYobz0wKTtsZXQgYSxsLGM9bztjb25zdCB1PWFpKFtyLHNdKTtkbyBhPW8sbz1udWxsLGw9ZSh1LGFpKHRbYV0pKSxpW2FdLmZvckVhY2goaD0+e2xldCBmPWUodSxhaSh0W2hdKSk7aWYoZjxsKXtsPWYsbz1oLGM9aDtyZXR1cm59fSk7d2hpbGUobyE9PW51bGwpO3JldHVybiBjfX1mdW5jdGlvbiBEVShpKXtpZihpLmxlbmd0aDwyKXJldHVybnt9O2xldCB0PTA7Zm9yKDtpc05hTihpW3RdWzBdK2lbdF1bMV0pJiZ0Kys8aS5sZW5ndGg7KTtjb25zdCBlPUF2KGlbdF0pLG49eVAoKS50cmFuc2xhdGUoWzAsMF0pLnNjYWxlKDEpLnJvdGF0ZShlLmludmVydChbMTgwLDBdKSk7aT1pLm1hcChuKTtjb25zdCByPVtdO2xldCBzPTE7Zm9yKGxldCBoPTAsZj1pLmxlbmd0aDtoPGY7aCsrKXtsZXQgZD1vbyhpW2hdWzBdLDIpK29vKGlbaF1bMV0sMik7IWlzRmluaXRlKGQpfHxkPjFlMzI/ci5wdXNoKGgpOmQ+cyYmKHM9ZCl9Y29uc3Qgbz0xZTYqSE0ocyk7ci5mb3JFYWNoKGg9PmlbaF09W28sMF0pLGkucHVzaChbMCxvXSksaS5wdXNoKFstbywwXSksaS5wdXNoKFswLC1vXSk7Y29uc3QgYT1YcC5mcm9tKGkpO2EucHJvamVjdGlvbj1uO2NvbnN0e3RyaWFuZ2xlczpsLGhhbGZlZGdlczpjLGluZWRnZXM6dX09YTtmb3IobGV0IGg9MCxmPWMubGVuZ3RoO2g8ZjtoKyspaWYoY1toXTwwKXtjb25zdCBkPWglMz09Mj9oLTI6aCsxLHA9aCUzPT0wP2grMjpoLTEseT1jW2RdLG09Y1twXTtjW3ldPW0sY1ttXT15LGNbZF09Y1twXT0tMSxsW2hdPWxbZF09bFtwXT10LHVbbFt5XV09eSUzPT0wP3krMjp5LTEsdVtsW21dXT1tJTM9PTA/bSsyOm0tMSxoKz0yLWglM31lbHNlIGxbaF0+aS5sZW5ndGgtMy0xJiYobFtoXT10KTtyZXR1cm4gYX1mdW5jdGlvbiBVVShpLHQpe2NvbnN0IGU9bmV3IFNldDtyZXR1cm4gdC5sZW5ndGg9PT0yP1tbMCwxXV06KGkuZm9yRWFjaChuPT57aWYoblswXSE9PW5bMV0mJiEoWnAobi5tYXAocj0+dFtyXSkpPDApKWZvcihsZXQgcj0wLHM7cjwzO3IrKylzPShyKzEpJTMsZS5hZGQoVmMoW25bcl0sbltzXV0pLmpvaW4oIi0iKSl9KSxBcnJheS5mcm9tKGUsbj0+bi5zcGxpdCgiLSIpLm1hcChOdW1iZXIpKSl9ZnVuY3Rpb24gTlUoaSl7Y29uc3R7dHJpYW5nbGVzOnR9PWk7aWYoIXQpcmV0dXJuW107Y29uc3QgZT1bXTtmb3IobGV0IG49MCxyPXQubGVuZ3RoLzM7bjxyO24rKyl7Y29uc3Qgcz10WzMqbl0sbz10WzMqbisxXSxhPXRbMypuKzJdO3MhPT1vJiZvIT09YSYmZS5wdXNoKFtzLGEsb10pfXJldHVybiBlfWZ1bmN0aW9uIEZVKGksdCl7cmV0dXJuIGkubWFwKGU9Pntjb25zdCBuPWUubWFwKHM9PnRbc10pLm1hcChhaSkscj1LdShLdShDbihuWzFdLG5bMF0pLENuKG5bMl0sblsxXSkpLENuKG5bMF0sblsyXSkpO3JldHVybiBZcChqdShyKSl9KX1mdW5jdGlvbiBPVShpLHQpe2NvbnN0IGU9W107cmV0dXJuIGkuZm9yRWFjaChuPT57Zm9yKGxldCByPTA7cjwzO3IrKyl7Y29uc3Qgcz1uW3JdLG89blsocisxKSUzXTtlW3NdPWVbc118fFtdLGVbc10ucHVzaChvKX19KSxpLmxlbmd0aD09PTAmJih0PT09Mj8oZVswXT1bMV0sZVsxXT1bMF0pOnQ9PT0xJiYoZVswXT1bXSkpLGV9ZnVuY3Rpb24gQlUoaSx0LGUpe2NvbnN0IG49W10scj1pLnNsaWNlKCk7aWYodC5sZW5ndGg9PT0wKXtpZihlLmxlbmd0aDwyKXJldHVybntwb2x5Z29uczpuLGNlbnRlcnM6cn07aWYoZS5sZW5ndGg9PT0yKXtjb25zdCBhPWFpKGVbMF0pLGw9YWkoZVsxXSksYz1qdShLdShhLGwpKSx1PWp1KENuKGEsbCkpLGg9Q24oYyx1KSxmPVtjLENuKGMsaCksQ24oQ24oYyxoKSxoKSxDbihDbihDbihjLGgpLGgpLGgpXS5tYXAoWXApLm1hcChvKTtyZXR1cm4gbi5wdXNoKGYpLG4ucHVzaChmLnNsaWNlKCkucmV2ZXJzZSgpKSx7cG9seWdvbnM6bixjZW50ZXJzOnJ9fX10LmZvckVhY2goKGEsbCk9Pntmb3IobGV0IGM9MDtjPDM7YysrKXtjb25zdCB1PWFbY10saD1hWyhjKzEpJTNdLGY9YVsoYysyKSUzXTtuW3VdPW5bdV18fFtdLG5bdV0ucHVzaChbaCxmLGwsW3UsaCxmXV0pfX0pO2NvbnN0IHM9bi5tYXAoYT0+e2NvbnN0IGw9W2FbMF1bMl1dO2xldCBjPWFbMF1bMV07Zm9yKGxldCB1PTE7dTxhLmxlbmd0aDt1KyspZm9yKGxldCBoPTA7aDxhLmxlbmd0aDtoKyspaWYoYVtoXVswXT09Yyl7Yz1hW2hdWzFdLGwucHVzaChhW2hdWzJdKTticmVha31pZihsLmxlbmd0aD4yKXJldHVybiBsO2lmKGwubGVuZ3RoPT0yKXtjb25zdCB1PSRNKGVbYVswXVszXVswXV0sZVthWzBdWzNdWzFdXSxyW2xbMF1dKSxoPSRNKGVbYVswXVszXVsyXV0sZVthWzBdWzNdWzBdXSxyW2xbMF1dKSxmPW8odSksZD1vKGgpO3JldHVybltsWzBdLGQsbFsxXSxmXX19KTtmdW5jdGlvbiBvKGEpe2xldCBsPS0xO3JldHVybiByLnNsaWNlKHQubGVuZ3RoLDEvMCkuZm9yRWFjaCgoYyx1KT0+e2NbMF09PT1hWzBdJiZjWzFdPT09YVsxXSYmKGw9dSt0Lmxlbmd0aCl9KSxsPDAmJihsPXIubGVuZ3RoLHIucHVzaChhKSksbH1yZXR1cm57cG9seWdvbnM6cyxjZW50ZXJzOnJ9fWZ1bmN0aW9uICRNKGksdCxlKXtpPWFpKGkpLHQ9YWkodCksZT1haShlKTtjb25zdCBuPVJVKFdNKENuKHQsaSksZSkpO3JldHVybiBZcChqdShLdShpLHQpKS5tYXAocj0+bipyKSl9ZnVuY3Rpb24gelUoaSl7Y29uc3QgdD1bXTtyZXR1cm4gaS5mb3JFYWNoKGU9PntpZighZSlyZXR1cm47bGV0IG49ZVtlLmxlbmd0aC0xXTtmb3IobGV0IHIgb2YgZSlyPm4mJnQucHVzaChbbixyXSksbj1yfSksdH1mdW5jdGlvbiBrVShpLHQpe3JldHVybiBmdW5jdGlvbihlKXtjb25zdCBuPW5ldyBNYXAscj1uZXcgTWFwO3JldHVybiBpLmZvckVhY2goKHMsbyk9Pntjb25zdCBhPXMuam9pbigiLSIpO24uc2V0KGEsZVtvXSksci5zZXQoYSwhMCl9KSx0LmZvckVhY2gocz0+e2xldCBvPTAsYT0tMTtmb3IobGV0IGw9MDtsPDM7bCsrKXtsZXQgYz1WYyhbc1tsXSxzWyhsKzEpJTNdXSkuam9pbigiLSIpO24uZ2V0KGMpPm8mJihvPW4uZ2V0KGMpLGE9Yyl9ci5zZXQoYSwhMSl9KSxpLm1hcChzPT5yLmdldChzLmpvaW4oIi0iKSkpfX1mdW5jdGlvbiBHVShpLHQpe2NvbnN0IGU9bmV3IFNldCxuPVtdO2kubWFwKGE9PntpZighKFpwKGEubWFwKGw9PnRbbD50Lmxlbmd0aD8wOmxdKSk+MWUtMTIpKWZvcihsZXQgbD0wO2w8MztsKyspe2xldCBjPVthW2xdLGFbKGwrMSklM11dLHU9YCR7Y1swXX0tJHtjWzFdfWA7ZS5oYXModSk/ZS5kZWxldGUodSk6ZS5hZGQoYCR7Y1sxXX0tJHtjWzBdfWApfX0pO2NvbnN0IHI9bmV3IE1hcDtsZXQgcztpZihlLmZvckVhY2goYT0+e2E9YS5zcGxpdCgiLSIpLm1hcChOdW1iZXIpLHIuc2V0KGFbMF0sYVsxXSkscz1hWzBdfSkscz09PXZvaWQgMClyZXR1cm4gbjtsZXQgbz1zO2Rve24ucHVzaChvKTtsZXQgYT1yLmdldChvKTtyLnNldChvLC0xKSxvPWF9d2hpbGUobz4tMSYmbyE9PXMpO3JldHVybiBufWZ1bmN0aW9uIFZVKGkpe2NvbnN0IHQ9ZnVuY3Rpb24oZSl7aWYodC5kZWxhdW5heT1udWxsLHQuX2RhdGE9ZSx0eXBlb2YgdC5fZGF0YT09Im9iamVjdCImJnQuX2RhdGEudHlwZT09PSJGZWF0dXJlQ29sbGVjdGlvbiImJih0Ll9kYXRhPXQuX2RhdGEuZmVhdHVyZXMpLHR5cGVvZiB0Ll9kYXRhPT0ib2JqZWN0Iil7Y29uc3Qgbj10Ll9kYXRhLm1hcChyPT5bdC5fdngociksdC5fdnkocikscl0pLmZpbHRlcihyPT5pc0Zpbml0ZShyWzBdK3JbMV0pKTt0LnBvaW50cz1uLm1hcChyPT5bclswXSxyWzFdXSksdC52YWxpZD1uLm1hcChyPT5yWzJdKSx0LmRlbGF1bmF5PUlVKHQucG9pbnRzKX1yZXR1cm4gdH07cmV0dXJuIHQuX3Z4PWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlPT0ib2JqZWN0IiYmInR5cGUiaW4gZSlyZXR1cm4geHYoZSlbMF07aWYoMCBpbiBlKXJldHVybiBlWzBdfSx0Ll92eT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09Im9iamVjdCImJiJ0eXBlImluIGUpcmV0dXJuIHh2KGUpWzFdO2lmKDEgaW4gZSlyZXR1cm4gZVsxXX0sdC54PWZ1bmN0aW9uKGUpe3JldHVybiBlPyh0Ll92eD1lLHQpOnQuX3Z4fSx0Lnk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/KHQuX3Z5PWUsdCk6dC5fdnl9LHQucG9seWdvbnM9ZnVuY3Rpb24oZSl7aWYoZSE9PXZvaWQgMCYmdChlKSwhdC5kZWxhdW5heSlyZXR1cm4hMTtjb25zdCBuPXt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6W119O3JldHVybiB0LnZhbGlkLmxlbmd0aD09PTB8fCh0LmRlbGF1bmF5LnBvbHlnb25zLmZvckVhY2goKHIscyk9Pm4uZmVhdHVyZXMucHVzaCh7dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6cj97dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1suLi5yLHJbMF1dLm1hcChvPT50LmRlbGF1bmF5LmNlbnRlcnNbb10pXX06bnVsbCxwcm9wZXJ0aWVzOntzaXRlOnQudmFsaWRbc10sc2l0ZWNvb3JkaW5hdGVzOnQucG9pbnRzW3NdLG5laWdoYm91cnM6dC5kZWxhdW5heS5uZWlnaGJvcnNbc119fSkpLHQudmFsaWQubGVuZ3RoPT09MSYmbi5mZWF0dXJlcy5wdXNoKHt0eXBlOiJGZWF0dXJlIixnZW9tZXRyeTp7dHlwZToiU3BoZXJlIn0scHJvcGVydGllczp7c2l0ZTp0LnZhbGlkWzBdLHNpdGVjb29yZGluYXRlczp0LnBvaW50c1swXSxuZWlnaGJvdXJzOltdfX0pKSxufSx0LnRyaWFuZ2xlcz1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXZvaWQgMCYmdChlKSx0LmRlbGF1bmF5P3t0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6dC5kZWxhdW5heS50cmlhbmdsZXMubWFwKChuLHIpPT4obj1uLm1hcChzPT50LnBvaW50c1tzXSksbi5jZW50ZXI9dC5kZWxhdW5heS5jZW50ZXJzW3JdLG4pKS5maWx0ZXIobj0+WnAobik+MCkubWFwKG49Pih7dHlwZToiRmVhdHVyZSIscHJvcGVydGllczp7Y2lyY3VtY2VudGVyOm4uY2VudGVyfSxnZW9tZXRyeTp7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1suLi5uLG5bMF1dXX19KSl9OiExfSx0LmxpbmtzPWZ1bmN0aW9uKGUpe2lmKGUhPT12b2lkIDAmJnQoZSksIXQuZGVsYXVuYXkpcmV0dXJuITE7Y29uc3Qgbj10LmRlbGF1bmF5LmVkZ2VzLm1hcChzPT56cyh0LnBvaW50c1tzWzBdXSx0LnBvaW50c1tzWzFdXSkpLHI9dC5kZWxhdW5heS51cnF1aGFydChuKTtyZXR1cm57dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOnQuZGVsYXVuYXkuZWRnZXMubWFwKChzLG8pPT4oe3R5cGU6IkZlYXR1cmUiLHByb3BlcnRpZXM6e3NvdXJjZTp0LnZhbGlkW3NbMF1dLHRhcmdldDp0LnZhbGlkW3NbMV1dLGxlbmd0aDpuW29dLHVycXVoYXJ0OiEhcltvXX0sZ2VvbWV0cnk6e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOlt0LnBvaW50c1tzWzBdXSx0LnBvaW50c1tzWzFdXV19fSkpfX0sdC5tZXNoPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dm9pZCAwJiZ0KGUpLHQuZGVsYXVuYXk/e3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dC5kZWxhdW5heS5lZGdlcy5tYXAobj0+W3QucG9pbnRzW25bMF1dLHQucG9pbnRzW25bMV1dXSl9OiExfSx0LmNlbGxNZXNoPWZ1bmN0aW9uKGUpe2lmKGUhPT12b2lkIDAmJnQoZSksIXQuZGVsYXVuYXkpcmV0dXJuITE7Y29uc3R7Y2VudGVyczpuLHBvbHlnb25zOnJ9PXQuZGVsYXVuYXkscz1bXTtmb3IoY29uc3QgbyBvZiByKWlmKG8pZm9yKGxldCBhPW8ubGVuZ3RoLGw9b1thLTFdLGM9b1swXSx1PTA7dTxhO2w9YyxjPW9bKyt1XSljPmwmJnMucHVzaChbbltsXSxuW2NdXSk7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6c319LHQuX2ZvdW5kPXZvaWQgMCx0LmZpbmQ9ZnVuY3Rpb24oZSxuLHIpe2lmKHQuX2ZvdW5kPXQuZGVsYXVuYXkuZmluZChlLG4sdC5fZm91bmQpLCFyfHx6cyhbZSxuXSx0LnBvaW50c1t0Ll9mb3VuZF0pPHIpcmV0dXJuIHQuX2ZvdW5kfSx0Lmh1bGw9ZnVuY3Rpb24oZSl7ZSE9PXZvaWQgMCYmdChlKTtjb25zdCBuPXQuZGVsYXVuYXkuaHVsbCxyPXQucG9pbnRzO3JldHVybiBuLmxlbmd0aD09PTA/bnVsbDp7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1suLi5uLm1hcChzPT5yW3NdKSxyW25bMF1dXV19fSxpP3QoaSk6dH1mdW5jdGlvbiBIVShpLHQpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOnRoaXMucmFuZ2UoaSk7YnJlYWs7ZGVmYXVsdDp0aGlzLnJhbmdlKHQpLmRvbWFpbihpKTticmVha31yZXR1cm4gdGhpc31mdW5jdGlvbiBKcChpLHQsZSl7aS5wcm90b3R5cGU9dC5wcm90b3R5cGU9ZSxlLmNvbnN0cnVjdG9yPWl9ZnVuY3Rpb24gWE0oaSx0KXt2YXIgZT1PYmplY3QuY3JlYXRlKGkucHJvdG90eXBlKTtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gTGEoKXt9dmFyIERhPS43LFF1PTEvRGEsbm89IlxccyooWystXT9cXGQrKVxccyoiLFVhPSJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixsaT0iXFxzKihbKy1dPyg/OlxcZCpcXC4pP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLFdVPS9eIyhbMC05YS1mXXszLDh9KSQvLCRVPW5ldyBSZWdFeHAoYF5yZ2JcXCgke25vfSwke25vfSwke25vfVxcKSRgKSxYVT1uZXcgUmVnRXhwKGBecmdiXFwoJHtsaX0sJHtsaX0sJHtsaX1cXCkkYCkscVU9bmV3IFJlZ0V4cChgXnJnYmFcXCgke25vfSwke25vfSwke25vfSwke1VhfVxcKSRgKSxZVT1uZXcgUmVnRXhwKGBecmdiYVxcKCR7bGl9LCR7bGl9LCR7bGl9LCR7VWF9XFwpJGApLFpVPW5ldyBSZWdFeHAoYF5oc2xcXCgke1VhfSwke2xpfSwke2xpfVxcKSRgKSxKVT1uZXcgUmVnRXhwKGBeaHNsYVxcKCR7VWF9LCR7bGl9LCR7bGl9LCR7VWF9XFwpJGApLHFNPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O0pwKExhLE5hLHtjb3B5KGkpe3JldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLHRoaXMsaSl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4OllNLGZvcm1hdEhleDpZTSxmb3JtYXRIZXg4OktVLGZvcm1hdEhzbDpqVSxmb3JtYXRSZ2I6Wk0sdG9TdHJpbmc6Wk19KTtmdW5jdGlvbiBZTSgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIEtVKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpfWZ1bmN0aW9uIGpVKCl7cmV0dXJuIHRTKHRoaXMpLmZvcm1hdEhzbCgpfWZ1bmN0aW9uIFpNKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gTmEoaSl7dmFyIHQsZTtyZXR1cm4gaT0oaSsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKHQ9V1UuZXhlYyhpKSk/KGU9dFsxXS5sZW5ndGgsdD1wYXJzZUludCh0WzFdLDE2KSxlPT09Nj9KTSh0KTplPT09Mz9uZXcgZ24odD4+OCYxNXx0Pj40JjI0MCx0Pj40JjE1fHQmMjQwLCh0JjE1KTw8NHx0JjE1LDEpOmU9PT04P3RoKHQ+PjI0JjI1NSx0Pj4xNiYyNTUsdD4+OCYyNTUsKHQmMjU1KS8yNTUpOmU9PT00P3RoKHQ+PjEyJjE1fHQ+PjgmMjQwLHQ+PjgmMTV8dD4+NCYyNDAsdD4+NCYxNXx0JjI0MCwoKHQmMTUpPDw0fHQmMTUpLzI1NSk6bnVsbCk6KHQ9JFUuZXhlYyhpKSk/bmV3IGduKHRbMV0sdFsyXSx0WzNdLDEpOih0PVhVLmV4ZWMoaSkpP25ldyBnbih0WzFdKjI1NS8xMDAsdFsyXSoyNTUvMTAwLHRbM10qMjU1LzEwMCwxKToodD1xVS5leGVjKGkpKT90aCh0WzFdLHRbMl0sdFszXSx0WzRdKToodD1ZVS5leGVjKGkpKT90aCh0WzFdKjI1NS8xMDAsdFsyXSoyNTUvMTAwLHRbM10qMjU1LzEwMCx0WzRdKToodD1aVS5leGVjKGkpKT9RTSh0WzFdLHRbMl0vMTAwLHRbM10vMTAwLDEpOih0PUpVLmV4ZWMoaSkpP1FNKHRbMV0sdFsyXS8xMDAsdFszXS8xMDAsdFs0XSk6cU0uaGFzT3duUHJvcGVydHkoaSk/Sk0ocU1baV0pOmk9PT0idHJhbnNwYXJlbnQiP25ldyBnbihOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIEpNKGkpe3JldHVybiBuZXcgZ24oaT4+MTYmMjU1LGk+PjgmMjU1LGkmMjU1LDEpfWZ1bmN0aW9uIHRoKGksdCxlLG4pe3JldHVybiBuPD0wJiYoaT10PWU9TmFOKSxuZXcgZ24oaSx0LGUsbil9ZnVuY3Rpb24gUVUoaSl7cmV0dXJuIGkgaW5zdGFuY2VvZiBMYXx8KGk9TmEoaSkpLGk/KGk9aS5yZ2IoKSxuZXcgZ24oaS5yLGkuZyxpLmIsaS5vcGFjaXR5KSk6bmV3IGdufWZ1bmN0aW9uIEtwKGksdCxlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MT9RVShpKTpuZXcgZ24oaSx0LGUsbj09bnVsbD8xOm4pfWZ1bmN0aW9uIGduKGksdCxlLG4pe3RoaXMucj0raSx0aGlzLmc9K3QsdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rbn1KcChnbixLcCxYTShMYSx7YnJpZ2h0ZXIoaSl7cmV0dXJuIGk9aT09bnVsbD9RdTpNYXRoLnBvdyhRdSxpKSxuZXcgZ24odGhpcy5yKmksdGhpcy5nKmksdGhpcy5iKmksdGhpcy5vcGFjaXR5KX0sZGFya2VyKGkpe3JldHVybiBpPWk9PW51bGw/RGE6TWF0aC5wb3coRGEsaSksbmV3IGduKHRoaXMucippLHRoaXMuZyppLHRoaXMuYippLHRoaXMub3BhY2l0eSl9LHJnYigpe3JldHVybiB0aGlzfSxjbGFtcCgpe3JldHVybiBuZXcgZ24ocXIodGhpcy5yKSxxcih0aGlzLmcpLHFyKHRoaXMuYiksZWgodGhpcy5vcGFjaXR5KSl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuLS41PD10aGlzLnImJnRoaXMucjwyNTUuNSYmLS41PD10aGlzLmcmJnRoaXMuZzwyNTUuNSYmLS41PD10aGlzLmImJnRoaXMuYjwyNTUuNSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDpLTSxmb3JtYXRIZXg6S00sZm9ybWF0SGV4ODp0Tixmb3JtYXRSZ2I6ak0sdG9TdHJpbmc6ak19KSk7ZnVuY3Rpb24gS00oKXtyZXR1cm5gIyR7WXIodGhpcy5yKX0ke1lyKHRoaXMuZyl9JHtZcih0aGlzLmIpfWB9ZnVuY3Rpb24gdE4oKXtyZXR1cm5gIyR7WXIodGhpcy5yKX0ke1lyKHRoaXMuZyl9JHtZcih0aGlzLmIpfSR7WXIoKGlzTmFOKHRoaXMub3BhY2l0eSk/MTp0aGlzLm9wYWNpdHkpKjI1NSl9YH1mdW5jdGlvbiBqTSgpe2NvbnN0IGk9ZWgodGhpcy5vcGFjaXR5KTtyZXR1cm5gJHtpPT09MT8icmdiKCI6InJnYmEoIn0ke3FyKHRoaXMucil9LCAke3FyKHRoaXMuZyl9LCAke3FyKHRoaXMuYil9JHtpPT09MT8iKSI6YCwgJHtpfSlgfWB9ZnVuY3Rpb24gZWgoaSl7cmV0dXJuIGlzTmFOKGkpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLGkpKX1mdW5jdGlvbiBxcihpKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZChpKXx8MCkpfWZ1bmN0aW9uIFlyKGkpe3JldHVybiBpPXFyKGkpLChpPDE2PyIwIjoiIikraS50b1N0cmluZygxNil9ZnVuY3Rpb24gUU0oaSx0LGUsbil7cmV0dXJuIG48PTA/aT10PWU9TmFOOmU8PTB8fGU+PTE/aT10PU5hTjp0PD0wJiYoaT1OYU4pLG5ldyBZbihpLHQsZSxuKX1mdW5jdGlvbiB0UyhpKXtpZihpIGluc3RhbmNlb2YgWW4pcmV0dXJuIG5ldyBZbihpLmgsaS5zLGkubCxpLm9wYWNpdHkpO2lmKGkgaW5zdGFuY2VvZiBMYXx8KGk9TmEoaSkpLCFpKXJldHVybiBuZXcgWW47aWYoaSBpbnN0YW5jZW9mIFluKXJldHVybiBpO2k9aS5yZ2IoKTt2YXIgdD1pLnIvMjU1LGU9aS5nLzI1NSxuPWkuYi8yNTUscj1NYXRoLm1pbih0LGUsbikscz1NYXRoLm1heCh0LGUsbiksbz1OYU4sYT1zLXIsbD0ocytyKS8yO3JldHVybiBhPyh0PT09cz9vPShlLW4pL2ErKGU8bikqNjplPT09cz9vPShuLXQpL2ErMjpvPSh0LWUpL2ErNCxhLz1sPC41P3MrcjoyLXMtcixvKj02MCk6YT1sPjAmJmw8MT8wOm8sbmV3IFluKG8sYSxsLGkub3BhY2l0eSl9ZnVuY3Rpb24gZU4oaSx0LGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0xP3RTKGkpOm5ldyBZbihpLHQsZSxuPT1udWxsPzE6bil9ZnVuY3Rpb24gWW4oaSx0LGUsbil7dGhpcy5oPStpLHRoaXMucz0rdCx0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStufUpwKFluLGVOLFhNKExhLHticmlnaHRlcihpKXtyZXR1cm4gaT1pPT1udWxsP1F1Ok1hdGgucG93KFF1LGkpLG5ldyBZbih0aGlzLmgsdGhpcy5zLHRoaXMubCppLHRoaXMub3BhY2l0eSl9LGRhcmtlcihpKXtyZXR1cm4gaT1pPT1udWxsP0RhOk1hdGgucG93KERhLGkpLG5ldyBZbih0aGlzLmgsdGhpcy5zLHRoaXMubCppLHRoaXMub3BhY2l0eSl9LHJnYigpe3ZhciBpPXRoaXMuaCUzNjArKHRoaXMuaDwwKSozNjAsdD1pc05hTihpKXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxuPWUrKGU8LjU/ZToxLWUpKnQscj0yKmUtbjtyZXR1cm4gbmV3IGduKGpwKGk+PTI0MD9pLTI0MDppKzEyMCxyLG4pLGpwKGkscixuKSxqcChpPDEyMD9pKzI0MDppLTEyMCxyLG4pLHRoaXMub3BhY2l0eSl9LGNsYW1wKCl7cmV0dXJuIG5ldyBZbihlUyh0aGlzLmgpLG5oKHRoaXMucyksbmgodGhpcy5sKSxlaCh0aGlzLm9wYWNpdHkpKX0sZGlzcGxheWFibGUoKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGZvcm1hdEhzbCgpe2NvbnN0IGk9ZWgodGhpcy5vcGFjaXR5KTtyZXR1cm5gJHtpPT09MT8iaHNsKCI6ImhzbGEoIn0ke2VTKHRoaXMuaCl9LCAke25oKHRoaXMucykqMTAwfSUsICR7bmgodGhpcy5sKSoxMDB9JSR7aT09PTE/IikiOmAsICR7aX0pYH1gfX0pKTtmdW5jdGlvbiBlUyhpKXtyZXR1cm4gaT0oaXx8MCklMzYwLGk8MD9pKzM2MDppfWZ1bmN0aW9uIG5oKGkpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDEsaXx8MCkpfWZ1bmN0aW9uIGpwKGksdCxlKXtyZXR1cm4oaTw2MD90KyhlLXQpKmkvNjA6aTwxODA/ZTppPDI0MD90KyhlLXQpKigyNDAtaSkvNjA6dCkqMjU1fXZhciBRcD1pPT4oKT0+aTtmdW5jdGlvbiBuTihpLHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gaStlKnR9fWZ1bmN0aW9uIGlOKGksdCxlKXtyZXR1cm4gaT1NYXRoLnBvdyhpLGUpLHQ9TWF0aC5wb3codCxlKS1pLGU9MS9lLGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnBvdyhpK24qdCxlKX19ZnVuY3Rpb24gck4oaSl7cmV0dXJuKGk9K2kpPT0xP25TOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdD9pTih0LGUsaSk6UXAoaXNOYU4odCk/ZTp0KX19ZnVuY3Rpb24gblMoaSx0KXt2YXIgZT10LWk7cmV0dXJuIGU/bk4oaSxlKTpRcChpc05hTihpKT90OmkpfXZhciBpUz1mdW5jdGlvbiBpKHQpe3ZhciBlPXJOKHQpO2Z1bmN0aW9uIG4ocixzKXt2YXIgbz1lKChyPUtwKHIpKS5yLChzPUtwKHMpKS5yKSxhPWUoci5nLHMuZyksbD1lKHIuYixzLmIpLGM9blMoci5vcGFjaXR5LHMub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHUpe3JldHVybiByLnI9byh1KSxyLmc9YSh1KSxyLmI9bCh1KSxyLm9wYWNpdHk9Yyh1KSxyKyIifX1yZXR1cm4gbi5nYW1tYT1pLG59KDEpO2Z1bmN0aW9uIHNOKGksdCl7dHx8KHQ9W10pO3ZhciBlPWk/TWF0aC5taW4odC5sZW5ndGgsaS5sZW5ndGgpOjAsbj10LnNsaWNlKCkscjtyZXR1cm4gZnVuY3Rpb24ocyl7Zm9yKHI9MDtyPGU7KytyKW5bcl09aVtyXSooMS1zKSt0W3JdKnM7cmV0dXJuIG59fWZ1bmN0aW9uIG9OKGkpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoaSkmJiEoaSBpbnN0YW5jZW9mIERhdGFWaWV3KX1mdW5jdGlvbiBhTihpLHQpe3ZhciBlPXQ/dC5sZW5ndGg6MCxuPWk/TWF0aC5taW4oZSxpLmxlbmd0aCk6MCxyPW5ldyBBcnJheShuKSxzPW5ldyBBcnJheShlKSxvO2ZvcihvPTA7bzxuOysrbylyW29dPW5tKGlbb10sdFtvXSk7Zm9yKDtvPGU7KytvKXNbb109dFtvXTtyZXR1cm4gZnVuY3Rpb24oYSl7Zm9yKG89MDtvPG47KytvKXNbb109cltvXShhKTtyZXR1cm4gc319ZnVuY3Rpb24gbE4oaSx0KXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gaT0raSx0PSt0LGZ1bmN0aW9uKG4pe3JldHVybiBlLnNldFRpbWUoaSooMS1uKSt0Km4pLGV9fWZ1bmN0aW9uIGloKGksdCl7cmV0dXJuIGk9K2ksdD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gaSooMS1lKSt0KmV9fWZ1bmN0aW9uIGNOKGksdCl7dmFyIGU9e30sbj17fSxyOyhpPT09bnVsbHx8dHlwZW9mIGkhPSJvYmplY3QiKSYmKGk9e30pLCh0PT09bnVsbHx8dHlwZW9mIHQhPSJvYmplY3QiKSYmKHQ9e30pO2ZvcihyIGluIHQpciBpbiBpP2Vbcl09bm0oaVtyXSx0W3JdKTpuW3JdPXRbcl07cmV0dXJuIGZ1bmN0aW9uKHMpe2ZvcihyIGluIGUpbltyXT1lW3JdKHMpO3JldHVybiBufX12YXIgdG09L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLGVtPW5ldyBSZWdFeHAodG0uc291cmNlLCJnIik7ZnVuY3Rpb24gdU4oaSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGl9fWZ1bmN0aW9uIGhOKGkpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaSh0KSsiIn19ZnVuY3Rpb24gZk4oaSx0KXt2YXIgZT10bS5sYXN0SW5kZXg9ZW0ubGFzdEluZGV4PTAsbixyLHMsbz0tMSxhPVtdLGw9W107Zm9yKGk9aSsiIix0PXQrIiI7KG49dG0uZXhlYyhpKSkmJihyPWVtLmV4ZWModCkpOykocz1yLmluZGV4KT5lJiYocz10LnNsaWNlKGUscyksYVtvXT9hW29dKz1zOmFbKytvXT1zKSwobj1uWzBdKT09PShyPXJbMF0pP2Fbb10/YVtvXSs9cjphWysrb109cjooYVsrK29dPW51bGwsbC5wdXNoKHtpOm8seDppaChuLHIpfSkpLGU9ZW0ubGFzdEluZGV4O3JldHVybiBlPHQubGVuZ3RoJiYocz10LnNsaWNlKGUpLGFbb10/YVtvXSs9czphWysrb109cyksYS5sZW5ndGg8Mj9sWzBdP2hOKGxbMF0ueCk6dU4odCk6KHQ9bC5sZW5ndGgsZnVuY3Rpb24oYyl7Zm9yKHZhciB1PTAsaDt1PHQ7Kyt1KWFbKGg9bFt1XSkuaV09aC54KGMpO3JldHVybiBhLmpvaW4oIiIpfSl9ZnVuY3Rpb24gbm0oaSx0KXt2YXIgZT10eXBlb2YgdCxuO3JldHVybiB0PT1udWxsfHxlPT09ImJvb2xlYW4iP1FwKHQpOihlPT09Im51bWJlciI/aWg6ZT09PSJzdHJpbmciPyhuPU5hKHQpKT8odD1uLGlTKTpmTjp0IGluc3RhbmNlb2YgTmE/aVM6dCBpbnN0YW5jZW9mIERhdGU/bE46b04odCk/c046QXJyYXkuaXNBcnJheSh0KT9hTjp0eXBlb2YgdC52YWx1ZU9mIT0iZnVuY3Rpb24iJiZ0eXBlb2YgdC50b1N0cmluZyE9ImZ1bmN0aW9uInx8aXNOYU4odCk/Y046aWgpKGksdCl9ZnVuY3Rpb24gZE4oaSx0KXtyZXR1cm4gaT0raSx0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKGkqKDEtZSkrdCplKX19ZnVuY3Rpb24gcE4oaSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGl9fWZ1bmN0aW9uIG1OKGkpe3JldHVybitpfXZhciByUz1bMCwxXTtmdW5jdGlvbiBpbyhpKXtyZXR1cm4gaX1mdW5jdGlvbiBpbShpLHQpe3JldHVybih0LT1pPStpKT9mdW5jdGlvbihlKXtyZXR1cm4oZS1pKS90fTpwTihpc05hTih0KT9OYU46LjUpfWZ1bmN0aW9uIGdOKGksdCl7dmFyIGU7cmV0dXJuIGk+dCYmKGU9aSxpPXQsdD1lKSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5tYXgoaSxNYXRoLm1pbih0LG4pKX19ZnVuY3Rpb24geU4oaSx0LGUpe3ZhciBuPWlbMF0scj1pWzFdLHM9dFswXSxvPXRbMV07cmV0dXJuIHI8bj8obj1pbShyLG4pLHM9ZShvLHMpKToobj1pbShuLHIpLHM9ZShzLG8pKSxmdW5jdGlvbihhKXtyZXR1cm4gcyhuKGEpKX19ZnVuY3Rpb24gdk4oaSx0LGUpe3ZhciBuPU1hdGgubWluKGkubGVuZ3RoLHQubGVuZ3RoKS0xLHI9bmV3IEFycmF5KG4pLHM9bmV3IEFycmF5KG4pLG89LTE7Zm9yKGlbbl08aVswXSYmKGk9aS5zbGljZSgpLnJldmVyc2UoKSx0PXQuc2xpY2UoKS5yZXZlcnNlKCkpOysrbzxuOylyW29dPWltKGlbb10saVtvKzFdKSxzW29dPWUodFtvXSx0W28rMV0pO3JldHVybiBmdW5jdGlvbihhKXt2YXIgbD1wUihpLGEsMSxuKS0xO3JldHVybiBzW2xdKHJbbF0oYSkpfX1mdW5jdGlvbiBfTihpLHQpe3JldHVybiB0LmRvbWFpbihpLmRvbWFpbigpKS5yYW5nZShpLnJhbmdlKCkpLmludGVycG9sYXRlKGkuaW50ZXJwb2xhdGUoKSkuY2xhbXAoaS5jbGFtcCgpKS51bmtub3duKGkudW5rbm93bigpKX1mdW5jdGlvbiB4Tigpe3ZhciBpPXJTLHQ9clMsZT1ubSxuLHIscyxvPWlvLGEsbCxjO2Z1bmN0aW9uIHUoKXt2YXIgZj1NYXRoLm1pbihpLmxlbmd0aCx0Lmxlbmd0aCk7cmV0dXJuIG8hPT1pbyYmKG89Z04oaVswXSxpW2YtMV0pKSxhPWY+Mj92Tjp5TixsPWM9bnVsbCxofWZ1bmN0aW9uIGgoZil7cmV0dXJuIGY9PW51bGx8fGlzTmFOKGY9K2YpP3M6KGx8fChsPWEoaS5tYXAobiksdCxlKSkpKG4obyhmKSkpfXJldHVybiBoLmludmVydD1mdW5jdGlvbihmKXtyZXR1cm4gbyhyKChjfHwoYz1hKHQsaS5tYXAobiksaWgpKSkoZikpKX0saC5kb21haW49ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9QXJyYXkuZnJvbShmLG1OKSx1KCkpOmkuc2xpY2UoKX0saC5yYW5nZT1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1BcnJheS5mcm9tKGYpLHUoKSk6dC5zbGljZSgpfSxoLnJhbmdlUm91bmQ9ZnVuY3Rpb24oZil7cmV0dXJuIHQ9QXJyYXkuZnJvbShmKSxlPWROLHUoKX0saC5jbGFtcD1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1mPyEwOmlvLHUoKSk6byE9PWlvfSxoLmludGVycG9sYXRlPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWYsdSgpKTplfSxoLnVua25vd249ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ZixoKTpzfSxmdW5jdGlvbihmLGQpe3JldHVybiBuPWYscj1kLHUoKX19ZnVuY3Rpb24gTU4oKXtyZXR1cm4geE4oKShpbyxpbyl9ZnVuY3Rpb24gU04oaSl7cmV0dXJuIE1hdGguYWJzKGk9TWF0aC5yb3VuZChpKSk+PTFlMjE/aS50b0xvY2FsZVN0cmluZygiZW4iKS5yZXBsYWNlKC8sL2csIiIpOmkudG9TdHJpbmcoMTApfWZ1bmN0aW9uIHJoKGksdCl7aWYoKGU9KGk9dD9pLnRvRXhwb25lbnRpYWwodC0xKTppLnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLG49aS5zbGljZSgwLGUpO3JldHVybltuLmxlbmd0aD4xP25bMF0rbi5zbGljZSgyKTpuLCtpLnNsaWNlKGUrMSldfWZ1bmN0aW9uIHJvKGkpe3JldHVybiBpPXJoKE1hdGguYWJzKGkpKSxpP2lbMV06TmFOfWZ1bmN0aW9uIGJOKGksdCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7Zm9yKHZhciByPWUubGVuZ3RoLHM9W10sbz0wLGE9aVswXSxsPTA7cj4wJiZhPjAmJihsK2ErMT5uJiYoYT1NYXRoLm1heCgxLG4tbCkpLHMucHVzaChlLnN1YnN0cmluZyhyLT1hLHIrYSkpLCEoKGwrPWErMSk+bikpOylhPWlbbz0obysxKSVpLmxlbmd0aF07cmV0dXJuIHMucmV2ZXJzZSgpLmpvaW4odCl9fWZ1bmN0aW9uIHdOKGkpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKGUpe3JldHVybiBpWytlXX0pfX12YXIgQU49L14oPzooLik/KFs8Pj1eXSkpPyhbK1wtKCBdKT8oWyQjXSk/KDApPyhcZCspPygsKT8oXC5cZCspPyh+KT8oW2EteiVdKT8kL2k7ZnVuY3Rpb24gc2goaSl7aWYoISh0PUFOLmV4ZWMoaSkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIraSk7dmFyIHQ7cmV0dXJuIG5ldyBybSh7ZmlsbDp0WzFdLGFsaWduOnRbMl0sc2lnbjp0WzNdLHN5bWJvbDp0WzRdLHplcm86dFs1XSx3aWR0aDp0WzZdLGNvbW1hOnRbN10scHJlY2lzaW9uOnRbOF0mJnRbOF0uc2xpY2UoMSksdHJpbTp0WzldLHR5cGU6dFsxMF19KX1zaC5wcm90b3R5cGU9cm0ucHJvdG90eXBlO2Z1bmN0aW9uIHJtKGkpe3RoaXMuZmlsbD1pLmZpbGw9PT12b2lkIDA/IiAiOmkuZmlsbCsiIix0aGlzLmFsaWduPWkuYWxpZ249PT12b2lkIDA/Ij4iOmkuYWxpZ24rIiIsdGhpcy5zaWduPWkuc2lnbj09PXZvaWQgMD8iLSI6aS5zaWduKyIiLHRoaXMuc3ltYm9sPWkuc3ltYm9sPT09dm9pZCAwPyIiOmkuc3ltYm9sKyIiLHRoaXMuemVybz0hIWkuemVybyx0aGlzLndpZHRoPWkud2lkdGg9PT12b2lkIDA/dm9pZCAwOitpLndpZHRoLHRoaXMuY29tbWE9ISFpLmNvbW1hLHRoaXMucHJlY2lzaW9uPWkucHJlY2lzaW9uPT09dm9pZCAwP3ZvaWQgMDoraS5wcmVjaXNpb24sdGhpcy50cmltPSEhaS50cmltLHRoaXMudHlwZT1pLnR5cGU9PT12b2lkIDA/IiI6aS50eXBlKyIifXJtLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyh0aGlzLndpZHRoPT09dm9pZCAwPyIiOk1hdGgubWF4KDEsdGhpcy53aWR0aHwwKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsodGhpcy5wcmVjaXNpb249PT12b2lkIDA/IiI6Ii4iK01hdGgubWF4KDAsdGhpcy5wcmVjaXNpb258MCkpKyh0aGlzLnRyaW0/In4iOiIiKSt0aGlzLnR5cGV9O2Z1bmN0aW9uIEVOKGkpe3Q6Zm9yKHZhciB0PWkubGVuZ3RoLGU9MSxuPS0xLHI7ZTx0OysrZSlzd2l0Y2goaVtlXSl7Y2FzZSIuIjpuPXI9ZTticmVhaztjYXNlIjAiOm49PT0wJiYobj1lKSxyPWU7YnJlYWs7ZGVmYXVsdDppZighK2lbZV0pYnJlYWsgdDtuPjAmJihuPTApO2JyZWFrfXJldHVybiBuPjA/aS5zbGljZSgwLG4pK2kuc2xpY2UocisxKTppfXZhciBzUztmdW5jdGlvbiBUTihpLHQpe3ZhciBlPXJoKGksdCk7aWYoIWUpcmV0dXJuIGkrIiI7dmFyIG49ZVswXSxyPWVbMV0scz1yLShzUz1NYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3Ioci8zKSkpKjMpKzEsbz1uLmxlbmd0aDtyZXR1cm4gcz09PW8/bjpzPm8/bituZXcgQXJyYXkocy1vKzEpLmpvaW4oIjAiKTpzPjA/bi5zbGljZSgwLHMpKyIuIituLnNsaWNlKHMpOiIwLiIrbmV3IEFycmF5KDEtcykuam9pbigiMCIpK3JoKGksTWF0aC5tYXgoMCx0K3MtMSkpWzBdfWZ1bmN0aW9uIG9TKGksdCl7dmFyIGU9cmgoaSx0KTtpZighZSlyZXR1cm4gaSsiIjt2YXIgbj1lWzBdLHI9ZVsxXTtyZXR1cm4gcjwwPyIwLiIrbmV3IEFycmF5KC1yKS5qb2luKCIwIikrbjpuLmxlbmd0aD5yKzE/bi5zbGljZSgwLHIrMSkrIi4iK24uc2xpY2UocisxKTpuK25ldyBBcnJheShyLW4ubGVuZ3RoKzIpLmpvaW4oIjAiKX12YXIgYVM9eyIlIjooaSx0KT0+KGkqMTAwKS50b0ZpeGVkKHQpLGI6aT0+TWF0aC5yb3VuZChpKS50b1N0cmluZygyKSxjOmk9PmkrIiIsZDpTTixlOihpLHQpPT5pLnRvRXhwb25lbnRpYWwodCksZjooaSx0KT0+aS50b0ZpeGVkKHQpLGc6KGksdCk9PmkudG9QcmVjaXNpb24odCksbzppPT5NYXRoLnJvdW5kKGkpLnRvU3RyaW5nKDgpLHA6KGksdCk9Pm9TKGkqMTAwLHQpLHI6b1MsczpUTixYOmk9Pk1hdGgucm91bmQoaSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkseDppPT5NYXRoLnJvdW5kKGkpLnRvU3RyaW5nKDE2KX07ZnVuY3Rpb24gbFMoaSl7cmV0dXJuIGl9dmFyIGNTPUFycmF5LnByb3RvdHlwZS5tYXAsdVM9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdO2Z1bmN0aW9uIENOKGkpe3ZhciB0PWkuZ3JvdXBpbmc9PT12b2lkIDB8fGkudGhvdXNhbmRzPT09dm9pZCAwP2xTOmJOKGNTLmNhbGwoaS5ncm91cGluZyxOdW1iZXIpLGkudGhvdXNhbmRzKyIiKSxlPWkuY3VycmVuY3k9PT12b2lkIDA/IiI6aS5jdXJyZW5jeVswXSsiIixuPWkuY3VycmVuY3k9PT12b2lkIDA/IiI6aS5jdXJyZW5jeVsxXSsiIixyPWkuZGVjaW1hbD09PXZvaWQgMD8iLiI6aS5kZWNpbWFsKyIiLHM9aS5udW1lcmFscz09PXZvaWQgMD9sUzp3TihjUy5jYWxsKGkubnVtZXJhbHMsU3RyaW5nKSksbz1pLnBlcmNlbnQ9PT12b2lkIDA/IiUiOmkucGVyY2VudCsiIixhPWkubWludXM9PT12b2lkIDA/IuKIkiI6aS5taW51cysiIixsPWkubmFuPT09dm9pZCAwPyJOYU4iOmkubmFuKyIiO2Z1bmN0aW9uIGMoaCl7aD1zaChoKTt2YXIgZj1oLmZpbGwsZD1oLmFsaWduLHA9aC5zaWduLHk9aC5zeW1ib2wsbT1oLnplcm8sZz1oLndpZHRoLHg9aC5jb21tYSx2PWgucHJlY2lzaW9uLF89aC50cmltLEU9aC50eXBlO0U9PT0ibiI/KHg9ITAsRT0iZyIpOmFTW0VdfHwodj09PXZvaWQgMCYmKHY9MTIpLF89ITAsRT0iZyIpLChtfHxmPT09IjAiJiZkPT09Ij0iKSYmKG09ITAsZj0iMCIsZD0iPSIpO3ZhciBiPXk9PT0iJCI/ZTp5PT09IiMiJiYvW2JveFhdLy50ZXN0KEUpPyIwIitFLnRvTG93ZXJDYXNlKCk6IiIsVD15PT09IiQiP246L1slcF0vLnRlc3QoRSk/bzoiIixQPWFTW0VdLHc9L1tkZWZncHJzJV0vLnRlc3QoRSk7dj12PT09dm9pZCAwPzY6L1tncHJzXS8udGVzdChFKT9NYXRoLm1heCgxLE1hdGgubWluKDIxLHYpKTpNYXRoLm1heCgwLE1hdGgubWluKDIwLHYpKTtmdW5jdGlvbiBNKEEpe3ZhciBGPWIsRD1ULE4sVSxCO2lmKEU9PT0iYyIpRD1QKEEpK0QsQT0iIjtlbHNle0E9K0E7dmFyIEg9QTwwfHwxL0E8MDtpZihBPWlzTmFOKEEpP2w6UChNYXRoLmFicyhBKSx2KSxfJiYoQT1FTihBKSksSCYmK0E9PTAmJnAhPT0iKyImJihIPSExKSxGPShIP3A9PT0iKCI/cDphOnA9PT0iLSJ8fHA9PT0iKCI/IiI6cCkrRixEPShFPT09InMiP3VTWzgrc1MvM106IiIpK0QrKEgmJnA9PT0iKCI/IikiOiIiKSx3KXtmb3IoTj0tMSxVPUEubGVuZ3RoOysrTjxVOylpZihCPUEuY2hhckNvZGVBdChOKSw0OD5CfHxCPjU3KXtEPShCPT09NDY/citBLnNsaWNlKE4rMSk6QS5zbGljZShOKSkrRCxBPUEuc2xpY2UoMCxOKTticmVha319fXgmJiFtJiYoQT10KEEsMS8wKSk7dmFyIEc9Ri5sZW5ndGgrQS5sZW5ndGgrRC5sZW5ndGgsdHQ9RzxnP25ldyBBcnJheShnLUcrMSkuam9pbihmKToiIjtzd2l0Y2goeCYmbSYmKEE9dCh0dCtBLHR0Lmxlbmd0aD9nLUQubGVuZ3RoOjEvMCksdHQ9IiIpLGQpe2Nhc2UiPCI6QT1GK0ErRCt0dDticmVhaztjYXNlIj0iOkE9Rit0dCtBK0Q7YnJlYWs7Y2FzZSJeIjpBPXR0LnNsaWNlKDAsRz10dC5sZW5ndGg+PjEpK0YrQStEK3R0LnNsaWNlKEcpO2JyZWFrO2RlZmF1bHQ6QT10dCtGK0ErRDticmVha31yZXR1cm4gcyhBKX1yZXR1cm4gTS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBoKyIifSxNfWZ1bmN0aW9uIHUoaCxmKXt2YXIgZD1jKChoPXNoKGgpLGgudHlwZT0iZiIsaCkpLHA9TWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHJvKGYpLzMpKSkqMyx5PU1hdGgucG93KDEwLC1wKSxtPXVTWzgrcC8zXTtyZXR1cm4gZnVuY3Rpb24oZyl7cmV0dXJuIGQoeSpnKSttfX1yZXR1cm57Zm9ybWF0OmMsZm9ybWF0UHJlZml4OnV9fXZhciBvaCxoUyxmUztSTih7dGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl19KTtmdW5jdGlvbiBSTihpKXtyZXR1cm4gb2g9Q04oaSksaFM9b2guZm9ybWF0LGZTPW9oLmZvcm1hdFByZWZpeCxvaH1mdW5jdGlvbiBQTihpKXtyZXR1cm4gTWF0aC5tYXgoMCwtcm8oTWF0aC5hYnMoaSkpKX1mdW5jdGlvbiBJTihpLHQpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihybyh0KS8zKSkpKjMtcm8oTWF0aC5hYnMoaSkpKX1mdW5jdGlvbiBMTihpLHQpe3JldHVybiBpPU1hdGguYWJzKGkpLHQ9TWF0aC5hYnModCktaSxNYXRoLm1heCgwLHJvKHQpLXJvKGkpKSsxfWZ1bmN0aW9uIEROKGksdCxlLG4pe3ZhciByPV9SKGksdCxlKSxzO3N3aXRjaChuPXNoKG49PW51bGw/IixmIjpuKSxuLnR5cGUpe2Nhc2UicyI6e3ZhciBvPU1hdGgubWF4KE1hdGguYWJzKGkpLE1hdGguYWJzKHQpKTtyZXR1cm4gbi5wcmVjaXNpb249PW51bGwmJiFpc05hTihzPUlOKHIsbykpJiYobi5wcmVjaXNpb249cyksZlMobixvKX1jYXNlIiI6Y2FzZSJlIjpjYXNlImciOmNhc2UicCI6Y2FzZSJyIjp7bi5wcmVjaXNpb249PW51bGwmJiFpc05hTihzPUxOKHIsTWF0aC5tYXgoTWF0aC5hYnMoaSksTWF0aC5hYnModCkpKSkmJihuLnByZWNpc2lvbj1zLShuLnR5cGU9PT0iZSIpKTticmVha31jYXNlImYiOmNhc2UiJSI6e24ucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocz1QTihyKSkmJihuLnByZWNpc2lvbj1zLShuLnR5cGU9PT0iJSIpKjIpO2JyZWFrfX1yZXR1cm4gaFMobil9ZnVuY3Rpb24gVU4oaSl7dmFyIHQ9aS5kb21haW47cmV0dXJuIGkudGlja3M9ZnVuY3Rpb24oZSl7dmFyIG49dCgpO3JldHVybiB2UihuWzBdLG5bbi5sZW5ndGgtMV0sZT09bnVsbD8xMDplKX0saS50aWNrRm9ybWF0PWZ1bmN0aW9uKGUsbil7dmFyIHI9dCgpO3JldHVybiBETihyWzBdLHJbci5sZW5ndGgtMV0sZT09bnVsbD8xMDplLG4pfSxpLm5pY2U9ZnVuY3Rpb24oZSl7ZT09bnVsbCYmKGU9MTApO3ZhciBuPXQoKSxyPTAscz1uLmxlbmd0aC0xLG89bltyXSxhPW5bc10sbCxjLHU9MTA7Zm9yKGE8byYmKGM9byxvPWEsYT1jLGM9cixyPXMscz1jKTt1LS0gPjA7KXtpZihjPXJkKG8sYSxlKSxjPT09bClyZXR1cm4gbltyXT1vLG5bc109YSx0KG4pO2lmKGM+MClvPU1hdGguZmxvb3Ioby9jKSpjLGE9TWF0aC5jZWlsKGEvYykqYztlbHNlIGlmKGM8MClvPU1hdGguY2VpbChvKmMpL2MsYT1NYXRoLmZsb29yKGEqYykvYztlbHNlIGJyZWFrO2w9Y31yZXR1cm4gaX0saX1mdW5jdGlvbiBzbSgpe3ZhciBpPU1OKCk7cmV0dXJuIGkuY29weT1mdW5jdGlvbigpe3JldHVybiBfTihpLHNtKCkpfSxIVS5hcHBseShpLGFyZ3VtZW50cyksVU4oaSl9ZnVuY3Rpb24gTk4oaSx0KXtyZXR1cm4gaS5tYXAoZT0+e2NvbnN0IG49W107bGV0IHI7cmV0dXJuIGUuZm9yRWFjaChzPT57aWYocil7Y29uc3Qgbz16cyhzLHIpKjE4MC9NYXRoLlBJO2lmKG8+dCl7Y29uc3QgYT1lUChyLHMpLGw9MS9NYXRoLmNlaWwoby90KTtsZXQgYz1sO2Zvcig7YzwxOyluLnB1c2goYShjKSksYys9bH19bi5wdXNoKHI9cyl9KSxufSl9ZnVuY3Rpb24gRk4oaSx7bWluTG5nOnQsbWF4TG5nOmUsbWluTGF0Om4sbWF4TGF0OnJ9PXt9KXtjb25zdCBzPU1hdGgucm91bmQob28oMzYwL2ksMikvTWF0aC5QSSksbz0oMStNYXRoLnNxcnQoNSkpLzIsYT1kPT5kL28qMzYwJTM2MC0xODAsbD1kPT5NYXRoLmFjb3MoMipkL3MtMSkvTWF0aC5QSSoxODAtOTAsYz1kPT5zKihNYXRoLmNvcygoZCs5MCkqTWF0aC5QSS8xODApKzEpLzIsdT1bciE9PXZvaWQgMD9NYXRoLmNlaWwoYyhyKSk6MCxuIT09dm9pZCAwP01hdGguZmxvb3IoYyhuKSk6cy0xXSxoPXQ9PT12b2lkIDAmJmU9PT12b2lkIDA/KCk9PiEwOnQ9PT12b2lkIDA/ZD0+ZDw9ZTplPT09dm9pZCAwP2Q9PmQ+PXQ6ZT49dD9kPT5kPj10JiZkPD1lOmQ9PmQ+PXR8fGQ8PWUsZj1bXTtmb3IobGV0IGQ9dVswXTtkPD11WzFdO2QrKyl7Y29uc3QgcD1hKGQpO2gocCkmJmYucHVzaChbcCxsKGQpXSl9cmV0dXJuIGZ9ZnVuY3Rpb24gb20oaSx0LGU9ITEpe3JldHVybiBlP3RQKHQsaSk6eVUoaSx0KX1mdW5jdGlvbiBPTihpLHQpe2NvbnN0IGU9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOml9LFtbbixyXSxbcyxvXV09cHYoZSk7aWYoTWF0aC5taW4oTWF0aC5hYnMocy1uKSxNYXRoLmFicyhvLXIpKTx0KXJldHVybltdO2NvbnN0IGE9bj5zfHxvPj04OXx8cjw9LTg5O3JldHVybiBGTih0LHttaW5Mbmc6bixtYXhMbmc6cyxtaW5MYXQ6cixtYXhMYXQ6b30pLmZpbHRlcihsPT5vbShsLGUsYSkpfWZ1bmN0aW9uIEJOKGkse3Jlc29sdXRpb246dD0xLzAsYmJveDplfT17fSl7Y29uc3Qgbj1OTihpLHQpLHI9Y2Eobikscz1PTihpLHQpLG89Wy4uLnIsLi4uc10sYT17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6aX0sW1tsLGNdLFt1LGhdXT1wdihhKSxmPWw+dXx8aD49ODl8fGM8PS04OTtsZXQgZD1bXTtpZihmKXtjb25zdCB4PVZVKG8pLnRyaWFuZ2xlcygpLHY9bmV3IE1hcChvLm1hcCgoW18sRV0sYik9PltgJHtffS0ke0V9YCxiXSkpO3guZmVhdHVyZXMuZm9yRWFjaChfPT57Y29uc3QgRT1fLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLnNsaWNlKDAsMykucmV2ZXJzZSgpLGI9W107aWYoRS5mb3JFYWNoKChbVCxQXSk9Pntjb25zdCB3PWAke1R9LSR7UH1gO3YuaGFzKHcpJiZiLnB1c2godi5nZXQodykpfSksYi5sZW5ndGg9PT0zKXtpZihiLnNvbWUoVD0+VDxyLmxlbmd0aCkpe2NvbnN0IFQ9Xy5wcm9wZXJ0aWVzLmNpcmN1bWNlbnRlcjtpZighb20oVCxhLGYpKXJldHVybn1kLnB1c2goLi4uYil9fSl9ZWxzZSBpZihzLmxlbmd0aCl7Y29uc3QgeD1QYS5mcm9tKG8pO2ZvcihsZXQgdj0wLF89eC50cmlhbmdsZXMubGVuZ3RoO3Y8Xzt2Kz0zKXtjb25zdCBFPVsyLDEsMF0ubWFwKFQ9PngudHJpYW5nbGVzW3YrVF0pLGI9RS5tYXAoVD0+b1tUXSk7aWYoRS5zb21lKFQ9PlQ8ci5sZW5ndGgpKXtjb25zdCBUPVswLDFdLm1hcChQPT54UihiLHc9PndbUF0pKTtpZighb20oVCxhLGYpKWNvbnRpbnVlfWQucHVzaCguLi5FKX19ZWxzZXtjb25zdHt2ZXJ0aWNlczp4LGhvbGVzOnY9W119PUZkLmZsYXR0ZW4obik7ZD1GZCh4LHYsMil9Y29uc3QgcD1zbShlP1tlWzBdLGVbMl1dOlZjKG8seD0+eFswXSksWzAsMV0pLHk9c20oZT9bZVsxXSxlWzNdXTpWYyhvLHg9PnhbMV0pLFswLDFdKSxtPW8ubWFwKChbeCx2XSk9PltwKHgpLHkodildKTtyZXR1cm57Y29udG91cjpuLHRyaWFuZ2xlczp7cG9pbnRzOm8saW5kaWNlczpkLHV2czptfX19Y29uc3QgZFM9bmV3IE50KCkuc2V0QXR0cmlidXRlPyJzZXRBdHRyaWJ1dGUiOiJhZGRBdHRyaWJ1dGUiO2Z1bmN0aW9uIGFoKGksdCxlLG4pe2NvbnN0IHI9aS5tYXAocz0+cy5tYXAoKFtvLGFdKT0+e2lmKG4pe2NvbnN0W2wsY109bihbbyxhXSk7cmV0dXJuW2wsLWMsdF19cmV0dXJuIGU/bFIobyxhLHQpOltvLGEsdF19KSk7cmV0dXJuIEZkLmZsYXR0ZW4ocil9ZnVuY3Rpb24gek4oaSx0LGUsbixyKXtjb25zdHt2ZXJ0aWNlczpzLGhvbGVzOm99PWFoKGksdCxuLHIpLHt2ZXJ0aWNlczphfT1haChpLGUsbixyKSxsPWNhKFthLHNdKSxjPU1hdGgucm91bmQoYS5sZW5ndGgvMyksdT1uZXcgU2V0KG8pO2xldCBoPTA7Y29uc3QgZj1bXTtmb3IobGV0IHA9MDtwPGM7cCsrKXtsZXQgeT1wKzE7aWYoeT09PWMpeT1oO2Vsc2UgaWYodS5oYXMoeSkpe2NvbnN0IG09eTt5PWgsaD1tfWYucHVzaChwLHArYyx5K2MpLGYucHVzaCh5K2MseSxwKX1jb25zdCBkPVtdO2ZvcihsZXQgcD0xO3A+PTA7cC0tKWZvcihsZXQgeT0wO3k8Yzt5Kz0xKWQucHVzaCh5LyhjLTEpLHApO3JldHVybntpbmRpY2VzOmYsdmVydGljZXM6bCx1dnM6ZCx0b3BWZXJ0czphfX1mdW5jdGlvbiBwUyhpLHQsZSxuLHIscyl7cmV0dXJue2luZGljZXM6bj9pLmluZGljZXM6aS5pbmRpY2VzLnNsaWNlKCkucmV2ZXJzZSgpLHZlcnRpY2VzOmFoKFtpLnBvaW50c10sdCxyLHMpLnZlcnRpY2VzLHV2czplfX1jb25zdCBtUz0oe3BvbHlnb25HZW9Kc29uOmksc3RhcnRIZWlnaHQ6dCxlbmRIZWlnaHQ6ZSxjdXJ2YXR1cmVSZXNvbHV0aW9uOm49MSxjYXJ0ZXNpYW46cj0hMCxoYXNTaWRlOnM9ITAsaGFzQm90dG9tOm89ITEsaGFzVG9wOmE9ITEscHJvamVjdGlvbjpsLGJib3g6Y30pPT57aS5mb3JFYWNoKGc9PntuVShnKXx8Zy5yZXZlcnNlKCl9KTtjb25zdHtjb250b3VyOnUsdHJpYW5nbGVzOmh9PUJOKGkse3Jlc29sdXRpb246bixiYm94OmN9KTtsZXQgZj17fSxkO3MmJihmPXpOKHUsdCE9bnVsbD90OmUsZSE9bnVsbD9lOnQscixsKSxkPWYudG9wVmVydHMpO2xldCBwPVtdOyhvfHxhKSYmKHA9Y2EoaC51dnMpKTtsZXQgeT17fTtvJiYoeT1wUyhoLHQscCwhMSxyLGwpKTtsZXQgbT17fTtyZXR1cm4gYSYmKG09cFMoaCxlLHAsITAscixsKSkse2NvbnRvdXI6dSx0cmlhbmdsZXM6aCxzaWRlVG9yc286Zixib3R0b21DYXA6eSx0b3BDYXA6bSx0b3BWZXJ0czpkfX07Y2xhc3Mga04gZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcih0LGU9e30pe3N1cGVyKCksdGhpcy50eXBlPSJQb2x5Z29uQnVmZmVyR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz1PaSh7cG9seWdvbkdlb0pzb246dCxzdGFydEhlaWdodDowLGVuZEhlaWdodDoxLGhhc1RvcDohMCxoYXNCb3R0b206ITAsaGFzU2lkZTohMCxjdXJ2YXR1cmVSZXNvbHV0aW9uOjEsY2FydGVzaWFuOiEwLHVzZXJEYXRhUnNvT2Zmc2V0OjB9LGUpO2NvbnN0e2VuZEhlaWdodDpuLGhhc1RvcDpyLGhhc0JvdHRvbTpzLGhhc1NpZGU6byxjYXJ0ZXNpYW46YSx1c2VyRGF0YVJzb09mZnNldDpsLHByb2plY3Rpb246Y309dGhpcy5wYXJhbWV0ZXJzLHtjb250b3VyOnUsc2lkZVRvcnNvOmgsdG9wVmVydHM6Zixib3R0b21DYXA6ZCx0b3BDYXA6cH09bVMoT2koe30sdGhpcy5wYXJhbWV0ZXJzKSk7bGV0IHk9W10sbT1bXSxnPVtdLHg9MDtjb25zdCB2PV89Pntjb25zdCBFPU1hdGgucm91bmQoeS5sZW5ndGgvMyksYj1nLmxlbmd0aDt5PXkuY29uY2F0KF8udmVydGljZXMpLG09bS5jb25jYXQoXy51dnMpLGc9Zy5jb25jYXQoRT9fLmluZGljZXMubWFwKFQ9PlQrRSk6Xy5pbmRpY2VzKSx0aGlzLmFkZEdyb3VwKGIsZy5sZW5ndGgtYix4KyspfTtvJiYodihoKSx0aGlzLnVzZXJEYXRhLnRvcFZlcnRzPWw/YWgodSxuK2wsYSxjKS52ZXJ0aWNlczpmKSxzJiZ2KGQpLHImJnYocCksdGhpcy5zZXRJbmRleChnKSx0aGlzW2RTXSgicG9zaXRpb24iLG5ldyBTdCh5LDMpKSx0aGlzW2RTXSgidXYiLG5ldyBTdChtLDIpKSx0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl9fXZhciBHTj1pPT57Y29uc3QgYT1pLHtjb29yZGluYXRlOnQsc3RhcnRIZWlnaHQ6ZSxoZWlnaHQ6bn09YSxyPUVTKGEsWyJjb29yZGluYXRlIiwic3RhcnRIZWlnaHQiLCJoZWlnaHQiXSk7bGV0IHM9ZXx8MDtyZXR1cm4gdHlwZW9mIGUhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbiE9InVuZGVmaW5lZCImJihzPWUrbiksbmV3IGtOKFt0XSxoaChPaSh7fSxyKSx7c3RhcnRIZWlnaHQ6ZSxlbmRIZWlnaHQ6c30pKX07dVIoe2V4dHJ1ZGVQb2x5Z29uOnhQLGxpbmU6YlAsbGluZTI6QVAsY29uaWNQb2x5Z29uOih7Y29vcmRpbmF0ZXNBcnI6aSxzdGFydDp0LGRlcHRoOmUsdXNlR3JvdXBzOm4saGFzVG9wOnIsaGFzQm90dG9tOnMsaGFzU2lkZTpvLGNhcnRlc2lhbjphLHByb2plY3Rpb246bCxjdXJ2YXR1cmVSZXNvbHV0aW9uOmMsYmJveDp1LGJib3hPZmZzZXQ6aH0pPT57Y29uc3QgZj1sJiZtYShsKTtpZihmJiYoYT0hMSx1JiZoKSl7bGV0IHA9ZihbdVswXSx1WzFdXSkseT1mKFt1WzJdLHVbM11dKTtwWzFdPS1wWzFdLHlbMV09LXlbMV0scFswXSs9aFswXSxwWzFdKz1oWzFdLHlbMF0rPWhbMl0seVsxXSs9aFszXSxwPWYuaW52ZXJ0KFtwWzBdLC1wWzFdXSl8fHAseT1mLmludmVydChbeVswXSwteVsxXV0pfHx5LHU9W3BbMF0scFsxXSx5WzBdLHlbMV1dfXR8fCh0PVswXSk7Y29uc3QgZD1pLm1hcCgocCx5KT0+e3ZhciBtLGc7cmV0dXJuIEdOKHtjb29yZGluYXRlOnAscHJvamVjdGlvbjpmLHN0YXJ0SGVpZ2h0OihtPXRbeV0pIT1udWxsP206dFswXSxoZWlnaHQ6KGc9ZVt5XSkhPW51bGw/ZzplWzBdLGhhc1RvcDpyIT1udWxsP3I6ITAsaGFzQm90dG9tOnMhPW51bGw/czohMCxoYXNTaWRlOm8hPW51bGw/bzohMCxjYXJ0ZXNpYW46YSE9bnVsbD9hOiEwLGN1cnZhdHVyZVJlc29sdXRpb246YyE9bnVsbD9jOjEsYmJveDp1fSl9KTtyZXR1cm4gZ2EoZCxuKX0sY29uaWNMaW5lOih7Y29vcmRpbmF0ZXNBcnI6aSxsaW5lV2lkdGg6dCxzdGFydDplLHVzZUdyb3VwczpufSk9Pntjb25zdCBzPWkubWFwKChvLGEpPT57dmFyIGw7cmV0dXJuIG1TKHtwb2x5Z29uR2VvSnNvbjpbb10sc3RhcnRIZWlnaHQ6KGw9ZVthXSkhPW51bGw/bDplWzBdfSkudG9wVmVydHN9KS5tYXAoKG8sYSk9Pnt2YXIgYztjb25zdCBsPShjPXRbYV0pIT1udWxsP2M6dFswXTtyZXR1cm4gcXYoe25vZGVzOm8sc2V0UG9pbnRXaWR0aDooKT0+bH0pfSk7cmV0dXJuIGdhKHMsbil9fSl9KSgpOwo=", Lk = (s) => Uint8Array.from(atob(s), (t) => t.charCodeAt(0)), BX = typeof window != "undefined" && window.Blob && new Blob([Lk(wf)], { type: "text/javascript;charset=utf-8" });
|
|
@@ -40388,7 +40403,7 @@ function ra(s) {
|
|
|
40388
40403
|
const t = new jt();
|
|
40389
40404
|
return t.color.setScalar(s), t;
|
|
40390
40405
|
}
|
|
40391
|
-
const Kf = "0.19.
|
|
40406
|
+
const Kf = "0.19.14";
|
|
40392
40407
|
class Fk {
|
|
40393
40408
|
constructor() {
|
|
40394
40409
|
A(this, "event", new ey());
|
|
@@ -43014,17 +43029,16 @@ const tz = Be(vt({}, Ml), {
|
|
|
43014
43029
|
}
|
|
43015
43030
|
handlePickTest() {
|
|
43016
43031
|
return ht(this, null, function* () {
|
|
43017
|
-
|
|
43018
|
-
|
|
43019
|
-
"down",
|
|
43020
|
-
|
|
43021
|
-
|
|
43022
|
-
|
|
43023
|
-
|
|
43024
|
-
|
|
43025
|
-
|
|
43026
|
-
|
|
43027
|
-
);
|
|
43032
|
+
var e;
|
|
43033
|
+
this.playing || (e = this.mapArea) == null || e.forEach((i) => {
|
|
43034
|
+
i.onPointerEvent("down", (n) => ht(this, null, function* () {
|
|
43035
|
+
this.caId = n.userData.ISO_A2 || n.userData.adcode;
|
|
43036
|
+
const l = this.mapLine.find(
|
|
43037
|
+
(c) => c.userData.ISO_A2 === this.caId || c.userData.adcode === this.caId
|
|
43038
|
+
), o = n.object3d.material[0].color.getHexString();
|
|
43039
|
+
this.settings["测试板块颜色.color:::caId"] = "#" + o, yield this.settings["测试板块颜色.color:::caId"], this.settings["测试边框颜色.color:::caId"] = "#" + (l == null ? void 0 : l.material.color.getHexString()), yield this.settings["测试边框颜色.color:::caId"], this.settings["测试边框宽度:::caId"] = l == null ? void 0 : l.material.lineWidth, yield this.settings["测试边框宽度:::caId"], this.emit("settingsChanged");
|
|
43040
|
+
}));
|
|
43041
|
+
});
|
|
43028
43042
|
});
|
|
43029
43043
|
}
|
|
43030
43044
|
hide() {
|