51 lines
2.6 MiB
51 lines
2.6 MiB
<!-- Saved from local source at 2025-10-22T15:01:16Z using monolith v2.10.1 -->
|
|
<!DOCTYPE html><html><head>
|
|
<style type="text/css">
|
|
|
|
body{
|
|
background: #555;
|
|
height: 100%;
|
|
margin: 0;
|
|
overflow: hidden;
|
|
padding: 0;
|
|
width: 100%;
|
|
}
|
|
|
|
img#btn_play:hover {
|
|
opacity: 1;
|
|
}
|
|
img#btn_play {
|
|
position: fixed;
|
|
top: 50%;
|
|
left: 50%;
|
|
width:30.000002%;
|
|
max-width:400px;
|
|
transform: translate(-50%,-50%);
|
|
cursor: pointer;
|
|
opacity: 0.6;
|
|
transition: 0.3s;
|
|
z-index: 999;
|
|
}
|
|
|
|
</style>
|
|
<script type="module" crossorigin="" src="data:text/javascript;;base64,dmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKdmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7CiAgZm9yICh2YXIgbmFtZSBpbiBhbGwpCiAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7CiAgICAgIGdldDogYWxsW25hbWVdLAogICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgIHNldDogKG5ld1ZhbHVlKSA9PiBhbGxbbmFtZV0gPSAoKSA9PiBuZXdWYWx1ZQogICAgfSk7Cn07CnZhciBfX2VzbSA9IChmbiwgcmVzKSA9PiAoKSA9PiAoZm4gJiYgKHJlcyA9IGZuKGZuID0gMCkpLCByZXMpOwoKLy8gbm9kZV9tb2R1bGVzL3RocmVlL2J1aWxkL3RocmVlLmNvcmUuanMKY2xhc3MgRXZlbnREaXNwYXRjaGVyIHsKICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICBpZiAodGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQpCiAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9OwogICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzOwogICAgaWYgKGxpc3RlbmVyc1t0eXBlXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGxpc3RlbmVyc1t0eXBlXSA9IFtdOwogICAgfQogICAgaWYgKGxpc3RlbmVyc1t0eXBlXS5pbmRleE9mKGxpc3RlbmVyKSA9PT0gLTEpIHsKICAgICAgbGlzdGVuZXJzW3R5cGVdLnB1c2gobGlzdGVuZXIpOwogICAgfQogIH0KICBoYXNFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7CiAgICBpZiAobGlzdGVuZXJzID09PSB1bmRlZmluZWQpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBsaXN0ZW5lcnNbdHlwZV0gIT09IHVuZGVmaW5lZCAmJiBsaXN0ZW5lcnNbdHlwZV0uaW5kZXhPZihsaXN0ZW5lcikgIT09IC0xOwogIH0KICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7CiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7CiAgICBpZiAobGlzdGVuZXJzID09PSB1bmRlZmluZWQpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbdHlwZV07CiAgICBpZiAobGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnN0IGluZGV4ID0gbGlzdGVuZXJBcnJheS5pbmRleE9mKGxpc3RlbmVyKTsKICAgICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICAgIGxpc3RlbmVyQXJyYXkuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgfQogICAgfQogIH0KICBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7CiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7CiAgICBpZiAobGlzdGVuZXJzID09PSB1bmRlZmluZWQpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbZXZlbnQudHlwZV07CiAgICBpZiAobGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGV2ZW50LnRhcmdldCA9IHRoaXM7CiAgICAgIGNvbnN0IGFycmF5ID0gbGlzdGVuZXJBcnJheS5zbGljZSgwKTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgIGFycmF5W2ldLmNhbGwodGhpcywgZXZlbnQpOwogICAgICB9CiAgICAgIGV2ZW50LnRhcmdldCA9IG51bGw7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGdlbmVyYXRlVVVJRCgpIHsKICBjb25zdCBkMCA9IE1hdGgucmFuZG9tKCkgKiA0Mjk0OTY3Mjk1IHwgMDsKICBjb25zdCBkMSA9IE1hdGgucmFuZG9tKCkgKiA0Mjk0OTY3Mjk1IHwgMDsKICBjb25zdCBkMiA9IE1hdGgucmFuZG9tKCkgKiA0Mjk0OTY3Mjk1IHwgMDsKICBjb25zdCBkMyA9IE1hdGgucmFuZG9tKCkgKiA0Mjk0OTY3Mjk1IHwgMDsKICBjb25zdCB1dWlkID0gX2x1dFtkMCAmIDI1NV0gKyBfbHV0W2QwID4+IDggJiAyNTVdICsgX2x1dFtkMCA+PiAxNiAmIDI1NV0gKyBfbHV0W2QwID4+IDI0ICYgMjU1XSArICItIiArIF9sdXRbZDEgJiAyNTVdICsgX2x1dFtkMSA+PiA4ICYgMjU1XSArICItIiArIF9sdXRbZDEgPj4gMTYgJiAxNSB8IDY0XSArIF9sdXRbZDEgPj4gMjQgJiAyNTVdICsgIi0iICsgX2x1dFtkMiAmIDYzIHwgMTI4XSArIF9sdXRbZDIgPj4gOCAmIDI1NV0gKyAiLSIgKyBfbHV0W2QyID4+IDE2ICYgMjU1XSArIF9sdXRbZDIgPj4gMjQgJiAyNTVdICsgX2x1dFtkMyAmIDI1NV0gKyBfbHV0W2QzID4+IDggJiAyNTVdICsgX2x1dFtkMyA+PiAxNiAmIDI1NV0gKyBfbHV0W2QzID4+IDI0ICYgMjU1XTsKICByZXR1cm4gdXVpZC50b0xvd2VyQ2FzZSgpOwp9CmZ1bmN0aW9uIGNsYW1wKHZhbHVlLCBtaW4sIG1heCkgewogIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsdWUpKTsKfQpmdW5jdGlvbiBldWNsaWRlYW5Nb2R1bG8obiwgbSkgewogIHJldHVybiAobiAlIG0gKyBtKSAlIG07Cn0KZnVuY3Rpb24gbWFwTGluZWFyKHgsIGExLCBhMiwgYjEsIGIyKSB7CiAgcmV0dXJuIGIxICsgKHggLSBhMSkgKiAoYjIgLSBiMSkgLyAoYTIgLSBhMSk7Cn0KZnVuY3Rpb24gaW52ZXJzZUxlcnAoeCwgeSwgdmFsdWUpIHsKICBpZiAoeCAhPT0geSkgewogICAgcmV0dXJuICh2YWx1ZSAtIHgpIC8gKHkgLSB4KTsKICB9IGVsc2UgewogICAgcmV0dXJuIDA7CiAgfQp9CmZ1bmN0aW9uIGxlcnAoeCwgeSwgdCkgewogIHJldHVybiAoMSAtIHQpICogeCArIHQgKiB5Owp9CmZ1bmN0aW9uIGRhbXAoeCwgeSwgbGFtYmRhLCBkdCkgewogIHJldHVybiBsZXJwKHgsIHksIDEgLSBNYXRoLmV4cCgtbGFtYmRhICogZHQpKTsKfQpmdW5jdGlvbiBwaW5ncG9uZyh4LCBsZW5ndGggPSAxKSB7CiAgcmV0dXJuIGxlbmd0aCAtIE1hdGguYWJzKGV1Y2xpZGVhbk1vZHVsbyh4LCBsZW5ndGggKiAyKSAtIGxlbmd0aCk7Cn0KZnVuY3Rpb24gc21vb3Roc3RlcCh4LCBtaW4sIG1heCkgewogIGlmICh4IDw9IG1pbikKICAgIHJldHVybiAwOwogIGlmICh4ID49IG1heCkKICAgIHJldHVybiAxOwogIHggPSAoeCAtIG1pbikgLyAobWF4IC0gbWluKTsKICByZXR1cm4geCAqIHggKiAoMyAtIDIgKiB4KTsKfQpmdW5jdGlvbiBzbW9vdGhlcnN0ZXAoeCwgbWluLCBtYXgpIHsKICBpZiAoeCA8PSBtaW4pCiAgICByZXR1cm4gMDsKICBpZiAoeCA+PSBtYXgpCiAgICByZXR1cm4gMTsKICB4ID0gKHggLSBtaW4pIC8gKG1heCAtIG1pbik7CiAgcmV0dXJuIHggKiB4ICogeCAqICh4ICogKHggKiA2IC0gMTUpICsgMTApOwp9CmZ1bmN0aW9uIHJhbmRJbnQobG93LCBoaWdoKSB7CiAgcmV0dXJuIGxvdyArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93ICsgMSkpOwp9CmZ1bmN0aW9uIHJhbmRGbG9hdChsb3csIGhpZ2gpIHsKICByZXR1cm4gbG93ICsgTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KTsKfQpmdW5jdGlvbiByYW5kRmxvYXRTcHJlYWQocmFuZ2UpIHsKICByZXR1cm4gcmFuZ2UgKiAoMC41IC0gTWF0aC5yYW5kb20oKSk7Cn0KZnVuY3Rpb24gc2VlZGVkUmFuZG9tKHMpIHsKICBpZiAocyAhPT0gdW5kZWZpbmVkKQogICAgX3NlZWQgPSBzOwogIGxldCB0ID0gX3NlZWQgKz0gMTgzMTU2NTgxMzsKICB0ID0gTWF0aC5pbXVsKHQgXiB0ID4+PiAxNSwgdCB8IDEpOwogIHQgXj0gdCArIE1hdGguaW11bCh0IF4gdCA+Pj4gNywgdCB8IDYxKTsKICByZXR1cm4gKCh0IF4gdCA+Pj4gMTQpID4+PiAwKSAvIDQyOTQ5NjcyOTY7Cn0KZnVuY3Rpb24gZGVnVG9SYWQoZGVncmVlcykgewogIHJldHVybiBkZWdyZWVzICogREVHMlJBRDsKfQpmdW5jdGlvbiByYWRUb0RlZyhyYWRpYW5zKSB7CiAgcmV0dXJuIHJhZGlhbnMgKiBSQUQyREVHOwp9CmZ1bmN0aW9uIGlzUG93ZXJPZlR3byh2YWx1ZSkgewogIHJldHVybiAodmFsdWUgJiB2YWx1ZSAtIDEpID09PSAwICYmIHZhbHVlICE9PSAwOwp9CmZ1bmN0aW9uIGNlaWxQb3dlck9mVHdvKHZhbHVlKSB7CiAgcmV0dXJuIE1hdGgucG93KDIsIE1hdGguY2VpbChNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMikpOwp9CmZ1bmN0aW9uIGZsb29yUG93ZXJPZlR3byh2YWx1ZSkgewogIHJldHVybiBNYXRoLnBvdygyLCBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKSk7Cn0KZnVuY3Rpb24gc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcihxLCBhLCBiLCBjLCBvcmRlcikgewogIGNvbnN0IGNvcyA9IE1hdGguY29zOwogIGNvbnN0IHNpbiA9IE1hdGguc2luOwogIGNvbnN0IGMyID0gY29zKGIgLyAyKTsKICBjb25zdCBzMiA9IHNpbihiIC8gMik7CiAgY29uc3QgYzEzID0gY29zKChhICsgYykgLyAyKTsKICBjb25zdCBzMTMgPSBzaW4oKGEgKyBjKSAvIDIpOwogIGNvbnN0IGMxXzMgPSBjb3MoKGEgLSBjKSAvIDIpOwogIGNvbnN0IHMxXzMgPSBzaW4oKGEgLSBjKSAvIDIpOwogIGNvbnN0IGMzXzEgPSBjb3MoKGMgLSBhKSAvIDIpOwogIGNvbnN0IHMzXzEgPSBzaW4oKGMgLSBhKSAvIDIpOwogIHN3aXRjaCAob3JkZXIpIHsKICAgIGNhc2UgIlhZWCI6CiAgICAgIHEuc2V0KGMyICogczEzLCBzMiAqIGMxXzMsIHMyICogczFfMywgYzIgKiBjMTMpOwogICAgICBicmVhazsKICAgIGNhc2UgIllaWSI6CiAgICAgIHEuc2V0KHMyICogczFfMywgYzIgKiBzMTMsIHMyICogYzFfMywgYzIgKiBjMTMpOwogICAgICBicmVhazsKICAgIGNhc2UgIlpYWiI6CiAgICAgIHEuc2V0KHMyICogYzFfMywgczIgKiBzMV8zLCBjMiAqIHMxMywgYzIgKiBjMTMpOwogICAgICBicmVhazsKICAgIGNhc2UgIlhaWCI6CiAgICAgIHEuc2V0KGMyICogczEzLCBzMiAqIHMzXzEsIHMyICogYzNfMSwgYzIgKiBjMTMpOwogICAgICBicmVhazsKICAgIGNhc2UgIllYWSI6CiAgICAgIHEuc2V0KHMyICogYzNfMSwgYzIgKiBzMTMsIHMyICogczNfMSwgYzIgKiBjMTMpOwogICAgICBicmVhazsKICAgIGNhc2UgIlpZWiI6CiAgICAgIHEuc2V0KHMyICogczNfMSwgczIgKiBjM18xLCBjMiAqIHMxMywgYzIgKiBjMTMpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuTWF0aFV0aWxzOiAuc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIgKyBvcmRlcik7CiAgfQp9CmZ1bmN0aW9uIGRlbm9ybWFsaXplKHZhbHVlLCBhcnJheSkgewogIHN3aXRjaCAoYXJyYXkuY29uc3RydWN0b3IpIHsKICAgIGNhc2UgRmxvYXQzMkFycmF5OgogICAgICByZXR1cm4gdmFsdWU7CiAgICBjYXNlIFVpbnQzMkFycmF5OgogICAgICByZXR1cm4gdmFsdWUgLyA0Mjk0OTY3Mjk1OwogICAgY2FzZSBVaW50MTZBcnJheToKICAgICAgcmV0dXJuIHZhbHVlIC8gNjU1MzU7CiAgICBjYXNlIFVpbnQ4QXJyYXk6CiAgICAgIHJldHVybiB2YWx1ZSAvIDI1NTsKICAgIGNhc2UgSW50MzJBcnJheToKICAgICAgcmV0dXJuIE1hdGgubWF4KHZhbHVlIC8gMjE0NzQ4MzY0NywgLTEpOwogICAgY2FzZSBJbnQxNkFycmF5OgogICAgICByZXR1cm4gTWF0aC5tYXgodmFsdWUgLyAzMjc2NywgLTEpOwogICAgY2FzZSBJbnQ4QXJyYXk6CiAgICAgIHJldHVybiBNYXRoLm1heCh2YWx1ZSAvIDEyNywgLTEpOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCB0eXBlLiIpOwogIH0KfQpmdW5jdGlvbiBub3JtYWxpemUodmFsdWUsIGFycmF5KSB7CiAgc3dpdGNoIChhcnJheS5jb25zdHJ1Y3RvcikgewogICAgY2FzZSBGbG9hdDMyQXJyYXk6CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIGNhc2UgVWludDMyQXJyYXk6CiAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlICogNDI5NDk2NzI5NSk7CiAgICBjYXNlIFVpbnQxNkFycmF5OgogICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIDY1NTM1KTsKICAgIGNhc2UgVWludDhBcnJheToKICAgICAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUgKiAyNTUpOwogICAgY2FzZSBJbnQzMkFycmF5OgogICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIDIxNDc0ODM2NDcpOwogICAgY2FzZSBJbnQxNkFycmF5OgogICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIDMyNzY3KTsKICAgIGNhc2UgSW50OEFycmF5OgogICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIDEyNyk7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHR5cGUuIik7CiAgfQp9CgpjbGFzcyBNYXRyaXgzIHsKICBjb25zdHJ1Y3RvcihuMTEsIG4xMiwgbjEzLCBuMjEsIG4yMiwgbjIzLCBuMzEsIG4zMiwgbjMzKSB7CiAgICBNYXRyaXgzLnByb3RvdHlwZS5pc01hdHJpeDMgPSB0cnVlOwogICAgdGhpcy5lbGVtZW50cyA9IFsKICAgICAgMSwKICAgICAgMCwKICAgICAgMCwKICAgICAgMCwKICAgICAgMSwKICAgICAgMCwKICAgICAgMCwKICAgICAgMCwKICAgICAgMQogICAgXTsKICAgIGlmIChuMTEgIT09IHVuZGVmaW5lZCkgewogICAgICB0aGlzLnNldChuMTEsIG4xMiwgbjEzLCBuMjEsIG4yMiwgbjIzLCBuMzEsIG4zMiwgbjMzKTsKICAgIH0KICB9CiAgc2V0KG4xMSwgbjEyLCBuMTMsIG4yMSwgbjIyLCBuMjMsIG4zMSwgbjMyLCBuMzMpIHsKICAgIGNvbnN0IHRlID0gdGhpcy5lbGVtZW50czsKICAgIHRlWzBdID0gbjExOwogICAgdGVbMV0gPSBuMjE7CiAgICB0ZVsyXSA9IG4zMTsKICAgIHRlWzNdID0gbjEyOwogICAgdGVbNF0gPSBuMjI7CiAgICB0ZVs1XSA9IG4zMjsKICAgIHRlWzZdID0gbjEzOwogICAgdGVbN10gPSBuMjM7CiAgICB0ZVs4XSA9IG4zMzsKICAgIHJldHVybiB0aGlzOwogIH0KICBpZGVudGl0eSgpIHsKICAgIHRoaXMuc2V0KDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGNvcHkobSkgewogICAgY29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzOwogICAgY29uc3QgbWUgPSBtLmVsZW1lbnRzOwogICAgdGVbMF0gPSBtZVswXTsKICAgIHRlWzFdID0gbWVbMV07CiAgICB0ZVsyXSA9IG1lWzJdOwogICAgdGVbM10gPSBtZVszXTsKICAgIHRlWzRdID0gbWVbNF07CiAgICB0ZVs1XSA9IG1lWzVdOwogICAgdGVbNl0gPSBtZVs2XTsKICAgIHRlWzddID0gbWVbN107CiAgICB0ZVs4XSA9IG1lWzhdOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGV4dHJhY3RCYXNpcyh4QXhpcywgeUF4aXMsIHpBeGlzKSB7CiAgICB4QXhpcy5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLCAwKTsKICAgIHlBeGlzLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsIDEpOwogICAgekF4aXMuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywgMik7CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2V0RnJvbU1hdHJpeDQobSkgewogICAgY29uc3QgbWUgPSBtLmVsZW1lbnRzOwogICAgdGhpcy5zZXQobWVbMF0sIG1lWzRdLCBtZVs4XSwgbWVbMV0sIG1lWzVdLCBtZVs5XSwgbWVbMl0sIG1lWzZdLCBtZVsxMF0pOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIG11bHRpcGx5KG0pIHsKICAgIHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcywgbSk7CiAgfQogIHByZW11bHRpcGx5KG0pIHsKICAgIHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMobSwgdGhpcyk7CiAgfQogIG11bHRpcGx5TWF0cmljZXMoYSwgYikgewogICAgY29uc3QgYWUgPSBhLmVsZW1lbnRzOwogICAgY29uc3QgYmUgPSBiLmVsZW1lbnRzOwogICAgY29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzOwogICAgY29uc3QgYTExID0gYWVbMF0sIGExMiA9IGFlWzNdLCBhMTMgPSBhZVs2XTsKICAgIGNvbnN0IGEyMSA9IGFlWzFdLCBhMjIgPSBhZVs0XSwgYTIzID0gYWVbN107CiAgICBjb25zdCBhMzEgPSBhZVsyXSwgYTMyID0gYWVbNV0sIGEzMyA9IGFlWzhdOwogICAgY29uc3QgYjExID0gYmVbMF0sIGIxMiA9IGJlWzNdLCBiMTMgPSBiZVs2XTsKICAgIGNvbnN0IGIyMSA9IGJlWzFdLCBiMjIgPSBiZVs0XSwgYjIzID0gYmVbN107CiAgICBjb25zdCBiMzEgPSBiZVsyXSwgYjMyID0gYmVbNV0sIGIzMyA9IGJlWzhdOwogICAgdGVbMF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzE7CiAgICB0ZVszXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMjsKICAgIHRlWzZdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzOwogICAgdGVbMV0gPSBhMjEgKiBiMTEgKyBhMjIgKiBiMjEgKyBhMjMgKiBiMzE7CiAgICB0ZVs0XSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMjsKICAgIHRlWzddID0gYTIxICogYjEzICsgYTIyICogYjIzICsgYTIzICogYjMzOwogICAgdGVbMl0gPSBhMzEgKiBiMTEgKyBhMzIgKiBiMjEgKyBhMzMgKiBiMzE7CiAgICB0ZVs1XSA9IGEzMSAqIGIxMiArIGEzMiAqIGIyMiArIGEzMyAqIGIzMjsKICAgIHRlWzhdID0gYTMxICogYjEzICsgYTMyICogYjIzICsgYTMzICogYjMzOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIG11bHRpcGx5U2NhbGFyKHMpIHsKICAgIGNvbnN0IHRlID0gdGhpcy5lbGVtZW50czsKICAgIHRlWzBdICo9IHM7CiAgICB0ZVszXSAqPSBzOwogICAgdGVbNl0gKj0gczsKICAgIHRlWzFdICo9IHM7CiAgICB0ZVs0XSAqPSBzOwogICAgdGVbN10gKj0gczsKICAgIHRlWzJdICo9IHM7CiAgICB0ZVs1XSAqPSBzOwogICAgdGVbOF0gKj0gczsKICAgIHJldHVybiB0aGlzOwogIH0KICBkZXRlcm1pbmFudCgpIHsKICAgIGNvbnN0IHRlID0gdGhpcy5lbGVtZW50czsKICAgIGNvbnN0IGEgPSB0ZVswXSwgYiA9IHRlWzFdLCBjID0gdGVbMl0sIGQgPSB0ZVszXSwgZSA9IHRlWzRdLCBmID0gdGVbNV0sIGcgPSB0ZVs2XSwgaCA9IHRlWzddLCBpID0gdGVbOF07CiAgICByZXR1cm4gYSAqIGUgKiBpIC0gYSAqIGYgKiBoIC0gYiAqIGQgKiBpICsgYiAqIGYgKiBnICsgYyAqIGQgKiBoIC0gYyAqIGUgKiBnOwogIH0KICBpbnZlcnQoKSB7CiAgICBjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHMsIG4xMSA9IHRlWzBdLCBuMjEgPSB0ZVsxXSwgbjMxID0gdGVbMl0sIG4xMiA9IHRlWzNdLCBuMjIgPSB0ZVs0XSwgbjMyID0gdGVbNV0sIG4xMyA9IHRlWzZdLCBuMjMgPSB0ZVs3XSwgbjMzID0gdGVbOF0sIHQxMSA9IG4zMyAqIG4yMiAtIG4zMiAqIG4yMywgdDEyID0gbjMyICogbjEzIC0gbjMzICogbjEyLCB0MTMgPSBuMjMgKiBuMTIgLSBuMjIgKiBuMTMsIGRldCA9IG4xMSAqIHQxMSArIG4yMSAqIHQxMiArIG4zMSAqIHQxMzsKICAgIGlmIChkZXQgPT09IDApCiAgICAgIHJldHVybiB0aGlzLnNldCgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKICAgIGNvbnN0IGRldEludiA9IDEgLyBkZXQ7CiAgICB0ZVswXSA9IHQxMSAqIGRldEludjsKICAgIHRlWzFdID0gKG4zMSAqIG4yMyAtIG4zMyAqIG4yMSkgKiBkZXRJbnY7CiAgICB0ZVsyXSA9IChuMzIgKiBuMjEgLSBuMzEgKiBuMjIpICogZGV0SW52OwogICAgdGVbM10gPSB0MTIgKiBkZXRJbnY7CiAgICB0ZVs0XSA9IChuMzMgKiBuMTEgLSBuMzEgKiBuMTMpICogZGV0SW52OwogICAgdGVbNV0gPSAobjMxICogbjEyIC0gbjMyICogbjExKSAqIGRldEludjsKICAgIHRlWzZdID0gdDEzICogZGV0SW52OwogICAgdGVbN10gPSAobjIxICogbjEzIC0gbjIzICogbjExKSAqIGRldEludjsKICAgIHRlWzhdID0gKG4yMiAqIG4xMSAtIG4yMSAqIG4xMikgKiBkZXRJbnY7CiAgICByZXR1cm4gdGhpczsKICB9CiAgdHJhbnNwb3NlKCkgewogICAgbGV0IHRtcDsKICAgIGNvbnN0IG0gPSB0aGlzLmVsZW1lbnRzOwogICAgdG1wID0gbVsxXTsKICAgIG1bMV0gPSBtWzNdOwogICAgbVszXSA9IHRtcDsKICAgIHRtcCA9IG1bMl07CiAgICBtWzJdID0gbVs2XTsKICAgIG1bNl0gPSB0bXA7CiAgICB0bXAgPSBtWzVdOwogICAgbVs1XSA9IG1bN107CiAgICBtWzddID0gdG1wOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGdldE5vcm1hbE1hdHJpeChtYXRyaXg0KSB7CiAgICByZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NChtYXRyaXg0KS5pbnZlcnQoKS50cmFuc3Bvc2UoKTsKICB9CiAgdHJhbnNwb3NlSW50b0FycmF5KHIpIHsKICAgIGNvbnN0IG0gPSB0aGlzLmVsZW1lbnRzOwogICAgclswXSA9IG1bMF07CiAgICByWzFdID0gbVszXTsKICAgIHJbMl0gPSBtWzZdOwogICAgclszXSA9IG1bMV07CiAgICByWzRdID0gbVs0XTsKICAgIHJbNV0gPSBtWzddOwogICAgcls2XSA9IG1bMl07CiAgICByWzddID0gbVs1XTsKICAgIHJbOF0gPSBtWzhdOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldFV2VHJhbnNmb3JtKHR4LCB0eSwgc3gsIHN5LCByb3RhdGlvbiwgY3gsIGN5KSB7CiAgICBjb25zdCBjID0gTWF0aC5jb3Mocm90YXRpb24pOwogICAgY29uc3QgcyA9IE1hdGguc2luKHJvdGF0aW9uKTsKICAgIHRoaXMuc2V0KHN4ICogYywgc3ggKiBzLCAtc3ggKiAoYyAqIGN4ICsgcyAqIGN5KSArIGN4ICsgdHgsIC1zeSAqIHMsIHN5ICogYywgLXN5ICogKC1zICogY3ggKyBjICogY3kpICsgY3kgKyB0eSwgMCwgMCwgMSk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2NhbGUoc3gsIHN5KSB7CiAgICB0aGlzLnByZW11bHRpcGx5KF9tMy5tYWtlU2NhbGUoc3gsIHN5KSk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgcm90YXRlKHRoZXRhKSB7CiAgICB0aGlzLnByZW11bHRpcGx5KF9tMy5tYWtlUm90YXRpb24oLXRoZXRhKSk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgdHJhbnNsYXRlKHR4LCB0eSkgewogICAgdGhpcy5wcmVtdWx0aXBseShfbTMubWFrZVRyYW5zbGF0aW9uKHR4LCB0eSkpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIG1ha2VUcmFuc2xhdGlvbih4LCB5KSB7CiAgICBpZiAoeC5pc1ZlY3RvcjIpIHsKICAgICAgdGhpcy5zZXQoMSwgMCwgeC54LCAwLCAxLCB4LnksIDAsIDAsIDEpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5zZXQoMSwgMCwgeCwgMCwgMSwgeSwgMCwgMCwgMSk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CiAgbWFrZVJvdGF0aW9uKHRoZXRhKSB7CiAgICBjb25zdCBjID0gTWF0aC5jb3ModGhldGEpOwogICAgY29uc3QgcyA9IE1hdGguc2luKHRoZXRhKTsKICAgIHRoaXMuc2V0KGMsIC1zLCAwLCBzLCBjLCAwLCAwLCAwLCAxKTsKICAgIHJldHVybiB0aGlzOwogIH0KICBtYWtlU2NhbGUoeCwgeSkgewogICAgdGhpcy5zZXQoeCwgMCwgMCwgMCwgeSwgMCwgMCwgMCwgMSk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgZXF1YWxzKG1hdHJpeCkgewogICAgY29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzOwogICAgY29uc3QgbWUgPSBtYXRyaXguZWxlbWVudHM7CiAgICBmb3IgKGxldCBpID0gMDtpIDwgOTsgaSsrKSB7CiAgICAgIGlmICh0ZVtpXSAhPT0gbWVbaV0pCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIGZyb21BcnJheShhcnJheSwgb2Zmc2V0ID0gMCkgewogICAgZm9yIChsZXQgaSA9IDA7aSA8IDk7IGkrKykgewogICAgICB0aGlzLmVsZW1lbnRzW2ldID0gYXJyYXlbaSArIG9mZnNldF07CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CiAgdG9BcnJheShhcnJheSA9IFtdLCBvZmZzZXQgPSAwKSB7CiAgICBjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7CiAgICBhcnJheVtvZmZzZXRdID0gdGVbMF07CiAgICBhcnJheVtvZmZzZXQgKyAxXSA9IHRlWzFdOwogICAgYXJyYXlbb2Zmc2V0ICsgMl0gPSB0ZVsyXTsKICAgIGFycmF5W29mZnNldCArIDNdID0gdGVbM107CiAgICBhcnJheVtvZmZzZXQgKyA0XSA9IHRlWzRdOwogICAgYXJyYXlbb2Zmc2V0ICsgNV0gPSB0ZVs1XTsKICAgIGFycmF5W29mZnNldCArIDZdID0gdGVbNl07CiAgICBhcnJheVtvZmZzZXQgKyA3XSA9IHRlWzddOwogICAgYXJyYXlbb2Zmc2V0ICsgOF0gPSB0ZVs4XTsKICAgIHJldHVybiBhcnJheTsKICB9CiAgY2xvbmUoKSB7CiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyk7CiAgfQp9CmZ1bmN0aW9uIGFycmF5TmVlZHNVaW50MzIoYXJyYXkpIHsKICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTtpID49IDA7IC0taSkgewogICAgaWYgKGFycmF5W2ldID49IDY1NTM1KQogICAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGdldFR5cGVkQXJyYXkodHlwZSwgYnVmZmVyKSB7CiAgcmV0dXJuIG5ldyBUWVBFRF9BUlJBWVNbdHlwZV0oYnVmZmVyKTsKfQpmdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMobmFtZSkgewogIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCBuYW1lKTsKfQpmdW5jdGlvbiBjcmVhdGVDYW52YXNFbGVtZW50KCkgewogIGNvbnN0IGNhbnZhcyA9IGNyZWF0ZUVsZW1lbnROUygiY2FudmFzIik7CiAgY2FudmFzLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOwogIHJldHVybiBjYW52YXM7Cn0KZnVuY3Rpb24gd2Fybk9uY2UobWVzc2FnZSkgewogIGlmIChtZXNzYWdlIGluIF9jYWNoZSkKICAgIHJldHVybjsKICBfY2FjaGVbbWVzc2FnZV0gPSB0cnVlOwogIGNvbnNvbGUud2FybihtZXNzYWdlKTsKfQpmdW5jdGlvbiBwcm9iZUFzeW5jKGdsLCBzeW5jLCBpbnRlcnZhbCkgewogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgIGZ1bmN0aW9uIHByb2JlKCkgewogICAgICBzd2l0Y2ggKGdsLmNsaWVudFdhaXRTeW5jKHN5bmMsIGdsLlNZTkNfRkxVU0hfQ09NTUFORFNfQklULCAwKSkgewogICAgICAgIGNhc2UgZ2wuV0FJVF9GQUlMRUQ6CiAgICAgICAgICByZWplY3QoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgZ2wuVElNRU9VVF9FWFBJUkVEOgogICAgICAgICAgc2V0VGltZW91dChwcm9iZSwgaW50ZXJ2YWwpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgfQogICAgfQogICAgc2V0VGltZW91dChwcm9iZSwgaW50ZXJ2YWwpOwogIH0pOwp9CmZ1bmN0aW9uIHRvTm9ybWFsaXplZFByb2plY3Rpb25NYXRyaXgocHJvamVjdGlvbk1hdHJpeCkgewogIGNvbnN0IG0gPSBwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzOwogIG1bMl0gPSAwLjUgKiBtWzJdICsgMC41ICogbVszXTsKICBtWzZdID0gMC41ICogbVs2XSArIDAuNSAqIG1bN107CiAgbVsxMF0gPSAwLjUgKiBtWzEwXSArIDAuNSAqIG1bMTFdOwogIG1bMTRdID0gMC41ICogbVsxNF0gKyAwLjUgKiBtWzE1XTsKfQpmdW5jdGlvbiB0b1JldmVyc2VkUHJvamVjdGlvbk1hdHJpeChwcm9qZWN0aW9uTWF0cml4KSB7CiAgY29uc3QgbSA9IHByb2plY3Rpb25NYXRyaXguZWxlbWVudHM7CiAgY29uc3QgaXNQZXJzcGVjdGl2ZU1hdHJpeCA9IG1bMTFdID09PSAtMTsKICBpZiAoaXNQZXJzcGVjdGl2ZU1hdHJpeCkgewogICAgbVsxMF0gPSAtbVsxMF0gLSAxOwogICAgbVsxNF0gPSAtbVsxNF07CiAgfSBlbHNlIHsKICAgIG1bMTBdID0gLW1bMTBdOwogICAgbVsxNF0gPSAtbVsxNF0gKyAxOwogIH0KfQpmdW5jdGlvbiBjcmVhdGVDb2xvck1hbmFnZW1lbnQoKSB7CiAgY29uc3QgQ29sb3JNYW5hZ2VtZW50ID0gewogICAgZW5hYmxlZDogdHJ1ZSwKICAgIHdvcmtpbmdDb2xvclNwYWNlOiBMaW5lYXJTUkdCQ29sb3JTcGFjZSwKICAgIHNwYWNlczoge30sCiAgICBjb252ZXJ0OiBmdW5jdGlvbihjb2xvciwgc291cmNlQ29sb3JTcGFjZSwgdGFyZ2V0Q29sb3JTcGFjZSkgewogICAgICBpZiAodGhpcy5lbmFibGVkID09PSBmYWxzZSB8fCBzb3VyY2VDb2xvclNwYWNlID09PSB0YXJnZXRDb2xvclNwYWNlIHx8ICFzb3VyY2VDb2xvclNwYWNlIHx8ICF0YXJnZXRDb2xvclNwYWNlKSB7CiAgICAgICAgcmV0dXJuIGNvbG9yOwogICAgICB9CiAgICAgIGlmICh0aGlzLnNwYWNlc1tzb3VyY2VDb2xvclNwYWNlXS50cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyKSB7CiAgICAgICAgY29sb3IuciA9IFNSR0JUb0xpbmVhcihjb2xvci5yKTsKICAgICAgICBjb2xvci5nID0gU1JHQlRvTGluZWFyKGNvbG9yLmcpOwogICAgICAgIGNvbG9yLmIgPSBTUkdCVG9MaW5lYXIoY29sb3IuYik7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuc3BhY2VzW3NvdXJjZUNvbG9yU3BhY2VdLnByaW1hcmllcyAhPT0gdGhpcy5zcGFjZXNbdGFyZ2V0Q29sb3JTcGFjZV0ucHJpbWFyaWVzKSB7CiAgICAgICAgY29sb3IuYXBwbHlNYXRyaXgzKHRoaXMuc3BhY2VzW3NvdXJjZUNvbG9yU3BhY2VdLnRvWFlaKTsKICAgICAgICBjb2xvci5hcHBseU1hdHJpeDModGhpcy5zcGFjZXNbdGFyZ2V0Q29sb3JTcGFjZV0uZnJvbVhZWik7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuc3BhY2VzW3RhcmdldENvbG9yU3BhY2VdLnRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIpIHsKICAgICAgICBjb2xvci5yID0gTGluZWFyVG9TUkdCKGNvbG9yLnIpOwogICAgICAgIGNvbG9yLmcgPSBMaW5lYXJUb1NSR0IoY29sb3IuZyk7CiAgICAgICAgY29sb3IuYiA9IExpbmVhclRvU1JHQihjb2xvci5iKTsKICAgICAgfQogICAgICByZXR1cm4gY29sb3I7CiAgICB9LAogICAgZnJvbVdvcmtpbmdDb2xvclNwYWNlOiBmdW5jdGlvbihjb2xvciwgdGFyZ2V0Q29sb3JTcGFjZSkgewogICAgICByZXR1cm4gdGhpcy5jb252ZXJ0KGNvbG9yLCB0aGlzLndvcmtpbmdDb2xvclNwYWNlLCB0YXJnZXRDb2xvclNwYWNlKTsKICAgIH0sCiAgICB0b1dvcmtpbmdDb2xvclNwYWNlOiBmdW5jdGlvbihjb2xvciwgc291cmNlQ29sb3JTcGFjZSkgewogICAgICByZXR1cm4gdGhpcy5jb252ZXJ0KGNvbG9yLCBzb3VyY2VDb2xvclNwYWNlLCB0aGlzLndvcmtpbmdDb2xvclNwYWNlKTsKICAgIH0sCiAgICBnZXRQcmltYXJpZXM6IGZ1bmN0aW9uKGNvbG9yU3BhY2UpIHsKICAgICAgcmV0dXJuIHRoaXMuc3BhY2VzW2NvbG9yU3BhY2VdLnByaW1hcmllczsKICAgIH0sCiAgICBnZXRUcmFuc2ZlcjogZnVuY3Rpb24oY29sb3JTcGFjZSkgewogICAgICBpZiAoY29sb3JTcGFjZSA9PT0gTm9Db2xvclNwYWNlKQogICAgICAgIHJldHVybiBMaW5lYXJUcmFuc2ZlcjsKICAgICAgcmV0dXJuIHRoaXMuc3BhY2VzW2NvbG9yU3BhY2VdLnRyYW5zZmVyOwogICAgfSwKICAgIGdldEx1bWluYW5jZUNvZWZmaWNpZW50czogZnVuY3Rpb24odGFyZ2V0LCBjb2xvclNwYWNlID0gdGhpcy53b3JraW5nQ29sb3JTcGFjZSkgewogICAgICByZXR1cm4gdGFyZ2V0LmZyb21BcnJheSh0aGlzLnNwYWNlc1tjb2xvclNwYWNlXS5sdW1pbmFuY2VDb2VmZmljaWVudHMpOwogICAgfSwKICAgIGRlZmluZTogZnVuY3Rpb24oY29sb3JTcGFjZXMpIHsKICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnNwYWNlcywgY29sb3JTcGFjZXMpOwogICAgfSwKICAgIF9nZXRNYXRyaXg6IGZ1bmN0aW9uKHRhcmdldE1hdHJpeCwgc291cmNlQ29sb3JTcGFjZSwgdGFyZ2V0Q29sb3JTcGFjZSkgewogICAgICByZXR1cm4gdGFyZ2V0TWF0cml4LmNvcHkodGhpcy5zcGFjZXNbc291cmNlQ29sb3JTcGFjZV0udG9YWVopLm11bHRpcGx5KHRoaXMuc3BhY2VzW3RhcmdldENvbG9yU3BhY2VdLmZyb21YWVopOwogICAgfSwKICAgIF9nZXREcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTogZnVuY3Rpb24oY29sb3JTcGFjZSkgewogICAgICByZXR1cm4gdGhpcy5zcGFjZXNbY29sb3JTcGFjZV0ub3V0cHV0Q29sb3JTcGFjZUNvbmZpZy5kcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTsKICAgIH0sCiAgICBfZ2V0VW5wYWNrQ29sb3JTcGFjZTogZnVuY3Rpb24oY29sb3JTcGFjZSA9IHRoaXMud29ya2luZ0NvbG9yU3BhY2UpIHsKICAgICAgcmV0dXJuIHRoaXMuc3BhY2VzW2NvbG9yU3BhY2VdLndvcmtpbmdDb2xvclNwYWNlQ29uZmlnLnVucGFja0NvbG9yU3BhY2U7CiAgICB9CiAgfTsKICBjb25zdCBSRUM3MDlfUFJJTUFSSUVTID0gWzAuNjQsIDAuMzMsIDAuMywgMC42LCAwLjE1LCAwLjA2XTsKICBjb25zdCBSRUM3MDlfTFVNSU5BTkNFX0NPRUZGSUNJRU5UUyA9IFswLjIxMjYsIDAuNzE1MiwgMC4wNzIyXTsKICBjb25zdCBENjUgPSBbMC4zMTI3LCAwLjMyOV07CiAgQ29sb3JNYW5hZ2VtZW50LmRlZmluZSh7CiAgICBbTGluZWFyU1JHQkNvbG9yU3BhY2VdOiB7CiAgICAgIHByaW1hcmllczogUkVDNzA5X1BSSU1BUklFUywKICAgICAgd2hpdGVQb2ludDogRDY1LAogICAgICB0cmFuc2ZlcjogTGluZWFyVHJhbnNmZXIsCiAgICAgIHRvWFlaOiBMSU5FQVJfUkVDNzA5X1RPX1hZWiwKICAgICAgZnJvbVhZWjogWFlaX1RPX0xJTkVBUl9SRUM3MDksCiAgICAgIGx1bWluYW5jZUNvZWZmaWNpZW50czogUkVDNzA5X0xVTUlOQU5DRV9DT0VGRklDSUVOVFMsCiAgICAgIHdvcmtpbmdDb2xvclNwYWNlQ29uZmlnOiB7IHVucGFja0NvbG9yU3BhY2U6IFNSR0JDb2xvclNwYWNlIH0sCiAgICAgIG91dHB1dENvbG9yU3BhY2VDb25maWc6IHsgZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6IFNSR0JDb2xvclNwYWNlIH0KICAgIH0sCiAgICBbU1JHQkNvbG9yU3BhY2VdOiB7CiAgICAgIHByaW1hcmllczogUkVDNzA5X1BSSU1BUklFUywKICAgICAgd2hpdGVQb2ludDogRDY1LAogICAgICB0cmFuc2ZlcjogU1JHQlRyYW5zZmVyLAogICAgICB0b1hZWjogTElORUFSX1JFQzcwOV9UT19YWVosCiAgICAgIGZyb21YWVo6IFhZWl9UT19MSU5FQVJfUkVDNzA5LAogICAgICBsdW1pbmFuY2VDb2VmZmljaWVudHM6IFJFQzcwOV9MVU1JTkFOQ0VfQ09FRkZJQ0lFTlRTLAogICAgICBvdXRwdXRDb2xvclNwYWNlQ29uZmlnOiB7IGRyYXdpbmdCdWZmZXJDb2xvclNwYWNlOiBTUkdCQ29sb3JTcGFjZSB9CiAgICB9CiAgfSk7CiAgcmV0dXJuIENvbG9yTWFuYWdlbWVudDsKfQpmdW5jdGlvbiBTUkdCVG9MaW5lYXIoYykgewogIHJldHVybiBjIDwgMC4wNDA0NSA/IGMgKiAwLjA3NzM5OTM4MDggOiBNYXRoLnBvdyhjICogMC45NDc4NjcyOTg2ICsgMC4wNTIxMzI3MDE0LCAyLjQpOwp9CmZ1bmN0aW9uIExpbmVhclRvU1JHQihjKSB7CiAgcmV0dXJuIGMgPCAwLjAwMzEzMDggPyBjICogMTIuOTIgOiAxLjA1NSAqIE1hdGgucG93KGMsIDAuNDE2NjYpIC0gMC4wNTU7Cn0KCmNsYXNzIEltYWdlVXRpbHMgewogIHN0YXRpYyBnZXREYXRhVVJMKGltYWdlKSB7CiAgICBpZiAoL15kYXRhOi9pLnRlc3QoaW1hZ2Uuc3JjKSkgewogICAgICByZXR1cm4gaW1hZ2Uuc3JjOwogICAgfQogICAgaWYgKHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgcmV0dXJuIGltYWdlLnNyYzsKICAgIH0KICAgIGxldCBjYW52YXM7CiAgICBpZiAoaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkgewogICAgICBjYW52YXMgPSBpbWFnZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChfY2FudmFzID09PSB1bmRlZmluZWQpCiAgICAgICAgX2NhbnZhcyA9IGNyZWF0ZUVsZW1lbnROUygiY2FudmFzIik7CiAgICAgIF9jYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDsKICAgICAgX2NhbnZhcy5oZWlnaHQgPSBpbWFnZS5oZWlnaHQ7CiAgICAgIGNvbnN0IGNvbnRleHQgPSBfY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgIGlmIChpbWFnZSBpbnN0YW5jZW9mIEltYWdlRGF0YSkgewogICAgICAgIGNvbnRleHQucHV0SW1hZ2VEYXRhKGltYWdlLCAwLCAwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCk7CiAgICAgIH0KICAgICAgY2FudmFzID0gX2NhbnZhczsKICAgIH0KICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKCJpbWFnZS9wbmciKTsKICB9CiAgc3RhdGljIHNSR0JUb0xpbmVhcihpbWFnZSkgewogICAgaWYgKHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHwgdHlwZW9mIEhUTUxDYW52YXNFbGVtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50IHx8IHR5cGVvZiBJbWFnZUJpdG1hcCAhPT0gInVuZGVmaW5lZCIgJiYgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCkgewogICAgICBjb25zdCBjYW52YXMgPSBjcmVhdGVFbGVtZW50TlMoImNhbnZhcyIpOwogICAgICBjYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDsKICAgICAgY2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDsKICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCk7CiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQpOwogICAgICBjb25zdCBkYXRhID0gaW1hZ2VEYXRhLmRhdGE7CiAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZGF0YVtpXSA9IFNSR0JUb0xpbmVhcihkYXRhW2ldIC8gMjU1KSAqIDI1NTsKICAgICAgfQogICAgICBjb250ZXh0LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApOwogICAgICByZXR1cm4gY2FudmFzOwogICAgfSBlbHNlIGlmIChpbWFnZS5kYXRhKSB7CiAgICAgIGNvbnN0IGRhdGEgPSBpbWFnZS5kYXRhLnNsaWNlKDApOwogICAgICBmb3IgKGxldCBpID0gMDtpIDwgZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCBkYXRhIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpIHsKICAgICAgICAgIGRhdGFbaV0gPSBNYXRoLmZsb29yKFNSR0JUb0xpbmVhcihkYXRhW2ldIC8gMjU1KSAqIDI1NSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRhdGFbaV0gPSBTUkdCVG9MaW5lYXIoZGF0YVtpXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgZGF0YSwKICAgICAgICB3aWR0aDogaW1hZ2Uud2lkdGgsCiAgICAgICAgaGVpZ2h0OiBpbWFnZS5oZWlnaHQKICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5zUkdCVG9MaW5lYXIoKTogVW5zdXBwb3J0ZWQgaW1hZ2UgdHlwZS4gTm8gY29sb3Igc3BhY2UgY29udmVyc2lvbiBhcHBsaWVkLiIpOwogICAgICByZXR1cm4gaW1hZ2U7CiAgICB9CiAgfQp9CgpjbGFzcyBTb3VyY2UgewogIGNvbnN0cnVjdG9yKGRhdGEgPSBudWxsKSB7CiAgICB0aGlzLmlzU291cmNlID0gdHJ1ZTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiaWQiLCB7IHZhbHVlOiBfc291cmNlSWQrKyB9KTsKICAgIHRoaXMudXVpZCA9IGdlbmVyYXRlVVVJRCgpOwogICAgdGhpcy5kYXRhID0gZGF0YTsKICAgIHRoaXMuZGF0YVJlYWR5ID0gdHJ1ZTsKICAgIHRoaXMudmVyc2lvbiA9IDA7CiAgfQogIHNldCBuZWVkc1VwZGF0ZSh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09PSB0cnVlKQogICAgICB0aGlzLnZlcnNpb24rKzsKICB9CiAgdG9KU09OKG1ldGEpIHsKICAgIGNvbnN0IGlzUm9vdE9iamVjdCA9IG1ldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWV0YSA9PT0gInN0cmluZyI7CiAgICBpZiAoIWlzUm9vdE9iamVjdCAmJiBtZXRhLmltYWdlc1t0aGlzLnV1aWRdICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIG1ldGEuaW1hZ2VzW3RoaXMudXVpZF07CiAgICB9CiAgICBjb25zdCBvdXRwdXQgPSB7CiAgICAgIHV1aWQ6IHRoaXMudXVpZCwKICAgICAgdXJsOiAiIgogICAgfTsKICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CiAgICBpZiAoZGF0YSAhPT0gbnVsbCkgewogICAgICBsZXQgdXJsOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkgewogICAgICAgIHVybCA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gZGF0YS5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgICAgaWYgKGRhdGFbaV0uaXNEYXRhVGV4dHVyZSkgewogICAgICAgICAgICB1cmwucHVzaChzZXJpYWxpemVJbWFnZShkYXRhW2ldLmltYWdlKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1cmwucHVzaChzZXJpYWxpemVJbWFnZShkYXRhW2ldKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHVybCA9IHNlcmlhbGl6ZUltYWdlKGRhdGEpOwogICAgICB9CiAgICAgIG91dHB1dC51cmwgPSB1cmw7CiAgICB9CiAgICBpZiAoIWlzUm9vdE9iamVjdCkgewogICAgICBtZXRhLmltYWdlc1t0aGlzLnV1aWRdID0gb3V0cHV0OwogICAgfQogICAgcmV0dXJuIG91dHB1dDsKICB9Cn0KZnVuY3Rpb24gc2VyaWFsaXplSW1hZ2UoaW1hZ2UpIHsKICBpZiAodHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCB8fCB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgdHlwZW9mIEltYWdlQml0bWFwICE9PSAidW5kZWZpbmVkIiAmJiBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwKSB7CiAgICByZXR1cm4gSW1hZ2VVdGlscy5nZXREYXRhVVJMKGltYWdlKTsKICB9IGVsc2UgewogICAgaWYgKGltYWdlLmRhdGEpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBkYXRhOiBBcnJheS5mcm9tKGltYWdlLmRhdGEpLAogICAgICAgIHdpZHRoOiBpbWFnZS53aWR0aCwKICAgICAgICBoZWlnaHQ6IGltYWdlLmhlaWdodCwKICAgICAgICB0eXBlOiBpbWFnZS5kYXRhLmNvbnN0cnVjdG9yLm5hbWUKICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuVGV4dHVyZTogVW5hYmxlIHRvIHNlcmlhbGl6ZSBUZXh0dXJlLiIpOwogICAgICByZXR1cm4ge307CiAgICB9CiAgfQp9CgpjbGFzcyBCb3gzIHsKICBjb25zdHJ1Y3RvcihtaW4gPSBuZXcgVmVjdG9yMyhJbmZpbml0eSwgSW5maW5pdHksIEluZmluaXR5KSwgbWF4ID0gbmV3IFZlY3RvcjMoLUluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eSkpIHsKICAgIHRoaXMuaXNCb3gzID0gdHJ1ZTsKICAgIHRoaXMubWluID0gbWluOwogICAgdGhpcy5tYXggPSBtYXg7CiAgfQogIHNldChtaW4sIG1heCkgewogICAgdGhpcy5taW4uY29weShtaW4pOwogICAgdGhpcy5tYXguY29weShtYXgpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldEZyb21BcnJheShhcnJheSkgewogICAgdGhpcy5tYWtlRW1wdHkoKTsKICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IGFycmF5Lmxlbmd0aDtpIDwgaWw7IGkgKz0gMykgewogICAgICB0aGlzLmV4cGFuZEJ5UG9pbnQoX3ZlY3RvciRiLmZyb21BcnJheShhcnJheSwgaSkpOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldEZyb21CdWZmZXJBdHRyaWJ1dGUoYXR0cmlidXRlKSB7CiAgICB0aGlzLm1ha2VFbXB0eSgpOwogICAgZm9yIChsZXQgaSA9IDAsIGlsID0gYXR0cmlidXRlLmNvdW50O2kgPCBpbDsgaSsrKSB7CiAgICAgIHRoaXMuZXhwYW5kQnlQb2ludChfdmVjdG9yJGIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhdHRyaWJ1dGUsIGkpKTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KICBzZXRGcm9tUG9pbnRzKHBvaW50cykgewogICAgdGhpcy5tYWtlRW1wdHkoKTsKICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgdGhpcy5leHBhbmRCeVBvaW50KHBvaW50c1tpXSk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2V0RnJvbUNlbnRlckFuZFNpemUoY2VudGVyLCBzaXplKSB7CiAgICBjb25zdCBoYWxmU2l6ZSA9IF92ZWN0b3IkYi5jb3B5KHNpemUpLm11bHRpcGx5U2NhbGFyKDAuNSk7CiAgICB0aGlzLm1pbi5jb3B5KGNlbnRlcikuc3ViKGhhbGZTaXplKTsKICAgIHRoaXMubWF4LmNvcHkoY2VudGVyKS5hZGQoaGFsZlNpemUpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldEZyb21PYmplY3Qob2JqZWN0LCBwcmVjaXNlID0gZmFsc2UpIHsKICAgIHRoaXMubWFrZUVtcHR5KCk7CiAgICByZXR1cm4gdGhpcy5leHBhbmRCeU9iamVjdChvYmplY3QsIHByZWNpc2UpOwogIH0KICBjbG9uZSgpIHsKICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyk7CiAgfQogIGNvcHkoYm94KSB7CiAgICB0aGlzLm1pbi5jb3B5KGJveC5taW4pOwogICAgdGhpcy5tYXguY29weShib3gubWF4KTsKICAgIHJldHVybiB0aGlzOwogIH0KICBtYWtlRW1wdHkoKSB7CiAgICB0aGlzLm1pbi54ID0gdGhpcy5taW4ueSA9IHRoaXMubWluLnogPSBJbmZpbml0eTsKICAgIHRoaXMubWF4LnggPSB0aGlzLm1heC55ID0gdGhpcy5tYXgueiA9IC1JbmZpbml0eTsKICAgIHJldHVybiB0aGlzOwogIH0KICBpc0VtcHR5KCkgewogICAgcmV0dXJuIHRoaXMubWF4LnggPCB0aGlzLm1pbi54IHx8IHRoaXMubWF4LnkgPCB0aGlzLm1pbi55IHx8IHRoaXMubWF4LnogPCB0aGlzLm1pbi56OwogIH0KICBnZXRDZW50ZXIodGFyZ2V0KSB7CiAgICByZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KDAsIDAsIDApIDogdGFyZ2V0LmFkZFZlY3RvcnModGhpcy5taW4sIHRoaXMubWF4KS5tdWx0aXBseVNjYWxhcigwLjUpOwogIH0KICBnZXRTaXplKHRhcmdldCkgewogICAgcmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCgwLCAwLCAwKSA6IHRhcmdldC5zdWJWZWN0b3JzKHRoaXMubWF4LCB0aGlzLm1pbik7CiAgfQogIGV4cGFuZEJ5UG9pbnQocG9pbnQpIHsKICAgIHRoaXMubWluLm1pbihwb2ludCk7CiAgICB0aGlzLm1heC5tYXgocG9pbnQpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGV4cGFuZEJ5VmVjdG9yKHZlY3RvcikgewogICAgdGhpcy5taW4uc3ViKHZlY3Rvcik7CiAgICB0aGlzLm1heC5hZGQodmVjdG9yKTsKICAgIHJldHVybiB0aGlzOwogIH0KICBleHBhbmRCeVNjYWxhcihzY2FsYXIpIHsKICAgIHRoaXMubWluLmFkZFNjYWxhcigtc2NhbGFyKTsKICAgIHRoaXMubWF4LmFkZFNjYWxhcihzY2FsYXIpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGV4cGFuZEJ5T2JqZWN0KG9iamVjdCwgcHJlY2lzZSA9IGZhbHNlKSB7CiAgICBvYmplY3QudXBkYXRlV29ybGRNYXRyaXgoZmFsc2UsIGZhbHNlKTsKICAgIGNvbnN0IGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5OwogICAgaWYgKGdlb21ldHJ5ICE9PSB1bmRlZmluZWQpIHsKICAgICAgY29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7CiAgICAgIGlmIChwcmVjaXNlID09PSB0cnVlICYmIHBvc2l0aW9uQXR0cmlidXRlICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCAhPT0gdHJ1ZSkgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7aSA8IGw7IGkrKykgewogICAgICAgICAgaWYgKG9iamVjdC5pc01lc2ggPT09IHRydWUpIHsKICAgICAgICAgICAgb2JqZWN0LmdldFZlcnRleFBvc2l0aW9uKGksIF92ZWN0b3IkYik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfdmVjdG9yJGIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbkF0dHJpYnV0ZSwgaSk7CiAgICAgICAgICB9CiAgICAgICAgICBfdmVjdG9yJGIuYXBwbHlNYXRyaXg0KG9iamVjdC5tYXRyaXhXb3JsZCk7CiAgICAgICAgICB0aGlzLmV4cGFuZEJ5UG9pbnQoX3ZlY3RvciRiKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKG9iamVjdC5ib3VuZGluZ0JveCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBpZiAob2JqZWN0LmJvdW5kaW5nQm94ID09PSBudWxsKSB7CiAgICAgICAgICAgIG9iamVjdC5jb21wdXRlQm91bmRpbmdCb3goKTsKICAgICAgICAgIH0KICAgICAgICAgIF9ib3gkNC5jb3B5KG9iamVjdC5ib3VuZGluZ0JveCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChnZW9tZXRyeS5ib3VuZGluZ0JveCA9PT0gbnVsbCkgewogICAgICAgICAgICBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTsKICAgICAgICAgIH0KICAgICAgICAgIF9ib3gkNC5jb3B5KGdlb21ldHJ5LmJvdW5kaW5nQm94KTsKICAgICAgICB9CiAgICAgICAgX2JveCQ0LmFwcGx5TWF0cml4NChvYmplY3QubWF0cml4V29ybGQpOwogICAgICAgIHRoaXMudW5pb24oX2JveCQ0KTsKICAgICAgfQogICAgfQogICAgY29uc3QgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47CiAgICBmb3IgKGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgIHRoaXMuZXhwYW5kQnlPYmplY3QoY2hpbGRyZW5baV0sIHByZWNpc2UpOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIGNvbnRhaW5zUG9pbnQocG9pbnQpIHsKICAgIHJldHVybiBwb2ludC54ID49IHRoaXMubWluLnggJiYgcG9pbnQueCA8PSB0aGlzLm1heC54ICYmIHBvaW50LnkgPj0gdGhpcy5taW4ueSAmJiBwb2ludC55IDw9IHRoaXMubWF4LnkgJiYgcG9pbnQueiA+PSB0aGlzLm1pbi56ICYmIHBvaW50LnogPD0gdGhpcy5tYXguejsKICB9CiAgY29udGFpbnNCb3goYm94KSB7CiAgICByZXR1cm4gdGhpcy5taW4ueCA8PSBib3gubWluLnggJiYgYm94Lm1heC54IDw9IHRoaXMubWF4LnggJiYgdGhpcy5taW4ueSA8PSBib3gubWluLnkgJiYgYm94Lm1heC55IDw9IHRoaXMubWF4LnkgJiYgdGhpcy5taW4ueiA8PSBib3gubWluLnogJiYgYm94Lm1heC56IDw9IHRoaXMubWF4Lno7CiAgfQogIGdldFBhcmFtZXRlcihwb2ludCwgdGFyZ2V0KSB7CiAgICByZXR1cm4gdGFyZ2V0LnNldCgocG9pbnQueCAtIHRoaXMubWluLngpIC8gKHRoaXMubWF4LnggLSB0aGlzLm1pbi54KSwgKHBvaW50LnkgLSB0aGlzLm1pbi55KSAvICh0aGlzLm1heC55IC0gdGhpcy5taW4ueSksIChwb2ludC56IC0gdGhpcy5taW4ueikgLyAodGhpcy5tYXgueiAtIHRoaXMubWluLnopKTsKICB9CiAgaW50ZXJzZWN0c0JveChib3gpIHsKICAgIHJldHVybiBib3gubWF4LnggPj0gdGhpcy5taW4ueCAmJiBib3gubWluLnggPD0gdGhpcy5tYXgueCAmJiBib3gubWF4LnkgPj0gdGhpcy5taW4ueSAmJiBib3gubWluLnkgPD0gdGhpcy5tYXgueSAmJiBib3gubWF4LnogPj0gdGhpcy5taW4ueiAmJiBib3gubWluLnogPD0gdGhpcy5tYXguejsKICB9CiAgaW50ZXJzZWN0c1NwaGVyZShzcGhlcmUpIHsKICAgIHRoaXMuY2xhbXBQb2ludChzcGhlcmUuY2VudGVyLCBfdmVjdG9yJGIpOwogICAgcmV0dXJuIF92ZWN0b3IkYi5kaXN0YW5jZVRvU3F1YXJlZChzcGhlcmUuY2VudGVyKSA8PSBzcGhlcmUucmFkaXVzICogc3BoZXJlLnJhZGl1czsKICB9CiAgaW50ZXJzZWN0c1BsYW5lKHBsYW5lKSB7CiAgICBsZXQgbWluLCBtYXg7CiAgICBpZiAocGxhbmUubm9ybWFsLnggPiAwKSB7CiAgICAgIG1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDsKICAgICAgbWF4ID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1heC54OwogICAgfSBlbHNlIHsKICAgICAgbWluID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1heC54OwogICAgICBtYXggPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7CiAgICB9CiAgICBpZiAocGxhbmUubm9ybWFsLnkgPiAwKSB7CiAgICAgIG1pbiArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWluLnk7CiAgICAgIG1heCArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7CiAgICB9IGVsc2UgewogICAgICBtaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1heC55OwogICAgICBtYXggKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55OwogICAgfQogICAgaWYgKHBsYW5lLm5vcm1hbC56ID4gMCkgewogICAgICBtaW4gKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56OwogICAgICBtYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1heC56OwogICAgfSBlbHNlIHsKICAgICAgbWluICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5tYXguejsKICAgICAgbWF4ICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5taW4uejsKICAgIH0KICAgIHJldHVybiBtaW4gPD0gLXBsYW5lLmNvbnN0YW50ICYmIG1heCA+PSAtcGxhbmUuY29uc3RhbnQ7CiAgfQogIGludGVyc2VjdHNUcmlhbmdsZSh0cmlhbmdsZSkgewogICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHRoaXMuZ2V0Q2VudGVyKF9jZW50ZXIpOwogICAgX2V4dGVudHMuc3ViVmVjdG9ycyh0aGlzLm1heCwgX2NlbnRlcik7CiAgICBfdjAkMi5zdWJWZWN0b3JzKHRyaWFuZ2xlLmEsIF9jZW50ZXIpOwogICAgX3YxJDcuc3ViVmVjdG9ycyh0cmlhbmdsZS5iLCBfY2VudGVyKTsKICAgIF92MiQ0LnN1YlZlY3RvcnModHJpYW5nbGUuYywgX2NlbnRlcik7CiAgICBfZjAuc3ViVmVjdG9ycyhfdjEkNywgX3YwJDIpOwogICAgX2YxLnN1YlZlY3RvcnMoX3YyJDQsIF92MSQ3KTsKICAgIF9mMi5zdWJWZWN0b3JzKF92MCQyLCBfdjIkNCk7CiAgICBsZXQgYXhlcyA9IFsKICAgICAgMCwKICAgICAgLV9mMC56LAogICAgICBfZjAueSwKICAgICAgMCwKICAgICAgLV9mMS56LAogICAgICBfZjEueSwKICAgICAgMCwKICAgICAgLV9mMi56LAogICAgICBfZjIueSwKICAgICAgX2YwLnosCiAgICAgIDAsCiAgICAgIC1fZjAueCwKICAgICAgX2YxLnosCiAgICAgIDAsCiAgICAgIC1fZjEueCwKICAgICAgX2YyLnosCiAgICAgIDAsCiAgICAgIC1fZjIueCwKICAgICAgLV9mMC55LAogICAgICBfZjAueCwKICAgICAgMCwKICAgICAgLV9mMS55LAogICAgICBfZjEueCwKICAgICAgMCwKICAgICAgLV9mMi55LAogICAgICBfZjIueCwKICAgICAgMAogICAgXTsKICAgIGlmICghc2F0Rm9yQXhlcyhheGVzLCBfdjAkMiwgX3YxJDcsIF92MiQ0LCBfZXh0ZW50cykpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgYXhlcyA9IFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXTsKICAgIGlmICghc2F0Rm9yQXhlcyhheGVzLCBfdjAkMiwgX3YxJDcsIF92MiQ0LCBfZXh0ZW50cykpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX3RyaWFuZ2xlTm9ybWFsLmNyb3NzVmVjdG9ycyhfZjAsIF9mMSk7CiAgICBheGVzID0gW190cmlhbmdsZU5vcm1hbC54LCBfdHJpYW5nbGVOb3JtYWwueSwgX3RyaWFuZ2xlTm9ybWFsLnpdOwogICAgcmV0dXJuIHNhdEZvckF4ZXMoYXhlcywgX3YwJDIsIF92MSQ3LCBfdjIkNCwgX2V4dGVudHMpOwogIH0KICBjbGFtcFBvaW50KHBvaW50LCB0YXJnZXQpIHsKICAgIHJldHVybiB0YXJnZXQuY29weShwb2ludCkuY2xhbXAodGhpcy5taW4sIHRoaXMubWF4KTsKICB9CiAgZGlzdGFuY2VUb1BvaW50KHBvaW50KSB7CiAgICByZXR1cm4gdGhpcy5jbGFtcFBvaW50KHBvaW50LCBfdmVjdG9yJGIpLmRpc3RhbmNlVG8ocG9pbnQpOwogIH0KICBnZXRCb3VuZGluZ1NwaGVyZSh0YXJnZXQpIHsKICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgewogICAgICB0YXJnZXQubWFrZUVtcHR5KCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmdldENlbnRlcih0YXJnZXQuY2VudGVyKTsKICAgICAgdGFyZ2V0LnJhZGl1cyA9IHRoaXMuZ2V0U2l6ZShfdmVjdG9yJGIpLmxlbmd0aCgpICogMC41OwogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CiAgaW50ZXJzZWN0KGJveCkgewogICAgdGhpcy5taW4ubWF4KGJveC5taW4pOwogICAgdGhpcy5tYXgubWluKGJveC5tYXgpOwogICAgaWYgKHRoaXMuaXNFbXB0eSgpKQogICAgICB0aGlzLm1ha2VFbXB0eSgpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHVuaW9uKGJveCkgewogICAgdGhpcy5taW4ubWluKGJveC5taW4pOwogICAgdGhpcy5tYXgubWF4KGJveC5tYXgpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGFwcGx5TWF0cml4NChtYXRyaXgpIHsKICAgIGlmICh0aGlzLmlzRW1wdHkoKSkKICAgICAgcmV0dXJuIHRoaXM7CiAgICBfcG9pbnRzWzBdLnNldCh0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQobWF0cml4KTsKICAgIF9wb2ludHNbMV0uc2V0KHRoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChtYXRyaXgpOwogICAgX3BvaW50c1syXS5zZXQodGhpcy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KG1hdHJpeCk7CiAgICBfcG9pbnRzWzNdLnNldCh0aGlzLm1pbi54LCB0aGlzLm1heC55LCB0aGlzLm1heC56KS5hcHBseU1hdHJpeDQobWF0cml4KTsKICAgIF9wb2ludHNbNF0uc2V0KHRoaXMubWF4LngsIHRoaXMubWluLnksIHRoaXMubWluLnopLmFwcGx5TWF0cml4NChtYXRyaXgpOwogICAgX3BvaW50c1s1XS5zZXQodGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KG1hdHJpeCk7CiAgICBfcG9pbnRzWzZdLnNldCh0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQobWF0cml4KTsKICAgIF9wb2ludHNbN10uc2V0KHRoaXMubWF4LngsIHRoaXMubWF4LnksIHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChtYXRyaXgpOwogICAgdGhpcy5zZXRGcm9tUG9pbnRzKF9wb2ludHMpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHRyYW5zbGF0ZShvZmZzZXQpIHsKICAgIHRoaXMubWluLmFkZChvZmZzZXQpOwogICAgdGhpcy5tYXguYWRkKG9mZnNldCk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgZXF1YWxzKGJveCkgewogICAgcmV0dXJuIGJveC5taW4uZXF1YWxzKHRoaXMubWluKSAmJiBib3gubWF4LmVxdWFscyh0aGlzLm1heCk7CiAgfQp9CmZ1bmN0aW9uIHNhdEZvckF4ZXMoYXhlcywgdjAsIHYxLCB2MiwgZXh0ZW50cykgewogIGZvciAobGV0IGkgPSAwLCBqID0gYXhlcy5sZW5ndGggLSAzO2kgPD0gajsgaSArPSAzKSB7CiAgICBfdGVzdEF4aXMuZnJvbUFycmF5KGF4ZXMsIGkpOwogICAgY29uc3QgciA9IGV4dGVudHMueCAqIE1hdGguYWJzKF90ZXN0QXhpcy54KSArIGV4dGVudHMueSAqIE1hdGguYWJzKF90ZXN0QXhpcy55KSArIGV4dGVudHMueiAqIE1hdGguYWJzKF90ZXN0QXhpcy56KTsKICAgIGNvbnN0IHAwID0gdjAuZG90KF90ZXN0QXhpcyk7CiAgICBjb25zdCBwMSA9IHYxLmRvdChfdGVzdEF4aXMpOwogICAgY29uc3QgcDIgPSB2Mi5kb3QoX3Rlc3RBeGlzKTsKICAgIGlmIChNYXRoLm1heCgtTWF0aC5tYXgocDAsIHAxLCBwMiksIE1hdGgubWluKHAwLCBwMSwgcDIpKSA+IHIpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQoKY2xhc3MgU3BoZXJlIHsKICBjb25zdHJ1Y3RvcihjZW50ZXIgPSBuZXcgVmVjdG9yMywgcmFkaXVzID0gLTEpIHsKICAgIHRoaXMuaXNTcGhlcmUgPSB0cnVlOwogICAgdGhpcy5jZW50ZXIgPSBjZW50ZXI7CiAgICB0aGlzLnJhZGl1cyA9IHJhZGl1czsKICB9CiAgc2V0KGNlbnRlciwgcmFkaXVzKSB7CiAgICB0aGlzLmNlbnRlci5jb3B5KGNlbnRlcik7CiAgICB0aGlzLnJhZGl1cyA9IHJhZGl1czsKICAgIHJldHVybiB0aGlzOwogIH0KICBzZXRGcm9tUG9pbnRzKHBvaW50cywgb3B0aW9uYWxDZW50ZXIpIHsKICAgIGNvbnN0IGNlbnRlciA9IHRoaXMuY2VudGVyOwogICAgaWYgKG9wdGlvbmFsQ2VudGVyICE9PSB1bmRlZmluZWQpIHsKICAgICAgY2VudGVyLmNvcHkob3B0aW9uYWxDZW50ZXIpOwogICAgfSBlbHNlIHsKICAgICAgX2JveCQzLnNldEZyb21Qb2ludHMocG9pbnRzKS5nZXRDZW50ZXIoY2VudGVyKTsKICAgIH0KICAgIGxldCBtYXhSYWRpdXNTcSA9IDA7CiAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoO2kgPCBpbDsgaSsrKSB7CiAgICAgIG1heFJhZGl1c1NxID0gTWF0aC5tYXgobWF4UmFkaXVzU3EsIGNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZChwb2ludHNbaV0pKTsKICAgIH0KICAgIHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KG1heFJhZGl1c1NxKTsKICAgIHJldHVybiB0aGlzOwogIH0KICBjb3B5KHNwaGVyZSkgewogICAgdGhpcy5jZW50ZXIuY29weShzcGhlcmUuY2VudGVyKTsKICAgIHRoaXMucmFkaXVzID0gc3BoZXJlLnJhZGl1czsKICAgIHJldHVybiB0aGlzOwogIH0KICBpc0VtcHR5KCkgewogICAgcmV0dXJuIHRoaXMucmFkaXVzIDwgMDsKICB9CiAgbWFrZUVtcHR5KCkgewogICAgdGhpcy5jZW50ZXIuc2V0KDAsIDAsIDApOwogICAgdGhpcy5yYWRpdXMgPSAtMTsKICAgIHJldHVybiB0aGlzOwogIH0KICBjb250YWluc1BvaW50KHBvaW50KSB7CiAgICByZXR1cm4gcG9pbnQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpIDw9IHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXM7CiAgfQogIGRpc3RhbmNlVG9Qb2ludChwb2ludCkgewogICAgcmV0dXJuIHBvaW50LmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpIC0gdGhpcy5yYWRpdXM7CiAgfQogIGludGVyc2VjdHNTcGhlcmUoc3BoZXJlKSB7CiAgICBjb25zdCByYWRpdXNTdW0gPSB0aGlzLnJhZGl1cyArIHNwaGVyZS5yYWRpdXM7CiAgICByZXR1cm4gc3BoZXJlLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcikgPD0gcmFkaXVzU3VtICogcmFkaXVzU3VtOwogIH0KICBpbnRlcnNlY3RzQm94KGJveCkgewogICAgcmV0dXJuIGJveC5pbnRlcnNlY3RzU3BoZXJlKHRoaXMpOwogIH0KICBpbnRlcnNlY3RzUGxhbmUocGxhbmUpIHsKICAgIHJldHVybiBNYXRoLmFicyhwbGFuZS5kaXN0YW5jZVRvUG9pbnQodGhpcy5jZW50ZXIpKSA8PSB0aGlzLnJhZGl1czsKICB9CiAgY2xhbXBQb2ludChwb2ludCwgdGFyZ2V0KSB7CiAgICBjb25zdCBkZWx0YUxlbmd0aFNxID0gdGhpcy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQocG9pbnQpOwogICAgdGFyZ2V0LmNvcHkocG9pbnQpOwogICAgaWYgKGRlbHRhTGVuZ3RoU3EgPiB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzKSB7CiAgICAgIHRhcmdldC5zdWIodGhpcy5jZW50ZXIpLm5vcm1hbGl6ZSgpOwogICAgICB0YXJnZXQubXVsdGlwbHlTY2FsYXIodGhpcy5yYWRpdXMpLmFkZCh0aGlzLmNlbnRlcik7CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0OwogIH0KICBnZXRCb3VuZGluZ0JveCh0YXJnZXQpIHsKICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgewogICAgICB0YXJnZXQubWFrZUVtcHR5KCk7CiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CiAgICB0YXJnZXQuc2V0KHRoaXMuY2VudGVyLCB0aGlzLmNlbnRlcik7CiAgICB0YXJnZXQuZXhwYW5kQnlTY2FsYXIodGhpcy5yYWRpdXMpOwogICAgcmV0dXJuIHRhcmdldDsKICB9CiAgYXBwbHlNYXRyaXg0KG1hdHJpeCkgewogICAgdGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KG1hdHJpeCk7CiAgICB0aGlzLnJhZGl1cyA9IHRoaXMucmFkaXVzICogbWF0cml4LmdldE1heFNjYWxlT25BeGlzKCk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgdHJhbnNsYXRlKG9mZnNldCkgewogICAgdGhpcy5jZW50ZXIuYWRkKG9mZnNldCk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgZXhwYW5kQnlQb2ludChwb2ludCkgewogICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7CiAgICAgIHRoaXMuY2VudGVyLmNvcHkocG9pbnQpOwogICAgICB0aGlzLnJhZGl1cyA9IDA7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgX3YxJDYuc3ViVmVjdG9ycyhwb2ludCwgdGhpcy5jZW50ZXIpOwogICAgY29uc3QgbGVuZ3RoU3EgPSBfdjEkNi5sZW5ndGhTcSgpOwogICAgaWYgKGxlbmd0aFNxID4gdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cykgewogICAgICBjb25zdCBsZW5ndGggPSBNYXRoLnNxcnQobGVuZ3RoU3EpOwogICAgICBjb25zdCBkZWx0YSA9IChsZW5ndGggLSB0aGlzLnJhZGl1cykgKiAwLjU7CiAgICAgIHRoaXMuY2VudGVyLmFkZFNjYWxlZFZlY3RvcihfdjEkNiwgZGVsdGEgLyBsZW5ndGgpOwogICAgICB0aGlzLnJhZGl1cyArPSBkZWx0YTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KICB1bmlvbihzcGhlcmUpIHsKICAgIGlmIChzcGhlcmUuaXNFbXB0eSgpKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7CiAgICAgIHRoaXMuY29weShzcGhlcmUpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGlmICh0aGlzLmNlbnRlci5lcXVhbHMoc3BoZXJlLmNlbnRlcikgPT09IHRydWUpIHsKICAgICAgdGhpcy5yYWRpdXMgPSBNYXRoLm1heCh0aGlzLnJhZGl1cywgc3BoZXJlLnJhZGl1cyk7CiAgICB9IGVsc2UgewogICAgICBfdjIkMy5zdWJWZWN0b3JzKHNwaGVyZS5jZW50ZXIsIHRoaXMuY2VudGVyKS5zZXRMZW5ndGgoc3BoZXJlLnJhZGl1cyk7CiAgICAgIHRoaXMuZXhwYW5kQnlQb2ludChfdjEkNi5jb3B5KHNwaGVyZS5jZW50ZXIpLmFkZChfdjIkMykpOwogICAgICB0aGlzLmV4cGFuZEJ5UG9pbnQoX3YxJDYuY29weShzcGhlcmUuY2VudGVyKS5zdWIoX3YyJDMpKTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KICBlcXVhbHMoc3BoZXJlKSB7CiAgICByZXR1cm4gc3BoZXJlLmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpICYmIHNwaGVyZS5yYWRpdXMgPT09IHRoaXMucmFkaXVzOwogIH0KICBjbG9uZSgpIHsKICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyk7CiAgfQp9CgpjbGFzcyBSYXkgewogIGNvbnN0cnVjdG9yKG9yaWdpbiA9IG5ldyBWZWN0b3IzLCBkaXJlY3Rpb24gPSBuZXcgVmVjdG9yMygwLCAwLCAtMSkpIHsKICAgIHRoaXMub3JpZ2luID0gb3JpZ2luOwogICAgdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247CiAgfQogIHNldChvcmlnaW4sIGRpcmVjdGlvbikgewogICAgdGhpcy5vcmlnaW4uY29weShvcmlnaW4pOwogICAgdGhpcy5kaXJlY3Rpb24uY29weShkaXJlY3Rpb24pOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGNvcHkocmF5KSB7CiAgICB0aGlzLm9yaWdpbi5jb3B5KHJheS5vcmlnaW4pOwogICAgdGhpcy5kaXJlY3Rpb24uY29weShyYXkuZGlyZWN0aW9uKTsKICAgIHJldHVybiB0aGlzOwogIH0KICBhdCh0LCB0YXJnZXQpIHsKICAgIHJldHVybiB0YXJnZXQuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLCB0KTsKICB9CiAgbG9va0F0KHYpIHsKICAgIHRoaXMuZGlyZWN0aW9uLmNvcHkodikuc3ViKHRoaXMub3JpZ2luKS5ub3JtYWxpemUoKTsKICAgIHJldHVybiB0aGlzOwogIH0KICByZWNhc3QodCkgewogICAgdGhpcy5vcmlnaW4uY29weSh0aGlzLmF0KHQsIF92ZWN0b3IkYSkpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGNsb3Nlc3RQb2ludFRvUG9pbnQocG9pbnQsIHRhcmdldCkgewogICAgdGFyZ2V0LnN1YlZlY3RvcnMocG9pbnQsIHRoaXMub3JpZ2luKTsKICAgIGNvbnN0IGRpcmVjdGlvbkRpc3RhbmNlID0gdGFyZ2V0LmRvdCh0aGlzLmRpcmVjdGlvbik7CiAgICBpZiAoZGlyZWN0aW9uRGlzdGFuY2UgPCAwKSB7CiAgICAgIHJldHVybiB0YXJnZXQuY29weSh0aGlzLm9yaWdpbik7CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0LmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbiwgZGlyZWN0aW9uRGlzdGFuY2UpOwogIH0KICBkaXN0YW5jZVRvUG9pbnQocG9pbnQpIHsKICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludChwb2ludCkpOwogIH0KICBkaXN0YW5jZVNxVG9Qb2ludChwb2ludCkgewogICAgY29uc3QgZGlyZWN0aW9uRGlzdGFuY2UgPSBfdmVjdG9yJGEuc3ViVmVjdG9ycyhwb2ludCwgdGhpcy5vcmlnaW4pLmRvdCh0aGlzLmRpcmVjdGlvbik7CiAgICBpZiAoZGlyZWN0aW9uRGlzdGFuY2UgPCAwKSB7CiAgICAgIHJldHVybiB0aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZChwb2ludCk7CiAgICB9CiAgICBfdmVjdG9yJGEuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLCBkaXJlY3Rpb25EaXN0YW5jZSk7CiAgICByZXR1cm4gX3ZlY3RvciRhLmRpc3RhbmNlVG9TcXVhcmVkKHBvaW50KTsKICB9CiAgZGlzdGFuY2VTcVRvU2VnbWVudCh2MCwgdjEsIG9wdGlvbmFsUG9pbnRPblJheSwgb3B0aW9uYWxQb2ludE9uU2VnbWVudCkgewogICAgX3NlZ0NlbnRlci5jb3B5KHYwKS5hZGQodjEpLm11bHRpcGx5U2NhbGFyKDAuNSk7CiAgICBfc2VnRGlyLmNvcHkodjEpLnN1Yih2MCkubm9ybWFsaXplKCk7CiAgICBfZGlmZi5jb3B5KHRoaXMub3JpZ2luKS5zdWIoX3NlZ0NlbnRlcik7CiAgICBjb25zdCBzZWdFeHRlbnQgPSB2MC5kaXN0YW5jZVRvKHYxKSAqIDAuNTsKICAgIGNvbnN0IGEwMSA9IC10aGlzLmRpcmVjdGlvbi5kb3QoX3NlZ0Rpcik7CiAgICBjb25zdCBiMCA9IF9kaWZmLmRvdCh0aGlzLmRpcmVjdGlvbik7CiAgICBjb25zdCBiMSA9IC1fZGlmZi5kb3QoX3NlZ0Rpcik7CiAgICBjb25zdCBjID0gX2RpZmYubGVuZ3RoU3EoKTsKICAgIGNvbnN0IGRldCA9IE1hdGguYWJzKDEgLSBhMDEgKiBhMDEpOwogICAgbGV0IHMwLCBzMSwgc3FyRGlzdCwgZXh0RGV0OwogICAgaWYgKGRldCA+IDApIHsKICAgICAgczAgPSBhMDEgKiBiMSAtIGIwOwogICAgICBzMSA9IGEwMSAqIGIwIC0gYjE7CiAgICAgIGV4dERldCA9IHNlZ0V4dGVudCAqIGRldDsKICAgICAgaWYgKHMwID49IDApIHsKICAgICAgICBpZiAoczEgPj0gLWV4dERldCkgewogICAgICAgICAgaWYgKHMxIDw9IGV4dERldCkgewogICAgICAgICAgICBjb25zdCBpbnZEZXQgPSAxIC8gZGV0OwogICAgICAgICAgICBzMCAqPSBpbnZEZXQ7CiAgICAgICAgICAgIHMxICo9IGludkRldDsKICAgICAgICAgICAgc3FyRGlzdCA9IHMwICogKHMwICsgYTAxICogczEgKyAyICogYjApICsgczEgKiAoYTAxICogczAgKyBzMSArIDIgKiBiMSkgKyBjOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgczEgPSBzZWdFeHRlbnQ7CiAgICAgICAgICAgIHMwID0gTWF0aC5tYXgoMCwgLShhMDEgKiBzMSArIGIwKSk7CiAgICAgICAgICAgIHNxckRpc3QgPSAtczAgKiBzMCArIHMxICogKHMxICsgMiAqIGIxKSArIGM7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHMxID0gLXNlZ0V4dGVudDsKICAgICAgICAgIHMwID0gTWF0aC5tYXgoMCwgLShhMDEgKiBzMSArIGIwKSk7CiAgICAgICAgICBzcXJEaXN0ID0gLXMwICogczAgKyBzMSAqIChzMSArIDIgKiBiMSkgKyBjOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoczEgPD0gLWV4dERldCkgewogICAgICAgICAgczAgPSBNYXRoLm1heCgwLCAtKC1hMDEgKiBzZWdFeHRlbnQgKyBiMCkpOwogICAgICAgICAgczEgPSBzMCA+IDAgPyAtc2VnRXh0ZW50IDogTWF0aC5taW4oTWF0aC5tYXgoLXNlZ0V4dGVudCwgLWIxKSwgc2VnRXh0ZW50KTsKICAgICAgICAgIHNxckRpc3QgPSAtczAgKiBzMCArIHMxICogKHMxICsgMiAqIGIxKSArIGM7CiAgICAgICAgfSBlbHNlIGlmIChzMSA8PSBleHREZXQpIHsKICAgICAgICAgIHMwID0gMDsKICAgICAgICAgIHMxID0gTWF0aC5taW4oTWF0aC5tYXgoLXNlZ0V4dGVudCwgLWIxKSwgc2VnRXh0ZW50KTsKICAgICAgICAgIHNxckRpc3QgPSBzMSAqIChzMSArIDIgKiBiMSkgKyBjOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzMCA9IE1hdGgubWF4KDAsIC0oYTAxICogc2VnRXh0ZW50ICsgYjApKTsKICAgICAgICAgIHMxID0gczAgPiAwID8gc2VnRXh0ZW50IDogTWF0aC5taW4oTWF0aC5tYXgoLXNlZ0V4dGVudCwgLWIxKSwgc2VnRXh0ZW50KTsKICAgICAgICAgIHNxckRpc3QgPSAtczAgKiBzMCArIHMxICogKHMxICsgMiAqIGIxKSArIGM7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzMSA9IGEwMSA+IDAgPyAtc2VnRXh0ZW50IDogc2VnRXh0ZW50OwogICAgICBzMCA9IE1hdGgubWF4KDAsIC0oYTAxICogczEgKyBiMCkpOwogICAgICBzcXJEaXN0ID0gLXMwICogczAgKyBzMSAqIChzMSArIDIgKiBiMSkgKyBjOwogICAgfQogICAgaWYgKG9wdGlvbmFsUG9pbnRPblJheSkgewogICAgICBvcHRpb25hbFBvaW50T25SYXkuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLCBzMCk7CiAgICB9CiAgICBpZiAob3B0aW9uYWxQb2ludE9uU2VnbWVudCkgewogICAgICBvcHRpb25hbFBvaW50T25TZWdtZW50LmNvcHkoX3NlZ0NlbnRlcikuYWRkU2NhbGVkVmVjdG9yKF9zZWdEaXIsIHMxKTsKICAgIH0KICAgIHJldHVybiBzcXJEaXN0OwogIH0KICBpbnRlcnNlY3RTcGhlcmUoc3BoZXJlLCB0YXJnZXQpIHsKICAgIF92ZWN0b3IkYS5zdWJWZWN0b3JzKHNwaGVyZS5jZW50ZXIsIHRoaXMub3JpZ2luKTsKICAgIGNvbnN0IHRjYSA9IF92ZWN0b3IkYS5kb3QodGhpcy5kaXJlY3Rpb24pOwogICAgY29uc3QgZDIgPSBfdmVjdG9yJGEuZG90KF92ZWN0b3IkYSkgLSB0Y2EgKiB0Y2E7CiAgICBjb25zdCByYWRpdXMyID0gc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXM7CiAgICBpZiAoZDIgPiByYWRpdXMyKQogICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IHRoYyA9IE1hdGguc3FydChyYWRpdXMyIC0gZDIpOwogICAgY29uc3QgdDAgPSB0Y2EgLSB0aGM7CiAgICBjb25zdCB0MSA9IHRjYSArIHRoYzsKICAgIGlmICh0MSA8IDApCiAgICAgIHJldHVybiBudWxsOwogICAgaWYgKHQwIDwgMCkKICAgICAgcmV0dXJuIHRoaXMuYXQodDEsIHRhcmdldCk7CiAgICByZXR1cm4gdGhpcy5hdCh0MCwgdGFyZ2V0KTsKICB9CiAgaW50ZXJzZWN0c1NwaGVyZShzcGhlcmUpIHsKICAgIHJldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KHNwaGVyZS5jZW50ZXIpIDw9IHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzOwogIH0KICBkaXN0YW5jZVRvUGxhbmUocGxhbmUpIHsKICAgIGNvbnN0IGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbik7CiAgICBpZiAoZGVub21pbmF0b3IgPT09IDApIHsKICAgICAgaWYgKHBsYW5lLmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbikgPT09IDApIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHQgPSAtKHRoaXMub3JpZ2luLmRvdChwbGFuZS5ub3JtYWwpICsgcGxhbmUuY29uc3RhbnQpIC8gZGVub21pbmF0b3I7CiAgICByZXR1cm4gdCA+PSAwID8gdCA6IG51bGw7CiAgfQogIGludGVyc2VjdFBsYW5lKHBsYW5lLCB0YXJnZXQpIHsKICAgIGNvbnN0IHQgPSB0aGlzLmRpc3RhbmNlVG9QbGFuZShwbGFuZSk7CiAgICBpZiAodCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiB0aGlzLmF0KHQsIHRhcmdldCk7CiAgfQogIGludGVyc2VjdHNQbGFuZShwbGFuZSkgewogICAgY29uc3QgZGlzdFRvUG9pbnQgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pOwogICAgaWYgKGRpc3RUb1BvaW50ID09PSAwKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgY29uc3QgZGVub21pbmF0b3IgPSBwbGFuZS5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKTsKICAgIGlmIChkZW5vbWluYXRvciAqIGRpc3RUb1BvaW50IDwgMCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgaW50ZXJzZWN0Qm94KGJveCwgdGFyZ2V0KSB7CiAgICBsZXQgdG1pbiwgdG1heCwgdHltaW4sIHR5bWF4LCB0em1pbiwgdHptYXg7CiAgICBjb25zdCBpbnZkaXJ4ID0gMSAvIHRoaXMuZGlyZWN0aW9uLngsIGludmRpcnkgPSAxIC8gdGhpcy5kaXJlY3Rpb24ueSwgaW52ZGlyeiA9IDEgLyB0aGlzLmRpcmVjdGlvbi56OwogICAgY29uc3Qgb3JpZ2luID0gdGhpcy5vcmlnaW47CiAgICBpZiAoaW52ZGlyeCA+PSAwKSB7CiAgICAgIHRtaW4gPSAoYm94Lm1pbi54IC0gb3JpZ2luLngpICogaW52ZGlyeDsKICAgICAgdG1heCA9IChib3gubWF4LnggLSBvcmlnaW4ueCkgKiBpbnZkaXJ4OwogICAgfSBlbHNlIHsKICAgICAgdG1pbiA9IChib3gubWF4LnggLSBvcmlnaW4ueCkgKiBpbnZkaXJ4OwogICAgICB0bWF4ID0gKGJveC5taW4ueCAtIG9yaWdpbi54KSAqIGludmRpcng7CiAgICB9CiAgICBpZiAoaW52ZGlyeSA+PSAwKSB7CiAgICAgIHR5bWluID0gKGJveC5taW4ueSAtIG9yaWdpbi55KSAqIGludmRpcnk7CiAgICAgIHR5bWF4ID0gKGJveC5tYXgueSAtIG9yaWdpbi55KSAqIGludmRpcnk7CiAgICB9IGVsc2UgewogICAgICB0eW1pbiA9IChib3gubWF4LnkgLSBvcmlnaW4ueSkgKiBpbnZkaXJ5OwogICAgICB0eW1heCA9IChib3gubWluLnkgLSBvcmlnaW4ueSkgKiBpbnZkaXJ5OwogICAgfQogICAgaWYgKHRtaW4gPiB0eW1heCB8fCB0eW1pbiA+IHRtYXgpCiAgICAgIHJldHVybiBudWxsOwogICAgaWYgKHR5bWluID4gdG1pbiB8fCBpc05hTih0bWluKSkKICAgICAgdG1pbiA9IHR5bWluOwogICAgaWYgKHR5bWF4IDwgdG1heCB8fCBpc05hTih0bWF4KSkKICAgICAgdG1heCA9IHR5bWF4OwogICAgaWYgKGludmRpcnogPj0gMCkgewogICAgICB0em1pbiA9IChib3gubWluLnogLSBvcmlnaW4ueikgKiBpbnZkaXJ6OwogICAgICB0em1heCA9IChib3gubWF4LnogLSBvcmlnaW4ueikgKiBpbnZkaXJ6OwogICAgfSBlbHNlIHsKICAgICAgdHptaW4gPSAoYm94Lm1heC56IC0gb3JpZ2luLnopICogaW52ZGlyejsKICAgICAgdHptYXggPSAoYm94Lm1pbi56IC0gb3JpZ2luLnopICogaW52ZGlyejsKICAgIH0KICAgIGlmICh0bWluID4gdHptYXggfHwgdHptaW4gPiB0bWF4KQogICAgICByZXR1cm4gbnVsbDsKICAgIGlmICh0em1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1pbikKICAgICAgdG1pbiA9IHR6bWluOwogICAgaWYgKHR6bWF4IDwgdG1heCB8fCB0bWF4ICE9PSB0bWF4KQogICAgICB0bWF4ID0gdHptYXg7CiAgICBpZiAodG1heCA8IDApCiAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuIHRoaXMuYXQodG1pbiA+PSAwID8gdG1pbiA6IHRtYXgsIHRhcmdldCk7CiAgfQogIGludGVyc2VjdHNCb3goYm94KSB7CiAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3goYm94LCBfdmVjdG9yJGEpICE9PSBudWxsOwogIH0KICBpbnRlcnNlY3RUcmlhbmdsZShhLCBiLCBjLCBiYWNrZmFjZUN1bGxpbmcsIHRhcmdldCkgewogICAgX2VkZ2UxLnN1YlZlY3RvcnMoYiwgYSk7CiAgICBfZWRnZTIuc3ViVmVjdG9ycyhjLCBhKTsKICAgIF9ub3JtYWwkMS5jcm9zc1ZlY3RvcnMoX2VkZ2UxLCBfZWRnZTIpOwogICAgbGV0IERkTiA9IHRoaXMuZGlyZWN0aW9uLmRvdChfbm9ybWFsJDEpOwogICAgbGV0IHNpZ247CiAgICBpZiAoRGROID4gMCkgewogICAgICBpZiAoYmFja2ZhY2VDdWxsaW5nKQogICAgICAgIHJldHVybiBudWxsOwogICAgICBzaWduID0gMTsKICAgIH0gZWxzZSBpZiAoRGROIDwgMCkgewogICAgICBzaWduID0gLTE7CiAgICAgIERkTiA9IC1EZE47CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIF9kaWZmLnN1YlZlY3RvcnModGhpcy5vcmlnaW4sIGEpOwogICAgY29uc3QgRGRReEUyID0gc2lnbiAqIHRoaXMuZGlyZWN0aW9uLmRvdChfZWRnZTIuY3Jvc3NWZWN0b3JzKF9kaWZmLCBfZWRnZTIpKTsKICAgIGlmIChEZFF4RTIgPCAwKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgRGRFMXhRID0gc2lnbiAqIHRoaXMuZGlyZWN0aW9uLmRvdChfZWRnZTEuY3Jvc3MoX2RpZmYpKTsKICAgIGlmIChEZEUxeFEgPCAwKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKERkUXhFMiArIERkRTF4USA+IERkTikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IFFkTiA9IC1zaWduICogX2RpZmYuZG90KF9ub3JtYWwkMSk7CiAgICBpZiAoUWROIDwgMCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiB0aGlzLmF0KFFkTiAvIERkTiwgdGFyZ2V0KTsKICB9CiAgYXBwbHlNYXRyaXg0KG1hdHJpeDQpIHsKICAgIHRoaXMub3JpZ2luLmFwcGx5TWF0cml4NChtYXRyaXg0KTsKICAgIHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihtYXRyaXg0KTsKICAgIHJldHVybiB0aGlzOwogIH0KICBlcXVhbHMocmF5KSB7CiAgICByZXR1cm4gcmF5Lm9yaWdpbi5lcXVhbHModGhpcy5vcmlnaW4pICYmIHJheS5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKTsKICB9CiAgY2xvbmUoKSB7CiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpOwogIH0KfQoKY2xhc3MgTWF0cml4NCB7CiAgY29uc3RydWN0b3IobjExLCBuMTIsIG4xMywgbjE0LCBuMjEsIG4yMiwgbjIzLCBuMjQsIG4zMSwgbjMyLCBuMzMsIG4zNCwgbjQxLCBuNDIsIG40MywgbjQ0KSB7CiAgICBNYXRyaXg0LnByb3RvdHlwZS5pc01hdHJpeDQgPSB0cnVlOwogICAgdGhpcy5lbGVtZW50cyA9IFsKICAgICAgMSwKICAgICAgMCwKICAgICAgMCwKICAgICAgMCwKICAgICAgMCwKICAgICAgMSwKICAgICAgMCwKICAgICAgMCwKICAgICAgMCwKICAgICAgMCwKICAgICAgMSwKICAgICAgMCwKICAgICAgMCwKICAgICAgMCwKICAgICAgMCwKICAgICAgMQogICAgXTsKICAgIGlmIChuMTEgIT09IHVuZGVmaW5lZCkgewogICAgICB0aGlzLnNldChuMTEsIG4xMiwgbjEzLCBuMTQsIG4yMSwgbjIyLCBuMjMsIG4yNCwgbjMxLCBuMzIsIG4zMywgbjM0LCBuNDEsIG40MiwgbjQzLCBuNDQpOwogICAgfQogIH0KICBzZXQobjExLCBuMTIsIG4xMywgbjE0LCBuMjEsIG4yMiwgbjIzLCBuMjQsIG4zMSwgbjMyLCBuMzMsIG4zNCwgbjQxLCBuNDIsIG40MywgbjQ0KSB7CiAgICBjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7CiAgICB0ZVswXSA9IG4xMTsKICAgIHRlWzRdID0gbjEyOwogICAgdGVbOF0gPSBuMTM7CiAgICB0ZVsxMl0gPSBuMTQ7CiAgICB0ZVsxXSA9IG4yMTsKICAgIHRlWzVdID0gbjIyOwogICAgdGVbOV0gPSBuMjM7CiAgICB0ZVsxM10gPSBuMjQ7CiAgICB0ZVsyXSA9IG4zMTsKICAgIHRlWzZdID0gbjMyOwogICAgdGVbMTBdID0gbjMzOwogICAgdGVbMTRdID0gbjM0OwogICAgdGVbM10gPSBuNDE7CiAgICB0ZVs3XSA9IG40MjsKICAgIHRlWzExXSA9IG40MzsKICAgIHRlWzE1XSA9IG40NDsKICAgIHJldHVybiB0aGlzOwogIH0KICBpZGVudGl0eSgpIHsKICAgIHRoaXMuc2V0KDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGNsb25lKCkgewogICAgcmV0dXJuIG5ldyBNYXRyaXg0KCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpOwogIH0KICBjb3B5KG0pIHsKICAgIGNvbnN0IHRlID0gdGhpcy5lbGVtZW50czsKICAgIGNvbnN0IG1lID0gbS5lbGVtZW50czsKICAgIHRlWzBdID0gbWVbMF07CiAgICB0ZVsxXSA9IG1lWzFdOwogICAgdGVbMl0gPSBtZVsyXTsKICAgIHRlWzNdID0gbWVbM107CiAgICB0ZVs0XSA9IG1lWzRdOwogICAgdGVbNV0gPSBtZVs1XTsKICAgIHRlWzZdID0gbWVbNl07CiAgICB0ZVs3XSA9IG1lWzddOwogICAgdGVbOF0gPSBtZVs4XTsKICAgIHRlWzldID0gbWVbOV07CiAgICB0ZVsxMF0gPSBtZVsxMF07CiAgICB0ZVsxMV0gPSBtZVsxMV07CiAgICB0ZVsxMl0gPSBtZVsxMl07CiAgICB0ZVsxM10gPSBtZVsxM107CiAgICB0ZVsxNF0gPSBtZVsxNF07CiAgICB0ZVsxNV0gPSBtZVsxNV07CiAgICByZXR1cm4gdGhpczsKICB9CiAgY29weVBvc2l0aW9uKG0pIHsKICAgIGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cywgbWUgPSBtLmVsZW1lbnRzOwogICAgdGVbMTJdID0gbWVbMTJdOwogICAgdGVbMTNdID0gbWVbMTNdOwogICAgdGVbMTRdID0gbWVbMTRdOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldEZyb21NYXRyaXgzKG0pIHsKICAgIGNvbnN0IG1lID0gbS5lbGVtZW50czsKICAgIHRoaXMuc2V0KG1lWzBdLCBtZVszXSwgbWVbNl0sIDAsIG1lWzFdLCBtZVs0XSwgbWVbN10sIDAsIG1lWzJdLCBtZVs1XSwgbWVbOF0sIDAsIDAsIDAsIDAsIDEpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGV4dHJhY3RCYXNpcyh4QXhpcywgeUF4aXMsIHpBeGlzKSB7CiAgICB4QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsIDApOwogICAgeUF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLCAxKTsKICAgIHpBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywgMik7CiAgICByZXR1cm4gdGhpczsKICB9CiAgbWFrZUJhc2lzKHhBeGlzLCB5QXhpcywgekF4aXMpIHsKICAgIHRoaXMuc2V0KHhBeGlzLngsIHlBeGlzLngsIHpBeGlzLngsIDAsIHhBeGlzLnksIHlBeGlzLnksIHpBeGlzLnksIDAsIHhBeGlzLnosIHlBeGlzLnosIHpBeGlzLnosIDAsIDAsIDAsIDAsIDEpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGV4dHJhY3RSb3RhdGlvbihtKSB7CiAgICBjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7CiAgICBjb25zdCBtZSA9IG0uZWxlbWVudHM7CiAgICBjb25zdCBzY2FsZVggPSAxIC8gX3YxJDUuc2V0RnJvbU1hdHJpeENvbHVtbihtLCAwKS5sZW5ndGgoKTsKICAgIGNvbnN0IHNjYWxlWSA9IDEgLyBfdjEkNS5zZXRGcm9tTWF0cml4Q29sdW1uKG0sIDEpLmxlbmd0aCgpOwogICAgY29uc3Qgc2NhbGVaID0gMSAvIF92MSQ1LnNldEZyb21NYXRyaXhDb2x1bW4obSwgMikubGVuZ3RoKCk7CiAgICB0ZVswXSA9IG1lWzBdICogc2NhbGVYOwogICAgdGVbMV0gPSBtZVsxXSAqIHNjYWxlWDsKICAgIHRlWzJdID0gbWVbMl0gKiBzY2FsZVg7CiAgICB0ZVszXSA9IDA7CiAgICB0ZVs0XSA9IG1lWzRdICogc2NhbGVZOwogICAgdGVbNV0gPSBtZVs1XSAqIHNjYWxlWTsKICAgIHRlWzZdID0gbWVbNl0gKiBzY2FsZVk7CiAgICB0ZVs3XSA9IDA7CiAgICB0ZVs4XSA9IG1lWzhdICogc2NhbGVaOwogICAgdGVbOV0gPSBtZVs5XSAqIHNjYWxlWjsKICAgIHRlWzEwXSA9IG1lWzEwXSAqIHNjYWxlWjsKICAgIHRlWzExXSA9IDA7CiAgICB0ZVsxMl0gPSAwOwogICAgdGVbMTNdID0gMDsKICAgIHRlWzE0XSA9IDA7CiAgICB0ZVsxNV0gPSAxOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIG1ha2VSb3RhdGlvbkZyb21FdWxlcihldWxlcikgewogICAgY29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzOwogICAgY29uc3QgeyB4LCB5LCB6IH0gPSBldWxlcjsKICAgIGNvbnN0IGEgPSBNYXRoLmNvcyh4KSwgYiA9IE1hdGguc2luKHgpOwogICAgY29uc3QgYyA9IE1hdGguY29zKHkpLCBkID0gTWF0aC5zaW4oeSk7CiAgICBjb25zdCBlID0gTWF0aC5jb3MoeiksIGYgPSBNYXRoLnNpbih6KTsKICAgIGlmIChldWxlci5vcmRlciA9PT0gIlhZWiIpIHsKICAgICAgY29uc3QgYWUgPSBhICogZSwgYWYgPSBhICogZiwgYmUgPSBiICogZSwgYmYgPSBiICogZjsKICAgICAgdGVbMF0gPSBjICogZTsKICAgICAgdGVbNF0gPSAtYyAqIGY7CiAgICAgIHRlWzhdID0gZDsKICAgICAgdGVbMV0gPSBhZiArIGJlICogZDsKICAgICAgdGVbNV0gPSBhZSAtIGJmICogZDsKICAgICAgdGVbOV0gPSAtYiAqIGM7CiAgICAgIHRlWzJdID0gYmYgLSBhZSAqIGQ7CiAgICAgIHRlWzZdID0gYmUgKyBhZiAqIGQ7CiAgICAgIHRlWzEwXSA9IGEgKiBjOwogICAgfSBlbHNlIGlmIChldWxlci5vcmRlciA9PT0gIllYWiIpIHsKICAgICAgY29uc3QgY2UgPSBjICogZSwgY2YgPSBjICogZiwgZGUgPSBkICogZSwgZGYgPSBkICogZjsKICAgICAgdGVbMF0gPSBjZSArIGRmICogYjsKICAgICAgdGVbNF0gPSBkZSAqIGIgLSBjZjsKICAgICAgdGVbOF0gPSBhICogZDsKICAgICAgdGVbMV0gPSBhICogZjsKICAgICAgdGVbNV0gPSBhICogZTsKICAgICAgdGVbOV0gPSAtYjsKICAgICAgdGVbMl0gPSBjZiAqIGIgLSBkZTsKICAgICAgdGVbNl0gPSBkZiArIGNlICogYjsKICAgICAgdGVbMTBdID0gYSAqIGM7CiAgICB9IGVsc2UgaWYgKGV1bGVyLm9yZGVyID09PSAiWlhZIikgewogICAgICBjb25zdCBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmOwogICAgICB0ZVswXSA9IGNlIC0gZGYgKiBiOwogICAgICB0ZVs0XSA9IC1hICogZjsKICAgICAgdGVbOF0gPSBkZSArIGNmICogYjsKICAgICAgdGVbMV0gPSBjZiArIGRlICogYjsKICAgICAgdGVbNV0gPSBhICogZTsKICAgICAgdGVbOV0gPSBkZiAtIGNlICogYjsKICAgICAgdGVbMl0gPSAtYSAqIGQ7CiAgICAgIHRlWzZdID0gYjsKICAgICAgdGVbMTBdID0gYSAqIGM7CiAgICB9IGVsc2UgaWYgKGV1bGVyLm9yZGVyID09PSAiWllYIikgewogICAgICBjb25zdCBhZSA9IGEgKiBlLCBhZiA9IGEgKiBmLCBiZSA9IGIgKiBlLCBiZiA9IGIgKiBmOwogICAgICB0ZVswXSA9IGMgKiBlOwogICAgICB0ZVs0XSA9IGJlICogZCAtIGFmOwogICAgICB0ZVs4XSA9IGFlICogZCArIGJmOwogICAgICB0ZVsxXSA9IGMgKiBmOwogICAgICB0ZVs1XSA9IGJmICogZCArIGFlOwogICAgICB0ZVs5XSA9IGFmICogZCAtIGJlOwogICAgICB0ZVsyXSA9IC1kOwogICAgICB0ZVs2XSA9IGIgKiBjOwogICAgICB0ZVsxMF0gPSBhICogYzsKICAgIH0gZWxzZSBpZiAoZXVsZXIub3JkZXIgPT09ICJZWlgiKSB7CiAgICAgIGNvbnN0IGFjID0gYSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7CiAgICAgIHRlWzBdID0gYyAqIGU7CiAgICAgIHRlWzRdID0gYmQgLSBhYyAqIGY7CiAgICAgIHRlWzhdID0gYmMgKiBmICsgYWQ7CiAgICAgIHRlWzFdID0gZjsKICAgICAgdGVbNV0gPSBhICogZTsKICAgICAgdGVbOV0gPSAtYiAqIGU7CiAgICAgIHRlWzJdID0gLWQgKiBlOwogICAgICB0ZVs2XSA9IGFkICogZiArIGJjOwogICAgICB0ZVsxMF0gPSBhYyAtIGJkICogZjsKICAgIH0gZWxzZSBpZiAoZXVsZXIub3JkZXIgPT09ICJYWlkiKSB7CiAgICAgIGNvbnN0IGFjID0gYSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7CiAgICAgIHRlWzBdID0gYyAqIGU7CiAgICAgIHRlWzRdID0gLWY7CiAgICAgIHRlWzhdID0gZCAqIGU7CiAgICAgIHRlWzFdID0gYWMgKiBmICsgYmQ7CiAgICAgIHRlWzVdID0gYSAqIGU7CiAgICAgIHRlWzldID0gYWQgKiBmIC0gYmM7CiAgICAgIHRlWzJdID0gYmMgKiBmIC0gYWQ7CiAgICAgIHRlWzZdID0gYiAqIGU7CiAgICAgIHRlWzEwXSA9IGJkICogZiArIGFjOwogICAgfQogICAgdGVbM10gPSAwOwogICAgdGVbN10gPSAwOwogICAgdGVbMTFdID0gMDsKICAgIHRlWzEyXSA9IDA7CiAgICB0ZVsxM10gPSAwOwogICAgdGVbMTRdID0gMDsKICAgIHRlWzE1XSA9IDE7CiAgICByZXR1cm4gdGhpczsKICB9CiAgbWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24ocSkgewogICAgcmV0dXJuIHRoaXMuY29tcG9zZShfemVybywgcSwgX29uZSk7CiAgfQogIGxvb2tBdChleWUsIHRhcmdldCwgdXApIHsKICAgIGNvbnN0IHRlID0gdGhpcy5lbGVtZW50czsKICAgIF96LnN1YlZlY3RvcnMoZXllLCB0YXJnZXQpOwogICAgaWYgKF96Lmxlbmd0aFNxKCkgPT09IDApIHsKICAgICAgX3oueiA9IDE7CiAgICB9CiAgICBfei5ub3JtYWxpemUoKTsKICAgIF94LmNyb3NzVmVjdG9ycyh1cCwgX3opOwogICAgaWYgKF94Lmxlbmd0aFNxKCkgPT09IDApIHsKICAgICAgaWYgKE1hdGguYWJzKHVwLnopID09PSAxKSB7CiAgICAgICAgX3oueCArPSAwLjAwMDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3oueiArPSAwLjAwMDE7CiAgICAgIH0KICAgICAgX3oubm9ybWFsaXplKCk7CiAgICAgIF94LmNyb3NzVmVjdG9ycyh1cCwgX3opOwogICAgfQogICAgX3gubm9ybWFsaXplKCk7CiAgICBfeS5jcm9zc1ZlY3RvcnMoX3osIF94KTsKICAgIHRlWzBdID0gX3gueDsKICAgIHRlWzRdID0gX3kueDsKICAgIHRlWzhdID0gX3oueDsKICAgIHRlWzFdID0gX3gueTsKICAgIHRlWzVdID0gX3kueTsKICAgIHRlWzldID0gX3oueTsKICAgIHRlWzJdID0gX3guejsKICAgIHRlWzZdID0gX3kuejsKICAgIHRlWzEwXSA9IF96Lno7CiAgICByZXR1cm4gdGhpczsKICB9CiAgbXVsdGlwbHkobSkgewogICAgcmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLCBtKTsKICB9CiAgcHJlbXVsdGlwbHkobSkgewogICAgcmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyhtLCB0aGlzKTsKICB9CiAgbXVsdGlwbHlNYXRyaWNlcyhhLCBiKSB7CiAgICBjb25zdCBhZSA9IGEuZWxlbWVudHM7CiAgICBjb25zdCBiZSA9IGIuZWxlbWVudHM7CiAgICBjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7CiAgICBjb25zdCBhMTEgPSBhZVswXSwgYTEyID0gYWVbNF0sIGExMyA9IGFlWzhdLCBhMTQgPSBhZVsxMl07CiAgICBjb25zdCBhMjEgPSBhZVsxXSwgYTIyID0gYWVbNV0sIGEyMyA9IGFlWzldLCBhMjQgPSBhZVsxM107CiAgICBjb25zdCBhMzEgPSBhZVsyXSwgYTMyID0gYWVbNl0sIGEzMyA9IGFlWzEwXSwgYTM0ID0gYWVbMTRdOwogICAgY29uc3QgYTQxID0gYWVbM10sIGE0MiA9IGFlWzddLCBhNDMgPSBhZVsxMV0sIGE0NCA9IGFlWzE1XTsKICAgIGNvbnN0IGIxMSA9IGJlWzBdLCBiMTIgPSBiZVs0XSwgYjEzID0gYmVbOF0sIGIxNCA9IGJlWzEyXTsKICAgIGNvbnN0IGIyMSA9IGJlWzFdLCBiMjIgPSBiZVs1XSwgYjIzID0gYmVbOV0sIGIyNCA9IGJlWzEzXTsKICAgIGNvbnN0IGIzMSA9IGJlWzJdLCBiMzIgPSBiZVs2XSwgYjMzID0gYmVbMTBdLCBiMzQgPSBiZVsxNF07CiAgICBjb25zdCBiNDEgPSBiZVszXSwgYjQyID0gYmVbN10sIGI0MyA9IGJlWzExXSwgYjQ0ID0gYmVbMTVdOwogICAgdGVbMF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzEgKyBhMTQgKiBiNDE7CiAgICB0ZVs0XSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMiArIGExNCAqIGI0MjsKICAgIHRlWzhdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzICsgYTE0ICogYjQzOwogICAgdGVbMTJdID0gYTExICogYjE0ICsgYTEyICogYjI0ICsgYTEzICogYjM0ICsgYTE0ICogYjQ0OwogICAgdGVbMV0gPSBhMjEgKiBiMTEgKyBhMjIgKiBiMjEgKyBhMjMgKiBiMzEgKyBhMjQgKiBiNDE7CiAgICB0ZVs1XSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMiArIGEyNCAqIGI0MjsKICAgIHRlWzldID0gYTIxICogYjEzICsgYTIyICogYjIzICsgYTIzICogYjMzICsgYTI0ICogYjQzOwogICAgdGVbMTNdID0gYTIxICogYjE0ICsgYTIyICogYjI0ICsgYTIzICogYjM0ICsgYTI0ICogYjQ0OwogICAgdGVbMl0gPSBhMzEgKiBiMTEgKyBhMzIgKiBiMjEgKyBhMzMgKiBiMzEgKyBhMzQgKiBiNDE7CiAgICB0ZVs2XSA9IGEzMSAqIGIxMiArIGEzMiAqIGIyMiArIGEzMyAqIGIzMiArIGEzNCAqIGI0MjsKICAgIHRlWzEwXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEzMyAqIGIzMyArIGEzNCAqIGI0MzsKICAgIHRlWzE0XSA9IGEzMSAqIGIxNCArIGEzMiAqIGIyNCArIGEzMyAqIGIzNCArIGEzNCAqIGI0NDsKICAgIHRlWzNdID0gYTQxICogYjExICsgYTQyICogYjIxICsgYTQzICogYjMxICsgYTQ0ICogYjQxOwogICAgdGVbN10gPSBhNDEgKiBiMTIgKyBhNDIgKiBiMjIgKyBhNDMgKiBiMzIgKyBhNDQgKiBiNDI7CiAgICB0ZVsxMV0gPSBhNDEgKiBiMTMgKyBhNDIgKiBiMjMgKyBhNDMgKiBiMzMgKyBhNDQgKiBiNDM7CiAgICB0ZVsxNV0gPSBhNDEgKiBiMTQgKyBhNDIgKiBiMjQgKyBhNDMgKiBiMzQgKyBhNDQgKiBiNDQ7CiAgICByZXR1cm4gdGhpczsKICB9CiAgbXVsdGlwbHlTY2FsYXIocykgewogICAgY29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzOwogICAgdGVbMF0gKj0gczsKICAgIHRlWzRdICo9IHM7CiAgICB0ZVs4XSAqPSBzOwogICAgdGVbMTJdICo9IHM7CiAgICB0ZVsxXSAqPSBzOwogICAgdGVbNV0gKj0gczsKICAgIHRlWzldICo9IHM7CiAgICB0ZVsxM10gKj0gczsKICAgIHRlWzJdICo9IHM7CiAgICB0ZVs2XSAqPSBzOwogICAgdGVbMTBdICo9IHM7CiAgICB0ZVsxNF0gKj0gczsKICAgIHRlWzNdICo9IHM7CiAgICB0ZVs3XSAqPSBzOwogICAgdGVbMTFdICo9IHM7CiAgICB0ZVsxNV0gKj0gczsKICAgIHJldHVybiB0aGlzOwogIH0KICBkZXRlcm1pbmFudCgpIHsKICAgIGNvbnN0IHRlID0gdGhpcy5lbGVtZW50czsKICAgIGNvbnN0IG4xMSA9IHRlWzBdLCBuMTIgPSB0ZVs0XSwgbjEzID0gdGVbOF0sIG4xNCA9IHRlWzEyXTsKICAgIGNvbnN0IG4yMSA9IHRlWzFdLCBuMjIgPSB0ZVs1XSwgbjIzID0gdGVbOV0sIG4yNCA9IHRlWzEzXTsKICAgIGNvbnN0IG4zMSA9IHRlWzJdLCBuMzIgPSB0ZVs2XSwgbjMzID0gdGVbMTBdLCBuMzQgPSB0ZVsxNF07CiAgICBjb25zdCBuNDEgPSB0ZVszXSwgbjQyID0gdGVbN10sIG40MyA9IHRlWzExXSwgbjQ0ID0gdGVbMTVdOwogICAgcmV0dXJuIG40MSAqICgrbjE0ICogbjIzICogbjMyIC0gbjEzICogbjI0ICogbjMyIC0gbjE0ICogbjIyICogbjMzICsgbjEyICogbjI0ICogbjMzICsgbjEzICogbjIyICogbjM0IC0gbjEyICogbjIzICogbjM0KSArIG40MiAqICgrbjExICogbjIzICogbjM0IC0gbjExICogbjI0ICogbjMzICsgbjE0ICogbjIxICogbjMzIC0gbjEzICogbjIxICogbjM0ICsgbjEzICogbjI0ICogbjMxIC0gbjE0ICogbjIzICogbjMxKSArIG40MyAqICgrbjExICogbjI0ICogbjMyIC0gbjExICogbjIyICogbjM0IC0gbjE0ICogbjIxICogbjMyICsgbjEyICogbjIxICogbjM0ICsgbjE0ICogbjIyICogbjMxIC0gbjEyICogbjI0ICogbjMxKSArIG40NCAqICgtbjEzICogbjIyICogbjMxIC0gbjExICogbjIzICogbjMyICsgbjExICogbjIyICogbjMzICsgbjEzICogbjIxICogbjMyIC0gbjEyICogbjIxICogbjMzICsgbjEyICogbjIzICogbjMxKTsKICB9CiAgdHJhbnNwb3NlKCkgewogICAgY29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzOwogICAgbGV0IHRtcDsKICAgIHRtcCA9IHRlWzFdOwogICAgdGVbMV0gPSB0ZVs0XTsKICAgIHRlWzRdID0gdG1wOwogICAgdG1wID0gdGVbMl07CiAgICB0ZVsyXSA9IHRlWzhdOwogICAgdGVbOF0gPSB0bXA7CiAgICB0bXAgPSB0ZVs2XTsKICAgIHRlWzZdID0gdGVbOV07CiAgICB0ZVs5XSA9IHRtcDsKICAgIHRtcCA9IHRlWzNdOwogICAgdGVbM10gPSB0ZVsxMl07CiAgICB0ZVsxMl0gPSB0bXA7CiAgICB0bXAgPSB0ZVs3XTsKICAgIHRlWzddID0gdGVbMTNdOwogICAgdGVbMTNdID0gdG1wOwogICAgdG1wID0gdGVbMTFdOwogICAgdGVbMTFdID0gdGVbMTRdOwogICAgdGVbMTRdID0gdG1wOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldFBvc2l0aW9uKHgsIHksIHopIHsKICAgIGNvbnN0IHRlID0gdGhpcy5lbGVtZW50czsKICAgIGlmICh4LmlzVmVjdG9yMykgewogICAgICB0ZVsxMl0gPSB4Lng7CiAgICAgIHRlWzEzXSA9IHgueTsKICAgICAgdGVbMTRdID0geC56OwogICAgfSBlbHNlIHsKICAgICAgdGVbMTJdID0geDsKICAgICAgdGVbMTNdID0geTsKICAgICAgdGVbMTRdID0gejsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KICBpbnZlcnQoKSB7CiAgICBjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHMsIG4xMSA9IHRlWzBdLCBuMjEgPSB0ZVsxXSwgbjMxID0gdGVbMl0sIG40MSA9IHRlWzNdLCBuMTIgPSB0ZVs0XSwgbjIyID0gdGVbNV0sIG4zMiA9IHRlWzZdLCBuNDIgPSB0ZVs3XSwgbjEzID0gdGVbOF0sIG4yMyA9IHRlWzldLCBuMzMgPSB0ZVsxMF0sIG40MyA9IHRlWzExXSwgbjE0ID0gdGVbMTJdLCBuMjQgPSB0ZVsxM10sIG4zNCA9IHRlWzE0XSwgbjQ0ID0gdGVbMTVdLCB0MTEgPSBuMjMgKiBuMzQgKiBuNDIgLSBuMjQgKiBuMzMgKiBuNDIgKyBuMjQgKiBuMzIgKiBuNDMgLSBuMjIgKiBuMzQgKiBuNDMgLSBuMjMgKiBuMzIgKiBuNDQgKyBuMjIgKiBuMzMgKiBuNDQsIHQxMiA9IG4xNCAqIG4zMyAqIG40MiAtIG4xMyAqIG4zNCAqIG40MiAtIG4xNCAqIG4zMiAqIG40MyArIG4xMiAqIG4zNCAqIG40MyArIG4xMyAqIG4zMiAqIG40NCAtIG4xMiAqIG4zMyAqIG40NCwgdDEzID0gbjEzICogbjI0ICogbjQyIC0gbjE0ICogbjIzICogbjQyICsgbjE0ICogbjIyICogbjQzIC0gbjEyICogbjI0ICogbjQzIC0gbjEzICogbjIyICogbjQ0ICsgbjEyICogbjIzICogbjQ0LCB0MTQgPSBuMTQgKiBuMjMgKiBuMzIgLSBuMTMgKiBuMjQgKiBuMzIgLSBuMTQgKiBuMjIgKiBuMzMgKyBuMTIgKiBuMjQgKiBuMzMgKyBuMTMgKiBuMjIgKiBuMzQgLSBuMTIgKiBuMjMgKiBuMzQ7CiAgICBjb25zdCBkZXQgPSBuMTEgKiB0MTEgKyBuMjEgKiB0MTIgKyBuMzEgKiB0MTMgKyBuNDEgKiB0MTQ7CiAgICBpZiAoZGV0ID09PSAwKQogICAgICByZXR1cm4gdGhpcy5zZXQoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CiAgICBjb25zdCBkZXRJbnYgPSAxIC8gZGV0OwogICAgdGVbMF0gPSB0MTEgKiBkZXRJbnY7CiAgICB0ZVsxXSA9IChuMjQgKiBuMzMgKiBuNDEgLSBuMjMgKiBuMzQgKiBuNDEgLSBuMjQgKiBuMzEgKiBuNDMgKyBuMjEgKiBuMzQgKiBuNDMgKyBuMjMgKiBuMzEgKiBuNDQgLSBuMjEgKiBuMzMgKiBuNDQpICogZGV0SW52OwogICAgdGVbMl0gPSAobjIyICogbjM0ICogbjQxIC0gbjI0ICogbjMyICogbjQxICsgbjI0ICogbjMxICogbjQyIC0gbjIxICogbjM0ICogbjQyIC0gbjIyICogbjMxICogbjQ0ICsgbjIxICogbjMyICogbjQ0KSAqIGRldEludjsKICAgIHRlWzNdID0gKG4yMyAqIG4zMiAqIG40MSAtIG4yMiAqIG4zMyAqIG40MSAtIG4yMyAqIG4zMSAqIG40MiArIG4yMSAqIG4zMyAqIG40MiArIG4yMiAqIG4zMSAqIG40MyAtIG4yMSAqIG4zMiAqIG40MykgKiBkZXRJbnY7CiAgICB0ZVs0XSA9IHQxMiAqIGRldEludjsKICAgIHRlWzVdID0gKG4xMyAqIG4zNCAqIG40MSAtIG4xNCAqIG4zMyAqIG40MSArIG4xNCAqIG4zMSAqIG40MyAtIG4xMSAqIG4zNCAqIG40MyAtIG4xMyAqIG4zMSAqIG40NCArIG4xMSAqIG4zMyAqIG40NCkgKiBkZXRJbnY7CiAgICB0ZVs2XSA9IChuMTQgKiBuMzIgKiBuNDEgLSBuMTIgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzEgKiBuNDIgKyBuMTEgKiBuMzQgKiBuNDIgKyBuMTIgKiBuMzEgKiBuNDQgLSBuMTEgKiBuMzIgKiBuNDQpICogZGV0SW52OwogICAgdGVbN10gPSAobjEyICogbjMzICogbjQxIC0gbjEzICogbjMyICogbjQxICsgbjEzICogbjMxICogbjQyIC0gbjExICogbjMzICogbjQyIC0gbjEyICogbjMxICogbjQzICsgbjExICogbjMyICogbjQzKSAqIGRldEludjsKICAgIHRlWzhdID0gdDEzICogZGV0SW52OwogICAgdGVbOV0gPSAobjE0ICogbjIzICogbjQxIC0gbjEzICogbjI0ICogbjQxIC0gbjE0ICogbjIxICogbjQzICsgbjExICogbjI0ICogbjQzICsgbjEzICogbjIxICogbjQ0IC0gbjExICogbjIzICogbjQ0KSAqIGRldEludjsKICAgIHRlWzEwXSA9IChuMTIgKiBuMjQgKiBuNDEgLSBuMTQgKiBuMjIgKiBuNDEgKyBuMTQgKiBuMjEgKiBuNDIgLSBuMTEgKiBuMjQgKiBuNDIgLSBuMTIgKiBuMjEgKiBuNDQgKyBuMTEgKiBuMjIgKiBuNDQpICogZGV0SW52OwogICAgdGVbMTFdID0gKG4xMyAqIG4yMiAqIG40MSAtIG4xMiAqIG4yMyAqIG40MSAtIG4xMyAqIG4yMSAqIG40MiArIG4xMSAqIG4yMyAqIG40MiArIG4xMiAqIG4yMSAqIG40MyAtIG4xMSAqIG4yMiAqIG40MykgKiBkZXRJbnY7CiAgICB0ZVsxMl0gPSB0MTQgKiBkZXRJbnY7CiAgICB0ZVsxM10gPSAobjEzICogbjI0ICogbjMxIC0gbjE0ICogbjIzICogbjMxICsgbjE0ICogbjIxICogbjMzIC0gbjExICogbjI0ICogbjMzIC0gbjEzICogbjIxICogbjM0ICsgbjExICogbjIzICogbjM0KSAqIGRldEludjsKICAgIHRlWzE0XSA9IChuMTQgKiBuMjIgKiBuMzEgLSBuMTIgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjEgKiBuMzIgKyBuMTEgKiBuMjQgKiBuMzIgKyBuMTIgKiBuMjEgKiBuMzQgLSBuMTEgKiBuMjIgKiBuMzQpICogZGV0SW52OwogICAgdGVbMTVdID0gKG4xMiAqIG4yMyAqIG4zMSAtIG4xMyAqIG4yMiAqIG4zMSArIG4xMyAqIG4yMSAqIG4zMiAtIG4xMSAqIG4yMyAqIG4zMiAtIG4xMiAqIG4yMSAqIG4zMyArIG4xMSAqIG4yMiAqIG4zMykgKiBkZXRJbnY7CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2NhbGUodikgewogICAgY29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzOwogICAgY29uc3QgeyB4LCB5LCB6IH0gPSB2OwogICAgdGVbMF0gKj0geDsKICAgIHRlWzRdICo9IHk7CiAgICB0ZVs4XSAqPSB6OwogICAgdGVbMV0gKj0geDsKICAgIHRlWzVdICo9IHk7CiAgICB0ZVs5XSAqPSB6OwogICAgdGVbMl0gKj0geDsKICAgIHRlWzZdICo9IHk7CiAgICB0ZVsxMF0gKj0gejsKICAgIHRlWzNdICo9IHg7CiAgICB0ZVs3XSAqPSB5OwogICAgdGVbMTFdICo9IHo7CiAgICByZXR1cm4gdGhpczsKICB9CiAgZ2V0TWF4U2NhbGVPbkF4aXMoKSB7CiAgICBjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7CiAgICBjb25zdCBzY2FsZVhTcSA9IHRlWzBdICogdGVbMF0gKyB0ZVsxXSAqIHRlWzFdICsgdGVbMl0gKiB0ZVsyXTsKICAgIGNvbnN0IHNjYWxlWVNxID0gdGVbNF0gKiB0ZVs0XSArIHRlWzVdICogdGVbNV0gKyB0ZVs2XSAqIHRlWzZdOwogICAgY29uc3Qgc2NhbGVaU3EgPSB0ZVs4XSAqIHRlWzhdICsgdGVbOV0gKiB0ZVs5XSArIHRlWzEwXSAqIHRlWzEwXTsKICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5tYXgoc2NhbGVYU3EsIHNjYWxlWVNxLCBzY2FsZVpTcSkpOwogIH0KICBtYWtlVHJhbnNsYXRpb24oeCwgeSwgeikgewogICAgaWYgKHguaXNWZWN0b3IzKSB7CiAgICAgIHRoaXMuc2V0KDEsIDAsIDAsIHgueCwgMCwgMSwgMCwgeC55LCAwLCAwLCAxLCB4LnosIDAsIDAsIDAsIDEpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5zZXQoMSwgMCwgMCwgeCwgMCwgMSwgMCwgeSwgMCwgMCwgMSwgeiwgMCwgMCwgMCwgMSk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CiAgbWFrZVJvdGF0aW9uWCh0aGV0YSkgewogICAgY29uc3QgYyA9IE1hdGguY29zKHRoZXRhKSwgcyA9IE1hdGguc2luKHRoZXRhKTsKICAgIHRoaXMuc2V0KDEsIDAsIDAsIDAsIDAsIGMsIC1zLCAwLCAwLCBzLCBjLCAwLCAwLCAwLCAwLCAxKTsKICAgIHJldHVybiB0aGlzOwogIH0KICBtYWtlUm90YXRpb25ZKHRoZXRhKSB7CiAgICBjb25zdCBjID0gTWF0aC5jb3ModGhldGEpLCBzID0gTWF0aC5zaW4odGhldGEpOwogICAgdGhpcy5zZXQoYywgMCwgcywgMCwgMCwgMSwgMCwgMCwgLXMsIDAsIGMsIDAsIDAsIDAsIDAsIDEpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIG1ha2VSb3RhdGlvbloodGhldGEpIHsKICAgIGNvbnN0IGMgPSBNYXRoLmNvcyh0aGV0YSksIHMgPSBNYXRoLnNpbih0aGV0YSk7CiAgICB0aGlzLnNldChjLCAtcywgMCwgMCwgcywgYywgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgbWFrZVJvdGF0aW9uQXhpcyhheGlzLCBhbmdsZSkgewogICAgY29uc3QgYyA9IE1hdGguY29zKGFuZ2xlKTsKICAgIGNvbnN0IHMgPSBNYXRoLnNpbihhbmdsZSk7CiAgICBjb25zdCB0ID0gMSAtIGM7CiAgICBjb25zdCB7IHgsIHksIHogfSA9IGF4aXM7CiAgICBjb25zdCB0eCA9IHQgKiB4LCB0eSA9IHQgKiB5OwogICAgdGhpcy5zZXQodHggKiB4ICsgYywgdHggKiB5IC0gcyAqIHosIHR4ICogeiArIHMgKiB5LCAwLCB0eCAqIHkgKyBzICogeiwgdHkgKiB5ICsgYywgdHkgKiB6IC0gcyAqIHgsIDAsIHR4ICogeiAtIHMgKiB5LCB0eSAqIHogKyBzICogeCwgdCAqIHogKiB6ICsgYywgMCwgMCwgMCwgMCwgMSk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgbWFrZVNjYWxlKHgsIHksIHopIHsKICAgIHRoaXMuc2V0KHgsIDAsIDAsIDAsIDAsIHksIDAsIDAsIDAsIDAsIHosIDAsIDAsIDAsIDAsIDEpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIG1ha2VTaGVhcih4eSwgeHosIHl4LCB5eiwgengsIHp5KSB7CiAgICB0aGlzLnNldCgxLCB5eCwgengsIDAsIHh5LCAxLCB6eSwgMCwgeHosIHl6LCAxLCAwLCAwLCAwLCAwLCAxKTsKICAgIHJldHVybiB0aGlzOwogIH0KICBjb21wb3NlKHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSkgewogICAgY29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzOwogICAgY29uc3QgeyBfeDogeCwgX3k6IHksIF96OiB6LCBfdzogdyB9ID0gcXVhdGVybmlvbjsKICAgIGNvbnN0IHgyID0geCArIHgsIHkyID0geSArIHksIHoyID0geiArIHo7CiAgICBjb25zdCB4eCA9IHggKiB4MiwgeHkgPSB4ICogeTIsIHh6ID0geCAqIHoyOwogICAgY29uc3QgeXkgPSB5ICogeTIsIHl6ID0geSAqIHoyLCB6eiA9IHogKiB6MjsKICAgIGNvbnN0IHd4ID0gdyAqIHgyLCB3eSA9IHcgKiB5Miwgd3ogPSB3ICogejI7CiAgICBjb25zdCB7IHg6IHN4LCB5OiBzeSwgejogc3ogfSA9IHNjYWxlOwogICAgdGVbMF0gPSAoMSAtICh5eSArIHp6KSkgKiBzeDsKICAgIHRlWzFdID0gKHh5ICsgd3opICogc3g7CiAgICB0ZVsyXSA9ICh4eiAtIHd5KSAqIHN4OwogICAgdGVbM10gPSAwOwogICAgdGVbNF0gPSAoeHkgLSB3eikgKiBzeTsKICAgIHRlWzVdID0gKDEgLSAoeHggKyB6eikpICogc3k7CiAgICB0ZVs2XSA9ICh5eiArIHd4KSAqIHN5OwogICAgdGVbN10gPSAwOwogICAgdGVbOF0gPSAoeHogKyB3eSkgKiBzejsKICAgIHRlWzldID0gKHl6IC0gd3gpICogc3o7CiAgICB0ZVsxMF0gPSAoMSAtICh4eCArIHl5KSkgKiBzejsKICAgIHRlWzExXSA9IDA7CiAgICB0ZVsxMl0gPSBwb3NpdGlvbi54OwogICAgdGVbMTNdID0gcG9zaXRpb24ueTsKICAgIHRlWzE0XSA9IHBvc2l0aW9uLno7CiAgICB0ZVsxNV0gPSAxOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGRlY29tcG9zZShwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUpIHsKICAgIGNvbnN0IHRlID0gdGhpcy5lbGVtZW50czsKICAgIGxldCBzeCA9IF92MSQ1LnNldCh0ZVswXSwgdGVbMV0sIHRlWzJdKS5sZW5ndGgoKTsKICAgIGNvbnN0IHN5ID0gX3YxJDUuc2V0KHRlWzRdLCB0ZVs1XSwgdGVbNl0pLmxlbmd0aCgpOwogICAgY29uc3Qgc3ogPSBfdjEkNS5zZXQodGVbOF0sIHRlWzldLCB0ZVsxMF0pLmxlbmd0aCgpOwogICAgY29uc3QgZGV0ID0gdGhpcy5kZXRlcm1pbmFudCgpOwogICAgaWYgKGRldCA8IDApCiAgICAgIHN4ID0gLXN4OwogICAgcG9zaXRpb24ueCA9IHRlWzEyXTsKICAgIHBvc2l0aW9uLnkgPSB0ZVsxM107CiAgICBwb3NpdGlvbi56ID0gdGVbMTRdOwogICAgX20xJDIuY29weSh0aGlzKTsKICAgIGNvbnN0IGludlNYID0gMSAvIHN4OwogICAgY29uc3QgaW52U1kgPSAxIC8gc3k7CiAgICBjb25zdCBpbnZTWiA9IDEgLyBzejsKICAgIF9tMSQyLmVsZW1lbnRzWzBdICo9IGludlNYOwogICAgX20xJDIuZWxlbWVudHNbMV0gKj0gaW52U1g7CiAgICBfbTEkMi5lbGVtZW50c1syXSAqPSBpbnZTWDsKICAgIF9tMSQyLmVsZW1lbnRzWzRdICo9IGludlNZOwogICAgX20xJDIuZWxlbWVudHNbNV0gKj0gaW52U1k7CiAgICBfbTEkMi5lbGVtZW50c1s2XSAqPSBpbnZTWTsKICAgIF9tMSQyLmVsZW1lbnRzWzhdICo9IGludlNaOwogICAgX20xJDIuZWxlbWVudHNbOV0gKj0gaW52U1o7CiAgICBfbTEkMi5lbGVtZW50c1sxMF0gKj0gaW52U1o7CiAgICBxdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChfbTEkMik7CiAgICBzY2FsZS54ID0gc3g7CiAgICBzY2FsZS55ID0gc3k7CiAgICBzY2FsZS56ID0gc3o7CiAgICByZXR1cm4gdGhpczsKICB9CiAgbWFrZVBlcnNwZWN0aXZlKGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyLCBjb29yZGluYXRlU3lzdGVtID0gV2ViR0xDb29yZGluYXRlU3lzdGVtKSB7CiAgICBjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7CiAgICBjb25zdCB4ID0gMiAqIG5lYXIgLyAocmlnaHQgLSBsZWZ0KTsKICAgIGNvbnN0IHkgPSAyICogbmVhciAvICh0b3AgLSBib3R0b20pOwogICAgY29uc3QgYSA9IChyaWdodCArIGxlZnQpIC8gKHJpZ2h0IC0gbGVmdCk7CiAgICBjb25zdCBiID0gKHRvcCArIGJvdHRvbSkgLyAodG9wIC0gYm90dG9tKTsKICAgIGxldCBjLCBkOwogICAgaWYgKGNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSkgewogICAgICBjID0gLShmYXIgKyBuZWFyKSAvIChmYXIgLSBuZWFyKTsKICAgICAgZCA9IC0yICogZmFyICogbmVhciAvIChmYXIgLSBuZWFyKTsKICAgIH0gZWxzZSBpZiAoY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSkgewogICAgICBjID0gLWZhciAvIChmYXIgLSBuZWFyKTsKICAgICAgZCA9IC1mYXIgKiBuZWFyIC8gKGZhciAtIG5lYXIpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VQZXJzcGVjdGl2ZSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiICsgY29vcmRpbmF0ZVN5c3RlbSk7CiAgICB9CiAgICB0ZVswXSA9IHg7CiAgICB0ZVs0XSA9IDA7CiAgICB0ZVs4XSA9IGE7CiAgICB0ZVsxMl0gPSAwOwogICAgdGVbMV0gPSAwOwogICAgdGVbNV0gPSB5OwogICAgdGVbOV0gPSBiOwogICAgdGVbMTNdID0gMDsKICAgIHRlWzJdID0gMDsKICAgIHRlWzZdID0gMDsKICAgIHRlWzEwXSA9IGM7CiAgICB0ZVsxNF0gPSBkOwogICAgdGVbM10gPSAwOwogICAgdGVbN10gPSAwOwogICAgdGVbMTFdID0gLTE7CiAgICB0ZVsxNV0gPSAwOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIG1ha2VPcnRob2dyYXBoaWMobGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIsIGNvb3JkaW5hdGVTeXN0ZW0gPSBXZWJHTENvb3JkaW5hdGVTeXN0ZW0pIHsKICAgIGNvbnN0IHRlID0gdGhpcy5lbGVtZW50czsKICAgIGNvbnN0IHcgPSAxIC8gKHJpZ2h0IC0gbGVmdCk7CiAgICBjb25zdCBoID0gMSAvICh0b3AgLSBib3R0b20pOwogICAgY29uc3QgcCA9IDEgLyAoZmFyIC0gbmVhcik7CiAgICBjb25zdCB4ID0gKHJpZ2h0ICsgbGVmdCkgKiB3OwogICAgY29uc3QgeSA9ICh0b3AgKyBib3R0b20pICogaDsKICAgIGxldCB6LCB6SW52OwogICAgaWYgKGNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSkgewogICAgICB6ID0gKGZhciArIG5lYXIpICogcDsKICAgICAgekludiA9IC0yICogcDsKICAgIH0gZWxzZSBpZiAoY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR1BVQ29vcmRpbmF0ZVN5c3RlbSkgewogICAgICB6ID0gbmVhciAqIHA7CiAgICAgIHpJbnYgPSAtMSAqIHA7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZU9ydGhvZ3JhcGhpYygpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiICsgY29vcmRpbmF0ZVN5c3RlbSk7CiAgICB9CiAgICB0ZVswXSA9IDIgKiB3OwogICAgdGVbNF0gPSAwOwogICAgdGVbOF0gPSAwOwogICAgdGVbMTJdID0gLXg7CiAgICB0ZVsxXSA9IDA7CiAgICB0ZVs1XSA9IDIgKiBoOwogICAgdGVbOV0gPSAwOwogICAgdGVbMTNdID0gLXk7CiAgICB0ZVsyXSA9IDA7CiAgICB0ZVs2XSA9IDA7CiAgICB0ZVsxMF0gPSB6SW52OwogICAgdGVbMTRdID0gLXo7CiAgICB0ZVszXSA9IDA7CiAgICB0ZVs3XSA9IDA7CiAgICB0ZVsxMV0gPSAwOwogICAgdGVbMTVdID0gMTsKICAgIHJldHVybiB0aGlzOwogIH0KICBlcXVhbHMobWF0cml4KSB7CiAgICBjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7CiAgICBjb25zdCBtZSA9IG1hdHJpeC5lbGVtZW50czsKICAgIGZvciAobGV0IGkgPSAwO2kgPCAxNjsgaSsrKSB7CiAgICAgIGlmICh0ZVtpXSAhPT0gbWVbaV0pCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIGZyb21BcnJheShhcnJheSwgb2Zmc2V0ID0gMCkgewogICAgZm9yIChsZXQgaSA9IDA7aSA8IDE2OyBpKyspIHsKICAgICAgdGhpcy5lbGVtZW50c1tpXSA9IGFycmF5W2kgKyBvZmZzZXRdOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIHRvQXJyYXkoYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCkgewogICAgY29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzOwogICAgYXJyYXlbb2Zmc2V0XSA9IHRlWzBdOwogICAgYXJyYXlbb2Zmc2V0ICsgMV0gPSB0ZVsxXTsKICAgIGFycmF5W29mZnNldCArIDJdID0gdGVbMl07CiAgICBhcnJheVtvZmZzZXQgKyAzXSA9IHRlWzNdOwogICAgYXJyYXlbb2Zmc2V0ICsgNF0gPSB0ZVs0XTsKICAgIGFycmF5W29mZnNldCArIDVdID0gdGVbNV07CiAgICBhcnJheVtvZmZzZXQgKyA2XSA9IHRlWzZdOwogICAgYXJyYXlbb2Zmc2V0ICsgN10gPSB0ZVs3XTsKICAgIGFycmF5W29mZnNldCArIDhdID0gdGVbOF07CiAgICBhcnJheVtvZmZzZXQgKyA5XSA9IHRlWzldOwogICAgYXJyYXlbb2Zmc2V0ICsgMTBdID0gdGVbMTBdOwogICAgYXJyYXlbb2Zmc2V0ICsgMTFdID0gdGVbMTFdOwogICAgYXJyYXlbb2Zmc2V0ICsgMTJdID0gdGVbMTJdOwogICAgYXJyYXlbb2Zmc2V0ICsgMTNdID0gdGVbMTNdOwogICAgYXJyYXlbb2Zmc2V0ICsgMTRdID0gdGVbMTRdOwogICAgYXJyYXlbb2Zmc2V0ICsgMTVdID0gdGVbMTVdOwogICAgcmV0dXJuIGFycmF5OwogIH0KfQoKY2xhc3MgTGF5ZXJzIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMubWFzayA9IDEgfCAwOwogIH0KICBzZXQoY2hhbm5lbCkgewogICAgdGhpcy5tYXNrID0gKDEgPDwgY2hhbm5lbCB8IDApID4+PiAwOwogIH0KICBlbmFibGUoY2hhbm5lbCkgewogICAgdGhpcy5tYXNrIHw9IDEgPDwgY2hhbm5lbCB8IDA7CiAgfQogIGVuYWJsZUFsbCgpIHsKICAgIHRoaXMubWFzayA9IDQyOTQ5NjcyOTUgfCAwOwogIH0KICB0b2dnbGUoY2hhbm5lbCkgewogICAgdGhpcy5tYXNrIF49IDEgPDwgY2hhbm5lbCB8IDA7CiAgfQogIGRpc2FibGUoY2hhbm5lbCkgewogICAgdGhpcy5tYXNrICY9IH4oMSA8PCBjaGFubmVsIHwgMCk7CiAgfQogIGRpc2FibGVBbGwoKSB7CiAgICB0aGlzLm1hc2sgPSAwOwogIH0KICB0ZXN0KGxheWVycykgewogICAgcmV0dXJuICh0aGlzLm1hc2sgJiBsYXllcnMubWFzaykgIT09IDA7CiAgfQogIGlzRW5hYmxlZChjaGFubmVsKSB7CiAgICByZXR1cm4gKHRoaXMubWFzayAmICgxIDw8IGNoYW5uZWwgfCAwKSkgIT09IDA7CiAgfQp9CgpjbGFzcyBUcmlhbmdsZSB7CiAgY29uc3RydWN0b3IoYSA9IG5ldyBWZWN0b3IzLCBiID0gbmV3IFZlY3RvcjMsIGMgPSBuZXcgVmVjdG9yMykgewogICAgdGhpcy5hID0gYTsKICAgIHRoaXMuYiA9IGI7CiAgICB0aGlzLmMgPSBjOwogIH0KICBzdGF0aWMgZ2V0Tm9ybWFsKGEsIGIsIGMsIHRhcmdldCkgewogICAgdGFyZ2V0LnN1YlZlY3RvcnMoYywgYik7CiAgICBfdjAkMS5zdWJWZWN0b3JzKGEsIGIpOwogICAgdGFyZ2V0LmNyb3NzKF92MCQxKTsKICAgIGNvbnN0IHRhcmdldExlbmd0aFNxID0gdGFyZ2V0Lmxlbmd0aFNxKCk7CiAgICBpZiAodGFyZ2V0TGVuZ3RoU3EgPiAwKSB7CiAgICAgIHJldHVybiB0YXJnZXQubXVsdGlwbHlTY2FsYXIoMSAvIE1hdGguc3FydCh0YXJnZXRMZW5ndGhTcSkpOwogICAgfQogICAgcmV0dXJuIHRhcmdldC5zZXQoMCwgMCwgMCk7CiAgfQogIHN0YXRpYyBnZXRCYXJ5Y29vcmQocG9pbnQsIGEsIGIsIGMsIHRhcmdldCkgewogICAgX3YwJDEuc3ViVmVjdG9ycyhjLCBhKTsKICAgIF92MSQzLnN1YlZlY3RvcnMoYiwgYSk7CiAgICBfdjIkMi5zdWJWZWN0b3JzKHBvaW50LCBhKTsKICAgIGNvbnN0IGRvdDAwID0gX3YwJDEuZG90KF92MCQxKTsKICAgIGNvbnN0IGRvdDAxID0gX3YwJDEuZG90KF92MSQzKTsKICAgIGNvbnN0IGRvdDAyID0gX3YwJDEuZG90KF92MiQyKTsKICAgIGNvbnN0IGRvdDExID0gX3YxJDMuZG90KF92MSQzKTsKICAgIGNvbnN0IGRvdDEyID0gX3YxJDMuZG90KF92MiQyKTsKICAgIGNvbnN0IGRlbm9tID0gZG90MDAgKiBkb3QxMSAtIGRvdDAxICogZG90MDE7CiAgICBpZiAoZGVub20gPT09IDApIHsKICAgICAgdGFyZ2V0LnNldCgwLCAwLCAwKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBpbnZEZW5vbSA9IDEgLyBkZW5vbTsKICAgIGNvbnN0IHUgPSAoZG90MTEgKiBkb3QwMiAtIGRvdDAxICogZG90MTIpICogaW52RGVub207CiAgICBjb25zdCB2ID0gKGRvdDAwICogZG90MTIgLSBkb3QwMSAqIGRvdDAyKSAqIGludkRlbm9tOwogICAgcmV0dXJuIHRhcmdldC5zZXQoMSAtIHUgLSB2LCB2LCB1KTsKICB9CiAgc3RhdGljIGNvbnRhaW5zUG9pbnQocG9pbnQsIGEsIGIsIGMpIHsKICAgIGlmICh0aGlzLmdldEJhcnljb29yZChwb2ludCwgYSwgYiwgYywgX3YzJDIpID09PSBudWxsKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiBfdjMkMi54ID49IDAgJiYgX3YzJDIueSA+PSAwICYmIF92MyQyLnggKyBfdjMkMi55IDw9IDE7CiAgfQogIHN0YXRpYyBnZXRJbnRlcnBvbGF0aW9uKHBvaW50LCBwMSwgcDIsIHAzLCB2MSwgdjIsIHYzLCB0YXJnZXQpIHsKICAgIGlmICh0aGlzLmdldEJhcnljb29yZChwb2ludCwgcDEsIHAyLCBwMywgX3YzJDIpID09PSBudWxsKSB7CiAgICAgIHRhcmdldC54ID0gMDsKICAgICAgdGFyZ2V0LnkgPSAwOwogICAgICBpZiAoInoiIGluIHRhcmdldCkKICAgICAgICB0YXJnZXQueiA9IDA7CiAgICAgIGlmICgidyIgaW4gdGFyZ2V0KQogICAgICAgIHRhcmdldC53ID0gMDsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB0YXJnZXQuc2V0U2NhbGFyKDApOwogICAgdGFyZ2V0LmFkZFNjYWxlZFZlY3Rvcih2MSwgX3YzJDIueCk7CiAgICB0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKHYyLCBfdjMkMi55KTsKICAgIHRhcmdldC5hZGRTY2FsZWRWZWN0b3IodjMsIF92MyQyLnopOwogICAgcmV0dXJuIHRhcmdldDsKICB9CiAgc3RhdGljIGdldEludGVycG9sYXRlZEF0dHJpYnV0ZShhdHRyLCBpMSwgaTIsIGkzLCBiYXJ5Y29vcmQsIHRhcmdldCkgewogICAgX3Y0MC5zZXRTY2FsYXIoMCk7CiAgICBfdjQxLnNldFNjYWxhcigwKTsKICAgIF92NDIuc2V0U2NhbGFyKDApOwogICAgX3Y0MC5mcm9tQnVmZmVyQXR0cmlidXRlKGF0dHIsIGkxKTsKICAgIF92NDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhdHRyLCBpMik7CiAgICBfdjQyLmZyb21CdWZmZXJBdHRyaWJ1dGUoYXR0ciwgaTMpOwogICAgdGFyZ2V0LnNldFNjYWxhcigwKTsKICAgIHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoX3Y0MCwgYmFyeWNvb3JkLngpOwogICAgdGFyZ2V0LmFkZFNjYWxlZFZlY3RvcihfdjQxLCBiYXJ5Y29vcmQueSk7CiAgICB0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKF92NDIsIGJhcnljb29yZC56KTsKICAgIHJldHVybiB0YXJnZXQ7CiAgfQogIHN0YXRpYyBpc0Zyb250RmFjaW5nKGEsIGIsIGMsIGRpcmVjdGlvbikgewogICAgX3YwJDEuc3ViVmVjdG9ycyhjLCBiKTsKICAgIF92MSQzLnN1YlZlY3RvcnMoYSwgYik7CiAgICByZXR1cm4gX3YwJDEuY3Jvc3MoX3YxJDMpLmRvdChkaXJlY3Rpb24pIDwgMCA/IHRydWUgOiBmYWxzZTsKICB9CiAgc2V0KGEsIGIsIGMpIHsKICAgIHRoaXMuYS5jb3B5KGEpOwogICAgdGhpcy5iLmNvcHkoYik7CiAgICB0aGlzLmMuY29weShjKTsKICAgIHJldHVybiB0aGlzOwogIH0KICBzZXRGcm9tUG9pbnRzQW5kSW5kaWNlcyhwb2ludHMsIGkwLCBpMSwgaTIpIHsKICAgIHRoaXMuYS5jb3B5KHBvaW50c1tpMF0pOwogICAgdGhpcy5iLmNvcHkocG9pbnRzW2kxXSk7CiAgICB0aGlzLmMuY29weShwb2ludHNbaTJdKTsKICAgIHJldHVybiB0aGlzOwogIH0KICBzZXRGcm9tQXR0cmlidXRlQW5kSW5kaWNlcyhhdHRyaWJ1dGUsIGkwLCBpMSwgaTIpIHsKICAgIHRoaXMuYS5mcm9tQnVmZmVyQXR0cmlidXRlKGF0dHJpYnV0ZSwgaTApOwogICAgdGhpcy5iLmZyb21CdWZmZXJBdHRyaWJ1dGUoYXR0cmlidXRlLCBpMSk7CiAgICB0aGlzLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhdHRyaWJ1dGUsIGkyKTsKICAgIHJldHVybiB0aGlzOwogIH0KICBjbG9uZSgpIHsKICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyk7CiAgfQogIGNvcHkodHJpYW5nbGUpIHsKICAgIHRoaXMuYS5jb3B5KHRyaWFuZ2xlLmEpOwogICAgdGhpcy5iLmNvcHkodHJpYW5nbGUuYik7CiAgICB0aGlzLmMuY29weSh0cmlhbmdsZS5jKTsKICAgIHJldHVybiB0aGlzOwogIH0KICBnZXRBcmVhKCkgewogICAgX3YwJDEuc3ViVmVjdG9ycyh0aGlzLmMsIHRoaXMuYik7CiAgICBfdjEkMy5zdWJWZWN0b3JzKHRoaXMuYSwgdGhpcy5iKTsKICAgIHJldHVybiBfdjAkMS5jcm9zcyhfdjEkMykubGVuZ3RoKCkgKiAwLjU7CiAgfQogIGdldE1pZHBvaW50KHRhcmdldCkgewogICAgcmV0dXJuIHRhcmdldC5hZGRWZWN0b3JzKHRoaXMuYSwgdGhpcy5iKS5hZGQodGhpcy5jKS5tdWx0aXBseVNjYWxhcigxIC8gMyk7CiAgfQogIGdldE5vcm1hbCh0YXJnZXQpIHsKICAgIHJldHVybiBUcmlhbmdsZS5nZXROb3JtYWwodGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgdGFyZ2V0KTsKICB9CiAgZ2V0UGxhbmUodGFyZ2V0KSB7CiAgICByZXR1cm4gdGFyZ2V0LnNldEZyb21Db3BsYW5hclBvaW50cyh0aGlzLmEsIHRoaXMuYiwgdGhpcy5jKTsKICB9CiAgZ2V0QmFyeWNvb3JkKHBvaW50LCB0YXJnZXQpIHsKICAgIHJldHVybiBUcmlhbmdsZS5nZXRCYXJ5Y29vcmQocG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHRhcmdldCk7CiAgfQogIGdldEludGVycG9sYXRpb24ocG9pbnQsIHYxLCB2MiwgdjMsIHRhcmdldCkgewogICAgcmV0dXJuIFRyaWFuZ2xlLmdldEludGVycG9sYXRpb24ocG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHYxLCB2MiwgdjMsIHRhcmdldCk7CiAgfQogIGNvbnRhaW5zUG9pbnQocG9pbnQpIHsKICAgIHJldHVybiBUcmlhbmdsZS5jb250YWluc1BvaW50KHBvaW50LCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jKTsKICB9CiAgaXNGcm9udEZhY2luZyhkaXJlY3Rpb24pIHsKICAgIHJldHVybiBUcmlhbmdsZS5pc0Zyb250RmFjaW5nKHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIGRpcmVjdGlvbik7CiAgfQogIGludGVyc2VjdHNCb3goYm94KSB7CiAgICByZXR1cm4gYm94LmludGVyc2VjdHNUcmlhbmdsZSh0aGlzKTsKICB9CiAgY2xvc2VzdFBvaW50VG9Qb2ludChwLCB0YXJnZXQpIHsKICAgIGNvbnN0IGEgPSB0aGlzLmEsIGIgPSB0aGlzLmIsIGMgPSB0aGlzLmM7CiAgICBsZXQgdiwgdzsKICAgIF92YWIuc3ViVmVjdG9ycyhiLCBhKTsKICAgIF92YWMuc3ViVmVjdG9ycyhjLCBhKTsKICAgIF92YXAuc3ViVmVjdG9ycyhwLCBhKTsKICAgIGNvbnN0IGQxID0gX3ZhYi5kb3QoX3ZhcCk7CiAgICBjb25zdCBkMiA9IF92YWMuZG90KF92YXApOwogICAgaWYgKGQxIDw9IDAgJiYgZDIgPD0gMCkgewogICAgICByZXR1cm4gdGFyZ2V0LmNvcHkoYSk7CiAgICB9CiAgICBfdmJwLnN1YlZlY3RvcnMocCwgYik7CiAgICBjb25zdCBkMyA9IF92YWIuZG90KF92YnApOwogICAgY29uc3QgZDQgPSBfdmFjLmRvdChfdmJwKTsKICAgIGlmIChkMyA+PSAwICYmIGQ0IDw9IGQzKSB7CiAgICAgIHJldHVybiB0YXJnZXQuY29weShiKTsKICAgIH0KICAgIGNvbnN0IHZjID0gZDEgKiBkNCAtIGQzICogZDI7CiAgICBpZiAodmMgPD0gMCAmJiBkMSA+PSAwICYmIGQzIDw9IDApIHsKICAgICAgdiA9IGQxIC8gKGQxIC0gZDMpOwogICAgICByZXR1cm4gdGFyZ2V0LmNvcHkoYSkuYWRkU2NhbGVkVmVjdG9yKF92YWIsIHYpOwogICAgfQogICAgX3ZjcC5zdWJWZWN0b3JzKHAsIGMpOwogICAgY29uc3QgZDUgPSBfdmFiLmRvdChfdmNwKTsKICAgIGNvbnN0IGQ2ID0gX3ZhYy5kb3QoX3ZjcCk7CiAgICBpZiAoZDYgPj0gMCAmJiBkNSA8PSBkNikgewogICAgICByZXR1cm4gdGFyZ2V0LmNvcHkoYyk7CiAgICB9CiAgICBjb25zdCB2YiA9IGQ1ICogZDIgLSBkMSAqIGQ2OwogICAgaWYgKHZiIDw9IDAgJiYgZDIgPj0gMCAmJiBkNiA8PSAwKSB7CiAgICAgIHcgPSBkMiAvIChkMiAtIGQ2KTsKICAgICAgcmV0dXJuIHRhcmdldC5jb3B5KGEpLmFkZFNjYWxlZFZlY3RvcihfdmFjLCB3KTsKICAgIH0KICAgIGNvbnN0IHZhID0gZDMgKiBkNiAtIGQ1ICogZDQ7CiAgICBpZiAodmEgPD0gMCAmJiBkNCAtIGQzID49IDAgJiYgZDUgLSBkNiA+PSAwKSB7CiAgICAgIF92YmMuc3ViVmVjdG9ycyhjLCBiKTsKICAgICAgdyA9IChkNCAtIGQzKSAvIChkNCAtIGQzICsgKGQ1IC0gZDYpKTsKICAgICAgcmV0dXJuIHRhcmdldC5jb3B5KGIpLmFkZFNjYWxlZFZlY3RvcihfdmJjLCB3KTsKICAgIH0KICAgIGNvbnN0IGRlbm9tID0gMSAvICh2YSArIHZiICsgdmMpOwogICAgdiA9IHZiICogZGVub207CiAgICB3ID0gdmMgKiBkZW5vbTsKICAgIHJldHVybiB0YXJnZXQuY29weShhKS5hZGRTY2FsZWRWZWN0b3IoX3ZhYiwgdikuYWRkU2NhbGVkVmVjdG9yKF92YWMsIHcpOwogIH0KICBlcXVhbHModHJpYW5nbGUpIHsKICAgIHJldHVybiB0cmlhbmdsZS5hLmVxdWFscyh0aGlzLmEpICYmIHRyaWFuZ2xlLmIuZXF1YWxzKHRoaXMuYikgJiYgdHJpYW5nbGUuYy5lcXVhbHModGhpcy5jKTsKICB9Cn0KZnVuY3Rpb24gaHVlMnJnYihwLCBxLCB0KSB7CiAgaWYgKHQgPCAwKQogICAgdCArPSAxOwogIGlmICh0ID4gMSkKICAgIHQgLT0gMTsKICBpZiAodCA8IDEgLyA2KQogICAgcmV0dXJuIHAgKyAocSAtIHApICogNiAqIHQ7CiAgaWYgKHQgPCAxIC8gMikKICAgIHJldHVybiBxOwogIGlmICh0IDwgMiAvIDMpCiAgICByZXR1cm4gcCArIChxIC0gcCkgKiA2ICogKDIgLyAzIC0gdCk7CiAgcmV0dXJuIHA7Cn0KZnVuY3Rpb24gX2dlbmVyYXRlVGFibGVzKCkgewogIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig0KTsKICBjb25zdCBmbG9hdFZpZXcgPSBuZXcgRmxvYXQzMkFycmF5KGJ1ZmZlcik7CiAgY29uc3QgdWludDMyVmlldyA9IG5ldyBVaW50MzJBcnJheShidWZmZXIpOwogIGNvbnN0IGJhc2VUYWJsZSA9IG5ldyBVaW50MzJBcnJheSg1MTIpOwogIGNvbnN0IHNoaWZ0VGFibGUgPSBuZXcgVWludDMyQXJyYXkoNTEyKTsKICBmb3IgKGxldCBpID0gMDtpIDwgMjU2OyArK2kpIHsKICAgIGNvbnN0IGUgPSBpIC0gMTI3OwogICAgaWYgKGUgPCAtMjcpIHsKICAgICAgYmFzZVRhYmxlW2ldID0gMDsKICAgICAgYmFzZVRhYmxlW2kgfCAyNTZdID0gMzI3Njg7CiAgICAgIHNoaWZ0VGFibGVbaV0gPSAyNDsKICAgICAgc2hpZnRUYWJsZVtpIHwgMjU2XSA9IDI0OwogICAgfSBlbHNlIGlmIChlIDwgLTE0KSB7CiAgICAgIGJhc2VUYWJsZVtpXSA9IDEwMjQgPj4gLWUgLSAxNDsKICAgICAgYmFzZVRhYmxlW2kgfCAyNTZdID0gMTAyNCA+PiAtZSAtIDE0IHwgMzI3Njg7CiAgICAgIHNoaWZ0VGFibGVbaV0gPSAtZSAtIDE7CiAgICAgIHNoaWZ0VGFibGVbaSB8IDI1Nl0gPSAtZSAtIDE7CiAgICB9IGVsc2UgaWYgKGUgPD0gMTUpIHsKICAgICAgYmFzZVRhYmxlW2ldID0gZSArIDE1IDw8IDEwOwogICAgICBiYXNlVGFibGVbaSB8IDI1Nl0gPSBlICsgMTUgPDwgMTAgfCAzMjc2ODsKICAgICAgc2hpZnRUYWJsZVtpXSA9IDEzOwogICAgICBzaGlmdFRhYmxlW2kgfCAyNTZdID0gMTM7CiAgICB9IGVsc2UgaWYgKGUgPCAxMjgpIHsKICAgICAgYmFzZVRhYmxlW2ldID0gMzE3NDQ7CiAgICAgIGJhc2VUYWJsZVtpIHwgMjU2XSA9IDY0NTEyOwogICAgICBzaGlmdFRhYmxlW2ldID0gMjQ7CiAgICAgIHNoaWZ0VGFibGVbaSB8IDI1Nl0gPSAyNDsKICAgIH0gZWxzZSB7CiAgICAgIGJhc2VUYWJsZVtpXSA9IDMxNzQ0OwogICAgICBiYXNlVGFibGVbaSB8IDI1Nl0gPSA2NDUxMjsKICAgICAgc2hpZnRUYWJsZVtpXSA9IDEzOwogICAgICBzaGlmdFRhYmxlW2kgfCAyNTZdID0gMTM7CiAgICB9CiAgfQogIGNvbnN0IG1hbnRpc3NhVGFibGUgPSBuZXcgVWludDMyQXJyYXkoMjA0OCk7CiAgY29uc3QgZXhwb25lbnRUYWJsZSA9IG5ldyBVaW50MzJBcnJheSg2NCk7CiAgY29uc3Qgb2Zmc2V0VGFibGUgPSBuZXcgVWludDMyQXJyYXkoNjQpOwogIGZvciAobGV0IGkgPSAxO2kgPCAxMDI0OyArK2kpIHsKICAgIGxldCBtID0gaSA8PCAxMzsKICAgIGxldCBlID0gMDsKICAgIHdoaWxlICgobSAmIDgzODg2MDgpID09PSAwKSB7CiAgICAgIG0gPDw9IDE7CiAgICAgIGUgLT0gODM4ODYwODsKICAgIH0KICAgIG0gJj0gLTgzODg2MDk7CiAgICBlICs9IDk0NzkxMjcwNDsKICAgIG1hbnRpc3NhVGFibGVbaV0gPSBtIHwgZTsKICB9CiAgZm9yIChsZXQgaSA9IDEwMjQ7aSA8IDIwNDg7ICsraSkgewogICAgbWFudGlzc2FUYWJsZVtpXSA9IDkzOTUyNDA5NiArIChpIC0gMTAyNCA8PCAxMyk7CiAgfQogIGZvciAobGV0IGkgPSAxO2kgPCAzMTsgKytpKSB7CiAgICBleHBvbmVudFRhYmxlW2ldID0gaSA8PCAyMzsKICB9CiAgZXhwb25lbnRUYWJsZVszMV0gPSAxMTk5NTcwOTQ0OwogIGV4cG9uZW50VGFibGVbMzJdID0gMjE0NzQ4MzY0ODsKICBmb3IgKGxldCBpID0gMzM7aSA8IDYzOyArK2kpIHsKICAgIGV4cG9uZW50VGFibGVbaV0gPSAyMTQ3NDgzNjQ4ICsgKGkgLSAzMiA8PCAyMyk7CiAgfQogIGV4cG9uZW50VGFibGVbNjNdID0gMzM0NzA1NDU5MjsKICBmb3IgKGxldCBpID0gMTtpIDwgNjQ7ICsraSkgewogICAgaWYgKGkgIT09IDMyKSB7CiAgICAgIG9mZnNldFRhYmxlW2ldID0gMTAyNDsKICAgIH0KICB9CiAgcmV0dXJuIHsKICAgIGZsb2F0VmlldywKICAgIHVpbnQzMlZpZXcsCiAgICBiYXNlVGFibGUsCiAgICBzaGlmdFRhYmxlLAogICAgbWFudGlzc2FUYWJsZSwKICAgIGV4cG9uZW50VGFibGUsCiAgICBvZmZzZXRUYWJsZQogIH07Cn0KZnVuY3Rpb24gdG9IYWxmRmxvYXQodmFsKSB7CiAgaWYgKE1hdGguYWJzKHZhbCkgPiA2NTUwNCkKICAgIGNvbnNvbGUud2FybigiVEhSRUUuRGF0YVV0aWxzLnRvSGFsZkZsb2F0KCk6IFZhbHVlIG91dCBvZiByYW5nZS4iKTsKICB2YWwgPSBjbGFtcCh2YWwsIC02NTUwNCwgNjU1MDQpOwogIF90YWJsZXMuZmxvYXRWaWV3WzBdID0gdmFsOwogIGNvbnN0IGYgPSBfdGFibGVzLnVpbnQzMlZpZXdbMF07CiAgY29uc3QgZSA9IGYgPj4gMjMgJiA1MTE7CiAgcmV0dXJuIF90YWJsZXMuYmFzZVRhYmxlW2VdICsgKChmICYgODM4ODYwNykgPj4gX3RhYmxlcy5zaGlmdFRhYmxlW2VdKTsKfQpmdW5jdGlvbiBmcm9tSGFsZkZsb2F0KHZhbCkgewogIGNvbnN0IG0gPSB2YWwgPj4gMTA7CiAgX3RhYmxlcy51aW50MzJWaWV3WzBdID0gX3RhYmxlcy5tYW50aXNzYVRhYmxlW190YWJsZXMub2Zmc2V0VGFibGVbbV0gKyAodmFsICYgMTAyMyldICsgX3RhYmxlcy5leHBvbmVudFRhYmxlW21dOwogIHJldHVybiBfdGFibGVzLmZsb2F0Vmlld1swXTsKfQoKY2xhc3MgQnVmZmVyQXR0cmlidXRlIHsKICBjb25zdHJ1Y3RvcihhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgPSBmYWxzZSkgewogICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXkpKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7CiAgICB9CiAgICB0aGlzLmlzQnVmZmVyQXR0cmlidXRlID0gdHJ1ZTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiaWQiLCB7IHZhbHVlOiBfaWQkMisrIH0pOwogICAgdGhpcy5uYW1lID0gIiI7CiAgICB0aGlzLmFycmF5ID0gYXJyYXk7CiAgICB0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7CiAgICB0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIGl0ZW1TaXplIDogMDsKICAgIHRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQ7CiAgICB0aGlzLnVzYWdlID0gU3RhdGljRHJhd1VzYWdlOwogICAgdGhpcy51cGRhdGVSYW5nZXMgPSBbXTsKICAgIHRoaXMuZ3B1VHlwZSA9IEZsb2F0VHlwZTsKICAgIHRoaXMudmVyc2lvbiA9IDA7CiAgfQogIG9uVXBsb2FkQ2FsbGJhY2soKSB7fQogIHNldCBuZWVkc1VwZGF0ZSh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09PSB0cnVlKQogICAgICB0aGlzLnZlcnNpb24rKzsKICB9CiAgc2V0VXNhZ2UodmFsdWUpIHsKICAgIHRoaXMudXNhZ2UgPSB2YWx1ZTsKICAgIHJldHVybiB0aGlzOwogIH0KICBhZGRVcGRhdGVSYW5nZShzdGFydCwgY291bnQpIHsKICAgIHRoaXMudXBkYXRlUmFuZ2VzLnB1c2goeyBzdGFydCwgY291bnQgfSk7CiAgfQogIGNsZWFyVXBkYXRlUmFuZ2VzKCkgewogICAgdGhpcy51cGRhdGVSYW5nZXMubGVuZ3RoID0gMDsKICB9CiAgY29weShzb3VyY2UpIHsKICAgIHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lOwogICAgdGhpcy5hcnJheSA9IG5ldyBzb3VyY2UuYXJyYXkuY29uc3RydWN0b3Ioc291cmNlLmFycmF5KTsKICAgIHRoaXMuaXRlbVNpemUgPSBzb3VyY2UuaXRlbVNpemU7CiAgICB0aGlzLmNvdW50ID0gc291cmNlLmNvdW50OwogICAgdGhpcy5ub3JtYWxpemVkID0gc291cmNlLm5vcm1hbGl6ZWQ7CiAgICB0aGlzLnVzYWdlID0gc291cmNlLnVzYWdlOwogICAgdGhpcy5ncHVUeXBlID0gc291cmNlLmdwdVR5cGU7CiAgICByZXR1cm4gdGhpczsKICB9CiAgY29weUF0KGluZGV4MSwgYXR0cmlidXRlLCBpbmRleDIpIHsKICAgIGluZGV4MSAqPSB0aGlzLml0ZW1TaXplOwogICAgaW5kZXgyICo9IGF0dHJpYnV0ZS5pdGVtU2l6ZTsKICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5pdGVtU2l6ZTtpIDwgbDsgaSsrKSB7CiAgICAgIHRoaXMuYXJyYXlbaW5kZXgxICsgaV0gPSBhdHRyaWJ1dGUuYXJyYXlbaW5kZXgyICsgaV07CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CiAgY29weUFycmF5KGFycmF5KSB7CiAgICB0aGlzLmFycmF5LnNldChhcnJheSk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgYXBwbHlNYXRyaXgzKG0pIHsKICAgIGlmICh0aGlzLml0ZW1TaXplID09PSAyKSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5jb3VudDtpIDwgbDsgaSsrKSB7CiAgICAgICAgX3ZlY3RvcjIkMS5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsIGkpOwogICAgICAgIF92ZWN0b3IyJDEuYXBwbHlNYXRyaXgzKG0pOwogICAgICAgIHRoaXMuc2V0WFkoaSwgX3ZlY3RvcjIkMS54LCBfdmVjdG9yMiQxLnkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHRoaXMuaXRlbVNpemUgPT09IDMpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50O2kgPCBsOyBpKyspIHsKICAgICAgICBfdmVjdG9yJDkuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLCBpKTsKICAgICAgICBfdmVjdG9yJDkuYXBwbHlNYXRyaXgzKG0pOwogICAgICAgIHRoaXMuc2V0WFlaKGksIF92ZWN0b3IkOS54LCBfdmVjdG9yJDkueSwgX3ZlY3RvciQ5LnopOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CiAgYXBwbHlNYXRyaXg0KG0pIHsKICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5jb3VudDtpIDwgbDsgaSsrKSB7CiAgICAgIF92ZWN0b3IkOS5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsIGkpOwogICAgICBfdmVjdG9yJDkuYXBwbHlNYXRyaXg0KG0pOwogICAgICB0aGlzLnNldFhZWihpLCBfdmVjdG9yJDkueCwgX3ZlY3RvciQ5LnksIF92ZWN0b3IkOS56KTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KICBhcHBseU5vcm1hbE1hdHJpeChtKSB7CiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7aSA8IGw7IGkrKykgewogICAgICBfdmVjdG9yJDkuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLCBpKTsKICAgICAgX3ZlY3RvciQ5LmFwcGx5Tm9ybWFsTWF0cml4KG0pOwogICAgICB0aGlzLnNldFhZWihpLCBfdmVjdG9yJDkueCwgX3ZlY3RvciQ5LnksIF92ZWN0b3IkOS56KTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KICB0cmFuc2Zvcm1EaXJlY3Rpb24obSkgewogICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50O2kgPCBsOyBpKyspIHsKICAgICAgX3ZlY3RvciQ5LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcywgaSk7CiAgICAgIF92ZWN0b3IkOS50cmFuc2Zvcm1EaXJlY3Rpb24obSk7CiAgICAgIHRoaXMuc2V0WFlaKGksIF92ZWN0b3IkOS54LCBfdmVjdG9yJDkueSwgX3ZlY3RvciQ5LnopOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldCh2YWx1ZSwgb2Zmc2V0ID0gMCkgewogICAgdGhpcy5hcnJheS5zZXQodmFsdWUsIG9mZnNldCk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgZ2V0Q29tcG9uZW50KGluZGV4LCBjb21wb25lbnQpIHsKICAgIGxldCB2YWx1ZSA9IHRoaXMuYXJyYXlbaW5kZXggKiB0aGlzLml0ZW1TaXplICsgY29tcG9uZW50XTsKICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpCiAgICAgIHZhbHVlID0gZGVub3JtYWxpemUodmFsdWUsIHRoaXMuYXJyYXkpOwogICAgcmV0dXJuIHZhbHVlOwogIH0KICBzZXRDb21wb25lbnQoaW5kZXgsIGNvbXBvbmVudCwgdmFsdWUpIHsKICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpCiAgICAgIHZhbHVlID0gbm9ybWFsaXplKHZhbHVlLCB0aGlzLmFycmF5KTsKICAgIHRoaXMuYXJyYXlbaW5kZXggKiB0aGlzLml0ZW1TaXplICsgY29tcG9uZW50XSA9IHZhbHVlOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGdldFgoaW5kZXgpIHsKICAgIGxldCB4ID0gdGhpcy5hcnJheVtpbmRleCAqIHRoaXMuaXRlbVNpemVdOwogICAgaWYgKHRoaXMubm9ybWFsaXplZCkKICAgICAgeCA9IGRlbm9ybWFsaXplKHgsIHRoaXMuYXJyYXkpOwogICAgcmV0dXJuIHg7CiAgfQogIHNldFgoaW5kZXgsIHgpIHsKICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpCiAgICAgIHggPSBub3JtYWxpemUoeCwgdGhpcy5hcnJheSk7CiAgICB0aGlzLmFycmF5W2luZGV4ICogdGhpcy5pdGVtU2l6ZV0gPSB4OwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGdldFkoaW5kZXgpIHsKICAgIGxldCB5ID0gdGhpcy5hcnJheVtpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAxXTsKICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpCiAgICAgIHkgPSBkZW5vcm1hbGl6ZSh5LCB0aGlzLmFycmF5KTsKICAgIHJldHVybiB5OwogIH0KICBzZXRZKGluZGV4LCB5KSB7CiAgICBpZiAodGhpcy5ub3JtYWxpemVkKQogICAgICB5ID0gbm9ybWFsaXplKHksIHRoaXMuYXJyYXkpOwogICAgdGhpcy5hcnJheVtpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAxXSA9IHk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgZ2V0WihpbmRleCkgewogICAgbGV0IHogPSB0aGlzLmFycmF5W2luZGV4ICogdGhpcy5pdGVtU2l6ZSArIDJdOwogICAgaWYgKHRoaXMubm9ybWFsaXplZCkKICAgICAgeiA9IGRlbm9ybWFsaXplKHosIHRoaXMuYXJyYXkpOwogICAgcmV0dXJuIHo7CiAgfQogIHNldFooaW5kZXgsIHopIHsKICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpCiAgICAgIHogPSBub3JtYWxpemUoeiwgdGhpcy5hcnJheSk7CiAgICB0aGlzLmFycmF5W2luZGV4ICogdGhpcy5pdGVtU2l6ZSArIDJdID0gejsKICAgIHJldHVybiB0aGlzOwogIH0KICBnZXRXKGluZGV4KSB7CiAgICBsZXQgdyA9IHRoaXMuYXJyYXlbaW5kZXggKiB0aGlzLml0ZW1TaXplICsgM107CiAgICBpZiAodGhpcy5ub3JtYWxpemVkKQogICAgICB3ID0gZGVub3JtYWxpemUodywgdGhpcy5hcnJheSk7CiAgICByZXR1cm4gdzsKICB9CiAgc2V0VyhpbmRleCwgdykgewogICAgaWYgKHRoaXMubm9ybWFsaXplZCkKICAgICAgdyA9IG5vcm1hbGl6ZSh3LCB0aGlzLmFycmF5KTsKICAgIHRoaXMuYXJyYXlbaW5kZXggKiB0aGlzLml0ZW1TaXplICsgM10gPSB3OwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldFhZKGluZGV4LCB4LCB5KSB7CiAgICBpbmRleCAqPSB0aGlzLml0ZW1TaXplOwogICAgaWYgKHRoaXMubm9ybWFsaXplZCkgewogICAgICB4ID0gbm9ybWFsaXplKHgsIHRoaXMuYXJyYXkpOwogICAgICB5ID0gbm9ybWFsaXplKHksIHRoaXMuYXJyYXkpOwogICAgfQogICAgdGhpcy5hcnJheVtpbmRleCArIDBdID0geDsKICAgIHRoaXMuYXJyYXlbaW5kZXggKyAxXSA9IHk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2V0WFlaKGluZGV4LCB4LCB5LCB6KSB7CiAgICBpbmRleCAqPSB0aGlzLml0ZW1TaXplOwogICAgaWYgKHRoaXMubm9ybWFsaXplZCkgewogICAgICB4ID0gbm9ybWFsaXplKHgsIHRoaXMuYXJyYXkpOwogICAgICB5ID0gbm9ybWFsaXplKHksIHRoaXMuYXJyYXkpOwogICAgICB6ID0gbm9ybWFsaXplKHosIHRoaXMuYXJyYXkpOwogICAgfQogICAgdGhpcy5hcnJheVtpbmRleCArIDBdID0geDsKICAgIHRoaXMuYXJyYXlbaW5kZXggKyAxXSA9IHk7CiAgICB0aGlzLmFycmF5W2luZGV4ICsgMl0gPSB6OwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldFhZWlcoaW5kZXgsIHgsIHksIHosIHcpIHsKICAgIGluZGV4ICo9IHRoaXMuaXRlbVNpemU7CiAgICBpZiAodGhpcy5ub3JtYWxpemVkKSB7CiAgICAgIHggPSBub3JtYWxpemUoeCwgdGhpcy5hcnJheSk7CiAgICAgIHkgPSBub3JtYWxpemUoeSwgdGhpcy5hcnJheSk7CiAgICAgIHogPSBub3JtYWxpemUoeiwgdGhpcy5hcnJheSk7CiAgICAgIHcgPSBub3JtYWxpemUodywgdGhpcy5hcnJheSk7CiAgICB9CiAgICB0aGlzLmFycmF5W2luZGV4ICsgMF0gPSB4OwogICAgdGhpcy5hcnJheVtpbmRleCArIDFdID0geTsKICAgIHRoaXMuYXJyYXlbaW5kZXggKyAyXSA9IHo7CiAgICB0aGlzLmFycmF5W2luZGV4ICsgM10gPSB3OwogICAgcmV0dXJuIHRoaXM7CiAgfQogIG9uVXBsb2FkKGNhbGxiYWNrKSB7CiAgICB0aGlzLm9uVXBsb2FkQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgIHJldHVybiB0aGlzOwogIH0KICBjbG9uZSgpIHsKICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LCB0aGlzLml0ZW1TaXplKS5jb3B5KHRoaXMpOwogIH0KICB0b0pTT04oKSB7CiAgICBjb25zdCBkYXRhID0gewogICAgICBpdGVtU2l6ZTogdGhpcy5pdGVtU2l6ZSwKICAgICAgdHlwZTogdGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLAogICAgICBhcnJheTogQXJyYXkuZnJvbSh0aGlzLmFycmF5KSwKICAgICAgbm9ybWFsaXplZDogdGhpcy5ub3JtYWxpemVkCiAgICB9OwogICAgaWYgKHRoaXMubmFtZSAhPT0gIiIpCiAgICAgIGRhdGEubmFtZSA9IHRoaXMubmFtZTsKICAgIGlmICh0aGlzLnVzYWdlICE9PSBTdGF0aWNEcmF3VXNhZ2UpCiAgICAgIGRhdGEudXNhZ2UgPSB0aGlzLnVzYWdlOwogICAgcmV0dXJuIGRhdGE7CiAgfQp9CmZ1bmN0aW9uIGNoZWNrSW50ZXJzZWN0aW9uJDEob2JqZWN0LCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIHBBLCBwQiwgcEMsIHBvaW50KSB7CiAgbGV0IGludGVyc2VjdDsKICBpZiAobWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUpIHsKICAgIGludGVyc2VjdCA9IHJheS5pbnRlcnNlY3RUcmlhbmdsZShwQywgcEIsIHBBLCB0cnVlLCBwb2ludCk7CiAgfSBlbHNlIHsKICAgIGludGVyc2VjdCA9IHJheS5pbnRlcnNlY3RUcmlhbmdsZShwQSwgcEIsIHBDLCBtYXRlcmlhbC5zaWRlID09PSBGcm9udFNpZGUsIHBvaW50KTsKICB9CiAgaWYgKGludGVyc2VjdCA9PT0gbnVsbCkKICAgIHJldHVybiBudWxsOwogIF9pbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmNvcHkocG9pbnQpOwogIF9pbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmFwcGx5TWF0cml4NChvYmplY3QubWF0cml4V29ybGQpOwogIGNvbnN0IGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhfaW50ZXJzZWN0aW9uUG9pbnRXb3JsZCk7CiAgaWYgKGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyKQogICAgcmV0dXJuIG51bGw7CiAgcmV0dXJuIHsKICAgIGRpc3RhbmNlLAogICAgcG9pbnQ6IF9pbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmNsb25lKCksCiAgICBvYmplY3QKICB9Owp9CmZ1bmN0aW9uIGNoZWNrR2VvbWV0cnlJbnRlcnNlY3Rpb24ob2JqZWN0LCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIHV2LCB1djEsIG5vcm1hbCwgYSwgYiwgYykgewogIG9iamVjdC5nZXRWZXJ0ZXhQb3NpdGlvbihhLCBfdkEkMSk7CiAgb2JqZWN0LmdldFZlcnRleFBvc2l0aW9uKGIsIF92QiQxKTsKICBvYmplY3QuZ2V0VmVydGV4UG9zaXRpb24oYywgX3ZDJDEpOwogIGNvbnN0IGludGVyc2VjdGlvbiA9IGNoZWNrSW50ZXJzZWN0aW9uJDEob2JqZWN0LCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIF92QSQxLCBfdkIkMSwgX3ZDJDEsIF9pbnRlcnNlY3Rpb25Qb2ludCk7CiAgaWYgKGludGVyc2VjdGlvbikgewogICAgY29uc3QgYmFyeWNvb3JkID0gbmV3IFZlY3RvcjM7CiAgICBUcmlhbmdsZS5nZXRCYXJ5Y29vcmQoX2ludGVyc2VjdGlvblBvaW50LCBfdkEkMSwgX3ZCJDEsIF92QyQxLCBiYXJ5Y29vcmQpOwogICAgaWYgKHV2KSB7CiAgICAgIGludGVyc2VjdGlvbi51diA9IFRyaWFuZ2xlLmdldEludGVycG9sYXRlZEF0dHJpYnV0ZSh1diwgYSwgYiwgYywgYmFyeWNvb3JkLCBuZXcgVmVjdG9yMik7CiAgICB9CiAgICBpZiAodXYxKSB7CiAgICAgIGludGVyc2VjdGlvbi51djEgPSBUcmlhbmdsZS5nZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUodXYxLCBhLCBiLCBjLCBiYXJ5Y29vcmQsIG5ldyBWZWN0b3IyKTsKICAgIH0KICAgIGlmIChub3JtYWwpIHsKICAgICAgaW50ZXJzZWN0aW9uLm5vcm1hbCA9IFRyaWFuZ2xlLmdldEludGVycG9sYXRlZEF0dHJpYnV0ZShub3JtYWwsIGEsIGIsIGMsIGJhcnljb29yZCwgbmV3IFZlY3RvcjMpOwogICAgICBpZiAoaW50ZXJzZWN0aW9uLm5vcm1hbC5kb3QocmF5LmRpcmVjdGlvbikgPiAwKSB7CiAgICAgICAgaW50ZXJzZWN0aW9uLm5vcm1hbC5tdWx0aXBseVNjYWxhcigtMSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGZhY2UgPSB7CiAgICAgIGEsCiAgICAgIGIsCiAgICAgIGMsCiAgICAgIG5vcm1hbDogbmV3IFZlY3RvcjMsCiAgICAgIG1hdGVyaWFsSW5kZXg6IDAKICAgIH07CiAgICBUcmlhbmdsZS5nZXROb3JtYWwoX3ZBJDEsIF92QiQxLCBfdkMkMSwgZmFjZS5ub3JtYWwpOwogICAgaW50ZXJzZWN0aW9uLmZhY2UgPSBmYWNlOwogICAgaW50ZXJzZWN0aW9uLmJhcnljb29yZCA9IGJhcnljb29yZDsKICB9CiAgcmV0dXJuIGludGVyc2VjdGlvbjsKfQpmdW5jdGlvbiBjbG9uZVVuaWZvcm1zKHNyYykgewogIGNvbnN0IGRzdCA9IHt9OwogIGZvciAoY29uc3QgdSBpbiBzcmMpIHsKICAgIGRzdFt1XSA9IHt9OwogICAgZm9yIChjb25zdCBwIGluIHNyY1t1XSkgewogICAgICBjb25zdCBwcm9wZXJ0eSA9IHNyY1t1XVtwXTsKICAgICAgaWYgKHByb3BlcnR5ICYmIChwcm9wZXJ0eS5pc0NvbG9yIHx8IHByb3BlcnR5LmlzTWF0cml4MyB8fCBwcm9wZXJ0eS5pc01hdHJpeDQgfHwgcHJvcGVydHkuaXNWZWN0b3IyIHx8IHByb3BlcnR5LmlzVmVjdG9yMyB8fCBwcm9wZXJ0eS5pc1ZlY3RvcjQgfHwgcHJvcGVydHkuaXNUZXh0dXJlIHx8IHByb3BlcnR5LmlzUXVhdGVybmlvbikpIHsKICAgICAgICBpZiAocHJvcGVydHkuaXNSZW5kZXJUYXJnZXRUZXh0dXJlKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oIlVuaWZvcm1zVXRpbHM6IFRleHR1cmVzIG9mIHJlbmRlciB0YXJnZXRzIGNhbm5vdCBiZSBjbG9uZWQgdmlhIGNsb25lVW5pZm9ybXMoKSBvciBtZXJnZVVuaWZvcm1zKCkuIik7CiAgICAgICAgICBkc3RbdV1bcF0gPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkc3RbdV1bcF0gPSBwcm9wZXJ0eS5jbG9uZSgpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHByb3BlcnR5KSkgewogICAgICAgIGRzdFt1XVtwXSA9IHByb3BlcnR5LnNsaWNlKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZHN0W3VdW3BdID0gcHJvcGVydHk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGRzdDsKfQpmdW5jdGlvbiBtZXJnZVVuaWZvcm1zKHVuaWZvcm1zKSB7CiAgY29uc3QgbWVyZ2VkID0ge307CiAgZm9yIChsZXQgdSA9IDA7dSA8IHVuaWZvcm1zLmxlbmd0aDsgdSsrKSB7CiAgICBjb25zdCB0bXAgPSBjbG9uZVVuaWZvcm1zKHVuaWZvcm1zW3VdKTsKICAgIGZvciAoY29uc3QgcCBpbiB0bXApIHsKICAgICAgbWVyZ2VkW3BdID0gdG1wW3BdOwogICAgfQogIH0KICByZXR1cm4gbWVyZ2VkOwp9CmZ1bmN0aW9uIGNsb25lVW5pZm9ybXNHcm91cHMoc3JjKSB7CiAgY29uc3QgZHN0ID0gW107CiAgZm9yIChsZXQgdSA9IDA7dSA8IHNyYy5sZW5ndGg7IHUrKykgewogICAgZHN0LnB1c2goc3JjW3VdLmNsb25lKCkpOwogIH0KICByZXR1cm4gZHN0Owp9CmZ1bmN0aW9uIGdldFVubGl0VW5pZm9ybUNvbG9yU3BhY2UocmVuZGVyZXIpIHsKICBjb25zdCBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7CiAgaWYgKGN1cnJlbnRSZW5kZXJUYXJnZXQgPT09IG51bGwpIHsKICAgIHJldHVybiByZW5kZXJlci5vdXRwdXRDb2xvclNwYWNlOwogIH0KICBpZiAoY3VycmVudFJlbmRlclRhcmdldC5pc1hSUmVuZGVyVGFyZ2V0ID09PSB0cnVlKSB7CiAgICByZXR1cm4gY3VycmVudFJlbmRlclRhcmdldC50ZXh0dXJlLmNvbG9yU3BhY2U7CiAgfQogIHJldHVybiBDb2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2U7Cn0KCmNsYXNzIFdlYlhSQ29udHJvbGxlciB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLl90YXJnZXRSYXkgPSBudWxsOwogICAgdGhpcy5fZ3JpcCA9IG51bGw7CiAgICB0aGlzLl9oYW5kID0gbnVsbDsKICB9CiAgZ2V0SGFuZFNwYWNlKCkgewogICAgaWYgKHRoaXMuX2hhbmQgPT09IG51bGwpIHsKICAgICAgdGhpcy5faGFuZCA9IG5ldyBHcm91cDsKICAgICAgdGhpcy5faGFuZC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CiAgICAgIHRoaXMuX2hhbmQudmlzaWJsZSA9IGZhbHNlOwogICAgICB0aGlzLl9oYW5kLmpvaW50cyA9IHt9OwogICAgICB0aGlzLl9oYW5kLmlucHV0U3RhdGUgPSB7IHBpbmNoaW5nOiBmYWxzZSB9OwogICAgfQogICAgcmV0dXJuIHRoaXMuX2hhbmQ7CiAgfQogIGdldFRhcmdldFJheVNwYWNlKCkgewogICAgaWYgKHRoaXMuX3RhcmdldFJheSA9PT0gbnVsbCkgewogICAgICB0aGlzLl90YXJnZXRSYXkgPSBuZXcgR3JvdXA7CiAgICAgIHRoaXMuX3RhcmdldFJheS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CiAgICAgIHRoaXMuX3RhcmdldFJheS52aXNpYmxlID0gZmFsc2U7CiAgICAgIHRoaXMuX3RhcmdldFJheS5oYXNMaW5lYXJWZWxvY2l0eSA9IGZhbHNlOwogICAgICB0aGlzLl90YXJnZXRSYXkubGluZWFyVmVsb2NpdHkgPSBuZXcgVmVjdG9yMzsKICAgICAgdGhpcy5fdGFyZ2V0UmF5Lmhhc0FuZ3VsYXJWZWxvY2l0eSA9IGZhbHNlOwogICAgICB0aGlzLl90YXJnZXRSYXkuYW5ndWxhclZlbG9jaXR5ID0gbmV3IFZlY3RvcjM7CiAgICB9CiAgICByZXR1cm4gdGhpcy5fdGFyZ2V0UmF5OwogIH0KICBnZXRHcmlwU3BhY2UoKSB7CiAgICBpZiAodGhpcy5fZ3JpcCA9PT0gbnVsbCkgewogICAgICB0aGlzLl9ncmlwID0gbmV3IEdyb3VwOwogICAgICB0aGlzLl9ncmlwLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKICAgICAgdGhpcy5fZ3JpcC52aXNpYmxlID0gZmFsc2U7CiAgICAgIHRoaXMuX2dyaXAuaGFzTGluZWFyVmVsb2NpdHkgPSBmYWxzZTsKICAgICAgdGhpcy5fZ3JpcC5saW5lYXJWZWxvY2l0eSA9IG5ldyBWZWN0b3IzOwogICAgICB0aGlzLl9ncmlwLmhhc0FuZ3VsYXJWZWxvY2l0eSA9IGZhbHNlOwogICAgICB0aGlzLl9ncmlwLmFuZ3VsYXJWZWxvY2l0eSA9IG5ldyBWZWN0b3IzOwogICAgfQogICAgcmV0dXJuIHRoaXMuX2dyaXA7CiAgfQogIGRpc3BhdGNoRXZlbnQoZXZlbnQpIHsKICAgIGlmICh0aGlzLl90YXJnZXRSYXkgIT09IG51bGwpIHsKICAgICAgdGhpcy5fdGFyZ2V0UmF5LmRpc3BhdGNoRXZlbnQoZXZlbnQpOwogICAgfQogICAgaWYgKHRoaXMuX2dyaXAgIT09IG51bGwpIHsKICAgICAgdGhpcy5fZ3JpcC5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgIH0KICAgIGlmICh0aGlzLl9oYW5kICE9PSBudWxsKSB7CiAgICAgIHRoaXMuX2hhbmQuZGlzcGF0Y2hFdmVudChldmVudCk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CiAgY29ubmVjdChpbnB1dFNvdXJjZSkgewogICAgaWYgKGlucHV0U291cmNlICYmIGlucHV0U291cmNlLmhhbmQpIHsKICAgICAgY29uc3QgaGFuZCA9IHRoaXMuX2hhbmQ7CiAgICAgIGlmIChoYW5kKSB7CiAgICAgICAgZm9yIChjb25zdCBpbnB1dGpvaW50IG9mIGlucHV0U291cmNlLmhhbmQudmFsdWVzKCkpIHsKICAgICAgICAgIHRoaXMuX2dldEhhbmRKb2ludChoYW5kLCBpbnB1dGpvaW50KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICJjb25uZWN0ZWQiLCBkYXRhOiBpbnB1dFNvdXJjZSB9KTsKICAgIHJldHVybiB0aGlzOwogIH0KICBkaXNjb25uZWN0KGlucHV0U291cmNlKSB7CiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoeyB0eXBlOiAiZGlzY29ubmVjdGVkIiwgZGF0YTogaW5wdXRTb3VyY2UgfSk7CiAgICBpZiAodGhpcy5fdGFyZ2V0UmF5ICE9PSBudWxsKSB7CiAgICAgIHRoaXMuX3RhcmdldFJheS52aXNpYmxlID0gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpcy5fZ3JpcCAhPT0gbnVsbCkgewogICAgICB0aGlzLl9ncmlwLnZpc2libGUgPSBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzLl9oYW5kICE9PSBudWxsKSB7CiAgICAgIHRoaXMuX2hhbmQudmlzaWJsZSA9IGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIHVwZGF0ZShpbnB1dFNvdXJjZSwgZnJhbWUsIHJlZmVyZW5jZVNwYWNlKSB7CiAgICBsZXQgaW5wdXRQb3NlID0gbnVsbDsKICAgIGxldCBncmlwUG9zZSA9IG51bGw7CiAgICBsZXQgaGFuZFBvc2UgPSBudWxsOwogICAgY29uc3QgdGFyZ2V0UmF5ID0gdGhpcy5fdGFyZ2V0UmF5OwogICAgY29uc3QgZ3JpcCA9IHRoaXMuX2dyaXA7CiAgICBjb25zdCBoYW5kID0gdGhpcy5faGFuZDsKICAgIGlmIChpbnB1dFNvdXJjZSAmJiBmcmFtZS5zZXNzaW9uLnZpc2liaWxpdHlTdGF0ZSAhPT0gInZpc2libGUtYmx1cnJlZCIpIHsKICAgICAgaWYgKGhhbmQgJiYgaW5wdXRTb3VyY2UuaGFuZCkgewogICAgICAgIGhhbmRQb3NlID0gdHJ1ZTsKICAgICAgICBmb3IgKGNvbnN0IGlucHV0am9pbnQgb2YgaW5wdXRTb3VyY2UuaGFuZC52YWx1ZXMoKSkgewogICAgICAgICAgY29uc3Qgam9pbnRQb3NlID0gZnJhbWUuZ2V0Sm9pbnRQb3NlKGlucHV0am9pbnQsIHJlZmVyZW5jZVNwYWNlKTsKICAgICAgICAgIGNvbnN0IGpvaW50ID0gdGhpcy5fZ2V0SGFuZEpvaW50KGhhbmQsIGlucHV0am9pbnQpOwogICAgICAgICAgaWYgKGpvaW50UG9zZSAhPT0gbnVsbCkgewogICAgICAgICAgICBqb2ludC5tYXRyaXguZnJvbUFycmF5KGpvaW50UG9zZS50cmFuc2Zvcm0ubWF0cml4KTsKICAgICAgICAgICAgam9pbnQubWF0cml4LmRlY29tcG9zZShqb2ludC5wb3NpdGlvbiwgam9pbnQucm90YXRpb24sIGpvaW50LnNjYWxlKTsKICAgICAgICAgICAgam9pbnQubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgICAgIGpvaW50LmpvaW50UmFkaXVzID0gam9pbnRQb3NlLnJhZGl1czsKICAgICAgICAgIH0KICAgICAgICAgIGpvaW50LnZpc2libGUgPSBqb2ludFBvc2UgIT09IG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGluZGV4VGlwID0gaGFuZC5qb2ludHNbImluZGV4LWZpbmdlci10aXAiXTsKICAgICAgICBjb25zdCB0aHVtYlRpcCA9IGhhbmQuam9pbnRzWyJ0aHVtYi10aXAiXTsKICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGluZGV4VGlwLnBvc2l0aW9uLmRpc3RhbmNlVG8odGh1bWJUaXAucG9zaXRpb24pOwogICAgICAgIGNvbnN0IGRpc3RhbmNlVG9QaW5jaCA9IDAuMDI7CiAgICAgICAgY29uc3QgdGhyZXNob2xkID0gMC4wMDU7CiAgICAgICAgaWYgKGhhbmQuaW5wdXRTdGF0ZS5waW5jaGluZyAmJiBkaXN0YW5jZSA+IGRpc3RhbmNlVG9QaW5jaCArIHRocmVzaG9sZCkgewogICAgICAgICAgaGFuZC5pbnB1dFN0YXRlLnBpbmNoaW5nID0gZmFsc2U7CiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoewogICAgICAgICAgICB0eXBlOiAicGluY2hlbmQiLAogICAgICAgICAgICBoYW5kZWRuZXNzOiBpbnB1dFNvdXJjZS5oYW5kZWRuZXNzLAogICAgICAgICAgICB0YXJnZXQ6IHRoaXMKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAoIWhhbmQuaW5wdXRTdGF0ZS5waW5jaGluZyAmJiBkaXN0YW5jZSA8PSBkaXN0YW5jZVRvUGluY2ggLSB0aHJlc2hvbGQpIHsKICAgICAgICAgIGhhbmQuaW5wdXRTdGF0ZS5waW5jaGluZyA9IHRydWU7CiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoewogICAgICAgICAgICB0eXBlOiAicGluY2hzdGFydCIsCiAgICAgICAgICAgIGhhbmRlZG5lc3M6IGlucHV0U291cmNlLmhhbmRlZG5lc3MsCiAgICAgICAgICAgIHRhcmdldDogdGhpcwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChncmlwICE9PSBudWxsICYmIGlucHV0U291cmNlLmdyaXBTcGFjZSkgewogICAgICAgICAgZ3JpcFBvc2UgPSBmcmFtZS5nZXRQb3NlKGlucHV0U291cmNlLmdyaXBTcGFjZSwgcmVmZXJlbmNlU3BhY2UpOwogICAgICAgICAgaWYgKGdyaXBQb3NlICE9PSBudWxsKSB7CiAgICAgICAgICAgIGdyaXAubWF0cml4LmZyb21BcnJheShncmlwUG9zZS50cmFuc2Zvcm0ubWF0cml4KTsKICAgICAgICAgICAgZ3JpcC5tYXRyaXguZGVjb21wb3NlKGdyaXAucG9zaXRpb24sIGdyaXAucm90YXRpb24sIGdyaXAuc2NhbGUpOwogICAgICAgICAgICBncmlwLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICAgICAgICBpZiAoZ3JpcFBvc2UubGluZWFyVmVsb2NpdHkpIHsKICAgICAgICAgICAgICBncmlwLmhhc0xpbmVhclZlbG9jaXR5ID0gdHJ1ZTsKICAgICAgICAgICAgICBncmlwLmxpbmVhclZlbG9jaXR5LmNvcHkoZ3JpcFBvc2UubGluZWFyVmVsb2NpdHkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGdyaXAuaGFzTGluZWFyVmVsb2NpdHkgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZ3JpcFBvc2UuYW5ndWxhclZlbG9jaXR5KSB7CiAgICAgICAgICAgICAgZ3JpcC5oYXNBbmd1bGFyVmVsb2NpdHkgPSB0cnVlOwogICAgICAgICAgICAgIGdyaXAuYW5ndWxhclZlbG9jaXR5LmNvcHkoZ3JpcFBvc2UuYW5ndWxhclZlbG9jaXR5KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBncmlwLmhhc0FuZ3VsYXJWZWxvY2l0eSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0YXJnZXRSYXkgIT09IG51bGwpIHsKICAgICAgICBpbnB1dFBvc2UgPSBmcmFtZS5nZXRQb3NlKGlucHV0U291cmNlLnRhcmdldFJheVNwYWNlLCByZWZlcmVuY2VTcGFjZSk7CiAgICAgICAgaWYgKGlucHV0UG9zZSA9PT0gbnVsbCAmJiBncmlwUG9zZSAhPT0gbnVsbCkgewogICAgICAgICAgaW5wdXRQb3NlID0gZ3JpcFBvc2U7CiAgICAgICAgfQogICAgICAgIGlmIChpbnB1dFBvc2UgIT09IG51bGwpIHsKICAgICAgICAgIHRhcmdldFJheS5tYXRyaXguZnJvbUFycmF5KGlucHV0UG9zZS50cmFuc2Zvcm0ubWF0cml4KTsKICAgICAgICAgIHRhcmdldFJheS5tYXRyaXguZGVjb21wb3NlKHRhcmdldFJheS5wb3NpdGlvbiwgdGFyZ2V0UmF5LnJvdGF0aW9uLCB0YXJnZXRSYXkuc2NhbGUpOwogICAgICAgICAgdGFyZ2V0UmF5Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICAgICAgaWYgKGlucHV0UG9zZS5saW5lYXJWZWxvY2l0eSkgewogICAgICAgICAgICB0YXJnZXRSYXkuaGFzTGluZWFyVmVsb2NpdHkgPSB0cnVlOwogICAgICAgICAgICB0YXJnZXRSYXkubGluZWFyVmVsb2NpdHkuY29weShpbnB1dFBvc2UubGluZWFyVmVsb2NpdHkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGFyZ2V0UmF5Lmhhc0xpbmVhclZlbG9jaXR5ID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaW5wdXRQb3NlLmFuZ3VsYXJWZWxvY2l0eSkgewogICAgICAgICAgICB0YXJnZXRSYXkuaGFzQW5ndWxhclZlbG9jaXR5ID0gdHJ1ZTsKICAgICAgICAgICAgdGFyZ2V0UmF5LmFuZ3VsYXJWZWxvY2l0eS5jb3B5KGlucHV0UG9zZS5hbmd1bGFyVmVsb2NpdHkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGFyZ2V0UmF5Lmhhc0FuZ3VsYXJWZWxvY2l0eSA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KF9tb3ZlRXZlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKHRhcmdldFJheSAhPT0gbnVsbCkgewogICAgICB0YXJnZXRSYXkudmlzaWJsZSA9IGlucHV0UG9zZSAhPT0gbnVsbDsKICAgIH0KICAgIGlmIChncmlwICE9PSBudWxsKSB7CiAgICAgIGdyaXAudmlzaWJsZSA9IGdyaXBQb3NlICE9PSBudWxsOwogICAgfQogICAgaWYgKGhhbmQgIT09IG51bGwpIHsKICAgICAgaGFuZC52aXNpYmxlID0gaGFuZFBvc2UgIT09IG51bGw7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CiAgX2dldEhhbmRKb2ludChoYW5kLCBpbnB1dGpvaW50KSB7CiAgICBpZiAoaGFuZC5qb2ludHNbaW5wdXRqb2ludC5qb2ludE5hbWVdID09PSB1bmRlZmluZWQpIHsKICAgICAgY29uc3Qgam9pbnQgPSBuZXcgR3JvdXA7CiAgICAgIGpvaW50Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKICAgICAgam9pbnQudmlzaWJsZSA9IGZhbHNlOwogICAgICBoYW5kLmpvaW50c1tpbnB1dGpvaW50LmpvaW50TmFtZV0gPSBqb2ludDsKICAgICAgaGFuZC5hZGQoam9pbnQpOwogICAgfQogICAgcmV0dXJuIGhhbmQuam9pbnRzW2lucHV0am9pbnQuam9pbnROYW1lXTsKICB9Cn0KCmNsYXNzIEZvZ0V4cDIgewogIGNvbnN0cnVjdG9yKGNvbG9yLCBkZW5zaXR5ID0gMC4wMDAyNSkgewogICAgdGhpcy5pc0ZvZ0V4cDIgPSB0cnVlOwogICAgdGhpcy5uYW1lID0gIiI7CiAgICB0aGlzLmNvbG9yID0gbmV3IENvbG9yKGNvbG9yKTsKICAgIHRoaXMuZGVuc2l0eSA9IGRlbnNpdHk7CiAgfQogIGNsb25lKCkgewogICAgcmV0dXJuIG5ldyBGb2dFeHAyKHRoaXMuY29sb3IsIHRoaXMuZGVuc2l0eSk7CiAgfQogIHRvSlNPTigpIHsKICAgIHJldHVybiB7CiAgICAgIHR5cGU6ICJGb2dFeHAyIiwKICAgICAgbmFtZTogdGhpcy5uYW1lLAogICAgICBjb2xvcjogdGhpcy5jb2xvci5nZXRIZXgoKSwKICAgICAgZGVuc2l0eTogdGhpcy5kZW5zaXR5CiAgICB9OwogIH0KfQoKY2xhc3MgRm9nIHsKICBjb25zdHJ1Y3Rvcihjb2xvciwgbmVhciA9IDEsIGZhciA9IDEwMDApIHsKICAgIHRoaXMuaXNGb2cgPSB0cnVlOwogICAgdGhpcy5uYW1lID0gIiI7CiAgICB0aGlzLmNvbG9yID0gbmV3IENvbG9yKGNvbG9yKTsKICAgIHRoaXMubmVhciA9IG5lYXI7CiAgICB0aGlzLmZhciA9IGZhcjsKICB9CiAgY2xvbmUoKSB7CiAgICByZXR1cm4gbmV3IEZvZyh0aGlzLmNvbG9yLCB0aGlzLm5lYXIsIHRoaXMuZmFyKTsKICB9CiAgdG9KU09OKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogIkZvZyIsCiAgICAgIG5hbWU6IHRoaXMubmFtZSwKICAgICAgY29sb3I6IHRoaXMuY29sb3IuZ2V0SGV4KCksCiAgICAgIG5lYXI6IHRoaXMubmVhciwKICAgICAgZmFyOiB0aGlzLmZhcgogICAgfTsKICB9Cn0KCmNsYXNzIEludGVybGVhdmVkQnVmZmVyIHsKICBjb25zdHJ1Y3RvcihhcnJheSwgc3RyaWRlKSB7CiAgICB0aGlzLmlzSW50ZXJsZWF2ZWRCdWZmZXIgPSB0cnVlOwogICAgdGhpcy5hcnJheSA9IGFycmF5OwogICAgdGhpcy5zdHJpZGUgPSBzdHJpZGU7CiAgICB0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHN0cmlkZSA6IDA7CiAgICB0aGlzLnVzYWdlID0gU3RhdGljRHJhd1VzYWdlOwogICAgdGhpcy51cGRhdGVSYW5nZXMgPSBbXTsKICAgIHRoaXMudmVyc2lvbiA9IDA7CiAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTsKICB9CiAgb25VcGxvYWRDYWxsYmFjaygpIHt9CiAgc2V0IG5lZWRzVXBkYXRlKHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IHRydWUpCiAgICAgIHRoaXMudmVyc2lvbisrOwogIH0KICBzZXRVc2FnZSh2YWx1ZSkgewogICAgdGhpcy51c2FnZSA9IHZhbHVlOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGFkZFVwZGF0ZVJhbmdlKHN0YXJ0LCBjb3VudCkgewogICAgdGhpcy51cGRhdGVSYW5nZXMucHVzaCh7IHN0YXJ0LCBjb3VudCB9KTsKICB9CiAgY2xlYXJVcGRhdGVSYW5nZXMoKSB7CiAgICB0aGlzLnVwZGF0ZVJhbmdlcy5sZW5ndGggPSAwOwogIH0KICBjb3B5KHNvdXJjZSkgewogICAgdGhpcy5hcnJheSA9IG5ldyBzb3VyY2UuYXJyYXkuY29uc3RydWN0b3Ioc291cmNlLmFycmF5KTsKICAgIHRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7CiAgICB0aGlzLnN0cmlkZSA9IHNvdXJjZS5zdHJpZGU7CiAgICB0aGlzLnVzYWdlID0gc291cmNlLnVzYWdlOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGNvcHlBdChpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyKSB7CiAgICBpbmRleDEgKj0gdGhpcy5zdHJpZGU7CiAgICBpbmRleDIgKj0gYXR0cmlidXRlLnN0cmlkZTsKICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5zdHJpZGU7aSA8IGw7IGkrKykgewogICAgICB0aGlzLmFycmF5W2luZGV4MSArIGldID0gYXR0cmlidXRlLmFycmF5W2luZGV4MiArIGldOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldCh2YWx1ZSwgb2Zmc2V0ID0gMCkgewogICAgdGhpcy5hcnJheS5zZXQodmFsdWUsIG9mZnNldCk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgY2xvbmUoZGF0YSkgewogICAgaWYgKGRhdGEuYXJyYXlCdWZmZXJzID09PSB1bmRlZmluZWQpIHsKICAgICAgZGF0YS5hcnJheUJ1ZmZlcnMgPSB7fTsKICAgIH0KICAgIGlmICh0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkID0gZ2VuZXJhdGVVVUlEKCk7CiAgICB9CiAgICBpZiAoZGF0YS5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdID09PSB1bmRlZmluZWQpIHsKICAgICAgZGF0YS5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdID0gdGhpcy5hcnJheS5zbGljZSgwKS5idWZmZXI7CiAgICB9CiAgICBjb25zdCBhcnJheSA9IG5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKGRhdGEuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXSk7CiAgICBjb25zdCBpYiA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGFycmF5LCB0aGlzLnN0cmlkZSk7CiAgICBpYi5zZXRVc2FnZSh0aGlzLnVzYWdlKTsKICAgIHJldHVybiBpYjsKICB9CiAgb25VcGxvYWQoY2FsbGJhY2spIHsKICAgIHRoaXMub25VcGxvYWRDYWxsYmFjayA9IGNhbGxiYWNrOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHRvSlNPTihkYXRhKSB7CiAgICBpZiAoZGF0YS5hcnJheUJ1ZmZlcnMgPT09IHVuZGVmaW5lZCkgewogICAgICBkYXRhLmFycmF5QnVmZmVycyA9IHt9OwogICAgfQogICAgaWYgKHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkID09PSB1bmRlZmluZWQpIHsKICAgICAgdGhpcy5hcnJheS5idWZmZXIuX3V1aWQgPSBnZW5lcmF0ZVVVSUQoKTsKICAgIH0KICAgIGlmIChkYXRhLmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF0gPT09IHVuZGVmaW5lZCkgewogICAgICBkYXRhLmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF0gPSBBcnJheS5mcm9tKG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5LmJ1ZmZlcikpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgdXVpZDogdGhpcy51dWlkLAogICAgICBidWZmZXI6IHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkLAogICAgICB0eXBlOiB0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsCiAgICAgIHN0cmlkZTogdGhpcy5zdHJpZGUKICAgIH07CiAgfQp9CgpjbGFzcyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSB7CiAgY29uc3RydWN0b3IoaW50ZXJsZWF2ZWRCdWZmZXIsIGl0ZW1TaXplLCBvZmZzZXQsIG5vcm1hbGl6ZWQgPSBmYWxzZSkgewogICAgdGhpcy5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlID0gdHJ1ZTsKICAgIHRoaXMubmFtZSA9ICIiOwogICAgdGhpcy5kYXRhID0gaW50ZXJsZWF2ZWRCdWZmZXI7CiAgICB0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7CiAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKICAgIHRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQ7CiAgfQogIGdldCBjb3VudCgpIHsKICAgIHJldHVybiB0aGlzLmRhdGEuY291bnQ7CiAgfQogIGdldCBhcnJheSgpIHsKICAgIHJldHVybiB0aGlzLmRhdGEuYXJyYXk7CiAgfQogIHNldCBuZWVkc1VwZGF0ZSh2YWx1ZSkgewogICAgdGhpcy5kYXRhLm5lZWRzVXBkYXRlID0gdmFsdWU7CiAgfQogIGFwcGx5TWF0cml4NChtKSB7CiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRoaXMuZGF0YS5jb3VudDtpIDwgbDsgaSsrKSB7CiAgICAgIF92ZWN0b3IkNy5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsIGkpOwogICAgICBfdmVjdG9yJDcuYXBwbHlNYXRyaXg0KG0pOwogICAgICB0aGlzLnNldFhZWihpLCBfdmVjdG9yJDcueCwgX3ZlY3RvciQ3LnksIF92ZWN0b3IkNy56KTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KICBhcHBseU5vcm1hbE1hdHJpeChtKSB7CiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7aSA8IGw7IGkrKykgewogICAgICBfdmVjdG9yJDcuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLCBpKTsKICAgICAgX3ZlY3RvciQ3LmFwcGx5Tm9ybWFsTWF0cml4KG0pOwogICAgICB0aGlzLnNldFhZWihpLCBfdmVjdG9yJDcueCwgX3ZlY3RvciQ3LnksIF92ZWN0b3IkNy56KTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KICB0cmFuc2Zvcm1EaXJlY3Rpb24obSkgewogICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50O2kgPCBsOyBpKyspIHsKICAgICAgX3ZlY3RvciQ3LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcywgaSk7CiAgICAgIF92ZWN0b3IkNy50cmFuc2Zvcm1EaXJlY3Rpb24obSk7CiAgICAgIHRoaXMuc2V0WFlaKGksIF92ZWN0b3IkNy54LCBfdmVjdG9yJDcueSwgX3ZlY3RvciQ3LnopOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIGdldENvbXBvbmVudChpbmRleCwgY29tcG9uZW50KSB7CiAgICBsZXQgdmFsdWUgPSB0aGlzLmFycmF5W2luZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgY29tcG9uZW50XTsKICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpCiAgICAgIHZhbHVlID0gZGVub3JtYWxpemUodmFsdWUsIHRoaXMuYXJyYXkpOwogICAgcmV0dXJuIHZhbHVlOwogIH0KICBzZXRDb21wb25lbnQoaW5kZXgsIGNvbXBvbmVudCwgdmFsdWUpIHsKICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpCiAgICAgIHZhbHVlID0gbm9ybWFsaXplKHZhbHVlLCB0aGlzLmFycmF5KTsKICAgIHRoaXMuZGF0YS5hcnJheVtpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIGNvbXBvbmVudF0gPSB2YWx1ZTsKICAgIHJldHVybiB0aGlzOwogIH0KICBzZXRYKGluZGV4LCB4KSB7CiAgICBpZiAodGhpcy5ub3JtYWxpemVkKQogICAgICB4ID0gbm9ybWFsaXplKHgsIHRoaXMuYXJyYXkpOwogICAgdGhpcy5kYXRhLmFycmF5W2luZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0XSA9IHg7CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2V0WShpbmRleCwgeSkgewogICAgaWYgKHRoaXMubm9ybWFsaXplZCkKICAgICAgeSA9IG5vcm1hbGl6ZSh5LCB0aGlzLmFycmF5KTsKICAgIHRoaXMuZGF0YS5hcnJheVtpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDFdID0geTsKICAgIHJldHVybiB0aGlzOwogIH0KICBzZXRaKGluZGV4LCB6KSB7CiAgICBpZiAodGhpcy5ub3JtYWxpemVkKQogICAgICB6ID0gbm9ybWFsaXplKHosIHRoaXMuYXJyYXkpOwogICAgdGhpcy5kYXRhLmFycmF5W2luZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMl0gPSB6OwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldFcoaW5kZXgsIHcpIHsKICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpCiAgICAgIHcgPSBub3JtYWxpemUodywgdGhpcy5hcnJheSk7CiAgICB0aGlzLmRhdGEuYXJyYXlbaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAzXSA9IHc7CiAgICByZXR1cm4gdGhpczsKICB9CiAgZ2V0WChpbmRleCkgewogICAgbGV0IHggPSB0aGlzLmRhdGEuYXJyYXlbaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXRdOwogICAgaWYgKHRoaXMubm9ybWFsaXplZCkKICAgICAgeCA9IGRlbm9ybWFsaXplKHgsIHRoaXMuYXJyYXkpOwogICAgcmV0dXJuIHg7CiAgfQogIGdldFkoaW5kZXgpIHsKICAgIGxldCB5ID0gdGhpcy5kYXRhLmFycmF5W2luZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMV07CiAgICBpZiAodGhpcy5ub3JtYWxpemVkKQogICAgICB5ID0gZGVub3JtYWxpemUoeSwgdGhpcy5hcnJheSk7CiAgICByZXR1cm4geTsKICB9CiAgZ2V0WihpbmRleCkgewogICAgbGV0IHogPSB0aGlzLmRhdGEuYXJyYXlbaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAyXTsKICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpCiAgICAgIHogPSBkZW5vcm1hbGl6ZSh6LCB0aGlzLmFycmF5KTsKICAgIHJldHVybiB6OwogIH0KICBnZXRXKGluZGV4KSB7CiAgICBsZXQgdyA9IHRoaXMuZGF0YS5hcnJheVtpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDNdOwogICAgaWYgKHRoaXMubm9ybWFsaXplZCkKICAgICAgdyA9IGRlbm9ybWFsaXplKHcsIHRoaXMuYXJyYXkpOwogICAgcmV0dXJuIHc7CiAgfQogIHNldFhZKGluZGV4LCB4LCB5KSB7CiAgICBpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0OwogICAgaWYgKHRoaXMubm9ybWFsaXplZCkgewogICAgICB4ID0gbm9ybWFsaXplKHgsIHRoaXMuYXJyYXkpOwogICAgICB5ID0gbm9ybWFsaXplKHksIHRoaXMuYXJyYXkpOwogICAgfQogICAgdGhpcy5kYXRhLmFycmF5W2luZGV4ICsgMF0gPSB4OwogICAgdGhpcy5kYXRhLmFycmF5W2luZGV4ICsgMV0gPSB5OwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldFhZWihpbmRleCwgeCwgeSwgeikgewogICAgaW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDsKICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpIHsKICAgICAgeCA9IG5vcm1hbGl6ZSh4LCB0aGlzLmFycmF5KTsKICAgICAgeSA9IG5vcm1hbGl6ZSh5LCB0aGlzLmFycmF5KTsKICAgICAgeiA9IG5vcm1hbGl6ZSh6LCB0aGlzLmFycmF5KTsKICAgIH0KICAgIHRoaXMuZGF0YS5hcnJheVtpbmRleCArIDBdID0geDsKICAgIHRoaXMuZGF0YS5hcnJheVtpbmRleCArIDFdID0geTsKICAgIHRoaXMuZGF0YS5hcnJheVtpbmRleCArIDJdID0gejsKICAgIHJldHVybiB0aGlzOwogIH0KICBzZXRYWVpXKGluZGV4LCB4LCB5LCB6LCB3KSB7CiAgICBpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0OwogICAgaWYgKHRoaXMubm9ybWFsaXplZCkgewogICAgICB4ID0gbm9ybWFsaXplKHgsIHRoaXMuYXJyYXkpOwogICAgICB5ID0gbm9ybWFsaXplKHksIHRoaXMuYXJyYXkpOwogICAgICB6ID0gbm9ybWFsaXplKHosIHRoaXMuYXJyYXkpOwogICAgICB3ID0gbm9ybWFsaXplKHcsIHRoaXMuYXJyYXkpOwogICAgfQogICAgdGhpcy5kYXRhLmFycmF5W2luZGV4ICsgMF0gPSB4OwogICAgdGhpcy5kYXRhLmFycmF5W2luZGV4ICsgMV0gPSB5OwogICAgdGhpcy5kYXRhLmFycmF5W2luZGV4ICsgMl0gPSB6OwogICAgdGhpcy5kYXRhLmFycmF5W2luZGV4ICsgM10gPSB3OwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGNsb25lKGRhdGEpIHsKICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHsKICAgICAgY29uc29sZS5sb2coIlRIUkVFLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLmNsb25lKCk6IENsb25pbmcgYW4gaW50ZXJsZWF2ZWQgYnVmZmVyIGF0dHJpYnV0ZSB3aWxsIGRlLWludGVybGVhdmUgYnVmZmVyIGRhdGEuIik7CiAgICAgIGNvbnN0IGFycmF5ID0gW107CiAgICAgIGZvciAobGV0IGkgPSAwO2kgPCB0aGlzLmNvdW50OyBpKyspIHsKICAgICAgICBjb25zdCBpbmRleCA9IGkgKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7aiA8IHRoaXMuaXRlbVNpemU7IGorKykgewogICAgICAgICAgYXJyYXkucHVzaCh0aGlzLmRhdGEuYXJyYXlbaW5kZXggKyBqXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBuZXcgQnVmZmVyQXR0cmlidXRlKG5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKGFycmF5KSwgdGhpcy5pdGVtU2l6ZSwgdGhpcy5ub3JtYWxpemVkKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChkYXRhLmludGVybGVhdmVkQnVmZmVycyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnMgPSB7fTsKICAgICAgfQogICAgICBpZiAoZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkYXRhLmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF0gPSB0aGlzLmRhdGEuY2xvbmUoZGF0YSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZShkYXRhLmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF0sIHRoaXMuaXRlbVNpemUsIHRoaXMub2Zmc2V0LCB0aGlzLm5vcm1hbGl6ZWQpOwogICAgfQogIH0KICB0b0pTT04oZGF0YSkgewogICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgewogICAgICBjb25zb2xlLmxvZygiVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUudG9KU09OKCk6IFNlcmlhbGl6aW5nIGFuIGludGVybGVhdmVkIGJ1ZmZlciBhdHRyaWJ1dGUgd2lsbCBkZS1pbnRlcmxlYXZlIGJ1ZmZlciBkYXRhLiIpOwogICAgICBjb25zdCBhcnJheSA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMDtpIDwgdGhpcy5jb3VudDsgaSsrKSB7CiAgICAgICAgY29uc3QgaW5kZXggPSBpICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0OwogICAgICAgIGZvciAobGV0IGogPSAwO2ogPCB0aGlzLml0ZW1TaXplOyBqKyspIHsKICAgICAgICAgIGFycmF5LnB1c2godGhpcy5kYXRhLmFycmF5W2luZGV4ICsgal0pOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIGl0ZW1TaXplOiB0aGlzLml0ZW1TaXplLAogICAgICAgIHR5cGU6IHRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSwKICAgICAgICBhcnJheSwKICAgICAgICBub3JtYWxpemVkOiB0aGlzLm5vcm1hbGl6ZWQKICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChkYXRhLmludGVybGVhdmVkQnVmZmVycyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnMgPSB7fTsKICAgICAgfQogICAgICBpZiAoZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkYXRhLmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF0gPSB0aGlzLmRhdGEudG9KU09OKGRhdGEpOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZTogdHJ1ZSwKICAgICAgICBpdGVtU2l6ZTogdGhpcy5pdGVtU2l6ZSwKICAgICAgICBkYXRhOiB0aGlzLmRhdGEudXVpZCwKICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LAogICAgICAgIG5vcm1hbGl6ZWQ6IHRoaXMubm9ybWFsaXplZAogICAgICB9OwogICAgfQogIH0KfQpmdW5jdGlvbiB0cmFuc2Zvcm1WZXJ0ZXgodmVydGV4UG9zaXRpb24sIG12UG9zaXRpb24sIGNlbnRlciwgc2NhbGUsIHNpbiwgY29zKSB7CiAgX2FsaWduZWRQb3NpdGlvbi5zdWJWZWN0b3JzKHZlcnRleFBvc2l0aW9uLCBjZW50ZXIpLmFkZFNjYWxhcigwLjUpLm11bHRpcGx5KHNjYWxlKTsKICBpZiAoc2luICE9PSB1bmRlZmluZWQpIHsKICAgIF9yb3RhdGVkUG9zaXRpb24ueCA9IGNvcyAqIF9hbGlnbmVkUG9zaXRpb24ueCAtIHNpbiAqIF9hbGlnbmVkUG9zaXRpb24ueTsKICAgIF9yb3RhdGVkUG9zaXRpb24ueSA9IHNpbiAqIF9hbGlnbmVkUG9zaXRpb24ueCArIGNvcyAqIF9hbGlnbmVkUG9zaXRpb24ueTsKICB9IGVsc2UgewogICAgX3JvdGF0ZWRQb3NpdGlvbi5jb3B5KF9hbGlnbmVkUG9zaXRpb24pOwogIH0KICB2ZXJ0ZXhQb3NpdGlvbi5jb3B5KG12UG9zaXRpb24pOwogIHZlcnRleFBvc2l0aW9uLnggKz0gX3JvdGF0ZWRQb3NpdGlvbi54OwogIHZlcnRleFBvc2l0aW9uLnkgKz0gX3JvdGF0ZWRQb3NpdGlvbi55OwogIHZlcnRleFBvc2l0aW9uLmFwcGx5TWF0cml4NChfdmlld1dvcmxkTWF0cml4KTsKfQoKY2xhc3MgU2tlbGV0b24gewogIGNvbnN0cnVjdG9yKGJvbmVzID0gW10sIGJvbmVJbnZlcnNlcyA9IFtdKSB7CiAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTsKICAgIHRoaXMuYm9uZXMgPSBib25lcy5zbGljZSgwKTsKICAgIHRoaXMuYm9uZUludmVyc2VzID0gYm9uZUludmVyc2VzOwogICAgdGhpcy5ib25lTWF0cmljZXMgPSBudWxsOwogICAgdGhpcy5ib25lVGV4dHVyZSA9IG51bGw7CiAgICB0aGlzLmluaXQoKTsKICB9CiAgaW5pdCgpIHsKICAgIGNvbnN0IGJvbmVzID0gdGhpcy5ib25lczsKICAgIGNvbnN0IGJvbmVJbnZlcnNlcyA9IHRoaXMuYm9uZUludmVyc2VzOwogICAgdGhpcy5ib25lTWF0cmljZXMgPSBuZXcgRmxvYXQzMkFycmF5KGJvbmVzLmxlbmd0aCAqIDE2KTsKICAgIGlmIChib25lSW52ZXJzZXMubGVuZ3RoID09PSAwKSB7CiAgICAgIHRoaXMuY2FsY3VsYXRlSW52ZXJzZXMoKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChib25lcy5sZW5ndGggIT09IGJvbmVJbnZlcnNlcy5sZW5ndGgpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLlNrZWxldG9uOiBOdW1iZXIgb2YgaW52ZXJzZSBib25lIG1hdHJpY2VzIGRvZXMgbm90IG1hdGNoIGFtb3VudCBvZiBib25lcy4iKTsKICAgICAgICB0aGlzLmJvbmVJbnZlcnNlcyA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoO2kgPCBpbDsgaSsrKSB7CiAgICAgICAgICB0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyBNYXRyaXg0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgY2FsY3VsYXRlSW52ZXJzZXMoKSB7CiAgICB0aGlzLmJvbmVJbnZlcnNlcy5sZW5ndGggPSAwOwogICAgZm9yIChsZXQgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgY29uc3QgaW52ZXJzZSA9IG5ldyBNYXRyaXg0OwogICAgICBpZiAodGhpcy5ib25lc1tpXSkgewogICAgICAgIGludmVyc2UuY29weSh0aGlzLmJvbmVzW2ldLm1hdHJpeFdvcmxkKS5pbnZlcnQoKTsKICAgICAgfQogICAgICB0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKGludmVyc2UpOwogICAgfQogIH0KICBwb3NlKCkgewogICAgZm9yIChsZXQgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgY29uc3QgYm9uZSA9IHRoaXMuYm9uZXNbaV07CiAgICAgIGlmIChib25lKSB7CiAgICAgICAgYm9uZS5tYXRyaXhXb3JsZC5jb3B5KHRoaXMuYm9uZUludmVyc2VzW2ldKS5pbnZlcnQoKTsKICAgICAgfQogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgY29uc3QgYm9uZSA9IHRoaXMuYm9uZXNbaV07CiAgICAgIGlmIChib25lKSB7CiAgICAgICAgaWYgKGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSkgewogICAgICAgICAgYm9uZS5tYXRyaXguY29weShib25lLnBhcmVudC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk7CiAgICAgICAgICBib25lLm1hdHJpeC5tdWx0aXBseShib25lLm1hdHJpeFdvcmxkKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYm9uZS5tYXRyaXguY29weShib25lLm1hdHJpeFdvcmxkKTsKICAgICAgICB9CiAgICAgICAgYm9uZS5tYXRyaXguZGVjb21wb3NlKGJvbmUucG9zaXRpb24sIGJvbmUucXVhdGVybmlvbiwgYm9uZS5zY2FsZSk7CiAgICAgIH0KICAgIH0KICB9CiAgdXBkYXRlKCkgewogICAgY29uc3QgYm9uZXMgPSB0aGlzLmJvbmVzOwogICAgY29uc3QgYm9uZUludmVyc2VzID0gdGhpcy5ib25lSW52ZXJzZXM7CiAgICBjb25zdCBib25lTWF0cmljZXMgPSB0aGlzLmJvbmVNYXRyaWNlczsKICAgIGNvbnN0IGJvbmVUZXh0dXJlID0gdGhpcy5ib25lVGV4dHVyZTsKICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IGJvbmVzLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICBjb25zdCBtYXRyaXggPSBib25lc1tpXSA/IGJvbmVzW2ldLm1hdHJpeFdvcmxkIDogX2lkZW50aXR5TWF0cml4OwogICAgICBfb2Zmc2V0TWF0cml4Lm11bHRpcGx5TWF0cmljZXMobWF0cml4LCBib25lSW52ZXJzZXNbaV0pOwogICAgICBfb2Zmc2V0TWF0cml4LnRvQXJyYXkoYm9uZU1hdHJpY2VzLCBpICogMTYpOwogICAgfQogICAgaWYgKGJvbmVUZXh0dXJlICE9PSBudWxsKSB7CiAgICAgIGJvbmVUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgIH0KICB9CiAgY2xvbmUoKSB7CiAgICByZXR1cm4gbmV3IFNrZWxldG9uKHRoaXMuYm9uZXMsIHRoaXMuYm9uZUludmVyc2VzKTsKICB9CiAgY29tcHV0ZUJvbmVUZXh0dXJlKCkgewogICAgbGV0IHNpemUgPSBNYXRoLnNxcnQodGhpcy5ib25lcy5sZW5ndGggKiA0KTsKICAgIHNpemUgPSBNYXRoLmNlaWwoc2l6ZSAvIDQpICogNDsKICAgIHNpemUgPSBNYXRoLm1heChzaXplLCA0KTsKICAgIGNvbnN0IGJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSAqIHNpemUgKiA0KTsKICAgIGJvbmVNYXRyaWNlcy5zZXQodGhpcy5ib25lTWF0cmljZXMpOwogICAgY29uc3QgYm9uZVRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoYm9uZU1hdHJpY2VzLCBzaXplLCBzaXplLCBSR0JBRm9ybWF0LCBGbG9hdFR5cGUpOwogICAgYm9uZVRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgdGhpcy5ib25lTWF0cmljZXMgPSBib25lTWF0cmljZXM7CiAgICB0aGlzLmJvbmVUZXh0dXJlID0gYm9uZVRleHR1cmU7CiAgICByZXR1cm4gdGhpczsKICB9CiAgZ2V0Qm9uZUJ5TmFtZShuYW1lKSB7CiAgICBmb3IgKGxldCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICBjb25zdCBib25lID0gdGhpcy5ib25lc1tpXTsKICAgICAgaWYgKGJvbmUubmFtZSA9PT0gbmFtZSkgewogICAgICAgIHJldHVybiBib25lOwogICAgICB9CiAgICB9CiAgICByZXR1cm47CiAgfQogIGRpc3Bvc2UoKSB7CiAgICBpZiAodGhpcy5ib25lVGV4dHVyZSAhPT0gbnVsbCkgewogICAgICB0aGlzLmJvbmVUZXh0dXJlLmRpc3Bvc2UoKTsKICAgICAgdGhpcy5ib25lVGV4dHVyZSA9IG51bGw7CiAgICB9CiAgfQogIGZyb21KU09OKGpzb24sIGJvbmVzKSB7CiAgICB0aGlzLnV1aWQgPSBqc29uLnV1aWQ7CiAgICBmb3IgKGxldCBpID0gMCwgbCA9IGpzb24uYm9uZXMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgY29uc3QgdXVpZCA9IGpzb24uYm9uZXNbaV07CiAgICAgIGxldCBib25lID0gYm9uZXNbdXVpZF07CiAgICAgIGlmIChib25lID09PSB1bmRlZmluZWQpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLlNrZWxldG9uOiBObyBib25lIGZvdW5kIHdpdGggVVVJRDoiLCB1dWlkKTsKICAgICAgICBib25lID0gbmV3IEJvbmU7CiAgICAgIH0KICAgICAgdGhpcy5ib25lcy5wdXNoKGJvbmUpOwogICAgICB0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyBNYXRyaXg0KCkuZnJvbUFycmF5KGpzb24uYm9uZUludmVyc2VzW2ldKSk7CiAgICB9CiAgICB0aGlzLmluaXQoKTsKICAgIHJldHVybiB0aGlzOwogIH0KICB0b0pTT04oKSB7CiAgICBjb25zdCBkYXRhID0gewogICAgICBtZXRhZGF0YTogewogICAgICAgIHZlcnNpb246IDQuNiwKICAgICAgICB0eXBlOiAiU2tlbGV0b24iLAogICAgICAgIGdlbmVyYXRvcjogIlNrZWxldG9uLnRvSlNPTiIKICAgICAgfSwKICAgICAgYm9uZXM6IFtdLAogICAgICBib25lSW52ZXJzZXM6IFtdCiAgICB9OwogICAgZGF0YS51dWlkID0gdGhpcy51dWlkOwogICAgY29uc3QgYm9uZXMgPSB0aGlzLmJvbmVzOwogICAgY29uc3QgYm9uZUludmVyc2VzID0gdGhpcy5ib25lSW52ZXJzZXM7CiAgICBmb3IgKGxldCBpID0gMCwgbCA9IGJvbmVzLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgIGNvbnN0IGJvbmUgPSBib25lc1tpXTsKICAgICAgZGF0YS5ib25lcy5wdXNoKGJvbmUudXVpZCk7CiAgICAgIGNvbnN0IGJvbmVJbnZlcnNlID0gYm9uZUludmVyc2VzW2ldOwogICAgICBkYXRhLmJvbmVJbnZlcnNlcy5wdXNoKGJvbmVJbnZlcnNlLnRvQXJyYXkoKSk7CiAgICB9CiAgICByZXR1cm4gZGF0YTsKICB9Cn0KCmNsYXNzIFBsYW5lIHsKICBjb25zdHJ1Y3Rvcihub3JtYWwgPSBuZXcgVmVjdG9yMygxLCAwLCAwKSwgY29uc3RhbnQgPSAwKSB7CiAgICB0aGlzLmlzUGxhbmUgPSB0cnVlOwogICAgdGhpcy5ub3JtYWwgPSBub3JtYWw7CiAgICB0aGlzLmNvbnN0YW50ID0gY29uc3RhbnQ7CiAgfQogIHNldChub3JtYWwsIGNvbnN0YW50KSB7CiAgICB0aGlzLm5vcm1hbC5jb3B5KG5vcm1hbCk7CiAgICB0aGlzLmNvbnN0YW50ID0gY29uc3RhbnQ7CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2V0Q29tcG9uZW50cyh4LCB5LCB6LCB3KSB7CiAgICB0aGlzLm5vcm1hbC5zZXQoeCwgeSwgeik7CiAgICB0aGlzLmNvbnN0YW50ID0gdzsKICAgIHJldHVybiB0aGlzOwogIH0KICBzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChub3JtYWwsIHBvaW50KSB7CiAgICB0aGlzLm5vcm1hbC5jb3B5KG5vcm1hbCk7CiAgICB0aGlzLmNvbnN0YW50ID0gLXBvaW50LmRvdCh0aGlzLm5vcm1hbCk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2V0RnJvbUNvcGxhbmFyUG9pbnRzKGEsIGIsIGMpIHsKICAgIGNvbnN0IG5vcm1hbCA9IF92ZWN0b3IxLnN1YlZlY3RvcnMoYywgYikuY3Jvc3MoX3ZlY3RvcjIuc3ViVmVjdG9ycyhhLCBiKSkubm9ybWFsaXplKCk7CiAgICB0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KG5vcm1hbCwgYSk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgY29weShwbGFuZSkgewogICAgdGhpcy5ub3JtYWwuY29weShwbGFuZS5ub3JtYWwpOwogICAgdGhpcy5jb25zdGFudCA9IHBsYW5lLmNvbnN0YW50OwogICAgcmV0dXJuIHRoaXM7CiAgfQogIG5vcm1hbGl6ZSgpIHsKICAgIGNvbnN0IGludmVyc2VOb3JtYWxMZW5ndGggPSAxIC8gdGhpcy5ub3JtYWwubGVuZ3RoKCk7CiAgICB0aGlzLm5vcm1hbC5tdWx0aXBseVNjYWxhcihpbnZlcnNlTm9ybWFsTGVuZ3RoKTsKICAgIHRoaXMuY29uc3RhbnQgKj0gaW52ZXJzZU5vcm1hbExlbmd0aDsKICAgIHJldHVybiB0aGlzOwogIH0KICBuZWdhdGUoKSB7CiAgICB0aGlzLmNvbnN0YW50ICo9IC0xOwogICAgdGhpcy5ub3JtYWwubmVnYXRlKCk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgZGlzdGFuY2VUb1BvaW50KHBvaW50KSB7CiAgICByZXR1cm4gdGhpcy5ub3JtYWwuZG90KHBvaW50KSArIHRoaXMuY29uc3RhbnQ7CiAgfQogIGRpc3RhbmNlVG9TcGhlcmUoc3BoZXJlKSB7CiAgICByZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoc3BoZXJlLmNlbnRlcikgLSBzcGhlcmUucmFkaXVzOwogIH0KICBwcm9qZWN0UG9pbnQocG9pbnQsIHRhcmdldCkgewogICAgcmV0dXJuIHRhcmdldC5jb3B5KHBvaW50KS5hZGRTY2FsZWRWZWN0b3IodGhpcy5ub3JtYWwsIC10aGlzLmRpc3RhbmNlVG9Qb2ludChwb2ludCkpOwogIH0KICBpbnRlcnNlY3RMaW5lKGxpbmUsIHRhcmdldCkgewogICAgY29uc3QgZGlyZWN0aW9uID0gbGluZS5kZWx0YShfdmVjdG9yMSk7CiAgICBjb25zdCBkZW5vbWluYXRvciA9IHRoaXMubm9ybWFsLmRvdChkaXJlY3Rpb24pOwogICAgaWYgKGRlbm9taW5hdG9yID09PSAwKSB7CiAgICAgIGlmICh0aGlzLmRpc3RhbmNlVG9Qb2ludChsaW5lLnN0YXJ0KSA9PT0gMCkgewogICAgICAgIHJldHVybiB0YXJnZXQuY29weShsaW5lLnN0YXJ0KTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHQgPSAtKGxpbmUuc3RhcnQuZG90KHRoaXMubm9ybWFsKSArIHRoaXMuY29uc3RhbnQpIC8gZGVub21pbmF0b3I7CiAgICBpZiAodCA8IDAgfHwgdCA+IDEpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0LmNvcHkobGluZS5zdGFydCkuYWRkU2NhbGVkVmVjdG9yKGRpcmVjdGlvbiwgdCk7CiAgfQogIGludGVyc2VjdHNMaW5lKGxpbmUpIHsKICAgIGNvbnN0IHN0YXJ0U2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KGxpbmUuc3RhcnQpOwogICAgY29uc3QgZW5kU2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KGxpbmUuZW5kKTsKICAgIHJldHVybiBzdGFydFNpZ24gPCAwICYmIGVuZFNpZ24gPiAwIHx8IGVuZFNpZ24gPCAwICYmIHN0YXJ0U2lnbiA+IDA7CiAgfQogIGludGVyc2VjdHNCb3goYm94KSB7CiAgICByZXR1cm4gYm94LmludGVyc2VjdHNQbGFuZSh0aGlzKTsKICB9CiAgaW50ZXJzZWN0c1NwaGVyZShzcGhlcmUpIHsKICAgIHJldHVybiBzcGhlcmUuaW50ZXJzZWN0c1BsYW5lKHRoaXMpOwogIH0KICBjb3BsYW5hclBvaW50KHRhcmdldCkgewogICAgcmV0dXJuIHRhcmdldC5jb3B5KHRoaXMubm9ybWFsKS5tdWx0aXBseVNjYWxhcigtdGhpcy5jb25zdGFudCk7CiAgfQogIGFwcGx5TWF0cml4NChtYXRyaXgsIG9wdGlvbmFsTm9ybWFsTWF0cml4KSB7CiAgICBjb25zdCBub3JtYWxNYXRyaXggPSBvcHRpb25hbE5vcm1hbE1hdHJpeCB8fCBfbm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeChtYXRyaXgpOwogICAgY29uc3QgcmVmZXJlbmNlUG9pbnQgPSB0aGlzLmNvcGxhbmFyUG9pbnQoX3ZlY3RvcjEpLmFwcGx5TWF0cml4NChtYXRyaXgpOwogICAgY29uc3Qgbm9ybWFsID0gdGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKG5vcm1hbE1hdHJpeCkubm9ybWFsaXplKCk7CiAgICB0aGlzLmNvbnN0YW50ID0gLXJlZmVyZW5jZVBvaW50LmRvdChub3JtYWwpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHRyYW5zbGF0ZShvZmZzZXQpIHsKICAgIHRoaXMuY29uc3RhbnQgLT0gb2Zmc2V0LmRvdCh0aGlzLm5vcm1hbCk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgZXF1YWxzKHBsYW5lKSB7CiAgICByZXR1cm4gcGxhbmUubm9ybWFsLmVxdWFscyh0aGlzLm5vcm1hbCkgJiYgcGxhbmUuY29uc3RhbnQgPT09IHRoaXMuY29uc3RhbnQ7CiAgfQogIGNsb25lKCkgewogICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKTsKICB9Cn0KCmNsYXNzIEZydXN0dW0gewogIGNvbnN0cnVjdG9yKHAwID0gbmV3IFBsYW5lLCBwMSA9IG5ldyBQbGFuZSwgcDIgPSBuZXcgUGxhbmUsIHAzID0gbmV3IFBsYW5lLCBwNCA9IG5ldyBQbGFuZSwgcDUgPSBuZXcgUGxhbmUpIHsKICAgIHRoaXMucGxhbmVzID0gW3AwLCBwMSwgcDIsIHAzLCBwNCwgcDVdOwogIH0KICBzZXQocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSkgewogICAgY29uc3QgcGxhbmVzID0gdGhpcy5wbGFuZXM7CiAgICBwbGFuZXNbMF0uY29weShwMCk7CiAgICBwbGFuZXNbMV0uY29weShwMSk7CiAgICBwbGFuZXNbMl0uY29weShwMik7CiAgICBwbGFuZXNbM10uY29weShwMyk7CiAgICBwbGFuZXNbNF0uY29weShwNCk7CiAgICBwbGFuZXNbNV0uY29weShwNSk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgY29weShmcnVzdHVtKSB7CiAgICBjb25zdCBwbGFuZXMgPSB0aGlzLnBsYW5lczsKICAgIGZvciAobGV0IGkgPSAwO2kgPCA2OyBpKyspIHsKICAgICAgcGxhbmVzW2ldLmNvcHkoZnJ1c3R1bS5wbGFuZXNbaV0pOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldEZyb21Qcm9qZWN0aW9uTWF0cml4KG0sIGNvb3JkaW5hdGVTeXN0ZW0gPSBXZWJHTENvb3JkaW5hdGVTeXN0ZW0pIHsKICAgIGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzOwogICAgY29uc3QgbWUgPSBtLmVsZW1lbnRzOwogICAgY29uc3QgbWUwID0gbWVbMF0sIG1lMSA9IG1lWzFdLCBtZTIgPSBtZVsyXSwgbWUzID0gbWVbM107CiAgICBjb25zdCBtZTQgPSBtZVs0XSwgbWU1ID0gbWVbNV0sIG1lNiA9IG1lWzZdLCBtZTcgPSBtZVs3XTsKICAgIGNvbnN0IG1lOCA9IG1lWzhdLCBtZTkgPSBtZVs5XSwgbWUxMCA9IG1lWzEwXSwgbWUxMSA9IG1lWzExXTsKICAgIGNvbnN0IG1lMTIgPSBtZVsxMl0sIG1lMTMgPSBtZVsxM10sIG1lMTQgPSBtZVsxNF0sIG1lMTUgPSBtZVsxNV07CiAgICBwbGFuZXNbMF0uc2V0Q29tcG9uZW50cyhtZTMgLSBtZTAsIG1lNyAtIG1lNCwgbWUxMSAtIG1lOCwgbWUxNSAtIG1lMTIpLm5vcm1hbGl6ZSgpOwogICAgcGxhbmVzWzFdLnNldENvbXBvbmVudHMobWUzICsgbWUwLCBtZTcgKyBtZTQsIG1lMTEgKyBtZTgsIG1lMTUgKyBtZTEyKS5ub3JtYWxpemUoKTsKICAgIHBsYW5lc1syXS5zZXRDb21wb25lbnRzKG1lMyArIG1lMSwgbWU3ICsgbWU1LCBtZTExICsgbWU5LCBtZTE1ICsgbWUxMykubm9ybWFsaXplKCk7CiAgICBwbGFuZXNbM10uc2V0Q29tcG9uZW50cyhtZTMgLSBtZTEsIG1lNyAtIG1lNSwgbWUxMSAtIG1lOSwgbWUxNSAtIG1lMTMpLm5vcm1hbGl6ZSgpOwogICAgcGxhbmVzWzRdLnNldENvbXBvbmVudHMobWUzIC0gbWUyLCBtZTcgLSBtZTYsIG1lMTEgLSBtZTEwLCBtZTE1IC0gbWUxNCkubm9ybWFsaXplKCk7CiAgICBpZiAoY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR0xDb29yZGluYXRlU3lzdGVtKSB7CiAgICAgIHBsYW5lc1s1XS5zZXRDb21wb25lbnRzKG1lMyArIG1lMiwgbWU3ICsgbWU2LCBtZTExICsgbWUxMCwgbWUxNSArIG1lMTQpLm5vcm1hbGl6ZSgpOwogICAgfSBlbHNlIGlmIChjb29yZGluYXRlU3lzdGVtID09PSBXZWJHUFVDb29yZGluYXRlU3lzdGVtKSB7CiAgICAgIHBsYW5lc1s1XS5zZXRDb21wb25lbnRzKG1lMiwgbWU2LCBtZTEwLCBtZTE0KS5ub3JtYWxpemUoKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVEhSRUUuRnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiICsgY29vcmRpbmF0ZVN5c3RlbSk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CiAgaW50ZXJzZWN0c09iamVjdChvYmplY3QpIHsKICAgIGlmIChvYmplY3QuYm91bmRpbmdTcGhlcmUgIT09IHVuZGVmaW5lZCkgewogICAgICBpZiAob2JqZWN0LmJvdW5kaW5nU3BoZXJlID09PSBudWxsKQogICAgICAgIG9iamVjdC5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKICAgICAgX3NwaGVyZSQzLmNvcHkob2JqZWN0LmJvdW5kaW5nU3BoZXJlKS5hcHBseU1hdHJpeDQob2JqZWN0Lm1hdHJpeFdvcmxkKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5OwogICAgICBpZiAoZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwpCiAgICAgICAgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CiAgICAgIF9zcGhlcmUkMy5jb3B5KGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlKS5hcHBseU1hdHJpeDQob2JqZWN0Lm1hdHJpeFdvcmxkKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoX3NwaGVyZSQzKTsKICB9CiAgaW50ZXJzZWN0c1Nwcml0ZShzcHJpdGUpIHsKICAgIF9zcGhlcmUkMy5jZW50ZXIuc2V0KDAsIDAsIDApOwogICAgX3NwaGVyZSQzLnJhZGl1cyA9IDAuNzA3MTA2NzgxMTg2NTQ3NjsKICAgIF9zcGhlcmUkMy5hcHBseU1hdHJpeDQoc3ByaXRlLm1hdHJpeFdvcmxkKTsKICAgIHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoX3NwaGVyZSQzKTsKICB9CiAgaW50ZXJzZWN0c1NwaGVyZShzcGhlcmUpIHsKICAgIGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzOwogICAgY29uc3QgY2VudGVyID0gc3BoZXJlLmNlbnRlcjsKICAgIGNvbnN0IG5lZ1JhZGl1cyA9IC1zcGhlcmUucmFkaXVzOwogICAgZm9yIChsZXQgaSA9IDA7aSA8IDY7IGkrKykgewogICAgICBjb25zdCBkaXN0YW5jZSA9IHBsYW5lc1tpXS5kaXN0YW5jZVRvUG9pbnQoY2VudGVyKTsKICAgICAgaWYgKGRpc3RhbmNlIDwgbmVnUmFkaXVzKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgaW50ZXJzZWN0c0JveChib3gpIHsKICAgIGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzOwogICAgZm9yIChsZXQgaSA9IDA7aSA8IDY7IGkrKykgewogICAgICBjb25zdCBwbGFuZSA9IHBsYW5lc1tpXTsKICAgICAgX3ZlY3RvciQ2LnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBib3gubWF4LnggOiBib3gubWluLng7CiAgICAgIF92ZWN0b3IkNi55ID0gcGxhbmUubm9ybWFsLnkgPiAwID8gYm94Lm1heC55IDogYm94Lm1pbi55OwogICAgICBfdmVjdG9yJDYueiA9IHBsYW5lLm5vcm1hbC56ID4gMCA/IGJveC5tYXgueiA6IGJveC5taW4uejsKICAgICAgaWYgKHBsYW5lLmRpc3RhbmNlVG9Qb2ludChfdmVjdG9yJDYpIDwgMCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIGNvbnRhaW5zUG9pbnQocG9pbnQpIHsKICAgIGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzOwogICAgZm9yIChsZXQgaSA9IDA7aSA8IDY7IGkrKykgewogICAgICBpZiAocGxhbmVzW2ldLmRpc3RhbmNlVG9Qb2ludChwb2ludCkgPCAwKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgY2xvbmUoKSB7CiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpOwogIH0KfQpmdW5jdGlvbiBhc2NJZFNvcnQoYSwgYikgewogIHJldHVybiBhIC0gYjsKfQpmdW5jdGlvbiBzb3J0T3BhcXVlKGEsIGIpIHsKICByZXR1cm4gYS56IC0gYi56Owp9CmZ1bmN0aW9uIHNvcnRUcmFuc3BhcmVudChhLCBiKSB7CiAgcmV0dXJuIGIueiAtIGEuejsKfQoKY2xhc3MgTXVsdGlEcmF3UmVuZGVyTGlzdCB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLmluZGV4ID0gMDsKICAgIHRoaXMucG9vbCA9IFtdOwogICAgdGhpcy5saXN0ID0gW107CiAgfQogIHB1c2goc3RhcnQsIGNvdW50LCB6LCBpbmRleCkgewogICAgY29uc3QgcG9vbCA9IHRoaXMucG9vbDsKICAgIGNvbnN0IGxpc3QgPSB0aGlzLmxpc3Q7CiAgICBpZiAodGhpcy5pbmRleCA+PSBwb29sLmxlbmd0aCkgewogICAgICBwb29sLnB1c2goewogICAgICAgIHN0YXJ0OiAtMSwKICAgICAgICBjb3VudDogLTEsCiAgICAgICAgejogLTEsCiAgICAgICAgaW5kZXg6IC0xCiAgICAgIH0pOwogICAgfQogICAgY29uc3QgaXRlbSA9IHBvb2xbdGhpcy5pbmRleF07CiAgICBsaXN0LnB1c2goaXRlbSk7CiAgICB0aGlzLmluZGV4Kys7CiAgICBpdGVtLnN0YXJ0ID0gc3RhcnQ7CiAgICBpdGVtLmNvdW50ID0gY291bnQ7CiAgICBpdGVtLnogPSB6OwogICAgaXRlbS5pbmRleCA9IGluZGV4OwogIH0KICByZXNldCgpIHsKICAgIHRoaXMubGlzdC5sZW5ndGggPSAwOwogICAgdGhpcy5pbmRleCA9IDA7CiAgfQp9CmZ1bmN0aW9uIGNvcHlBdHRyaWJ1dGVEYXRhKHNyYywgdGFyZ2V0LCB0YXJnZXRPZmZzZXQgPSAwKSB7CiAgY29uc3QgaXRlbVNpemUgPSB0YXJnZXQuaXRlbVNpemU7CiAgaWYgKHNyYy5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIHx8IHNyYy5hcnJheS5jb25zdHJ1Y3RvciAhPT0gdGFyZ2V0LmFycmF5LmNvbnN0cnVjdG9yKSB7CiAgICBjb25zdCB2ZXJ0ZXhDb3VudCA9IHNyYy5jb3VudDsKICAgIGZvciAobGV0IGkgPSAwO2kgPCB2ZXJ0ZXhDb3VudDsgaSsrKSB7CiAgICAgIGZvciAobGV0IGMgPSAwO2MgPCBpdGVtU2l6ZTsgYysrKSB7CiAgICAgICAgdGFyZ2V0LnNldENvbXBvbmVudChpICsgdGFyZ2V0T2Zmc2V0LCBjLCBzcmMuZ2V0Q29tcG9uZW50KGksIGMpKTsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICB0YXJnZXQuYXJyYXkuc2V0KHNyYy5hcnJheSwgdGFyZ2V0T2Zmc2V0ICogaXRlbVNpemUpOwogIH0KICB0YXJnZXQubmVlZHNVcGRhdGUgPSB0cnVlOwp9CmZ1bmN0aW9uIGNvcHlBcnJheUNvbnRlbnRzKHNyYywgdGFyZ2V0KSB7CiAgaWYgKHNyYy5jb25zdHJ1Y3RvciAhPT0gdGFyZ2V0LmNvbnN0cnVjdG9yKSB7CiAgICBjb25zdCBsZW4gPSBNYXRoLm1pbihzcmMubGVuZ3RoLCB0YXJnZXQubGVuZ3RoKTsKICAgIGZvciAobGV0IGkgPSAwO2kgPCBsZW47IGkrKykgewogICAgICB0YXJnZXRbaV0gPSBzcmNbaV07CiAgICB9CiAgfSBlbHNlIHsKICAgIGNvbnN0IGxlbiA9IE1hdGgubWluKHNyYy5sZW5ndGgsIHRhcmdldC5sZW5ndGgpOwogICAgdGFyZ2V0LnNldChuZXcgc3JjLmNvbnN0cnVjdG9yKHNyYy5idWZmZXIsIDAsIGxlbikpOwogIH0KfQpmdW5jdGlvbiBjaGVja0ludGVyc2VjdGlvbihvYmplY3QsIHJheWNhc3RlciwgcmF5LCB0aHJlc2hvbGRTcSwgYSwgYiwgaSkgewogIGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gb2JqZWN0Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247CiAgX3ZTdGFydC5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uQXR0cmlidXRlLCBhKTsKICBfdkVuZC5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uQXR0cmlidXRlLCBiKTsKICBjb25zdCBkaXN0U3EgPSByYXkuZGlzdGFuY2VTcVRvU2VnbWVudChfdlN0YXJ0LCBfdkVuZCwgX2ludGVyc2VjdFBvaW50T25SYXksIF9pbnRlcnNlY3RQb2ludE9uU2VnbWVudCk7CiAgaWYgKGRpc3RTcSA+IHRocmVzaG9sZFNxKQogICAgcmV0dXJuOwogIF9pbnRlcnNlY3RQb2ludE9uUmF5LmFwcGx5TWF0cml4NChvYmplY3QubWF0cml4V29ybGQpOwogIGNvbnN0IGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhfaW50ZXJzZWN0UG9pbnRPblJheSk7CiAgaWYgKGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyKQogICAgcmV0dXJuOwogIHJldHVybiB7CiAgICBkaXN0YW5jZSwKICAgIHBvaW50OiBfaW50ZXJzZWN0UG9pbnRPblNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQob2JqZWN0Lm1hdHJpeFdvcmxkKSwKICAgIGluZGV4OiBpLAogICAgZmFjZTogbnVsbCwKICAgIGZhY2VJbmRleDogbnVsbCwKICAgIGJhcnljb29yZDogbnVsbCwKICAgIG9iamVjdAogIH07Cn0KZnVuY3Rpb24gdGVzdFBvaW50KHBvaW50LCBpbmRleCwgbG9jYWxUaHJlc2hvbGRTcSwgbWF0cml4V29ybGQsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgb2JqZWN0KSB7CiAgY29uc3QgcmF5UG9pbnREaXN0YW5jZVNxID0gX3JheS5kaXN0YW5jZVNxVG9Qb2ludChwb2ludCk7CiAgaWYgKHJheVBvaW50RGlzdGFuY2VTcSA8IGxvY2FsVGhyZXNob2xkU3EpIHsKICAgIGNvbnN0IGludGVyc2VjdFBvaW50ID0gbmV3IFZlY3RvcjM7CiAgICBfcmF5LmNsb3Nlc3RQb2ludFRvUG9pbnQocG9pbnQsIGludGVyc2VjdFBvaW50KTsKICAgIGludGVyc2VjdFBvaW50LmFwcGx5TWF0cml4NChtYXRyaXhXb3JsZCk7CiAgICBjb25zdCBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oaW50ZXJzZWN0UG9pbnQpOwogICAgaWYgKGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyKQogICAgICByZXR1cm47CiAgICBpbnRlcnNlY3RzLnB1c2goewogICAgICBkaXN0YW5jZSwKICAgICAgZGlzdGFuY2VUb1JheTogTWF0aC5zcXJ0KHJheVBvaW50RGlzdGFuY2VTcSksCiAgICAgIHBvaW50OiBpbnRlcnNlY3RQb2ludCwKICAgICAgaW5kZXgsCiAgICAgIGZhY2U6IG51bGwsCiAgICAgIGZhY2VJbmRleDogbnVsbCwKICAgICAgYmFyeWNvb3JkOiBudWxsLAogICAgICBvYmplY3QKICAgIH0pOwogIH0KfQoKY2xhc3MgQ3VydmUgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy50eXBlID0gIkN1cnZlIjsKICAgIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gMjAwOwogIH0KICBnZXRQb2ludCgpIHsKICAgIGNvbnNvbGUud2FybigiVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4iKTsKICAgIHJldHVybiBudWxsOwogIH0KICBnZXRQb2ludEF0KHUsIG9wdGlvbmFsVGFyZ2V0KSB7CiAgICBjb25zdCB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyh1KTsKICAgIHJldHVybiB0aGlzLmdldFBvaW50KHQsIG9wdGlvbmFsVGFyZ2V0KTsKICB9CiAgZ2V0UG9pbnRzKGRpdmlzaW9ucyA9IDUpIHsKICAgIGNvbnN0IHBvaW50cyA9IFtdOwogICAgZm9yIChsZXQgZCA9IDA7ZCA8PSBkaXZpc2lvbnM7IGQrKykgewogICAgICBwb2ludHMucHVzaCh0aGlzLmdldFBvaW50KGQgLyBkaXZpc2lvbnMpKTsKICAgIH0KICAgIHJldHVybiBwb2ludHM7CiAgfQogIGdldFNwYWNlZFBvaW50cyhkaXZpc2lvbnMgPSA1KSB7CiAgICBjb25zdCBwb2ludHMgPSBbXTsKICAgIGZvciAobGV0IGQgPSAwO2QgPD0gZGl2aXNpb25zOyBkKyspIHsKICAgICAgcG9pbnRzLnB1c2godGhpcy5nZXRQb2ludEF0KGQgLyBkaXZpc2lvbnMpKTsKICAgIH0KICAgIHJldHVybiBwb2ludHM7CiAgfQogIGdldExlbmd0aCgpIHsKICAgIGNvbnN0IGxlbmd0aHMgPSB0aGlzLmdldExlbmd0aHMoKTsKICAgIHJldHVybiBsZW5ndGhzW2xlbmd0aHMubGVuZ3RoIC0gMV07CiAgfQogIGdldExlbmd0aHMoZGl2aXNpb25zID0gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMpIHsKICAgIGlmICh0aGlzLmNhY2hlQXJjTGVuZ3RocyAmJiB0aGlzLmNhY2hlQXJjTGVuZ3Rocy5sZW5ndGggPT09IGRpdmlzaW9ucyArIDEgJiYgIXRoaXMubmVlZHNVcGRhdGUpIHsKICAgICAgcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzOwogICAgfQogICAgdGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlOwogICAgY29uc3QgY2FjaGUgPSBbXTsKICAgIGxldCBjdXJyZW50LCBsYXN0ID0gdGhpcy5nZXRQb2ludCgwKTsKICAgIGxldCBzdW0gPSAwOwogICAgY2FjaGUucHVzaCgwKTsKICAgIGZvciAobGV0IHAgPSAxO3AgPD0gZGl2aXNpb25zOyBwKyspIHsKICAgICAgY3VycmVudCA9IHRoaXMuZ2V0UG9pbnQocCAvIGRpdmlzaW9ucyk7CiAgICAgIHN1bSArPSBjdXJyZW50LmRpc3RhbmNlVG8obGFzdCk7CiAgICAgIGNhY2hlLnB1c2goc3VtKTsKICAgICAgbGFzdCA9IGN1cnJlbnQ7CiAgICB9CiAgICB0aGlzLmNhY2hlQXJjTGVuZ3RocyA9IGNhY2hlOwogICAgcmV0dXJuIGNhY2hlOwogIH0KICB1cGRhdGVBcmNMZW5ndGhzKCkgewogICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICB0aGlzLmdldExlbmd0aHMoKTsKICB9CiAgZ2V0VXRvVG1hcHBpbmcodSwgZGlzdGFuY2UpIHsKICAgIGNvbnN0IGFyY0xlbmd0aHMgPSB0aGlzLmdldExlbmd0aHMoKTsKICAgIGxldCBpID0gMDsKICAgIGNvbnN0IGlsID0gYXJjTGVuZ3Rocy5sZW5ndGg7CiAgICBsZXQgdGFyZ2V0QXJjTGVuZ3RoOwogICAgaWYgKGRpc3RhbmNlKSB7CiAgICAgIHRhcmdldEFyY0xlbmd0aCA9IGRpc3RhbmNlOwogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0QXJjTGVuZ3RoID0gdSAqIGFyY0xlbmd0aHNbaWwgLSAxXTsKICAgIH0KICAgIGxldCBsb3cgPSAwLCBoaWdoID0gaWwgLSAxLCBjb21wYXJpc29uOwogICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgIGkgPSBNYXRoLmZsb29yKGxvdyArIChoaWdoIC0gbG93KSAvIDIpOwogICAgICBjb21wYXJpc29uID0gYXJjTGVuZ3Roc1tpXSAtIHRhcmdldEFyY0xlbmd0aDsKICAgICAgaWYgKGNvbXBhcmlzb24gPCAwKSB7CiAgICAgICAgbG93ID0gaSArIDE7CiAgICAgIH0gZWxzZSBpZiAoY29tcGFyaXNvbiA+IDApIHsKICAgICAgICBoaWdoID0gaSAtIDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaGlnaCA9IGk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGkgPSBoaWdoOwogICAgaWYgKGFyY0xlbmd0aHNbaV0gPT09IHRhcmdldEFyY0xlbmd0aCkgewogICAgICByZXR1cm4gaSAvIChpbCAtIDEpOwogICAgfQogICAgY29uc3QgbGVuZ3RoQmVmb3JlID0gYXJjTGVuZ3Roc1tpXTsKICAgIGNvbnN0IGxlbmd0aEFmdGVyID0gYXJjTGVuZ3Roc1tpICsgMV07CiAgICBjb25zdCBzZWdtZW50TGVuZ3RoID0gbGVuZ3RoQWZ0ZXIgLSBsZW5ndGhCZWZvcmU7CiAgICBjb25zdCBzZWdtZW50RnJhY3Rpb24gPSAodGFyZ2V0QXJjTGVuZ3RoIC0gbGVuZ3RoQmVmb3JlKSAvIHNlZ21lbnRMZW5ndGg7CiAgICBjb25zdCB0ID0gKGkgKyBzZWdtZW50RnJhY3Rpb24pIC8gKGlsIC0gMSk7CiAgICByZXR1cm4gdDsKICB9CiAgZ2V0VGFuZ2VudCh0LCBvcHRpb25hbFRhcmdldCkgewogICAgY29uc3QgZGVsdGEgPSAwLjAwMDE7CiAgICBsZXQgdDEgPSB0IC0gZGVsdGE7CiAgICBsZXQgdDIgPSB0ICsgZGVsdGE7CiAgICBpZiAodDEgPCAwKQogICAgICB0MSA9IDA7CiAgICBpZiAodDIgPiAxKQogICAgICB0MiA9IDE7CiAgICBjb25zdCBwdDEgPSB0aGlzLmdldFBvaW50KHQxKTsKICAgIGNvbnN0IHB0MiA9IHRoaXMuZ2V0UG9pbnQodDIpOwogICAgY29uc3QgdGFuZ2VudCA9IG9wdGlvbmFsVGFyZ2V0IHx8IChwdDEuaXNWZWN0b3IyID8gbmV3IFZlY3RvcjIgOiBuZXcgVmVjdG9yMyk7CiAgICB0YW5nZW50LmNvcHkocHQyKS5zdWIocHQxKS5ub3JtYWxpemUoKTsKICAgIHJldHVybiB0YW5nZW50OwogIH0KICBnZXRUYW5nZW50QXQodSwgb3B0aW9uYWxUYXJnZXQpIHsKICAgIGNvbnN0IHQgPSB0aGlzLmdldFV0b1RtYXBwaW5nKHUpOwogICAgcmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCh0LCBvcHRpb25hbFRhcmdldCk7CiAgfQogIGNvbXB1dGVGcmVuZXRGcmFtZXMoc2VnbWVudHMsIGNsb3NlZCkgewogICAgY29uc3Qgbm9ybWFsID0gbmV3IFZlY3RvcjM7CiAgICBjb25zdCB0YW5nZW50cyA9IFtdOwogICAgY29uc3Qgbm9ybWFscyA9IFtdOwogICAgY29uc3QgYmlub3JtYWxzID0gW107CiAgICBjb25zdCB2ZWMgPSBuZXcgVmVjdG9yMzsKICAgIGNvbnN0IG1hdCA9IG5ldyBNYXRyaXg0OwogICAgZm9yIChsZXQgaSA9IDA7aSA8PSBzZWdtZW50czsgaSsrKSB7CiAgICAgIGNvbnN0IHUgPSBpIC8gc2VnbWVudHM7CiAgICAgIHRhbmdlbnRzW2ldID0gdGhpcy5nZXRUYW5nZW50QXQodSwgbmV3IFZlY3RvcjMpOwogICAgfQogICAgbm9ybWFsc1swXSA9IG5ldyBWZWN0b3IzOwogICAgYmlub3JtYWxzWzBdID0gbmV3IFZlY3RvcjM7CiAgICBsZXQgbWluID0gTnVtYmVyLk1BWF9WQUxVRTsKICAgIGNvbnN0IHR4ID0gTWF0aC5hYnModGFuZ2VudHNbMF0ueCk7CiAgICBjb25zdCB0eSA9IE1hdGguYWJzKHRhbmdlbnRzWzBdLnkpOwogICAgY29uc3QgdHogPSBNYXRoLmFicyh0YW5nZW50c1swXS56KTsKICAgIGlmICh0eCA8PSBtaW4pIHsKICAgICAgbWluID0gdHg7CiAgICAgIG5vcm1hbC5zZXQoMSwgMCwgMCk7CiAgICB9CiAgICBpZiAodHkgPD0gbWluKSB7CiAgICAgIG1pbiA9IHR5OwogICAgICBub3JtYWwuc2V0KDAsIDEsIDApOwogICAgfQogICAgaWYgKHR6IDw9IG1pbikgewogICAgICBub3JtYWwuc2V0KDAsIDAsIDEpOwogICAgfQogICAgdmVjLmNyb3NzVmVjdG9ycyh0YW5nZW50c1swXSwgbm9ybWFsKS5ub3JtYWxpemUoKTsKICAgIG5vcm1hbHNbMF0uY3Jvc3NWZWN0b3JzKHRhbmdlbnRzWzBdLCB2ZWMpOwogICAgYmlub3JtYWxzWzBdLmNyb3NzVmVjdG9ycyh0YW5nZW50c1swXSwgbm9ybWFsc1swXSk7CiAgICBmb3IgKGxldCBpID0gMTtpIDw9IHNlZ21lbnRzOyBpKyspIHsKICAgICAgbm9ybWFsc1tpXSA9IG5vcm1hbHNbaSAtIDFdLmNsb25lKCk7CiAgICAgIGJpbm9ybWFsc1tpXSA9IGJpbm9ybWFsc1tpIC0gMV0uY2xvbmUoKTsKICAgICAgdmVjLmNyb3NzVmVjdG9ycyh0YW5nZW50c1tpIC0gMV0sIHRhbmdlbnRzW2ldKTsKICAgICAgaWYgKHZlYy5sZW5ndGgoKSA+IE51bWJlci5FUFNJTE9OKSB7CiAgICAgICAgdmVjLm5vcm1hbGl6ZSgpOwogICAgICAgIGNvbnN0IHRoZXRhID0gTWF0aC5hY29zKGNsYW1wKHRhbmdlbnRzW2kgLSAxXS5kb3QodGFuZ2VudHNbaV0pLCAtMSwgMSkpOwogICAgICAgIG5vcm1hbHNbaV0uYXBwbHlNYXRyaXg0KG1hdC5tYWtlUm90YXRpb25BeGlzKHZlYywgdGhldGEpKTsKICAgICAgfQogICAgICBiaW5vcm1hbHNbaV0uY3Jvc3NWZWN0b3JzKHRhbmdlbnRzW2ldLCBub3JtYWxzW2ldKTsKICAgIH0KICAgIGlmIChjbG9zZWQgPT09IHRydWUpIHsKICAgICAgbGV0IHRoZXRhID0gTWF0aC5hY29zKGNsYW1wKG5vcm1hbHNbMF0uZG90KG5vcm1hbHNbc2VnbWVudHNdKSwgLTEsIDEpKTsKICAgICAgdGhldGEgLz0gc2VnbWVudHM7CiAgICAgIGlmICh0YW5nZW50c1swXS5kb3QodmVjLmNyb3NzVmVjdG9ycyhub3JtYWxzWzBdLCBub3JtYWxzW3NlZ21lbnRzXSkpID4gMCkgewogICAgICAgIHRoZXRhID0gLXRoZXRhOwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAxO2kgPD0gc2VnbWVudHM7IGkrKykgewogICAgICAgIG5vcm1hbHNbaV0uYXBwbHlNYXRyaXg0KG1hdC5tYWtlUm90YXRpb25BeGlzKHRhbmdlbnRzW2ldLCB0aGV0YSAqIGkpKTsKICAgICAgICBiaW5vcm1hbHNbaV0uY3Jvc3NWZWN0b3JzKHRhbmdlbnRzW2ldLCBub3JtYWxzW2ldKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHsKICAgICAgdGFuZ2VudHMsCiAgICAgIG5vcm1hbHMsCiAgICAgIGJpbm9ybWFscwogICAgfTsKICB9CiAgY2xvbmUoKSB7CiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpOwogIH0KICBjb3B5KHNvdXJjZSkgewogICAgdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSBzb3VyY2UuYXJjTGVuZ3RoRGl2aXNpb25zOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHRvSlNPTigpIHsKICAgIGNvbnN0IGRhdGEgPSB7CiAgICAgIG1ldGFkYXRhOiB7CiAgICAgICAgdmVyc2lvbjogNC42LAogICAgICAgIHR5cGU6ICJDdXJ2ZSIsCiAgICAgICAgZ2VuZXJhdG9yOiAiQ3VydmUudG9KU09OIgogICAgICB9CiAgICB9OwogICAgZGF0YS5hcmNMZW5ndGhEaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9uczsKICAgIGRhdGEudHlwZSA9IHRoaXMudHlwZTsKICAgIHJldHVybiBkYXRhOwogIH0KICBmcm9tSlNPTihqc29uKSB7CiAgICB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IGpzb24uYXJjTGVuZ3RoRGl2aXNpb25zOwogICAgcmV0dXJuIHRoaXM7CiAgfQp9CmZ1bmN0aW9uIEN1YmljUG9seSgpIHsKICBsZXQgYzAgPSAwLCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwOwogIGZ1bmN0aW9uIGluaXQoeDAsIHgxLCB0MCwgdDEpIHsKICAgIGMwID0geDA7CiAgICBjMSA9IHQwOwogICAgYzIgPSAtMyAqIHgwICsgMyAqIHgxIC0gMiAqIHQwIC0gdDE7CiAgICBjMyA9IDIgKiB4MCAtIDIgKiB4MSArIHQwICsgdDE7CiAgfQogIHJldHVybiB7CiAgICBpbml0Q2F0bXVsbFJvbTogZnVuY3Rpb24oeDAsIHgxLCB4MiwgeDMsIHRlbnNpb24pIHsKICAgICAgaW5pdCh4MSwgeDIsIHRlbnNpb24gKiAoeDIgLSB4MCksIHRlbnNpb24gKiAoeDMgLSB4MSkpOwogICAgfSwKICAgIGluaXROb251bmlmb3JtQ2F0bXVsbFJvbTogZnVuY3Rpb24oeDAsIHgxLCB4MiwgeDMsIGR0MCwgZHQxLCBkdDIpIHsKICAgICAgbGV0IHQxID0gKHgxIC0geDApIC8gZHQwIC0gKHgyIC0geDApIC8gKGR0MCArIGR0MSkgKyAoeDIgLSB4MSkgLyBkdDE7CiAgICAgIGxldCB0MiA9ICh4MiAtIHgxKSAvIGR0MSAtICh4MyAtIHgxKSAvIChkdDEgKyBkdDIpICsgKHgzIC0geDIpIC8gZHQyOwogICAgICB0MSAqPSBkdDE7CiAgICAgIHQyICo9IGR0MTsKICAgICAgaW5pdCh4MSwgeDIsIHQxLCB0Mik7CiAgICB9LAogICAgY2FsYzogZnVuY3Rpb24odCkgewogICAgICBjb25zdCB0MiA9IHQgKiB0OwogICAgICBjb25zdCB0MyA9IHQyICogdDsKICAgICAgcmV0dXJuIGMwICsgYzEgKiB0ICsgYzIgKiB0MiArIGMzICogdDM7CiAgICB9CiAgfTsKfQpmdW5jdGlvbiBDYXRtdWxsUm9tKHQsIHAwLCBwMSwgcDIsIHAzKSB7CiAgY29uc3QgdjAgPSAocDIgLSBwMCkgKiAwLjU7CiAgY29uc3QgdjEgPSAocDMgLSBwMSkgKiAwLjU7CiAgY29uc3QgdDIgPSB0ICogdDsKICBjb25zdCB0MyA9IHQgKiB0MjsKICByZXR1cm4gKDIgKiBwMSAtIDIgKiBwMiArIHYwICsgdjEpICogdDMgKyAoLTMgKiBwMSArIDMgKiBwMiAtIDIgKiB2MCAtIHYxKSAqIHQyICsgdjAgKiB0ICsgcDE7Cn0KZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDAodCwgcCkgewogIGNvbnN0IGsgPSAxIC0gdDsKICByZXR1cm4gayAqIGsgKiBwOwp9CmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAxKHQsIHApIHsKICByZXR1cm4gMiAqICgxIC0gdCkgKiB0ICogcDsKfQpmdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMih0LCBwKSB7CiAgcmV0dXJuIHQgKiB0ICogcDsKfQpmdW5jdGlvbiBRdWFkcmF0aWNCZXppZXIodCwgcDAsIHAxLCBwMikgewogIHJldHVybiBRdWFkcmF0aWNCZXppZXJQMCh0LCBwMCkgKyBRdWFkcmF0aWNCZXppZXJQMSh0LCBwMSkgKyBRdWFkcmF0aWNCZXppZXJQMih0LCBwMik7Cn0KZnVuY3Rpb24gQ3ViaWNCZXppZXJQMCh0LCBwKSB7CiAgY29uc3QgayA9IDEgLSB0OwogIHJldHVybiBrICogayAqIGsgKiBwOwp9CmZ1bmN0aW9uIEN1YmljQmV6aWVyUDEodCwgcCkgewogIGNvbnN0IGsgPSAxIC0gdDsKICByZXR1cm4gMyAqIGsgKiBrICogdCAqIHA7Cn0KZnVuY3Rpb24gQ3ViaWNCZXppZXJQMih0LCBwKSB7CiAgcmV0dXJuIDMgKiAoMSAtIHQpICogdCAqIHQgKiBwOwp9CmZ1bmN0aW9uIEN1YmljQmV6aWVyUDModCwgcCkgewogIHJldHVybiB0ICogdCAqIHQgKiBwOwp9CmZ1bmN0aW9uIEN1YmljQmV6aWVyKHQsIHAwLCBwMSwgcDIsIHAzKSB7CiAgcmV0dXJuIEN1YmljQmV6aWVyUDAodCwgcDApICsgQ3ViaWNCZXppZXJQMSh0LCBwMSkgKyBDdWJpY0JlemllclAyKHQsIHAyKSArIEN1YmljQmV6aWVyUDModCwgcDMpOwp9CmZ1bmN0aW9uIGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBjbG9ja3dpc2UpIHsKICBsZXQgaSwgbGFzdDsKICBpZiAoY2xvY2t3aXNlID09PSBzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkgPiAwKSB7CiAgICBmb3IgKGkgPSBzdGFydDtpIDwgZW5kOyBpICs9IGRpbSkKICAgICAgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpOwogIH0gZWxzZSB7CiAgICBmb3IgKGkgPSBlbmQgLSBkaW07aSA+PSBzdGFydDsgaSAtPSBkaW0pCiAgICAgIGxhc3QgPSBpbnNlcnROb2RlKGksIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTsKICB9CiAgaWYgKGxhc3QgJiYgZXF1YWxzKGxhc3QsIGxhc3QubmV4dCkpIHsKICAgIHJlbW92ZU5vZGUobGFzdCk7CiAgICBsYXN0ID0gbGFzdC5uZXh0OwogIH0KICByZXR1cm4gbGFzdDsKfQpmdW5jdGlvbiBmaWx0ZXJQb2ludHMoc3RhcnQsIGVuZCkgewogIGlmICghc3RhcnQpCiAgICByZXR1cm4gc3RhcnQ7CiAgaWYgKCFlbmQpCiAgICBlbmQgPSBzdGFydDsKICBsZXQgcCA9IHN0YXJ0LCBhZ2FpbjsKICBkbyB7CiAgICBhZ2FpbiA9IGZhbHNlOwogICAgaWYgKCFwLnN0ZWluZXIgJiYgKGVxdWFscyhwLCBwLm5leHQpIHx8IGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID09PSAwKSkgewogICAgICByZW1vdmVOb2RlKHApOwogICAgICBwID0gZW5kID0gcC5wcmV2OwogICAgICBpZiAocCA9PT0gcC5uZXh0KQogICAgICAgIGJyZWFrOwogICAgICBhZ2FpbiA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICBwID0gcC5uZXh0OwogICAgfQogIH0gd2hpbGUgKGFnYWluIHx8IHAgIT09IGVuZCk7CiAgcmV0dXJuIGVuZDsKfQpmdW5jdGlvbiBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcykgewogIGlmICghZWFyKQogICAgcmV0dXJuOwogIGlmICghcGFzcyAmJiBpbnZTaXplKQogICAgaW5kZXhDdXJ2ZShlYXIsIG1pblgsIG1pblksIGludlNpemUpOwogIGxldCBzdG9wID0gZWFyLCBwcmV2LCBuZXh0OwogIHdoaWxlIChlYXIucHJldiAhPT0gZWFyLm5leHQpIHsKICAgIHByZXYgPSBlYXIucHJldjsKICAgIG5leHQgPSBlYXIubmV4dDsKICAgIGlmIChpbnZTaXplID8gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSA6IGlzRWFyKGVhcikpIHsKICAgICAgdHJpYW5nbGVzLnB1c2gocHJldi5pIC8gZGltIHwgMCk7CiAgICAgIHRyaWFuZ2xlcy5wdXNoKGVhci5pIC8gZGltIHwgMCk7CiAgICAgIHRyaWFuZ2xlcy5wdXNoKG5leHQuaSAvIGRpbSB8IDApOwogICAgICByZW1vdmVOb2RlKGVhcik7CiAgICAgIGVhciA9IG5leHQubmV4dDsKICAgICAgc3RvcCA9IG5leHQubmV4dDsKICAgICAgY29udGludWU7CiAgICB9CiAgICBlYXIgPSBuZXh0OwogICAgaWYgKGVhciA9PT0gc3RvcCkgewogICAgICBpZiAoIXBhc3MpIHsKICAgICAgICBlYXJjdXRMaW5rZWQoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAxKTsKICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAxKSB7CiAgICAgICAgZWFyID0gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhmaWx0ZXJQb2ludHMoZWFyKSwgdHJpYW5nbGVzLCBkaW0pOwogICAgICAgIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAyKTsKICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAyKSB7CiAgICAgICAgc3BsaXRFYXJjdXQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGlzRWFyKGVhcikgewogIGNvbnN0IGEgPSBlYXIucHJldiwgYiA9IGVhciwgYyA9IGVhci5uZXh0OwogIGlmIChhcmVhKGEsIGIsIGMpID49IDApCiAgICByZXR1cm4gZmFsc2U7CiAgY29uc3QgYXggPSBhLngsIGJ4ID0gYi54LCBjeCA9IGMueCwgYXkgPSBhLnksIGJ5ID0gYi55LCBjeSA9IGMueTsKICBjb25zdCB4MCA9IGF4IDwgYnggPyBheCA8IGN4ID8gYXggOiBjeCA6IGJ4IDwgY3ggPyBieCA6IGN4LCB5MCA9IGF5IDwgYnkgPyBheSA8IGN5ID8gYXkgOiBjeSA6IGJ5IDwgY3kgPyBieSA6IGN5LCB4MSA9IGF4ID4gYnggPyBheCA+IGN4ID8gYXggOiBjeCA6IGJ4ID4gY3ggPyBieCA6IGN4LCB5MSA9IGF5ID4gYnkgPyBheSA+IGN5ID8gYXkgOiBjeSA6IGJ5ID4gY3kgPyBieSA6IGN5OwogIGxldCBwID0gYy5uZXh0OwogIHdoaWxlIChwICE9PSBhKSB7CiAgICBpZiAocC54ID49IHgwICYmIHAueCA8PSB4MSAmJiBwLnkgPj0geTAgJiYgcC55IDw9IHkxICYmIHBvaW50SW5UcmlhbmdsZShheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBwLngsIHAueSkgJiYgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkKICAgICAgcmV0dXJuIGZhbHNlOwogICAgcCA9IHAubmV4dDsKICB9CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7CiAgY29uc3QgYSA9IGVhci5wcmV2LCBiID0gZWFyLCBjID0gZWFyLm5leHQ7CiAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkKICAgIHJldHVybiBmYWxzZTsKICBjb25zdCBheCA9IGEueCwgYnggPSBiLngsIGN4ID0gYy54LCBheSA9IGEueSwgYnkgPSBiLnksIGN5ID0gYy55OwogIGNvbnN0IHgwID0gYXggPCBieCA/IGF4IDwgY3ggPyBheCA6IGN4IDogYnggPCBjeCA/IGJ4IDogY3gsIHkwID0gYXkgPCBieSA/IGF5IDwgY3kgPyBheSA6IGN5IDogYnkgPCBjeSA/IGJ5IDogY3ksIHgxID0gYXggPiBieCA/IGF4ID4gY3ggPyBheCA6IGN4IDogYnggPiBjeCA/IGJ4IDogY3gsIHkxID0gYXkgPiBieSA/IGF5ID4gY3kgPyBheSA6IGN5IDogYnkgPiBjeSA/IGJ5IDogY3k7CiAgY29uc3QgbWluWiA9IHpPcmRlcih4MCwgeTAsIG1pblgsIG1pblksIGludlNpemUpLCBtYXhaID0gek9yZGVyKHgxLCB5MSwgbWluWCwgbWluWSwgaW52U2l6ZSk7CiAgbGV0IHsgcHJldlo6IHAsIG5leHRaOiBuIH0gPSBlYXI7CiAgd2hpbGUgKHAgJiYgcC56ID49IG1pblogJiYgbiAmJiBuLnogPD0gbWF4WikgewogICAgaWYgKHAueCA+PSB4MCAmJiBwLnggPD0geDEgJiYgcC55ID49IHkwICYmIHAueSA8PSB5MSAmJiBwICE9PSBhICYmIHAgIT09IGMgJiYgcG9pbnRJblRyaWFuZ2xlKGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHAueCwgcC55KSAmJiBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKQogICAgICByZXR1cm4gZmFsc2U7CiAgICBwID0gcC5wcmV2WjsKICAgIGlmIChuLnggPj0geDAgJiYgbi54IDw9IHgxICYmIG4ueSA+PSB5MCAmJiBuLnkgPD0geTEgJiYgbiAhPT0gYSAmJiBuICE9PSBjICYmIHBvaW50SW5UcmlhbmdsZShheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBuLngsIG4ueSkgJiYgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkKICAgICAgcmV0dXJuIGZhbHNlOwogICAgbiA9IG4ubmV4dFo7CiAgfQogIHdoaWxlIChwICYmIHAueiA+PSBtaW5aKSB7CiAgICBpZiAocC54ID49IHgwICYmIHAueCA8PSB4MSAmJiBwLnkgPj0geTAgJiYgcC55IDw9IHkxICYmIHAgIT09IGEgJiYgcCAhPT0gYyAmJiBwb2ludEluVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcC54LCBwLnkpICYmIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApCiAgICAgIHJldHVybiBmYWxzZTsKICAgIHAgPSBwLnByZXZaOwogIH0KICB3aGlsZSAobiAmJiBuLnogPD0gbWF4WikgewogICAgaWYgKG4ueCA+PSB4MCAmJiBuLnggPD0geDEgJiYgbi55ID49IHkwICYmIG4ueSA8PSB5MSAmJiBuICE9PSBhICYmIG4gIT09IGMgJiYgcG9pbnRJblRyaWFuZ2xlKGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIG4ueCwgbi55KSAmJiBhcmVhKG4ucHJldiwgbiwgbi5uZXh0KSA+PSAwKQogICAgICByZXR1cm4gZmFsc2U7CiAgICBuID0gbi5uZXh0WjsKICB9CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhzdGFydCwgdHJpYW5nbGVzLCBkaW0pIHsKICBsZXQgcCA9IHN0YXJ0OwogIGRvIHsKICAgIGNvbnN0IGEgPSBwLnByZXYsIGIgPSBwLm5leHQubmV4dDsKICAgIGlmICghZXF1YWxzKGEsIGIpICYmIGludGVyc2VjdHMoYSwgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkpIHsKICAgICAgdHJpYW5nbGVzLnB1c2goYS5pIC8gZGltIHwgMCk7CiAgICAgIHRyaWFuZ2xlcy5wdXNoKHAuaSAvIGRpbSB8IDApOwogICAgICB0cmlhbmdsZXMucHVzaChiLmkgLyBkaW0gfCAwKTsKICAgICAgcmVtb3ZlTm9kZShwKTsKICAgICAgcmVtb3ZlTm9kZShwLm5leHQpOwogICAgICBwID0gc3RhcnQgPSBiOwogICAgfQogICAgcCA9IHAubmV4dDsKICB9IHdoaWxlIChwICE9PSBzdGFydCk7CiAgcmV0dXJuIGZpbHRlclBvaW50cyhwKTsKfQpmdW5jdGlvbiBzcGxpdEVhcmN1dChzdGFydCwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpIHsKICBsZXQgYSA9IHN0YXJ0OwogIGRvIHsKICAgIGxldCBiID0gYS5uZXh0Lm5leHQ7CiAgICB3aGlsZSAoYiAhPT0gYS5wcmV2KSB7CiAgICAgIGlmIChhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikpIHsKICAgICAgICBsZXQgYyA9IHNwbGl0UG9seWdvbihhLCBiKTsKICAgICAgICBhID0gZmlsdGVyUG9pbnRzKGEsIGEubmV4dCk7CiAgICAgICAgYyA9IGZpbHRlclBvaW50cyhjLCBjLm5leHQpOwogICAgICAgIGVhcmN1dExpbmtlZChhLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMCk7CiAgICAgICAgZWFyY3V0TGlua2VkKGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAwKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgYiA9IGIubmV4dDsKICAgIH0KICAgIGEgPSBhLm5leHQ7CiAgfSB3aGlsZSAoYSAhPT0gc3RhcnQpOwp9CmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSkgewogIGNvbnN0IHF1ZXVlID0gW107CiAgbGV0IGksIGxlbiwgc3RhcnQsIGVuZCwgbGlzdDsKICBmb3IgKGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7aSA8IGxlbjsgaSsrKSB7CiAgICBzdGFydCA9IGhvbGVJbmRpY2VzW2ldICogZGltOwogICAgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDsKICAgIGxpc3QgPSBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgZmFsc2UpOwogICAgaWYgKGxpc3QgPT09IGxpc3QubmV4dCkKICAgICAgbGlzdC5zdGVpbmVyID0gdHJ1ZTsKICAgIHF1ZXVlLnB1c2goZ2V0TGVmdG1vc3QobGlzdCkpOwogIH0KICBxdWV1ZS5zb3J0KGNvbXBhcmVYKTsKICBmb3IgKGkgPSAwO2kgPCBxdWV1ZS5sZW5ndGg7IGkrKykgewogICAgb3V0ZXJOb2RlID0gZWxpbWluYXRlSG9sZShxdWV1ZVtpXSwgb3V0ZXJOb2RlKTsKICB9CiAgcmV0dXJuIG91dGVyTm9kZTsKfQpmdW5jdGlvbiBjb21wYXJlWChhLCBiKSB7CiAgcmV0dXJuIGEueCAtIGIueDsKfQpmdW5jdGlvbiBlbGltaW5hdGVIb2xlKGhvbGUsIG91dGVyTm9kZSkgewogIGNvbnN0IGJyaWRnZSA9IGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSk7CiAgaWYgKCFicmlkZ2UpIHsKICAgIHJldHVybiBvdXRlck5vZGU7CiAgfQogIGNvbnN0IGJyaWRnZVJldmVyc2UgPSBzcGxpdFBvbHlnb24oYnJpZGdlLCBob2xlKTsKICBmaWx0ZXJQb2ludHMoYnJpZGdlUmV2ZXJzZSwgYnJpZGdlUmV2ZXJzZS5uZXh0KTsKICByZXR1cm4gZmlsdGVyUG9pbnRzKGJyaWRnZSwgYnJpZGdlLm5leHQpOwp9CmZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSkgewogIGxldCBwID0gb3V0ZXJOb2RlLCBxeCA9IC1JbmZpbml0eSwgbTsKICBjb25zdCB7IHg6IGh4LCB5OiBoeSB9ID0gaG9sZTsKICBkbyB7CiAgICBpZiAoaHkgPD0gcC55ICYmIGh5ID49IHAubmV4dC55ICYmIHAubmV4dC55ICE9PSBwLnkpIHsKICAgICAgY29uc3QgeCA9IHAueCArIChoeSAtIHAueSkgKiAocC5uZXh0LnggLSBwLngpIC8gKHAubmV4dC55IC0gcC55KTsKICAgICAgaWYgKHggPD0gaHggJiYgeCA+IHF4KSB7CiAgICAgICAgcXggPSB4OwogICAgICAgIG0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7CiAgICAgICAgaWYgKHggPT09IGh4KQogICAgICAgICAgcmV0dXJuIG07CiAgICAgIH0KICAgIH0KICAgIHAgPSBwLm5leHQ7CiAgfSB3aGlsZSAocCAhPT0gb3V0ZXJOb2RlKTsKICBpZiAoIW0pCiAgICByZXR1cm4gbnVsbDsKICBjb25zdCBzdG9wID0gbSwgbXggPSBtLngsIG15ID0gbS55OwogIGxldCB0YW5NaW4gPSBJbmZpbml0eSwgdGFuOwogIHAgPSBtOwogIGRvIHsKICAgIGlmIChoeCA+PSBwLnggJiYgcC54ID49IG14ICYmIGh4ICE9PSBwLnggJiYgcG9pbnRJblRyaWFuZ2xlKGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55KSkgewogICAgICB0YW4gPSBNYXRoLmFicyhoeSAtIHAueSkgLyAoaHggLSBwLngpOwogICAgICBpZiAobG9jYWxseUluc2lkZShwLCBob2xlKSAmJiAodGFuIDwgdGFuTWluIHx8IHRhbiA9PT0gdGFuTWluICYmIChwLnggPiBtLnggfHwgcC54ID09PSBtLnggJiYgc2VjdG9yQ29udGFpbnNTZWN0b3IobSwgcCkpKSkgewogICAgICAgIG0gPSBwOwogICAgICAgIHRhbk1pbiA9IHRhbjsKICAgICAgfQogICAgfQogICAgcCA9IHAubmV4dDsKICB9IHdoaWxlIChwICE9PSBzdG9wKTsKICByZXR1cm4gbTsKfQpmdW5jdGlvbiBzZWN0b3JDb250YWluc1NlY3RvcihtLCBwKSB7CiAgcmV0dXJuIGFyZWEobS5wcmV2LCBtLCBwLnByZXYpIDwgMCAmJiBhcmVhKHAubmV4dCwgbSwgbS5uZXh0KSA8IDA7Cn0KZnVuY3Rpb24gaW5kZXhDdXJ2ZShzdGFydCwgbWluWCwgbWluWSwgaW52U2l6ZSkgewogIGxldCBwID0gc3RhcnQ7CiAgZG8gewogICAgaWYgKHAueiA9PT0gMCkKICAgICAgcC56ID0gek9yZGVyKHAueCwgcC55LCBtaW5YLCBtaW5ZLCBpbnZTaXplKTsKICAgIHAucHJldlogPSBwLnByZXY7CiAgICBwLm5leHRaID0gcC5uZXh0OwogICAgcCA9IHAubmV4dDsKICB9IHdoaWxlIChwICE9PSBzdGFydCk7CiAgcC5wcmV2Wi5uZXh0WiA9IG51bGw7CiAgcC5wcmV2WiA9IG51bGw7CiAgc29ydExpbmtlZChwKTsKfQpmdW5jdGlvbiBzb3J0TGlua2VkKGxpc3QpIHsKICBsZXQgaSwgcCwgcSwgZSwgdGFpbCwgbnVtTWVyZ2VzLCBwU2l6ZSwgcVNpemUsIGluU2l6ZSA9IDE7CiAgZG8gewogICAgcCA9IGxpc3Q7CiAgICBsaXN0ID0gbnVsbDsKICAgIHRhaWwgPSBudWxsOwogICAgbnVtTWVyZ2VzID0gMDsKICAgIHdoaWxlIChwKSB7CiAgICAgIG51bU1lcmdlcysrOwogICAgICBxID0gcDsKICAgICAgcFNpemUgPSAwOwogICAgICBmb3IgKGkgPSAwO2kgPCBpblNpemU7IGkrKykgewogICAgICAgIHBTaXplKys7CiAgICAgICAgcSA9IHEubmV4dFo7CiAgICAgICAgaWYgKCFxKQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcVNpemUgPSBpblNpemU7CiAgICAgIHdoaWxlIChwU2l6ZSA+IDAgfHwgcVNpemUgPiAwICYmIHEpIHsKICAgICAgICBpZiAocFNpemUgIT09IDAgJiYgKHFTaXplID09PSAwIHx8ICFxIHx8IHAueiA8PSBxLnopKSB7CiAgICAgICAgICBlID0gcDsKICAgICAgICAgIHAgPSBwLm5leHRaOwogICAgICAgICAgcFNpemUtLTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZSA9IHE7CiAgICAgICAgICBxID0gcS5uZXh0WjsKICAgICAgICAgIHFTaXplLS07CiAgICAgICAgfQogICAgICAgIGlmICh0YWlsKQogICAgICAgICAgdGFpbC5uZXh0WiA9IGU7CiAgICAgICAgZWxzZQogICAgICAgICAgbGlzdCA9IGU7CiAgICAgICAgZS5wcmV2WiA9IHRhaWw7CiAgICAgICAgdGFpbCA9IGU7CiAgICAgIH0KICAgICAgcCA9IHE7CiAgICB9CiAgICB0YWlsLm5leHRaID0gbnVsbDsKICAgIGluU2l6ZSAqPSAyOwogIH0gd2hpbGUgKG51bU1lcmdlcyA+IDEpOwogIHJldHVybiBsaXN0Owp9CmZ1bmN0aW9uIHpPcmRlcih4LCB5LCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7CiAgeCA9ICh4IC0gbWluWCkgKiBpbnZTaXplIHwgMDsKICB5ID0gKHkgLSBtaW5ZKSAqIGludlNpemUgfCAwOwogIHggPSAoeCB8IHggPDwgOCkgJiAxNjcxMTkzNTsKICB4ID0gKHggfCB4IDw8IDQpICYgMjUyNjQ1MTM1OwogIHggPSAoeCB8IHggPDwgMikgJiA4NTg5OTM0NTk7CiAgeCA9ICh4IHwgeCA8PCAxKSAmIDE0MzE2NTU3NjU7CiAgeSA9ICh5IHwgeSA8PCA4KSAmIDE2NzExOTM1OwogIHkgPSAoeSB8IHkgPDwgNCkgJiAyNTI2NDUxMzU7CiAgeSA9ICh5IHwgeSA8PCAyKSAmIDg1ODk5MzQ1OTsKICB5ID0gKHkgfCB5IDw8IDEpICYgMTQzMTY1NTc2NTsKICByZXR1cm4geCB8IHkgPDwgMTsKfQpmdW5jdGlvbiBnZXRMZWZ0bW9zdChzdGFydCkgewogIGxldCBwID0gc3RhcnQsIGxlZnRtb3N0ID0gc3RhcnQ7CiAgZG8gewogICAgaWYgKHAueCA8IGxlZnRtb3N0LnggfHwgcC54ID09PSBsZWZ0bW9zdC54ICYmIHAueSA8IGxlZnRtb3N0LnkpCiAgICAgIGxlZnRtb3N0ID0gcDsKICAgIHAgPSBwLm5leHQ7CiAgfSB3aGlsZSAocCAhPT0gc3RhcnQpOwogIHJldHVybiBsZWZ0bW9zdDsKfQpmdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgyLCBweTIpIHsKICByZXR1cm4gKGN4IC0gcHgyKSAqIChheSAtIHB5MikgPj0gKGF4IC0gcHgyKSAqIChjeSAtIHB5MikgJiYgKGF4IC0gcHgyKSAqIChieSAtIHB5MikgPj0gKGJ4IC0gcHgyKSAqIChheSAtIHB5MikgJiYgKGJ4IC0gcHgyKSAqIChjeSAtIHB5MikgPj0gKGN4IC0gcHgyKSAqIChieSAtIHB5Mik7Cn0KZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKGEsIGIpIHsKICByZXR1cm4gYS5uZXh0LmkgIT09IGIuaSAmJiBhLnByZXYuaSAhPT0gYi5pICYmICFpbnRlcnNlY3RzUG9seWdvbihhLCBiKSAmJiAobG9jYWxseUluc2lkZShhLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEpICYmIG1pZGRsZUluc2lkZShhLCBiKSAmJiAoYXJlYShhLnByZXYsIGEsIGIucHJldikgfHwgYXJlYShhLCBiLnByZXYsIGIpKSB8fCBlcXVhbHMoYSwgYikgJiYgYXJlYShhLnByZXYsIGEsIGEubmV4dCkgPiAwICYmIGFyZWEoYi5wcmV2LCBiLCBiLm5leHQpID4gMCk7Cn0KZnVuY3Rpb24gYXJlYShwLCBxLCByKSB7CiAgcmV0dXJuIChxLnkgLSBwLnkpICogKHIueCAtIHEueCkgLSAocS54IC0gcC54KSAqIChyLnkgLSBxLnkpOwp9CmZ1bmN0aW9uIGVxdWFscyhwMSwgcDIpIHsKICByZXR1cm4gcDEueCA9PT0gcDIueCAmJiBwMS55ID09PSBwMi55Owp9CmZ1bmN0aW9uIGludGVyc2VjdHMocDEsIHExLCBwMiwgcTIpIHsKICBjb25zdCBvMSA9IHNpZ24oYXJlYShwMSwgcTEsIHAyKSk7CiAgY29uc3QgbzIgPSBzaWduKGFyZWEocDEsIHExLCBxMikpOwogIGNvbnN0IG8zID0gc2lnbihhcmVhKHAyLCBxMiwgcDEpKTsKICBjb25zdCBvNCA9IHNpZ24oYXJlYShwMiwgcTIsIHExKSk7CiAgaWYgKG8xICE9PSBvMiAmJiBvMyAhPT0gbzQpCiAgICByZXR1cm4gdHJ1ZTsKICBpZiAobzEgPT09IDAgJiYgb25TZWdtZW50KHAxLCBwMiwgcTEpKQogICAgcmV0dXJuIHRydWU7CiAgaWYgKG8yID09PSAwICYmIG9uU2VnbWVudChwMSwgcTIsIHExKSkKICAgIHJldHVybiB0cnVlOwogIGlmIChvMyA9PT0gMCAmJiBvblNlZ21lbnQocDIsIHAxLCBxMikpCiAgICByZXR1cm4gdHJ1ZTsKICBpZiAobzQgPT09IDAgJiYgb25TZWdtZW50KHAyLCBxMSwgcTIpKQogICAgcmV0dXJuIHRydWU7CiAgcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIG9uU2VnbWVudChwLCBxLCByKSB7CiAgcmV0dXJuIHEueCA8PSBNYXRoLm1heChwLngsIHIueCkgJiYgcS54ID49IE1hdGgubWluKHAueCwgci54KSAmJiBxLnkgPD0gTWF0aC5tYXgocC55LCByLnkpICYmIHEueSA+PSBNYXRoLm1pbihwLnksIHIueSk7Cn0KZnVuY3Rpb24gc2lnbihudW0pIHsKICByZXR1cm4gbnVtID4gMCA/IDEgOiBudW0gPCAwID8gLTEgOiAwOwp9CmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKGEsIGIpIHsKICBsZXQgcCA9IGE7CiAgZG8gewogICAgaWYgKHAuaSAhPT0gYS5pICYmIHAubmV4dC5pICE9PSBhLmkgJiYgcC5pICE9PSBiLmkgJiYgcC5uZXh0LmkgIT09IGIuaSAmJiBpbnRlcnNlY3RzKHAsIHAubmV4dCwgYSwgYikpCiAgICAgIHJldHVybiB0cnVlOwogICAgcCA9IHAubmV4dDsKICB9IHdoaWxlIChwICE9PSBhKTsKICByZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gbG9jYWxseUluc2lkZShhLCBiKSB7CiAgcmV0dXJuIGFyZWEoYS5wcmV2LCBhLCBhLm5leHQpIDwgMCA/IGFyZWEoYSwgYiwgYS5uZXh0KSA+PSAwICYmIGFyZWEoYSwgYS5wcmV2LCBiKSA+PSAwIDogYXJlYShhLCBiLCBhLnByZXYpIDwgMCB8fCBhcmVhKGEsIGEubmV4dCwgYikgPCAwOwp9CmZ1bmN0aW9uIG1pZGRsZUluc2lkZShhLCBiKSB7CiAgbGV0IHAgPSBhLCBpbnNpZGUgPSBmYWxzZTsKICBjb25zdCBweDIgPSAoYS54ICsgYi54KSAvIDIsIHB5MiA9IChhLnkgKyBiLnkpIC8gMjsKICBkbyB7CiAgICBpZiAocC55ID4gcHkyICE9PSBwLm5leHQueSA+IHB5MiAmJiBwLm5leHQueSAhPT0gcC55ICYmIHB4MiA8IChwLm5leHQueCAtIHAueCkgKiAocHkyIC0gcC55KSAvIChwLm5leHQueSAtIHAueSkgKyBwLngpCiAgICAgIGluc2lkZSA9ICFpbnNpZGU7CiAgICBwID0gcC5uZXh0OwogIH0gd2hpbGUgKHAgIT09IGEpOwogIHJldHVybiBpbnNpZGU7Cn0KZnVuY3Rpb24gc3BsaXRQb2x5Z29uKGEsIGIpIHsKICBjb25zdCBhMiA9IG5ldyBOb2RlMihhLmksIGEueCwgYS55KSwgYjIgPSBuZXcgTm9kZTIoYi5pLCBiLngsIGIueSksIGFuID0gYS5uZXh0LCBicCA9IGIucHJldjsKICBhLm5leHQgPSBiOwogIGIucHJldiA9IGE7CiAgYTIubmV4dCA9IGFuOwogIGFuLnByZXYgPSBhMjsKICBiMi5uZXh0ID0gYTI7CiAgYTIucHJldiA9IGIyOwogIGJwLm5leHQgPSBiMjsKICBiMi5wcmV2ID0gYnA7CiAgcmV0dXJuIGIyOwp9CmZ1bmN0aW9uIGluc2VydE5vZGUoaSwgeCwgeSwgbGFzdCkgewogIGNvbnN0IHAgPSBuZXcgTm9kZTIoaSwgeCwgeSk7CiAgaWYgKCFsYXN0KSB7CiAgICBwLnByZXYgPSBwOwogICAgcC5uZXh0ID0gcDsKICB9IGVsc2UgewogICAgcC5uZXh0ID0gbGFzdC5uZXh0OwogICAgcC5wcmV2ID0gbGFzdDsKICAgIGxhc3QubmV4dC5wcmV2ID0gcDsKICAgIGxhc3QubmV4dCA9IHA7CiAgfQogIHJldHVybiBwOwp9CmZ1bmN0aW9uIHJlbW92ZU5vZGUocCkgewogIHAubmV4dC5wcmV2ID0gcC5wcmV2OwogIHAucHJldi5uZXh0ID0gcC5uZXh0OwogIGlmIChwLnByZXZaKQogICAgcC5wcmV2Wi5uZXh0WiA9IHAubmV4dFo7CiAgaWYgKHAubmV4dFopCiAgICBwLm5leHRaLnByZXZaID0gcC5wcmV2WjsKfQpmdW5jdGlvbiBOb2RlMihpLCB4LCB5KSB7CiAgdGhpcy5pID0gaTsKICB0aGlzLnggPSB4OwogIHRoaXMueSA9IHk7CiAgdGhpcy5wcmV2ID0gbnVsbDsKICB0aGlzLm5leHQgPSBudWxsOwogIHRoaXMueiA9IDA7CiAgdGhpcy5wcmV2WiA9IG51bGw7CiAgdGhpcy5uZXh0WiA9IG51bGw7CiAgdGhpcy5zdGVpbmVyID0gZmFsc2U7Cn0KZnVuY3Rpb24gc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pIHsKICBsZXQgc3VtID0gMDsKICBmb3IgKGxldCBpID0gc3RhcnQsIGogPSBlbmQgLSBkaW07aSA8IGVuZDsgaSArPSBkaW0pIHsKICAgIHN1bSArPSAoZGF0YVtqXSAtIGRhdGFbaV0pICogKGRhdGFbaSArIDFdICsgZGF0YVtqICsgMV0pOwogICAgaiA9IGk7CiAgfQogIHJldHVybiBzdW07Cn0KCmNsYXNzIFNoYXBlVXRpbHMgewogIHN0YXRpYyBhcmVhKGNvbnRvdXIpIHsKICAgIGNvbnN0IG4gPSBjb250b3VyLmxlbmd0aDsKICAgIGxldCBhID0gMDsKICAgIGZvciAobGV0IHAgPSBuIC0gMSwgcSA9IDA7cSA8IG47IHAgPSBxKyspIHsKICAgICAgYSArPSBjb250b3VyW3BdLnggKiBjb250b3VyW3FdLnkgLSBjb250b3VyW3FdLnggKiBjb250b3VyW3BdLnk7CiAgICB9CiAgICByZXR1cm4gYSAqIDAuNTsKICB9CiAgc3RhdGljIGlzQ2xvY2tXaXNlKHB0cykgewogICAgcmV0dXJuIFNoYXBlVXRpbHMuYXJlYShwdHMpIDwgMDsKICB9CiAgc3RhdGljIHRyaWFuZ3VsYXRlU2hhcGUoY29udG91ciwgaG9sZXMpIHsKICAgIGNvbnN0IHZlcnRpY2VzID0gW107CiAgICBjb25zdCBob2xlSW5kaWNlcyA9IFtdOwogICAgY29uc3QgZmFjZXMgPSBbXTsKICAgIHJlbW92ZUR1cEVuZFB0cyhjb250b3VyKTsKICAgIGFkZENvbnRvdXIodmVydGljZXMsIGNvbnRvdXIpOwogICAgbGV0IGhvbGVJbmRleCA9IGNvbnRvdXIubGVuZ3RoOwogICAgaG9sZXMuZm9yRWFjaChyZW1vdmVEdXBFbmRQdHMpOwogICAgZm9yIChsZXQgaSA9IDA7aSA8IGhvbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGhvbGVJbmRpY2VzLnB1c2goaG9sZUluZGV4KTsKICAgICAgaG9sZUluZGV4ICs9IGhvbGVzW2ldLmxlbmd0aDsKICAgICAgYWRkQ29udG91cih2ZXJ0aWNlcywgaG9sZXNbaV0pOwogICAgfQogICAgY29uc3QgdHJpYW5nbGVzID0gRWFyY3V0LnRyaWFuZ3VsYXRlKHZlcnRpY2VzLCBob2xlSW5kaWNlcyk7CiAgICBmb3IgKGxldCBpID0gMDtpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzKSB7CiAgICAgIGZhY2VzLnB1c2godHJpYW5nbGVzLnNsaWNlKGksIGkgKyAzKSk7CiAgICB9CiAgICByZXR1cm4gZmFjZXM7CiAgfQp9CmZ1bmN0aW9uIHJlbW92ZUR1cEVuZFB0cyhwb2ludHMpIHsKICBjb25zdCBsID0gcG9pbnRzLmxlbmd0aDsKICBpZiAobCA+IDIgJiYgcG9pbnRzW2wgLSAxXS5lcXVhbHMocG9pbnRzWzBdKSkgewogICAgcG9pbnRzLnBvcCgpOwogIH0KfQpmdW5jdGlvbiBhZGRDb250b3VyKHZlcnRpY2VzLCBjb250b3VyKSB7CiAgZm9yIChsZXQgaSA9IDA7aSA8IGNvbnRvdXIubGVuZ3RoOyBpKyspIHsKICAgIHZlcnRpY2VzLnB1c2goY29udG91cltpXS54KTsKICAgIHZlcnRpY2VzLnB1c2goY29udG91cltpXS55KTsKICB9Cn0KZnVuY3Rpb24gdG9KU09OJDEoc2hhcGVzLCBvcHRpb25zLCBkYXRhKSB7CiAgZGF0YS5zaGFwZXMgPSBbXTsKICBpZiAoQXJyYXkuaXNBcnJheShzaGFwZXMpKSB7CiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICBjb25zdCBzaGFwZSA9IHNoYXBlc1tpXTsKICAgICAgZGF0YS5zaGFwZXMucHVzaChzaGFwZS51dWlkKTsKICAgIH0KICB9IGVsc2UgewogICAgZGF0YS5zaGFwZXMucHVzaChzaGFwZXMudXVpZCk7CiAgfQogIGRhdGEub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpOwogIGlmIChvcHRpb25zLmV4dHJ1ZGVQYXRoICE9PSB1bmRlZmluZWQpCiAgICBkYXRhLm9wdGlvbnMuZXh0cnVkZVBhdGggPSBvcHRpb25zLmV4dHJ1ZGVQYXRoLnRvSlNPTigpOwogIHJldHVybiBkYXRhOwp9CmZ1bmN0aW9uIHRvSlNPTihzaGFwZXMsIGRhdGEpIHsKICBkYXRhLnNoYXBlcyA9IFtdOwogIGlmIChBcnJheS5pc0FycmF5KHNoYXBlcykpIHsKICAgIGZvciAobGV0IGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgIGNvbnN0IHNoYXBlID0gc2hhcGVzW2ldOwogICAgICBkYXRhLnNoYXBlcy5wdXNoKHNoYXBlLnV1aWQpOwogICAgfQogIH0gZWxzZSB7CiAgICBkYXRhLnNoYXBlcy5wdXNoKHNoYXBlcy51dWlkKTsKICB9CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gaXNVbmlxdWVFZGdlKHN0YXJ0LCBlbmQsIGVkZ2VzKSB7CiAgY29uc3QgaGFzaDEgPSBgJHtzdGFydC54fSwke3N0YXJ0Lnl9LCR7c3RhcnQuen0tJHtlbmQueH0sJHtlbmQueX0sJHtlbmQuen1gOwogIGNvbnN0IGhhc2gyID0gYCR7ZW5kLnh9LCR7ZW5kLnl9LCR7ZW5kLnp9LSR7c3RhcnQueH0sJHtzdGFydC55fSwke3N0YXJ0Lnp9YDsKICBpZiAoZWRnZXMuaGFzKGhhc2gxKSA9PT0gdHJ1ZSB8fCBlZGdlcy5oYXMoaGFzaDIpID09PSB0cnVlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfSBlbHNlIHsKICAgIGVkZ2VzLmFkZChoYXNoMSk7CiAgICBlZGdlcy5hZGQoaGFzaDIpOwogICAgcmV0dXJuIHRydWU7CiAgfQp9CmZ1bmN0aW9uIGNvbnZlcnRBcnJheShhcnJheSwgdHlwZSwgZm9yY2VDbG9uZSkgewogIGlmICghYXJyYXkgfHwgIWZvcmNlQ2xvbmUgJiYgYXJyYXkuY29uc3RydWN0b3IgPT09IHR5cGUpCiAgICByZXR1cm4gYXJyYXk7CiAgaWYgKHR5cGVvZiB0eXBlLkJZVEVTX1BFUl9FTEVNRU5UID09PSAibnVtYmVyIikgewogICAgcmV0dXJuIG5ldyB0eXBlKGFycmF5KTsKICB9CiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFycmF5KTsKfQpmdW5jdGlvbiBpc1R5cGVkQXJyYXkob2JqZWN0KSB7CiAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhvYmplY3QpICYmICEob2JqZWN0IGluc3RhbmNlb2YgRGF0YVZpZXcpOwp9CmZ1bmN0aW9uIGdldEtleWZyYW1lT3JkZXIodGltZXMpIHsKICBmdW5jdGlvbiBjb21wYXJlVGltZShpLCBqKSB7CiAgICByZXR1cm4gdGltZXNbaV0gLSB0aW1lc1tqXTsKICB9CiAgY29uc3QgbiA9IHRpbWVzLmxlbmd0aDsKICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobik7CiAgZm9yIChsZXQgaSA9IDA7aSAhPT0gbjsgKytpKQogICAgcmVzdWx0W2ldID0gaTsKICByZXN1bHQuc29ydChjb21wYXJlVGltZSk7CiAgcmV0dXJuIHJlc3VsdDsKfQpmdW5jdGlvbiBzb3J0ZWRBcnJheSh2YWx1ZXMsIHN0cmlkZSwgb3JkZXIpIHsKICBjb25zdCBuVmFsdWVzID0gdmFsdWVzLmxlbmd0aDsKICBjb25zdCByZXN1bHQgPSBuZXcgdmFsdWVzLmNvbnN0cnVjdG9yKG5WYWx1ZXMpOwogIGZvciAobGV0IGkgPSAwLCBkc3RPZmZzZXQgPSAwO2RzdE9mZnNldCAhPT0gblZhbHVlczsgKytpKSB7CiAgICBjb25zdCBzcmNPZmZzZXQgPSBvcmRlcltpXSAqIHN0cmlkZTsKICAgIGZvciAobGV0IGogPSAwO2ogIT09IHN0cmlkZTsgKytqKSB7CiAgICAgIHJlc3VsdFtkc3RPZmZzZXQrK10gPSB2YWx1ZXNbc3JjT2Zmc2V0ICsgal07CiAgICB9CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gZmxhdHRlbkpTT04oanNvbktleXMsIHRpbWVzLCB2YWx1ZXMsIHZhbHVlUHJvcGVydHlOYW1lKSB7CiAgbGV0IGkgPSAxLCBrZXkgPSBqc29uS2V5c1swXTsKICB3aGlsZSAoa2V5ICE9PSB1bmRlZmluZWQgJiYga2V5W3ZhbHVlUHJvcGVydHlOYW1lXSA9PT0gdW5kZWZpbmVkKSB7CiAgICBrZXkgPSBqc29uS2V5c1tpKytdOwogIH0KICBpZiAoa2V5ID09PSB1bmRlZmluZWQpCiAgICByZXR1cm47CiAgbGV0IHZhbHVlID0ga2V5W3ZhbHVlUHJvcGVydHlOYW1lXTsKICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkKICAgIHJldHVybjsKICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgIGRvIHsKICAgICAgdmFsdWUgPSBrZXlbdmFsdWVQcm9wZXJ0eU5hbWVdOwogICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRpbWVzLnB1c2goa2V5LnRpbWUpOwogICAgICAgIHZhbHVlcy5wdXNoLmFwcGx5KHZhbHVlcywgdmFsdWUpOwogICAgICB9CiAgICAgIGtleSA9IGpzb25LZXlzW2krK107CiAgICB9IHdoaWxlIChrZXkgIT09IHVuZGVmaW5lZCk7CiAgfSBlbHNlIGlmICh2YWx1ZS50b0FycmF5ICE9PSB1bmRlZmluZWQpIHsKICAgIGRvIHsKICAgICAgdmFsdWUgPSBrZXlbdmFsdWVQcm9wZXJ0eU5hbWVdOwogICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRpbWVzLnB1c2goa2V5LnRpbWUpOwogICAgICAgIHZhbHVlLnRvQXJyYXkodmFsdWVzLCB2YWx1ZXMubGVuZ3RoKTsKICAgICAgfQogICAgICBrZXkgPSBqc29uS2V5c1tpKytdOwogICAgfSB3aGlsZSAoa2V5ICE9PSB1bmRlZmluZWQpOwogIH0gZWxzZSB7CiAgICBkbyB7CiAgICAgIHZhbHVlID0ga2V5W3ZhbHVlUHJvcGVydHlOYW1lXTsKICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB0aW1lcy5wdXNoKGtleS50aW1lKTsKICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7CiAgICAgIH0KICAgICAga2V5ID0ganNvbktleXNbaSsrXTsKICAgIH0gd2hpbGUgKGtleSAhPT0gdW5kZWZpbmVkKTsKICB9Cn0KZnVuY3Rpb24gc3ViY2xpcChzb3VyY2VDbGlwLCBuYW1lLCBzdGFydEZyYW1lLCBlbmRGcmFtZSwgZnBzID0gMzApIHsKICBjb25zdCBjbGlwID0gc291cmNlQ2xpcC5jbG9uZSgpOwogIGNsaXAubmFtZSA9IG5hbWU7CiAgY29uc3QgdHJhY2tzID0gW107CiAgZm9yIChsZXQgaSA9IDA7aSA8IGNsaXAudHJhY2tzLmxlbmd0aDsgKytpKSB7CiAgICBjb25zdCB0cmFjayA9IGNsaXAudHJhY2tzW2ldOwogICAgY29uc3QgdmFsdWVTaXplID0gdHJhY2suZ2V0VmFsdWVTaXplKCk7CiAgICBjb25zdCB0aW1lcyA9IFtdOwogICAgY29uc3QgdmFsdWVzID0gW107CiAgICBmb3IgKGxldCBqID0gMDtqIDwgdHJhY2sudGltZXMubGVuZ3RoOyArK2opIHsKICAgICAgY29uc3QgZnJhbWUgPSB0cmFjay50aW1lc1tqXSAqIGZwczsKICAgICAgaWYgKGZyYW1lIDwgc3RhcnRGcmFtZSB8fCBmcmFtZSA+PSBlbmRGcmFtZSkKICAgICAgICBjb250aW51ZTsKICAgICAgdGltZXMucHVzaCh0cmFjay50aW1lc1tqXSk7CiAgICAgIGZvciAobGV0IGsgPSAwO2sgPCB2YWx1ZVNpemU7ICsraykgewogICAgICAgIHZhbHVlcy5wdXNoKHRyYWNrLnZhbHVlc1tqICogdmFsdWVTaXplICsga10pOwogICAgICB9CiAgICB9CiAgICBpZiAodGltZXMubGVuZ3RoID09PSAwKQogICAgICBjb250aW51ZTsKICAgIHRyYWNrLnRpbWVzID0gY29udmVydEFycmF5KHRpbWVzLCB0cmFjay50aW1lcy5jb25zdHJ1Y3Rvcik7CiAgICB0cmFjay52YWx1ZXMgPSBjb252ZXJ0QXJyYXkodmFsdWVzLCB0cmFjay52YWx1ZXMuY29uc3RydWN0b3IpOwogICAgdHJhY2tzLnB1c2godHJhY2spOwogIH0KICBjbGlwLnRyYWNrcyA9IHRyYWNrczsKICBsZXQgbWluU3RhcnRUaW1lID0gSW5maW5pdHk7CiAgZm9yIChsZXQgaSA9IDA7aSA8IGNsaXAudHJhY2tzLmxlbmd0aDsgKytpKSB7CiAgICBpZiAobWluU3RhcnRUaW1lID4gY2xpcC50cmFja3NbaV0udGltZXNbMF0pIHsKICAgICAgbWluU3RhcnRUaW1lID0gY2xpcC50cmFja3NbaV0udGltZXNbMF07CiAgICB9CiAgfQogIGZvciAobGV0IGkgPSAwO2kgPCBjbGlwLnRyYWNrcy5sZW5ndGg7ICsraSkgewogICAgY2xpcC50cmFja3NbaV0uc2hpZnQoLTEgKiBtaW5TdGFydFRpbWUpOwogIH0KICBjbGlwLnJlc2V0RHVyYXRpb24oKTsKICByZXR1cm4gY2xpcDsKfQpmdW5jdGlvbiBtYWtlQ2xpcEFkZGl0aXZlKHRhcmdldENsaXAsIHJlZmVyZW5jZUZyYW1lID0gMCwgcmVmZXJlbmNlQ2xpcCA9IHRhcmdldENsaXAsIGZwcyA9IDMwKSB7CiAgaWYgKGZwcyA8PSAwKQogICAgZnBzID0gMzA7CiAgY29uc3QgbnVtVHJhY2tzID0gcmVmZXJlbmNlQ2xpcC50cmFja3MubGVuZ3RoOwogIGNvbnN0IHJlZmVyZW5jZVRpbWUgPSByZWZlcmVuY2VGcmFtZSAvIGZwczsKICBmb3IgKGxldCBpID0gMDtpIDwgbnVtVHJhY2tzOyArK2kpIHsKICAgIGNvbnN0IHJlZmVyZW5jZVRyYWNrID0gcmVmZXJlbmNlQ2xpcC50cmFja3NbaV07CiAgICBjb25zdCByZWZlcmVuY2VUcmFja1R5cGUgPSByZWZlcmVuY2VUcmFjay5WYWx1ZVR5cGVOYW1lOwogICAgaWYgKHJlZmVyZW5jZVRyYWNrVHlwZSA9PT0gImJvb2wiIHx8IHJlZmVyZW5jZVRyYWNrVHlwZSA9PT0gInN0cmluZyIpCiAgICAgIGNvbnRpbnVlOwogICAgY29uc3QgdGFyZ2V0VHJhY2sgPSB0YXJnZXRDbGlwLnRyYWNrcy5maW5kKGZ1bmN0aW9uKHRyYWNrKSB7CiAgICAgIHJldHVybiB0cmFjay5uYW1lID09PSByZWZlcmVuY2VUcmFjay5uYW1lICYmIHRyYWNrLlZhbHVlVHlwZU5hbWUgPT09IHJlZmVyZW5jZVRyYWNrVHlwZTsKICAgIH0pOwogICAgaWYgKHRhcmdldFRyYWNrID09PSB1bmRlZmluZWQpCiAgICAgIGNvbnRpbnVlOwogICAgbGV0IHJlZmVyZW5jZU9mZnNldCA9IDA7CiAgICBjb25zdCByZWZlcmVuY2VWYWx1ZVNpemUgPSByZWZlcmVuY2VUcmFjay5nZXRWYWx1ZVNpemUoKTsKICAgIGlmIChyZWZlcmVuY2VUcmFjay5jcmVhdGVJbnRlcnBvbGFudC5pc0ludGVycG9sYW50RmFjdG9yeU1ldGhvZEdMVEZDdWJpY1NwbGluZSkgewogICAgICByZWZlcmVuY2VPZmZzZXQgPSByZWZlcmVuY2VWYWx1ZVNpemUgLyAzOwogICAgfQogICAgbGV0IHRhcmdldE9mZnNldCA9IDA7CiAgICBjb25zdCB0YXJnZXRWYWx1ZVNpemUgPSB0YXJnZXRUcmFjay5nZXRWYWx1ZVNpemUoKTsKICAgIGlmICh0YXJnZXRUcmFjay5jcmVhdGVJbnRlcnBvbGFudC5pc0ludGVycG9sYW50RmFjdG9yeU1ldGhvZEdMVEZDdWJpY1NwbGluZSkgewogICAgICB0YXJnZXRPZmZzZXQgPSB0YXJnZXRWYWx1ZVNpemUgLyAzOwogICAgfQogICAgY29uc3QgbGFzdEluZGV4ID0gcmVmZXJlbmNlVHJhY2sudGltZXMubGVuZ3RoIC0gMTsKICAgIGxldCByZWZlcmVuY2VWYWx1ZTsKICAgIGlmIChyZWZlcmVuY2VUaW1lIDw9IHJlZmVyZW5jZVRyYWNrLnRpbWVzWzBdKSB7CiAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSByZWZlcmVuY2VPZmZzZXQ7CiAgICAgIGNvbnN0IGVuZEluZGV4ID0gcmVmZXJlbmNlVmFsdWVTaXplIC0gcmVmZXJlbmNlT2Zmc2V0OwogICAgICByZWZlcmVuY2VWYWx1ZSA9IHJlZmVyZW5jZVRyYWNrLnZhbHVlcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7CiAgICB9IGVsc2UgaWYgKHJlZmVyZW5jZVRpbWUgPj0gcmVmZXJlbmNlVHJhY2sudGltZXNbbGFzdEluZGV4XSkgewogICAgICBjb25zdCBzdGFydEluZGV4ID0gbGFzdEluZGV4ICogcmVmZXJlbmNlVmFsdWVTaXplICsgcmVmZXJlbmNlT2Zmc2V0OwogICAgICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyByZWZlcmVuY2VWYWx1ZVNpemUgLSByZWZlcmVuY2VPZmZzZXQ7CiAgICAgIHJlZmVyZW5jZVZhbHVlID0gcmVmZXJlbmNlVHJhY2sudmFsdWVzLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGludGVycG9sYW50ID0gcmVmZXJlbmNlVHJhY2suY3JlYXRlSW50ZXJwb2xhbnQoKTsKICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHJlZmVyZW5jZU9mZnNldDsKICAgICAgY29uc3QgZW5kSW5kZXggPSByZWZlcmVuY2VWYWx1ZVNpemUgLSByZWZlcmVuY2VPZmZzZXQ7CiAgICAgIGludGVycG9sYW50LmV2YWx1YXRlKHJlZmVyZW5jZVRpbWUpOwogICAgICByZWZlcmVuY2VWYWx1ZSA9IGludGVycG9sYW50LnJlc3VsdEJ1ZmZlci5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7CiAgICB9CiAgICBpZiAocmVmZXJlbmNlVHJhY2tUeXBlID09PSAicXVhdGVybmlvbiIpIHsKICAgICAgY29uc3QgcmVmZXJlbmNlUXVhdCA9IG5ldyBRdWF0ZXJuaW9uKCkuZnJvbUFycmF5KHJlZmVyZW5jZVZhbHVlKS5ub3JtYWxpemUoKS5jb25qdWdhdGUoKTsKICAgICAgcmVmZXJlbmNlUXVhdC50b0FycmF5KHJlZmVyZW5jZVZhbHVlKTsKICAgIH0KICAgIGNvbnN0IG51bVRpbWVzID0gdGFyZ2V0VHJhY2sudGltZXMubGVuZ3RoOwogICAgZm9yIChsZXQgaiA9IDA7aiA8IG51bVRpbWVzOyArK2opIHsKICAgICAgY29uc3QgdmFsdWVTdGFydCA9IGogKiB0YXJnZXRWYWx1ZVNpemUgKyB0YXJnZXRPZmZzZXQ7CiAgICAgIGlmIChyZWZlcmVuY2VUcmFja1R5cGUgPT09ICJxdWF0ZXJuaW9uIikgewogICAgICAgIFF1YXRlcm5pb24ubXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQodGFyZ2V0VHJhY2sudmFsdWVzLCB2YWx1ZVN0YXJ0LCByZWZlcmVuY2VWYWx1ZSwgMCwgdGFyZ2V0VHJhY2sudmFsdWVzLCB2YWx1ZVN0YXJ0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCB2YWx1ZUVuZCA9IHRhcmdldFZhbHVlU2l6ZSAtIHRhcmdldE9mZnNldCAqIDI7CiAgICAgICAgZm9yIChsZXQgayA9IDA7ayA8IHZhbHVlRW5kOyArK2spIHsKICAgICAgICAgIHRhcmdldFRyYWNrLnZhbHVlc1t2YWx1ZVN0YXJ0ICsga10gLT0gcmVmZXJlbmNlVmFsdWVba107CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHRhcmdldENsaXAuYmxlbmRNb2RlID0gQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGU7CiAgcmV0dXJuIHRhcmdldENsaXA7Cn0KCmNsYXNzIEludGVycG9sYW50IHsKICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyKSB7CiAgICB0aGlzLnBhcmFtZXRlclBvc2l0aW9ucyA9IHBhcmFtZXRlclBvc2l0aW9uczsKICAgIHRoaXMuX2NhY2hlZEluZGV4ID0gMDsKICAgIHRoaXMucmVzdWx0QnVmZmVyID0gcmVzdWx0QnVmZmVyICE9PSB1bmRlZmluZWQgPyByZXN1bHRCdWZmZXIgOiBuZXcgc2FtcGxlVmFsdWVzLmNvbnN0cnVjdG9yKHNhbXBsZVNpemUpOwogICAgdGhpcy5zYW1wbGVWYWx1ZXMgPSBzYW1wbGVWYWx1ZXM7CiAgICB0aGlzLnZhbHVlU2l6ZSA9IHNhbXBsZVNpemU7CiAgICB0aGlzLnNldHRpbmdzID0gbnVsbDsKICAgIHRoaXMuRGVmYXVsdFNldHRpbmdzXyA9IHt9OwogIH0KICBldmFsdWF0ZSh0KSB7CiAgICBjb25zdCBwcCA9IHRoaXMucGFyYW1ldGVyUG9zaXRpb25zOwogICAgbGV0IGkxID0gdGhpcy5fY2FjaGVkSW5kZXgsIHQxID0gcHBbaTFdLCB0MCA9IHBwW2kxIC0gMV07CiAgICB2YWxpZGF0ZV9pbnRlcnZhbDogewogICAgICBzZWVrOiB7CiAgICAgICAgbGV0IHJpZ2h0OwogICAgICAgIGxpbmVhcl9zY2FuOiB7CiAgICAgICAgICBmb3J3YXJkX3NjYW46CiAgICAgICAgICAgIGlmICghKHQgPCB0MSkpIHsKICAgICAgICAgICAgICBmb3IgKGxldCBnaXZlVXBBdCA9IGkxICsgMjs7ICkgewogICAgICAgICAgICAgICAgaWYgKHQxID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgaWYgKHQgPCB0MCkKICAgICAgICAgICAgICAgICAgICBicmVhayBmb3J3YXJkX3NjYW47CiAgICAgICAgICAgICAgICAgIGkxID0gcHAubGVuZ3RoOwogICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZWRJbmRleCA9IGkxOwogICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKGkxIC0gMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaTEgPT09IGdpdmVVcEF0KQogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIHQwID0gdDE7CiAgICAgICAgICAgICAgICB0MSA9IHBwWysraTFdOwogICAgICAgICAgICAgICAgaWYgKHQgPCB0MSkgewogICAgICAgICAgICAgICAgICBicmVhayBzZWVrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByaWdodCA9IHBwLmxlbmd0aDsKICAgICAgICAgICAgICBicmVhayBsaW5lYXJfc2NhbjsKICAgICAgICAgICAgfQogICAgICAgICAgaWYgKCEodCA+PSB0MCkpIHsKICAgICAgICAgICAgY29uc3QgdDFnbG9iYWwgPSBwcFsxXTsKICAgICAgICAgICAgaWYgKHQgPCB0MWdsb2JhbCkgewogICAgICAgICAgICAgIGkxID0gMjsKICAgICAgICAgICAgICB0MCA9IHQxZ2xvYmFsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAobGV0IGdpdmVVcEF0ID0gaTEgLSAyOzsgKSB7CiAgICAgICAgICAgICAgaWYgKHQwID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZEluZGV4ID0gMDsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oMCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChpMSA9PT0gZ2l2ZVVwQXQpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB0MSA9IHQwOwogICAgICAgICAgICAgIHQwID0gcHBbLS1pMSAtIDFdOwogICAgICAgICAgICAgIGlmICh0ID49IHQwKSB7CiAgICAgICAgICAgICAgICBicmVhayBzZWVrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByaWdodCA9IGkxOwogICAgICAgICAgICBpMSA9IDA7CiAgICAgICAgICAgIGJyZWFrIGxpbmVhcl9zY2FuOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWsgdmFsaWRhdGVfaW50ZXJ2YWw7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChpMSA8IHJpZ2h0KSB7CiAgICAgICAgICBjb25zdCBtaWQgPSBpMSArIHJpZ2h0ID4+PiAxOwogICAgICAgICAgaWYgKHQgPCBwcFttaWRdKSB7CiAgICAgICAgICAgIHJpZ2h0ID0gbWlkOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaTEgPSBtaWQgKyAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0MSA9IHBwW2kxXTsKICAgICAgICB0MCA9IHBwW2kxIC0gMV07CiAgICAgICAgaWYgKHQwID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHRoaXMuX2NhY2hlZEluZGV4ID0gMDsKICAgICAgICAgIHJldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oMCk7CiAgICAgICAgfQogICAgICAgIGlmICh0MSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBpMSA9IHBwLmxlbmd0aDsKICAgICAgICAgIHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7CiAgICAgICAgICByZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKGkxIC0gMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7CiAgICAgIHRoaXMuaW50ZXJ2YWxDaGFuZ2VkXyhpMSwgdDAsIHQxKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmludGVycG9sYXRlXyhpMSwgdDAsIHQsIHQxKTsKICB9CiAgZ2V0U2V0dGluZ3NfKCkgewogICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MgfHwgdGhpcy5EZWZhdWx0U2V0dGluZ3NfOwogIH0KICBjb3B5U2FtcGxlVmFsdWVfKGluZGV4KSB7CiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlciwgdmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsIHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLCBvZmZzZXQgPSBpbmRleCAqIHN0cmlkZTsKICAgIGZvciAobGV0IGkgPSAwO2kgIT09IHN0cmlkZTsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IHZhbHVlc1tvZmZzZXQgKyBpXTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGludGVycG9sYXRlXygpIHsKICAgIHRocm93IG5ldyBFcnJvcigiY2FsbCB0byBhYnN0cmFjdCBtZXRob2QiKTsKICB9CiAgaW50ZXJ2YWxDaGFuZ2VkXygpIHt9Cn0KCmNsYXNzIEtleWZyYW1lVHJhY2sgewogIGNvbnN0cnVjdG9yKG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24pIHsKICAgIGlmIChuYW1lID09PSB1bmRlZmluZWQpCiAgICAgIHRocm93IG5ldyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgbmFtZSBpcyB1bmRlZmluZWQiKTsKICAgIGlmICh0aW1lcyA9PT0gdW5kZWZpbmVkIHx8IHRpbWVzLmxlbmd0aCA9PT0gMCkKICAgICAgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBubyBrZXlmcmFtZXMgaW4gdHJhY2sgbmFtZWQgIiArIG5hbWUpOwogICAgdGhpcy5uYW1lID0gbmFtZTsKICAgIHRoaXMudGltZXMgPSBjb252ZXJ0QXJyYXkodGltZXMsIHRoaXMuVGltZUJ1ZmZlclR5cGUpOwogICAgdGhpcy52YWx1ZXMgPSBjb252ZXJ0QXJyYXkodmFsdWVzLCB0aGlzLlZhbHVlQnVmZmVyVHlwZSk7CiAgICB0aGlzLnNldEludGVycG9sYXRpb24oaW50ZXJwb2xhdGlvbiB8fCB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKTsKICB9CiAgc3RhdGljIHRvSlNPTih0cmFjaykgewogICAgY29uc3QgdHJhY2tUeXBlID0gdHJhY2suY29uc3RydWN0b3I7CiAgICBsZXQganNvbjsKICAgIGlmICh0cmFja1R5cGUudG9KU09OICE9PSB0aGlzLnRvSlNPTikgewogICAgICBqc29uID0gdHJhY2tUeXBlLnRvSlNPTih0cmFjayk7CiAgICB9IGVsc2UgewogICAgICBqc29uID0gewogICAgICAgIG5hbWU6IHRyYWNrLm5hbWUsCiAgICAgICAgdGltZXM6IGNvbnZlcnRBcnJheSh0cmFjay50aW1lcywgQXJyYXkpLAogICAgICAgIHZhbHVlczogY29udmVydEFycmF5KHRyYWNrLnZhbHVlcywgQXJyYXkpCiAgICAgIH07CiAgICAgIGNvbnN0IGludGVycG9sYXRpb24gPSB0cmFjay5nZXRJbnRlcnBvbGF0aW9uKCk7CiAgICAgIGlmIChpbnRlcnBvbGF0aW9uICE9PSB0cmFjay5EZWZhdWx0SW50ZXJwb2xhdGlvbikgewogICAgICAgIGpzb24uaW50ZXJwb2xhdGlvbiA9IGludGVycG9sYXRpb247CiAgICAgIH0KICAgIH0KICAgIGpzb24udHlwZSA9IHRyYWNrLlZhbHVlVHlwZU5hbWU7CiAgICByZXR1cm4ganNvbjsKICB9CiAgSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGUocmVzdWx0KSB7CiAgICByZXR1cm4gbmV3IERpc2NyZXRlSW50ZXJwb2xhbnQodGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCk7CiAgfQogIEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcihyZXN1bHQpIHsKICAgIHJldHVybiBuZXcgTGluZWFySW50ZXJwb2xhbnQodGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCk7CiAgfQogIEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aChyZXN1bHQpIHsKICAgIHJldHVybiBuZXcgQ3ViaWNJbnRlcnBvbGFudCh0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0KTsKICB9CiAgc2V0SW50ZXJwb2xhdGlvbihpbnRlcnBvbGF0aW9uKSB7CiAgICBsZXQgZmFjdG9yeU1ldGhvZDsKICAgIHN3aXRjaCAoaW50ZXJwb2xhdGlvbikgewogICAgICBjYXNlIEludGVycG9sYXRlRGlzY3JldGU6CiAgICAgICAgZmFjdG9yeU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSW50ZXJwb2xhdGVMaW5lYXI6CiAgICAgICAgZmFjdG9yeU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEludGVycG9sYXRlU21vb3RoOgogICAgICAgIGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDsKICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChmYWN0b3J5TWV0aG9kID09PSB1bmRlZmluZWQpIHsKICAgICAgY29uc3QgbWVzc2FnZSA9ICJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAiICsgdGhpcy5WYWx1ZVR5cGVOYW1lICsgIiBrZXlmcmFtZSB0cmFjayBuYW1lZCAiICsgdGhpcy5uYW1lOwogICAgICBpZiAodGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgaWYgKGludGVycG9sYXRpb24gIT09IHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pIHsKICAgICAgICAgIHRoaXMuc2V0SW50ZXJwb2xhdGlvbih0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zb2xlLndhcm4oIlRIUkVFLktleWZyYW1lVHJhY2s6IiwgbWVzc2FnZSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9IGZhY3RvcnlNZXRob2Q7CiAgICByZXR1cm4gdGhpczsKICB9CiAgZ2V0SW50ZXJwb2xhdGlvbigpIHsKICAgIHN3aXRjaCAodGhpcy5jcmVhdGVJbnRlcnBvbGFudCkgewogICAgICBjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6CiAgICAgICAgcmV0dXJuIEludGVycG9sYXRlRGlzY3JldGU7CiAgICAgIGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6CiAgICAgICAgcmV0dXJuIEludGVycG9sYXRlTGluZWFyOwogICAgICBjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOgogICAgICAgIHJldHVybiBJbnRlcnBvbGF0ZVNtb290aDsKICAgIH0KICB9CiAgZ2V0VmFsdWVTaXplKCkgewogICAgcmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aCAvIHRoaXMudGltZXMubGVuZ3RoOwogIH0KICBzaGlmdCh0aW1lT2Zmc2V0KSB7CiAgICBpZiAodGltZU9mZnNldCAhPT0gMCkgewogICAgICBjb25zdCB0aW1lcyA9IHRoaXMudGltZXM7CiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gdGltZXMubGVuZ3RoO2kgIT09IG47ICsraSkgewogICAgICAgIHRpbWVzW2ldICs9IHRpbWVPZmZzZXQ7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KICBzY2FsZSh0aW1lU2NhbGUpIHsKICAgIGlmICh0aW1lU2NhbGUgIT09IDEpIHsKICAgICAgY29uc3QgdGltZXMgPSB0aGlzLnRpbWVzOwogICAgICBmb3IgKGxldCBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDtpICE9PSBuOyArK2kpIHsKICAgICAgICB0aW1lc1tpXSAqPSB0aW1lU2NhbGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KICB0cmltKHN0YXJ0VGltZSwgZW5kVGltZSkgewogICAgY29uc3QgdGltZXMgPSB0aGlzLnRpbWVzLCBuS2V5cyA9IHRpbWVzLmxlbmd0aDsKICAgIGxldCBmcm9tID0gMCwgdG8gPSBuS2V5cyAtIDE7CiAgICB3aGlsZSAoZnJvbSAhPT0gbktleXMgJiYgdGltZXNbZnJvbV0gPCBzdGFydFRpbWUpIHsKICAgICAgKytmcm9tOwogICAgfQogICAgd2hpbGUgKHRvICE9PSAtMSAmJiB0aW1lc1t0b10gPiBlbmRUaW1lKSB7CiAgICAgIC0tdG87CiAgICB9CiAgICArK3RvOwogICAgaWYgKGZyb20gIT09IDAgfHwgdG8gIT09IG5LZXlzKSB7CiAgICAgIGlmIChmcm9tID49IHRvKSB7CiAgICAgICAgdG8gPSBNYXRoLm1heCh0bywgMSk7CiAgICAgICAgZnJvbSA9IHRvIC0gMTsKICAgICAgfQogICAgICBjb25zdCBzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpOwogICAgICB0aGlzLnRpbWVzID0gdGltZXMuc2xpY2UoZnJvbSwgdG8pOwogICAgICB0aGlzLnZhbHVlcyA9IHRoaXMudmFsdWVzLnNsaWNlKGZyb20gKiBzdHJpZGUsIHRvICogc3RyaWRlKTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KICB2YWxpZGF0ZSgpIHsKICAgIGxldCB2YWxpZCA9IHRydWU7CiAgICBjb25zdCB2YWx1ZVNpemUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpOwogICAgaWYgKHZhbHVlU2l6ZSAtIE1hdGguZmxvb3IodmFsdWVTaXplKSAhPT0gMCkgewogICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBJbnZhbGlkIHZhbHVlIHNpemUgaW4gdHJhY2suIiwgdGhpcyk7CiAgICAgIHZhbGlkID0gZmFsc2U7CiAgICB9CiAgICBjb25zdCB0aW1lcyA9IHRoaXMudGltZXMsIHZhbHVlcyA9IHRoaXMudmFsdWVzLCBuS2V5cyA9IHRpbWVzLmxlbmd0aDsKICAgIGlmIChuS2V5cyA9PT0gMCkgewogICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBUcmFjayBpcyBlbXB0eS4iLCB0aGlzKTsKICAgICAgdmFsaWQgPSBmYWxzZTsKICAgIH0KICAgIGxldCBwcmV2VGltZSA9IG51bGw7CiAgICBmb3IgKGxldCBpID0gMDtpICE9PSBuS2V5czsgaSsrKSB7CiAgICAgIGNvbnN0IGN1cnJUaW1lID0gdGltZXNbaV07CiAgICAgIGlmICh0eXBlb2YgY3VyclRpbWUgPT09ICJudW1iZXIiICYmIGlzTmFOKGN1cnJUaW1lKSkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFRpbWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLiIsIHRoaXMsIGksIGN1cnJUaW1lKTsKICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChwcmV2VGltZSAhPT0gbnVsbCAmJiBwcmV2VGltZSA+IGN1cnJUaW1lKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuIiwgdGhpcywgaSwgY3VyclRpbWUsIHByZXZUaW1lKTsKICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHByZXZUaW1lID0gY3VyclRpbWU7CiAgICB9CiAgICBpZiAodmFsdWVzICE9PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKGlzVHlwZWRBcnJheSh2YWx1ZXMpKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSB2YWx1ZXMubGVuZ3RoO2kgIT09IG47ICsraSkgewogICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07CiAgICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4iLCB0aGlzLCBpLCB2YWx1ZSk7CiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbGlkOwogIH0KICBvcHRpbWl6ZSgpIHsKICAgIGNvbnN0IHRpbWVzID0gdGhpcy50aW1lcy5zbGljZSgpLCB2YWx1ZXMgPSB0aGlzLnZhbHVlcy5zbGljZSgpLCBzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpLCBzbW9vdGhJbnRlcnBvbGF0aW9uID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uKCkgPT09IEludGVycG9sYXRlU21vb3RoLCBsYXN0SW5kZXggPSB0aW1lcy5sZW5ndGggLSAxOwogICAgbGV0IHdyaXRlSW5kZXggPSAxOwogICAgZm9yIChsZXQgaSA9IDE7aSA8IGxhc3RJbmRleDsgKytpKSB7CiAgICAgIGxldCBrZWVwID0gZmFsc2U7CiAgICAgIGNvbnN0IHRpbWUgPSB0aW1lc1tpXTsKICAgICAgY29uc3QgdGltZU5leHQgPSB0aW1lc1tpICsgMV07CiAgICAgIGlmICh0aW1lICE9PSB0aW1lTmV4dCAmJiAoaSAhPT0gMSB8fCB0aW1lICE9PSB0aW1lc1swXSkpIHsKICAgICAgICBpZiAoIXNtb290aEludGVycG9sYXRpb24pIHsKICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGkgKiBzdHJpZGUsIG9mZnNldFAgPSBvZmZzZXQgLSBzdHJpZGUsIG9mZnNldE4gPSBvZmZzZXQgKyBzdHJpZGU7CiAgICAgICAgICBmb3IgKGxldCBqID0gMDtqICE9PSBzdHJpZGU7ICsraikgewogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tvZmZzZXQgKyBqXTsKICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB2YWx1ZXNbb2Zmc2V0UCArIGpdIHx8IHZhbHVlICE9PSB2YWx1ZXNbb2Zmc2V0TiArIGpdKSB7CiAgICAgICAgICAgICAga2VlcCA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAga2VlcCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChrZWVwKSB7CiAgICAgICAgaWYgKGkgIT09IHdyaXRlSW5kZXgpIHsKICAgICAgICAgIHRpbWVzW3dyaXRlSW5kZXhdID0gdGltZXNbaV07CiAgICAgICAgICBjb25zdCByZWFkT2Zmc2V0ID0gaSAqIHN0cmlkZSwgd3JpdGVPZmZzZXQgPSB3cml0ZUluZGV4ICogc3RyaWRlOwogICAgICAgICAgZm9yIChsZXQgaiA9IDA7aiAhPT0gc3RyaWRlOyArK2opIHsKICAgICAgICAgICAgdmFsdWVzW3dyaXRlT2Zmc2V0ICsgal0gPSB2YWx1ZXNbcmVhZE9mZnNldCArIGpdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICArK3dyaXRlSW5kZXg7CiAgICAgIH0KICAgIH0KICAgIGlmIChsYXN0SW5kZXggPiAwKSB7CiAgICAgIHRpbWVzW3dyaXRlSW5kZXhdID0gdGltZXNbbGFzdEluZGV4XTsKICAgICAgZm9yIChsZXQgcmVhZE9mZnNldCA9IGxhc3RJbmRleCAqIHN0cmlkZSwgd3JpdGVPZmZzZXQgPSB3cml0ZUluZGV4ICogc3RyaWRlLCBqID0gMDtqICE9PSBzdHJpZGU7ICsraikgewogICAgICAgIHZhbHVlc1t3cml0ZU9mZnNldCArIGpdID0gdmFsdWVzW3JlYWRPZmZzZXQgKyBqXTsKICAgICAgfQogICAgICArK3dyaXRlSW5kZXg7CiAgICB9CiAgICBpZiAod3JpdGVJbmRleCAhPT0gdGltZXMubGVuZ3RoKSB7CiAgICAgIHRoaXMudGltZXMgPSB0aW1lcy5zbGljZSgwLCB3cml0ZUluZGV4KTsKICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXMuc2xpY2UoMCwgd3JpdGVJbmRleCAqIHN0cmlkZSk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnRpbWVzID0gdGltZXM7CiAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIGNsb25lKCkgewogICAgY29uc3QgdGltZXMgPSB0aGlzLnRpbWVzLnNsaWNlKCk7CiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnZhbHVlcy5zbGljZSgpOwogICAgY29uc3QgVHlwZWRLZXlmcmFtZVRyYWNrID0gdGhpcy5jb25zdHJ1Y3RvcjsKICAgIGNvbnN0IHRyYWNrID0gbmV3IFR5cGVkS2V5ZnJhbWVUcmFjayh0aGlzLm5hbWUsIHRpbWVzLCB2YWx1ZXMpOwogICAgdHJhY2suY3JlYXRlSW50ZXJwb2xhbnQgPSB0aGlzLmNyZWF0ZUludGVycG9sYW50OwogICAgcmV0dXJuIHRyYWNrOwogIH0KfQoKY2xhc3MgQW5pbWF0aW9uQ2xpcCB7CiAgY29uc3RydWN0b3IobmFtZSA9ICIiLCBkdXJhdGlvbiA9IC0xLCB0cmFja3MgPSBbXSwgYmxlbmRNb2RlID0gTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlKSB7CiAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgdGhpcy50cmFja3MgPSB0cmFja3M7CiAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247CiAgICB0aGlzLmJsZW5kTW9kZSA9IGJsZW5kTW9kZTsKICAgIHRoaXMudXVpZCA9IGdlbmVyYXRlVVVJRCgpOwogICAgaWYgKHRoaXMuZHVyYXRpb24gPCAwKSB7CiAgICAgIHRoaXMucmVzZXREdXJhdGlvbigpOwogICAgfQogIH0KICBzdGF0aWMgcGFyc2UoanNvbikgewogICAgY29uc3QgdHJhY2tzID0gW10sIGpzb25UcmFja3MgPSBqc29uLnRyYWNrcywgZnJhbWVUaW1lID0gMSAvIChqc29uLmZwcyB8fCAxKTsKICAgIGZvciAobGV0IGkgPSAwLCBuID0ganNvblRyYWNrcy5sZW5ndGg7aSAhPT0gbjsgKytpKSB7CiAgICAgIHRyYWNrcy5wdXNoKHBhcnNlS2V5ZnJhbWVUcmFjayhqc29uVHJhY2tzW2ldKS5zY2FsZShmcmFtZVRpbWUpKTsKICAgIH0KICAgIGNvbnN0IGNsaXAgPSBuZXcgdGhpcyhqc29uLm5hbWUsIGpzb24uZHVyYXRpb24sIHRyYWNrcywganNvbi5ibGVuZE1vZGUpOwogICAgY2xpcC51dWlkID0ganNvbi51dWlkOwogICAgcmV0dXJuIGNsaXA7CiAgfQogIHN0YXRpYyB0b0pTT04oY2xpcCkgewogICAgY29uc3QgdHJhY2tzID0gW10sIGNsaXBUcmFja3MgPSBjbGlwLnRyYWNrczsKICAgIGNvbnN0IGpzb24gPSB7CiAgICAgIG5hbWU6IGNsaXAubmFtZSwKICAgICAgZHVyYXRpb246IGNsaXAuZHVyYXRpb24sCiAgICAgIHRyYWNrcywKICAgICAgdXVpZDogY2xpcC51dWlkLAogICAgICBibGVuZE1vZGU6IGNsaXAuYmxlbmRNb2RlCiAgICB9OwogICAgZm9yIChsZXQgaSA9IDAsIG4gPSBjbGlwVHJhY2tzLmxlbmd0aDtpICE9PSBuOyArK2kpIHsKICAgICAgdHJhY2tzLnB1c2goS2V5ZnJhbWVUcmFjay50b0pTT04oY2xpcFRyYWNrc1tpXSkpOwogICAgfQogICAgcmV0dXJuIGpzb247CiAgfQogIHN0YXRpYyBDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZShuYW1lLCBtb3JwaFRhcmdldFNlcXVlbmNlLCBmcHMsIG5vTG9vcCkgewogICAgY29uc3QgbnVtTW9ycGhUYXJnZXRzID0gbW9ycGhUYXJnZXRTZXF1ZW5jZS5sZW5ndGg7CiAgICBjb25zdCB0cmFja3MgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwO2kgPCBudW1Nb3JwaFRhcmdldHM7IGkrKykgewogICAgICBsZXQgdGltZXMgPSBbXTsKICAgICAgbGV0IHZhbHVlcyA9IFtdOwogICAgICB0aW1lcy5wdXNoKChpICsgbnVtTW9ycGhUYXJnZXRzIC0gMSkgJSBudW1Nb3JwaFRhcmdldHMsIGksIChpICsgMSkgJSBudW1Nb3JwaFRhcmdldHMpOwogICAgICB2YWx1ZXMucHVzaCgwLCAxLCAwKTsKICAgICAgY29uc3Qgb3JkZXIgPSBnZXRLZXlmcmFtZU9yZGVyKHRpbWVzKTsKICAgICAgdGltZXMgPSBzb3J0ZWRBcnJheSh0aW1lcywgMSwgb3JkZXIpOwogICAgICB2YWx1ZXMgPSBzb3J0ZWRBcnJheSh2YWx1ZXMsIDEsIG9yZGVyKTsKICAgICAgaWYgKCFub0xvb3AgJiYgdGltZXNbMF0gPT09IDApIHsKICAgICAgICB0aW1lcy5wdXNoKG51bU1vcnBoVGFyZ2V0cyk7CiAgICAgICAgdmFsdWVzLnB1c2godmFsdWVzWzBdKTsKICAgICAgfQogICAgICB0cmFja3MucHVzaChuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjaygiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1siICsgbW9ycGhUYXJnZXRTZXF1ZW5jZVtpXS5uYW1lICsgIl0iLCB0aW1lcywgdmFsdWVzKS5zY2FsZSgxIC8gZnBzKSk7CiAgICB9CiAgICByZXR1cm4gbmV3IHRoaXMobmFtZSwgLTEsIHRyYWNrcyk7CiAgfQogIHN0YXRpYyBmaW5kQnlOYW1lKG9iamVjdE9yQ2xpcEFycmF5LCBuYW1lKSB7CiAgICBsZXQgY2xpcEFycmF5ID0gb2JqZWN0T3JDbGlwQXJyYXk7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkob2JqZWN0T3JDbGlwQXJyYXkpKSB7CiAgICAgIGNvbnN0IG8gPSBvYmplY3RPckNsaXBBcnJheTsKICAgICAgY2xpcEFycmF5ID0gby5nZW9tZXRyeSAmJiBvLmdlb21ldHJ5LmFuaW1hdGlvbnMgfHwgby5hbmltYXRpb25zOwogICAgfQogICAgZm9yIChsZXQgaSA9IDA7aSA8IGNsaXBBcnJheS5sZW5ndGg7IGkrKykgewogICAgICBpZiAoY2xpcEFycmF5W2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICByZXR1cm4gY2xpcEFycmF5W2ldOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgc3RhdGljIENyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzKG1vcnBoVGFyZ2V0cywgZnBzLCBub0xvb3ApIHsKICAgIGNvbnN0IGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzID0ge307CiAgICBjb25zdCBwYXR0ZXJuID0gL14oW1x3LV0qPykoW1xkXSspJC87CiAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoO2kgPCBpbDsgaSsrKSB7CiAgICAgIGNvbnN0IG1vcnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzW2ldOwogICAgICBjb25zdCBwYXJ0cyA9IG1vcnBoVGFyZ2V0Lm5hbWUubWF0Y2gocGF0dGVybik7CiAgICAgIGlmIChwYXJ0cyAmJiBwYXJ0cy5sZW5ndGggPiAxKSB7CiAgICAgICAgY29uc3QgbmFtZSA9IHBhcnRzWzFdOwogICAgICAgIGxldCBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1tuYW1lXTsKICAgICAgICBpZiAoIWFuaW1hdGlvbk1vcnBoVGFyZ2V0cykgewogICAgICAgICAgYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbbmFtZV0gPSBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBbXTsKICAgICAgICB9CiAgICAgICAgYW5pbWF0aW9uTW9ycGhUYXJnZXRzLnB1c2gobW9ycGhUYXJnZXQpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBjbGlwcyA9IFtdOwogICAgZm9yIChjb25zdCBuYW1lIGluIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzKSB7CiAgICAgIGNsaXBzLnB1c2godGhpcy5DcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZShuYW1lLCBhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1tuYW1lXSwgZnBzLCBub0xvb3ApKTsKICAgIH0KICAgIHJldHVybiBjbGlwczsKICB9CiAgc3RhdGljIHBhcnNlQW5pbWF0aW9uKGFuaW1hdGlvbiwgYm9uZXMpIHsKICAgIGlmICghYW5pbWF0aW9uKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkFuaW1hdGlvbkNsaXA6IE5vIGFuaW1hdGlvbiBpbiBKU09OTG9hZGVyIGRhdGEuIik7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgYWRkTm9uZW1wdHlUcmFjayA9IGZ1bmN0aW9uKHRyYWNrVHlwZSwgdHJhY2tOYW1lLCBhbmltYXRpb25LZXlzLCBwcm9wZXJ0eU5hbWUsIGRlc3RUcmFja3MpIHsKICAgICAgaWYgKGFuaW1hdGlvbktleXMubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgY29uc3QgdGltZXMgPSBbXTsKICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTsKICAgICAgICBmbGF0dGVuSlNPTihhbmltYXRpb25LZXlzLCB0aW1lcywgdmFsdWVzLCBwcm9wZXJ0eU5hbWUpOwogICAgICAgIGlmICh0aW1lcy5sZW5ndGggIT09IDApIHsKICAgICAgICAgIGRlc3RUcmFja3MucHVzaChuZXcgdHJhY2tUeXBlKHRyYWNrTmFtZSwgdGltZXMsIHZhbHVlcykpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGNvbnN0IHRyYWNrcyA9IFtdOwogICAgY29uc3QgY2xpcE5hbWUgPSBhbmltYXRpb24ubmFtZSB8fCAiZGVmYXVsdCI7CiAgICBjb25zdCBmcHMgPSBhbmltYXRpb24uZnBzIHx8IDMwOwogICAgY29uc3QgYmxlbmRNb2RlID0gYW5pbWF0aW9uLmJsZW5kTW9kZTsKICAgIGxldCBkdXJhdGlvbiA9IGFuaW1hdGlvbi5sZW5ndGggfHwgLTE7CiAgICBjb25zdCBoaWVyYXJjaHlUcmFja3MgPSBhbmltYXRpb24uaGllcmFyY2h5IHx8IFtdOwogICAgZm9yIChsZXQgaCA9IDA7aCA8IGhpZXJhcmNoeVRyYWNrcy5sZW5ndGg7IGgrKykgewogICAgICBjb25zdCBhbmltYXRpb25LZXlzID0gaGllcmFyY2h5VHJhY2tzW2hdLmtleXM7CiAgICAgIGlmICghYW5pbWF0aW9uS2V5cyB8fCBhbmltYXRpb25LZXlzLmxlbmd0aCA9PT0gMCkKICAgICAgICBjb250aW51ZTsKICAgICAgaWYgKGFuaW1hdGlvbktleXNbMF0ubW9ycGhUYXJnZXRzKSB7CiAgICAgICAgY29uc3QgbW9ycGhUYXJnZXROYW1lcyA9IHt9OwogICAgICAgIGxldCBrOwogICAgICAgIGZvciAoayA9IDA7ayA8IGFuaW1hdGlvbktleXMubGVuZ3RoOyBrKyspIHsKICAgICAgICAgIGlmIChhbmltYXRpb25LZXlzW2tdLm1vcnBoVGFyZ2V0cykgewogICAgICAgICAgICBmb3IgKGxldCBtID0gMDttIDwgYW5pbWF0aW9uS2V5c1trXS5tb3JwaFRhcmdldHMubGVuZ3RoOyBtKyspIHsKICAgICAgICAgICAgICBtb3JwaFRhcmdldE5hbWVzW2FuaW1hdGlvbktleXNba10ubW9ycGhUYXJnZXRzW21dXSA9IC0xOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3QgbW9ycGhUYXJnZXROYW1lIGluIG1vcnBoVGFyZ2V0TmFtZXMpIHsKICAgICAgICAgIGNvbnN0IHRpbWVzID0gW107CiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTsKICAgICAgICAgIGZvciAobGV0IG0gPSAwO20gIT09IGFuaW1hdGlvbktleXNba10ubW9ycGhUYXJnZXRzLmxlbmd0aDsgKyttKSB7CiAgICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbktleSA9IGFuaW1hdGlvbktleXNba107CiAgICAgICAgICAgIHRpbWVzLnB1c2goYW5pbWF0aW9uS2V5LnRpbWUpOwogICAgICAgICAgICB2YWx1ZXMucHVzaChhbmltYXRpb25LZXkubW9ycGhUYXJnZXQgPT09IG1vcnBoVGFyZ2V0TmFtZSA/IDEgOiAwKTsKICAgICAgICAgIH0KICAgICAgICAgIHRyYWNrcy5wdXNoKG5ldyBOdW1iZXJLZXlmcmFtZVRyYWNrKCIubW9ycGhUYXJnZXRJbmZsdWVuY2VbIiArIG1vcnBoVGFyZ2V0TmFtZSArICJdIiwgdGltZXMsIHZhbHVlcykpOwogICAgICAgIH0KICAgICAgICBkdXJhdGlvbiA9IG1vcnBoVGFyZ2V0TmFtZXMubGVuZ3RoICogZnBzOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGJvbmVOYW1lID0gIi5ib25lc1siICsgYm9uZXNbaF0ubmFtZSArICJdIjsKICAgICAgICBhZGROb25lbXB0eVRyYWNrKFZlY3RvcktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgIi5wb3NpdGlvbiIsIGFuaW1hdGlvbktleXMsICJwb3MiLCB0cmFja3MpOwogICAgICAgIGFkZE5vbmVtcHR5VHJhY2soUXVhdGVybmlvbktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgIi5xdWF0ZXJuaW9uIiwgYW5pbWF0aW9uS2V5cywgInJvdCIsIHRyYWNrcyk7CiAgICAgICAgYWRkTm9uZW1wdHlUcmFjayhWZWN0b3JLZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICIuc2NhbGUiLCBhbmltYXRpb25LZXlzLCAic2NsIiwgdHJhY2tzKTsKICAgICAgfQogICAgfQogICAgaWYgKHRyYWNrcy5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBjbGlwID0gbmV3IHRoaXMoY2xpcE5hbWUsIGR1cmF0aW9uLCB0cmFja3MsIGJsZW5kTW9kZSk7CiAgICByZXR1cm4gY2xpcDsKICB9CiAgcmVzZXREdXJhdGlvbigpIHsKICAgIGNvbnN0IHRyYWNrcyA9IHRoaXMudHJhY2tzOwogICAgbGV0IGR1cmF0aW9uID0gMDsKICAgIGZvciAobGV0IGkgPSAwLCBuID0gdHJhY2tzLmxlbmd0aDtpICE9PSBuOyArK2kpIHsKICAgICAgY29uc3QgdHJhY2sgPSB0aGlzLnRyYWNrc1tpXTsKICAgICAgZHVyYXRpb24gPSBNYXRoLm1heChkdXJhdGlvbiwgdHJhY2sudGltZXNbdHJhY2sudGltZXMubGVuZ3RoIC0gMV0pOwogICAgfQogICAgdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHRyaW0oKSB7CiAgICBmb3IgKGxldCBpID0gMDtpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpKyspIHsKICAgICAgdGhpcy50cmFja3NbaV0udHJpbSgwLCB0aGlzLmR1cmF0aW9uKTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KICB2YWxpZGF0ZSgpIHsKICAgIGxldCB2YWxpZCA9IHRydWU7CiAgICBmb3IgKGxldCBpID0gMDtpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpKyspIHsKICAgICAgdmFsaWQgPSB2YWxpZCAmJiB0aGlzLnRyYWNrc1tpXS52YWxpZGF0ZSgpOwogICAgfQogICAgcmV0dXJuIHZhbGlkOwogIH0KICBvcHRpbWl6ZSgpIHsKICAgIGZvciAobGV0IGkgPSAwO2kgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkrKykgewogICAgICB0aGlzLnRyYWNrc1tpXS5vcHRpbWl6ZSgpOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIGNsb25lKCkgewogICAgY29uc3QgdHJhY2tzID0gW107CiAgICBmb3IgKGxldCBpID0gMDtpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpKyspIHsKICAgICAgdHJhY2tzLnB1c2godGhpcy50cmFja3NbaV0uY2xvbmUoKSk7CiAgICB9CiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5uYW1lLCB0aGlzLmR1cmF0aW9uLCB0cmFja3MsIHRoaXMuYmxlbmRNb2RlKTsKICB9CiAgdG9KU09OKCkgewogICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9KU09OKHRoaXMpOwogIH0KfQpmdW5jdGlvbiBnZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lKHR5cGVOYW1lKSB7CiAgc3dpdGNoICh0eXBlTmFtZS50b0xvd2VyQ2FzZSgpKSB7CiAgICBjYXNlICJzY2FsYXIiOgogICAgY2FzZSAiZG91YmxlIjoKICAgIGNhc2UgImZsb2F0IjoKICAgIGNhc2UgIm51bWJlciI6CiAgICBjYXNlICJpbnRlZ2VyIjoKICAgICAgcmV0dXJuIE51bWJlcktleWZyYW1lVHJhY2s7CiAgICBjYXNlICJ2ZWN0b3IiOgogICAgY2FzZSAidmVjdG9yMiI6CiAgICBjYXNlICJ2ZWN0b3IzIjoKICAgIGNhc2UgInZlY3RvcjQiOgogICAgICByZXR1cm4gVmVjdG9yS2V5ZnJhbWVUcmFjazsKICAgIGNhc2UgImNvbG9yIjoKICAgICAgcmV0dXJuIENvbG9yS2V5ZnJhbWVUcmFjazsKICAgIGNhc2UgInF1YXRlcm5pb24iOgogICAgICByZXR1cm4gUXVhdGVybmlvbktleWZyYW1lVHJhY2s7CiAgICBjYXNlICJib29sIjoKICAgIGNhc2UgImJvb2xlYW4iOgogICAgICByZXR1cm4gQm9vbGVhbktleWZyYW1lVHJhY2s7CiAgICBjYXNlICJzdHJpbmciOgogICAgICByZXR1cm4gU3RyaW5nS2V5ZnJhbWVUcmFjazsKICB9CiAgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIiArIHR5cGVOYW1lKTsKfQpmdW5jdGlvbiBwYXJzZUtleWZyYW1lVHJhY2soanNvbikgewogIGlmIChqc29uLnR5cGUgPT09IHVuZGVmaW5lZCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayB0eXBlIHVuZGVmaW5lZCwgY2FuIG5vdCBwYXJzZSIpOwogIH0KICBjb25zdCB0cmFja1R5cGUgPSBnZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lKGpzb24udHlwZSk7CiAgaWYgKGpzb24udGltZXMgPT09IHVuZGVmaW5lZCkgewogICAgY29uc3QgdGltZXMgPSBbXSwgdmFsdWVzID0gW107CiAgICBmbGF0dGVuSlNPTihqc29uLmtleXMsIHRpbWVzLCB2YWx1ZXMsICJ2YWx1ZSIpOwogICAganNvbi50aW1lcyA9IHRpbWVzOwogICAganNvbi52YWx1ZXMgPSB2YWx1ZXM7CiAgfQogIGlmICh0cmFja1R5cGUucGFyc2UgIT09IHVuZGVmaW5lZCkgewogICAgcmV0dXJuIHRyYWNrVHlwZS5wYXJzZShqc29uKTsKICB9IGVsc2UgewogICAgcmV0dXJuIG5ldyB0cmFja1R5cGUoanNvbi5uYW1lLCBqc29uLnRpbWVzLCBqc29uLnZhbHVlcywganNvbi5pbnRlcnBvbGF0aW9uKTsKICB9Cn0KCmNsYXNzIExvYWRpbmdNYW5hZ2VyIHsKICBjb25zdHJ1Y3RvcihvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IpIHsKICAgIGNvbnN0IHNjb3BlID0gdGhpczsKICAgIGxldCBpc0xvYWRpbmcgPSBmYWxzZTsKICAgIGxldCBpdGVtc0xvYWRlZCA9IDA7CiAgICBsZXQgaXRlbXNUb3RhbCA9IDA7CiAgICBsZXQgdXJsTW9kaWZpZXIgPSB1bmRlZmluZWQ7CiAgICBjb25zdCBoYW5kbGVycyA9IFtdOwogICAgdGhpcy5vblN0YXJ0ID0gdW5kZWZpbmVkOwogICAgdGhpcy5vbkxvYWQgPSBvbkxvYWQ7CiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBvblByb2dyZXNzOwogICAgdGhpcy5vbkVycm9yID0gb25FcnJvcjsKICAgIHRoaXMuaXRlbVN0YXJ0ID0gZnVuY3Rpb24odXJsKSB7CiAgICAgIGl0ZW1zVG90YWwrKzsKICAgICAgaWYgKGlzTG9hZGluZyA9PT0gZmFsc2UpIHsKICAgICAgICBpZiAoc2NvcGUub25TdGFydCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBzY29wZS5vblN0YXJ0KHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwpOwogICAgICAgIH0KICAgICAgfQogICAgICBpc0xvYWRpbmcgPSB0cnVlOwogICAgfTsKICAgIHRoaXMuaXRlbUVuZCA9IGZ1bmN0aW9uKHVybCkgewogICAgICBpdGVtc0xvYWRlZCsrOwogICAgICBpZiAoc2NvcGUub25Qcm9ncmVzcyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgc2NvcGUub25Qcm9ncmVzcyh1cmwsIGl0ZW1zTG9hZGVkLCBpdGVtc1RvdGFsKTsKICAgICAgfQogICAgICBpZiAoaXRlbXNMb2FkZWQgPT09IGl0ZW1zVG90YWwpIHsKICAgICAgICBpc0xvYWRpbmcgPSBmYWxzZTsKICAgICAgICBpZiAoc2NvcGUub25Mb2FkICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHNjb3BlLm9uTG9hZCgpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIHRoaXMuaXRlbUVycm9yID0gZnVuY3Rpb24odXJsKSB7CiAgICAgIGlmIChzY29wZS5vbkVycm9yICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBzY29wZS5vbkVycm9yKHVybCk7CiAgICAgIH0KICAgIH07CiAgICB0aGlzLnJlc29sdmVVUkwgPSBmdW5jdGlvbih1cmwpIHsKICAgICAgaWYgKHVybE1vZGlmaWVyKSB7CiAgICAgICAgcmV0dXJuIHVybE1vZGlmaWVyKHVybCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHVybDsKICAgIH07CiAgICB0aGlzLnNldFVSTE1vZGlmaWVyID0gZnVuY3Rpb24odHJhbnNmb3JtKSB7CiAgICAgIHVybE1vZGlmaWVyID0gdHJhbnNmb3JtOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICB0aGlzLmFkZEhhbmRsZXIgPSBmdW5jdGlvbihyZWdleCwgbG9hZGVyKSB7CiAgICAgIGhhbmRsZXJzLnB1c2gocmVnZXgsIGxvYWRlcik7CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIHRoaXMucmVtb3ZlSGFuZGxlciA9IGZ1bmN0aW9uKHJlZ2V4KSB7CiAgICAgIGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihyZWdleCk7CiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHsKICAgICAgICBoYW5kbGVycy5zcGxpY2UoaW5kZXgsIDIpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIHRoaXMuZ2V0SGFuZGxlciA9IGZ1bmN0aW9uKGZpbGUpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7aSA8IGw7IGkgKz0gMikgewogICAgICAgIGNvbnN0IHJlZ2V4ID0gaGFuZGxlcnNbaV07CiAgICAgICAgY29uc3QgbG9hZGVyID0gaGFuZGxlcnNbaSArIDFdOwogICAgICAgIGlmIChyZWdleC5nbG9iYWwpCiAgICAgICAgICByZWdleC5sYXN0SW5kZXggPSAwOwogICAgICAgIGlmIChyZWdleC50ZXN0KGZpbGUpKSB7CiAgICAgICAgICByZXR1cm4gbG9hZGVyOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH07CiAgfQp9CgpjbGFzcyBMb2FkZXIgewogIGNvbnN0cnVjdG9yKG1hbmFnZXIpIHsKICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXIgIT09IHVuZGVmaW5lZCA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7CiAgICB0aGlzLmNyb3NzT3JpZ2luID0gImFub255bW91cyI7CiAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9IGZhbHNlOwogICAgdGhpcy5wYXRoID0gIiI7CiAgICB0aGlzLnJlc291cmNlUGF0aCA9ICIiOwogICAgdGhpcy5yZXF1ZXN0SGVhZGVyID0ge307CiAgfQogIGxvYWQoKSB7fQogIGxvYWRBc3luYyh1cmwsIG9uUHJvZ3Jlc3MpIHsKICAgIGNvbnN0IHNjb3BlID0gdGhpczsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgc2NvcGUubG9hZCh1cmwsIHJlc29sdmUsIG9uUHJvZ3Jlc3MsIHJlamVjdCk7CiAgICB9KTsKICB9CiAgcGFyc2UoKSB7fQogIHNldENyb3NzT3JpZ2luKGNyb3NzT3JpZ2luKSB7CiAgICB0aGlzLmNyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW47CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2V0V2l0aENyZWRlbnRpYWxzKHZhbHVlKSB7CiAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9IHZhbHVlOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldFBhdGgocGF0aCkgewogICAgdGhpcy5wYXRoID0gcGF0aDsKICAgIHJldHVybiB0aGlzOwogIH0KICBzZXRSZXNvdXJjZVBhdGgocmVzb3VyY2VQYXRoKSB7CiAgICB0aGlzLnJlc291cmNlUGF0aCA9IHJlc291cmNlUGF0aDsKICAgIHJldHVybiB0aGlzOwogIH0KICBzZXRSZXF1ZXN0SGVhZGVyKHJlcXVlc3RIZWFkZXIpIHsKICAgIHRoaXMucmVxdWVzdEhlYWRlciA9IHJlcXVlc3RIZWFkZXI7CiAgICByZXR1cm4gdGhpczsKICB9Cn0KCmNsYXNzIExpZ2h0U2hhZG93IHsKICBjb25zdHJ1Y3RvcihjYW1lcmEpIHsKICAgIHRoaXMuY2FtZXJhID0gY2FtZXJhOwogICAgdGhpcy5pbnRlbnNpdHkgPSAxOwogICAgdGhpcy5iaWFzID0gMDsKICAgIHRoaXMubm9ybWFsQmlhcyA9IDA7CiAgICB0aGlzLnJhZGl1cyA9IDE7CiAgICB0aGlzLmJsdXJTYW1wbGVzID0gODsKICAgIHRoaXMubWFwU2l6ZSA9IG5ldyBWZWN0b3IyKDUxMiwgNTEyKTsKICAgIHRoaXMubWFwID0gbnVsbDsKICAgIHRoaXMubWFwUGFzcyA9IG51bGw7CiAgICB0aGlzLm1hdHJpeCA9IG5ldyBNYXRyaXg0OwogICAgdGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTsKICAgIHRoaXMubmVlZHNVcGRhdGUgPSBmYWxzZTsKICAgIHRoaXMuX2ZydXN0dW0gPSBuZXcgRnJ1c3R1bTsKICAgIHRoaXMuX2ZyYW1lRXh0ZW50cyA9IG5ldyBWZWN0b3IyKDEsIDEpOwogICAgdGhpcy5fdmlld3BvcnRDb3VudCA9IDE7CiAgICB0aGlzLl92aWV3cG9ydHMgPSBbCiAgICAgIG5ldyBWZWN0b3I0KDAsIDAsIDEsIDEpCiAgICBdOwogIH0KICBnZXRWaWV3cG9ydENvdW50KCkgewogICAgcmV0dXJuIHRoaXMuX3ZpZXdwb3J0Q291bnQ7CiAgfQogIGdldEZydXN0dW0oKSB7CiAgICByZXR1cm4gdGhpcy5fZnJ1c3R1bTsKICB9CiAgdXBkYXRlTWF0cmljZXMobGlnaHQpIHsKICAgIGNvbnN0IHNoYWRvd0NhbWVyYSA9IHRoaXMuY2FtZXJhOwogICAgY29uc3Qgc2hhZG93TWF0cml4ID0gdGhpcy5tYXRyaXg7CiAgICBfbGlnaHRQb3NpdGlvbldvcmxkJDEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGxpZ2h0Lm1hdHJpeFdvcmxkKTsKICAgIHNoYWRvd0NhbWVyYS5wb3NpdGlvbi5jb3B5KF9saWdodFBvc2l0aW9uV29ybGQkMSk7CiAgICBfbG9va1RhcmdldCQxLnNldEZyb21NYXRyaXhQb3NpdGlvbihsaWdodC50YXJnZXQubWF0cml4V29ybGQpOwogICAgc2hhZG93Q2FtZXJhLmxvb2tBdChfbG9va1RhcmdldCQxKTsKICAgIHNoYWRvd0NhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpOwogICAgX3Byb2pTY3JlZW5NYXRyaXgkMS5tdWx0aXBseU1hdHJpY2VzKHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTsKICAgIHRoaXMuX2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoX3Byb2pTY3JlZW5NYXRyaXgkMSk7CiAgICBzaGFkb3dNYXRyaXguc2V0KDAuNSwgMCwgMCwgMC41LCAwLCAwLjUsIDAsIDAuNSwgMCwgMCwgMC41LCAwLjUsIDAsIDAsIDAsIDEpOwogICAgc2hhZG93TWF0cml4Lm11bHRpcGx5KF9wcm9qU2NyZWVuTWF0cml4JDEpOwogIH0KICBnZXRWaWV3cG9ydCh2aWV3cG9ydEluZGV4KSB7CiAgICByZXR1cm4gdGhpcy5fdmlld3BvcnRzW3ZpZXdwb3J0SW5kZXhdOwogIH0KICBnZXRGcmFtZUV4dGVudHMoKSB7CiAgICByZXR1cm4gdGhpcy5fZnJhbWVFeHRlbnRzOwogIH0KICBkaXNwb3NlKCkgewogICAgaWYgKHRoaXMubWFwKSB7CiAgICAgIHRoaXMubWFwLmRpc3Bvc2UoKTsKICAgIH0KICAgIGlmICh0aGlzLm1hcFBhc3MpIHsKICAgICAgdGhpcy5tYXBQYXNzLmRpc3Bvc2UoKTsKICAgIH0KICB9CiAgY29weShzb3VyY2UpIHsKICAgIHRoaXMuY2FtZXJhID0gc291cmNlLmNhbWVyYS5jbG9uZSgpOwogICAgdGhpcy5pbnRlbnNpdHkgPSBzb3VyY2UuaW50ZW5zaXR5OwogICAgdGhpcy5iaWFzID0gc291cmNlLmJpYXM7CiAgICB0aGlzLnJhZGl1cyA9IHNvdXJjZS5yYWRpdXM7CiAgICB0aGlzLm1hcFNpemUuY29weShzb3VyY2UubWFwU2l6ZSk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgY2xvbmUoKSB7CiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpOwogIH0KICB0b0pTT04oKSB7CiAgICBjb25zdCBvYmplY3QgPSB7fTsKICAgIGlmICh0aGlzLmludGVuc2l0eSAhPT0gMSkKICAgICAgb2JqZWN0LmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5OwogICAgaWYgKHRoaXMuYmlhcyAhPT0gMCkKICAgICAgb2JqZWN0LmJpYXMgPSB0aGlzLmJpYXM7CiAgICBpZiAodGhpcy5ub3JtYWxCaWFzICE9PSAwKQogICAgICBvYmplY3Qubm9ybWFsQmlhcyA9IHRoaXMubm9ybWFsQmlhczsKICAgIGlmICh0aGlzLnJhZGl1cyAhPT0gMSkKICAgICAgb2JqZWN0LnJhZGl1cyA9IHRoaXMucmFkaXVzOwogICAgaWYgKHRoaXMubWFwU2l6ZS54ICE9PSA1MTIgfHwgdGhpcy5tYXBTaXplLnkgIT09IDUxMikKICAgICAgb2JqZWN0Lm1hcFNpemUgPSB0aGlzLm1hcFNpemUudG9BcnJheSgpOwogICAgb2JqZWN0LmNhbWVyYSA9IHRoaXMuY2FtZXJhLnRvSlNPTihmYWxzZSkub2JqZWN0OwogICAgZGVsZXRlIG9iamVjdC5jYW1lcmEubWF0cml4OwogICAgcmV0dXJuIG9iamVjdDsKICB9Cn0KCmNsYXNzIFNwaGVyaWNhbEhhcm1vbmljczMgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5pc1NwaGVyaWNhbEhhcm1vbmljczMgPSB0cnVlOwogICAgdGhpcy5jb2VmZmljaWVudHMgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwO2kgPCA5OyBpKyspIHsKICAgICAgdGhpcy5jb2VmZmljaWVudHMucHVzaChuZXcgVmVjdG9yMyk7CiAgICB9CiAgfQogIHNldChjb2VmZmljaWVudHMpIHsKICAgIGZvciAobGV0IGkgPSAwO2kgPCA5OyBpKyspIHsKICAgICAgdGhpcy5jb2VmZmljaWVudHNbaV0uY29weShjb2VmZmljaWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIHplcm8oKSB7CiAgICBmb3IgKGxldCBpID0gMDtpIDwgOTsgaSsrKSB7CiAgICAgIHRoaXMuY29lZmZpY2llbnRzW2ldLnNldCgwLCAwLCAwKTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KICBnZXRBdChub3JtYWwsIHRhcmdldCkgewogICAgY29uc3QgeyB4LCB5LCB6IH0gPSBub3JtYWw7CiAgICBjb25zdCBjb2VmZiA9IHRoaXMuY29lZmZpY2llbnRzOwogICAgdGFyZ2V0LmNvcHkoY29lZmZbMF0pLm11bHRpcGx5U2NhbGFyKDAuMjgyMDk1KTsKICAgIHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoY29lZmZbMV0sIDAuNDg4NjAzICogeSk7CiAgICB0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKGNvZWZmWzJdLCAwLjQ4ODYwMyAqIHopOwogICAgdGFyZ2V0LmFkZFNjYWxlZFZlY3Rvcihjb2VmZlszXSwgMC40ODg2MDMgKiB4KTsKICAgIHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoY29lZmZbNF0sIDEuMDkyNTQ4ICogKHggKiB5KSk7CiAgICB0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKGNvZWZmWzVdLCAxLjA5MjU0OCAqICh5ICogeikpOwogICAgdGFyZ2V0LmFkZFNjYWxlZFZlY3Rvcihjb2VmZls2XSwgMC4zMTUzOTIgKiAoMyAqIHogKiB6IC0gMSkpOwogICAgdGFyZ2V0LmFkZFNjYWxlZFZlY3Rvcihjb2VmZls3XSwgMS4wOTI1NDggKiAoeCAqIHopKTsKICAgIHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoY29lZmZbOF0sIDAuNTQ2Mjc0ICogKHggKiB4IC0geSAqIHkpKTsKICAgIHJldHVybiB0YXJnZXQ7CiAgfQogIGdldElycmFkaWFuY2VBdChub3JtYWwsIHRhcmdldCkgewogICAgY29uc3QgeyB4LCB5LCB6IH0gPSBub3JtYWw7CiAgICBjb25zdCBjb2VmZiA9IHRoaXMuY29lZmZpY2llbnRzOwogICAgdGFyZ2V0LmNvcHkoY29lZmZbMF0pLm11bHRpcGx5U2NhbGFyKDAuODg2MjI3KTsKICAgIHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoY29lZmZbMV0sIDIgKiAwLjUxMTY2NCAqIHkpOwogICAgdGFyZ2V0LmFkZFNjYWxlZFZlY3Rvcihjb2VmZlsyXSwgMiAqIDAuNTExNjY0ICogeik7CiAgICB0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKGNvZWZmWzNdLCAyICogMC41MTE2NjQgKiB4KTsKICAgIHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoY29lZmZbNF0sIDIgKiAwLjQyOTA0MyAqIHggKiB5KTsKICAgIHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoY29lZmZbNV0sIDIgKiAwLjQyOTA0MyAqIHkgKiB6KTsKICAgIHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoY29lZmZbNl0sIDAuNzQzMTI1ICogeiAqIHogLSAwLjI0NzcwOCk7CiAgICB0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKGNvZWZmWzddLCAyICogMC40MjkwNDMgKiB4ICogeik7CiAgICB0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKGNvZWZmWzhdLCAwLjQyOTA0MyAqICh4ICogeCAtIHkgKiB5KSk7CiAgICByZXR1cm4gdGFyZ2V0OwogIH0KICBhZGQoc2gpIHsKICAgIGZvciAobGV0IGkgPSAwO2kgPCA5OyBpKyspIHsKICAgICAgdGhpcy5jb2VmZmljaWVudHNbaV0uYWRkKHNoLmNvZWZmaWNpZW50c1tpXSk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CiAgYWRkU2NhbGVkU0goc2gsIHMpIHsKICAgIGZvciAobGV0IGkgPSAwO2kgPCA5OyBpKyspIHsKICAgICAgdGhpcy5jb2VmZmljaWVudHNbaV0uYWRkU2NhbGVkVmVjdG9yKHNoLmNvZWZmaWNpZW50c1tpXSwgcyk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2NhbGUocykgewogICAgZm9yIChsZXQgaSA9IDA7aSA8IDk7IGkrKykgewogICAgICB0aGlzLmNvZWZmaWNpZW50c1tpXS5tdWx0aXBseVNjYWxhcihzKTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KICBsZXJwKHNoLCBhbHBoYSkgewogICAgZm9yIChsZXQgaSA9IDA7aSA8IDk7IGkrKykgewogICAgICB0aGlzLmNvZWZmaWNpZW50c1tpXS5sZXJwKHNoLmNvZWZmaWNpZW50c1tpXSwgYWxwaGEpOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIGVxdWFscyhzaCkgewogICAgZm9yIChsZXQgaSA9IDA7aSA8IDk7IGkrKykgewogICAgICBpZiAoIXRoaXMuY29lZmZpY2llbnRzW2ldLmVxdWFscyhzaC5jb2VmZmljaWVudHNbaV0pKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgY29weShzaCkgewogICAgcmV0dXJuIHRoaXMuc2V0KHNoLmNvZWZmaWNpZW50cyk7CiAgfQogIGNsb25lKCkgewogICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKTsKICB9CiAgZnJvbUFycmF5KGFycmF5LCBvZmZzZXQgPSAwKSB7CiAgICBjb25zdCBjb2VmZmljaWVudHMgPSB0aGlzLmNvZWZmaWNpZW50czsKICAgIGZvciAobGV0IGkgPSAwO2kgPCA5OyBpKyspIHsKICAgICAgY29lZmZpY2llbnRzW2ldLmZyb21BcnJheShhcnJheSwgb2Zmc2V0ICsgaSAqIDMpOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIHRvQXJyYXkoYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCkgewogICAgY29uc3QgY29lZmZpY2llbnRzID0gdGhpcy5jb2VmZmljaWVudHM7CiAgICBmb3IgKGxldCBpID0gMDtpIDwgOTsgaSsrKSB7CiAgICAgIGNvZWZmaWNpZW50c1tpXS50b0FycmF5KGFycmF5LCBvZmZzZXQgKyBpICogMyk7CiAgICB9CiAgICByZXR1cm4gYXJyYXk7CiAgfQogIHN0YXRpYyBnZXRCYXNpc0F0KG5vcm1hbCwgc2hCYXNpcykgewogICAgY29uc3QgeyB4LCB5LCB6IH0gPSBub3JtYWw7CiAgICBzaEJhc2lzWzBdID0gMC4yODIwOTU7CiAgICBzaEJhc2lzWzFdID0gMC40ODg2MDMgKiB5OwogICAgc2hCYXNpc1syXSA9IDAuNDg4NjAzICogejsKICAgIHNoQmFzaXNbM10gPSAwLjQ4ODYwMyAqIHg7CiAgICBzaEJhc2lzWzRdID0gMS4wOTI1NDggKiB4ICogeTsKICAgIHNoQmFzaXNbNV0gPSAxLjA5MjU0OCAqIHkgKiB6OwogICAgc2hCYXNpc1s2XSA9IDAuMzE1MzkyICogKDMgKiB6ICogeiAtIDEpOwogICAgc2hCYXNpc1s3XSA9IDEuMDkyNTQ4ICogeCAqIHo7CiAgICBzaEJhc2lzWzhdID0gMC41NDYyNzQgKiAoeCAqIHggLSB5ICogeSk7CiAgfQp9CgpjbGFzcyBMb2FkZXJVdGlscyB7CiAgc3RhdGljIGRlY29kZVRleHQoYXJyYXkpIHsKICAgIGNvbnNvbGUud2FybigiVEhSRUUuTG9hZGVyVXRpbHM6IGRlY29kZVRleHQoKSBoYXMgYmVlbiBkZXByZWNhdGVkIHdpdGggcjE2NSBhbmQgd2lsbCBiZSByZW1vdmVkIHdpdGggcjE3NS4gVXNlIFRleHREZWNvZGVyIGluc3RlYWQuIik7CiAgICBpZiAodHlwZW9mIFRleHREZWNvZGVyICE9PSAidW5kZWZpbmVkIikgewogICAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGFycmF5KTsKICAgIH0KICAgIGxldCBzID0gIiI7CiAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBhcnJheS5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFycmF5W2ldKTsKICAgIH0KICAgIHRyeSB7CiAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHMpKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIHM7CiAgICB9CiAgfQogIHN0YXRpYyBleHRyYWN0VXJsQmFzZSh1cmwpIHsKICAgIGNvbnN0IGluZGV4ID0gdXJsLmxhc3RJbmRleE9mKCIvIik7CiAgICBpZiAoaW5kZXggPT09IC0xKQogICAgICByZXR1cm4gIi4vIjsKICAgIHJldHVybiB1cmwuc2xpY2UoMCwgaW5kZXggKyAxKTsKICB9CiAgc3RhdGljIHJlc29sdmVVUkwodXJsLCBwYXRoKSB7CiAgICBpZiAodHlwZW9mIHVybCAhPT0gInN0cmluZyIgfHwgdXJsID09PSAiIikKICAgICAgcmV0dXJuICIiOwogICAgaWYgKC9eaHR0cHM/OlwvXC8vaS50ZXN0KHBhdGgpICYmIC9eXC8vLnRlc3QodXJsKSkgewogICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC8oXmh0dHBzPzpcL1wvW15cL10rKS4qL2ksICIkMSIpOwogICAgfQogICAgaWYgKC9eKGh0dHBzPzopP1wvXC8vaS50ZXN0KHVybCkpCiAgICAgIHJldHVybiB1cmw7CiAgICBpZiAoL15kYXRhOi4qLC4qJC9pLnRlc3QodXJsKSkKICAgICAgcmV0dXJuIHVybDsKICAgIGlmICgvXmJsb2I6LiokL2kudGVzdCh1cmwpKQogICAgICByZXR1cm4gdXJsOwogICAgcmV0dXJuIHBhdGggKyB1cmw7CiAgfQp9CgpjbGFzcyBBdWRpb0NvbnRleHQgewogIHN0YXRpYyBnZXRDb250ZXh0KCkgewogICAgaWYgKF9jb250ZXh0ID09PSB1bmRlZmluZWQpIHsKICAgICAgX2NvbnRleHQgPSBuZXcgKHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCk7CiAgICB9CiAgICByZXR1cm4gX2NvbnRleHQ7CiAgfQogIHN0YXRpYyBzZXRDb250ZXh0KHZhbHVlKSB7CiAgICBfY29udGV4dCA9IHZhbHVlOwogIH0KfQoKY2xhc3MgU3RlcmVvQ2FtZXJhIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMudHlwZSA9ICJTdGVyZW9DYW1lcmEiOwogICAgdGhpcy5hc3BlY3QgPSAxOwogICAgdGhpcy5leWVTZXAgPSAwLjA2NDsKICAgIHRoaXMuY2FtZXJhTCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYTsKICAgIHRoaXMuY2FtZXJhTC5sYXllcnMuZW5hYmxlKDEpOwogICAgdGhpcy5jYW1lcmFMLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKICAgIHRoaXMuY2FtZXJhUiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYTsKICAgIHRoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKDIpOwogICAgdGhpcy5jYW1lcmFSLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKICAgIHRoaXMuX2NhY2hlID0gewogICAgICBmb2N1czogbnVsbCwKICAgICAgZm92OiBudWxsLAogICAgICBhc3BlY3Q6IG51bGwsCiAgICAgIG5lYXI6IG51bGwsCiAgICAgIGZhcjogbnVsbCwKICAgICAgem9vbTogbnVsbCwKICAgICAgZXllU2VwOiBudWxsCiAgICB9OwogIH0KICB1cGRhdGUoY2FtZXJhKSB7CiAgICBjb25zdCBjYWNoZSA9IHRoaXMuX2NhY2hlOwogICAgY29uc3QgbmVlZHNVcGRhdGUgPSBjYWNoZS5mb2N1cyAhPT0gY2FtZXJhLmZvY3VzIHx8IGNhY2hlLmZvdiAhPT0gY2FtZXJhLmZvdiB8fCBjYWNoZS5hc3BlY3QgIT09IGNhbWVyYS5hc3BlY3QgKiB0aGlzLmFzcGVjdCB8fCBjYWNoZS5uZWFyICE9PSBjYW1lcmEubmVhciB8fCBjYWNoZS5mYXIgIT09IGNhbWVyYS5mYXIgfHwgY2FjaGUuem9vbSAhPT0gY2FtZXJhLnpvb20gfHwgY2FjaGUuZXllU2VwICE9PSB0aGlzLmV5ZVNlcDsKICAgIGlmIChuZWVkc1VwZGF0ZSkgewogICAgICBjYWNoZS5mb2N1cyA9IGNhbWVyYS5mb2N1czsKICAgICAgY2FjaGUuZm92ID0gY2FtZXJhLmZvdjsKICAgICAgY2FjaGUuYXNwZWN0ID0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0OwogICAgICBjYWNoZS5uZWFyID0gY2FtZXJhLm5lYXI7CiAgICAgIGNhY2hlLmZhciA9IGNhbWVyYS5mYXI7CiAgICAgIGNhY2hlLnpvb20gPSBjYW1lcmEuem9vbTsKICAgICAgY2FjaGUuZXllU2VwID0gdGhpcy5leWVTZXA7CiAgICAgIF9wcm9qZWN0aW9uTWF0cml4LmNvcHkoY2FtZXJhLnByb2plY3Rpb25NYXRyaXgpOwogICAgICBjb25zdCBleWVTZXBIYWxmID0gY2FjaGUuZXllU2VwIC8gMjsKICAgICAgY29uc3QgZXllU2VwT25Qcm9qZWN0aW9uID0gZXllU2VwSGFsZiAqIGNhY2hlLm5lYXIgLyBjYWNoZS5mb2N1czsKICAgICAgY29uc3QgeW1heCA9IGNhY2hlLm5lYXIgKiBNYXRoLnRhbihERUcyUkFEICogY2FjaGUuZm92ICogMC41KSAvIGNhY2hlLnpvb207CiAgICAgIGxldCB4bWluLCB4bWF4OwogICAgICBfZXllTGVmdC5lbGVtZW50c1sxMl0gPSAtZXllU2VwSGFsZjsKICAgICAgX2V5ZVJpZ2h0LmVsZW1lbnRzWzEyXSA9IGV5ZVNlcEhhbGY7CiAgICAgIHhtaW4gPSAteW1heCAqIGNhY2hlLmFzcGVjdCArIGV5ZVNlcE9uUHJvamVjdGlvbjsKICAgICAgeG1heCA9IHltYXggKiBjYWNoZS5hc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247CiAgICAgIF9wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWzBdID0gMiAqIGNhY2hlLm5lYXIgLyAoeG1heCAtIHhtaW4pOwogICAgICBfcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1s4XSA9ICh4bWF4ICsgeG1pbikgLyAoeG1heCAtIHhtaW4pOwogICAgICB0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KF9wcm9qZWN0aW9uTWF0cml4KTsKICAgICAgeG1pbiA9IC15bWF4ICogY2FjaGUuYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uOwogICAgICB4bWF4ID0geW1heCAqIGNhY2hlLmFzcGVjdCAtIGV5ZVNlcE9uUHJvamVjdGlvbjsKICAgICAgX3Byb2plY3Rpb25NYXRyaXguZWxlbWVudHNbMF0gPSAyICogY2FjaGUubmVhciAvICh4bWF4IC0geG1pbik7CiAgICAgIF9wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWzhdID0gKHhtYXggKyB4bWluKSAvICh4bWF4IC0geG1pbik7CiAgICAgIHRoaXMuY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoX3Byb2plY3Rpb25NYXRyaXgpOwogICAgfQogICAgdGhpcy5jYW1lcmFMLm1hdHJpeFdvcmxkLmNvcHkoY2FtZXJhLm1hdHJpeFdvcmxkKS5tdWx0aXBseShfZXllTGVmdCk7CiAgICB0aGlzLmNhbWVyYVIubWF0cml4V29ybGQuY29weShjYW1lcmEubWF0cml4V29ybGQpLm11bHRpcGx5KF9leWVSaWdodCk7CiAgfQp9CgpjbGFzcyBDbG9jayB7CiAgY29uc3RydWN0b3IoYXV0b1N0YXJ0ID0gdHJ1ZSkgewogICAgdGhpcy5hdXRvU3RhcnQgPSBhdXRvU3RhcnQ7CiAgICB0aGlzLnN0YXJ0VGltZSA9IDA7CiAgICB0aGlzLm9sZFRpbWUgPSAwOwogICAgdGhpcy5lbGFwc2VkVGltZSA9IDA7CiAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKICB9CiAgc3RhcnQoKSB7CiAgICB0aGlzLnN0YXJ0VGltZSA9IG5vdygpOwogICAgdGhpcy5vbGRUaW1lID0gdGhpcy5zdGFydFRpbWU7CiAgICB0aGlzLmVsYXBzZWRUaW1lID0gMDsKICAgIHRoaXMucnVubmluZyA9IHRydWU7CiAgfQogIHN0b3AoKSB7CiAgICB0aGlzLmdldEVsYXBzZWRUaW1lKCk7CiAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKICAgIHRoaXMuYXV0b1N0YXJ0ID0gZmFsc2U7CiAgfQogIGdldEVsYXBzZWRUaW1lKCkgewogICAgdGhpcy5nZXREZWx0YSgpOwogICAgcmV0dXJuIHRoaXMuZWxhcHNlZFRpbWU7CiAgfQogIGdldERlbHRhKCkgewogICAgbGV0IGRpZmYgPSAwOwogICAgaWYgKHRoaXMuYXV0b1N0YXJ0ICYmICF0aGlzLnJ1bm5pbmcpIHsKICAgICAgdGhpcy5zdGFydCgpOwogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmICh0aGlzLnJ1bm5pbmcpIHsKICAgICAgY29uc3QgbmV3VGltZSA9IG5vdygpOwogICAgICBkaWZmID0gKG5ld1RpbWUgLSB0aGlzLm9sZFRpbWUpIC8gMTAwMDsKICAgICAgdGhpcy5vbGRUaW1lID0gbmV3VGltZTsKICAgICAgdGhpcy5lbGFwc2VkVGltZSArPSBkaWZmOwogICAgfQogICAgcmV0dXJuIGRpZmY7CiAgfQp9CmZ1bmN0aW9uIG5vdygpIHsKICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCk7Cn0KCmNsYXNzIEF1ZGlvQW5hbHlzZXIgewogIGNvbnN0cnVjdG9yKGF1ZGlvLCBmZnRTaXplID0gMjA0OCkgewogICAgdGhpcy5hbmFseXNlciA9IGF1ZGlvLmNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKTsKICAgIHRoaXMuYW5hbHlzZXIuZmZ0U2l6ZSA9IGZmdFNpemU7CiAgICB0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheSh0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50KTsKICAgIGF1ZGlvLmdldE91dHB1dCgpLmNvbm5lY3QodGhpcy5hbmFseXNlcik7CiAgfQogIGdldEZyZXF1ZW5jeURhdGEoKSB7CiAgICB0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKHRoaXMuZGF0YSk7CiAgICByZXR1cm4gdGhpcy5kYXRhOwogIH0KICBnZXRBdmVyYWdlRnJlcXVlbmN5KCkgewogICAgbGV0IHZhbHVlID0gMDsKICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKTsKICAgIGZvciAobGV0IGkgPSAwO2kgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhbHVlICs9IGRhdGFbaV07CiAgICB9CiAgICByZXR1cm4gdmFsdWUgLyBkYXRhLmxlbmd0aDsKICB9Cn0KCmNsYXNzIFByb3BlcnR5TWl4ZXIgewogIGNvbnN0cnVjdG9yKGJpbmRpbmcsIHR5cGVOYW1lLCB2YWx1ZVNpemUpIHsKICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7CiAgICB0aGlzLnZhbHVlU2l6ZSA9IHZhbHVlU2l6ZTsKICAgIGxldCBtaXhGdW5jdGlvbiwgbWl4RnVuY3Rpb25BZGRpdGl2ZSwgc2V0SWRlbnRpdHk7CiAgICBzd2l0Y2ggKHR5cGVOYW1lKSB7CiAgICAgIGNhc2UgInF1YXRlcm5pb24iOgogICAgICAgIG1peEZ1bmN0aW9uID0gdGhpcy5fc2xlcnA7CiAgICAgICAgbWl4RnVuY3Rpb25BZGRpdGl2ZSA9IHRoaXMuX3NsZXJwQWRkaXRpdmU7CiAgICAgICAgc2V0SWRlbnRpdHkgPSB0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5UXVhdGVybmlvbjsKICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDY0QXJyYXkodmFsdWVTaXplICogNik7CiAgICAgICAgdGhpcy5fd29ya0luZGV4ID0gNTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAic3RyaW5nIjoKICAgICAgY2FzZSAiYm9vbCI6CiAgICAgICAgbWl4RnVuY3Rpb24gPSB0aGlzLl9zZWxlY3Q7CiAgICAgICAgbWl4RnVuY3Rpb25BZGRpdGl2ZSA9IHRoaXMuX3NlbGVjdDsKICAgICAgICBzZXRJZGVudGl0eSA9IHRoaXMuX3NldEFkZGl0aXZlSWRlbnRpdHlPdGhlcjsKICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheSh2YWx1ZVNpemUgKiA1KTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBtaXhGdW5jdGlvbiA9IHRoaXMuX2xlcnA7CiAgICAgICAgbWl4RnVuY3Rpb25BZGRpdGl2ZSA9IHRoaXMuX2xlcnBBZGRpdGl2ZTsKICAgICAgICBzZXRJZGVudGl0eSA9IHRoaXMuX3NldEFkZGl0aXZlSWRlbnRpdHlOdW1lcmljOwogICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IEZsb2F0NjRBcnJheSh2YWx1ZVNpemUgKiA1KTsKICAgIH0KICAgIHRoaXMuX21peEJ1ZmZlclJlZ2lvbiA9IG1peEZ1bmN0aW9uOwogICAgdGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmUgPSBtaXhGdW5jdGlvbkFkZGl0aXZlOwogICAgdGhpcy5fc2V0SWRlbnRpdHkgPSBzZXRJZGVudGl0eTsKICAgIHRoaXMuX29yaWdJbmRleCA9IDM7CiAgICB0aGlzLl9hZGRJbmRleCA9IDQ7CiAgICB0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwOwogICAgdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUgPSAwOwogICAgdGhpcy51c2VDb3VudCA9IDA7CiAgICB0aGlzLnJlZmVyZW5jZUNvdW50ID0gMDsKICB9CiAgYWNjdW11bGF0ZShhY2N1SW5kZXgsIHdlaWdodCkgewogICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXIsIHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLCBvZmZzZXQgPSBhY2N1SW5kZXggKiBzdHJpZGUgKyBzdHJpZGU7CiAgICBsZXQgY3VycmVudFdlaWdodCA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodDsKICAgIGlmIChjdXJyZW50V2VpZ2h0ID09PSAwKSB7CiAgICAgIGZvciAobGV0IGkgPSAwO2kgIT09IHN0cmlkZTsgKytpKSB7CiAgICAgICAgYnVmZmVyW29mZnNldCArIGldID0gYnVmZmVyW2ldOwogICAgICB9CiAgICAgIGN1cnJlbnRXZWlnaHQgPSB3ZWlnaHQ7CiAgICB9IGVsc2UgewogICAgICBjdXJyZW50V2VpZ2h0ICs9IHdlaWdodDsKICAgICAgY29uc3QgbWl4ID0gd2VpZ2h0IC8gY3VycmVudFdlaWdodDsKICAgICAgdGhpcy5fbWl4QnVmZmVyUmVnaW9uKGJ1ZmZlciwgb2Zmc2V0LCAwLCBtaXgsIHN0cmlkZSk7CiAgICB9CiAgICB0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSBjdXJyZW50V2VpZ2h0OwogIH0KICBhY2N1bXVsYXRlQWRkaXRpdmUod2VpZ2h0KSB7CiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlciwgc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsIG9mZnNldCA9IHN0cmlkZSAqIHRoaXMuX2FkZEluZGV4OwogICAgaWYgKHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlID09PSAwKSB7CiAgICAgIHRoaXMuX3NldElkZW50aXR5KCk7CiAgICB9CiAgICB0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZShidWZmZXIsIG9mZnNldCwgMCwgd2VpZ2h0LCBzdHJpZGUpOwogICAgdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUgKz0gd2VpZ2h0OwogIH0KICBhcHBseShhY2N1SW5kZXgpIHsKICAgIGNvbnN0IHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLCBidWZmZXIgPSB0aGlzLmJ1ZmZlciwgb2Zmc2V0ID0gYWNjdUluZGV4ICogc3RyaWRlICsgc3RyaWRlLCB3ZWlnaHQgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQsIHdlaWdodEFkZGl0aXZlID0gdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUsIGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7CiAgICB0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwOwogICAgdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUgPSAwOwogICAgaWYgKHdlaWdodCA8IDEpIHsKICAgICAgY29uc3Qgb3JpZ2luYWxWYWx1ZU9mZnNldCA9IHN0cmlkZSAqIHRoaXMuX29yaWdJbmRleDsKICAgICAgdGhpcy5fbWl4QnVmZmVyUmVnaW9uKGJ1ZmZlciwgb2Zmc2V0LCBvcmlnaW5hbFZhbHVlT2Zmc2V0LCAxIC0gd2VpZ2h0LCBzdHJpZGUpOwogICAgfQogICAgaWYgKHdlaWdodEFkZGl0aXZlID4gMCkgewogICAgICB0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZShidWZmZXIsIG9mZnNldCwgdGhpcy5fYWRkSW5kZXggKiBzdHJpZGUsIDEsIHN0cmlkZSk7CiAgICB9CiAgICBmb3IgKGxldCBpID0gc3RyaWRlLCBlID0gc3RyaWRlICsgc3RyaWRlO2kgIT09IGU7ICsraSkgewogICAgICBpZiAoYnVmZmVyW2ldICE9PSBidWZmZXJbaSArIHN0cmlkZV0pIHsKICAgICAgICBiaW5kaW5nLnNldFZhbHVlKGJ1ZmZlciwgb2Zmc2V0KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KICBzYXZlT3JpZ2luYWxTdGF0ZSgpIHsKICAgIGNvbnN0IGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7CiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlciwgc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsIG9yaWdpbmFsVmFsdWVPZmZzZXQgPSBzdHJpZGUgKiB0aGlzLl9vcmlnSW5kZXg7CiAgICBiaW5kaW5nLmdldFZhbHVlKGJ1ZmZlciwgb3JpZ2luYWxWYWx1ZU9mZnNldCk7CiAgICBmb3IgKGxldCBpID0gc3RyaWRlLCBlID0gb3JpZ2luYWxWYWx1ZU9mZnNldDtpICE9PSBlOyArK2kpIHsKICAgICAgYnVmZmVyW2ldID0gYnVmZmVyW29yaWdpbmFsVmFsdWVPZmZzZXQgKyBpICUgc3RyaWRlXTsKICAgIH0KICAgIHRoaXMuX3NldElkZW50aXR5KCk7CiAgICB0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwOwogICAgdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUgPSAwOwogIH0KICByZXN0b3JlT3JpZ2luYWxTdGF0ZSgpIHsKICAgIGNvbnN0IG9yaWdpbmFsVmFsdWVPZmZzZXQgPSB0aGlzLnZhbHVlU2l6ZSAqIDM7CiAgICB0aGlzLmJpbmRpbmcuc2V0VmFsdWUodGhpcy5idWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQpOwogIH0KICBfc2V0QWRkaXRpdmVJZGVudGl0eU51bWVyaWMoKSB7CiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5fYWRkSW5kZXggKiB0aGlzLnZhbHVlU2l6ZTsKICAgIGNvbnN0IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIHRoaXMudmFsdWVTaXplOwogICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7aSA8IGVuZEluZGV4OyBpKyspIHsKICAgICAgdGhpcy5idWZmZXJbaV0gPSAwOwogICAgfQogIH0KICBfc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb24oKSB7CiAgICB0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpOwogICAgdGhpcy5idWZmZXJbdGhpcy5fYWRkSW5kZXggKiB0aGlzLnZhbHVlU2l6ZSArIDNdID0gMTsKICB9CiAgX3NldEFkZGl0aXZlSWRlbnRpdHlPdGhlcigpIHsKICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLl9vcmlnSW5kZXggKiB0aGlzLnZhbHVlU2l6ZTsKICAgIGNvbnN0IHRhcmdldEluZGV4ID0gdGhpcy5fYWRkSW5kZXggKiB0aGlzLnZhbHVlU2l6ZTsKICAgIGZvciAobGV0IGkgPSAwO2kgPCB0aGlzLnZhbHVlU2l6ZTsgaSsrKSB7CiAgICAgIHRoaXMuYnVmZmVyW3RhcmdldEluZGV4ICsgaV0gPSB0aGlzLmJ1ZmZlcltzdGFydEluZGV4ICsgaV07CiAgICB9CiAgfQogIF9zZWxlY3QoYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlKSB7CiAgICBpZiAodCA+PSAwLjUpIHsKICAgICAgZm9yIChsZXQgaSA9IDA7aSAhPT0gc3RyaWRlOyArK2kpIHsKICAgICAgICBidWZmZXJbZHN0T2Zmc2V0ICsgaV0gPSBidWZmZXJbc3JjT2Zmc2V0ICsgaV07CiAgICAgIH0KICAgIH0KICB9CiAgX3NsZXJwKGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQpIHsKICAgIFF1YXRlcm5pb24uc2xlcnBGbGF0KGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBzcmNPZmZzZXQsIHQpOwogIH0KICBfc2xlcnBBZGRpdGl2ZShidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUpIHsKICAgIGNvbnN0IHdvcmtPZmZzZXQgPSB0aGlzLl93b3JrSW5kZXggKiBzdHJpZGU7CiAgICBRdWF0ZXJuaW9uLm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KGJ1ZmZlciwgd29ya09mZnNldCwgYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgc3JjT2Zmc2V0KTsKICAgIFF1YXRlcm5pb24uc2xlcnBGbGF0KGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCB3b3JrT2Zmc2V0LCB0KTsKICB9CiAgX2xlcnAoYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlKSB7CiAgICBjb25zdCBzID0gMSAtIHQ7CiAgICBmb3IgKGxldCBpID0gMDtpICE9PSBzdHJpZGU7ICsraSkgewogICAgICBjb25zdCBqID0gZHN0T2Zmc2V0ICsgaTsKICAgICAgYnVmZmVyW2pdID0gYnVmZmVyW2pdICogcyArIGJ1ZmZlcltzcmNPZmZzZXQgKyBpXSAqIHQ7CiAgICB9CiAgfQogIF9sZXJwQWRkaXRpdmUoYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlKSB7CiAgICBmb3IgKGxldCBpID0gMDtpICE9PSBzdHJpZGU7ICsraSkgewogICAgICBjb25zdCBqID0gZHN0T2Zmc2V0ICsgaTsKICAgICAgYnVmZmVyW2pdID0gYnVmZmVyW2pdICsgYnVmZmVyW3NyY09mZnNldCArIGldICogdDsKICAgIH0KICB9Cn0KCmNsYXNzIENvbXBvc2l0ZSB7CiAgY29uc3RydWN0b3IodGFyZ2V0R3JvdXAsIHBhdGgsIG9wdGlvbmFsUGFyc2VkUGF0aCkgewogICAgY29uc3QgcGFyc2VkUGF0aCA9IG9wdGlvbmFsUGFyc2VkUGF0aCB8fCBQcm9wZXJ0eUJpbmRpbmcucGFyc2VUcmFja05hbWUocGF0aCk7CiAgICB0aGlzLl90YXJnZXRHcm91cCA9IHRhcmdldEdyb3VwOwogICAgdGhpcy5fYmluZGluZ3MgPSB0YXJnZXRHcm91cC5zdWJzY3JpYmVfKHBhdGgsIHBhcnNlZFBhdGgpOwogIH0KICBnZXRWYWx1ZShhcnJheSwgb2Zmc2V0KSB7CiAgICB0aGlzLmJpbmQoKTsKICAgIGNvbnN0IGZpcnN0VmFsaWRJbmRleCA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywgYmluZGluZyA9IHRoaXMuX2JpbmRpbmdzW2ZpcnN0VmFsaWRJbmRleF07CiAgICBpZiAoYmluZGluZyAhPT0gdW5kZWZpbmVkKQogICAgICBiaW5kaW5nLmdldFZhbHVlKGFycmF5LCBvZmZzZXQpOwogIH0KICBzZXRWYWx1ZShhcnJheSwgb2Zmc2V0KSB7CiAgICBjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzOwogICAgZm9yIChsZXQgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywgbiA9IGJpbmRpbmdzLmxlbmd0aDtpICE9PSBuOyArK2kpIHsKICAgICAgYmluZGluZ3NbaV0uc2V0VmFsdWUoYXJyYXksIG9mZnNldCk7CiAgICB9CiAgfQogIGJpbmQoKSB7CiAgICBjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzOwogICAgZm9yIChsZXQgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywgbiA9IGJpbmRpbmdzLmxlbmd0aDtpICE9PSBuOyArK2kpIHsKICAgICAgYmluZGluZ3NbaV0uYmluZCgpOwogICAgfQogIH0KICB1bmJpbmQoKSB7CiAgICBjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzOwogICAgZm9yIChsZXQgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywgbiA9IGJpbmRpbmdzLmxlbmd0aDtpICE9PSBuOyArK2kpIHsKICAgICAgYmluZGluZ3NbaV0udW5iaW5kKCk7CiAgICB9CiAgfQp9CgpjbGFzcyBQcm9wZXJ0eUJpbmRpbmcgewogIGNvbnN0cnVjdG9yKHJvb3ROb2RlLCBwYXRoLCBwYXJzZWRQYXRoKSB7CiAgICB0aGlzLnBhdGggPSBwYXRoOwogICAgdGhpcy5wYXJzZWRQYXRoID0gcGFyc2VkUGF0aCB8fCBQcm9wZXJ0eUJpbmRpbmcucGFyc2VUcmFja05hbWUocGF0aCk7CiAgICB0aGlzLm5vZGUgPSBQcm9wZXJ0eUJpbmRpbmcuZmluZE5vZGUocm9vdE5vZGUsIHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSk7CiAgICB0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7CiAgICB0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5ib3VuZDsKICAgIHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmJvdW5kOwogIH0KICBzdGF0aWMgY3JlYXRlKHJvb3QsIHBhdGgsIHBhcnNlZFBhdGgpIHsKICAgIGlmICghKHJvb3QgJiYgcm9vdC5pc0FuaW1hdGlvbk9iamVjdEdyb3VwKSkgewogICAgICByZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZyhyb290LCBwYXRoLCBwYXJzZWRQYXRoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZShyb290LCBwYXRoLCBwYXJzZWRQYXRoKTsKICAgIH0KICB9CiAgc3RhdGljIHNhbml0aXplTm9kZU5hbWUobmFtZSkgewogICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXHMvZywgIl8iKS5yZXBsYWNlKF9yZXNlcnZlZFJlLCAiIik7CiAgfQogIHN0YXRpYyBwYXJzZVRyYWNrTmFtZSh0cmFja05hbWUpIHsKICAgIGNvbnN0IG1hdGNoZXMgPSBfdHJhY2tSZS5leGVjKHRyYWNrTmFtZSk7CiAgICBpZiAobWF0Y2hlcyA9PT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlByb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogIiArIHRyYWNrTmFtZSk7CiAgICB9CiAgICBjb25zdCByZXN1bHRzID0gewogICAgICBub2RlTmFtZTogbWF0Y2hlc1syXSwKICAgICAgb2JqZWN0TmFtZTogbWF0Y2hlc1szXSwKICAgICAgb2JqZWN0SW5kZXg6IG1hdGNoZXNbNF0sCiAgICAgIHByb3BlcnR5TmFtZTogbWF0Y2hlc1s1XSwKICAgICAgcHJvcGVydHlJbmRleDogbWF0Y2hlc1s2XQogICAgfTsKICAgIGNvbnN0IGxhc3REb3QgPSByZXN1bHRzLm5vZGVOYW1lICYmIHJlc3VsdHMubm9kZU5hbWUubGFzdEluZGV4T2YoIi4iKTsKICAgIGlmIChsYXN0RG90ICE9PSB1bmRlZmluZWQgJiYgbGFzdERvdCAhPT0gLTEpIHsKICAgICAgY29uc3Qgb2JqZWN0TmFtZSA9IHJlc3VsdHMubm9kZU5hbWUuc3Vic3RyaW5nKGxhc3REb3QgKyAxKTsKICAgICAgaWYgKF9zdXBwb3J0ZWRPYmplY3ROYW1lcy5pbmRleE9mKG9iamVjdE5hbWUpICE9PSAtMSkgewogICAgICAgIHJlc3VsdHMubm9kZU5hbWUgPSByZXN1bHRzLm5vZGVOYW1lLnN1YnN0cmluZygwLCBsYXN0RG90KTsKICAgICAgICByZXN1bHRzLm9iamVjdE5hbWUgPSBvYmplY3ROYW1lOwogICAgICB9CiAgICB9CiAgICBpZiAocmVzdWx0cy5wcm9wZXJ0eU5hbWUgPT09IG51bGwgfHwgcmVzdWx0cy5wcm9wZXJ0eU5hbWUubGVuZ3RoID09PSAwKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBjYW4gbm90IHBhcnNlIHByb3BlcnR5TmFtZSBmcm9tIHRyYWNrTmFtZTogIiArIHRyYWNrTmFtZSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9CiAgc3RhdGljIGZpbmROb2RlKHJvb3QsIG5vZGVOYW1lKSB7CiAgICBpZiAobm9kZU5hbWUgPT09IHVuZGVmaW5lZCB8fCBub2RlTmFtZSA9PT0gIiIgfHwgbm9kZU5hbWUgPT09ICIuIiB8fCBub2RlTmFtZSA9PT0gLTEgfHwgbm9kZU5hbWUgPT09IHJvb3QubmFtZSB8fCBub2RlTmFtZSA9PT0gcm9vdC51dWlkKSB7CiAgICAgIHJldHVybiByb290OwogICAgfQogICAgaWYgKHJvb3Quc2tlbGV0b24pIHsKICAgICAgY29uc3QgYm9uZSA9IHJvb3Quc2tlbGV0b24uZ2V0Qm9uZUJ5TmFtZShub2RlTmFtZSk7CiAgICAgIGlmIChib25lICE9PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm4gYm9uZTsKICAgICAgfQogICAgfQogICAgaWYgKHJvb3QuY2hpbGRyZW4pIHsKICAgICAgY29uc3Qgc2VhcmNoTm9kZVN1YnRyZWUgPSBmdW5jdGlvbihjaGlsZHJlbikgewogICAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gY2hpbGRyZW5baV07CiAgICAgICAgICBpZiAoY2hpbGROb2RlLm5hbWUgPT09IG5vZGVOYW1lIHx8IGNoaWxkTm9kZS51dWlkID09PSBub2RlTmFtZSkgewogICAgICAgICAgICByZXR1cm4gY2hpbGROb2RlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgcmVzdWx0ID0gc2VhcmNoTm9kZVN1YnRyZWUoY2hpbGROb2RlLmNoaWxkcmVuKTsKICAgICAgICAgIGlmIChyZXN1bHQpCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9OwogICAgICBjb25zdCBzdWJUcmVlTm9kZSA9IHNlYXJjaE5vZGVTdWJ0cmVlKHJvb3QuY2hpbGRyZW4pOwogICAgICBpZiAoc3ViVHJlZU5vZGUpIHsKICAgICAgICByZXR1cm4gc3ViVHJlZU5vZGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBfZ2V0VmFsdWVfdW5hdmFpbGFibGUoKSB7fQogIF9zZXRWYWx1ZV91bmF2YWlsYWJsZSgpIHt9CiAgX2dldFZhbHVlX2RpcmVjdChidWZmZXIsIG9mZnNldCkgewogICAgYnVmZmVyW29mZnNldF0gPSB0aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV07CiAgfQogIF9nZXRWYWx1ZV9hcnJheShidWZmZXIsIG9mZnNldCkgewogICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5OwogICAgZm9yIChsZXQgaSA9IDAsIG4gPSBzb3VyY2UubGVuZ3RoO2kgIT09IG47ICsraSkgewogICAgICBidWZmZXJbb2Zmc2V0KytdID0gc291cmNlW2ldOwogICAgfQogIH0KICBfZ2V0VmFsdWVfYXJyYXlFbGVtZW50KGJ1ZmZlciwgb2Zmc2V0KSB7CiAgICBidWZmZXJbb2Zmc2V0XSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdOwogIH0KICBfZ2V0VmFsdWVfdG9BcnJheShidWZmZXIsIG9mZnNldCkgewogICAgdGhpcy5yZXNvbHZlZFByb3BlcnR5LnRvQXJyYXkoYnVmZmVyLCBvZmZzZXQpOwogIH0KICBfc2V0VmFsdWVfZGlyZWN0KGJ1ZmZlciwgb2Zmc2V0KSB7CiAgICB0aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV0gPSBidWZmZXJbb2Zmc2V0XTsKICB9CiAgX3NldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZShidWZmZXIsIG9mZnNldCkgewogICAgdGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdID0gYnVmZmVyW29mZnNldF07CiAgICB0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgfQogIF9zZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZShidWZmZXIsIG9mZnNldCkgewogICAgdGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdID0gYnVmZmVyW29mZnNldF07CiAgICB0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTsKICB9CiAgX3NldFZhbHVlX2FycmF5KGJ1ZmZlciwgb2Zmc2V0KSB7CiAgICBjb25zdCBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5OwogICAgZm9yIChsZXQgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDtpICE9PSBuOyArK2kpIHsKICAgICAgZGVzdFtpXSA9IGJ1ZmZlcltvZmZzZXQrK107CiAgICB9CiAgfQogIF9zZXRWYWx1ZV9hcnJheV9zZXROZWVkc1VwZGF0ZShidWZmZXIsIG9mZnNldCkgewogICAgY29uc3QgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTsKICAgIGZvciAobGV0IGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7aSAhPT0gbjsgKytpKSB7CiAgICAgIGRlc3RbaV0gPSBidWZmZXJbb2Zmc2V0KytdOwogICAgfQogICAgdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlOwogIH0KICBfc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZShidWZmZXIsIG9mZnNldCkgewogICAgY29uc3QgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTsKICAgIGZvciAobGV0IGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7aSAhPT0gbjsgKytpKSB7CiAgICAgIGRlc3RbaV0gPSBidWZmZXJbb2Zmc2V0KytdOwogICAgfQogICAgdGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7CiAgfQogIF9zZXRWYWx1ZV9hcnJheUVsZW1lbnQoYnVmZmVyLCBvZmZzZXQpIHsKICAgIHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdID0gYnVmZmVyW29mZnNldF07CiAgfQogIF9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUoYnVmZmVyLCBvZmZzZXQpIHsKICAgIHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdID0gYnVmZmVyW29mZnNldF07CiAgICB0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgfQogIF9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZShidWZmZXIsIG9mZnNldCkgewogICAgdGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF0gPSBidWZmZXJbb2Zmc2V0XTsKICAgIHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlOwogIH0KICBfc2V0VmFsdWVfZnJvbUFycmF5KGJ1ZmZlciwgb2Zmc2V0KSB7CiAgICB0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KGJ1ZmZlciwgb2Zmc2V0KTsKICB9CiAgX3NldFZhbHVlX2Zyb21BcnJheV9zZXROZWVkc1VwZGF0ZShidWZmZXIsIG9mZnNldCkgewogICAgdGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheShidWZmZXIsIG9mZnNldCk7CiAgICB0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgfQogIF9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZShidWZmZXIsIG9mZnNldCkgewogICAgdGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheShidWZmZXIsIG9mZnNldCk7CiAgICB0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTsKICB9CiAgX2dldFZhbHVlX3VuYm91bmQodGFyZ2V0QXJyYXksIG9mZnNldCkgewogICAgdGhpcy5iaW5kKCk7CiAgICB0aGlzLmdldFZhbHVlKHRhcmdldEFycmF5LCBvZmZzZXQpOwogIH0KICBfc2V0VmFsdWVfdW5ib3VuZChzb3VyY2VBcnJheSwgb2Zmc2V0KSB7CiAgICB0aGlzLmJpbmQoKTsKICAgIHRoaXMuc2V0VmFsdWUoc291cmNlQXJyYXksIG9mZnNldCk7CiAgfQogIGJpbmQoKSB7CiAgICBsZXQgdGFyZ2V0T2JqZWN0ID0gdGhpcy5ub2RlOwogICAgY29uc3QgcGFyc2VkUGF0aCA9IHRoaXMucGFyc2VkUGF0aDsKICAgIGNvbnN0IG9iamVjdE5hbWUgPSBwYXJzZWRQYXRoLm9iamVjdE5hbWU7CiAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBwYXJzZWRQYXRoLnByb3BlcnR5TmFtZTsKICAgIGxldCBwcm9wZXJ0eUluZGV4ID0gcGFyc2VkUGF0aC5wcm9wZXJ0eUluZGV4OwogICAgaWYgKCF0YXJnZXRPYmplY3QpIHsKICAgICAgdGFyZ2V0T2JqZWN0ID0gUHJvcGVydHlCaW5kaW5nLmZpbmROb2RlKHRoaXMucm9vdE5vZGUsIHBhcnNlZFBhdGgubm9kZU5hbWUpOwogICAgICB0aGlzLm5vZGUgPSB0YXJnZXRPYmplY3Q7CiAgICB9CiAgICB0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5hdmFpbGFibGU7CiAgICB0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5hdmFpbGFibGU7CiAgICBpZiAoIXRhcmdldE9iamVjdCkgewogICAgICBjb25zb2xlLndhcm4oIlRIUkVFLlByb3BlcnR5QmluZGluZzogTm8gdGFyZ2V0IG5vZGUgZm91bmQgZm9yIHRyYWNrOiAiICsgdGhpcy5wYXRoICsgIi4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG9iamVjdE5hbWUpIHsKICAgICAgbGV0IG9iamVjdEluZGV4ID0gcGFyc2VkUGF0aC5vYmplY3RJbmRleDsKICAgICAgc3dpdGNoIChvYmplY3ROYW1lKSB7CiAgICAgICAgY2FzZSAibWF0ZXJpYWxzIjoKICAgICAgICAgIGlmICghdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFsLiIsIHRoaXMpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHMpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWF0ZXJpYWxzIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFscyBhcnJheS4iLCB0aGlzKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsLm1hdGVyaWFsczsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImJvbmVzIjoKICAgICAgICAgIGlmICghdGFyZ2V0T2JqZWN0LnNrZWxldG9uKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLiIsIHRoaXMpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICB0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Quc2tlbGV0b24uYm9uZXM7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgdGFyZ2V0T2JqZWN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICh0YXJnZXRPYmplY3RbaV0ubmFtZSA9PT0gb2JqZWN0SW5kZXgpIHsKICAgICAgICAgICAgICBvYmplY3RJbmRleCA9IGk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIm1hcCI6CiAgICAgICAgICBpZiAoIm1hcCIgaW4gdGFyZ2V0T2JqZWN0KSB7CiAgICAgICAgICAgIHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5tYXA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCF0YXJnZXRPYmplY3QubWF0ZXJpYWwpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuIiwgdGhpcyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsLm1hcCkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXAgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWFwLiIsIHRoaXMpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICB0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3QubWF0ZXJpYWwubWFwOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGlmICh0YXJnZXRPYmplY3Rbb2JqZWN0TmFtZV0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLiIsIHRoaXMpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICB0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Rbb2JqZWN0TmFtZV07CiAgICAgIH0KICAgICAgaWYgKG9iamVjdEluZGV4ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBpZiAodGFyZ2V0T2JqZWN0W29iamVjdEluZGV4XSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuIiwgdGhpcywgdGFyZ2V0T2JqZWN0KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0W29iamVjdEluZGV4XTsKICAgICAgfQogICAgfQogICAgY29uc3Qgbm9kZVByb3BlcnR5ID0gdGFyZ2V0T2JqZWN0W3Byb3BlcnR5TmFtZV07CiAgICBpZiAobm9kZVByb3BlcnR5ID09PSB1bmRlZmluZWQpIHsKICAgICAgY29uc3Qgbm9kZU5hbWUgPSBwYXJzZWRQYXRoLm5vZGVOYW1lOwogICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgcHJvcGVydHkgZm9yIHRyYWNrOiAiICsgbm9kZU5hbWUgKyAiLiIgKyBwcm9wZXJ0eU5hbWUgKyAiIGJ1dCBpdCB3YXNuJ3QgZm91bmQuIiwgdGFyZ2V0T2JqZWN0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTm9uZTsKICAgIHRoaXMudGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0OwogICAgaWYgKHRhcmdldE9iamVjdC5pc01hdGVyaWFsID09PSB0cnVlKSB7CiAgICAgIHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTmVlZHNVcGRhdGU7CiAgICB9IGVsc2UgaWYgKHRhcmdldE9iamVjdC5pc09iamVjdDNEID09PSB0cnVlKSB7CiAgICAgIHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTWF0cml4V29ybGROZWVkc1VwZGF0ZTsKICAgIH0KICAgIGxldCBiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuRGlyZWN0OwogICAgaWYgKHByb3BlcnR5SW5kZXggIT09IHVuZGVmaW5lZCkgewogICAgICBpZiAocHJvcGVydHlOYW1lID09PSAibW9ycGhUYXJnZXRJbmZsdWVuY2VzIikgewogICAgICAgIGlmICghdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5KSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS4iLCB0aGlzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCF0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuIiwgdGhpcyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICh0YXJnZXRPYmplY3QubW9ycGhUYXJnZXREaWN0aW9uYXJ5W3Byb3BlcnR5SW5kZXhdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHByb3BlcnR5SW5kZXggPSB0YXJnZXRPYmplY3QubW9ycGhUYXJnZXREaWN0aW9uYXJ5W3Byb3BlcnR5SW5kZXhdOwogICAgICAgIH0KICAgICAgfQogICAgICBiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuQXJyYXlFbGVtZW50OwogICAgICB0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7CiAgICAgIHRoaXMucHJvcGVydHlJbmRleCA9IHByb3BlcnR5SW5kZXg7CiAgICB9IGVsc2UgaWYgKG5vZGVQcm9wZXJ0eS5mcm9tQXJyYXkgIT09IHVuZGVmaW5lZCAmJiBub2RlUHJvcGVydHkudG9BcnJheSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheTsKICAgICAgdGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5OwogICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG5vZGVQcm9wZXJ0eSkpIHsKICAgICAgYmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5OwogICAgICB0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKICAgIH0KICAgIHRoaXMuZ2V0VmFsdWUgPSB0aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbYmluZGluZ1R5cGVdOwogICAgdGhpcy5zZXRWYWx1ZSA9IHRoaXMuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmdbYmluZGluZ1R5cGVdW3ZlcnNpb25pbmddOwogIH0KICB1bmJpbmQoKSB7CiAgICB0aGlzLm5vZGUgPSBudWxsOwogICAgdGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYm91bmQ7CiAgICB0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5ib3VuZDsKICB9Cn0KCmNsYXNzIEFuaW1hdGlvbk9iamVjdEdyb3VwIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuaXNBbmltYXRpb25PYmplY3RHcm91cCA9IHRydWU7CiAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTsKICAgIHRoaXMuX29iamVjdHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgdGhpcy5uQ2FjaGVkT2JqZWN0c18gPSAwOwogICAgY29uc3QgaW5kaWNlcyA9IHt9OwogICAgdGhpcy5faW5kaWNlc0J5VVVJRCA9IGluZGljZXM7CiAgICBmb3IgKGxldCBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7aSAhPT0gbjsgKytpKSB7CiAgICAgIGluZGljZXNbYXJndW1lbnRzW2ldLnV1aWRdID0gaTsKICAgIH0KICAgIHRoaXMuX3BhdGhzID0gW107CiAgICB0aGlzLl9wYXJzZWRQYXRocyA9IFtdOwogICAgdGhpcy5fYmluZGluZ3MgPSBbXTsKICAgIHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCA9IHt9OwogICAgY29uc3Qgc2NvcGUgPSB0aGlzOwogICAgdGhpcy5zdGF0cyA9IHsKICAgICAgb2JqZWN0czogewogICAgICAgIGdldCB0b3RhbCgpIHsKICAgICAgICAgIHJldHVybiBzY29wZS5fb2JqZWN0cy5sZW5ndGg7CiAgICAgICAgfSwKICAgICAgICBnZXQgaW5Vc2UoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy50b3RhbCAtIHNjb3BlLm5DYWNoZWRPYmplY3RzXzsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGdldCBiaW5kaW5nc1Blck9iamVjdCgpIHsKICAgICAgICByZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDsKICAgICAgfQogICAgfTsKICB9CiAgYWRkKCkgewogICAgY29uc3Qgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsIGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELCBwYXRocyA9IHRoaXMuX3BhdGhzLCBwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLCBuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7CiAgICBsZXQga25vd25PYmplY3QgPSB1bmRlZmluZWQsIG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsIG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c187CiAgICBmb3IgKGxldCBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7aSAhPT0gbjsgKytpKSB7CiAgICAgIGNvbnN0IG9iamVjdCA9IGFyZ3VtZW50c1tpXSwgdXVpZCA9IG9iamVjdC51dWlkOwogICAgICBsZXQgaW5kZXggPSBpbmRpY2VzQnlVVUlEW3V1aWRdOwogICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkgewogICAgICAgIGluZGV4ID0gbk9iamVjdHMrKzsKICAgICAgICBpbmRpY2VzQnlVVUlEW3V1aWRdID0gaW5kZXg7CiAgICAgICAgb2JqZWN0cy5wdXNoKG9iamVjdCk7CiAgICAgICAgZm9yIChsZXQgaiA9IDAsIG0gPSBuQmluZGluZ3M7aiAhPT0gbTsgKytqKSB7CiAgICAgICAgICBiaW5kaW5nc1tqXS5wdXNoKG5ldyBQcm9wZXJ0eUJpbmRpbmcob2JqZWN0LCBwYXRoc1tqXSwgcGFyc2VkUGF0aHNbal0pKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaW5kZXggPCBuQ2FjaGVkT2JqZWN0cykgewogICAgICAgIGtub3duT2JqZWN0ID0gb2JqZWN0c1tpbmRleF07CiAgICAgICAgY29uc3QgZmlyc3RBY3RpdmVJbmRleCA9IC0tbkNhY2hlZE9iamVjdHMsIGxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzW2ZpcnN0QWN0aXZlSW5kZXhdOwogICAgICAgIGluZGljZXNCeVVVSURbbGFzdENhY2hlZE9iamVjdC51dWlkXSA9IGluZGV4OwogICAgICAgIG9iamVjdHNbaW5kZXhdID0gbGFzdENhY2hlZE9iamVjdDsKICAgICAgICBpbmRpY2VzQnlVVUlEW3V1aWRdID0gZmlyc3RBY3RpdmVJbmRleDsKICAgICAgICBvYmplY3RzW2ZpcnN0QWN0aXZlSW5kZXhdID0gb2JqZWN0OwogICAgICAgIGZvciAobGV0IGogPSAwLCBtID0gbkJpbmRpbmdzO2ogIT09IG07ICsraikgewogICAgICAgICAgY29uc3QgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3Nbal0sIGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbZmlyc3RBY3RpdmVJbmRleF07CiAgICAgICAgICBsZXQgYmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFtpbmRleF07CiAgICAgICAgICBiaW5kaW5nc0ZvclBhdGhbaW5kZXhdID0gbGFzdENhY2hlZDsKICAgICAgICAgIGlmIChiaW5kaW5nID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgYmluZGluZyA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcob2JqZWN0LCBwYXRoc1tqXSwgcGFyc2VkUGF0aHNbal0pOwogICAgICAgICAgfQogICAgICAgICAgYmluZGluZ3NGb3JQYXRoW2ZpcnN0QWN0aXZlSW5kZXhdID0gYmluZGluZzsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob2JqZWN0c1tpbmRleF0gIT09IGtub3duT2JqZWN0KSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uT2JqZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCAiICsgImRldGVjdGVkLiBDbGVhbiB0aGUgY2FjaGVzIG9yIHJlY3JlYXRlIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgd2hlbiByZWxvYWRpbmcgc2NlbmVzLiIpOwogICAgICB9CiAgICB9CiAgICB0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzOwogIH0KICByZW1vdmUoKSB7CiAgICBjb25zdCBvYmplY3RzID0gdGhpcy5fb2JqZWN0cywgaW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsIG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aDsKICAgIGxldCBuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfOwogICAgZm9yIChsZXQgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoO2kgIT09IG47ICsraSkgewogICAgICBjb25zdCBvYmplY3QgPSBhcmd1bWVudHNbaV0sIHV1aWQgPSBvYmplY3QudXVpZCwgaW5kZXggPSBpbmRpY2VzQnlVVUlEW3V1aWRdOwogICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+PSBuQ2FjaGVkT2JqZWN0cykgewogICAgICAgIGNvbnN0IGxhc3RDYWNoZWRJbmRleCA9IG5DYWNoZWRPYmplY3RzKyssIGZpcnN0QWN0aXZlT2JqZWN0ID0gb2JqZWN0c1tsYXN0Q2FjaGVkSW5kZXhdOwogICAgICAgIGluZGljZXNCeVVVSURbZmlyc3RBY3RpdmVPYmplY3QudXVpZF0gPSBpbmRleDsKICAgICAgICBvYmplY3RzW2luZGV4XSA9IGZpcnN0QWN0aXZlT2JqZWN0OwogICAgICAgIGluZGljZXNCeVVVSURbdXVpZF0gPSBsYXN0Q2FjaGVkSW5kZXg7CiAgICAgICAgb2JqZWN0c1tsYXN0Q2FjaGVkSW5kZXhdID0gb2JqZWN0OwogICAgICAgIGZvciAobGV0IGogPSAwLCBtID0gbkJpbmRpbmdzO2ogIT09IG07ICsraikgewogICAgICAgICAgY29uc3QgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3Nbal0sIGZpcnN0QWN0aXZlID0gYmluZGluZ3NGb3JQYXRoW2xhc3RDYWNoZWRJbmRleF0sIGJpbmRpbmcgPSBiaW5kaW5nc0ZvclBhdGhbaW5kZXhdOwogICAgICAgICAgYmluZGluZ3NGb3JQYXRoW2luZGV4XSA9IGZpcnN0QWN0aXZlOwogICAgICAgICAgYmluZGluZ3NGb3JQYXRoW2xhc3RDYWNoZWRJbmRleF0gPSBiaW5kaW5nOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0czsKICB9CiAgdW5jYWNoZSgpIHsKICAgIGNvbnN0IG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLCBpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCwgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncywgbkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoOwogICAgbGV0IG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sIG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGg7CiAgICBmb3IgKGxldCBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7aSAhPT0gbjsgKytpKSB7CiAgICAgIGNvbnN0IG9iamVjdCA9IGFyZ3VtZW50c1tpXSwgdXVpZCA9IG9iamVjdC51dWlkLCBpbmRleCA9IGluZGljZXNCeVVVSURbdXVpZF07CiAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVsZXRlIGluZGljZXNCeVVVSURbdXVpZF07CiAgICAgICAgaWYgKGluZGV4IDwgbkNhY2hlZE9iamVjdHMpIHsKICAgICAgICAgIGNvbnN0IGZpcnN0QWN0aXZlSW5kZXggPSAtLW5DYWNoZWRPYmplY3RzLCBsYXN0Q2FjaGVkT2JqZWN0ID0gb2JqZWN0c1tmaXJzdEFjdGl2ZUluZGV4XSwgbGFzdEluZGV4ID0gLS1uT2JqZWN0cywgbGFzdE9iamVjdCA9IG9iamVjdHNbbGFzdEluZGV4XTsKICAgICAgICAgIGluZGljZXNCeVVVSURbbGFzdENhY2hlZE9iamVjdC51dWlkXSA9IGluZGV4OwogICAgICAgICAgb2JqZWN0c1tpbmRleF0gPSBsYXN0Q2FjaGVkT2JqZWN0OwogICAgICAgICAgaW5kaWNlc0J5VVVJRFtsYXN0T2JqZWN0LnV1aWRdID0gZmlyc3RBY3RpdmVJbmRleDsKICAgICAgICAgIG9iamVjdHNbZmlyc3RBY3RpdmVJbmRleF0gPSBsYXN0T2JqZWN0OwogICAgICAgICAgb2JqZWN0cy5wb3AoKTsKICAgICAgICAgIGZvciAobGV0IGogPSAwLCBtID0gbkJpbmRpbmdzO2ogIT09IG07ICsraikgewogICAgICAgICAgICBjb25zdCBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1tqXSwgbGFzdENhY2hlZCA9IGJpbmRpbmdzRm9yUGF0aFtmaXJzdEFjdGl2ZUluZGV4XSwgbGFzdCA9IGJpbmRpbmdzRm9yUGF0aFtsYXN0SW5kZXhdOwogICAgICAgICAgICBiaW5kaW5nc0ZvclBhdGhbaW5kZXhdID0gbGFzdENhY2hlZDsKICAgICAgICAgICAgYmluZGluZ3NGb3JQYXRoW2ZpcnN0QWN0aXZlSW5kZXhdID0gbGFzdDsKICAgICAgICAgICAgYmluZGluZ3NGb3JQYXRoLnBvcCgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBsYXN0SW5kZXggPSAtLW5PYmplY3RzLCBsYXN0T2JqZWN0ID0gb2JqZWN0c1tsYXN0SW5kZXhdOwogICAgICAgICAgaWYgKGxhc3RJbmRleCA+IDApIHsKICAgICAgICAgICAgaW5kaWNlc0J5VVVJRFtsYXN0T2JqZWN0LnV1aWRdID0gaW5kZXg7CiAgICAgICAgICB9CiAgICAgICAgICBvYmplY3RzW2luZGV4XSA9IGxhc3RPYmplY3Q7CiAgICAgICAgICBvYmplY3RzLnBvcCgpOwogICAgICAgICAgZm9yIChsZXQgaiA9IDAsIG0gPSBuQmluZGluZ3M7aiAhPT0gbTsgKytqKSB7CiAgICAgICAgICAgIGNvbnN0IGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzW2pdOwogICAgICAgICAgICBiaW5kaW5nc0ZvclBhdGhbaW5kZXhdID0gYmluZGluZ3NGb3JQYXRoW2xhc3RJbmRleF07CiAgICAgICAgICAgIGJpbmRpbmdzRm9yUGF0aC5wb3AoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMubkNhY2hlZE9iamVjdHNfID0gbkNhY2hlZE9iamVjdHM7CiAgfQogIHN1YnNjcmliZV8ocGF0aCwgcGFyc2VkUGF0aCkgewogICAgY29uc3QgaW5kaWNlc0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aDsKICAgIGxldCBpbmRleCA9IGluZGljZXNCeVBhdGhbcGF0aF07CiAgICBjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzOwogICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpCiAgICAgIHJldHVybiBiaW5kaW5nc1tpbmRleF07CiAgICBjb25zdCBwYXRocyA9IHRoaXMuX3BhdGhzLCBwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLCBvYmplY3RzID0gdGhpcy5fb2JqZWN0cywgbk9iamVjdHMgPSBvYmplY3RzLmxlbmd0aCwgbkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXywgYmluZGluZ3NGb3JQYXRoID0gbmV3IEFycmF5KG5PYmplY3RzKTsKICAgIGluZGV4ID0gYmluZGluZ3MubGVuZ3RoOwogICAgaW5kaWNlc0J5UGF0aFtwYXRoXSA9IGluZGV4OwogICAgcGF0aHMucHVzaChwYXRoKTsKICAgIHBhcnNlZFBhdGhzLnB1c2gocGFyc2VkUGF0aCk7CiAgICBiaW5kaW5ncy5wdXNoKGJpbmRpbmdzRm9yUGF0aCk7CiAgICBmb3IgKGxldCBpID0gbkNhY2hlZE9iamVjdHMsIG4gPSBvYmplY3RzLmxlbmd0aDtpICE9PSBuOyArK2kpIHsKICAgICAgY29uc3Qgb2JqZWN0ID0gb2JqZWN0c1tpXTsKICAgICAgYmluZGluZ3NGb3JQYXRoW2ldID0gbmV3IFByb3BlcnR5QmluZGluZyhvYmplY3QsIHBhdGgsIHBhcnNlZFBhdGgpOwogICAgfQogICAgcmV0dXJuIGJpbmRpbmdzRm9yUGF0aDsKICB9CiAgdW5zdWJzY3JpYmVfKHBhdGgpIHsKICAgIGNvbnN0IGluZGljZXNCeVBhdGggPSB0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsIGluZGV4ID0gaW5kaWNlc0J5UGF0aFtwYXRoXTsKICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy5fcGF0aHMsIHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsIGxhc3RCaW5kaW5nc0luZGV4ID0gYmluZGluZ3MubGVuZ3RoIC0gMSwgbGFzdEJpbmRpbmdzID0gYmluZGluZ3NbbGFzdEJpbmRpbmdzSW5kZXhdLCBsYXN0QmluZGluZ3NQYXRoID0gcGF0aFtsYXN0QmluZGluZ3NJbmRleF07CiAgICAgIGluZGljZXNCeVBhdGhbbGFzdEJpbmRpbmdzUGF0aF0gPSBpbmRleDsKICAgICAgYmluZGluZ3NbaW5kZXhdID0gbGFzdEJpbmRpbmdzOwogICAgICBiaW5kaW5ncy5wb3AoKTsKICAgICAgcGFyc2VkUGF0aHNbaW5kZXhdID0gcGFyc2VkUGF0aHNbbGFzdEJpbmRpbmdzSW5kZXhdOwogICAgICBwYXJzZWRQYXRocy5wb3AoKTsKICAgICAgcGF0aHNbaW5kZXhdID0gcGF0aHNbbGFzdEJpbmRpbmdzSW5kZXhdOwogICAgICBwYXRocy5wb3AoKTsKICAgIH0KICB9Cn0KCmNsYXNzIEFuaW1hdGlvbkFjdGlvbiB7CiAgY29uc3RydWN0b3IobWl4ZXIsIGNsaXAsIGxvY2FsUm9vdCA9IG51bGwsIGJsZW5kTW9kZSA9IGNsaXAuYmxlbmRNb2RlKSB7CiAgICB0aGlzLl9taXhlciA9IG1peGVyOwogICAgdGhpcy5fY2xpcCA9IGNsaXA7CiAgICB0aGlzLl9sb2NhbFJvb3QgPSBsb2NhbFJvb3Q7CiAgICB0aGlzLmJsZW5kTW9kZSA9IGJsZW5kTW9kZTsKICAgIGNvbnN0IHRyYWNrcyA9IGNsaXAudHJhY2tzLCBuVHJhY2tzID0gdHJhY2tzLmxlbmd0aCwgaW50ZXJwb2xhbnRzID0gbmV3IEFycmF5KG5UcmFja3MpOwogICAgY29uc3QgaW50ZXJwb2xhbnRTZXR0aW5ncyA9IHsKICAgICAgZW5kaW5nU3RhcnQ6IFplcm9DdXJ2YXR1cmVFbmRpbmcsCiAgICAgIGVuZGluZ0VuZDogWmVyb0N1cnZhdHVyZUVuZGluZwogICAgfTsKICAgIGZvciAobGV0IGkgPSAwO2kgIT09IG5UcmFja3M7ICsraSkgewogICAgICBjb25zdCBpbnRlcnBvbGFudCA9IHRyYWNrc1tpXS5jcmVhdGVJbnRlcnBvbGFudChudWxsKTsKICAgICAgaW50ZXJwb2xhbnRzW2ldID0gaW50ZXJwb2xhbnQ7CiAgICAgIGludGVycG9sYW50LnNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5nczsKICAgIH0KICAgIHRoaXMuX2ludGVycG9sYW50U2V0dGluZ3MgPSBpbnRlcnBvbGFudFNldHRpbmdzOwogICAgdGhpcy5faW50ZXJwb2xhbnRzID0gaW50ZXJwb2xhbnRzOwogICAgdGhpcy5fcHJvcGVydHlCaW5kaW5ncyA9IG5ldyBBcnJheShuVHJhY2tzKTsKICAgIHRoaXMuX2NhY2hlSW5kZXggPSBudWxsOwogICAgdGhpcy5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7CiAgICB0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IG51bGw7CiAgICB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7CiAgICB0aGlzLmxvb3AgPSBMb29wUmVwZWF0OwogICAgdGhpcy5fbG9vcENvdW50ID0gLTE7CiAgICB0aGlzLl9zdGFydFRpbWUgPSBudWxsOwogICAgdGhpcy50aW1lID0gMDsKICAgIHRoaXMudGltZVNjYWxlID0gMTsKICAgIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IDE7CiAgICB0aGlzLndlaWdodCA9IDE7CiAgICB0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSAxOwogICAgdGhpcy5yZXBldGl0aW9ucyA9IEluZmluaXR5OwogICAgdGhpcy5wYXVzZWQgPSBmYWxzZTsKICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7CiAgICB0aGlzLmNsYW1wV2hlbkZpbmlzaGVkID0gZmFsc2U7CiAgICB0aGlzLnplcm9TbG9wZUF0U3RhcnQgPSB0cnVlOwogICAgdGhpcy56ZXJvU2xvcGVBdEVuZCA9IHRydWU7CiAgfQogIHBsYXkoKSB7CiAgICB0aGlzLl9taXhlci5fYWN0aXZhdGVBY3Rpb24odGhpcyk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgc3RvcCgpIHsKICAgIHRoaXMuX21peGVyLl9kZWFjdGl2YXRlQWN0aW9uKHRoaXMpOwogICAgcmV0dXJuIHRoaXMucmVzZXQoKTsKICB9CiAgcmVzZXQoKSB7CiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlOwogICAgdGhpcy5lbmFibGVkID0gdHJ1ZTsKICAgIHRoaXMudGltZSA9IDA7CiAgICB0aGlzLl9sb29wQ291bnQgPSAtMTsKICAgIHRoaXMuX3N0YXJ0VGltZSA9IG51bGw7CiAgICByZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKTsKICB9CiAgaXNSdW5uaW5nKCkgewogICAgcmV0dXJuIHRoaXMuZW5hYmxlZCAmJiAhdGhpcy5wYXVzZWQgJiYgdGhpcy50aW1lU2NhbGUgIT09IDAgJiYgdGhpcy5fc3RhcnRUaW1lID09PSBudWxsICYmIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbih0aGlzKTsKICB9CiAgaXNTY2hlZHVsZWQoKSB7CiAgICByZXR1cm4gdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpOwogIH0KICBzdGFydEF0KHRpbWUpIHsKICAgIHRoaXMuX3N0YXJ0VGltZSA9IHRpbWU7CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2V0TG9vcChtb2RlLCByZXBldGl0aW9ucykgewogICAgdGhpcy5sb29wID0gbW9kZTsKICAgIHRoaXMucmVwZXRpdGlvbnMgPSByZXBldGl0aW9uczsKICAgIHJldHVybiB0aGlzOwogIH0KICBzZXRFZmZlY3RpdmVXZWlnaHQod2VpZ2h0KSB7CiAgICB0aGlzLndlaWdodCA9IHdlaWdodDsKICAgIHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHRoaXMuZW5hYmxlZCA/IHdlaWdodCA6IDA7CiAgICByZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCk7CiAgfQogIGdldEVmZmVjdGl2ZVdlaWdodCgpIHsKICAgIHJldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHQ7CiAgfQogIGZhZGVJbihkdXJhdGlvbikgewogICAgcmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKGR1cmF0aW9uLCAwLCAxKTsKICB9CiAgZmFkZU91dChkdXJhdGlvbikgewogICAgcmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKGR1cmF0aW9uLCAxLCAwKTsKICB9CiAgY3Jvc3NGYWRlRnJvbShmYWRlT3V0QWN0aW9uLCBkdXJhdGlvbiwgd2FycCkgewogICAgZmFkZU91dEFjdGlvbi5mYWRlT3V0KGR1cmF0aW9uKTsKICAgIHRoaXMuZmFkZUluKGR1cmF0aW9uKTsKICAgIGlmICh3YXJwKSB7CiAgICAgIGNvbnN0IGZhZGVJbkR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbiwgZmFkZU91dER1cmF0aW9uID0gZmFkZU91dEFjdGlvbi5fY2xpcC5kdXJhdGlvbiwgc3RhcnRFbmRSYXRpbyA9IGZhZGVPdXREdXJhdGlvbiAvIGZhZGVJbkR1cmF0aW9uLCBlbmRTdGFydFJhdGlvID0gZmFkZUluRHVyYXRpb24gLyBmYWRlT3V0RHVyYXRpb247CiAgICAgIGZhZGVPdXRBY3Rpb24ud2FycCgxLCBzdGFydEVuZFJhdGlvLCBkdXJhdGlvbik7CiAgICAgIHRoaXMud2FycChlbmRTdGFydFJhdGlvLCAxLCBkdXJhdGlvbik7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CiAgY3Jvc3NGYWRlVG8oZmFkZUluQWN0aW9uLCBkdXJhdGlvbiwgd2FycCkgewogICAgcmV0dXJuIGZhZGVJbkFjdGlvbi5jcm9zc0ZhZGVGcm9tKHRoaXMsIGR1cmF0aW9uLCB3YXJwKTsKICB9CiAgc3RvcEZhZGluZygpIHsKICAgIGNvbnN0IHdlaWdodEludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7CiAgICBpZiAod2VpZ2h0SW50ZXJwb2xhbnQgIT09IG51bGwpIHsKICAgICAgdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBudWxsOwogICAgICB0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQod2VpZ2h0SW50ZXJwb2xhbnQpOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldEVmZmVjdGl2ZVRpbWVTY2FsZSh0aW1lU2NhbGUpIHsKICAgIHRoaXMudGltZVNjYWxlID0gdGltZVNjYWxlOwogICAgdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gdGhpcy5wYXVzZWQgPyAwIDogdGltZVNjYWxlOwogICAgcmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTsKICB9CiAgZ2V0RWZmZWN0aXZlVGltZVNjYWxlKCkgewogICAgcmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZTsKICB9CiAgc2V0RHVyYXRpb24oZHVyYXRpb24pIHsKICAgIHRoaXMudGltZVNjYWxlID0gdGhpcy5fY2xpcC5kdXJhdGlvbiAvIGR1cmF0aW9uOwogICAgcmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTsKICB9CiAgc3luY1dpdGgoYWN0aW9uKSB7CiAgICB0aGlzLnRpbWUgPSBhY3Rpb24udGltZTsKICAgIHRoaXMudGltZVNjYWxlID0gYWN0aW9uLnRpbWVTY2FsZTsKICAgIHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7CiAgfQogIGhhbHQoZHVyYXRpb24pIHsKICAgIHJldHVybiB0aGlzLndhcnAodGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlLCAwLCBkdXJhdGlvbik7CiAgfQogIHdhcnAoc3RhcnRUaW1lU2NhbGUsIGVuZFRpbWVTY2FsZSwgZHVyYXRpb24pIHsKICAgIGNvbnN0IG1peGVyID0gdGhpcy5fbWl4ZXIsIG5vdzIgPSBtaXhlci50aW1lLCB0aW1lU2NhbGUgPSB0aGlzLnRpbWVTY2FsZTsKICAgIGxldCBpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50OwogICAgaWYgKGludGVycG9sYW50ID09PSBudWxsKSB7CiAgICAgIGludGVycG9sYW50ID0gbWl4ZXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKTsKICAgICAgdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudDsKICAgIH0KICAgIGNvbnN0IHsgcGFyYW1ldGVyUG9zaXRpb25zOiB0aW1lcywgc2FtcGxlVmFsdWVzOiB2YWx1ZXMgfSA9IGludGVycG9sYW50OwogICAgdGltZXNbMF0gPSBub3cyOwogICAgdGltZXNbMV0gPSBub3cyICsgZHVyYXRpb247CiAgICB2YWx1ZXNbMF0gPSBzdGFydFRpbWVTY2FsZSAvIHRpbWVTY2FsZTsKICAgIHZhbHVlc1sxXSA9IGVuZFRpbWVTY2FsZSAvIHRpbWVTY2FsZTsKICAgIHJldHVybiB0aGlzOwogIH0KICBzdG9wV2FycGluZygpIHsKICAgIGNvbnN0IHRpbWVTY2FsZUludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7CiAgICBpZiAodGltZVNjYWxlSW50ZXJwb2xhbnQgIT09IG51bGwpIHsKICAgICAgdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsOwogICAgICB0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQodGltZVNjYWxlSW50ZXJwb2xhbnQpOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIGdldE1peGVyKCkgewogICAgcmV0dXJuIHRoaXMuX21peGVyOwogIH0KICBnZXRDbGlwKCkgewogICAgcmV0dXJuIHRoaXMuX2NsaXA7CiAgfQogIGdldFJvb3QoKSB7CiAgICByZXR1cm4gdGhpcy5fbG9jYWxSb290IHx8IHRoaXMuX21peGVyLl9yb290OwogIH0KICBfdXBkYXRlKHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4KSB7CiAgICBpZiAoIXRoaXMuZW5hYmxlZCkgewogICAgICB0aGlzLl91cGRhdGVXZWlnaHQodGltZSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHN0YXJ0VGltZSA9IHRoaXMuX3N0YXJ0VGltZTsKICAgIGlmIChzdGFydFRpbWUgIT09IG51bGwpIHsKICAgICAgY29uc3QgdGltZVJ1bm5pbmcgPSAodGltZSAtIHN0YXJ0VGltZSkgKiB0aW1lRGlyZWN0aW9uOwogICAgICBpZiAodGltZVJ1bm5pbmcgPCAwIHx8IHRpbWVEaXJlY3Rpb24gPT09IDApIHsKICAgICAgICBkZWx0YVRpbWUgPSAwOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IG51bGw7CiAgICAgICAgZGVsdGFUaW1lID0gdGltZURpcmVjdGlvbiAqIHRpbWVSdW5uaW5nOwogICAgICB9CiAgICB9CiAgICBkZWx0YVRpbWUgKj0gdGhpcy5fdXBkYXRlVGltZVNjYWxlKHRpbWUpOwogICAgY29uc3QgY2xpcFRpbWUgPSB0aGlzLl91cGRhdGVUaW1lKGRlbHRhVGltZSk7CiAgICBjb25zdCB3ZWlnaHQgPSB0aGlzLl91cGRhdGVXZWlnaHQodGltZSk7CiAgICBpZiAod2VpZ2h0ID4gMCkgewogICAgICBjb25zdCBpbnRlcnBvbGFudHMgPSB0aGlzLl9pbnRlcnBvbGFudHM7CiAgICAgIGNvbnN0IHByb3BlcnR5TWl4ZXJzID0gdGhpcy5fcHJvcGVydHlCaW5kaW5nczsKICAgICAgc3dpdGNoICh0aGlzLmJsZW5kTW9kZSkgewogICAgICAgIGNhc2UgQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGU6CiAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbSA9IGludGVycG9sYW50cy5sZW5ndGg7aiAhPT0gbTsgKytqKSB7CiAgICAgICAgICAgIGludGVycG9sYW50c1tqXS5ldmFsdWF0ZShjbGlwVGltZSk7CiAgICAgICAgICAgIHByb3BlcnR5TWl4ZXJzW2pdLmFjY3VtdWxhdGVBZGRpdGl2ZSh3ZWlnaHQpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBOb3JtYWxBbmltYXRpb25CbGVuZE1vZGU6CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGZvciAobGV0IGogPSAwLCBtID0gaW50ZXJwb2xhbnRzLmxlbmd0aDtqICE9PSBtOyArK2opIHsKICAgICAgICAgICAgaW50ZXJwb2xhbnRzW2pdLmV2YWx1YXRlKGNsaXBUaW1lKTsKICAgICAgICAgICAgcHJvcGVydHlNaXhlcnNbal0uYWNjdW11bGF0ZShhY2N1SW5kZXgsIHdlaWdodCk7CiAgICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgX3VwZGF0ZVdlaWdodCh0aW1lKSB7CiAgICBsZXQgd2VpZ2h0ID0gMDsKICAgIGlmICh0aGlzLmVuYWJsZWQpIHsKICAgICAgd2VpZ2h0ID0gdGhpcy53ZWlnaHQ7CiAgICAgIGNvbnN0IGludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7CiAgICAgIGlmIChpbnRlcnBvbGFudCAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSh0aW1lKVswXTsKICAgICAgICB3ZWlnaHQgKj0gaW50ZXJwb2xhbnRWYWx1ZTsKICAgICAgICBpZiAodGltZSA+IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9uc1sxXSkgewogICAgICAgICAgdGhpcy5zdG9wRmFkaW5nKCk7CiAgICAgICAgICBpZiAoaW50ZXJwb2xhbnRWYWx1ZSA9PT0gMCkgewogICAgICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHdlaWdodDsKICAgIHJldHVybiB3ZWlnaHQ7CiAgfQogIF91cGRhdGVUaW1lU2NhbGUodGltZSkgewogICAgbGV0IHRpbWVTY2FsZSA9IDA7CiAgICBpZiAoIXRoaXMucGF1c2VkKSB7CiAgICAgIHRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlOwogICAgICBjb25zdCBpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50OwogICAgICBpZiAoaW50ZXJwb2xhbnQgIT09IG51bGwpIHsKICAgICAgICBjb25zdCBpbnRlcnBvbGFudFZhbHVlID0gaW50ZXJwb2xhbnQuZXZhbHVhdGUodGltZSlbMF07CiAgICAgICAgdGltZVNjYWxlICo9IGludGVycG9sYW50VmFsdWU7CiAgICAgICAgaWYgKHRpbWUgPiBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0pIHsKICAgICAgICAgIHRoaXMuc3RvcFdhcnBpbmcoKTsKICAgICAgICAgIGlmICh0aW1lU2NhbGUgPT09IDApIHsKICAgICAgICAgICAgdGhpcy5wYXVzZWQgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy50aW1lU2NhbGUgPSB0aW1lU2NhbGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aW1lU2NhbGU7CiAgICByZXR1cm4gdGltZVNjYWxlOwogIH0KICBfdXBkYXRlVGltZShkZWx0YVRpbWUpIHsKICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbjsKICAgIGNvbnN0IGxvb3AgPSB0aGlzLmxvb3A7CiAgICBsZXQgdGltZSA9IHRoaXMudGltZSArIGRlbHRhVGltZTsKICAgIGxldCBsb29wQ291bnQgPSB0aGlzLl9sb29wQ291bnQ7CiAgICBjb25zdCBwaW5nUG9uZyA9IGxvb3AgPT09IExvb3BQaW5nUG9uZzsKICAgIGlmIChkZWx0YVRpbWUgPT09IDApIHsKICAgICAgaWYgKGxvb3BDb3VudCA9PT0gLTEpCiAgICAgICAgcmV0dXJuIHRpbWU7CiAgICAgIHJldHVybiBwaW5nUG9uZyAmJiAobG9vcENvdW50ICYgMSkgPT09IDEgPyBkdXJhdGlvbiAtIHRpbWUgOiB0aW1lOwogICAgfQogICAgaWYgKGxvb3AgPT09IExvb3BPbmNlKSB7CiAgICAgIGlmIChsb29wQ291bnQgPT09IC0xKSB7CiAgICAgICAgdGhpcy5fbG9vcENvdW50ID0gMDsKICAgICAgICB0aGlzLl9zZXRFbmRpbmdzKHRydWUsIHRydWUsIGZhbHNlKTsKICAgICAgfQogICAgICBoYW5kbGVfc3RvcDogewogICAgICAgIGlmICh0aW1lID49IGR1cmF0aW9uKSB7CiAgICAgICAgICB0aW1lID0gZHVyYXRpb247CiAgICAgICAgfSBlbHNlIGlmICh0aW1lIDwgMCkgewogICAgICAgICAgdGltZSA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMudGltZSA9IHRpbWU7CiAgICAgICAgICBicmVhayBoYW5kbGVfc3RvcDsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuY2xhbXBXaGVuRmluaXNoZWQpCiAgICAgICAgICB0aGlzLnBhdXNlZCA9IHRydWU7CiAgICAgICAgZWxzZQogICAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy50aW1lID0gdGltZTsKICAgICAgICB0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHsKICAgICAgICAgIHR5cGU6ICJmaW5pc2hlZCIsCiAgICAgICAgICBhY3Rpb246IHRoaXMsCiAgICAgICAgICBkaXJlY3Rpb246IGRlbHRhVGltZSA8IDAgPyAtMSA6IDEKICAgICAgICB9KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGxvb3BDb3VudCA9PT0gLTEpIHsKICAgICAgICBpZiAoZGVsdGFUaW1lID49IDApIHsKICAgICAgICAgIGxvb3BDb3VudCA9IDA7CiAgICAgICAgICB0aGlzLl9zZXRFbmRpbmdzKHRydWUsIHRoaXMucmVwZXRpdGlvbnMgPT09IDAsIHBpbmdQb25nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5fc2V0RW5kaW5ncyh0aGlzLnJlcGV0aXRpb25zID09PSAwLCB0cnVlLCBwaW5nUG9uZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aW1lID49IGR1cmF0aW9uIHx8IHRpbWUgPCAwKSB7CiAgICAgICAgY29uc3QgbG9vcERlbHRhID0gTWF0aC5mbG9vcih0aW1lIC8gZHVyYXRpb24pOwogICAgICAgIHRpbWUgLT0gZHVyYXRpb24gKiBsb29wRGVsdGE7CiAgICAgICAgbG9vcENvdW50ICs9IE1hdGguYWJzKGxvb3BEZWx0YSk7CiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucmVwZXRpdGlvbnMgLSBsb29wQ291bnQ7CiAgICAgICAgaWYgKHBlbmRpbmcgPD0gMCkgewogICAgICAgICAgaWYgKHRoaXMuY2xhbXBXaGVuRmluaXNoZWQpCiAgICAgICAgICAgIHRoaXMucGF1c2VkID0gdHJ1ZTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7CiAgICAgICAgICB0aW1lID0gZGVsdGFUaW1lID4gMCA/IGR1cmF0aW9uIDogMDsKICAgICAgICAgIHRoaXMudGltZSA9IHRpbWU7CiAgICAgICAgICB0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHsKICAgICAgICAgICAgdHlwZTogImZpbmlzaGVkIiwKICAgICAgICAgICAgYWN0aW9uOiB0aGlzLAogICAgICAgICAgICBkaXJlY3Rpb246IGRlbHRhVGltZSA+IDAgPyAxIDogLTEKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAocGVuZGluZyA9PT0gMSkgewogICAgICAgICAgICBjb25zdCBhdFN0YXJ0ID0gZGVsdGFUaW1lIDwgMDsKICAgICAgICAgICAgdGhpcy5fc2V0RW5kaW5ncyhhdFN0YXJ0LCAhYXRTdGFydCwgcGluZ1BvbmcpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fc2V0RW5kaW5ncyhmYWxzZSwgZmFsc2UsIHBpbmdQb25nKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX2xvb3BDb3VudCA9IGxvb3BDb3VudDsKICAgICAgICAgIHRoaXMudGltZSA9IHRpbWU7CiAgICAgICAgICB0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHsKICAgICAgICAgICAgdHlwZTogImxvb3AiLAogICAgICAgICAgICBhY3Rpb246IHRoaXMsCiAgICAgICAgICAgIGxvb3BEZWx0YQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMudGltZSA9IHRpbWU7CiAgICAgIH0KICAgICAgaWYgKHBpbmdQb25nICYmIChsb29wQ291bnQgJiAxKSA9PT0gMSkgewogICAgICAgIHJldHVybiBkdXJhdGlvbiAtIHRpbWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aW1lOwogIH0KICBfc2V0RW5kaW5ncyhhdFN0YXJ0LCBhdEVuZCwgcGluZ1BvbmcpIHsKICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5faW50ZXJwb2xhbnRTZXR0aW5nczsKICAgIGlmIChwaW5nUG9uZykgewogICAgICBzZXR0aW5ncy5lbmRpbmdTdGFydCA9IFplcm9TbG9wZUVuZGluZzsKICAgICAgc2V0dGluZ3MuZW5kaW5nRW5kID0gWmVyb1Nsb3BlRW5kaW5nOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGF0U3RhcnQpIHsKICAgICAgICBzZXR0aW5ncy5lbmRpbmdTdGFydCA9IHRoaXMuemVyb1Nsb3BlQXRTdGFydCA/IFplcm9TbG9wZUVuZGluZyA6IFplcm9DdXJ2YXR1cmVFbmRpbmc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0dGluZ3MuZW5kaW5nU3RhcnQgPSBXcmFwQXJvdW5kRW5kaW5nOwogICAgICB9CiAgICAgIGlmIChhdEVuZCkgewogICAgICAgIHNldHRpbmdzLmVuZGluZ0VuZCA9IHRoaXMuemVyb1Nsb3BlQXRFbmQgPyBaZXJvU2xvcGVFbmRpbmcgOiBaZXJvQ3VydmF0dXJlRW5kaW5nOwogICAgICB9IGVsc2UgewogICAgICAgIHNldHRpbmdzLmVuZGluZ0VuZCA9IFdyYXBBcm91bmRFbmRpbmc7CiAgICAgIH0KICAgIH0KICB9CiAgX3NjaGVkdWxlRmFkaW5nKGR1cmF0aW9uLCB3ZWlnaHROb3csIHdlaWdodFRoZW4pIHsKICAgIGNvbnN0IG1peGVyID0gdGhpcy5fbWl4ZXIsIG5vdzIgPSBtaXhlci50aW1lOwogICAgbGV0IGludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7CiAgICBpZiAoaW50ZXJwb2xhbnQgPT09IG51bGwpIHsKICAgICAgaW50ZXJwb2xhbnQgPSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpOwogICAgICB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IGludGVycG9sYW50OwogICAgfQogICAgY29uc3QgeyBwYXJhbWV0ZXJQb3NpdGlvbnM6IHRpbWVzLCBzYW1wbGVWYWx1ZXM6IHZhbHVlcyB9ID0gaW50ZXJwb2xhbnQ7CiAgICB0aW1lc1swXSA9IG5vdzI7CiAgICB2YWx1ZXNbMF0gPSB3ZWlnaHROb3c7CiAgICB0aW1lc1sxXSA9IG5vdzIgKyBkdXJhdGlvbjsKICAgIHZhbHVlc1sxXSA9IHdlaWdodFRoZW47CiAgICByZXR1cm4gdGhpczsKICB9Cn0KCmNsYXNzIFVuaWZvcm0gewogIGNvbnN0cnVjdG9yKHZhbHVlKSB7CiAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgfQogIGNsb25lKCkgewogICAgcmV0dXJuIG5ldyBVbmlmb3JtKHRoaXMudmFsdWUuY2xvbmUgPT09IHVuZGVmaW5lZCA/IHRoaXMudmFsdWUgOiB0aGlzLnZhbHVlLmNsb25lKCkpOwogIH0KfQoKY2xhc3MgR0xCdWZmZXJBdHRyaWJ1dGUgewogIGNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZSwgaXRlbVNpemUsIGVsZW1lbnRTaXplLCBjb3VudCkgewogICAgdGhpcy5pc0dMQnVmZmVyQXR0cmlidXRlID0gdHJ1ZTsKICAgIHRoaXMubmFtZSA9ICIiOwogICAgdGhpcy5idWZmZXIgPSBidWZmZXI7CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy5pdGVtU2l6ZSA9IGl0ZW1TaXplOwogICAgdGhpcy5lbGVtZW50U2l6ZSA9IGVsZW1lbnRTaXplOwogICAgdGhpcy5jb3VudCA9IGNvdW50OwogICAgdGhpcy52ZXJzaW9uID0gMDsKICB9CiAgc2V0IG5lZWRzVXBkYXRlKHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IHRydWUpCiAgICAgIHRoaXMudmVyc2lvbisrOwogIH0KICBzZXRCdWZmZXIoYnVmZmVyKSB7CiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKICAgIHJldHVybiB0aGlzOwogIH0KICBzZXRUeXBlKHR5cGUsIGVsZW1lbnRTaXplKSB7CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy5lbGVtZW50U2l6ZSA9IGVsZW1lbnRTaXplOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNldEl0ZW1TaXplKGl0ZW1TaXplKSB7CiAgICB0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2V0Q291bnQoY291bnQpIHsKICAgIHRoaXMuY291bnQgPSBjb3VudDsKICAgIHJldHVybiB0aGlzOwogIH0KfQoKY2xhc3MgUmF5Y2FzdGVyIHsKICBjb25zdHJ1Y3RvcihvcmlnaW4sIGRpcmVjdGlvbiwgbmVhciA9IDAsIGZhciA9IEluZmluaXR5KSB7CiAgICB0aGlzLnJheSA9IG5ldyBSYXkob3JpZ2luLCBkaXJlY3Rpb24pOwogICAgdGhpcy5uZWFyID0gbmVhcjsKICAgIHRoaXMuZmFyID0gZmFyOwogICAgdGhpcy5jYW1lcmEgPSBudWxsOwogICAgdGhpcy5sYXllcnMgPSBuZXcgTGF5ZXJzOwogICAgdGhpcy5wYXJhbXMgPSB7CiAgICAgIE1lc2g6IHt9LAogICAgICBMaW5lOiB7IHRocmVzaG9sZDogMSB9LAogICAgICBMT0Q6IHt9LAogICAgICBQb2ludHM6IHsgdGhyZXNob2xkOiAxIH0sCiAgICAgIFNwcml0ZToge30KICAgIH07CiAgfQogIHNldChvcmlnaW4sIGRpcmVjdGlvbikgewogICAgdGhpcy5yYXkuc2V0KG9yaWdpbiwgZGlyZWN0aW9uKTsKICB9CiAgc2V0RnJvbUNhbWVyYShjb29yZHMsIGNhbWVyYSkgewogICAgaWYgKGNhbWVyYS5pc1BlcnNwZWN0aXZlQ2FtZXJhKSB7CiAgICAgIHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oY2FtZXJhLm1hdHJpeFdvcmxkKTsKICAgICAgdGhpcy5yYXkuZGlyZWN0aW9uLnNldChjb29yZHMueCwgY29vcmRzLnksIDAuNSkudW5wcm9qZWN0KGNhbWVyYSkuc3ViKHRoaXMucmF5Lm9yaWdpbikubm9ybWFsaXplKCk7CiAgICAgIHRoaXMuY2FtZXJhID0gY2FtZXJhOwogICAgfSBlbHNlIGlmIChjYW1lcmEuaXNPcnRob2dyYXBoaWNDYW1lcmEpIHsKICAgICAgdGhpcy5yYXkub3JpZ2luLnNldChjb29yZHMueCwgY29vcmRzLnksIChjYW1lcmEubmVhciArIGNhbWVyYS5mYXIpIC8gKGNhbWVyYS5uZWFyIC0gY2FtZXJhLmZhcikpLnVucHJvamVjdChjYW1lcmEpOwogICAgICB0aGlzLnJheS5kaXJlY3Rpb24uc2V0KDAsIDAsIC0xKS50cmFuc2Zvcm1EaXJlY3Rpb24oY2FtZXJhLm1hdHJpeFdvcmxkKTsKICAgICAgdGhpcy5jYW1lcmEgPSBjYW1lcmE7CiAgICB9IGVsc2UgewogICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlOiAiICsgY2FtZXJhLnR5cGUpOwogICAgfQogIH0KICBzZXRGcm9tWFJDb250cm9sbGVyKGNvbnRyb2xsZXIpIHsKICAgIF9tYXRyaXguaWRlbnRpdHkoKS5leHRyYWN0Um90YXRpb24oY29udHJvbGxlci5tYXRyaXhXb3JsZCk7CiAgICB0aGlzLnJheS5vcmlnaW4uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGNvbnRyb2xsZXIubWF0cml4V29ybGQpOwogICAgdGhpcy5yYXkuZGlyZWN0aW9uLnNldCgwLCAwLCAtMSkuYXBwbHlNYXRyaXg0KF9tYXRyaXgpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGludGVyc2VjdE9iamVjdChvYmplY3QsIHJlY3Vyc2l2ZSA9IHRydWUsIGludGVyc2VjdHMyID0gW10pIHsKICAgIGludGVyc2VjdChvYmplY3QsIHRoaXMsIGludGVyc2VjdHMyLCByZWN1cnNpdmUpOwogICAgaW50ZXJzZWN0czIuc29ydChhc2NTb3J0KTsKICAgIHJldHVybiBpbnRlcnNlY3RzMjsKICB9CiAgaW50ZXJzZWN0T2JqZWN0cyhvYmplY3RzLCByZWN1cnNpdmUgPSB0cnVlLCBpbnRlcnNlY3RzMiA9IFtdKSB7CiAgICBmb3IgKGxldCBpID0gMCwgbCA9IG9iamVjdHMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgaW50ZXJzZWN0KG9iamVjdHNbaV0sIHRoaXMsIGludGVyc2VjdHMyLCByZWN1cnNpdmUpOwogICAgfQogICAgaW50ZXJzZWN0czIuc29ydChhc2NTb3J0KTsKICAgIHJldHVybiBpbnRlcnNlY3RzMjsKICB9Cn0KZnVuY3Rpb24gYXNjU29ydChhLCBiKSB7CiAgcmV0dXJuIGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlOwp9CmZ1bmN0aW9uIGludGVyc2VjdChvYmplY3QsIHJheWNhc3RlciwgaW50ZXJzZWN0czIsIHJlY3Vyc2l2ZSkgewogIGxldCBwcm9wYWdhdGUgPSB0cnVlOwogIGlmIChvYmplY3QubGF5ZXJzLnRlc3QocmF5Y2FzdGVyLmxheWVycykpIHsKICAgIGNvbnN0IHJlc3VsdCA9IG9iamVjdC5yYXljYXN0KHJheWNhc3RlciwgaW50ZXJzZWN0czIpOwogICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpCiAgICAgIHByb3BhZ2F0ZSA9IGZhbHNlOwogIH0KICBpZiAocHJvcGFnYXRlID09PSB0cnVlICYmIHJlY3Vyc2l2ZSA9PT0gdHJ1ZSkgewogICAgY29uc3QgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47CiAgICBmb3IgKGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgIGludGVyc2VjdChjaGlsZHJlbltpXSwgcmF5Y2FzdGVyLCBpbnRlcnNlY3RzMiwgdHJ1ZSk7CiAgICB9CiAgfQp9CgpjbGFzcyBTcGhlcmljYWwgewogIGNvbnN0cnVjdG9yKHJhZGl1cyA9IDEsIHBoaSA9IDAsIHRoZXRhID0gMCkgewogICAgdGhpcy5yYWRpdXMgPSByYWRpdXM7CiAgICB0aGlzLnBoaSA9IHBoaTsKICAgIHRoaXMudGhldGEgPSB0aGV0YTsKICAgIHJldHVybiB0aGlzOwogIH0KICBzZXQocmFkaXVzLCBwaGksIHRoZXRhKSB7CiAgICB0aGlzLnJhZGl1cyA9IHJhZGl1czsKICAgIHRoaXMucGhpID0gcGhpOwogICAgdGhpcy50aGV0YSA9IHRoZXRhOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGNvcHkob3RoZXIpIHsKICAgIHRoaXMucmFkaXVzID0gb3RoZXIucmFkaXVzOwogICAgdGhpcy5waGkgPSBvdGhlci5waGk7CiAgICB0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7CiAgICByZXR1cm4gdGhpczsKICB9CiAgbWFrZVNhZmUoKSB7CiAgICBjb25zdCBFUFMgPSAwLjAwMDAwMTsKICAgIHRoaXMucGhpID0gY2xhbXAodGhpcy5waGksIEVQUywgTWF0aC5QSSAtIEVQUyk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2V0RnJvbVZlY3RvcjModikgewogICAgcmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3Jkcyh2LngsIHYueSwgdi56KTsKICB9CiAgc2V0RnJvbUNhcnRlc2lhbkNvb3Jkcyh4LCB5LCB6KSB7CiAgICB0aGlzLnJhZGl1cyA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5ICsgeiAqIHopOwogICAgaWYgKHRoaXMucmFkaXVzID09PSAwKSB7CiAgICAgIHRoaXMudGhldGEgPSAwOwogICAgICB0aGlzLnBoaSA9IDA7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnRoZXRhID0gTWF0aC5hdGFuMih4LCB6KTsKICAgICAgdGhpcy5waGkgPSBNYXRoLmFjb3MoY2xhbXAoeSAvIHRoaXMucmFkaXVzLCAtMSwgMSkpOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIGNsb25lKCkgewogICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKTsKICB9Cn0KCmNsYXNzIEN5bGluZHJpY2FsIHsKICBjb25zdHJ1Y3RvcihyYWRpdXMgPSAxLCB0aGV0YSA9IDAsIHkgPSAwKSB7CiAgICB0aGlzLnJhZGl1cyA9IHJhZGl1czsKICAgIHRoaXMudGhldGEgPSB0aGV0YTsKICAgIHRoaXMueSA9IHk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2V0KHJhZGl1cywgdGhldGEsIHkpIHsKICAgIHRoaXMucmFkaXVzID0gcmFkaXVzOwogICAgdGhpcy50aGV0YSA9IHRoZXRhOwogICAgdGhpcy55ID0geTsKICAgIHJldHVybiB0aGlzOwogIH0KICBjb3B5KG90aGVyKSB7CiAgICB0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1czsKICAgIHRoaXMudGhldGEgPSBvdGhlci50aGV0YTsKICAgIHRoaXMueSA9IG90aGVyLnk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2V0RnJvbVZlY3RvcjModikgewogICAgcmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3Jkcyh2LngsIHYueSwgdi56KTsKICB9CiAgc2V0RnJvbUNhcnRlc2lhbkNvb3Jkcyh4LCB5LCB6KSB7CiAgICB0aGlzLnJhZGl1cyA9IE1hdGguc3FydCh4ICogeCArIHogKiB6KTsKICAgIHRoaXMudGhldGEgPSBNYXRoLmF0YW4yKHgsIHopOwogICAgdGhpcy55ID0geTsKICAgIHJldHVybiB0aGlzOwogIH0KICBjbG9uZSgpIHsKICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyk7CiAgfQp9CgpjbGFzcyBNYXRyaXgyIHsKICBjb25zdHJ1Y3RvcihuMTEsIG4xMiwgbjIxLCBuMjIpIHsKICAgIE1hdHJpeDIucHJvdG90eXBlLmlzTWF0cml4MiA9IHRydWU7CiAgICB0aGlzLmVsZW1lbnRzID0gWwogICAgICAxLAogICAgICAwLAogICAgICAwLAogICAgICAxCiAgICBdOwogICAgaWYgKG4xMSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHRoaXMuc2V0KG4xMSwgbjEyLCBuMjEsIG4yMik7CiAgICB9CiAgfQogIGlkZW50aXR5KCkgewogICAgdGhpcy5zZXQoMSwgMCwgMCwgMSk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgZnJvbUFycmF5KGFycmF5LCBvZmZzZXQgPSAwKSB7CiAgICBmb3IgKGxldCBpID0gMDtpIDwgNDsgaSsrKSB7CiAgICAgIHRoaXMuZWxlbWVudHNbaV0gPSBhcnJheVtpICsgb2Zmc2V0XTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KICBzZXQobjExLCBuMTIsIG4yMSwgbjIyKSB7CiAgICBjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7CiAgICB0ZVswXSA9IG4xMTsKICAgIHRlWzJdID0gbjEyOwogICAgdGVbMV0gPSBuMjE7CiAgICB0ZVszXSA9IG4yMjsKICAgIHJldHVybiB0aGlzOwogIH0KfQoKY2xhc3MgQm94MiB7CiAgY29uc3RydWN0b3IobWluID0gbmV3IFZlY3RvcjIoSW5maW5pdHksIEluZmluaXR5KSwgbWF4ID0gbmV3IFZlY3RvcjIoLUluZmluaXR5LCAtSW5maW5pdHkpKSB7CiAgICB0aGlzLmlzQm94MiA9IHRydWU7CiAgICB0aGlzLm1pbiA9IG1pbjsKICAgIHRoaXMubWF4ID0gbWF4OwogIH0KICBzZXQobWluLCBtYXgpIHsKICAgIHRoaXMubWluLmNvcHkobWluKTsKICAgIHRoaXMubWF4LmNvcHkobWF4KTsKICAgIHJldHVybiB0aGlzOwogIH0KICBzZXRGcm9tUG9pbnRzKHBvaW50cykgewogICAgdGhpcy5tYWtlRW1wdHkoKTsKICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgdGhpcy5leHBhbmRCeVBvaW50KHBvaW50c1tpXSk7CiAgICB9CiAgICByZXR1cm4gdGhpczsKICB9CiAgc2V0RnJvbUNlbnRlckFuZFNpemUoY2VudGVyLCBzaXplKSB7CiAgICBjb25zdCBoYWxmU2l6ZSA9IF92ZWN0b3IkNC5jb3B5KHNpemUpLm11bHRpcGx5U2NhbGFyKDAuNSk7CiAgICB0aGlzLm1pbi5jb3B5KGNlbnRlcikuc3ViKGhhbGZTaXplKTsKICAgIHRoaXMubWF4LmNvcHkoY2VudGVyKS5hZGQoaGFsZlNpemUpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGNsb25lKCkgewogICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKTsKICB9CiAgY29weShib3gpIHsKICAgIHRoaXMubWluLmNvcHkoYm94Lm1pbik7CiAgICB0aGlzLm1heC5jb3B5KGJveC5tYXgpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIG1ha2VFbXB0eSgpIHsKICAgIHRoaXMubWluLnggPSB0aGlzLm1pbi55ID0gSW5maW5pdHk7CiAgICB0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IC1JbmZpbml0eTsKICAgIHJldHVybiB0aGlzOwogIH0KICBpc0VtcHR5KCkgewogICAgcmV0dXJuIHRoaXMubWF4LnggPCB0aGlzLm1pbi54IHx8IHRoaXMubWF4LnkgPCB0aGlzLm1pbi55OwogIH0KICBnZXRDZW50ZXIodGFyZ2V0KSB7CiAgICByZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KDAsIDApIDogdGFyZ2V0LmFkZFZlY3RvcnModGhpcy5taW4sIHRoaXMubWF4KS5tdWx0aXBseVNjYWxhcigwLjUpOwogIH0KICBnZXRTaXplKHRhcmdldCkgewogICAgcmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCgwLCAwKSA6IHRhcmdldC5zdWJWZWN0b3JzKHRoaXMubWF4LCB0aGlzLm1pbik7CiAgfQogIGV4cGFuZEJ5UG9pbnQocG9pbnQpIHsKICAgIHRoaXMubWluLm1pbihwb2ludCk7CiAgICB0aGlzLm1heC5tYXgocG9pbnQpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGV4cGFuZEJ5VmVjdG9yKHZlY3RvcikgewogICAgdGhpcy5taW4uc3ViKHZlY3Rvcik7CiAgICB0aGlzLm1heC5hZGQodmVjdG9yKTsKICAgIHJldHVybiB0aGlzOwogIH0KICBleHBhbmRCeVNjYWxhcihzY2FsYXIpIHsKICAgIHRoaXMubWluLmFkZFNjYWxhcigtc2NhbGFyKTsKICAgIHRoaXMubWF4LmFkZFNjYWxhcihzY2FsYXIpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGNvbnRhaW5zUG9pbnQocG9pbnQpIHsKICAgIHJldHVybiBwb2ludC54ID49IHRoaXMubWluLnggJiYgcG9pbnQueCA8PSB0aGlzLm1heC54ICYmIHBvaW50LnkgPj0gdGhpcy5taW4ueSAmJiBwb2ludC55IDw9IHRoaXMubWF4Lnk7CiAgfQogIGNvbnRhaW5zQm94KGJveCkgewogICAgcmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmIHRoaXMubWluLnkgPD0gYm94Lm1pbi55ICYmIGJveC5tYXgueSA8PSB0aGlzLm1heC55OwogIH0KICBnZXRQYXJhbWV0ZXIocG9pbnQsIHRhcmdldCkgewogICAgcmV0dXJuIHRhcmdldC5zZXQoKHBvaW50LnggLSB0aGlzLm1pbi54KSAvICh0aGlzLm1heC54IC0gdGhpcy5taW4ueCksIChwb2ludC55IC0gdGhpcy5taW4ueSkgLyAodGhpcy5tYXgueSAtIHRoaXMubWluLnkpKTsKICB9CiAgaW50ZXJzZWN0c0JveChib3gpIHsKICAgIHJldHVybiBib3gubWF4LnggPj0gdGhpcy5taW4ueCAmJiBib3gubWluLnggPD0gdGhpcy5tYXgueCAmJiBib3gubWF4LnkgPj0gdGhpcy5taW4ueSAmJiBib3gubWluLnkgPD0gdGhpcy5tYXgueTsKICB9CiAgY2xhbXBQb2ludChwb2ludCwgdGFyZ2V0KSB7CiAgICByZXR1cm4gdGFyZ2V0LmNvcHkocG9pbnQpLmNsYW1wKHRoaXMubWluLCB0aGlzLm1heCk7CiAgfQogIGRpc3RhbmNlVG9Qb2ludChwb2ludCkgewogICAgcmV0dXJuIHRoaXMuY2xhbXBQb2ludChwb2ludCwgX3ZlY3RvciQ0KS5kaXN0YW5jZVRvKHBvaW50KTsKICB9CiAgaW50ZXJzZWN0KGJveCkgewogICAgdGhpcy5taW4ubWF4KGJveC5taW4pOwogICAgdGhpcy5tYXgubWluKGJveC5tYXgpOwogICAgaWYgKHRoaXMuaXNFbXB0eSgpKQogICAgICB0aGlzLm1ha2VFbXB0eSgpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHVuaW9uKGJveCkgewogICAgdGhpcy5taW4ubWluKGJveC5taW4pOwogICAgdGhpcy5tYXgubWF4KGJveC5tYXgpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHRyYW5zbGF0ZShvZmZzZXQpIHsKICAgIHRoaXMubWluLmFkZChvZmZzZXQpOwogICAgdGhpcy5tYXguYWRkKG9mZnNldCk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgZXF1YWxzKGJveCkgewogICAgcmV0dXJuIGJveC5taW4uZXF1YWxzKHRoaXMubWluKSAmJiBib3gubWF4LmVxdWFscyh0aGlzLm1heCk7CiAgfQp9CgpjbGFzcyBMaW5lMyB7CiAgY29uc3RydWN0b3Ioc3RhcnQgPSBuZXcgVmVjdG9yMywgZW5kID0gbmV3IFZlY3RvcjMpIHsKICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKICAgIHRoaXMuZW5kID0gZW5kOwogIH0KICBzZXQoc3RhcnQsIGVuZCkgewogICAgdGhpcy5zdGFydC5jb3B5KHN0YXJ0KTsKICAgIHRoaXMuZW5kLmNvcHkoZW5kKTsKICAgIHJldHVybiB0aGlzOwogIH0KICBjb3B5KGxpbmUpIHsKICAgIHRoaXMuc3RhcnQuY29weShsaW5lLnN0YXJ0KTsKICAgIHRoaXMuZW5kLmNvcHkobGluZS5lbmQpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGdldENlbnRlcih0YXJnZXQpIHsKICAgIHJldHVybiB0YXJnZXQuYWRkVmVjdG9ycyh0aGlzLnN0YXJ0LCB0aGlzLmVuZCkubXVsdGlwbHlTY2FsYXIoMC41KTsKICB9CiAgZGVsdGEodGFyZ2V0KSB7CiAgICByZXR1cm4gdGFyZ2V0LnN1YlZlY3RvcnModGhpcy5lbmQsIHRoaXMuc3RhcnQpOwogIH0KICBkaXN0YW5jZVNxKCkgewogICAgcmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5lbmQpOwogIH0KICBkaXN0YW5jZSgpIHsKICAgIHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8odGhpcy5lbmQpOwogIH0KICBhdCh0LCB0YXJnZXQpIHsKICAgIHJldHVybiB0aGlzLmRlbHRhKHRhcmdldCkubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMuc3RhcnQpOwogIH0KICBjbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKHBvaW50LCBjbGFtcFRvTGluZSkgewogICAgX3N0YXJ0UC5zdWJWZWN0b3JzKHBvaW50LCB0aGlzLnN0YXJ0KTsKICAgIF9zdGFydEVuZC5zdWJWZWN0b3JzKHRoaXMuZW5kLCB0aGlzLnN0YXJ0KTsKICAgIGNvbnN0IHN0YXJ0RW5kMiA9IF9zdGFydEVuZC5kb3QoX3N0YXJ0RW5kKTsKICAgIGNvbnN0IHN0YXJ0RW5kX3N0YXJ0UCA9IF9zdGFydEVuZC5kb3QoX3N0YXJ0UCk7CiAgICBsZXQgdCA9IHN0YXJ0RW5kX3N0YXJ0UCAvIHN0YXJ0RW5kMjsKICAgIGlmIChjbGFtcFRvTGluZSkgewogICAgICB0ID0gY2xhbXAodCwgMCwgMSk7CiAgICB9CiAgICByZXR1cm4gdDsKICB9CiAgY2xvc2VzdFBvaW50VG9Qb2ludChwb2ludCwgY2xhbXBUb0xpbmUsIHRhcmdldCkgewogICAgY29uc3QgdCA9IHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcihwb2ludCwgY2xhbXBUb0xpbmUpOwogICAgcmV0dXJuIHRoaXMuZGVsdGEodGFyZ2V0KS5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy5zdGFydCk7CiAgfQogIGFwcGx5TWF0cml4NChtYXRyaXgpIHsKICAgIHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KG1hdHJpeCk7CiAgICB0aGlzLmVuZC5hcHBseU1hdHJpeDQobWF0cml4KTsKICAgIHJldHVybiB0aGlzOwogIH0KICBlcXVhbHMobGluZSkgewogICAgcmV0dXJuIGxpbmUuc3RhcnQuZXF1YWxzKHRoaXMuc3RhcnQpICYmIGxpbmUuZW5kLmVxdWFscyh0aGlzLmVuZCk7CiAgfQogIGNsb25lKCkgewogICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKTsKICB9Cn0KZnVuY3Rpb24gZ2V0Qm9uZUxpc3Qob2JqZWN0KSB7CiAgY29uc3QgYm9uZUxpc3QgPSBbXTsKICBpZiAob2JqZWN0LmlzQm9uZSA9PT0gdHJ1ZSkgewogICAgYm9uZUxpc3QucHVzaChvYmplY3QpOwogIH0KICBmb3IgKGxldCBpID0gMDtpIDwgb2JqZWN0LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICBib25lTGlzdC5wdXNoLmFwcGx5KGJvbmVMaXN0LCBnZXRCb25lTGlzdChvYmplY3QuY2hpbGRyZW5baV0pKTsKICB9CiAgcmV0dXJuIGJvbmVMaXN0Owp9CmZ1bmN0aW9uIHNldFBvaW50KHBvaW50LCBwb2ludE1hcCwgZ2VvbWV0cnksIGNhbWVyYSwgeCwgeSwgeikgewogIF92ZWN0b3Iuc2V0KHgsIHksIHopLnVucHJvamVjdChjYW1lcmEpOwogIGNvbnN0IHBvaW50cyA9IHBvaW50TWFwW3BvaW50XTsKICBpZiAocG9pbnRzICE9PSB1bmRlZmluZWQpIHsKICAgIGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpOwogICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgcG9zaXRpb24uc2V0WFlaKHBvaW50c1tpXSwgX3ZlY3Rvci54LCBfdmVjdG9yLnksIF92ZWN0b3Iueik7CiAgICB9CiAgfQp9CgpjbGFzcyBTaGFwZVBhdGggewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy50eXBlID0gIlNoYXBlUGF0aCI7CiAgICB0aGlzLmNvbG9yID0gbmV3IENvbG9yOwogICAgdGhpcy5zdWJQYXRocyA9IFtdOwogICAgdGhpcy5jdXJyZW50UGF0aCA9IG51bGw7CiAgfQogIG1vdmVUbyh4LCB5KSB7CiAgICB0aGlzLmN1cnJlbnRQYXRoID0gbmV3IFBhdGg7CiAgICB0aGlzLnN1YlBhdGhzLnB1c2godGhpcy5jdXJyZW50UGF0aCk7CiAgICB0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyh4LCB5KTsKICAgIHJldHVybiB0aGlzOwogIH0KICBsaW5lVG8oeCwgeSkgewogICAgdGhpcy5jdXJyZW50UGF0aC5saW5lVG8oeCwgeSk7CiAgICByZXR1cm4gdGhpczsKICB9CiAgcXVhZHJhdGljQ3VydmVUbyhhQ1B4LCBhQ1B5LCBhWCwgYVkpIHsKICAgIHRoaXMuY3VycmVudFBhdGgucXVhZHJhdGljQ3VydmVUbyhhQ1B4LCBhQ1B5LCBhWCwgYVkpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGJlemllckN1cnZlVG8oYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSkgewogICAgdGhpcy5jdXJyZW50UGF0aC5iZXppZXJDdXJ2ZVRvKGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIHNwbGluZVRocnUocHRzKSB7CiAgICB0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUocHRzKTsKICAgIHJldHVybiB0aGlzOwogIH0KICB0b1NoYXBlcyhpc0NDVykgewogICAgZnVuY3Rpb24gdG9TaGFwZXNOb0hvbGVzKGluU3VicGF0aHMpIHsKICAgICAgY29uc3Qgc2hhcGVzMiA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGluU3VicGF0aHMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICBjb25zdCB0bXBQYXRoMiA9IGluU3VicGF0aHNbaV07CiAgICAgICAgY29uc3QgdG1wU2hhcGUyID0gbmV3IFNoYXBlOwogICAgICAgIHRtcFNoYXBlMi5jdXJ2ZXMgPSB0bXBQYXRoMi5jdXJ2ZXM7CiAgICAgICAgc2hhcGVzMi5wdXNoKHRtcFNoYXBlMik7CiAgICAgIH0KICAgICAgcmV0dXJuIHNoYXBlczI7CiAgICB9CiAgICBmdW5jdGlvbiBpc1BvaW50SW5zaWRlUG9seWdvbihpblB0LCBpblBvbHlnb24pIHsKICAgICAgY29uc3QgcG9seUxlbiA9IGluUG9seWdvbi5sZW5ndGg7CiAgICAgIGxldCBpbnNpZGUgPSBmYWxzZTsKICAgICAgZm9yIChsZXQgcCA9IHBvbHlMZW4gLSAxLCBxID0gMDtxIDwgcG9seUxlbjsgcCA9IHErKykgewogICAgICAgIGxldCBlZGdlTG93UHQgPSBpblBvbHlnb25bcF07CiAgICAgICAgbGV0IGVkZ2VIaWdoUHQgPSBpblBvbHlnb25bcV07CiAgICAgICAgbGV0IGVkZ2VEeCA9IGVkZ2VIaWdoUHQueCAtIGVkZ2VMb3dQdC54OwogICAgICAgIGxldCBlZGdlRHkgPSBlZGdlSGlnaFB0LnkgLSBlZGdlTG93UHQueTsKICAgICAgICBpZiAoTWF0aC5hYnMoZWRnZUR5KSA+IE51bWJlci5FUFNJTE9OKSB7CiAgICAgICAgICBpZiAoZWRnZUR5IDwgMCkgewogICAgICAgICAgICBlZGdlTG93UHQgPSBpblBvbHlnb25bcV07CiAgICAgICAgICAgIGVkZ2VEeCA9IC1lZGdlRHg7CiAgICAgICAgICAgIGVkZ2VIaWdoUHQgPSBpblBvbHlnb25bcF07CiAgICAgICAgICAgIGVkZ2VEeSA9IC1lZGdlRHk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaW5QdC55IDwgZWRnZUxvd1B0LnkgfHwgaW5QdC55ID4gZWRnZUhpZ2hQdC55KQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIGlmIChpblB0LnkgPT09IGVkZ2VMb3dQdC55KSB7CiAgICAgICAgICAgIGlmIChpblB0LnggPT09IGVkZ2VMb3dQdC54KQogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgcGVycEVkZ2UgPSBlZGdlRHkgKiAoaW5QdC54IC0gZWRnZUxvd1B0LngpIC0gZWRnZUR4ICogKGluUHQueSAtIGVkZ2VMb3dQdC55KTsKICAgICAgICAgICAgaWYgKHBlcnBFZGdlID09PSAwKQogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICBpZiAocGVycEVkZ2UgPCAwKQogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaW5QdC55ICE9PSBlZGdlTG93UHQueSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICBpZiAoZWRnZUhpZ2hQdC54IDw9IGluUHQueCAmJiBpblB0LnggPD0gZWRnZUxvd1B0LnggfHwgZWRnZUxvd1B0LnggPD0gaW5QdC54ICYmIGluUHQueCA8PSBlZGdlSGlnaFB0LngpCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaW5zaWRlOwogICAgfQogICAgY29uc3QgaXNDbG9ja1dpc2UgPSBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlOwogICAgY29uc3Qgc3ViUGF0aHMgPSB0aGlzLnN1YlBhdGhzOwogICAgaWYgKHN1YlBhdGhzLmxlbmd0aCA9PT0gMCkKICAgICAgcmV0dXJuIFtdOwogICAgbGV0IHNvbGlkLCB0bXBQYXRoLCB0bXBTaGFwZTsKICAgIGNvbnN0IHNoYXBlcyA9IFtdOwogICAgaWYgKHN1YlBhdGhzLmxlbmd0aCA9PT0gMSkgewogICAgICB0bXBQYXRoID0gc3ViUGF0aHNbMF07CiAgICAgIHRtcFNoYXBlID0gbmV3IFNoYXBlOwogICAgICB0bXBTaGFwZS5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlczsKICAgICAgc2hhcGVzLnB1c2godG1wU2hhcGUpOwogICAgICByZXR1cm4gc2hhcGVzOwogICAgfQogICAgbGV0IGhvbGVzRmlyc3QgPSAhaXNDbG9ja1dpc2Uoc3ViUGF0aHNbMF0uZ2V0UG9pbnRzKCkpOwogICAgaG9sZXNGaXJzdCA9IGlzQ0NXID8gIWhvbGVzRmlyc3QgOiBob2xlc0ZpcnN0OwogICAgY29uc3QgYmV0dGVyU2hhcGVIb2xlcyA9IFtdOwogICAgY29uc3QgbmV3U2hhcGVzID0gW107CiAgICBsZXQgbmV3U2hhcGVIb2xlcyA9IFtdOwogICAgbGV0IG1haW5JZHggPSAwOwogICAgbGV0IHRtcFBvaW50czsKICAgIG5ld1NoYXBlc1ttYWluSWR4XSA9IHVuZGVmaW5lZDsKICAgIG5ld1NoYXBlSG9sZXNbbWFpbklkeF0gPSBbXTsKICAgIGZvciAobGV0IGkgPSAwLCBsID0gc3ViUGF0aHMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgdG1wUGF0aCA9IHN1YlBhdGhzW2ldOwogICAgICB0bXBQb2ludHMgPSB0bXBQYXRoLmdldFBvaW50cygpOwogICAgICBzb2xpZCA9IGlzQ2xvY2tXaXNlKHRtcFBvaW50cyk7CiAgICAgIHNvbGlkID0gaXNDQ1cgPyAhc29saWQgOiBzb2xpZDsKICAgICAgaWYgKHNvbGlkKSB7CiAgICAgICAgaWYgKCFob2xlc0ZpcnN0ICYmIG5ld1NoYXBlc1ttYWluSWR4XSkKICAgICAgICAgIG1haW5JZHgrKzsKICAgICAgICBuZXdTaGFwZXNbbWFpbklkeF0gPSB7IHM6IG5ldyBTaGFwZSwgcDogdG1wUG9pbnRzIH07CiAgICAgICAgbmV3U2hhcGVzW21haW5JZHhdLnMuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7CiAgICAgICAgaWYgKGhvbGVzRmlyc3QpCiAgICAgICAgICBtYWluSWR4Kys7CiAgICAgICAgbmV3U2hhcGVIb2xlc1ttYWluSWR4XSA9IFtdOwogICAgICB9IGVsc2UgewogICAgICAgIG5ld1NoYXBlSG9sZXNbbWFpbklkeF0ucHVzaCh7IGg6IHRtcFBhdGgsIHA6IHRtcFBvaW50c1swXSB9KTsKICAgICAgfQogICAgfQogICAgaWYgKCFuZXdTaGFwZXNbMF0pCiAgICAgIHJldHVybiB0b1NoYXBlc05vSG9sZXMoc3ViUGF0aHMpOwogICAgaWYgKG5ld1NoYXBlcy5sZW5ndGggPiAxKSB7CiAgICAgIGxldCBhbWJpZ3VvdXMgPSBmYWxzZTsKICAgICAgbGV0IHRvQ2hhbmdlID0gMDsKICAgICAgZm9yIChsZXQgc0lkeCA9IDAsIHNMZW4gPSBuZXdTaGFwZXMubGVuZ3RoO3NJZHggPCBzTGVuOyBzSWR4KyspIHsKICAgICAgICBiZXR0ZXJTaGFwZUhvbGVzW3NJZHhdID0gW107CiAgICAgIH0KICAgICAgZm9yIChsZXQgc0lkeCA9IDAsIHNMZW4gPSBuZXdTaGFwZXMubGVuZ3RoO3NJZHggPCBzTGVuOyBzSWR4KyspIHsKICAgICAgICBjb25zdCBzaG8gPSBuZXdTaGFwZUhvbGVzW3NJZHhdOwogICAgICAgIGZvciAobGV0IGhJZHggPSAwO2hJZHggPCBzaG8ubGVuZ3RoOyBoSWR4KyspIHsKICAgICAgICAgIGNvbnN0IGhvID0gc2hvW2hJZHhdOwogICAgICAgICAgbGV0IGhvbGVfdW5hc3NpZ25lZCA9IHRydWU7CiAgICAgICAgICBmb3IgKGxldCBzMklkeCA9IDA7czJJZHggPCBuZXdTaGFwZXMubGVuZ3RoOyBzMklkeCsrKSB7CiAgICAgICAgICAgIGlmIChpc1BvaW50SW5zaWRlUG9seWdvbihoby5wLCBuZXdTaGFwZXNbczJJZHhdLnApKSB7CiAgICAgICAgICAgICAgaWYgKHNJZHggIT09IHMySWR4KQogICAgICAgICAgICAgICAgdG9DaGFuZ2UrKzsKICAgICAgICAgICAgICBpZiAoaG9sZV91bmFzc2lnbmVkKSB7CiAgICAgICAgICAgICAgICBob2xlX3VuYXNzaWduZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGJldHRlclNoYXBlSG9sZXNbczJJZHhdLnB1c2goaG8pOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhbWJpZ3VvdXMgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGhvbGVfdW5hc3NpZ25lZCkgewogICAgICAgICAgICBiZXR0ZXJTaGFwZUhvbGVzW3NJZHhdLnB1c2goaG8pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodG9DaGFuZ2UgPiAwICYmIGFtYmlndW91cyA9PT0gZmFsc2UpIHsKICAgICAgICBuZXdTaGFwZUhvbGVzID0gYmV0dGVyU2hhcGVIb2xlczsKICAgICAgfQogICAgfQogICAgbGV0IHRtcEhvbGVzOwogICAgZm9yIChsZXQgaSA9IDAsIGlsID0gbmV3U2hhcGVzLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICB0bXBTaGFwZSA9IG5ld1NoYXBlc1tpXS5zOwogICAgICBzaGFwZXMucHVzaCh0bXBTaGFwZSk7CiAgICAgIHRtcEhvbGVzID0gbmV3U2hhcGVIb2xlc1tpXTsKICAgICAgZm9yIChsZXQgaiA9IDAsIGpsID0gdG1wSG9sZXMubGVuZ3RoO2ogPCBqbDsgaisrKSB7CiAgICAgICAgdG1wU2hhcGUuaG9sZXMucHVzaCh0bXBIb2xlc1tqXS5oKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYXBlczsKICB9Cn0KZnVuY3Rpb24gY29udGFpbih0ZXh0dXJlLCBhc3BlY3QyKSB7CiAgY29uc3QgaW1hZ2VBc3BlY3QgPSB0ZXh0dXJlLmltYWdlICYmIHRleHR1cmUuaW1hZ2Uud2lkdGggPyB0ZXh0dXJlLmltYWdlLndpZHRoIC8gdGV4dHVyZS5pbWFnZS5oZWlnaHQgOiAxOwogIGlmIChpbWFnZUFzcGVjdCA+IGFzcGVjdDIpIHsKICAgIHRleHR1cmUucmVwZWF0LnggPSAxOwogICAgdGV4dHVyZS5yZXBlYXQueSA9IGltYWdlQXNwZWN0IC8gYXNwZWN0MjsKICAgIHRleHR1cmUub2Zmc2V0LnggPSAwOwogICAgdGV4dHVyZS5vZmZzZXQueSA9ICgxIC0gdGV4dHVyZS5yZXBlYXQueSkgLyAyOwogIH0gZWxzZSB7CiAgICB0ZXh0dXJlLnJlcGVhdC54ID0gYXNwZWN0MiAvIGltYWdlQXNwZWN0OwogICAgdGV4dHVyZS5yZXBlYXQueSA9IDE7CiAgICB0ZXh0dXJlLm9mZnNldC54ID0gKDEgLSB0ZXh0dXJlLnJlcGVhdC54KSAvIDI7CiAgICB0ZXh0dXJlLm9mZnNldC55ID0gMDsKICB9CiAgcmV0dXJuIHRleHR1cmU7Cn0KZnVuY3Rpb24gY292ZXIodGV4dHVyZSwgYXNwZWN0MikgewogIGNvbnN0IGltYWdlQXNwZWN0ID0gdGV4dHVyZS5pbWFnZSAmJiB0ZXh0dXJlLmltYWdlLndpZHRoID8gdGV4dHVyZS5pbWFnZS53aWR0aCAvIHRleHR1cmUuaW1hZ2UuaGVpZ2h0IDogMTsKICBpZiAoaW1hZ2VBc3BlY3QgPiBhc3BlY3QyKSB7CiAgICB0ZXh0dXJlLnJlcGVhdC54ID0gYXNwZWN0MiAvIGltYWdlQXNwZWN0OwogICAgdGV4dHVyZS5yZXBlYXQueSA9IDE7CiAgICB0ZXh0dXJlLm9mZnNldC54ID0gKDEgLSB0ZXh0dXJlLnJlcGVhdC54KSAvIDI7CiAgICB0ZXh0dXJlLm9mZnNldC55ID0gMDsKICB9IGVsc2UgewogICAgdGV4dHVyZS5yZXBlYXQueCA9IDE7CiAgICB0ZXh0dXJlLnJlcGVhdC55ID0gaW1hZ2VBc3BlY3QgLyBhc3BlY3QyOwogICAgdGV4dHVyZS5vZmZzZXQueCA9IDA7CiAgICB0ZXh0dXJlLm9mZnNldC55ID0gKDEgLSB0ZXh0dXJlLnJlcGVhdC55KSAvIDI7CiAgfQogIHJldHVybiB0ZXh0dXJlOwp9CmZ1bmN0aW9uIGZpbGwodGV4dHVyZSkgewogIHRleHR1cmUucmVwZWF0LnggPSAxOwogIHRleHR1cmUucmVwZWF0LnkgPSAxOwogIHRleHR1cmUub2Zmc2V0LnggPSAwOwogIHRleHR1cmUub2Zmc2V0LnkgPSAwOwogIHJldHVybiB0ZXh0dXJlOwp9CmZ1bmN0aW9uIGdldEJ5dGVMZW5ndGgod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlKSB7CiAgY29uc3QgdHlwZUJ5dGVMZW5ndGggPSBnZXRUZXh0dXJlVHlwZUJ5dGVMZW5ndGgodHlwZSk7CiAgc3dpdGNoIChmb3JtYXQpIHsKICAgIGNhc2UgQWxwaGFGb3JtYXQ6CiAgICAgIHJldHVybiB3aWR0aCAqIGhlaWdodDsKICAgIGNhc2UgTHVtaW5hbmNlRm9ybWF0OgogICAgICByZXR1cm4gd2lkdGggKiBoZWlnaHQ7CiAgICBjYXNlIEx1bWluYW5jZUFscGhhRm9ybWF0OgogICAgICByZXR1cm4gd2lkdGggKiBoZWlnaHQgKiAyOwogICAgY2FzZSBSZWRGb3JtYXQ6CiAgICAgIHJldHVybiB3aWR0aCAqIGhlaWdodCAvIHR5cGVCeXRlTGVuZ3RoLmNvbXBvbmVudHMgKiB0eXBlQnl0ZUxlbmd0aC5ieXRlTGVuZ3RoOwogICAgY2FzZSBSZWRJbnRlZ2VyRm9ybWF0OgogICAgICByZXR1cm4gd2lkdGggKiBoZWlnaHQgLyB0eXBlQnl0ZUxlbmd0aC5jb21wb25lbnRzICogdHlwZUJ5dGVMZW5ndGguYnl0ZUxlbmd0aDsKICAgIGNhc2UgUkdGb3JtYXQ6CiAgICAgIHJldHVybiB3aWR0aCAqIGhlaWdodCAqIDIgLyB0eXBlQnl0ZUxlbmd0aC5jb21wb25lbnRzICogdHlwZUJ5dGVMZW5ndGguYnl0ZUxlbmd0aDsKICAgIGNhc2UgUkdJbnRlZ2VyRm9ybWF0OgogICAgICByZXR1cm4gd2lkdGggKiBoZWlnaHQgKiAyIC8gdHlwZUJ5dGVMZW5ndGguY29tcG9uZW50cyAqIHR5cGVCeXRlTGVuZ3RoLmJ5dGVMZW5ndGg7CiAgICBjYXNlIFJHQkZvcm1hdDoKICAgICAgcmV0dXJuIHdpZHRoICogaGVpZ2h0ICogMyAvIHR5cGVCeXRlTGVuZ3RoLmNvbXBvbmVudHMgKiB0eXBlQnl0ZUxlbmd0aC5ieXRlTGVuZ3RoOwogICAgY2FzZSBSR0JBRm9ybWF0OgogICAgICByZXR1cm4gd2lkdGggKiBoZWlnaHQgKiA0IC8gdHlwZUJ5dGVMZW5ndGguY29tcG9uZW50cyAqIHR5cGVCeXRlTGVuZ3RoLmJ5dGVMZW5ndGg7CiAgICBjYXNlIFJHQkFJbnRlZ2VyRm9ybWF0OgogICAgICByZXR1cm4gd2lkdGggKiBoZWlnaHQgKiA0IC8gdHlwZUJ5dGVMZW5ndGguY29tcG9uZW50cyAqIHR5cGVCeXRlTGVuZ3RoLmJ5dGVMZW5ndGg7CiAgICBjYXNlIFJHQl9TM1RDX0RYVDFfRm9ybWF0OgogICAgY2FzZSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQ6CiAgICAgIHJldHVybiBNYXRoLmZsb29yKCh3aWR0aCArIDMpIC8gNCkgKiBNYXRoLmZsb29yKChoZWlnaHQgKyAzKSAvIDQpICogODsKICAgIGNhc2UgUkdCQV9TM1RDX0RYVDNfRm9ybWF0OgogICAgY2FzZSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQ6CiAgICAgIHJldHVybiBNYXRoLmZsb29yKCh3aWR0aCArIDMpIC8gNCkgKiBNYXRoLmZsb29yKChoZWlnaHQgKyAzKSAvIDQpICogMTY7CiAgICBjYXNlIFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0OgogICAgY2FzZSBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQ6CiAgICAgIHJldHVybiBNYXRoLm1heCh3aWR0aCwgMTYpICogTWF0aC5tYXgoaGVpZ2h0LCA4KSAvIDQ7CiAgICBjYXNlIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0OgogICAgY2FzZSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQ6CiAgICAgIHJldHVybiBNYXRoLm1heCh3aWR0aCwgOCkgKiBNYXRoLm1heChoZWlnaHQsIDgpIC8gMjsKICAgIGNhc2UgUkdCX0VUQzFfRm9ybWF0OgogICAgY2FzZSBSR0JfRVRDMl9Gb3JtYXQ6CiAgICAgIHJldHVybiBNYXRoLmZsb29yKCh3aWR0aCArIDMpIC8gNCkgKiBNYXRoLmZsb29yKChoZWlnaHQgKyAzKSAvIDQpICogODsKICAgIGNhc2UgUkdCQV9FVEMyX0VBQ19Gb3JtYXQ6CiAgICAgIHJldHVybiBNYXRoLmZsb29yKCh3aWR0aCArIDMpIC8gNCkgKiBNYXRoLmZsb29yKChoZWlnaHQgKyAzKSAvIDQpICogMTY7CiAgICBjYXNlIFJHQkFfQVNUQ180eDRfRm9ybWF0OgogICAgICByZXR1cm4gTWF0aC5mbG9vcigod2lkdGggKyAzKSAvIDQpICogTWF0aC5mbG9vcigoaGVpZ2h0ICsgMykgLyA0KSAqIDE2OwogICAgY2FzZSBSR0JBX0FTVENfNXg0X0Zvcm1hdDoKICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKHdpZHRoICsgNCkgLyA1KSAqIE1hdGguZmxvb3IoKGhlaWdodCArIDMpIC8gNCkgKiAxNjsKICAgIGNhc2UgUkdCQV9BU1RDXzV4NV9Gb3JtYXQ6CiAgICAgIHJldHVybiBNYXRoLmZsb29yKCh3aWR0aCArIDQpIC8gNSkgKiBNYXRoLmZsb29yKChoZWlnaHQgKyA0KSAvIDUpICogMTY7CiAgICBjYXNlIFJHQkFfQVNUQ182eDVfRm9ybWF0OgogICAgICByZXR1cm4gTWF0aC5mbG9vcigod2lkdGggKyA1KSAvIDYpICogTWF0aC5mbG9vcigoaGVpZ2h0ICsgNCkgLyA1KSAqIDE2OwogICAgY2FzZSBSR0JBX0FTVENfNng2X0Zvcm1hdDoKICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKHdpZHRoICsgNSkgLyA2KSAqIE1hdGguZmxvb3IoKGhlaWdodCArIDUpIC8gNikgKiAxNjsKICAgIGNhc2UgUkdCQV9BU1RDXzh4NV9Gb3JtYXQ6CiAgICAgIHJldHVybiBNYXRoLmZsb29yKCh3aWR0aCArIDcpIC8gOCkgKiBNYXRoLmZsb29yKChoZWlnaHQgKyA0KSAvIDUpICogMTY7CiAgICBjYXNlIFJHQkFfQVNUQ184eDZfRm9ybWF0OgogICAgICByZXR1cm4gTWF0aC5mbG9vcigod2lkdGggKyA3KSAvIDgpICogTWF0aC5mbG9vcigoaGVpZ2h0ICsgNSkgLyA2KSAqIDE2OwogICAgY2FzZSBSR0JBX0FTVENfOHg4X0Zvcm1hdDoKICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKHdpZHRoICsgNykgLyA4KSAqIE1hdGguZmxvb3IoKGhlaWdodCArIDcpIC8gOCkgKiAxNjsKICAgIGNhc2UgUkdCQV9BU1RDXzEweDVfRm9ybWF0OgogICAgICByZXR1cm4gTWF0aC5mbG9vcigod2lkdGggKyA5KSAvIDEwKSAqIE1hdGguZmxvb3IoKGhlaWdodCArIDQpIC8gNSkgKiAxNjsKICAgIGNhc2UgUkdCQV9BU1RDXzEweDZfRm9ybWF0OgogICAgICByZXR1cm4gTWF0aC5mbG9vcigod2lkdGggKyA5KSAvIDEwKSAqIE1hdGguZmxvb3IoKGhlaWdodCArIDUpIC8gNikgKiAxNjsKICAgIGNhc2UgUkdCQV9BU1RDXzEweDhfRm9ybWF0OgogICAgICByZXR1cm4gTWF0aC5mbG9vcigod2lkdGggKyA5KSAvIDEwKSAqIE1hdGguZmxvb3IoKGhlaWdodCArIDcpIC8gOCkgKiAxNjsKICAgIGNhc2UgUkdCQV9BU1RDXzEweDEwX0Zvcm1hdDoKICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKHdpZHRoICsgOSkgLyAxMCkgKiBNYXRoLmZsb29yKChoZWlnaHQgKyA5KSAvIDEwKSAqIDE2OwogICAgY2FzZSBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0OgogICAgICByZXR1cm4gTWF0aC5mbG9vcigod2lkdGggKyAxMSkgLyAxMikgKiBNYXRoLmZsb29yKChoZWlnaHQgKyA5KSAvIDEwKSAqIDE2OwogICAgY2FzZSBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0OgogICAgICByZXR1cm4gTWF0aC5mbG9vcigod2lkdGggKyAxMSkgLyAxMikgKiBNYXRoLmZsb29yKChoZWlnaHQgKyAxMSkgLyAxMikgKiAxNjsKICAgIGNhc2UgUkdCQV9CUFRDX0Zvcm1hdDoKICAgIGNhc2UgUkdCX0JQVENfU0lHTkVEX0Zvcm1hdDoKICAgIGNhc2UgUkdCX0JQVENfVU5TSUdORURfRm9ybWF0OgogICAgICByZXR1cm4gTWF0aC5jZWlsKHdpZHRoIC8gNCkgKiBNYXRoLmNlaWwoaGVpZ2h0IC8gNCkgKiAxNjsKICAgIGNhc2UgUkVEX1JHVEMxX0Zvcm1hdDoKICAgIGNhc2UgU0lHTkVEX1JFRF9SR1RDMV9Gb3JtYXQ6CiAgICAgIHJldHVybiBNYXRoLmNlaWwod2lkdGggLyA0KSAqIE1hdGguY2VpbChoZWlnaHQgLyA0KSAqIDg7CiAgICBjYXNlIFJFRF9HUkVFTl9SR1RDMl9Gb3JtYXQ6CiAgICBjYXNlIFNJR05FRF9SRURfR1JFRU5fUkdUQzJfRm9ybWF0OgogICAgICByZXR1cm4gTWF0aC5jZWlsKHdpZHRoIC8gNCkgKiBNYXRoLmNlaWwoaGVpZ2h0IC8gNCkgKiAxNjsKICB9CiAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZGV0ZXJtaW5lIHRleHR1cmUgYnl0ZSBsZW5ndGggZm9yICR7Zm9ybWF0fSBmb3JtYXQuYCk7Cn0KZnVuY3Rpb24gZ2V0VGV4dHVyZVR5cGVCeXRlTGVuZ3RoKHR5cGUpIHsKICBzd2l0Y2ggKHR5cGUpIHsKICAgIGNhc2UgVW5zaWduZWRCeXRlVHlwZToKICAgIGNhc2UgQnl0ZVR5cGU6CiAgICAgIHJldHVybiB7IGJ5dGVMZW5ndGg6IDEsIGNvbXBvbmVudHM6IDEgfTsKICAgIGNhc2UgVW5zaWduZWRTaG9ydFR5cGU6CiAgICBjYXNlIFNob3J0VHlwZToKICAgIGNhc2UgSGFsZkZsb2F0VHlwZToKICAgICAgcmV0dXJuIHsgYnl0ZUxlbmd0aDogMiwgY29tcG9uZW50czogMSB9OwogICAgY2FzZSBVbnNpZ25lZFNob3J0NDQ0NFR5cGU6CiAgICBjYXNlIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZToKICAgICAgcmV0dXJuIHsgYnl0ZUxlbmd0aDogMiwgY29tcG9uZW50czogNCB9OwogICAgY2FzZSBVbnNpZ25lZEludFR5cGU6CiAgICBjYXNlIEludFR5cGU6CiAgICBjYXNlIEZsb2F0VHlwZToKICAgICAgcmV0dXJuIHsgYnl0ZUxlbmd0aDogNCwgY29tcG9uZW50czogMSB9OwogICAgY2FzZSBVbnNpZ25lZEludDU5OTlUeXBlOgogICAgICByZXR1cm4geyBieXRlTGVuZ3RoOiA0LCBjb21wb25lbnRzOiAzIH07CiAgfQogIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0ZXh0dXJlIHR5cGUgJHt0eXBlfS5gKTsKfQp2YXIgUkVWSVNJT04gPSAiMTczIiwgTU9VU0UsIFRPVUNILCBDdWxsRmFjZU5vbmUgPSAwLCBDdWxsRmFjZUJhY2sgPSAxLCBDdWxsRmFjZUZyb250ID0gMiwgQ3VsbEZhY2VGcm9udEJhY2sgPSAzLCBCYXNpY1NoYWRvd01hcCA9IDAsIFBDRlNoYWRvd01hcCA9IDEsIFBDRlNvZnRTaGFkb3dNYXAgPSAyLCBWU01TaGFkb3dNYXAgPSAzLCBGcm9udFNpZGUgPSAwLCBCYWNrU2lkZSA9IDEsIERvdWJsZVNpZGUgPSAyLCBOb0JsZW5kaW5nID0gMCwgTm9ybWFsQmxlbmRpbmcgPSAxLCBBZGRpdGl2ZUJsZW5kaW5nID0gMiwgU3VidHJhY3RpdmVCbGVuZGluZyA9IDMsIE11bHRpcGx5QmxlbmRpbmcgPSA0LCBDdXN0b21CbGVuZGluZyA9IDUsIEFkZEVxdWF0aW9uID0gMTAwLCBTdWJ0cmFjdEVxdWF0aW9uID0gMTAxLCBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiA9IDEwMiwgTWluRXF1YXRpb24gPSAxMDMsIE1heEVxdWF0aW9uID0gMTA0LCBaZXJvRmFjdG9yID0gMjAwLCBPbmVGYWN0b3IgPSAyMDEsIFNyY0NvbG9yRmFjdG9yID0gMjAyLCBPbmVNaW51c1NyY0NvbG9yRmFjdG9yID0gMjAzLCBTcmNBbHBoYUZhY3RvciA9IDIwNCwgT25lTWludXNTcmNBbHBoYUZhY3RvciA9IDIwNSwgRHN0QWxwaGFGYWN0b3IgPSAyMDYsIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IgPSAyMDcsIERzdENvbG9yRmFjdG9yID0gMjA4LCBPbmVNaW51c0RzdENvbG9yRmFjdG9yID0gMjA5LCBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yID0gMjEwLCBDb25zdGFudENvbG9yRmFjdG9yID0gMjExLCBPbmVNaW51c0NvbnN0YW50Q29sb3JGYWN0b3IgPSAyMTIsIENvbnN0YW50QWxwaGFGYWN0b3IgPSAyMTMsIE9uZU1pbnVzQ29uc3RhbnRBbHBoYUZhY3RvciA9IDIxNCwgTmV2ZXJEZXB0aCA9IDAsIEFsd2F5c0RlcHRoID0gMSwgTGVzc0RlcHRoID0gMiwgTGVzc0VxdWFsRGVwdGggPSAzLCBFcXVhbERlcHRoID0gNCwgR3JlYXRlckVxdWFsRGVwdGggPSA1LCBHcmVhdGVyRGVwdGggPSA2LCBOb3RFcXVhbERlcHRoID0gNywgTXVsdGlwbHlPcGVyYXRpb24gPSAwLCBNaXhPcGVyYXRpb24gPSAxLCBBZGRPcGVyYXRpb24gPSAyLCBOb1RvbmVNYXBwaW5nID0gMCwgTGluZWFyVG9uZU1hcHBpbmcgPSAxLCBSZWluaGFyZFRvbmVNYXBwaW5nID0gMiwgQ2luZW9uVG9uZU1hcHBpbmcgPSAzLCBBQ0VTRmlsbWljVG9uZU1hcHBpbmcgPSA0LCBDdXN0b21Ub25lTWFwcGluZyA9IDUsIEFnWFRvbmVNYXBwaW5nID0gNiwgTmV1dHJhbFRvbmVNYXBwaW5nID0gNywgQXR0YWNoZWRCaW5kTW9kZSA9ICJhdHRhY2hlZCIsIERldGFjaGVkQmluZE1vZGUgPSAiZGV0YWNoZWQiLCBVVk1hcHBpbmcgPSAzMDAsIEN1YmVSZWZsZWN0aW9uTWFwcGluZyA9IDMwMSwgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nID0gMzAyLCBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyA9IDMwMywgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcgPSAzMDQsIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nID0gMzA2LCBSZXBlYXRXcmFwcGluZyA9IDEwMDAsIENsYW1wVG9FZGdlV3JhcHBpbmcgPSAxMDAxLCBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nID0gMTAwMiwgTmVhcmVzdEZpbHRlciA9IDEwMDMsIE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyID0gMTAwNCwgTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIgPSAxMDA0LCBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyID0gMTAwNSwgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciA9IDEwMDUsIExpbmVhckZpbHRlciA9IDEwMDYsIExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIgPSAxMDA3LCBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNywgTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyID0gMTAwOCwgTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyID0gMTAwOCwgVW5zaWduZWRCeXRlVHlwZSA9IDEwMDksIEJ5dGVUeXBlID0gMTAxMCwgU2hvcnRUeXBlID0gMTAxMSwgVW5zaWduZWRTaG9ydFR5cGUgPSAxMDEyLCBJbnRUeXBlID0gMTAxMywgVW5zaWduZWRJbnRUeXBlID0gMTAxNCwgRmxvYXRUeXBlID0gMTAxNSwgSGFsZkZsb2F0VHlwZSA9IDEwMTYsIFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSA9IDEwMTcsIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSA9IDEwMTgsIFVuc2lnbmVkSW50MjQ4VHlwZSA9IDEwMjAsIFVuc2lnbmVkSW50NTk5OVR5cGUgPSAzNTkwMiwgQWxwaGFGb3JtYXQgPSAxMDIxLCBSR0JGb3JtYXQgPSAxMDIyLCBSR0JBRm9ybWF0ID0gMTAyMywgTHVtaW5hbmNlRm9ybWF0ID0gMTAyNCwgTHVtaW5hbmNlQWxwaGFGb3JtYXQgPSAxMDI1LCBEZXB0aEZvcm1hdCA9IDEwMjYsIERlcHRoU3RlbmNpbEZvcm1hdCA9IDEwMjcsIFJlZEZvcm1hdCA9IDEwMjgsIFJlZEludGVnZXJGb3JtYXQgPSAxMDI5LCBSR0Zvcm1hdCA9IDEwMzAsIFJHSW50ZWdlckZvcm1hdCA9IDEwMzEsIFJHQkludGVnZXJGb3JtYXQgPSAxMDMyLCBSR0JBSW50ZWdlckZvcm1hdCA9IDEwMzMsIFJHQl9TM1RDX0RYVDFfRm9ybWF0ID0gMzM3NzYsIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCA9IDMzNzc3LCBSR0JBX1MzVENfRFhUM19Gb3JtYXQgPSAzMzc3OCwgUkdCQV9TM1RDX0RYVDVfRm9ybWF0ID0gMzM3NzksIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0ID0gMzU4NDAsIFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ID0gMzU4NDEsIFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCA9IDM1ODQyLCBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSAzNTg0MywgUkdCX0VUQzFfRm9ybWF0ID0gMzYxOTYsIFJHQl9FVEMyX0Zvcm1hdCA9IDM3NDkyLCBSR0JBX0VUQzJfRUFDX0Zvcm1hdCA9IDM3NDk2LCBSR0JBX0FTVENfNHg0X0Zvcm1hdCA9IDM3ODA4LCBSR0JBX0FTVENfNXg0X0Zvcm1hdCA9IDM3ODA5LCBSR0JBX0FTVENfNXg1X0Zvcm1hdCA9IDM3ODEwLCBSR0JBX0FTVENfNng1X0Zvcm1hdCA9IDM3ODExLCBSR0JBX0FTVENfNng2X0Zvcm1hdCA9IDM3ODEyLCBSR0JBX0FTVENfOHg1X0Zvcm1hdCA9IDM3ODEzLCBSR0JBX0FTVENfOHg2X0Zvcm1hdCA9IDM3ODE0LCBSR0JBX0FTVENfOHg4X0Zvcm1hdCA9IDM3ODE1LCBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgPSAzNzgxNiwgUkdCQV9BU1RDXzEweDZfRm9ybWF0ID0gMzc4MTcsIFJHQkFfQVNUQ18xMHg4X0Zvcm1hdCA9IDM3ODE4LCBSR0JBX0FTVENfMTB4MTBfRm9ybWF0ID0gMzc4MTksIFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQgPSAzNzgyMCwgUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCA9IDM3ODIxLCBSR0JBX0JQVENfRm9ybWF0ID0gMzY0OTIsIFJHQl9CUFRDX1NJR05FRF9Gb3JtYXQgPSAzNjQ5NCwgUkdCX0JQVENfVU5TSUdORURfRm9ybWF0ID0gMzY0OTUsIFJFRF9SR1RDMV9Gb3JtYXQgPSAzNjI4MywgU0lHTkVEX1JFRF9SR1RDMV9Gb3JtYXQgPSAzNjI4NCwgUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCA9IDM2Mjg1LCBTSUdORURfUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCA9IDM2Mjg2LCBMb29wT25jZSA9IDIyMDAsIExvb3BSZXBlYXQgPSAyMjAxLCBMb29wUGluZ1BvbmcgPSAyMjAyLCBJbnRlcnBvbGF0ZURpc2NyZXRlID0gMjMwMCwgSW50ZXJwb2xhdGVMaW5lYXIgPSAyMzAxLCBJbnRlcnBvbGF0ZVNtb290aCA9IDIzMDIsIFplcm9DdXJ2YXR1cmVFbmRpbmcgPSAyNDAwLCBaZXJvU2xvcGVFbmRpbmcgPSAyNDAxLCBXcmFwQXJvdW5kRW5kaW5nID0gMjQwMiwgTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlID0gMjUwMCwgQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGUgPSAyNTAxLCBUcmlhbmdsZXNEcmF3TW9kZSA9IDAsIFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSA9IDEsIFRyaWFuZ2xlRmFuRHJhd01vZGUgPSAyLCBCYXNpY0RlcHRoUGFja2luZyA9IDMyMDAsIFJHQkFEZXB0aFBhY2tpbmcgPSAzMjAxLCBSR0JEZXB0aFBhY2tpbmcgPSAzMjAyLCBSR0RlcHRoUGFja2luZyA9IDMyMDMsIFRhbmdlbnRTcGFjZU5vcm1hbE1hcCA9IDAsIE9iamVjdFNwYWNlTm9ybWFsTWFwID0gMSwgTm9Db2xvclNwYWNlID0gIiIsIFNSR0JDb2xvclNwYWNlID0gInNyZ2IiLCBMaW5lYXJTUkdCQ29sb3JTcGFjZSA9ICJzcmdiLWxpbmVhciIsIExpbmVhclRyYW5zZmVyID0gImxpbmVhciIsIFNSR0JUcmFuc2ZlciA9ICJzcmdiIiwgWmVyb1N0ZW5jaWxPcCA9IDAsIEtlZXBTdGVuY2lsT3AgPSA3NjgwLCBSZXBsYWNlU3RlbmNpbE9wID0gNzY4MSwgSW5jcmVtZW50U3RlbmNpbE9wID0gNzY4MiwgRGVjcmVtZW50U3RlbmNpbE9wID0gNzY4MywgSW5jcmVtZW50V3JhcFN0ZW5jaWxPcCA9IDM0MDU1LCBEZWNyZW1lbnRXcmFwU3RlbmNpbE9wID0gMzQwNTYsIEludmVydFN0ZW5jaWxPcCA9IDUzODYsIE5ldmVyU3RlbmNpbEZ1bmMgPSA1MTIsIExlc3NTdGVuY2lsRnVuYyA9IDUxMywgRXF1YWxTdGVuY2lsRnVuYyA9IDUxNCwgTGVzc0VxdWFsU3RlbmNpbEZ1bmMgPSA1MTUsIEdyZWF0ZXJTdGVuY2lsRnVuYyA9IDUxNiwgTm90RXF1YWxTdGVuY2lsRnVuYyA9IDUxNywgR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmMgPSA1MTgsIEFsd2F5c1N0ZW5jaWxGdW5jID0gNTE5LCBOZXZlckNvbXBhcmUgPSA1MTIsIExlc3NDb21wYXJlID0gNTEzLCBFcXVhbENvbXBhcmUgPSA1MTQsIExlc3NFcXVhbENvbXBhcmUgPSA1MTUsIEdyZWF0ZXJDb21wYXJlID0gNTE2LCBOb3RFcXVhbENvbXBhcmUgPSA1MTcsIEdyZWF0ZXJFcXVhbENvbXBhcmUgPSA1MTgsIEFsd2F5c0NvbXBhcmUgPSA1MTksIFN0YXRpY0RyYXdVc2FnZSA9IDM1MDQ0LCBEeW5hbWljRHJhd1VzYWdlID0gMzUwNDgsIFN0cmVhbURyYXdVc2FnZSA9IDM1MDQwLCBTdGF0aWNSZWFkVXNhZ2UgPSAzNTA0NSwgRHluYW1pY1JlYWRVc2FnZSA9IDM1MDQ5LCBTdHJlYW1SZWFkVXNhZ2UgPSAzNTA0MSwgU3RhdGljQ29weVVzYWdlID0gMzUwNDYsIER5bmFtaWNDb3B5VXNhZ2UgPSAzNTA1MCwgU3RyZWFtQ29weVVzYWdlID0gMzUwNDIsIEdMU0wxID0gIjEwMCIsIEdMU0wzID0gIjMwMCBlcyIsIFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSA9IDIwMDAsIFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0gPSAyMDAxLCBUaW1lc3RhbXBRdWVyeSwgX2x1dCwgX3NlZWQgPSAxMjM0NTY3LCBERUcyUkFELCBSQUQyREVHLCBNYXRoVXRpbHMsIFZlY3RvcjIsIF9tMywgVFlQRURfQVJSQVlTLCBfY2FjaGUsIExJTkVBUl9SRUM3MDlfVE9fWFlaLCBYWVpfVE9fTElORUFSX1JFQzcwOSwgQ29sb3JNYW5hZ2VtZW50LCBfY2FudmFzLCBfc291cmNlSWQgPSAwLCBfdGV4dHVyZUlkID0gMCwgVGV4dHVyZSwgVmVjdG9yNCwgUmVuZGVyVGFyZ2V0LCBXZWJHTFJlbmRlclRhcmdldCwgRGF0YUFycmF5VGV4dHVyZSwgV2ViR0xBcnJheVJlbmRlclRhcmdldCwgRGF0YTNEVGV4dHVyZSwgV2ViR0wzRFJlbmRlclRhcmdldCwgUXVhdGVybmlvbiwgVmVjdG9yMywgX3ZlY3RvciRjLCBfcXVhdGVybmlvbiQ0LCBfcG9pbnRzLCBfdmVjdG9yJGIsIF9ib3gkNCwgX3YwJDIsIF92MSQ3LCBfdjIkNCwgX2YwLCBfZjEsIF9mMiwgX2NlbnRlciwgX2V4dGVudHMsIF90cmlhbmdsZU5vcm1hbCwgX3Rlc3RBeGlzLCBfYm94JDMsIF92MSQ2LCBfdjIkMywgX3ZlY3RvciRhLCBfc2VnQ2VudGVyLCBfc2VnRGlyLCBfZGlmZiwgX2VkZ2UxLCBfZWRnZTIsIF9ub3JtYWwkMSwgX3YxJDUsIF9tMSQyLCBfemVybywgX29uZSwgX3gsIF95LCBfeiwgX21hdHJpeCQyLCBfcXVhdGVybmlvbiQzLCBFdWxlciwgX29iamVjdDNESWQgPSAwLCBfdjEkNCwgX3ExLCBfbTEkMSwgX3RhcmdldCwgX3Bvc2l0aW9uJDMsIF9zY2FsZSQyLCBfcXVhdGVybmlvbiQyLCBfeEF4aXMsIF95QXhpcywgX3pBeGlzLCBfYWRkZWRFdmVudCwgX3JlbW92ZWRFdmVudCwgX2NoaWxkYWRkZWRFdmVudCwgX2NoaWxkcmVtb3ZlZEV2ZW50LCBPYmplY3QzRCwgX3YwJDEsIF92MSQzLCBfdjIkMiwgX3YzJDIsIF92YWIsIF92YWMsIF92YmMsIF92YXAsIF92YnAsIF92Y3AsIF92NDAsIF92NDEsIF92NDIsIF9jb2xvcktleXdvcmRzLCBfaHNsQSwgX2hzbEIsIENvbG9yLCBfY29sb3IsIF9tYXRlcmlhbElkID0gMCwgTWF0ZXJpYWwsIE1lc2hCYXNpY01hdGVyaWFsLCBfdGFibGVzLCBEYXRhVXRpbHMsIF92ZWN0b3IkOSwgX3ZlY3RvcjIkMSwgX2lkJDIgPSAwLCBJbnQ4QnVmZmVyQXR0cmlidXRlLCBVaW50OEJ1ZmZlckF0dHJpYnV0ZSwgVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLCBJbnQxNkJ1ZmZlckF0dHJpYnV0ZSwgVWludDE2QnVmZmVyQXR0cmlidXRlLCBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSwgVWludDMyQnVmZmVyQXR0cmlidXRlLCBGbG9hdDE2QnVmZmVyQXR0cmlidXRlLCBGbG9hdDMyQnVmZmVyQXR0cmlidXRlLCBfaWQkMSA9IDAsIF9tMSwgX29iaiwgX29mZnNldCwgX2JveCQyLCBfYm94TW9ycGhUYXJnZXRzLCBfdmVjdG9yJDgsIEJ1ZmZlckdlb21ldHJ5LCBfaW52ZXJzZU1hdHJpeCQzLCBfcmF5JDMsIF9zcGhlcmUkNiwgX3NwaGVyZUhpdEF0LCBfdkEkMSwgX3ZCJDEsIF92QyQxLCBfdGVtcEEsIF9tb3JwaEEsIF9pbnRlcnNlY3Rpb25Qb2ludCwgX2ludGVyc2VjdGlvblBvaW50V29ybGQsIE1lc2gsIEJveEdlb21ldHJ5LCBVbmlmb3Jtc1V0aWxzLCBkZWZhdWx0X3ZlcnRleCA9IGB2b2lkIG1haW4oKSB7CglnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7Cn1gLCBkZWZhdWx0X2ZyYWdtZW50ID0gYHZvaWQgbWFpbigpIHsKCWdsX0ZyYWdDb2xvciA9IHZlYzQoIDEuMCwgMC4wLCAwLjAsIDEuMCApOwp9YCwgU2hhZGVyTWF0ZXJpYWwsIENhbWVyYSwgX3YzJDEsIF9taW5UYXJnZXQsIF9tYXhUYXJnZXQsIFBlcnNwZWN0aXZlQ2FtZXJhLCBmb3YgPSAtOTAsIGFzcGVjdCA9IDEsIEN1YmVDYW1lcmEsIEN1YmVUZXh0dXJlLCBXZWJHTEN1YmVSZW5kZXJUYXJnZXQsIEdyb3VwLCBfbW92ZUV2ZW50LCBTY2VuZSwgX3ZlY3RvciQ3LCBTcHJpdGVNYXRlcmlhbCwgX2dlb21ldHJ5LCBfaW50ZXJzZWN0UG9pbnQsIF93b3JsZFNjYWxlLCBfbXZQb3NpdGlvbiwgX2FsaWduZWRQb3NpdGlvbiwgX3JvdGF0ZWRQb3NpdGlvbiwgX3ZpZXdXb3JsZE1hdHJpeCwgX3ZBLCBfdkIsIF92QywgX3V2QSwgX3V2QiwgX3V2QywgU3ByaXRlLCBfdjEkMiwgX3YyJDEsIExPRCwgX2Jhc2VQb3NpdGlvbiwgX3NraW5JbmRleCwgX3NraW5XZWlnaHQsIF92ZWN0b3IzLCBfbWF0cml4NCwgX3ZlcnRleCwgX3NwaGVyZSQ1LCBfaW52ZXJzZU1hdHJpeCQyLCBfcmF5JDIsIFNraW5uZWRNZXNoLCBCb25lLCBEYXRhVGV4dHVyZSwgX29mZnNldE1hdHJpeCwgX2lkZW50aXR5TWF0cml4LCBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUsIF9pbnN0YW5jZUxvY2FsTWF0cml4LCBfaW5zdGFuY2VXb3JsZE1hdHJpeCwgX2luc3RhbmNlSW50ZXJzZWN0cywgX2JveDMsIF9pZGVudGl0eSwgX21lc2gkMSwgX3NwaGVyZSQ0LCBJbnN0YW5jZWRNZXNoLCBfdmVjdG9yMSwgX3ZlY3RvcjIsIF9ub3JtYWxNYXRyaXgsIF9zcGhlcmUkMywgX3ZlY3RvciQ2LCBfbWF0cml4JDEsIF93aGl0ZUNvbG9yLCBfZnJ1c3R1bSwgX2JveCQxLCBfc3BoZXJlJDIsIF92ZWN0b3IkNSwgX2ZvcndhcmQsIF90ZW1wLCBfcmVuZGVyTGlzdCwgX21lc2gsIF9iYXRjaEludGVyc2VjdHMsIEJhdGNoZWRNZXNoLCBMaW5lQmFzaWNNYXRlcmlhbCwgX3ZTdGFydCwgX3ZFbmQsIF9pbnZlcnNlTWF0cml4JDEsIF9yYXkkMSwgX3NwaGVyZSQxLCBfaW50ZXJzZWN0UG9pbnRPblJheSwgX2ludGVyc2VjdFBvaW50T25TZWdtZW50LCBMaW5lLCBfc3RhcnQsIF9lbmQsIExpbmVTZWdtZW50cywgTGluZUxvb3AsIFBvaW50c01hdGVyaWFsLCBfaW52ZXJzZU1hdHJpeCwgX3JheSwgX3NwaGVyZSwgX3Bvc2l0aW9uJDIsIFBvaW50cywgVmlkZW9UZXh0dXJlLCBWaWRlb0ZyYW1lVGV4dHVyZSwgRnJhbWVidWZmZXJUZXh0dXJlLCBDb21wcmVzc2VkVGV4dHVyZSwgQ29tcHJlc3NlZEFycmF5VGV4dHVyZSwgQ29tcHJlc3NlZEN1YmVUZXh0dXJlLCBDYW52YXNUZXh0dXJlLCBEZXB0aFRleHR1cmUsIEVsbGlwc2VDdXJ2ZSwgQXJjQ3VydmUsIHRtcCwgcHgsIHB5LCBweiwgQ2F0bXVsbFJvbUN1cnZlMywgQ3ViaWNCZXppZXJDdXJ2ZSwgQ3ViaWNCZXppZXJDdXJ2ZTMsIExpbmVDdXJ2ZSwgTGluZUN1cnZlMywgUXVhZHJhdGljQmV6aWVyQ3VydmUsIFF1YWRyYXRpY0JlemllckN1cnZlMywgU3BsaW5lQ3VydmUsIEN1cnZlcywgQ3VydmVQYXRoLCBQYXRoLCBMYXRoZUdlb21ldHJ5LCBDYXBzdWxlR2VvbWV0cnksIENpcmNsZUdlb21ldHJ5LCBDeWxpbmRlckdlb21ldHJ5LCBDb25lR2VvbWV0cnksIFBvbHloZWRyb25HZW9tZXRyeSwgRG9kZWNhaGVkcm9uR2VvbWV0cnksIF92MCwgX3YxJDEsIF9ub3JtYWwsIF90cmlhbmdsZSwgRWRnZXNHZW9tZXRyeSwgU2hhcGUsIEVhcmN1dCwgRXh0cnVkZUdlb21ldHJ5LCBXb3JsZFVWR2VuZXJhdG9yLCBJY29zYWhlZHJvbkdlb21ldHJ5LCBPY3RhaGVkcm9uR2VvbWV0cnksIFBsYW5lR2VvbWV0cnksIFJpbmdHZW9tZXRyeSwgU2hhcGVHZW9tZXRyeSwgU3BoZXJlR2VvbWV0cnksIFRldHJhaGVkcm9uR2VvbWV0cnksIFRvcnVzR2VvbWV0cnksIFRvcnVzS25vdEdlb21ldHJ5LCBUdWJlR2VvbWV0cnksIFdpcmVmcmFtZUdlb21ldHJ5LCBHZW9tZXRyaWVzLCBTaGFkb3dNYXRlcmlhbCwgUmF3U2hhZGVyTWF0ZXJpYWwsIE1lc2hTdGFuZGFyZE1hdGVyaWFsLCBNZXNoUGh5c2ljYWxNYXRlcmlhbCwgTWVzaFBob25nTWF0ZXJpYWwsIE1lc2hUb29uTWF0ZXJpYWwsIE1lc2hOb3JtYWxNYXRlcmlhbCwgTWVzaExhbWJlcnRNYXRlcmlhbCwgTWVzaERlcHRoTWF0ZXJpYWwsIE1lc2hEaXN0YW5jZU1hdGVyaWFsLCBNZXNoTWF0Y2FwTWF0ZXJpYWwsIExpbmVEYXNoZWRNYXRlcmlhbCwgQW5pbWF0aW9uVXRpbHMsIEN1YmljSW50ZXJwb2xhbnQsIExpbmVhckludGVycG9sYW50LCBEaXNjcmV0ZUludGVycG9sYW50LCBCb29sZWFuS2V5ZnJhbWVUcmFjaywgQ29sb3JLZXlmcmFtZVRyYWNrLCBOdW1iZXJLZXlmcmFtZVRyYWNrLCBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLCBTdHJpbmdLZXlmcmFtZVRyYWNrLCBWZWN0b3JLZXlmcmFtZVRyYWNrLCBDYWNoZSwgRGVmYXVsdExvYWRpbmdNYW5hZ2VyLCBsb2FkaW5nLCBIdHRwRXJyb3IsIEZpbGVMb2FkZXIsIEFuaW1hdGlvbkxvYWRlciwgQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIsIEltYWdlTG9hZGVyLCBDdWJlVGV4dHVyZUxvYWRlciwgRGF0YVRleHR1cmVMb2FkZXIsIFRleHR1cmVMb2FkZXIsIExpZ2h0LCBIZW1pc3BoZXJlTGlnaHQsIF9wcm9qU2NyZWVuTWF0cml4JDEsIF9saWdodFBvc2l0aW9uV29ybGQkMSwgX2xvb2tUYXJnZXQkMSwgU3BvdExpZ2h0U2hhZG93LCBTcG90TGlnaHQsIF9wcm9qU2NyZWVuTWF0cml4LCBfbGlnaHRQb3NpdGlvbldvcmxkLCBfbG9va1RhcmdldCwgUG9pbnRMaWdodFNoYWRvdywgUG9pbnRMaWdodCwgT3J0aG9ncmFwaGljQ2FtZXJhLCBEaXJlY3Rpb25hbExpZ2h0U2hhZG93LCBEaXJlY3Rpb25hbExpZ2h0LCBBbWJpZW50TGlnaHQsIFJlY3RBcmVhTGlnaHQsIExpZ2h0UHJvYmUsIE1hdGVyaWFsTG9hZGVyLCBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSwgQnVmZmVyR2VvbWV0cnlMb2FkZXIsIE9iamVjdExvYWRlciwgVEVYVFVSRV9NQVBQSU5HLCBURVhUVVJFX1dSQVBQSU5HLCBURVhUVVJFX0ZJTFRFUiwgSW1hZ2VCaXRtYXBMb2FkZXIsIF9jb250ZXh0LCBBdWRpb0xvYWRlciwgX2V5ZVJpZ2h0LCBfZXllTGVmdCwgX3Byb2plY3Rpb25NYXRyaXgsIEFycmF5Q2FtZXJhLCBfcG9zaXRpb24kMSwgX3F1YXRlcm5pb24kMSwgX3NjYWxlJDEsIF9vcmllbnRhdGlvbiQxLCBBdWRpb0xpc3RlbmVyLCBBdWRpbywgX3Bvc2l0aW9uLCBfcXVhdGVybmlvbiwgX3NjYWxlLCBfb3JpZW50YXRpb24sIFBvc2l0aW9uYWxBdWRpbywgX1JFU0VSVkVEX0NIQVJTX1JFID0gIlxcW1xcXVxcLjpcXC8iLCBfcmVzZXJ2ZWRSZSwgX3dvcmRDaGFyLCBfd29yZENoYXJPckRvdCwgX2RpcmVjdG9yeVJlLCBfbm9kZVJlLCBfb2JqZWN0UmUsIF9wcm9wZXJ0eVJlLCBfdHJhY2tSZSwgX3N1cHBvcnRlZE9iamVjdE5hbWVzLCBfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciwgQW5pbWF0aW9uTWl4ZXIsIFJlbmRlclRhcmdldDNELCBSZW5kZXJUYXJnZXRBcnJheSwgX2lkID0gMCwgVW5pZm9ybXNHcm91cCwgSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIsIF9tYXRyaXgsIF92ZWN0b3IkNCwgX3N0YXJ0UCwgX3N0YXJ0RW5kLCBfdmVjdG9yJDMsIFNwb3RMaWdodEhlbHBlciwgX3ZlY3RvciQyLCBfYm9uZU1hdHJpeCwgX21hdHJpeFdvcmxkSW52LCBTa2VsZXRvbkhlbHBlciwgUG9pbnRMaWdodEhlbHBlciwgX3ZlY3RvciQxLCBfY29sb3IxLCBfY29sb3IyLCBIZW1pc3BoZXJlTGlnaHRIZWxwZXIsIEdyaWRIZWxwZXIsIFBvbGFyR3JpZEhlbHBlciwgX3YxLCBfdjIsIF92MywgRGlyZWN0aW9uYWxMaWdodEhlbHBlciwgX3ZlY3RvciwgX2NhbWVyYSwgQ2FtZXJhSGVscGVyLCBfYm94LCBCb3hIZWxwZXIsIEJveDNIZWxwZXIsIFBsYW5lSGVscGVyLCBfYXhpcywgX2xpbmVHZW9tZXRyeSwgX2NvbmVHZW9tZXRyeSwgQXJyb3dIZWxwZXIsIEF4ZXNIZWxwZXIsIENvbnRyb2xzLCBUZXh0dXJlVXRpbHM7CnZhciBpbml0X3RocmVlX2NvcmUgPSBfX2VzbSgoKSA9PiB7CiAgTU9VU0UgPSB7IExFRlQ6IDAsIE1JRERMRTogMSwgUklHSFQ6IDIsIFJPVEFURTogMCwgRE9MTFk6IDEsIFBBTjogMiB9OwogIFRPVUNIID0geyBST1RBVEU6IDAsIFBBTjogMSwgRE9MTFlfUEFOOiAyLCBET0xMWV9ST1RBVEU6IDMgfTsKICBUaW1lc3RhbXBRdWVyeSA9IHsKICAgIENPTVBVVEU6ICJjb21wdXRlIiwKICAgIFJFTkRFUjogInJlbmRlciIKICB9OwogIF9sdXQgPSBbIjAwIiwgIjAxIiwgIjAyIiwgIjAzIiwgIjA0IiwgIjA1IiwgIjA2IiwgIjA3IiwgIjA4IiwgIjA5IiwgIjBhIiwgIjBiIiwgIjBjIiwgIjBkIiwgIjBlIiwgIjBmIiwgIjEwIiwgIjExIiwgIjEyIiwgIjEzIiwgIjE0IiwgIjE1IiwgIjE2IiwgIjE3IiwgIjE4IiwgIjE5IiwgIjFhIiwgIjFiIiwgIjFjIiwgIjFkIiwgIjFlIiwgIjFmIiwgIjIwIiwgIjIxIiwgIjIyIiwgIjIzIiwgIjI0IiwgIjI1IiwgIjI2IiwgIjI3IiwgIjI4IiwgIjI5IiwgIjJhIiwgIjJiIiwgIjJjIiwgIjJkIiwgIjJlIiwgIjJmIiwgIjMwIiwgIjMxIiwgIjMyIiwgIjMzIiwgIjM0IiwgIjM1IiwgIjM2IiwgIjM3IiwgIjM4IiwgIjM5IiwgIjNhIiwgIjNiIiwgIjNjIiwgIjNkIiwgIjNlIiwgIjNmIiwgIjQwIiwgIjQxIiwgIjQyIiwgIjQzIiwgIjQ0IiwgIjQ1IiwgIjQ2IiwgIjQ3IiwgIjQ4IiwgIjQ5IiwgIjRhIiwgIjRiIiwgIjRjIiwgIjRkIiwgIjRlIiwgIjRmIiwgIjUwIiwgIjUxIiwgIjUyIiwgIjUzIiwgIjU0IiwgIjU1IiwgIjU2IiwgIjU3IiwgIjU4IiwgIjU5IiwgIjVhIiwgIjViIiwgIjVjIiwgIjVkIiwgIjVlIiwgIjVmIiwgIjYwIiwgIjYxIiwgIjYyIiwgIjYzIiwgIjY0IiwgIjY1IiwgIjY2IiwgIjY3IiwgIjY4IiwgIjY5IiwgIjZhIiwgIjZiIiwgIjZjIiwgIjZkIiwgIjZlIiwgIjZmIiwgIjcwIiwgIjcxIiwgIjcyIiwgIjczIiwgIjc0IiwgIjc1IiwgIjc2IiwgIjc3IiwgIjc4IiwgIjc5IiwgIjdhIiwgIjdiIiwgIjdjIiwgIjdkIiwgIjdlIiwgIjdmIiwgIjgwIiwgIjgxIiwgIjgyIiwgIjgzIiwgIjg0IiwgIjg1IiwgIjg2IiwgIjg3IiwgIjg4IiwgIjg5IiwgIjhhIiwgIjhiIiwgIjhjIiwgIjhkIiwgIjhlIiwgIjhmIiwgIjkwIiwgIjkxIiwgIjkyIiwgIjkzIiwgIjk0IiwgIjk1IiwgIjk2IiwgIjk3IiwgIjk4IiwgIjk5IiwgIjlhIiwgIjliIiwgIjljIiwgIjlkIiwgIjllIiwgIjlmIiwgImEwIiwgImExIiwgImEyIiwgImEzIiwgImE0IiwgImE1IiwgImE2IiwgImE3IiwgImE4IiwgImE5IiwgImFhIiwgImFiIiwgImFjIiwgImFkIiwgImFlIiwgImFmIiwgImIwIiwgImIxIiwgImIyIiwgImIzIiwgImI0IiwgImI1IiwgImI2IiwgImI3IiwgImI4IiwgImI5IiwgImJhIiwgImJiIiwgImJjIiwgImJkIiwgImJlIiwgImJmIiwgImMwIiwgImMxIiwgImMyIiwgImMzIiwgImM0IiwgImM1IiwgImM2IiwgImM3IiwgImM4IiwgImM5IiwgImNhIiwgImNiIiwgImNjIiwgImNkIiwgImNlIiwgImNmIiwgImQwIiwgImQxIiwgImQyIiwgImQzIiwgImQ0IiwgImQ1IiwgImQ2IiwgImQ3IiwgImQ4IiwgImQ5IiwgImRhIiwgImRiIiwgImRjIiwgImRkIiwgImRlIiwgImRmIiwgImUwIiwgImUxIiwgImUyIiwgImUzIiwgImU0IiwgImU1IiwgImU2IiwgImU3IiwgImU4IiwgImU5IiwgImVhIiwgImViIiwgImVjIiwgImVkIiwgImVlIiwgImVmIiwgImYwIiwgImYxIiwgImYyIiwgImYzIiwgImY0IiwgImY1IiwgImY2IiwgImY3IiwgImY4IiwgImY5IiwgImZhIiwgImZiIiwgImZjIiwgImZkIiwgImZlIiwgImZmIl07CiAgREVHMlJBRCA9IE1hdGguUEkgLyAxODA7CiAgUkFEMkRFRyA9IDE4MCAvIE1hdGguUEk7CiAgTWF0aFV0aWxzID0gewogICAgREVHMlJBRCwKICAgIFJBRDJERUcsCiAgICBnZW5lcmF0ZVVVSUQsCiAgICBjbGFtcCwKICAgIGV1Y2xpZGVhbk1vZHVsbywKICAgIG1hcExpbmVhciwKICAgIGludmVyc2VMZXJwLAogICAgbGVycCwKICAgIGRhbXAsCiAgICBwaW5ncG9uZywKICAgIHNtb290aHN0ZXAsCiAgICBzbW9vdGhlcnN0ZXAsCiAgICByYW5kSW50LAogICAgcmFuZEZsb2F0LAogICAgcmFuZEZsb2F0U3ByZWFkLAogICAgc2VlZGVkUmFuZG9tLAogICAgZGVnVG9SYWQsCiAgICByYWRUb0RlZywKICAgIGlzUG93ZXJPZlR3bywKICAgIGNlaWxQb3dlck9mVHdvLAogICAgZmxvb3JQb3dlck9mVHdvLAogICAgc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlciwKICAgIG5vcm1hbGl6ZSwKICAgIGRlbm9ybWFsaXplCiAgfTsKICBWZWN0b3IyID0gY2xhc3MgVmVjdG9yMiB7CiAgICBjb25zdHJ1Y3Rvcih4ID0gMCwgeSA9IDApIHsKICAgICAgVmVjdG9yMi5wcm90b3R5cGUuaXNWZWN0b3IyID0gdHJ1ZTsKICAgICAgdGhpcy54ID0geDsKICAgICAgdGhpcy55ID0geTsKICAgIH0KICAgIGdldCB3aWR0aCgpIHsKICAgICAgcmV0dXJuIHRoaXMueDsKICAgIH0KICAgIHNldCB3aWR0aCh2YWx1ZSkgewogICAgICB0aGlzLnggPSB2YWx1ZTsKICAgIH0KICAgIGdldCBoZWlnaHQoKSB7CiAgICAgIHJldHVybiB0aGlzLnk7CiAgICB9CiAgICBzZXQgaGVpZ2h0KHZhbHVlKSB7CiAgICAgIHRoaXMueSA9IHZhbHVlOwogICAgfQogICAgc2V0KHgsIHkpIHsKICAgICAgdGhpcy54ID0geDsKICAgICAgdGhpcy55ID0geTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRTY2FsYXIoc2NhbGFyKSB7CiAgICAgIHRoaXMueCA9IHNjYWxhcjsKICAgICAgdGhpcy55ID0gc2NhbGFyOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldFgoeCkgewogICAgICB0aGlzLnggPSB4OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldFkoeSkgewogICAgICB0aGlzLnkgPSB5OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldENvbXBvbmVudChpbmRleCwgdmFsdWUpIHsKICAgICAgc3dpdGNoIChpbmRleCkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIHRoaXMueCA9IHZhbHVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgdGhpcy55ID0gdmFsdWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIgKyBpbmRleCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBnZXRDb21wb25lbnQoaW5kZXgpIHsKICAgICAgc3dpdGNoIChpbmRleCkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIHJldHVybiB0aGlzLng7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgcmV0dXJuIHRoaXMueTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIgKyBpbmRleCk7CiAgICAgIH0KICAgIH0KICAgIGNsb25lKCkgewogICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LCB0aGlzLnkpOwogICAgfQogICAgY29weSh2KSB7CiAgICAgIHRoaXMueCA9IHYueDsKICAgICAgdGhpcy55ID0gdi55OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGFkZCh2KSB7CiAgICAgIHRoaXMueCArPSB2Lng7CiAgICAgIHRoaXMueSArPSB2Lnk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgYWRkU2NhbGFyKHMpIHsKICAgICAgdGhpcy54ICs9IHM7CiAgICAgIHRoaXMueSArPSBzOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGFkZFZlY3RvcnMoYSwgYikgewogICAgICB0aGlzLnggPSBhLnggKyBiLng7CiAgICAgIHRoaXMueSA9IGEueSArIGIueTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBhZGRTY2FsZWRWZWN0b3IodiwgcykgewogICAgICB0aGlzLnggKz0gdi54ICogczsKICAgICAgdGhpcy55ICs9IHYueSAqIHM7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc3ViKHYpIHsKICAgICAgdGhpcy54IC09IHYueDsKICAgICAgdGhpcy55IC09IHYueTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzdWJTY2FsYXIocykgewogICAgICB0aGlzLnggLT0gczsKICAgICAgdGhpcy55IC09IHM7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc3ViVmVjdG9ycyhhLCBiKSB7CiAgICAgIHRoaXMueCA9IGEueCAtIGIueDsKICAgICAgdGhpcy55ID0gYS55IC0gYi55OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIG11bHRpcGx5KHYpIHsKICAgICAgdGhpcy54ICo9IHYueDsKICAgICAgdGhpcy55ICo9IHYueTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBtdWx0aXBseVNjYWxhcihzY2FsYXIpIHsKICAgICAgdGhpcy54ICo9IHNjYWxhcjsKICAgICAgdGhpcy55ICo9IHNjYWxhcjsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBkaXZpZGUodikgewogICAgICB0aGlzLnggLz0gdi54OwogICAgICB0aGlzLnkgLz0gdi55OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGRpdmlkZVNjYWxhcihzY2FsYXIpIHsKICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMSAvIHNjYWxhcik7CiAgICB9CiAgICBhcHBseU1hdHJpeDMobSkgewogICAgICBjb25zdCB4ID0gdGhpcy54LCB5ID0gdGhpcy55OwogICAgICBjb25zdCBlID0gbS5lbGVtZW50czsKICAgICAgdGhpcy54ID0gZVswXSAqIHggKyBlWzNdICogeSArIGVbNl07CiAgICAgIHRoaXMueSA9IGVbMV0gKiB4ICsgZVs0XSAqIHkgKyBlWzddOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIG1pbih2KSB7CiAgICAgIHRoaXMueCA9IE1hdGgubWluKHRoaXMueCwgdi54KTsKICAgICAgdGhpcy55ID0gTWF0aC5taW4odGhpcy55LCB2LnkpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIG1heCh2KSB7CiAgICAgIHRoaXMueCA9IE1hdGgubWF4KHRoaXMueCwgdi54KTsKICAgICAgdGhpcy55ID0gTWF0aC5tYXgodGhpcy55LCB2LnkpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGNsYW1wKG1pbiwgbWF4KSB7CiAgICAgIHRoaXMueCA9IGNsYW1wKHRoaXMueCwgbWluLngsIG1heC54KTsKICAgICAgdGhpcy55ID0gY2xhbXAodGhpcy55LCBtaW4ueSwgbWF4LnkpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGNsYW1wU2NhbGFyKG1pblZhbCwgbWF4VmFsKSB7CiAgICAgIHRoaXMueCA9IGNsYW1wKHRoaXMueCwgbWluVmFsLCBtYXhWYWwpOwogICAgICB0aGlzLnkgPSBjbGFtcCh0aGlzLnksIG1pblZhbCwgbWF4VmFsKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjbGFtcExlbmd0aChtaW4sIG1heCkgewogICAgICBjb25zdCBsZW5ndGggPSB0aGlzLmxlbmd0aCgpOwogICAgICByZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobGVuZ3RoIHx8IDEpLm11bHRpcGx5U2NhbGFyKGNsYW1wKGxlbmd0aCwgbWluLCBtYXgpKTsKICAgIH0KICAgIGZsb29yKCkgewogICAgICB0aGlzLnggPSBNYXRoLmZsb29yKHRoaXMueCk7CiAgICAgIHRoaXMueSA9IE1hdGguZmxvb3IodGhpcy55KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjZWlsKCkgewogICAgICB0aGlzLnggPSBNYXRoLmNlaWwodGhpcy54KTsKICAgICAgdGhpcy55ID0gTWF0aC5jZWlsKHRoaXMueSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcm91bmQoKSB7CiAgICAgIHRoaXMueCA9IE1hdGgucm91bmQodGhpcy54KTsKICAgICAgdGhpcy55ID0gTWF0aC5yb3VuZCh0aGlzLnkpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJvdW5kVG9aZXJvKCkgewogICAgICB0aGlzLnggPSBNYXRoLnRydW5jKHRoaXMueCk7CiAgICAgIHRoaXMueSA9IE1hdGgudHJ1bmModGhpcy55KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBuZWdhdGUoKSB7CiAgICAgIHRoaXMueCA9IC10aGlzLng7CiAgICAgIHRoaXMueSA9IC10aGlzLnk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZG90KHYpIHsKICAgICAgcmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueTsKICAgIH0KICAgIGNyb3NzKHYpIHsKICAgICAgcmV0dXJuIHRoaXMueCAqIHYueSAtIHRoaXMueSAqIHYueDsKICAgIH0KICAgIGxlbmd0aFNxKCkgewogICAgICByZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55OwogICAgfQogICAgbGVuZ3RoKCkgewogICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSk7CiAgICB9CiAgICBtYW5oYXR0YW5MZW5ndGgoKSB7CiAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLngpICsgTWF0aC5hYnModGhpcy55KTsKICAgIH0KICAgIG5vcm1hbGl6ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCkgfHwgMSk7CiAgICB9CiAgICBhbmdsZSgpIHsKICAgICAgY29uc3QgYW5nbGUgPSBNYXRoLmF0YW4yKC10aGlzLnksIC10aGlzLngpICsgTWF0aC5QSTsKICAgICAgcmV0dXJuIGFuZ2xlOwogICAgfQogICAgYW5nbGVUbyh2KSB7CiAgICAgIGNvbnN0IGRlbm9taW5hdG9yID0gTWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSAqIHYubGVuZ3RoU3EoKSk7CiAgICAgIGlmIChkZW5vbWluYXRvciA9PT0gMCkKICAgICAgICByZXR1cm4gTWF0aC5QSSAvIDI7CiAgICAgIGNvbnN0IHRoZXRhID0gdGhpcy5kb3QodikgLyBkZW5vbWluYXRvcjsKICAgICAgcmV0dXJuIE1hdGguYWNvcyhjbGFtcCh0aGV0YSwgLTEsIDEpKTsKICAgIH0KICAgIGRpc3RhbmNlVG8odikgewogICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodikpOwogICAgfQogICAgZGlzdGFuY2VUb1NxdWFyZWQodikgewogICAgICBjb25zdCBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlzLnkgLSB2Lnk7CiAgICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTsKICAgIH0KICAgIG1hbmhhdHRhbkRpc3RhbmNlVG8odikgewogICAgICByZXR1cm4gTWF0aC5hYnModGhpcy54IC0gdi54KSArIE1hdGguYWJzKHRoaXMueSAtIHYueSk7CiAgICB9CiAgICBzZXRMZW5ndGgobGVuZ3RoKSB7CiAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGxlbmd0aCk7CiAgICB9CiAgICBsZXJwKHYsIGFscGhhKSB7CiAgICAgIHRoaXMueCArPSAodi54IC0gdGhpcy54KSAqIGFscGhhOwogICAgICB0aGlzLnkgKz0gKHYueSAtIHRoaXMueSkgKiBhbHBoYTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBsZXJwVmVjdG9ycyh2MSwgdjIsIGFscGhhKSB7CiAgICAgIHRoaXMueCA9IHYxLnggKyAodjIueCAtIHYxLngpICogYWxwaGE7CiAgICAgIHRoaXMueSA9IHYxLnkgKyAodjIueSAtIHYxLnkpICogYWxwaGE7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZXF1YWxzKHYpIHsKICAgICAgcmV0dXJuIHYueCA9PT0gdGhpcy54ICYmIHYueSA9PT0gdGhpcy55OwogICAgfQogICAgZnJvbUFycmF5KGFycmF5LCBvZmZzZXQgPSAwKSB7CiAgICAgIHRoaXMueCA9IGFycmF5W29mZnNldF07CiAgICAgIHRoaXMueSA9IGFycmF5W29mZnNldCArIDFdOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHRvQXJyYXkoYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCkgewogICAgICBhcnJheVtvZmZzZXRdID0gdGhpcy54OwogICAgICBhcnJheVtvZmZzZXQgKyAxXSA9IHRoaXMueTsKICAgICAgcmV0dXJuIGFycmF5OwogICAgfQogICAgZnJvbUJ1ZmZlckF0dHJpYnV0ZShhdHRyaWJ1dGUsIGluZGV4KSB7CiAgICAgIHRoaXMueCA9IGF0dHJpYnV0ZS5nZXRYKGluZGV4KTsKICAgICAgdGhpcy55ID0gYXR0cmlidXRlLmdldFkoaW5kZXgpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJvdGF0ZUFyb3VuZChjZW50ZXIsIGFuZ2xlKSB7CiAgICAgIGNvbnN0IGMgPSBNYXRoLmNvcyhhbmdsZSksIHMgPSBNYXRoLnNpbihhbmdsZSk7CiAgICAgIGNvbnN0IHggPSB0aGlzLnggLSBjZW50ZXIueDsKICAgICAgY29uc3QgeSA9IHRoaXMueSAtIGNlbnRlci55OwogICAgICB0aGlzLnggPSB4ICogYyAtIHkgKiBzICsgY2VudGVyLng7CiAgICAgIHRoaXMueSA9IHggKiBzICsgeSAqIGMgKyBjZW50ZXIueTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByYW5kb20oKSB7CiAgICAgIHRoaXMueCA9IE1hdGgucmFuZG9tKCk7CiAgICAgIHRoaXMueSA9IE1hdGgucmFuZG9tKCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgKltTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgICB5aWVsZCB0aGlzLng7CiAgICAgIHlpZWxkIHRoaXMueTsKICAgIH0KICB9OwogIF9tMyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4MzsKICBUWVBFRF9BUlJBWVMgPSB7CiAgICBJbnQ4QXJyYXksCiAgICBVaW50OEFycmF5LAogICAgVWludDhDbGFtcGVkQXJyYXksCiAgICBJbnQxNkFycmF5LAogICAgVWludDE2QXJyYXksCiAgICBJbnQzMkFycmF5LAogICAgVWludDMyQXJyYXksCiAgICBGbG9hdDMyQXJyYXksCiAgICBGbG9hdDY0QXJyYXkKICB9OwogIF9jYWNoZSA9IHt9OwogIExJTkVBUl9SRUM3MDlfVE9fWFlaID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzKCkuc2V0KDAuNDEyMzkwOCwgMC4zNTc1ODQzLCAwLjE4MDQ4MDgsIDAuMjEyNjM5LCAwLjcxNTE2ODcsIDAuMDcyMTkyMywgMC4wMTkzMzA4LCAwLjExOTE5NDgsIDAuOTUwNTMyMik7CiAgWFlaX1RPX0xJTkVBUl9SRUM3MDkgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDMoKS5zZXQoMy4yNDA5Njk5LCAtMS41MzczODMyLCAtMC40OTg2MTA4LCAtMC45NjkyNDM2LCAxLjg3NTk2NzUsIDAuMDQxNTU1MSwgMC4wNTU2MzAxLCAtMC4yMDM5NzcsIDEuMDU2OTcxNSk7CiAgQ29sb3JNYW5hZ2VtZW50ID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUNvbG9yTWFuYWdlbWVudCgpOwogIFRleHR1cmUgPSBjbGFzcyBUZXh0dXJlIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHsKICAgIGNvbnN0cnVjdG9yKGltYWdlID0gVGV4dHVyZS5ERUZBVUxUX0lNQUdFLCBtYXBwaW5nID0gVGV4dHVyZS5ERUZBVUxUX01BUFBJTkcsIHdyYXBTID0gQ2xhbXBUb0VkZ2VXcmFwcGluZywgd3JhcFQgPSBDbGFtcFRvRWRnZVdyYXBwaW5nLCBtYWdGaWx0ZXIgPSBMaW5lYXJGaWx0ZXIsIG1pbkZpbHRlciA9IExpbmVhck1pcG1hcExpbmVhckZpbHRlciwgZm9ybWF0ID0gUkdCQUZvcm1hdCwgdHlwZSA9IFVuc2lnbmVkQnl0ZVR5cGUsIGFuaXNvdHJvcHkgPSBUZXh0dXJlLkRFRkFVTFRfQU5JU09UUk9QWSwgY29sb3JTcGFjZSA9IE5vQ29sb3JTcGFjZSkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzVGV4dHVyZSA9IHRydWU7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiaWQiLCB7IHZhbHVlOiBfdGV4dHVyZUlkKysgfSk7CiAgICAgIHRoaXMudXVpZCA9IGdlbmVyYXRlVVVJRCgpOwogICAgICB0aGlzLm5hbWUgPSAiIjsKICAgICAgdGhpcy5zb3VyY2UgPSBuZXcgU291cmNlKGltYWdlKTsKICAgICAgdGhpcy5taXBtYXBzID0gW107CiAgICAgIHRoaXMubWFwcGluZyA9IG1hcHBpbmc7CiAgICAgIHRoaXMuY2hhbm5lbCA9IDA7CiAgICAgIHRoaXMud3JhcFMgPSB3cmFwUzsKICAgICAgdGhpcy53cmFwVCA9IHdyYXBUOwogICAgICB0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlcjsKICAgICAgdGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXI7CiAgICAgIHRoaXMuYW5pc290cm9weSA9IGFuaXNvdHJvcHk7CiAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OwogICAgICB0aGlzLmludGVybmFsRm9ybWF0ID0gbnVsbDsKICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgdGhpcy5vZmZzZXQgPSBuZXcgVmVjdG9yMigwLCAwKTsKICAgICAgdGhpcy5yZXBlYXQgPSBuZXcgVmVjdG9yMigxLCAxKTsKICAgICAgdGhpcy5jZW50ZXIgPSBuZXcgVmVjdG9yMigwLCAwKTsKICAgICAgdGhpcy5yb3RhdGlvbiA9IDA7CiAgICAgIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHRydWU7CiAgICAgIHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDM7CiAgICAgIHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gdHJ1ZTsKICAgICAgdGhpcy5wcmVtdWx0aXBseUFscGhhID0gZmFsc2U7CiAgICAgIHRoaXMuZmxpcFkgPSB0cnVlOwogICAgICB0aGlzLnVucGFja0FsaWdubWVudCA9IDQ7CiAgICAgIHRoaXMuY29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7CiAgICAgIHRoaXMudXNlckRhdGEgPSB7fTsKICAgICAgdGhpcy52ZXJzaW9uID0gMDsKICAgICAgdGhpcy5vblVwZGF0ZSA9IG51bGw7CiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0ID0gbnVsbDsKICAgICAgdGhpcy5pc1JlbmRlclRhcmdldFRleHR1cmUgPSBmYWxzZTsKICAgICAgdGhpcy5wbXJlbVZlcnNpb24gPSAwOwogICAgfQogICAgZ2V0IGltYWdlKCkgewogICAgICByZXR1cm4gdGhpcy5zb3VyY2UuZGF0YTsKICAgIH0KICAgIHNldCBpbWFnZSh2YWx1ZSA9IG51bGwpIHsKICAgICAgdGhpcy5zb3VyY2UuZGF0YSA9IHZhbHVlOwogICAgfQogICAgdXBkYXRlTWF0cml4KCkgewogICAgICB0aGlzLm1hdHJpeC5zZXRVdlRyYW5zZm9ybSh0aGlzLm9mZnNldC54LCB0aGlzLm9mZnNldC55LCB0aGlzLnJlcGVhdC54LCB0aGlzLnJlcGVhdC55LCB0aGlzLnJvdGF0aW9uLCB0aGlzLmNlbnRlci54LCB0aGlzLmNlbnRlci55KTsKICAgIH0KICAgIGNsb25lKCkgewogICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpOwogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgdGhpcy5uYW1lID0gc291cmNlLm5hbWU7CiAgICAgIHRoaXMuc291cmNlID0gc291cmNlLnNvdXJjZTsKICAgICAgdGhpcy5taXBtYXBzID0gc291cmNlLm1pcG1hcHMuc2xpY2UoMCk7CiAgICAgIHRoaXMubWFwcGluZyA9IHNvdXJjZS5tYXBwaW5nOwogICAgICB0aGlzLmNoYW5uZWwgPSBzb3VyY2UuY2hhbm5lbDsKICAgICAgdGhpcy53cmFwUyA9IHNvdXJjZS53cmFwUzsKICAgICAgdGhpcy53cmFwVCA9IHNvdXJjZS53cmFwVDsKICAgICAgdGhpcy5tYWdGaWx0ZXIgPSBzb3VyY2UubWFnRmlsdGVyOwogICAgICB0aGlzLm1pbkZpbHRlciA9IHNvdXJjZS5taW5GaWx0ZXI7CiAgICAgIHRoaXMuYW5pc290cm9weSA9IHNvdXJjZS5hbmlzb3Ryb3B5OwogICAgICB0aGlzLmZvcm1hdCA9IHNvdXJjZS5mb3JtYXQ7CiAgICAgIHRoaXMuaW50ZXJuYWxGb3JtYXQgPSBzb3VyY2UuaW50ZXJuYWxGb3JtYXQ7CiAgICAgIHRoaXMudHlwZSA9IHNvdXJjZS50eXBlOwogICAgICB0aGlzLm9mZnNldC5jb3B5KHNvdXJjZS5vZmZzZXQpOwogICAgICB0aGlzLnJlcGVhdC5jb3B5KHNvdXJjZS5yZXBlYXQpOwogICAgICB0aGlzLmNlbnRlci5jb3B5KHNvdXJjZS5jZW50ZXIpOwogICAgICB0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uOwogICAgICB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTsKICAgICAgdGhpcy5tYXRyaXguY29weShzb3VyY2UubWF0cml4KTsKICAgICAgdGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBzb3VyY2UuZ2VuZXJhdGVNaXBtYXBzOwogICAgICB0aGlzLnByZW11bHRpcGx5QWxwaGEgPSBzb3VyY2UucHJlbXVsdGlwbHlBbHBoYTsKICAgICAgdGhpcy5mbGlwWSA9IHNvdXJjZS5mbGlwWTsKICAgICAgdGhpcy51bnBhY2tBbGlnbm1lbnQgPSBzb3VyY2UudW5wYWNrQWxpZ25tZW50OwogICAgICB0aGlzLmNvbG9yU3BhY2UgPSBzb3VyY2UuY29sb3JTcGFjZTsKICAgICAgdGhpcy5yZW5kZXJUYXJnZXQgPSBzb3VyY2UucmVuZGVyVGFyZ2V0OwogICAgICB0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IHNvdXJjZS5pc1JlbmRlclRhcmdldFRleHR1cmU7CiAgICAgIHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNvdXJjZS51c2VyRGF0YSkpOwogICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0b0pTT04obWV0YSkgewogICAgICBjb25zdCBpc1Jvb3RPYmplY3QgPSBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICJzdHJpbmciOwogICAgICBpZiAoIWlzUm9vdE9iamVjdCAmJiBtZXRhLnRleHR1cmVzW3RoaXMudXVpZF0gIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybiBtZXRhLnRleHR1cmVzW3RoaXMudXVpZF07CiAgICAgIH0KICAgICAgY29uc3Qgb3V0cHV0ID0gewogICAgICAgIG1ldGFkYXRhOiB7CiAgICAgICAgICB2ZXJzaW9uOiA0LjYsCiAgICAgICAgICB0eXBlOiAiVGV4dHVyZSIsCiAgICAgICAgICBnZW5lcmF0b3I6ICJUZXh0dXJlLnRvSlNPTiIKICAgICAgICB9LAogICAgICAgIHV1aWQ6IHRoaXMudXVpZCwKICAgICAgICBuYW1lOiB0aGlzLm5hbWUsCiAgICAgICAgaW1hZ2U6IHRoaXMuc291cmNlLnRvSlNPTihtZXRhKS51dWlkLAogICAgICAgIG1hcHBpbmc6IHRoaXMubWFwcGluZywKICAgICAgICBjaGFubmVsOiB0aGlzLmNoYW5uZWwsCiAgICAgICAgcmVwZWF0OiBbdGhpcy5yZXBlYXQueCwgdGhpcy5yZXBlYXQueV0sCiAgICAgICAgb2Zmc2V0OiBbdGhpcy5vZmZzZXQueCwgdGhpcy5vZmZzZXQueV0sCiAgICAgICAgY2VudGVyOiBbdGhpcy5jZW50ZXIueCwgdGhpcy5jZW50ZXIueV0sCiAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sCiAgICAgICAgd3JhcDogW3RoaXMud3JhcFMsIHRoaXMud3JhcFRdLAogICAgICAgIGZvcm1hdDogdGhpcy5mb3JtYXQsCiAgICAgICAgaW50ZXJuYWxGb3JtYXQ6IHRoaXMuaW50ZXJuYWxGb3JtYXQsCiAgICAgICAgdHlwZTogdGhpcy50eXBlLAogICAgICAgIGNvbG9yU3BhY2U6IHRoaXMuY29sb3JTcGFjZSwKICAgICAgICBtaW5GaWx0ZXI6IHRoaXMubWluRmlsdGVyLAogICAgICAgIG1hZ0ZpbHRlcjogdGhpcy5tYWdGaWx0ZXIsCiAgICAgICAgYW5pc290cm9weTogdGhpcy5hbmlzb3Ryb3B5LAogICAgICAgIGZsaXBZOiB0aGlzLmZsaXBZLAogICAgICAgIGdlbmVyYXRlTWlwbWFwczogdGhpcy5nZW5lcmF0ZU1pcG1hcHMsCiAgICAgICAgcHJlbXVsdGlwbHlBbHBoYTogdGhpcy5wcmVtdWx0aXBseUFscGhhLAogICAgICAgIHVucGFja0FsaWdubWVudDogdGhpcy51bnBhY2tBbGlnbm1lbnQKICAgICAgfTsKICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aCA+IDApCiAgICAgICAgb3V0cHV0LnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTsKICAgICAgaWYgKCFpc1Jvb3RPYmplY3QpIHsKICAgICAgICBtZXRhLnRleHR1cmVzW3RoaXMudXVpZF0gPSBvdXRwdXQ7CiAgICAgIH0KICAgICAgcmV0dXJuIG91dHB1dDsKICAgIH0KICAgIGRpc3Bvc2UoKSB7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICJkaXNwb3NlIiB9KTsKICAgIH0KICAgIHRyYW5zZm9ybVV2KHV2KSB7CiAgICAgIGlmICh0aGlzLm1hcHBpbmcgIT09IFVWTWFwcGluZykKICAgICAgICByZXR1cm4gdXY7CiAgICAgIHV2LmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCk7CiAgICAgIGlmICh1di54IDwgMCB8fCB1di54ID4gMSkgewogICAgICAgIHN3aXRjaCAodGhpcy53cmFwUykgewogICAgICAgICAgY2FzZSBSZXBlYXRXcmFwcGluZzoKICAgICAgICAgICAgdXYueCA9IHV2LnggLSBNYXRoLmZsb29yKHV2LngpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgQ2xhbXBUb0VkZ2VXcmFwcGluZzoKICAgICAgICAgICAgdXYueCA9IHV2LnggPCAwID8gMCA6IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOgogICAgICAgICAgICBpZiAoTWF0aC5hYnMoTWF0aC5mbG9vcih1di54KSAlIDIpID09PSAxKSB7CiAgICAgICAgICAgICAgdXYueCA9IE1hdGguY2VpbCh1di54KSAtIHV2Lng7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdXYueCA9IHV2LnggLSBNYXRoLmZsb29yKHV2LngpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodXYueSA8IDAgfHwgdXYueSA+IDEpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMud3JhcFQpIHsKICAgICAgICAgIGNhc2UgUmVwZWF0V3JhcHBpbmc6CiAgICAgICAgICAgIHV2LnkgPSB1di55IC0gTWF0aC5mbG9vcih1di55KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIENsYW1wVG9FZGdlV3JhcHBpbmc6CiAgICAgICAgICAgIHV2LnkgPSB1di55IDwgMCA/IDAgOiAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzoKICAgICAgICAgICAgaWYgKE1hdGguYWJzKE1hdGguZmxvb3IodXYueSkgJSAyKSA9PT0gMSkgewogICAgICAgICAgICAgIHV2LnkgPSBNYXRoLmNlaWwodXYueSkgLSB1di55OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHV2LnkgPSB1di55IC0gTWF0aC5mbG9vcih1di55KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZmxpcFkpIHsKICAgICAgICB1di55ID0gMSAtIHV2Lnk7CiAgICAgIH0KICAgICAgcmV0dXJuIHV2OwogICAgfQogICAgc2V0IG5lZWRzVXBkYXRlKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkgewogICAgICAgIHRoaXMudmVyc2lvbisrOwogICAgICAgIHRoaXMuc291cmNlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgc2V0IG5lZWRzUE1SRU1VcGRhdGUodmFsdWUpIHsKICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7CiAgICAgICAgdGhpcy5wbXJlbVZlcnNpb24rKzsKICAgICAgfQogICAgfQogIH07CiAgVGV4dHVyZS5ERUZBVUxUX0lNQUdFID0gbnVsbDsKICBUZXh0dXJlLkRFRkFVTFRfTUFQUElORyA9IFVWTWFwcGluZzsKICBUZXh0dXJlLkRFRkFVTFRfQU5JU09UUk9QWSA9IDE7CiAgVmVjdG9yNCA9IGNsYXNzIFZlY3RvcjQgewogICAgY29uc3RydWN0b3IoeCA9IDAsIHkgPSAwLCB6ID0gMCwgdyA9IDEpIHsKICAgICAgVmVjdG9yNC5wcm90b3R5cGUuaXNWZWN0b3I0ID0gdHJ1ZTsKICAgICAgdGhpcy54ID0geDsKICAgICAgdGhpcy55ID0geTsKICAgICAgdGhpcy56ID0gejsKICAgICAgdGhpcy53ID0gdzsKICAgIH0KICAgIGdldCB3aWR0aCgpIHsKICAgICAgcmV0dXJuIHRoaXMuejsKICAgIH0KICAgIHNldCB3aWR0aCh2YWx1ZSkgewogICAgICB0aGlzLnogPSB2YWx1ZTsKICAgIH0KICAgIGdldCBoZWlnaHQoKSB7CiAgICAgIHJldHVybiB0aGlzLnc7CiAgICB9CiAgICBzZXQgaGVpZ2h0KHZhbHVlKSB7CiAgICAgIHRoaXMudyA9IHZhbHVlOwogICAgfQogICAgc2V0KHgsIHksIHosIHcpIHsKICAgICAgdGhpcy54ID0geDsKICAgICAgdGhpcy55ID0geTsKICAgICAgdGhpcy56ID0gejsKICAgICAgdGhpcy53ID0gdzsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRTY2FsYXIoc2NhbGFyKSB7CiAgICAgIHRoaXMueCA9IHNjYWxhcjsKICAgICAgdGhpcy55ID0gc2NhbGFyOwogICAgICB0aGlzLnogPSBzY2FsYXI7CiAgICAgIHRoaXMudyA9IHNjYWxhcjsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRYKHgpIHsKICAgICAgdGhpcy54ID0geDsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRZKHkpIHsKICAgICAgdGhpcy55ID0geTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRaKHopIHsKICAgICAgdGhpcy56ID0gejsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRXKHcpIHsKICAgICAgdGhpcy53ID0gdzsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRDb21wb25lbnQoaW5kZXgsIHZhbHVlKSB7CiAgICAgIHN3aXRjaCAoaW5kZXgpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICB0aGlzLnggPSB2YWx1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHRoaXMueSA9IHZhbHVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgdGhpcy56ID0gdmFsdWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICB0aGlzLncgPSB2YWx1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIiArIGluZGV4KTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldENvbXBvbmVudChpbmRleCkgewogICAgICBzd2l0Y2ggKGluZGV4KSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgcmV0dXJuIHRoaXMueDsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICByZXR1cm4gdGhpcy55OwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIHJldHVybiB0aGlzLno7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgcmV0dXJuIHRoaXMudzsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIgKyBpbmRleCk7CiAgICAgIH0KICAgIH0KICAgIGNsb25lKCkgewogICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53KTsKICAgIH0KICAgIGNvcHkodikgewogICAgICB0aGlzLnggPSB2Lng7CiAgICAgIHRoaXMueSA9IHYueTsKICAgICAgdGhpcy56ID0gdi56OwogICAgICB0aGlzLncgPSB2LncgIT09IHVuZGVmaW5lZCA/IHYudyA6IDE7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgYWRkKHYpIHsKICAgICAgdGhpcy54ICs9IHYueDsKICAgICAgdGhpcy55ICs9IHYueTsKICAgICAgdGhpcy56ICs9IHYuejsKICAgICAgdGhpcy53ICs9IHYudzsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBhZGRTY2FsYXIocykgewogICAgICB0aGlzLnggKz0gczsKICAgICAgdGhpcy55ICs9IHM7CiAgICAgIHRoaXMueiArPSBzOwogICAgICB0aGlzLncgKz0gczsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBhZGRWZWN0b3JzKGEsIGIpIHsKICAgICAgdGhpcy54ID0gYS54ICsgYi54OwogICAgICB0aGlzLnkgPSBhLnkgKyBiLnk7CiAgICAgIHRoaXMueiA9IGEueiArIGIuejsKICAgICAgdGhpcy53ID0gYS53ICsgYi53OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGFkZFNjYWxlZFZlY3Rvcih2LCBzKSB7CiAgICAgIHRoaXMueCArPSB2LnggKiBzOwogICAgICB0aGlzLnkgKz0gdi55ICogczsKICAgICAgdGhpcy56ICs9IHYueiAqIHM7CiAgICAgIHRoaXMudyArPSB2LncgKiBzOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHN1Yih2KSB7CiAgICAgIHRoaXMueCAtPSB2Lng7CiAgICAgIHRoaXMueSAtPSB2Lnk7CiAgICAgIHRoaXMueiAtPSB2Lno7CiAgICAgIHRoaXMudyAtPSB2Lnc7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc3ViU2NhbGFyKHMpIHsKICAgICAgdGhpcy54IC09IHM7CiAgICAgIHRoaXMueSAtPSBzOwogICAgICB0aGlzLnogLT0gczsKICAgICAgdGhpcy53IC09IHM7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc3ViVmVjdG9ycyhhLCBiKSB7CiAgICAgIHRoaXMueCA9IGEueCAtIGIueDsKICAgICAgdGhpcy55ID0gYS55IC0gYi55OwogICAgICB0aGlzLnogPSBhLnogLSBiLno7CiAgICAgIHRoaXMudyA9IGEudyAtIGIudzsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBtdWx0aXBseSh2KSB7CiAgICAgIHRoaXMueCAqPSB2Lng7CiAgICAgIHRoaXMueSAqPSB2Lnk7CiAgICAgIHRoaXMueiAqPSB2Lno7CiAgICAgIHRoaXMudyAqPSB2Lnc7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgbXVsdGlwbHlTY2FsYXIoc2NhbGFyKSB7CiAgICAgIHRoaXMueCAqPSBzY2FsYXI7CiAgICAgIHRoaXMueSAqPSBzY2FsYXI7CiAgICAgIHRoaXMueiAqPSBzY2FsYXI7CiAgICAgIHRoaXMudyAqPSBzY2FsYXI7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgYXBwbHlNYXRyaXg0KG0pIHsKICAgICAgY29uc3QgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMueiwgdyA9IHRoaXMudzsKICAgICAgY29uc3QgZSA9IG0uZWxlbWVudHM7CiAgICAgIHRoaXMueCA9IGVbMF0gKiB4ICsgZVs0XSAqIHkgKyBlWzhdICogeiArIGVbMTJdICogdzsKICAgICAgdGhpcy55ID0gZVsxXSAqIHggKyBlWzVdICogeSArIGVbOV0gKiB6ICsgZVsxM10gKiB3OwogICAgICB0aGlzLnogPSBlWzJdICogeCArIGVbNl0gKiB5ICsgZVsxMF0gKiB6ICsgZVsxNF0gKiB3OwogICAgICB0aGlzLncgPSBlWzNdICogeCArIGVbN10gKiB5ICsgZVsxMV0gKiB6ICsgZVsxNV0gKiB3OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGRpdmlkZSh2KSB7CiAgICAgIHRoaXMueCAvPSB2Lng7CiAgICAgIHRoaXMueSAvPSB2Lnk7CiAgICAgIHRoaXMueiAvPSB2Lno7CiAgICAgIHRoaXMudyAvPSB2Lnc7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZGl2aWRlU2NhbGFyKHNjYWxhcikgewogICAgICByZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxIC8gc2NhbGFyKTsKICAgIH0KICAgIHNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uKHEpIHsKICAgICAgdGhpcy53ID0gMiAqIE1hdGguYWNvcyhxLncpOwogICAgICBjb25zdCBzID0gTWF0aC5zcXJ0KDEgLSBxLncgKiBxLncpOwogICAgICBpZiAocyA8IDAuMDAwMSkgewogICAgICAgIHRoaXMueCA9IDE7CiAgICAgICAgdGhpcy55ID0gMDsKICAgICAgICB0aGlzLnogPSAwOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMueCA9IHEueCAvIHM7CiAgICAgICAgdGhpcy55ID0gcS55IC8gczsKICAgICAgICB0aGlzLnogPSBxLnogLyBzOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4KG0pIHsKICAgICAgbGV0IGFuZ2xlLCB4LCB5LCB6OwogICAgICBjb25zdCBlcHNpbG9uID0gMC4wMSwgZXBzaWxvbjIgPSAwLjEsIHRlID0gbS5lbGVtZW50cywgbTExID0gdGVbMF0sIG0xMiA9IHRlWzRdLCBtMTMgPSB0ZVs4XSwgbTIxID0gdGVbMV0sIG0yMiA9IHRlWzVdLCBtMjMgPSB0ZVs5XSwgbTMxID0gdGVbMl0sIG0zMiA9IHRlWzZdLCBtMzMgPSB0ZVsxMF07CiAgICAgIGlmIChNYXRoLmFicyhtMTIgLSBtMjEpIDwgZXBzaWxvbiAmJiBNYXRoLmFicyhtMTMgLSBtMzEpIDwgZXBzaWxvbiAmJiBNYXRoLmFicyhtMjMgLSBtMzIpIDwgZXBzaWxvbikgewogICAgICAgIGlmIChNYXRoLmFicyhtMTIgKyBtMjEpIDwgZXBzaWxvbjIgJiYgTWF0aC5hYnMobTEzICsgbTMxKSA8IGVwc2lsb24yICYmIE1hdGguYWJzKG0yMyArIG0zMikgPCBlcHNpbG9uMiAmJiBNYXRoLmFicyhtMTEgKyBtMjIgKyBtMzMgLSAzKSA8IGVwc2lsb24yKSB7CiAgICAgICAgICB0aGlzLnNldCgxLCAwLCAwLCAwKTsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICBhbmdsZSA9IE1hdGguUEk7CiAgICAgICAgY29uc3QgeHggPSAobTExICsgMSkgLyAyOwogICAgICAgIGNvbnN0IHl5ID0gKG0yMiArIDEpIC8gMjsKICAgICAgICBjb25zdCB6eiA9IChtMzMgKyAxKSAvIDI7CiAgICAgICAgY29uc3QgeHkgPSAobTEyICsgbTIxKSAvIDQ7CiAgICAgICAgY29uc3QgeHogPSAobTEzICsgbTMxKSAvIDQ7CiAgICAgICAgY29uc3QgeXogPSAobTIzICsgbTMyKSAvIDQ7CiAgICAgICAgaWYgKHh4ID4geXkgJiYgeHggPiB6eikgewogICAgICAgICAgaWYgKHh4IDwgZXBzaWxvbikgewogICAgICAgICAgICB4ID0gMDsKICAgICAgICAgICAgeSA9IDAuNzA3MTA2NzgxOwogICAgICAgICAgICB6ID0gMC43MDcxMDY3ODE7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB4ID0gTWF0aC5zcXJ0KHh4KTsKICAgICAgICAgICAgeSA9IHh5IC8geDsKICAgICAgICAgICAgeiA9IHh6IC8geDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHl5ID4genopIHsKICAgICAgICAgIGlmICh5eSA8IGVwc2lsb24pIHsKICAgICAgICAgICAgeCA9IDAuNzA3MTA2NzgxOwogICAgICAgICAgICB5ID0gMDsKICAgICAgICAgICAgeiA9IDAuNzA3MTA2NzgxOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgeSA9IE1hdGguc3FydCh5eSk7CiAgICAgICAgICAgIHggPSB4eSAvIHk7CiAgICAgICAgICAgIHogPSB5eiAvIHk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICh6eiA8IGVwc2lsb24pIHsKICAgICAgICAgICAgeCA9IDAuNzA3MTA2NzgxOwogICAgICAgICAgICB5ID0gMC43MDcxMDY3ODE7CiAgICAgICAgICAgIHogPSAwOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgeiA9IE1hdGguc3FydCh6eik7CiAgICAgICAgICAgIHggPSB4eiAvIHo7CiAgICAgICAgICAgIHkgPSB5eiAvIHo7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuc2V0KHgsIHksIHosIGFuZ2xlKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBsZXQgcyA9IE1hdGguc3FydCgobTMyIC0gbTIzKSAqIChtMzIgLSBtMjMpICsgKG0xMyAtIG0zMSkgKiAobTEzIC0gbTMxKSArIChtMjEgLSBtMTIpICogKG0yMSAtIG0xMikpOwogICAgICBpZiAoTWF0aC5hYnMocykgPCAwLjAwMSkKICAgICAgICBzID0gMTsKICAgICAgdGhpcy54ID0gKG0zMiAtIG0yMykgLyBzOwogICAgICB0aGlzLnkgPSAobTEzIC0gbTMxKSAvIHM7CiAgICAgIHRoaXMueiA9IChtMjEgLSBtMTIpIC8gczsKICAgICAgdGhpcy53ID0gTWF0aC5hY29zKChtMTEgKyBtMjIgKyBtMzMgLSAxKSAvIDIpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldEZyb21NYXRyaXhQb3NpdGlvbihtKSB7CiAgICAgIGNvbnN0IGUgPSBtLmVsZW1lbnRzOwogICAgICB0aGlzLnggPSBlWzEyXTsKICAgICAgdGhpcy55ID0gZVsxM107CiAgICAgIHRoaXMueiA9IGVbMTRdOwogICAgICB0aGlzLncgPSBlWzE1XTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBtaW4odikgewogICAgICB0aGlzLnggPSBNYXRoLm1pbih0aGlzLngsIHYueCk7CiAgICAgIHRoaXMueSA9IE1hdGgubWluKHRoaXMueSwgdi55KTsKICAgICAgdGhpcy56ID0gTWF0aC5taW4odGhpcy56LCB2LnopOwogICAgICB0aGlzLncgPSBNYXRoLm1pbih0aGlzLncsIHYudyk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgbWF4KHYpIHsKICAgICAgdGhpcy54ID0gTWF0aC5tYXgodGhpcy54LCB2LngpOwogICAgICB0aGlzLnkgPSBNYXRoLm1heCh0aGlzLnksIHYueSk7CiAgICAgIHRoaXMueiA9IE1hdGgubWF4KHRoaXMueiwgdi56KTsKICAgICAgdGhpcy53ID0gTWF0aC5tYXgodGhpcy53LCB2LncpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGNsYW1wKG1pbiwgbWF4KSB7CiAgICAgIHRoaXMueCA9IGNsYW1wKHRoaXMueCwgbWluLngsIG1heC54KTsKICAgICAgdGhpcy55ID0gY2xhbXAodGhpcy55LCBtaW4ueSwgbWF4LnkpOwogICAgICB0aGlzLnogPSBjbGFtcCh0aGlzLnosIG1pbi56LCBtYXgueik7CiAgICAgIHRoaXMudyA9IGNsYW1wKHRoaXMudywgbWluLncsIG1heC53KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjbGFtcFNjYWxhcihtaW5WYWwsIG1heFZhbCkgewogICAgICB0aGlzLnggPSBjbGFtcCh0aGlzLngsIG1pblZhbCwgbWF4VmFsKTsKICAgICAgdGhpcy55ID0gY2xhbXAodGhpcy55LCBtaW5WYWwsIG1heFZhbCk7CiAgICAgIHRoaXMueiA9IGNsYW1wKHRoaXMueiwgbWluVmFsLCBtYXhWYWwpOwogICAgICB0aGlzLncgPSBjbGFtcCh0aGlzLncsIG1pblZhbCwgbWF4VmFsKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjbGFtcExlbmd0aChtaW4sIG1heCkgewogICAgICBjb25zdCBsZW5ndGggPSB0aGlzLmxlbmd0aCgpOwogICAgICByZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobGVuZ3RoIHx8IDEpLm11bHRpcGx5U2NhbGFyKGNsYW1wKGxlbmd0aCwgbWluLCBtYXgpKTsKICAgIH0KICAgIGZsb29yKCkgewogICAgICB0aGlzLnggPSBNYXRoLmZsb29yKHRoaXMueCk7CiAgICAgIHRoaXMueSA9IE1hdGguZmxvb3IodGhpcy55KTsKICAgICAgdGhpcy56ID0gTWF0aC5mbG9vcih0aGlzLnopOwogICAgICB0aGlzLncgPSBNYXRoLmZsb29yKHRoaXMudyk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgY2VpbCgpIHsKICAgICAgdGhpcy54ID0gTWF0aC5jZWlsKHRoaXMueCk7CiAgICAgIHRoaXMueSA9IE1hdGguY2VpbCh0aGlzLnkpOwogICAgICB0aGlzLnogPSBNYXRoLmNlaWwodGhpcy56KTsKICAgICAgdGhpcy53ID0gTWF0aC5jZWlsKHRoaXMudyk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcm91bmQoKSB7CiAgICAgIHRoaXMueCA9IE1hdGgucm91bmQodGhpcy54KTsKICAgICAgdGhpcy55ID0gTWF0aC5yb3VuZCh0aGlzLnkpOwogICAgICB0aGlzLnogPSBNYXRoLnJvdW5kKHRoaXMueik7CiAgICAgIHRoaXMudyA9IE1hdGgucm91bmQodGhpcy53KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByb3VuZFRvWmVybygpIHsKICAgICAgdGhpcy54ID0gTWF0aC50cnVuYyh0aGlzLngpOwogICAgICB0aGlzLnkgPSBNYXRoLnRydW5jKHRoaXMueSk7CiAgICAgIHRoaXMueiA9IE1hdGgudHJ1bmModGhpcy56KTsKICAgICAgdGhpcy53ID0gTWF0aC50cnVuYyh0aGlzLncpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIG5lZ2F0ZSgpIHsKICAgICAgdGhpcy54ID0gLXRoaXMueDsKICAgICAgdGhpcy55ID0gLXRoaXMueTsKICAgICAgdGhpcy56ID0gLXRoaXMuejsKICAgICAgdGhpcy53ID0gLXRoaXMudzsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBkb3QodikgewogICAgICByZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56ICsgdGhpcy53ICogdi53OwogICAgfQogICAgbGVuZ3RoU3EoKSB7CiAgICAgIHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLnc7CiAgICB9CiAgICBsZW5ndGgoKSB7CiAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICsgdGhpcy53ICogdGhpcy53KTsKICAgIH0KICAgIG1hbmhhdHRhbkxlbmd0aCgpIHsKICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMueCkgKyBNYXRoLmFicyh0aGlzLnkpICsgTWF0aC5hYnModGhpcy56KSArIE1hdGguYWJzKHRoaXMudyk7CiAgICB9CiAgICBub3JtYWxpemUoKSB7CiAgICAgIHJldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpIHx8IDEpOwogICAgfQogICAgc2V0TGVuZ3RoKGxlbmd0aCkgewogICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihsZW5ndGgpOwogICAgfQogICAgbGVycCh2LCBhbHBoYSkgewogICAgICB0aGlzLnggKz0gKHYueCAtIHRoaXMueCkgKiBhbHBoYTsKICAgICAgdGhpcy55ICs9ICh2LnkgLSB0aGlzLnkpICogYWxwaGE7CiAgICAgIHRoaXMueiArPSAodi56IC0gdGhpcy56KSAqIGFscGhhOwogICAgICB0aGlzLncgKz0gKHYudyAtIHRoaXMudykgKiBhbHBoYTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBsZXJwVmVjdG9ycyh2MSwgdjIsIGFscGhhKSB7CiAgICAgIHRoaXMueCA9IHYxLnggKyAodjIueCAtIHYxLngpICogYWxwaGE7CiAgICAgIHRoaXMueSA9IHYxLnkgKyAodjIueSAtIHYxLnkpICogYWxwaGE7CiAgICAgIHRoaXMueiA9IHYxLnogKyAodjIueiAtIHYxLnopICogYWxwaGE7CiAgICAgIHRoaXMudyA9IHYxLncgKyAodjIudyAtIHYxLncpICogYWxwaGE7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZXF1YWxzKHYpIHsKICAgICAgcmV0dXJuIHYueCA9PT0gdGhpcy54ICYmIHYueSA9PT0gdGhpcy55ICYmIHYueiA9PT0gdGhpcy56ICYmIHYudyA9PT0gdGhpcy53OwogICAgfQogICAgZnJvbUFycmF5KGFycmF5LCBvZmZzZXQgPSAwKSB7CiAgICAgIHRoaXMueCA9IGFycmF5W29mZnNldF07CiAgICAgIHRoaXMueSA9IGFycmF5W29mZnNldCArIDFdOwogICAgICB0aGlzLnogPSBhcnJheVtvZmZzZXQgKyAyXTsKICAgICAgdGhpcy53ID0gYXJyYXlbb2Zmc2V0ICsgM107CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdG9BcnJheShhcnJheSA9IFtdLCBvZmZzZXQgPSAwKSB7CiAgICAgIGFycmF5W29mZnNldF0gPSB0aGlzLng7CiAgICAgIGFycmF5W29mZnNldCArIDFdID0gdGhpcy55OwogICAgICBhcnJheVtvZmZzZXQgKyAyXSA9IHRoaXMuejsKICAgICAgYXJyYXlbb2Zmc2V0ICsgM10gPSB0aGlzLnc7CiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KICAgIGZyb21CdWZmZXJBdHRyaWJ1dGUoYXR0cmlidXRlLCBpbmRleCkgewogICAgICB0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WChpbmRleCk7CiAgICAgIHRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKGluZGV4KTsKICAgICAgdGhpcy56ID0gYXR0cmlidXRlLmdldFooaW5kZXgpOwogICAgICB0aGlzLncgPSBhdHRyaWJ1dGUuZ2V0VyhpbmRleCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcmFuZG9tKCkgewogICAgICB0aGlzLnggPSBNYXRoLnJhbmRvbSgpOwogICAgICB0aGlzLnkgPSBNYXRoLnJhbmRvbSgpOwogICAgICB0aGlzLnogPSBNYXRoLnJhbmRvbSgpOwogICAgICB0aGlzLncgPSBNYXRoLnJhbmRvbSgpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHsKICAgICAgeWllbGQgdGhpcy54OwogICAgICB5aWVsZCB0aGlzLnk7CiAgICAgIHlpZWxkIHRoaXMuejsKICAgICAgeWllbGQgdGhpcy53OwogICAgfQogIH07CiAgUmVuZGVyVGFyZ2V0ID0gY2xhc3MgUmVuZGVyVGFyZ2V0IGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHsKICAgIGNvbnN0cnVjdG9yKHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgb3B0aW9ucyA9IHt9KSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNSZW5kZXJUYXJnZXQgPSB0cnVlOwogICAgICB0aGlzLndpZHRoID0gd2lkdGg7CiAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICB0aGlzLmRlcHRoID0gMTsKICAgICAgdGhpcy5zY2lzc29yID0gbmV3IFZlY3RvcjQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CiAgICAgIHRoaXMuc2Npc3NvclRlc3QgPSBmYWxzZTsKICAgICAgdGhpcy52aWV3cG9ydCA9IG5ldyBWZWN0b3I0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogICAgICBjb25zdCBpbWFnZSA9IHsgd2lkdGgsIGhlaWdodCwgZGVwdGg6IDEgfTsKICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oewogICAgICAgIGdlbmVyYXRlTWlwbWFwczogZmFsc2UsCiAgICAgICAgaW50ZXJuYWxGb3JtYXQ6IG51bGwsCiAgICAgICAgbWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsCiAgICAgICAgZGVwdGhCdWZmZXI6IHRydWUsCiAgICAgICAgc3RlbmNpbEJ1ZmZlcjogZmFsc2UsCiAgICAgICAgcmVzb2x2ZURlcHRoQnVmZmVyOiB0cnVlLAogICAgICAgIHJlc29sdmVTdGVuY2lsQnVmZmVyOiB0cnVlLAogICAgICAgIGRlcHRoVGV4dHVyZTogbnVsbCwKICAgICAgICBzYW1wbGVzOiAwLAogICAgICAgIGNvdW50OiAxCiAgICAgIH0sIG9wdGlvbnMpOwogICAgICBjb25zdCB0ZXh0dXJlID0gbmV3IFRleHR1cmUoaW1hZ2UsIG9wdGlvbnMubWFwcGluZywgb3B0aW9ucy53cmFwUywgb3B0aW9ucy53cmFwVCwgb3B0aW9ucy5tYWdGaWx0ZXIsIG9wdGlvbnMubWluRmlsdGVyLCBvcHRpb25zLmZvcm1hdCwgb3B0aW9ucy50eXBlLCBvcHRpb25zLmFuaXNvdHJvcHksIG9wdGlvbnMuY29sb3JTcGFjZSk7CiAgICAgIHRleHR1cmUuZmxpcFkgPSBmYWxzZTsKICAgICAgdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBvcHRpb25zLmdlbmVyYXRlTWlwbWFwczsKICAgICAgdGV4dHVyZS5pbnRlcm5hbEZvcm1hdCA9IG9wdGlvbnMuaW50ZXJuYWxGb3JtYXQ7CiAgICAgIHRoaXMudGV4dHVyZXMgPSBbXTsKICAgICAgY29uc3QgY291bnQgPSBvcHRpb25zLmNvdW50OwogICAgICBmb3IgKGxldCBpID0gMDtpIDwgY291bnQ7IGkrKykgewogICAgICAgIHRoaXMudGV4dHVyZXNbaV0gPSB0ZXh0dXJlLmNsb25lKCk7CiAgICAgICAgdGhpcy50ZXh0dXJlc1tpXS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSB0cnVlOwogICAgICAgIHRoaXMudGV4dHVyZXNbaV0ucmVuZGVyVGFyZ2V0ID0gdGhpczsKICAgICAgfQogICAgICB0aGlzLmRlcHRoQnVmZmVyID0gb3B0aW9ucy5kZXB0aEJ1ZmZlcjsKICAgICAgdGhpcy5zdGVuY2lsQnVmZmVyID0gb3B0aW9ucy5zdGVuY2lsQnVmZmVyOwogICAgICB0aGlzLnJlc29sdmVEZXB0aEJ1ZmZlciA9IG9wdGlvbnMucmVzb2x2ZURlcHRoQnVmZmVyOwogICAgICB0aGlzLnJlc29sdmVTdGVuY2lsQnVmZmVyID0gb3B0aW9ucy5yZXNvbHZlU3RlbmNpbEJ1ZmZlcjsKICAgICAgdGhpcy5fZGVwdGhUZXh0dXJlID0gbnVsbDsKICAgICAgdGhpcy5kZXB0aFRleHR1cmUgPSBvcHRpb25zLmRlcHRoVGV4dHVyZTsKICAgICAgdGhpcy5zYW1wbGVzID0gb3B0aW9ucy5zYW1wbGVzOwogICAgfQogICAgZ2V0IHRleHR1cmUoKSB7CiAgICAgIHJldHVybiB0aGlzLnRleHR1cmVzWzBdOwogICAgfQogICAgc2V0IHRleHR1cmUodmFsdWUpIHsKICAgICAgdGhpcy50ZXh0dXJlc1swXSA9IHZhbHVlOwogICAgfQogICAgc2V0IGRlcHRoVGV4dHVyZShjdXJyZW50KSB7CiAgICAgIGlmICh0aGlzLl9kZXB0aFRleHR1cmUgIT09IG51bGwpCiAgICAgICAgdGhpcy5fZGVwdGhUZXh0dXJlLnJlbmRlclRhcmdldCA9IG51bGw7CiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKQogICAgICAgIGN1cnJlbnQucmVuZGVyVGFyZ2V0ID0gdGhpczsKICAgICAgdGhpcy5fZGVwdGhUZXh0dXJlID0gY3VycmVudDsKICAgIH0KICAgIGdldCBkZXB0aFRleHR1cmUoKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZXB0aFRleHR1cmU7CiAgICB9CiAgICBzZXRTaXplKHdpZHRoLCBoZWlnaHQsIGRlcHRoID0gMSkgewogICAgICBpZiAodGhpcy53aWR0aCAhPT0gd2lkdGggfHwgdGhpcy5oZWlnaHQgIT09IGhlaWdodCB8fCB0aGlzLmRlcHRoICE9PSBkZXB0aCkgewogICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKICAgICAgICB0aGlzLmRlcHRoID0gZGVwdGg7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlsID0gdGhpcy50ZXh0dXJlcy5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgICAgIHRoaXMudGV4dHVyZXNbaV0uaW1hZ2Uud2lkdGggPSB3aWR0aDsKICAgICAgICAgIHRoaXMudGV4dHVyZXNbaV0uaW1hZ2UuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgICAgdGhpcy50ZXh0dXJlc1tpXS5pbWFnZS5kZXB0aCA9IGRlcHRoOwogICAgICAgIH0KICAgICAgICB0aGlzLmRpc3Bvc2UoKTsKICAgICAgfQogICAgICB0aGlzLnZpZXdwb3J0LnNldCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgdGhpcy5zY2lzc29yLnNldCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgIH0KICAgIGNsb25lKCkgewogICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpOwogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgdGhpcy53aWR0aCA9IHNvdXJjZS53aWR0aDsKICAgICAgdGhpcy5oZWlnaHQgPSBzb3VyY2UuaGVpZ2h0OwogICAgICB0aGlzLmRlcHRoID0gc291cmNlLmRlcHRoOwogICAgICB0aGlzLnNjaXNzb3IuY29weShzb3VyY2Uuc2Npc3Nvcik7CiAgICAgIHRoaXMuc2Npc3NvclRlc3QgPSBzb3VyY2Uuc2Npc3NvclRlc3Q7CiAgICAgIHRoaXMudmlld3BvcnQuY29weShzb3VyY2Uudmlld3BvcnQpOwogICAgICB0aGlzLnRleHR1cmVzLmxlbmd0aCA9IDA7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IHNvdXJjZS50ZXh0dXJlcy5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgICB0aGlzLnRleHR1cmVzW2ldID0gc291cmNlLnRleHR1cmVzW2ldLmNsb25lKCk7CiAgICAgICAgdGhpcy50ZXh0dXJlc1tpXS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSB0cnVlOwogICAgICAgIHRoaXMudGV4dHVyZXNbaV0ucmVuZGVyVGFyZ2V0ID0gdGhpczsKICAgICAgfQogICAgICBjb25zdCBpbWFnZSA9IE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZS50ZXh0dXJlLmltYWdlKTsKICAgICAgdGhpcy50ZXh0dXJlLnNvdXJjZSA9IG5ldyBTb3VyY2UoaW1hZ2UpOwogICAgICB0aGlzLmRlcHRoQnVmZmVyID0gc291cmNlLmRlcHRoQnVmZmVyOwogICAgICB0aGlzLnN0ZW5jaWxCdWZmZXIgPSBzb3VyY2Uuc3RlbmNpbEJ1ZmZlcjsKICAgICAgdGhpcy5yZXNvbHZlRGVwdGhCdWZmZXIgPSBzb3VyY2UucmVzb2x2ZURlcHRoQnVmZmVyOwogICAgICB0aGlzLnJlc29sdmVTdGVuY2lsQnVmZmVyID0gc291cmNlLnJlc29sdmVTdGVuY2lsQnVmZmVyOwogICAgICBpZiAoc291cmNlLmRlcHRoVGV4dHVyZSAhPT0gbnVsbCkKICAgICAgICB0aGlzLmRlcHRoVGV4dHVyZSA9IHNvdXJjZS5kZXB0aFRleHR1cmUuY2xvbmUoKTsKICAgICAgdGhpcy5zYW1wbGVzID0gc291cmNlLnNhbXBsZXM7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHsgdHlwZTogImRpc3Bvc2UiIH0pOwogICAgfQogIH07CiAgV2ViR0xSZW5kZXJUYXJnZXQgPSBjbGFzcyBXZWJHTFJlbmRlclRhcmdldCBleHRlbmRzIFJlbmRlclRhcmdldCB7CiAgICBjb25zdHJ1Y3Rvcih3aWR0aCA9IDEsIGhlaWdodCA9IDEsIG9wdGlvbnMgPSB7fSkgewogICAgICBzdXBlcih3aWR0aCwgaGVpZ2h0LCBvcHRpb25zKTsKICAgICAgdGhpcy5pc1dlYkdMUmVuZGVyVGFyZ2V0ID0gdHJ1ZTsKICAgIH0KICB9OwogIERhdGFBcnJheVRleHR1cmUgPSBjbGFzcyBEYXRhQXJyYXlUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7CiAgICBjb25zdHJ1Y3RvcihkYXRhID0gbnVsbCwgd2lkdGggPSAxLCBoZWlnaHQgPSAxLCBkZXB0aCA9IDEpIHsKICAgICAgc3VwZXIobnVsbCk7CiAgICAgIHRoaXMuaXNEYXRhQXJyYXlUZXh0dXJlID0gdHJ1ZTsKICAgICAgdGhpcy5pbWFnZSA9IHsgZGF0YSwgd2lkdGgsIGhlaWdodCwgZGVwdGggfTsKICAgICAgdGhpcy5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyOwogICAgICB0aGlzLm1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7CiAgICAgIHRoaXMud3JhcFIgPSBDbGFtcFRvRWRnZVdyYXBwaW5nOwogICAgICB0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlOwogICAgICB0aGlzLmZsaXBZID0gZmFsc2U7CiAgICAgIHRoaXMudW5wYWNrQWxpZ25tZW50ID0gMTsKICAgICAgdGhpcy5sYXllclVwZGF0ZXMgPSBuZXcgU2V0OwogICAgfQogICAgYWRkTGF5ZXJVcGRhdGUobGF5ZXJJbmRleCkgewogICAgICB0aGlzLmxheWVyVXBkYXRlcy5hZGQobGF5ZXJJbmRleCk7CiAgICB9CiAgICBjbGVhckxheWVyVXBkYXRlcygpIHsKICAgICAgdGhpcy5sYXllclVwZGF0ZXMuY2xlYXIoKTsKICAgIH0KICB9OwogIFdlYkdMQXJyYXlSZW5kZXJUYXJnZXQgPSBjbGFzcyBXZWJHTEFycmF5UmVuZGVyVGFyZ2V0IGV4dGVuZHMgV2ViR0xSZW5kZXJUYXJnZXQgewogICAgY29uc3RydWN0b3Iod2lkdGggPSAxLCBoZWlnaHQgPSAxLCBkZXB0aCA9IDEsIG9wdGlvbnMgPSB7fSkgewogICAgICBzdXBlcih3aWR0aCwgaGVpZ2h0LCBvcHRpb25zKTsKICAgICAgdGhpcy5pc1dlYkdMQXJyYXlSZW5kZXJUYXJnZXQgPSB0cnVlOwogICAgICB0aGlzLmRlcHRoID0gZGVwdGg7CiAgICAgIHRoaXMudGV4dHVyZSA9IG5ldyBEYXRhQXJyYXlUZXh0dXJlKG51bGwsIHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsKICAgICAgdGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IHRydWU7CiAgICB9CiAgfTsKICBEYXRhM0RUZXh0dXJlID0gY2xhc3MgRGF0YTNEVGV4dHVyZSBleHRlbmRzIFRleHR1cmUgewogICAgY29uc3RydWN0b3IoZGF0YSA9IG51bGwsIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZGVwdGggPSAxKSB7CiAgICAgIHN1cGVyKG51bGwpOwogICAgICB0aGlzLmlzRGF0YTNEVGV4dHVyZSA9IHRydWU7CiAgICAgIHRoaXMuaW1hZ2UgPSB7IGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoIH07CiAgICAgIHRoaXMubWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlcjsKICAgICAgdGhpcy5taW5GaWx0ZXIgPSBOZWFyZXN0RmlsdGVyOwogICAgICB0aGlzLndyYXBSID0gQ2xhbXBUb0VkZ2VXcmFwcGluZzsKICAgICAgdGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTsKICAgICAgdGhpcy5mbGlwWSA9IGZhbHNlOwogICAgICB0aGlzLnVucGFja0FsaWdubWVudCA9IDE7CiAgICB9CiAgfTsKICBXZWJHTDNEUmVuZGVyVGFyZ2V0ID0gY2xhc3MgV2ViR0wzRFJlbmRlclRhcmdldCBleHRlbmRzIFdlYkdMUmVuZGVyVGFyZ2V0IHsKICAgIGNvbnN0cnVjdG9yKHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZGVwdGggPSAxLCBvcHRpb25zID0ge30pIHsKICAgICAgc3VwZXIod2lkdGgsIGhlaWdodCwgb3B0aW9ucyk7CiAgICAgIHRoaXMuaXNXZWJHTDNEUmVuZGVyVGFyZ2V0ID0gdHJ1ZTsKICAgICAgdGhpcy5kZXB0aCA9IGRlcHRoOwogICAgICB0aGlzLnRleHR1cmUgPSBuZXcgRGF0YTNEVGV4dHVyZShudWxsLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7CiAgICAgIHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSB0cnVlOwogICAgfQogIH07CiAgUXVhdGVybmlvbiA9IGNsYXNzIFF1YXRlcm5pb24gewogICAgY29uc3RydWN0b3IoeCA9IDAsIHkgPSAwLCB6ID0gMCwgdyA9IDEpIHsKICAgICAgdGhpcy5pc1F1YXRlcm5pb24gPSB0cnVlOwogICAgICB0aGlzLl94ID0geDsKICAgICAgdGhpcy5feSA9IHk7CiAgICAgIHRoaXMuX3ogPSB6OwogICAgICB0aGlzLl93ID0gdzsKICAgIH0KICAgIHN0YXRpYyBzbGVycEZsYXQoZHN0LCBkc3RPZmZzZXQsIHNyYzAsIHNyY09mZnNldDAsIHNyYzEsIHNyY09mZnNldDEsIHQpIHsKICAgICAgbGV0IHgwID0gc3JjMFtzcmNPZmZzZXQwICsgMF0sIHkwID0gc3JjMFtzcmNPZmZzZXQwICsgMV0sIHowID0gc3JjMFtzcmNPZmZzZXQwICsgMl0sIHcwID0gc3JjMFtzcmNPZmZzZXQwICsgM107CiAgICAgIGNvbnN0IHgxID0gc3JjMVtzcmNPZmZzZXQxICsgMF0sIHkxID0gc3JjMVtzcmNPZmZzZXQxICsgMV0sIHoxID0gc3JjMVtzcmNPZmZzZXQxICsgMl0sIHcxID0gc3JjMVtzcmNPZmZzZXQxICsgM107CiAgICAgIGlmICh0ID09PSAwKSB7CiAgICAgICAgZHN0W2RzdE9mZnNldCArIDBdID0geDA7CiAgICAgICAgZHN0W2RzdE9mZnNldCArIDFdID0geTA7CiAgICAgICAgZHN0W2RzdE9mZnNldCArIDJdID0gejA7CiAgICAgICAgZHN0W2RzdE9mZnNldCArIDNdID0gdzA7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0ID09PSAxKSB7CiAgICAgICAgZHN0W2RzdE9mZnNldCArIDBdID0geDE7CiAgICAgICAgZHN0W2RzdE9mZnNldCArIDFdID0geTE7CiAgICAgICAgZHN0W2RzdE9mZnNldCArIDJdID0gejE7CiAgICAgICAgZHN0W2RzdE9mZnNldCArIDNdID0gdzE7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh3MCAhPT0gdzEgfHwgeDAgIT09IHgxIHx8IHkwICE9PSB5MSB8fCB6MCAhPT0gejEpIHsKICAgICAgICBsZXQgcyA9IDEgLSB0OwogICAgICAgIGNvbnN0IGNvcyA9IHgwICogeDEgKyB5MCAqIHkxICsgejAgKiB6MSArIHcwICogdzEsIGRpciA9IGNvcyA+PSAwID8gMSA6IC0xLCBzcXJTaW4gPSAxIC0gY29zICogY29zOwogICAgICAgIGlmIChzcXJTaW4gPiBOdW1iZXIuRVBTSUxPTikgewogICAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zcXJ0KHNxclNpbiksIGxlbiA9IE1hdGguYXRhbjIoc2luLCBjb3MgKiBkaXIpOwogICAgICAgICAgcyA9IE1hdGguc2luKHMgKiBsZW4pIC8gc2luOwogICAgICAgICAgdCA9IE1hdGguc2luKHQgKiBsZW4pIC8gc2luOwogICAgICAgIH0KICAgICAgICBjb25zdCB0RGlyID0gdCAqIGRpcjsKICAgICAgICB4MCA9IHgwICogcyArIHgxICogdERpcjsKICAgICAgICB5MCA9IHkwICogcyArIHkxICogdERpcjsKICAgICAgICB6MCA9IHowICogcyArIHoxICogdERpcjsKICAgICAgICB3MCA9IHcwICogcyArIHcxICogdERpcjsKICAgICAgICBpZiAocyA9PT0gMSAtIHQpIHsKICAgICAgICAgIGNvbnN0IGYgPSAxIC8gTWF0aC5zcXJ0KHgwICogeDAgKyB5MCAqIHkwICsgejAgKiB6MCArIHcwICogdzApOwogICAgICAgICAgeDAgKj0gZjsKICAgICAgICAgIHkwICo9IGY7CiAgICAgICAgICB6MCAqPSBmOwogICAgICAgICAgdzAgKj0gZjsKICAgICAgICB9CiAgICAgIH0KICAgICAgZHN0W2RzdE9mZnNldF0gPSB4MDsKICAgICAgZHN0W2RzdE9mZnNldCArIDFdID0geTA7CiAgICAgIGRzdFtkc3RPZmZzZXQgKyAyXSA9IHowOwogICAgICBkc3RbZHN0T2Zmc2V0ICsgM10gPSB3MDsKICAgIH0KICAgIHN0YXRpYyBtdWx0aXBseVF1YXRlcm5pb25zRmxhdChkc3QsIGRzdE9mZnNldCwgc3JjMCwgc3JjT2Zmc2V0MCwgc3JjMSwgc3JjT2Zmc2V0MSkgewogICAgICBjb25zdCB4MCA9IHNyYzBbc3JjT2Zmc2V0MF07CiAgICAgIGNvbnN0IHkwID0gc3JjMFtzcmNPZmZzZXQwICsgMV07CiAgICAgIGNvbnN0IHowID0gc3JjMFtzcmNPZmZzZXQwICsgMl07CiAgICAgIGNvbnN0IHcwID0gc3JjMFtzcmNPZmZzZXQwICsgM107CiAgICAgIGNvbnN0IHgxID0gc3JjMVtzcmNPZmZzZXQxXTsKICAgICAgY29uc3QgeTEgPSBzcmMxW3NyY09mZnNldDEgKyAxXTsKICAgICAgY29uc3QgejEgPSBzcmMxW3NyY09mZnNldDEgKyAyXTsKICAgICAgY29uc3QgdzEgPSBzcmMxW3NyY09mZnNldDEgKyAzXTsKICAgICAgZHN0W2RzdE9mZnNldF0gPSB4MCAqIHcxICsgdzAgKiB4MSArIHkwICogejEgLSB6MCAqIHkxOwogICAgICBkc3RbZHN0T2Zmc2V0ICsgMV0gPSB5MCAqIHcxICsgdzAgKiB5MSArIHowICogeDEgLSB4MCAqIHoxOwogICAgICBkc3RbZHN0T2Zmc2V0ICsgMl0gPSB6MCAqIHcxICsgdzAgKiB6MSArIHgwICogeTEgLSB5MCAqIHgxOwogICAgICBkc3RbZHN0T2Zmc2V0ICsgM10gPSB3MCAqIHcxIC0geDAgKiB4MSAtIHkwICogeTEgLSB6MCAqIHoxOwogICAgICByZXR1cm4gZHN0OwogICAgfQogICAgZ2V0IHgoKSB7CiAgICAgIHJldHVybiB0aGlzLl94OwogICAgfQogICAgc2V0IHgodmFsdWUpIHsKICAgICAgdGhpcy5feCA9IHZhbHVlOwogICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CiAgICB9CiAgICBnZXQgeSgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3k7CiAgICB9CiAgICBzZXQgeSh2YWx1ZSkgewogICAgICB0aGlzLl95ID0gdmFsdWU7CiAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTsKICAgIH0KICAgIGdldCB6KCkgewogICAgICByZXR1cm4gdGhpcy5fejsKICAgIH0KICAgIHNldCB6KHZhbHVlKSB7CiAgICAgIHRoaXMuX3ogPSB2YWx1ZTsKICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwogICAgfQogICAgZ2V0IHcoKSB7CiAgICAgIHJldHVybiB0aGlzLl93OwogICAgfQogICAgc2V0IHcodmFsdWUpIHsKICAgICAgdGhpcy5fdyA9IHZhbHVlOwogICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CiAgICB9CiAgICBzZXQoeCwgeSwgeiwgdykgewogICAgICB0aGlzLl94ID0geDsKICAgICAgdGhpcy5feSA9IHk7CiAgICAgIHRoaXMuX3ogPSB6OwogICAgICB0aGlzLl93ID0gdzsKICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGNsb25lKCkgewogICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fdyk7CiAgICB9CiAgICBjb3B5KHF1YXRlcm5pb24pIHsKICAgICAgdGhpcy5feCA9IHF1YXRlcm5pb24ueDsKICAgICAgdGhpcy5feSA9IHF1YXRlcm5pb24ueTsKICAgICAgdGhpcy5feiA9IHF1YXRlcm5pb24uejsKICAgICAgdGhpcy5fdyA9IHF1YXRlcm5pb24udzsKICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldEZyb21FdWxlcihldWxlciwgdXBkYXRlID0gdHJ1ZSkgewogICAgICBjb25zdCB7IF94OiB4LCBfeTogeSwgX3o6IHosIF9vcmRlcjogb3JkZXIgfSA9IGV1bGVyOwogICAgICBjb25zdCBjb3MgPSBNYXRoLmNvczsKICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW47CiAgICAgIGNvbnN0IGMxID0gY29zKHggLyAyKTsKICAgICAgY29uc3QgYzIgPSBjb3MoeSAvIDIpOwogICAgICBjb25zdCBjMyA9IGNvcyh6IC8gMik7CiAgICAgIGNvbnN0IHMxID0gc2luKHggLyAyKTsKICAgICAgY29uc3QgczIgPSBzaW4oeSAvIDIpOwogICAgICBjb25zdCBzMyA9IHNpbih6IC8gMik7CiAgICAgIHN3aXRjaCAob3JkZXIpIHsKICAgICAgICBjYXNlICJYWVoiOgogICAgICAgICAgdGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMzsKICAgICAgICAgIHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7CiAgICAgICAgICB0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzOwogICAgICAgICAgdGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIllYWiI6CiAgICAgICAgICB0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzOwogICAgICAgICAgdGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMzsKICAgICAgICAgIHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7CiAgICAgICAgICB0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiWlhZIjoKICAgICAgICAgIHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7CiAgICAgICAgICB0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzOwogICAgICAgICAgdGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMzsKICAgICAgICAgIHRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJaWVgiOgogICAgICAgICAgdGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMzsKICAgICAgICAgIHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7CiAgICAgICAgICB0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzOwogICAgICAgICAgdGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIllaWCI6CiAgICAgICAgICB0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzOwogICAgICAgICAgdGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMzsKICAgICAgICAgIHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7CiAgICAgICAgICB0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiWFpZIjoKICAgICAgICAgIHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7CiAgICAgICAgICB0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzOwogICAgICAgICAgdGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMzsKICAgICAgICAgIHRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIiArIG9yZGVyKTsKICAgICAgfQogICAgICBpZiAodXBkYXRlID09PSB0cnVlKQogICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tQXhpc0FuZ2xlKGF4aXMsIGFuZ2xlKSB7CiAgICAgIGNvbnN0IGhhbGZBbmdsZSA9IGFuZ2xlIC8gMiwgcyA9IE1hdGguc2luKGhhbGZBbmdsZSk7CiAgICAgIHRoaXMuX3ggPSBheGlzLnggKiBzOwogICAgICB0aGlzLl95ID0gYXhpcy55ICogczsKICAgICAgdGhpcy5feiA9IGF4aXMueiAqIHM7CiAgICAgIHRoaXMuX3cgPSBNYXRoLmNvcyhoYWxmQW5nbGUpOwogICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0RnJvbVJvdGF0aW9uTWF0cml4KG0pIHsKICAgICAgY29uc3QgdGUgPSBtLmVsZW1lbnRzLCBtMTEgPSB0ZVswXSwgbTEyID0gdGVbNF0sIG0xMyA9IHRlWzhdLCBtMjEgPSB0ZVsxXSwgbTIyID0gdGVbNV0sIG0yMyA9IHRlWzldLCBtMzEgPSB0ZVsyXSwgbTMyID0gdGVbNl0sIG0zMyA9IHRlWzEwXSwgdHJhY2UgPSBtMTEgKyBtMjIgKyBtMzM7CiAgICAgIGlmICh0cmFjZSA+IDApIHsKICAgICAgICBjb25zdCBzID0gMC41IC8gTWF0aC5zcXJ0KHRyYWNlICsgMSk7CiAgICAgICAgdGhpcy5fdyA9IDAuMjUgLyBzOwogICAgICAgIHRoaXMuX3ggPSAobTMyIC0gbTIzKSAqIHM7CiAgICAgICAgdGhpcy5feSA9IChtMTMgLSBtMzEpICogczsKICAgICAgICB0aGlzLl96ID0gKG0yMSAtIG0xMikgKiBzOwogICAgICB9IGVsc2UgaWYgKG0xMSA+IG0yMiAmJiBtMTEgPiBtMzMpIHsKICAgICAgICBjb25zdCBzID0gMiAqIE1hdGguc3FydCgxICsgbTExIC0gbTIyIC0gbTMzKTsKICAgICAgICB0aGlzLl93ID0gKG0zMiAtIG0yMykgLyBzOwogICAgICAgIHRoaXMuX3ggPSAwLjI1ICogczsKICAgICAgICB0aGlzLl95ID0gKG0xMiArIG0yMSkgLyBzOwogICAgICAgIHRoaXMuX3ogPSAobTEzICsgbTMxKSAvIHM7CiAgICAgIH0gZWxzZSBpZiAobTIyID4gbTMzKSB7CiAgICAgICAgY29uc3QgcyA9IDIgKiBNYXRoLnNxcnQoMSArIG0yMiAtIG0xMSAtIG0zMyk7CiAgICAgICAgdGhpcy5fdyA9IChtMTMgLSBtMzEpIC8gczsKICAgICAgICB0aGlzLl94ID0gKG0xMiArIG0yMSkgLyBzOwogICAgICAgIHRoaXMuX3kgPSAwLjI1ICogczsKICAgICAgICB0aGlzLl96ID0gKG0yMyArIG0zMikgLyBzOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHMgPSAyICogTWF0aC5zcXJ0KDEgKyBtMzMgLSBtMTEgLSBtMjIpOwogICAgICAgIHRoaXMuX3cgPSAobTIxIC0gbTEyKSAvIHM7CiAgICAgICAgdGhpcy5feCA9IChtMTMgKyBtMzEpIC8gczsKICAgICAgICB0aGlzLl95ID0gKG0yMyArIG0zMikgLyBzOwogICAgICAgIHRoaXMuX3ogPSAwLjI1ICogczsKICAgICAgfQogICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0RnJvbVVuaXRWZWN0b3JzKHZGcm9tLCB2VG8pIHsKICAgICAgbGV0IHIgPSB2RnJvbS5kb3QodlRvKSArIDE7CiAgICAgIGlmIChyIDwgTnVtYmVyLkVQU0lMT04pIHsKICAgICAgICByID0gMDsKICAgICAgICBpZiAoTWF0aC5hYnModkZyb20ueCkgPiBNYXRoLmFicyh2RnJvbS56KSkgewogICAgICAgICAgdGhpcy5feCA9IC12RnJvbS55OwogICAgICAgICAgdGhpcy5feSA9IHZGcm9tLng7CiAgICAgICAgICB0aGlzLl96ID0gMDsKICAgICAgICAgIHRoaXMuX3cgPSByOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl94ID0gMDsKICAgICAgICAgIHRoaXMuX3kgPSAtdkZyb20uejsKICAgICAgICAgIHRoaXMuX3ogPSB2RnJvbS55OwogICAgICAgICAgdGhpcy5fdyA9IHI7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuX3ggPSB2RnJvbS55ICogdlRvLnogLSB2RnJvbS56ICogdlRvLnk7CiAgICAgICAgdGhpcy5feSA9IHZGcm9tLnogKiB2VG8ueCAtIHZGcm9tLnggKiB2VG8uejsKICAgICAgICB0aGlzLl96ID0gdkZyb20ueCAqIHZUby55IC0gdkZyb20ueSAqIHZUby54OwogICAgICAgIHRoaXMuX3cgPSByOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpOwogICAgfQogICAgYW5nbGVUbyhxKSB7CiAgICAgIHJldHVybiAyICogTWF0aC5hY29zKE1hdGguYWJzKGNsYW1wKHRoaXMuZG90KHEpLCAtMSwgMSkpKTsKICAgIH0KICAgIHJvdGF0ZVRvd2FyZHMocSwgc3RlcCkgewogICAgICBjb25zdCBhbmdsZSA9IHRoaXMuYW5nbGVUbyhxKTsKICAgICAgaWYgKGFuZ2xlID09PSAwKQogICAgICAgIHJldHVybiB0aGlzOwogICAgICBjb25zdCB0ID0gTWF0aC5taW4oMSwgc3RlcCAvIGFuZ2xlKTsKICAgICAgdGhpcy5zbGVycChxLCB0KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBpZGVudGl0eSgpIHsKICAgICAgcmV0dXJuIHRoaXMuc2V0KDAsIDAsIDAsIDEpOwogICAgfQogICAgaW52ZXJ0KCkgewogICAgICByZXR1cm4gdGhpcy5jb25qdWdhdGUoKTsKICAgIH0KICAgIGNvbmp1Z2F0ZSgpIHsKICAgICAgdGhpcy5feCAqPSAtMTsKICAgICAgdGhpcy5feSAqPSAtMTsKICAgICAgdGhpcy5feiAqPSAtMTsKICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGRvdCh2KSB7CiAgICAgIHJldHVybiB0aGlzLl94ICogdi5feCArIHRoaXMuX3kgKiB2Ll95ICsgdGhpcy5feiAqIHYuX3ogKyB0aGlzLl93ICogdi5fdzsKICAgIH0KICAgIGxlbmd0aFNxKCkgewogICAgICByZXR1cm4gdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3c7CiAgICB9CiAgICBsZW5ndGgoKSB7CiAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3cpOwogICAgfQogICAgbm9ybWFsaXplKCkgewogICAgICBsZXQgbCA9IHRoaXMubGVuZ3RoKCk7CiAgICAgIGlmIChsID09PSAwKSB7CiAgICAgICAgdGhpcy5feCA9IDA7CiAgICAgICAgdGhpcy5feSA9IDA7CiAgICAgICAgdGhpcy5feiA9IDA7CiAgICAgICAgdGhpcy5fdyA9IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbCA9IDEgLyBsOwogICAgICAgIHRoaXMuX3ggPSB0aGlzLl94ICogbDsKICAgICAgICB0aGlzLl95ID0gdGhpcy5feSAqIGw7CiAgICAgICAgdGhpcy5feiA9IHRoaXMuX3ogKiBsOwogICAgICAgIHRoaXMuX3cgPSB0aGlzLl93ICogbDsKICAgICAgfQogICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgbXVsdGlwbHkocSkgewogICAgICByZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsIHEpOwogICAgfQogICAgcHJlbXVsdGlwbHkocSkgewogICAgICByZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHEsIHRoaXMpOwogICAgfQogICAgbXVsdGlwbHlRdWF0ZXJuaW9ucyhhLCBiKSB7CiAgICAgIGNvbnN0IHsgX3g6IHFheCwgX3k6IHFheSwgX3o6IHFheiwgX3c6IHFhdyB9ID0gYTsKICAgICAgY29uc3QgeyBfeDogcWJ4LCBfeTogcWJ5LCBfejogcWJ6LCBfdzogcWJ3IH0gPSBiOwogICAgICB0aGlzLl94ID0gcWF4ICogcWJ3ICsgcWF3ICogcWJ4ICsgcWF5ICogcWJ6IC0gcWF6ICogcWJ5OwogICAgICB0aGlzLl95ID0gcWF5ICogcWJ3ICsgcWF3ICogcWJ5ICsgcWF6ICogcWJ4IC0gcWF4ICogcWJ6OwogICAgICB0aGlzLl96ID0gcWF6ICogcWJ3ICsgcWF3ICogcWJ6ICsgcWF4ICogcWJ5IC0gcWF5ICogcWJ4OwogICAgICB0aGlzLl93ID0gcWF3ICogcWJ3IC0gcWF4ICogcWJ4IC0gcWF5ICogcWJ5IC0gcWF6ICogcWJ6OwogICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2xlcnAocWIsIHQpIHsKICAgICAgaWYgKHQgPT09IDApCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIGlmICh0ID09PSAxKQogICAgICAgIHJldHVybiB0aGlzLmNvcHkocWIpOwogICAgICBjb25zdCB4ID0gdGhpcy5feCwgeSA9IHRoaXMuX3ksIHogPSB0aGlzLl96LCB3ID0gdGhpcy5fdzsKICAgICAgbGV0IGNvc0hhbGZUaGV0YSA9IHcgKiBxYi5fdyArIHggKiBxYi5feCArIHkgKiBxYi5feSArIHogKiBxYi5fejsKICAgICAgaWYgKGNvc0hhbGZUaGV0YSA8IDApIHsKICAgICAgICB0aGlzLl93ID0gLXFiLl93OwogICAgICAgIHRoaXMuX3ggPSAtcWIuX3g7CiAgICAgICAgdGhpcy5feSA9IC1xYi5feTsKICAgICAgICB0aGlzLl96ID0gLXFiLl96OwogICAgICAgIGNvc0hhbGZUaGV0YSA9IC1jb3NIYWxmVGhldGE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5jb3B5KHFiKTsKICAgICAgfQogICAgICBpZiAoY29zSGFsZlRoZXRhID49IDEpIHsKICAgICAgICB0aGlzLl93ID0gdzsKICAgICAgICB0aGlzLl94ID0geDsKICAgICAgICB0aGlzLl95ID0geTsKICAgICAgICB0aGlzLl96ID0gejsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBjb25zdCBzcXJTaW5IYWxmVGhldGEgPSAxIC0gY29zSGFsZlRoZXRhICogY29zSGFsZlRoZXRhOwogICAgICBpZiAoc3FyU2luSGFsZlRoZXRhIDw9IE51bWJlci5FUFNJTE9OKSB7CiAgICAgICAgY29uc3QgcyA9IDEgLSB0OwogICAgICAgIHRoaXMuX3cgPSBzICogdyArIHQgKiB0aGlzLl93OwogICAgICAgIHRoaXMuX3ggPSBzICogeCArIHQgKiB0aGlzLl94OwogICAgICAgIHRoaXMuX3kgPSBzICogeSArIHQgKiB0aGlzLl95OwogICAgICAgIHRoaXMuX3ogPSBzICogeiArIHQgKiB0aGlzLl96OwogICAgICAgIHRoaXMubm9ybWFsaXplKCk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgY29uc3Qgc2luSGFsZlRoZXRhID0gTWF0aC5zcXJ0KHNxclNpbkhhbGZUaGV0YSk7CiAgICAgIGNvbnN0IGhhbGZUaGV0YSA9IE1hdGguYXRhbjIoc2luSGFsZlRoZXRhLCBjb3NIYWxmVGhldGEpOwogICAgICBjb25zdCByYXRpb0EgPSBNYXRoLnNpbigoMSAtIHQpICogaGFsZlRoZXRhKSAvIHNpbkhhbGZUaGV0YSwgcmF0aW9CID0gTWF0aC5zaW4odCAqIGhhbGZUaGV0YSkgLyBzaW5IYWxmVGhldGE7CiAgICAgIHRoaXMuX3cgPSB3ICogcmF0aW9BICsgdGhpcy5fdyAqIHJhdGlvQjsKICAgICAgdGhpcy5feCA9IHggKiByYXRpb0EgKyB0aGlzLl94ICogcmF0aW9COwogICAgICB0aGlzLl95ID0geSAqIHJhdGlvQSArIHRoaXMuX3kgKiByYXRpb0I7CiAgICAgIHRoaXMuX3ogPSB6ICogcmF0aW9BICsgdGhpcy5feiAqIHJhdGlvQjsKICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNsZXJwUXVhdGVybmlvbnMocWEsIHFiLCB0KSB7CiAgICAgIHJldHVybiB0aGlzLmNvcHkocWEpLnNsZXJwKHFiLCB0KTsKICAgIH0KICAgIHJhbmRvbSgpIHsKICAgICAgY29uc3QgdGhldGExID0gMiAqIE1hdGguUEkgKiBNYXRoLnJhbmRvbSgpOwogICAgICBjb25zdCB0aGV0YTIgPSAyICogTWF0aC5QSSAqIE1hdGgucmFuZG9tKCk7CiAgICAgIGNvbnN0IHgwID0gTWF0aC5yYW5kb20oKTsKICAgICAgY29uc3QgcjEgPSBNYXRoLnNxcnQoMSAtIHgwKTsKICAgICAgY29uc3QgcjIgPSBNYXRoLnNxcnQoeDApOwogICAgICByZXR1cm4gdGhpcy5zZXQocjEgKiBNYXRoLnNpbih0aGV0YTEpLCByMSAqIE1hdGguY29zKHRoZXRhMSksIHIyICogTWF0aC5zaW4odGhldGEyKSwgcjIgKiBNYXRoLmNvcyh0aGV0YTIpKTsKICAgIH0KICAgIGVxdWFscyhxdWF0ZXJuaW9uKSB7CiAgICAgIHJldHVybiBxdWF0ZXJuaW9uLl94ID09PSB0aGlzLl94ICYmIHF1YXRlcm5pb24uX3kgPT09IHRoaXMuX3kgJiYgcXVhdGVybmlvbi5feiA9PT0gdGhpcy5feiAmJiBxdWF0ZXJuaW9uLl93ID09PSB0aGlzLl93OwogICAgfQogICAgZnJvbUFycmF5KGFycmF5LCBvZmZzZXQgPSAwKSB7CiAgICAgIHRoaXMuX3ggPSBhcnJheVtvZmZzZXRdOwogICAgICB0aGlzLl95ID0gYXJyYXlbb2Zmc2V0ICsgMV07CiAgICAgIHRoaXMuX3ogPSBhcnJheVtvZmZzZXQgKyAyXTsKICAgICAgdGhpcy5fdyA9IGFycmF5W29mZnNldCArIDNdOwogICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdG9BcnJheShhcnJheSA9IFtdLCBvZmZzZXQgPSAwKSB7CiAgICAgIGFycmF5W29mZnNldF0gPSB0aGlzLl94OwogICAgICBhcnJheVtvZmZzZXQgKyAxXSA9IHRoaXMuX3k7CiAgICAgIGFycmF5W29mZnNldCArIDJdID0gdGhpcy5fejsKICAgICAgYXJyYXlbb2Zmc2V0ICsgM10gPSB0aGlzLl93OwogICAgICByZXR1cm4gYXJyYXk7CiAgICB9CiAgICBmcm9tQnVmZmVyQXR0cmlidXRlKGF0dHJpYnV0ZSwgaW5kZXgpIHsKICAgICAgdGhpcy5feCA9IGF0dHJpYnV0ZS5nZXRYKGluZGV4KTsKICAgICAgdGhpcy5feSA9IGF0dHJpYnV0ZS5nZXRZKGluZGV4KTsKICAgICAgdGhpcy5feiA9IGF0dHJpYnV0ZS5nZXRaKGluZGV4KTsKICAgICAgdGhpcy5fdyA9IGF0dHJpYnV0ZS5nZXRXKGluZGV4KTsKICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHRvSlNPTigpIHsKICAgICAgcmV0dXJuIHRoaXMudG9BcnJheSgpOwogICAgfQogICAgX29uQ2hhbmdlKGNhbGxiYWNrKSB7CiAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBfb25DaGFuZ2VDYWxsYmFjaygpIHt9CiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgIHlpZWxkIHRoaXMuX3g7CiAgICAgIHlpZWxkIHRoaXMuX3k7CiAgICAgIHlpZWxkIHRoaXMuX3o7CiAgICAgIHlpZWxkIHRoaXMuX3c7CiAgICB9CiAgfTsKICBWZWN0b3IzID0gY2xhc3MgVmVjdG9yMyB7CiAgICBjb25zdHJ1Y3Rvcih4ID0gMCwgeSA9IDAsIHogPSAwKSB7CiAgICAgIFZlY3RvcjMucHJvdG90eXBlLmlzVmVjdG9yMyA9IHRydWU7CiAgICAgIHRoaXMueCA9IHg7CiAgICAgIHRoaXMueSA9IHk7CiAgICAgIHRoaXMueiA9IHo7CiAgICB9CiAgICBzZXQoeCwgeSwgeikgewogICAgICBpZiAoeiA9PT0gdW5kZWZpbmVkKQogICAgICAgIHogPSB0aGlzLno7CiAgICAgIHRoaXMueCA9IHg7CiAgICAgIHRoaXMueSA9IHk7CiAgICAgIHRoaXMueiA9IHo7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0U2NhbGFyKHNjYWxhcikgewogICAgICB0aGlzLnggPSBzY2FsYXI7CiAgICAgIHRoaXMueSA9IHNjYWxhcjsKICAgICAgdGhpcy56ID0gc2NhbGFyOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldFgoeCkgewogICAgICB0aGlzLnggPSB4OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldFkoeSkgewogICAgICB0aGlzLnkgPSB5OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldFooeikgewogICAgICB0aGlzLnogPSB6OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldENvbXBvbmVudChpbmRleCwgdmFsdWUpIHsKICAgICAgc3dpdGNoIChpbmRleCkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIHRoaXMueCA9IHZhbHVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgdGhpcy55ID0gdmFsdWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICB0aGlzLnogPSB2YWx1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIiArIGluZGV4KTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldENvbXBvbmVudChpbmRleCkgewogICAgICBzd2l0Y2ggKGluZGV4KSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgcmV0dXJuIHRoaXMueDsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICByZXR1cm4gdGhpcy55OwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIHJldHVybiB0aGlzLno7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiICsgaW5kZXgpOwogICAgICB9CiAgICB9CiAgICBjbG9uZSgpIHsKICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCwgdGhpcy55LCB0aGlzLnopOwogICAgfQogICAgY29weSh2KSB7CiAgICAgIHRoaXMueCA9IHYueDsKICAgICAgdGhpcy55ID0gdi55OwogICAgICB0aGlzLnogPSB2Lno7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgYWRkKHYpIHsKICAgICAgdGhpcy54ICs9IHYueDsKICAgICAgdGhpcy55ICs9IHYueTsKICAgICAgdGhpcy56ICs9IHYuejsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBhZGRTY2FsYXIocykgewogICAgICB0aGlzLnggKz0gczsKICAgICAgdGhpcy55ICs9IHM7CiAgICAgIHRoaXMueiArPSBzOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGFkZFZlY3RvcnMoYSwgYikgewogICAgICB0aGlzLnggPSBhLnggKyBiLng7CiAgICAgIHRoaXMueSA9IGEueSArIGIueTsKICAgICAgdGhpcy56ID0gYS56ICsgYi56OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGFkZFNjYWxlZFZlY3Rvcih2LCBzKSB7CiAgICAgIHRoaXMueCArPSB2LnggKiBzOwogICAgICB0aGlzLnkgKz0gdi55ICogczsKICAgICAgdGhpcy56ICs9IHYueiAqIHM7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc3ViKHYpIHsKICAgICAgdGhpcy54IC09IHYueDsKICAgICAgdGhpcy55IC09IHYueTsKICAgICAgdGhpcy56IC09IHYuejsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzdWJTY2FsYXIocykgewogICAgICB0aGlzLnggLT0gczsKICAgICAgdGhpcy55IC09IHM7CiAgICAgIHRoaXMueiAtPSBzOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHN1YlZlY3RvcnMoYSwgYikgewogICAgICB0aGlzLnggPSBhLnggLSBiLng7CiAgICAgIHRoaXMueSA9IGEueSAtIGIueTsKICAgICAgdGhpcy56ID0gYS56IC0gYi56OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIG11bHRpcGx5KHYpIHsKICAgICAgdGhpcy54ICo9IHYueDsKICAgICAgdGhpcy55ICo9IHYueTsKICAgICAgdGhpcy56ICo9IHYuejsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBtdWx0aXBseVNjYWxhcihzY2FsYXIpIHsKICAgICAgdGhpcy54ICo9IHNjYWxhcjsKICAgICAgdGhpcy55ICo9IHNjYWxhcjsKICAgICAgdGhpcy56ICo9IHNjYWxhcjsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBtdWx0aXBseVZlY3RvcnMoYSwgYikgewogICAgICB0aGlzLnggPSBhLnggKiBiLng7CiAgICAgIHRoaXMueSA9IGEueSAqIGIueTsKICAgICAgdGhpcy56ID0gYS56ICogYi56OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGFwcGx5RXVsZXIoZXVsZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKF9xdWF0ZXJuaW9uJDQuc2V0RnJvbUV1bGVyKGV1bGVyKSk7CiAgICB9CiAgICBhcHBseUF4aXNBbmdsZShheGlzLCBhbmdsZSkgewogICAgICByZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oX3F1YXRlcm5pb24kNC5zZXRGcm9tQXhpc0FuZ2xlKGF4aXMsIGFuZ2xlKSk7CiAgICB9CiAgICBhcHBseU1hdHJpeDMobSkgewogICAgICBjb25zdCB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56OwogICAgICBjb25zdCBlID0gbS5lbGVtZW50czsKICAgICAgdGhpcy54ID0gZVswXSAqIHggKyBlWzNdICogeSArIGVbNl0gKiB6OwogICAgICB0aGlzLnkgPSBlWzFdICogeCArIGVbNF0gKiB5ICsgZVs3XSAqIHo7CiAgICAgIHRoaXMueiA9IGVbMl0gKiB4ICsgZVs1XSAqIHkgKyBlWzhdICogejsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBhcHBseU5vcm1hbE1hdHJpeChtKSB7CiAgICAgIHJldHVybiB0aGlzLmFwcGx5TWF0cml4MyhtKS5ub3JtYWxpemUoKTsKICAgIH0KICAgIGFwcGx5TWF0cml4NChtKSB7CiAgICAgIGNvbnN0IHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7CiAgICAgIGNvbnN0IGUgPSBtLmVsZW1lbnRzOwogICAgICBjb25zdCB3ID0gMSAvIChlWzNdICogeCArIGVbN10gKiB5ICsgZVsxMV0gKiB6ICsgZVsxNV0pOwogICAgICB0aGlzLnggPSAoZVswXSAqIHggKyBlWzRdICogeSArIGVbOF0gKiB6ICsgZVsxMl0pICogdzsKICAgICAgdGhpcy55ID0gKGVbMV0gKiB4ICsgZVs1XSAqIHkgKyBlWzldICogeiArIGVbMTNdKSAqIHc7CiAgICAgIHRoaXMueiA9IChlWzJdICogeCArIGVbNl0gKiB5ICsgZVsxMF0gKiB6ICsgZVsxNF0pICogdzsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBhcHBseVF1YXRlcm5pb24ocSkgewogICAgICBjb25zdCB2eCA9IHRoaXMueCwgdnkgPSB0aGlzLnksIHZ6ID0gdGhpcy56OwogICAgICBjb25zdCB7IHg6IHF4LCB5OiBxeSwgejogcXosIHc6IHF3IH0gPSBxOwogICAgICBjb25zdCB0eCA9IDIgKiAocXkgKiB2eiAtIHF6ICogdnkpOwogICAgICBjb25zdCB0eSA9IDIgKiAocXogKiB2eCAtIHF4ICogdnopOwogICAgICBjb25zdCB0eiA9IDIgKiAocXggKiB2eSAtIHF5ICogdngpOwogICAgICB0aGlzLnggPSB2eCArIHF3ICogdHggKyBxeSAqIHR6IC0gcXogKiB0eTsKICAgICAgdGhpcy55ID0gdnkgKyBxdyAqIHR5ICsgcXogKiB0eCAtIHF4ICogdHo7CiAgICAgIHRoaXMueiA9IHZ6ICsgcXcgKiB0eiArIHF4ICogdHkgLSBxeSAqIHR4OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHByb2plY3QoY2FtZXJhKSB7CiAgICAgIHJldHVybiB0aGlzLmFwcGx5TWF0cml4NChjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQoY2FtZXJhLnByb2plY3Rpb25NYXRyaXgpOwogICAgfQogICAgdW5wcm9qZWN0KGNhbWVyYSkgewogICAgICByZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKS5hcHBseU1hdHJpeDQoY2FtZXJhLm1hdHJpeFdvcmxkKTsKICAgIH0KICAgIHRyYW5zZm9ybURpcmVjdGlvbihtKSB7CiAgICAgIGNvbnN0IHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7CiAgICAgIGNvbnN0IGUgPSBtLmVsZW1lbnRzOwogICAgICB0aGlzLnggPSBlWzBdICogeCArIGVbNF0gKiB5ICsgZVs4XSAqIHo7CiAgICAgIHRoaXMueSA9IGVbMV0gKiB4ICsgZVs1XSAqIHkgKyBlWzldICogejsKICAgICAgdGhpcy56ID0gZVsyXSAqIHggKyBlWzZdICogeSArIGVbMTBdICogejsKICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplKCk7CiAgICB9CiAgICBkaXZpZGUodikgewogICAgICB0aGlzLnggLz0gdi54OwogICAgICB0aGlzLnkgLz0gdi55OwogICAgICB0aGlzLnogLz0gdi56OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGRpdmlkZVNjYWxhcihzY2FsYXIpIHsKICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMSAvIHNjYWxhcik7CiAgICB9CiAgICBtaW4odikgewogICAgICB0aGlzLnggPSBNYXRoLm1pbih0aGlzLngsIHYueCk7CiAgICAgIHRoaXMueSA9IE1hdGgubWluKHRoaXMueSwgdi55KTsKICAgICAgdGhpcy56ID0gTWF0aC5taW4odGhpcy56LCB2LnopOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIG1heCh2KSB7CiAgICAgIHRoaXMueCA9IE1hdGgubWF4KHRoaXMueCwgdi54KTsKICAgICAgdGhpcy55ID0gTWF0aC5tYXgodGhpcy55LCB2LnkpOwogICAgICB0aGlzLnogPSBNYXRoLm1heCh0aGlzLnosIHYueik7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgY2xhbXAobWluLCBtYXgpIHsKICAgICAgdGhpcy54ID0gY2xhbXAodGhpcy54LCBtaW4ueCwgbWF4LngpOwogICAgICB0aGlzLnkgPSBjbGFtcCh0aGlzLnksIG1pbi55LCBtYXgueSk7CiAgICAgIHRoaXMueiA9IGNsYW1wKHRoaXMueiwgbWluLnosIG1heC56KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjbGFtcFNjYWxhcihtaW5WYWwsIG1heFZhbCkgewogICAgICB0aGlzLnggPSBjbGFtcCh0aGlzLngsIG1pblZhbCwgbWF4VmFsKTsKICAgICAgdGhpcy55ID0gY2xhbXAodGhpcy55LCBtaW5WYWwsIG1heFZhbCk7CiAgICAgIHRoaXMueiA9IGNsYW1wKHRoaXMueiwgbWluVmFsLCBtYXhWYWwpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGNsYW1wTGVuZ3RoKG1pbiwgbWF4KSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7CiAgICAgIHJldHVybiB0aGlzLmRpdmlkZVNjYWxhcihsZW5ndGggfHwgMSkubXVsdGlwbHlTY2FsYXIoY2xhbXAobGVuZ3RoLCBtaW4sIG1heCkpOwogICAgfQogICAgZmxvb3IoKSB7CiAgICAgIHRoaXMueCA9IE1hdGguZmxvb3IodGhpcy54KTsKICAgICAgdGhpcy55ID0gTWF0aC5mbG9vcih0aGlzLnkpOwogICAgICB0aGlzLnogPSBNYXRoLmZsb29yKHRoaXMueik7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgY2VpbCgpIHsKICAgICAgdGhpcy54ID0gTWF0aC5jZWlsKHRoaXMueCk7CiAgICAgIHRoaXMueSA9IE1hdGguY2VpbCh0aGlzLnkpOwogICAgICB0aGlzLnogPSBNYXRoLmNlaWwodGhpcy56KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByb3VuZCgpIHsKICAgICAgdGhpcy54ID0gTWF0aC5yb3VuZCh0aGlzLngpOwogICAgICB0aGlzLnkgPSBNYXRoLnJvdW5kKHRoaXMueSk7CiAgICAgIHRoaXMueiA9IE1hdGgucm91bmQodGhpcy56KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByb3VuZFRvWmVybygpIHsKICAgICAgdGhpcy54ID0gTWF0aC50cnVuYyh0aGlzLngpOwogICAgICB0aGlzLnkgPSBNYXRoLnRydW5jKHRoaXMueSk7CiAgICAgIHRoaXMueiA9IE1hdGgudHJ1bmModGhpcy56KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBuZWdhdGUoKSB7CiAgICAgIHRoaXMueCA9IC10aGlzLng7CiAgICAgIHRoaXMueSA9IC10aGlzLnk7CiAgICAgIHRoaXMueiA9IC10aGlzLno7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZG90KHYpIHsKICAgICAgcmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueSArIHRoaXMueiAqIHYuejsKICAgIH0KICAgIGxlbmd0aFNxKCkgewogICAgICByZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56OwogICAgfQogICAgbGVuZ3RoKCkgewogICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueik7CiAgICB9CiAgICBtYW5oYXR0YW5MZW5ndGgoKSB7CiAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLngpICsgTWF0aC5hYnModGhpcy55KSArIE1hdGguYWJzKHRoaXMueik7CiAgICB9CiAgICBub3JtYWxpemUoKSB7CiAgICAgIHJldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpIHx8IDEpOwogICAgfQogICAgc2V0TGVuZ3RoKGxlbmd0aCkgewogICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihsZW5ndGgpOwogICAgfQogICAgbGVycCh2LCBhbHBoYSkgewogICAgICB0aGlzLnggKz0gKHYueCAtIHRoaXMueCkgKiBhbHBoYTsKICAgICAgdGhpcy55ICs9ICh2LnkgLSB0aGlzLnkpICogYWxwaGE7CiAgICAgIHRoaXMueiArPSAodi56IC0gdGhpcy56KSAqIGFscGhhOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGxlcnBWZWN0b3JzKHYxLCB2MiwgYWxwaGEpIHsKICAgICAgdGhpcy54ID0gdjEueCArICh2Mi54IC0gdjEueCkgKiBhbHBoYTsKICAgICAgdGhpcy55ID0gdjEueSArICh2Mi55IC0gdjEueSkgKiBhbHBoYTsKICAgICAgdGhpcy56ID0gdjEueiArICh2Mi56IC0gdjEueikgKiBhbHBoYTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjcm9zcyh2KSB7CiAgICAgIHJldHVybiB0aGlzLmNyb3NzVmVjdG9ycyh0aGlzLCB2KTsKICAgIH0KICAgIGNyb3NzVmVjdG9ycyhhLCBiKSB7CiAgICAgIGNvbnN0IHsgeDogYXgsIHk6IGF5LCB6OiBheiB9ID0gYTsKICAgICAgY29uc3QgeyB4OiBieCwgeTogYnksIHo6IGJ6IH0gPSBiOwogICAgICB0aGlzLnggPSBheSAqIGJ6IC0gYXogKiBieTsKICAgICAgdGhpcy55ID0gYXogKiBieCAtIGF4ICogYno7CiAgICAgIHRoaXMueiA9IGF4ICogYnkgLSBheSAqIGJ4OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHByb2plY3RPblZlY3Rvcih2KSB7CiAgICAgIGNvbnN0IGRlbm9taW5hdG9yID0gdi5sZW5ndGhTcSgpOwogICAgICBpZiAoZGVub21pbmF0b3IgPT09IDApCiAgICAgICAgcmV0dXJuIHRoaXMuc2V0KDAsIDAsIDApOwogICAgICBjb25zdCBzY2FsYXIgPSB2LmRvdCh0aGlzKSAvIGRlbm9taW5hdG9yOwogICAgICByZXR1cm4gdGhpcy5jb3B5KHYpLm11bHRpcGx5U2NhbGFyKHNjYWxhcik7CiAgICB9CiAgICBwcm9qZWN0T25QbGFuZShwbGFuZU5vcm1hbCkgewogICAgICBfdmVjdG9yJGMuY29weSh0aGlzKS5wcm9qZWN0T25WZWN0b3IocGxhbmVOb3JtYWwpOwogICAgICByZXR1cm4gdGhpcy5zdWIoX3ZlY3RvciRjKTsKICAgIH0KICAgIHJlZmxlY3Qobm9ybWFsKSB7CiAgICAgIHJldHVybiB0aGlzLnN1YihfdmVjdG9yJGMuY29weShub3JtYWwpLm11bHRpcGx5U2NhbGFyKDIgKiB0aGlzLmRvdChub3JtYWwpKSk7CiAgICB9CiAgICBhbmdsZVRvKHYpIHsKICAgICAgY29uc3QgZGVub21pbmF0b3IgPSBNYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpICogdi5sZW5ndGhTcSgpKTsKICAgICAgaWYgKGRlbm9taW5hdG9yID09PSAwKQogICAgICAgIHJldHVybiBNYXRoLlBJIC8gMjsKICAgICAgY29uc3QgdGhldGEgPSB0aGlzLmRvdCh2KSAvIGRlbm9taW5hdG9yOwogICAgICByZXR1cm4gTWF0aC5hY29zKGNsYW1wKHRoZXRhLCAtMSwgMSkpOwogICAgfQogICAgZGlzdGFuY2VUbyh2KSB7CiAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh2KSk7CiAgICB9CiAgICBkaXN0YW5jZVRvU3F1YXJlZCh2KSB7CiAgICAgIGNvbnN0IGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueSwgZHogPSB0aGlzLnogLSB2Lno7CiAgICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeSArIGR6ICogZHo7CiAgICB9CiAgICBtYW5oYXR0YW5EaXN0YW5jZVRvKHYpIHsKICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMueCAtIHYueCkgKyBNYXRoLmFicyh0aGlzLnkgLSB2LnkpICsgTWF0aC5hYnModGhpcy56IC0gdi56KTsKICAgIH0KICAgIHNldEZyb21TcGhlcmljYWwocykgewogICAgICByZXR1cm4gdGhpcy5zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHMucmFkaXVzLCBzLnBoaSwgcy50aGV0YSk7CiAgICB9CiAgICBzZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHJhZGl1cywgcGhpLCB0aGV0YSkgewogICAgICBjb25zdCBzaW5QaGlSYWRpdXMgPSBNYXRoLnNpbihwaGkpICogcmFkaXVzOwogICAgICB0aGlzLnggPSBzaW5QaGlSYWRpdXMgKiBNYXRoLnNpbih0aGV0YSk7CiAgICAgIHRoaXMueSA9IE1hdGguY29zKHBoaSkgKiByYWRpdXM7CiAgICAgIHRoaXMueiA9IHNpblBoaVJhZGl1cyAqIE1hdGguY29zKHRoZXRhKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tQ3lsaW5kcmljYWwoYykgewogICAgICByZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMoYy5yYWRpdXMsIGMudGhldGEsIGMueSk7CiAgICB9CiAgICBzZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMocmFkaXVzLCB0aGV0YSwgeSkgewogICAgICB0aGlzLnggPSByYWRpdXMgKiBNYXRoLnNpbih0aGV0YSk7CiAgICAgIHRoaXMueSA9IHk7CiAgICAgIHRoaXMueiA9IHJhZGl1cyAqIE1hdGguY29zKHRoZXRhKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tTWF0cml4UG9zaXRpb24obSkgewogICAgICBjb25zdCBlID0gbS5lbGVtZW50czsKICAgICAgdGhpcy54ID0gZVsxMl07CiAgICAgIHRoaXMueSA9IGVbMTNdOwogICAgICB0aGlzLnogPSBlWzE0XTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tTWF0cml4U2NhbGUobSkgewogICAgICBjb25zdCBzeCA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihtLCAwKS5sZW5ndGgoKTsKICAgICAgY29uc3Qgc3kgPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4obSwgMSkubGVuZ3RoKCk7CiAgICAgIGNvbnN0IHN6ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKG0sIDIpLmxlbmd0aCgpOwogICAgICB0aGlzLnggPSBzeDsKICAgICAgdGhpcy55ID0gc3k7CiAgICAgIHRoaXMueiA9IHN6OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldEZyb21NYXRyaXhDb2x1bW4obSwgaW5kZXgpIHsKICAgICAgcmV0dXJuIHRoaXMuZnJvbUFycmF5KG0uZWxlbWVudHMsIGluZGV4ICogNCk7CiAgICB9CiAgICBzZXRGcm9tTWF0cml4M0NvbHVtbihtLCBpbmRleCkgewogICAgICByZXR1cm4gdGhpcy5mcm9tQXJyYXkobS5lbGVtZW50cywgaW5kZXggKiAzKTsKICAgIH0KICAgIHNldEZyb21FdWxlcihlKSB7CiAgICAgIHRoaXMueCA9IGUuX3g7CiAgICAgIHRoaXMueSA9IGUuX3k7CiAgICAgIHRoaXMueiA9IGUuX3o7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0RnJvbUNvbG9yKGMpIHsKICAgICAgdGhpcy54ID0gYy5yOwogICAgICB0aGlzLnkgPSBjLmc7CiAgICAgIHRoaXMueiA9IGMuYjsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBlcXVhbHModikgewogICAgICByZXR1cm4gdi54ID09PSB0aGlzLnggJiYgdi55ID09PSB0aGlzLnkgJiYgdi56ID09PSB0aGlzLno7CiAgICB9CiAgICBmcm9tQXJyYXkoYXJyYXksIG9mZnNldCA9IDApIHsKICAgICAgdGhpcy54ID0gYXJyYXlbb2Zmc2V0XTsKICAgICAgdGhpcy55ID0gYXJyYXlbb2Zmc2V0ICsgMV07CiAgICAgIHRoaXMueiA9IGFycmF5W29mZnNldCArIDJdOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHRvQXJyYXkoYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCkgewogICAgICBhcnJheVtvZmZzZXRdID0gdGhpcy54OwogICAgICBhcnJheVtvZmZzZXQgKyAxXSA9IHRoaXMueTsKICAgICAgYXJyYXlbb2Zmc2V0ICsgMl0gPSB0aGlzLno7CiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KICAgIGZyb21CdWZmZXJBdHRyaWJ1dGUoYXR0cmlidXRlLCBpbmRleCkgewogICAgICB0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WChpbmRleCk7CiAgICAgIHRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKGluZGV4KTsKICAgICAgdGhpcy56ID0gYXR0cmlidXRlLmdldFooaW5kZXgpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJhbmRvbSgpIHsKICAgICAgdGhpcy54ID0gTWF0aC5yYW5kb20oKTsKICAgICAgdGhpcy55ID0gTWF0aC5yYW5kb20oKTsKICAgICAgdGhpcy56ID0gTWF0aC5yYW5kb20oKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByYW5kb21EaXJlY3Rpb24oKSB7CiAgICAgIGNvbnN0IHRoZXRhID0gTWF0aC5yYW5kb20oKSAqIE1hdGguUEkgKiAyOwogICAgICBjb25zdCB1ID0gTWF0aC5yYW5kb20oKSAqIDIgLSAxOwogICAgICBjb25zdCBjID0gTWF0aC5zcXJ0KDEgLSB1ICogdSk7CiAgICAgIHRoaXMueCA9IGMgKiBNYXRoLmNvcyh0aGV0YSk7CiAgICAgIHRoaXMueSA9IHU7CiAgICAgIHRoaXMueiA9IGMgKiBNYXRoLnNpbih0aGV0YSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgKltTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgICB5aWVsZCB0aGlzLng7CiAgICAgIHlpZWxkIHRoaXMueTsKICAgICAgeWllbGQgdGhpcy56OwogICAgfQogIH07CiAgX3ZlY3RvciRjID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9xdWF0ZXJuaW9uJDQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFF1YXRlcm5pb247CiAgX3BvaW50cyA9IFsKICAgIC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMywKICAgIC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMywKICAgIC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMywKICAgIC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMywKICAgIC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMywKICAgIC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMywKICAgIC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMywKICAgIC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMwogIF07CiAgX3ZlY3RvciRiID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9ib3gkNCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgQm94MzsKICBfdjAkMiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfdjEkNyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfdjIkNCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfZjAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX2YxID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9mMiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfY2VudGVyID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9leHRlbnRzID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF90cmlhbmdsZU5vcm1hbCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfdGVzdEF4aXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX2JveCQzID0gLyogQF9fUFVSRV9fICovIG5ldyBCb3gzOwogIF92MSQ2ID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF92MiQzID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF92ZWN0b3IkYSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfc2VnQ2VudGVyID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9zZWdEaXIgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX2RpZmYgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX2VkZ2UxID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9lZGdlMiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfbm9ybWFsJDEgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX3YxJDUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX20xJDIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDQ7CiAgX3plcm8gPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjMoMCwgMCwgMCk7CiAgX29uZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMygxLCAxLCAxKTsKICBfeCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfeSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfeiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfbWF0cml4JDIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDQ7CiAgX3F1YXRlcm5pb24kMyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgUXVhdGVybmlvbjsKICBFdWxlciA9IGNsYXNzIEV1bGVyIHsKICAgIGNvbnN0cnVjdG9yKHggPSAwLCB5ID0gMCwgeiA9IDAsIG9yZGVyID0gRXVsZXIuREVGQVVMVF9PUkRFUikgewogICAgICB0aGlzLmlzRXVsZXIgPSB0cnVlOwogICAgICB0aGlzLl94ID0geDsKICAgICAgdGhpcy5feSA9IHk7CiAgICAgIHRoaXMuX3ogPSB6OwogICAgICB0aGlzLl9vcmRlciA9IG9yZGVyOwogICAgfQogICAgZ2V0IHgoKSB7CiAgICAgIHJldHVybiB0aGlzLl94OwogICAgfQogICAgc2V0IHgodmFsdWUpIHsKICAgICAgdGhpcy5feCA9IHZhbHVlOwogICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CiAgICB9CiAgICBnZXQgeSgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3k7CiAgICB9CiAgICBzZXQgeSh2YWx1ZSkgewogICAgICB0aGlzLl95ID0gdmFsdWU7CiAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTsKICAgIH0KICAgIGdldCB6KCkgewogICAgICByZXR1cm4gdGhpcy5fejsKICAgIH0KICAgIHNldCB6KHZhbHVlKSB7CiAgICAgIHRoaXMuX3ogPSB2YWx1ZTsKICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwogICAgfQogICAgZ2V0IG9yZGVyKCkgewogICAgICByZXR1cm4gdGhpcy5fb3JkZXI7CiAgICB9CiAgICBzZXQgb3JkZXIodmFsdWUpIHsKICAgICAgdGhpcy5fb3JkZXIgPSB2YWx1ZTsKICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwogICAgfQogICAgc2V0KHgsIHksIHosIG9yZGVyID0gdGhpcy5fb3JkZXIpIHsKICAgICAgdGhpcy5feCA9IHg7CiAgICAgIHRoaXMuX3kgPSB5OwogICAgICB0aGlzLl96ID0gejsKICAgICAgdGhpcy5fb3JkZXIgPSBvcmRlcjsKICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGNsb25lKCkgewogICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fb3JkZXIpOwogICAgfQogICAgY29weShldWxlcikgewogICAgICB0aGlzLl94ID0gZXVsZXIuX3g7CiAgICAgIHRoaXMuX3kgPSBldWxlci5feTsKICAgICAgdGhpcy5feiA9IGV1bGVyLl96OwogICAgICB0aGlzLl9vcmRlciA9IGV1bGVyLl9vcmRlcjsKICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldEZyb21Sb3RhdGlvbk1hdHJpeChtLCBvcmRlciA9IHRoaXMuX29yZGVyLCB1cGRhdGUgPSB0cnVlKSB7CiAgICAgIGNvbnN0IHRlID0gbS5lbGVtZW50czsKICAgICAgY29uc3QgbTExID0gdGVbMF0sIG0xMiA9IHRlWzRdLCBtMTMgPSB0ZVs4XTsKICAgICAgY29uc3QgbTIxID0gdGVbMV0sIG0yMiA9IHRlWzVdLCBtMjMgPSB0ZVs5XTsKICAgICAgY29uc3QgbTMxID0gdGVbMl0sIG0zMiA9IHRlWzZdLCBtMzMgPSB0ZVsxMF07CiAgICAgIHN3aXRjaCAob3JkZXIpIHsKICAgICAgICBjYXNlICJYWVoiOgogICAgICAgICAgdGhpcy5feSA9IE1hdGguYXNpbihjbGFtcChtMTMsIC0xLCAxKSk7CiAgICAgICAgICBpZiAoTWF0aC5hYnMobTEzKSA8IDAuOTk5OTk5OSkgewogICAgICAgICAgICB0aGlzLl94ID0gTWF0aC5hdGFuMigtbTIzLCBtMzMpOwogICAgICAgICAgICB0aGlzLl96ID0gTWF0aC5hdGFuMigtbTEyLCBtMTEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5feCA9IE1hdGguYXRhbjIobTMyLCBtMjIpOwogICAgICAgICAgICB0aGlzLl96ID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIllYWiI6CiAgICAgICAgICB0aGlzLl94ID0gTWF0aC5hc2luKC1jbGFtcChtMjMsIC0xLCAxKSk7CiAgICAgICAgICBpZiAoTWF0aC5hYnMobTIzKSA8IDAuOTk5OTk5OSkgewogICAgICAgICAgICB0aGlzLl95ID0gTWF0aC5hdGFuMihtMTMsIG0zMyk7CiAgICAgICAgICAgIHRoaXMuX3ogPSBNYXRoLmF0YW4yKG0yMSwgbTIyKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX3kgPSBNYXRoLmF0YW4yKC1tMzEsIG0xMSk7CiAgICAgICAgICAgIHRoaXMuX3ogPSAwOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiWlhZIjoKICAgICAgICAgIHRoaXMuX3ggPSBNYXRoLmFzaW4oY2xhbXAobTMyLCAtMSwgMSkpOwogICAgICAgICAgaWYgKE1hdGguYWJzKG0zMikgPCAwLjk5OTk5OTkpIHsKICAgICAgICAgICAgdGhpcy5feSA9IE1hdGguYXRhbjIoLW0zMSwgbTMzKTsKICAgICAgICAgICAgdGhpcy5feiA9IE1hdGguYXRhbjIoLW0xMiwgbTIyKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX3kgPSAwOwogICAgICAgICAgICB0aGlzLl96ID0gTWF0aC5hdGFuMihtMjEsIG0xMSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJaWVgiOgogICAgICAgICAgdGhpcy5feSA9IE1hdGguYXNpbigtY2xhbXAobTMxLCAtMSwgMSkpOwogICAgICAgICAgaWYgKE1hdGguYWJzKG0zMSkgPCAwLjk5OTk5OTkpIHsKICAgICAgICAgICAgdGhpcy5feCA9IE1hdGguYXRhbjIobTMyLCBtMzMpOwogICAgICAgICAgICB0aGlzLl96ID0gTWF0aC5hdGFuMihtMjEsIG0xMSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl94ID0gMDsKICAgICAgICAgICAgdGhpcy5feiA9IE1hdGguYXRhbjIoLW0xMiwgbTIyKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIllaWCI6CiAgICAgICAgICB0aGlzLl96ID0gTWF0aC5hc2luKGNsYW1wKG0yMSwgLTEsIDEpKTsKICAgICAgICAgIGlmIChNYXRoLmFicyhtMjEpIDwgMC45OTk5OTk5KSB7CiAgICAgICAgICAgIHRoaXMuX3ggPSBNYXRoLmF0YW4yKC1tMjMsIG0yMik7CiAgICAgICAgICAgIHRoaXMuX3kgPSBNYXRoLmF0YW4yKC1tMzEsIG0xMSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl94ID0gMDsKICAgICAgICAgICAgdGhpcy5feSA9IE1hdGguYXRhbjIobTEzLCBtMzMpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiWFpZIjoKICAgICAgICAgIHRoaXMuX3ogPSBNYXRoLmFzaW4oLWNsYW1wKG0xMiwgLTEsIDEpKTsKICAgICAgICAgIGlmIChNYXRoLmFicyhtMTIpIDwgMC45OTk5OTk5KSB7CiAgICAgICAgICAgIHRoaXMuX3ggPSBNYXRoLmF0YW4yKG0zMiwgbTIyKTsKICAgICAgICAgICAgdGhpcy5feSA9IE1hdGguYXRhbjIobTEzLCBtMTEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5feCA9IE1hdGguYXRhbjIoLW0yMywgbTMzKTsKICAgICAgICAgICAgdGhpcy5feSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIgKyBvcmRlcik7CiAgICAgIH0KICAgICAgdGhpcy5fb3JkZXIgPSBvcmRlcjsKICAgICAgaWYgKHVwZGF0ZSA9PT0gdHJ1ZSkKICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0RnJvbVF1YXRlcm5pb24ocSwgb3JkZXIsIHVwZGF0ZSkgewogICAgICBfbWF0cml4JDIubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24ocSk7CiAgICAgIHJldHVybiB0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeChfbWF0cml4JDIsIG9yZGVyLCB1cGRhdGUpOwogICAgfQogICAgc2V0RnJvbVZlY3RvcjModiwgb3JkZXIgPSB0aGlzLl9vcmRlcikgewogICAgICByZXR1cm4gdGhpcy5zZXQodi54LCB2LnksIHYueiwgb3JkZXIpOwogICAgfQogICAgcmVvcmRlcihuZXdPcmRlcikgewogICAgICBfcXVhdGVybmlvbiQzLnNldEZyb21FdWxlcih0aGlzKTsKICAgICAgcmV0dXJuIHRoaXMuc2V0RnJvbVF1YXRlcm5pb24oX3F1YXRlcm5pb24kMywgbmV3T3JkZXIpOwogICAgfQogICAgZXF1YWxzKGV1bGVyKSB7CiAgICAgIHJldHVybiBldWxlci5feCA9PT0gdGhpcy5feCAmJiBldWxlci5feSA9PT0gdGhpcy5feSAmJiBldWxlci5feiA9PT0gdGhpcy5feiAmJiBldWxlci5fb3JkZXIgPT09IHRoaXMuX29yZGVyOwogICAgfQogICAgZnJvbUFycmF5KGFycmF5KSB7CiAgICAgIHRoaXMuX3ggPSBhcnJheVswXTsKICAgICAgdGhpcy5feSA9IGFycmF5WzFdOwogICAgICB0aGlzLl96ID0gYXJyYXlbMl07CiAgICAgIGlmIChhcnJheVszXSAhPT0gdW5kZWZpbmVkKQogICAgICAgIHRoaXMuX29yZGVyID0gYXJyYXlbM107CiAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0b0FycmF5KGFycmF5ID0gW10sIG9mZnNldCA9IDApIHsKICAgICAgYXJyYXlbb2Zmc2V0XSA9IHRoaXMuX3g7CiAgICAgIGFycmF5W29mZnNldCArIDFdID0gdGhpcy5feTsKICAgICAgYXJyYXlbb2Zmc2V0ICsgMl0gPSB0aGlzLl96OwogICAgICBhcnJheVtvZmZzZXQgKyAzXSA9IHRoaXMuX29yZGVyOwogICAgICByZXR1cm4gYXJyYXk7CiAgICB9CiAgICBfb25DaGFuZ2UoY2FsbGJhY2spIHsKICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIF9vbkNoYW5nZUNhbGxiYWNrKCkge30KICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHsKICAgICAgeWllbGQgdGhpcy5feDsKICAgICAgeWllbGQgdGhpcy5feTsKICAgICAgeWllbGQgdGhpcy5fejsKICAgICAgeWllbGQgdGhpcy5fb3JkZXI7CiAgICB9CiAgfTsKICBFdWxlci5ERUZBVUxUX09SREVSID0gIlhZWiI7CiAgX3YxJDQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX3ExID0gLyogQF9fUFVSRV9fICovIG5ldyBRdWF0ZXJuaW9uOwogIF9tMSQxID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXg0OwogIF90YXJnZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX3Bvc2l0aW9uJDMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX3NjYWxlJDIgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX3F1YXRlcm5pb24kMiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgUXVhdGVybmlvbjsKICBfeEF4aXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjMoMSwgMCwgMCk7CiAgX3lBeGlzID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzKDAsIDEsIDApOwogIF96QXhpcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMygwLCAwLCAxKTsKICBfYWRkZWRFdmVudCA9IHsgdHlwZTogImFkZGVkIiB9OwogIF9yZW1vdmVkRXZlbnQgPSB7IHR5cGU6ICJyZW1vdmVkIiB9OwogIF9jaGlsZGFkZGVkRXZlbnQgPSB7IHR5cGU6ICJjaGlsZGFkZGVkIiwgY2hpbGQ6IG51bGwgfTsKICBfY2hpbGRyZW1vdmVkRXZlbnQgPSB7IHR5cGU6ICJjaGlsZHJlbW92ZWQiLCBjaGlsZDogbnVsbCB9OwogIE9iamVjdDNEID0gY2xhc3MgT2JqZWN0M0QgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNPYmplY3QzRCA9IHRydWU7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiaWQiLCB7IHZhbHVlOiBfb2JqZWN0M0RJZCsrIH0pOwogICAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTsKICAgICAgdGhpcy5uYW1lID0gIiI7CiAgICAgIHRoaXMudHlwZSA9ICJPYmplY3QzRCI7CiAgICAgIHRoaXMucGFyZW50ID0gbnVsbDsKICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwogICAgICB0aGlzLnVwID0gT2JqZWN0M0QuREVGQVVMVF9VUC5jbG9uZSgpOwogICAgICBjb25zdCBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzOwogICAgICBjb25zdCByb3RhdGlvbiA9IG5ldyBFdWxlcjsKICAgICAgY29uc3QgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uOwogICAgICBjb25zdCBzY2FsZSA9IG5ldyBWZWN0b3IzKDEsIDEsIDEpOwogICAgICBmdW5jdGlvbiBvblJvdGF0aW9uQ2hhbmdlKCkgewogICAgICAgIHF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKHJvdGF0aW9uLCBmYWxzZSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gb25RdWF0ZXJuaW9uQ2hhbmdlKCkgewogICAgICAgIHJvdGF0aW9uLnNldEZyb21RdWF0ZXJuaW9uKHF1YXRlcm5pb24sIHVuZGVmaW5lZCwgZmFsc2UpOwogICAgICB9CiAgICAgIHJvdGF0aW9uLl9vbkNoYW5nZShvblJvdGF0aW9uQ2hhbmdlKTsKICAgICAgcXVhdGVybmlvbi5fb25DaGFuZ2Uob25RdWF0ZXJuaW9uQ2hhbmdlKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywgewogICAgICAgIHBvc2l0aW9uOiB7CiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgdmFsdWU6IHBvc2l0aW9uCiAgICAgICAgfSwKICAgICAgICByb3RhdGlvbjogewogICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgIHZhbHVlOiByb3RhdGlvbgogICAgICAgIH0sCiAgICAgICAgcXVhdGVybmlvbjogewogICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgIHZhbHVlOiBxdWF0ZXJuaW9uCiAgICAgICAgfSwKICAgICAgICBzY2FsZTogewogICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgIHZhbHVlOiBzY2FsZQogICAgICAgIH0sCiAgICAgICAgbW9kZWxWaWV3TWF0cml4OiB7CiAgICAgICAgICB2YWx1ZTogbmV3IE1hdHJpeDQKICAgICAgICB9LAogICAgICAgIG5vcm1hbE1hdHJpeDogewogICAgICAgICAgdmFsdWU6IG5ldyBNYXRyaXgzCiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NDsKICAgICAgdGhpcy5tYXRyaXhXb3JsZCA9IG5ldyBNYXRyaXg0OwogICAgICB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBPYmplY3QzRC5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURTsKICAgICAgdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGUgPSBPYmplY3QzRC5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURTsKICAgICAgdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7CiAgICAgIHRoaXMubGF5ZXJzID0gbmV3IExheWVyczsKICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTsKICAgICAgdGhpcy5jYXN0U2hhZG93ID0gZmFsc2U7CiAgICAgIHRoaXMucmVjZWl2ZVNoYWRvdyA9IGZhbHNlOwogICAgICB0aGlzLmZydXN0dW1DdWxsZWQgPSB0cnVlOwogICAgICB0aGlzLnJlbmRlck9yZGVyID0gMDsKICAgICAgdGhpcy5hbmltYXRpb25zID0gW107CiAgICAgIHRoaXMudXNlckRhdGEgPSB7fTsKICAgIH0KICAgIG9uQmVmb3JlU2hhZG93KCkge30KICAgIG9uQWZ0ZXJTaGFkb3coKSB7fQogICAgb25CZWZvcmVSZW5kZXIoKSB7fQogICAgb25BZnRlclJlbmRlcigpIHt9CiAgICBhcHBseU1hdHJpeDQobWF0cml4KSB7CiAgICAgIGlmICh0aGlzLm1hdHJpeEF1dG9VcGRhdGUpCiAgICAgICAgdGhpcy51cGRhdGVNYXRyaXgoKTsKICAgICAgdGhpcy5tYXRyaXgucHJlbXVsdGlwbHkobWF0cml4KTsKICAgICAgdGhpcy5tYXRyaXguZGVjb21wb3NlKHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSk7CiAgICB9CiAgICBhcHBseVF1YXRlcm5pb24ocSkgewogICAgICB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkocSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlKGF4aXMsIGFuZ2xlKSB7CiAgICAgIHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKGF4aXMsIGFuZ2xlKTsKICAgIH0KICAgIHNldFJvdGF0aW9uRnJvbUV1bGVyKGV1bGVyKSB7CiAgICAgIHRoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoZXVsZXIsIHRydWUpOwogICAgfQogICAgc2V0Um90YXRpb25Gcm9tTWF0cml4KG0pIHsKICAgICAgdGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChtKTsKICAgIH0KICAgIHNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24ocSkgewogICAgICB0aGlzLnF1YXRlcm5pb24uY29weShxKTsKICAgIH0KICAgIHJvdGF0ZU9uQXhpcyhheGlzLCBhbmdsZSkgewogICAgICBfcTEuc2V0RnJvbUF4aXNBbmdsZShheGlzLCBhbmdsZSk7CiAgICAgIHRoaXMucXVhdGVybmlvbi5tdWx0aXBseShfcTEpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJvdGF0ZU9uV29ybGRBeGlzKGF4aXMsIGFuZ2xlKSB7CiAgICAgIF9xMS5zZXRGcm9tQXhpc0FuZ2xlKGF4aXMsIGFuZ2xlKTsKICAgICAgdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KF9xMSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcm90YXRlWChhbmdsZSkgewogICAgICByZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoX3hBeGlzLCBhbmdsZSk7CiAgICB9CiAgICByb3RhdGVZKGFuZ2xlKSB7CiAgICAgIHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhfeUF4aXMsIGFuZ2xlKTsKICAgIH0KICAgIHJvdGF0ZVooYW5nbGUpIHsKICAgICAgcmV0dXJuIHRoaXMucm90YXRlT25BeGlzKF96QXhpcywgYW5nbGUpOwogICAgfQogICAgdHJhbnNsYXRlT25BeGlzKGF4aXMsIGRpc3RhbmNlKSB7CiAgICAgIF92MSQ0LmNvcHkoYXhpcykuYXBwbHlRdWF0ZXJuaW9uKHRoaXMucXVhdGVybmlvbik7CiAgICAgIHRoaXMucG9zaXRpb24uYWRkKF92MSQ0Lm11bHRpcGx5U2NhbGFyKGRpc3RhbmNlKSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdHJhbnNsYXRlWChkaXN0YW5jZSkgewogICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoX3hBeGlzLCBkaXN0YW5jZSk7CiAgICB9CiAgICB0cmFuc2xhdGVZKGRpc3RhbmNlKSB7CiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhfeUF4aXMsIGRpc3RhbmNlKTsKICAgIH0KICAgIHRyYW5zbGF0ZVooZGlzdGFuY2UpIHsKICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKF96QXhpcywgZGlzdGFuY2UpOwogICAgfQogICAgbG9jYWxUb1dvcmxkKHZlY3RvcikgewogICAgICB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTsKICAgICAgcmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCk7CiAgICB9CiAgICB3b3JsZFRvTG9jYWwodmVjdG9yKSB7CiAgICAgIHRoaXMudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpOwogICAgICByZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NChfbTEkMS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKTsKICAgIH0KICAgIGxvb2tBdCh4LCB5LCB6KSB7CiAgICAgIGlmICh4LmlzVmVjdG9yMykgewogICAgICAgIF90YXJnZXQuY29weSh4KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfdGFyZ2V0LnNldCh4LCB5LCB6KTsKICAgICAgfQogICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDsKICAgICAgdGhpcy51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCBmYWxzZSk7CiAgICAgIF9wb3NpdGlvbiQzLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKTsKICAgICAgaWYgKHRoaXMuaXNDYW1lcmEgfHwgdGhpcy5pc0xpZ2h0KSB7CiAgICAgICAgX20xJDEubG9va0F0KF9wb3NpdGlvbiQzLCBfdGFyZ2V0LCB0aGlzLnVwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfbTEkMS5sb29rQXQoX3RhcmdldCwgX3Bvc2l0aW9uJDMsIHRoaXMudXApOwogICAgICB9CiAgICAgIHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoX20xJDEpOwogICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgX20xJDEuZXh0cmFjdFJvdGF0aW9uKHBhcmVudC5tYXRyaXhXb3JsZCk7CiAgICAgICAgX3ExLnNldEZyb21Sb3RhdGlvbk1hdHJpeChfbTEkMSk7CiAgICAgICAgdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KF9xMS5pbnZlcnQoKSk7CiAgICAgIH0KICAgIH0KICAgIGFkZChvYmplY3QpIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGhpcy5hZGQoYXJndW1lbnRzW2ldKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgaWYgKG9iamVjdCA9PT0gdGhpcykgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLiIsIG9iamVjdCk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgICAgaWYgKG9iamVjdCAmJiBvYmplY3QuaXNPYmplY3QzRCkgewogICAgICAgIG9iamVjdC5yZW1vdmVGcm9tUGFyZW50KCk7CiAgICAgICAgb2JqZWN0LnBhcmVudCA9IHRoaXM7CiAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKG9iamVjdCk7CiAgICAgICAgb2JqZWN0LmRpc3BhdGNoRXZlbnQoX2FkZGVkRXZlbnQpOwogICAgICAgIF9jaGlsZGFkZGVkRXZlbnQuY2hpbGQgPSBvYmplY3Q7CiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KF9jaGlsZGFkZGVkRXZlbnQpOwogICAgICAgIF9jaGlsZGFkZGVkRXZlbnQuY2hpbGQgPSBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4iLCBvYmplY3QpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcmVtb3ZlKG9iamVjdCkgewogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLnJlbW92ZShhcmd1bWVudHNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICBjb25zdCBpbmRleCA9IHRoaXMuY2hpbGRyZW4uaW5kZXhPZihvYmplY3QpOwogICAgICBpZiAoaW5kZXggIT09IC0xKSB7CiAgICAgICAgb2JqZWN0LnBhcmVudCA9IG51bGw7CiAgICAgICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgIG9iamVjdC5kaXNwYXRjaEV2ZW50KF9yZW1vdmVkRXZlbnQpOwogICAgICAgIF9jaGlsZHJlbW92ZWRFdmVudC5jaGlsZCA9IG9iamVjdDsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoX2NoaWxkcmVtb3ZlZEV2ZW50KTsKICAgICAgICBfY2hpbGRyZW1vdmVkRXZlbnQuY2hpbGQgPSBudWxsOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcmVtb3ZlRnJvbVBhcmVudCgpIHsKICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7CiAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHsKICAgICAgICBwYXJlbnQucmVtb3ZlKHRoaXMpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgY2xlYXIoKSB7CiAgICAgIHJldHVybiB0aGlzLnJlbW92ZSguLi50aGlzLmNoaWxkcmVuKTsKICAgIH0KICAgIGF0dGFjaChvYmplY3QpIHsKICAgICAgdGhpcy51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCBmYWxzZSk7CiAgICAgIF9tMSQxLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk7CiAgICAgIGlmIChvYmplY3QucGFyZW50ICE9PSBudWxsKSB7CiAgICAgICAgb2JqZWN0LnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCBmYWxzZSk7CiAgICAgICAgX20xJDEubXVsdGlwbHkob2JqZWN0LnBhcmVudC5tYXRyaXhXb3JsZCk7CiAgICAgIH0KICAgICAgb2JqZWN0LmFwcGx5TWF0cml4NChfbTEkMSk7CiAgICAgIG9iamVjdC5yZW1vdmVGcm9tUGFyZW50KCk7CiAgICAgIG9iamVjdC5wYXJlbnQgPSB0aGlzOwogICAgICB0aGlzLmNoaWxkcmVuLnB1c2gob2JqZWN0KTsKICAgICAgb2JqZWN0LnVwZGF0ZVdvcmxkTWF0cml4KGZhbHNlLCB0cnVlKTsKICAgICAgb2JqZWN0LmRpc3BhdGNoRXZlbnQoX2FkZGVkRXZlbnQpOwogICAgICBfY2hpbGRhZGRlZEV2ZW50LmNoaWxkID0gb2JqZWN0OwogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoX2NoaWxkYWRkZWRFdmVudCk7CiAgICAgIF9jaGlsZGFkZGVkRXZlbnQuY2hpbGQgPSBudWxsOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldE9iamVjdEJ5SWQoaWQpIHsKICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgiaWQiLCBpZCk7CiAgICB9CiAgICBnZXRPYmplY3RCeU5hbWUobmFtZSkgewogICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIiwgbmFtZSk7CiAgICB9CiAgICBnZXRPYmplY3RCeVByb3BlcnR5KG5hbWUsIHZhbHVlKSB7CiAgICAgIGlmICh0aGlzW25hbWVdID09PSB2YWx1ZSkKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldOwogICAgICAgIGNvbnN0IG9iamVjdCA9IGNoaWxkLmdldE9iamVjdEJ5UHJvcGVydHkobmFtZSwgdmFsdWUpOwogICAgICAgIGlmIChvYmplY3QgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgZ2V0T2JqZWN0c0J5UHJvcGVydHkobmFtZSwgdmFsdWUsIHJlc3VsdCA9IFtdKSB7CiAgICAgIGlmICh0aGlzW25hbWVdID09PSB2YWx1ZSkKICAgICAgICByZXN1bHQucHVzaCh0aGlzKTsKICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuOwogICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgY2hpbGRyZW5baV0uZ2V0T2JqZWN0c0J5UHJvcGVydHkobmFtZSwgdmFsdWUsIHJlc3VsdCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGdldFdvcmxkUG9zaXRpb24odGFyZ2V0KSB7CiAgICAgIHRoaXMudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpOwogICAgICByZXR1cm4gdGFyZ2V0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKTsKICAgIH0KICAgIGdldFdvcmxkUXVhdGVybmlvbih0YXJnZXQpIHsKICAgICAgdGhpcy51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCBmYWxzZSk7CiAgICAgIHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKF9wb3NpdGlvbiQzLCB0YXJnZXQsIF9zY2FsZSQyKTsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGdldFdvcmxkU2NhbGUodGFyZ2V0KSB7CiAgICAgIHRoaXMudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpOwogICAgICB0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShfcG9zaXRpb24kMywgX3F1YXRlcm5pb24kMiwgdGFyZ2V0KTsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGdldFdvcmxkRGlyZWN0aW9uKHRhcmdldCkgewogICAgICB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTsKICAgICAgY29uc3QgZSA9IHRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7CiAgICAgIHJldHVybiB0YXJnZXQuc2V0KGVbOF0sIGVbOV0sIGVbMTBdKS5ub3JtYWxpemUoKTsKICAgIH0KICAgIHJheWNhc3QoKSB7fQogICAgdHJhdmVyc2UoY2FsbGJhY2spIHsKICAgICAgY2FsbGJhY2sodGhpcyk7CiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgIGNoaWxkcmVuW2ldLnRyYXZlcnNlKGNhbGxiYWNrKTsKICAgICAgfQogICAgfQogICAgdHJhdmVyc2VWaXNpYmxlKGNhbGxiYWNrKSB7CiAgICAgIGlmICh0aGlzLnZpc2libGUgPT09IGZhbHNlKQogICAgICAgIHJldHVybjsKICAgICAgY2FsbGJhY2sodGhpcyk7CiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgIGNoaWxkcmVuW2ldLnRyYXZlcnNlVmlzaWJsZShjYWxsYmFjayk7CiAgICAgIH0KICAgIH0KICAgIHRyYXZlcnNlQW5jZXN0b3JzKGNhbGxiYWNrKSB7CiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50OwogICAgICBpZiAocGFyZW50ICE9PSBudWxsKSB7CiAgICAgICAgY2FsbGJhY2socGFyZW50KTsKICAgICAgICBwYXJlbnQudHJhdmVyc2VBbmNlc3RvcnMoY2FsbGJhY2spOwogICAgICB9CiAgICB9CiAgICB1cGRhdGVNYXRyaXgoKSB7CiAgICAgIHRoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlKTsKICAgICAgdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgIH0KICAgIHVwZGF0ZU1hdHJpeFdvcmxkKGZvcmNlKSB7CiAgICAgIGlmICh0aGlzLm1hdHJpeEF1dG9VcGRhdGUpCiAgICAgICAgdGhpcy51cGRhdGVNYXRyaXgoKTsKICAgICAgaWYgKHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSB8fCBmb3JjZSkgewogICAgICAgIGlmICh0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSA9PT0gdHJ1ZSkgewogICAgICAgICAgaWYgKHRoaXMucGFyZW50ID09PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsIHRoaXMubWF0cml4KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7CiAgICAgICAgZm9yY2UgPSB0cnVlOwogICAgICB9CiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07CiAgICAgICAgY2hpbGQudXBkYXRlTWF0cml4V29ybGQoZm9yY2UpOwogICAgICB9CiAgICB9CiAgICB1cGRhdGVXb3JsZE1hdHJpeCh1cGRhdGVQYXJlbnRzLCB1cGRhdGVDaGlsZHJlbikgewogICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDsKICAgICAgaWYgKHVwZGF0ZVBhcmVudHMgPT09IHRydWUgJiYgcGFyZW50ICE9PSBudWxsKSB7CiAgICAgICAgcGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTsKICAgICAgfQogICAgICBpZiAodGhpcy5tYXRyaXhBdXRvVXBkYXRlKQogICAgICAgIHRoaXMudXBkYXRlTWF0cml4KCk7CiAgICAgIGlmICh0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSA9PT0gdHJ1ZSkgewogICAgICAgIGlmICh0aGlzLnBhcmVudCA9PT0gbnVsbCkgewogICAgICAgICAgdGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLCB0aGlzLm1hdHJpeCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh1cGRhdGVDaGlsZHJlbiA9PT0gdHJ1ZSkgewogICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjsKICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgICAgY2hpbGQudXBkYXRlV29ybGRNYXRyaXgoZmFsc2UsIHRydWUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdG9KU09OKG1ldGEpIHsKICAgICAgY29uc3QgaXNSb290T2JqZWN0ID0gbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAic3RyaW5nIjsKICAgICAgY29uc3Qgb3V0cHV0ID0ge307CiAgICAgIGlmIChpc1Jvb3RPYmplY3QpIHsKICAgICAgICBtZXRhID0gewogICAgICAgICAgZ2VvbWV0cmllczoge30sCiAgICAgICAgICBtYXRlcmlhbHM6IHt9LAogICAgICAgICAgdGV4dHVyZXM6IHt9LAogICAgICAgICAgaW1hZ2VzOiB7fSwKICAgICAgICAgIHNoYXBlczoge30sCiAgICAgICAgICBza2VsZXRvbnM6IHt9LAogICAgICAgICAgYW5pbWF0aW9uczoge30sCiAgICAgICAgICBub2Rlczoge30KICAgICAgICB9OwogICAgICAgIG91dHB1dC5tZXRhZGF0YSA9IHsKICAgICAgICAgIHZlcnNpb246IDQuNiwKICAgICAgICAgIHR5cGU6ICJPYmplY3QiLAogICAgICAgICAgZ2VuZXJhdG9yOiAiT2JqZWN0M0QudG9KU09OIgogICAgICAgIH07CiAgICAgIH0KICAgICAgY29uc3Qgb2JqZWN0ID0ge307CiAgICAgIG9iamVjdC51dWlkID0gdGhpcy51dWlkOwogICAgICBvYmplY3QudHlwZSA9IHRoaXMudHlwZTsKICAgICAgaWYgKHRoaXMubmFtZSAhPT0gIiIpCiAgICAgICAgb2JqZWN0Lm5hbWUgPSB0aGlzLm5hbWU7CiAgICAgIGlmICh0aGlzLmNhc3RTaGFkb3cgPT09IHRydWUpCiAgICAgICAgb2JqZWN0LmNhc3RTaGFkb3cgPSB0cnVlOwogICAgICBpZiAodGhpcy5yZWNlaXZlU2hhZG93ID09PSB0cnVlKQogICAgICAgIG9iamVjdC5yZWNlaXZlU2hhZG93ID0gdHJ1ZTsKICAgICAgaWYgKHRoaXMudmlzaWJsZSA9PT0gZmFsc2UpCiAgICAgICAgb2JqZWN0LnZpc2libGUgPSBmYWxzZTsKICAgICAgaWYgKHRoaXMuZnJ1c3R1bUN1bGxlZCA9PT0gZmFsc2UpCiAgICAgICAgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBmYWxzZTsKICAgICAgaWYgKHRoaXMucmVuZGVyT3JkZXIgIT09IDApCiAgICAgICAgb2JqZWN0LnJlbmRlck9yZGVyID0gdGhpcy5yZW5kZXJPcmRlcjsKICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aCA+IDApCiAgICAgICAgb2JqZWN0LnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTsKICAgICAgb2JqZWN0LmxheWVycyA9IHRoaXMubGF5ZXJzLm1hc2s7CiAgICAgIG9iamVjdC5tYXRyaXggPSB0aGlzLm1hdHJpeC50b0FycmF5KCk7CiAgICAgIG9iamVjdC51cCA9IHRoaXMudXAudG9BcnJheSgpOwogICAgICBpZiAodGhpcy5tYXRyaXhBdXRvVXBkYXRlID09PSBmYWxzZSkKICAgICAgICBvYmplY3QubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwogICAgICBpZiAodGhpcy5pc0luc3RhbmNlZE1lc2gpIHsKICAgICAgICBvYmplY3QudHlwZSA9ICJJbnN0YW5jZWRNZXNoIjsKICAgICAgICBvYmplY3QuY291bnQgPSB0aGlzLmNvdW50OwogICAgICAgIG9iamVjdC5pbnN0YW5jZU1hdHJpeCA9IHRoaXMuaW5zdGFuY2VNYXRyaXgudG9KU09OKCk7CiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2VDb2xvciAhPT0gbnVsbCkKICAgICAgICAgIG9iamVjdC5pbnN0YW5jZUNvbG9yID0gdGhpcy5pbnN0YW5jZUNvbG9yLnRvSlNPTigpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmlzQmF0Y2hlZE1lc2gpIHsKICAgICAgICBvYmplY3QudHlwZSA9ICJCYXRjaGVkTWVzaCI7CiAgICAgICAgb2JqZWN0LnBlck9iamVjdEZydXN0dW1DdWxsZWQgPSB0aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQ7CiAgICAgICAgb2JqZWN0LnNvcnRPYmplY3RzID0gdGhpcy5zb3J0T2JqZWN0czsKICAgICAgICBvYmplY3QuZHJhd1JhbmdlcyA9IHRoaXMuX2RyYXdSYW5nZXM7CiAgICAgICAgb2JqZWN0LnJlc2VydmVkUmFuZ2VzID0gdGhpcy5fcmVzZXJ2ZWRSYW5nZXM7CiAgICAgICAgb2JqZWN0LnZpc2liaWxpdHkgPSB0aGlzLl92aXNpYmlsaXR5OwogICAgICAgIG9iamVjdC5hY3RpdmUgPSB0aGlzLl9hY3RpdmU7CiAgICAgICAgb2JqZWN0LmJvdW5kcyA9IHRoaXMuX2JvdW5kcy5tYXAoKGJvdW5kKSA9PiAoewogICAgICAgICAgYm94SW5pdGlhbGl6ZWQ6IGJvdW5kLmJveEluaXRpYWxpemVkLAogICAgICAgICAgYm94TWluOiBib3VuZC5ib3gubWluLnRvQXJyYXkoKSwKICAgICAgICAgIGJveE1heDogYm91bmQuYm94Lm1heC50b0FycmF5KCksCiAgICAgICAgICBzcGhlcmVJbml0aWFsaXplZDogYm91bmQuc3BoZXJlSW5pdGlhbGl6ZWQsCiAgICAgICAgICBzcGhlcmVSYWRpdXM6IGJvdW5kLnNwaGVyZS5yYWRpdXMsCiAgICAgICAgICBzcGhlcmVDZW50ZXI6IGJvdW5kLnNwaGVyZS5jZW50ZXIudG9BcnJheSgpCiAgICAgICAgfSkpOwogICAgICAgIG9iamVjdC5tYXhJbnN0YW5jZUNvdW50ID0gdGhpcy5fbWF4SW5zdGFuY2VDb3VudDsKICAgICAgICBvYmplY3QubWF4VmVydGV4Q291bnQgPSB0aGlzLl9tYXhWZXJ0ZXhDb3VudDsKICAgICAgICBvYmplY3QubWF4SW5kZXhDb3VudCA9IHRoaXMuX21heEluZGV4Q291bnQ7CiAgICAgICAgb2JqZWN0Lmdlb21ldHJ5SW5pdGlhbGl6ZWQgPSB0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkOwogICAgICAgIG9iamVjdC5nZW9tZXRyeUNvdW50ID0gdGhpcy5fZ2VvbWV0cnlDb3VudDsKICAgICAgICBvYmplY3QubWF0cmljZXNUZXh0dXJlID0gdGhpcy5fbWF0cmljZXNUZXh0dXJlLnRvSlNPTihtZXRhKTsKICAgICAgICBpZiAodGhpcy5fY29sb3JzVGV4dHVyZSAhPT0gbnVsbCkKICAgICAgICAgIG9iamVjdC5jb2xvcnNUZXh0dXJlID0gdGhpcy5fY29sb3JzVGV4dHVyZS50b0pTT04obWV0YSk7CiAgICAgICAgaWYgKHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwpIHsKICAgICAgICAgIG9iamVjdC5ib3VuZGluZ1NwaGVyZSA9IHsKICAgICAgICAgICAgY2VudGVyOiBvYmplY3QuYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSwKICAgICAgICAgICAgcmFkaXVzOiBvYmplY3QuYm91bmRpbmdTcGhlcmUucmFkaXVzCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCkgewogICAgICAgICAgb2JqZWN0LmJvdW5kaW5nQm94ID0gewogICAgICAgICAgICBtaW46IG9iamVjdC5ib3VuZGluZ0JveC5taW4udG9BcnJheSgpLAogICAgICAgICAgICBtYXg6IG9iamVjdC5ib3VuZGluZ0JveC5tYXgudG9BcnJheSgpCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBzZXJpYWxpemUobGlicmFyeSwgZWxlbWVudCkgewogICAgICAgIGlmIChsaWJyYXJ5W2VsZW1lbnQudXVpZF0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgbGlicmFyeVtlbGVtZW50LnV1aWRdID0gZWxlbWVudC50b0pTT04obWV0YSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlbGVtZW50LnV1aWQ7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuaXNTY2VuZSkgewogICAgICAgIGlmICh0aGlzLmJhY2tncm91bmQpIHsKICAgICAgICAgIGlmICh0aGlzLmJhY2tncm91bmQuaXNDb2xvcikgewogICAgICAgICAgICBvYmplY3QuYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZC50b0pTT04oKTsKICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5iYWNrZ3JvdW5kLmlzVGV4dHVyZSkgewogICAgICAgICAgICBvYmplY3QuYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZC50b0pTT04obWV0YSkudXVpZDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQgJiYgdGhpcy5lbnZpcm9ubWVudC5pc1RleHR1cmUgJiYgdGhpcy5lbnZpcm9ubWVudC5pc1JlbmRlclRhcmdldFRleHR1cmUgIT09IHRydWUpIHsKICAgICAgICAgIG9iamVjdC5lbnZpcm9ubWVudCA9IHRoaXMuZW52aXJvbm1lbnQudG9KU09OKG1ldGEpLnV1aWQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoaXMuaXNNZXNoIHx8IHRoaXMuaXNMaW5lIHx8IHRoaXMuaXNQb2ludHMpIHsKICAgICAgICBvYmplY3QuZ2VvbWV0cnkgPSBzZXJpYWxpemUobWV0YS5nZW9tZXRyaWVzLCB0aGlzLmdlb21ldHJ5KTsKICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzOwogICAgICAgIGlmIChwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgJiYgcGFyYW1ldGVycy5zaGFwZXMgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgY29uc3Qgc2hhcGVzID0gcGFyYW1ldGVycy5zaGFwZXM7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzaGFwZXMpKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSBzaGFwZXNbaV07CiAgICAgICAgICAgICAgc2VyaWFsaXplKG1ldGEuc2hhcGVzLCBzaGFwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNlcmlhbGl6ZShtZXRhLnNoYXBlcywgc2hhcGVzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRoaXMuaXNTa2lubmVkTWVzaCkgewogICAgICAgIG9iamVjdC5iaW5kTW9kZSA9IHRoaXMuYmluZE1vZGU7CiAgICAgICAgb2JqZWN0LmJpbmRNYXRyaXggPSB0aGlzLmJpbmRNYXRyaXgudG9BcnJheSgpOwogICAgICAgIGlmICh0aGlzLnNrZWxldG9uICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHNlcmlhbGl6ZShtZXRhLnNrZWxldG9ucywgdGhpcy5za2VsZXRvbik7CiAgICAgICAgICBvYmplY3Quc2tlbGV0b24gPSB0aGlzLnNrZWxldG9uLnV1aWQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aGlzLm1hdGVyaWFsICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSkgewogICAgICAgICAgY29uc3QgdXVpZHMgPSBbXTsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5tYXRlcmlhbC5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgICAgICB1dWlkcy5wdXNoKHNlcmlhbGl6ZShtZXRhLm1hdGVyaWFscywgdGhpcy5tYXRlcmlhbFtpXSkpOwogICAgICAgICAgfQogICAgICAgICAgb2JqZWN0Lm1hdGVyaWFsID0gdXVpZHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9iamVjdC5tYXRlcmlhbCA9IHNlcmlhbGl6ZShtZXRhLm1hdGVyaWFscywgdGhpcy5tYXRlcmlhbCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgICBvYmplY3QuY2hpbGRyZW4gPSBbXTsKICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgb2JqZWN0LmNoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXS50b0pTT04obWV0YSkub2JqZWN0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRoaXMuYW5pbWF0aW9ucy5sZW5ndGggPiAwKSB7CiAgICAgICAgb2JqZWN0LmFuaW1hdGlvbnMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgdGhpcy5hbmltYXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNbaV07CiAgICAgICAgICBvYmplY3QuYW5pbWF0aW9ucy5wdXNoKHNlcmlhbGl6ZShtZXRhLmFuaW1hdGlvbnMsIGFuaW1hdGlvbikpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNSb290T2JqZWN0KSB7CiAgICAgICAgY29uc3QgZ2VvbWV0cmllcyA9IGV4dHJhY3RGcm9tQ2FjaGUobWV0YS5nZW9tZXRyaWVzKTsKICAgICAgICBjb25zdCBtYXRlcmlhbHMgPSBleHRyYWN0RnJvbUNhY2hlKG1ldGEubWF0ZXJpYWxzKTsKICAgICAgICBjb25zdCB0ZXh0dXJlcyA9IGV4dHJhY3RGcm9tQ2FjaGUobWV0YS50ZXh0dXJlcyk7CiAgICAgICAgY29uc3QgaW1hZ2VzID0gZXh0cmFjdEZyb21DYWNoZShtZXRhLmltYWdlcyk7CiAgICAgICAgY29uc3Qgc2hhcGVzID0gZXh0cmFjdEZyb21DYWNoZShtZXRhLnNoYXBlcyk7CiAgICAgICAgY29uc3Qgc2tlbGV0b25zID0gZXh0cmFjdEZyb21DYWNoZShtZXRhLnNrZWxldG9ucyk7CiAgICAgICAgY29uc3QgYW5pbWF0aW9ucyA9IGV4dHJhY3RGcm9tQ2FjaGUobWV0YS5hbmltYXRpb25zKTsKICAgICAgICBjb25zdCBub2RlcyA9IGV4dHJhY3RGcm9tQ2FjaGUobWV0YS5ub2Rlcyk7CiAgICAgICAgaWYgKGdlb21ldHJpZXMubGVuZ3RoID4gMCkKICAgICAgICAgIG91dHB1dC5nZW9tZXRyaWVzID0gZ2VvbWV0cmllczsKICAgICAgICBpZiAobWF0ZXJpYWxzLmxlbmd0aCA+IDApCiAgICAgICAgICBvdXRwdXQubWF0ZXJpYWxzID0gbWF0ZXJpYWxzOwogICAgICAgIGlmICh0ZXh0dXJlcy5sZW5ndGggPiAwKQogICAgICAgICAgb3V0cHV0LnRleHR1cmVzID0gdGV4dHVyZXM7CiAgICAgICAgaWYgKGltYWdlcy5sZW5ndGggPiAwKQogICAgICAgICAgb3V0cHV0LmltYWdlcyA9IGltYWdlczsKICAgICAgICBpZiAoc2hhcGVzLmxlbmd0aCA+IDApCiAgICAgICAgICBvdXRwdXQuc2hhcGVzID0gc2hhcGVzOwogICAgICAgIGlmIChza2VsZXRvbnMubGVuZ3RoID4gMCkKICAgICAgICAgIG91dHB1dC5za2VsZXRvbnMgPSBza2VsZXRvbnM7CiAgICAgICAgaWYgKGFuaW1hdGlvbnMubGVuZ3RoID4gMCkKICAgICAgICAgIG91dHB1dC5hbmltYXRpb25zID0gYW5pbWF0aW9uczsKICAgICAgICBpZiAobm9kZXMubGVuZ3RoID4gMCkKICAgICAgICAgIG91dHB1dC5ub2RlcyA9IG5vZGVzOwogICAgICB9CiAgICAgIG91dHB1dC5vYmplY3QgPSBvYmplY3Q7CiAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgIGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoY2FjaGUpIHsKICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjYWNoZSkgewogICAgICAgICAgY29uc3QgZGF0YSA9IGNhY2hlW2tleV07CiAgICAgICAgICBkZWxldGUgZGF0YS5tZXRhZGF0YTsKICAgICAgICAgIHZhbHVlcy5wdXNoKGRhdGEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICB9CiAgICB9CiAgICBjbG9uZShyZWN1cnNpdmUpIHsKICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzLCByZWN1cnNpdmUpOwogICAgfQogICAgY29weShzb3VyY2UsIHJlY3Vyc2l2ZSA9IHRydWUpIHsKICAgICAgdGhpcy5uYW1lID0gc291cmNlLm5hbWU7CiAgICAgIHRoaXMudXAuY29weShzb3VyY2UudXApOwogICAgICB0aGlzLnBvc2l0aW9uLmNvcHkoc291cmNlLnBvc2l0aW9uKTsKICAgICAgdGhpcy5yb3RhdGlvbi5vcmRlciA9IHNvdXJjZS5yb3RhdGlvbi5vcmRlcjsKICAgICAgdGhpcy5xdWF0ZXJuaW9uLmNvcHkoc291cmNlLnF1YXRlcm5pb24pOwogICAgICB0aGlzLnNjYWxlLmNvcHkoc291cmNlLnNjYWxlKTsKICAgICAgdGhpcy5tYXRyaXguY29weShzb3VyY2UubWF0cml4KTsKICAgICAgdGhpcy5tYXRyaXhXb3JsZC5jb3B5KHNvdXJjZS5tYXRyaXhXb3JsZCk7CiAgICAgIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlOwogICAgICB0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhXb3JsZEF1dG9VcGRhdGU7CiAgICAgIHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlOwogICAgICB0aGlzLmxheWVycy5tYXNrID0gc291cmNlLmxheWVycy5tYXNrOwogICAgICB0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTsKICAgICAgdGhpcy5jYXN0U2hhZG93ID0gc291cmNlLmNhc3RTaGFkb3c7CiAgICAgIHRoaXMucmVjZWl2ZVNoYWRvdyA9IHNvdXJjZS5yZWNlaXZlU2hhZG93OwogICAgICB0aGlzLmZydXN0dW1DdWxsZWQgPSBzb3VyY2UuZnJ1c3R1bUN1bGxlZDsKICAgICAgdGhpcy5yZW5kZXJPcmRlciA9IHNvdXJjZS5yZW5kZXJPcmRlcjsKICAgICAgdGhpcy5hbmltYXRpb25zID0gc291cmNlLmFuaW1hdGlvbnMuc2xpY2UoKTsKICAgICAgdGhpcy51c2VyRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc291cmNlLnVzZXJEYXRhKSk7CiAgICAgIGlmIChyZWN1cnNpdmUgPT09IHRydWUpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgc291cmNlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBjaGlsZCA9IHNvdXJjZS5jaGlsZHJlbltpXTsKICAgICAgICAgIHRoaXMuYWRkKGNoaWxkLmNsb25lKCkpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIE9iamVjdDNELkRFRkFVTFRfVVAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjMoMCwgMSwgMCk7CiAgT2JqZWN0M0QuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEUgPSB0cnVlOwogIE9iamVjdDNELkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFID0gdHJ1ZTsKICBfdjAkMSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfdjEkMyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfdjIkMiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfdjMkMiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfdmFiID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF92YWMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX3ZiYyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfdmFwID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF92YnAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX3ZjcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfdjQwID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3I0OwogIF92NDEgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjQ7CiAgX3Y0MiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yNDsKICBfY29sb3JLZXl3b3JkcyA9IHsKICAgIGFsaWNlYmx1ZTogMTU3OTIzODMsCiAgICBhbnRpcXVld2hpdGU6IDE2NDQ0Mzc1LAogICAgYXF1YTogNjU1MzUsCiAgICBhcXVhbWFyaW5lOiA4Mzg4NTY0LAogICAgYXp1cmU6IDE1Nzk0MTc1LAogICAgYmVpZ2U6IDE2MTE5MjYwLAogICAgYmlzcXVlOiAxNjc3MDI0NCwKICAgIGJsYWNrOiAwLAogICAgYmxhbmNoZWRhbG1vbmQ6IDE2NzcyMDQ1LAogICAgYmx1ZTogMjU1LAogICAgYmx1ZXZpb2xldDogOTA1NTIwMiwKICAgIGJyb3duOiAxMDgyNDIzNCwKICAgIGJ1cmx5d29vZDogMTQ1OTYyMzEsCiAgICBjYWRldGJsdWU6IDYyNjY1MjgsCiAgICBjaGFydHJldXNlOiA4Mzg4MzUyLAogICAgY2hvY29sYXRlOiAxMzc4OTQ3MCwKICAgIGNvcmFsOiAxNjc0NDI3MiwKICAgIGNvcm5mbG93ZXJibHVlOiA2NTkxOTgxLAogICAgY29ybnNpbGs6IDE2Nzc1Mzg4LAogICAgY3JpbXNvbjogMTQ0MjMxMDAsCiAgICBjeWFuOiA2NTUzNSwKICAgIGRhcmtibHVlOiAxMzksCiAgICBkYXJrY3lhbjogMzU3MjMsCiAgICBkYXJrZ29sZGVucm9kOiAxMjA5MjkzOSwKICAgIGRhcmtncmF5OiAxMTExOTAxNywKICAgIGRhcmtncmVlbjogMjU2MDAsCiAgICBkYXJrZ3JleTogMTExMTkwMTcsCiAgICBkYXJra2hha2k6IDEyNDMzMjU5LAogICAgZGFya21hZ2VudGE6IDkxMDk2NDMsCiAgICBkYXJrb2xpdmVncmVlbjogNTU5Nzk5OSwKICAgIGRhcmtvcmFuZ2U6IDE2NzQ3NTIwLAogICAgZGFya29yY2hpZDogMTAwNDAwMTIsCiAgICBkYXJrcmVkOiA5MTA5NTA0LAogICAgZGFya3NhbG1vbjogMTUzMDg0MTAsCiAgICBkYXJrc2VhZ3JlZW46IDk0MTk5MTksCiAgICBkYXJrc2xhdGVibHVlOiA0NzM0MzQ3LAogICAgZGFya3NsYXRlZ3JheTogMzEwMDQ5NSwKICAgIGRhcmtzbGF0ZWdyZXk6IDMxMDA0OTUsCiAgICBkYXJrdHVycXVvaXNlOiA1Mjk0NSwKICAgIGRhcmt2aW9sZXQ6IDk2OTk1MzksCiAgICBkZWVwcGluazogMTY3MTY5NDcsCiAgICBkZWVwc2t5Ymx1ZTogNDkxNTEsCiAgICBkaW1ncmF5OiA2OTA4MjY1LAogICAgZGltZ3JleTogNjkwODI2NSwKICAgIGRvZGdlcmJsdWU6IDIwMDMxOTksCiAgICBmaXJlYnJpY2s6IDExNjc0MTQ2LAogICAgZmxvcmFsd2hpdGU6IDE2Nzc1OTIwLAogICAgZm9yZXN0Z3JlZW46IDIyNjM4NDIsCiAgICBmdWNoc2lhOiAxNjcxMTkzNSwKICAgIGdhaW5zYm9ybzogMTQ0NzQ0NjAsCiAgICBnaG9zdHdoaXRlOiAxNjMxNjY3MSwKICAgIGdvbGQ6IDE2NzY2NzIwLAogICAgZ29sZGVucm9kOiAxNDMyOTEyMCwKICAgIGdyYXk6IDg0MjE1MDQsCiAgICBncmVlbjogMzI3NjgsCiAgICBncmVlbnllbGxvdzogMTE0MDMwNTUsCiAgICBncmV5OiA4NDIxNTA0LAogICAgaG9uZXlkZXc6IDE1Nzk0MTYwLAogICAgaG90cGluazogMTY3Mzg3NDAsCiAgICBpbmRpYW5yZWQ6IDEzNDU4NTI0LAogICAgaW5kaWdvOiA0OTE1MzMwLAogICAgaXZvcnk6IDE2Nzc3MjAwLAogICAga2hha2k6IDE1Nzg3NjYwLAogICAgbGF2ZW5kZXI6IDE1MTMyNDEwLAogICAgbGF2ZW5kZXJibHVzaDogMTY3NzMzNjUsCiAgICBsYXduZ3JlZW46IDgxOTA5NzYsCiAgICBsZW1vbmNoaWZmb246IDE2Nzc1ODg1LAogICAgbGlnaHRibHVlOiAxMTM5MzI1NCwKICAgIGxpZ2h0Y29yYWw6IDE1NzYxNTM2LAogICAgbGlnaHRjeWFuOiAxNDc0NTU5OSwKICAgIGxpZ2h0Z29sZGVucm9keWVsbG93OiAxNjQ0ODIxMCwKICAgIGxpZ2h0Z3JheTogMTM4ODIzMjMsCiAgICBsaWdodGdyZWVuOiA5NDk4MjU2LAogICAgbGlnaHRncmV5OiAxMzg4MjMyMywKICAgIGxpZ2h0cGluazogMTY3NTg0NjUsCiAgICBsaWdodHNhbG1vbjogMTY3NTI3NjIsCiAgICBsaWdodHNlYWdyZWVuOiAyMTQyODkwLAogICAgbGlnaHRza3libHVlOiA4OTAwMzQ2LAogICAgbGlnaHRzbGF0ZWdyYXk6IDc4MzM3NTMsCiAgICBsaWdodHNsYXRlZ3JleTogNzgzMzc1MywKICAgIGxpZ2h0c3RlZWxibHVlOiAxMTU4NDczNCwKICAgIGxpZ2h0eWVsbG93OiAxNjc3NzE4NCwKICAgIGxpbWU6IDY1MjgwLAogICAgbGltZWdyZWVuOiAzMzI5MzMwLAogICAgbGluZW46IDE2NDQ1NjcwLAogICAgbWFnZW50YTogMTY3MTE5MzUsCiAgICBtYXJvb246IDgzODg2MDgsCiAgICBtZWRpdW1hcXVhbWFyaW5lOiA2NzM3MzIyLAogICAgbWVkaXVtYmx1ZTogMjA1LAogICAgbWVkaXVtb3JjaGlkOiAxMjIxMTY2NywKICAgIG1lZGl1bXB1cnBsZTogOTY2MjY4MywKICAgIG1lZGl1bXNlYWdyZWVuOiAzOTc4MDk3LAogICAgbWVkaXVtc2xhdGVibHVlOiA4MDg3NzkwLAogICAgbWVkaXVtc3ByaW5nZ3JlZW46IDY0MTU0LAogICAgbWVkaXVtdHVycXVvaXNlOiA0NzcyMzAwLAogICAgbWVkaXVtdmlvbGV0cmVkOiAxMzA0NzE3MywKICAgIG1pZG5pZ2h0Ymx1ZTogMTY0NDkxMiwKICAgIG1pbnRjcmVhbTogMTYxMjE4NTAsCiAgICBtaXN0eXJvc2U6IDE2NzcwMjczLAogICAgbW9jY2FzaW46IDE2NzcwMjI5LAogICAgbmF2YWpvd2hpdGU6IDE2NzY4Njg1LAogICAgbmF2eTogMTI4LAogICAgb2xkbGFjZTogMTY2NDM1NTgsCiAgICBvbGl2ZTogODQyMTM3NiwKICAgIG9saXZlZHJhYjogNzA0ODczOSwKICAgIG9yYW5nZTogMTY3NTM5MjAsCiAgICBvcmFuZ2VyZWQ6IDE2NzI5MzQ0LAogICAgb3JjaGlkOiAxNDMxNTczNCwKICAgIHBhbGVnb2xkZW5yb2Q6IDE1NjU3MTMwLAogICAgcGFsZWdyZWVuOiAxMDAyNTg4MCwKICAgIHBhbGV0dXJxdW9pc2U6IDExNTI5OTY2LAogICAgcGFsZXZpb2xldHJlZDogMTQzODEyMDMsCiAgICBwYXBheWF3aGlwOiAxNjc3MzA3NywKICAgIHBlYWNocHVmZjogMTY3Njc2NzMsCiAgICBwZXJ1OiAxMzQ2ODk5MSwKICAgIHBpbms6IDE2NzYxMDM1LAogICAgcGx1bTogMTQ1MjQ2MzcsCiAgICBwb3dkZXJibHVlOiAxMTU5MTkxMCwKICAgIHB1cnBsZTogODM4ODczNiwKICAgIHJlYmVjY2FwdXJwbGU6IDY2OTc4ODEsCiAgICByZWQ6IDE2NzExNjgwLAogICAgcm9zeWJyb3duOiAxMjM1NzUxOSwKICAgIHJveWFsYmx1ZTogNDI4Njk0NSwKICAgIHNhZGRsZWJyb3duOiA5MTI3MTg3LAogICAgc2FsbW9uOiAxNjQxNjg4MiwKICAgIHNhbmR5YnJvd246IDE2MDMyODY0LAogICAgc2VhZ3JlZW46IDMwNTAzMjcsCiAgICBzZWFzaGVsbDogMTY3NzQ2MzgsCiAgICBzaWVubmE6IDEwNTA2Nzk3LAogICAgc2lsdmVyOiAxMjYzMjI1NiwKICAgIHNreWJsdWU6IDg5MDAzMzEsCiAgICBzbGF0ZWJsdWU6IDY5NzAwNjEsCiAgICBzbGF0ZWdyYXk6IDczNzI5NDQsCiAgICBzbGF0ZWdyZXk6IDczNzI5NDQsCiAgICBzbm93OiAxNjc3NTkzMCwKICAgIHNwcmluZ2dyZWVuOiA2NTQwNywKICAgIHN0ZWVsYmx1ZTogNDYyMDk4MCwKICAgIHRhbjogMTM4MDg3ODAsCiAgICB0ZWFsOiAzMjg5NiwKICAgIHRoaXN0bGU6IDE0MjA0ODg4LAogICAgdG9tYXRvOiAxNjczNzA5NSwKICAgIHR1cnF1b2lzZTogNDI1MTg1NiwKICAgIHZpb2xldDogMTU2MzEwODYsCiAgICB3aGVhdDogMTYxMTMzMzEsCiAgICB3aGl0ZTogMTY3NzcyMTUsCiAgICB3aGl0ZXNtb2tlOiAxNjExOTI4NSwKICAgIHllbGxvdzogMTY3NzY5NjAsCiAgICB5ZWxsb3dncmVlbjogMTAxNDUwNzQKICB9OwogIF9oc2xBID0geyBoOiAwLCBzOiAwLCBsOiAwIH07CiAgX2hzbEIgPSB7IGg6IDAsIHM6IDAsIGw6IDAgfTsKICBDb2xvciA9IGNsYXNzIENvbG9yIHsKICAgIGNvbnN0cnVjdG9yKHIsIGcsIGIpIHsKICAgICAgdGhpcy5pc0NvbG9yID0gdHJ1ZTsKICAgICAgdGhpcy5yID0gMTsKICAgICAgdGhpcy5nID0gMTsKICAgICAgdGhpcy5iID0gMTsKICAgICAgcmV0dXJuIHRoaXMuc2V0KHIsIGcsIGIpOwogICAgfQogICAgc2V0KHIsIGcsIGIpIHsKICAgICAgaWYgKGcgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHsKICAgICAgICBjb25zdCB2YWx1ZSA9IHI7CiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmlzQ29sb3IpIHsKICAgICAgICAgIHRoaXMuY29weSh2YWx1ZSk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aGlzLnNldEhleCh2YWx1ZSk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICB0aGlzLnNldFN0eWxlKHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zZXRSR0IociwgZywgYik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRTY2FsYXIoc2NhbGFyKSB7CiAgICAgIHRoaXMuciA9IHNjYWxhcjsKICAgICAgdGhpcy5nID0gc2NhbGFyOwogICAgICB0aGlzLmIgPSBzY2FsYXI7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0SGV4KGhleCwgY29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlKSB7CiAgICAgIGhleCA9IE1hdGguZmxvb3IoaGV4KTsKICAgICAgdGhpcy5yID0gKGhleCA+PiAxNiAmIDI1NSkgLyAyNTU7CiAgICAgIHRoaXMuZyA9IChoZXggPj4gOCAmIDI1NSkgLyAyNTU7CiAgICAgIHRoaXMuYiA9IChoZXggJiAyNTUpIC8gMjU1OwogICAgICBDb2xvck1hbmFnZW1lbnQudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLCBjb2xvclNwYWNlKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRSR0IociwgZywgYiwgY29sb3JTcGFjZSA9IENvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZSkgewogICAgICB0aGlzLnIgPSByOwogICAgICB0aGlzLmcgPSBnOwogICAgICB0aGlzLmIgPSBiOwogICAgICBDb2xvck1hbmFnZW1lbnQudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLCBjb2xvclNwYWNlKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRIU0woaCwgcywgbCwgY29sb3JTcGFjZSA9IENvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZSkgewogICAgICBoID0gZXVjbGlkZWFuTW9kdWxvKGgsIDEpOwogICAgICBzID0gY2xhbXAocywgMCwgMSk7CiAgICAgIGwgPSBjbGFtcChsLCAwLCAxKTsKICAgICAgaWYgKHMgPT09IDApIHsKICAgICAgICB0aGlzLnIgPSB0aGlzLmcgPSB0aGlzLmIgPSBsOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHAgPSBsIDw9IDAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogczsKICAgICAgICBjb25zdCBxID0gMiAqIGwgLSBwOwogICAgICAgIHRoaXMuciA9IGh1ZTJyZ2IocSwgcCwgaCArIDEgLyAzKTsKICAgICAgICB0aGlzLmcgPSBodWUycmdiKHEsIHAsIGgpOwogICAgICAgIHRoaXMuYiA9IGh1ZTJyZ2IocSwgcCwgaCAtIDEgLyAzKTsKICAgICAgfQogICAgICBDb2xvck1hbmFnZW1lbnQudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLCBjb2xvclNwYWNlKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRTdHlsZShzdHlsZSwgY29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlKSB7CiAgICAgIGZ1bmN0aW9uIGhhbmRsZUFscGhhKHN0cmluZykgewogICAgICAgIGlmIChzdHJpbmcgPT09IHVuZGVmaW5lZCkKICAgICAgICAgIHJldHVybjsKICAgICAgICBpZiAocGFyc2VGbG9hdChzdHJpbmcpIDwgMSkgewogICAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIgKyBzdHlsZSArICIgd2lsbCBiZSBpZ25vcmVkLiIpOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgbTsKICAgICAgaWYgKG0gPSAvXihcdyspXCgoW15cKV0qKVwpLy5leGVjKHN0eWxlKSkgewogICAgICAgIGxldCBjb2xvcjsKICAgICAgICBjb25zdCBuYW1lID0gbVsxXTsKICAgICAgICBjb25zdCBjb21wb25lbnRzID0gbVsyXTsKICAgICAgICBzd2l0Y2ggKG5hbWUpIHsKICAgICAgICAgIGNhc2UgInJnYiI6CiAgICAgICAgICBjYXNlICJyZ2JhIjoKICAgICAgICAgICAgaWYgKGNvbG9yID0gL15ccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhjb21wb25lbnRzKSkgewogICAgICAgICAgICAgIGhhbmRsZUFscGhhKGNvbG9yWzRdKTsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRSR0IoTWF0aC5taW4oMjU1LCBwYXJzZUludChjb2xvclsxXSwgMTApKSAvIDI1NSwgTWF0aC5taW4oMjU1LCBwYXJzZUludChjb2xvclsyXSwgMTApKSAvIDI1NSwgTWF0aC5taW4oMjU1LCBwYXJzZUludChjb2xvclszXSwgMTApKSAvIDI1NSwgY29sb3JTcGFjZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNvbG9yID0gL15ccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhjb21wb25lbnRzKSkgewogICAgICAgICAgICAgIGhhbmRsZUFscGhhKGNvbG9yWzRdKTsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRSR0IoTWF0aC5taW4oMTAwLCBwYXJzZUludChjb2xvclsxXSwgMTApKSAvIDEwMCwgTWF0aC5taW4oMTAwLCBwYXJzZUludChjb2xvclsyXSwgMTApKSAvIDEwMCwgTWF0aC5taW4oMTAwLCBwYXJzZUludChjb2xvclszXSwgMTApKSAvIDEwMCwgY29sb3JTcGFjZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJoc2wiOgogICAgICAgICAgY2FzZSAiaHNsYSI6CiAgICAgICAgICAgIGlmIChjb2xvciA9IC9eXHMqKFxkKlwuP1xkKylccyosXHMqKFxkKlwuP1xkKylcJVxzKixccyooXGQqXC4/XGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGNvbXBvbmVudHMpKSB7CiAgICAgICAgICAgICAgaGFuZGxlQWxwaGEoY29sb3JbNF0pOwogICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldEhTTChwYXJzZUZsb2F0KGNvbG9yWzFdKSAvIDM2MCwgcGFyc2VGbG9hdChjb2xvclsyXSkgLyAxMDAsIHBhcnNlRmxvYXQoY29sb3JbM10pIC8gMTAwLCBjb2xvclNwYWNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgbW9kZWwgIiArIHN0eWxlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobSA9IC9eXCMoW0EtRmEtZlxkXSspJC8uZXhlYyhzdHlsZSkpIHsKICAgICAgICBjb25zdCBoZXggPSBtWzFdOwogICAgICAgIGNvbnN0IHNpemUgPSBoZXgubGVuZ3RoOwogICAgICAgIGlmIChzaXplID09PSAzKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5zZXRSR0IocGFyc2VJbnQoaGV4LmNoYXJBdCgwKSwgMTYpIC8gMTUsIHBhcnNlSW50KGhleC5jaGFyQXQoMSksIDE2KSAvIDE1LCBwYXJzZUludChoZXguY2hhckF0KDIpLCAxNikgLyAxNSwgY29sb3JTcGFjZSk7CiAgICAgICAgfSBlbHNlIGlmIChzaXplID09PSA2KSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5zZXRIZXgocGFyc2VJbnQoaGV4LCAxNiksIGNvbG9yU3BhY2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBJbnZhbGlkIGhleCBjb2xvciAiICsgc3R5bGUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChzdHlsZSAmJiBzdHlsZS5sZW5ndGggPiAwKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKHN0eWxlLCBjb2xvclNwYWNlKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldENvbG9yTmFtZShzdHlsZSwgY29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlKSB7CiAgICAgIGNvbnN0IGhleCA9IF9jb2xvcktleXdvcmRzW3N0eWxlLnRvTG93ZXJDYXNlKCldOwogICAgICBpZiAoaGV4ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB0aGlzLnNldEhleChoZXgsIGNvbG9yU3BhY2UpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgIiArIHN0eWxlKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGNsb25lKCkgewogICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLCB0aGlzLmcsIHRoaXMuYik7CiAgICB9CiAgICBjb3B5KGNvbG9yKSB7CiAgICAgIHRoaXMuciA9IGNvbG9yLnI7CiAgICAgIHRoaXMuZyA9IGNvbG9yLmc7CiAgICAgIHRoaXMuYiA9IGNvbG9yLmI7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgY29weVNSR0JUb0xpbmVhcihjb2xvcikgewogICAgICB0aGlzLnIgPSBTUkdCVG9MaW5lYXIoY29sb3Iucik7CiAgICAgIHRoaXMuZyA9IFNSR0JUb0xpbmVhcihjb2xvci5nKTsKICAgICAgdGhpcy5iID0gU1JHQlRvTGluZWFyKGNvbG9yLmIpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGNvcHlMaW5lYXJUb1NSR0IoY29sb3IpIHsKICAgICAgdGhpcy5yID0gTGluZWFyVG9TUkdCKGNvbG9yLnIpOwogICAgICB0aGlzLmcgPSBMaW5lYXJUb1NSR0IoY29sb3IuZyk7CiAgICAgIHRoaXMuYiA9IExpbmVhclRvU1JHQihjb2xvci5iKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjb252ZXJ0U1JHQlRvTGluZWFyKCkgewogICAgICB0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgY29udmVydExpbmVhclRvU1JHQigpIHsKICAgICAgdGhpcy5jb3B5TGluZWFyVG9TUkdCKHRoaXMpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldEhleChjb2xvclNwYWNlID0gU1JHQkNvbG9yU3BhY2UpIHsKICAgICAgQ29sb3JNYW5hZ2VtZW50LmZyb21Xb3JraW5nQ29sb3JTcGFjZShfY29sb3IuY29weSh0aGlzKSwgY29sb3JTcGFjZSk7CiAgICAgIHJldHVybiBNYXRoLnJvdW5kKGNsYW1wKF9jb2xvci5yICogMjU1LCAwLCAyNTUpKSAqIDY1NTM2ICsgTWF0aC5yb3VuZChjbGFtcChfY29sb3IuZyAqIDI1NSwgMCwgMjU1KSkgKiAyNTYgKyBNYXRoLnJvdW5kKGNsYW1wKF9jb2xvci5iICogMjU1LCAwLCAyNTUpKTsKICAgIH0KICAgIGdldEhleFN0cmluZyhjb2xvclNwYWNlID0gU1JHQkNvbG9yU3BhY2UpIHsKICAgICAgcmV0dXJuICgiMDAwMDAwIiArIHRoaXMuZ2V0SGV4KGNvbG9yU3BhY2UpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpOwogICAgfQogICAgZ2V0SFNMKHRhcmdldCwgY29sb3JTcGFjZSA9IENvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZSkgewogICAgICBDb2xvck1hbmFnZW1lbnQuZnJvbVdvcmtpbmdDb2xvclNwYWNlKF9jb2xvci5jb3B5KHRoaXMpLCBjb2xvclNwYWNlKTsKICAgICAgY29uc3QgeyByLCBnLCBiIH0gPSBfY29sb3I7CiAgICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpOwogICAgICBjb25zdCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTsKICAgICAgbGV0IGh1ZSwgc2F0dXJhdGlvbjsKICAgICAgY29uc3QgbGlnaHRuZXNzID0gKG1pbiArIG1heCkgLyAyOwogICAgICBpZiAobWluID09PSBtYXgpIHsKICAgICAgICBodWUgPSAwOwogICAgICAgIHNhdHVyYXRpb24gPSAwOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGRlbHRhID0gbWF4IC0gbWluOwogICAgICAgIHNhdHVyYXRpb24gPSBsaWdodG5lc3MgPD0gMC41ID8gZGVsdGEgLyAobWF4ICsgbWluKSA6IGRlbHRhIC8gKDIgLSBtYXggLSBtaW4pOwogICAgICAgIHN3aXRjaCAobWF4KSB7CiAgICAgICAgICBjYXNlIHI6CiAgICAgICAgICAgIGh1ZSA9IChnIC0gYikgLyBkZWx0YSArIChnIDwgYiA/IDYgOiAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIGc6CiAgICAgICAgICAgIGh1ZSA9IChiIC0gcikgLyBkZWx0YSArIDI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBiOgogICAgICAgICAgICBodWUgPSAociAtIGcpIC8gZGVsdGEgKyA0OwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaHVlIC89IDY7CiAgICAgIH0KICAgICAgdGFyZ2V0LmggPSBodWU7CiAgICAgIHRhcmdldC5zID0gc2F0dXJhdGlvbjsKICAgICAgdGFyZ2V0LmwgPSBsaWdodG5lc3M7CiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CiAgICBnZXRSR0IodGFyZ2V0LCBjb2xvclNwYWNlID0gQ29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlKSB7CiAgICAgIENvbG9yTWFuYWdlbWVudC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoX2NvbG9yLmNvcHkodGhpcyksIGNvbG9yU3BhY2UpOwogICAgICB0YXJnZXQuciA9IF9jb2xvci5yOwogICAgICB0YXJnZXQuZyA9IF9jb2xvci5nOwogICAgICB0YXJnZXQuYiA9IF9jb2xvci5iOwogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQogICAgZ2V0U3R5bGUoY29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlKSB7CiAgICAgIENvbG9yTWFuYWdlbWVudC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoX2NvbG9yLmNvcHkodGhpcyksIGNvbG9yU3BhY2UpOwogICAgICBjb25zdCB7IHIsIGcsIGIgfSA9IF9jb2xvcjsKICAgICAgaWYgKGNvbG9yU3BhY2UgIT09IFNSR0JDb2xvclNwYWNlKSB7CiAgICAgICAgcmV0dXJuIGBjb2xvcigke2NvbG9yU3BhY2V9ICR7ci50b0ZpeGVkKDMpfSAke2cudG9GaXhlZCgzKX0gJHtiLnRvRml4ZWQoMyl9KWA7CiAgICAgIH0KICAgICAgcmV0dXJuIGByZ2IoJHtNYXRoLnJvdW5kKHIgKiAyNTUpfSwke01hdGgucm91bmQoZyAqIDI1NSl9LCR7TWF0aC5yb3VuZChiICogMjU1KX0pYDsKICAgIH0KICAgIG9mZnNldEhTTChoLCBzLCBsKSB7CiAgICAgIHRoaXMuZ2V0SFNMKF9oc2xBKTsKICAgICAgcmV0dXJuIHRoaXMuc2V0SFNMKF9oc2xBLmggKyBoLCBfaHNsQS5zICsgcywgX2hzbEEubCArIGwpOwogICAgfQogICAgYWRkKGNvbG9yKSB7CiAgICAgIHRoaXMuciArPSBjb2xvci5yOwogICAgICB0aGlzLmcgKz0gY29sb3IuZzsKICAgICAgdGhpcy5iICs9IGNvbG9yLmI7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgYWRkQ29sb3JzKGNvbG9yMSwgY29sb3IyKSB7CiAgICAgIHRoaXMuciA9IGNvbG9yMS5yICsgY29sb3IyLnI7CiAgICAgIHRoaXMuZyA9IGNvbG9yMS5nICsgY29sb3IyLmc7CiAgICAgIHRoaXMuYiA9IGNvbG9yMS5iICsgY29sb3IyLmI7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgYWRkU2NhbGFyKHMpIHsKICAgICAgdGhpcy5yICs9IHM7CiAgICAgIHRoaXMuZyArPSBzOwogICAgICB0aGlzLmIgKz0gczsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzdWIoY29sb3IpIHsKICAgICAgdGhpcy5yID0gTWF0aC5tYXgoMCwgdGhpcy5yIC0gY29sb3Iucik7CiAgICAgIHRoaXMuZyA9IE1hdGgubWF4KDAsIHRoaXMuZyAtIGNvbG9yLmcpOwogICAgICB0aGlzLmIgPSBNYXRoLm1heCgwLCB0aGlzLmIgLSBjb2xvci5iKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBtdWx0aXBseShjb2xvcikgewogICAgICB0aGlzLnIgKj0gY29sb3IucjsKICAgICAgdGhpcy5nICo9IGNvbG9yLmc7CiAgICAgIHRoaXMuYiAqPSBjb2xvci5iOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIG11bHRpcGx5U2NhbGFyKHMpIHsKICAgICAgdGhpcy5yICo9IHM7CiAgICAgIHRoaXMuZyAqPSBzOwogICAgICB0aGlzLmIgKj0gczsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBsZXJwKGNvbG9yLCBhbHBoYSkgewogICAgICB0aGlzLnIgKz0gKGNvbG9yLnIgLSB0aGlzLnIpICogYWxwaGE7CiAgICAgIHRoaXMuZyArPSAoY29sb3IuZyAtIHRoaXMuZykgKiBhbHBoYTsKICAgICAgdGhpcy5iICs9IChjb2xvci5iIC0gdGhpcy5iKSAqIGFscGhhOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGxlcnBDb2xvcnMoY29sb3IxLCBjb2xvcjIsIGFscGhhKSB7CiAgICAgIHRoaXMuciA9IGNvbG9yMS5yICsgKGNvbG9yMi5yIC0gY29sb3IxLnIpICogYWxwaGE7CiAgICAgIHRoaXMuZyA9IGNvbG9yMS5nICsgKGNvbG9yMi5nIC0gY29sb3IxLmcpICogYWxwaGE7CiAgICAgIHRoaXMuYiA9IGNvbG9yMS5iICsgKGNvbG9yMi5iIC0gY29sb3IxLmIpICogYWxwaGE7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgbGVycEhTTChjb2xvciwgYWxwaGEpIHsKICAgICAgdGhpcy5nZXRIU0woX2hzbEEpOwogICAgICBjb2xvci5nZXRIU0woX2hzbEIpOwogICAgICBjb25zdCBoID0gbGVycChfaHNsQS5oLCBfaHNsQi5oLCBhbHBoYSk7CiAgICAgIGNvbnN0IHMgPSBsZXJwKF9oc2xBLnMsIF9oc2xCLnMsIGFscGhhKTsKICAgICAgY29uc3QgbCA9IGxlcnAoX2hzbEEubCwgX2hzbEIubCwgYWxwaGEpOwogICAgICB0aGlzLnNldEhTTChoLCBzLCBsKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tVmVjdG9yMyh2KSB7CiAgICAgIHRoaXMuciA9IHYueDsKICAgICAgdGhpcy5nID0gdi55OwogICAgICB0aGlzLmIgPSB2Lno7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgYXBwbHlNYXRyaXgzKG0pIHsKICAgICAgY29uc3QgciA9IHRoaXMuciwgZyA9IHRoaXMuZywgYiA9IHRoaXMuYjsKICAgICAgY29uc3QgZSA9IG0uZWxlbWVudHM7CiAgICAgIHRoaXMuciA9IGVbMF0gKiByICsgZVszXSAqIGcgKyBlWzZdICogYjsKICAgICAgdGhpcy5nID0gZVsxXSAqIHIgKyBlWzRdICogZyArIGVbN10gKiBiOwogICAgICB0aGlzLmIgPSBlWzJdICogciArIGVbNV0gKiBnICsgZVs4XSAqIGI7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZXF1YWxzKGMpIHsKICAgICAgcmV0dXJuIGMuciA9PT0gdGhpcy5yICYmIGMuZyA9PT0gdGhpcy5nICYmIGMuYiA9PT0gdGhpcy5iOwogICAgfQogICAgZnJvbUFycmF5KGFycmF5LCBvZmZzZXQgPSAwKSB7CiAgICAgIHRoaXMuciA9IGFycmF5W29mZnNldF07CiAgICAgIHRoaXMuZyA9IGFycmF5W29mZnNldCArIDFdOwogICAgICB0aGlzLmIgPSBhcnJheVtvZmZzZXQgKyAyXTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0b0FycmF5KGFycmF5ID0gW10sIG9mZnNldCA9IDApIHsKICAgICAgYXJyYXlbb2Zmc2V0XSA9IHRoaXMucjsKICAgICAgYXJyYXlbb2Zmc2V0ICsgMV0gPSB0aGlzLmc7CiAgICAgIGFycmF5W29mZnNldCArIDJdID0gdGhpcy5iOwogICAgICByZXR1cm4gYXJyYXk7CiAgICB9CiAgICBmcm9tQnVmZmVyQXR0cmlidXRlKGF0dHJpYnV0ZSwgaW5kZXgpIHsKICAgICAgdGhpcy5yID0gYXR0cmlidXRlLmdldFgoaW5kZXgpOwogICAgICB0aGlzLmcgPSBhdHRyaWJ1dGUuZ2V0WShpbmRleCk7CiAgICAgIHRoaXMuYiA9IGF0dHJpYnV0ZS5nZXRaKGluZGV4KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0b0pTT04oKSB7CiAgICAgIHJldHVybiB0aGlzLmdldEhleCgpOwogICAgfQogICAgKltTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgICB5aWVsZCB0aGlzLnI7CiAgICAgIHlpZWxkIHRoaXMuZzsKICAgICAgeWllbGQgdGhpcy5iOwogICAgfQogIH07CiAgX2NvbG9yID0gLyogQF9fUFVSRV9fICovIG5ldyBDb2xvcjsKICBDb2xvci5OQU1FUyA9IF9jb2xvcktleXdvcmRzOwogIE1hdGVyaWFsID0gY2xhc3MgTWF0ZXJpYWwgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNNYXRlcmlhbCA9IHRydWU7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiaWQiLCB7IHZhbHVlOiBfbWF0ZXJpYWxJZCsrIH0pOwogICAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTsKICAgICAgdGhpcy5uYW1lID0gIiI7CiAgICAgIHRoaXMudHlwZSA9ICJNYXRlcmlhbCI7CiAgICAgIHRoaXMuYmxlbmRpbmcgPSBOb3JtYWxCbGVuZGluZzsKICAgICAgdGhpcy5zaWRlID0gRnJvbnRTaWRlOwogICAgICB0aGlzLnZlcnRleENvbG9ycyA9IGZhbHNlOwogICAgICB0aGlzLm9wYWNpdHkgPSAxOwogICAgICB0aGlzLnRyYW5zcGFyZW50ID0gZmFsc2U7CiAgICAgIHRoaXMuYWxwaGFIYXNoID0gZmFsc2U7CiAgICAgIHRoaXMuYmxlbmRTcmMgPSBTcmNBbHBoYUZhY3RvcjsKICAgICAgdGhpcy5ibGVuZERzdCA9IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I7CiAgICAgIHRoaXMuYmxlbmRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uOwogICAgICB0aGlzLmJsZW5kU3JjQWxwaGEgPSBudWxsOwogICAgICB0aGlzLmJsZW5kRHN0QWxwaGEgPSBudWxsOwogICAgICB0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7CiAgICAgIHRoaXMuYmxlbmRDb2xvciA9IG5ldyBDb2xvcigwLCAwLCAwKTsKICAgICAgdGhpcy5ibGVuZEFscGhhID0gMDsKICAgICAgdGhpcy5kZXB0aEZ1bmMgPSBMZXNzRXF1YWxEZXB0aDsKICAgICAgdGhpcy5kZXB0aFRlc3QgPSB0cnVlOwogICAgICB0aGlzLmRlcHRoV3JpdGUgPSB0cnVlOwogICAgICB0aGlzLnN0ZW5jaWxXcml0ZU1hc2sgPSAyNTU7CiAgICAgIHRoaXMuc3RlbmNpbEZ1bmMgPSBBbHdheXNTdGVuY2lsRnVuYzsKICAgICAgdGhpcy5zdGVuY2lsUmVmID0gMDsKICAgICAgdGhpcy5zdGVuY2lsRnVuY01hc2sgPSAyNTU7CiAgICAgIHRoaXMuc3RlbmNpbEZhaWwgPSBLZWVwU3RlbmNpbE9wOwogICAgICB0aGlzLnN0ZW5jaWxaRmFpbCA9IEtlZXBTdGVuY2lsT3A7CiAgICAgIHRoaXMuc3RlbmNpbFpQYXNzID0gS2VlcFN0ZW5jaWxPcDsKICAgICAgdGhpcy5zdGVuY2lsV3JpdGUgPSBmYWxzZTsKICAgICAgdGhpcy5jbGlwcGluZ1BsYW5lcyA9IG51bGw7CiAgICAgIHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IGZhbHNlOwogICAgICB0aGlzLmNsaXBTaGFkb3dzID0gZmFsc2U7CiAgICAgIHRoaXMuc2hhZG93U2lkZSA9IG51bGw7CiAgICAgIHRoaXMuY29sb3JXcml0ZSA9IHRydWU7CiAgICAgIHRoaXMucHJlY2lzaW9uID0gbnVsbDsKICAgICAgdGhpcy5wb2x5Z29uT2Zmc2V0ID0gZmFsc2U7CiAgICAgIHRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IDA7CiAgICAgIHRoaXMucG9seWdvbk9mZnNldFVuaXRzID0gMDsKICAgICAgdGhpcy5kaXRoZXJpbmcgPSBmYWxzZTsKICAgICAgdGhpcy5hbHBoYVRvQ292ZXJhZ2UgPSBmYWxzZTsKICAgICAgdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSBmYWxzZTsKICAgICAgdGhpcy5mb3JjZVNpbmdsZVBhc3MgPSBmYWxzZTsKICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTsKICAgICAgdGhpcy50b25lTWFwcGVkID0gdHJ1ZTsKICAgICAgdGhpcy51c2VyRGF0YSA9IHt9OwogICAgICB0aGlzLnZlcnNpb24gPSAwOwogICAgICB0aGlzLl9hbHBoYVRlc3QgPSAwOwogICAgfQogICAgZ2V0IGFscGhhVGVzdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FscGhhVGVzdDsKICAgIH0KICAgIHNldCBhbHBoYVRlc3QodmFsdWUpIHsKICAgICAgaWYgKHRoaXMuX2FscGhhVGVzdCA+IDAgIT09IHZhbHVlID4gMCkgewogICAgICAgIHRoaXMudmVyc2lvbisrOwogICAgICB9CiAgICAgIHRoaXMuX2FscGhhVGVzdCA9IHZhbHVlOwogICAgfQogICAgb25CZWZvcmVSZW5kZXIoKSB7fQogICAgb25CZWZvcmVDb21waWxlKCkge30KICAgIGN1c3RvbVByb2dyYW1DYWNoZUtleSgpIHsKICAgICAgcmV0dXJuIHRoaXMub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCk7CiAgICB9CiAgICBzZXRWYWx1ZXModmFsdWVzKSB7CiAgICAgIGlmICh2YWx1ZXMgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm47CiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlcykgewogICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWVzW2tleV07CiAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGNvbnNvbGUud2FybihgVEhSRUUuTWF0ZXJpYWw6IHBhcmFtZXRlciAnJHtrZXl9JyBoYXMgdmFsdWUgb2YgdW5kZWZpbmVkLmApOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXNba2V5XTsKICAgICAgICBpZiAoY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGNvbnNvbGUud2FybihgVEhSRUUuTWF0ZXJpYWw6ICcke2tleX0nIGlzIG5vdCBhIHByb3BlcnR5IG9mIFRIUkVFLiR7dGhpcy50eXBlfS5gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5pc0NvbG9yKSB7CiAgICAgICAgICBjdXJyZW50VmFsdWUuc2V0KG5ld1ZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNWZWN0b3IzICYmIChuZXdWYWx1ZSAmJiBuZXdWYWx1ZS5pc1ZlY3RvcjMpKSB7CiAgICAgICAgICBjdXJyZW50VmFsdWUuY29weShuZXdWYWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXNba2V5XSA9IG5ld1ZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdG9KU09OKG1ldGEpIHsKICAgICAgY29uc3QgaXNSb290T2JqZWN0ID0gbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAic3RyaW5nIjsKICAgICAgaWYgKGlzUm9vdE9iamVjdCkgewogICAgICAgIG1ldGEgPSB7CiAgICAgICAgICB0ZXh0dXJlczoge30sCiAgICAgICAgICBpbWFnZXM6IHt9CiAgICAgICAgfTsKICAgICAgfQogICAgICBjb25zdCBkYXRhID0gewogICAgICAgIG1ldGFkYXRhOiB7CiAgICAgICAgICB2ZXJzaW9uOiA0LjYsCiAgICAgICAgICB0eXBlOiAiTWF0ZXJpYWwiLAogICAgICAgICAgZ2VuZXJhdG9yOiAiTWF0ZXJpYWwudG9KU09OIgogICAgICAgIH0KICAgICAgfTsKICAgICAgZGF0YS51dWlkID0gdGhpcy51dWlkOwogICAgICBkYXRhLnR5cGUgPSB0aGlzLnR5cGU7CiAgICAgIGlmICh0aGlzLm5hbWUgIT09ICIiKQogICAgICAgIGRhdGEubmFtZSA9IHRoaXMubmFtZTsKICAgICAgaWYgKHRoaXMuY29sb3IgJiYgdGhpcy5jb2xvci5pc0NvbG9yKQogICAgICAgIGRhdGEuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpOwogICAgICBpZiAodGhpcy5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCkKICAgICAgICBkYXRhLnJvdWdobmVzcyA9IHRoaXMucm91Z2huZXNzOwogICAgICBpZiAodGhpcy5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCkKICAgICAgICBkYXRhLm1ldGFsbmVzcyA9IHRoaXMubWV0YWxuZXNzOwogICAgICBpZiAodGhpcy5zaGVlbiAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEuc2hlZW4gPSB0aGlzLnNoZWVuOwogICAgICBpZiAodGhpcy5zaGVlbkNvbG9yICYmIHRoaXMuc2hlZW5Db2xvci5pc0NvbG9yKQogICAgICAgIGRhdGEuc2hlZW5Db2xvciA9IHRoaXMuc2hlZW5Db2xvci5nZXRIZXgoKTsKICAgICAgaWYgKHRoaXMuc2hlZW5Sb3VnaG5lc3MgIT09IHVuZGVmaW5lZCkKICAgICAgICBkYXRhLnNoZWVuUm91Z2huZXNzID0gdGhpcy5zaGVlblJvdWdobmVzczsKICAgICAgaWYgKHRoaXMuZW1pc3NpdmUgJiYgdGhpcy5lbWlzc2l2ZS5pc0NvbG9yKQogICAgICAgIGRhdGEuZW1pc3NpdmUgPSB0aGlzLmVtaXNzaXZlLmdldEhleCgpOwogICAgICBpZiAodGhpcy5lbWlzc2l2ZUludGVuc2l0eSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgIT09IDEpCiAgICAgICAgZGF0YS5lbWlzc2l2ZUludGVuc2l0eSA9IHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk7CiAgICAgIGlmICh0aGlzLnNwZWN1bGFyICYmIHRoaXMuc3BlY3VsYXIuaXNDb2xvcikKICAgICAgICBkYXRhLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhci5nZXRIZXgoKTsKICAgICAgaWYgKHRoaXMuc3BlY3VsYXJJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCkKICAgICAgICBkYXRhLnNwZWN1bGFySW50ZW5zaXR5ID0gdGhpcy5zcGVjdWxhckludGVuc2l0eTsKICAgICAgaWYgKHRoaXMuc3BlY3VsYXJDb2xvciAmJiB0aGlzLnNwZWN1bGFyQ29sb3IuaXNDb2xvcikKICAgICAgICBkYXRhLnNwZWN1bGFyQ29sb3IgPSB0aGlzLnNwZWN1bGFyQ29sb3IuZ2V0SGV4KCk7CiAgICAgIGlmICh0aGlzLnNoaW5pbmVzcyAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEuc2hpbmluZXNzID0gdGhpcy5zaGluaW5lc3M7CiAgICAgIGlmICh0aGlzLmNsZWFyY29hdCAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEuY2xlYXJjb2F0ID0gdGhpcy5jbGVhcmNvYXQ7CiAgICAgIGlmICh0aGlzLmNsZWFyY29hdFJvdWdobmVzcyAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEuY2xlYXJjb2F0Um91Z2huZXNzID0gdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M7CiAgICAgIGlmICh0aGlzLmNsZWFyY29hdE1hcCAmJiB0aGlzLmNsZWFyY29hdE1hcC5pc1RleHR1cmUpIHsKICAgICAgICBkYXRhLmNsZWFyY29hdE1hcCA9IHRoaXMuY2xlYXJjb2F0TWFwLnRvSlNPTihtZXRhKS51dWlkOwogICAgICB9CiAgICAgIGlmICh0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcCAmJiB0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcC5pc1RleHR1cmUpIHsKICAgICAgICBkYXRhLmNsZWFyY29hdFJvdWdobmVzc01hcCA9IHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnRvSlNPTihtZXRhKS51dWlkOwogICAgICB9CiAgICAgIGlmICh0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCAmJiB0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUpIHsKICAgICAgICBkYXRhLmNsZWFyY29hdE5vcm1hbE1hcCA9IHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwLnRvSlNPTihtZXRhKS51dWlkOwogICAgICAgIGRhdGEuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgPSB0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKTsKICAgICAgfQogICAgICBpZiAodGhpcy5kaXNwZXJzaW9uICE9PSB1bmRlZmluZWQpCiAgICAgICAgZGF0YS5kaXNwZXJzaW9uID0gdGhpcy5kaXNwZXJzaW9uOwogICAgICBpZiAodGhpcy5pcmlkZXNjZW5jZSAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEuaXJpZGVzY2VuY2UgPSB0aGlzLmlyaWRlc2NlbmNlOwogICAgICBpZiAodGhpcy5pcmlkZXNjZW5jZUlPUiAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEuaXJpZGVzY2VuY2VJT1IgPSB0aGlzLmlyaWRlc2NlbmNlSU9SOwogICAgICBpZiAodGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlICE9PSB1bmRlZmluZWQpCiAgICAgICAgZGF0YS5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlID0gdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlOwogICAgICBpZiAodGhpcy5pcmlkZXNjZW5jZU1hcCAmJiB0aGlzLmlyaWRlc2NlbmNlTWFwLmlzVGV4dHVyZSkgewogICAgICAgIGRhdGEuaXJpZGVzY2VuY2VNYXAgPSB0aGlzLmlyaWRlc2NlbmNlTWFwLnRvSlNPTihtZXRhKS51dWlkOwogICAgICB9CiAgICAgIGlmICh0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwICYmIHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuaXNUZXh0dXJlKSB7CiAgICAgICAgZGF0YS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCA9IHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAudG9KU09OKG1ldGEpLnV1aWQ7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuYW5pc290cm9weSAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEuYW5pc290cm9weSA9IHRoaXMuYW5pc290cm9weTsKICAgICAgaWYgKHRoaXMuYW5pc290cm9weVJvdGF0aW9uICE9PSB1bmRlZmluZWQpCiAgICAgICAgZGF0YS5hbmlzb3Ryb3B5Um90YXRpb24gPSB0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbjsKICAgICAgaWYgKHRoaXMuYW5pc290cm9weU1hcCAmJiB0aGlzLmFuaXNvdHJvcHlNYXAuaXNUZXh0dXJlKSB7CiAgICAgICAgZGF0YS5hbmlzb3Ryb3B5TWFwID0gdGhpcy5hbmlzb3Ryb3B5TWFwLnRvSlNPTihtZXRhKS51dWlkOwogICAgICB9CiAgICAgIGlmICh0aGlzLm1hcCAmJiB0aGlzLm1hcC5pc1RleHR1cmUpCiAgICAgICAgZGF0YS5tYXAgPSB0aGlzLm1hcC50b0pTT04obWV0YSkudXVpZDsKICAgICAgaWYgKHRoaXMubWF0Y2FwICYmIHRoaXMubWF0Y2FwLmlzVGV4dHVyZSkKICAgICAgICBkYXRhLm1hdGNhcCA9IHRoaXMubWF0Y2FwLnRvSlNPTihtZXRhKS51dWlkOwogICAgICBpZiAodGhpcy5hbHBoYU1hcCAmJiB0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSkKICAgICAgICBkYXRhLmFscGhhTWFwID0gdGhpcy5hbHBoYU1hcC50b0pTT04obWV0YSkudXVpZDsKICAgICAgaWYgKHRoaXMubGlnaHRNYXAgJiYgdGhpcy5saWdodE1hcC5pc1RleHR1cmUpIHsKICAgICAgICBkYXRhLmxpZ2h0TWFwID0gdGhpcy5saWdodE1hcC50b0pTT04obWV0YSkudXVpZDsKICAgICAgICBkYXRhLmxpZ2h0TWFwSW50ZW5zaXR5ID0gdGhpcy5saWdodE1hcEludGVuc2l0eTsKICAgICAgfQogICAgICBpZiAodGhpcy5hb01hcCAmJiB0aGlzLmFvTWFwLmlzVGV4dHVyZSkgewogICAgICAgIGRhdGEuYW9NYXAgPSB0aGlzLmFvTWFwLnRvSlNPTihtZXRhKS51dWlkOwogICAgICAgIGRhdGEuYW9NYXBJbnRlbnNpdHkgPSB0aGlzLmFvTWFwSW50ZW5zaXR5OwogICAgICB9CiAgICAgIGlmICh0aGlzLmJ1bXBNYXAgJiYgdGhpcy5idW1wTWFwLmlzVGV4dHVyZSkgewogICAgICAgIGRhdGEuYnVtcE1hcCA9IHRoaXMuYnVtcE1hcC50b0pTT04obWV0YSkudXVpZDsKICAgICAgICBkYXRhLmJ1bXBTY2FsZSA9IHRoaXMuYnVtcFNjYWxlOwogICAgICB9CiAgICAgIGlmICh0aGlzLm5vcm1hbE1hcCAmJiB0aGlzLm5vcm1hbE1hcC5pc1RleHR1cmUpIHsKICAgICAgICBkYXRhLm5vcm1hbE1hcCA9IHRoaXMubm9ybWFsTWFwLnRvSlNPTihtZXRhKS51dWlkOwogICAgICAgIGRhdGEubm9ybWFsTWFwVHlwZSA9IHRoaXMubm9ybWFsTWFwVHlwZTsKICAgICAgICBkYXRhLm5vcm1hbFNjYWxlID0gdGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZGlzcGxhY2VtZW50TWFwICYmIHRoaXMuZGlzcGxhY2VtZW50TWFwLmlzVGV4dHVyZSkgewogICAgICAgIGRhdGEuZGlzcGxhY2VtZW50TWFwID0gdGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKG1ldGEpLnV1aWQ7CiAgICAgICAgZGF0YS5kaXNwbGFjZW1lbnRTY2FsZSA9IHRoaXMuZGlzcGxhY2VtZW50U2NhbGU7CiAgICAgICAgZGF0YS5kaXNwbGFjZW1lbnRCaWFzID0gdGhpcy5kaXNwbGFjZW1lbnRCaWFzOwogICAgICB9CiAgICAgIGlmICh0aGlzLnJvdWdobmVzc01hcCAmJiB0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUpCiAgICAgICAgZGF0YS5yb3VnaG5lc3NNYXAgPSB0aGlzLnJvdWdobmVzc01hcC50b0pTT04obWV0YSkudXVpZDsKICAgICAgaWYgKHRoaXMubWV0YWxuZXNzTWFwICYmIHRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSkKICAgICAgICBkYXRhLm1ldGFsbmVzc01hcCA9IHRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTihtZXRhKS51dWlkOwogICAgICBpZiAodGhpcy5lbWlzc2l2ZU1hcCAmJiB0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSkKICAgICAgICBkYXRhLmVtaXNzaXZlTWFwID0gdGhpcy5lbWlzc2l2ZU1hcC50b0pTT04obWV0YSkudXVpZDsKICAgICAgaWYgKHRoaXMuc3BlY3VsYXJNYXAgJiYgdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUpCiAgICAgICAgZGF0YS5zcGVjdWxhck1hcCA9IHRoaXMuc3BlY3VsYXJNYXAudG9KU09OKG1ldGEpLnV1aWQ7CiAgICAgIGlmICh0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwICYmIHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAuaXNUZXh0dXJlKQogICAgICAgIGRhdGEuc3BlY3VsYXJJbnRlbnNpdHlNYXAgPSB0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLnRvSlNPTihtZXRhKS51dWlkOwogICAgICBpZiAodGhpcy5zcGVjdWxhckNvbG9yTWFwICYmIHRoaXMuc3BlY3VsYXJDb2xvck1hcC5pc1RleHR1cmUpCiAgICAgICAgZGF0YS5zcGVjdWxhckNvbG9yTWFwID0gdGhpcy5zcGVjdWxhckNvbG9yTWFwLnRvSlNPTihtZXRhKS51dWlkOwogICAgICBpZiAodGhpcy5lbnZNYXAgJiYgdGhpcy5lbnZNYXAuaXNUZXh0dXJlKSB7CiAgICAgICAgZGF0YS5lbnZNYXAgPSB0aGlzLmVudk1hcC50b0pTT04obWV0YSkudXVpZDsKICAgICAgICBpZiAodGhpcy5jb21iaW5lICE9PSB1bmRlZmluZWQpCiAgICAgICAgICBkYXRhLmNvbWJpbmUgPSB0aGlzLmNvbWJpbmU7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZW52TWFwUm90YXRpb24gIT09IHVuZGVmaW5lZCkKICAgICAgICBkYXRhLmVudk1hcFJvdGF0aW9uID0gdGhpcy5lbnZNYXBSb3RhdGlvbi50b0FycmF5KCk7CiAgICAgIGlmICh0aGlzLmVudk1hcEludGVuc2l0eSAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEuZW52TWFwSW50ZW5zaXR5ID0gdGhpcy5lbnZNYXBJbnRlbnNpdHk7CiAgICAgIGlmICh0aGlzLnJlZmxlY3Rpdml0eSAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEucmVmbGVjdGl2aXR5ID0gdGhpcy5yZWZsZWN0aXZpdHk7CiAgICAgIGlmICh0aGlzLnJlZnJhY3Rpb25SYXRpbyAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEucmVmcmFjdGlvblJhdGlvID0gdGhpcy5yZWZyYWN0aW9uUmF0aW87CiAgICAgIGlmICh0aGlzLmdyYWRpZW50TWFwICYmIHRoaXMuZ3JhZGllbnRNYXAuaXNUZXh0dXJlKSB7CiAgICAgICAgZGF0YS5ncmFkaWVudE1hcCA9IHRoaXMuZ3JhZGllbnRNYXAudG9KU09OKG1ldGEpLnV1aWQ7CiAgICAgIH0KICAgICAgaWYgKHRoaXMudHJhbnNtaXNzaW9uICE9PSB1bmRlZmluZWQpCiAgICAgICAgZGF0YS50cmFuc21pc3Npb24gPSB0aGlzLnRyYW5zbWlzc2lvbjsKICAgICAgaWYgKHRoaXMudHJhbnNtaXNzaW9uTWFwICYmIHRoaXMudHJhbnNtaXNzaW9uTWFwLmlzVGV4dHVyZSkKICAgICAgICBkYXRhLnRyYW5zbWlzc2lvbk1hcCA9IHRoaXMudHJhbnNtaXNzaW9uTWFwLnRvSlNPTihtZXRhKS51dWlkOwogICAgICBpZiAodGhpcy50aGlja25lc3MgIT09IHVuZGVmaW5lZCkKICAgICAgICBkYXRhLnRoaWNrbmVzcyA9IHRoaXMudGhpY2tuZXNzOwogICAgICBpZiAodGhpcy50aGlja25lc3NNYXAgJiYgdGhpcy50aGlja25lc3NNYXAuaXNUZXh0dXJlKQogICAgICAgIGRhdGEudGhpY2tuZXNzTWFwID0gdGhpcy50aGlja25lc3NNYXAudG9KU09OKG1ldGEpLnV1aWQ7CiAgICAgIGlmICh0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UgIT09IEluZmluaXR5KQogICAgICAgIGRhdGEuYXR0ZW51YXRpb25EaXN0YW5jZSA9IHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZTsKICAgICAgaWYgKHRoaXMuYXR0ZW51YXRpb25Db2xvciAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEuYXR0ZW51YXRpb25Db2xvciA9IHRoaXMuYXR0ZW51YXRpb25Db2xvci5nZXRIZXgoKTsKICAgICAgaWYgKHRoaXMuc2l6ZSAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEuc2l6ZSA9IHRoaXMuc2l6ZTsKICAgICAgaWYgKHRoaXMuc2hhZG93U2lkZSAhPT0gbnVsbCkKICAgICAgICBkYXRhLnNoYWRvd1NpZGUgPSB0aGlzLnNoYWRvd1NpZGU7CiAgICAgIGlmICh0aGlzLnNpemVBdHRlbnVhdGlvbiAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEuc2l6ZUF0dGVudWF0aW9uID0gdGhpcy5zaXplQXR0ZW51YXRpb247CiAgICAgIGlmICh0aGlzLmJsZW5kaW5nICE9PSBOb3JtYWxCbGVuZGluZykKICAgICAgICBkYXRhLmJsZW5kaW5nID0gdGhpcy5ibGVuZGluZzsKICAgICAgaWYgKHRoaXMuc2lkZSAhPT0gRnJvbnRTaWRlKQogICAgICAgIGRhdGEuc2lkZSA9IHRoaXMuc2lkZTsKICAgICAgaWYgKHRoaXMudmVydGV4Q29sb3JzID09PSB0cnVlKQogICAgICAgIGRhdGEudmVydGV4Q29sb3JzID0gdHJ1ZTsKICAgICAgaWYgKHRoaXMub3BhY2l0eSA8IDEpCiAgICAgICAgZGF0YS5vcGFjaXR5ID0gdGhpcy5vcGFjaXR5OwogICAgICBpZiAodGhpcy50cmFuc3BhcmVudCA9PT0gdHJ1ZSkKICAgICAgICBkYXRhLnRyYW5zcGFyZW50ID0gdHJ1ZTsKICAgICAgaWYgKHRoaXMuYmxlbmRTcmMgIT09IFNyY0FscGhhRmFjdG9yKQogICAgICAgIGRhdGEuYmxlbmRTcmMgPSB0aGlzLmJsZW5kU3JjOwogICAgICBpZiAodGhpcy5ibGVuZERzdCAhPT0gT25lTWludXNTcmNBbHBoYUZhY3RvcikKICAgICAgICBkYXRhLmJsZW5kRHN0ID0gdGhpcy5ibGVuZERzdDsKICAgICAgaWYgKHRoaXMuYmxlbmRFcXVhdGlvbiAhPT0gQWRkRXF1YXRpb24pCiAgICAgICAgZGF0YS5ibGVuZEVxdWF0aW9uID0gdGhpcy5ibGVuZEVxdWF0aW9uOwogICAgICBpZiAodGhpcy5ibGVuZFNyY0FscGhhICE9PSBudWxsKQogICAgICAgIGRhdGEuYmxlbmRTcmNBbHBoYSA9IHRoaXMuYmxlbmRTcmNBbHBoYTsKICAgICAgaWYgKHRoaXMuYmxlbmREc3RBbHBoYSAhPT0gbnVsbCkKICAgICAgICBkYXRhLmJsZW5kRHN0QWxwaGEgPSB0aGlzLmJsZW5kRHN0QWxwaGE7CiAgICAgIGlmICh0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSAhPT0gbnVsbCkKICAgICAgICBkYXRhLmJsZW5kRXF1YXRpb25BbHBoYSA9IHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhOwogICAgICBpZiAodGhpcy5ibGVuZENvbG9yICYmIHRoaXMuYmxlbmRDb2xvci5pc0NvbG9yKQogICAgICAgIGRhdGEuYmxlbmRDb2xvciA9IHRoaXMuYmxlbmRDb2xvci5nZXRIZXgoKTsKICAgICAgaWYgKHRoaXMuYmxlbmRBbHBoYSAhPT0gMCkKICAgICAgICBkYXRhLmJsZW5kQWxwaGEgPSB0aGlzLmJsZW5kQWxwaGE7CiAgICAgIGlmICh0aGlzLmRlcHRoRnVuYyAhPT0gTGVzc0VxdWFsRGVwdGgpCiAgICAgICAgZGF0YS5kZXB0aEZ1bmMgPSB0aGlzLmRlcHRoRnVuYzsKICAgICAgaWYgKHRoaXMuZGVwdGhUZXN0ID09PSBmYWxzZSkKICAgICAgICBkYXRhLmRlcHRoVGVzdCA9IHRoaXMuZGVwdGhUZXN0OwogICAgICBpZiAodGhpcy5kZXB0aFdyaXRlID09PSBmYWxzZSkKICAgICAgICBkYXRhLmRlcHRoV3JpdGUgPSB0aGlzLmRlcHRoV3JpdGU7CiAgICAgIGlmICh0aGlzLmNvbG9yV3JpdGUgPT09IGZhbHNlKQogICAgICAgIGRhdGEuY29sb3JXcml0ZSA9IHRoaXMuY29sb3JXcml0ZTsKICAgICAgaWYgKHRoaXMuc3RlbmNpbFdyaXRlTWFzayAhPT0gMjU1KQogICAgICAgIGRhdGEuc3RlbmNpbFdyaXRlTWFzayA9IHRoaXMuc3RlbmNpbFdyaXRlTWFzazsKICAgICAgaWYgKHRoaXMuc3RlbmNpbEZ1bmMgIT09IEFsd2F5c1N0ZW5jaWxGdW5jKQogICAgICAgIGRhdGEuc3RlbmNpbEZ1bmMgPSB0aGlzLnN0ZW5jaWxGdW5jOwogICAgICBpZiAodGhpcy5zdGVuY2lsUmVmICE9PSAwKQogICAgICAgIGRhdGEuc3RlbmNpbFJlZiA9IHRoaXMuc3RlbmNpbFJlZjsKICAgICAgaWYgKHRoaXMuc3RlbmNpbEZ1bmNNYXNrICE9PSAyNTUpCiAgICAgICAgZGF0YS5zdGVuY2lsRnVuY01hc2sgPSB0aGlzLnN0ZW5jaWxGdW5jTWFzazsKICAgICAgaWYgKHRoaXMuc3RlbmNpbEZhaWwgIT09IEtlZXBTdGVuY2lsT3ApCiAgICAgICAgZGF0YS5zdGVuY2lsRmFpbCA9IHRoaXMuc3RlbmNpbEZhaWw7CiAgICAgIGlmICh0aGlzLnN0ZW5jaWxaRmFpbCAhPT0gS2VlcFN0ZW5jaWxPcCkKICAgICAgICBkYXRhLnN0ZW5jaWxaRmFpbCA9IHRoaXMuc3RlbmNpbFpGYWlsOwogICAgICBpZiAodGhpcy5zdGVuY2lsWlBhc3MgIT09IEtlZXBTdGVuY2lsT3ApCiAgICAgICAgZGF0YS5zdGVuY2lsWlBhc3MgPSB0aGlzLnN0ZW5jaWxaUGFzczsKICAgICAgaWYgKHRoaXMuc3RlbmNpbFdyaXRlID09PSB0cnVlKQogICAgICAgIGRhdGEuc3RlbmNpbFdyaXRlID0gdGhpcy5zdGVuY2lsV3JpdGU7CiAgICAgIGlmICh0aGlzLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yb3RhdGlvbiAhPT0gMCkKICAgICAgICBkYXRhLnJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjsKICAgICAgaWYgKHRoaXMucG9seWdvbk9mZnNldCA9PT0gdHJ1ZSkKICAgICAgICBkYXRhLnBvbHlnb25PZmZzZXQgPSB0cnVlOwogICAgICBpZiAodGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yICE9PSAwKQogICAgICAgIGRhdGEucG9seWdvbk9mZnNldEZhY3RvciA9IHRoaXMucG9seWdvbk9mZnNldEZhY3RvcjsKICAgICAgaWYgKHRoaXMucG9seWdvbk9mZnNldFVuaXRzICE9PSAwKQogICAgICAgIGRhdGEucG9seWdvbk9mZnNldFVuaXRzID0gdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM7CiAgICAgIGlmICh0aGlzLmxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICYmIHRoaXMubGluZXdpZHRoICE9PSAxKQogICAgICAgIGRhdGEubGluZXdpZHRoID0gdGhpcy5saW5ld2lkdGg7CiAgICAgIGlmICh0aGlzLmRhc2hTaXplICE9PSB1bmRlZmluZWQpCiAgICAgICAgZGF0YS5kYXNoU2l6ZSA9IHRoaXMuZGFzaFNpemU7CiAgICAgIGlmICh0aGlzLmdhcFNpemUgIT09IHVuZGVmaW5lZCkKICAgICAgICBkYXRhLmdhcFNpemUgPSB0aGlzLmdhcFNpemU7CiAgICAgIGlmICh0aGlzLnNjYWxlICE9PSB1bmRlZmluZWQpCiAgICAgICAgZGF0YS5zY2FsZSA9IHRoaXMuc2NhbGU7CiAgICAgIGlmICh0aGlzLmRpdGhlcmluZyA9PT0gdHJ1ZSkKICAgICAgICBkYXRhLmRpdGhlcmluZyA9IHRydWU7CiAgICAgIGlmICh0aGlzLmFscGhhVGVzdCA+IDApCiAgICAgICAgZGF0YS5hbHBoYVRlc3QgPSB0aGlzLmFscGhhVGVzdDsKICAgICAgaWYgKHRoaXMuYWxwaGFIYXNoID09PSB0cnVlKQogICAgICAgIGRhdGEuYWxwaGFIYXNoID0gdHJ1ZTsKICAgICAgaWYgKHRoaXMuYWxwaGFUb0NvdmVyYWdlID09PSB0cnVlKQogICAgICAgIGRhdGEuYWxwaGFUb0NvdmVyYWdlID0gdHJ1ZTsKICAgICAgaWYgKHRoaXMucHJlbXVsdGlwbGllZEFscGhhID09PSB0cnVlKQogICAgICAgIGRhdGEucHJlbXVsdGlwbGllZEFscGhhID0gdHJ1ZTsKICAgICAgaWYgKHRoaXMuZm9yY2VTaW5nbGVQYXNzID09PSB0cnVlKQogICAgICAgIGRhdGEuZm9yY2VTaW5nbGVQYXNzID0gdHJ1ZTsKICAgICAgaWYgKHRoaXMud2lyZWZyYW1lID09PSB0cnVlKQogICAgICAgIGRhdGEud2lyZWZyYW1lID0gdHJ1ZTsKICAgICAgaWYgKHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID4gMSkKICAgICAgICBkYXRhLndpcmVmcmFtZUxpbmV3aWR0aCA9IHRoaXMud2lyZWZyYW1lTGluZXdpZHRoOwogICAgICBpZiAodGhpcy53aXJlZnJhbWVMaW5lY2FwICE9PSAicm91bmQiKQogICAgICAgIGRhdGEud2lyZWZyYW1lTGluZWNhcCA9IHRoaXMud2lyZWZyYW1lTGluZWNhcDsKICAgICAgaWYgKHRoaXMud2lyZWZyYW1lTGluZWpvaW4gIT09ICJyb3VuZCIpCiAgICAgICAgZGF0YS53aXJlZnJhbWVMaW5lam9pbiA9IHRoaXMud2lyZWZyYW1lTGluZWpvaW47CiAgICAgIGlmICh0aGlzLmZsYXRTaGFkaW5nID09PSB0cnVlKQogICAgICAgIGRhdGEuZmxhdFNoYWRpbmcgPSB0cnVlOwogICAgICBpZiAodGhpcy52aXNpYmxlID09PSBmYWxzZSkKICAgICAgICBkYXRhLnZpc2libGUgPSBmYWxzZTsKICAgICAgaWYgKHRoaXMudG9uZU1hcHBlZCA9PT0gZmFsc2UpCiAgICAgICAgZGF0YS50b25lTWFwcGVkID0gZmFsc2U7CiAgICAgIGlmICh0aGlzLmZvZyA9PT0gZmFsc2UpCiAgICAgICAgZGF0YS5mb2cgPSBmYWxzZTsKICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aCA+IDApCiAgICAgICAgZGF0YS51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7CiAgICAgIGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoY2FjaGUpIHsKICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjYWNoZSkgewogICAgICAgICAgY29uc3QgZGF0YTIgPSBjYWNoZVtrZXldOwogICAgICAgICAgZGVsZXRlIGRhdGEyLm1ldGFkYXRhOwogICAgICAgICAgdmFsdWVzLnB1c2goZGF0YTIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICB9CiAgICAgIGlmIChpc1Jvb3RPYmplY3QpIHsKICAgICAgICBjb25zdCB0ZXh0dXJlcyA9IGV4dHJhY3RGcm9tQ2FjaGUobWV0YS50ZXh0dXJlcyk7CiAgICAgICAgY29uc3QgaW1hZ2VzID0gZXh0cmFjdEZyb21DYWNoZShtZXRhLmltYWdlcyk7CiAgICAgICAgaWYgKHRleHR1cmVzLmxlbmd0aCA+IDApCiAgICAgICAgICBkYXRhLnRleHR1cmVzID0gdGV4dHVyZXM7CiAgICAgICAgaWYgKGltYWdlcy5sZW5ndGggPiAwKQogICAgICAgICAgZGF0YS5pbWFnZXMgPSBpbWFnZXM7CiAgICAgIH0KICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBjbG9uZSgpIHsKICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKTsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lOwogICAgICB0aGlzLmJsZW5kaW5nID0gc291cmNlLmJsZW5kaW5nOwogICAgICB0aGlzLnNpZGUgPSBzb3VyY2Uuc2lkZTsKICAgICAgdGhpcy52ZXJ0ZXhDb2xvcnMgPSBzb3VyY2UudmVydGV4Q29sb3JzOwogICAgICB0aGlzLm9wYWNpdHkgPSBzb3VyY2Uub3BhY2l0eTsKICAgICAgdGhpcy50cmFuc3BhcmVudCA9IHNvdXJjZS50cmFuc3BhcmVudDsKICAgICAgdGhpcy5ibGVuZFNyYyA9IHNvdXJjZS5ibGVuZFNyYzsKICAgICAgdGhpcy5ibGVuZERzdCA9IHNvdXJjZS5ibGVuZERzdDsKICAgICAgdGhpcy5ibGVuZEVxdWF0aW9uID0gc291cmNlLmJsZW5kRXF1YXRpb247CiAgICAgIHRoaXMuYmxlbmRTcmNBbHBoYSA9IHNvdXJjZS5ibGVuZFNyY0FscGhhOwogICAgICB0aGlzLmJsZW5kRHN0QWxwaGEgPSBzb3VyY2UuYmxlbmREc3RBbHBoYTsKICAgICAgdGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEgPSBzb3VyY2UuYmxlbmRFcXVhdGlvbkFscGhhOwogICAgICB0aGlzLmJsZW5kQ29sb3IuY29weShzb3VyY2UuYmxlbmRDb2xvcik7CiAgICAgIHRoaXMuYmxlbmRBbHBoYSA9IHNvdXJjZS5ibGVuZEFscGhhOwogICAgICB0aGlzLmRlcHRoRnVuYyA9IHNvdXJjZS5kZXB0aEZ1bmM7CiAgICAgIHRoaXMuZGVwdGhUZXN0ID0gc291cmNlLmRlcHRoVGVzdDsKICAgICAgdGhpcy5kZXB0aFdyaXRlID0gc291cmNlLmRlcHRoV3JpdGU7CiAgICAgIHRoaXMuc3RlbmNpbFdyaXRlTWFzayA9IHNvdXJjZS5zdGVuY2lsV3JpdGVNYXNrOwogICAgICB0aGlzLnN0ZW5jaWxGdW5jID0gc291cmNlLnN0ZW5jaWxGdW5jOwogICAgICB0aGlzLnN0ZW5jaWxSZWYgPSBzb3VyY2Uuc3RlbmNpbFJlZjsKICAgICAgdGhpcy5zdGVuY2lsRnVuY01hc2sgPSBzb3VyY2Uuc3RlbmNpbEZ1bmNNYXNrOwogICAgICB0aGlzLnN0ZW5jaWxGYWlsID0gc291cmNlLnN0ZW5jaWxGYWlsOwogICAgICB0aGlzLnN0ZW5jaWxaRmFpbCA9IHNvdXJjZS5zdGVuY2lsWkZhaWw7CiAgICAgIHRoaXMuc3RlbmNpbFpQYXNzID0gc291cmNlLnN0ZW5jaWxaUGFzczsKICAgICAgdGhpcy5zdGVuY2lsV3JpdGUgPSBzb3VyY2Uuc3RlbmNpbFdyaXRlOwogICAgICBjb25zdCBzcmNQbGFuZXMgPSBzb3VyY2UuY2xpcHBpbmdQbGFuZXM7CiAgICAgIGxldCBkc3RQbGFuZXMgPSBudWxsOwogICAgICBpZiAoc3JjUGxhbmVzICE9PSBudWxsKSB7CiAgICAgICAgY29uc3QgbiA9IHNyY1BsYW5lcy5sZW5ndGg7CiAgICAgICAgZHN0UGxhbmVzID0gbmV3IEFycmF5KG4pOwogICAgICAgIGZvciAobGV0IGkgPSAwO2kgIT09IG47ICsraSkgewogICAgICAgICAgZHN0UGxhbmVzW2ldID0gc3JjUGxhbmVzW2ldLmNsb25lKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBkc3RQbGFuZXM7CiAgICAgIHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IHNvdXJjZS5jbGlwSW50ZXJzZWN0aW9uOwogICAgICB0aGlzLmNsaXBTaGFkb3dzID0gc291cmNlLmNsaXBTaGFkb3dzOwogICAgICB0aGlzLnNoYWRvd1NpZGUgPSBzb3VyY2Uuc2hhZG93U2lkZTsKICAgICAgdGhpcy5jb2xvcldyaXRlID0gc291cmNlLmNvbG9yV3JpdGU7CiAgICAgIHRoaXMucHJlY2lzaW9uID0gc291cmNlLnByZWNpc2lvbjsKICAgICAgdGhpcy5wb2x5Z29uT2Zmc2V0ID0gc291cmNlLnBvbHlnb25PZmZzZXQ7CiAgICAgIHRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0RmFjdG9yOwogICAgICB0aGlzLnBvbHlnb25PZmZzZXRVbml0cyA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0VW5pdHM7CiAgICAgIHRoaXMuZGl0aGVyaW5nID0gc291cmNlLmRpdGhlcmluZzsKICAgICAgdGhpcy5hbHBoYVRlc3QgPSBzb3VyY2UuYWxwaGFUZXN0OwogICAgICB0aGlzLmFscGhhSGFzaCA9IHNvdXJjZS5hbHBoYUhhc2g7CiAgICAgIHRoaXMuYWxwaGFUb0NvdmVyYWdlID0gc291cmNlLmFscGhhVG9Db3ZlcmFnZTsKICAgICAgdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSBzb3VyY2UucHJlbXVsdGlwbGllZEFscGhhOwogICAgICB0aGlzLmZvcmNlU2luZ2xlUGFzcyA9IHNvdXJjZS5mb3JjZVNpbmdsZVBhc3M7CiAgICAgIHRoaXMudmlzaWJsZSA9IHNvdXJjZS52aXNpYmxlOwogICAgICB0aGlzLnRvbmVNYXBwZWQgPSBzb3VyY2UudG9uZU1hcHBlZDsKICAgICAgdGhpcy51c2VyRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc291cmNlLnVzZXJEYXRhKSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHsgdHlwZTogImRpc3Bvc2UiIH0pOwogICAgfQogICAgc2V0IG5lZWRzVXBkYXRlKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkKICAgICAgICB0aGlzLnZlcnNpb24rKzsKICAgIH0KICAgIG9uQnVpbGQoKSB7CiAgICAgIGNvbnNvbGUud2FybigiTWF0ZXJpYWw6IG9uQnVpbGQoKSBoYXMgYmVlbiByZW1vdmVkLiIpOwogICAgfQogIH07CiAgTWVzaEJhc2ljTWF0ZXJpYWwgPSBjbGFzcyBNZXNoQmFzaWNNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHsKICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5pc01lc2hCYXNpY01hdGVyaWFsID0gdHJ1ZTsKICAgICAgdGhpcy50eXBlID0gIk1lc2hCYXNpY01hdGVyaWFsIjsKICAgICAgdGhpcy5jb2xvciA9IG5ldyBDb2xvcigxNjc3NzIxNSk7CiAgICAgIHRoaXMubWFwID0gbnVsbDsKICAgICAgdGhpcy5saWdodE1hcCA9IG51bGw7CiAgICAgIHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxOwogICAgICB0aGlzLmFvTWFwID0gbnVsbDsKICAgICAgdGhpcy5hb01hcEludGVuc2l0eSA9IDE7CiAgICAgIHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsOwogICAgICB0aGlzLmFscGhhTWFwID0gbnVsbDsKICAgICAgdGhpcy5lbnZNYXAgPSBudWxsOwogICAgICB0aGlzLmVudk1hcFJvdGF0aW9uID0gbmV3IEV1bGVyOwogICAgICB0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjsKICAgICAgdGhpcy5yZWZsZWN0aXZpdHkgPSAxOwogICAgICB0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7CiAgICAgIHRoaXMud2lyZWZyYW1lID0gZmFsc2U7CiAgICAgIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTsKICAgICAgdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gInJvdW5kIjsKICAgICAgdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICJyb3VuZCI7CiAgICAgIHRoaXMuZm9nID0gdHJ1ZTsKICAgICAgdGhpcy5zZXRWYWx1ZXMocGFyYW1ldGVycyk7CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMuY29sb3IuY29weShzb3VyY2UuY29sb3IpOwogICAgICB0aGlzLm1hcCA9IHNvdXJjZS5tYXA7CiAgICAgIHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7CiAgICAgIHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7CiAgICAgIHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7CiAgICAgIHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7CiAgICAgIHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7CiAgICAgIHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7CiAgICAgIHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDsKICAgICAgdGhpcy5lbnZNYXBSb3RhdGlvbi5jb3B5KHNvdXJjZS5lbnZNYXBSb3RhdGlvbik7CiAgICAgIHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lOwogICAgICB0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7CiAgICAgIHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbzsKICAgICAgdGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lOwogICAgICB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CiAgICAgIHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwOwogICAgICB0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luOwogICAgICB0aGlzLmZvZyA9IHNvdXJjZS5mb2c7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH07CiAgX3RhYmxlcyA9IC8qIEBfX1BVUkVfXyAqLyBfZ2VuZXJhdGVUYWJsZXMoKTsKICBEYXRhVXRpbHMgPSB7CiAgICB0b0hhbGZGbG9hdCwKICAgIGZyb21IYWxmRmxvYXQKICB9OwogIF92ZWN0b3IkOSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfdmVjdG9yMiQxID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IyOwogIEludDhCdWZmZXJBdHRyaWJ1dGUgPSBjbGFzcyBJbnQ4QnVmZmVyQXR0cmlidXRlIGV4dGVuZHMgQnVmZmVyQXR0cmlidXRlIHsKICAgIGNvbnN0cnVjdG9yKGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCkgewogICAgICBzdXBlcihuZXcgSW50OEFycmF5KGFycmF5KSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQpOwogICAgfQogIH07CiAgVWludDhCdWZmZXJBdHRyaWJ1dGUgPSBjbGFzcyBVaW50OEJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEJ1ZmZlckF0dHJpYnV0ZSB7CiAgICBjb25zdHJ1Y3RvcihhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQpIHsKICAgICAgc3VwZXIobmV3IFVpbnQ4QXJyYXkoYXJyYXkpLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCk7CiAgICB9CiAgfTsKICBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUgPSBjbGFzcyBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUgZXh0ZW5kcyBCdWZmZXJBdHRyaWJ1dGUgewogICAgY29uc3RydWN0b3IoYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkKSB7CiAgICAgIHN1cGVyKG5ldyBVaW50OENsYW1wZWRBcnJheShhcnJheSksIGl0ZW1TaXplLCBub3JtYWxpemVkKTsKICAgIH0KICB9OwogIEludDE2QnVmZmVyQXR0cmlidXRlID0gY2xhc3MgSW50MTZCdWZmZXJBdHRyaWJ1dGUgZXh0ZW5kcyBCdWZmZXJBdHRyaWJ1dGUgewogICAgY29uc3RydWN0b3IoYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkKSB7CiAgICAgIHN1cGVyKG5ldyBJbnQxNkFycmF5KGFycmF5KSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQpOwogICAgfQogIH07CiAgVWludDE2QnVmZmVyQXR0cmlidXRlID0gY2xhc3MgVWludDE2QnVmZmVyQXR0cmlidXRlIGV4dGVuZHMgQnVmZmVyQXR0cmlidXRlIHsKICAgIGNvbnN0cnVjdG9yKGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCkgewogICAgICBzdXBlcihuZXcgVWludDE2QXJyYXkoYXJyYXkpLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCk7CiAgICB9CiAgfTsKICBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSA9IGNsYXNzIEludDMyQnVmZmVyQXR0cmlidXRlIGV4dGVuZHMgQnVmZmVyQXR0cmlidXRlIHsKICAgIGNvbnN0cnVjdG9yKGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCkgewogICAgICBzdXBlcihuZXcgSW50MzJBcnJheShhcnJheSksIGl0ZW1TaXplLCBub3JtYWxpemVkKTsKICAgIH0KICB9OwogIFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSA9IGNsYXNzIFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSBleHRlbmRzIEJ1ZmZlckF0dHJpYnV0ZSB7CiAgICBjb25zdHJ1Y3RvcihhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQpIHsKICAgICAgc3VwZXIobmV3IFVpbnQzMkFycmF5KGFycmF5KSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQpOwogICAgfQogIH07CiAgRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSA9IGNsYXNzIEZsb2F0MTZCdWZmZXJBdHRyaWJ1dGUgZXh0ZW5kcyBCdWZmZXJBdHRyaWJ1dGUgewogICAgY29uc3RydWN0b3IoYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkKSB7CiAgICAgIHN1cGVyKG5ldyBVaW50MTZBcnJheShhcnJheSksIGl0ZW1TaXplLCBub3JtYWxpemVkKTsKICAgICAgdGhpcy5pc0Zsb2F0MTZCdWZmZXJBdHRyaWJ1dGUgPSB0cnVlOwogICAgfQogICAgZ2V0WChpbmRleCkgewogICAgICBsZXQgeCA9IGZyb21IYWxmRmxvYXQodGhpcy5hcnJheVtpbmRleCAqIHRoaXMuaXRlbVNpemVdKTsKICAgICAgaWYgKHRoaXMubm9ybWFsaXplZCkKICAgICAgICB4ID0gZGVub3JtYWxpemUoeCwgdGhpcy5hcnJheSk7CiAgICAgIHJldHVybiB4OwogICAgfQogICAgc2V0WChpbmRleCwgeCkgewogICAgICBpZiAodGhpcy5ub3JtYWxpemVkKQogICAgICAgIHggPSBub3JtYWxpemUoeCwgdGhpcy5hcnJheSk7CiAgICAgIHRoaXMuYXJyYXlbaW5kZXggKiB0aGlzLml0ZW1TaXplXSA9IHRvSGFsZkZsb2F0KHgpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldFkoaW5kZXgpIHsKICAgICAgbGV0IHkgPSBmcm9tSGFsZkZsb2F0KHRoaXMuYXJyYXlbaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMV0pOwogICAgICBpZiAodGhpcy5ub3JtYWxpemVkKQogICAgICAgIHkgPSBkZW5vcm1hbGl6ZSh5LCB0aGlzLmFycmF5KTsKICAgICAgcmV0dXJuIHk7CiAgICB9CiAgICBzZXRZKGluZGV4LCB5KSB7CiAgICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpCiAgICAgICAgeSA9IG5vcm1hbGl6ZSh5LCB0aGlzLmFycmF5KTsKICAgICAgdGhpcy5hcnJheVtpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAxXSA9IHRvSGFsZkZsb2F0KHkpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldFooaW5kZXgpIHsKICAgICAgbGV0IHogPSBmcm9tSGFsZkZsb2F0KHRoaXMuYXJyYXlbaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMl0pOwogICAgICBpZiAodGhpcy5ub3JtYWxpemVkKQogICAgICAgIHogPSBkZW5vcm1hbGl6ZSh6LCB0aGlzLmFycmF5KTsKICAgICAgcmV0dXJuIHo7CiAgICB9CiAgICBzZXRaKGluZGV4LCB6KSB7CiAgICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpCiAgICAgICAgeiA9IG5vcm1hbGl6ZSh6LCB0aGlzLmFycmF5KTsKICAgICAgdGhpcy5hcnJheVtpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAyXSA9IHRvSGFsZkZsb2F0KHopOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldFcoaW5kZXgpIHsKICAgICAgbGV0IHcgPSBmcm9tSGFsZkZsb2F0KHRoaXMuYXJyYXlbaW5kZXggKiB0aGlzLml0ZW1TaXplICsgM10pOwogICAgICBpZiAodGhpcy5ub3JtYWxpemVkKQogICAgICAgIHcgPSBkZW5vcm1hbGl6ZSh3LCB0aGlzLmFycmF5KTsKICAgICAgcmV0dXJuIHc7CiAgICB9CiAgICBzZXRXKGluZGV4LCB3KSB7CiAgICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpCiAgICAgICAgdyA9IG5vcm1hbGl6ZSh3LCB0aGlzLmFycmF5KTsKICAgICAgdGhpcy5hcnJheVtpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAzXSA9IHRvSGFsZkZsb2F0KHcpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldFhZKGluZGV4LCB4LCB5KSB7CiAgICAgIGluZGV4ICo9IHRoaXMuaXRlbVNpemU7CiAgICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpIHsKICAgICAgICB4ID0gbm9ybWFsaXplKHgsIHRoaXMuYXJyYXkpOwogICAgICAgIHkgPSBub3JtYWxpemUoeSwgdGhpcy5hcnJheSk7CiAgICAgIH0KICAgICAgdGhpcy5hcnJheVtpbmRleCArIDBdID0gdG9IYWxmRmxvYXQoeCk7CiAgICAgIHRoaXMuYXJyYXlbaW5kZXggKyAxXSA9IHRvSGFsZkZsb2F0KHkpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldFhZWihpbmRleCwgeCwgeSwgeikgewogICAgICBpbmRleCAqPSB0aGlzLml0ZW1TaXplOwogICAgICBpZiAodGhpcy5ub3JtYWxpemVkKSB7CiAgICAgICAgeCA9IG5vcm1hbGl6ZSh4LCB0aGlzLmFycmF5KTsKICAgICAgICB5ID0gbm9ybWFsaXplKHksIHRoaXMuYXJyYXkpOwogICAgICAgIHogPSBub3JtYWxpemUoeiwgdGhpcy5hcnJheSk7CiAgICAgIH0KICAgICAgdGhpcy5hcnJheVtpbmRleCArIDBdID0gdG9IYWxmRmxvYXQoeCk7CiAgICAgIHRoaXMuYXJyYXlbaW5kZXggKyAxXSA9IHRvSGFsZkZsb2F0KHkpOwogICAgICB0aGlzLmFycmF5W2luZGV4ICsgMl0gPSB0b0hhbGZGbG9hdCh6KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRYWVpXKGluZGV4LCB4LCB5LCB6LCB3KSB7CiAgICAgIGluZGV4ICo9IHRoaXMuaXRlbVNpemU7CiAgICAgIGlmICh0aGlzLm5vcm1hbGl6ZWQpIHsKICAgICAgICB4ID0gbm9ybWFsaXplKHgsIHRoaXMuYXJyYXkpOwogICAgICAgIHkgPSBub3JtYWxpemUoeSwgdGhpcy5hcnJheSk7CiAgICAgICAgeiA9IG5vcm1hbGl6ZSh6LCB0aGlzLmFycmF5KTsKICAgICAgICB3ID0gbm9ybWFsaXplKHcsIHRoaXMuYXJyYXkpOwogICAgICB9CiAgICAgIHRoaXMuYXJyYXlbaW5kZXggKyAwXSA9IHRvSGFsZkZsb2F0KHgpOwogICAgICB0aGlzLmFycmF5W2luZGV4ICsgMV0gPSB0b0hhbGZGbG9hdCh5KTsKICAgICAgdGhpcy5hcnJheVtpbmRleCArIDJdID0gdG9IYWxmRmxvYXQoeik7CiAgICAgIHRoaXMuYXJyYXlbaW5kZXggKyAzXSA9IHRvSGFsZkZsb2F0KHcpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUgPSBjbGFzcyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlIGV4dGVuZHMgQnVmZmVyQXR0cmlidXRlIHsKICAgIGNvbnN0cnVjdG9yKGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCkgewogICAgICBzdXBlcihuZXcgRmxvYXQzMkFycmF5KGFycmF5KSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQpOwogICAgfQogIH07CiAgX20xID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXg0OwogIF9vYmogPSAvKiBAX19QVVJFX18gKi8gbmV3IE9iamVjdDNEOwogIF9vZmZzZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX2JveCQyID0gLyogQF9fUFVSRV9fICovIG5ldyBCb3gzOwogIF9ib3hNb3JwaFRhcmdldHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IEJveDM7CiAgX3ZlY3RvciQ4ID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIEJ1ZmZlckdlb21ldHJ5ID0gY2xhc3MgQnVmZmVyR2VvbWV0cnkgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNCdWZmZXJHZW9tZXRyeSA9IHRydWU7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiaWQiLCB7IHZhbHVlOiBfaWQkMSsrIH0pOwogICAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTsKICAgICAgdGhpcy5uYW1lID0gIiI7CiAgICAgIHRoaXMudHlwZSA9ICJCdWZmZXJHZW9tZXRyeSI7CiAgICAgIHRoaXMuaW5kZXggPSBudWxsOwogICAgICB0aGlzLmluZGlyZWN0ID0gbnVsbDsKICAgICAgdGhpcy5hdHRyaWJ1dGVzID0ge307CiAgICAgIHRoaXMubW9ycGhBdHRyaWJ1dGVzID0ge307CiAgICAgIHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmUgPSBmYWxzZTsKICAgICAgdGhpcy5ncm91cHMgPSBbXTsKICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IG51bGw7CiAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsOwogICAgICB0aGlzLmRyYXdSYW5nZSA9IHsgc3RhcnQ6IDAsIGNvdW50OiBJbmZpbml0eSB9OwogICAgICB0aGlzLnVzZXJEYXRhID0ge307CiAgICB9CiAgICBnZXRJbmRleCgpIHsKICAgICAgcmV0dXJuIHRoaXMuaW5kZXg7CiAgICB9CiAgICBzZXRJbmRleChpbmRleCkgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShpbmRleCkpIHsKICAgICAgICB0aGlzLmluZGV4ID0gbmV3ICgoYXJyYXlOZWVkc1VpbnQzMihpbmRleCkpID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlKShpbmRleCwgMSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0SW5kaXJlY3QoaW5kaXJlY3QpIHsKICAgICAgdGhpcy5pbmRpcmVjdCA9IGluZGlyZWN0OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldEluZGlyZWN0KCkgewogICAgICByZXR1cm4gdGhpcy5pbmRpcmVjdDsKICAgIH0KICAgIGdldEF0dHJpYnV0ZShuYW1lKSB7CiAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbbmFtZV07CiAgICB9CiAgICBzZXRBdHRyaWJ1dGUobmFtZSwgYXR0cmlidXRlKSB7CiAgICAgIHRoaXMuYXR0cmlidXRlc1tuYW1lXSA9IGF0dHJpYnV0ZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBkZWxldGVBdHRyaWJ1dGUobmFtZSkgewogICAgICBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW25hbWVdOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGhhc0F0dHJpYnV0ZShuYW1lKSB7CiAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbbmFtZV0gIT09IHVuZGVmaW5lZDsKICAgIH0KICAgIGFkZEdyb3VwKHN0YXJ0LCBjb3VudCwgbWF0ZXJpYWxJbmRleCA9IDApIHsKICAgICAgdGhpcy5ncm91cHMucHVzaCh7CiAgICAgICAgc3RhcnQsCiAgICAgICAgY291bnQsCiAgICAgICAgbWF0ZXJpYWxJbmRleAogICAgICB9KTsKICAgIH0KICAgIGNsZWFyR3JvdXBzKCkgewogICAgICB0aGlzLmdyb3VwcyA9IFtdOwogICAgfQogICAgc2V0RHJhd1JhbmdlKHN0YXJ0LCBjb3VudCkgewogICAgICB0aGlzLmRyYXdSYW5nZS5zdGFydCA9IHN0YXJ0OwogICAgICB0aGlzLmRyYXdSYW5nZS5jb3VudCA9IGNvdW50OwogICAgfQogICAgYXBwbHlNYXRyaXg0KG1hdHJpeCkgewogICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjsKICAgICAgaWYgKHBvc2l0aW9uICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBwb3NpdGlvbi5hcHBseU1hdHJpeDQobWF0cml4KTsKICAgICAgICBwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgIH0KICAgICAgY29uc3Qgbm9ybWFsID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDsKICAgICAgaWYgKG5vcm1hbCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29uc3Qgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgobWF0cml4KTsKICAgICAgICBub3JtYWwuYXBwbHlOb3JtYWxNYXRyaXgobm9ybWFsTWF0cml4KTsKICAgICAgICBub3JtYWwubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICB9CiAgICAgIGNvbnN0IHRhbmdlbnQgPSB0aGlzLmF0dHJpYnV0ZXMudGFuZ2VudDsKICAgICAgaWYgKHRhbmdlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRhbmdlbnQudHJhbnNmb3JtRGlyZWN0aW9uKG1hdHJpeCk7CiAgICAgICAgdGFuZ2VudC5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwpIHsKICAgICAgICB0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGFwcGx5UXVhdGVybmlvbihxKSB7CiAgICAgIF9tMS5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihxKTsKICAgICAgdGhpcy5hcHBseU1hdHJpeDQoX20xKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByb3RhdGVYKGFuZ2xlKSB7CiAgICAgIF9tMS5tYWtlUm90YXRpb25YKGFuZ2xlKTsKICAgICAgdGhpcy5hcHBseU1hdHJpeDQoX20xKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByb3RhdGVZKGFuZ2xlKSB7CiAgICAgIF9tMS5tYWtlUm90YXRpb25ZKGFuZ2xlKTsKICAgICAgdGhpcy5hcHBseU1hdHJpeDQoX20xKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByb3RhdGVaKGFuZ2xlKSB7CiAgICAgIF9tMS5tYWtlUm90YXRpb25aKGFuZ2xlKTsKICAgICAgdGhpcy5hcHBseU1hdHJpeDQoX20xKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0cmFuc2xhdGUoeCwgeSwgeikgewogICAgICBfbTEubWFrZVRyYW5zbGF0aW9uKHgsIHksIHopOwogICAgICB0aGlzLmFwcGx5TWF0cml4NChfbTEpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNjYWxlKHgsIHksIHopIHsKICAgICAgX20xLm1ha2VTY2FsZSh4LCB5LCB6KTsKICAgICAgdGhpcy5hcHBseU1hdHJpeDQoX20xKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBsb29rQXQodmVjdG9yKSB7CiAgICAgIF9vYmoubG9va0F0KHZlY3Rvcik7CiAgICAgIF9vYmoudXBkYXRlTWF0cml4KCk7CiAgICAgIHRoaXMuYXBwbHlNYXRyaXg0KF9vYmoubWF0cml4KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjZW50ZXIoKSB7CiAgICAgIHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7CiAgICAgIHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKF9vZmZzZXQpLm5lZ2F0ZSgpOwogICAgICB0aGlzLnRyYW5zbGF0ZShfb2Zmc2V0LngsIF9vZmZzZXQueSwgX29mZnNldC56KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRGcm9tUG9pbnRzKHBvaW50cykgewogICAgICBjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpOwogICAgICBpZiAocG9zaXRpb25BdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbnN0IHBvc2l0aW9uID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzW2ldOwogICAgICAgICAgcG9zaXRpb24ucHVzaChwb2ludC54LCBwb2ludC55LCBwb2ludC56IHx8IDApOwogICAgICAgIH0KICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgMykpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGwgPSBNYXRoLm1pbihwb2ludHMubGVuZ3RoLCBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudCk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IGw7IGkrKykgewogICAgICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHNbaV07CiAgICAgICAgICBwb3NpdGlvbkF0dHJpYnV0ZS5zZXRYWVooaSwgcG9pbnQueCwgcG9pbnQueSwgcG9pbnQueiB8fCAwKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBvaW50cy5sZW5ndGggPiBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudCkgewogICAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogQnVmZmVyIHNpemUgdG9vIHNtYWxsIGZvciBwb2ludHMgZGF0YS4gVXNlIC5kaXNwb3NlKCkgYW5kIGNyZWF0ZSBhIG5ldyBnZW9tZXRyeS4iKTsKICAgICAgICB9CiAgICAgICAgcG9zaXRpb25BdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgY29tcHV0ZUJvdW5kaW5nQm94KCkgewogICAgICBpZiAodGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCkgewogICAgICAgIHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm94MzsKICAgICAgfQogICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjsKICAgICAgY29uc3QgbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24gPSB0aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjsKICAgICAgaWYgKHBvc2l0aW9uICYmIHBvc2l0aW9uLmlzR0xCdWZmZXJBdHRyaWJ1dGUpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgYm94LiIsIHRoaXMpOwogICAgICAgIHRoaXMuYm91bmRpbmdCb3guc2V0KG5ldyBWZWN0b3IzKC1JbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHkpLCBuZXcgVmVjdG9yMyhJbmZpbml0eSwgSW5maW5pdHksIEluZmluaXR5KSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChwb3NpdGlvbiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uKTsKICAgICAgICBpZiAobW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24pIHsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICAgICAgICBjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uW2ldOwogICAgICAgICAgICBfYm94JDIuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShtb3JwaEF0dHJpYnV0ZSk7CiAgICAgICAgICAgIGlmICh0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKSB7CiAgICAgICAgICAgICAgX3ZlY3RvciQ4LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5taW4sIF9ib3gkMi5taW4pOwogICAgICAgICAgICAgIHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChfdmVjdG9yJDgpOwogICAgICAgICAgICAgIF92ZWN0b3IkOC5hZGRWZWN0b3JzKHRoaXMuYm91bmRpbmdCb3gubWF4LCBfYm94JDIubWF4KTsKICAgICAgICAgICAgICB0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoX3ZlY3RvciQ4KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoX2JveCQyLm1pbik7CiAgICAgICAgICAgICAgdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KF9ib3gkMi5tYXgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7CiAgICAgIH0KICAgICAgaWYgKGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLngpIHx8IGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpIHx8IGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnopKSB7CiAgICAgICAgY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzKTsKICAgICAgfQogICAgfQogICAgY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCkgewogICAgICBpZiAodGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCkgewogICAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlOwogICAgICB9CiAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgICBjb25zdCBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbiA9IHRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgICBpZiAocG9zaXRpb24gJiYgcG9zaXRpb24uaXNHTEJ1ZmZlckF0dHJpYnV0ZSkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBzcGhlcmUuIiwgdGhpcyk7CiAgICAgICAgdGhpcy5ib3VuZGluZ1NwaGVyZS5zZXQobmV3IFZlY3RvcjMsIEluZmluaXR5KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHBvc2l0aW9uKSB7CiAgICAgICAgY29uc3QgY2VudGVyID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7CiAgICAgICAgX2JveCQyLnNldEZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb24pOwogICAgICAgIGlmIChtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbikgewogICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlsID0gbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24ubGVuZ3RoO2kgPCBpbDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb25baV07CiAgICAgICAgICAgIF9ib3hNb3JwaFRhcmdldHMuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShtb3JwaEF0dHJpYnV0ZSk7CiAgICAgICAgICAgIGlmICh0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKSB7CiAgICAgICAgICAgICAgX3ZlY3RvciQ4LmFkZFZlY3RvcnMoX2JveCQyLm1pbiwgX2JveE1vcnBoVGFyZ2V0cy5taW4pOwogICAgICAgICAgICAgIF9ib3gkMi5leHBhbmRCeVBvaW50KF92ZWN0b3IkOCk7CiAgICAgICAgICAgICAgX3ZlY3RvciQ4LmFkZFZlY3RvcnMoX2JveCQyLm1heCwgX2JveE1vcnBoVGFyZ2V0cy5tYXgpOwogICAgICAgICAgICAgIF9ib3gkMi5leHBhbmRCeVBvaW50KF92ZWN0b3IkOCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX2JveCQyLmV4cGFuZEJ5UG9pbnQoX2JveE1vcnBoVGFyZ2V0cy5taW4pOwogICAgICAgICAgICAgIF9ib3gkMi5leHBhbmRCeVBvaW50KF9ib3hNb3JwaFRhcmdldHMubWF4KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfYm94JDIuZ2V0Q2VudGVyKGNlbnRlcik7CiAgICAgICAgbGV0IG1heFJhZGl1c1NxID0gMDsKICAgICAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBwb3NpdGlvbi5jb3VudDtpIDwgaWw7IGkrKykgewogICAgICAgICAgX3ZlY3RvciQ4LmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb24sIGkpOwogICAgICAgICAgbWF4UmFkaXVzU3EgPSBNYXRoLm1heChtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKF92ZWN0b3IkOCkpOwogICAgICAgIH0KICAgICAgICBpZiAobW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24pIHsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICAgICAgICBjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uW2ldOwogICAgICAgICAgICBjb25zdCBtb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwLCBqbCA9IG1vcnBoQXR0cmlidXRlLmNvdW50O2ogPCBqbDsgaisrKSB7CiAgICAgICAgICAgICAgX3ZlY3RvciQ4LmZyb21CdWZmZXJBdHRyaWJ1dGUobW9ycGhBdHRyaWJ1dGUsIGopOwogICAgICAgICAgICAgIGlmIChtb3JwaFRhcmdldHNSZWxhdGl2ZSkgewogICAgICAgICAgICAgICAgX29mZnNldC5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBqKTsKICAgICAgICAgICAgICAgIF92ZWN0b3IkOC5hZGQoX29mZnNldCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG1heFJhZGl1c1NxID0gTWF0aC5tYXgobWF4UmFkaXVzU3EsIGNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZChfdmVjdG9yJDgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cyA9IE1hdGguc3FydChtYXhSYWRpdXNTcSk7CiAgICAgICAgaWYgKGlzTmFOKHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzKSkgewogICAgICAgICAgY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsIHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29tcHV0ZVRhbmdlbnRzKCkgewogICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXg7CiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7CiAgICAgIGlmIChpbmRleCA9PT0gbnVsbCB8fCBhdHRyaWJ1dGVzLnBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgYXR0cmlidXRlcy5ub3JtYWwgPT09IHVuZGVmaW5lZCB8fCBhdHRyaWJ1dGVzLnV2ID09PSB1bmRlZmluZWQpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGZhaWxlZC4gTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzIChpbmRleCwgcG9zaXRpb24sIG5vcm1hbCBvciB1dikiKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgICBjb25zdCBub3JtYWxBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5vcm1hbDsKICAgICAgY29uc3QgdXZBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLnV2OwogICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoInRhbmdlbnQiKSA9PT0gZmFsc2UpIHsKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgidGFuZ2VudCIsIG5ldyBCdWZmZXJBdHRyaWJ1dGUobmV3IEZsb2F0MzJBcnJheSg0ICogcG9zaXRpb25BdHRyaWJ1dGUuY291bnQpLCA0KSk7CiAgICAgIH0KICAgICAgY29uc3QgdGFuZ2VudEF0dHJpYnV0ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCJ0YW5nZW50Iik7CiAgICAgIGNvbnN0IHRhbjEgPSBbXSwgdGFuMiA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMDtpIDwgcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkrKykgewogICAgICAgIHRhbjFbaV0gPSBuZXcgVmVjdG9yMzsKICAgICAgICB0YW4yW2ldID0gbmV3IFZlY3RvcjM7CiAgICAgIH0KICAgICAgY29uc3QgdkEgPSBuZXcgVmVjdG9yMywgdkIgPSBuZXcgVmVjdG9yMywgdkMgPSBuZXcgVmVjdG9yMywgdXZBID0gbmV3IFZlY3RvcjIsIHV2QiA9IG5ldyBWZWN0b3IyLCB1dkMgPSBuZXcgVmVjdG9yMiwgc2RpciA9IG5ldyBWZWN0b3IzLCB0ZGlyID0gbmV3IFZlY3RvcjM7CiAgICAgIGZ1bmN0aW9uIGhhbmRsZVRyaWFuZ2xlKGEsIGIsIGMpIHsKICAgICAgICB2QS5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uQXR0cmlidXRlLCBhKTsKICAgICAgICB2Qi5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uQXR0cmlidXRlLCBiKTsKICAgICAgICB2Qy5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uQXR0cmlidXRlLCBjKTsKICAgICAgICB1dkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1dkF0dHJpYnV0ZSwgYSk7CiAgICAgICAgdXZCLmZyb21CdWZmZXJBdHRyaWJ1dGUodXZBdHRyaWJ1dGUsIGIpOwogICAgICAgIHV2Qy5mcm9tQnVmZmVyQXR0cmlidXRlKHV2QXR0cmlidXRlLCBjKTsKICAgICAgICB2Qi5zdWIodkEpOwogICAgICAgIHZDLnN1Yih2QSk7CiAgICAgICAgdXZCLnN1Yih1dkEpOwogICAgICAgIHV2Qy5zdWIodXZBKTsKICAgICAgICBjb25zdCByID0gMSAvICh1dkIueCAqIHV2Qy55IC0gdXZDLnggKiB1dkIueSk7CiAgICAgICAgaWYgKCFpc0Zpbml0ZShyKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBzZGlyLmNvcHkodkIpLm11bHRpcGx5U2NhbGFyKHV2Qy55KS5hZGRTY2FsZWRWZWN0b3IodkMsIC11dkIueSkubXVsdGlwbHlTY2FsYXIocik7CiAgICAgICAgdGRpci5jb3B5KHZDKS5tdWx0aXBseVNjYWxhcih1dkIueCkuYWRkU2NhbGVkVmVjdG9yKHZCLCAtdXZDLngpLm11bHRpcGx5U2NhbGFyKHIpOwogICAgICAgIHRhbjFbYV0uYWRkKHNkaXIpOwogICAgICAgIHRhbjFbYl0uYWRkKHNkaXIpOwogICAgICAgIHRhbjFbY10uYWRkKHNkaXIpOwogICAgICAgIHRhbjJbYV0uYWRkKHRkaXIpOwogICAgICAgIHRhbjJbYl0uYWRkKHRkaXIpOwogICAgICAgIHRhbjJbY10uYWRkKHRkaXIpOwogICAgICB9CiAgICAgIGxldCBncm91cHMgPSB0aGlzLmdyb3VwczsKICAgICAgaWYgKGdyb3Vwcy5sZW5ndGggPT09IDApIHsKICAgICAgICBncm91cHMgPSBbewogICAgICAgICAgc3RhcnQ6IDAsCiAgICAgICAgICBjb3VudDogaW5kZXguY291bnQKICAgICAgICB9XTsKICAgICAgfQogICAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBncm91cHMubGVuZ3RoO2kgPCBpbDsgKytpKSB7CiAgICAgICAgY29uc3QgZ3JvdXAgPSBncm91cHNbaV07CiAgICAgICAgY29uc3Qgc3RhcnQgPSBncm91cC5zdGFydDsKICAgICAgICBjb25zdCBjb3VudCA9IGdyb3VwLmNvdW50OwogICAgICAgIGZvciAobGV0IGogPSBzdGFydCwgamwgPSBzdGFydCArIGNvdW50O2ogPCBqbDsgaiArPSAzKSB7CiAgICAgICAgICBoYW5kbGVUcmlhbmdsZShpbmRleC5nZXRYKGogKyAwKSwgaW5kZXguZ2V0WChqICsgMSksIGluZGV4LmdldFgoaiArIDIpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgdG1wID0gbmV3IFZlY3RvcjMsIHRtcDIgPSBuZXcgVmVjdG9yMzsKICAgICAgY29uc3QgbiA9IG5ldyBWZWN0b3IzLCBuMiA9IG5ldyBWZWN0b3IzOwogICAgICBmdW5jdGlvbiBoYW5kbGVWZXJ0ZXgodikgewogICAgICAgIG4uZnJvbUJ1ZmZlckF0dHJpYnV0ZShub3JtYWxBdHRyaWJ1dGUsIHYpOwogICAgICAgIG4yLmNvcHkobik7CiAgICAgICAgY29uc3QgdCA9IHRhbjFbdl07CiAgICAgICAgdG1wLmNvcHkodCk7CiAgICAgICAgdG1wLnN1YihuLm11bHRpcGx5U2NhbGFyKG4uZG90KHQpKSkubm9ybWFsaXplKCk7CiAgICAgICAgdG1wMi5jcm9zc1ZlY3RvcnMobjIsIHQpOwogICAgICAgIGNvbnN0IHRlc3QgPSB0bXAyLmRvdCh0YW4yW3ZdKTsKICAgICAgICBjb25zdCB3ID0gdGVzdCA8IDAgPyAtMSA6IDE7CiAgICAgICAgdGFuZ2VudEF0dHJpYnV0ZS5zZXRYWVpXKHYsIHRtcC54LCB0bXAueSwgdG1wLnosIHcpOwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IGdyb3Vwcy5sZW5ndGg7aSA8IGlsOyArK2kpIHsKICAgICAgICBjb25zdCBncm91cCA9IGdyb3Vwc1tpXTsKICAgICAgICBjb25zdCBzdGFydCA9IGdyb3VwLnN0YXJ0OwogICAgICAgIGNvbnN0IGNvdW50ID0gZ3JvdXAuY291bnQ7CiAgICAgICAgZm9yIChsZXQgaiA9IHN0YXJ0LCBqbCA9IHN0YXJ0ICsgY291bnQ7aiA8IGpsOyBqICs9IDMpIHsKICAgICAgICAgIGhhbmRsZVZlcnRleChpbmRleC5nZXRYKGogKyAwKSk7CiAgICAgICAgICBoYW5kbGVWZXJ0ZXgoaW5kZXguZ2V0WChqICsgMSkpOwogICAgICAgICAgaGFuZGxlVmVydGV4KGluZGV4LmdldFgoaiArIDIpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCkgewogICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXg7CiAgICAgIGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gdGhpcy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7CiAgICAgIGlmIChwb3NpdGlvbkF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgbGV0IG5vcm1hbEF0dHJpYnV0ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCJub3JtYWwiKTsKICAgICAgICBpZiAobm9ybWFsQXR0cmlidXRlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIG5vcm1hbEF0dHJpYnV0ZSA9IG5ldyBCdWZmZXJBdHRyaWJ1dGUobmV3IEZsb2F0MzJBcnJheShwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudCAqIDMpLCAzKTsKICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLCBub3JtYWxBdHRyaWJ1dGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBub3JtYWxBdHRyaWJ1dGUuY291bnQ7aSA8IGlsOyBpKyspIHsKICAgICAgICAgICAgbm9ybWFsQXR0cmlidXRlLnNldFhZWihpLCAwLCAwLCAwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgcEEgPSBuZXcgVmVjdG9yMywgcEIgPSBuZXcgVmVjdG9yMywgcEMgPSBuZXcgVmVjdG9yMzsKICAgICAgICBjb25zdCBuQSA9IG5ldyBWZWN0b3IzLCBuQiA9IG5ldyBWZWN0b3IzLCBuQyA9IG5ldyBWZWN0b3IzOwogICAgICAgIGNvbnN0IGNiID0gbmV3IFZlY3RvcjMsIGFiID0gbmV3IFZlY3RvcjM7CiAgICAgICAgaWYgKGluZGV4KSB7CiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBpbmRleC5jb3VudDtpIDwgaWw7IGkgKz0gMykgewogICAgICAgICAgICBjb25zdCB2QSA9IGluZGV4LmdldFgoaSArIDApOwogICAgICAgICAgICBjb25zdCB2QiA9IGluZGV4LmdldFgoaSArIDEpOwogICAgICAgICAgICBjb25zdCB2QyA9IGluZGV4LmdldFgoaSArIDIpOwogICAgICAgICAgICBwQS5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uQXR0cmlidXRlLCB2QSk7CiAgICAgICAgICAgIHBCLmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb25BdHRyaWJ1dGUsIHZCKTsKICAgICAgICAgICAgcEMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbkF0dHJpYnV0ZSwgdkMpOwogICAgICAgICAgICBjYi5zdWJWZWN0b3JzKHBDLCBwQik7CiAgICAgICAgICAgIGFiLnN1YlZlY3RvcnMocEEsIHBCKTsKICAgICAgICAgICAgY2IuY3Jvc3MoYWIpOwogICAgICAgICAgICBuQS5mcm9tQnVmZmVyQXR0cmlidXRlKG5vcm1hbEF0dHJpYnV0ZSwgdkEpOwogICAgICAgICAgICBuQi5mcm9tQnVmZmVyQXR0cmlidXRlKG5vcm1hbEF0dHJpYnV0ZSwgdkIpOwogICAgICAgICAgICBuQy5mcm9tQnVmZmVyQXR0cmlidXRlKG5vcm1hbEF0dHJpYnV0ZSwgdkMpOwogICAgICAgICAgICBuQS5hZGQoY2IpOwogICAgICAgICAgICBuQi5hZGQoY2IpOwogICAgICAgICAgICBuQy5hZGQoY2IpOwogICAgICAgICAgICBub3JtYWxBdHRyaWJ1dGUuc2V0WFlaKHZBLCBuQS54LCBuQS55LCBuQS56KTsKICAgICAgICAgICAgbm9ybWFsQXR0cmlidXRlLnNldFhZWih2QiwgbkIueCwgbkIueSwgbkIueik7CiAgICAgICAgICAgIG5vcm1hbEF0dHJpYnV0ZS5zZXRYWVoodkMsIG5DLngsIG5DLnksIG5DLnopOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudDtpIDwgaWw7IGkgKz0gMykgewogICAgICAgICAgICBwQS5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uQXR0cmlidXRlLCBpICsgMCk7CiAgICAgICAgICAgIHBCLmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb25BdHRyaWJ1dGUsIGkgKyAxKTsKICAgICAgICAgICAgcEMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbkF0dHJpYnV0ZSwgaSArIDIpOwogICAgICAgICAgICBjYi5zdWJWZWN0b3JzKHBDLCBwQik7CiAgICAgICAgICAgIGFiLnN1YlZlY3RvcnMocEEsIHBCKTsKICAgICAgICAgICAgY2IuY3Jvc3MoYWIpOwogICAgICAgICAgICBub3JtYWxBdHRyaWJ1dGUuc2V0WFlaKGkgKyAwLCBjYi54LCBjYi55LCBjYi56KTsKICAgICAgICAgICAgbm9ybWFsQXR0cmlidXRlLnNldFhZWihpICsgMSwgY2IueCwgY2IueSwgY2Iueik7CiAgICAgICAgICAgIG5vcm1hbEF0dHJpYnV0ZS5zZXRYWVooaSArIDIsIGNiLngsIGNiLnksIGNiLnopOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTsKICAgICAgICBub3JtYWxBdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBub3JtYWxpemVOb3JtYWxzKCkgewogICAgICBjb25zdCBub3JtYWxzID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlsID0gbm9ybWFscy5jb3VudDtpIDwgaWw7IGkrKykgewogICAgICAgIF92ZWN0b3IkOC5mcm9tQnVmZmVyQXR0cmlidXRlKG5vcm1hbHMsIGkpOwogICAgICAgIF92ZWN0b3IkOC5ub3JtYWxpemUoKTsKICAgICAgICBub3JtYWxzLnNldFhZWihpLCBfdmVjdG9yJDgueCwgX3ZlY3RvciQ4LnksIF92ZWN0b3IkOC56KTsKICAgICAgfQogICAgfQogICAgdG9Ob25JbmRleGVkKCkgewogICAgICBmdW5jdGlvbiBjb252ZXJ0QnVmZmVyQXR0cmlidXRlKGF0dHJpYnV0ZSwgaW5kaWNlczIpIHsKICAgICAgICBjb25zdCBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTsKICAgICAgICBjb25zdCBpdGVtU2l6ZSA9IGF0dHJpYnV0ZS5pdGVtU2l6ZTsKICAgICAgICBjb25zdCBub3JtYWxpemVkID0gYXR0cmlidXRlLm5vcm1hbGl6ZWQ7CiAgICAgICAgY29uc3QgYXJyYXkyID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKGluZGljZXMyLmxlbmd0aCAqIGl0ZW1TaXplKTsKICAgICAgICBsZXQgaW5kZXggPSAwLCBpbmRleDIgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gaW5kaWNlczIubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICAgIGlmIChhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSkgewogICAgICAgICAgICBpbmRleCA9IGluZGljZXMyW2ldICogYXR0cmlidXRlLmRhdGEuc3RyaWRlICsgYXR0cmlidXRlLm9mZnNldDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlczJbaV0gKiBpdGVtU2l6ZTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAobGV0IGogPSAwO2ogPCBpdGVtU2l6ZTsgaisrKSB7CiAgICAgICAgICAgIGFycmF5MltpbmRleDIrK10gPSBhcnJheVtpbmRleCsrXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJBdHRyaWJ1dGUoYXJyYXkyLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuaW5kZXggPT09IG51bGwpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBCdWZmZXJHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLiIpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGNvbnN0IGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeTsKICAgICAgY29uc3QgaW5kaWNlcyA9IHRoaXMuaW5kZXguYXJyYXk7CiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7CiAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBhdHRyaWJ1dGVzKSB7CiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1tuYW1lXTsKICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGUgPSBjb252ZXJ0QnVmZmVyQXR0cmlidXRlKGF0dHJpYnV0ZSwgaW5kaWNlcyk7CiAgICAgICAgZ2VvbWV0cnkyLnNldEF0dHJpYnV0ZShuYW1lLCBuZXdBdHRyaWJ1dGUpOwogICAgICB9CiAgICAgIGNvbnN0IG1vcnBoQXR0cmlidXRlcyA9IHRoaXMubW9ycGhBdHRyaWJ1dGVzOwogICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gbW9ycGhBdHRyaWJ1dGVzKSB7CiAgICAgICAgY29uc3QgbW9ycGhBcnJheSA9IFtdOwogICAgICAgIGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzW25hbWVdOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICAgICAgY29uc3QgYXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVbaV07CiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGUgPSBjb252ZXJ0QnVmZmVyQXR0cmlidXRlKGF0dHJpYnV0ZSwgaW5kaWNlcyk7CiAgICAgICAgICBtb3JwaEFycmF5LnB1c2gobmV3QXR0cmlidXRlKTsKICAgICAgICB9CiAgICAgICAgZ2VvbWV0cnkyLm1vcnBoQXR0cmlidXRlc1tuYW1lXSA9IG1vcnBoQXJyYXk7CiAgICAgIH0KICAgICAgZ2VvbWV0cnkyLm1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTsKICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5ncm91cHM7CiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgY29uc3QgZ3JvdXAgPSBncm91cHNbaV07CiAgICAgICAgZ2VvbWV0cnkyLmFkZEdyb3VwKGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGdlb21ldHJ5MjsKICAgIH0KICAgIHRvSlNPTigpIHsKICAgICAgY29uc3QgZGF0YSA9IHsKICAgICAgICBtZXRhZGF0YTogewogICAgICAgICAgdmVyc2lvbjogNC42LAogICAgICAgICAgdHlwZTogIkJ1ZmZlckdlb21ldHJ5IiwKICAgICAgICAgIGdlbmVyYXRvcjogIkJ1ZmZlckdlb21ldHJ5LnRvSlNPTiIKICAgICAgICB9CiAgICAgIH07CiAgICAgIGRhdGEudXVpZCA9IHRoaXMudXVpZDsKICAgICAgZGF0YS50eXBlID0gdGhpcy50eXBlOwogICAgICBpZiAodGhpcy5uYW1lICE9PSAiIikKICAgICAgICBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7CiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGggPiAwKQogICAgICAgIGRhdGEudXNlckRhdGEgPSB0aGlzLnVzZXJEYXRhOwogICAgICBpZiAodGhpcy5wYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzOwogICAgICAgIGZvciAoY29uc3Qga2V5IGluIHBhcmFtZXRlcnMpIHsKICAgICAgICAgIGlmIChwYXJhbWV0ZXJzW2tleV0gIT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgZGF0YVtrZXldID0gcGFyYW1ldGVyc1trZXldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgfQogICAgICBkYXRhLmRhdGEgPSB7IGF0dHJpYnV0ZXM6IHt9IH07CiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleDsKICAgICAgaWYgKGluZGV4ICE9PSBudWxsKSB7CiAgICAgICAgZGF0YS5kYXRhLmluZGV4ID0gewogICAgICAgICAgdHlwZTogaW5kZXguYXJyYXkuY29uc3RydWN0b3IubmFtZSwKICAgICAgICAgIGFycmF5OiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpbmRleC5hcnJheSkKICAgICAgICB9OwogICAgICB9CiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7CiAgICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMpIHsKICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2tleV07CiAgICAgICAgZGF0YS5kYXRhLmF0dHJpYnV0ZXNba2V5XSA9IGF0dHJpYnV0ZS50b0pTT04oZGF0YS5kYXRhKTsKICAgICAgfQogICAgICBjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSB7fTsKICAgICAgbGV0IGhhc01vcnBoQXR0cmlidXRlcyA9IGZhbHNlOwogICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLm1vcnBoQXR0cmlidXRlcykgewogICAgICAgIGNvbnN0IGF0dHJpYnV0ZUFycmF5ID0gdGhpcy5tb3JwaEF0dHJpYnV0ZXNba2V5XTsKICAgICAgICBjb25zdCBhcnJheSA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IGF0dHJpYnV0ZUFycmF5Lmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICAgICAgY29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlQXJyYXlbaV07CiAgICAgICAgICBhcnJheS5wdXNoKGF0dHJpYnV0ZS50b0pTT04oZGF0YS5kYXRhKSk7CiAgICAgICAgfQogICAgICAgIGlmIChhcnJheS5sZW5ndGggPiAwKSB7CiAgICAgICAgICBtb3JwaEF0dHJpYnV0ZXNba2V5XSA9IGFycmF5OwogICAgICAgICAgaGFzTW9ycGhBdHRyaWJ1dGVzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGhhc01vcnBoQXR0cmlidXRlcykgewogICAgICAgIGRhdGEuZGF0YS5tb3JwaEF0dHJpYnV0ZXMgPSBtb3JwaEF0dHJpYnV0ZXM7CiAgICAgICAgZGF0YS5kYXRhLm1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTsKICAgICAgfQogICAgICBjb25zdCBncm91cHMgPSB0aGlzLmdyb3VwczsKICAgICAgaWYgKGdyb3Vwcy5sZW5ndGggPiAwKSB7CiAgICAgICAgZGF0YS5kYXRhLmdyb3VwcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZ3JvdXBzKSk7CiAgICAgIH0KICAgICAgY29uc3QgYm91bmRpbmdTcGhlcmUgPSB0aGlzLmJvdW5kaW5nU3BoZXJlOwogICAgICBpZiAoYm91bmRpbmdTcGhlcmUgIT09IG51bGwpIHsKICAgICAgICBkYXRhLmRhdGEuYm91bmRpbmdTcGhlcmUgPSB7CiAgICAgICAgICBjZW50ZXI6IGJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCksCiAgICAgICAgICByYWRpdXM6IGJvdW5kaW5nU3BoZXJlLnJhZGl1cwogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBjbG9uZSgpIHsKICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKTsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHRoaXMuaW5kZXggPSBudWxsOwogICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgdGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fTsKICAgICAgdGhpcy5ncm91cHMgPSBbXTsKICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IG51bGw7CiAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsOwogICAgICBjb25zdCBkYXRhID0ge307CiAgICAgIHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lOwogICAgICBjb25zdCBpbmRleCA9IHNvdXJjZS5pbmRleDsKICAgICAgaWYgKGluZGV4ICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5zZXRJbmRleChpbmRleC5jbG9uZShkYXRhKSk7CiAgICAgIH0KICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHNvdXJjZS5hdHRyaWJ1dGVzOwogICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gYXR0cmlidXRlcykgewogICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbbmFtZV07CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgYXR0cmlidXRlLmNsb25lKGRhdGEpKTsKICAgICAgfQogICAgICBjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSBzb3VyY2UubW9ycGhBdHRyaWJ1dGVzOwogICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gbW9ycGhBdHRyaWJ1dGVzKSB7CiAgICAgICAgY29uc3QgYXJyYXkgPSBbXTsKICAgICAgICBjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1tuYW1lXTsKICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICBhcnJheS5wdXNoKG1vcnBoQXR0cmlidXRlW2ldLmNsb25lKGRhdGEpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5tb3JwaEF0dHJpYnV0ZXNbbmFtZV0gPSBhcnJheTsKICAgICAgfQogICAgICB0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gc291cmNlLm1vcnBoVGFyZ2V0c1JlbGF0aXZlOwogICAgICBjb25zdCBncm91cHMgPSBzb3VyY2UuZ3JvdXBzOwogICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgIGNvbnN0IGdyb3VwID0gZ3JvdXBzW2ldOwogICAgICAgIHRoaXMuYWRkR3JvdXAoZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4KTsKICAgICAgfQogICAgICBjb25zdCBib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveDsKICAgICAgaWYgKGJvdW5kaW5nQm94ICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94LmNsb25lKCk7CiAgICAgIH0KICAgICAgY29uc3QgYm91bmRpbmdTcGhlcmUgPSBzb3VyY2UuYm91bmRpbmdTcGhlcmU7CiAgICAgIGlmIChib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCkgewogICAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBib3VuZGluZ1NwaGVyZS5jbG9uZSgpOwogICAgICB9CiAgICAgIHRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gc291cmNlLmRyYXdSYW5nZS5zdGFydDsKICAgICAgdGhpcy5kcmF3UmFuZ2UuY291bnQgPSBzb3VyY2UuZHJhd1JhbmdlLmNvdW50OwogICAgICB0aGlzLnVzZXJEYXRhID0gc291cmNlLnVzZXJEYXRhOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGRpc3Bvc2UoKSB7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICJkaXNwb3NlIiB9KTsKICAgIH0KICB9OwogIF9pbnZlcnNlTWF0cml4JDMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDQ7CiAgX3JheSQzID0gLyogQF9fUFVSRV9fICovIG5ldyBSYXk7CiAgX3NwaGVyZSQ2ID0gLyogQF9fUFVSRV9fICovIG5ldyBTcGhlcmU7CiAgX3NwaGVyZUhpdEF0ID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF92QSQxID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF92QiQxID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF92QyQxID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF90ZW1wQSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfbW9ycGhBID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9pbnRlcnNlY3Rpb25Qb2ludCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfaW50ZXJzZWN0aW9uUG9pbnRXb3JsZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBNZXNoID0gY2xhc3MgTWVzaCBleHRlbmRzIE9iamVjdDNEIHsKICAgIGNvbnN0cnVjdG9yKGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5LCBtYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzTWVzaCA9IHRydWU7CiAgICAgIHRoaXMudHlwZSA9ICJNZXNoIjsKICAgICAgdGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5OwogICAgICB0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7CiAgICAgIHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCk7CiAgICB9CiAgICBjb3B5KHNvdXJjZSwgcmVjdXJzaXZlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlLCByZWN1cnNpdmUpOwogICAgICBpZiAoc291cmNlLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBzb3VyY2UubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCk7CiAgICAgIH0KICAgICAgaWYgKHNvdXJjZS5tb3JwaFRhcmdldERpY3Rpb25hcnkgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgc291cmNlLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSk7CiAgICAgIH0KICAgICAgdGhpcy5tYXRlcmlhbCA9IEFycmF5LmlzQXJyYXkoc291cmNlLm1hdGVyaWFsKSA/IHNvdXJjZS5tYXRlcmlhbC5zbGljZSgpIDogc291cmNlLm1hdGVyaWFsOwogICAgICB0aGlzLmdlb21ldHJ5ID0gc291cmNlLmdlb21ldHJ5OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHVwZGF0ZU1vcnBoVGFyZ2V0cygpIHsKICAgICAgY29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OwogICAgICBjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7CiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhtb3JwaEF0dHJpYnV0ZXMpOwogICAgICBpZiAoa2V5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgY29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNba2V5c1swXV07CiAgICAgICAgaWYgKG1vcnBoQXR0cmlidXRlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gW107CiAgICAgICAgICB0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9OwogICAgICAgICAgZm9yIChsZXQgbSA9IDAsIG1sID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoO20gPCBtbDsgbSsrKSB7CiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBtb3JwaEF0dHJpYnV0ZVttXS5uYW1lIHx8IFN0cmluZyhtKTsKICAgICAgICAgICAgdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKTsKICAgICAgICAgICAgdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbbmFtZV0gPSBtOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZ2V0VmVydGV4UG9zaXRpb24oaW5kZXgsIHRhcmdldCkgewogICAgICBjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKICAgICAgY29uc3QgbW9ycGhQb3NpdGlvbiA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjsKICAgICAgY29uc3QgbW9ycGhUYXJnZXRzUmVsYXRpdmUgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZTsKICAgICAgdGFyZ2V0LmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb24sIGluZGV4KTsKICAgICAgY29uc3QgbW9ycGhJbmZsdWVuY2VzID0gdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM7CiAgICAgIGlmIChtb3JwaFBvc2l0aW9uICYmIG1vcnBoSW5mbHVlbmNlcykgewogICAgICAgIF9tb3JwaEEuc2V0KDAsIDAsIDApOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IG1vcnBoUG9zaXRpb24ubGVuZ3RoO2kgPCBpbDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBpbmZsdWVuY2UgPSBtb3JwaEluZmx1ZW5jZXNbaV07CiAgICAgICAgICBjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoUG9zaXRpb25baV07CiAgICAgICAgICBpZiAoaW5mbHVlbmNlID09PSAwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIF90ZW1wQS5mcm9tQnVmZmVyQXR0cmlidXRlKG1vcnBoQXR0cmlidXRlLCBpbmRleCk7CiAgICAgICAgICBpZiAobW9ycGhUYXJnZXRzUmVsYXRpdmUpIHsKICAgICAgICAgICAgX21vcnBoQS5hZGRTY2FsZWRWZWN0b3IoX3RlbXBBLCBpbmZsdWVuY2UpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX21vcnBoQS5hZGRTY2FsZWRWZWN0b3IoX3RlbXBBLnN1Yih0YXJnZXQpLCBpbmZsdWVuY2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0YXJnZXQuYWRkKF9tb3JwaEEpOwogICAgICB9CiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CiAgICByYXljYXN0KHJheWNhc3RlciwgaW50ZXJzZWN0cykgewogICAgICBjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgIGNvbnN0IG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDsKICAgICAgY29uc3QgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkOwogICAgICBpZiAobWF0ZXJpYWwgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm47CiAgICAgIGlmIChnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCkKICAgICAgICBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKICAgICAgX3NwaGVyZSQ2LmNvcHkoZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUpOwogICAgICBfc3BoZXJlJDYuYXBwbHlNYXRyaXg0KG1hdHJpeFdvcmxkKTsKICAgICAgX3JheSQzLmNvcHkocmF5Y2FzdGVyLnJheSkucmVjYXN0KHJheWNhc3Rlci5uZWFyKTsKICAgICAgaWYgKF9zcGhlcmUkNi5jb250YWluc1BvaW50KF9yYXkkMy5vcmlnaW4pID09PSBmYWxzZSkgewogICAgICAgIGlmIChfcmF5JDMuaW50ZXJzZWN0U3BoZXJlKF9zcGhlcmUkNiwgX3NwaGVyZUhpdEF0KSA9PT0gbnVsbCkKICAgICAgICAgIHJldHVybjsKICAgICAgICBpZiAoX3JheSQzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZChfc3BoZXJlSGl0QXQpID4gKHJheWNhc3Rlci5mYXIgLSByYXljYXN0ZXIubmVhcikgKiogMikKICAgICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBfaW52ZXJzZU1hdHJpeCQzLmNvcHkobWF0cml4V29ybGQpLmludmVydCgpOwogICAgICBfcmF5JDMuY29weShyYXljYXN0ZXIucmF5KS5hcHBseU1hdHJpeDQoX2ludmVyc2VNYXRyaXgkMyk7CiAgICAgIGlmIChnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCkgewogICAgICAgIGlmIChfcmF5JDMuaW50ZXJzZWN0c0JveChnZW9tZXRyeS5ib3VuZGluZ0JveCkgPT09IGZhbHNlKQogICAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX2NvbXB1dGVJbnRlcnNlY3Rpb25zKHJheWNhc3RlciwgaW50ZXJzZWN0cywgX3JheSQzKTsKICAgIH0KICAgIF9jb21wdXRlSW50ZXJzZWN0aW9ucyhyYXljYXN0ZXIsIGludGVyc2VjdHMsIHJheUxvY2FsU3BhY2UpIHsKICAgICAgbGV0IGludGVyc2VjdGlvbjsKICAgICAgY29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OwogICAgICBjb25zdCBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7CiAgICAgIGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7CiAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKICAgICAgY29uc3QgdXYgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnV2OwogICAgICBjb25zdCB1djEgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnV2MTsKICAgICAgY29uc3Qgbm9ybWFsID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWw7CiAgICAgIGNvbnN0IGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwczsKICAgICAgY29uc3QgZHJhd1JhbmdlID0gZ2VvbWV0cnkuZHJhd1JhbmdlOwogICAgICBpZiAoaW5kZXggIT09IG51bGwpIHsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtYXRlcmlhbCkpIHsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IGdyb3Vwcy5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBncm91cHNbaV07CiAgICAgICAgICAgIGNvbnN0IGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFtncm91cC5tYXRlcmlhbEluZGV4XTsKICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heChncm91cC5zdGFydCwgZHJhd1JhbmdlLnN0YXJ0KTsKICAgICAgICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oaW5kZXguY291bnQsIE1hdGgubWluKGdyb3VwLnN0YXJ0ICsgZ3JvdXAuY291bnQsIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCkpOwogICAgICAgICAgICBmb3IgKGxldCBqID0gc3RhcnQsIGpsID0gZW5kO2ogPCBqbDsgaiArPSAzKSB7CiAgICAgICAgICAgICAgY29uc3QgYSA9IGluZGV4LmdldFgoaik7CiAgICAgICAgICAgICAgY29uc3QgYiA9IGluZGV4LmdldFgoaiArIDEpOwogICAgICAgICAgICAgIGNvbnN0IGMgPSBpbmRleC5nZXRYKGogKyAyKTsKICAgICAgICAgICAgICBpbnRlcnNlY3Rpb24gPSBjaGVja0dlb21ldHJ5SW50ZXJzZWN0aW9uKHRoaXMsIGdyb3VwTWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5TG9jYWxTcGFjZSwgdXYsIHV2MSwgbm9ybWFsLCBhLCBiLCBjKTsKICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9uKSB7CiAgICAgICAgICAgICAgICBpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vcihqIC8gMyk7CiAgICAgICAgICAgICAgICBpbnRlcnNlY3Rpb24uZmFjZS5tYXRlcmlhbEluZGV4ID0gZ3JvdXAubWF0ZXJpYWxJbmRleDsKICAgICAgICAgICAgICAgIGludGVyc2VjdHMucHVzaChpbnRlcnNlY3Rpb24pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGRyYXdSYW5nZS5zdGFydCk7CiAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihpbmRleC5jb3VudCwgZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50KTsKICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydCwgaWwgPSBlbmQ7aSA8IGlsOyBpICs9IDMpIHsKICAgICAgICAgICAgY29uc3QgYSA9IGluZGV4LmdldFgoaSk7CiAgICAgICAgICAgIGNvbnN0IGIgPSBpbmRleC5nZXRYKGkgKyAxKTsKICAgICAgICAgICAgY29uc3QgYyA9IGluZGV4LmdldFgoaSArIDIpOwogICAgICAgICAgICBpbnRlcnNlY3Rpb24gPSBjaGVja0dlb21ldHJ5SW50ZXJzZWN0aW9uKHRoaXMsIG1hdGVyaWFsLCByYXljYXN0ZXIsIHJheUxvY2FsU3BhY2UsIHV2LCB1djEsIG5vcm1hbCwgYSwgYiwgYyk7CiAgICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb24pIHsKICAgICAgICAgICAgICBpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vcihpIC8gMyk7CiAgICAgICAgICAgICAgaW50ZXJzZWN0cy5wdXNoKGludGVyc2VjdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1hdGVyaWFsKSkgewogICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlsID0gZ3JvdXBzLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICAgICAgICBjb25zdCBncm91cCA9IGdyb3Vwc1tpXTsKICAgICAgICAgICAgY29uc3QgZ3JvdXBNYXRlcmlhbCA9IG1hdGVyaWFsW2dyb3VwLm1hdGVyaWFsSW5kZXhdOwogICAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KGdyb3VwLnN0YXJ0LCBkcmF3UmFuZ2Uuc3RhcnQpOwogICAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihwb3NpdGlvbi5jb3VudCwgTWF0aC5taW4oZ3JvdXAuc3RhcnQgKyBncm91cC5jb3VudCwgZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50KSk7CiAgICAgICAgICAgIGZvciAobGV0IGogPSBzdGFydCwgamwgPSBlbmQ7aiA8IGpsOyBqICs9IDMpIHsKICAgICAgICAgICAgICBjb25zdCBhID0gajsKICAgICAgICAgICAgICBjb25zdCBiID0gaiArIDE7CiAgICAgICAgICAgICAgY29uc3QgYyA9IGogKyAyOwogICAgICAgICAgICAgIGludGVyc2VjdGlvbiA9IGNoZWNrR2VvbWV0cnlJbnRlcnNlY3Rpb24odGhpcywgZ3JvdXBNYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXlMb2NhbFNwYWNlLCB1diwgdXYxLCBub3JtYWwsIGEsIGIsIGMpOwogICAgICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb24pIHsKICAgICAgICAgICAgICAgIGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKGogLyAzKTsKICAgICAgICAgICAgICAgIGludGVyc2VjdGlvbi5mYWNlLm1hdGVyaWFsSW5kZXggPSBncm91cC5tYXRlcmlhbEluZGV4OwogICAgICAgICAgICAgICAgaW50ZXJzZWN0cy5wdXNoKGludGVyc2VjdGlvbik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgZHJhd1JhbmdlLnN0YXJ0KTsKICAgICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKHBvc2l0aW9uLmNvdW50LCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQpOwogICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0LCBpbCA9IGVuZDtpIDwgaWw7IGkgKz0gMykgewogICAgICAgICAgICBjb25zdCBhID0gaTsKICAgICAgICAgICAgY29uc3QgYiA9IGkgKyAxOwogICAgICAgICAgICBjb25zdCBjID0gaSArIDI7CiAgICAgICAgICAgIGludGVyc2VjdGlvbiA9IGNoZWNrR2VvbWV0cnlJbnRlcnNlY3Rpb24odGhpcywgbWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5TG9jYWxTcGFjZSwgdXYsIHV2MSwgbm9ybWFsLCBhLCBiLCBjKTsKICAgICAgICAgICAgaWYgKGludGVyc2VjdGlvbikgewogICAgICAgICAgICAgIGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKGkgLyAzKTsKICAgICAgICAgICAgICBpbnRlcnNlY3RzLnB1c2goaW50ZXJzZWN0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CiAgQm94R2VvbWV0cnkgPSBjbGFzcyBCb3hHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHsKICAgIGNvbnN0cnVjdG9yKHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZGVwdGggPSAxLCB3aWR0aFNlZ21lbnRzID0gMSwgaGVpZ2h0U2VnbWVudHMgPSAxLCBkZXB0aFNlZ21lbnRzID0gMSkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLnR5cGUgPSAiQm94R2VvbWV0cnkiOwogICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0LAogICAgICAgIGRlcHRoLAogICAgICAgIHdpZHRoU2VnbWVudHMsCiAgICAgICAgaGVpZ2h0U2VnbWVudHMsCiAgICAgICAgZGVwdGhTZWdtZW50cwogICAgICB9OwogICAgICBjb25zdCBzY29wZSA9IHRoaXM7CiAgICAgIHdpZHRoU2VnbWVudHMgPSBNYXRoLmZsb29yKHdpZHRoU2VnbWVudHMpOwogICAgICBoZWlnaHRTZWdtZW50cyA9IE1hdGguZmxvb3IoaGVpZ2h0U2VnbWVudHMpOwogICAgICBkZXB0aFNlZ21lbnRzID0gTWF0aC5mbG9vcihkZXB0aFNlZ21lbnRzKTsKICAgICAgY29uc3QgaW5kaWNlcyA9IFtdOwogICAgICBjb25zdCB2ZXJ0aWNlcyA9IFtdOwogICAgICBjb25zdCBub3JtYWxzID0gW107CiAgICAgIGNvbnN0IHV2cyA9IFtdOwogICAgICBsZXQgbnVtYmVyT2ZWZXJ0aWNlcyA9IDA7CiAgICAgIGxldCBncm91cFN0YXJ0ID0gMDsKICAgICAgYnVpbGRQbGFuZSgieiIsICJ5IiwgIngiLCAtMSwgLTEsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMCk7CiAgICAgIGJ1aWxkUGxhbmUoInoiLCAieSIsICJ4IiwgMSwgLTEsIGRlcHRoLCBoZWlnaHQsIC13aWR0aCwgZGVwdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDEpOwogICAgICBidWlsZFBsYW5lKCJ4IiwgInoiLCAieSIsIDEsIDEsIHdpZHRoLCBkZXB0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzLCAyKTsKICAgICAgYnVpbGRQbGFuZSgieCIsICJ6IiwgInkiLCAxLCAtMSwgd2lkdGgsIGRlcHRoLCAtaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzLCAzKTsKICAgICAgYnVpbGRQbGFuZSgieCIsICJ5IiwgInoiLCAxLCAtMSwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA0KTsKICAgICAgYnVpbGRQbGFuZSgieCIsICJ5IiwgInoiLCAtMSwgLTEsIHdpZHRoLCBoZWlnaHQsIC1kZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDUpOwogICAgICB0aGlzLnNldEluZGV4KGluZGljZXMpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh2ZXJ0aWNlcywgMykpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUobm9ybWFscywgMykpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh1dnMsIDIpKTsKICAgICAgZnVuY3Rpb24gYnVpbGRQbGFuZSh1LCB2LCB3LCB1ZGlyLCB2ZGlyLCB3aWR0aDIsIGhlaWdodDIsIGRlcHRoMiwgZ3JpZFgsIGdyaWRZLCBtYXRlcmlhbEluZGV4KSB7CiAgICAgICAgY29uc3Qgc2VnbWVudFdpZHRoID0gd2lkdGgyIC8gZ3JpZFg7CiAgICAgICAgY29uc3Qgc2VnbWVudEhlaWdodCA9IGhlaWdodDIgLyBncmlkWTsKICAgICAgICBjb25zdCB3aWR0aEhhbGYgPSB3aWR0aDIgLyAyOwogICAgICAgIGNvbnN0IGhlaWdodEhhbGYgPSBoZWlnaHQyIC8gMjsKICAgICAgICBjb25zdCBkZXB0aEhhbGYgPSBkZXB0aDIgLyAyOwogICAgICAgIGNvbnN0IGdyaWRYMSA9IGdyaWRYICsgMTsKICAgICAgICBjb25zdCBncmlkWTEgPSBncmlkWSArIDE7CiAgICAgICAgbGV0IHZlcnRleENvdW50ZXIgPSAwOwogICAgICAgIGxldCBncm91cENvdW50ID0gMDsKICAgICAgICBjb25zdCB2ZWN0b3IgPSBuZXcgVmVjdG9yMzsKICAgICAgICBmb3IgKGxldCBpeSA9IDA7aXkgPCBncmlkWTE7IGl5KyspIHsKICAgICAgICAgIGNvbnN0IHkgPSBpeSAqIHNlZ21lbnRIZWlnaHQgLSBoZWlnaHRIYWxmOwogICAgICAgICAgZm9yIChsZXQgaXggPSAwO2l4IDwgZ3JpZFgxOyBpeCsrKSB7CiAgICAgICAgICAgIGNvbnN0IHggPSBpeCAqIHNlZ21lbnRXaWR0aCAtIHdpZHRoSGFsZjsKICAgICAgICAgICAgdmVjdG9yW3VdID0geCAqIHVkaXI7CiAgICAgICAgICAgIHZlY3Rvclt2XSA9IHkgKiB2ZGlyOwogICAgICAgICAgICB2ZWN0b3Jbd10gPSBkZXB0aEhhbGY7CiAgICAgICAgICAgIHZlcnRpY2VzLnB1c2godmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3Iueik7CiAgICAgICAgICAgIHZlY3Rvclt1XSA9IDA7CiAgICAgICAgICAgIHZlY3Rvclt2XSA9IDA7CiAgICAgICAgICAgIHZlY3Rvclt3XSA9IGRlcHRoMiA+IDAgPyAxIDogLTE7CiAgICAgICAgICAgIG5vcm1hbHMucHVzaCh2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56KTsKICAgICAgICAgICAgdXZzLnB1c2goaXggLyBncmlkWCk7CiAgICAgICAgICAgIHV2cy5wdXNoKDEgLSBpeSAvIGdyaWRZKTsKICAgICAgICAgICAgdmVydGV4Q291bnRlciArPSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpeSA9IDA7aXkgPCBncmlkWTsgaXkrKykgewogICAgICAgICAgZm9yIChsZXQgaXggPSAwO2l4IDwgZ3JpZFg7IGl4KyspIHsKICAgICAgICAgICAgY29uc3QgYSA9IG51bWJlck9mVmVydGljZXMgKyBpeCArIGdyaWRYMSAqIGl5OwogICAgICAgICAgICBjb25zdCBiID0gbnVtYmVyT2ZWZXJ0aWNlcyArIGl4ICsgZ3JpZFgxICogKGl5ICsgMSk7CiAgICAgICAgICAgIGNvbnN0IGMgPSBudW1iZXJPZlZlcnRpY2VzICsgKGl4ICsgMSkgKyBncmlkWDEgKiAoaXkgKyAxKTsKICAgICAgICAgICAgY29uc3QgZCA9IG51bWJlck9mVmVydGljZXMgKyAoaXggKyAxKSArIGdyaWRYMSAqIGl5OwogICAgICAgICAgICBpbmRpY2VzLnB1c2goYSwgYiwgZCk7CiAgICAgICAgICAgIGluZGljZXMucHVzaChiLCBjLCBkKTsKICAgICAgICAgICAgZ3JvdXBDb3VudCArPSA2OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzY29wZS5hZGRHcm91cChncm91cFN0YXJ0LCBncm91cENvdW50LCBtYXRlcmlhbEluZGV4KTsKICAgICAgICBncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7CiAgICAgICAgbnVtYmVyT2ZWZXJ0aWNlcyArPSB2ZXJ0ZXhDb3VudGVyOwogICAgICB9CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZS5wYXJhbWV0ZXJzKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04oZGF0YSkgewogICAgICByZXR1cm4gbmV3IEJveEdlb21ldHJ5KGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0LCBkYXRhLmRlcHRoLCBkYXRhLndpZHRoU2VnbWVudHMsIGRhdGEuaGVpZ2h0U2VnbWVudHMsIGRhdGEuZGVwdGhTZWdtZW50cyk7CiAgICB9CiAgfTsKICBVbmlmb3Jtc1V0aWxzID0geyBjbG9uZTogY2xvbmVVbmlmb3JtcywgbWVyZ2U6IG1lcmdlVW5pZm9ybXMgfTsKICBTaGFkZXJNYXRlcmlhbCA9IGNsYXNzIFNoYWRlck1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwgewogICAgY29uc3RydWN0b3IocGFyYW1ldGVycykgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzU2hhZGVyTWF0ZXJpYWwgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiU2hhZGVyTWF0ZXJpYWwiOwogICAgICB0aGlzLmRlZmluZXMgPSB7fTsKICAgICAgdGhpcy51bmlmb3JtcyA9IHt9OwogICAgICB0aGlzLnVuaWZvcm1zR3JvdXBzID0gW107CiAgICAgIHRoaXMudmVydGV4U2hhZGVyID0gZGVmYXVsdF92ZXJ0ZXg7CiAgICAgIHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBkZWZhdWx0X2ZyYWdtZW50OwogICAgICB0aGlzLmxpbmV3aWR0aCA9IDE7CiAgICAgIHRoaXMud2lyZWZyYW1lID0gZmFsc2U7CiAgICAgIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTsKICAgICAgdGhpcy5mb2cgPSBmYWxzZTsKICAgICAgdGhpcy5saWdodHMgPSBmYWxzZTsKICAgICAgdGhpcy5jbGlwcGluZyA9IGZhbHNlOwogICAgICB0aGlzLmZvcmNlU2luZ2xlUGFzcyA9IHRydWU7CiAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHsKICAgICAgICBjbGlwQ3VsbERpc3RhbmNlOiBmYWxzZSwKICAgICAgICBtdWx0aURyYXc6IGZhbHNlCiAgICAgIH07CiAgICAgIHRoaXMuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IHsKICAgICAgICBjb2xvcjogWzEsIDEsIDFdLAogICAgICAgIHV2OiBbMCwgMF0sCiAgICAgICAgdXYxOiBbMCwgMF0KICAgICAgfTsKICAgICAgdGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lID0gdW5kZWZpbmVkOwogICAgICB0aGlzLnVuaWZvcm1zTmVlZFVwZGF0ZSA9IGZhbHNlOwogICAgICB0aGlzLmdsc2xWZXJzaW9uID0gbnVsbDsKICAgICAgaWYgKHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRoaXMuc2V0VmFsdWVzKHBhcmFtZXRlcnMpOwogICAgICB9CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBzb3VyY2UuZnJhZ21lbnRTaGFkZXI7CiAgICAgIHRoaXMudmVydGV4U2hhZGVyID0gc291cmNlLnZlcnRleFNoYWRlcjsKICAgICAgdGhpcy51bmlmb3JtcyA9IGNsb25lVW5pZm9ybXMoc291cmNlLnVuaWZvcm1zKTsKICAgICAgdGhpcy51bmlmb3Jtc0dyb3VwcyA9IGNsb25lVW5pZm9ybXNHcm91cHMoc291cmNlLnVuaWZvcm1zR3JvdXBzKTsKICAgICAgdGhpcy5kZWZpbmVzID0gT2JqZWN0LmFzc2lnbih7fSwgc291cmNlLmRlZmluZXMpOwogICAgICB0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7CiAgICAgIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDsKICAgICAgdGhpcy5mb2cgPSBzb3VyY2UuZm9nOwogICAgICB0aGlzLmxpZ2h0cyA9IHNvdXJjZS5saWdodHM7CiAgICAgIHRoaXMuY2xpcHBpbmcgPSBzb3VyY2UuY2xpcHBpbmc7CiAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZS5leHRlbnNpb25zKTsKICAgICAgdGhpcy5nbHNsVmVyc2lvbiA9IHNvdXJjZS5nbHNsVmVyc2lvbjsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0b0pTT04obWV0YSkgewogICAgICBjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKG1ldGEpOwogICAgICBkYXRhLmdsc2xWZXJzaW9uID0gdGhpcy5nbHNsVmVyc2lvbjsKICAgICAgZGF0YS51bmlmb3JtcyA9IHt9OwogICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gdGhpcy51bmlmb3JtcykgewogICAgICAgIGNvbnN0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW25hbWVdOwogICAgICAgIGNvbnN0IHZhbHVlID0gdW5pZm9ybS52YWx1ZTsKICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUuaXNUZXh0dXJlKSB7CiAgICAgICAgICBkYXRhLnVuaWZvcm1zW25hbWVdID0gewogICAgICAgICAgICB0eXBlOiAidCIsCiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS50b0pTT04obWV0YSkudXVpZAogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHZhbHVlLmlzQ29sb3IpIHsKICAgICAgICAgIGRhdGEudW5pZm9ybXNbbmFtZV0gPSB7CiAgICAgICAgICAgIHR5cGU6ICJjIiwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLmdldEhleCgpCiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdmFsdWUuaXNWZWN0b3IyKSB7CiAgICAgICAgICBkYXRhLnVuaWZvcm1zW25hbWVdID0gewogICAgICAgICAgICB0eXBlOiAidjIiLAogICAgICAgICAgICB2YWx1ZTogdmFsdWUudG9BcnJheSgpCiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdmFsdWUuaXNWZWN0b3IzKSB7CiAgICAgICAgICBkYXRhLnVuaWZvcm1zW25hbWVdID0gewogICAgICAgICAgICB0eXBlOiAidjMiLAogICAgICAgICAgICB2YWx1ZTogdmFsdWUudG9BcnJheSgpCiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdmFsdWUuaXNWZWN0b3I0KSB7CiAgICAgICAgICBkYXRhLnVuaWZvcm1zW25hbWVdID0gewogICAgICAgICAgICB0eXBlOiAidjQiLAogICAgICAgICAgICB2YWx1ZTogdmFsdWUudG9BcnJheSgpCiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdmFsdWUuaXNNYXRyaXgzKSB7CiAgICAgICAgICBkYXRhLnVuaWZvcm1zW25hbWVdID0gewogICAgICAgICAgICB0eXBlOiAibTMiLAogICAgICAgICAgICB2YWx1ZTogdmFsdWUudG9BcnJheSgpCiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdmFsdWUuaXNNYXRyaXg0KSB7CiAgICAgICAgICBkYXRhLnVuaWZvcm1zW25hbWVdID0gewogICAgICAgICAgICB0eXBlOiAibTQiLAogICAgICAgICAgICB2YWx1ZTogdmFsdWUudG9BcnJheSgpCiAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkYXRhLnVuaWZvcm1zW25hbWVdID0gewogICAgICAgICAgICB2YWx1ZQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZGVmaW5lcykubGVuZ3RoID4gMCkKICAgICAgICBkYXRhLmRlZmluZXMgPSB0aGlzLmRlZmluZXM7CiAgICAgIGRhdGEudmVydGV4U2hhZGVyID0gdGhpcy52ZXJ0ZXhTaGFkZXI7CiAgICAgIGRhdGEuZnJhZ21lbnRTaGFkZXIgPSB0aGlzLmZyYWdtZW50U2hhZGVyOwogICAgICBkYXRhLmxpZ2h0cyA9IHRoaXMubGlnaHRzOwogICAgICBkYXRhLmNsaXBwaW5nID0gdGhpcy5jbGlwcGluZzsKICAgICAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9OwogICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmV4dGVuc2lvbnMpIHsKICAgICAgICBpZiAodGhpcy5leHRlbnNpb25zW2tleV0gPT09IHRydWUpCiAgICAgICAgICBleHRlbnNpb25zW2tleV0gPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChPYmplY3Qua2V5cyhleHRlbnNpb25zKS5sZW5ndGggPiAwKQogICAgICAgIGRhdGEuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogIH07CiAgQ2FtZXJhID0gY2xhc3MgQ2FtZXJhIGV4dGVuZHMgT2JqZWN0M0QgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNDYW1lcmEgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiQ2FtZXJhIjsKICAgICAgdGhpcy5tYXRyaXhXb3JsZEludmVyc2UgPSBuZXcgTWF0cml4NDsKICAgICAgdGhpcy5wcm9qZWN0aW9uTWF0cml4ID0gbmV3IE1hdHJpeDQ7CiAgICAgIHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NDsKICAgICAgdGhpcy5jb29yZGluYXRlU3lzdGVtID0gV2ViR0xDb29yZGluYXRlU3lzdGVtOwogICAgfQogICAgY29weShzb3VyY2UsIHJlY3Vyc2l2ZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSwgcmVjdXJzaXZlKTsKICAgICAgdGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weShzb3VyY2UubWF0cml4V29ybGRJbnZlcnNlKTsKICAgICAgdGhpcy5wcm9qZWN0aW9uTWF0cml4LmNvcHkoc291cmNlLnByb2plY3Rpb25NYXRyaXgpOwogICAgICB0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoc291cmNlLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKTsKICAgICAgdGhpcy5jb29yZGluYXRlU3lzdGVtID0gc291cmNlLmNvb3JkaW5hdGVTeXN0ZW07CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZ2V0V29ybGREaXJlY3Rpb24odGFyZ2V0KSB7CiAgICAgIHJldHVybiBzdXBlci5nZXRXb3JsZERpcmVjdGlvbih0YXJnZXQpLm5lZ2F0ZSgpOwogICAgfQogICAgdXBkYXRlTWF0cml4V29ybGQoZm9yY2UpIHsKICAgICAgc3VwZXIudXBkYXRlTWF0cml4V29ybGQoZm9yY2UpOwogICAgICB0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpOwogICAgfQogICAgdXBkYXRlV29ybGRNYXRyaXgodXBkYXRlUGFyZW50cywgdXBkYXRlQ2hpbGRyZW4pIHsKICAgICAgc3VwZXIudXBkYXRlV29ybGRNYXRyaXgodXBkYXRlUGFyZW50cywgdXBkYXRlQ2hpbGRyZW4pOwogICAgICB0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpOwogICAgfQogICAgY2xvbmUoKSB7CiAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyk7CiAgICB9CiAgfTsKICBfdjMkMSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfbWluVGFyZ2V0ID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IyOwogIF9tYXhUYXJnZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjI7CiAgUGVyc3BlY3RpdmVDYW1lcmEgPSBjbGFzcyBQZXJzcGVjdGl2ZUNhbWVyYSBleHRlbmRzIENhbWVyYSB7CiAgICBjb25zdHJ1Y3Rvcihmb3YgPSA1MCwgYXNwZWN0ID0gMSwgbmVhciA9IDAuMSwgZmFyID0gMjAwMCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzUGVyc3BlY3RpdmVDYW1lcmEgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiUGVyc3BlY3RpdmVDYW1lcmEiOwogICAgICB0aGlzLmZvdiA9IGZvdjsKICAgICAgdGhpcy56b29tID0gMTsKICAgICAgdGhpcy5uZWFyID0gbmVhcjsKICAgICAgdGhpcy5mYXIgPSBmYXI7CiAgICAgIHRoaXMuZm9jdXMgPSAxMDsKICAgICAgdGhpcy5hc3BlY3QgPSBhc3BlY3Q7CiAgICAgIHRoaXMudmlldyA9IG51bGw7CiAgICAgIHRoaXMuZmlsbUdhdWdlID0gMzU7CiAgICAgIHRoaXMuZmlsbU9mZnNldCA9IDA7CiAgICAgIHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwogICAgfQogICAgY29weShzb3VyY2UsIHJlY3Vyc2l2ZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSwgcmVjdXJzaXZlKTsKICAgICAgdGhpcy5mb3YgPSBzb3VyY2UuZm92OwogICAgICB0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTsKICAgICAgdGhpcy5uZWFyID0gc291cmNlLm5lYXI7CiAgICAgIHRoaXMuZmFyID0gc291cmNlLmZhcjsKICAgICAgdGhpcy5mb2N1cyA9IHNvdXJjZS5mb2N1czsKICAgICAgdGhpcy5hc3BlY3QgPSBzb3VyY2UuYXNwZWN0OwogICAgICB0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKHt9LCBzb3VyY2Uudmlldyk7CiAgICAgIHRoaXMuZmlsbUdhdWdlID0gc291cmNlLmZpbG1HYXVnZTsKICAgICAgdGhpcy5maWxtT2Zmc2V0ID0gc291cmNlLmZpbG1PZmZzZXQ7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0Rm9jYWxMZW5ndGgoZm9jYWxMZW5ndGgpIHsKICAgICAgY29uc3QgdkV4dGVudFNsb3BlID0gMC41ICogdGhpcy5nZXRGaWxtSGVpZ2h0KCkgLyBmb2NhbExlbmd0aDsKICAgICAgdGhpcy5mb3YgPSBSQUQyREVHICogMiAqIE1hdGguYXRhbih2RXh0ZW50U2xvcGUpOwogICAgICB0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKICAgIH0KICAgIGdldEZvY2FsTGVuZ3RoKCkgewogICAgICBjb25zdCB2RXh0ZW50U2xvcGUgPSBNYXRoLnRhbihERUcyUkFEICogMC41ICogdGhpcy5mb3YpOwogICAgICByZXR1cm4gMC41ICogdGhpcy5nZXRGaWxtSGVpZ2h0KCkgLyB2RXh0ZW50U2xvcGU7CiAgICB9CiAgICBnZXRFZmZlY3RpdmVGT1YoKSB7CiAgICAgIHJldHVybiBSQUQyREVHICogMiAqIE1hdGguYXRhbihNYXRoLnRhbihERUcyUkFEICogMC41ICogdGhpcy5mb3YpIC8gdGhpcy56b29tKTsKICAgIH0KICAgIGdldEZpbG1XaWR0aCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZmlsbUdhdWdlICogTWF0aC5taW4odGhpcy5hc3BlY3QsIDEpOwogICAgfQogICAgZ2V0RmlsbUhlaWdodCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZmlsbUdhdWdlIC8gTWF0aC5tYXgodGhpcy5hc3BlY3QsIDEpOwogICAgfQogICAgZ2V0Vmlld0JvdW5kcyhkaXN0YW5jZSwgbWluVGFyZ2V0LCBtYXhUYXJnZXQpIHsKICAgICAgX3YzJDEuc2V0KC0xLCAtMSwgMC41KS5hcHBseU1hdHJpeDQodGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSk7CiAgICAgIG1pblRhcmdldC5zZXQoX3YzJDEueCwgX3YzJDEueSkubXVsdGlwbHlTY2FsYXIoLWRpc3RhbmNlIC8gX3YzJDEueik7CiAgICAgIF92MyQxLnNldCgxLCAxLCAwLjUpLmFwcGx5TWF0cml4NCh0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKTsKICAgICAgbWF4VGFyZ2V0LnNldChfdjMkMS54LCBfdjMkMS55KS5tdWx0aXBseVNjYWxhcigtZGlzdGFuY2UgLyBfdjMkMS56KTsKICAgIH0KICAgIGdldFZpZXdTaXplKGRpc3RhbmNlLCB0YXJnZXQpIHsKICAgICAgdGhpcy5nZXRWaWV3Qm91bmRzKGRpc3RhbmNlLCBfbWluVGFyZ2V0LCBfbWF4VGFyZ2V0KTsKICAgICAgcmV0dXJuIHRhcmdldC5zdWJWZWN0b3JzKF9tYXhUYXJnZXQsIF9taW5UYXJnZXQpOwogICAgfQogICAgc2V0Vmlld09mZnNldChmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgdGhpcy5hc3BlY3QgPSBmdWxsV2lkdGggLyBmdWxsSGVpZ2h0OwogICAgICBpZiAodGhpcy52aWV3ID09PSBudWxsKSB7CiAgICAgICAgdGhpcy52aWV3ID0gewogICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgIGZ1bGxXaWR0aDogMSwKICAgICAgICAgIGZ1bGxIZWlnaHQ6IDEsCiAgICAgICAgICBvZmZzZXRYOiAwLAogICAgICAgICAgb2Zmc2V0WTogMCwKICAgICAgICAgIHdpZHRoOiAxLAogICAgICAgICAgaGVpZ2h0OiAxCiAgICAgICAgfTsKICAgICAgfQogICAgICB0aGlzLnZpZXcuZW5hYmxlZCA9IHRydWU7CiAgICAgIHRoaXMudmlldy5mdWxsV2lkdGggPSBmdWxsV2lkdGg7CiAgICAgIHRoaXMudmlldy5mdWxsSGVpZ2h0ID0gZnVsbEhlaWdodDsKICAgICAgdGhpcy52aWV3Lm9mZnNldFggPSB4OwogICAgICB0aGlzLnZpZXcub2Zmc2V0WSA9IHk7CiAgICAgIHRoaXMudmlldy53aWR0aCA9IHdpZHRoOwogICAgICB0aGlzLnZpZXcuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICB0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKICAgIH0KICAgIGNsZWFyVmlld09mZnNldCgpIHsKICAgICAgaWYgKHRoaXMudmlldyAhPT0gbnVsbCkgewogICAgICAgIHRoaXMudmlldy5lbmFibGVkID0gZmFsc2U7CiAgICAgIH0KICAgICAgdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CiAgICB9CiAgICB1cGRhdGVQcm9qZWN0aW9uTWF0cml4KCkgewogICAgICBjb25zdCBuZWFyID0gdGhpcy5uZWFyOwogICAgICBsZXQgdG9wID0gbmVhciAqIE1hdGgudGFuKERFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdikgLyB0aGlzLnpvb207CiAgICAgIGxldCBoZWlnaHQgPSAyICogdG9wOwogICAgICBsZXQgd2lkdGggPSB0aGlzLmFzcGVjdCAqIGhlaWdodDsKICAgICAgbGV0IGxlZnQgPSAtMC41ICogd2lkdGg7CiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXc7CiAgICAgIGlmICh0aGlzLnZpZXcgIT09IG51bGwgJiYgdGhpcy52aWV3LmVuYWJsZWQpIHsKICAgICAgICBjb25zdCB7IGZ1bGxXaWR0aCwgZnVsbEhlaWdodCB9ID0gdmlldzsKICAgICAgICBsZWZ0ICs9IHZpZXcub2Zmc2V0WCAqIHdpZHRoIC8gZnVsbFdpZHRoOwogICAgICAgIHRvcCAtPSB2aWV3Lm9mZnNldFkgKiBoZWlnaHQgLyBmdWxsSGVpZ2h0OwogICAgICAgIHdpZHRoICo9IHZpZXcud2lkdGggLyBmdWxsV2lkdGg7CiAgICAgICAgaGVpZ2h0ICo9IHZpZXcuaGVpZ2h0IC8gZnVsbEhlaWdodDsKICAgICAgfQogICAgICBjb25zdCBza2V3ID0gdGhpcy5maWxtT2Zmc2V0OwogICAgICBpZiAoc2tldyAhPT0gMCkKICAgICAgICBsZWZ0ICs9IG5lYXIgKiBza2V3IC8gdGhpcy5nZXRGaWxtV2lkdGgoKTsKICAgICAgdGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZShsZWZ0LCBsZWZ0ICsgd2lkdGgsIHRvcCwgdG9wIC0gaGVpZ2h0LCBuZWFyLCB0aGlzLmZhciwgdGhpcy5jb29yZGluYXRlU3lzdGVtKTsKICAgICAgdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMucHJvamVjdGlvbk1hdHJpeCkuaW52ZXJ0KCk7CiAgICB9CiAgICB0b0pTT04obWV0YSkgewogICAgICBjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKG1ldGEpOwogICAgICBkYXRhLm9iamVjdC5mb3YgPSB0aGlzLmZvdjsKICAgICAgZGF0YS5vYmplY3Quem9vbSA9IHRoaXMuem9vbTsKICAgICAgZGF0YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjsKICAgICAgZGF0YS5vYmplY3QuZmFyID0gdGhpcy5mYXI7CiAgICAgIGRhdGEub2JqZWN0LmZvY3VzID0gdGhpcy5mb2N1czsKICAgICAgZGF0YS5vYmplY3QuYXNwZWN0ID0gdGhpcy5hc3BlY3Q7CiAgICAgIGlmICh0aGlzLnZpZXcgIT09IG51bGwpCiAgICAgICAgZGF0YS5vYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMudmlldyk7CiAgICAgIGRhdGEub2JqZWN0LmZpbG1HYXVnZSA9IHRoaXMuZmlsbUdhdWdlOwogICAgICBkYXRhLm9iamVjdC5maWxtT2Zmc2V0ID0gdGhpcy5maWxtT2Zmc2V0OwogICAgICByZXR1cm4gZGF0YTsKICAgIH0KICB9OwogIEN1YmVDYW1lcmEgPSBjbGFzcyBDdWJlQ2FtZXJhIGV4dGVuZHMgT2JqZWN0M0QgewogICAgY29uc3RydWN0b3IobmVhciwgZmFyLCByZW5kZXJUYXJnZXQpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy50eXBlID0gIkN1YmVDYW1lcmEiOwogICAgICB0aGlzLnJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDsKICAgICAgdGhpcy5jb29yZGluYXRlU3lzdGVtID0gbnVsbDsKICAgICAgdGhpcy5hY3RpdmVNaXBtYXBMZXZlbCA9IDA7CiAgICAgIGNvbnN0IGNhbWVyYVBYID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIpOwogICAgICBjYW1lcmFQWC5sYXllcnMgPSB0aGlzLmxheWVyczsKICAgICAgdGhpcy5hZGQoY2FtZXJhUFgpOwogICAgICBjb25zdCBjYW1lcmFOWCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYShmb3YsIGFzcGVjdCwgbmVhciwgZmFyKTsKICAgICAgY2FtZXJhTlgubGF5ZXJzID0gdGhpcy5sYXllcnM7CiAgICAgIHRoaXMuYWRkKGNhbWVyYU5YKTsKICAgICAgY29uc3QgY2FtZXJhUFkgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoZm92LCBhc3BlY3QsIG5lYXIsIGZhcik7CiAgICAgIGNhbWVyYVBZLmxheWVycyA9IHRoaXMubGF5ZXJzOwogICAgICB0aGlzLmFkZChjYW1lcmFQWSk7CiAgICAgIGNvbnN0IGNhbWVyYU5ZID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIpOwogICAgICBjYW1lcmFOWS5sYXllcnMgPSB0aGlzLmxheWVyczsKICAgICAgdGhpcy5hZGQoY2FtZXJhTlkpOwogICAgICBjb25zdCBjYW1lcmFQWiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYShmb3YsIGFzcGVjdCwgbmVhciwgZmFyKTsKICAgICAgY2FtZXJhUFoubGF5ZXJzID0gdGhpcy5sYXllcnM7CiAgICAgIHRoaXMuYWRkKGNhbWVyYVBaKTsKICAgICAgY29uc3QgY2FtZXJhTlogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoZm92LCBhc3BlY3QsIG5lYXIsIGZhcik7CiAgICAgIGNhbWVyYU5aLmxheWVycyA9IHRoaXMubGF5ZXJzOwogICAgICB0aGlzLmFkZChjYW1lcmFOWik7CiAgICB9CiAgICB1cGRhdGVDb29yZGluYXRlU3lzdGVtKCkgewogICAgICBjb25zdCBjb29yZGluYXRlU3lzdGVtID0gdGhpcy5jb29yZGluYXRlU3lzdGVtOwogICAgICBjb25zdCBjYW1lcmFzID0gdGhpcy5jaGlsZHJlbi5jb25jYXQoKTsKICAgICAgY29uc3QgW2NhbWVyYVBYLCBjYW1lcmFOWCwgY2FtZXJhUFksIGNhbWVyYU5ZLCBjYW1lcmFQWiwgY2FtZXJhTlpdID0gY2FtZXJhczsKICAgICAgZm9yIChjb25zdCBjYW1lcmEgb2YgY2FtZXJhcykKICAgICAgICB0aGlzLnJlbW92ZShjYW1lcmEpOwogICAgICBpZiAoY29vcmRpbmF0ZVN5c3RlbSA9PT0gV2ViR0xDb29yZGluYXRlU3lzdGVtKSB7CiAgICAgICAgY2FtZXJhUFgudXAuc2V0KDAsIDEsIDApOwogICAgICAgIGNhbWVyYVBYLmxvb2tBdCgxLCAwLCAwKTsKICAgICAgICBjYW1lcmFOWC51cC5zZXQoMCwgMSwgMCk7CiAgICAgICAgY2FtZXJhTlgubG9va0F0KC0xLCAwLCAwKTsKICAgICAgICBjYW1lcmFQWS51cC5zZXQoMCwgMCwgLTEpOwogICAgICAgIGNhbWVyYVBZLmxvb2tBdCgwLCAxLCAwKTsKICAgICAgICBjYW1lcmFOWS51cC5zZXQoMCwgMCwgMSk7CiAgICAgICAgY2FtZXJhTlkubG9va0F0KDAsIC0xLCAwKTsKICAgICAgICBjYW1lcmFQWi51cC5zZXQoMCwgMSwgMCk7CiAgICAgICAgY2FtZXJhUFoubG9va0F0KDAsIDAsIDEpOwogICAgICAgIGNhbWVyYU5aLnVwLnNldCgwLCAxLCAwKTsKICAgICAgICBjYW1lcmFOWi5sb29rQXQoMCwgMCwgLTEpOwogICAgICB9IGVsc2UgaWYgKGNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW0pIHsKICAgICAgICBjYW1lcmFQWC51cC5zZXQoMCwgLTEsIDApOwogICAgICAgIGNhbWVyYVBYLmxvb2tBdCgtMSwgMCwgMCk7CiAgICAgICAgY2FtZXJhTlgudXAuc2V0KDAsIC0xLCAwKTsKICAgICAgICBjYW1lcmFOWC5sb29rQXQoMSwgMCwgMCk7CiAgICAgICAgY2FtZXJhUFkudXAuc2V0KDAsIDAsIDEpOwogICAgICAgIGNhbWVyYVBZLmxvb2tBdCgwLCAxLCAwKTsKICAgICAgICBjYW1lcmFOWS51cC5zZXQoMCwgMCwgLTEpOwogICAgICAgIGNhbWVyYU5ZLmxvb2tBdCgwLCAtMSwgMCk7CiAgICAgICAgY2FtZXJhUFoudXAuc2V0KDAsIC0xLCAwKTsKICAgICAgICBjYW1lcmFQWi5sb29rQXQoMCwgMCwgMSk7CiAgICAgICAgY2FtZXJhTloudXAuc2V0KDAsIC0xLCAwKTsKICAgICAgICBjYW1lcmFOWi5sb29rQXQoMCwgMCwgLTEpOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiVEhSRUUuQ3ViZUNhbWVyYS51cGRhdGVDb29yZGluYXRlU3lzdGVtKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIgKyBjb29yZGluYXRlU3lzdGVtKTsKICAgICAgfQogICAgICBmb3IgKGNvbnN0IGNhbWVyYSBvZiBjYW1lcmFzKSB7CiAgICAgICAgdGhpcy5hZGQoY2FtZXJhKTsKICAgICAgICBjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTsKICAgICAgfQogICAgfQogICAgdXBkYXRlKHJlbmRlcmVyLCBzY2VuZSkgewogICAgICBpZiAodGhpcy5wYXJlbnQgPT09IG51bGwpCiAgICAgICAgdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpOwogICAgICBjb25zdCB7IHJlbmRlclRhcmdldCwgYWN0aXZlTWlwbWFwTGV2ZWwgfSA9IHRoaXM7CiAgICAgIGlmICh0aGlzLmNvb3JkaW5hdGVTeXN0ZW0gIT09IHJlbmRlcmVyLmNvb3JkaW5hdGVTeXN0ZW0pIHsKICAgICAgICB0aGlzLmNvb3JkaW5hdGVTeXN0ZW0gPSByZW5kZXJlci5jb29yZGluYXRlU3lzdGVtOwogICAgICAgIHRoaXMudXBkYXRlQ29vcmRpbmF0ZVN5c3RlbSgpOwogICAgICB9CiAgICAgIGNvbnN0IFtjYW1lcmFQWCwgY2FtZXJhTlgsIGNhbWVyYVBZLCBjYW1lcmFOWSwgY2FtZXJhUFosIGNhbWVyYU5aXSA9IHRoaXMuY2hpbGRyZW47CiAgICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTsKICAgICAgY29uc3QgY3VycmVudEFjdGl2ZUN1YmVGYWNlID0gcmVuZGVyZXIuZ2V0QWN0aXZlQ3ViZUZhY2UoKTsKICAgICAgY29uc3QgY3VycmVudEFjdGl2ZU1pcG1hcExldmVsID0gcmVuZGVyZXIuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKTsKICAgICAgY29uc3QgY3VycmVudFhyRW5hYmxlZCA9IHJlbmRlcmVyLnhyLmVuYWJsZWQ7CiAgICAgIHJlbmRlcmVyLnhyLmVuYWJsZWQgPSBmYWxzZTsKICAgICAgY29uc3QgZ2VuZXJhdGVNaXBtYXBzID0gcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzOwogICAgICByZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTsKICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCwgMCwgYWN0aXZlTWlwbWFwTGV2ZWwpOwogICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYVBYKTsKICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCwgMSwgYWN0aXZlTWlwbWFwTGV2ZWwpOwogICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYU5YKTsKICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCwgMiwgYWN0aXZlTWlwbWFwTGV2ZWwpOwogICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYVBZKTsKICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCwgMywgYWN0aXZlTWlwbWFwTGV2ZWwpOwogICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYU5ZKTsKICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCwgNCwgYWN0aXZlTWlwbWFwTGV2ZWwpOwogICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYVBaKTsKICAgICAgcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZ2VuZXJhdGVNaXBtYXBzOwogICAgICByZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQocmVuZGVyVGFyZ2V0LCA1LCBhY3RpdmVNaXBtYXBMZXZlbCk7CiAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhTlopOwogICAgICByZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoY3VycmVudFJlbmRlclRhcmdldCwgY3VycmVudEFjdGl2ZUN1YmVGYWNlLCBjdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWwpOwogICAgICByZW5kZXJlci54ci5lbmFibGVkID0gY3VycmVudFhyRW5hYmxlZDsKICAgICAgcmVuZGVyVGFyZ2V0LnRleHR1cmUubmVlZHNQTVJFTVVwZGF0ZSA9IHRydWU7CiAgICB9CiAgfTsKICBDdWJlVGV4dHVyZSA9IGNsYXNzIEN1YmVUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7CiAgICBjb25zdHJ1Y3RvcihpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgY29sb3JTcGFjZSkgewogICAgICBpbWFnZXMgPSBpbWFnZXMgIT09IHVuZGVmaW5lZCA/IGltYWdlcyA6IFtdOwogICAgICBtYXBwaW5nID0gbWFwcGluZyAhPT0gdW5kZWZpbmVkID8gbWFwcGluZyA6IEN1YmVSZWZsZWN0aW9uTWFwcGluZzsKICAgICAgc3VwZXIoaW1hZ2VzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGNvbG9yU3BhY2UpOwogICAgICB0aGlzLmlzQ3ViZVRleHR1cmUgPSB0cnVlOwogICAgICB0aGlzLmZsaXBZID0gZmFsc2U7CiAgICB9CiAgICBnZXQgaW1hZ2VzKCkgewogICAgICByZXR1cm4gdGhpcy5pbWFnZTsKICAgIH0KICAgIHNldCBpbWFnZXModmFsdWUpIHsKICAgICAgdGhpcy5pbWFnZSA9IHZhbHVlOwogICAgfQogIH07CiAgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ID0gY2xhc3MgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0IGV4dGVuZHMgV2ViR0xSZW5kZXJUYXJnZXQgewogICAgY29uc3RydWN0b3Ioc2l6ZSA9IDEsIG9wdGlvbnMgPSB7fSkgewogICAgICBzdXBlcihzaXplLCBzaXplLCBvcHRpb25zKTsKICAgICAgdGhpcy5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCA9IHRydWU7CiAgICAgIGNvbnN0IGltYWdlID0geyB3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplLCBkZXB0aDogMSB9OwogICAgICBjb25zdCBpbWFnZXMgPSBbaW1hZ2UsIGltYWdlLCBpbWFnZSwgaW1hZ2UsIGltYWdlLCBpbWFnZV07CiAgICAgIHRoaXMudGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZShpbWFnZXMsIG9wdGlvbnMubWFwcGluZywgb3B0aW9ucy53cmFwUywgb3B0aW9ucy53cmFwVCwgb3B0aW9ucy5tYWdGaWx0ZXIsIG9wdGlvbnMubWluRmlsdGVyLCBvcHRpb25zLmZvcm1hdCwgb3B0aW9ucy50eXBlLCBvcHRpb25zLmFuaXNvdHJvcHksIG9wdGlvbnMuY29sb3JTcGFjZSk7CiAgICAgIHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmUgPSB0cnVlOwogICAgICB0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gb3B0aW9ucy5nZW5lcmF0ZU1pcG1hcHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZ2VuZXJhdGVNaXBtYXBzIDogZmFsc2U7CiAgICAgIHRoaXMudGV4dHVyZS5taW5GaWx0ZXIgPSBvcHRpb25zLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5taW5GaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7CiAgICB9CiAgICBmcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZShyZW5kZXJlciwgdGV4dHVyZSkgewogICAgICB0aGlzLnRleHR1cmUudHlwZSA9IHRleHR1cmUudHlwZTsKICAgICAgdGhpcy50ZXh0dXJlLmNvbG9yU3BhY2UgPSB0ZXh0dXJlLmNvbG9yU3BhY2U7CiAgICAgIHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwczsKICAgICAgdGhpcy50ZXh0dXJlLm1pbkZpbHRlciA9IHRleHR1cmUubWluRmlsdGVyOwogICAgICB0aGlzLnRleHR1cmUubWFnRmlsdGVyID0gdGV4dHVyZS5tYWdGaWx0ZXI7CiAgICAgIGNvbnN0IHNoYWRlciA9IHsKICAgICAgICB1bmlmb3JtczogewogICAgICAgICAgdEVxdWlyZWN0OiB7IHZhbHVlOiBudWxsIH0KICAgICAgICB9LAogICAgICAgIHZlcnRleFNoYWRlcjogYAoKCQkJCXZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CgoJCQkJdmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHsKCgkJCQkJcmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7CgoJCQkJfQoKCQkJCXZvaWQgbWFpbigpIHsKCgkJCQkJdldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTsKCgkJCQkJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCQkJCQkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgoJCQkJfQoJCQlgLAogICAgICAgIGZyYWdtZW50U2hhZGVyOiBgCgoJCQkJdW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0OwoKCQkJCXZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CgoJCQkJI2luY2x1ZGUgPGNvbW1vbj4KCgkJCQl2b2lkIG1haW4oKSB7CgoJCQkJCXZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29ybGREaXJlY3Rpb24gKTsKCgkJCQkJdmVjMiBzYW1wbGVVViA9IGVxdWlyZWN0VXYoIGRpcmVjdGlvbiApOwoKCQkJCQlnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTsKCgkJCQl9CgkJCWAKICAgICAgfTsKICAgICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgQm94R2VvbWV0cnkoNSwgNSwgNSk7CiAgICAgIGNvbnN0IG1hdGVyaWFsID0gbmV3IFNoYWRlck1hdGVyaWFsKHsKICAgICAgICBuYW1lOiAiQ3ViZW1hcEZyb21FcXVpcmVjdCIsCiAgICAgICAgdW5pZm9ybXM6IGNsb25lVW5pZm9ybXMoc2hhZGVyLnVuaWZvcm1zKSwKICAgICAgICB2ZXJ0ZXhTaGFkZXI6IHNoYWRlci52ZXJ0ZXhTaGFkZXIsCiAgICAgICAgZnJhZ21lbnRTaGFkZXI6IHNoYWRlci5mcmFnbWVudFNoYWRlciwKICAgICAgICBzaWRlOiBCYWNrU2lkZSwKICAgICAgICBibGVuZGluZzogTm9CbGVuZGluZwogICAgICB9KTsKICAgICAgbWF0ZXJpYWwudW5pZm9ybXMudEVxdWlyZWN0LnZhbHVlID0gdGV4dHVyZTsKICAgICAgY29uc3QgbWVzaCA9IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCk7CiAgICAgIGNvbnN0IGN1cnJlbnRNaW5GaWx0ZXIgPSB0ZXh0dXJlLm1pbkZpbHRlcjsKICAgICAgaWYgKHRleHR1cmUubWluRmlsdGVyID09PSBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIpCiAgICAgICAgdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7CiAgICAgIGNvbnN0IGNhbWVyYSA9IG5ldyBDdWJlQ2FtZXJhKDEsIDEwLCB0aGlzKTsKICAgICAgY2FtZXJhLnVwZGF0ZShyZW5kZXJlciwgbWVzaCk7CiAgICAgIHRleHR1cmUubWluRmlsdGVyID0gY3VycmVudE1pbkZpbHRlcjsKICAgICAgbWVzaC5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAgIG1lc2gubWF0ZXJpYWwuZGlzcG9zZSgpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGNsZWFyKHJlbmRlcmVyLCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwpIHsKICAgICAgY29uc3QgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpOwogICAgICBmb3IgKGxldCBpID0gMDtpIDwgNjsgaSsrKSB7CiAgICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHRoaXMsIGkpOwogICAgICAgIHJlbmRlcmVyLmNsZWFyKGNvbG9yLCBkZXB0aCwgc3RlbmNpbCk7CiAgICAgIH0KICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KGN1cnJlbnRSZW5kZXJUYXJnZXQpOwogICAgfQogIH07CiAgR3JvdXAgPSBjbGFzcyBHcm91cCBleHRlbmRzIE9iamVjdDNEIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzR3JvdXAgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiR3JvdXAiOwogICAgfQogIH07CiAgX21vdmVFdmVudCA9IHsgdHlwZTogIm1vdmUiIH07CiAgU2NlbmUgPSBjbGFzcyBTY2VuZSBleHRlbmRzIE9iamVjdDNEIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzU2NlbmUgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiU2NlbmUiOwogICAgICB0aGlzLmJhY2tncm91bmQgPSBudWxsOwogICAgICB0aGlzLmVudmlyb25tZW50ID0gbnVsbDsKICAgICAgdGhpcy5mb2cgPSBudWxsOwogICAgICB0aGlzLmJhY2tncm91bmRCbHVycmluZXNzID0gMDsKICAgICAgdGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5ID0gMTsKICAgICAgdGhpcy5iYWNrZ3JvdW5kUm90YXRpb24gPSBuZXcgRXVsZXI7CiAgICAgIHRoaXMuZW52aXJvbm1lbnRJbnRlbnNpdHkgPSAxOwogICAgICB0aGlzLmVudmlyb25tZW50Um90YXRpb24gPSBuZXcgRXVsZXI7CiAgICAgIHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IG51bGw7CiAgICAgIGlmICh0eXBlb2YgX19USFJFRV9ERVZUT09MU19fICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIF9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgib2JzZXJ2ZSIsIHsgZGV0YWlsOiB0aGlzIH0pKTsKICAgICAgfQogICAgfQogICAgY29weShzb3VyY2UsIHJlY3Vyc2l2ZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSwgcmVjdXJzaXZlKTsKICAgICAgaWYgKHNvdXJjZS5iYWNrZ3JvdW5kICE9PSBudWxsKQogICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHNvdXJjZS5iYWNrZ3JvdW5kLmNsb25lKCk7CiAgICAgIGlmIChzb3VyY2UuZW52aXJvbm1lbnQgIT09IG51bGwpCiAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IHNvdXJjZS5lbnZpcm9ubWVudC5jbG9uZSgpOwogICAgICBpZiAoc291cmNlLmZvZyAhPT0gbnVsbCkKICAgICAgICB0aGlzLmZvZyA9IHNvdXJjZS5mb2cuY2xvbmUoKTsKICAgICAgdGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcyA9IHNvdXJjZS5iYWNrZ3JvdW5kQmx1cnJpbmVzczsKICAgICAgdGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5ID0gc291cmNlLmJhY2tncm91bmRJbnRlbnNpdHk7CiAgICAgIHRoaXMuYmFja2dyb3VuZFJvdGF0aW9uLmNvcHkoc291cmNlLmJhY2tncm91bmRSb3RhdGlvbik7CiAgICAgIHRoaXMuZW52aXJvbm1lbnRJbnRlbnNpdHkgPSBzb3VyY2UuZW52aXJvbm1lbnRJbnRlbnNpdHk7CiAgICAgIHRoaXMuZW52aXJvbm1lbnRSb3RhdGlvbi5jb3B5KHNvdXJjZS5lbnZpcm9ubWVudFJvdGF0aW9uKTsKICAgICAgaWYgKHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsICE9PSBudWxsKQogICAgICAgIHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCk7CiAgICAgIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHRvSlNPTihtZXRhKSB7CiAgICAgIGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04obWV0YSk7CiAgICAgIGlmICh0aGlzLmZvZyAhPT0gbnVsbCkKICAgICAgICBkYXRhLm9iamVjdC5mb2cgPSB0aGlzLmZvZy50b0pTT04oKTsKICAgICAgaWYgKHRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3MgPiAwKQogICAgICAgIGRhdGEub2JqZWN0LmJhY2tncm91bmRCbHVycmluZXNzID0gdGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzczsKICAgICAgaWYgKHRoaXMuYmFja2dyb3VuZEludGVuc2l0eSAhPT0gMSkKICAgICAgICBkYXRhLm9iamVjdC5iYWNrZ3JvdW5kSW50ZW5zaXR5ID0gdGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5OwogICAgICBkYXRhLm9iamVjdC5iYWNrZ3JvdW5kUm90YXRpb24gPSB0aGlzLmJhY2tncm91bmRSb3RhdGlvbi50b0FycmF5KCk7CiAgICAgIGlmICh0aGlzLmVudmlyb25tZW50SW50ZW5zaXR5ICE9PSAxKQogICAgICAgIGRhdGEub2JqZWN0LmVudmlyb25tZW50SW50ZW5zaXR5ID0gdGhpcy5lbnZpcm9ubWVudEludGVuc2l0eTsKICAgICAgZGF0YS5vYmplY3QuZW52aXJvbm1lbnRSb3RhdGlvbiA9IHRoaXMuZW52aXJvbm1lbnRSb3RhdGlvbi50b0FycmF5KCk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogIH07CiAgX3ZlY3RvciQ3ID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIFNwcml0ZU1hdGVyaWFsID0gY2xhc3MgU3ByaXRlTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7CiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNTcHJpdGVNYXRlcmlhbCA9IHRydWU7CiAgICAgIHRoaXMudHlwZSA9ICJTcHJpdGVNYXRlcmlhbCI7CiAgICAgIHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoMTY3NzcyMTUpOwogICAgICB0aGlzLm1hcCA9IG51bGw7CiAgICAgIHRoaXMuYWxwaGFNYXAgPSBudWxsOwogICAgICB0aGlzLnJvdGF0aW9uID0gMDsKICAgICAgdGhpcy5zaXplQXR0ZW51YXRpb24gPSB0cnVlOwogICAgICB0aGlzLnRyYW5zcGFyZW50ID0gdHJ1ZTsKICAgICAgdGhpcy5mb2cgPSB0cnVlOwogICAgICB0aGlzLnNldFZhbHVlcyhwYXJhbWV0ZXJzKTsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5jb2xvci5jb3B5KHNvdXJjZS5jb2xvcik7CiAgICAgIHRoaXMubWFwID0gc291cmNlLm1hcDsKICAgICAgdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKICAgICAgdGhpcy5yb3RhdGlvbiA9IHNvdXJjZS5yb3RhdGlvbjsKICAgICAgdGhpcy5zaXplQXR0ZW51YXRpb24gPSBzb3VyY2Uuc2l6ZUF0dGVudWF0aW9uOwogICAgICB0aGlzLmZvZyA9IHNvdXJjZS5mb2c7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH07CiAgX2ludGVyc2VjdFBvaW50ID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF93b3JsZFNjYWxlID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9tdlBvc2l0aW9uID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9hbGlnbmVkUG9zaXRpb24gPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjI7CiAgX3JvdGF0ZWRQb3NpdGlvbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMjsKICBfdmlld1dvcmxkTWF0cml4ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXg0OwogIF92QSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfdkIgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX3ZDID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF91dkEgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjI7CiAgX3V2QiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMjsKICBfdXZDID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IyOwogIFNwcml0ZSA9IGNsYXNzIFNwcml0ZSBleHRlbmRzIE9iamVjdDNEIHsKICAgIGNvbnN0cnVjdG9yKG1hdGVyaWFsID0gbmV3IFNwcml0ZU1hdGVyaWFsKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNTcHJpdGUgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiU3ByaXRlIjsKICAgICAgaWYgKF9nZW9tZXRyeSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgX2dlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5OwogICAgICAgIGNvbnN0IGZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoWwogICAgICAgICAgLTAuNSwKICAgICAgICAgIC0wLjUsCiAgICAgICAgICAwLAogICAgICAgICAgMCwKICAgICAgICAgIDAsCiAgICAgICAgICAwLjUsCiAgICAgICAgICAtMC41LAogICAgICAgICAgMCwKICAgICAgICAgIDEsCiAgICAgICAgICAwLAogICAgICAgICAgMC41LAogICAgICAgICAgMC41LAogICAgICAgICAgMCwKICAgICAgICAgIDEsCiAgICAgICAgICAxLAogICAgICAgICAgLTAuNSwKICAgICAgICAgIDAuNSwKICAgICAgICAgIDAsCiAgICAgICAgICAwLAogICAgICAgICAgMQogICAgICAgIF0pOwogICAgICAgIGNvbnN0IGludGVybGVhdmVkQnVmZmVyID0gbmV3IEludGVybGVhdmVkQnVmZmVyKGZsb2F0MzJBcnJheSwgNSk7CiAgICAgICAgX2dlb21ldHJ5LnNldEluZGV4KFswLCAxLCAyLCAwLCAyLCAzXSk7CiAgICAgICAgX2dlb21ldHJ5LnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoaW50ZXJsZWF2ZWRCdWZmZXIsIDMsIDAsIGZhbHNlKSk7CiAgICAgICAgX2dlb21ldHJ5LnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoaW50ZXJsZWF2ZWRCdWZmZXIsIDIsIDMsIGZhbHNlKSk7CiAgICAgIH0KICAgICAgdGhpcy5nZW9tZXRyeSA9IF9nZW9tZXRyeTsKICAgICAgdGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsOwogICAgICB0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKDAuNSwgMC41KTsKICAgIH0KICAgIHJheWNhc3QocmF5Y2FzdGVyLCBpbnRlcnNlY3RzKSB7CiAgICAgIGlmIChyYXljYXN0ZXIuY2FtZXJhID09PSBudWxsKSB7CiAgICAgICAgY29uc29sZS5lcnJvcignVEhSRUUuU3ByaXRlOiAiUmF5Y2FzdGVyLmNhbWVyYSIgbmVlZHMgdG8gYmUgc2V0IGluIG9yZGVyIHRvIHJheWNhc3QgYWdhaW5zdCBzcHJpdGVzLicpOwogICAgICB9CiAgICAgIF93b3JsZFNjYWxlLnNldEZyb21NYXRyaXhTY2FsZSh0aGlzLm1hdHJpeFdvcmxkKTsKICAgICAgX3ZpZXdXb3JsZE1hdHJpeC5jb3B5KHJheWNhc3Rlci5jYW1lcmEubWF0cml4V29ybGQpOwogICAgICB0aGlzLm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKHJheWNhc3Rlci5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCB0aGlzLm1hdHJpeFdvcmxkKTsKICAgICAgX212UG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubW9kZWxWaWV3TWF0cml4KTsKICAgICAgaWYgKHJheWNhc3Rlci5jYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSAmJiB0aGlzLm1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiA9PT0gZmFsc2UpIHsKICAgICAgICBfd29ybGRTY2FsZS5tdWx0aXBseVNjYWxhcigtX212UG9zaXRpb24ueik7CiAgICAgIH0KICAgICAgY29uc3Qgcm90YXRpb24gPSB0aGlzLm1hdGVyaWFsLnJvdGF0aW9uOwogICAgICBsZXQgc2luLCBjb3M7CiAgICAgIGlmIChyb3RhdGlvbiAhPT0gMCkgewogICAgICAgIGNvcyA9IE1hdGguY29zKHJvdGF0aW9uKTsKICAgICAgICBzaW4gPSBNYXRoLnNpbihyb3RhdGlvbik7CiAgICAgIH0KICAgICAgY29uc3QgY2VudGVyID0gdGhpcy5jZW50ZXI7CiAgICAgIHRyYW5zZm9ybVZlcnRleChfdkEuc2V0KC0wLjUsIC0wLjUsIDApLCBfbXZQb3NpdGlvbiwgY2VudGVyLCBfd29ybGRTY2FsZSwgc2luLCBjb3MpOwogICAgICB0cmFuc2Zvcm1WZXJ0ZXgoX3ZCLnNldCgwLjUsIC0wLjUsIDApLCBfbXZQb3NpdGlvbiwgY2VudGVyLCBfd29ybGRTY2FsZSwgc2luLCBjb3MpOwogICAgICB0cmFuc2Zvcm1WZXJ0ZXgoX3ZDLnNldCgwLjUsIDAuNSwgMCksIF9tdlBvc2l0aW9uLCBjZW50ZXIsIF93b3JsZFNjYWxlLCBzaW4sIGNvcyk7CiAgICAgIF91dkEuc2V0KDAsIDApOwogICAgICBfdXZCLnNldCgxLCAwKTsKICAgICAgX3V2Qy5zZXQoMSwgMSk7CiAgICAgIGxldCBpbnRlcnNlY3QgPSByYXljYXN0ZXIucmF5LmludGVyc2VjdFRyaWFuZ2xlKF92QSwgX3ZCLCBfdkMsIGZhbHNlLCBfaW50ZXJzZWN0UG9pbnQpOwogICAgICBpZiAoaW50ZXJzZWN0ID09PSBudWxsKSB7CiAgICAgICAgdHJhbnNmb3JtVmVydGV4KF92Qi5zZXQoLTAuNSwgMC41LCAwKSwgX212UG9zaXRpb24sIGNlbnRlciwgX3dvcmxkU2NhbGUsIHNpbiwgY29zKTsKICAgICAgICBfdXZCLnNldCgwLCAxKTsKICAgICAgICBpbnRlcnNlY3QgPSByYXljYXN0ZXIucmF5LmludGVyc2VjdFRyaWFuZ2xlKF92QSwgX3ZDLCBfdkIsIGZhbHNlLCBfaW50ZXJzZWN0UG9pbnQpOwogICAgICAgIGlmIChpbnRlcnNlY3QgPT09IG51bGwpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKF9pbnRlcnNlY3RQb2ludCk7CiAgICAgIGlmIChkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhcikKICAgICAgICByZXR1cm47CiAgICAgIGludGVyc2VjdHMucHVzaCh7CiAgICAgICAgZGlzdGFuY2UsCiAgICAgICAgcG9pbnQ6IF9pbnRlcnNlY3RQb2ludC5jbG9uZSgpLAogICAgICAgIHV2OiBUcmlhbmdsZS5nZXRJbnRlcnBvbGF0aW9uKF9pbnRlcnNlY3RQb2ludCwgX3ZBLCBfdkIsIF92QywgX3V2QSwgX3V2QiwgX3V2QywgbmV3IFZlY3RvcjIpLAogICAgICAgIGZhY2U6IG51bGwsCiAgICAgICAgb2JqZWN0OiB0aGlzCiAgICAgIH0pOwogICAgfQogICAgY29weShzb3VyY2UsIHJlY3Vyc2l2ZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSwgcmVjdXJzaXZlKTsKICAgICAgaWYgKHNvdXJjZS5jZW50ZXIgIT09IHVuZGVmaW5lZCkKICAgICAgICB0aGlzLmNlbnRlci5jb3B5KHNvdXJjZS5jZW50ZXIpOwogICAgICB0aGlzLm1hdGVyaWFsID0gc291cmNlLm1hdGVyaWFsOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIF92MSQyID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF92MiQxID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIExPRCA9IGNsYXNzIExPRCBleHRlbmRzIE9iamVjdDNEIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLl9jdXJyZW50TGV2ZWwgPSAwOwogICAgICB0aGlzLnR5cGUgPSAiTE9EIjsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywgewogICAgICAgIGxldmVsczogewogICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgIHZhbHVlOiBbXQogICAgICAgIH0sCiAgICAgICAgaXNMT0Q6IHsKICAgICAgICAgIHZhbHVlOiB0cnVlCiAgICAgICAgfQogICAgICB9KTsKICAgICAgdGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlLCBmYWxzZSk7CiAgICAgIGNvbnN0IGxldmVscyA9IHNvdXJjZS5sZXZlbHM7CiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgY29uc3QgbGV2ZWwgPSBsZXZlbHNbaV07CiAgICAgICAgdGhpcy5hZGRMZXZlbChsZXZlbC5vYmplY3QuY2xvbmUoKSwgbGV2ZWwuZGlzdGFuY2UsIGxldmVsLmh5c3RlcmVzaXMpOwogICAgICB9CiAgICAgIHRoaXMuYXV0b1VwZGF0ZSA9IHNvdXJjZS5hdXRvVXBkYXRlOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGFkZExldmVsKG9iamVjdCwgZGlzdGFuY2UgPSAwLCBoeXN0ZXJlc2lzID0gMCkgewogICAgICBkaXN0YW5jZSA9IE1hdGguYWJzKGRpc3RhbmNlKTsKICAgICAgY29uc3QgbGV2ZWxzID0gdGhpcy5sZXZlbHM7CiAgICAgIGxldCBsOwogICAgICBmb3IgKGwgPSAwO2wgPCBsZXZlbHMubGVuZ3RoOyBsKyspIHsKICAgICAgICBpZiAoZGlzdGFuY2UgPCBsZXZlbHNbbF0uZGlzdGFuY2UpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXZlbHMuc3BsaWNlKGwsIDAsIHsgZGlzdGFuY2UsIGh5c3RlcmVzaXMsIG9iamVjdCB9KTsKICAgICAgdGhpcy5hZGQob2JqZWN0KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByZW1vdmVMZXZlbChkaXN0YW5jZSkgewogICAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmxldmVsczsKICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IGxldmVscy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChsZXZlbHNbaV0uZGlzdGFuY2UgPT09IGRpc3RhbmNlKSB7CiAgICAgICAgICBjb25zdCByZW1vdmVkRWxlbWVudHMgPSBsZXZlbHMuc3BsaWNlKGksIDEpOwogICAgICAgICAgdGhpcy5yZW1vdmUocmVtb3ZlZEVsZW1lbnRzWzBdLm9iamVjdCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZ2V0Q3VycmVudExldmVsKCkgewogICAgICByZXR1cm4gdGhpcy5fY3VycmVudExldmVsOwogICAgfQogICAgZ2V0T2JqZWN0Rm9yRGlzdGFuY2UoZGlzdGFuY2UpIHsKICAgICAgY29uc3QgbGV2ZWxzID0gdGhpcy5sZXZlbHM7CiAgICAgIGlmIChsZXZlbHMubGVuZ3RoID4gMCkgewogICAgICAgIGxldCBpLCBsOwogICAgICAgIGZvciAoaSA9IDEsIGwgPSBsZXZlbHMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICAgIGxldCBsZXZlbERpc3RhbmNlID0gbGV2ZWxzW2ldLmRpc3RhbmNlOwogICAgICAgICAgaWYgKGxldmVsc1tpXS5vYmplY3QudmlzaWJsZSkgewogICAgICAgICAgICBsZXZlbERpc3RhbmNlIC09IGxldmVsRGlzdGFuY2UgKiBsZXZlbHNbaV0uaHlzdGVyZXNpczsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChkaXN0YW5jZSA8IGxldmVsRGlzdGFuY2UpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsZXZlbHNbaSAtIDFdLm9iamVjdDsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJheWNhc3QocmF5Y2FzdGVyLCBpbnRlcnNlY3RzKSB7CiAgICAgIGNvbnN0IGxldmVscyA9IHRoaXMubGV2ZWxzOwogICAgICBpZiAobGV2ZWxzLmxlbmd0aCA+IDApIHsKICAgICAgICBfdjEkMi5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7CiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKF92MSQyKTsKICAgICAgICB0aGlzLmdldE9iamVjdEZvckRpc3RhbmNlKGRpc3RhbmNlKS5yYXljYXN0KHJheWNhc3RlciwgaW50ZXJzZWN0cyk7CiAgICAgIH0KICAgIH0KICAgIHVwZGF0ZShjYW1lcmEpIHsKICAgICAgY29uc3QgbGV2ZWxzID0gdGhpcy5sZXZlbHM7CiAgICAgIGlmIChsZXZlbHMubGVuZ3RoID4gMSkgewogICAgICAgIF92MSQyLnNldEZyb21NYXRyaXhQb3NpdGlvbihjYW1lcmEubWF0cml4V29ybGQpOwogICAgICAgIF92MiQxLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKTsKICAgICAgICBjb25zdCBkaXN0YW5jZSA9IF92MSQyLmRpc3RhbmNlVG8oX3YyJDEpIC8gY2FtZXJhLnpvb207CiAgICAgICAgbGV2ZWxzWzBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTsKICAgICAgICBsZXQgaSwgbDsKICAgICAgICBmb3IgKGkgPSAxLCBsID0gbGV2ZWxzLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICBsZXQgbGV2ZWxEaXN0YW5jZSA9IGxldmVsc1tpXS5kaXN0YW5jZTsKICAgICAgICAgIGlmIChsZXZlbHNbaV0ub2JqZWN0LnZpc2libGUpIHsKICAgICAgICAgICAgbGV2ZWxEaXN0YW5jZSAtPSBsZXZlbERpc3RhbmNlICogbGV2ZWxzW2ldLmh5c3RlcmVzaXM7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGlzdGFuY2UgPj0gbGV2ZWxEaXN0YW5jZSkgewogICAgICAgICAgICBsZXZlbHNbaSAtIDFdLm9iamVjdC52aXNpYmxlID0gZmFsc2U7CiAgICAgICAgICAgIGxldmVsc1tpXS5vYmplY3QudmlzaWJsZSA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5fY3VycmVudExldmVsID0gaSAtIDE7CiAgICAgICAgZm9yICg7aSA8IGw7IGkrKykgewogICAgICAgICAgbGV2ZWxzW2ldLm9iamVjdC52aXNpYmxlID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0b0pTT04obWV0YSkgewogICAgICBjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKG1ldGEpOwogICAgICBpZiAodGhpcy5hdXRvVXBkYXRlID09PSBmYWxzZSkKICAgICAgICBkYXRhLm9iamVjdC5hdXRvVXBkYXRlID0gZmFsc2U7CiAgICAgIGRhdGEub2JqZWN0LmxldmVscyA9IFtdOwogICAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmxldmVsczsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBsZXZlbHMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICBjb25zdCBsZXZlbCA9IGxldmVsc1tpXTsKICAgICAgICBkYXRhLm9iamVjdC5sZXZlbHMucHVzaCh7CiAgICAgICAgICBvYmplY3Q6IGxldmVsLm9iamVjdC51dWlkLAogICAgICAgICAgZGlzdGFuY2U6IGxldmVsLmRpc3RhbmNlLAogICAgICAgICAgaHlzdGVyZXNpczogbGV2ZWwuaHlzdGVyZXNpcwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogIH07CiAgX2Jhc2VQb3NpdGlvbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfc2tpbkluZGV4ID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3I0OwogIF9za2luV2VpZ2h0ID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3I0OwogIF92ZWN0b3IzID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9tYXRyaXg0ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXg0OwogIF92ZXJ0ZXggPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX3NwaGVyZSQ1ID0gLyogQF9fUFVSRV9fICovIG5ldyBTcGhlcmU7CiAgX2ludmVyc2VNYXRyaXgkMiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4NDsKICBfcmF5JDIgPSAvKiBAX19QVVJFX18gKi8gbmV3IFJheTsKICBTa2lubmVkTWVzaCA9IGNsYXNzIFNraW5uZWRNZXNoIGV4dGVuZHMgTWVzaCB7CiAgICBjb25zdHJ1Y3RvcihnZW9tZXRyeSwgbWF0ZXJpYWwpIHsKICAgICAgc3VwZXIoZ2VvbWV0cnksIG1hdGVyaWFsKTsKICAgICAgdGhpcy5pc1NraW5uZWRNZXNoID0gdHJ1ZTsKICAgICAgdGhpcy50eXBlID0gIlNraW5uZWRNZXNoIjsKICAgICAgdGhpcy5iaW5kTW9kZSA9IEF0dGFjaGVkQmluZE1vZGU7CiAgICAgIHRoaXMuYmluZE1hdHJpeCA9IG5ldyBNYXRyaXg0OwogICAgICB0aGlzLmJpbmRNYXRyaXhJbnZlcnNlID0gbmV3IE1hdHJpeDQ7CiAgICAgIHRoaXMuYm91bmRpbmdCb3ggPSBudWxsOwogICAgICB0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDsKICAgIH0KICAgIGNvbXB1dGVCb3VuZGluZ0JveCgpIHsKICAgICAgY29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OwogICAgICBpZiAodGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCkgewogICAgICAgIHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm94MzsKICAgICAgfQogICAgICB0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpOwogICAgICBjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTsKICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpKyspIHsKICAgICAgICB0aGlzLmdldFZlcnRleFBvc2l0aW9uKGksIF92ZXJ0ZXgpOwogICAgICAgIHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChfdmVydGV4KTsKICAgICAgfQogICAgfQogICAgY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCkgewogICAgICBjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgIGlmICh0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsKSB7CiAgICAgICAgdGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmU7CiAgICAgIH0KICAgICAgdGhpcy5ib3VuZGluZ1NwaGVyZS5tYWtlRW1wdHkoKTsKICAgICAgY29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7CiAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudDsgaSsrKSB7CiAgICAgICAgdGhpcy5nZXRWZXJ0ZXhQb3NpdGlvbihpLCBfdmVydGV4KTsKICAgICAgICB0aGlzLmJvdW5kaW5nU3BoZXJlLmV4cGFuZEJ5UG9pbnQoX3ZlcnRleCk7CiAgICAgIH0KICAgIH0KICAgIGNvcHkoc291cmNlLCByZWN1cnNpdmUpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UsIHJlY3Vyc2l2ZSk7CiAgICAgIHRoaXMuYmluZE1vZGUgPSBzb3VyY2UuYmluZE1vZGU7CiAgICAgIHRoaXMuYmluZE1hdHJpeC5jb3B5KHNvdXJjZS5iaW5kTWF0cml4KTsKICAgICAgdGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KHNvdXJjZS5iaW5kTWF0cml4SW52ZXJzZSk7CiAgICAgIHRoaXMuc2tlbGV0b24gPSBzb3VyY2Uuc2tlbGV0b247CiAgICAgIGlmIChzb3VyY2UuYm91bmRpbmdCb3ggIT09IG51bGwpCiAgICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveC5jbG9uZSgpOwogICAgICBpZiAoc291cmNlLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsKQogICAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBzb3VyY2UuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByYXljYXN0KHJheWNhc3RlciwgaW50ZXJzZWN0cykgewogICAgICBjb25zdCBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7CiAgICAgIGNvbnN0IG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDsKICAgICAgaWYgKG1hdGVyaWFsID09PSB1bmRlZmluZWQpCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAodGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCkKICAgICAgICB0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwogICAgICBfc3BoZXJlJDUuY29weSh0aGlzLmJvdW5kaW5nU3BoZXJlKTsKICAgICAgX3NwaGVyZSQ1LmFwcGx5TWF0cml4NChtYXRyaXhXb3JsZCk7CiAgICAgIGlmIChyYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoX3NwaGVyZSQ1KSA9PT0gZmFsc2UpCiAgICAgICAgcmV0dXJuOwogICAgICBfaW52ZXJzZU1hdHJpeCQyLmNvcHkobWF0cml4V29ybGQpLmludmVydCgpOwogICAgICBfcmF5JDIuY29weShyYXljYXN0ZXIucmF5KS5hcHBseU1hdHJpeDQoX2ludmVyc2VNYXRyaXgkMik7CiAgICAgIGlmICh0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsKSB7CiAgICAgICAgaWYgKF9yYXkkMi5pbnRlcnNlY3RzQm94KHRoaXMuYm91bmRpbmdCb3gpID09PSBmYWxzZSkKICAgICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLl9jb21wdXRlSW50ZXJzZWN0aW9ucyhyYXljYXN0ZXIsIGludGVyc2VjdHMsIF9yYXkkMik7CiAgICB9CiAgICBnZXRWZXJ0ZXhQb3NpdGlvbihpbmRleCwgdGFyZ2V0KSB7CiAgICAgIHN1cGVyLmdldFZlcnRleFBvc2l0aW9uKGluZGV4LCB0YXJnZXQpOwogICAgICB0aGlzLmFwcGx5Qm9uZVRyYW5zZm9ybShpbmRleCwgdGFyZ2V0KTsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGJpbmQoc2tlbGV0b24sIGJpbmRNYXRyaXgpIHsKICAgICAgdGhpcy5za2VsZXRvbiA9IHNrZWxldG9uOwogICAgICBpZiAoYmluZE1hdHJpeCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhpcy51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTsKICAgICAgICB0aGlzLnNrZWxldG9uLmNhbGN1bGF0ZUludmVyc2VzKCk7CiAgICAgICAgYmluZE1hdHJpeCA9IHRoaXMubWF0cml4V29ybGQ7CiAgICAgIH0KICAgICAgdGhpcy5iaW5kTWF0cml4LmNvcHkoYmluZE1hdHJpeCk7CiAgICAgIHRoaXMuYmluZE1hdHJpeEludmVyc2UuY29weShiaW5kTWF0cml4KS5pbnZlcnQoKTsKICAgIH0KICAgIHBvc2UoKSB7CiAgICAgIHRoaXMuc2tlbGV0b24ucG9zZSgpOwogICAgfQogICAgbm9ybWFsaXplU2tpbldlaWdodHMoKSB7CiAgICAgIGNvbnN0IHZlY3RvciA9IG5ldyBWZWN0b3I0OwogICAgICBjb25zdCBza2luV2VpZ2h0ID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQ7CiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gc2tpbldlaWdodC5jb3VudDtpIDwgbDsgaSsrKSB7CiAgICAgICAgdmVjdG9yLmZyb21CdWZmZXJBdHRyaWJ1dGUoc2tpbldlaWdodCwgaSk7CiAgICAgICAgY29uc3Qgc2NhbGUgPSAxIC8gdmVjdG9yLm1hbmhhdHRhbkxlbmd0aCgpOwogICAgICAgIGlmIChzY2FsZSAhPT0gSW5maW5pdHkpIHsKICAgICAgICAgIHZlY3Rvci5tdWx0aXBseVNjYWxhcihzY2FsZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZlY3Rvci5zZXQoMSwgMCwgMCwgMCk7CiAgICAgICAgfQogICAgICAgIHNraW5XZWlnaHQuc2V0WFlaVyhpLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56LCB2ZWN0b3Iudyk7CiAgICAgIH0KICAgIH0KICAgIHVwZGF0ZU1hdHJpeFdvcmxkKGZvcmNlKSB7CiAgICAgIHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKGZvcmNlKTsKICAgICAgaWYgKHRoaXMuYmluZE1vZGUgPT09IEF0dGFjaGVkQmluZE1vZGUpIHsKICAgICAgICB0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5iaW5kTW9kZSA9PT0gRGV0YWNoZWRCaW5kTW9kZSkgewogICAgICAgIHRoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSh0aGlzLmJpbmRNYXRyaXgpLmludmVydCgpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuU2tpbm5lZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTogIiArIHRoaXMuYmluZE1vZGUpOwogICAgICB9CiAgICB9CiAgICBhcHBseUJvbmVUcmFuc2Zvcm0oaW5kZXgsIHZlY3RvcikgewogICAgICBjb25zdCBza2VsZXRvbiA9IHRoaXMuc2tlbGV0b247CiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKICAgICAgX3NraW5JbmRleC5mcm9tQnVmZmVyQXR0cmlidXRlKGdlb21ldHJ5LmF0dHJpYnV0ZXMuc2tpbkluZGV4LCBpbmRleCk7CiAgICAgIF9za2luV2VpZ2h0LmZyb21CdWZmZXJBdHRyaWJ1dGUoZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0LCBpbmRleCk7CiAgICAgIF9iYXNlUG9zaXRpb24uY29weSh2ZWN0b3IpLmFwcGx5TWF0cml4NCh0aGlzLmJpbmRNYXRyaXgpOwogICAgICB2ZWN0b3Iuc2V0KDAsIDAsIDApOwogICAgICBmb3IgKGxldCBpID0gMDtpIDwgNDsgaSsrKSB7CiAgICAgICAgY29uc3Qgd2VpZ2h0ID0gX3NraW5XZWlnaHQuZ2V0Q29tcG9uZW50KGkpOwogICAgICAgIGlmICh3ZWlnaHQgIT09IDApIHsKICAgICAgICAgIGNvbnN0IGJvbmVJbmRleCA9IF9za2luSW5kZXguZ2V0Q29tcG9uZW50KGkpOwogICAgICAgICAgX21hdHJpeDQubXVsdGlwbHlNYXRyaWNlcyhza2VsZXRvbi5ib25lc1tib25lSW5kZXhdLm1hdHJpeFdvcmxkLCBza2VsZXRvbi5ib25lSW52ZXJzZXNbYm9uZUluZGV4XSk7CiAgICAgICAgICB2ZWN0b3IuYWRkU2NhbGVkVmVjdG9yKF92ZWN0b3IzLmNvcHkoX2Jhc2VQb3NpdGlvbikuYXBwbHlNYXRyaXg0KF9tYXRyaXg0KSwgd2VpZ2h0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQodGhpcy5iaW5kTWF0cml4SW52ZXJzZSk7CiAgICB9CiAgfTsKICBCb25lID0gY2xhc3MgQm9uZSBleHRlbmRzIE9iamVjdDNEIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzQm9uZSA9IHRydWU7CiAgICAgIHRoaXMudHlwZSA9ICJCb25lIjsKICAgIH0KICB9OwogIERhdGFUZXh0dXJlID0gY2xhc3MgRGF0YVRleHR1cmUgZXh0ZW5kcyBUZXh0dXJlIHsKICAgIGNvbnN0cnVjdG9yKGRhdGEgPSBudWxsLCB3aWR0aCA9IDEsIGhlaWdodCA9IDEsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyLCBtaW5GaWx0ZXIgPSBOZWFyZXN0RmlsdGVyLCBhbmlzb3Ryb3B5LCBjb2xvclNwYWNlKSB7CiAgICAgIHN1cGVyKG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgY29sb3JTcGFjZSk7CiAgICAgIHRoaXMuaXNEYXRhVGV4dHVyZSA9IHRydWU7CiAgICAgIHRoaXMuaW1hZ2UgPSB7IGRhdGEsIHdpZHRoLCBoZWlnaHQgfTsKICAgICAgdGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTsKICAgICAgdGhpcy5mbGlwWSA9IGZhbHNlOwogICAgICB0aGlzLnVucGFja0FsaWdubWVudCA9IDE7CiAgICB9CiAgfTsKICBfb2Zmc2V0TWF0cml4ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXg0OwogIF9pZGVudGl0eU1hdHJpeCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4NDsKICBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgPSBjbGFzcyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgZXh0ZW5kcyBCdWZmZXJBdHRyaWJ1dGUgewogICAgY29uc3RydWN0b3IoYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkLCBtZXNoUGVyQXR0cmlidXRlID0gMSkgewogICAgICBzdXBlcihhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQpOwogICAgICB0aGlzLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlID0gdHJ1ZTsKICAgICAgdGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0dHJpYnV0ZTsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5tZXNoUGVyQXR0cmlidXRlID0gc291cmNlLm1lc2hQZXJBdHRyaWJ1dGU7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICBjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7CiAgICAgIGRhdGEubWVzaFBlckF0dHJpYnV0ZSA9IHRoaXMubWVzaFBlckF0dHJpYnV0ZTsKICAgICAgZGF0YS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA9IHRydWU7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogIH07CiAgX2luc3RhbmNlTG9jYWxNYXRyaXggPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDQ7CiAgX2luc3RhbmNlV29ybGRNYXRyaXggPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDQ7CiAgX2luc3RhbmNlSW50ZXJzZWN0cyA9IFtdOwogIF9ib3gzID0gLyogQF9fUFVSRV9fICovIG5ldyBCb3gzOwogIF9pZGVudGl0eSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4NDsKICBfbWVzaCQxID0gLyogQF9fUFVSRV9fICovIG5ldyBNZXNoOwogIF9zcGhlcmUkNCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU3BoZXJlOwogIEluc3RhbmNlZE1lc2ggPSBjbGFzcyBJbnN0YW5jZWRNZXNoIGV4dGVuZHMgTWVzaCB7CiAgICBjb25zdHJ1Y3RvcihnZW9tZXRyeSwgbWF0ZXJpYWwsIGNvdW50KSB7CiAgICAgIHN1cGVyKGdlb21ldHJ5LCBtYXRlcmlhbCk7CiAgICAgIHRoaXMuaXNJbnN0YW5jZWRNZXNoID0gdHJ1ZTsKICAgICAgdGhpcy5pbnN0YW5jZU1hdHJpeCA9IG5ldyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUobmV3IEZsb2F0MzJBcnJheShjb3VudCAqIDE2KSwgMTYpOwogICAgICB0aGlzLmluc3RhbmNlQ29sb3IgPSBudWxsOwogICAgICB0aGlzLm1vcnBoVGV4dHVyZSA9IG51bGw7CiAgICAgIHRoaXMuY291bnQgPSBjb3VudDsKICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IG51bGw7CiAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsOwogICAgICBmb3IgKGxldCBpID0gMDtpIDwgY291bnQ7IGkrKykgewogICAgICAgIHRoaXMuc2V0TWF0cml4QXQoaSwgX2lkZW50aXR5KTsKICAgICAgfQogICAgfQogICAgY29tcHV0ZUJvdW5kaW5nQm94KCkgewogICAgICBjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5jb3VudDsKICAgICAgaWYgKHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwpIHsKICAgICAgICB0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDM7CiAgICAgIH0KICAgICAgaWYgKGdlb21ldHJ5LmJvdW5kaW5nQm94ID09PSBudWxsKSB7CiAgICAgICAgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk7CiAgICAgIH0KICAgICAgdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTsKICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IGNvdW50OyBpKyspIHsKICAgICAgICB0aGlzLmdldE1hdHJpeEF0KGksIF9pbnN0YW5jZUxvY2FsTWF0cml4KTsKICAgICAgICBfYm94My5jb3B5KGdlb21ldHJ5LmJvdW5kaW5nQm94KS5hcHBseU1hdHJpeDQoX2luc3RhbmNlTG9jYWxNYXRyaXgpOwogICAgICAgIHRoaXMuYm91bmRpbmdCb3gudW5pb24oX2JveDMpOwogICAgICB9CiAgICB9CiAgICBjb21wdXRlQm91bmRpbmdTcGhlcmUoKSB7CiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKICAgICAgY29uc3QgY291bnQgPSB0aGlzLmNvdW50OwogICAgICBpZiAodGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCkgewogICAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlOwogICAgICB9CiAgICAgIGlmIChnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCkgewogICAgICAgIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwogICAgICB9CiAgICAgIHRoaXMuYm91bmRpbmdTcGhlcmUubWFrZUVtcHR5KCk7CiAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgdGhpcy5nZXRNYXRyaXhBdChpLCBfaW5zdGFuY2VMb2NhbE1hdHJpeCk7CiAgICAgICAgX3NwaGVyZSQ0LmNvcHkoZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NChfaW5zdGFuY2VMb2NhbE1hdHJpeCk7CiAgICAgICAgdGhpcy5ib3VuZGluZ1NwaGVyZS51bmlvbihfc3BoZXJlJDQpOwogICAgICB9CiAgICB9CiAgICBjb3B5KHNvdXJjZSwgcmVjdXJzaXZlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlLCByZWN1cnNpdmUpOwogICAgICB0aGlzLmluc3RhbmNlTWF0cml4LmNvcHkoc291cmNlLmluc3RhbmNlTWF0cml4KTsKICAgICAgaWYgKHNvdXJjZS5tb3JwaFRleHR1cmUgIT09IG51bGwpCiAgICAgICAgdGhpcy5tb3JwaFRleHR1cmUgPSBzb3VyY2UubW9ycGhUZXh0dXJlLmNsb25lKCk7CiAgICAgIGlmIChzb3VyY2UuaW5zdGFuY2VDb2xvciAhPT0gbnVsbCkKICAgICAgICB0aGlzLmluc3RhbmNlQ29sb3IgPSBzb3VyY2UuaW5zdGFuY2VDb2xvci5jbG9uZSgpOwogICAgICB0aGlzLmNvdW50ID0gc291cmNlLmNvdW50OwogICAgICBpZiAoc291cmNlLmJvdW5kaW5nQm94ICE9PSBudWxsKQogICAgICAgIHRoaXMuYm91bmRpbmdCb3ggPSBzb3VyY2UuYm91bmRpbmdCb3guY2xvbmUoKTsKICAgICAgaWYgKHNvdXJjZS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCkKICAgICAgICB0aGlzLmJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZ2V0Q29sb3JBdChpbmRleCwgY29sb3IpIHsKICAgICAgY29sb3IuZnJvbUFycmF5KHRoaXMuaW5zdGFuY2VDb2xvci5hcnJheSwgaW5kZXggKiAzKTsKICAgIH0KICAgIGdldE1hdHJpeEF0KGluZGV4LCBtYXRyaXgpIHsKICAgICAgbWF0cml4LmZyb21BcnJheSh0aGlzLmluc3RhbmNlTWF0cml4LmFycmF5LCBpbmRleCAqIDE2KTsKICAgIH0KICAgIGdldE1vcnBoQXQoaW5kZXgsIG9iamVjdCkgewogICAgICBjb25zdCBvYmplY3RJbmZsdWVuY2VzID0gb2JqZWN0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlczsKICAgICAgY29uc3QgYXJyYXkgPSB0aGlzLm1vcnBoVGV4dHVyZS5zb3VyY2UuZGF0YS5kYXRhOwogICAgICBjb25zdCBsZW4gPSBvYmplY3RJbmZsdWVuY2VzLmxlbmd0aCArIDE7CiAgICAgIGNvbnN0IGRhdGFJbmRleCA9IGluZGV4ICogbGVuICsgMTsKICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IG9iamVjdEluZmx1ZW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBvYmplY3RJbmZsdWVuY2VzW2ldID0gYXJyYXlbZGF0YUluZGV4ICsgaV07CiAgICAgIH0KICAgIH0KICAgIHJheWNhc3QocmF5Y2FzdGVyLCBpbnRlcnNlY3RzKSB7CiAgICAgIGNvbnN0IG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDsKICAgICAgY29uc3QgcmF5Y2FzdFRpbWVzID0gdGhpcy5jb3VudDsKICAgICAgX21lc2gkMS5nZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgIF9tZXNoJDEubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsOwogICAgICBpZiAoX21lc2gkMS5tYXRlcmlhbCA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwpCiAgICAgICAgdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKICAgICAgX3NwaGVyZSQ0LmNvcHkodGhpcy5ib3VuZGluZ1NwaGVyZSk7CiAgICAgIF9zcGhlcmUkNC5hcHBseU1hdHJpeDQobWF0cml4V29ybGQpOwogICAgICBpZiAocmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKF9zcGhlcmUkNCkgPT09IGZhbHNlKQogICAgICAgIHJldHVybjsKICAgICAgZm9yIChsZXQgaW5zdGFuY2VJZCA9IDA7aW5zdGFuY2VJZCA8IHJheWNhc3RUaW1lczsgaW5zdGFuY2VJZCsrKSB7CiAgICAgICAgdGhpcy5nZXRNYXRyaXhBdChpbnN0YW5jZUlkLCBfaW5zdGFuY2VMb2NhbE1hdHJpeCk7CiAgICAgICAgX2luc3RhbmNlV29ybGRNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhtYXRyaXhXb3JsZCwgX2luc3RhbmNlTG9jYWxNYXRyaXgpOwogICAgICAgIF9tZXNoJDEubWF0cml4V29ybGQgPSBfaW5zdGFuY2VXb3JsZE1hdHJpeDsKICAgICAgICBfbWVzaCQxLnJheWNhc3QocmF5Y2FzdGVyLCBfaW5zdGFuY2VJbnRlcnNlY3RzKTsKICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IF9pbnN0YW5jZUludGVyc2VjdHMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGludGVyc2VjdCA9IF9pbnN0YW5jZUludGVyc2VjdHNbaV07CiAgICAgICAgICBpbnRlcnNlY3QuaW5zdGFuY2VJZCA9IGluc3RhbmNlSWQ7CiAgICAgICAgICBpbnRlcnNlY3Qub2JqZWN0ID0gdGhpczsKICAgICAgICAgIGludGVyc2VjdHMucHVzaChpbnRlcnNlY3QpOwogICAgICAgIH0KICAgICAgICBfaW5zdGFuY2VJbnRlcnNlY3RzLmxlbmd0aCA9IDA7CiAgICAgIH0KICAgIH0KICAgIHNldENvbG9yQXQoaW5kZXgsIGNvbG9yKSB7CiAgICAgIGlmICh0aGlzLmluc3RhbmNlQ29sb3IgPT09IG51bGwpIHsKICAgICAgICB0aGlzLmluc3RhbmNlQ29sb3IgPSBuZXcgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKG5ldyBGbG9hdDMyQXJyYXkodGhpcy5pbnN0YW5jZU1hdHJpeC5jb3VudCAqIDMpLmZpbGwoMSksIDMpOwogICAgICB9CiAgICAgIGNvbG9yLnRvQXJyYXkodGhpcy5pbnN0YW5jZUNvbG9yLmFycmF5LCBpbmRleCAqIDMpOwogICAgfQogICAgc2V0TWF0cml4QXQoaW5kZXgsIG1hdHJpeCkgewogICAgICBtYXRyaXgudG9BcnJheSh0aGlzLmluc3RhbmNlTWF0cml4LmFycmF5LCBpbmRleCAqIDE2KTsKICAgIH0KICAgIHNldE1vcnBoQXQoaW5kZXgsIG9iamVjdCkgewogICAgICBjb25zdCBvYmplY3RJbmZsdWVuY2VzID0gb2JqZWN0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlczsKICAgICAgY29uc3QgbGVuID0gb2JqZWN0SW5mbHVlbmNlcy5sZW5ndGggKyAxOwogICAgICBpZiAodGhpcy5tb3JwaFRleHR1cmUgPT09IG51bGwpIHsKICAgICAgICB0aGlzLm1vcnBoVGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZShuZXcgRmxvYXQzMkFycmF5KGxlbiAqIHRoaXMuY291bnQpLCBsZW4sIHRoaXMuY291bnQsIFJlZEZvcm1hdCwgRmxvYXRUeXBlKTsKICAgICAgfQogICAgICBjb25zdCBhcnJheSA9IHRoaXMubW9ycGhUZXh0dXJlLnNvdXJjZS5kYXRhLmRhdGE7CiAgICAgIGxldCBtb3JwaEluZmx1ZW5jZXNTdW0gPSAwOwogICAgICBmb3IgKGxldCBpID0gMDtpIDwgb2JqZWN0SW5mbHVlbmNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIG1vcnBoSW5mbHVlbmNlc1N1bSArPSBvYmplY3RJbmZsdWVuY2VzW2ldOwogICAgICB9CiAgICAgIGNvbnN0IG1vcnBoQmFzZUluZmx1ZW5jZSA9IHRoaXMuZ2VvbWV0cnkubW9ycGhUYXJnZXRzUmVsYXRpdmUgPyAxIDogMSAtIG1vcnBoSW5mbHVlbmNlc1N1bTsKICAgICAgY29uc3QgZGF0YUluZGV4ID0gbGVuICogaW5kZXg7CiAgICAgIGFycmF5W2RhdGFJbmRleF0gPSBtb3JwaEJhc2VJbmZsdWVuY2U7CiAgICAgIGFycmF5LnNldChvYmplY3RJbmZsdWVuY2VzLCBkYXRhSW5kZXggKyAxKTsKICAgIH0KICAgIHVwZGF0ZU1vcnBoVGFyZ2V0cygpIHt9CiAgICBkaXNwb3NlKCkgewogICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoeyB0eXBlOiAiZGlzcG9zZSIgfSk7CiAgICAgIGlmICh0aGlzLm1vcnBoVGV4dHVyZSAhPT0gbnVsbCkgewogICAgICAgIHRoaXMubW9ycGhUZXh0dXJlLmRpc3Bvc2UoKTsKICAgICAgICB0aGlzLm1vcnBoVGV4dHVyZSA9IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBfdmVjdG9yMSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfdmVjdG9yMiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfbm9ybWFsTWF0cml4ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzOwogIF9zcGhlcmUkMyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU3BoZXJlOwogIF92ZWN0b3IkNiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfbWF0cml4JDEgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDQ7CiAgX3doaXRlQ29sb3IgPSAvKiBAX19QVVJFX18gKi8gbmV3IENvbG9yKDEsIDEsIDEpOwogIF9mcnVzdHVtID0gLyogQF9fUFVSRV9fICovIG5ldyBGcnVzdHVtOwogIF9ib3gkMSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgQm94MzsKICBfc3BoZXJlJDIgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNwaGVyZTsKICBfdmVjdG9yJDUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX2ZvcndhcmQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX3RlbXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX3JlbmRlckxpc3QgPSAvKiBAX19QVVJFX18gKi8gbmV3IE11bHRpRHJhd1JlbmRlckxpc3Q7CiAgX21lc2ggPSAvKiBAX19QVVJFX18gKi8gbmV3IE1lc2g7CiAgX2JhdGNoSW50ZXJzZWN0cyA9IFtdOwogIEJhdGNoZWRNZXNoID0gY2xhc3MgQmF0Y2hlZE1lc2ggZXh0ZW5kcyBNZXNoIHsKICAgIGdldCBtYXhJbnN0YW5jZUNvdW50KCkgewogICAgICByZXR1cm4gdGhpcy5fbWF4SW5zdGFuY2VDb3VudDsKICAgIH0KICAgIGdldCBpbnN0YW5jZUNvdW50KCkgewogICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2VJbmZvLmxlbmd0aCAtIHRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLmxlbmd0aDsKICAgIH0KICAgIGdldCB1bnVzZWRWZXJ0ZXhDb3VudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX21heFZlcnRleENvdW50IC0gdGhpcy5fbmV4dFZlcnRleFN0YXJ0OwogICAgfQogICAgZ2V0IHVudXNlZEluZGV4Q291bnQoKSB7CiAgICAgIHJldHVybiB0aGlzLl9tYXhJbmRleENvdW50IC0gdGhpcy5fbmV4dEluZGV4U3RhcnQ7CiAgICB9CiAgICBjb25zdHJ1Y3RvcihtYXhJbnN0YW5jZUNvdW50LCBtYXhWZXJ0ZXhDb3VudCwgbWF4SW5kZXhDb3VudCA9IG1heFZlcnRleENvdW50ICogMiwgbWF0ZXJpYWwpIHsKICAgICAgc3VwZXIobmV3IEJ1ZmZlckdlb21ldHJ5LCBtYXRlcmlhbCk7CiAgICAgIHRoaXMuaXNCYXRjaGVkTWVzaCA9IHRydWU7CiAgICAgIHRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCA9IHRydWU7CiAgICAgIHRoaXMuc29ydE9iamVjdHMgPSB0cnVlOwogICAgICB0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDsKICAgICAgdGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7CiAgICAgIHRoaXMuY3VzdG9tU29ydCA9IG51bGw7CiAgICAgIHRoaXMuX2luc3RhbmNlSW5mbyA9IFtdOwogICAgICB0aGlzLl9nZW9tZXRyeUluZm8gPSBbXTsKICAgICAgdGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMgPSBbXTsKICAgICAgdGhpcy5fYXZhaWxhYmxlR2VvbWV0cnlJZHMgPSBbXTsKICAgICAgdGhpcy5fbmV4dEluZGV4U3RhcnQgPSAwOwogICAgICB0aGlzLl9uZXh0VmVydGV4U3RhcnQgPSAwOwogICAgICB0aGlzLl9nZW9tZXRyeUNvdW50ID0gMDsKICAgICAgdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQgPSB0cnVlOwogICAgICB0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkID0gZmFsc2U7CiAgICAgIHRoaXMuX21heEluc3RhbmNlQ291bnQgPSBtYXhJbnN0YW5jZUNvdW50OwogICAgICB0aGlzLl9tYXhWZXJ0ZXhDb3VudCA9IG1heFZlcnRleENvdW50OwogICAgICB0aGlzLl9tYXhJbmRleENvdW50ID0gbWF4SW5kZXhDb3VudDsKICAgICAgdGhpcy5fbXVsdGlEcmF3Q291bnRzID0gbmV3IEludDMyQXJyYXkobWF4SW5zdGFuY2VDb3VudCk7CiAgICAgIHRoaXMuX211bHRpRHJhd1N0YXJ0cyA9IG5ldyBJbnQzMkFycmF5KG1heEluc3RhbmNlQ291bnQpOwogICAgICB0aGlzLl9tdWx0aURyYXdDb3VudCA9IDA7CiAgICAgIHRoaXMuX211bHRpRHJhd0luc3RhbmNlcyA9IG51bGw7CiAgICAgIHRoaXMuX21hdHJpY2VzVGV4dHVyZSA9IG51bGw7CiAgICAgIHRoaXMuX2luZGlyZWN0VGV4dHVyZSA9IG51bGw7CiAgICAgIHRoaXMuX2NvbG9yc1RleHR1cmUgPSBudWxsOwogICAgICB0aGlzLl9pbml0TWF0cmljZXNUZXh0dXJlKCk7CiAgICAgIHRoaXMuX2luaXRJbmRpcmVjdFRleHR1cmUoKTsKICAgIH0KICAgIF9pbml0TWF0cmljZXNUZXh0dXJlKCkgewogICAgICBsZXQgc2l6ZSA9IE1hdGguc3FydCh0aGlzLl9tYXhJbnN0YW5jZUNvdW50ICogNCk7CiAgICAgIHNpemUgPSBNYXRoLmNlaWwoc2l6ZSAvIDQpICogNDsKICAgICAgc2l6ZSA9IE1hdGgubWF4KHNpemUsIDQpOwogICAgICBjb25zdCBtYXRyaWNlc0FycmF5ID0gbmV3IEZsb2F0MzJBcnJheShzaXplICogc2l6ZSAqIDQpOwogICAgICBjb25zdCBtYXRyaWNlc1RleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUobWF0cmljZXNBcnJheSwgc2l6ZSwgc2l6ZSwgUkdCQUZvcm1hdCwgRmxvYXRUeXBlKTsKICAgICAgdGhpcy5fbWF0cmljZXNUZXh0dXJlID0gbWF0cmljZXNUZXh0dXJlOwogICAgfQogICAgX2luaXRJbmRpcmVjdFRleHR1cmUoKSB7CiAgICAgIGxldCBzaXplID0gTWF0aC5zcXJ0KHRoaXMuX21heEluc3RhbmNlQ291bnQpOwogICAgICBzaXplID0gTWF0aC5jZWlsKHNpemUpOwogICAgICBjb25zdCBpbmRpcmVjdEFycmF5ID0gbmV3IFVpbnQzMkFycmF5KHNpemUgKiBzaXplKTsKICAgICAgY29uc3QgaW5kaXJlY3RUZXh0dXJlID0gbmV3IERhdGFUZXh0dXJlKGluZGlyZWN0QXJyYXksIHNpemUsIHNpemUsIFJlZEludGVnZXJGb3JtYXQsIFVuc2lnbmVkSW50VHlwZSk7CiAgICAgIHRoaXMuX2luZGlyZWN0VGV4dHVyZSA9IGluZGlyZWN0VGV4dHVyZTsKICAgIH0KICAgIF9pbml0Q29sb3JzVGV4dHVyZSgpIHsKICAgICAgbGV0IHNpemUgPSBNYXRoLnNxcnQodGhpcy5fbWF4SW5zdGFuY2VDb3VudCk7CiAgICAgIHNpemUgPSBNYXRoLmNlaWwoc2l6ZSk7CiAgICAgIGNvbnN0IGNvbG9yc0FycmF5ID0gbmV3IEZsb2F0MzJBcnJheShzaXplICogc2l6ZSAqIDQpLmZpbGwoMSk7CiAgICAgIGNvbnN0IGNvbG9yc1RleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoY29sb3JzQXJyYXksIHNpemUsIHNpemUsIFJHQkFGb3JtYXQsIEZsb2F0VHlwZSk7CiAgICAgIGNvbG9yc1RleHR1cmUuY29sb3JTcGFjZSA9IENvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZTsKICAgICAgdGhpcy5fY29sb3JzVGV4dHVyZSA9IGNvbG9yc1RleHR1cmU7CiAgICB9CiAgICBfaW5pdGlhbGl6ZUdlb21ldHJ5KHJlZmVyZW5jZSkgewogICAgICBjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgIGNvbnN0IG1heFZlcnRleENvdW50ID0gdGhpcy5fbWF4VmVydGV4Q291bnQ7CiAgICAgIGNvbnN0IG1heEluZGV4Q291bnQgPSB0aGlzLl9tYXhJbmRleENvdW50OwogICAgICBpZiAodGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCA9PT0gZmFsc2UpIHsKICAgICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgaW4gcmVmZXJlbmNlLmF0dHJpYnV0ZXMpIHsKICAgICAgICAgIGNvbnN0IHNyY0F0dHJpYnV0ZSA9IHJlZmVyZW5jZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7CiAgICAgICAgICBjb25zdCB7IGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCB9ID0gc3JjQXR0cmlidXRlOwogICAgICAgICAgY29uc3QgZHN0QXJyYXkgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IobWF4VmVydGV4Q291bnQgKiBpdGVtU2l6ZSk7CiAgICAgICAgICBjb25zdCBkc3RBdHRyaWJ1dGUgPSBuZXcgQnVmZmVyQXR0cmlidXRlKGRzdEFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCk7CiAgICAgICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgZHN0QXR0cmlidXRlKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlZmVyZW5jZS5nZXRJbmRleCgpICE9PSBudWxsKSB7CiAgICAgICAgICBjb25zdCBpbmRleEFycmF5ID0gbWF4VmVydGV4Q291bnQgPiA2NTUzNSA/IG5ldyBVaW50MzJBcnJheShtYXhJbmRleENvdW50KSA6IG5ldyBVaW50MTZBcnJheShtYXhJbmRleENvdW50KTsKICAgICAgICAgIGdlb21ldHJ5LnNldEluZGV4KG5ldyBCdWZmZXJBdHRyaWJ1dGUoaW5kZXhBcnJheSwgMSkpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgX3ZhbGlkYXRlR2VvbWV0cnkoZ2VvbWV0cnkpIHsKICAgICAgY29uc3QgYmF0Y2hHZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgIGlmIChCb29sZWFuKGdlb21ldHJ5LmdldEluZGV4KCkpICE9PSBCb29sZWFuKGJhdGNoR2VvbWV0cnkuZ2V0SW5kZXgoKSkpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RIUkVFLkJhdGNoZWRNZXNoOiBBbGwgZ2VvbWV0cmllcyBtdXN0IGNvbnNpc3RlbnRseSBoYXZlICJpbmRleCIuJyk7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIGluIGJhdGNoR2VvbWV0cnkuYXR0cmlidXRlcykgewogICAgICAgIGlmICghZ2VvbWV0cnkuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRIUkVFLkJhdGNoZWRNZXNoOiBBZGRlZCBnZW9tZXRyeSBtaXNzaW5nICIke2F0dHJpYnV0ZU5hbWV9Ii4gQWxsIGdlb21ldHJpZXMgbXVzdCBoYXZlIGNvbnNpc3RlbnQgYXR0cmlidXRlcy5gKTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3JjQXR0cmlidXRlID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwogICAgICAgIGNvbnN0IGRzdEF0dHJpYnV0ZSA9IGJhdGNoR2VvbWV0cnkuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwogICAgICAgIGlmIChzcmNBdHRyaWJ1dGUuaXRlbVNpemUgIT09IGRzdEF0dHJpYnV0ZS5pdGVtU2l6ZSB8fCBzcmNBdHRyaWJ1dGUubm9ybWFsaXplZCAhPT0gZHN0QXR0cmlidXRlLm5vcm1hbGl6ZWQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVEhSRUUuQmF0Y2hlZE1lc2g6IEFsbCBhdHRyaWJ1dGVzIG11c3QgaGF2ZSBhIGNvbnNpc3RlbnQgaXRlbVNpemUgYW5kIG5vcm1hbGl6ZWQgdmFsdWUuIik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB2YWxpZGF0ZUluc3RhbmNlSWQoaW5zdGFuY2VJZCkgewogICAgICBjb25zdCBpbnN0YW5jZUluZm8gPSB0aGlzLl9pbnN0YW5jZUluZm87CiAgICAgIGlmIChpbnN0YW5jZUlkIDwgMCB8fCBpbnN0YW5jZUlkID49IGluc3RhbmNlSW5mby5sZW5ndGggfHwgaW5zdGFuY2VJbmZvW2luc3RhbmNlSWRdLmFjdGl2ZSA9PT0gZmFsc2UpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRIUkVFLkJhdGNoZWRNZXNoOiBJbnZhbGlkIGluc3RhbmNlSWQgJHtpbnN0YW5jZUlkfS4gSW5zdGFuY2UgaXMgZWl0aGVyIG91dCBvZiByYW5nZSBvciBoYXMgYmVlbiBkZWxldGVkLmApOwogICAgICB9CiAgICB9CiAgICB2YWxpZGF0ZUdlb21ldHJ5SWQoZ2VvbWV0cnlJZCkgewogICAgICBjb25zdCBnZW9tZXRyeUluZm9MaXN0ID0gdGhpcy5fZ2VvbWV0cnlJbmZvOwogICAgICBpZiAoZ2VvbWV0cnlJZCA8IDAgfHwgZ2VvbWV0cnlJZCA+PSBnZW9tZXRyeUluZm9MaXN0Lmxlbmd0aCB8fCBnZW9tZXRyeUluZm9MaXN0W2dlb21ldHJ5SWRdLmFjdGl2ZSA9PT0gZmFsc2UpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRIUkVFLkJhdGNoZWRNZXNoOiBJbnZhbGlkIGdlb21ldHJ5SWQgJHtnZW9tZXRyeUlkfS4gR2VvbWV0cnkgaXMgZWl0aGVyIG91dCBvZiByYW5nZSBvciBoYXMgYmVlbiBkZWxldGVkLmApOwogICAgICB9CiAgICB9CiAgICBzZXRDdXN0b21Tb3J0KGZ1bmMpIHsKICAgICAgdGhpcy5jdXN0b21Tb3J0ID0gZnVuYzsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjb21wdXRlQm91bmRpbmdCb3goKSB7CiAgICAgIGlmICh0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsKSB7CiAgICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IG5ldyBCb3gzOwogICAgICB9CiAgICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gdGhpcy5ib3VuZGluZ0JveDsKICAgICAgY29uc3QgaW5zdGFuY2VJbmZvID0gdGhpcy5faW5zdGFuY2VJbmZvOwogICAgICBib3VuZGluZ0JveC5tYWtlRW1wdHkoKTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBpbnN0YW5jZUluZm8ubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICBpZiAoaW5zdGFuY2VJbmZvW2ldLmFjdGl2ZSA9PT0gZmFsc2UpCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjb25zdCBnZW9tZXRyeUlkID0gaW5zdGFuY2VJbmZvW2ldLmdlb21ldHJ5SW5kZXg7CiAgICAgICAgdGhpcy5nZXRNYXRyaXhBdChpLCBfbWF0cml4JDEpOwogICAgICAgIHRoaXMuZ2V0Qm91bmRpbmdCb3hBdChnZW9tZXRyeUlkLCBfYm94JDEpLmFwcGx5TWF0cml4NChfbWF0cml4JDEpOwogICAgICAgIGJvdW5kaW5nQm94LnVuaW9uKF9ib3gkMSk7CiAgICAgIH0KICAgIH0KICAgIGNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpIHsKICAgICAgaWYgKHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwpIHsKICAgICAgICB0aGlzLmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZTsKICAgICAgfQogICAgICBjb25zdCBib3VuZGluZ1NwaGVyZSA9IHRoaXMuYm91bmRpbmdTcGhlcmU7CiAgICAgIGNvbnN0IGluc3RhbmNlSW5mbyA9IHRoaXMuX2luc3RhbmNlSW5mbzsKICAgICAgYm91bmRpbmdTcGhlcmUubWFrZUVtcHR5KCk7CiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gaW5zdGFuY2VJbmZvLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgaWYgKGluc3RhbmNlSW5mb1tpXS5hY3RpdmUgPT09IGZhbHNlKQogICAgICAgICAgY29udGludWU7CiAgICAgICAgY29uc3QgZ2VvbWV0cnlJZCA9IGluc3RhbmNlSW5mb1tpXS5nZW9tZXRyeUluZGV4OwogICAgICAgIHRoaXMuZ2V0TWF0cml4QXQoaSwgX21hdHJpeCQxKTsKICAgICAgICB0aGlzLmdldEJvdW5kaW5nU3BoZXJlQXQoZ2VvbWV0cnlJZCwgX3NwaGVyZSQyKS5hcHBseU1hdHJpeDQoX21hdHJpeCQxKTsKICAgICAgICBib3VuZGluZ1NwaGVyZS51bmlvbihfc3BoZXJlJDIpOwogICAgICB9CiAgICB9CiAgICBhZGRJbnN0YW5jZShnZW9tZXRyeUlkKSB7CiAgICAgIGNvbnN0IGF0Q2FwYWNpdHkgPSB0aGlzLl9pbnN0YW5jZUluZm8ubGVuZ3RoID49IHRoaXMubWF4SW5zdGFuY2VDb3VudDsKICAgICAgaWYgKGF0Q2FwYWNpdHkgJiYgdGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5CYXRjaGVkTWVzaDogTWF4aW11bSBpdGVtIGNvdW50IHJlYWNoZWQuIik7CiAgICAgIH0KICAgICAgY29uc3QgaW5zdGFuY2VJbmZvID0gewogICAgICAgIHZpc2libGU6IHRydWUsCiAgICAgICAgYWN0aXZlOiB0cnVlLAogICAgICAgIGdlb21ldHJ5SW5kZXg6IGdlb21ldHJ5SWQKICAgICAgfTsKICAgICAgbGV0IGRyYXdJZCA9IG51bGw7CiAgICAgIGlmICh0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMuc29ydChhc2NJZFNvcnQpOwogICAgICAgIGRyYXdJZCA9IHRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLnNoaWZ0KCk7CiAgICAgICAgdGhpcy5faW5zdGFuY2VJbmZvW2RyYXdJZF0gPSBpbnN0YW5jZUluZm87CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZHJhd0lkID0gdGhpcy5faW5zdGFuY2VJbmZvLmxlbmd0aDsKICAgICAgICB0aGlzLl9pbnN0YW5jZUluZm8ucHVzaChpbnN0YW5jZUluZm8pOwogICAgICB9CiAgICAgIGNvbnN0IG1hdHJpY2VzVGV4dHVyZSA9IHRoaXMuX21hdHJpY2VzVGV4dHVyZTsKICAgICAgX21hdHJpeCQxLmlkZW50aXR5KCkudG9BcnJheShtYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YSwgZHJhd0lkICogMTYpOwogICAgICBtYXRyaWNlc1RleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICBjb25zdCBjb2xvcnNUZXh0dXJlID0gdGhpcy5fY29sb3JzVGV4dHVyZTsKICAgICAgaWYgKGNvbG9yc1RleHR1cmUpIHsKICAgICAgICBfd2hpdGVDb2xvci50b0FycmF5KGNvbG9yc1RleHR1cmUuaW1hZ2UuZGF0YSwgZHJhd0lkICogNCk7CiAgICAgICAgY29sb3JzVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgIH0KICAgICAgdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQgPSB0cnVlOwogICAgICByZXR1cm4gZHJhd0lkOwogICAgfQogICAgYWRkR2VvbWV0cnkoZ2VvbWV0cnksIHJlc2VydmVkVmVydGV4Q291bnQgPSAtMSwgcmVzZXJ2ZWRJbmRleENvdW50ID0gLTEpIHsKICAgICAgdGhpcy5faW5pdGlhbGl6ZUdlb21ldHJ5KGdlb21ldHJ5KTsKICAgICAgdGhpcy5fdmFsaWRhdGVHZW9tZXRyeShnZW9tZXRyeSk7CiAgICAgIGNvbnN0IGdlb21ldHJ5SW5mbyA9IHsKICAgICAgICB2ZXJ0ZXhTdGFydDogLTEsCiAgICAgICAgdmVydGV4Q291bnQ6IC0xLAogICAgICAgIHJlc2VydmVkVmVydGV4Q291bnQ6IC0xLAogICAgICAgIGluZGV4U3RhcnQ6IC0xLAogICAgICAgIGluZGV4Q291bnQ6IC0xLAogICAgICAgIHJlc2VydmVkSW5kZXhDb3VudDogLTEsCiAgICAgICAgc3RhcnQ6IC0xLAogICAgICAgIGNvdW50OiAtMSwKICAgICAgICBib3VuZGluZ0JveDogbnVsbCwKICAgICAgICBib3VuZGluZ1NwaGVyZTogbnVsbCwKICAgICAgICBhY3RpdmU6IHRydWUKICAgICAgfTsKICAgICAgY29uc3QgZ2VvbWV0cnlJbmZvTGlzdCA9IHRoaXMuX2dlb21ldHJ5SW5mbzsKICAgICAgZ2VvbWV0cnlJbmZvLnZlcnRleFN0YXJ0ID0gdGhpcy5fbmV4dFZlcnRleFN0YXJ0OwogICAgICBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRWZXJ0ZXhDb3VudCA9IHJlc2VydmVkVmVydGV4Q291bnQgPT09IC0xID8gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLmNvdW50IDogcmVzZXJ2ZWRWZXJ0ZXhDb3VudDsKICAgICAgY29uc3QgaW5kZXggPSBnZW9tZXRyeS5nZXRJbmRleCgpOwogICAgICBjb25zdCBoYXNJbmRleCA9IGluZGV4ICE9PSBudWxsOwogICAgICBpZiAoaGFzSW5kZXgpIHsKICAgICAgICBnZW9tZXRyeUluZm8uaW5kZXhTdGFydCA9IHRoaXMuX25leHRJbmRleFN0YXJ0OwogICAgICAgIGdlb21ldHJ5SW5mby5yZXNlcnZlZEluZGV4Q291bnQgPSByZXNlcnZlZEluZGV4Q291bnQgPT09IC0xID8gaW5kZXguY291bnQgOiByZXNlcnZlZEluZGV4Q291bnQ7CiAgICAgIH0KICAgICAgaWYgKGdlb21ldHJ5SW5mby5pbmRleFN0YXJ0ICE9PSAtMSAmJiBnZW9tZXRyeUluZm8uaW5kZXhTdGFydCArIGdlb21ldHJ5SW5mby5yZXNlcnZlZEluZGV4Q291bnQgPiB0aGlzLl9tYXhJbmRleENvdW50IHx8IGdlb21ldHJ5SW5mby52ZXJ0ZXhTdGFydCArIGdlb21ldHJ5SW5mby5yZXNlcnZlZFZlcnRleENvdW50ID4gdGhpcy5fbWF4VmVydGV4Q291bnQpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkJhdGNoZWRNZXNoOiBSZXNlcnZlZCBzcGFjZSByZXF1ZXN0IGV4Y2VlZHMgdGhlIG1heGltdW0gYnVmZmVyIHNpemUuIik7CiAgICAgIH0KICAgICAgbGV0IGdlb21ldHJ5SWQ7CiAgICAgIGlmICh0aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpcy5fYXZhaWxhYmxlR2VvbWV0cnlJZHMuc29ydChhc2NJZFNvcnQpOwogICAgICAgIGdlb21ldHJ5SWQgPSB0aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcy5zaGlmdCgpOwogICAgICAgIGdlb21ldHJ5SW5mb0xpc3RbZ2VvbWV0cnlJZF0gPSBnZW9tZXRyeUluZm87CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZ2VvbWV0cnlJZCA9IHRoaXMuX2dlb21ldHJ5Q291bnQ7CiAgICAgICAgdGhpcy5fZ2VvbWV0cnlDb3VudCsrOwogICAgICAgIGdlb21ldHJ5SW5mb0xpc3QucHVzaChnZW9tZXRyeUluZm8pOwogICAgICB9CiAgICAgIHRoaXMuc2V0R2VvbWV0cnlBdChnZW9tZXRyeUlkLCBnZW9tZXRyeSk7CiAgICAgIHRoaXMuX25leHRJbmRleFN0YXJ0ID0gZ2VvbWV0cnlJbmZvLmluZGV4U3RhcnQgKyBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRJbmRleENvdW50OwogICAgICB0aGlzLl9uZXh0VmVydGV4U3RhcnQgPSBnZW9tZXRyeUluZm8udmVydGV4U3RhcnQgKyBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRWZXJ0ZXhDb3VudDsKICAgICAgcmV0dXJuIGdlb21ldHJ5SWQ7CiAgICB9CiAgICBzZXRHZW9tZXRyeUF0KGdlb21ldHJ5SWQsIGdlb21ldHJ5KSB7CiAgICAgIGlmIChnZW9tZXRyeUlkID49IHRoaXMuX2dlb21ldHJ5Q291bnQpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkJhdGNoZWRNZXNoOiBNYXhpbXVtIGdlb21ldHJ5IGNvdW50IHJlYWNoZWQuIik7CiAgICAgIH0KICAgICAgdGhpcy5fdmFsaWRhdGVHZW9tZXRyeShnZW9tZXRyeSk7CiAgICAgIGNvbnN0IGJhdGNoR2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OwogICAgICBjb25zdCBoYXNJbmRleCA9IGJhdGNoR2VvbWV0cnkuZ2V0SW5kZXgoKSAhPT0gbnVsbDsKICAgICAgY29uc3QgZHN0SW5kZXggPSBiYXRjaEdlb21ldHJ5LmdldEluZGV4KCk7CiAgICAgIGNvbnN0IHNyY0luZGV4ID0gZ2VvbWV0cnkuZ2V0SW5kZXgoKTsKICAgICAgY29uc3QgZ2VvbWV0cnlJbmZvID0gdGhpcy5fZ2VvbWV0cnlJbmZvW2dlb21ldHJ5SWRdOwogICAgICBpZiAoaGFzSW5kZXggJiYgc3JjSW5kZXguY291bnQgPiBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRJbmRleENvdW50IHx8IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQgPiBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRWZXJ0ZXhDb3VudCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiVEhSRUUuQmF0Y2hlZE1lc2g6IFJlc2VydmVkIHNwYWNlIG5vdCBsYXJnZSBlbm91Z2ggZm9yIHByb3ZpZGVkIGdlb21ldHJ5LiIpOwogICAgICB9CiAgICAgIGNvbnN0IHZlcnRleFN0YXJ0ID0gZ2VvbWV0cnlJbmZvLnZlcnRleFN0YXJ0OwogICAgICBjb25zdCByZXNlcnZlZFZlcnRleENvdW50ID0gZ2VvbWV0cnlJbmZvLnJlc2VydmVkVmVydGV4Q291bnQ7CiAgICAgIGdlb21ldHJ5SW5mby52ZXJ0ZXhDb3VudCA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5jb3VudDsKICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIGluIGJhdGNoR2VvbWV0cnkuYXR0cmlidXRlcykgewogICAgICAgIGNvbnN0IHNyY0F0dHJpYnV0ZSA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKICAgICAgICBjb25zdCBkc3RBdHRyaWJ1dGUgPSBiYXRjaEdlb21ldHJ5LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKICAgICAgICBjb3B5QXR0cmlidXRlRGF0YShzcmNBdHRyaWJ1dGUsIGRzdEF0dHJpYnV0ZSwgdmVydGV4U3RhcnQpOwogICAgICAgIGNvbnN0IGl0ZW1TaXplID0gc3JjQXR0cmlidXRlLml0ZW1TaXplOwogICAgICAgIGZvciAobGV0IGkgPSBzcmNBdHRyaWJ1dGUuY291bnQsIGwgPSByZXNlcnZlZFZlcnRleENvdW50O2kgPCBsOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGluZGV4ID0gdmVydGV4U3RhcnQgKyBpOwogICAgICAgICAgZm9yIChsZXQgYyA9IDA7YyA8IGl0ZW1TaXplOyBjKyspIHsKICAgICAgICAgICAgZHN0QXR0cmlidXRlLnNldENvbXBvbmVudChpbmRleCwgYywgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRzdEF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgZHN0QXR0cmlidXRlLmFkZFVwZGF0ZVJhbmdlKHZlcnRleFN0YXJ0ICogaXRlbVNpemUsIHJlc2VydmVkVmVydGV4Q291bnQgKiBpdGVtU2l6ZSk7CiAgICAgIH0KICAgICAgaWYgKGhhc0luZGV4KSB7CiAgICAgICAgY29uc3QgaW5kZXhTdGFydCA9IGdlb21ldHJ5SW5mby5pbmRleFN0YXJ0OwogICAgICAgIGNvbnN0IHJlc2VydmVkSW5kZXhDb3VudCA9IGdlb21ldHJ5SW5mby5yZXNlcnZlZEluZGV4Q291bnQ7CiAgICAgICAgZ2VvbWV0cnlJbmZvLmluZGV4Q291bnQgPSBnZW9tZXRyeS5nZXRJbmRleCgpLmNvdW50OwogICAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBzcmNJbmRleC5jb3VudDsgaSsrKSB7CiAgICAgICAgICBkc3RJbmRleC5zZXRYKGluZGV4U3RhcnQgKyBpLCB2ZXJ0ZXhTdGFydCArIHNyY0luZGV4LmdldFgoaSkpOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gc3JjSW5kZXguY291bnQsIGwgPSByZXNlcnZlZEluZGV4Q291bnQ7aSA8IGw7IGkrKykgewogICAgICAgICAgZHN0SW5kZXguc2V0WChpbmRleFN0YXJ0ICsgaSwgdmVydGV4U3RhcnQpOwogICAgICAgIH0KICAgICAgICBkc3RJbmRleC5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgZHN0SW5kZXguYWRkVXBkYXRlUmFuZ2UoaW5kZXhTdGFydCwgZ2VvbWV0cnlJbmZvLnJlc2VydmVkSW5kZXhDb3VudCk7CiAgICAgIH0KICAgICAgZ2VvbWV0cnlJbmZvLnN0YXJ0ID0gaGFzSW5kZXggPyBnZW9tZXRyeUluZm8uaW5kZXhTdGFydCA6IGdlb21ldHJ5SW5mby52ZXJ0ZXhTdGFydDsKICAgICAgZ2VvbWV0cnlJbmZvLmNvdW50ID0gaGFzSW5kZXggPyBnZW9tZXRyeUluZm8uaW5kZXhDb3VudCA6IGdlb21ldHJ5SW5mby52ZXJ0ZXhDb3VudDsKICAgICAgZ2VvbWV0cnlJbmZvLmJvdW5kaW5nQm94ID0gbnVsbDsKICAgICAgaWYgKGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsKSB7CiAgICAgICAgZ2VvbWV0cnlJbmZvLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTsKICAgICAgfQogICAgICBnZW9tZXRyeUluZm8uYm91bmRpbmdTcGhlcmUgPSBudWxsOwogICAgICBpZiAoZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwpIHsKICAgICAgICBnZW9tZXRyeUluZm8uYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpOwogICAgICB9CiAgICAgIHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkID0gdHJ1ZTsKICAgICAgcmV0dXJuIGdlb21ldHJ5SWQ7CiAgICB9CiAgICBkZWxldGVHZW9tZXRyeShnZW9tZXRyeUlkKSB7CiAgICAgIGNvbnN0IGdlb21ldHJ5SW5mb0xpc3QgPSB0aGlzLl9nZW9tZXRyeUluZm87CiAgICAgIGlmIChnZW9tZXRyeUlkID49IGdlb21ldHJ5SW5mb0xpc3QubGVuZ3RoIHx8IGdlb21ldHJ5SW5mb0xpc3RbZ2VvbWV0cnlJZF0uYWN0aXZlID09PSBmYWxzZSkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIGNvbnN0IGluc3RhbmNlSW5mbyA9IHRoaXMuX2luc3RhbmNlSW5mbzsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBpbnN0YW5jZUluZm8ubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICBpZiAoaW5zdGFuY2VJbmZvW2ldLmFjdGl2ZSAmJiBpbnN0YW5jZUluZm9baV0uZ2VvbWV0cnlJbmRleCA9PT0gZ2VvbWV0cnlJZCkgewogICAgICAgICAgdGhpcy5kZWxldGVJbnN0YW5jZShpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZ2VvbWV0cnlJbmZvTGlzdFtnZW9tZXRyeUlkXS5hY3RpdmUgPSBmYWxzZTsKICAgICAgdGhpcy5fYXZhaWxhYmxlR2VvbWV0cnlJZHMucHVzaChnZW9tZXRyeUlkKTsKICAgICAgdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQgPSB0cnVlOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGRlbGV0ZUluc3RhbmNlKGluc3RhbmNlSWQpIHsKICAgICAgdGhpcy52YWxpZGF0ZUluc3RhbmNlSWQoaW5zdGFuY2VJZCk7CiAgICAgIHRoaXMuX2luc3RhbmNlSW5mb1tpbnN0YW5jZUlkXS5hY3RpdmUgPSBmYWxzZTsKICAgICAgdGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMucHVzaChpbnN0YW5jZUlkKTsKICAgICAgdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQgPSB0cnVlOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIG9wdGltaXplKCkgewogICAgICBsZXQgbmV4dFZlcnRleFN0YXJ0ID0gMDsKICAgICAgbGV0IG5leHRJbmRleFN0YXJ0ID0gMDsKICAgICAgY29uc3QgZ2VvbWV0cnlJbmZvTGlzdCA9IHRoaXMuX2dlb21ldHJ5SW5mbzsKICAgICAgY29uc3QgaW5kaWNlcyA9IGdlb21ldHJ5SW5mb0xpc3QubWFwKChlLCBpKSA9PiBpKS5zb3J0KChhLCBiKSA9PiB7CiAgICAgICAgcmV0dXJuIGdlb21ldHJ5SW5mb0xpc3RbYV0udmVydGV4U3RhcnQgLSBnZW9tZXRyeUluZm9MaXN0W2JdLnZlcnRleFN0YXJ0OwogICAgICB9KTsKICAgICAgY29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OwogICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGdlb21ldHJ5SW5mb0xpc3QubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICBjb25zdCBpbmRleCA9IGluZGljZXNbaV07CiAgICAgICAgY29uc3QgZ2VvbWV0cnlJbmZvID0gZ2VvbWV0cnlJbmZvTGlzdFtpbmRleF07CiAgICAgICAgaWYgKGdlb21ldHJ5SW5mby5hY3RpdmUgPT09IGZhbHNlKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGdlb21ldHJ5LmluZGV4ICE9PSBudWxsKSB7CiAgICAgICAgICBpZiAoZ2VvbWV0cnlJbmZvLmluZGV4U3RhcnQgIT09IG5leHRJbmRleFN0YXJ0KSB7CiAgICAgICAgICAgIGNvbnN0IHsgaW5kZXhTdGFydCwgdmVydGV4U3RhcnQsIHJlc2VydmVkSW5kZXhDb3VudCB9ID0gZ2VvbWV0cnlJbmZvOwogICAgICAgICAgICBjb25zdCBpbmRleDIgPSBnZW9tZXRyeS5pbmRleDsKICAgICAgICAgICAgY29uc3QgYXJyYXkgPSBpbmRleDIuYXJyYXk7CiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREZWx0YSA9IG5leHRWZXJ0ZXhTdGFydCAtIHZlcnRleFN0YXJ0OwogICAgICAgICAgICBmb3IgKGxldCBqID0gaW5kZXhTdGFydDtqIDwgaW5kZXhTdGFydCArIHJlc2VydmVkSW5kZXhDb3VudDsgaisrKSB7CiAgICAgICAgICAgICAgYXJyYXlbal0gPSBhcnJheVtqXSArIGVsZW1lbnREZWx0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbmRleDIuYXJyYXkuY29weVdpdGhpbihuZXh0SW5kZXhTdGFydCwgaW5kZXhTdGFydCwgaW5kZXhTdGFydCArIHJlc2VydmVkSW5kZXhDb3VudCk7CiAgICAgICAgICAgIGluZGV4Mi5hZGRVcGRhdGVSYW5nZShuZXh0SW5kZXhTdGFydCwgcmVzZXJ2ZWRJbmRleENvdW50KTsKICAgICAgICAgICAgZ2VvbWV0cnlJbmZvLmluZGV4U3RhcnQgPSBuZXh0SW5kZXhTdGFydDsKICAgICAgICAgIH0KICAgICAgICAgIG5leHRJbmRleFN0YXJ0ICs9IGdlb21ldHJ5SW5mby5yZXNlcnZlZEluZGV4Q291bnQ7CiAgICAgICAgfQogICAgICAgIGlmIChnZW9tZXRyeUluZm8udmVydGV4U3RhcnQgIT09IG5leHRWZXJ0ZXhTdGFydCkgewogICAgICAgICAgY29uc3QgeyB2ZXJ0ZXhTdGFydCwgcmVzZXJ2ZWRWZXJ0ZXhDb3VudCB9ID0gZ2VvbWV0cnlJbmZvOwogICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNba2V5XTsKICAgICAgICAgICAgY29uc3QgeyBhcnJheSwgaXRlbVNpemUgfSA9IGF0dHJpYnV0ZTsKICAgICAgICAgICAgYXJyYXkuY29weVdpdGhpbihuZXh0VmVydGV4U3RhcnQgKiBpdGVtU2l6ZSwgdmVydGV4U3RhcnQgKiBpdGVtU2l6ZSwgKHZlcnRleFN0YXJ0ICsgcmVzZXJ2ZWRWZXJ0ZXhDb3VudCkgKiBpdGVtU2l6ZSk7CiAgICAgICAgICAgIGF0dHJpYnV0ZS5hZGRVcGRhdGVSYW5nZShuZXh0VmVydGV4U3RhcnQgKiBpdGVtU2l6ZSwgcmVzZXJ2ZWRWZXJ0ZXhDb3VudCAqIGl0ZW1TaXplKTsKICAgICAgICAgIH0KICAgICAgICAgIGdlb21ldHJ5SW5mby52ZXJ0ZXhTdGFydCA9IG5leHRWZXJ0ZXhTdGFydDsKICAgICAgICB9CiAgICAgICAgbmV4dFZlcnRleFN0YXJ0ICs9IGdlb21ldHJ5SW5mby5yZXNlcnZlZFZlcnRleENvdW50OwogICAgICAgIGdlb21ldHJ5SW5mby5zdGFydCA9IGdlb21ldHJ5LmluZGV4ID8gZ2VvbWV0cnlJbmZvLmluZGV4U3RhcnQgOiBnZW9tZXRyeUluZm8udmVydGV4U3RhcnQ7CiAgICAgICAgdGhpcy5fbmV4dEluZGV4U3RhcnQgPSBnZW9tZXRyeS5pbmRleCA/IGdlb21ldHJ5SW5mby5pbmRleFN0YXJ0ICsgZ2VvbWV0cnlJbmZvLnJlc2VydmVkSW5kZXhDb3VudCA6IDA7CiAgICAgICAgdGhpcy5fbmV4dFZlcnRleFN0YXJ0ID0gZ2VvbWV0cnlJbmZvLnZlcnRleFN0YXJ0ICsgZ2VvbWV0cnlJbmZvLnJlc2VydmVkVmVydGV4Q291bnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBnZXRCb3VuZGluZ0JveEF0KGdlb21ldHJ5SWQsIHRhcmdldCkgewogICAgICBpZiAoZ2VvbWV0cnlJZCA+PSB0aGlzLl9nZW9tZXRyeUNvdW50KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OwogICAgICBjb25zdCBnZW9tZXRyeUluZm8gPSB0aGlzLl9nZW9tZXRyeUluZm9bZ2VvbWV0cnlJZF07CiAgICAgIGlmIChnZW9tZXRyeUluZm8uYm91bmRpbmdCb3ggPT09IG51bGwpIHsKICAgICAgICBjb25zdCBib3ggPSBuZXcgQm94MzsKICAgICAgICBjb25zdCBpbmRleCA9IGdlb21ldHJ5LmluZGV4OwogICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKICAgICAgICBmb3IgKGxldCBpID0gZ2VvbWV0cnlJbmZvLnN0YXJ0LCBsID0gZ2VvbWV0cnlJbmZvLnN0YXJ0ICsgZ2VvbWV0cnlJbmZvLmNvdW50O2kgPCBsOyBpKyspIHsKICAgICAgICAgIGxldCBpdiA9IGk7CiAgICAgICAgICBpZiAoaW5kZXgpIHsKICAgICAgICAgICAgaXYgPSBpbmRleC5nZXRYKGl2KTsKICAgICAgICAgIH0KICAgICAgICAgIGJveC5leHBhbmRCeVBvaW50KF92ZWN0b3IkNS5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpdikpOwogICAgICAgIH0KICAgICAgICBnZW9tZXRyeUluZm8uYm91bmRpbmdCb3ggPSBib3g7CiAgICAgIH0KICAgICAgdGFyZ2V0LmNvcHkoZ2VvbWV0cnlJbmZvLmJvdW5kaW5nQm94KTsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGdldEJvdW5kaW5nU3BoZXJlQXQoZ2VvbWV0cnlJZCwgdGFyZ2V0KSB7CiAgICAgIGlmIChnZW9tZXRyeUlkID49IHRoaXMuX2dlb21ldHJ5Q291bnQpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgIGNvbnN0IGdlb21ldHJ5SW5mbyA9IHRoaXMuX2dlb21ldHJ5SW5mb1tnZW9tZXRyeUlkXTsKICAgICAgaWYgKGdlb21ldHJ5SW5mby5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCkgewogICAgICAgIGNvbnN0IHNwaGVyZSA9IG5ldyBTcGhlcmU7CiAgICAgICAgdGhpcy5nZXRCb3VuZGluZ0JveEF0KGdlb21ldHJ5SWQsIF9ib3gkMSk7CiAgICAgICAgX2JveCQxLmdldENlbnRlcihzcGhlcmUuY2VudGVyKTsKICAgICAgICBjb25zdCBpbmRleCA9IGdlb21ldHJ5LmluZGV4OwogICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKICAgICAgICBsZXQgbWF4UmFkaXVzU3EgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSBnZW9tZXRyeUluZm8uc3RhcnQsIGwgPSBnZW9tZXRyeUluZm8uc3RhcnQgKyBnZW9tZXRyeUluZm8uY291bnQ7aSA8IGw7IGkrKykgewogICAgICAgICAgbGV0IGl2ID0gaTsKICAgICAgICAgIGlmIChpbmRleCkgewogICAgICAgICAgICBpdiA9IGluZGV4LmdldFgoaXYpOwogICAgICAgICAgfQogICAgICAgICAgX3ZlY3RvciQ1LmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb24sIGl2KTsKICAgICAgICAgIG1heFJhZGl1c1NxID0gTWF0aC5tYXgobWF4UmFkaXVzU3EsIHNwaGVyZS5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoX3ZlY3RvciQ1KSk7CiAgICAgICAgfQogICAgICAgIHNwaGVyZS5yYWRpdXMgPSBNYXRoLnNxcnQobWF4UmFkaXVzU3EpOwogICAgICAgIGdlb21ldHJ5SW5mby5ib3VuZGluZ1NwaGVyZSA9IHNwaGVyZTsKICAgICAgfQogICAgICB0YXJnZXQuY29weShnZW9tZXRyeUluZm8uYm91bmRpbmdTcGhlcmUpOwogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQogICAgc2V0TWF0cml4QXQoaW5zdGFuY2VJZCwgbWF0cml4KSB7CiAgICAgIHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKGluc3RhbmNlSWQpOwogICAgICBjb25zdCBtYXRyaWNlc1RleHR1cmUgPSB0aGlzLl9tYXRyaWNlc1RleHR1cmU7CiAgICAgIGNvbnN0IG1hdHJpY2VzQXJyYXkgPSB0aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YTsKICAgICAgbWF0cml4LnRvQXJyYXkobWF0cmljZXNBcnJheSwgaW5zdGFuY2VJZCAqIDE2KTsKICAgICAgbWF0cmljZXNUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBnZXRNYXRyaXhBdChpbnN0YW5jZUlkLCBtYXRyaXgpIHsKICAgICAgdGhpcy52YWxpZGF0ZUluc3RhbmNlSWQoaW5zdGFuY2VJZCk7CiAgICAgIHJldHVybiBtYXRyaXguZnJvbUFycmF5KHRoaXMuX21hdHJpY2VzVGV4dHVyZS5pbWFnZS5kYXRhLCBpbnN0YW5jZUlkICogMTYpOwogICAgfQogICAgc2V0Q29sb3JBdChpbnN0YW5jZUlkLCBjb2xvcikgewogICAgICB0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZChpbnN0YW5jZUlkKTsKICAgICAgaWYgKHRoaXMuX2NvbG9yc1RleHR1cmUgPT09IG51bGwpIHsKICAgICAgICB0aGlzLl9pbml0Q29sb3JzVGV4dHVyZSgpOwogICAgICB9CiAgICAgIGNvbG9yLnRvQXJyYXkodGhpcy5fY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhLCBpbnN0YW5jZUlkICogNCk7CiAgICAgIHRoaXMuX2NvbG9yc1RleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldENvbG9yQXQoaW5zdGFuY2VJZCwgY29sb3IpIHsKICAgICAgdGhpcy52YWxpZGF0ZUluc3RhbmNlSWQoaW5zdGFuY2VJZCk7CiAgICAgIHJldHVybiBjb2xvci5mcm9tQXJyYXkodGhpcy5fY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhLCBpbnN0YW5jZUlkICogNCk7CiAgICB9CiAgICBzZXRWaXNpYmxlQXQoaW5zdGFuY2VJZCwgdmFsdWUpIHsKICAgICAgdGhpcy52YWxpZGF0ZUluc3RhbmNlSWQoaW5zdGFuY2VJZCk7CiAgICAgIGlmICh0aGlzLl9pbnN0YW5jZUluZm9baW5zdGFuY2VJZF0udmlzaWJsZSA9PT0gdmFsdWUpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICB0aGlzLl9pbnN0YW5jZUluZm9baW5zdGFuY2VJZF0udmlzaWJsZSA9IHZhbHVlOwogICAgICB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCA9IHRydWU7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZ2V0VmlzaWJsZUF0KGluc3RhbmNlSWQpIHsKICAgICAgdGhpcy52YWxpZGF0ZUluc3RhbmNlSWQoaW5zdGFuY2VJZCk7CiAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZUluZm9baW5zdGFuY2VJZF0udmlzaWJsZTsKICAgIH0KICAgIHNldEdlb21ldHJ5SWRBdChpbnN0YW5jZUlkLCBnZW9tZXRyeUlkKSB7CiAgICAgIHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKGluc3RhbmNlSWQpOwogICAgICB0aGlzLnZhbGlkYXRlR2VvbWV0cnlJZChnZW9tZXRyeUlkKTsKICAgICAgdGhpcy5faW5zdGFuY2VJbmZvW2luc3RhbmNlSWRdLmdlb21ldHJ5SW5kZXggPSBnZW9tZXRyeUlkOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldEdlb21ldHJ5SWRBdChpbnN0YW5jZUlkKSB7CiAgICAgIHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKGluc3RhbmNlSWQpOwogICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2VJbmZvW2luc3RhbmNlSWRdLmdlb21ldHJ5SW5kZXg7CiAgICB9CiAgICBnZXRHZW9tZXRyeVJhbmdlQXQoZ2VvbWV0cnlJZCwgdGFyZ2V0ID0ge30pIHsKICAgICAgdGhpcy52YWxpZGF0ZUdlb21ldHJ5SWQoZ2VvbWV0cnlJZCk7CiAgICAgIGNvbnN0IGdlb21ldHJ5SW5mbyA9IHRoaXMuX2dlb21ldHJ5SW5mb1tnZW9tZXRyeUlkXTsKICAgICAgdGFyZ2V0LnZlcnRleFN0YXJ0ID0gZ2VvbWV0cnlJbmZvLnZlcnRleFN0YXJ0OwogICAgICB0YXJnZXQudmVydGV4Q291bnQgPSBnZW9tZXRyeUluZm8udmVydGV4Q291bnQ7CiAgICAgIHRhcmdldC5yZXNlcnZlZFZlcnRleENvdW50ID0gZ2VvbWV0cnlJbmZvLnJlc2VydmVkVmVydGV4Q291bnQ7CiAgICAgIHRhcmdldC5pbmRleFN0YXJ0ID0gZ2VvbWV0cnlJbmZvLmluZGV4U3RhcnQ7CiAgICAgIHRhcmdldC5pbmRleENvdW50ID0gZ2VvbWV0cnlJbmZvLmluZGV4Q291bnQ7CiAgICAgIHRhcmdldC5yZXNlcnZlZEluZGV4Q291bnQgPSBnZW9tZXRyeUluZm8ucmVzZXJ2ZWRJbmRleENvdW50OwogICAgICB0YXJnZXQuc3RhcnQgPSBnZW9tZXRyeUluZm8uc3RhcnQ7CiAgICAgIHRhcmdldC5jb3VudCA9IGdlb21ldHJ5SW5mby5jb3VudDsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIHNldEluc3RhbmNlQ291bnQobWF4SW5zdGFuY2VDb3VudCkgewogICAgICBjb25zdCBhdmFpbGFibGVJbnN0YW5jZUlkcyA9IHRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzOwogICAgICBjb25zdCBpbnN0YW5jZUluZm8gPSB0aGlzLl9pbnN0YW5jZUluZm87CiAgICAgIGF2YWlsYWJsZUluc3RhbmNlSWRzLnNvcnQoYXNjSWRTb3J0KTsKICAgICAgd2hpbGUgKGF2YWlsYWJsZUluc3RhbmNlSWRzW2F2YWlsYWJsZUluc3RhbmNlSWRzLmxlbmd0aCAtIDFdID09PSBpbnN0YW5jZUluZm8ubGVuZ3RoKSB7CiAgICAgICAgaW5zdGFuY2VJbmZvLnBvcCgpOwogICAgICAgIGF2YWlsYWJsZUluc3RhbmNlSWRzLnBvcCgpOwogICAgICB9CiAgICAgIGlmIChtYXhJbnN0YW5jZUNvdW50IDwgaW5zdGFuY2VJbmZvLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgQmF0Y2hlZE1lc2g6IEluc3RhbmNlIGlkcyBvdXRzaWRlIHRoZSByYW5nZSAke21heEluc3RhbmNlQ291bnR9IGFyZSBiZWluZyB1c2VkLiBDYW5ub3Qgc2hyaW5rIGluc3RhbmNlIGNvdW50LmApOwogICAgICB9CiAgICAgIGNvbnN0IG11bHRpRHJhd0NvdW50cyA9IG5ldyBJbnQzMkFycmF5KG1heEluc3RhbmNlQ291bnQpOwogICAgICBjb25zdCBtdWx0aURyYXdTdGFydHMgPSBuZXcgSW50MzJBcnJheShtYXhJbnN0YW5jZUNvdW50KTsKICAgICAgY29weUFycmF5Q29udGVudHModGhpcy5fbXVsdGlEcmF3Q291bnRzLCBtdWx0aURyYXdDb3VudHMpOwogICAgICBjb3B5QXJyYXlDb250ZW50cyh0aGlzLl9tdWx0aURyYXdTdGFydHMsIG11bHRpRHJhd1N0YXJ0cyk7CiAgICAgIHRoaXMuX211bHRpRHJhd0NvdW50cyA9IG11bHRpRHJhd0NvdW50czsKICAgICAgdGhpcy5fbXVsdGlEcmF3U3RhcnRzID0gbXVsdGlEcmF3U3RhcnRzOwogICAgICB0aGlzLl9tYXhJbnN0YW5jZUNvdW50ID0gbWF4SW5zdGFuY2VDb3VudDsKICAgICAgY29uc3QgaW5kaXJlY3RUZXh0dXJlID0gdGhpcy5faW5kaXJlY3RUZXh0dXJlOwogICAgICBjb25zdCBtYXRyaWNlc1RleHR1cmUgPSB0aGlzLl9tYXRyaWNlc1RleHR1cmU7CiAgICAgIGNvbnN0IGNvbG9yc1RleHR1cmUgPSB0aGlzLl9jb2xvcnNUZXh0dXJlOwogICAgICBpbmRpcmVjdFRleHR1cmUuZGlzcG9zZSgpOwogICAgICB0aGlzLl9pbml0SW5kaXJlY3RUZXh0dXJlKCk7CiAgICAgIGNvcHlBcnJheUNvbnRlbnRzKGluZGlyZWN0VGV4dHVyZS5pbWFnZS5kYXRhLCB0aGlzLl9pbmRpcmVjdFRleHR1cmUuaW1hZ2UuZGF0YSk7CiAgICAgIG1hdHJpY2VzVGV4dHVyZS5kaXNwb3NlKCk7CiAgICAgIHRoaXMuX2luaXRNYXRyaWNlc1RleHR1cmUoKTsKICAgICAgY29weUFycmF5Q29udGVudHMobWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGEsIHRoaXMuX21hdHJpY2VzVGV4dHVyZS5pbWFnZS5kYXRhKTsKICAgICAgaWYgKGNvbG9yc1RleHR1cmUpIHsKICAgICAgICBjb2xvcnNUZXh0dXJlLmRpc3Bvc2UoKTsKICAgICAgICB0aGlzLl9pbml0Q29sb3JzVGV4dHVyZSgpOwogICAgICAgIGNvcHlBcnJheUNvbnRlbnRzKGNvbG9yc1RleHR1cmUuaW1hZ2UuZGF0YSwgdGhpcy5fY29sb3JzVGV4dHVyZS5pbWFnZS5kYXRhKTsKICAgICAgfQogICAgfQogICAgc2V0R2VvbWV0cnlTaXplKG1heFZlcnRleENvdW50LCBtYXhJbmRleENvdW50KSB7CiAgICAgIGNvbnN0IHZhbGlkUmFuZ2VzID0gWy4uLnRoaXMuX2dlb21ldHJ5SW5mb10uZmlsdGVyKChpbmZvKSA9PiBpbmZvLmFjdGl2ZSk7CiAgICAgIGNvbnN0IHJlcXVpcmVkVmVydGV4TGVuZ3RoID0gTWF0aC5tYXgoLi4udmFsaWRSYW5nZXMubWFwKChyYW5nZSkgPT4gcmFuZ2UudmVydGV4U3RhcnQgKyByYW5nZS5yZXNlcnZlZFZlcnRleENvdW50KSk7CiAgICAgIGlmIChyZXF1aXJlZFZlcnRleExlbmd0aCA+IG1heFZlcnRleENvdW50KSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYXRjaGVkTWVzaDogR2VvbWV0cnkgdmVydGV4IHZhbHVlcyBhcmUgYmVpbmcgdXNlZCBvdXRzaWRlIHRoZSByYW5nZSAke21heEluZGV4Q291bnR9LiBDYW5ub3Qgc2hyaW5rIGZ1cnRoZXIuYCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZ2VvbWV0cnkuaW5kZXgpIHsKICAgICAgICBjb25zdCByZXF1aXJlZEluZGV4TGVuZ3RoID0gTWF0aC5tYXgoLi4udmFsaWRSYW5nZXMubWFwKChyYW5nZSkgPT4gcmFuZ2UuaW5kZXhTdGFydCArIHJhbmdlLnJlc2VydmVkSW5kZXhDb3VudCkpOwogICAgICAgIGlmIChyZXF1aXJlZEluZGV4TGVuZ3RoID4gbWF4SW5kZXhDb3VudCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYXRjaGVkTWVzaDogR2VvbWV0cnkgaW5kZXggdmFsdWVzIGFyZSBiZWluZyB1c2VkIG91dHNpZGUgdGhlIHJhbmdlICR7bWF4SW5kZXhDb3VudH0uIENhbm5vdCBzaHJpbmsgZnVydGhlci5gKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3Qgb2xkR2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OwogICAgICBvbGRHZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAgIHRoaXMuX21heFZlcnRleENvdW50ID0gbWF4VmVydGV4Q291bnQ7CiAgICAgIHRoaXMuX21heEluZGV4Q291bnQgPSBtYXhJbmRleENvdW50OwogICAgICBpZiAodGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCkgewogICAgICAgIHRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLmdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5OwogICAgICAgIHRoaXMuX2luaXRpYWxpemVHZW9tZXRyeShvbGRHZW9tZXRyeSk7CiAgICAgIH0KICAgICAgY29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OwogICAgICBpZiAob2xkR2VvbWV0cnkuaW5kZXgpIHsKICAgICAgICBjb3B5QXJyYXlDb250ZW50cyhvbGRHZW9tZXRyeS5pbmRleC5hcnJheSwgZ2VvbWV0cnkuaW5kZXguYXJyYXkpOwogICAgICB9CiAgICAgIGZvciAoY29uc3Qga2V5IGluIG9sZEdlb21ldHJ5LmF0dHJpYnV0ZXMpIHsKICAgICAgICBjb3B5QXJyYXlDb250ZW50cyhvbGRHZW9tZXRyeS5hdHRyaWJ1dGVzW2tleV0uYXJyYXksIGdlb21ldHJ5LmF0dHJpYnV0ZXNba2V5XS5hcnJheSk7CiAgICAgIH0KICAgIH0KICAgIHJheWNhc3QocmF5Y2FzdGVyLCBpbnRlcnNlY3RzKSB7CiAgICAgIGNvbnN0IGluc3RhbmNlSW5mbyA9IHRoaXMuX2luc3RhbmNlSW5mbzsKICAgICAgY29uc3QgZ2VvbWV0cnlJbmZvTGlzdCA9IHRoaXMuX2dlb21ldHJ5SW5mbzsKICAgICAgY29uc3QgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkOwogICAgICBjb25zdCBiYXRjaEdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKICAgICAgX21lc2gubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsOwogICAgICBfbWVzaC5nZW9tZXRyeS5pbmRleCA9IGJhdGNoR2VvbWV0cnkuaW5kZXg7CiAgICAgIF9tZXNoLmdlb21ldHJ5LmF0dHJpYnV0ZXMgPSBiYXRjaEdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICAgIGlmIChfbWVzaC5nZW9tZXRyeS5ib3VuZGluZ0JveCA9PT0gbnVsbCkgewogICAgICAgIF9tZXNoLmdlb21ldHJ5LmJvdW5kaW5nQm94ID0gbmV3IEJveDM7CiAgICAgIH0KICAgICAgaWYgKF9tZXNoLmdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsKSB7CiAgICAgICAgX21lc2guZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlOwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gaW5zdGFuY2VJbmZvLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgaWYgKCFpbnN0YW5jZUluZm9baV0udmlzaWJsZSB8fCAhaW5zdGFuY2VJbmZvW2ldLmFjdGl2ZSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGdlb21ldHJ5SWQgPSBpbnN0YW5jZUluZm9baV0uZ2VvbWV0cnlJbmRleDsKICAgICAgICBjb25zdCBnZW9tZXRyeUluZm8gPSBnZW9tZXRyeUluZm9MaXN0W2dlb21ldHJ5SWRdOwogICAgICAgIF9tZXNoLmdlb21ldHJ5LnNldERyYXdSYW5nZShnZW9tZXRyeUluZm8uc3RhcnQsIGdlb21ldHJ5SW5mby5jb3VudCk7CiAgICAgICAgdGhpcy5nZXRNYXRyaXhBdChpLCBfbWVzaC5tYXRyaXhXb3JsZCkucHJlbXVsdGlwbHkobWF0cml4V29ybGQpOwogICAgICAgIHRoaXMuZ2V0Qm91bmRpbmdCb3hBdChnZW9tZXRyeUlkLCBfbWVzaC5nZW9tZXRyeS5ib3VuZGluZ0JveCk7CiAgICAgICAgdGhpcy5nZXRCb3VuZGluZ1NwaGVyZUF0KGdlb21ldHJ5SWQsIF9tZXNoLmdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlKTsKICAgICAgICBfbWVzaC5yYXljYXN0KHJheWNhc3RlciwgX2JhdGNoSW50ZXJzZWN0cyk7CiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGwyID0gX2JhdGNoSW50ZXJzZWN0cy5sZW5ndGg7aiA8IGwyOyBqKyspIHsKICAgICAgICAgIGNvbnN0IGludGVyc2VjdCA9IF9iYXRjaEludGVyc2VjdHNbal07CiAgICAgICAgICBpbnRlcnNlY3Qub2JqZWN0ID0gdGhpczsKICAgICAgICAgIGludGVyc2VjdC5iYXRjaElkID0gaTsKICAgICAgICAgIGludGVyc2VjdHMucHVzaChpbnRlcnNlY3QpOwogICAgICAgIH0KICAgICAgICBfYmF0Y2hJbnRlcnNlY3RzLmxlbmd0aCA9IDA7CiAgICAgIH0KICAgICAgX21lc2gubWF0ZXJpYWwgPSBudWxsOwogICAgICBfbWVzaC5nZW9tZXRyeS5pbmRleCA9IG51bGw7CiAgICAgIF9tZXNoLmdlb21ldHJ5LmF0dHJpYnV0ZXMgPSB7fTsKICAgICAgX21lc2guZ2VvbWV0cnkuc2V0RHJhd1JhbmdlKDAsIEluZmluaXR5KTsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5nZW9tZXRyeSA9IHNvdXJjZS5nZW9tZXRyeS5jbG9uZSgpOwogICAgICB0aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQgPSBzb3VyY2UucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZDsKICAgICAgdGhpcy5zb3J0T2JqZWN0cyA9IHNvdXJjZS5zb3J0T2JqZWN0czsKICAgICAgdGhpcy5ib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveCAhPT0gbnVsbCA/IHNvdXJjZS5ib3VuZGluZ0JveC5jbG9uZSgpIDogbnVsbDsKICAgICAgdGhpcy5ib3VuZGluZ1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCA/IHNvdXJjZS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpIDogbnVsbDsKICAgICAgdGhpcy5fZ2VvbWV0cnlJbmZvID0gc291cmNlLl9nZW9tZXRyeUluZm8ubWFwKChpbmZvKSA9PiAoewogICAgICAgIC4uLmluZm8sCiAgICAgICAgYm91bmRpbmdCb3g6IGluZm8uYm91bmRpbmdCb3ggIT09IG51bGwgPyBpbmZvLmJvdW5kaW5nQm94LmNsb25lKCkgOiBudWxsLAogICAgICAgIGJvdW5kaW5nU3BoZXJlOiBpbmZvLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsID8gaW5mby5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpIDogbnVsbAogICAgICB9KSk7CiAgICAgIHRoaXMuX2luc3RhbmNlSW5mbyA9IHNvdXJjZS5faW5zdGFuY2VJbmZvLm1hcCgoaW5mbykgPT4gKHsgLi4uaW5mbyB9KSk7CiAgICAgIHRoaXMuX21heEluc3RhbmNlQ291bnQgPSBzb3VyY2UuX21heEluc3RhbmNlQ291bnQ7CiAgICAgIHRoaXMuX21heFZlcnRleENvdW50ID0gc291cmNlLl9tYXhWZXJ0ZXhDb3VudDsKICAgICAgdGhpcy5fbWF4SW5kZXhDb3VudCA9IHNvdXJjZS5fbWF4SW5kZXhDb3VudDsKICAgICAgdGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCA9IHNvdXJjZS5fZ2VvbWV0cnlJbml0aWFsaXplZDsKICAgICAgdGhpcy5fZ2VvbWV0cnlDb3VudCA9IHNvdXJjZS5fZ2VvbWV0cnlDb3VudDsKICAgICAgdGhpcy5fbXVsdGlEcmF3Q291bnRzID0gc291cmNlLl9tdWx0aURyYXdDb3VudHMuc2xpY2UoKTsKICAgICAgdGhpcy5fbXVsdGlEcmF3U3RhcnRzID0gc291cmNlLl9tdWx0aURyYXdTdGFydHMuc2xpY2UoKTsKICAgICAgdGhpcy5fbWF0cmljZXNUZXh0dXJlID0gc291cmNlLl9tYXRyaWNlc1RleHR1cmUuY2xvbmUoKTsKICAgICAgdGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGEgPSB0aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YS5zbGljZSgpOwogICAgICBpZiAodGhpcy5fY29sb3JzVGV4dHVyZSAhPT0gbnVsbCkgewogICAgICAgIHRoaXMuX2NvbG9yc1RleHR1cmUgPSBzb3VyY2UuX2NvbG9yc1RleHR1cmUuY2xvbmUoKTsKICAgICAgICB0aGlzLl9jb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEgPSB0aGlzLl9jb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEuc2xpY2UoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGRpc3Bvc2UoKSB7CiAgICAgIHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpOwogICAgICB0aGlzLl9tYXRyaWNlc1RleHR1cmUuZGlzcG9zZSgpOwogICAgICB0aGlzLl9tYXRyaWNlc1RleHR1cmUgPSBudWxsOwogICAgICB0aGlzLl9pbmRpcmVjdFRleHR1cmUuZGlzcG9zZSgpOwogICAgICB0aGlzLl9pbmRpcmVjdFRleHR1cmUgPSBudWxsOwogICAgICBpZiAodGhpcy5fY29sb3JzVGV4dHVyZSAhPT0gbnVsbCkgewogICAgICAgIHRoaXMuX2NvbG9yc1RleHR1cmUuZGlzcG9zZSgpOwogICAgICAgIHRoaXMuX2NvbG9yc1RleHR1cmUgPSBudWxsOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgb25CZWZvcmVSZW5kZXIocmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCkgewogICAgICBpZiAoIXRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkICYmICF0aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQgJiYgIXRoaXMuc29ydE9iamVjdHMpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3QgaW5kZXggPSBnZW9tZXRyeS5nZXRJbmRleCgpOwogICAgICBjb25zdCBieXRlc1BlckVsZW1lbnQgPSBpbmRleCA9PT0gbnVsbCA/IDEgOiBpbmRleC5hcnJheS5CWVRFU19QRVJfRUxFTUVOVDsKICAgICAgY29uc3QgaW5zdGFuY2VJbmZvID0gdGhpcy5faW5zdGFuY2VJbmZvOwogICAgICBjb25zdCBtdWx0aURyYXdTdGFydHMgPSB0aGlzLl9tdWx0aURyYXdTdGFydHM7CiAgICAgIGNvbnN0IG11bHRpRHJhd0NvdW50cyA9IHRoaXMuX211bHRpRHJhd0NvdW50czsKICAgICAgY29uc3QgZ2VvbWV0cnlJbmZvTGlzdCA9IHRoaXMuX2dlb21ldHJ5SW5mbzsKICAgICAgY29uc3QgcGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCA9IHRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZDsKICAgICAgY29uc3QgaW5kaXJlY3RUZXh0dXJlID0gdGhpcy5faW5kaXJlY3RUZXh0dXJlOwogICAgICBjb25zdCBpbmRpcmVjdEFycmF5ID0gaW5kaXJlY3RUZXh0dXJlLmltYWdlLmRhdGE7CiAgICAgIGlmIChwZXJPYmplY3RGcnVzdHVtQ3VsbGVkKSB7CiAgICAgICAgX21hdHJpeCQxLm11bHRpcGx5TWF0cmljZXMoY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UpLm11bHRpcGx5KHRoaXMubWF0cml4V29ybGQpOwogICAgICAgIF9mcnVzdHVtLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KF9tYXRyaXgkMSwgcmVuZGVyZXIuY29vcmRpbmF0ZVN5c3RlbSk7CiAgICAgIH0KICAgICAgbGV0IG11bHRpRHJhd0NvdW50ID0gMDsKICAgICAgaWYgKHRoaXMuc29ydE9iamVjdHMpIHsKICAgICAgICBfbWF0cml4JDEuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKTsKICAgICAgICBfdmVjdG9yJDUuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGNhbWVyYS5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KF9tYXRyaXgkMSk7CiAgICAgICAgX2ZvcndhcmQuc2V0KDAsIDAsIC0xKS50cmFuc2Zvcm1EaXJlY3Rpb24oY2FtZXJhLm1hdHJpeFdvcmxkKS50cmFuc2Zvcm1EaXJlY3Rpb24oX21hdHJpeCQxKTsKICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGluc3RhbmNlSW5mby5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgICAgaWYgKGluc3RhbmNlSW5mb1tpXS52aXNpYmxlICYmIGluc3RhbmNlSW5mb1tpXS5hY3RpdmUpIHsKICAgICAgICAgICAgY29uc3QgZ2VvbWV0cnlJZCA9IGluc3RhbmNlSW5mb1tpXS5nZW9tZXRyeUluZGV4OwogICAgICAgICAgICB0aGlzLmdldE1hdHJpeEF0KGksIF9tYXRyaXgkMSk7CiAgICAgICAgICAgIHRoaXMuZ2V0Qm91bmRpbmdTcGhlcmVBdChnZW9tZXRyeUlkLCBfc3BoZXJlJDIpLmFwcGx5TWF0cml4NChfbWF0cml4JDEpOwogICAgICAgICAgICBsZXQgY3VsbGVkID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChwZXJPYmplY3RGcnVzdHVtQ3VsbGVkKSB7CiAgICAgICAgICAgICAgY3VsbGVkID0gIV9mcnVzdHVtLmludGVyc2VjdHNTcGhlcmUoX3NwaGVyZSQyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWN1bGxlZCkgewogICAgICAgICAgICAgIGNvbnN0IGdlb21ldHJ5SW5mbyA9IGdlb21ldHJ5SW5mb0xpc3RbZ2VvbWV0cnlJZF07CiAgICAgICAgICAgICAgY29uc3QgeiA9IF90ZW1wLnN1YlZlY3RvcnMoX3NwaGVyZSQyLmNlbnRlciwgX3ZlY3RvciQ1KS5kb3QoX2ZvcndhcmQpOwogICAgICAgICAgICAgIF9yZW5kZXJMaXN0LnB1c2goZ2VvbWV0cnlJbmZvLnN0YXJ0LCBnZW9tZXRyeUluZm8uY291bnQsIHosIGkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxpc3QgPSBfcmVuZGVyTGlzdC5saXN0OwogICAgICAgIGNvbnN0IGN1c3RvbVNvcnQgPSB0aGlzLmN1c3RvbVNvcnQ7CiAgICAgICAgaWYgKGN1c3RvbVNvcnQgPT09IG51bGwpIHsKICAgICAgICAgIGxpc3Quc29ydChtYXRlcmlhbC50cmFuc3BhcmVudCA/IHNvcnRUcmFuc3BhcmVudCA6IHNvcnRPcGFxdWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXN0b21Tb3J0LmNhbGwodGhpcywgbGlzdCwgY2FtZXJhKTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBpdGVtID0gbGlzdFtpXTsKICAgICAgICAgIG11bHRpRHJhd1N0YXJ0c1ttdWx0aURyYXdDb3VudF0gPSBpdGVtLnN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50OwogICAgICAgICAgbXVsdGlEcmF3Q291bnRzW211bHRpRHJhd0NvdW50XSA9IGl0ZW0uY291bnQ7CiAgICAgICAgICBpbmRpcmVjdEFycmF5W211bHRpRHJhd0NvdW50XSA9IGl0ZW0uaW5kZXg7CiAgICAgICAgICBtdWx0aURyYXdDb3VudCsrOwogICAgICAgIH0KICAgICAgICBfcmVuZGVyTGlzdC5yZXNldCgpOwogICAgICB9IGVsc2UgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gaW5zdGFuY2VJbmZvLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICBpZiAoaW5zdGFuY2VJbmZvW2ldLnZpc2libGUgJiYgaW5zdGFuY2VJbmZvW2ldLmFjdGl2ZSkgewogICAgICAgICAgICBjb25zdCBnZW9tZXRyeUlkID0gaW5zdGFuY2VJbmZvW2ldLmdlb21ldHJ5SW5kZXg7CiAgICAgICAgICAgIGxldCBjdWxsZWQgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHBlck9iamVjdEZydXN0dW1DdWxsZWQpIHsKICAgICAgICAgICAgICB0aGlzLmdldE1hdHJpeEF0KGksIF9tYXRyaXgkMSk7CiAgICAgICAgICAgICAgdGhpcy5nZXRCb3VuZGluZ1NwaGVyZUF0KGdlb21ldHJ5SWQsIF9zcGhlcmUkMikuYXBwbHlNYXRyaXg0KF9tYXRyaXgkMSk7CiAgICAgICAgICAgICAgY3VsbGVkID0gIV9mcnVzdHVtLmludGVyc2VjdHNTcGhlcmUoX3NwaGVyZSQyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWN1bGxlZCkgewogICAgICAgICAgICAgIGNvbnN0IGdlb21ldHJ5SW5mbyA9IGdlb21ldHJ5SW5mb0xpc3RbZ2VvbWV0cnlJZF07CiAgICAgICAgICAgICAgbXVsdGlEcmF3U3RhcnRzW211bHRpRHJhd0NvdW50XSA9IGdlb21ldHJ5SW5mby5zdGFydCAqIGJ5dGVzUGVyRWxlbWVudDsKICAgICAgICAgICAgICBtdWx0aURyYXdDb3VudHNbbXVsdGlEcmF3Q291bnRdID0gZ2VvbWV0cnlJbmZvLmNvdW50OwogICAgICAgICAgICAgIGluZGlyZWN0QXJyYXlbbXVsdGlEcmF3Q291bnRdID0gaTsKICAgICAgICAgICAgICBtdWx0aURyYXdDb3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGluZGlyZWN0VGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgIHRoaXMuX211bHRpRHJhd0NvdW50ID0gbXVsdGlEcmF3Q291bnQ7CiAgICAgIHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkID0gZmFsc2U7CiAgICB9CiAgICBvbkJlZm9yZVNoYWRvdyhyZW5kZXJlciwgb2JqZWN0LCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwpIHsKICAgICAgdGhpcy5vbkJlZm9yZVJlbmRlcihyZW5kZXJlciwgbnVsbCwgc2hhZG93Q2FtZXJhLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCk7CiAgICB9CiAgfTsKICBMaW5lQmFzaWNNYXRlcmlhbCA9IGNsYXNzIExpbmVCYXNpY01hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwgewogICAgY29uc3RydWN0b3IocGFyYW1ldGVycykgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzTGluZUJhc2ljTWF0ZXJpYWwgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiTGluZUJhc2ljTWF0ZXJpYWwiOwogICAgICB0aGlzLmNvbG9yID0gbmV3IENvbG9yKDE2Nzc3MjE1KTsKICAgICAgdGhpcy5tYXAgPSBudWxsOwogICAgICB0aGlzLmxpbmV3aWR0aCA9IDE7CiAgICAgIHRoaXMubGluZWNhcCA9ICJyb3VuZCI7CiAgICAgIHRoaXMubGluZWpvaW4gPSAicm91bmQiOwogICAgICB0aGlzLmZvZyA9IHRydWU7CiAgICAgIHRoaXMuc2V0VmFsdWVzKHBhcmFtZXRlcnMpOwogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLmNvbG9yLmNvcHkoc291cmNlLmNvbG9yKTsKICAgICAgdGhpcy5tYXAgPSBzb3VyY2UubWFwOwogICAgICB0aGlzLmxpbmV3aWR0aCA9IHNvdXJjZS5saW5ld2lkdGg7CiAgICAgIHRoaXMubGluZWNhcCA9IHNvdXJjZS5saW5lY2FwOwogICAgICB0aGlzLmxpbmVqb2luID0gc291cmNlLmxpbmVqb2luOwogICAgICB0aGlzLmZvZyA9IHNvdXJjZS5mb2c7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH07CiAgX3ZTdGFydCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfdkVuZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfaW52ZXJzZU1hdHJpeCQxID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXg0OwogIF9yYXkkMSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgUmF5OwogIF9zcGhlcmUkMSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU3BoZXJlOwogIF9pbnRlcnNlY3RQb2ludE9uUmF5ID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9pbnRlcnNlY3RQb2ludE9uU2VnbWVudCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBMaW5lID0gY2xhc3MgTGluZSBleHRlbmRzIE9iamVjdDNEIHsKICAgIGNvbnN0cnVjdG9yKGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5LCBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzTGluZSA9IHRydWU7CiAgICAgIHRoaXMudHlwZSA9ICJMaW5lIjsKICAgICAgdGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5OwogICAgICB0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7CiAgICAgIHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCk7CiAgICB9CiAgICBjb3B5KHNvdXJjZSwgcmVjdXJzaXZlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlLCByZWN1cnNpdmUpOwogICAgICB0aGlzLm1hdGVyaWFsID0gQXJyYXkuaXNBcnJheShzb3VyY2UubWF0ZXJpYWwpID8gc291cmNlLm1hdGVyaWFsLnNsaWNlKCkgOiBzb3VyY2UubWF0ZXJpYWw7CiAgICAgIHRoaXMuZ2VvbWV0cnkgPSBzb3VyY2UuZ2VvbWV0cnk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSB7CiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKICAgICAgaWYgKGdlb21ldHJ5LmluZGV4ID09PSBudWxsKSB7CiAgICAgICAgY29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgICAgIGNvbnN0IGxpbmVEaXN0YW5jZXMgPSBbMF07CiAgICAgICAgZm9yIChsZXQgaSA9IDEsIGwgPSBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICBfdlN0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb25BdHRyaWJ1dGUsIGkgLSAxKTsKICAgICAgICAgIF92RW5kLmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb25BdHRyaWJ1dGUsIGkpOwogICAgICAgICAgbGluZURpc3RhbmNlc1tpXSA9IGxpbmVEaXN0YW5jZXNbaSAtIDFdOwogICAgICAgICAgbGluZURpc3RhbmNlc1tpXSArPSBfdlN0YXJ0LmRpc3RhbmNlVG8oX3ZFbmQpOwogICAgICAgIH0KICAgICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKGxpbmVEaXN0YW5jZXMsIDEpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTogQ29tcHV0YXRpb24gb25seSBwb3NzaWJsZSB3aXRoIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5LiIpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcmF5Y2FzdChyYXljYXN0ZXIsIGludGVyc2VjdHMpIHsKICAgICAgY29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OwogICAgICBjb25zdCBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7CiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IHJheWNhc3Rlci5wYXJhbXMuTGluZS50aHJlc2hvbGQ7CiAgICAgIGNvbnN0IGRyYXdSYW5nZSA9IGdlb21ldHJ5LmRyYXdSYW5nZTsKICAgICAgaWYgKGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsKQogICAgICAgIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwogICAgICBfc3BoZXJlJDEuY29weShnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSk7CiAgICAgIF9zcGhlcmUkMS5hcHBseU1hdHJpeDQobWF0cml4V29ybGQpOwogICAgICBfc3BoZXJlJDEucmFkaXVzICs9IHRocmVzaG9sZDsKICAgICAgaWYgKHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZShfc3BoZXJlJDEpID09PSBmYWxzZSkKICAgICAgICByZXR1cm47CiAgICAgIF9pbnZlcnNlTWF0cml4JDEuY29weShtYXRyaXhXb3JsZCkuaW52ZXJ0KCk7CiAgICAgIF9yYXkkMS5jb3B5KHJheWNhc3Rlci5yYXkpLmFwcGx5TWF0cml4NChfaW52ZXJzZU1hdHJpeCQxKTsKICAgICAgY29uc3QgbG9jYWxUaHJlc2hvbGQgPSB0aHJlc2hvbGQgLyAoKHRoaXMuc2NhbGUueCArIHRoaXMuc2NhbGUueSArIHRoaXMuc2NhbGUueikgLyAzKTsKICAgICAgY29uc3QgbG9jYWxUaHJlc2hvbGRTcSA9IGxvY2FsVGhyZXNob2xkICogbG9jYWxUaHJlc2hvbGQ7CiAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmlzTGluZVNlZ21lbnRzID8gMiA6IDE7CiAgICAgIGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7CiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwogICAgICBjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMucG9zaXRpb247CiAgICAgIGlmIChpbmRleCAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgZHJhd1JhbmdlLnN0YXJ0KTsKICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihpbmRleC5jb3VudCwgZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50KTsKICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQsIGwgPSBlbmQgLSAxO2kgPCBsOyBpICs9IHN0ZXApIHsKICAgICAgICAgIGNvbnN0IGEgPSBpbmRleC5nZXRYKGkpOwogICAgICAgICAgY29uc3QgYiA9IGluZGV4LmdldFgoaSArIDEpOwogICAgICAgICAgY29uc3QgaW50ZXJzZWN0ID0gY2hlY2tJbnRlcnNlY3Rpb24odGhpcywgcmF5Y2FzdGVyLCBfcmF5JDEsIGxvY2FsVGhyZXNob2xkU3EsIGEsIGIsIGkpOwogICAgICAgICAgaWYgKGludGVyc2VjdCkgewogICAgICAgICAgICBpbnRlcnNlY3RzLnB1c2goaW50ZXJzZWN0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuaXNMaW5lTG9vcCkgewogICAgICAgICAgY29uc3QgYSA9IGluZGV4LmdldFgoZW5kIC0gMSk7CiAgICAgICAgICBjb25zdCBiID0gaW5kZXguZ2V0WChzdGFydCk7CiAgICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSBjaGVja0ludGVyc2VjdGlvbih0aGlzLCByYXljYXN0ZXIsIF9yYXkkMSwgbG9jYWxUaHJlc2hvbGRTcSwgYSwgYiwgZW5kIC0gMSk7CiAgICAgICAgICBpZiAoaW50ZXJzZWN0KSB7CiAgICAgICAgICAgIGludGVyc2VjdHMucHVzaChpbnRlcnNlY3QpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGRyYXdSYW5nZS5zdGFydCk7CiAgICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4ocG9zaXRpb25BdHRyaWJ1dGUuY291bnQsIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCk7CiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0LCBsID0gZW5kIC0gMTtpIDwgbDsgaSArPSBzdGVwKSB7CiAgICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSBjaGVja0ludGVyc2VjdGlvbih0aGlzLCByYXljYXN0ZXIsIF9yYXkkMSwgbG9jYWxUaHJlc2hvbGRTcSwgaSwgaSArIDEsIGkpOwogICAgICAgICAgaWYgKGludGVyc2VjdCkgewogICAgICAgICAgICBpbnRlcnNlY3RzLnB1c2goaW50ZXJzZWN0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuaXNMaW5lTG9vcCkgewogICAgICAgICAgY29uc3QgaW50ZXJzZWN0ID0gY2hlY2tJbnRlcnNlY3Rpb24odGhpcywgcmF5Y2FzdGVyLCBfcmF5JDEsIGxvY2FsVGhyZXNob2xkU3EsIGVuZCAtIDEsIHN0YXJ0LCBlbmQgLSAxKTsKICAgICAgICAgIGlmIChpbnRlcnNlY3QpIHsKICAgICAgICAgICAgaW50ZXJzZWN0cy5wdXNoKGludGVyc2VjdCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB1cGRhdGVNb3JwaFRhcmdldHMoKSB7CiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKICAgICAgY29uc3QgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzOwogICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMobW9ycGhBdHRyaWJ1dGVzKTsKICAgICAgaWYgKGtleXMubGVuZ3RoID4gMCkgewogICAgICAgIGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzW2tleXNbMF1dOwogICAgICAgIGlmIChtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdOwogICAgICAgICAgdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB7fTsKICAgICAgICAgIGZvciAobGV0IG0gPSAwLCBtbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDttIDwgbWw7IG0rKykgewogICAgICAgICAgICBjb25zdCBuYW1lID0gbW9ycGhBdHRyaWJ1dGVbbV0ubmFtZSB8fCBTdHJpbmcobSk7CiAgICAgICAgICAgIHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCk7CiAgICAgICAgICAgIHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W25hbWVdID0gbTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9OwogIF9zdGFydCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfZW5kID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIExpbmVTZWdtZW50cyA9IGNsYXNzIExpbmVTZWdtZW50cyBleHRlbmRzIExpbmUgewogICAgY29uc3RydWN0b3IoZ2VvbWV0cnksIG1hdGVyaWFsKSB7CiAgICAgIHN1cGVyKGdlb21ldHJ5LCBtYXRlcmlhbCk7CiAgICAgIHRoaXMuaXNMaW5lU2VnbWVudHMgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiTGluZVNlZ21lbnRzIjsKICAgIH0KICAgIGNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgewogICAgICBjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgIGlmIChnZW9tZXRyeS5pbmRleCA9PT0gbnVsbCkgewogICAgICAgIGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKICAgICAgICBjb25zdCBsaW5lRGlzdGFuY2VzID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudDtpIDwgbDsgaSArPSAyKSB7CiAgICAgICAgICBfc3RhcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbkF0dHJpYnV0ZSwgaSk7CiAgICAgICAgICBfZW5kLmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb25BdHRyaWJ1dGUsIGkgKyAxKTsKICAgICAgICAgIGxpbmVEaXN0YW5jZXNbaV0gPSBpID09PSAwID8gMCA6IGxpbmVEaXN0YW5jZXNbaSAtIDFdOwogICAgICAgICAgbGluZURpc3RhbmNlc1tpICsgMV0gPSBsaW5lRGlzdGFuY2VzW2ldICsgX3N0YXJ0LmRpc3RhbmNlVG8oX2VuZCk7CiAgICAgICAgfQogICAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgibGluZURpc3RhbmNlIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUobGluZURpc3RhbmNlcywgMSkpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIExpbmVMb29wID0gY2xhc3MgTGluZUxvb3AgZXh0ZW5kcyBMaW5lIHsKICAgIGNvbnN0cnVjdG9yKGdlb21ldHJ5LCBtYXRlcmlhbCkgewogICAgICBzdXBlcihnZW9tZXRyeSwgbWF0ZXJpYWwpOwogICAgICB0aGlzLmlzTGluZUxvb3AgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiTGluZUxvb3AiOwogICAgfQogIH07CiAgUG9pbnRzTWF0ZXJpYWwgPSBjbGFzcyBQb2ludHNNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHsKICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5pc1BvaW50c01hdGVyaWFsID0gdHJ1ZTsKICAgICAgdGhpcy50eXBlID0gIlBvaW50c01hdGVyaWFsIjsKICAgICAgdGhpcy5jb2xvciA9IG5ldyBDb2xvcigxNjc3NzIxNSk7CiAgICAgIHRoaXMubWFwID0gbnVsbDsKICAgICAgdGhpcy5hbHBoYU1hcCA9IG51bGw7CiAgICAgIHRoaXMuc2l6ZSA9IDE7CiAgICAgIHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gdHJ1ZTsKICAgICAgdGhpcy5mb2cgPSB0cnVlOwogICAgICB0aGlzLnNldFZhbHVlcyhwYXJhbWV0ZXJzKTsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5jb2xvci5jb3B5KHNvdXJjZS5jb2xvcik7CiAgICAgIHRoaXMubWFwID0gc291cmNlLm1hcDsKICAgICAgdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKICAgICAgdGhpcy5zaXplID0gc291cmNlLnNpemU7CiAgICAgIHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gc291cmNlLnNpemVBdHRlbnVhdGlvbjsKICAgICAgdGhpcy5mb2cgPSBzb3VyY2UuZm9nOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIF9pbnZlcnNlTWF0cml4ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXg0OwogIF9yYXkgPSAvKiBAX19QVVJFX18gKi8gbmV3IFJheTsKICBfc3BoZXJlID0gLyogQF9fUFVSRV9fICovIG5ldyBTcGhlcmU7CiAgX3Bvc2l0aW9uJDIgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgUG9pbnRzID0gY2xhc3MgUG9pbnRzIGV4dGVuZHMgT2JqZWN0M0QgewogICAgY29uc3RydWN0b3IoZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnksIG1hdGVyaWFsID0gbmV3IFBvaW50c01hdGVyaWFsKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNQb2ludHMgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiUG9pbnRzIjsKICAgICAgdGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5OwogICAgICB0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7CiAgICAgIHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCk7CiAgICB9CiAgICBjb3B5KHNvdXJjZSwgcmVjdXJzaXZlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlLCByZWN1cnNpdmUpOwogICAgICB0aGlzLm1hdGVyaWFsID0gQXJyYXkuaXNBcnJheShzb3VyY2UubWF0ZXJpYWwpID8gc291cmNlLm1hdGVyaWFsLnNsaWNlKCkgOiBzb3VyY2UubWF0ZXJpYWw7CiAgICAgIHRoaXMuZ2VvbWV0cnkgPSBzb3VyY2UuZ2VvbWV0cnk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcmF5Y2FzdChyYXljYXN0ZXIsIGludGVyc2VjdHMpIHsKICAgICAgY29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OwogICAgICBjb25zdCBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7CiAgICAgIGNvbnN0IHRocmVzaG9sZCA9IHJheWNhc3Rlci5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZDsKICAgICAgY29uc3QgZHJhd1JhbmdlID0gZ2VvbWV0cnkuZHJhd1JhbmdlOwogICAgICBpZiAoZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwpCiAgICAgICAgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CiAgICAgIF9zcGhlcmUuY29weShnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSk7CiAgICAgIF9zcGhlcmUuYXBwbHlNYXRyaXg0KG1hdHJpeFdvcmxkKTsKICAgICAgX3NwaGVyZS5yYWRpdXMgKz0gdGhyZXNob2xkOwogICAgICBpZiAocmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKF9zcGhlcmUpID09PSBmYWxzZSkKICAgICAgICByZXR1cm47CiAgICAgIF9pbnZlcnNlTWF0cml4LmNvcHkobWF0cml4V29ybGQpLmludmVydCgpOwogICAgICBfcmF5LmNvcHkocmF5Y2FzdGVyLnJheSkuYXBwbHlNYXRyaXg0KF9pbnZlcnNlTWF0cml4KTsKICAgICAgY29uc3QgbG9jYWxUaHJlc2hvbGQgPSB0aHJlc2hvbGQgLyAoKHRoaXMuc2NhbGUueCArIHRoaXMuc2NhbGUueSArIHRoaXMuc2NhbGUueikgLyAzKTsKICAgICAgY29uc3QgbG9jYWxUaHJlc2hvbGRTcSA9IGxvY2FsVGhyZXNob2xkICogbG9jYWxUaHJlc2hvbGQ7CiAgICAgIGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7CiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwogICAgICBjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMucG9zaXRpb247CiAgICAgIGlmIChpbmRleCAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgZHJhd1JhbmdlLnN0YXJ0KTsKICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihpbmRleC5jb3VudCwgZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50KTsKICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQsIGlsID0gZW5kO2kgPCBpbDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBhID0gaW5kZXguZ2V0WChpKTsKICAgICAgICAgIF9wb3NpdGlvbiQyLmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb25BdHRyaWJ1dGUsIGEpOwogICAgICAgICAgdGVzdFBvaW50KF9wb3NpdGlvbiQyLCBhLCBsb2NhbFRocmVzaG9sZFNxLCBtYXRyaXhXb3JsZCwgcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCB0aGlzKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBkcmF3UmFuZ2Uuc3RhcnQpOwogICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKHBvc2l0aW9uQXR0cmlidXRlLmNvdW50LCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQpOwogICAgICAgIGZvciAobGV0IGkgPSBzdGFydCwgbCA9IGVuZDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICBfcG9zaXRpb24kMi5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uQXR0cmlidXRlLCBpKTsKICAgICAgICAgIHRlc3RQb2ludChfcG9zaXRpb24kMiwgaSwgbG9jYWxUaHJlc2hvbGRTcSwgbWF0cml4V29ybGQsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdGhpcyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB1cGRhdGVNb3JwaFRhcmdldHMoKSB7CiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKICAgICAgY29uc3QgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzOwogICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMobW9ycGhBdHRyaWJ1dGVzKTsKICAgICAgaWYgKGtleXMubGVuZ3RoID4gMCkgewogICAgICAgIGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzW2tleXNbMF1dOwogICAgICAgIGlmIChtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdOwogICAgICAgICAgdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB7fTsKICAgICAgICAgIGZvciAobGV0IG0gPSAwLCBtbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDttIDwgbWw7IG0rKykgewogICAgICAgICAgICBjb25zdCBuYW1lID0gbW9ycGhBdHRyaWJ1dGVbbV0ubmFtZSB8fCBTdHJpbmcobSk7CiAgICAgICAgICAgIHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCk7CiAgICAgICAgICAgIHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W25hbWVdID0gbTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9OwogIFZpZGVvVGV4dHVyZSA9IGNsYXNzIFZpZGVvVGV4dHVyZSBleHRlbmRzIFRleHR1cmUgewogICAgY29uc3RydWN0b3IodmlkZW8sIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSkgewogICAgICBzdXBlcih2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5KTsKICAgICAgdGhpcy5pc1ZpZGVvVGV4dHVyZSA9IHRydWU7CiAgICAgIHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7CiAgICAgIHRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7CiAgICAgIHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7CiAgICAgIGNvbnN0IHNjb3BlID0gdGhpczsKICAgICAgZnVuY3Rpb24gdXBkYXRlVmlkZW8oKSB7CiAgICAgICAgc2NvcGUubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICAgIHZpZGVvLnJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2sodXBkYXRlVmlkZW8pOwogICAgICB9CiAgICAgIGlmICgicmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjayIgaW4gdmlkZW8pIHsKICAgICAgICB2aWRlby5yZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrKHVwZGF0ZVZpZGVvKTsKICAgICAgfQogICAgfQogICAgY2xvbmUoKSB7CiAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmltYWdlKS5jb3B5KHRoaXMpOwogICAgfQogICAgdXBkYXRlKCkgewogICAgICBjb25zdCB2aWRlbyA9IHRoaXMuaW1hZ2U7CiAgICAgIGNvbnN0IGhhc1ZpZGVvRnJhbWVDYWxsYmFjayA9ICJyZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrIiBpbiB2aWRlbzsKICAgICAgaWYgKGhhc1ZpZGVvRnJhbWVDYWxsYmFjayA9PT0gZmFsc2UgJiYgdmlkZW8ucmVhZHlTdGF0ZSA+PSB2aWRlby5IQVZFX0NVUlJFTlRfREFUQSkgewogICAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfTsKICBWaWRlb0ZyYW1lVGV4dHVyZSA9IGNsYXNzIFZpZGVvRnJhbWVUZXh0dXJlIGV4dGVuZHMgVmlkZW9UZXh0dXJlIHsKICAgIGNvbnN0cnVjdG9yKG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSkgewogICAgICBzdXBlcih7fSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5KTsKICAgICAgdGhpcy5pc1ZpZGVvRnJhbWVUZXh0dXJlID0gdHJ1ZTsKICAgIH0KICAgIHVwZGF0ZSgpIHt9CiAgICBjbG9uZSgpIHsKICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKTsKICAgIH0KICAgIHNldEZyYW1lKGZyYW1lKSB7CiAgICAgIHRoaXMuaW1hZ2UgPSBmcmFtZTsKICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICB9CiAgfTsKICBGcmFtZWJ1ZmZlclRleHR1cmUgPSBjbGFzcyBGcmFtZWJ1ZmZlclRleHR1cmUgZXh0ZW5kcyBUZXh0dXJlIHsKICAgIGNvbnN0cnVjdG9yKHdpZHRoLCBoZWlnaHQpIHsKICAgICAgc3VwZXIoeyB3aWR0aCwgaGVpZ2h0IH0pOwogICAgICB0aGlzLmlzRnJhbWVidWZmZXJUZXh0dXJlID0gdHJ1ZTsKICAgICAgdGhpcy5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyOwogICAgICB0aGlzLm1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7CiAgICAgIHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7CiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgfQogIH07CiAgQ29tcHJlc3NlZFRleHR1cmUgPSBjbGFzcyBDb21wcmVzc2VkVGV4dHVyZSBleHRlbmRzIFRleHR1cmUgewogICAgY29uc3RydWN0b3IobWlwbWFwcywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBjb2xvclNwYWNlKSB7CiAgICAgIHN1cGVyKG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgY29sb3JTcGFjZSk7CiAgICAgIHRoaXMuaXNDb21wcmVzc2VkVGV4dHVyZSA9IHRydWU7CiAgICAgIHRoaXMuaW1hZ2UgPSB7IHdpZHRoLCBoZWlnaHQgfTsKICAgICAgdGhpcy5taXBtYXBzID0gbWlwbWFwczsKICAgICAgdGhpcy5mbGlwWSA9IGZhbHNlOwogICAgICB0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlOwogICAgfQogIH07CiAgQ29tcHJlc3NlZEFycmF5VGV4dHVyZSA9IGNsYXNzIENvbXByZXNzZWRBcnJheVRleHR1cmUgZXh0ZW5kcyBDb21wcmVzc2VkVGV4dHVyZSB7CiAgICBjb25zdHJ1Y3RvcihtaXBtYXBzLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZm9ybWF0LCB0eXBlKSB7CiAgICAgIHN1cGVyKG1pcG1hcHMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSk7CiAgICAgIHRoaXMuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlID0gdHJ1ZTsKICAgICAgdGhpcy5pbWFnZS5kZXB0aCA9IGRlcHRoOwogICAgICB0aGlzLndyYXBSID0gQ2xhbXBUb0VkZ2VXcmFwcGluZzsKICAgICAgdGhpcy5sYXllclVwZGF0ZXMgPSBuZXcgU2V0OwogICAgfQogICAgYWRkTGF5ZXJVcGRhdGUobGF5ZXJJbmRleCkgewogICAgICB0aGlzLmxheWVyVXBkYXRlcy5hZGQobGF5ZXJJbmRleCk7CiAgICB9CiAgICBjbGVhckxheWVyVXBkYXRlcygpIHsKICAgICAgdGhpcy5sYXllclVwZGF0ZXMuY2xlYXIoKTsKICAgIH0KICB9OwogIENvbXByZXNzZWRDdWJlVGV4dHVyZSA9IGNsYXNzIENvbXByZXNzZWRDdWJlVGV4dHVyZSBleHRlbmRzIENvbXByZXNzZWRUZXh0dXJlIHsKICAgIGNvbnN0cnVjdG9yKGltYWdlcywgZm9ybWF0LCB0eXBlKSB7CiAgICAgIHN1cGVyKHVuZGVmaW5lZCwgaW1hZ2VzWzBdLndpZHRoLCBpbWFnZXNbMF0uaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIEN1YmVSZWZsZWN0aW9uTWFwcGluZyk7CiAgICAgIHRoaXMuaXNDb21wcmVzc2VkQ3ViZVRleHR1cmUgPSB0cnVlOwogICAgICB0aGlzLmlzQ3ViZVRleHR1cmUgPSB0cnVlOwogICAgICB0aGlzLmltYWdlID0gaW1hZ2VzOwogICAgfQogIH07CiAgQ2FudmFzVGV4dHVyZSA9IGNsYXNzIENhbnZhc1RleHR1cmUgZXh0ZW5kcyBUZXh0dXJlIHsKICAgIGNvbnN0cnVjdG9yKGNhbnZhcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5KSB7CiAgICAgIHN1cGVyKGNhbnZhcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5KTsKICAgICAgdGhpcy5pc0NhbnZhc1RleHR1cmUgPSB0cnVlOwogICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgIH0KICB9OwogIERlcHRoVGV4dHVyZSA9IGNsYXNzIERlcHRoVGV4dHVyZSBleHRlbmRzIFRleHR1cmUgewogICAgY29uc3RydWN0b3Iod2lkdGgsIGhlaWdodCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZm9ybWF0ID0gRGVwdGhGb3JtYXQpIHsKICAgICAgaWYgKGZvcm1hdCAhPT0gRGVwdGhGb3JtYXQgJiYgZm9ybWF0ICE9PSBEZXB0aFN0ZW5jaWxGb3JtYXQpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkRlcHRoVGV4dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3IgVEhSRUUuRGVwdGhTdGVuY2lsRm9ybWF0Iik7CiAgICAgIH0KICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCAmJiBmb3JtYXQgPT09IERlcHRoRm9ybWF0KQogICAgICAgIHR5cGUgPSBVbnNpZ25lZEludFR5cGU7CiAgICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQgJiYgZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQpCiAgICAgICAgdHlwZSA9IFVuc2lnbmVkSW50MjQ4VHlwZTsKICAgICAgc3VwZXIobnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5KTsKICAgICAgdGhpcy5pc0RlcHRoVGV4dHVyZSA9IHRydWU7CiAgICAgIHRoaXMuaW1hZ2UgPSB7IHdpZHRoLCBoZWlnaHQgfTsKICAgICAgdGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7CiAgICAgIHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBOZWFyZXN0RmlsdGVyOwogICAgICB0aGlzLmZsaXBZID0gZmFsc2U7CiAgICAgIHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7CiAgICAgIHRoaXMuY29tcGFyZUZ1bmN0aW9uID0gbnVsbDsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5jb21wYXJlRnVuY3Rpb24gPSBzb3VyY2UuY29tcGFyZUZ1bmN0aW9uOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHRvSlNPTihtZXRhKSB7CiAgICAgIGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04obWV0YSk7CiAgICAgIGlmICh0aGlzLmNvbXBhcmVGdW5jdGlvbiAhPT0gbnVsbCkKICAgICAgICBkYXRhLmNvbXBhcmVGdW5jdGlvbiA9IHRoaXMuY29tcGFyZUZ1bmN0aW9uOwogICAgICByZXR1cm4gZGF0YTsKICAgIH0KICB9OwogIEVsbGlwc2VDdXJ2ZSA9IGNsYXNzIEVsbGlwc2VDdXJ2ZSBleHRlbmRzIEN1cnZlIHsKICAgIGNvbnN0cnVjdG9yKGFYID0gMCwgYVkgPSAwLCB4UmFkaXVzID0gMSwgeVJhZGl1cyA9IDEsIGFTdGFydEFuZ2xlID0gMCwgYUVuZEFuZ2xlID0gTWF0aC5QSSAqIDIsIGFDbG9ja3dpc2UgPSBmYWxzZSwgYVJvdGF0aW9uID0gMCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzRWxsaXBzZUN1cnZlID0gdHJ1ZTsKICAgICAgdGhpcy50eXBlID0gIkVsbGlwc2VDdXJ2ZSI7CiAgICAgIHRoaXMuYVggPSBhWDsKICAgICAgdGhpcy5hWSA9IGFZOwogICAgICB0aGlzLnhSYWRpdXMgPSB4UmFkaXVzOwogICAgICB0aGlzLnlSYWRpdXMgPSB5UmFkaXVzOwogICAgICB0aGlzLmFTdGFydEFuZ2xlID0gYVN0YXJ0QW5nbGU7CiAgICAgIHRoaXMuYUVuZEFuZ2xlID0gYUVuZEFuZ2xlOwogICAgICB0aGlzLmFDbG9ja3dpc2UgPSBhQ2xvY2t3aXNlOwogICAgICB0aGlzLmFSb3RhdGlvbiA9IGFSb3RhdGlvbjsKICAgIH0KICAgIGdldFBvaW50KHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjIpIHsKICAgICAgY29uc3QgcG9pbnQgPSBvcHRpb25hbFRhcmdldDsKICAgICAgY29uc3QgdHdvUGkgPSBNYXRoLlBJICogMjsKICAgICAgbGV0IGRlbHRhQW5nbGUgPSB0aGlzLmFFbmRBbmdsZSAtIHRoaXMuYVN0YXJ0QW5nbGU7CiAgICAgIGNvbnN0IHNhbWVQb2ludHMgPSBNYXRoLmFicyhkZWx0YUFuZ2xlKSA8IE51bWJlci5FUFNJTE9OOwogICAgICB3aGlsZSAoZGVsdGFBbmdsZSA8IDApCiAgICAgICAgZGVsdGFBbmdsZSArPSB0d29QaTsKICAgICAgd2hpbGUgKGRlbHRhQW5nbGUgPiB0d29QaSkKICAgICAgICBkZWx0YUFuZ2xlIC09IHR3b1BpOwogICAgICBpZiAoZGVsdGFBbmdsZSA8IE51bWJlci5FUFNJTE9OKSB7CiAgICAgICAgaWYgKHNhbWVQb2ludHMpIHsKICAgICAgICAgIGRlbHRhQW5nbGUgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkZWx0YUFuZ2xlID0gdHdvUGk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aGlzLmFDbG9ja3dpc2UgPT09IHRydWUgJiYgIXNhbWVQb2ludHMpIHsKICAgICAgICBpZiAoZGVsdGFBbmdsZSA9PT0gdHdvUGkpIHsKICAgICAgICAgIGRlbHRhQW5nbGUgPSAtdHdvUGk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRlbHRhQW5nbGUgPSBkZWx0YUFuZ2xlIC0gdHdvUGk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IGFuZ2xlID0gdGhpcy5hU3RhcnRBbmdsZSArIHQgKiBkZWx0YUFuZ2xlOwogICAgICBsZXQgeCA9IHRoaXMuYVggKyB0aGlzLnhSYWRpdXMgKiBNYXRoLmNvcyhhbmdsZSk7CiAgICAgIGxldCB5ID0gdGhpcy5hWSArIHRoaXMueVJhZGl1cyAqIE1hdGguc2luKGFuZ2xlKTsKICAgICAgaWYgKHRoaXMuYVJvdGF0aW9uICE9PSAwKSB7CiAgICAgICAgY29uc3QgY29zID0gTWF0aC5jb3ModGhpcy5hUm90YXRpb24pOwogICAgICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKHRoaXMuYVJvdGF0aW9uKTsKICAgICAgICBjb25zdCB0eCA9IHggLSB0aGlzLmFYOwogICAgICAgIGNvbnN0IHR5ID0geSAtIHRoaXMuYVk7CiAgICAgICAgeCA9IHR4ICogY29zIC0gdHkgKiBzaW4gKyB0aGlzLmFYOwogICAgICAgIHkgPSB0eCAqIHNpbiArIHR5ICogY29zICsgdGhpcy5hWTsKICAgICAgfQogICAgICByZXR1cm4gcG9pbnQuc2V0KHgsIHkpOwogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLmFYID0gc291cmNlLmFYOwogICAgICB0aGlzLmFZID0gc291cmNlLmFZOwogICAgICB0aGlzLnhSYWRpdXMgPSBzb3VyY2UueFJhZGl1czsKICAgICAgdGhpcy55UmFkaXVzID0gc291cmNlLnlSYWRpdXM7CiAgICAgIHRoaXMuYVN0YXJ0QW5nbGUgPSBzb3VyY2UuYVN0YXJ0QW5nbGU7CiAgICAgIHRoaXMuYUVuZEFuZ2xlID0gc291cmNlLmFFbmRBbmdsZTsKICAgICAgdGhpcy5hQ2xvY2t3aXNlID0gc291cmNlLmFDbG9ja3dpc2U7CiAgICAgIHRoaXMuYVJvdGF0aW9uID0gc291cmNlLmFSb3RhdGlvbjsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0b0pTT04oKSB7CiAgICAgIGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTsKICAgICAgZGF0YS5hWCA9IHRoaXMuYVg7CiAgICAgIGRhdGEuYVkgPSB0aGlzLmFZOwogICAgICBkYXRhLnhSYWRpdXMgPSB0aGlzLnhSYWRpdXM7CiAgICAgIGRhdGEueVJhZGl1cyA9IHRoaXMueVJhZGl1czsKICAgICAgZGF0YS5hU3RhcnRBbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGU7CiAgICAgIGRhdGEuYUVuZEFuZ2xlID0gdGhpcy5hRW5kQW5nbGU7CiAgICAgIGRhdGEuYUNsb2Nrd2lzZSA9IHRoaXMuYUNsb2Nrd2lzZTsKICAgICAgZGF0YS5hUm90YXRpb24gPSB0aGlzLmFSb3RhdGlvbjsKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBmcm9tSlNPTihqc29uKSB7CiAgICAgIHN1cGVyLmZyb21KU09OKGpzb24pOwogICAgICB0aGlzLmFYID0ganNvbi5hWDsKICAgICAgdGhpcy5hWSA9IGpzb24uYVk7CiAgICAgIHRoaXMueFJhZGl1cyA9IGpzb24ueFJhZGl1czsKICAgICAgdGhpcy55UmFkaXVzID0ganNvbi55UmFkaXVzOwogICAgICB0aGlzLmFTdGFydEFuZ2xlID0ganNvbi5hU3RhcnRBbmdsZTsKICAgICAgdGhpcy5hRW5kQW5nbGUgPSBqc29uLmFFbmRBbmdsZTsKICAgICAgdGhpcy5hQ2xvY2t3aXNlID0ganNvbi5hQ2xvY2t3aXNlOwogICAgICB0aGlzLmFSb3RhdGlvbiA9IGpzb24uYVJvdGF0aW9uOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIEFyY0N1cnZlID0gY2xhc3MgQXJjQ3VydmUgZXh0ZW5kcyBFbGxpcHNlQ3VydmUgewogICAgY29uc3RydWN0b3IoYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlKSB7CiAgICAgIHN1cGVyKGFYLCBhWSwgYVJhZGl1cywgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSk7CiAgICAgIHRoaXMuaXNBcmNDdXJ2ZSA9IHRydWU7CiAgICAgIHRoaXMudHlwZSA9ICJBcmNDdXJ2ZSI7CiAgICB9CiAgfTsKICB0bXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgcHggPSAvKiBAX19QVVJFX18gKi8gbmV3IEN1YmljUG9seTsKICBweSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgQ3ViaWNQb2x5OwogIHB6ID0gLyogQF9fUFVSRV9fICovIG5ldyBDdWJpY1BvbHk7CiAgQ2F0bXVsbFJvbUN1cnZlMyA9IGNsYXNzIENhdG11bGxSb21DdXJ2ZTMgZXh0ZW5kcyBDdXJ2ZSB7CiAgICBjb25zdHJ1Y3Rvcihwb2ludHMgPSBbXSwgY2xvc2VkID0gZmFsc2UsIGN1cnZlVHlwZSA9ICJjZW50cmlwZXRhbCIsIHRlbnNpb24gPSAwLjUpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5pc0NhdG11bGxSb21DdXJ2ZTMgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiQ2F0bXVsbFJvbUN1cnZlMyI7CiAgICAgIHRoaXMucG9pbnRzID0gcG9pbnRzOwogICAgICB0aGlzLmNsb3NlZCA9IGNsb3NlZDsKICAgICAgdGhpcy5jdXJ2ZVR5cGUgPSBjdXJ2ZVR5cGU7CiAgICAgIHRoaXMudGVuc2lvbiA9IHRlbnNpb247CiAgICB9CiAgICBnZXRQb2ludCh0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IzKSB7CiAgICAgIGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7CiAgICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzOwogICAgICBjb25zdCBsID0gcG9pbnRzLmxlbmd0aDsKICAgICAgY29uc3QgcCA9IChsIC0gKHRoaXMuY2xvc2VkID8gMCA6IDEpKSAqIHQ7CiAgICAgIGxldCBpbnRQb2ludCA9IE1hdGguZmxvb3IocCk7CiAgICAgIGxldCB3ZWlnaHQgPSBwIC0gaW50UG9pbnQ7CiAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgIGludFBvaW50ICs9IGludFBvaW50ID4gMCA/IDAgOiAoTWF0aC5mbG9vcihNYXRoLmFicyhpbnRQb2ludCkgLyBsKSArIDEpICogbDsKICAgICAgfSBlbHNlIGlmICh3ZWlnaHQgPT09IDAgJiYgaW50UG9pbnQgPT09IGwgLSAxKSB7CiAgICAgICAgaW50UG9pbnQgPSBsIC0gMjsKICAgICAgICB3ZWlnaHQgPSAxOwogICAgICB9CiAgICAgIGxldCBwMCwgcDM7CiAgICAgIGlmICh0aGlzLmNsb3NlZCB8fCBpbnRQb2ludCA+IDApIHsKICAgICAgICBwMCA9IHBvaW50c1soaW50UG9pbnQgLSAxKSAlIGxdOwogICAgICB9IGVsc2UgewogICAgICAgIHRtcC5zdWJWZWN0b3JzKHBvaW50c1swXSwgcG9pbnRzWzFdKS5hZGQocG9pbnRzWzBdKTsKICAgICAgICBwMCA9IHRtcDsKICAgICAgfQogICAgICBjb25zdCBwMSA9IHBvaW50c1tpbnRQb2ludCAlIGxdOwogICAgICBjb25zdCBwMiA9IHBvaW50c1soaW50UG9pbnQgKyAxKSAlIGxdOwogICAgICBpZiAodGhpcy5jbG9zZWQgfHwgaW50UG9pbnQgKyAyIDwgbCkgewogICAgICAgIHAzID0gcG9pbnRzWyhpbnRQb2ludCArIDIpICUgbF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdG1wLnN1YlZlY3RvcnMocG9pbnRzW2wgLSAxXSwgcG9pbnRzW2wgLSAyXSkuYWRkKHBvaW50c1tsIC0gMV0pOwogICAgICAgIHAzID0gdG1wOwogICAgICB9CiAgICAgIGlmICh0aGlzLmN1cnZlVHlwZSA9PT0gImNlbnRyaXBldGFsIiB8fCB0aGlzLmN1cnZlVHlwZSA9PT0gImNob3JkYWwiKSB7CiAgICAgICAgY29uc3QgcG93ID0gdGhpcy5jdXJ2ZVR5cGUgPT09ICJjaG9yZGFsIiA/IDAuNSA6IDAuMjU7CiAgICAgICAgbGV0IGR0MCA9IE1hdGgucG93KHAwLmRpc3RhbmNlVG9TcXVhcmVkKHAxKSwgcG93KTsKICAgICAgICBsZXQgZHQxID0gTWF0aC5wb3cocDEuZGlzdGFuY2VUb1NxdWFyZWQocDIpLCBwb3cpOwogICAgICAgIGxldCBkdDIgPSBNYXRoLnBvdyhwMi5kaXN0YW5jZVRvU3F1YXJlZChwMyksIHBvdyk7CiAgICAgICAgaWYgKGR0MSA8IDAuMDAwMSkKICAgICAgICAgIGR0MSA9IDE7CiAgICAgICAgaWYgKGR0MCA8IDAuMDAwMSkKICAgICAgICAgIGR0MCA9IGR0MTsKICAgICAgICBpZiAoZHQyIDwgMC4wMDAxKQogICAgICAgICAgZHQyID0gZHQxOwogICAgICAgIHB4LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShwMC54LCBwMS54LCBwMi54LCBwMy54LCBkdDAsIGR0MSwgZHQyKTsKICAgICAgICBweS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20ocDAueSwgcDEueSwgcDIueSwgcDMueSwgZHQwLCBkdDEsIGR0Mik7CiAgICAgICAgcHouaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHAwLnosIHAxLnosIHAyLnosIHAzLnosIGR0MCwgZHQxLCBkdDIpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuY3VydmVUeXBlID09PSAiY2F0bXVsbHJvbSIpIHsKICAgICAgICBweC5pbml0Q2F0bXVsbFJvbShwMC54LCBwMS54LCBwMi54LCBwMy54LCB0aGlzLnRlbnNpb24pOwogICAgICAgIHB5LmluaXRDYXRtdWxsUm9tKHAwLnksIHAxLnksIHAyLnksIHAzLnksIHRoaXMudGVuc2lvbik7CiAgICAgICAgcHouaW5pdENhdG11bGxSb20ocDAueiwgcDEueiwgcDIueiwgcDMueiwgdGhpcy50ZW5zaW9uKTsKICAgICAgfQogICAgICBwb2ludC5zZXQocHguY2FsYyh3ZWlnaHQpLCBweS5jYWxjKHdlaWdodCksIHB6LmNhbGMod2VpZ2h0KSk7CiAgICAgIHJldHVybiBwb2ludDsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5wb2ludHMgPSBbXTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzb3VyY2UucG9pbnRzLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgY29uc3QgcG9pbnQgPSBzb3VyY2UucG9pbnRzW2ldOwogICAgICAgIHRoaXMucG9pbnRzLnB1c2gocG9pbnQuY2xvbmUoKSk7CiAgICAgIH0KICAgICAgdGhpcy5jbG9zZWQgPSBzb3VyY2UuY2xvc2VkOwogICAgICB0aGlzLmN1cnZlVHlwZSA9IHNvdXJjZS5jdXJ2ZVR5cGU7CiAgICAgIHRoaXMudGVuc2lvbiA9IHNvdXJjZS50ZW5zaW9uOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHRvSlNPTigpIHsKICAgICAgY29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpOwogICAgICBkYXRhLnBvaW50cyA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRoaXMucG9pbnRzLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgY29uc3QgcG9pbnQgPSB0aGlzLnBvaW50c1tpXTsKICAgICAgICBkYXRhLnBvaW50cy5wdXNoKHBvaW50LnRvQXJyYXkoKSk7CiAgICAgIH0KICAgICAgZGF0YS5jbG9zZWQgPSB0aGlzLmNsb3NlZDsKICAgICAgZGF0YS5jdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlVHlwZTsKICAgICAgZGF0YS50ZW5zaW9uID0gdGhpcy50ZW5zaW9uOwogICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIGZyb21KU09OKGpzb24pIHsKICAgICAgc3VwZXIuZnJvbUpTT04oanNvbik7CiAgICAgIHRoaXMucG9pbnRzID0gW107CiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0ganNvbi5wb2ludHMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICBjb25zdCBwb2ludCA9IGpzb24ucG9pbnRzW2ldOwogICAgICAgIHRoaXMucG9pbnRzLnB1c2gobmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkocG9pbnQpKTsKICAgICAgfQogICAgICB0aGlzLmNsb3NlZCA9IGpzb24uY2xvc2VkOwogICAgICB0aGlzLmN1cnZlVHlwZSA9IGpzb24uY3VydmVUeXBlOwogICAgICB0aGlzLnRlbnNpb24gPSBqc29uLnRlbnNpb247CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH07CiAgQ3ViaWNCZXppZXJDdXJ2ZSA9IGNsYXNzIEN1YmljQmV6aWVyQ3VydmUgZXh0ZW5kcyBDdXJ2ZSB7CiAgICBjb25zdHJ1Y3Rvcih2MCA9IG5ldyBWZWN0b3IyLCB2MSA9IG5ldyBWZWN0b3IyLCB2MiA9IG5ldyBWZWN0b3IyLCB2MyA9IG5ldyBWZWN0b3IyKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNDdWJpY0JlemllckN1cnZlID0gdHJ1ZTsKICAgICAgdGhpcy50eXBlID0gIkN1YmljQmV6aWVyQ3VydmUiOwogICAgICB0aGlzLnYwID0gdjA7CiAgICAgIHRoaXMudjEgPSB2MTsKICAgICAgdGhpcy52MiA9IHYyOwogICAgICB0aGlzLnYzID0gdjM7CiAgICB9CiAgICBnZXRQb2ludCh0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IyKSB7CiAgICAgIGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7CiAgICAgIGNvbnN0IHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjIsIHYzID0gdGhpcy52MzsKICAgICAgcG9pbnQuc2V0KEN1YmljQmV6aWVyKHQsIHYwLngsIHYxLngsIHYyLngsIHYzLngpLCBDdWJpY0Jlemllcih0LCB2MC55LCB2MS55LCB2Mi55LCB2My55KSk7CiAgICAgIHJldHVybiBwb2ludDsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy52MC5jb3B5KHNvdXJjZS52MCk7CiAgICAgIHRoaXMudjEuY29weShzb3VyY2UudjEpOwogICAgICB0aGlzLnYyLmNvcHkoc291cmNlLnYyKTsKICAgICAgdGhpcy52My5jb3B5KHNvdXJjZS52Myk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICBjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7CiAgICAgIGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTsKICAgICAgZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpOwogICAgICBkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7CiAgICAgIGRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTsKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBmcm9tSlNPTihqc29uKSB7CiAgICAgIHN1cGVyLmZyb21KU09OKGpzb24pOwogICAgICB0aGlzLnYwLmZyb21BcnJheShqc29uLnYwKTsKICAgICAgdGhpcy52MS5mcm9tQXJyYXkoanNvbi52MSk7CiAgICAgIHRoaXMudjIuZnJvbUFycmF5KGpzb24udjIpOwogICAgICB0aGlzLnYzLmZyb21BcnJheShqc29uLnYzKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBDdWJpY0JlemllckN1cnZlMyA9IGNsYXNzIEN1YmljQmV6aWVyQ3VydmUzIGV4dGVuZHMgQ3VydmUgewogICAgY29uc3RydWN0b3IodjAgPSBuZXcgVmVjdG9yMywgdjEgPSBuZXcgVmVjdG9yMywgdjIgPSBuZXcgVmVjdG9yMywgdjMgPSBuZXcgVmVjdG9yMykgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzQ3ViaWNCZXppZXJDdXJ2ZTMgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiQ3ViaWNCZXppZXJDdXJ2ZTMiOwogICAgICB0aGlzLnYwID0gdjA7CiAgICAgIHRoaXMudjEgPSB2MTsKICAgICAgdGhpcy52MiA9IHYyOwogICAgICB0aGlzLnYzID0gdjM7CiAgICB9CiAgICBnZXRQb2ludCh0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IzKSB7CiAgICAgIGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7CiAgICAgIGNvbnN0IHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjIsIHYzID0gdGhpcy52MzsKICAgICAgcG9pbnQuc2V0KEN1YmljQmV6aWVyKHQsIHYwLngsIHYxLngsIHYyLngsIHYzLngpLCBDdWJpY0Jlemllcih0LCB2MC55LCB2MS55LCB2Mi55LCB2My55KSwgQ3ViaWNCZXppZXIodCwgdjAueiwgdjEueiwgdjIueiwgdjMueikpOwogICAgICByZXR1cm4gcG9pbnQ7CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMudjAuY29weShzb3VyY2UudjApOwogICAgICB0aGlzLnYxLmNvcHkoc291cmNlLnYxKTsKICAgICAgdGhpcy52Mi5jb3B5KHNvdXJjZS52Mik7CiAgICAgIHRoaXMudjMuY29weShzb3VyY2UudjMpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHRvSlNPTigpIHsKICAgICAgY29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpOwogICAgICBkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7CiAgICAgIGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTsKICAgICAgZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpOwogICAgICBkYXRhLnYzID0gdGhpcy52My50b0FycmF5KCk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgZnJvbUpTT04oanNvbikgewogICAgICBzdXBlci5mcm9tSlNPTihqc29uKTsKICAgICAgdGhpcy52MC5mcm9tQXJyYXkoanNvbi52MCk7CiAgICAgIHRoaXMudjEuZnJvbUFycmF5KGpzb24udjEpOwogICAgICB0aGlzLnYyLmZyb21BcnJheShqc29uLnYyKTsKICAgICAgdGhpcy52My5mcm9tQXJyYXkoanNvbi52Myk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH07CiAgTGluZUN1cnZlID0gY2xhc3MgTGluZUN1cnZlIGV4dGVuZHMgQ3VydmUgewogICAgY29uc3RydWN0b3IodjEgPSBuZXcgVmVjdG9yMiwgdjIgPSBuZXcgVmVjdG9yMikgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzTGluZUN1cnZlID0gdHJ1ZTsKICAgICAgdGhpcy50eXBlID0gIkxpbmVDdXJ2ZSI7CiAgICAgIHRoaXMudjEgPSB2MTsKICAgICAgdGhpcy52MiA9IHYyOwogICAgfQogICAgZ2V0UG9pbnQodCwgb3B0aW9uYWxUYXJnZXQgPSBuZXcgVmVjdG9yMikgewogICAgICBjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0OwogICAgICBpZiAodCA9PT0gMSkgewogICAgICAgIHBvaW50LmNvcHkodGhpcy52Mik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG9pbnQuY29weSh0aGlzLnYyKS5zdWIodGhpcy52MSk7CiAgICAgICAgcG9pbnQubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMudjEpOwogICAgICB9CiAgICAgIHJldHVybiBwb2ludDsKICAgIH0KICAgIGdldFBvaW50QXQodSwgb3B0aW9uYWxUYXJnZXQpIHsKICAgICAgcmV0dXJuIHRoaXMuZ2V0UG9pbnQodSwgb3B0aW9uYWxUYXJnZXQpOwogICAgfQogICAgZ2V0VGFuZ2VudCh0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IyKSB7CiAgICAgIHJldHVybiBvcHRpb25hbFRhcmdldC5zdWJWZWN0b3JzKHRoaXMudjIsIHRoaXMudjEpLm5vcm1hbGl6ZSgpOwogICAgfQogICAgZ2V0VGFuZ2VudEF0KHUsIG9wdGlvbmFsVGFyZ2V0KSB7CiAgICAgIHJldHVybiB0aGlzLmdldFRhbmdlbnQodSwgb3B0aW9uYWxUYXJnZXQpOwogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLnYxLmNvcHkoc291cmNlLnYxKTsKICAgICAgdGhpcy52Mi5jb3B5KHNvdXJjZS52Mik7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICBjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7CiAgICAgIGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTsKICAgICAgZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpOwogICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIGZyb21KU09OKGpzb24pIHsKICAgICAgc3VwZXIuZnJvbUpTT04oanNvbik7CiAgICAgIHRoaXMudjEuZnJvbUFycmF5KGpzb24udjEpOwogICAgICB0aGlzLnYyLmZyb21BcnJheShqc29uLnYyKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBMaW5lQ3VydmUzID0gY2xhc3MgTGluZUN1cnZlMyBleHRlbmRzIEN1cnZlIHsKICAgIGNvbnN0cnVjdG9yKHYxID0gbmV3IFZlY3RvcjMsIHYyID0gbmV3IFZlY3RvcjMpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5pc0xpbmVDdXJ2ZTMgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiTGluZUN1cnZlMyI7CiAgICAgIHRoaXMudjEgPSB2MTsKICAgICAgdGhpcy52MiA9IHYyOwogICAgfQogICAgZ2V0UG9pbnQodCwgb3B0aW9uYWxUYXJnZXQgPSBuZXcgVmVjdG9yMykgewogICAgICBjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0OwogICAgICBpZiAodCA9PT0gMSkgewogICAgICAgIHBvaW50LmNvcHkodGhpcy52Mik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG9pbnQuY29weSh0aGlzLnYyKS5zdWIodGhpcy52MSk7CiAgICAgICAgcG9pbnQubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMudjEpOwogICAgICB9CiAgICAgIHJldHVybiBwb2ludDsKICAgIH0KICAgIGdldFBvaW50QXQodSwgb3B0aW9uYWxUYXJnZXQpIHsKICAgICAgcmV0dXJuIHRoaXMuZ2V0UG9pbnQodSwgb3B0aW9uYWxUYXJnZXQpOwogICAgfQogICAgZ2V0VGFuZ2VudCh0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IzKSB7CiAgICAgIHJldHVybiBvcHRpb25hbFRhcmdldC5zdWJWZWN0b3JzKHRoaXMudjIsIHRoaXMudjEpLm5vcm1hbGl6ZSgpOwogICAgfQogICAgZ2V0VGFuZ2VudEF0KHUsIG9wdGlvbmFsVGFyZ2V0KSB7CiAgICAgIHJldHVybiB0aGlzLmdldFRhbmdlbnQodSwgb3B0aW9uYWxUYXJnZXQpOwogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLnYxLmNvcHkoc291cmNlLnYxKTsKICAgICAgdGhpcy52Mi5jb3B5KHNvdXJjZS52Mik7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICBjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7CiAgICAgIGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTsKICAgICAgZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpOwogICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIGZyb21KU09OKGpzb24pIHsKICAgICAgc3VwZXIuZnJvbUpTT04oanNvbik7CiAgICAgIHRoaXMudjEuZnJvbUFycmF5KGpzb24udjEpOwogICAgICB0aGlzLnYyLmZyb21BcnJheShqc29uLnYyKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBRdWFkcmF0aWNCZXppZXJDdXJ2ZSA9IGNsYXNzIFF1YWRyYXRpY0JlemllckN1cnZlIGV4dGVuZHMgQ3VydmUgewogICAgY29uc3RydWN0b3IodjAgPSBuZXcgVmVjdG9yMiwgdjEgPSBuZXcgVmVjdG9yMiwgdjIgPSBuZXcgVmVjdG9yMikgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiUXVhZHJhdGljQmV6aWVyQ3VydmUiOwogICAgICB0aGlzLnYwID0gdjA7CiAgICAgIHRoaXMudjEgPSB2MTsKICAgICAgdGhpcy52MiA9IHYyOwogICAgfQogICAgZ2V0UG9pbnQodCwgb3B0aW9uYWxUYXJnZXQgPSBuZXcgVmVjdG9yMikgewogICAgICBjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0OwogICAgICBjb25zdCB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyOwogICAgICBwb2ludC5zZXQoUXVhZHJhdGljQmV6aWVyKHQsIHYwLngsIHYxLngsIHYyLngpLCBRdWFkcmF0aWNCZXppZXIodCwgdjAueSwgdjEueSwgdjIueSkpOwogICAgICByZXR1cm4gcG9pbnQ7CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMudjAuY29weShzb3VyY2UudjApOwogICAgICB0aGlzLnYxLmNvcHkoc291cmNlLnYxKTsKICAgICAgdGhpcy52Mi5jb3B5KHNvdXJjZS52Mik7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICBjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7CiAgICAgIGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTsKICAgICAgZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpOwogICAgICBkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgZnJvbUpTT04oanNvbikgewogICAgICBzdXBlci5mcm9tSlNPTihqc29uKTsKICAgICAgdGhpcy52MC5mcm9tQXJyYXkoanNvbi52MCk7CiAgICAgIHRoaXMudjEuZnJvbUFycmF5KGpzb24udjEpOwogICAgICB0aGlzLnYyLmZyb21BcnJheShqc29uLnYyKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMgPSBjbGFzcyBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMgZXh0ZW5kcyBDdXJ2ZSB7CiAgICBjb25zdHJ1Y3Rvcih2MCA9IG5ldyBWZWN0b3IzLCB2MSA9IG5ldyBWZWN0b3IzLCB2MiA9IG5ldyBWZWN0b3IzKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTMgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiUXVhZHJhdGljQmV6aWVyQ3VydmUzIjsKICAgICAgdGhpcy52MCA9IHYwOwogICAgICB0aGlzLnYxID0gdjE7CiAgICAgIHRoaXMudjIgPSB2MjsKICAgIH0KICAgIGdldFBvaW50KHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjMpIHsKICAgICAgY29uc3QgcG9pbnQgPSBvcHRpb25hbFRhcmdldDsKICAgICAgY29uc3QgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MjsKICAgICAgcG9pbnQuc2V0KFF1YWRyYXRpY0Jlemllcih0LCB2MC54LCB2MS54LCB2Mi54KSwgUXVhZHJhdGljQmV6aWVyKHQsIHYwLnksIHYxLnksIHYyLnkpLCBRdWFkcmF0aWNCZXppZXIodCwgdjAueiwgdjEueiwgdjIueikpOwogICAgICByZXR1cm4gcG9pbnQ7CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMudjAuY29weShzb3VyY2UudjApOwogICAgICB0aGlzLnYxLmNvcHkoc291cmNlLnYxKTsKICAgICAgdGhpcy52Mi5jb3B5KHNvdXJjZS52Mik7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICBjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7CiAgICAgIGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTsKICAgICAgZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpOwogICAgICBkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgZnJvbUpTT04oanNvbikgewogICAgICBzdXBlci5mcm9tSlNPTihqc29uKTsKICAgICAgdGhpcy52MC5mcm9tQXJyYXkoanNvbi52MCk7CiAgICAgIHRoaXMudjEuZnJvbUFycmF5KGpzb24udjEpOwogICAgICB0aGlzLnYyLmZyb21BcnJheShqc29uLnYyKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBTcGxpbmVDdXJ2ZSA9IGNsYXNzIFNwbGluZUN1cnZlIGV4dGVuZHMgQ3VydmUgewogICAgY29uc3RydWN0b3IocG9pbnRzID0gW10pIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5pc1NwbGluZUN1cnZlID0gdHJ1ZTsKICAgICAgdGhpcy50eXBlID0gIlNwbGluZUN1cnZlIjsKICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7CiAgICB9CiAgICBnZXRQb2ludCh0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IyKSB7CiAgICAgIGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7CiAgICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzOwogICAgICBjb25zdCBwID0gKHBvaW50cy5sZW5ndGggLSAxKSAqIHQ7CiAgICAgIGNvbnN0IGludFBvaW50ID0gTWF0aC5mbG9vcihwKTsKICAgICAgY29uc3Qgd2VpZ2h0ID0gcCAtIGludFBvaW50OwogICAgICBjb25zdCBwMCA9IHBvaW50c1tpbnRQb2ludCA9PT0gMCA/IGludFBvaW50IDogaW50UG9pbnQgLSAxXTsKICAgICAgY29uc3QgcDEgPSBwb2ludHNbaW50UG9pbnRdOwogICAgICBjb25zdCBwMiA9IHBvaW50c1tpbnRQb2ludCA+IHBvaW50cy5sZW5ndGggLSAyID8gcG9pbnRzLmxlbmd0aCAtIDEgOiBpbnRQb2ludCArIDFdOwogICAgICBjb25zdCBwMyA9IHBvaW50c1tpbnRQb2ludCA+IHBvaW50cy5sZW5ndGggLSAzID8gcG9pbnRzLmxlbmd0aCAtIDEgOiBpbnRQb2ludCArIDJdOwogICAgICBwb2ludC5zZXQoQ2F0bXVsbFJvbSh3ZWlnaHQsIHAwLngsIHAxLngsIHAyLngsIHAzLngpLCBDYXRtdWxsUm9tKHdlaWdodCwgcDAueSwgcDEueSwgcDIueSwgcDMueSkpOwogICAgICByZXR1cm4gcG9pbnQ7CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMucG9pbnRzID0gW107CiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gc291cmNlLnBvaW50cy5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgIGNvbnN0IHBvaW50ID0gc291cmNlLnBvaW50c1tpXTsKICAgICAgICB0aGlzLnBvaW50cy5wdXNoKHBvaW50LmNsb25lKCkpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICBjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7CiAgICAgIGRhdGEucG9pbnRzID0gW107CiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5wb2ludHMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICBjb25zdCBwb2ludCA9IHRoaXMucG9pbnRzW2ldOwogICAgICAgIGRhdGEucG9pbnRzLnB1c2gocG9pbnQudG9BcnJheSgpKTsKICAgICAgfQogICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIGZyb21KU09OKGpzb24pIHsKICAgICAgc3VwZXIuZnJvbUpTT04oanNvbik7CiAgICAgIHRoaXMucG9pbnRzID0gW107CiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0ganNvbi5wb2ludHMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICBjb25zdCBwb2ludCA9IGpzb24ucG9pbnRzW2ldOwogICAgICAgIHRoaXMucG9pbnRzLnB1c2gobmV3IFZlY3RvcjIoKS5mcm9tQXJyYXkocG9pbnQpKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIEN1cnZlcyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuZnJlZXplKHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgIEFyY0N1cnZlLAogICAgQ2F0bXVsbFJvbUN1cnZlMywKICAgIEN1YmljQmV6aWVyQ3VydmUsCiAgICBDdWJpY0JlemllckN1cnZlMywKICAgIEVsbGlwc2VDdXJ2ZSwKICAgIExpbmVDdXJ2ZSwKICAgIExpbmVDdXJ2ZTMsCiAgICBRdWFkcmF0aWNCZXppZXJDdXJ2ZSwKICAgIFF1YWRyYXRpY0JlemllckN1cnZlMywKICAgIFNwbGluZUN1cnZlCiAgfSk7CiAgQ3VydmVQYXRoID0gY2xhc3MgQ3VydmVQYXRoIGV4dGVuZHMgQ3VydmUgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMudHlwZSA9ICJDdXJ2ZVBhdGgiOwogICAgICB0aGlzLmN1cnZlcyA9IFtdOwogICAgICB0aGlzLmF1dG9DbG9zZSA9IGZhbHNlOwogICAgfQogICAgYWRkKGN1cnZlKSB7CiAgICAgIHRoaXMuY3VydmVzLnB1c2goY3VydmUpOwogICAgfQogICAgY2xvc2VQYXRoKCkgewogICAgICBjb25zdCBzdGFydFBvaW50ID0gdGhpcy5jdXJ2ZXNbMF0uZ2V0UG9pbnQoMCk7CiAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5jdXJ2ZXNbdGhpcy5jdXJ2ZXMubGVuZ3RoIC0gMV0uZ2V0UG9pbnQoMSk7CiAgICAgIGlmICghc3RhcnRQb2ludC5lcXVhbHMoZW5kUG9pbnQpKSB7CiAgICAgICAgY29uc3QgbGluZVR5cGUgPSBzdGFydFBvaW50LmlzVmVjdG9yMiA9PT0gdHJ1ZSA/ICJMaW5lQ3VydmUiIDogIkxpbmVDdXJ2ZTMiOwogICAgICAgIHRoaXMuY3VydmVzLnB1c2gobmV3IEN1cnZlc1tsaW5lVHlwZV0oZW5kUG9pbnQsIHN0YXJ0UG9pbnQpKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldFBvaW50KHQsIG9wdGlvbmFsVGFyZ2V0KSB7CiAgICAgIGNvbnN0IGQgPSB0ICogdGhpcy5nZXRMZW5ndGgoKTsKICAgICAgY29uc3QgY3VydmVMZW5ndGhzID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTsKICAgICAgbGV0IGkgPSAwOwogICAgICB3aGlsZSAoaSA8IGN1cnZlTGVuZ3Rocy5sZW5ndGgpIHsKICAgICAgICBpZiAoY3VydmVMZW5ndGhzW2ldID49IGQpIHsKICAgICAgICAgIGNvbnN0IGRpZmYgPSBjdXJ2ZUxlbmd0aHNbaV0gLSBkOwogICAgICAgICAgY29uc3QgY3VydmUgPSB0aGlzLmN1cnZlc1tpXTsKICAgICAgICAgIGNvbnN0IHNlZ21lbnRMZW5ndGggPSBjdXJ2ZS5nZXRMZW5ndGgoKTsKICAgICAgICAgIGNvbnN0IHUgPSBzZWdtZW50TGVuZ3RoID09PSAwID8gMCA6IDEgLSBkaWZmIC8gc2VnbWVudExlbmd0aDsKICAgICAgICAgIHJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KHUsIG9wdGlvbmFsVGFyZ2V0KTsKICAgICAgICB9CiAgICAgICAgaSsrOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZ2V0TGVuZ3RoKCkgewogICAgICBjb25zdCBsZW5zID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTsKICAgICAgcmV0dXJuIGxlbnNbbGVucy5sZW5ndGggLSAxXTsKICAgIH0KICAgIHVwZGF0ZUFyY0xlbmd0aHMoKSB7CiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICB0aGlzLmNhY2hlTGVuZ3RocyA9IG51bGw7CiAgICAgIHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7CiAgICB9CiAgICBnZXRDdXJ2ZUxlbmd0aHMoKSB7CiAgICAgIGlmICh0aGlzLmNhY2hlTGVuZ3RocyAmJiB0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGggPT09IHRoaXMuY3VydmVzLmxlbmd0aCkgewogICAgICAgIHJldHVybiB0aGlzLmNhY2hlTGVuZ3RoczsKICAgICAgfQogICAgICBjb25zdCBsZW5ndGhzID0gW107CiAgICAgIGxldCBzdW1zID0gMDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLmN1cnZlcy5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgIHN1bXMgKz0gdGhpcy5jdXJ2ZXNbaV0uZ2V0TGVuZ3RoKCk7CiAgICAgICAgbGVuZ3Rocy5wdXNoKHN1bXMpOwogICAgICB9CiAgICAgIHRoaXMuY2FjaGVMZW5ndGhzID0gbGVuZ3RoczsKICAgICAgcmV0dXJuIGxlbmd0aHM7CiAgICB9CiAgICBnZXRTcGFjZWRQb2ludHMoZGl2aXNpb25zID0gNDApIHsKICAgICAgY29uc3QgcG9pbnRzID0gW107CiAgICAgIGZvciAobGV0IGkgPSAwO2kgPD0gZGl2aXNpb25zOyBpKyspIHsKICAgICAgICBwb2ludHMucHVzaCh0aGlzLmdldFBvaW50KGkgLyBkaXZpc2lvbnMpKTsKICAgICAgfQogICAgICBpZiAodGhpcy5hdXRvQ2xvc2UpIHsKICAgICAgICBwb2ludHMucHVzaChwb2ludHNbMF0pOwogICAgICB9CiAgICAgIHJldHVybiBwb2ludHM7CiAgICB9CiAgICBnZXRQb2ludHMoZGl2aXNpb25zID0gMTIpIHsKICAgICAgY29uc3QgcG9pbnRzID0gW107CiAgICAgIGxldCBsYXN0OwogICAgICBmb3IgKGxldCBpID0gMCwgY3VydmVzID0gdGhpcy5jdXJ2ZXM7aSA8IGN1cnZlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNvbnN0IGN1cnZlID0gY3VydmVzW2ldOwogICAgICAgIGNvbnN0IHJlc29sdXRpb24gPSBjdXJ2ZS5pc0VsbGlwc2VDdXJ2ZSA/IGRpdmlzaW9ucyAqIDIgOiBjdXJ2ZS5pc0xpbmVDdXJ2ZSB8fCBjdXJ2ZS5pc0xpbmVDdXJ2ZTMgPyAxIDogY3VydmUuaXNTcGxpbmVDdXJ2ZSA/IGRpdmlzaW9ucyAqIGN1cnZlLnBvaW50cy5sZW5ndGggOiBkaXZpc2lvbnM7CiAgICAgICAgY29uc3QgcHRzID0gY3VydmUuZ2V0UG9pbnRzKHJlc29sdXRpb24pOwogICAgICAgIGZvciAobGV0IGogPSAwO2ogPCBwdHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgIGNvbnN0IHBvaW50ID0gcHRzW2pdOwogICAgICAgICAgaWYgKGxhc3QgJiYgbGFzdC5lcXVhbHMocG9pbnQpKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIHBvaW50cy5wdXNoKHBvaW50KTsKICAgICAgICAgIGxhc3QgPSBwb2ludDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRoaXMuYXV0b0Nsb3NlICYmIHBvaW50cy5sZW5ndGggPiAxICYmICFwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdLmVxdWFscyhwb2ludHNbMF0pKSB7CiAgICAgICAgcG9pbnRzLnB1c2gocG9pbnRzWzBdKTsKICAgICAgfQogICAgICByZXR1cm4gcG9pbnRzOwogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLmN1cnZlcyA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHNvdXJjZS5jdXJ2ZXMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICBjb25zdCBjdXJ2ZSA9IHNvdXJjZS5jdXJ2ZXNbaV07CiAgICAgICAgdGhpcy5jdXJ2ZXMucHVzaChjdXJ2ZS5jbG9uZSgpKTsKICAgICAgfQogICAgICB0aGlzLmF1dG9DbG9zZSA9IHNvdXJjZS5hdXRvQ2xvc2U7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICBjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7CiAgICAgIGRhdGEuYXV0b0Nsb3NlID0gdGhpcy5hdXRvQ2xvc2U7CiAgICAgIGRhdGEuY3VydmVzID0gW107CiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5jdXJ2ZXMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICBjb25zdCBjdXJ2ZSA9IHRoaXMuY3VydmVzW2ldOwogICAgICAgIGRhdGEuY3VydmVzLnB1c2goY3VydmUudG9KU09OKCkpOwogICAgICB9CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgZnJvbUpTT04oanNvbikgewogICAgICBzdXBlci5mcm9tSlNPTihqc29uKTsKICAgICAgdGhpcy5hdXRvQ2xvc2UgPSBqc29uLmF1dG9DbG9zZTsKICAgICAgdGhpcy5jdXJ2ZXMgPSBbXTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBqc29uLmN1cnZlcy5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgIGNvbnN0IGN1cnZlID0ganNvbi5jdXJ2ZXNbaV07CiAgICAgICAgdGhpcy5jdXJ2ZXMucHVzaChuZXcgQ3VydmVzW2N1cnZlLnR5cGVdKCkuZnJvbUpTT04oY3VydmUpKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIFBhdGggPSBjbGFzcyBQYXRoIGV4dGVuZHMgQ3VydmVQYXRoIHsKICAgIGNvbnN0cnVjdG9yKHBvaW50cykgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLnR5cGUgPSAiUGF0aCI7CiAgICAgIHRoaXMuY3VycmVudFBvaW50ID0gbmV3IFZlY3RvcjI7CiAgICAgIGlmIChwb2ludHMpIHsKICAgICAgICB0aGlzLnNldEZyb21Qb2ludHMocG9pbnRzKTsKICAgICAgfQogICAgfQogICAgc2V0RnJvbVBvaW50cyhwb2ludHMpIHsKICAgICAgdGhpcy5tb3ZlVG8ocG9pbnRzWzBdLngsIHBvaW50c1swXS55KTsKICAgICAgZm9yIChsZXQgaSA9IDEsIGwgPSBwb2ludHMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICB0aGlzLmxpbmVUbyhwb2ludHNbaV0ueCwgcG9pbnRzW2ldLnkpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgbW92ZVRvKHgsIHkpIHsKICAgICAgdGhpcy5jdXJyZW50UG9pbnQuc2V0KHgsIHkpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGxpbmVUbyh4LCB5KSB7CiAgICAgIGNvbnN0IGN1cnZlID0gbmV3IExpbmVDdXJ2ZSh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLCBuZXcgVmVjdG9yMih4LCB5KSk7CiAgICAgIHRoaXMuY3VydmVzLnB1c2goY3VydmUpOwogICAgICB0aGlzLmN1cnJlbnRQb2ludC5zZXQoeCwgeSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcXVhZHJhdGljQ3VydmVUbyhhQ1B4LCBhQ1B5LCBhWCwgYVkpIHsKICAgICAgY29uc3QgY3VydmUgPSBuZXcgUXVhZHJhdGljQmV6aWVyQ3VydmUodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSwgbmV3IFZlY3RvcjIoYUNQeCwgYUNQeSksIG5ldyBWZWN0b3IyKGFYLCBhWSkpOwogICAgICB0aGlzLmN1cnZlcy5wdXNoKGN1cnZlKTsKICAgICAgdGhpcy5jdXJyZW50UG9pbnQuc2V0KGFYLCBhWSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgYmV6aWVyQ3VydmVUbyhhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZKSB7CiAgICAgIGNvbnN0IGN1cnZlID0gbmV3IEN1YmljQmV6aWVyQ3VydmUodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSwgbmV3IFZlY3RvcjIoYUNQMXgsIGFDUDF5KSwgbmV3IFZlY3RvcjIoYUNQMngsIGFDUDJ5KSwgbmV3IFZlY3RvcjIoYVgsIGFZKSk7CiAgICAgIHRoaXMuY3VydmVzLnB1c2goY3VydmUpOwogICAgICB0aGlzLmN1cnJlbnRQb2ludC5zZXQoYVgsIGFZKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzcGxpbmVUaHJ1KHB0cykgewogICAgICBjb25zdCBucHRzID0gW3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdChwdHMpOwogICAgICBjb25zdCBjdXJ2ZSA9IG5ldyBTcGxpbmVDdXJ2ZShucHRzKTsKICAgICAgdGhpcy5jdXJ2ZXMucHVzaChjdXJ2ZSk7CiAgICAgIHRoaXMuY3VycmVudFBvaW50LmNvcHkocHRzW3B0cy5sZW5ndGggLSAxXSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgYXJjKGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSkgewogICAgICBjb25zdCB4MCA9IHRoaXMuY3VycmVudFBvaW50Lng7CiAgICAgIGNvbnN0IHkwID0gdGhpcy5jdXJyZW50UG9pbnQueTsKICAgICAgdGhpcy5hYnNhcmMoYVggKyB4MCwgYVkgKyB5MCwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgYWJzYXJjKGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSkgewogICAgICB0aGlzLmFic2VsbGlwc2UoYVgsIGFZLCBhUmFkaXVzLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBlbGxpcHNlKGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uKSB7CiAgICAgIGNvbnN0IHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDsKICAgICAgY29uc3QgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55OwogICAgICB0aGlzLmFic2VsbGlwc2UoYVggKyB4MCwgYVkgKyB5MCwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBhYnNlbGxpcHNlKGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uKSB7CiAgICAgIGNvbnN0IGN1cnZlID0gbmV3IEVsbGlwc2VDdXJ2ZShhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbik7CiAgICAgIGlmICh0aGlzLmN1cnZlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgY29uc3QgZmlyc3RQb2ludCA9IGN1cnZlLmdldFBvaW50KDApOwogICAgICAgIGlmICghZmlyc3RQb2ludC5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpKSB7CiAgICAgICAgICB0aGlzLmxpbmVUbyhmaXJzdFBvaW50LngsIGZpcnN0UG9pbnQueSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuY3VydmVzLnB1c2goY3VydmUpOwogICAgICBjb25zdCBsYXN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCgxKTsKICAgICAgdGhpcy5jdXJyZW50UG9pbnQuY29weShsYXN0UG9pbnQpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5jdXJyZW50UG9pbnQuY29weShzb3VyY2UuY3VycmVudFBvaW50KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0b0pTT04oKSB7CiAgICAgIGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTsKICAgICAgZGF0YS5jdXJyZW50UG9pbnQgPSB0aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgZnJvbUpTT04oanNvbikgewogICAgICBzdXBlci5mcm9tSlNPTihqc29uKTsKICAgICAgdGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KGpzb24uY3VycmVudFBvaW50KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBMYXRoZUdlb21ldHJ5ID0gY2xhc3MgTGF0aGVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHsKICAgIGNvbnN0cnVjdG9yKHBvaW50cyA9IFtuZXcgVmVjdG9yMigwLCAtMC41KSwgbmV3IFZlY3RvcjIoMC41LCAwKSwgbmV3IFZlY3RvcjIoMCwgMC41KV0sIHNlZ21lbnRzID0gMTIsIHBoaVN0YXJ0ID0gMCwgcGhpTGVuZ3RoID0gTWF0aC5QSSAqIDIpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy50eXBlID0gIkxhdGhlR2VvbWV0cnkiOwogICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgcG9pbnRzLAogICAgICAgIHNlZ21lbnRzLAogICAgICAgIHBoaVN0YXJ0LAogICAgICAgIHBoaUxlbmd0aAogICAgICB9OwogICAgICBzZWdtZW50cyA9IE1hdGguZmxvb3Ioc2VnbWVudHMpOwogICAgICBwaGlMZW5ndGggPSBjbGFtcChwaGlMZW5ndGgsIDAsIE1hdGguUEkgKiAyKTsKICAgICAgY29uc3QgaW5kaWNlcyA9IFtdOwogICAgICBjb25zdCB2ZXJ0aWNlcyA9IFtdOwogICAgICBjb25zdCB1dnMgPSBbXTsKICAgICAgY29uc3QgaW5pdE5vcm1hbHMgPSBbXTsKICAgICAgY29uc3Qgbm9ybWFscyA9IFtdOwogICAgICBjb25zdCBpbnZlcnNlU2VnbWVudHMgPSAxIC8gc2VnbWVudHM7CiAgICAgIGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzOwogICAgICBjb25zdCB1diA9IG5ldyBWZWN0b3IyOwogICAgICBjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMzsKICAgICAgY29uc3QgY3VyTm9ybWFsID0gbmV3IFZlY3RvcjM7CiAgICAgIGNvbnN0IHByZXZOb3JtYWwgPSBuZXcgVmVjdG9yMzsKICAgICAgbGV0IGR4ID0gMDsKICAgICAgbGV0IGR5ID0gMDsKICAgICAgZm9yIChsZXQgaiA9IDA7aiA8PSBwb2ludHMubGVuZ3RoIC0gMTsgaisrKSB7CiAgICAgICAgc3dpdGNoIChqKSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIGR4ID0gcG9pbnRzW2ogKyAxXS54IC0gcG9pbnRzW2pdLng7CiAgICAgICAgICAgIGR5ID0gcG9pbnRzW2ogKyAxXS55IC0gcG9pbnRzW2pdLnk7CiAgICAgICAgICAgIG5vcm1hbC54ID0gZHkgKiAxOwogICAgICAgICAgICBub3JtYWwueSA9IC1keDsKICAgICAgICAgICAgbm9ybWFsLnogPSBkeSAqIDA7CiAgICAgICAgICAgIHByZXZOb3JtYWwuY29weShub3JtYWwpOwogICAgICAgICAgICBub3JtYWwubm9ybWFsaXplKCk7CiAgICAgICAgICAgIGluaXROb3JtYWxzLnB1c2gobm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBwb2ludHMubGVuZ3RoIC0gMToKICAgICAgICAgICAgaW5pdE5vcm1hbHMucHVzaChwcmV2Tm9ybWFsLngsIHByZXZOb3JtYWwueSwgcHJldk5vcm1hbC56KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBkeCA9IHBvaW50c1tqICsgMV0ueCAtIHBvaW50c1tqXS54OwogICAgICAgICAgICBkeSA9IHBvaW50c1tqICsgMV0ueSAtIHBvaW50c1tqXS55OwogICAgICAgICAgICBub3JtYWwueCA9IGR5ICogMTsKICAgICAgICAgICAgbm9ybWFsLnkgPSAtZHg7CiAgICAgICAgICAgIG5vcm1hbC56ID0gZHkgKiAwOwogICAgICAgICAgICBjdXJOb3JtYWwuY29weShub3JtYWwpOwogICAgICAgICAgICBub3JtYWwueCArPSBwcmV2Tm9ybWFsLng7CiAgICAgICAgICAgIG5vcm1hbC55ICs9IHByZXZOb3JtYWwueTsKICAgICAgICAgICAgbm9ybWFsLnogKz0gcHJldk5vcm1hbC56OwogICAgICAgICAgICBub3JtYWwubm9ybWFsaXplKCk7CiAgICAgICAgICAgIGluaXROb3JtYWxzLnB1c2gobm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueik7CiAgICAgICAgICAgIHByZXZOb3JtYWwuY29weShjdXJOb3JtYWwpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGxldCBpID0gMDtpIDw9IHNlZ21lbnRzOyBpKyspIHsKICAgICAgICBjb25zdCBwaGkgPSBwaGlTdGFydCArIGkgKiBpbnZlcnNlU2VnbWVudHMgKiBwaGlMZW5ndGg7CiAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW4ocGhpKTsKICAgICAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhwaGkpOwogICAgICAgIGZvciAobGV0IGogPSAwO2ogPD0gcG9pbnRzLmxlbmd0aCAtIDE7IGorKykgewogICAgICAgICAgdmVydGV4LnggPSBwb2ludHNbal0ueCAqIHNpbjsKICAgICAgICAgIHZlcnRleC55ID0gcG9pbnRzW2pdLnk7CiAgICAgICAgICB2ZXJ0ZXgueiA9IHBvaW50c1tqXS54ICogY29zOwogICAgICAgICAgdmVydGljZXMucHVzaCh2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56KTsKICAgICAgICAgIHV2LnggPSBpIC8gc2VnbWVudHM7CiAgICAgICAgICB1di55ID0gaiAvIChwb2ludHMubGVuZ3RoIC0gMSk7CiAgICAgICAgICB1dnMucHVzaCh1di54LCB1di55KTsKICAgICAgICAgIGNvbnN0IHggPSBpbml0Tm9ybWFsc1szICogaiArIDBdICogc2luOwogICAgICAgICAgY29uc3QgeSA9IGluaXROb3JtYWxzWzMgKiBqICsgMV07CiAgICAgICAgICBjb25zdCB6ID0gaW5pdE5vcm1hbHNbMyAqIGogKyAwXSAqIGNvczsKICAgICAgICAgIG5vcm1hbHMucHVzaCh4LCB5LCB6KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IHNlZ21lbnRzOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqID0gMDtqIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGorKykgewogICAgICAgICAgY29uc3QgYmFzZSA9IGogKyBpICogcG9pbnRzLmxlbmd0aDsKICAgICAgICAgIGNvbnN0IGEgPSBiYXNlOwogICAgICAgICAgY29uc3QgYiA9IGJhc2UgKyBwb2ludHMubGVuZ3RoOwogICAgICAgICAgY29uc3QgYyA9IGJhc2UgKyBwb2ludHMubGVuZ3RoICsgMTsKICAgICAgICAgIGNvbnN0IGQgPSBiYXNlICsgMTsKICAgICAgICAgIGluZGljZXMucHVzaChhLCBiLCBkKTsKICAgICAgICAgIGluZGljZXMucHVzaChjLCBkLCBiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5zZXRJbmRleChpbmRpY2VzKTsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUodmVydGljZXMsIDMpKTsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoInV2IiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUodXZzLCAyKSk7CiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShub3JtYWxzLCAzKSk7CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZS5wYXJhbWV0ZXJzKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04oZGF0YSkgewogICAgICByZXR1cm4gbmV3IExhdGhlR2VvbWV0cnkoZGF0YS5wb2ludHMsIGRhdGEuc2VnbWVudHMsIGRhdGEucGhpU3RhcnQsIGRhdGEucGhpTGVuZ3RoKTsKICAgIH0KICB9OwogIENhcHN1bGVHZW9tZXRyeSA9IGNsYXNzIENhcHN1bGVHZW9tZXRyeSBleHRlbmRzIExhdGhlR2VvbWV0cnkgewogICAgY29uc3RydWN0b3IocmFkaXVzID0gMSwgbGVuZ3RoID0gMSwgY2FwU2VnbWVudHMgPSA0LCByYWRpYWxTZWdtZW50cyA9IDgpIHsKICAgICAgY29uc3QgcGF0aCA9IG5ldyBQYXRoOwogICAgICBwYXRoLmFic2FyYygwLCAtbGVuZ3RoIC8gMiwgcmFkaXVzLCBNYXRoLlBJICogMS41LCAwKTsKICAgICAgcGF0aC5hYnNhcmMoMCwgbGVuZ3RoIC8gMiwgcmFkaXVzLCAwLCBNYXRoLlBJICogMC41KTsKICAgICAgc3VwZXIocGF0aC5nZXRQb2ludHMoY2FwU2VnbWVudHMpLCByYWRpYWxTZWdtZW50cyk7CiAgICAgIHRoaXMudHlwZSA9ICJDYXBzdWxlR2VvbWV0cnkiOwogICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgcmFkaXVzLAogICAgICAgIGxlbmd0aCwKICAgICAgICBjYXBTZWdtZW50cywKICAgICAgICByYWRpYWxTZWdtZW50cwogICAgICB9OwogICAgfQogICAgc3RhdGljIGZyb21KU09OKGRhdGEpIHsKICAgICAgcmV0dXJuIG5ldyBDYXBzdWxlR2VvbWV0cnkoZGF0YS5yYWRpdXMsIGRhdGEubGVuZ3RoLCBkYXRhLmNhcFNlZ21lbnRzLCBkYXRhLnJhZGlhbFNlZ21lbnRzKTsKICAgIH0KICB9OwogIENpcmNsZUdlb21ldHJ5ID0gY2xhc3MgQ2lyY2xlR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7CiAgICBjb25zdHJ1Y3RvcihyYWRpdXMgPSAxLCBzZWdtZW50cyA9IDMyLCB0aGV0YVN0YXJ0ID0gMCwgdGhldGFMZW5ndGggPSBNYXRoLlBJICogMikgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLnR5cGUgPSAiQ2lyY2xlR2VvbWV0cnkiOwogICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgcmFkaXVzLAogICAgICAgIHNlZ21lbnRzLAogICAgICAgIHRoZXRhU3RhcnQsCiAgICAgICAgdGhldGFMZW5ndGgKICAgICAgfTsKICAgICAgc2VnbWVudHMgPSBNYXRoLm1heCgzLCBzZWdtZW50cyk7CiAgICAgIGNvbnN0IGluZGljZXMgPSBbXTsKICAgICAgY29uc3QgdmVydGljZXMgPSBbXTsKICAgICAgY29uc3Qgbm9ybWFscyA9IFtdOwogICAgICBjb25zdCB1dnMgPSBbXTsKICAgICAgY29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjM7CiAgICAgIGNvbnN0IHV2ID0gbmV3IFZlY3RvcjI7CiAgICAgIHZlcnRpY2VzLnB1c2goMCwgMCwgMCk7CiAgICAgIG5vcm1hbHMucHVzaCgwLCAwLCAxKTsKICAgICAgdXZzLnB1c2goMC41LCAwLjUpOwogICAgICBmb3IgKGxldCBzID0gMCwgaSA9IDM7cyA8PSBzZWdtZW50czsgcysrLCBpICs9IDMpIHsKICAgICAgICBjb25zdCBzZWdtZW50ID0gdGhldGFTdGFydCArIHMgLyBzZWdtZW50cyAqIHRoZXRhTGVuZ3RoOwogICAgICAgIHZlcnRleC54ID0gcmFkaXVzICogTWF0aC5jb3Moc2VnbWVudCk7CiAgICAgICAgdmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLnNpbihzZWdtZW50KTsKICAgICAgICB2ZXJ0aWNlcy5wdXNoKHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnopOwogICAgICAgIG5vcm1hbHMucHVzaCgwLCAwLCAxKTsKICAgICAgICB1di54ID0gKHZlcnRpY2VzW2ldIC8gcmFkaXVzICsgMSkgLyAyOwogICAgICAgIHV2LnkgPSAodmVydGljZXNbaSArIDFdIC8gcmFkaXVzICsgMSkgLyAyOwogICAgICAgIHV2cy5wdXNoKHV2LngsIHV2LnkpOwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAxO2kgPD0gc2VnbWVudHM7IGkrKykgewogICAgICAgIGluZGljZXMucHVzaChpLCBpICsgMSwgMCk7CiAgICAgIH0KICAgICAgdGhpcy5zZXRJbmRleChpbmRpY2VzKTsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUodmVydGljZXMsIDMpKTsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKG5vcm1hbHMsIDMpKTsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoInV2IiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUodXZzLCAyKSk7CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZS5wYXJhbWV0ZXJzKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04oZGF0YSkgewogICAgICByZXR1cm4gbmV3IENpcmNsZUdlb21ldHJ5KGRhdGEucmFkaXVzLCBkYXRhLnNlZ21lbnRzLCBkYXRhLnRoZXRhU3RhcnQsIGRhdGEudGhldGFMZW5ndGgpOwogICAgfQogIH07CiAgQ3lsaW5kZXJHZW9tZXRyeSA9IGNsYXNzIEN5bGluZGVyR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7CiAgICBjb25zdHJ1Y3RvcihyYWRpdXNUb3AgPSAxLCByYWRpdXNCb3R0b20gPSAxLCBoZWlnaHQgPSAxLCByYWRpYWxTZWdtZW50cyA9IDMyLCBoZWlnaHRTZWdtZW50cyA9IDEsIG9wZW5FbmRlZCA9IGZhbHNlLCB0aGV0YVN0YXJ0ID0gMCwgdGhldGFMZW5ndGggPSBNYXRoLlBJICogMikgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLnR5cGUgPSAiQ3lsaW5kZXJHZW9tZXRyeSI7CiAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICByYWRpdXNUb3AsCiAgICAgICAgcmFkaXVzQm90dG9tLAogICAgICAgIGhlaWdodCwKICAgICAgICByYWRpYWxTZWdtZW50cywKICAgICAgICBoZWlnaHRTZWdtZW50cywKICAgICAgICBvcGVuRW5kZWQsCiAgICAgICAgdGhldGFTdGFydCwKICAgICAgICB0aGV0YUxlbmd0aAogICAgICB9OwogICAgICBjb25zdCBzY29wZSA9IHRoaXM7CiAgICAgIHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vcihyYWRpYWxTZWdtZW50cyk7CiAgICAgIGhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vcihoZWlnaHRTZWdtZW50cyk7CiAgICAgIGNvbnN0IGluZGljZXMgPSBbXTsKICAgICAgY29uc3QgdmVydGljZXMgPSBbXTsKICAgICAgY29uc3Qgbm9ybWFscyA9IFtdOwogICAgICBjb25zdCB1dnMgPSBbXTsKICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgY29uc3QgaW5kZXhBcnJheSA9IFtdOwogICAgICBjb25zdCBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjsKICAgICAgbGV0IGdyb3VwU3RhcnQgPSAwOwogICAgICBnZW5lcmF0ZVRvcnNvKCk7CiAgICAgIGlmIChvcGVuRW5kZWQgPT09IGZhbHNlKSB7CiAgICAgICAgaWYgKHJhZGl1c1RvcCA+IDApCiAgICAgICAgICBnZW5lcmF0ZUNhcCh0cnVlKTsKICAgICAgICBpZiAocmFkaXVzQm90dG9tID4gMCkKICAgICAgICAgIGdlbmVyYXRlQ2FwKGZhbHNlKTsKICAgICAgfQogICAgICB0aGlzLnNldEluZGV4KGluZGljZXMpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh2ZXJ0aWNlcywgMykpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUobm9ybWFscywgMykpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh1dnMsIDIpKTsKICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVUb3JzbygpIHsKICAgICAgICBjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMzsKICAgICAgICBjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMzsKICAgICAgICBsZXQgZ3JvdXBDb3VudCA9IDA7CiAgICAgICAgY29uc3Qgc2xvcGUgPSAocmFkaXVzQm90dG9tIC0gcmFkaXVzVG9wKSAvIGhlaWdodDsKICAgICAgICBmb3IgKGxldCB5ID0gMDt5IDw9IGhlaWdodFNlZ21lbnRzOyB5KyspIHsKICAgICAgICAgIGNvbnN0IGluZGV4Um93ID0gW107CiAgICAgICAgICBjb25zdCB2ID0geSAvIGhlaWdodFNlZ21lbnRzOwogICAgICAgICAgY29uc3QgcmFkaXVzID0gdiAqIChyYWRpdXNCb3R0b20gLSByYWRpdXNUb3ApICsgcmFkaXVzVG9wOwogICAgICAgICAgZm9yIChsZXQgeCA9IDA7eCA8PSByYWRpYWxTZWdtZW50czsgeCsrKSB7CiAgICAgICAgICAgIGNvbnN0IHUgPSB4IC8gcmFkaWFsU2VnbWVudHM7CiAgICAgICAgICAgIGNvbnN0IHRoZXRhID0gdSAqIHRoZXRhTGVuZ3RoICsgdGhldGFTdGFydDsKICAgICAgICAgICAgY29uc3Qgc2luVGhldGEgPSBNYXRoLnNpbih0aGV0YSk7CiAgICAgICAgICAgIGNvbnN0IGNvc1RoZXRhID0gTWF0aC5jb3ModGhldGEpOwogICAgICAgICAgICB2ZXJ0ZXgueCA9IHJhZGl1cyAqIHNpblRoZXRhOwogICAgICAgICAgICB2ZXJ0ZXgueSA9IC12ICogaGVpZ2h0ICsgaGFsZkhlaWdodDsKICAgICAgICAgICAgdmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTsKICAgICAgICAgICAgdmVydGljZXMucHVzaCh2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56KTsKICAgICAgICAgICAgbm9ybWFsLnNldChzaW5UaGV0YSwgc2xvcGUsIGNvc1RoZXRhKS5ub3JtYWxpemUoKTsKICAgICAgICAgICAgbm9ybWFscy5wdXNoKG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnopOwogICAgICAgICAgICB1dnMucHVzaCh1LCAxIC0gdik7CiAgICAgICAgICAgIGluZGV4Um93LnB1c2goaW5kZXgrKyk7CiAgICAgICAgICB9CiAgICAgICAgICBpbmRleEFycmF5LnB1c2goaW5kZXhSb3cpOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCB4ID0gMDt4IDwgcmFkaWFsU2VnbWVudHM7IHgrKykgewogICAgICAgICAgZm9yIChsZXQgeSA9IDA7eSA8IGhlaWdodFNlZ21lbnRzOyB5KyspIHsKICAgICAgICAgICAgY29uc3QgYSA9IGluZGV4QXJyYXlbeV1beF07CiAgICAgICAgICAgIGNvbnN0IGIgPSBpbmRleEFycmF5W3kgKyAxXVt4XTsKICAgICAgICAgICAgY29uc3QgYyA9IGluZGV4QXJyYXlbeSArIDFdW3ggKyAxXTsKICAgICAgICAgICAgY29uc3QgZCA9IGluZGV4QXJyYXlbeV1beCArIDFdOwogICAgICAgICAgICBpZiAocmFkaXVzVG9wID4gMCB8fCB5ICE9PSAwKSB7CiAgICAgICAgICAgICAgaW5kaWNlcy5wdXNoKGEsIGIsIGQpOwogICAgICAgICAgICAgIGdyb3VwQ291bnQgKz0gMzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmFkaXVzQm90dG9tID4gMCB8fCB5ICE9PSBoZWlnaHRTZWdtZW50cyAtIDEpIHsKICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goYiwgYywgZCk7CiAgICAgICAgICAgICAgZ3JvdXBDb3VudCArPSAzOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNjb3BlLmFkZEdyb3VwKGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIDApOwogICAgICAgIGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDsKICAgICAgfQogICAgICBmdW5jdGlvbiBnZW5lcmF0ZUNhcCh0b3ApIHsKICAgICAgICBjb25zdCBjZW50ZXJJbmRleFN0YXJ0ID0gaW5kZXg7CiAgICAgICAgY29uc3QgdXYgPSBuZXcgVmVjdG9yMjsKICAgICAgICBjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMzsKICAgICAgICBsZXQgZ3JvdXBDb3VudCA9IDA7CiAgICAgICAgY29uc3QgcmFkaXVzID0gdG9wID09PSB0cnVlID8gcmFkaXVzVG9wIDogcmFkaXVzQm90dG9tOwogICAgICAgIGNvbnN0IHNpZ24gPSB0b3AgPT09IHRydWUgPyAxIDogLTE7CiAgICAgICAgZm9yIChsZXQgeCA9IDE7eCA8PSByYWRpYWxTZWdtZW50czsgeCsrKSB7CiAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKDAsIGhhbGZIZWlnaHQgKiBzaWduLCAwKTsKICAgICAgICAgIG5vcm1hbHMucHVzaCgwLCBzaWduLCAwKTsKICAgICAgICAgIHV2cy5wdXNoKDAuNSwgMC41KTsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNlbnRlckluZGV4RW5kID0gaW5kZXg7CiAgICAgICAgZm9yIChsZXQgeCA9IDA7eCA8PSByYWRpYWxTZWdtZW50czsgeCsrKSB7CiAgICAgICAgICBjb25zdCB1ID0geCAvIHJhZGlhbFNlZ21lbnRzOwogICAgICAgICAgY29uc3QgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0OwogICAgICAgICAgY29uc3QgY29zVGhldGEgPSBNYXRoLmNvcyh0aGV0YSk7CiAgICAgICAgICBjb25zdCBzaW5UaGV0YSA9IE1hdGguc2luKHRoZXRhKTsKICAgICAgICAgIHZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7CiAgICAgICAgICB2ZXJ0ZXgueSA9IGhhbGZIZWlnaHQgKiBzaWduOwogICAgICAgICAgdmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTsKICAgICAgICAgIHZlcnRpY2VzLnB1c2godmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueik7CiAgICAgICAgICBub3JtYWxzLnB1c2goMCwgc2lnbiwgMCk7CiAgICAgICAgICB1di54ID0gY29zVGhldGEgKiAwLjUgKyAwLjU7CiAgICAgICAgICB1di55ID0gc2luVGhldGEgKiAwLjUgKiBzaWduICsgMC41OwogICAgICAgICAgdXZzLnB1c2godXYueCwgdXYueSk7CiAgICAgICAgICBpbmRleCsrOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCB4ID0gMDt4IDwgcmFkaWFsU2VnbWVudHM7IHgrKykgewogICAgICAgICAgY29uc3QgYyA9IGNlbnRlckluZGV4U3RhcnQgKyB4OwogICAgICAgICAgY29uc3QgaSA9IGNlbnRlckluZGV4RW5kICsgeDsKICAgICAgICAgIGlmICh0b3AgPT09IHRydWUpIHsKICAgICAgICAgICAgaW5kaWNlcy5wdXNoKGksIGkgKyAxLCBjKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluZGljZXMucHVzaChpICsgMSwgaSwgYyk7CiAgICAgICAgICB9CiAgICAgICAgICBncm91cENvdW50ICs9IDM7CiAgICAgICAgfQogICAgICAgIHNjb3BlLmFkZEdyb3VwKGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIHRvcCA9PT0gdHJ1ZSA/IDEgOiAyKTsKICAgICAgICBncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7CiAgICAgIH0KICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgc291cmNlLnBhcmFtZXRlcnMpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHN0YXRpYyBmcm9tSlNPTihkYXRhKSB7CiAgICAgIHJldHVybiBuZXcgQ3lsaW5kZXJHZW9tZXRyeShkYXRhLnJhZGl1c1RvcCwgZGF0YS5yYWRpdXNCb3R0b20sIGRhdGEuaGVpZ2h0LCBkYXRhLnJhZGlhbFNlZ21lbnRzLCBkYXRhLmhlaWdodFNlZ21lbnRzLCBkYXRhLm9wZW5FbmRlZCwgZGF0YS50aGV0YVN0YXJ0LCBkYXRhLnRoZXRhTGVuZ3RoKTsKICAgIH0KICB9OwogIENvbmVHZW9tZXRyeSA9IGNsYXNzIENvbmVHZW9tZXRyeSBleHRlbmRzIEN5bGluZGVyR2VvbWV0cnkgewogICAgY29uc3RydWN0b3IocmFkaXVzID0gMSwgaGVpZ2h0ID0gMSwgcmFkaWFsU2VnbWVudHMgPSAzMiwgaGVpZ2h0U2VnbWVudHMgPSAxLCBvcGVuRW5kZWQgPSBmYWxzZSwgdGhldGFTdGFydCA9IDAsIHRoZXRhTGVuZ3RoID0gTWF0aC5QSSAqIDIpIHsKICAgICAgc3VwZXIoMCwgcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCk7CiAgICAgIHRoaXMudHlwZSA9ICJDb25lR2VvbWV0cnkiOwogICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgcmFkaXVzLAogICAgICAgIGhlaWdodCwKICAgICAgICByYWRpYWxTZWdtZW50cywKICAgICAgICBoZWlnaHRTZWdtZW50cywKICAgICAgICBvcGVuRW5kZWQsCiAgICAgICAgdGhldGFTdGFydCwKICAgICAgICB0aGV0YUxlbmd0aAogICAgICB9OwogICAgfQogICAgc3RhdGljIGZyb21KU09OKGRhdGEpIHsKICAgICAgcmV0dXJuIG5ldyBDb25lR2VvbWV0cnkoZGF0YS5yYWRpdXMsIGRhdGEuaGVpZ2h0LCBkYXRhLnJhZGlhbFNlZ21lbnRzLCBkYXRhLmhlaWdodFNlZ21lbnRzLCBkYXRhLm9wZW5FbmRlZCwgZGF0YS50aGV0YVN0YXJ0LCBkYXRhLnRoZXRhTGVuZ3RoKTsKICAgIH0KICB9OwogIFBvbHloZWRyb25HZW9tZXRyeSA9IGNsYXNzIFBvbHloZWRyb25HZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHsKICAgIGNvbnN0cnVjdG9yKHZlcnRpY2VzID0gW10sIGluZGljZXMgPSBbXSwgcmFkaXVzID0gMSwgZGV0YWlsID0gMCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLnR5cGUgPSAiUG9seWhlZHJvbkdlb21ldHJ5IjsKICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gewogICAgICAgIHZlcnRpY2VzLAogICAgICAgIGluZGljZXMsCiAgICAgICAgcmFkaXVzLAogICAgICAgIGRldGFpbAogICAgICB9OwogICAgICBjb25zdCB2ZXJ0ZXhCdWZmZXIgPSBbXTsKICAgICAgY29uc3QgdXZCdWZmZXIgPSBbXTsKICAgICAgc3ViZGl2aWRlKGRldGFpbCk7CiAgICAgIGFwcGx5UmFkaXVzKHJhZGl1cyk7CiAgICAgIGdlbmVyYXRlVVZzKCk7CiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKHZlcnRleEJ1ZmZlciwgMykpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUodmVydGV4QnVmZmVyLnNsaWNlKCksIDMpKTsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoInV2IiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUodXZCdWZmZXIsIDIpKTsKICAgICAgaWYgKGRldGFpbCA9PT0gMCkgewogICAgICAgIHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBzdWJkaXZpZGUoZGV0YWlsMikgewogICAgICAgIGNvbnN0IGEgPSBuZXcgVmVjdG9yMzsKICAgICAgICBjb25zdCBiID0gbmV3IFZlY3RvcjM7CiAgICAgICAgY29uc3QgYyA9IG5ldyBWZWN0b3IzOwogICAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBpbmRpY2VzLmxlbmd0aDsgaSArPSAzKSB7CiAgICAgICAgICBnZXRWZXJ0ZXhCeUluZGV4KGluZGljZXNbaSArIDBdLCBhKTsKICAgICAgICAgIGdldFZlcnRleEJ5SW5kZXgoaW5kaWNlc1tpICsgMV0sIGIpOwogICAgICAgICAgZ2V0VmVydGV4QnlJbmRleChpbmRpY2VzW2kgKyAyXSwgYyk7CiAgICAgICAgICBzdWJkaXZpZGVGYWNlKGEsIGIsIGMsIGRldGFpbDIpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBzdWJkaXZpZGVGYWNlKGEsIGIsIGMsIGRldGFpbDIpIHsKICAgICAgICBjb25zdCBjb2xzID0gZGV0YWlsMiArIDE7CiAgICAgICAgY29uc3QgdiA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwO2kgPD0gY29sczsgaSsrKSB7CiAgICAgICAgICB2W2ldID0gW107CiAgICAgICAgICBjb25zdCBhaiA9IGEuY2xvbmUoKS5sZXJwKGMsIGkgLyBjb2xzKTsKICAgICAgICAgIGNvbnN0IGJqID0gYi5jbG9uZSgpLmxlcnAoYywgaSAvIGNvbHMpOwogICAgICAgICAgY29uc3Qgcm93cyA9IGNvbHMgLSBpOwogICAgICAgICAgZm9yIChsZXQgaiA9IDA7aiA8PSByb3dzOyBqKyspIHsKICAgICAgICAgICAgaWYgKGogPT09IDAgJiYgaSA9PT0gY29scykgewogICAgICAgICAgICAgIHZbaV1bal0gPSBhajsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2W2ldW2pdID0gYWouY2xvbmUoKS5sZXJwKGJqLCBqIC8gcm93cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IGNvbHM7IGkrKykgewogICAgICAgICAgZm9yIChsZXQgaiA9IDA7aiA8IDIgKiAoY29scyAtIGkpIC0gMTsgaisrKSB7CiAgICAgICAgICAgIGNvbnN0IGsgPSBNYXRoLmZsb29yKGogLyAyKTsKICAgICAgICAgICAgaWYgKGogJSAyID09PSAwKSB7CiAgICAgICAgICAgICAgcHVzaFZlcnRleCh2W2ldW2sgKyAxXSk7CiAgICAgICAgICAgICAgcHVzaFZlcnRleCh2W2kgKyAxXVtrXSk7CiAgICAgICAgICAgICAgcHVzaFZlcnRleCh2W2ldW2tdKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBwdXNoVmVydGV4KHZbaV1bayArIDFdKTsKICAgICAgICAgICAgICBwdXNoVmVydGV4KHZbaSArIDFdW2sgKyAxXSk7CiAgICAgICAgICAgICAgcHVzaFZlcnRleCh2W2kgKyAxXVtrXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gYXBwbHlSYWRpdXMocmFkaXVzMikgewogICAgICAgIGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzOwogICAgICAgIGZvciAobGV0IGkgPSAwO2kgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMpIHsKICAgICAgICAgIHZlcnRleC54ID0gdmVydGV4QnVmZmVyW2kgKyAwXTsKICAgICAgICAgIHZlcnRleC55ID0gdmVydGV4QnVmZmVyW2kgKyAxXTsKICAgICAgICAgIHZlcnRleC56ID0gdmVydGV4QnVmZmVyW2kgKyAyXTsKICAgICAgICAgIHZlcnRleC5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihyYWRpdXMyKTsKICAgICAgICAgIHZlcnRleEJ1ZmZlcltpICsgMF0gPSB2ZXJ0ZXgueDsKICAgICAgICAgIHZlcnRleEJ1ZmZlcltpICsgMV0gPSB2ZXJ0ZXgueTsKICAgICAgICAgIHZlcnRleEJ1ZmZlcltpICsgMl0gPSB2ZXJ0ZXguejsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVVVnMoKSB7CiAgICAgICAgY29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjM7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gMykgewogICAgICAgICAgdmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbaSArIDBdOwogICAgICAgICAgdmVydGV4LnkgPSB2ZXJ0ZXhCdWZmZXJbaSArIDFdOwogICAgICAgICAgdmVydGV4LnogPSB2ZXJ0ZXhCdWZmZXJbaSArIDJdOwogICAgICAgICAgY29uc3QgdSA9IGF6aW11dGgodmVydGV4KSAvIDIgLyBNYXRoLlBJICsgMC41OwogICAgICAgICAgY29uc3QgdiA9IGluY2xpbmF0aW9uKHZlcnRleCkgLyBNYXRoLlBJICsgMC41OwogICAgICAgICAgdXZCdWZmZXIucHVzaCh1LCAxIC0gdik7CiAgICAgICAgfQogICAgICAgIGNvcnJlY3RVVnMoKTsKICAgICAgICBjb3JyZWN0U2VhbSgpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGNvcnJlY3RTZWFtKCkgewogICAgICAgIGZvciAobGV0IGkgPSAwO2kgPCB1dkJ1ZmZlci5sZW5ndGg7IGkgKz0gNikgewogICAgICAgICAgY29uc3QgeDAgPSB1dkJ1ZmZlcltpICsgMF07CiAgICAgICAgICBjb25zdCB4MSA9IHV2QnVmZmVyW2kgKyAyXTsKICAgICAgICAgIGNvbnN0IHgyID0gdXZCdWZmZXJbaSArIDRdOwogICAgICAgICAgY29uc3QgbWF4ID0gTWF0aC5tYXgoeDAsIHgxLCB4Mik7CiAgICAgICAgICBjb25zdCBtaW4gPSBNYXRoLm1pbih4MCwgeDEsIHgyKTsKICAgICAgICAgIGlmIChtYXggPiAwLjkgJiYgbWluIDwgMC4xKSB7CiAgICAgICAgICAgIGlmICh4MCA8IDAuMikKICAgICAgICAgICAgICB1dkJ1ZmZlcltpICsgMF0gKz0gMTsKICAgICAgICAgICAgaWYgKHgxIDwgMC4yKQogICAgICAgICAgICAgIHV2QnVmZmVyW2kgKyAyXSArPSAxOwogICAgICAgICAgICBpZiAoeDIgPCAwLjIpCiAgICAgICAgICAgICAgdXZCdWZmZXJbaSArIDRdICs9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIHB1c2hWZXJ0ZXgodmVydGV4KSB7CiAgICAgICAgdmVydGV4QnVmZmVyLnB1c2godmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueik7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZ2V0VmVydGV4QnlJbmRleChpbmRleCwgdmVydGV4KSB7CiAgICAgICAgY29uc3Qgc3RyaWRlID0gaW5kZXggKiAzOwogICAgICAgIHZlcnRleC54ID0gdmVydGljZXNbc3RyaWRlICsgMF07CiAgICAgICAgdmVydGV4LnkgPSB2ZXJ0aWNlc1tzdHJpZGUgKyAxXTsKICAgICAgICB2ZXJ0ZXgueiA9IHZlcnRpY2VzW3N0cmlkZSArIDJdOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGNvcnJlY3RVVnMoKSB7CiAgICAgICAgY29uc3QgYSA9IG5ldyBWZWN0b3IzOwogICAgICAgIGNvbnN0IGIgPSBuZXcgVmVjdG9yMzsKICAgICAgICBjb25zdCBjID0gbmV3IFZlY3RvcjM7CiAgICAgICAgY29uc3QgY2VudHJvaWQgPSBuZXcgVmVjdG9yMzsKICAgICAgICBjb25zdCB1dkEgPSBuZXcgVmVjdG9yMjsKICAgICAgICBjb25zdCB1dkIgPSBuZXcgVmVjdG9yMjsKICAgICAgICBjb25zdCB1dkMgPSBuZXcgVmVjdG9yMjsKICAgICAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7aSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gOSwgaiArPSA2KSB7CiAgICAgICAgICBhLnNldCh2ZXJ0ZXhCdWZmZXJbaSArIDBdLCB2ZXJ0ZXhCdWZmZXJbaSArIDFdLCB2ZXJ0ZXhCdWZmZXJbaSArIDJdKTsKICAgICAgICAgIGIuc2V0KHZlcnRleEJ1ZmZlcltpICsgM10sIHZlcnRleEJ1ZmZlcltpICsgNF0sIHZlcnRleEJ1ZmZlcltpICsgNV0pOwogICAgICAgICAgYy5zZXQodmVydGV4QnVmZmVyW2kgKyA2XSwgdmVydGV4QnVmZmVyW2kgKyA3XSwgdmVydGV4QnVmZmVyW2kgKyA4XSk7CiAgICAgICAgICB1dkEuc2V0KHV2QnVmZmVyW2ogKyAwXSwgdXZCdWZmZXJbaiArIDFdKTsKICAgICAgICAgIHV2Qi5zZXQodXZCdWZmZXJbaiArIDJdLCB1dkJ1ZmZlcltqICsgM10pOwogICAgICAgICAgdXZDLnNldCh1dkJ1ZmZlcltqICsgNF0sIHV2QnVmZmVyW2ogKyA1XSk7CiAgICAgICAgICBjZW50cm9pZC5jb3B5KGEpLmFkZChiKS5hZGQoYykuZGl2aWRlU2NhbGFyKDMpOwogICAgICAgICAgY29uc3QgYXppID0gYXppbXV0aChjZW50cm9pZCk7CiAgICAgICAgICBjb3JyZWN0VVYodXZBLCBqICsgMCwgYSwgYXppKTsKICAgICAgICAgIGNvcnJlY3RVVih1dkIsIGogKyAyLCBiLCBhemkpOwogICAgICAgICAgY29ycmVjdFVWKHV2QywgaiArIDQsIGMsIGF6aSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIGNvcnJlY3RVVih1diwgc3RyaWRlLCB2ZWN0b3IsIGF6aW11dGgyKSB7CiAgICAgICAgaWYgKGF6aW11dGgyIDwgMCAmJiB1di54ID09PSAxKSB7CiAgICAgICAgICB1dkJ1ZmZlcltzdHJpZGVdID0gdXYueCAtIDE7CiAgICAgICAgfQogICAgICAgIGlmICh2ZWN0b3IueCA9PT0gMCAmJiB2ZWN0b3IueiA9PT0gMCkgewogICAgICAgICAgdXZCdWZmZXJbc3RyaWRlXSA9IGF6aW11dGgyIC8gMiAvIE1hdGguUEkgKyAwLjU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIGF6aW11dGgodmVjdG9yKSB7CiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodmVjdG9yLnosIC12ZWN0b3IueCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gaW5jbGluYXRpb24odmVjdG9yKSB7CiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIoLXZlY3Rvci55LCBNYXRoLnNxcnQodmVjdG9yLnggKiB2ZWN0b3IueCArIHZlY3Rvci56ICogdmVjdG9yLnopKTsKICAgICAgfQogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBzb3VyY2UucGFyYW1ldGVycyk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc3RhdGljIGZyb21KU09OKGRhdGEpIHsKICAgICAgcmV0dXJuIG5ldyBQb2x5aGVkcm9uR2VvbWV0cnkoZGF0YS52ZXJ0aWNlcywgZGF0YS5pbmRpY2VzLCBkYXRhLnJhZGl1cywgZGF0YS5kZXRhaWxzKTsKICAgIH0KICB9OwogIERvZGVjYWhlZHJvbkdlb21ldHJ5ID0gY2xhc3MgRG9kZWNhaGVkcm9uR2VvbWV0cnkgZXh0ZW5kcyBQb2x5aGVkcm9uR2VvbWV0cnkgewogICAgY29uc3RydWN0b3IocmFkaXVzID0gMSwgZGV0YWlsID0gMCkgewogICAgICBjb25zdCB0ID0gKDEgKyBNYXRoLnNxcnQoNSkpIC8gMjsKICAgICAgY29uc3QgciA9IDEgLyB0OwogICAgICBjb25zdCB2ZXJ0aWNlcyA9IFsKICAgICAgICAtMSwKICAgICAgICAtMSwKICAgICAgICAtMSwKICAgICAgICAtMSwKICAgICAgICAtMSwKICAgICAgICAxLAogICAgICAgIC0xLAogICAgICAgIDEsCiAgICAgICAgLTEsCiAgICAgICAgLTEsCiAgICAgICAgMSwKICAgICAgICAxLAogICAgICAgIDEsCiAgICAgICAgLTEsCiAgICAgICAgLTEsCiAgICAgICAgMSwKICAgICAgICAtMSwKICAgICAgICAxLAogICAgICAgIDEsCiAgICAgICAgMSwKICAgICAgICAtMSwKICAgICAgICAxLAogICAgICAgIDEsCiAgICAgICAgMSwKICAgICAgICAwLAogICAgICAgIC1yLAogICAgICAgIC10LAogICAgICAgIDAsCiAgICAgICAgLXIsCiAgICAgICAgdCwKICAgICAgICAwLAogICAgICAgIHIsCiAgICAgICAgLXQsCiAgICAgICAgMCwKICAgICAgICByLAogICAgICAgIHQsCiAgICAgICAgLXIsCiAgICAgICAgLXQsCiAgICAgICAgMCwKICAgICAgICAtciwKICAgICAgICB0LAogICAgICAgIDAsCiAgICAgICAgciwKICAgICAgICAtdCwKICAgICAgICAwLAogICAgICAgIHIsCiAgICAgICAgdCwKICAgICAgICAwLAogICAgICAgIC10LAogICAgICAgIDAsCiAgICAgICAgLXIsCiAgICAgICAgdCwKICAgICAgICAwLAogICAgICAgIC1yLAogICAgICAgIC10LAogICAgICAgIDAsCiAgICAgICAgciwKICAgICAgICB0LAogICAgICAgIDAsCiAgICAgICAgcgogICAgICBdOwogICAgICBjb25zdCBpbmRpY2VzID0gWwogICAgICAgIDMsCiAgICAgICAgMTEsCiAgICAgICAgNywKICAgICAgICAzLAogICAgICAgIDcsCiAgICAgICAgMTUsCiAgICAgICAgMywKICAgICAgICAxNSwKICAgICAgICAxMywKICAgICAgICA3LAogICAgICAgIDE5LAogICAgICAgIDE3LAogICAgICAgIDcsCiAgICAgICAgMTcsCiAgICAgICAgNiwKICAgICAgICA3LAogICAgICAgIDYsCiAgICAgICAgMTUsCiAgICAgICAgMTcsCiAgICAgICAgNCwKICAgICAgICA4LAogICAgICAgIDE3LAogICAgICAgIDgsCiAgICAgICAgMTAsCiAgICAgICAgMTcsCiAgICAgICAgMTAsCiAgICAgICAgNiwKICAgICAgICA4LAogICAgICAgIDAsCiAgICAgICAgMTYsCiAgICAgICAgOCwKICAgICAgICAxNiwKICAgICAgICAyLAogICAgICAgIDgsCiAgICAgICAgMiwKICAgICAgICAxMCwKICAgICAgICAwLAogICAgICAgIDEyLAogICAgICAgIDEsCiAgICAgICAgMCwKICAgICAgICAxLAogICAgICAgIDE4LAogICAgICAgIDAsCiAgICAgICAgMTgsCiAgICAgICAgMTYsCiAgICAgICAgNiwKICAgICAgICAxMCwKICAgICAgICAyLAogICAgICAgIDYsCiAgICAgICAgMiwKICAgICAgICAxMywKICAgICAgICA2LAogICAgICAgIDEzLAogICAgICAgIDE1LAogICAgICAgIDIsCiAgICAgICAgMTYsCiAgICAgICAgMTgsCiAgICAgICAgMiwKICAgICAgICAxOCwKICAgICAgICAzLAogICAgICAgIDIsCiAgICAgICAgMywKICAgICAgICAxMywKICAgICAgICAxOCwKICAgICAgICAxLAogICAgICAgIDksCiAgICAgICAgMTgsCiAgICAgICAgOSwKICAgICAgICAxMSwKICAgICAgICAxOCwKICAgICAgICAxMSwKICAgICAgICAzLAogICAgICAgIDQsCiAgICAgICAgMTQsCiAgICAgICAgMTIsCiAgICAgICAgNCwKICAgICAgICAxMiwKICAgICAgICAwLAogICAgICAgIDQsCiAgICAgICAgMCwKICAgICAgICA4LAogICAgICAgIDExLAogICAgICAgIDksCiAgICAgICAgNSwKICAgICAgICAxMSwKICAgICAgICA1LAogICAgICAgIDE5LAogICAgICAgIDExLAogICAgICAgIDE5LAogICAgICAgIDcsCiAgICAgICAgMTksCiAgICAgICAgNSwKICAgICAgICAxNCwKICAgICAgICAxOSwKICAgICAgICAxNCwKICAgICAgICA0LAogICAgICAgIDE5LAogICAgICAgIDQsCiAgICAgICAgMTcsCiAgICAgICAgMSwKICAgICAgICAxMiwKICAgICAgICAxNCwKICAgICAgICAxLAogICAgICAgIDE0LAogICAgICAgIDUsCiAgICAgICAgMSwKICAgICAgICA1LAogICAgICAgIDkKICAgICAgXTsKICAgICAgc3VwZXIodmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsKTsKICAgICAgdGhpcy50eXBlID0gIkRvZGVjYWhlZHJvbkdlb21ldHJ5IjsKICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gewogICAgICAgIHJhZGl1cywKICAgICAgICBkZXRhaWwKICAgICAgfTsKICAgIH0KICAgIHN0YXRpYyBmcm9tSlNPTihkYXRhKSB7CiAgICAgIHJldHVybiBuZXcgRG9kZWNhaGVkcm9uR2VvbWV0cnkoZGF0YS5yYWRpdXMsIGRhdGEuZGV0YWlsKTsKICAgIH0KICB9OwogIF92MCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfdjEkMSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfbm9ybWFsID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF90cmlhbmdsZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVHJpYW5nbGU7CiAgRWRnZXNHZW9tZXRyeSA9IGNsYXNzIEVkZ2VzR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7CiAgICBjb25zdHJ1Y3RvcihnZW9tZXRyeSA9IG51bGwsIHRocmVzaG9sZEFuZ2xlID0gMSkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLnR5cGUgPSAiRWRnZXNHZW9tZXRyeSI7CiAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICBnZW9tZXRyeSwKICAgICAgICB0aHJlc2hvbGRBbmdsZQogICAgICB9OwogICAgICBpZiAoZ2VvbWV0cnkgIT09IG51bGwpIHsKICAgICAgICBjb25zdCBwcmVjaXNpb25Qb2ludHMgPSA0OwogICAgICAgIGNvbnN0IHByZWNpc2lvbiA9IE1hdGgucG93KDEwLCBwcmVjaXNpb25Qb2ludHMpOwogICAgICAgIGNvbnN0IHRocmVzaG9sZERvdCA9IE1hdGguY29zKERFRzJSQUQgKiB0aHJlc2hvbGRBbmdsZSk7CiAgICAgICAgY29uc3QgaW5kZXhBdHRyID0gZ2VvbWV0cnkuZ2V0SW5kZXgoKTsKICAgICAgICBjb25zdCBwb3NpdGlvbkF0dHIgPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7CiAgICAgICAgY29uc3QgaW5kZXhDb3VudCA9IGluZGV4QXR0ciA/IGluZGV4QXR0ci5jb3VudCA6IHBvc2l0aW9uQXR0ci5jb3VudDsKICAgICAgICBjb25zdCBpbmRleEFyciA9IFswLCAwLCAwXTsKICAgICAgICBjb25zdCB2ZXJ0S2V5cyA9IFsiYSIsICJiIiwgImMiXTsKICAgICAgICBjb25zdCBoYXNoZXMgPSBuZXcgQXJyYXkoMyk7CiAgICAgICAgY29uc3QgZWRnZURhdGEgPSB7fTsKICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBpbmRleENvdW50OyBpICs9IDMpIHsKICAgICAgICAgIGlmIChpbmRleEF0dHIpIHsKICAgICAgICAgICAgaW5kZXhBcnJbMF0gPSBpbmRleEF0dHIuZ2V0WChpKTsKICAgICAgICAgICAgaW5kZXhBcnJbMV0gPSBpbmRleEF0dHIuZ2V0WChpICsgMSk7CiAgICAgICAgICAgIGluZGV4QXJyWzJdID0gaW5kZXhBdHRyLmdldFgoaSArIDIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW5kZXhBcnJbMF0gPSBpOwogICAgICAgICAgICBpbmRleEFyclsxXSA9IGkgKyAxOwogICAgICAgICAgICBpbmRleEFyclsyXSA9IGkgKyAyOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgeyBhLCBiLCBjIH0gPSBfdHJpYW5nbGU7CiAgICAgICAgICBhLmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb25BdHRyLCBpbmRleEFyclswXSk7CiAgICAgICAgICBiLmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb25BdHRyLCBpbmRleEFyclsxXSk7CiAgICAgICAgICBjLmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb25BdHRyLCBpbmRleEFyclsyXSk7CiAgICAgICAgICBfdHJpYW5nbGUuZ2V0Tm9ybWFsKF9ub3JtYWwpOwogICAgICAgICAgaGFzaGVzWzBdID0gYCR7TWF0aC5yb3VuZChhLnggKiBwcmVjaXNpb24pfSwke01hdGgucm91bmQoYS55ICogcHJlY2lzaW9uKX0sJHtNYXRoLnJvdW5kKGEueiAqIHByZWNpc2lvbil9YDsKICAgICAgICAgIGhhc2hlc1sxXSA9IGAke01hdGgucm91bmQoYi54ICogcHJlY2lzaW9uKX0sJHtNYXRoLnJvdW5kKGIueSAqIHByZWNpc2lvbil9LCR7TWF0aC5yb3VuZChiLnogKiBwcmVjaXNpb24pfWA7CiAgICAgICAgICBoYXNoZXNbMl0gPSBgJHtNYXRoLnJvdW5kKGMueCAqIHByZWNpc2lvbil9LCR7TWF0aC5yb3VuZChjLnkgKiBwcmVjaXNpb24pfSwke01hdGgucm91bmQoYy56ICogcHJlY2lzaW9uKX1gOwogICAgICAgICAgaWYgKGhhc2hlc1swXSA9PT0gaGFzaGVzWzFdIHx8IGhhc2hlc1sxXSA9PT0gaGFzaGVzWzJdIHx8IGhhc2hlc1syXSA9PT0gaGFzaGVzWzBdKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChsZXQgaiA9IDA7aiA8IDM7IGorKykgewogICAgICAgICAgICBjb25zdCBqTmV4dCA9IChqICsgMSkgJSAzOwogICAgICAgICAgICBjb25zdCB2ZWNIYXNoMCA9IGhhc2hlc1tqXTsKICAgICAgICAgICAgY29uc3QgdmVjSGFzaDEgPSBoYXNoZXNbak5leHRdOwogICAgICAgICAgICBjb25zdCB2MCA9IF90cmlhbmdsZVt2ZXJ0S2V5c1tqXV07CiAgICAgICAgICAgIGNvbnN0IHYxID0gX3RyaWFuZ2xlW3ZlcnRLZXlzW2pOZXh0XV07CiAgICAgICAgICAgIGNvbnN0IGhhc2ggPSBgJHt2ZWNIYXNoMH1fJHt2ZWNIYXNoMX1gOwogICAgICAgICAgICBjb25zdCByZXZlcnNlSGFzaCA9IGAke3ZlY0hhc2gxfV8ke3ZlY0hhc2gwfWA7CiAgICAgICAgICAgIGlmIChyZXZlcnNlSGFzaCBpbiBlZGdlRGF0YSAmJiBlZGdlRGF0YVtyZXZlcnNlSGFzaF0pIHsKICAgICAgICAgICAgICBpZiAoX25vcm1hbC5kb3QoZWRnZURhdGFbcmV2ZXJzZUhhc2hdLm5vcm1hbCkgPD0gdGhyZXNob2xkRG90KSB7CiAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKHYwLngsIHYwLnksIHYwLnopOwogICAgICAgICAgICAgICAgdmVydGljZXMucHVzaCh2MS54LCB2MS55LCB2MS56KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWRnZURhdGFbcmV2ZXJzZUhhc2hdID0gbnVsbDsKICAgICAgICAgICAgfSBlbHNlIGlmICghKGhhc2ggaW4gZWRnZURhdGEpKSB7CiAgICAgICAgICAgICAgZWRnZURhdGFbaGFzaF0gPSB7CiAgICAgICAgICAgICAgICBpbmRleDA6IGluZGV4QXJyW2pdLAogICAgICAgICAgICAgICAgaW5kZXgxOiBpbmRleEFycltqTmV4dF0sCiAgICAgICAgICAgICAgICBub3JtYWw6IF9ub3JtYWwuY2xvbmUoKQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZWRnZURhdGEpIHsKICAgICAgICAgIGlmIChlZGdlRGF0YVtrZXldKSB7CiAgICAgICAgICAgIGNvbnN0IHsgaW5kZXgwLCBpbmRleDEgfSA9IGVkZ2VEYXRhW2tleV07CiAgICAgICAgICAgIF92MC5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uQXR0ciwgaW5kZXgwKTsKICAgICAgICAgICAgX3YxJDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbkF0dHIsIGluZGV4MSk7CiAgICAgICAgICAgIHZlcnRpY2VzLnB1c2goX3YwLngsIF92MC55LCBfdjAueik7CiAgICAgICAgICAgIHZlcnRpY2VzLnB1c2goX3YxJDEueCwgX3YxJDEueSwgX3YxJDEueik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKHZlcnRpY2VzLCAzKSk7CiAgICAgIH0KICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgc291cmNlLnBhcmFtZXRlcnMpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIFNoYXBlID0gY2xhc3MgU2hhcGUgZXh0ZW5kcyBQYXRoIHsKICAgIGNvbnN0cnVjdG9yKHBvaW50cykgewogICAgICBzdXBlcihwb2ludHMpOwogICAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVVVSUQoKTsKICAgICAgdGhpcy50eXBlID0gIlNoYXBlIjsKICAgICAgdGhpcy5ob2xlcyA9IFtdOwogICAgfQogICAgZ2V0UG9pbnRzSG9sZXMoZGl2aXNpb25zKSB7CiAgICAgIGNvbnN0IGhvbGVzUHRzID0gW107CiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5ob2xlcy5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgIGhvbGVzUHRzW2ldID0gdGhpcy5ob2xlc1tpXS5nZXRQb2ludHMoZGl2aXNpb25zKTsKICAgICAgfQogICAgICByZXR1cm4gaG9sZXNQdHM7CiAgICB9CiAgICBleHRyYWN0UG9pbnRzKGRpdmlzaW9ucykgewogICAgICByZXR1cm4gewogICAgICAgIHNoYXBlOiB0aGlzLmdldFBvaW50cyhkaXZpc2lvbnMpLAogICAgICAgIGhvbGVzOiB0aGlzLmdldFBvaW50c0hvbGVzKGRpdmlzaW9ucykKICAgICAgfTsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5ob2xlcyA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHNvdXJjZS5ob2xlcy5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgIGNvbnN0IGhvbGUgPSBzb3VyY2UuaG9sZXNbaV07CiAgICAgICAgdGhpcy5ob2xlcy5wdXNoKGhvbGUuY2xvbmUoKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0b0pTT04oKSB7CiAgICAgIGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTsKICAgICAgZGF0YS51dWlkID0gdGhpcy51dWlkOwogICAgICBkYXRhLmhvbGVzID0gW107CiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5ob2xlcy5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgIGNvbnN0IGhvbGUgPSB0aGlzLmhvbGVzW2ldOwogICAgICAgIGRhdGEuaG9sZXMucHVzaChob2xlLnRvSlNPTigpKTsKICAgICAgfQogICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIGZyb21KU09OKGpzb24pIHsKICAgICAgc3VwZXIuZnJvbUpTT04oanNvbik7CiAgICAgIHRoaXMudXVpZCA9IGpzb24udXVpZDsKICAgICAgdGhpcy5ob2xlcyA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGpzb24uaG9sZXMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICBjb25zdCBob2xlID0ganNvbi5ob2xlc1tpXTsKICAgICAgICB0aGlzLmhvbGVzLnB1c2gobmV3IFBhdGgoKS5mcm9tSlNPTihob2xlKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBFYXJjdXQgPSB7CiAgICB0cmlhbmd1bGF0ZTogZnVuY3Rpb24oZGF0YSwgaG9sZUluZGljZXMsIGRpbSA9IDIpIHsKICAgICAgY29uc3QgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGg7CiAgICAgIGNvbnN0IG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoOwogICAgICBsZXQgb3V0ZXJOb2RlID0gbGlua2VkTGlzdChkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlKTsKICAgICAgY29uc3QgdHJpYW5nbGVzID0gW107CiAgICAgIGlmICghb3V0ZXJOb2RlIHx8IG91dGVyTm9kZS5uZXh0ID09PSBvdXRlck5vZGUucHJldikKICAgICAgICByZXR1cm4gdHJpYW5nbGVzOwogICAgICBsZXQgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgeCwgeSwgaW52U2l6ZTsKICAgICAgaWYgKGhhc0hvbGVzKQogICAgICAgIG91dGVyTm9kZSA9IGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSk7CiAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDgwICogZGltKSB7CiAgICAgICAgbWluWCA9IG1heFggPSBkYXRhWzBdOwogICAgICAgIG1pblkgPSBtYXhZID0gZGF0YVsxXTsKICAgICAgICBmb3IgKGxldCBpID0gZGltO2kgPCBvdXRlckxlbjsgaSArPSBkaW0pIHsKICAgICAgICAgIHggPSBkYXRhW2ldOwogICAgICAgICAgeSA9IGRhdGFbaSArIDFdOwogICAgICAgICAgaWYgKHggPCBtaW5YKQogICAgICAgICAgICBtaW5YID0geDsKICAgICAgICAgIGlmICh5IDwgbWluWSkKICAgICAgICAgICAgbWluWSA9IHk7CiAgICAgICAgICBpZiAoeCA+IG1heFgpCiAgICAgICAgICAgIG1heFggPSB4OwogICAgICAgICAgaWYgKHkgPiBtYXhZKQogICAgICAgICAgICBtYXhZID0geTsKICAgICAgICB9CiAgICAgICAgaW52U2l6ZSA9IE1hdGgubWF4KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7CiAgICAgICAgaW52U2l6ZSA9IGludlNpemUgIT09IDAgPyAzMjc2NyAvIGludlNpemUgOiAwOwogICAgICB9CiAgICAgIGVhcmN1dExpbmtlZChvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAwKTsKICAgICAgcmV0dXJuIHRyaWFuZ2xlczsKICAgIH0KICB9OwogIEV4dHJ1ZGVHZW9tZXRyeSA9IGNsYXNzIEV4dHJ1ZGVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHsKICAgIGNvbnN0cnVjdG9yKHNoYXBlcyA9IG5ldyBTaGFwZShbbmV3IFZlY3RvcjIoMC41LCAwLjUpLCBuZXcgVmVjdG9yMigtMC41LCAwLjUpLCBuZXcgVmVjdG9yMigtMC41LCAtMC41KSwgbmV3IFZlY3RvcjIoMC41LCAtMC41KV0pLCBvcHRpb25zID0ge30pIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy50eXBlID0gIkV4dHJ1ZGVHZW9tZXRyeSI7CiAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICBzaGFwZXMsCiAgICAgICAgb3B0aW9ucwogICAgICB9OwogICAgICBzaGFwZXMgPSBBcnJheS5pc0FycmF5KHNoYXBlcykgPyBzaGFwZXMgOiBbc2hhcGVzXTsKICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzOwogICAgICBjb25zdCB2ZXJ0aWNlc0FycmF5ID0gW107CiAgICAgIGNvbnN0IHV2QXJyYXkgPSBbXTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICBjb25zdCBzaGFwZSA9IHNoYXBlc1tpXTsKICAgICAgICBhZGRTaGFwZShzaGFwZSk7CiAgICAgIH0KICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUodmVydGljZXNBcnJheSwgMykpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh1dkFycmF5LCAyKSk7CiAgICAgIHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTsKICAgICAgZnVuY3Rpb24gYWRkU2hhcGUoc2hhcGUpIHsKICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9IFtdOwogICAgICAgIGNvbnN0IGN1cnZlU2VnbWVudHMgPSBvcHRpb25zLmN1cnZlU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY3VydmVTZWdtZW50cyA6IDEyOwogICAgICAgIGNvbnN0IHN0ZXBzID0gb3B0aW9ucy5zdGVwcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zdGVwcyA6IDE7CiAgICAgICAgY29uc3QgZGVwdGggPSBvcHRpb25zLmRlcHRoICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlcHRoIDogMTsKICAgICAgICBsZXQgYmV2ZWxFbmFibGVkID0gb3B0aW9ucy5iZXZlbEVuYWJsZWQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxFbmFibGVkIDogdHJ1ZTsKICAgICAgICBsZXQgYmV2ZWxUaGlja25lc3MgPSBvcHRpb25zLmJldmVsVGhpY2tuZXNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsVGhpY2tuZXNzIDogMC4yOwogICAgICAgIGxldCBiZXZlbFNpemUgPSBvcHRpb25zLmJldmVsU2l6ZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFNpemUgOiBiZXZlbFRoaWNrbmVzcyAtIDAuMTsKICAgICAgICBsZXQgYmV2ZWxPZmZzZXQgPSBvcHRpb25zLmJldmVsT2Zmc2V0ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsT2Zmc2V0IDogMDsKICAgICAgICBsZXQgYmV2ZWxTZWdtZW50cyA9IG9wdGlvbnMuYmV2ZWxTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFNlZ21lbnRzIDogMzsKICAgICAgICBjb25zdCBleHRydWRlUGF0aCA9IG9wdGlvbnMuZXh0cnVkZVBhdGg7CiAgICAgICAgY29uc3QgdXZnZW4gPSBvcHRpb25zLlVWR2VuZXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLlVWR2VuZXJhdG9yIDogV29ybGRVVkdlbmVyYXRvcjsKICAgICAgICBsZXQgZXh0cnVkZVB0cywgZXh0cnVkZUJ5UGF0aCA9IGZhbHNlOwogICAgICAgIGxldCBzcGxpbmVUdWJlLCBiaW5vcm1hbCwgbm9ybWFsLCBwb3NpdGlvbjI7CiAgICAgICAgaWYgKGV4dHJ1ZGVQYXRoKSB7CiAgICAgICAgICBleHRydWRlUHRzID0gZXh0cnVkZVBhdGguZ2V0U3BhY2VkUG9pbnRzKHN0ZXBzKTsKICAgICAgICAgIGV4dHJ1ZGVCeVBhdGggPSB0cnVlOwogICAgICAgICAgYmV2ZWxFbmFibGVkID0gZmFsc2U7CiAgICAgICAgICBzcGxpbmVUdWJlID0gZXh0cnVkZVBhdGguY29tcHV0ZUZyZW5ldEZyYW1lcyhzdGVwcywgZmFsc2UpOwogICAgICAgICAgYmlub3JtYWwgPSBuZXcgVmVjdG9yMzsKICAgICAgICAgIG5vcm1hbCA9IG5ldyBWZWN0b3IzOwogICAgICAgICAgcG9zaXRpb24yID0gbmV3IFZlY3RvcjM7CiAgICAgICAgfQogICAgICAgIGlmICghYmV2ZWxFbmFibGVkKSB7CiAgICAgICAgICBiZXZlbFNlZ21lbnRzID0gMDsKICAgICAgICAgIGJldmVsVGhpY2tuZXNzID0gMDsKICAgICAgICAgIGJldmVsU2l6ZSA9IDA7CiAgICAgICAgICBiZXZlbE9mZnNldCA9IDA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHNoYXBlUG9pbnRzID0gc2hhcGUuZXh0cmFjdFBvaW50cyhjdXJ2ZVNlZ21lbnRzKTsKICAgICAgICBsZXQgdmVydGljZXMgPSBzaGFwZVBvaW50cy5zaGFwZTsKICAgICAgICBjb25zdCBob2xlcyA9IHNoYXBlUG9pbnRzLmhvbGVzOwogICAgICAgIGNvbnN0IHJldmVyc2UgPSAhU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSh2ZXJ0aWNlcyk7CiAgICAgICAgaWYgKHJldmVyc2UpIHsKICAgICAgICAgIHZlcnRpY2VzID0gdmVydGljZXMucmV2ZXJzZSgpOwogICAgICAgICAgZm9yIChsZXQgaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoO2ggPCBobDsgaCsrKSB7CiAgICAgICAgICAgIGNvbnN0IGFob2xlID0gaG9sZXNbaF07CiAgICAgICAgICAgIGlmIChTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKGFob2xlKSkgewogICAgICAgICAgICAgIGhvbGVzW2hdID0gYWhvbGUucmV2ZXJzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKHZlcnRpY2VzLCBob2xlcyk7CiAgICAgICAgY29uc3QgY29udG91ciA9IHZlcnRpY2VzOwogICAgICAgIGZvciAobGV0IGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDtoIDwgaGw7IGgrKykgewogICAgICAgICAgY29uc3QgYWhvbGUgPSBob2xlc1toXTsKICAgICAgICAgIHZlcnRpY2VzID0gdmVydGljZXMuY29uY2F0KGFob2xlKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gc2NhbGVQdDIocHQsIHZlYywgc2l6ZSkgewogICAgICAgICAgaWYgKCF2ZWMpCiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0Iik7CiAgICAgICAgICByZXR1cm4gcHQuY2xvbmUoKS5hZGRTY2FsZWRWZWN0b3IodmVjLCBzaXplKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdmxlbiA9IHZlcnRpY2VzLmxlbmd0aCwgZmxlbiA9IGZhY2VzLmxlbmd0aDsKICAgICAgICBmdW5jdGlvbiBnZXRCZXZlbFZlYyhpblB0LCBpblByZXYsIGluTmV4dCkgewogICAgICAgICAgbGV0IHZfdHJhbnNfeCwgdl90cmFuc195LCBzaHJpbmtfYnk7CiAgICAgICAgICBjb25zdCB2X3ByZXZfeCA9IGluUHQueCAtIGluUHJldi54LCB2X3ByZXZfeSA9IGluUHQueSAtIGluUHJldi55OwogICAgICAgICAgY29uc3Qgdl9uZXh0X3ggPSBpbk5leHQueCAtIGluUHQueCwgdl9uZXh0X3kgPSBpbk5leHQueSAtIGluUHQueTsKICAgICAgICAgIGNvbnN0IHZfcHJldl9sZW5zcSA9IHZfcHJldl94ICogdl9wcmV2X3ggKyB2X3ByZXZfeSAqIHZfcHJldl95OwogICAgICAgICAgY29uc3QgY29sbGluZWFyMCA9IHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94OwogICAgICAgICAgaWYgKE1hdGguYWJzKGNvbGxpbmVhcjApID4gTnVtYmVyLkVQU0lMT04pIHsKICAgICAgICAgICAgY29uc3Qgdl9wcmV2X2xlbiA9IE1hdGguc3FydCh2X3ByZXZfbGVuc3EpOwogICAgICAgICAgICBjb25zdCB2X25leHRfbGVuID0gTWF0aC5zcXJ0KHZfbmV4dF94ICogdl9uZXh0X3ggKyB2X25leHRfeSAqIHZfbmV4dF95KTsKICAgICAgICAgICAgY29uc3QgcHRQcmV2U2hpZnRfeCA9IGluUHJldi54IC0gdl9wcmV2X3kgLyB2X3ByZXZfbGVuOwogICAgICAgICAgICBjb25zdCBwdFByZXZTaGlmdF95ID0gaW5QcmV2LnkgKyB2X3ByZXZfeCAvIHZfcHJldl9sZW47CiAgICAgICAgICAgIGNvbnN0IHB0TmV4dFNoaWZ0X3ggPSBpbk5leHQueCAtIHZfbmV4dF95IC8gdl9uZXh0X2xlbjsKICAgICAgICAgICAgY29uc3QgcHROZXh0U2hpZnRfeSA9IGluTmV4dC55ICsgdl9uZXh0X3ggLyB2X25leHRfbGVuOwogICAgICAgICAgICBjb25zdCBzZiA9ICgocHROZXh0U2hpZnRfeCAtIHB0UHJldlNoaWZ0X3gpICogdl9uZXh0X3kgLSAocHROZXh0U2hpZnRfeSAtIHB0UHJldlNoaWZ0X3kpICogdl9uZXh0X3gpIC8gKHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94KTsKICAgICAgICAgICAgdl90cmFuc194ID0gcHRQcmV2U2hpZnRfeCArIHZfcHJldl94ICogc2YgLSBpblB0Lng7CiAgICAgICAgICAgIHZfdHJhbnNfeSA9IHB0UHJldlNoaWZ0X3kgKyB2X3ByZXZfeSAqIHNmIC0gaW5QdC55OwogICAgICAgICAgICBjb25zdCB2X3RyYW5zX2xlbnNxID0gdl90cmFuc194ICogdl90cmFuc194ICsgdl90cmFuc195ICogdl90cmFuc195OwogICAgICAgICAgICBpZiAodl90cmFuc19sZW5zcSA8PSAyKSB7CiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWZWN0b3IyKHZfdHJhbnNfeCwgdl90cmFuc195KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzaHJpbmtfYnkgPSBNYXRoLnNxcnQodl90cmFuc19sZW5zcSAvIDIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZXQgZGlyZWN0aW9uX2VxID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh2X3ByZXZfeCA+IE51bWJlci5FUFNJTE9OKSB7CiAgICAgICAgICAgICAgaWYgKHZfbmV4dF94ID4gTnVtYmVyLkVQU0lMT04pIHsKICAgICAgICAgICAgICAgIGRpcmVjdGlvbl9lcSA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmICh2X3ByZXZfeCA8IC1OdW1iZXIuRVBTSUxPTikgewogICAgICAgICAgICAgICAgaWYgKHZfbmV4dF94IDwgLU51bWJlci5FUFNJTE9OKSB7CiAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbl9lcSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChNYXRoLnNpZ24odl9wcmV2X3kpID09PSBNYXRoLnNpZ24odl9uZXh0X3kpKSB7CiAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbl9lcSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkaXJlY3Rpb25fZXEpIHsKICAgICAgICAgICAgICB2X3RyYW5zX3ggPSAtdl9wcmV2X3k7CiAgICAgICAgICAgICAgdl90cmFuc195ID0gdl9wcmV2X3g7CiAgICAgICAgICAgICAgc2hyaW5rX2J5ID0gTWF0aC5zcXJ0KHZfcHJldl9sZW5zcSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdl90cmFuc194ID0gdl9wcmV2X3g7CiAgICAgICAgICAgICAgdl90cmFuc195ID0gdl9wcmV2X3k7CiAgICAgICAgICAgICAgc2hyaW5rX2J5ID0gTWF0aC5zcXJ0KHZfcHJldl9sZW5zcSAvIDIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjIodl90cmFuc194IC8gc2hyaW5rX2J5LCB2X3RyYW5zX3kgLyBzaHJpbmtfYnkpOwogICAgICAgIH0KICAgICAgICBjb25zdCBjb250b3VyTW92ZW1lbnRzID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBpICsgMTtpIDwgaWw7IGkrKywgaisrLCBrKyspIHsKICAgICAgICAgIGlmIChqID09PSBpbCkKICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICBpZiAoayA9PT0gaWwpCiAgICAgICAgICAgIGsgPSAwOwogICAgICAgICAgY29udG91ck1vdmVtZW50c1tpXSA9IGdldEJldmVsVmVjKGNvbnRvdXJbaV0sIGNvbnRvdXJbal0sIGNvbnRvdXJba10pOwogICAgICAgIH0KICAgICAgICBjb25zdCBob2xlc01vdmVtZW50cyA9IFtdOwogICAgICAgIGxldCBvbmVIb2xlTW92ZW1lbnRzLCB2ZXJ0aWNlc01vdmVtZW50cyA9IGNvbnRvdXJNb3ZlbWVudHMuY29uY2F0KCk7CiAgICAgICAgZm9yIChsZXQgaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoO2ggPCBobDsgaCsrKSB7CiAgICAgICAgICBjb25zdCBhaG9sZSA9IGhvbGVzW2hdOwogICAgICAgICAgb25lSG9sZU1vdmVtZW50cyA9IFtdOwogICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoLCBqID0gaWwgLSAxLCBrID0gaSArIDE7aSA8IGlsOyBpKyssIGorKywgaysrKSB7CiAgICAgICAgICAgIGlmIChqID09PSBpbCkKICAgICAgICAgICAgICBqID0gMDsKICAgICAgICAgICAgaWYgKGsgPT09IGlsKQogICAgICAgICAgICAgIGsgPSAwOwogICAgICAgICAgICBvbmVIb2xlTW92ZW1lbnRzW2ldID0gZ2V0QmV2ZWxWZWMoYWhvbGVbaV0sIGFob2xlW2pdLCBhaG9sZVtrXSk7CiAgICAgICAgICB9CiAgICAgICAgICBob2xlc01vdmVtZW50cy5wdXNoKG9uZUhvbGVNb3ZlbWVudHMpOwogICAgICAgICAgdmVydGljZXNNb3ZlbWVudHMgPSB2ZXJ0aWNlc01vdmVtZW50cy5jb25jYXQob25lSG9sZU1vdmVtZW50cyk7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGIgPSAwO2IgPCBiZXZlbFNlZ21lbnRzOyBiKyspIHsKICAgICAgICAgIGNvbnN0IHQgPSBiIC8gYmV2ZWxTZWdtZW50czsKICAgICAgICAgIGNvbnN0IHogPSBiZXZlbFRoaWNrbmVzcyAqIE1hdGguY29zKHQgKiBNYXRoLlBJIC8gMik7CiAgICAgICAgICBjb25zdCBiczIgPSBiZXZlbFNpemUgKiBNYXRoLnNpbih0ICogTWF0aC5QSSAvIDIpICsgYmV2ZWxPZmZzZXQ7CiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICAgICAgICBjb25zdCB2ZXJ0ID0gc2NhbGVQdDIoY29udG91cltpXSwgY29udG91ck1vdmVtZW50c1tpXSwgYnMyKTsKICAgICAgICAgICAgdih2ZXJ0LngsIHZlcnQueSwgLXopOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChsZXQgaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoO2ggPCBobDsgaCsrKSB7CiAgICAgICAgICAgIGNvbnN0IGFob2xlID0gaG9sZXNbaF07CiAgICAgICAgICAgIG9uZUhvbGVNb3ZlbWVudHMgPSBob2xlc01vdmVtZW50c1toXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoO2kgPCBpbDsgaSsrKSB7CiAgICAgICAgICAgICAgY29uc3QgdmVydCA9IHNjYWxlUHQyKGFob2xlW2ldLCBvbmVIb2xlTW92ZW1lbnRzW2ldLCBiczIpOwogICAgICAgICAgICAgIHYodmVydC54LCB2ZXJ0LnksIC16KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBicyA9IGJldmVsU2l6ZSArIGJldmVsT2Zmc2V0OwogICAgICAgIGZvciAobGV0IGkgPSAwO2kgPCB2bGVuOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2FsZVB0Mih2ZXJ0aWNlc1tpXSwgdmVydGljZXNNb3ZlbWVudHNbaV0sIGJzKSA6IHZlcnRpY2VzW2ldOwogICAgICAgICAgaWYgKCFleHRydWRlQnlQYXRoKSB7CiAgICAgICAgICAgIHYodmVydC54LCB2ZXJ0LnksIDApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbm9ybWFsLmNvcHkoc3BsaW5lVHViZS5ub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcih2ZXJ0LngpOwogICAgICAgICAgICBiaW5vcm1hbC5jb3B5KHNwbGluZVR1YmUuYmlub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcih2ZXJ0LnkpOwogICAgICAgICAgICBwb3NpdGlvbjIuY29weShleHRydWRlUHRzWzBdKS5hZGQobm9ybWFsKS5hZGQoYmlub3JtYWwpOwogICAgICAgICAgICB2KHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnopOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBzID0gMTtzIDw9IHN0ZXBzOyBzKyspIHsKICAgICAgICAgIGZvciAobGV0IGkgPSAwO2kgPCB2bGVuOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgdmVydCA9IGJldmVsRW5hYmxlZCA/IHNjYWxlUHQyKHZlcnRpY2VzW2ldLCB2ZXJ0aWNlc01vdmVtZW50c1tpXSwgYnMpIDogdmVydGljZXNbaV07CiAgICAgICAgICAgIGlmICghZXh0cnVkZUJ5UGF0aCkgewogICAgICAgICAgICAgIHYodmVydC54LCB2ZXJ0LnksIGRlcHRoIC8gc3RlcHMgKiBzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBub3JtYWwuY29weShzcGxpbmVUdWJlLm5vcm1hbHNbc10pLm11bHRpcGx5U2NhbGFyKHZlcnQueCk7CiAgICAgICAgICAgICAgYmlub3JtYWwuY29weShzcGxpbmVUdWJlLmJpbm9ybWFsc1tzXSkubXVsdGlwbHlTY2FsYXIodmVydC55KTsKICAgICAgICAgICAgICBwb3NpdGlvbjIuY29weShleHRydWRlUHRzW3NdKS5hZGQobm9ybWFsKS5hZGQoYmlub3JtYWwpOwogICAgICAgICAgICAgIHYocG9zaXRpb24yLngsIHBvc2l0aW9uMi55LCBwb3NpdGlvbjIueik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgYiA9IGJldmVsU2VnbWVudHMgLSAxO2IgPj0gMDsgYi0tKSB7CiAgICAgICAgICBjb25zdCB0ID0gYiAvIGJldmVsU2VnbWVudHM7CiAgICAgICAgICBjb25zdCB6ID0gYmV2ZWxUaGlja25lc3MgKiBNYXRoLmNvcyh0ICogTWF0aC5QSSAvIDIpOwogICAgICAgICAgY29uc3QgYnMyID0gYmV2ZWxTaXplICogTWF0aC5zaW4odCAqIE1hdGguUEkgLyAyKSArIGJldmVsT2Zmc2V0OwogICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgdmVydCA9IHNjYWxlUHQyKGNvbnRvdXJbaV0sIGNvbnRvdXJNb3ZlbWVudHNbaV0sIGJzMik7CiAgICAgICAgICAgIHYodmVydC54LCB2ZXJ0LnksIGRlcHRoICsgeik7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGxldCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7aCA8IGhsOyBoKyspIHsKICAgICAgICAgICAgY29uc3QgYWhvbGUgPSBob2xlc1toXTsKICAgICAgICAgICAgb25lSG9sZU1vdmVtZW50cyA9IGhvbGVzTW92ZW1lbnRzW2hdOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgICAgICAgICBjb25zdCB2ZXJ0ID0gc2NhbGVQdDIoYWhvbGVbaV0sIG9uZUhvbGVNb3ZlbWVudHNbaV0sIGJzMik7CiAgICAgICAgICAgICAgaWYgKCFleHRydWRlQnlQYXRoKSB7CiAgICAgICAgICAgICAgICB2KHZlcnQueCwgdmVydC55LCBkZXB0aCArIHopOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2KHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1tzdGVwcyAtIDFdLnksIGV4dHJ1ZGVQdHNbc3RlcHMgLSAxXS54ICsgeik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJ1aWxkTGlkRmFjZXMoKTsKICAgICAgICBidWlsZFNpZGVGYWNlcygpOwogICAgICAgIGZ1bmN0aW9uIGJ1aWxkTGlkRmFjZXMoKSB7CiAgICAgICAgICBjb25zdCBzdGFydCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMzsKICAgICAgICAgIGlmIChiZXZlbEVuYWJsZWQpIHsKICAgICAgICAgICAgbGV0IGxheWVyID0gMDsKICAgICAgICAgICAgbGV0IG9mZnNldCA9IHZsZW4gKiBsYXllcjsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IGZsZW47IGkrKykgewogICAgICAgICAgICAgIGNvbnN0IGZhY2UgPSBmYWNlc1tpXTsKICAgICAgICAgICAgICBmMyhmYWNlWzJdICsgb2Zmc2V0LCBmYWNlWzFdICsgb2Zmc2V0LCBmYWNlWzBdICsgb2Zmc2V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXllciA9IHN0ZXBzICsgYmV2ZWxTZWdtZW50cyAqIDI7CiAgICAgICAgICAgIG9mZnNldCA9IHZsZW4gKiBsYXllcjsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IGZsZW47IGkrKykgewogICAgICAgICAgICAgIGNvbnN0IGZhY2UgPSBmYWNlc1tpXTsKICAgICAgICAgICAgICBmMyhmYWNlWzBdICsgb2Zmc2V0LCBmYWNlWzFdICsgb2Zmc2V0LCBmYWNlWzJdICsgb2Zmc2V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IGZsZW47IGkrKykgewogICAgICAgICAgICAgIGNvbnN0IGZhY2UgPSBmYWNlc1tpXTsKICAgICAgICAgICAgICBmMyhmYWNlWzJdLCBmYWNlWzFdLCBmYWNlWzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgZmxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgY29uc3QgZmFjZSA9IGZhY2VzW2ldOwogICAgICAgICAgICAgIGYzKGZhY2VbMF0gKyB2bGVuICogc3RlcHMsIGZhY2VbMV0gKyB2bGVuICogc3RlcHMsIGZhY2VbMl0gKyB2bGVuICogc3RlcHMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzY29wZS5hZGRHcm91cChzdGFydCwgdmVydGljZXNBcnJheS5sZW5ndGggLyAzIC0gc3RhcnQsIDApOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBidWlsZFNpZGVGYWNlcygpIHsKICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzOwogICAgICAgICAgbGV0IGxheWVyb2Zmc2V0ID0gMDsKICAgICAgICAgIHNpZGV3YWxscyhjb250b3VyLCBsYXllcm9mZnNldCk7CiAgICAgICAgICBsYXllcm9mZnNldCArPSBjb250b3VyLmxlbmd0aDsKICAgICAgICAgIGZvciAobGV0IGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDtoIDwgaGw7IGgrKykgewogICAgICAgICAgICBjb25zdCBhaG9sZSA9IGhvbGVzW2hdOwogICAgICAgICAgICBzaWRld2FsbHMoYWhvbGUsIGxheWVyb2Zmc2V0KTsKICAgICAgICAgICAgbGF5ZXJvZmZzZXQgKz0gYWhvbGUubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgc2NvcGUuYWRkR3JvdXAoc3RhcnQsIHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMyAtIHN0YXJ0LCAxKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gc2lkZXdhbGxzKGNvbnRvdXIyLCBsYXllcm9mZnNldCkgewogICAgICAgICAgbGV0IGkgPSBjb250b3VyMi5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAoLS1pID49IDApIHsKICAgICAgICAgICAgY29uc3QgaiA9IGk7CiAgICAgICAgICAgIGxldCBrID0gaSAtIDE7CiAgICAgICAgICAgIGlmIChrIDwgMCkKICAgICAgICAgICAgICBrID0gY29udG91cjIubGVuZ3RoIC0gMTsKICAgICAgICAgICAgZm9yIChsZXQgcyA9IDAsIHNsID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjtzIDwgc2w7IHMrKykgewogICAgICAgICAgICAgIGNvbnN0IHNsZW4xID0gdmxlbiAqIHM7CiAgICAgICAgICAgICAgY29uc3Qgc2xlbjIgPSB2bGVuICogKHMgKyAxKTsKICAgICAgICAgICAgICBjb25zdCBhID0gbGF5ZXJvZmZzZXQgKyBqICsgc2xlbjEsIGIgPSBsYXllcm9mZnNldCArIGsgKyBzbGVuMSwgYyA9IGxheWVyb2Zmc2V0ICsgayArIHNsZW4yLCBkID0gbGF5ZXJvZmZzZXQgKyBqICsgc2xlbjI7CiAgICAgICAgICAgICAgZjQoYSwgYiwgYywgZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gdih4LCB5LCB6KSB7CiAgICAgICAgICBwbGFjZWhvbGRlci5wdXNoKHgpOwogICAgICAgICAgcGxhY2Vob2xkZXIucHVzaCh5KTsKICAgICAgICAgIHBsYWNlaG9sZGVyLnB1c2goeik7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGYzKGEsIGIsIGMpIHsKICAgICAgICAgIGFkZFZlcnRleChhKTsKICAgICAgICAgIGFkZFZlcnRleChiKTsKICAgICAgICAgIGFkZFZlcnRleChjKTsKICAgICAgICAgIGNvbnN0IG5leHRJbmRleCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMzsKICAgICAgICAgIGNvbnN0IHV2cyA9IHV2Z2VuLmdlbmVyYXRlVG9wVVYoc2NvcGUsIHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAtIDIsIG5leHRJbmRleCAtIDEpOwogICAgICAgICAgYWRkVVYodXZzWzBdKTsKICAgICAgICAgIGFkZFVWKHV2c1sxXSk7CiAgICAgICAgICBhZGRVVih1dnNbMl0pOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBmNChhLCBiLCBjLCBkKSB7CiAgICAgICAgICBhZGRWZXJ0ZXgoYSk7CiAgICAgICAgICBhZGRWZXJ0ZXgoYik7CiAgICAgICAgICBhZGRWZXJ0ZXgoZCk7CiAgICAgICAgICBhZGRWZXJ0ZXgoYik7CiAgICAgICAgICBhZGRWZXJ0ZXgoYyk7CiAgICAgICAgICBhZGRWZXJ0ZXgoZCk7CiAgICAgICAgICBjb25zdCBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7CiAgICAgICAgICBjb25zdCB1dnMgPSB1dmdlbi5nZW5lcmF0ZVNpZGVXYWxsVVYoc2NvcGUsIHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDYsIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAtIDIsIG5leHRJbmRleCAtIDEpOwogICAgICAgICAgYWRkVVYodXZzWzBdKTsKICAgICAgICAgIGFkZFVWKHV2c1sxXSk7CiAgICAgICAgICBhZGRVVih1dnNbM10pOwogICAgICAgICAgYWRkVVYodXZzWzFdKTsKICAgICAgICAgIGFkZFVWKHV2c1syXSk7CiAgICAgICAgICBhZGRVVih1dnNbM10pOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBhZGRWZXJ0ZXgoaW5kZXgpIHsKICAgICAgICAgIHZlcnRpY2VzQXJyYXkucHVzaChwbGFjZWhvbGRlcltpbmRleCAqIDMgKyAwXSk7CiAgICAgICAgICB2ZXJ0aWNlc0FycmF5LnB1c2gocGxhY2Vob2xkZXJbaW5kZXggKiAzICsgMV0pOwogICAgICAgICAgdmVydGljZXNBcnJheS5wdXNoKHBsYWNlaG9sZGVyW2luZGV4ICogMyArIDJdKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYWRkVVYodmVjdG9yMikgewogICAgICAgICAgdXZBcnJheS5wdXNoKHZlY3RvcjIueCk7CiAgICAgICAgICB1dkFycmF5LnB1c2godmVjdG9yMi55KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgc291cmNlLnBhcmFtZXRlcnMpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHRvSlNPTigpIHsKICAgICAgY29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpOwogICAgICBjb25zdCBzaGFwZXMgPSB0aGlzLnBhcmFtZXRlcnMuc2hhcGVzOwogICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnM7CiAgICAgIHJldHVybiB0b0pTT04kMShzaGFwZXMsIG9wdGlvbnMsIGRhdGEpOwogICAgfQogICAgc3RhdGljIGZyb21KU09OKGRhdGEsIHNoYXBlcykgewogICAgICBjb25zdCBnZW9tZXRyeVNoYXBlcyA9IFtdOwogICAgICBmb3IgKGxldCBqID0gMCwgamwgPSBkYXRhLnNoYXBlcy5sZW5ndGg7aiA8IGpsOyBqKyspIHsKICAgICAgICBjb25zdCBzaGFwZSA9IHNoYXBlc1tkYXRhLnNoYXBlc1tqXV07CiAgICAgICAgZ2VvbWV0cnlTaGFwZXMucHVzaChzaGFwZSk7CiAgICAgIH0KICAgICAgY29uc3QgZXh0cnVkZVBhdGggPSBkYXRhLm9wdGlvbnMuZXh0cnVkZVBhdGg7CiAgICAgIGlmIChleHRydWRlUGF0aCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGF0YS5vcHRpb25zLmV4dHJ1ZGVQYXRoID0gbmV3IEN1cnZlc1tleHRydWRlUGF0aC50eXBlXSgpLmZyb21KU09OKGV4dHJ1ZGVQYXRoKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IEV4dHJ1ZGVHZW9tZXRyeShnZW9tZXRyeVNoYXBlcywgZGF0YS5vcHRpb25zKTsKICAgIH0KICB9OwogIFdvcmxkVVZHZW5lcmF0b3IgPSB7CiAgICBnZW5lcmF0ZVRvcFVWOiBmdW5jdGlvbihnZW9tZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMpIHsKICAgICAgY29uc3QgYV94ID0gdmVydGljZXNbaW5kZXhBICogM107CiAgICAgIGNvbnN0IGFfeSA9IHZlcnRpY2VzW2luZGV4QSAqIDMgKyAxXTsKICAgICAgY29uc3QgYl94ID0gdmVydGljZXNbaW5kZXhCICogM107CiAgICAgIGNvbnN0IGJfeSA9IHZlcnRpY2VzW2luZGV4QiAqIDMgKyAxXTsKICAgICAgY29uc3QgY194ID0gdmVydGljZXNbaW5kZXhDICogM107CiAgICAgIGNvbnN0IGNfeSA9IHZlcnRpY2VzW2luZGV4QyAqIDMgKyAxXTsKICAgICAgcmV0dXJuIFsKICAgICAgICBuZXcgVmVjdG9yMihhX3gsIGFfeSksCiAgICAgICAgbmV3IFZlY3RvcjIoYl94LCBiX3kpLAogICAgICAgIG5ldyBWZWN0b3IyKGNfeCwgY195KQogICAgICBdOwogICAgfSwKICAgIGdlbmVyYXRlU2lkZVdhbGxVVjogZnVuY3Rpb24oZ2VvbWV0cnksIHZlcnRpY2VzLCBpbmRleEEsIGluZGV4QiwgaW5kZXhDLCBpbmRleEQpIHsKICAgICAgY29uc3QgYV94ID0gdmVydGljZXNbaW5kZXhBICogM107CiAgICAgIGNvbnN0IGFfeSA9IHZlcnRpY2VzW2luZGV4QSAqIDMgKyAxXTsKICAgICAgY29uc3QgYV96ID0gdmVydGljZXNbaW5kZXhBICogMyArIDJdOwogICAgICBjb25zdCBiX3ggPSB2ZXJ0aWNlc1tpbmRleEIgKiAzXTsKICAgICAgY29uc3QgYl95ID0gdmVydGljZXNbaW5kZXhCICogMyArIDFdOwogICAgICBjb25zdCBiX3ogPSB2ZXJ0aWNlc1tpbmRleEIgKiAzICsgMl07CiAgICAgIGNvbnN0IGNfeCA9IHZlcnRpY2VzW2luZGV4QyAqIDNdOwogICAgICBjb25zdCBjX3kgPSB2ZXJ0aWNlc1tpbmRleEMgKiAzICsgMV07CiAgICAgIGNvbnN0IGNfeiA9IHZlcnRpY2VzW2luZGV4QyAqIDMgKyAyXTsKICAgICAgY29uc3QgZF94ID0gdmVydGljZXNbaW5kZXhEICogM107CiAgICAgIGNvbnN0IGRfeSA9IHZlcnRpY2VzW2luZGV4RCAqIDMgKyAxXTsKICAgICAgY29uc3QgZF96ID0gdmVydGljZXNbaW5kZXhEICogMyArIDJdOwogICAgICBpZiAoTWF0aC5hYnMoYV95IC0gYl95KSA8IE1hdGguYWJzKGFfeCAtIGJfeCkpIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgbmV3IFZlY3RvcjIoYV94LCAxIC0gYV96KSwKICAgICAgICAgIG5ldyBWZWN0b3IyKGJfeCwgMSAtIGJfeiksCiAgICAgICAgICBuZXcgVmVjdG9yMihjX3gsIDEgLSBjX3opLAogICAgICAgICAgbmV3IFZlY3RvcjIoZF94LCAxIC0gZF96KQogICAgICAgIF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgIG5ldyBWZWN0b3IyKGFfeSwgMSAtIGFfeiksCiAgICAgICAgICBuZXcgVmVjdG9yMihiX3ksIDEgLSBiX3opLAogICAgICAgICAgbmV3IFZlY3RvcjIoY195LCAxIC0gY196KSwKICAgICAgICAgIG5ldyBWZWN0b3IyKGRfeSwgMSAtIGRfeikKICAgICAgICBdOwogICAgICB9CiAgICB9CiAgfTsKICBJY29zYWhlZHJvbkdlb21ldHJ5ID0gY2xhc3MgSWNvc2FoZWRyb25HZW9tZXRyeSBleHRlbmRzIFBvbHloZWRyb25HZW9tZXRyeSB7CiAgICBjb25zdHJ1Y3RvcihyYWRpdXMgPSAxLCBkZXRhaWwgPSAwKSB7CiAgICAgIGNvbnN0IHQgPSAoMSArIE1hdGguc3FydCg1KSkgLyAyOwogICAgICBjb25zdCB2ZXJ0aWNlcyA9IFsKICAgICAgICAtMSwKICAgICAgICB0LAogICAgICAgIDAsCiAgICAgICAgMSwKICAgICAgICB0LAogICAgICAgIDAsCiAgICAgICAgLTEsCiAgICAgICAgLXQsCiAgICAgICAgMCwKICAgICAgICAxLAogICAgICAgIC10LAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAtMSwKICAgICAgICB0LAogICAgICAgIDAsCiAgICAgICAgMSwKICAgICAgICB0LAogICAgICAgIDAsCiAgICAgICAgLTEsCiAgICAgICAgLXQsCiAgICAgICAgMCwKICAgICAgICAxLAogICAgICAgIC10LAogICAgICAgIHQsCiAgICAgICAgMCwKICAgICAgICAtMSwKICAgICAgICB0LAogICAgICAgIDAsCiAgICAgICAgMSwKICAgICAgICAtdCwKICAgICAgICAwLAogICAgICAgIC0xLAogICAgICAgIC10LAogICAgICAgIDAsCiAgICAgICAgMQogICAgICBdOwogICAgICBjb25zdCBpbmRpY2VzID0gWwogICAgICAgIDAsCiAgICAgICAgMTEsCiAgICAgICAgNSwKICAgICAgICAwLAogICAgICAgIDUsCiAgICAgICAgMSwKICAgICAgICAwLAogICAgICAgIDEsCiAgICAgICAgNywKICAgICAgICAwLAogICAgICAgIDcsCiAgICAgICAgMTAsCiAgICAgICAgMCwKICAgICAgICAxMCwKICAgICAgICAxMSwKICAgICAgICAxLAogICAgICAgIDUsCiAgICAgICAgOSwKICAgICAgICA1LAogICAgICAgIDExLAogICAgICAgIDQsCiAgICAgICAgMTEsCiAgICAgICAgMTAsCiAgICAgICAgMiwKICAgICAgICAxMCwKICAgICAgICA3LAogICAgICAgIDYsCiAgICAgICAgNywKICAgICAgICAxLAogICAgICAgIDgsCiAgICAgICAgMywKICAgICAgICA5LAogICAgICAgIDQsCiAgICAgICAgMywKICAgICAgICA0LAogICAgICAgIDIsCiAgICAgICAgMywKICAgICAgICAyLAogICAgICAgIDYsCiAgICAgICAgMywKICAgICAgICA2LAogICAgICAgIDgsCiAgICAgICAgMywKICAgICAgICA4LAogICAgICAgIDksCiAgICAgICAgNCwKICAgICAgICA5LAogICAgICAgIDUsCiAgICAgICAgMiwKICAgICAgICA0LAogICAgICAgIDExLAogICAgICAgIDYsCiAgICAgICAgMiwKICAgICAgICAxMCwKICAgICAgICA4LAogICAgICAgIDYsCiAgICAgICAgNywKICAgICAgICA5LAogICAgICAgIDgsCiAgICAgICAgMQogICAgICBdOwogICAgICBzdXBlcih2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwpOwogICAgICB0aGlzLnR5cGUgPSAiSWNvc2FoZWRyb25HZW9tZXRyeSI7CiAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICByYWRpdXMsCiAgICAgICAgZGV0YWlsCiAgICAgIH07CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04oZGF0YSkgewogICAgICByZXR1cm4gbmV3IEljb3NhaGVkcm9uR2VvbWV0cnkoZGF0YS5yYWRpdXMsIGRhdGEuZGV0YWlsKTsKICAgIH0KICB9OwogIE9jdGFoZWRyb25HZW9tZXRyeSA9IGNsYXNzIE9jdGFoZWRyb25HZW9tZXRyeSBleHRlbmRzIFBvbHloZWRyb25HZW9tZXRyeSB7CiAgICBjb25zdHJ1Y3RvcihyYWRpdXMgPSAxLCBkZXRhaWwgPSAwKSB7CiAgICAgIGNvbnN0IHZlcnRpY2VzID0gWwogICAgICAgIDEsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIC0xLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDEsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIC0xLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDEsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIC0xCiAgICAgIF07CiAgICAgIGNvbnN0IGluZGljZXMgPSBbCiAgICAgICAgMCwKICAgICAgICAyLAogICAgICAgIDQsCiAgICAgICAgMCwKICAgICAgICA0LAogICAgICAgIDMsCiAgICAgICAgMCwKICAgICAgICAzLAogICAgICAgIDUsCiAgICAgICAgMCwKICAgICAgICA1LAogICAgICAgIDIsCiAgICAgICAgMSwKICAgICAgICAyLAogICAgICAgIDUsCiAgICAgICAgMSwKICAgICAgICA1LAogICAgICAgIDMsCiAgICAgICAgMSwKICAgICAgICAzLAogICAgICAgIDQsCiAgICAgICAgMSwKICAgICAgICA0LAogICAgICAgIDIKICAgICAgXTsKICAgICAgc3VwZXIodmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsKTsKICAgICAgdGhpcy50eXBlID0gIk9jdGFoZWRyb25HZW9tZXRyeSI7CiAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICByYWRpdXMsCiAgICAgICAgZGV0YWlsCiAgICAgIH07CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04oZGF0YSkgewogICAgICByZXR1cm4gbmV3IE9jdGFoZWRyb25HZW9tZXRyeShkYXRhLnJhZGl1cywgZGF0YS5kZXRhaWwpOwogICAgfQogIH07CiAgUGxhbmVHZW9tZXRyeSA9IGNsYXNzIFBsYW5lR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7CiAgICBjb25zdHJ1Y3Rvcih3aWR0aCA9IDEsIGhlaWdodCA9IDEsIHdpZHRoU2VnbWVudHMgPSAxLCBoZWlnaHRTZWdtZW50cyA9IDEpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy50eXBlID0gIlBsYW5lR2VvbWV0cnkiOwogICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0LAogICAgICAgIHdpZHRoU2VnbWVudHMsCiAgICAgICAgaGVpZ2h0U2VnbWVudHMKICAgICAgfTsKICAgICAgY29uc3Qgd2lkdGhfaGFsZiA9IHdpZHRoIC8gMjsKICAgICAgY29uc3QgaGVpZ2h0X2hhbGYgPSBoZWlnaHQgLyAyOwogICAgICBjb25zdCBncmlkWCA9IE1hdGguZmxvb3Iod2lkdGhTZWdtZW50cyk7CiAgICAgIGNvbnN0IGdyaWRZID0gTWF0aC5mbG9vcihoZWlnaHRTZWdtZW50cyk7CiAgICAgIGNvbnN0IGdyaWRYMSA9IGdyaWRYICsgMTsKICAgICAgY29uc3QgZ3JpZFkxID0gZ3JpZFkgKyAxOwogICAgICBjb25zdCBzZWdtZW50X3dpZHRoID0gd2lkdGggLyBncmlkWDsKICAgICAgY29uc3Qgc2VnbWVudF9oZWlnaHQgPSBoZWlnaHQgLyBncmlkWTsKICAgICAgY29uc3QgaW5kaWNlcyA9IFtdOwogICAgICBjb25zdCB2ZXJ0aWNlcyA9IFtdOwogICAgICBjb25zdCBub3JtYWxzID0gW107CiAgICAgIGNvbnN0IHV2cyA9IFtdOwogICAgICBmb3IgKGxldCBpeSA9IDA7aXkgPCBncmlkWTE7IGl5KyspIHsKICAgICAgICBjb25zdCB5ID0gaXkgKiBzZWdtZW50X2hlaWdodCAtIGhlaWdodF9oYWxmOwogICAgICAgIGZvciAobGV0IGl4ID0gMDtpeCA8IGdyaWRYMTsgaXgrKykgewogICAgICAgICAgY29uc3QgeCA9IGl4ICogc2VnbWVudF93aWR0aCAtIHdpZHRoX2hhbGY7CiAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKHgsIC15LCAwKTsKICAgICAgICAgIG5vcm1hbHMucHVzaCgwLCAwLCAxKTsKICAgICAgICAgIHV2cy5wdXNoKGl4IC8gZ3JpZFgpOwogICAgICAgICAgdXZzLnB1c2goMSAtIGl5IC8gZ3JpZFkpOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGxldCBpeSA9IDA7aXkgPCBncmlkWTsgaXkrKykgewogICAgICAgIGZvciAobGV0IGl4ID0gMDtpeCA8IGdyaWRYOyBpeCsrKSB7CiAgICAgICAgICBjb25zdCBhID0gaXggKyBncmlkWDEgKiBpeTsKICAgICAgICAgIGNvbnN0IGIgPSBpeCArIGdyaWRYMSAqIChpeSArIDEpOwogICAgICAgICAgY29uc3QgYyA9IGl4ICsgMSArIGdyaWRYMSAqIChpeSArIDEpOwogICAgICAgICAgY29uc3QgZCA9IGl4ICsgMSArIGdyaWRYMSAqIGl5OwogICAgICAgICAgaW5kaWNlcy5wdXNoKGEsIGIsIGQpOwogICAgICAgICAgaW5kaWNlcy5wdXNoKGIsIGMsIGQpOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLnNldEluZGV4KGluZGljZXMpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh2ZXJ0aWNlcywgMykpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUobm9ybWFscywgMykpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh1dnMsIDIpKTsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgc291cmNlLnBhcmFtZXRlcnMpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHN0YXRpYyBmcm9tSlNPTihkYXRhKSB7CiAgICAgIHJldHVybiBuZXcgUGxhbmVHZW9tZXRyeShkYXRhLndpZHRoLCBkYXRhLmhlaWdodCwgZGF0YS53aWR0aFNlZ21lbnRzLCBkYXRhLmhlaWdodFNlZ21lbnRzKTsKICAgIH0KICB9OwogIFJpbmdHZW9tZXRyeSA9IGNsYXNzIFJpbmdHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHsKICAgIGNvbnN0cnVjdG9yKGlubmVyUmFkaXVzID0gMC41LCBvdXRlclJhZGl1cyA9IDEsIHRoZXRhU2VnbWVudHMgPSAzMiwgcGhpU2VnbWVudHMgPSAxLCB0aGV0YVN0YXJ0ID0gMCwgdGhldGFMZW5ndGggPSBNYXRoLlBJICogMikgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLnR5cGUgPSAiUmluZ0dlb21ldHJ5IjsKICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gewogICAgICAgIGlubmVyUmFkaXVzLAogICAgICAgIG91dGVyUmFkaXVzLAogICAgICAgIHRoZXRhU2VnbWVudHMsCiAgICAgICAgcGhpU2VnbWVudHMsCiAgICAgICAgdGhldGFTdGFydCwKICAgICAgICB0aGV0YUxlbmd0aAogICAgICB9OwogICAgICB0aGV0YVNlZ21lbnRzID0gTWF0aC5tYXgoMywgdGhldGFTZWdtZW50cyk7CiAgICAgIHBoaVNlZ21lbnRzID0gTWF0aC5tYXgoMSwgcGhpU2VnbWVudHMpOwogICAgICBjb25zdCBpbmRpY2VzID0gW107CiAgICAgIGNvbnN0IHZlcnRpY2VzID0gW107CiAgICAgIGNvbnN0IG5vcm1hbHMgPSBbXTsKICAgICAgY29uc3QgdXZzID0gW107CiAgICAgIGxldCByYWRpdXMgPSBpbm5lclJhZGl1czsKICAgICAgY29uc3QgcmFkaXVzU3RlcCA9IChvdXRlclJhZGl1cyAtIGlubmVyUmFkaXVzKSAvIHBoaVNlZ21lbnRzOwogICAgICBjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMzsKICAgICAgY29uc3QgdXYgPSBuZXcgVmVjdG9yMjsKICAgICAgZm9yIChsZXQgaiA9IDA7aiA8PSBwaGlTZWdtZW50czsgaisrKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8PSB0aGV0YVNlZ21lbnRzOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgaSAvIHRoZXRhU2VnbWVudHMgKiB0aGV0YUxlbmd0aDsKICAgICAgICAgIHZlcnRleC54ID0gcmFkaXVzICogTWF0aC5jb3Moc2VnbWVudCk7CiAgICAgICAgICB2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguc2luKHNlZ21lbnQpOwogICAgICAgICAgdmVydGljZXMucHVzaCh2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56KTsKICAgICAgICAgIG5vcm1hbHMucHVzaCgwLCAwLCAxKTsKICAgICAgICAgIHV2LnggPSAodmVydGV4LnggLyBvdXRlclJhZGl1cyArIDEpIC8gMjsKICAgICAgICAgIHV2LnkgPSAodmVydGV4LnkgLyBvdXRlclJhZGl1cyArIDEpIC8gMjsKICAgICAgICAgIHV2cy5wdXNoKHV2LngsIHV2LnkpOwogICAgICAgIH0KICAgICAgICByYWRpdXMgKz0gcmFkaXVzU3RlcDsKICAgICAgfQogICAgICBmb3IgKGxldCBqID0gMDtqIDwgcGhpU2VnbWVudHM7IGorKykgewogICAgICAgIGNvbnN0IHRoZXRhU2VnbWVudExldmVsID0gaiAqICh0aGV0YVNlZ21lbnRzICsgMSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IHRoZXRhU2VnbWVudHM7IGkrKykgewogICAgICAgICAgY29uc3Qgc2VnbWVudCA9IGkgKyB0aGV0YVNlZ21lbnRMZXZlbDsKICAgICAgICAgIGNvbnN0IGEgPSBzZWdtZW50OwogICAgICAgICAgY29uc3QgYiA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMTsKICAgICAgICAgIGNvbnN0IGMgPSBzZWdtZW50ICsgdGhldGFTZWdtZW50cyArIDI7CiAgICAgICAgICBjb25zdCBkID0gc2VnbWVudCArIDE7CiAgICAgICAgICBpbmRpY2VzLnB1c2goYSwgYiwgZCk7CiAgICAgICAgICBpbmRpY2VzLnB1c2goYiwgYywgZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuc2V0SW5kZXgoaW5kaWNlcyk7CiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKHZlcnRpY2VzLCAzKSk7CiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShub3JtYWxzLCAzKSk7CiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKHV2cywgMikpOwogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBzb3VyY2UucGFyYW1ldGVycyk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc3RhdGljIGZyb21KU09OKGRhdGEpIHsKICAgICAgcmV0dXJuIG5ldyBSaW5nR2VvbWV0cnkoZGF0YS5pbm5lclJhZGl1cywgZGF0YS5vdXRlclJhZGl1cywgZGF0YS50aGV0YVNlZ21lbnRzLCBkYXRhLnBoaVNlZ21lbnRzLCBkYXRhLnRoZXRhU3RhcnQsIGRhdGEudGhldGFMZW5ndGgpOwogICAgfQogIH07CiAgU2hhcGVHZW9tZXRyeSA9IGNsYXNzIFNoYXBlR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7CiAgICBjb25zdHJ1Y3RvcihzaGFwZXMgPSBuZXcgU2hhcGUoW25ldyBWZWN0b3IyKDAsIDAuNSksIG5ldyBWZWN0b3IyKC0wLjUsIC0wLjUpLCBuZXcgVmVjdG9yMigwLjUsIC0wLjUpXSksIGN1cnZlU2VnbWVudHMgPSAxMikgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLnR5cGUgPSAiU2hhcGVHZW9tZXRyeSI7CiAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICBzaGFwZXMsCiAgICAgICAgY3VydmVTZWdtZW50cwogICAgICB9OwogICAgICBjb25zdCBpbmRpY2VzID0gW107CiAgICAgIGNvbnN0IHZlcnRpY2VzID0gW107CiAgICAgIGNvbnN0IG5vcm1hbHMgPSBbXTsKICAgICAgY29uc3QgdXZzID0gW107CiAgICAgIGxldCBncm91cFN0YXJ0ID0gMDsKICAgICAgbGV0IGdyb3VwQ291bnQgPSAwOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShzaGFwZXMpID09PSBmYWxzZSkgewogICAgICAgIGFkZFNoYXBlKHNoYXBlcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IHNoYXBlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgYWRkU2hhcGUoc2hhcGVzW2ldKTsKICAgICAgICAgIHRoaXMuYWRkR3JvdXAoZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgaSk7CiAgICAgICAgICBncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7CiAgICAgICAgICBncm91cENvdW50ID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5zZXRJbmRleChpbmRpY2VzKTsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUodmVydGljZXMsIDMpKTsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKG5vcm1hbHMsIDMpKTsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoInV2IiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUodXZzLCAyKSk7CiAgICAgIGZ1bmN0aW9uIGFkZFNoYXBlKHNoYXBlKSB7CiAgICAgICAgY29uc3QgaW5kZXhPZmZzZXQgPSB2ZXJ0aWNlcy5sZW5ndGggLyAzOwogICAgICAgIGNvbnN0IHBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMoY3VydmVTZWdtZW50cyk7CiAgICAgICAgbGV0IHNoYXBlVmVydGljZXMgPSBwb2ludHMuc2hhcGU7CiAgICAgICAgY29uc3Qgc2hhcGVIb2xlcyA9IHBvaW50cy5ob2xlczsKICAgICAgICBpZiAoU2hhcGVVdGlscy5pc0Nsb2NrV2lzZShzaGFwZVZlcnRpY2VzKSA9PT0gZmFsc2UpIHsKICAgICAgICAgIHNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRpY2VzLnJldmVyc2UoKTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBzaGFwZUhvbGUgPSBzaGFwZUhvbGVzW2ldOwogICAgICAgICAgaWYgKFNoYXBlVXRpbHMuaXNDbG9ja1dpc2Uoc2hhcGVIb2xlKSA9PT0gdHJ1ZSkgewogICAgICAgICAgICBzaGFwZUhvbGVzW2ldID0gc2hhcGVIb2xlLnJldmVyc2UoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgZmFjZXMgPSBTaGFwZVV0aWxzLnRyaWFuZ3VsYXRlU2hhcGUoc2hhcGVWZXJ0aWNlcywgc2hhcGVIb2xlcyk7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBzaGFwZUhvbGUgPSBzaGFwZUhvbGVzW2ldOwogICAgICAgICAgc2hhcGVWZXJ0aWNlcyA9IHNoYXBlVmVydGljZXMuY29uY2F0KHNoYXBlSG9sZSk7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gc2hhcGVWZXJ0aWNlcy5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgICAgY29uc3QgdmVydGV4ID0gc2hhcGVWZXJ0aWNlc1tpXTsKICAgICAgICAgIHZlcnRpY2VzLnB1c2godmVydGV4LngsIHZlcnRleC55LCAwKTsKICAgICAgICAgIG5vcm1hbHMucHVzaCgwLCAwLCAxKTsKICAgICAgICAgIHV2cy5wdXNoKHZlcnRleC54LCB2ZXJ0ZXgueSk7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGZhY2UgPSBmYWNlc1tpXTsKICAgICAgICAgIGNvbnN0IGEgPSBmYWNlWzBdICsgaW5kZXhPZmZzZXQ7CiAgICAgICAgICBjb25zdCBiID0gZmFjZVsxXSArIGluZGV4T2Zmc2V0OwogICAgICAgICAgY29uc3QgYyA9IGZhY2VbMl0gKyBpbmRleE9mZnNldDsKICAgICAgICAgIGluZGljZXMucHVzaChhLCBiLCBjKTsKICAgICAgICAgIGdyb3VwQ291bnQgKz0gMzsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgc291cmNlLnBhcmFtZXRlcnMpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHRvSlNPTigpIHsKICAgICAgY29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpOwogICAgICBjb25zdCBzaGFwZXMgPSB0aGlzLnBhcmFtZXRlcnMuc2hhcGVzOwogICAgICByZXR1cm4gdG9KU09OKHNoYXBlcywgZGF0YSk7CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04oZGF0YSwgc2hhcGVzKSB7CiAgICAgIGNvbnN0IGdlb21ldHJ5U2hhcGVzID0gW107CiAgICAgIGZvciAobGV0IGogPSAwLCBqbCA9IGRhdGEuc2hhcGVzLmxlbmd0aDtqIDwgamw7IGorKykgewogICAgICAgIGNvbnN0IHNoYXBlID0gc2hhcGVzW2RhdGEuc2hhcGVzW2pdXTsKICAgICAgICBnZW9tZXRyeVNoYXBlcy5wdXNoKHNoYXBlKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFNoYXBlR2VvbWV0cnkoZ2VvbWV0cnlTaGFwZXMsIGRhdGEuY3VydmVTZWdtZW50cyk7CiAgICB9CiAgfTsKICBTcGhlcmVHZW9tZXRyeSA9IGNsYXNzIFNwaGVyZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkgewogICAgY29uc3RydWN0b3IocmFkaXVzID0gMSwgd2lkdGhTZWdtZW50cyA9IDMyLCBoZWlnaHRTZWdtZW50cyA9IDE2LCBwaGlTdGFydCA9IDAsIHBoaUxlbmd0aCA9IE1hdGguUEkgKiAyLCB0aGV0YVN0YXJ0ID0gMCwgdGhldGFMZW5ndGggPSBNYXRoLlBJKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMudHlwZSA9ICJTcGhlcmVHZW9tZXRyeSI7CiAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICByYWRpdXMsCiAgICAgICAgd2lkdGhTZWdtZW50cywKICAgICAgICBoZWlnaHRTZWdtZW50cywKICAgICAgICBwaGlTdGFydCwKICAgICAgICBwaGlMZW5ndGgsCiAgICAgICAgdGhldGFTdGFydCwKICAgICAgICB0aGV0YUxlbmd0aAogICAgICB9OwogICAgICB3aWR0aFNlZ21lbnRzID0gTWF0aC5tYXgoMywgTWF0aC5mbG9vcih3aWR0aFNlZ21lbnRzKSk7CiAgICAgIGhlaWdodFNlZ21lbnRzID0gTWF0aC5tYXgoMiwgTWF0aC5mbG9vcihoZWlnaHRTZWdtZW50cykpOwogICAgICBjb25zdCB0aGV0YUVuZCA9IE1hdGgubWluKHRoZXRhU3RhcnQgKyB0aGV0YUxlbmd0aCwgTWF0aC5QSSk7CiAgICAgIGxldCBpbmRleCA9IDA7CiAgICAgIGNvbnN0IGdyaWQgPSBbXTsKICAgICAgY29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjM7CiAgICAgIGNvbnN0IG5vcm1hbCA9IG5ldyBWZWN0b3IzOwogICAgICBjb25zdCBpbmRpY2VzID0gW107CiAgICAgIGNvbnN0IHZlcnRpY2VzID0gW107CiAgICAgIGNvbnN0IG5vcm1hbHMgPSBbXTsKICAgICAgY29uc3QgdXZzID0gW107CiAgICAgIGZvciAobGV0IGl5ID0gMDtpeSA8PSBoZWlnaHRTZWdtZW50czsgaXkrKykgewogICAgICAgIGNvbnN0IHZlcnRpY2VzUm93ID0gW107CiAgICAgICAgY29uc3QgdiA9IGl5IC8gaGVpZ2h0U2VnbWVudHM7CiAgICAgICAgbGV0IHVPZmZzZXQgPSAwOwogICAgICAgIGlmIChpeSA9PT0gMCAmJiB0aGV0YVN0YXJ0ID09PSAwKSB7CiAgICAgICAgICB1T2Zmc2V0ID0gMC41IC8gd2lkdGhTZWdtZW50czsKICAgICAgICB9IGVsc2UgaWYgKGl5ID09PSBoZWlnaHRTZWdtZW50cyAmJiB0aGV0YUVuZCA9PT0gTWF0aC5QSSkgewogICAgICAgICAgdU9mZnNldCA9IC0wLjUgLyB3aWR0aFNlZ21lbnRzOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpeCA9IDA7aXggPD0gd2lkdGhTZWdtZW50czsgaXgrKykgewogICAgICAgICAgY29uc3QgdSA9IGl4IC8gd2lkdGhTZWdtZW50czsKICAgICAgICAgIHZlcnRleC54ID0gLXJhZGl1cyAqIE1hdGguY29zKHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCkgKiBNYXRoLnNpbih0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoKTsKICAgICAgICAgIHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5jb3ModGhldGFTdGFydCArIHYgKiB0aGV0YUxlbmd0aCk7CiAgICAgICAgICB2ZXJ0ZXgueiA9IHJhZGl1cyAqIE1hdGguc2luKHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCkgKiBNYXRoLnNpbih0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoKTsKICAgICAgICAgIHZlcnRpY2VzLnB1c2godmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueik7CiAgICAgICAgICBub3JtYWwuY29weSh2ZXJ0ZXgpLm5vcm1hbGl6ZSgpOwogICAgICAgICAgbm9ybWFscy5wdXNoKG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnopOwogICAgICAgICAgdXZzLnB1c2godSArIHVPZmZzZXQsIDEgLSB2KTsKICAgICAgICAgIHZlcnRpY2VzUm93LnB1c2goaW5kZXgrKyk7CiAgICAgICAgfQogICAgICAgIGdyaWQucHVzaCh2ZXJ0aWNlc1Jvdyk7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaXkgPSAwO2l5IDwgaGVpZ2h0U2VnbWVudHM7IGl5KyspIHsKICAgICAgICBmb3IgKGxldCBpeCA9IDA7aXggPCB3aWR0aFNlZ21lbnRzOyBpeCsrKSB7CiAgICAgICAgICBjb25zdCBhID0gZ3JpZFtpeV1baXggKyAxXTsKICAgICAgICAgIGNvbnN0IGIgPSBncmlkW2l5XVtpeF07CiAgICAgICAgICBjb25zdCBjID0gZ3JpZFtpeSArIDFdW2l4XTsKICAgICAgICAgIGNvbnN0IGQgPSBncmlkW2l5ICsgMV1baXggKyAxXTsKICAgICAgICAgIGlmIChpeSAhPT0gMCB8fCB0aGV0YVN0YXJ0ID4gMCkKICAgICAgICAgICAgaW5kaWNlcy5wdXNoKGEsIGIsIGQpOwogICAgICAgICAgaWYgKGl5ICE9PSBoZWlnaHRTZWdtZW50cyAtIDEgfHwgdGhldGFFbmQgPCBNYXRoLlBJKQogICAgICAgICAgICBpbmRpY2VzLnB1c2goYiwgYywgZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuc2V0SW5kZXgoaW5kaWNlcyk7CiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKHZlcnRpY2VzLCAzKSk7CiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShub3JtYWxzLCAzKSk7CiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKHV2cywgMikpOwogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBzb3VyY2UucGFyYW1ldGVycyk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc3RhdGljIGZyb21KU09OKGRhdGEpIHsKICAgICAgcmV0dXJuIG5ldyBTcGhlcmVHZW9tZXRyeShkYXRhLnJhZGl1cywgZGF0YS53aWR0aFNlZ21lbnRzLCBkYXRhLmhlaWdodFNlZ21lbnRzLCBkYXRhLnBoaVN0YXJ0LCBkYXRhLnBoaUxlbmd0aCwgZGF0YS50aGV0YVN0YXJ0LCBkYXRhLnRoZXRhTGVuZ3RoKTsKICAgIH0KICB9OwogIFRldHJhaGVkcm9uR2VvbWV0cnkgPSBjbGFzcyBUZXRyYWhlZHJvbkdlb21ldHJ5IGV4dGVuZHMgUG9seWhlZHJvbkdlb21ldHJ5IHsKICAgIGNvbnN0cnVjdG9yKHJhZGl1cyA9IDEsIGRldGFpbCA9IDApIHsKICAgICAgY29uc3QgdmVydGljZXMgPSBbCiAgICAgICAgMSwKICAgICAgICAxLAogICAgICAgIDEsCiAgICAgICAgLTEsCiAgICAgICAgLTEsCiAgICAgICAgMSwKICAgICAgICAtMSwKICAgICAgICAxLAogICAgICAgIC0xLAogICAgICAgIDEsCiAgICAgICAgLTEsCiAgICAgICAgLTEKICAgICAgXTsKICAgICAgY29uc3QgaW5kaWNlcyA9IFsKICAgICAgICAyLAogICAgICAgIDEsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDMsCiAgICAgICAgMiwKICAgICAgICAxLAogICAgICAgIDMsCiAgICAgICAgMCwKICAgICAgICAyLAogICAgICAgIDMsCiAgICAgICAgMQogICAgICBdOwogICAgICBzdXBlcih2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwpOwogICAgICB0aGlzLnR5cGUgPSAiVGV0cmFoZWRyb25HZW9tZXRyeSI7CiAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICByYWRpdXMsCiAgICAgICAgZGV0YWlsCiAgICAgIH07CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04oZGF0YSkgewogICAgICByZXR1cm4gbmV3IFRldHJhaGVkcm9uR2VvbWV0cnkoZGF0YS5yYWRpdXMsIGRhdGEuZGV0YWlsKTsKICAgIH0KICB9OwogIFRvcnVzR2VvbWV0cnkgPSBjbGFzcyBUb3J1c0dlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkgewogICAgY29uc3RydWN0b3IocmFkaXVzID0gMSwgdHViZSA9IDAuNCwgcmFkaWFsU2VnbWVudHMgPSAxMiwgdHVidWxhclNlZ21lbnRzID0gNDgsIGFyYyA9IE1hdGguUEkgKiAyKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMudHlwZSA9ICJUb3J1c0dlb21ldHJ5IjsKICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gewogICAgICAgIHJhZGl1cywKICAgICAgICB0dWJlLAogICAgICAgIHJhZGlhbFNlZ21lbnRzLAogICAgICAgIHR1YnVsYXJTZWdtZW50cywKICAgICAgICBhcmMKICAgICAgfTsKICAgICAgcmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKHJhZGlhbFNlZ21lbnRzKTsKICAgICAgdHVidWxhclNlZ21lbnRzID0gTWF0aC5mbG9vcih0dWJ1bGFyU2VnbWVudHMpOwogICAgICBjb25zdCBpbmRpY2VzID0gW107CiAgICAgIGNvbnN0IHZlcnRpY2VzID0gW107CiAgICAgIGNvbnN0IG5vcm1hbHMgPSBbXTsKICAgICAgY29uc3QgdXZzID0gW107CiAgICAgIGNvbnN0IGNlbnRlciA9IG5ldyBWZWN0b3IzOwogICAgICBjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMzsKICAgICAgY29uc3Qgbm9ybWFsID0gbmV3IFZlY3RvcjM7CiAgICAgIGZvciAobGV0IGogPSAwO2ogPD0gcmFkaWFsU2VnbWVudHM7IGorKykgewogICAgICAgIGZvciAobGV0IGkgPSAwO2kgPD0gdHVidWxhclNlZ21lbnRzOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHUgPSBpIC8gdHVidWxhclNlZ21lbnRzICogYXJjOwogICAgICAgICAgY29uc3QgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyOwogICAgICAgICAgdmVydGV4LnggPSAocmFkaXVzICsgdHViZSAqIE1hdGguY29zKHYpKSAqIE1hdGguY29zKHUpOwogICAgICAgICAgdmVydGV4LnkgPSAocmFkaXVzICsgdHViZSAqIE1hdGguY29zKHYpKSAqIE1hdGguc2luKHUpOwogICAgICAgICAgdmVydGV4LnogPSB0dWJlICogTWF0aC5zaW4odik7CiAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnopOwogICAgICAgICAgY2VudGVyLnggPSByYWRpdXMgKiBNYXRoLmNvcyh1KTsKICAgICAgICAgIGNlbnRlci55ID0gcmFkaXVzICogTWF0aC5zaW4odSk7CiAgICAgICAgICBub3JtYWwuc3ViVmVjdG9ycyh2ZXJ0ZXgsIGNlbnRlcikubm9ybWFsaXplKCk7CiAgICAgICAgICBub3JtYWxzLnB1c2gobm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueik7CiAgICAgICAgICB1dnMucHVzaChpIC8gdHVidWxhclNlZ21lbnRzKTsKICAgICAgICAgIHV2cy5wdXNoKGogLyByYWRpYWxTZWdtZW50cyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAxO2ogPD0gcmFkaWFsU2VnbWVudHM7IGorKykgewogICAgICAgIGZvciAobGV0IGkgPSAxO2kgPD0gdHVidWxhclNlZ21lbnRzOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGEgPSAodHVidWxhclNlZ21lbnRzICsgMSkgKiBqICsgaSAtIDE7CiAgICAgICAgICBjb25zdCBiID0gKHR1YnVsYXJTZWdtZW50cyArIDEpICogKGogLSAxKSArIGkgLSAxOwogICAgICAgICAgY29uc3QgYyA9ICh0dWJ1bGFyU2VnbWVudHMgKyAxKSAqIChqIC0gMSkgKyBpOwogICAgICAgICAgY29uc3QgZCA9ICh0dWJ1bGFyU2VnbWVudHMgKyAxKSAqIGogKyBpOwogICAgICAgICAgaW5kaWNlcy5wdXNoKGEsIGIsIGQpOwogICAgICAgICAgaW5kaWNlcy5wdXNoKGIsIGMsIGQpOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLnNldEluZGV4KGluZGljZXMpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh2ZXJ0aWNlcywgMykpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUobm9ybWFscywgMykpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh1dnMsIDIpKTsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgc291cmNlLnBhcmFtZXRlcnMpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHN0YXRpYyBmcm9tSlNPTihkYXRhKSB7CiAgICAgIHJldHVybiBuZXcgVG9ydXNHZW9tZXRyeShkYXRhLnJhZGl1cywgZGF0YS50dWJlLCBkYXRhLnJhZGlhbFNlZ21lbnRzLCBkYXRhLnR1YnVsYXJTZWdtZW50cywgZGF0YS5hcmMpOwogICAgfQogIH07CiAgVG9ydXNLbm90R2VvbWV0cnkgPSBjbGFzcyBUb3J1c0tub3RHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHsKICAgIGNvbnN0cnVjdG9yKHJhZGl1cyA9IDEsIHR1YmUgPSAwLjQsIHR1YnVsYXJTZWdtZW50cyA9IDY0LCByYWRpYWxTZWdtZW50cyA9IDgsIHAgPSAyLCBxID0gMykgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLnR5cGUgPSAiVG9ydXNLbm90R2VvbWV0cnkiOwogICAgICB0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAgICAgcmFkaXVzLAogICAgICAgIHR1YmUsCiAgICAgICAgdHVidWxhclNlZ21lbnRzLAogICAgICAgIHJhZGlhbFNlZ21lbnRzLAogICAgICAgIHAsCiAgICAgICAgcQogICAgICB9OwogICAgICB0dWJ1bGFyU2VnbWVudHMgPSBNYXRoLmZsb29yKHR1YnVsYXJTZWdtZW50cyk7CiAgICAgIHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vcihyYWRpYWxTZWdtZW50cyk7CiAgICAgIGNvbnN0IGluZGljZXMgPSBbXTsKICAgICAgY29uc3QgdmVydGljZXMgPSBbXTsKICAgICAgY29uc3Qgbm9ybWFscyA9IFtdOwogICAgICBjb25zdCB1dnMgPSBbXTsKICAgICAgY29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjM7CiAgICAgIGNvbnN0IG5vcm1hbCA9IG5ldyBWZWN0b3IzOwogICAgICBjb25zdCBQMSA9IG5ldyBWZWN0b3IzOwogICAgICBjb25zdCBQMiA9IG5ldyBWZWN0b3IzOwogICAgICBjb25zdCBCID0gbmV3IFZlY3RvcjM7CiAgICAgIGNvbnN0IFQgPSBuZXcgVmVjdG9yMzsKICAgICAgY29uc3QgTiA9IG5ldyBWZWN0b3IzOwogICAgICBmb3IgKGxldCBpID0gMDtpIDw9IHR1YnVsYXJTZWdtZW50czsgKytpKSB7CiAgICAgICAgY29uc3QgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBwICogTWF0aC5QSSAqIDI7CiAgICAgICAgY2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKHUsIHAsIHEsIHJhZGl1cywgUDEpOwogICAgICAgIGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSh1ICsgMC4wMSwgcCwgcSwgcmFkaXVzLCBQMik7CiAgICAgICAgVC5zdWJWZWN0b3JzKFAyLCBQMSk7CiAgICAgICAgTi5hZGRWZWN0b3JzKFAyLCBQMSk7CiAgICAgICAgQi5jcm9zc1ZlY3RvcnMoVCwgTik7CiAgICAgICAgTi5jcm9zc1ZlY3RvcnMoQiwgVCk7CiAgICAgICAgQi5ub3JtYWxpemUoKTsKICAgICAgICBOLm5vcm1hbGl6ZSgpOwogICAgICAgIGZvciAobGV0IGogPSAwO2ogPD0gcmFkaWFsU2VnbWVudHM7ICsraikgewogICAgICAgICAgY29uc3QgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyOwogICAgICAgICAgY29uc3QgY3ggPSAtdHViZSAqIE1hdGguY29zKHYpOwogICAgICAgICAgY29uc3QgY3kgPSB0dWJlICogTWF0aC5zaW4odik7CiAgICAgICAgICB2ZXJ0ZXgueCA9IFAxLnggKyAoY3ggKiBOLnggKyBjeSAqIEIueCk7CiAgICAgICAgICB2ZXJ0ZXgueSA9IFAxLnkgKyAoY3ggKiBOLnkgKyBjeSAqIEIueSk7CiAgICAgICAgICB2ZXJ0ZXgueiA9IFAxLnogKyAoY3ggKiBOLnogKyBjeSAqIEIueik7CiAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnopOwogICAgICAgICAgbm9ybWFsLnN1YlZlY3RvcnModmVydGV4LCBQMSkubm9ybWFsaXplKCk7CiAgICAgICAgICBub3JtYWxzLnB1c2gobm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueik7CiAgICAgICAgICB1dnMucHVzaChpIC8gdHVidWxhclNlZ21lbnRzKTsKICAgICAgICAgIHV2cy5wdXNoKGogLyByYWRpYWxTZWdtZW50cyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAxO2ogPD0gdHVidWxhclNlZ21lbnRzOyBqKyspIHsKICAgICAgICBmb3IgKGxldCBpID0gMTtpIDw9IHJhZGlhbFNlZ21lbnRzOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGEgPSAocmFkaWFsU2VnbWVudHMgKyAxKSAqIChqIC0gMSkgKyAoaSAtIDEpOwogICAgICAgICAgY29uc3QgYiA9IChyYWRpYWxTZWdtZW50cyArIDEpICogaiArIChpIC0gMSk7CiAgICAgICAgICBjb25zdCBjID0gKHJhZGlhbFNlZ21lbnRzICsgMSkgKiBqICsgaTsKICAgICAgICAgIGNvbnN0IGQgPSAocmFkaWFsU2VnbWVudHMgKyAxKSAqIChqIC0gMSkgKyBpOwogICAgICAgICAgaW5kaWNlcy5wdXNoKGEsIGIsIGQpOwogICAgICAgICAgaW5kaWNlcy5wdXNoKGIsIGMsIGQpOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLnNldEluZGV4KGluZGljZXMpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh2ZXJ0aWNlcywgMykpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUobm9ybWFscywgMykpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh1dnMsIDIpKTsKICAgICAgZnVuY3Rpb24gY2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKHUsIHAyLCBxMiwgcmFkaXVzMiwgcG9zaXRpb24pIHsKICAgICAgICBjb25zdCBjdSA9IE1hdGguY29zKHUpOwogICAgICAgIGNvbnN0IHN1ID0gTWF0aC5zaW4odSk7CiAgICAgICAgY29uc3QgcXVPdmVyUCA9IHEyIC8gcDIgKiB1OwogICAgICAgIGNvbnN0IGNzID0gTWF0aC5jb3MocXVPdmVyUCk7CiAgICAgICAgcG9zaXRpb24ueCA9IHJhZGl1czIgKiAoMiArIGNzKSAqIDAuNSAqIGN1OwogICAgICAgIHBvc2l0aW9uLnkgPSByYWRpdXMyICogKDIgKyBjcykgKiBzdSAqIDAuNTsKICAgICAgICBwb3NpdGlvbi56ID0gcmFkaXVzMiAqIE1hdGguc2luKHF1T3ZlclApICogMC41OwogICAgICB9CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZS5wYXJhbWV0ZXJzKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzdGF0aWMgZnJvbUpTT04oZGF0YSkgewogICAgICByZXR1cm4gbmV3IFRvcnVzS25vdEdlb21ldHJ5KGRhdGEucmFkaXVzLCBkYXRhLnR1YmUsIGRhdGEudHVidWxhclNlZ21lbnRzLCBkYXRhLnJhZGlhbFNlZ21lbnRzLCBkYXRhLnAsIGRhdGEucSk7CiAgICB9CiAgfTsKICBUdWJlR2VvbWV0cnkgPSBjbGFzcyBUdWJlR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7CiAgICBjb25zdHJ1Y3RvcihwYXRoID0gbmV3IFF1YWRyYXRpY0JlemllckN1cnZlMyhuZXcgVmVjdG9yMygtMSwgLTEsIDApLCBuZXcgVmVjdG9yMygtMSwgMSwgMCksIG5ldyBWZWN0b3IzKDEsIDEsIDApKSwgdHVidWxhclNlZ21lbnRzID0gNjQsIHJhZGl1cyA9IDEsIHJhZGlhbFNlZ21lbnRzID0gOCwgY2xvc2VkID0gZmFsc2UpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy50eXBlID0gIlR1YmVHZW9tZXRyeSI7CiAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICBwYXRoLAogICAgICAgIHR1YnVsYXJTZWdtZW50cywKICAgICAgICByYWRpdXMsCiAgICAgICAgcmFkaWFsU2VnbWVudHMsCiAgICAgICAgY2xvc2VkCiAgICAgIH07CiAgICAgIGNvbnN0IGZyYW1lcyA9IHBhdGguY29tcHV0ZUZyZW5ldEZyYW1lcyh0dWJ1bGFyU2VnbWVudHMsIGNsb3NlZCk7CiAgICAgIHRoaXMudGFuZ2VudHMgPSBmcmFtZXMudGFuZ2VudHM7CiAgICAgIHRoaXMubm9ybWFscyA9IGZyYW1lcy5ub3JtYWxzOwogICAgICB0aGlzLmJpbm9ybWFscyA9IGZyYW1lcy5iaW5vcm1hbHM7CiAgICAgIGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzOwogICAgICBjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMzsKICAgICAgY29uc3QgdXYgPSBuZXcgVmVjdG9yMjsKICAgICAgbGV0IFAgPSBuZXcgVmVjdG9yMzsKICAgICAgY29uc3QgdmVydGljZXMgPSBbXTsKICAgICAgY29uc3Qgbm9ybWFscyA9IFtdOwogICAgICBjb25zdCB1dnMgPSBbXTsKICAgICAgY29uc3QgaW5kaWNlcyA9IFtdOwogICAgICBnZW5lcmF0ZUJ1ZmZlckRhdGEoKTsKICAgICAgdGhpcy5zZXRJbmRleChpbmRpY2VzKTsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUodmVydGljZXMsIDMpKTsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKG5vcm1hbHMsIDMpKTsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoInV2IiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUodXZzLCAyKSk7CiAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlQnVmZmVyRGF0YSgpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgdHVidWxhclNlZ21lbnRzOyBpKyspIHsKICAgICAgICAgIGdlbmVyYXRlU2VnbWVudChpKTsKICAgICAgICB9CiAgICAgICAgZ2VuZXJhdGVTZWdtZW50KGNsb3NlZCA9PT0gZmFsc2UgPyB0dWJ1bGFyU2VnbWVudHMgOiAwKTsKICAgICAgICBnZW5lcmF0ZVVWcygpOwogICAgICAgIGdlbmVyYXRlSW5kaWNlcygpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlU2VnbWVudChpKSB7CiAgICAgICAgUCA9IHBhdGguZ2V0UG9pbnRBdChpIC8gdHVidWxhclNlZ21lbnRzLCBQKTsKICAgICAgICBjb25zdCBOID0gZnJhbWVzLm5vcm1hbHNbaV07CiAgICAgICAgY29uc3QgQiA9IGZyYW1lcy5iaW5vcm1hbHNbaV07CiAgICAgICAgZm9yIChsZXQgaiA9IDA7aiA8PSByYWRpYWxTZWdtZW50czsgaisrKSB7CiAgICAgICAgICBjb25zdCB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7CiAgICAgICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbih2KTsKICAgICAgICAgIGNvbnN0IGNvcyA9IC1NYXRoLmNvcyh2KTsKICAgICAgICAgIG5vcm1hbC54ID0gY29zICogTi54ICsgc2luICogQi54OwogICAgICAgICAgbm9ybWFsLnkgPSBjb3MgKiBOLnkgKyBzaW4gKiBCLnk7CiAgICAgICAgICBub3JtYWwueiA9IGNvcyAqIE4ueiArIHNpbiAqIEIuejsKICAgICAgICAgIG5vcm1hbC5ub3JtYWxpemUoKTsKICAgICAgICAgIG5vcm1hbHMucHVzaChub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56KTsKICAgICAgICAgIHZlcnRleC54ID0gUC54ICsgcmFkaXVzICogbm9ybWFsLng7CiAgICAgICAgICB2ZXJ0ZXgueSA9IFAueSArIHJhZGl1cyAqIG5vcm1hbC55OwogICAgICAgICAgdmVydGV4LnogPSBQLnogKyByYWRpdXMgKiBub3JtYWwuejsKICAgICAgICAgIHZlcnRpY2VzLnB1c2godmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlSW5kaWNlcygpIHsKICAgICAgICBmb3IgKGxldCBqID0gMTtqIDw9IHR1YnVsYXJTZWdtZW50czsgaisrKSB7CiAgICAgICAgICBmb3IgKGxldCBpID0gMTtpIDw9IHJhZGlhbFNlZ21lbnRzOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgYSA9IChyYWRpYWxTZWdtZW50cyArIDEpICogKGogLSAxKSArIChpIC0gMSk7CiAgICAgICAgICAgIGNvbnN0IGIgPSAocmFkaWFsU2VnbWVudHMgKyAxKSAqIGogKyAoaSAtIDEpOwogICAgICAgICAgICBjb25zdCBjID0gKHJhZGlhbFNlZ21lbnRzICsgMSkgKiBqICsgaTsKICAgICAgICAgICAgY29uc3QgZCA9IChyYWRpYWxTZWdtZW50cyArIDEpICogKGogLSAxKSArIGk7CiAgICAgICAgICAgIGluZGljZXMucHVzaChhLCBiLCBkKTsKICAgICAgICAgICAgaW5kaWNlcy5wdXNoKGIsIGMsIGQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBnZW5lcmF0ZVVWcygpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDtpIDw9IHR1YnVsYXJTZWdtZW50czsgaSsrKSB7CiAgICAgICAgICBmb3IgKGxldCBqID0gMDtqIDw9IHJhZGlhbFNlZ21lbnRzOyBqKyspIHsKICAgICAgICAgICAgdXYueCA9IGkgLyB0dWJ1bGFyU2VnbWVudHM7CiAgICAgICAgICAgIHV2LnkgPSBqIC8gcmFkaWFsU2VnbWVudHM7CiAgICAgICAgICAgIHV2cy5wdXNoKHV2LngsIHV2LnkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBzb3VyY2UucGFyYW1ldGVycyk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICBjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7CiAgICAgIGRhdGEucGF0aCA9IHRoaXMucGFyYW1ldGVycy5wYXRoLnRvSlNPTigpOwogICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIHN0YXRpYyBmcm9tSlNPTihkYXRhKSB7CiAgICAgIHJldHVybiBuZXcgVHViZUdlb21ldHJ5KG5ldyBDdXJ2ZXNbZGF0YS5wYXRoLnR5cGVdKCkuZnJvbUpTT04oZGF0YS5wYXRoKSwgZGF0YS50dWJ1bGFyU2VnbWVudHMsIGRhdGEucmFkaXVzLCBkYXRhLnJhZGlhbFNlZ21lbnRzLCBkYXRhLmNsb3NlZCk7CiAgICB9CiAgfTsKICBXaXJlZnJhbWVHZW9tZXRyeSA9IGNsYXNzIFdpcmVmcmFtZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkgewogICAgY29uc3RydWN0b3IoZ2VvbWV0cnkgPSBudWxsKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMudHlwZSA9ICJXaXJlZnJhbWVHZW9tZXRyeSI7CiAgICAgIHRoaXMucGFyYW1ldGVycyA9IHsKICAgICAgICBnZW9tZXRyeQogICAgICB9OwogICAgICBpZiAoZ2VvbWV0cnkgIT09IG51bGwpIHsKICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IFtdOwogICAgICAgIGNvbnN0IGVkZ2VzID0gbmV3IFNldDsKICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBWZWN0b3IzOwogICAgICAgIGNvbnN0IGVuZCA9IG5ldyBWZWN0b3IzOwogICAgICAgIGlmIChnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgICAgICAgY29uc3QgaW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4OwogICAgICAgICAgbGV0IGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwczsKICAgICAgICAgIGlmIChncm91cHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGdyb3VwcyA9IFt7IHN0YXJ0OiAwLCBjb3VudDogaW5kaWNlcy5jb3VudCwgbWF0ZXJpYWxJbmRleDogMCB9XTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAobGV0IG8gPSAwLCBvbCA9IGdyb3Vwcy5sZW5ndGg7byA8IG9sOyArK28pIHsKICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBncm91cHNbb107CiAgICAgICAgICAgIGNvbnN0IGdyb3VwU3RhcnQgPSBncm91cC5zdGFydDsKICAgICAgICAgICAgY29uc3QgZ3JvdXBDb3VudCA9IGdyb3VwLmNvdW50OwogICAgICAgICAgICBmb3IgKGxldCBpID0gZ3JvdXBTdGFydCwgbCA9IGdyb3VwU3RhcnQgKyBncm91cENvdW50O2kgPCBsOyBpICs9IDMpIHsKICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDtqIDwgMzsgaisrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBpbmRleDEgPSBpbmRpY2VzLmdldFgoaSArIGopOwogICAgICAgICAgICAgICAgY29uc3QgaW5kZXgyID0gaW5kaWNlcy5nZXRYKGkgKyAoaiArIDEpICUgMyk7CiAgICAgICAgICAgICAgICBzdGFydC5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleDEpOwogICAgICAgICAgICAgICAgZW5kLmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb24sIGluZGV4Mik7CiAgICAgICAgICAgICAgICBpZiAoaXNVbmlxdWVFZGdlKHN0YXJ0LCBlbmQsIGVkZ2VzKSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKHN0YXJ0LngsIHN0YXJ0LnksIHN0YXJ0LnopOwogICAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKGVuZC54LCBlbmQueSwgZW5kLnopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247CiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHBvc2l0aW9uLmNvdW50IC8gMztpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwO2ogPCAzOyBqKyspIHsKICAgICAgICAgICAgICBjb25zdCBpbmRleDEgPSAzICogaSArIGo7CiAgICAgICAgICAgICAgY29uc3QgaW5kZXgyID0gMyAqIGkgKyAoaiArIDEpICUgMzsKICAgICAgICAgICAgICBzdGFydC5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleDEpOwogICAgICAgICAgICAgIGVuZC5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleDIpOwogICAgICAgICAgICAgIGlmIChpc1VuaXF1ZUVkZ2Uoc3RhcnQsIGVuZCwgZWRnZXMpID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKHN0YXJ0LngsIHN0YXJ0LnksIHN0YXJ0LnopOwogICAgICAgICAgICAgICAgdmVydGljZXMucHVzaChlbmQueCwgZW5kLnksIGVuZC56KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUodmVydGljZXMsIDMpKTsKICAgICAgfQogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLnBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBzb3VyY2UucGFyYW1ldGVycyk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH07CiAgR2VvbWV0cmllcyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuZnJlZXplKHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgIEJveEdlb21ldHJ5LAogICAgQ2Fwc3VsZUdlb21ldHJ5LAogICAgQ2lyY2xlR2VvbWV0cnksCiAgICBDb25lR2VvbWV0cnksCiAgICBDeWxpbmRlckdlb21ldHJ5LAogICAgRG9kZWNhaGVkcm9uR2VvbWV0cnksCiAgICBFZGdlc0dlb21ldHJ5LAogICAgRXh0cnVkZUdlb21ldHJ5LAogICAgSWNvc2FoZWRyb25HZW9tZXRyeSwKICAgIExhdGhlR2VvbWV0cnksCiAgICBPY3RhaGVkcm9uR2VvbWV0cnksCiAgICBQbGFuZUdlb21ldHJ5LAogICAgUG9seWhlZHJvbkdlb21ldHJ5LAogICAgUmluZ0dlb21ldHJ5LAogICAgU2hhcGVHZW9tZXRyeSwKICAgIFNwaGVyZUdlb21ldHJ5LAogICAgVGV0cmFoZWRyb25HZW9tZXRyeSwKICAgIFRvcnVzR2VvbWV0cnksCiAgICBUb3J1c0tub3RHZW9tZXRyeSwKICAgIFR1YmVHZW9tZXRyeSwKICAgIFdpcmVmcmFtZUdlb21ldHJ5CiAgfSk7CiAgU2hhZG93TWF0ZXJpYWwgPSBjbGFzcyBTaGFkb3dNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHsKICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5pc1NoYWRvd01hdGVyaWFsID0gdHJ1ZTsKICAgICAgdGhpcy50eXBlID0gIlNoYWRvd01hdGVyaWFsIjsKICAgICAgdGhpcy5jb2xvciA9IG5ldyBDb2xvcigwKTsKICAgICAgdGhpcy50cmFuc3BhcmVudCA9IHRydWU7CiAgICAgIHRoaXMuZm9nID0gdHJ1ZTsKICAgICAgdGhpcy5zZXRWYWx1ZXMocGFyYW1ldGVycyk7CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMuY29sb3IuY29weShzb3VyY2UuY29sb3IpOwogICAgICB0aGlzLmZvZyA9IHNvdXJjZS5mb2c7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH07CiAgUmF3U2hhZGVyTWF0ZXJpYWwgPSBjbGFzcyBSYXdTaGFkZXJNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHsKICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKICAgICAgc3VwZXIocGFyYW1ldGVycyk7CiAgICAgIHRoaXMuaXNSYXdTaGFkZXJNYXRlcmlhbCA9IHRydWU7CiAgICAgIHRoaXMudHlwZSA9ICJSYXdTaGFkZXJNYXRlcmlhbCI7CiAgICB9CiAgfTsKICBNZXNoU3RhbmRhcmRNYXRlcmlhbCA9IGNsYXNzIE1lc2hTdGFuZGFyZE1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwgewogICAgY29uc3RydWN0b3IocGFyYW1ldGVycykgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiTWVzaFN0YW5kYXJkTWF0ZXJpYWwiOwogICAgICB0aGlzLmRlZmluZXMgPSB7IFNUQU5EQVJEOiAiIiB9OwogICAgICB0aGlzLmNvbG9yID0gbmV3IENvbG9yKDE2Nzc3MjE1KTsKICAgICAgdGhpcy5yb3VnaG5lc3MgPSAxOwogICAgICB0aGlzLm1ldGFsbmVzcyA9IDA7CiAgICAgIHRoaXMubWFwID0gbnVsbDsKICAgICAgdGhpcy5saWdodE1hcCA9IG51bGw7CiAgICAgIHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxOwogICAgICB0aGlzLmFvTWFwID0gbnVsbDsKICAgICAgdGhpcy5hb01hcEludGVuc2l0eSA9IDE7CiAgICAgIHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoMCk7CiAgICAgIHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxOwogICAgICB0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDsKICAgICAgdGhpcy5idW1wTWFwID0gbnVsbDsKICAgICAgdGhpcy5idW1wU2NhbGUgPSAxOwogICAgICB0aGlzLm5vcm1hbE1hcCA9IG51bGw7CiAgICAgIHRoaXMubm9ybWFsTWFwVHlwZSA9IFRhbmdlbnRTcGFjZU5vcm1hbE1hcDsKICAgICAgdGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKDEsIDEpOwogICAgICB0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7CiAgICAgIHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxOwogICAgICB0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwOwogICAgICB0aGlzLnJvdWdobmVzc01hcCA9IG51bGw7CiAgICAgIHRoaXMubWV0YWxuZXNzTWFwID0gbnVsbDsKICAgICAgdGhpcy5hbHBoYU1hcCA9IG51bGw7CiAgICAgIHRoaXMuZW52TWFwID0gbnVsbDsKICAgICAgdGhpcy5lbnZNYXBSb3RhdGlvbiA9IG5ldyBFdWxlcjsKICAgICAgdGhpcy5lbnZNYXBJbnRlbnNpdHkgPSAxOwogICAgICB0aGlzLndpcmVmcmFtZSA9IGZhbHNlOwogICAgICB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7CiAgICAgIHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICJyb3VuZCI7CiAgICAgIHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAicm91bmQiOwogICAgICB0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7CiAgICAgIHRoaXMuZm9nID0gdHJ1ZTsKICAgICAgdGhpcy5zZXRWYWx1ZXMocGFyYW1ldGVycyk7CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMuZGVmaW5lcyA9IHsgU1RBTkRBUkQ6ICIiIH07CiAgICAgIHRoaXMuY29sb3IuY29weShzb3VyY2UuY29sb3IpOwogICAgICB0aGlzLnJvdWdobmVzcyA9IHNvdXJjZS5yb3VnaG5lc3M7CiAgICAgIHRoaXMubWV0YWxuZXNzID0gc291cmNlLm1ldGFsbmVzczsKICAgICAgdGhpcy5tYXAgPSBzb3VyY2UubWFwOwogICAgICB0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwOwogICAgICB0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5OwogICAgICB0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwOwogICAgICB0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5OwogICAgICB0aGlzLmVtaXNzaXZlLmNvcHkoc291cmNlLmVtaXNzaXZlKTsKICAgICAgdGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDsKICAgICAgdGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTsKICAgICAgdGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7CiAgICAgIHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTsKICAgICAgdGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwOwogICAgICB0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTsKICAgICAgdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHNvdXJjZS5ub3JtYWxTY2FsZSk7CiAgICAgIHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7CiAgICAgIHRoaXMucm91Z2huZXNzTWFwID0gc291cmNlLnJvdWdobmVzc01hcDsKICAgICAgdGhpcy5tZXRhbG5lc3NNYXAgPSBzb3VyY2UubWV0YWxuZXNzTWFwOwogICAgICB0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwOwogICAgICB0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7CiAgICAgIHRoaXMuZW52TWFwUm90YXRpb24uY29weShzb3VyY2UuZW52TWFwUm90YXRpb24pOwogICAgICB0aGlzLmVudk1hcEludGVuc2l0eSA9IHNvdXJjZS5lbnZNYXBJbnRlbnNpdHk7CiAgICAgIHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKICAgICAgdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoOwogICAgICB0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDsKICAgICAgdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjsKICAgICAgdGhpcy5mbGF0U2hhZGluZyA9IHNvdXJjZS5mbGF0U2hhZGluZzsKICAgICAgdGhpcy5mb2cgPSBzb3VyY2UuZm9nOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIE1lc2hQaHlzaWNhbE1hdGVyaWFsID0gY2xhc3MgTWVzaFBoeXNpY2FsTWF0ZXJpYWwgZXh0ZW5kcyBNZXNoU3RhbmRhcmRNYXRlcmlhbCB7CiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCA9IHRydWU7CiAgICAgIHRoaXMuZGVmaW5lcyA9IHsKICAgICAgICBTVEFOREFSRDogIiIsCiAgICAgICAgUEhZU0lDQUw6ICIiCiAgICAgIH07CiAgICAgIHRoaXMudHlwZSA9ICJNZXNoUGh5c2ljYWxNYXRlcmlhbCI7CiAgICAgIHRoaXMuYW5pc290cm9weVJvdGF0aW9uID0gMDsKICAgICAgdGhpcy5hbmlzb3Ryb3B5TWFwID0gbnVsbDsKICAgICAgdGhpcy5jbGVhcmNvYXRNYXAgPSBudWxsOwogICAgICB0aGlzLmNsZWFyY29hdFJvdWdobmVzcyA9IDA7CiAgICAgIHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwID0gbnVsbDsKICAgICAgdGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKDEsIDEpOwogICAgICB0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCA9IG51bGw7CiAgICAgIHRoaXMuaW9yID0gMS41OwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgInJlZmxlY3Rpdml0eSIsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGNsYW1wKDIuNSAqICh0aGlzLmlvciAtIDEpIC8gKHRoaXMuaW9yICsgMSksIDAsIDEpOwogICAgICAgIH0sCiAgICAgICAgc2V0OiBmdW5jdGlvbihyZWZsZWN0aXZpdHkpIHsKICAgICAgICAgIHRoaXMuaW9yID0gKDEgKyAwLjQgKiByZWZsZWN0aXZpdHkpIC8gKDEgLSAwLjQgKiByZWZsZWN0aXZpdHkpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHRoaXMuaXJpZGVzY2VuY2VNYXAgPSBudWxsOwogICAgICB0aGlzLmlyaWRlc2NlbmNlSU9SID0gMS4zOwogICAgICB0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UgPSBbMTAwLCA0MDBdOwogICAgICB0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwID0gbnVsbDsKICAgICAgdGhpcy5zaGVlbkNvbG9yID0gbmV3IENvbG9yKDApOwogICAgICB0aGlzLnNoZWVuQ29sb3JNYXAgPSBudWxsOwogICAgICB0aGlzLnNoZWVuUm91Z2huZXNzID0gMTsKICAgICAgdGhpcy5zaGVlblJvdWdobmVzc01hcCA9IG51bGw7CiAgICAgIHRoaXMudHJhbnNtaXNzaW9uTWFwID0gbnVsbDsKICAgICAgdGhpcy50aGlja25lc3MgPSAwOwogICAgICB0aGlzLnRoaWNrbmVzc01hcCA9IG51bGw7CiAgICAgIHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSA9IEluZmluaXR5OwogICAgICB0aGlzLmF0dGVudWF0aW9uQ29sb3IgPSBuZXcgQ29sb3IoMSwgMSwgMSk7CiAgICAgIHRoaXMuc3BlY3VsYXJJbnRlbnNpdHkgPSAxOwogICAgICB0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwID0gbnVsbDsKICAgICAgdGhpcy5zcGVjdWxhckNvbG9yID0gbmV3IENvbG9yKDEsIDEsIDEpOwogICAgICB0aGlzLnNwZWN1bGFyQ29sb3JNYXAgPSBudWxsOwogICAgICB0aGlzLl9hbmlzb3Ryb3B5ID0gMDsKICAgICAgdGhpcy5fY2xlYXJjb2F0ID0gMDsKICAgICAgdGhpcy5fZGlzcGVyc2lvbiA9IDA7CiAgICAgIHRoaXMuX2lyaWRlc2NlbmNlID0gMDsKICAgICAgdGhpcy5fc2hlZW4gPSAwOwogICAgICB0aGlzLl90cmFuc21pc3Npb24gPSAwOwogICAgICB0aGlzLnNldFZhbHVlcyhwYXJhbWV0ZXJzKTsKICAgIH0KICAgIGdldCBhbmlzb3Ryb3B5KCkgewogICAgICByZXR1cm4gdGhpcy5fYW5pc290cm9weTsKICAgIH0KICAgIHNldCBhbmlzb3Ryb3B5KHZhbHVlKSB7CiAgICAgIGlmICh0aGlzLl9hbmlzb3Ryb3B5ID4gMCAhPT0gdmFsdWUgPiAwKSB7CiAgICAgICAgdGhpcy52ZXJzaW9uKys7CiAgICAgIH0KICAgICAgdGhpcy5fYW5pc290cm9weSA9IHZhbHVlOwogICAgfQogICAgZ2V0IGNsZWFyY29hdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2NsZWFyY29hdDsKICAgIH0KICAgIHNldCBjbGVhcmNvYXQodmFsdWUpIHsKICAgICAgaWYgKHRoaXMuX2NsZWFyY29hdCA+IDAgIT09IHZhbHVlID4gMCkgewogICAgICAgIHRoaXMudmVyc2lvbisrOwogICAgICB9CiAgICAgIHRoaXMuX2NsZWFyY29hdCA9IHZhbHVlOwogICAgfQogICAgZ2V0IGlyaWRlc2NlbmNlKCkgewogICAgICByZXR1cm4gdGhpcy5faXJpZGVzY2VuY2U7CiAgICB9CiAgICBzZXQgaXJpZGVzY2VuY2UodmFsdWUpIHsKICAgICAgaWYgKHRoaXMuX2lyaWRlc2NlbmNlID4gMCAhPT0gdmFsdWUgPiAwKSB7CiAgICAgICAgdGhpcy52ZXJzaW9uKys7CiAgICAgIH0KICAgICAgdGhpcy5faXJpZGVzY2VuY2UgPSB2YWx1ZTsKICAgIH0KICAgIGdldCBkaXNwZXJzaW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fZGlzcGVyc2lvbjsKICAgIH0KICAgIHNldCBkaXNwZXJzaW9uKHZhbHVlKSB7CiAgICAgIGlmICh0aGlzLl9kaXNwZXJzaW9uID4gMCAhPT0gdmFsdWUgPiAwKSB7CiAgICAgICAgdGhpcy52ZXJzaW9uKys7CiAgICAgIH0KICAgICAgdGhpcy5fZGlzcGVyc2lvbiA9IHZhbHVlOwogICAgfQogICAgZ2V0IHNoZWVuKCkgewogICAgICByZXR1cm4gdGhpcy5fc2hlZW47CiAgICB9CiAgICBzZXQgc2hlZW4odmFsdWUpIHsKICAgICAgaWYgKHRoaXMuX3NoZWVuID4gMCAhPT0gdmFsdWUgPiAwKSB7CiAgICAgICAgdGhpcy52ZXJzaW9uKys7CiAgICAgIH0KICAgICAgdGhpcy5fc2hlZW4gPSB2YWx1ZTsKICAgIH0KICAgIGdldCB0cmFuc21pc3Npb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl90cmFuc21pc3Npb247CiAgICB9CiAgICBzZXQgdHJhbnNtaXNzaW9uKHZhbHVlKSB7CiAgICAgIGlmICh0aGlzLl90cmFuc21pc3Npb24gPiAwICE9PSB2YWx1ZSA+IDApIHsKICAgICAgICB0aGlzLnZlcnNpb24rKzsKICAgICAgfQogICAgICB0aGlzLl90cmFuc21pc3Npb24gPSB2YWx1ZTsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5kZWZpbmVzID0gewogICAgICAgIFNUQU5EQVJEOiAiIiwKICAgICAgICBQSFlTSUNBTDogIiIKICAgICAgfTsKICAgICAgdGhpcy5hbmlzb3Ryb3B5ID0gc291cmNlLmFuaXNvdHJvcHk7CiAgICAgIHRoaXMuYW5pc290cm9weVJvdGF0aW9uID0gc291cmNlLmFuaXNvdHJvcHlSb3RhdGlvbjsKICAgICAgdGhpcy5hbmlzb3Ryb3B5TWFwID0gc291cmNlLmFuaXNvdHJvcHlNYXA7CiAgICAgIHRoaXMuY2xlYXJjb2F0ID0gc291cmNlLmNsZWFyY29hdDsKICAgICAgdGhpcy5jbGVhcmNvYXRNYXAgPSBzb3VyY2UuY2xlYXJjb2F0TWFwOwogICAgICB0aGlzLmNsZWFyY29hdFJvdWdobmVzcyA9IHNvdXJjZS5jbGVhcmNvYXRSb3VnaG5lc3M7CiAgICAgIHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwID0gc291cmNlLmNsZWFyY29hdFJvdWdobmVzc01hcDsKICAgICAgdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAgPSBzb3VyY2UuY2xlYXJjb2F0Tm9ybWFsTWFwOwogICAgICB0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLmNvcHkoc291cmNlLmNsZWFyY29hdE5vcm1hbFNjYWxlKTsKICAgICAgdGhpcy5kaXNwZXJzaW9uID0gc291cmNlLmRpc3BlcnNpb247CiAgICAgIHRoaXMuaW9yID0gc291cmNlLmlvcjsKICAgICAgdGhpcy5pcmlkZXNjZW5jZSA9IHNvdXJjZS5pcmlkZXNjZW5jZTsKICAgICAgdGhpcy5pcmlkZXNjZW5jZU1hcCA9IHNvdXJjZS5pcmlkZXNjZW5jZU1hcDsKICAgICAgdGhpcy5pcmlkZXNjZW5jZUlPUiA9IHNvdXJjZS5pcmlkZXNjZW5jZUlPUjsKICAgICAgdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlID0gWy4uLnNvdXJjZS5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlXTsKICAgICAgdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCA9IHNvdXJjZS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcDsKICAgICAgdGhpcy5zaGVlbiA9IHNvdXJjZS5zaGVlbjsKICAgICAgdGhpcy5zaGVlbkNvbG9yLmNvcHkoc291cmNlLnNoZWVuQ29sb3IpOwogICAgICB0aGlzLnNoZWVuQ29sb3JNYXAgPSBzb3VyY2Uuc2hlZW5Db2xvck1hcDsKICAgICAgdGhpcy5zaGVlblJvdWdobmVzcyA9IHNvdXJjZS5zaGVlblJvdWdobmVzczsKICAgICAgdGhpcy5zaGVlblJvdWdobmVzc01hcCA9IHNvdXJjZS5zaGVlblJvdWdobmVzc01hcDsKICAgICAgdGhpcy50cmFuc21pc3Npb24gPSBzb3VyY2UudHJhbnNtaXNzaW9uOwogICAgICB0aGlzLnRyYW5zbWlzc2lvbk1hcCA9IHNvdXJjZS50cmFuc21pc3Npb25NYXA7CiAgICAgIHRoaXMudGhpY2tuZXNzID0gc291cmNlLnRoaWNrbmVzczsKICAgICAgdGhpcy50aGlja25lc3NNYXAgPSBzb3VyY2UudGhpY2tuZXNzTWFwOwogICAgICB0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UgPSBzb3VyY2UuYXR0ZW51YXRpb25EaXN0YW5jZTsKICAgICAgdGhpcy5hdHRlbnVhdGlvbkNvbG9yLmNvcHkoc291cmNlLmF0dGVudWF0aW9uQ29sb3IpOwogICAgICB0aGlzLnNwZWN1bGFySW50ZW5zaXR5ID0gc291cmNlLnNwZWN1bGFySW50ZW5zaXR5OwogICAgICB0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwID0gc291cmNlLnNwZWN1bGFySW50ZW5zaXR5TWFwOwogICAgICB0aGlzLnNwZWN1bGFyQ29sb3IuY29weShzb3VyY2Uuc3BlY3VsYXJDb2xvcik7CiAgICAgIHRoaXMuc3BlY3VsYXJDb2xvck1hcCA9IHNvdXJjZS5zcGVjdWxhckNvbG9yTWFwOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIE1lc2hQaG9uZ01hdGVyaWFsID0gY2xhc3MgTWVzaFBob25nTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7CiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNNZXNoUGhvbmdNYXRlcmlhbCA9IHRydWU7CiAgICAgIHRoaXMudHlwZSA9ICJNZXNoUGhvbmdNYXRlcmlhbCI7CiAgICAgIHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoMTY3NzcyMTUpOwogICAgICB0aGlzLnNwZWN1bGFyID0gbmV3IENvbG9yKDExMTg0ODEpOwogICAgICB0aGlzLnNoaW5pbmVzcyA9IDMwOwogICAgICB0aGlzLm1hcCA9IG51bGw7CiAgICAgIHRoaXMubGlnaHRNYXAgPSBudWxsOwogICAgICB0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMTsKICAgICAgdGhpcy5hb01hcCA9IG51bGw7CiAgICAgIHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxOwogICAgICB0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKDApOwogICAgICB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMTsKICAgICAgdGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7CiAgICAgIHRoaXMuYnVtcE1hcCA9IG51bGw7CiAgICAgIHRoaXMuYnVtcFNjYWxlID0gMTsKICAgICAgdGhpcy5ub3JtYWxNYXAgPSBudWxsOwogICAgICB0aGlzLm5vcm1hbE1hcFR5cGUgPSBUYW5nZW50U3BhY2VOb3JtYWxNYXA7CiAgICAgIHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMigxLCAxKTsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsOwogICAgICB0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDsKICAgICAgdGhpcy5zcGVjdWxhck1hcCA9IG51bGw7CiAgICAgIHRoaXMuYWxwaGFNYXAgPSBudWxsOwogICAgICB0aGlzLmVudk1hcCA9IG51bGw7CiAgICAgIHRoaXMuZW52TWFwUm90YXRpb24gPSBuZXcgRXVsZXI7CiAgICAgIHRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uOwogICAgICB0aGlzLnJlZmxlY3Rpdml0eSA9IDE7CiAgICAgIHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODsKICAgICAgdGhpcy53aXJlZnJhbWUgPSBmYWxzZTsKICAgICAgdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxOwogICAgICB0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAicm91bmQiOwogICAgICB0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gInJvdW5kIjsKICAgICAgdGhpcy5mbGF0U2hhZGluZyA9IGZhbHNlOwogICAgICB0aGlzLmZvZyA9IHRydWU7CiAgICAgIHRoaXMuc2V0VmFsdWVzKHBhcmFtZXRlcnMpOwogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLmNvbG9yLmNvcHkoc291cmNlLmNvbG9yKTsKICAgICAgdGhpcy5zcGVjdWxhci5jb3B5KHNvdXJjZS5zcGVjdWxhcik7CiAgICAgIHRoaXMuc2hpbmluZXNzID0gc291cmNlLnNoaW5pbmVzczsKICAgICAgdGhpcy5tYXAgPSBzb3VyY2UubWFwOwogICAgICB0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwOwogICAgICB0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5OwogICAgICB0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwOwogICAgICB0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5OwogICAgICB0aGlzLmVtaXNzaXZlLmNvcHkoc291cmNlLmVtaXNzaXZlKTsKICAgICAgdGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDsKICAgICAgdGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTsKICAgICAgdGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7CiAgICAgIHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTsKICAgICAgdGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwOwogICAgICB0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTsKICAgICAgdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHNvdXJjZS5ub3JtYWxTY2FsZSk7CiAgICAgIHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7CiAgICAgIHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7CiAgICAgIHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7CiAgICAgIHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDsKICAgICAgdGhpcy5lbnZNYXBSb3RhdGlvbi5jb3B5KHNvdXJjZS5lbnZNYXBSb3RhdGlvbik7CiAgICAgIHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lOwogICAgICB0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7CiAgICAgIHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbzsKICAgICAgdGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lOwogICAgICB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CiAgICAgIHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwOwogICAgICB0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luOwogICAgICB0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nOwogICAgICB0aGlzLmZvZyA9IHNvdXJjZS5mb2c7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH07CiAgTWVzaFRvb25NYXRlcmlhbCA9IGNsYXNzIE1lc2hUb29uTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7CiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNNZXNoVG9vbk1hdGVyaWFsID0gdHJ1ZTsKICAgICAgdGhpcy5kZWZpbmVzID0geyBUT09OOiAiIiB9OwogICAgICB0aGlzLnR5cGUgPSAiTWVzaFRvb25NYXRlcmlhbCI7CiAgICAgIHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoMTY3NzcyMTUpOwogICAgICB0aGlzLm1hcCA9IG51bGw7CiAgICAgIHRoaXMuZ3JhZGllbnRNYXAgPSBudWxsOwogICAgICB0aGlzLmxpZ2h0TWFwID0gbnVsbDsKICAgICAgdGhpcy5saWdodE1hcEludGVuc2l0eSA9IDE7CiAgICAgIHRoaXMuYW9NYXAgPSBudWxsOwogICAgICB0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMTsKICAgICAgdGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvcigwKTsKICAgICAgdGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDE7CiAgICAgIHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsOwogICAgICB0aGlzLmJ1bXBNYXAgPSBudWxsOwogICAgICB0aGlzLmJ1bXBTY2FsZSA9IDE7CiAgICAgIHRoaXMubm9ybWFsTWFwID0gbnVsbDsKICAgICAgdGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwOwogICAgICB0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoMSwgMSk7CiAgICAgIHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7CiAgICAgIHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7CiAgICAgIHRoaXMuYWxwaGFNYXAgPSBudWxsOwogICAgICB0aGlzLndpcmVmcmFtZSA9IGZhbHNlOwogICAgICB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7CiAgICAgIHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICJyb3VuZCI7CiAgICAgIHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAicm91bmQiOwogICAgICB0aGlzLmZvZyA9IHRydWU7CiAgICAgIHRoaXMuc2V0VmFsdWVzKHBhcmFtZXRlcnMpOwogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLmNvbG9yLmNvcHkoc291cmNlLmNvbG9yKTsKICAgICAgdGhpcy5tYXAgPSBzb3VyY2UubWFwOwogICAgICB0aGlzLmdyYWRpZW50TWFwID0gc291cmNlLmdyYWRpZW50TWFwOwogICAgICB0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwOwogICAgICB0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5OwogICAgICB0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwOwogICAgICB0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5OwogICAgICB0aGlzLmVtaXNzaXZlLmNvcHkoc291cmNlLmVtaXNzaXZlKTsKICAgICAgdGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDsKICAgICAgdGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTsKICAgICAgdGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7CiAgICAgIHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTsKICAgICAgdGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwOwogICAgICB0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTsKICAgICAgdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHNvdXJjZS5ub3JtYWxTY2FsZSk7CiAgICAgIHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7CiAgICAgIHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7CiAgICAgIHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKICAgICAgdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoOwogICAgICB0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDsKICAgICAgdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjsKICAgICAgdGhpcy5mb2cgPSBzb3VyY2UuZm9nOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIE1lc2hOb3JtYWxNYXRlcmlhbCA9IGNsYXNzIE1lc2hOb3JtYWxNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHsKICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5pc01lc2hOb3JtYWxNYXRlcmlhbCA9IHRydWU7CiAgICAgIHRoaXMudHlwZSA9ICJNZXNoTm9ybWFsTWF0ZXJpYWwiOwogICAgICB0aGlzLmJ1bXBNYXAgPSBudWxsOwogICAgICB0aGlzLmJ1bXBTY2FsZSA9IDE7CiAgICAgIHRoaXMubm9ybWFsTWFwID0gbnVsbDsKICAgICAgdGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwOwogICAgICB0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoMSwgMSk7CiAgICAgIHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7CiAgICAgIHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7CiAgICAgIHRoaXMud2lyZWZyYW1lID0gZmFsc2U7CiAgICAgIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTsKICAgICAgdGhpcy5mbGF0U2hhZGluZyA9IGZhbHNlOwogICAgICB0aGlzLnNldFZhbHVlcyhwYXJhbWV0ZXJzKTsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7CiAgICAgIHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTsKICAgICAgdGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwOwogICAgICB0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTsKICAgICAgdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHNvdXJjZS5ub3JtYWxTY2FsZSk7CiAgICAgIHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7CiAgICAgIHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKICAgICAgdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoOwogICAgICB0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIE1lc2hMYW1iZXJ0TWF0ZXJpYWwgPSBjbGFzcyBNZXNoTGFtYmVydE1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwgewogICAgY29uc3RydWN0b3IocGFyYW1ldGVycykgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzTWVzaExhbWJlcnRNYXRlcmlhbCA9IHRydWU7CiAgICAgIHRoaXMudHlwZSA9ICJNZXNoTGFtYmVydE1hdGVyaWFsIjsKICAgICAgdGhpcy5jb2xvciA9IG5ldyBDb2xvcigxNjc3NzIxNSk7CiAgICAgIHRoaXMubWFwID0gbnVsbDsKICAgICAgdGhpcy5saWdodE1hcCA9IG51bGw7CiAgICAgIHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxOwogICAgICB0aGlzLmFvTWFwID0gbnVsbDsKICAgICAgdGhpcy5hb01hcEludGVuc2l0eSA9IDE7CiAgICAgIHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoMCk7CiAgICAgIHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxOwogICAgICB0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDsKICAgICAgdGhpcy5idW1wTWFwID0gbnVsbDsKICAgICAgdGhpcy5idW1wU2NhbGUgPSAxOwogICAgICB0aGlzLm5vcm1hbE1hcCA9IG51bGw7CiAgICAgIHRoaXMubm9ybWFsTWFwVHlwZSA9IFRhbmdlbnRTcGFjZU5vcm1hbE1hcDsKICAgICAgdGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKDEsIDEpOwogICAgICB0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7CiAgICAgIHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxOwogICAgICB0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwOwogICAgICB0aGlzLnNwZWN1bGFyTWFwID0gbnVsbDsKICAgICAgdGhpcy5hbHBoYU1hcCA9IG51bGw7CiAgICAgIHRoaXMuZW52TWFwID0gbnVsbDsKICAgICAgdGhpcy5lbnZNYXBSb3RhdGlvbiA9IG5ldyBFdWxlcjsKICAgICAgdGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247CiAgICAgIHRoaXMucmVmbGVjdGl2aXR5ID0gMTsKICAgICAgdGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4OwogICAgICB0aGlzLndpcmVmcmFtZSA9IGZhbHNlOwogICAgICB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7CiAgICAgIHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICJyb3VuZCI7CiAgICAgIHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAicm91bmQiOwogICAgICB0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7CiAgICAgIHRoaXMuZm9nID0gdHJ1ZTsKICAgICAgdGhpcy5zZXRWYWx1ZXMocGFyYW1ldGVycyk7CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMuY29sb3IuY29weShzb3VyY2UuY29sb3IpOwogICAgICB0aGlzLm1hcCA9IHNvdXJjZS5tYXA7CiAgICAgIHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7CiAgICAgIHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7CiAgICAgIHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7CiAgICAgIHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7CiAgICAgIHRoaXMuZW1pc3NpdmUuY29weShzb3VyY2UuZW1pc3NpdmUpOwogICAgICB0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwOwogICAgICB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5OwogICAgICB0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDsKICAgICAgdGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlOwogICAgICB0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7CiAgICAgIHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlOwogICAgICB0aGlzLm5vcm1hbFNjYWxlLmNvcHkoc291cmNlLm5vcm1hbFNjYWxlKTsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwOwogICAgICB0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlOwogICAgICB0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhczsKICAgICAgdGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDsKICAgICAgdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKICAgICAgdGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwOwogICAgICB0aGlzLmVudk1hcFJvdGF0aW9uLmNvcHkoc291cmNlLmVudk1hcFJvdGF0aW9uKTsKICAgICAgdGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7CiAgICAgIHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTsKICAgICAgdGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvOwogICAgICB0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7CiAgICAgIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDsKICAgICAgdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7CiAgICAgIHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47CiAgICAgIHRoaXMuZmxhdFNoYWRpbmcgPSBzb3VyY2UuZmxhdFNoYWRpbmc7CiAgICAgIHRoaXMuZm9nID0gc291cmNlLmZvZzsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBNZXNoRGVwdGhNYXRlcmlhbCA9IGNsYXNzIE1lc2hEZXB0aE1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwgewogICAgY29uc3RydWN0b3IocGFyYW1ldGVycykgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzTWVzaERlcHRoTWF0ZXJpYWwgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiTWVzaERlcHRoTWF0ZXJpYWwiOwogICAgICB0aGlzLmRlcHRoUGFja2luZyA9IEJhc2ljRGVwdGhQYWNraW5nOwogICAgICB0aGlzLm1hcCA9IG51bGw7CiAgICAgIHRoaXMuYWxwaGFNYXAgPSBudWxsOwogICAgICB0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7CiAgICAgIHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxOwogICAgICB0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwOwogICAgICB0aGlzLndpcmVmcmFtZSA9IGZhbHNlOwogICAgICB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7CiAgICAgIHRoaXMuc2V0VmFsdWVzKHBhcmFtZXRlcnMpOwogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLmRlcHRoUGFja2luZyA9IHNvdXJjZS5kZXB0aFBhY2tpbmc7CiAgICAgIHRoaXMubWFwID0gc291cmNlLm1hcDsKICAgICAgdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwOwogICAgICB0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlOwogICAgICB0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhczsKICAgICAgdGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lOwogICAgICB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH07CiAgTWVzaERpc3RhbmNlTWF0ZXJpYWwgPSBjbGFzcyBNZXNoRGlzdGFuY2VNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHsKICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5pc01lc2hEaXN0YW5jZU1hdGVyaWFsID0gdHJ1ZTsKICAgICAgdGhpcy50eXBlID0gIk1lc2hEaXN0YW5jZU1hdGVyaWFsIjsKICAgICAgdGhpcy5tYXAgPSBudWxsOwogICAgICB0aGlzLmFscGhhTWFwID0gbnVsbDsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsOwogICAgICB0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDsKICAgICAgdGhpcy5zZXRWYWx1ZXMocGFyYW1ldGVycyk7CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMubWFwID0gc291cmNlLm1hcDsKICAgICAgdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwOwogICAgICB0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlOwogICAgICB0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhczsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBNZXNoTWF0Y2FwTWF0ZXJpYWwgPSBjbGFzcyBNZXNoTWF0Y2FwTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7CiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNNZXNoTWF0Y2FwTWF0ZXJpYWwgPSB0cnVlOwogICAgICB0aGlzLmRlZmluZXMgPSB7IE1BVENBUDogIiIgfTsKICAgICAgdGhpcy50eXBlID0gIk1lc2hNYXRjYXBNYXRlcmlhbCI7CiAgICAgIHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoMTY3NzcyMTUpOwogICAgICB0aGlzLm1hdGNhcCA9IG51bGw7CiAgICAgIHRoaXMubWFwID0gbnVsbDsKICAgICAgdGhpcy5idW1wTWFwID0gbnVsbDsKICAgICAgdGhpcy5idW1wU2NhbGUgPSAxOwogICAgICB0aGlzLm5vcm1hbE1hcCA9IG51bGw7CiAgICAgIHRoaXMubm9ybWFsTWFwVHlwZSA9IFRhbmdlbnRTcGFjZU5vcm1hbE1hcDsKICAgICAgdGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKDEsIDEpOwogICAgICB0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7CiAgICAgIHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxOwogICAgICB0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwOwogICAgICB0aGlzLmFscGhhTWFwID0gbnVsbDsKICAgICAgdGhpcy5mbGF0U2hhZGluZyA9IGZhbHNlOwogICAgICB0aGlzLmZvZyA9IHRydWU7CiAgICAgIHRoaXMuc2V0VmFsdWVzKHBhcmFtZXRlcnMpOwogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLmRlZmluZXMgPSB7IE1BVENBUDogIiIgfTsKICAgICAgdGhpcy5jb2xvci5jb3B5KHNvdXJjZS5jb2xvcik7CiAgICAgIHRoaXMubWF0Y2FwID0gc291cmNlLm1hdGNhcDsKICAgICAgdGhpcy5tYXAgPSBzb3VyY2UubWFwOwogICAgICB0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDsKICAgICAgdGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlOwogICAgICB0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7CiAgICAgIHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlOwogICAgICB0aGlzLm5vcm1hbFNjYWxlLmNvcHkoc291cmNlLm5vcm1hbFNjYWxlKTsKICAgICAgdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwOwogICAgICB0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlOwogICAgICB0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhczsKICAgICAgdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKICAgICAgdGhpcy5mbGF0U2hhZGluZyA9IHNvdXJjZS5mbGF0U2hhZGluZzsKICAgICAgdGhpcy5mb2cgPSBzb3VyY2UuZm9nOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIExpbmVEYXNoZWRNYXRlcmlhbCA9IGNsYXNzIExpbmVEYXNoZWRNYXRlcmlhbCBleHRlbmRzIExpbmVCYXNpY01hdGVyaWFsIHsKICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5pc0xpbmVEYXNoZWRNYXRlcmlhbCA9IHRydWU7CiAgICAgIHRoaXMudHlwZSA9ICJMaW5lRGFzaGVkTWF0ZXJpYWwiOwogICAgICB0aGlzLnNjYWxlID0gMTsKICAgICAgdGhpcy5kYXNoU2l6ZSA9IDM7CiAgICAgIHRoaXMuZ2FwU2l6ZSA9IDE7CiAgICAgIHRoaXMuc2V0VmFsdWVzKHBhcmFtZXRlcnMpOwogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLnNjYWxlID0gc291cmNlLnNjYWxlOwogICAgICB0aGlzLmRhc2hTaXplID0gc291cmNlLmRhc2hTaXplOwogICAgICB0aGlzLmdhcFNpemUgPSBzb3VyY2UuZ2FwU2l6ZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBBbmltYXRpb25VdGlscyA9IHsKICAgIGNvbnZlcnRBcnJheSwKICAgIGlzVHlwZWRBcnJheSwKICAgIGdldEtleWZyYW1lT3JkZXIsCiAgICBzb3J0ZWRBcnJheSwKICAgIGZsYXR0ZW5KU09OLAogICAgc3ViY2xpcCwKICAgIG1ha2VDbGlwQWRkaXRpdmUKICB9OwogIEN1YmljSW50ZXJwb2xhbnQgPSBjbGFzcyBDdWJpY0ludGVycG9sYW50IGV4dGVuZHMgSW50ZXJwb2xhbnQgewogICAgY29uc3RydWN0b3IocGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlcikgewogICAgICBzdXBlcihwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyKTsKICAgICAgdGhpcy5fd2VpZ2h0UHJldiA9IC0wOwogICAgICB0aGlzLl9vZmZzZXRQcmV2ID0gLTA7CiAgICAgIHRoaXMuX3dlaWdodE5leHQgPSAtMDsKICAgICAgdGhpcy5fb2Zmc2V0TmV4dCA9IC0wOwogICAgICB0aGlzLkRlZmF1bHRTZXR0aW5nc18gPSB7CiAgICAgICAgZW5kaW5nU3RhcnQ6IFplcm9DdXJ2YXR1cmVFbmRpbmcsCiAgICAgICAgZW5kaW5nRW5kOiBaZXJvQ3VydmF0dXJlRW5kaW5nCiAgICAgIH07CiAgICB9CiAgICBpbnRlcnZhbENoYW5nZWRfKGkxLCB0MCwgdDEpIHsKICAgICAgY29uc3QgcHAgPSB0aGlzLnBhcmFtZXRlclBvc2l0aW9uczsKICAgICAgbGV0IGlQcmV2ID0gaTEgLSAyLCBpTmV4dCA9IGkxICsgMSwgdFByZXYgPSBwcFtpUHJldl0sIHROZXh0ID0gcHBbaU5leHRdOwogICAgICBpZiAodFByZXYgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHN3aXRjaCAodGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdTdGFydCkgewogICAgICAgICAgY2FzZSBaZXJvU2xvcGVFbmRpbmc6CiAgICAgICAgICAgIGlQcmV2ID0gaTE7CiAgICAgICAgICAgIHRQcmV2ID0gMiAqIHQwIC0gdDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBXcmFwQXJvdW5kRW5kaW5nOgogICAgICAgICAgICBpUHJldiA9IHBwLmxlbmd0aCAtIDI7CiAgICAgICAgICAgIHRQcmV2ID0gdDAgKyBwcFtpUHJldl0gLSBwcFtpUHJldiArIDFdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGlQcmV2ID0gaTE7CiAgICAgICAgICAgIHRQcmV2ID0gdDE7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0TmV4dCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgc3dpdGNoICh0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ0VuZCkgewogICAgICAgICAgY2FzZSBaZXJvU2xvcGVFbmRpbmc6CiAgICAgICAgICAgIGlOZXh0ID0gaTE7CiAgICAgICAgICAgIHROZXh0ID0gMiAqIHQxIC0gdDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBXcmFwQXJvdW5kRW5kaW5nOgogICAgICAgICAgICBpTmV4dCA9IDE7CiAgICAgICAgICAgIHROZXh0ID0gdDEgKyBwcFsxXSAtIHBwWzBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGlOZXh0ID0gaTEgLSAxOwogICAgICAgICAgICB0TmV4dCA9IHQwOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBoYWxmRHQgPSAodDEgLSB0MCkgKiAwLjUsIHN0cmlkZSA9IHRoaXMudmFsdWVTaXplOwogICAgICB0aGlzLl93ZWlnaHRQcmV2ID0gaGFsZkR0IC8gKHQwIC0gdFByZXYpOwogICAgICB0aGlzLl93ZWlnaHROZXh0ID0gaGFsZkR0IC8gKHROZXh0IC0gdDEpOwogICAgICB0aGlzLl9vZmZzZXRQcmV2ID0gaVByZXYgKiBzdHJpZGU7CiAgICAgIHRoaXMuX29mZnNldE5leHQgPSBpTmV4dCAqIHN0cmlkZTsKICAgIH0KICAgIGludGVycG9sYXRlXyhpMSwgdDAsIHQsIHQxKSB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLCB2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcywgc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsIG8xID0gaTEgKiBzdHJpZGUsIG8wID0gbzEgLSBzdHJpZGUsIG9QID0gdGhpcy5fb2Zmc2V0UHJldiwgb04gPSB0aGlzLl9vZmZzZXROZXh0LCB3UCA9IHRoaXMuX3dlaWdodFByZXYsIHdOID0gdGhpcy5fd2VpZ2h0TmV4dCwgcCA9ICh0IC0gdDApIC8gKHQxIC0gdDApLCBwcCA9IHAgKiBwLCBwcHAgPSBwcCAqIHA7CiAgICAgIGNvbnN0IHNQID0gLXdQICogcHBwICsgMiAqIHdQICogcHAgLSB3UCAqIHA7CiAgICAgIGNvbnN0IHMwID0gKDEgKyB3UCkgKiBwcHAgKyAoLTEuNSAtIDIgKiB3UCkgKiBwcCArICgtMC41ICsgd1ApICogcCArIDE7CiAgICAgIGNvbnN0IHMxID0gKC0xIC0gd04pICogcHBwICsgKDEuNSArIHdOKSAqIHBwICsgMC41ICogcDsKICAgICAgY29uc3Qgc04gPSB3TiAqIHBwcCAtIHdOICogcHA7CiAgICAgIGZvciAobGV0IGkgPSAwO2kgIT09IHN0cmlkZTsgKytpKSB7CiAgICAgICAgcmVzdWx0W2ldID0gc1AgKiB2YWx1ZXNbb1AgKyBpXSArIHMwICogdmFsdWVzW28wICsgaV0gKyBzMSAqIHZhbHVlc1tvMSArIGldICsgc04gKiB2YWx1ZXNbb04gKyBpXTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogIH07CiAgTGluZWFySW50ZXJwb2xhbnQgPSBjbGFzcyBMaW5lYXJJbnRlcnBvbGFudCBleHRlbmRzIEludGVycG9sYW50IHsKICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIpIHsKICAgICAgc3VwZXIocGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlcik7CiAgICB9CiAgICBpbnRlcnBvbGF0ZV8oaTEsIHQwLCB0LCB0MSkgewogICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlciwgdmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsIHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLCBvZmZzZXQxID0gaTEgKiBzdHJpZGUsIG9mZnNldDAgPSBvZmZzZXQxIC0gc3RyaWRlLCB3ZWlnaHQxID0gKHQgLSB0MCkgLyAodDEgLSB0MCksIHdlaWdodDAgPSAxIC0gd2VpZ2h0MTsKICAgICAgZm9yIChsZXQgaSA9IDA7aSAhPT0gc3RyaWRlOyArK2kpIHsKICAgICAgICByZXN1bHRbaV0gPSB2YWx1ZXNbb2Zmc2V0MCArIGldICogd2VpZ2h0MCArIHZhbHVlc1tvZmZzZXQxICsgaV0gKiB3ZWlnaHQxOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgfTsKICBEaXNjcmV0ZUludGVycG9sYW50ID0gY2xhc3MgRGlzY3JldGVJbnRlcnBvbGFudCBleHRlbmRzIEludGVycG9sYW50IHsKICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIpIHsKICAgICAgc3VwZXIocGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlcik7CiAgICB9CiAgICBpbnRlcnBvbGF0ZV8oaTEpIHsKICAgICAgcmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyhpMSAtIDEpOwogICAgfQogIH07CiAgS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVGltZUJ1ZmZlclR5cGUgPSBGbG9hdDMyQXJyYXk7CiAgS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlID0gRmxvYXQzMkFycmF5OwogIEtleWZyYW1lVHJhY2sucHJvdG90eXBlLkRlZmF1bHRJbnRlcnBvbGF0aW9uID0gSW50ZXJwb2xhdGVMaW5lYXI7CiAgQm9vbGVhbktleWZyYW1lVHJhY2sgPSBjbGFzcyBCb29sZWFuS2V5ZnJhbWVUcmFjayBleHRlbmRzIEtleWZyYW1lVHJhY2sgewogICAgY29uc3RydWN0b3IobmFtZSwgdGltZXMsIHZhbHVlcykgewogICAgICBzdXBlcihuYW1lLCB0aW1lcywgdmFsdWVzKTsKICAgIH0KICB9OwogIEJvb2xlYW5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lID0gImJvb2wiOwogIEJvb2xlYW5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZUJ1ZmZlclR5cGUgPSBBcnJheTsKICBCb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb24gPSBJbnRlcnBvbGF0ZURpc2NyZXRlOwogIEJvb2xlYW5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXIgPSB1bmRlZmluZWQ7CiAgQm9vbGVhbktleWZyYW1lVHJhY2sucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aCA9IHVuZGVmaW5lZDsKICBDb2xvcktleWZyYW1lVHJhY2sgPSBjbGFzcyBDb2xvcktleWZyYW1lVHJhY2sgZXh0ZW5kcyBLZXlmcmFtZVRyYWNrIHsKICB9OwogIENvbG9yS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICJjb2xvciI7CiAgTnVtYmVyS2V5ZnJhbWVUcmFjayA9IGNsYXNzIE51bWJlcktleWZyYW1lVHJhY2sgZXh0ZW5kcyBLZXlmcmFtZVRyYWNrIHsKICB9OwogIE51bWJlcktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAibnVtYmVyIjsKICBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQgPSBjbGFzcyBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQgZXh0ZW5kcyBJbnRlcnBvbGFudCB7CiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyKSB7CiAgICAgIHN1cGVyKHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIpOwogICAgfQogICAgaW50ZXJwb2xhdGVfKGkxLCB0MCwgdCwgdDEpIHsKICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsIHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLCBzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSwgYWxwaGEgPSAodCAtIHQwKSAvICh0MSAtIHQwKTsKICAgICAgbGV0IG9mZnNldCA9IGkxICogc3RyaWRlOwogICAgICBmb3IgKGxldCBlbmQgPSBvZmZzZXQgKyBzdHJpZGU7b2Zmc2V0ICE9PSBlbmQ7IG9mZnNldCArPSA0KSB7CiAgICAgICAgUXVhdGVybmlvbi5zbGVycEZsYXQocmVzdWx0LCAwLCB2YWx1ZXMsIG9mZnNldCAtIHN0cmlkZSwgdmFsdWVzLCBvZmZzZXQsIGFscGhhKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogIH07CiAgUXVhdGVybmlvbktleWZyYW1lVHJhY2sgPSBjbGFzcyBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayBleHRlbmRzIEtleWZyYW1lVHJhY2sgewogICAgSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyKHJlc3VsdCkgewogICAgICByZXR1cm4gbmV3IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCh0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0KTsKICAgIH0KICB9OwogIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lID0gInF1YXRlcm5pb24iOwogIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGggPSB1bmRlZmluZWQ7CiAgU3RyaW5nS2V5ZnJhbWVUcmFjayA9IGNsYXNzIFN0cmluZ0tleWZyYW1lVHJhY2sgZXh0ZW5kcyBLZXlmcmFtZVRyYWNrIHsKICAgIGNvbnN0cnVjdG9yKG5hbWUsIHRpbWVzLCB2YWx1ZXMpIHsKICAgICAgc3VwZXIobmFtZSwgdGltZXMsIHZhbHVlcyk7CiAgICB9CiAgfTsKICBTdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lID0gInN0cmluZyI7CiAgU3RyaW5nS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlID0gQXJyYXk7CiAgU3RyaW5nS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb24gPSBJbnRlcnBvbGF0ZURpc2NyZXRlOwogIFN0cmluZ0tleWZyYW1lVHJhY2sucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhciA9IHVuZGVmaW5lZDsKICBTdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGggPSB1bmRlZmluZWQ7CiAgVmVjdG9yS2V5ZnJhbWVUcmFjayA9IGNsYXNzIFZlY3RvcktleWZyYW1lVHJhY2sgZXh0ZW5kcyBLZXlmcmFtZVRyYWNrIHsKICB9OwogIFZlY3RvcktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAidmVjdG9yIjsKICBDYWNoZSA9IHsKICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgZmlsZXM6IHt9LAogICAgYWRkOiBmdW5jdGlvbihrZXksIGZpbGUpIHsKICAgICAgaWYgKHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLmZpbGVzW2tleV0gPSBmaWxlOwogICAgfSwKICAgIGdldDogZnVuY3Rpb24oa2V5KSB7CiAgICAgIGlmICh0aGlzLmVuYWJsZWQgPT09IGZhbHNlKQogICAgICAgIHJldHVybjsKICAgICAgcmV0dXJuIHRoaXMuZmlsZXNba2V5XTsKICAgIH0sCiAgICByZW1vdmU6IGZ1bmN0aW9uKGtleSkgewogICAgICBkZWxldGUgdGhpcy5maWxlc1trZXldOwogICAgfSwKICAgIGNsZWFyOiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5maWxlcyA9IHt9OwogICAgfQogIH07CiAgRGVmYXVsdExvYWRpbmdNYW5hZ2VyID0gLyogQF9fUFVSRV9fICovIG5ldyBMb2FkaW5nTWFuYWdlcjsKICBMb2FkZXIuREVGQVVMVF9NQVRFUklBTF9OQU1FID0gIl9fREVGQVVMVCI7CiAgbG9hZGluZyA9IHt9OwogIEh0dHBFcnJvciA9IGNsYXNzIEh0dHBFcnJvciBleHRlbmRzIEVycm9yIHsKICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHJlc3BvbnNlKSB7CiAgICAgIHN1cGVyKG1lc3NhZ2UpOwogICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CiAgICB9CiAgfTsKICBGaWxlTG9hZGVyID0gY2xhc3MgRmlsZUxvYWRlciBleHRlbmRzIExvYWRlciB7CiAgICBjb25zdHJ1Y3RvcihtYW5hZ2VyKSB7CiAgICAgIHN1cGVyKG1hbmFnZXIpOwogICAgfQogICAgbG9hZCh1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvcikgewogICAgICBpZiAodXJsID09PSB1bmRlZmluZWQpCiAgICAgICAgdXJsID0gIiI7CiAgICAgIGlmICh0aGlzLnBhdGggIT09IHVuZGVmaW5lZCkKICAgICAgICB1cmwgPSB0aGlzLnBhdGggKyB1cmw7CiAgICAgIHVybCA9IHRoaXMubWFuYWdlci5yZXNvbHZlVVJMKHVybCk7CiAgICAgIGNvbnN0IGNhY2hlZCA9IENhY2hlLmdldCh1cmwpOwogICAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB0aGlzLm1hbmFnZXIuaXRlbVN0YXJ0KHVybCk7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBpZiAob25Mb2FkKQogICAgICAgICAgICBvbkxvYWQoY2FjaGVkKTsKICAgICAgICAgIHRoaXMubWFuYWdlci5pdGVtRW5kKHVybCk7CiAgICAgICAgfSwgMCk7CiAgICAgICAgcmV0dXJuIGNhY2hlZDsKICAgICAgfQogICAgICBpZiAobG9hZGluZ1t1cmxdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBsb2FkaW5nW3VybF0ucHVzaCh7CiAgICAgICAgICBvbkxvYWQsCiAgICAgICAgICBvblByb2dyZXNzLAogICAgICAgICAgb25FcnJvcgogICAgICAgIH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBsb2FkaW5nW3VybF0gPSBbXTsKICAgICAgbG9hZGluZ1t1cmxdLnB1c2goewogICAgICAgIG9uTG9hZCwKICAgICAgICBvblByb2dyZXNzLAogICAgICAgIG9uRXJyb3IKICAgICAgfSk7CiAgICAgIGNvbnN0IHJlcSA9IG5ldyBSZXF1ZXN0KHVybCwgewogICAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHRoaXMucmVxdWVzdEhlYWRlciksCiAgICAgICAgY3JlZGVudGlhbHM6IHRoaXMud2l0aENyZWRlbnRpYWxzID8gImluY2x1ZGUiIDogInNhbWUtb3JpZ2luIgogICAgICB9KTsKICAgICAgY29uc3QgbWltZVR5cGUgPSB0aGlzLm1pbWVUeXBlOwogICAgICBjb25zdCByZXNwb25zZVR5cGUgPSB0aGlzLnJlc3BvbnNlVHlwZTsKICAgICAgZmV0Y2gocmVxKS50aGVuKChyZXNwb25zZSkgPT4gewogICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCB8fCByZXNwb25zZS5zdGF0dXMgPT09IDApIHsKICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDApIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLiIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGVvZiBSZWFkYWJsZVN0cmVhbSA9PT0gInVuZGVmaW5lZCIgfHwgcmVzcG9uc2UuYm9keSA9PT0gdW5kZWZpbmVkIHx8IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gbG9hZGluZ1t1cmxdOwogICAgICAgICAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTsKICAgICAgICAgIGNvbnN0IGNvbnRlbnRMZW5ndGggPSByZXNwb25zZS5oZWFkZXJzLmdldCgiWC1GaWxlLVNpemUiKSB8fCByZXNwb25zZS5oZWFkZXJzLmdldCgiQ29udGVudC1MZW5ndGgiKTsKICAgICAgICAgIGNvbnN0IHRvdGFsID0gY29udGVudExlbmd0aCA/IHBhcnNlSW50KGNvbnRlbnRMZW5ndGgpIDogMDsKICAgICAgICAgIGNvbnN0IGxlbmd0aENvbXB1dGFibGUgPSB0b3RhbCAhPT0gMDsKICAgICAgICAgIGxldCBsb2FkZWQgPSAwOwogICAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IFJlYWRhYmxlU3RyZWFtKHsKICAgICAgICAgICAgc3RhcnQoY29udHJvbGxlcikgewogICAgICAgICAgICAgIHJlYWREYXRhKCk7CiAgICAgICAgICAgICAgZnVuY3Rpb24gcmVhZERhdGEoKSB7CiAgICAgICAgICAgICAgICByZWFkZXIucmVhZCgpLnRoZW4oKHsgZG9uZSwgdmFsdWUgfSkgPT4gewogICAgICAgICAgICAgICAgICBpZiAoZG9uZSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsb2FkZWQgKz0gdmFsdWUuYnl0ZUxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBQcm9ncmVzc0V2ZW50KCJwcm9ncmVzcyIsIHsgbGVuZ3RoQ29tcHV0YWJsZSwgbG9hZGVkLCB0b3RhbCB9KTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoO2kgPCBpbDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGNhbGxiYWNrc1tpXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjay5vblByb2dyZXNzKQogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblByb2dyZXNzKGV2ZW50KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICByZWFkRGF0YSgpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCAoZSkgPT4gewogICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmVycm9yKGUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2Uoc3RyZWFtKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEh0dHBFcnJvcihgZmV0Y2ggZm9yICIke3Jlc3BvbnNlLnVybH0iIHJlc3BvbmRlZCB3aXRoICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWAsIHJlc3BvbnNlKTsKICAgICAgICB9CiAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7CiAgICAgICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHsKICAgICAgICAgIGNhc2UgImFycmF5YnVmZmVyIjoKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7CiAgICAgICAgICBjYXNlICJibG9iIjoKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJsb2IoKTsKICAgICAgICAgIGNhc2UgImRvY3VtZW50IjoKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKS50aGVuKCh0ZXh0KSA9PiB7CiAgICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcjsKICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh0ZXh0LCBtaW1lVHlwZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgY2FzZSAianNvbiI6CiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpZiAobWltZVR5cGUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY29uc3QgcmUgPSAvY2hhcnNldD0iPyhbXjsiXHNdKikiPy9pOwogICAgICAgICAgICAgIGNvbnN0IGV4ZWMgPSByZS5leGVjKG1pbWVUeXBlKTsKICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGV4ZWMgJiYgZXhlY1sxXSA/IGV4ZWNbMV0udG9Mb3dlckNhc2UoKSA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKGxhYmVsKTsKICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKS50aGVuKChhYikgPT4gZGVjb2Rlci5kZWNvZGUoYWIpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSkudGhlbigoZGF0YSkgPT4gewogICAgICAgIENhY2hlLmFkZCh1cmwsIGRhdGEpOwogICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IGxvYWRpbmdbdXJsXTsKICAgICAgICBkZWxldGUgbG9hZGluZ1t1cmxdOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gY2FsbGJhY2tzW2ldOwogICAgICAgICAgaWYgKGNhbGxiYWNrLm9uTG9hZCkKICAgICAgICAgICAgY2FsbGJhY2sub25Mb2FkKGRhdGEpOwogICAgICAgIH0KICAgICAgfSkuY2F0Y2goKGVycikgPT4gewogICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IGxvYWRpbmdbdXJsXTsKICAgICAgICBpZiAoY2FsbGJhY2tzID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHRoaXMubWFuYWdlci5pdGVtRXJyb3IodXJsKTsKICAgICAgICAgIHRocm93IGVycjsKICAgICAgICB9CiAgICAgICAgZGVsZXRlIGxvYWRpbmdbdXJsXTsKICAgICAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoO2kgPCBpbDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGNhbGxiYWNrc1tpXTsKICAgICAgICAgIGlmIChjYWxsYmFjay5vbkVycm9yKQogICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKGVycik7CiAgICAgICAgfQogICAgICAgIHRoaXMubWFuYWdlci5pdGVtRXJyb3IodXJsKTsKICAgICAgfSkuZmluYWxseSgoKSA9PiB7CiAgICAgICAgdGhpcy5tYW5hZ2VyLml0ZW1FbmQodXJsKTsKICAgICAgfSk7CiAgICAgIHRoaXMubWFuYWdlci5pdGVtU3RhcnQodXJsKTsKICAgIH0KICAgIHNldFJlc3BvbnNlVHlwZSh2YWx1ZSkgewogICAgICB0aGlzLnJlc3BvbnNlVHlwZSA9IHZhbHVlOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldE1pbWVUeXBlKHZhbHVlKSB7CiAgICAgIHRoaXMubWltZVR5cGUgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBBbmltYXRpb25Mb2FkZXIgPSBjbGFzcyBBbmltYXRpb25Mb2FkZXIgZXh0ZW5kcyBMb2FkZXIgewogICAgY29uc3RydWN0b3IobWFuYWdlcikgewogICAgICBzdXBlcihtYW5hZ2VyKTsKICAgIH0KICAgIGxvYWQodXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IpIHsKICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzOwogICAgICBjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlcih0aGlzLm1hbmFnZXIpOwogICAgICBsb2FkZXIuc2V0UGF0aCh0aGlzLnBhdGgpOwogICAgICBsb2FkZXIuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpOwogICAgICBsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKTsKICAgICAgbG9hZGVyLmxvYWQodXJsLCBmdW5jdGlvbih0ZXh0KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIG9uTG9hZChzY29wZS5wYXJzZShKU09OLnBhcnNlKHRleHQpKSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgaWYgKG9uRXJyb3IpIHsKICAgICAgICAgICAgb25FcnJvcihlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICB9CiAgICAgICAgICBzY29wZS5tYW5hZ2VyLml0ZW1FcnJvcih1cmwpOwogICAgICAgIH0KICAgICAgfSwgb25Qcm9ncmVzcywgb25FcnJvcik7CiAgICB9CiAgICBwYXJzZShqc29uKSB7CiAgICAgIGNvbnN0IGFuaW1hdGlvbnMgPSBbXTsKICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IGpzb24ubGVuZ3RoOyBpKyspIHsKICAgICAgICBjb25zdCBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJzZShqc29uW2ldKTsKICAgICAgICBhbmltYXRpb25zLnB1c2goY2xpcCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGFuaW1hdGlvbnM7CiAgICB9CiAgfTsKICBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciA9IGNsYXNzIENvbXByZXNzZWRUZXh0dXJlTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHsKICAgIGNvbnN0cnVjdG9yKG1hbmFnZXIpIHsKICAgICAgc3VwZXIobWFuYWdlcik7CiAgICB9CiAgICBsb2FkKHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yKSB7CiAgICAgIGNvbnN0IHNjb3BlID0gdGhpczsKICAgICAgY29uc3QgaW1hZ2VzID0gW107CiAgICAgIGNvbnN0IHRleHR1cmUgPSBuZXcgQ29tcHJlc3NlZFRleHR1cmU7CiAgICAgIGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKHRoaXMubWFuYWdlcik7CiAgICAgIGxvYWRlci5zZXRQYXRoKHRoaXMucGF0aCk7CiAgICAgIGxvYWRlci5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7CiAgICAgIGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlcik7CiAgICAgIGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoc2NvcGUud2l0aENyZWRlbnRpYWxzKTsKICAgICAgbGV0IGxvYWRlZCA9IDA7CiAgICAgIGZ1bmN0aW9uIGxvYWRUZXh0dXJlKGkpIHsKICAgICAgICBsb2FkZXIubG9hZCh1cmxbaV0sIGZ1bmN0aW9uKGJ1ZmZlcikgewogICAgICAgICAgY29uc3QgdGV4RGF0YXMgPSBzY29wZS5wYXJzZShidWZmZXIsIHRydWUpOwogICAgICAgICAgaW1hZ2VzW2ldID0gewogICAgICAgICAgICB3aWR0aDogdGV4RGF0YXMud2lkdGgsCiAgICAgICAgICAgIGhlaWdodDogdGV4RGF0YXMuaGVpZ2h0LAogICAgICAgICAgICBmb3JtYXQ6IHRleERhdGFzLmZvcm1hdCwKICAgICAgICAgICAgbWlwbWFwczogdGV4RGF0YXMubWlwbWFwcwogICAgICAgICAgfTsKICAgICAgICAgIGxvYWRlZCArPSAxOwogICAgICAgICAgaWYgKGxvYWRlZCA9PT0gNikgewogICAgICAgICAgICBpZiAodGV4RGF0YXMubWlwbWFwQ291bnQgPT09IDEpCiAgICAgICAgICAgICAgdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7CiAgICAgICAgICAgIHRleHR1cmUuaW1hZ2UgPSBpbWFnZXM7CiAgICAgICAgICAgIHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0OwogICAgICAgICAgICB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKG9uTG9hZCkKICAgICAgICAgICAgICBvbkxvYWQodGV4dHVyZSk7CiAgICAgICAgICB9CiAgICAgICAgfSwgb25Qcm9ncmVzcywgb25FcnJvcik7CiAgICAgIH0KICAgICAgaWYgKEFycmF5LmlzQXJyYXkodXJsKSkgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IHVybC5sZW5ndGg7aSA8IGlsOyArK2kpIHsKICAgICAgICAgIGxvYWRUZXh0dXJlKGkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBsb2FkZXIubG9hZCh1cmwsIGZ1bmN0aW9uKGJ1ZmZlcikgewogICAgICAgICAgY29uc3QgdGV4RGF0YXMgPSBzY29wZS5wYXJzZShidWZmZXIsIHRydWUpOwogICAgICAgICAgaWYgKHRleERhdGFzLmlzQ3ViZW1hcCkgewogICAgICAgICAgICBjb25zdCBmYWNlcyA9IHRleERhdGFzLm1pcG1hcHMubGVuZ3RoIC8gdGV4RGF0YXMubWlwbWFwQ291bnQ7CiAgICAgICAgICAgIGZvciAobGV0IGYgPSAwO2YgPCBmYWNlczsgZisrKSB7CiAgICAgICAgICAgICAgaW1hZ2VzW2ZdID0geyBtaXBtYXBzOiBbXSB9OwogICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwO2kgPCB0ZXhEYXRhcy5taXBtYXBDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpbWFnZXNbZl0ubWlwbWFwcy5wdXNoKHRleERhdGFzLm1pcG1hcHNbZiAqIHRleERhdGFzLm1pcG1hcENvdW50ICsgaV0pOwogICAgICAgICAgICAgICAgaW1hZ2VzW2ZdLmZvcm1hdCA9IHRleERhdGFzLmZvcm1hdDsKICAgICAgICAgICAgICAgIGltYWdlc1tmXS53aWR0aCA9IHRleERhdGFzLndpZHRoOwogICAgICAgICAgICAgICAgaW1hZ2VzW2ZdLmhlaWdodCA9IHRleERhdGFzLmhlaWdodDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGV4dHVyZS5pbWFnZSA9IGltYWdlczsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRleHR1cmUuaW1hZ2Uud2lkdGggPSB0ZXhEYXRhcy53aWR0aDsKICAgICAgICAgICAgdGV4dHVyZS5pbWFnZS5oZWlnaHQgPSB0ZXhEYXRhcy5oZWlnaHQ7CiAgICAgICAgICAgIHRleHR1cmUubWlwbWFwcyA9IHRleERhdGFzLm1pcG1hcHM7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGV4RGF0YXMubWlwbWFwQ291bnQgPT09IDEpIHsKICAgICAgICAgICAgdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7CiAgICAgICAgICB9CiAgICAgICAgICB0ZXh0dXJlLmZvcm1hdCA9IHRleERhdGFzLmZvcm1hdDsKICAgICAgICAgIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICAgICAgaWYgKG9uTG9hZCkKICAgICAgICAgICAgb25Mb2FkKHRleHR1cmUpOwogICAgICAgIH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IpOwogICAgICB9CiAgICAgIHJldHVybiB0ZXh0dXJlOwogICAgfQogIH07CiAgSW1hZ2VMb2FkZXIgPSBjbGFzcyBJbWFnZUxvYWRlciBleHRlbmRzIExvYWRlciB7CiAgICBjb25zdHJ1Y3RvcihtYW5hZ2VyKSB7CiAgICAgIHN1cGVyKG1hbmFnZXIpOwogICAgfQogICAgbG9hZCh1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvcikgewogICAgICBpZiAodGhpcy5wYXRoICE9PSB1bmRlZmluZWQpCiAgICAgICAgdXJsID0gdGhpcy5wYXRoICsgdXJsOwogICAgICB1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCh1cmwpOwogICAgICBjb25zdCBzY29wZSA9IHRoaXM7CiAgICAgIGNvbnN0IGNhY2hlZCA9IENhY2hlLmdldCh1cmwpOwogICAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCh1cmwpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAob25Mb2FkKQogICAgICAgICAgICBvbkxvYWQoY2FjaGVkKTsKICAgICAgICAgIHNjb3BlLm1hbmFnZXIuaXRlbUVuZCh1cmwpOwogICAgICAgIH0sIDApOwogICAgICAgIHJldHVybiBjYWNoZWQ7CiAgICAgIH0KICAgICAgY29uc3QgaW1hZ2UgPSBjcmVhdGVFbGVtZW50TlMoImltZyIpOwogICAgICBmdW5jdGlvbiBvbkltYWdlTG9hZCgpIHsKICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpOwogICAgICAgIENhY2hlLmFkZCh1cmwsIHRoaXMpOwogICAgICAgIGlmIChvbkxvYWQpCiAgICAgICAgICBvbkxvYWQodGhpcyk7CiAgICAgICAgc2NvcGUubWFuYWdlci5pdGVtRW5kKHVybCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gb25JbWFnZUVycm9yKGV2ZW50KSB7CiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTsKICAgICAgICBpZiAob25FcnJvcikKICAgICAgICAgIG9uRXJyb3IoZXZlbnQpOwogICAgICAgIHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKHVybCk7CiAgICAgICAgc2NvcGUubWFuYWdlci5pdGVtRW5kKHVybCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSB7CiAgICAgICAgaW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsIG9uSW1hZ2VMb2FkLCBmYWxzZSk7CiAgICAgICAgaW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBvbkltYWdlRXJyb3IsIGZhbHNlKTsKICAgICAgfQogICAgICBpbWFnZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgb25JbWFnZUxvYWQsIGZhbHNlKTsKICAgICAgaW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBvbkltYWdlRXJyb3IsIGZhbHNlKTsKICAgICAgaWYgKHVybC5zbGljZSgwLCA1KSAhPT0gImRhdGE6IikgewogICAgICAgIGlmICh0aGlzLmNyb3NzT3JpZ2luICE9PSB1bmRlZmluZWQpCiAgICAgICAgICBpbWFnZS5jcm9zc09yaWdpbiA9IHRoaXMuY3Jvc3NPcmlnaW47CiAgICAgIH0KICAgICAgc2NvcGUubWFuYWdlci5pdGVtU3RhcnQodXJsKTsKICAgICAgaW1hZ2Uuc3JjID0gdXJsOwogICAgICByZXR1cm4gaW1hZ2U7CiAgICB9CiAgfTsKICBDdWJlVGV4dHVyZUxvYWRlciA9IGNsYXNzIEN1YmVUZXh0dXJlTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHsKICAgIGNvbnN0cnVjdG9yKG1hbmFnZXIpIHsKICAgICAgc3VwZXIobWFuYWdlcik7CiAgICB9CiAgICBsb2FkKHVybHMsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvcikgewogICAgICBjb25zdCB0ZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlOwogICAgICB0ZXh0dXJlLmNvbG9yU3BhY2UgPSBTUkdCQ29sb3JTcGFjZTsKICAgICAgY29uc3QgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKHRoaXMubWFuYWdlcik7CiAgICAgIGxvYWRlci5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTsKICAgICAgbG9hZGVyLnNldFBhdGgodGhpcy5wYXRoKTsKICAgICAgbGV0IGxvYWRlZCA9IDA7CiAgICAgIGZ1bmN0aW9uIGxvYWRUZXh0dXJlKGkpIHsKICAgICAgICBsb2FkZXIubG9hZCh1cmxzW2ldLCBmdW5jdGlvbihpbWFnZSkgewogICAgICAgICAgdGV4dHVyZS5pbWFnZXNbaV0gPSBpbWFnZTsKICAgICAgICAgIGxvYWRlZCsrOwogICAgICAgICAgaWYgKGxvYWRlZCA9PT0gNikgewogICAgICAgICAgICB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKG9uTG9hZCkKICAgICAgICAgICAgICBvbkxvYWQodGV4dHVyZSk7CiAgICAgICAgICB9CiAgICAgICAgfSwgdW5kZWZpbmVkLCBvbkVycm9yKTsKICAgICAgfQogICAgICBmb3IgKGxldCBpID0gMDtpIDwgdXJscy5sZW5ndGg7ICsraSkgewogICAgICAgIGxvYWRUZXh0dXJlKGkpOwogICAgICB9CiAgICAgIHJldHVybiB0ZXh0dXJlOwogICAgfQogIH07CiAgRGF0YVRleHR1cmVMb2FkZXIgPSBjbGFzcyBEYXRhVGV4dHVyZUxvYWRlciBleHRlbmRzIExvYWRlciB7CiAgICBjb25zdHJ1Y3RvcihtYW5hZ2VyKSB7CiAgICAgIHN1cGVyKG1hbmFnZXIpOwogICAgfQogICAgbG9hZCh1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvcikgewogICAgICBjb25zdCBzY29wZSA9IHRoaXM7CiAgICAgIGNvbnN0IHRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmU7CiAgICAgIGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKHRoaXMubWFuYWdlcik7CiAgICAgIGxvYWRlci5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7CiAgICAgIGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlcik7CiAgICAgIGxvYWRlci5zZXRQYXRoKHRoaXMucGF0aCk7CiAgICAgIGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoc2NvcGUud2l0aENyZWRlbnRpYWxzKTsKICAgICAgbG9hZGVyLmxvYWQodXJsLCBmdW5jdGlvbihidWZmZXIpIHsKICAgICAgICBsZXQgdGV4RGF0YTsKICAgICAgICB0cnkgewogICAgICAgICAgdGV4RGF0YSA9IHNjb3BlLnBhcnNlKGJ1ZmZlcik7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgIGlmIChvbkVycm9yICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgb25FcnJvcihlcnJvcik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGV4RGF0YS5pbWFnZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB0ZXh0dXJlLmltYWdlID0gdGV4RGF0YS5pbWFnZTsKICAgICAgICB9IGVsc2UgaWYgKHRleERhdGEuZGF0YSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB0ZXh0dXJlLmltYWdlLndpZHRoID0gdGV4RGF0YS53aWR0aDsKICAgICAgICAgIHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YS5oZWlnaHQ7CiAgICAgICAgICB0ZXh0dXJlLmltYWdlLmRhdGEgPSB0ZXhEYXRhLmRhdGE7CiAgICAgICAgfQogICAgICAgIHRleHR1cmUud3JhcFMgPSB0ZXhEYXRhLndyYXBTICE9PSB1bmRlZmluZWQgPyB0ZXhEYXRhLndyYXBTIDogQ2xhbXBUb0VkZ2VXcmFwcGluZzsKICAgICAgICB0ZXh0dXJlLndyYXBUID0gdGV4RGF0YS53cmFwVCAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS53cmFwVCA6IENsYW1wVG9FZGdlV3JhcHBpbmc7CiAgICAgICAgdGV4dHVyZS5tYWdGaWx0ZXIgPSB0ZXhEYXRhLm1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS5tYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7CiAgICAgICAgdGV4dHVyZS5taW5GaWx0ZXIgPSB0ZXhEYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS5taW5GaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7CiAgICAgICAgdGV4dHVyZS5hbmlzb3Ryb3B5ID0gdGV4RGF0YS5hbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgPyB0ZXhEYXRhLmFuaXNvdHJvcHkgOiAxOwogICAgICAgIGlmICh0ZXhEYXRhLmNvbG9yU3BhY2UgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGV4dHVyZS5jb2xvclNwYWNlID0gdGV4RGF0YS5jb2xvclNwYWNlOwogICAgICAgIH0KICAgICAgICBpZiAodGV4RGF0YS5mbGlwWSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB0ZXh0dXJlLmZsaXBZID0gdGV4RGF0YS5mbGlwWTsKICAgICAgICB9CiAgICAgICAgaWYgKHRleERhdGEuZm9ybWF0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YS5mb3JtYXQ7CiAgICAgICAgfQogICAgICAgIGlmICh0ZXhEYXRhLnR5cGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGV4dHVyZS50eXBlID0gdGV4RGF0YS50eXBlOwogICAgICAgIH0KICAgICAgICBpZiAodGV4RGF0YS5taXBtYXBzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHRleHR1cmUubWlwbWFwcyA9IHRleERhdGEubWlwbWFwczsKICAgICAgICAgIHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOwogICAgICAgIH0KICAgICAgICBpZiAodGV4RGF0YS5taXBtYXBDb3VudCA9PT0gMSkgewogICAgICAgICAgdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7CiAgICAgICAgfQogICAgICAgIGlmICh0ZXhEYXRhLmdlbmVyYXRlTWlwbWFwcyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IHRleERhdGEuZ2VuZXJhdGVNaXBtYXBzOwogICAgICAgIH0KICAgICAgICB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgICBpZiAob25Mb2FkKQogICAgICAgICAgb25Mb2FkKHRleHR1cmUsIHRleERhdGEpOwogICAgICB9LCBvblByb2dyZXNzLCBvbkVycm9yKTsKICAgICAgcmV0dXJuIHRleHR1cmU7CiAgICB9CiAgfTsKICBUZXh0dXJlTG9hZGVyID0gY2xhc3MgVGV4dHVyZUxvYWRlciBleHRlbmRzIExvYWRlciB7CiAgICBjb25zdHJ1Y3RvcihtYW5hZ2VyKSB7CiAgICAgIHN1cGVyKG1hbmFnZXIpOwogICAgfQogICAgbG9hZCh1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvcikgewogICAgICBjb25zdCB0ZXh0dXJlID0gbmV3IFRleHR1cmU7CiAgICAgIGNvbnN0IGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcih0aGlzLm1hbmFnZXIpOwogICAgICBsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7CiAgICAgIGxvYWRlci5zZXRQYXRoKHRoaXMucGF0aCk7CiAgICAgIGxvYWRlci5sb2FkKHVybCwgZnVuY3Rpb24oaW1hZ2UpIHsKICAgICAgICB0ZXh0dXJlLmltYWdlID0gaW1hZ2U7CiAgICAgICAgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgaWYgKG9uTG9hZCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBvbkxvYWQodGV4dHVyZSk7CiAgICAgICAgfQogICAgICB9LCBvblByb2dyZXNzLCBvbkVycm9yKTsKICAgICAgcmV0dXJuIHRleHR1cmU7CiAgICB9CiAgfTsKICBMaWdodCA9IGNsYXNzIExpZ2h0IGV4dGVuZHMgT2JqZWN0M0QgewogICAgY29uc3RydWN0b3IoY29sb3IsIGludGVuc2l0eSA9IDEpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5pc0xpZ2h0ID0gdHJ1ZTsKICAgICAgdGhpcy50eXBlID0gIkxpZ2h0IjsKICAgICAgdGhpcy5jb2xvciA9IG5ldyBDb2xvcihjb2xvcik7CiAgICAgIHRoaXMuaW50ZW5zaXR5ID0gaW50ZW5zaXR5OwogICAgfQogICAgZGlzcG9zZSgpIHt9CiAgICBjb3B5KHNvdXJjZSwgcmVjdXJzaXZlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlLCByZWN1cnNpdmUpOwogICAgICB0aGlzLmNvbG9yLmNvcHkoc291cmNlLmNvbG9yKTsKICAgICAgdGhpcy5pbnRlbnNpdHkgPSBzb3VyY2UuaW50ZW5zaXR5OwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHRvSlNPTihtZXRhKSB7CiAgICAgIGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04obWV0YSk7CiAgICAgIGRhdGEub2JqZWN0LmNvbG9yID0gdGhpcy5jb2xvci5nZXRIZXgoKTsKICAgICAgZGF0YS5vYmplY3QuaW50ZW5zaXR5ID0gdGhpcy5pbnRlbnNpdHk7CiAgICAgIGlmICh0aGlzLmdyb3VuZENvbG9yICE9PSB1bmRlZmluZWQpCiAgICAgICAgZGF0YS5vYmplY3QuZ3JvdW5kQ29sb3IgPSB0aGlzLmdyb3VuZENvbG9yLmdldEhleCgpOwogICAgICBpZiAodGhpcy5kaXN0YW5jZSAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEub2JqZWN0LmRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZTsKICAgICAgaWYgKHRoaXMuYW5nbGUgIT09IHVuZGVmaW5lZCkKICAgICAgICBkYXRhLm9iamVjdC5hbmdsZSA9IHRoaXMuYW5nbGU7CiAgICAgIGlmICh0aGlzLmRlY2F5ICE9PSB1bmRlZmluZWQpCiAgICAgICAgZGF0YS5vYmplY3QuZGVjYXkgPSB0aGlzLmRlY2F5OwogICAgICBpZiAodGhpcy5wZW51bWJyYSAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEub2JqZWN0LnBlbnVtYnJhID0gdGhpcy5wZW51bWJyYTsKICAgICAgaWYgKHRoaXMuc2hhZG93ICE9PSB1bmRlZmluZWQpCiAgICAgICAgZGF0YS5vYmplY3Quc2hhZG93ID0gdGhpcy5zaGFkb3cudG9KU09OKCk7CiAgICAgIGlmICh0aGlzLnRhcmdldCAhPT0gdW5kZWZpbmVkKQogICAgICAgIGRhdGEub2JqZWN0LnRhcmdldCA9IHRoaXMudGFyZ2V0LnV1aWQ7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogIH07CiAgSGVtaXNwaGVyZUxpZ2h0ID0gY2xhc3MgSGVtaXNwaGVyZUxpZ2h0IGV4dGVuZHMgTGlnaHQgewogICAgY29uc3RydWN0b3Ioc2t5Q29sb3IsIGdyb3VuZENvbG9yLCBpbnRlbnNpdHkpIHsKICAgICAgc3VwZXIoc2t5Q29sb3IsIGludGVuc2l0eSk7CiAgICAgIHRoaXMuaXNIZW1pc3BoZXJlTGlnaHQgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiSGVtaXNwaGVyZUxpZ2h0IjsKICAgICAgdGhpcy5wb3NpdGlvbi5jb3B5KE9iamVjdDNELkRFRkFVTFRfVVApOwogICAgICB0aGlzLnVwZGF0ZU1hdHJpeCgpOwogICAgICB0aGlzLmdyb3VuZENvbG9yID0gbmV3IENvbG9yKGdyb3VuZENvbG9yKTsKICAgIH0KICAgIGNvcHkoc291cmNlLCByZWN1cnNpdmUpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UsIHJlY3Vyc2l2ZSk7CiAgICAgIHRoaXMuZ3JvdW5kQ29sb3IuY29weShzb3VyY2UuZ3JvdW5kQ29sb3IpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICB9OwogIF9wcm9qU2NyZWVuTWF0cml4JDEgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDQ7CiAgX2xpZ2h0UG9zaXRpb25Xb3JsZCQxID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9sb29rVGFyZ2V0JDEgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgU3BvdExpZ2h0U2hhZG93ID0gY2xhc3MgU3BvdExpZ2h0U2hhZG93IGV4dGVuZHMgTGlnaHRTaGFkb3cgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSg1MCwgMSwgMC41LCA1MDApKTsKICAgICAgdGhpcy5pc1Nwb3RMaWdodFNoYWRvdyA9IHRydWU7CiAgICAgIHRoaXMuZm9jdXMgPSAxOwogICAgfQogICAgdXBkYXRlTWF0cmljZXMobGlnaHQpIHsKICAgICAgY29uc3QgY2FtZXJhID0gdGhpcy5jYW1lcmE7CiAgICAgIGNvbnN0IGZvdjIgPSBSQUQyREVHICogMiAqIGxpZ2h0LmFuZ2xlICogdGhpcy5mb2N1czsKICAgICAgY29uc3QgYXNwZWN0MiA9IHRoaXMubWFwU2l6ZS53aWR0aCAvIHRoaXMubWFwU2l6ZS5oZWlnaHQ7CiAgICAgIGNvbnN0IGZhciA9IGxpZ2h0LmRpc3RhbmNlIHx8IGNhbWVyYS5mYXI7CiAgICAgIGlmIChmb3YyICE9PSBjYW1lcmEuZm92IHx8IGFzcGVjdDIgIT09IGNhbWVyYS5hc3BlY3QgfHwgZmFyICE9PSBjYW1lcmEuZmFyKSB7CiAgICAgICAgY2FtZXJhLmZvdiA9IGZvdjI7CiAgICAgICAgY2FtZXJhLmFzcGVjdCA9IGFzcGVjdDI7CiAgICAgICAgY2FtZXJhLmZhciA9IGZhcjsKICAgICAgICBjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwogICAgICB9CiAgICAgIHN1cGVyLnVwZGF0ZU1hdHJpY2VzKGxpZ2h0KTsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5mb2N1cyA9IHNvdXJjZS5mb2N1czsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBTcG90TGlnaHQgPSBjbGFzcyBTcG90TGlnaHQgZXh0ZW5kcyBMaWdodCB7CiAgICBjb25zdHJ1Y3Rvcihjb2xvciwgaW50ZW5zaXR5LCBkaXN0YW5jZSA9IDAsIGFuZ2xlID0gTWF0aC5QSSAvIDMsIHBlbnVtYnJhID0gMCwgZGVjYXkgPSAyKSB7CiAgICAgIHN1cGVyKGNvbG9yLCBpbnRlbnNpdHkpOwogICAgICB0aGlzLmlzU3BvdExpZ2h0ID0gdHJ1ZTsKICAgICAgdGhpcy50eXBlID0gIlNwb3RMaWdodCI7CiAgICAgIHRoaXMucG9zaXRpb24uY29weShPYmplY3QzRC5ERUZBVUxUX1VQKTsKICAgICAgdGhpcy51cGRhdGVNYXRyaXgoKTsKICAgICAgdGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0Q7CiAgICAgIHRoaXMuZGlzdGFuY2UgPSBkaXN0YW5jZTsKICAgICAgdGhpcy5hbmdsZSA9IGFuZ2xlOwogICAgICB0aGlzLnBlbnVtYnJhID0gcGVudW1icmE7CiAgICAgIHRoaXMuZGVjYXkgPSBkZWNheTsKICAgICAgdGhpcy5tYXAgPSBudWxsOwogICAgICB0aGlzLnNoYWRvdyA9IG5ldyBTcG90TGlnaHRTaGFkb3c7CiAgICB9CiAgICBnZXQgcG93ZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLmludGVuc2l0eSAqIE1hdGguUEk7CiAgICB9CiAgICBzZXQgcG93ZXIocG93ZXIpIHsKICAgICAgdGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvIE1hdGguUEk7CiAgICB9CiAgICBkaXNwb3NlKCkgewogICAgICB0aGlzLnNoYWRvdy5kaXNwb3NlKCk7CiAgICB9CiAgICBjb3B5KHNvdXJjZSwgcmVjdXJzaXZlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlLCByZWN1cnNpdmUpOwogICAgICB0aGlzLmRpc3RhbmNlID0gc291cmNlLmRpc3RhbmNlOwogICAgICB0aGlzLmFuZ2xlID0gc291cmNlLmFuZ2xlOwogICAgICB0aGlzLnBlbnVtYnJhID0gc291cmNlLnBlbnVtYnJhOwogICAgICB0aGlzLmRlY2F5ID0gc291cmNlLmRlY2F5OwogICAgICB0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTsKICAgICAgdGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH07CiAgX3Byb2pTY3JlZW5NYXRyaXggPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDQ7CiAgX2xpZ2h0UG9zaXRpb25Xb3JsZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfbG9va1RhcmdldCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBQb2ludExpZ2h0U2hhZG93ID0gY2xhc3MgUG9pbnRMaWdodFNoYWRvdyBleHRlbmRzIExpZ2h0U2hhZG93IHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcihuZXcgUGVyc3BlY3RpdmVDYW1lcmEoOTAsIDEsIDAuNSwgNTAwKSk7CiAgICAgIHRoaXMuaXNQb2ludExpZ2h0U2hhZG93ID0gdHJ1ZTsKICAgICAgdGhpcy5fZnJhbWVFeHRlbnRzID0gbmV3IFZlY3RvcjIoNCwgMik7CiAgICAgIHRoaXMuX3ZpZXdwb3J0Q291bnQgPSA2OwogICAgICB0aGlzLl92aWV3cG9ydHMgPSBbCiAgICAgICAgbmV3IFZlY3RvcjQoMiwgMSwgMSwgMSksCiAgICAgICAgbmV3IFZlY3RvcjQoMCwgMSwgMSwgMSksCiAgICAgICAgbmV3IFZlY3RvcjQoMywgMSwgMSwgMSksCiAgICAgICAgbmV3IFZlY3RvcjQoMSwgMSwgMSwgMSksCiAgICAgICAgbmV3IFZlY3RvcjQoMywgMCwgMSwgMSksCiAgICAgICAgbmV3IFZlY3RvcjQoMSwgMCwgMSwgMSkKICAgICAgXTsKICAgICAgdGhpcy5fY3ViZURpcmVjdGlvbnMgPSBbCiAgICAgICAgbmV3IFZlY3RvcjMoMSwgMCwgMCksCiAgICAgICAgbmV3IFZlY3RvcjMoLTEsIDAsIDApLAogICAgICAgIG5ldyBWZWN0b3IzKDAsIDAsIDEpLAogICAgICAgIG5ldyBWZWN0b3IzKDAsIDAsIC0xKSwKICAgICAgICBuZXcgVmVjdG9yMygwLCAxLCAwKSwKICAgICAgICBuZXcgVmVjdG9yMygwLCAtMSwgMCkKICAgICAgXTsKICAgICAgdGhpcy5fY3ViZVVwcyA9IFsKICAgICAgICBuZXcgVmVjdG9yMygwLCAxLCAwKSwKICAgICAgICBuZXcgVmVjdG9yMygwLCAxLCAwKSwKICAgICAgICBuZXcgVmVjdG9yMygwLCAxLCAwKSwKICAgICAgICBuZXcgVmVjdG9yMygwLCAxLCAwKSwKICAgICAgICBuZXcgVmVjdG9yMygwLCAwLCAxKSwKICAgICAgICBuZXcgVmVjdG9yMygwLCAwLCAtMSkKICAgICAgXTsKICAgIH0KICAgIHVwZGF0ZU1hdHJpY2VzKGxpZ2h0LCB2aWV3cG9ydEluZGV4ID0gMCkgewogICAgICBjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTsKICAgICAgY29uc3Qgc2hhZG93TWF0cml4ID0gdGhpcy5tYXRyaXg7CiAgICAgIGNvbnN0IGZhciA9IGxpZ2h0LmRpc3RhbmNlIHx8IGNhbWVyYS5mYXI7CiAgICAgIGlmIChmYXIgIT09IGNhbWVyYS5mYXIpIHsKICAgICAgICBjYW1lcmEuZmFyID0gZmFyOwogICAgICAgIGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CiAgICAgIH0KICAgICAgX2xpZ2h0UG9zaXRpb25Xb3JsZC5zZXRGcm9tTWF0cml4UG9zaXRpb24obGlnaHQubWF0cml4V29ybGQpOwogICAgICBjYW1lcmEucG9zaXRpb24uY29weShfbGlnaHRQb3NpdGlvbldvcmxkKTsKICAgICAgX2xvb2tUYXJnZXQuY29weShjYW1lcmEucG9zaXRpb24pOwogICAgICBfbG9va1RhcmdldC5hZGQodGhpcy5fY3ViZURpcmVjdGlvbnNbdmlld3BvcnRJbmRleF0pOwogICAgICBjYW1lcmEudXAuY29weSh0aGlzLl9jdWJlVXBzW3ZpZXdwb3J0SW5kZXhdKTsKICAgICAgY2FtZXJhLmxvb2tBdChfbG9va1RhcmdldCk7CiAgICAgIGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpOwogICAgICBzaGFkb3dNYXRyaXgubWFrZVRyYW5zbGF0aW9uKC1fbGlnaHRQb3NpdGlvbldvcmxkLngsIC1fbGlnaHRQb3NpdGlvbldvcmxkLnksIC1fbGlnaHRQb3NpdGlvbldvcmxkLnopOwogICAgICBfcHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTsKICAgICAgdGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChfcHJvalNjcmVlbk1hdHJpeCk7CiAgICB9CiAgfTsKICBQb2ludExpZ2h0ID0gY2xhc3MgUG9pbnRMaWdodCBleHRlbmRzIExpZ2h0IHsKICAgIGNvbnN0cnVjdG9yKGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlID0gMCwgZGVjYXkgPSAyKSB7CiAgICAgIHN1cGVyKGNvbG9yLCBpbnRlbnNpdHkpOwogICAgICB0aGlzLmlzUG9pbnRMaWdodCA9IHRydWU7CiAgICAgIHRoaXMudHlwZSA9ICJQb2ludExpZ2h0IjsKICAgICAgdGhpcy5kaXN0YW5jZSA9IGRpc3RhbmNlOwogICAgICB0aGlzLmRlY2F5ID0gZGVjYXk7CiAgICAgIHRoaXMuc2hhZG93ID0gbmV3IFBvaW50TGlnaHRTaGFkb3c7CiAgICB9CiAgICBnZXQgcG93ZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLmludGVuc2l0eSAqIDQgKiBNYXRoLlBJOwogICAgfQogICAgc2V0IHBvd2VyKHBvd2VyKSB7CiAgICAgIHRoaXMuaW50ZW5zaXR5ID0gcG93ZXIgLyAoNCAqIE1hdGguUEkpOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgdGhpcy5zaGFkb3cuZGlzcG9zZSgpOwogICAgfQogICAgY29weShzb3VyY2UsIHJlY3Vyc2l2ZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSwgcmVjdXJzaXZlKTsKICAgICAgdGhpcy5kaXN0YW5jZSA9IHNvdXJjZS5kaXN0YW5jZTsKICAgICAgdGhpcy5kZWNheSA9IHNvdXJjZS5kZWNheTsKICAgICAgdGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogIH07CiAgT3J0aG9ncmFwaGljQ2FtZXJhID0gY2xhc3MgT3J0aG9ncmFwaGljQ2FtZXJhIGV4dGVuZHMgQ2FtZXJhIHsKICAgIGNvbnN0cnVjdG9yKGxlZnQgPSAtMSwgcmlnaHQgPSAxLCB0b3AgPSAxLCBib3R0b20gPSAtMSwgbmVhciA9IDAuMSwgZmFyID0gMjAwMCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzT3J0aG9ncmFwaGljQ2FtZXJhID0gdHJ1ZTsKICAgICAgdGhpcy50eXBlID0gIk9ydGhvZ3JhcGhpY0NhbWVyYSI7CiAgICAgIHRoaXMuem9vbSA9IDE7CiAgICAgIHRoaXMudmlldyA9IG51bGw7CiAgICAgIHRoaXMubGVmdCA9IGxlZnQ7CiAgICAgIHRoaXMucmlnaHQgPSByaWdodDsKICAgICAgdGhpcy50b3AgPSB0b3A7CiAgICAgIHRoaXMuYm90dG9tID0gYm90dG9tOwogICAgICB0aGlzLm5lYXIgPSBuZWFyOwogICAgICB0aGlzLmZhciA9IGZhcjsKICAgICAgdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CiAgICB9CiAgICBjb3B5KHNvdXJjZSwgcmVjdXJzaXZlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlLCByZWN1cnNpdmUpOwogICAgICB0aGlzLmxlZnQgPSBzb3VyY2UubGVmdDsKICAgICAgdGhpcy5yaWdodCA9IHNvdXJjZS5yaWdodDsKICAgICAgdGhpcy50b3AgPSBzb3VyY2UudG9wOwogICAgICB0aGlzLmJvdHRvbSA9IHNvdXJjZS5ib3R0b207CiAgICAgIHRoaXMubmVhciA9IHNvdXJjZS5uZWFyOwogICAgICB0aGlzLmZhciA9IHNvdXJjZS5mYXI7CiAgICAgIHRoaXMuem9vbSA9IHNvdXJjZS56b29tOwogICAgICB0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKHt9LCBzb3VyY2Uudmlldyk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0Vmlld09mZnNldChmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgaWYgKHRoaXMudmlldyA9PT0gbnVsbCkgewogICAgICAgIHRoaXMudmlldyA9IHsKICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICBmdWxsV2lkdGg6IDEsCiAgICAgICAgICBmdWxsSGVpZ2h0OiAxLAogICAgICAgICAgb2Zmc2V0WDogMCwKICAgICAgICAgIG9mZnNldFk6IDAsCiAgICAgICAgICB3aWR0aDogMSwKICAgICAgICAgIGhlaWdodDogMQogICAgICAgIH07CiAgICAgIH0KICAgICAgdGhpcy52aWV3LmVuYWJsZWQgPSB0cnVlOwogICAgICB0aGlzLnZpZXcuZnVsbFdpZHRoID0gZnVsbFdpZHRoOwogICAgICB0aGlzLnZpZXcuZnVsbEhlaWdodCA9IGZ1bGxIZWlnaHQ7CiAgICAgIHRoaXMudmlldy5vZmZzZXRYID0geDsKICAgICAgdGhpcy52aWV3Lm9mZnNldFkgPSB5OwogICAgICB0aGlzLnZpZXcud2lkdGggPSB3aWR0aDsKICAgICAgdGhpcy52aWV3LmhlaWdodCA9IGhlaWdodDsKICAgICAgdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CiAgICB9CiAgICBjbGVhclZpZXdPZmZzZXQoKSB7CiAgICAgIGlmICh0aGlzLnZpZXcgIT09IG51bGwpIHsKICAgICAgICB0aGlzLnZpZXcuZW5hYmxlZCA9IGZhbHNlOwogICAgICB9CiAgICAgIHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwogICAgfQogICAgdXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpIHsKICAgICAgY29uc3QgZHggPSAodGhpcy5yaWdodCAtIHRoaXMubGVmdCkgLyAoMiAqIHRoaXMuem9vbSk7CiAgICAgIGNvbnN0IGR5ID0gKHRoaXMudG9wIC0gdGhpcy5ib3R0b20pIC8gKDIgKiB0aGlzLnpvb20pOwogICAgICBjb25zdCBjeCA9ICh0aGlzLnJpZ2h0ICsgdGhpcy5sZWZ0KSAvIDI7CiAgICAgIGNvbnN0IGN5ID0gKHRoaXMudG9wICsgdGhpcy5ib3R0b20pIC8gMjsKICAgICAgbGV0IGxlZnQgPSBjeCAtIGR4OwogICAgICBsZXQgcmlnaHQgPSBjeCArIGR4OwogICAgICBsZXQgdG9wID0gY3kgKyBkeTsKICAgICAgbGV0IGJvdHRvbSA9IGN5IC0gZHk7CiAgICAgIGlmICh0aGlzLnZpZXcgIT09IG51bGwgJiYgdGhpcy52aWV3LmVuYWJsZWQpIHsKICAgICAgICBjb25zdCBzY2FsZVcgPSAodGhpcy5yaWdodCAtIHRoaXMubGVmdCkgLyB0aGlzLnZpZXcuZnVsbFdpZHRoIC8gdGhpcy56b29tOwogICAgICAgIGNvbnN0IHNjYWxlSCA9ICh0aGlzLnRvcCAtIHRoaXMuYm90dG9tKSAvIHRoaXMudmlldy5mdWxsSGVpZ2h0IC8gdGhpcy56b29tOwogICAgICAgIGxlZnQgKz0gc2NhbGVXICogdGhpcy52aWV3Lm9mZnNldFg7CiAgICAgICAgcmlnaHQgPSBsZWZ0ICsgc2NhbGVXICogdGhpcy52aWV3LndpZHRoOwogICAgICAgIHRvcCAtPSBzY2FsZUggKiB0aGlzLnZpZXcub2Zmc2V0WTsKICAgICAgICBib3R0b20gPSB0b3AgLSBzY2FsZUggKiB0aGlzLnZpZXcuaGVpZ2h0OwogICAgICB9CiAgICAgIHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlT3J0aG9ncmFwaGljKGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgdGhpcy5uZWFyLCB0aGlzLmZhciwgdGhpcy5jb29yZGluYXRlU3lzdGVtKTsKICAgICAgdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMucHJvamVjdGlvbk1hdHJpeCkuaW52ZXJ0KCk7CiAgICB9CiAgICB0b0pTT04obWV0YSkgewogICAgICBjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKG1ldGEpOwogICAgICBkYXRhLm9iamVjdC56b29tID0gdGhpcy56b29tOwogICAgICBkYXRhLm9iamVjdC5sZWZ0ID0gdGhpcy5sZWZ0OwogICAgICBkYXRhLm9iamVjdC5yaWdodCA9IHRoaXMucmlnaHQ7CiAgICAgIGRhdGEub2JqZWN0LnRvcCA9IHRoaXMudG9wOwogICAgICBkYXRhLm9iamVjdC5ib3R0b20gPSB0aGlzLmJvdHRvbTsKICAgICAgZGF0YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjsKICAgICAgZGF0YS5vYmplY3QuZmFyID0gdGhpcy5mYXI7CiAgICAgIGlmICh0aGlzLnZpZXcgIT09IG51bGwpCiAgICAgICAgZGF0YS5vYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMudmlldyk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogIH07CiAgRGlyZWN0aW9uYWxMaWdodFNoYWRvdyA9IGNsYXNzIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZXh0ZW5kcyBMaWdodFNoYWRvdyB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIobmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSgtNSwgNSwgNSwgLTUsIDAuNSwgNTAwKSk7CiAgICAgIHRoaXMuaXNEaXJlY3Rpb25hbExpZ2h0U2hhZG93ID0gdHJ1ZTsKICAgIH0KICB9OwogIERpcmVjdGlvbmFsTGlnaHQgPSBjbGFzcyBEaXJlY3Rpb25hbExpZ2h0IGV4dGVuZHMgTGlnaHQgewogICAgY29uc3RydWN0b3IoY29sb3IsIGludGVuc2l0eSkgewogICAgICBzdXBlcihjb2xvciwgaW50ZW5zaXR5KTsKICAgICAgdGhpcy5pc0RpcmVjdGlvbmFsTGlnaHQgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiRGlyZWN0aW9uYWxMaWdodCI7CiAgICAgIHRoaXMucG9zaXRpb24uY29weShPYmplY3QzRC5ERUZBVUxUX1VQKTsKICAgICAgdGhpcy51cGRhdGVNYXRyaXgoKTsKICAgICAgdGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0Q7CiAgICAgIHRoaXMuc2hhZG93ID0gbmV3IERpcmVjdGlvbmFsTGlnaHRTaGFkb3c7CiAgICB9CiAgICBkaXNwb3NlKCkgewogICAgICB0aGlzLnNoYWRvdy5kaXNwb3NlKCk7CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpOwogICAgICB0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBBbWJpZW50TGlnaHQgPSBjbGFzcyBBbWJpZW50TGlnaHQgZXh0ZW5kcyBMaWdodCB7CiAgICBjb25zdHJ1Y3Rvcihjb2xvciwgaW50ZW5zaXR5KSB7CiAgICAgIHN1cGVyKGNvbG9yLCBpbnRlbnNpdHkpOwogICAgICB0aGlzLmlzQW1iaWVudExpZ2h0ID0gdHJ1ZTsKICAgICAgdGhpcy50eXBlID0gIkFtYmllbnRMaWdodCI7CiAgICB9CiAgfTsKICBSZWN0QXJlYUxpZ2h0ID0gY2xhc3MgUmVjdEFyZWFMaWdodCBleHRlbmRzIExpZ2h0IHsKICAgIGNvbnN0cnVjdG9yKGNvbG9yLCBpbnRlbnNpdHksIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwKSB7CiAgICAgIHN1cGVyKGNvbG9yLCBpbnRlbnNpdHkpOwogICAgICB0aGlzLmlzUmVjdEFyZWFMaWdodCA9IHRydWU7CiAgICAgIHRoaXMudHlwZSA9ICJSZWN0QXJlYUxpZ2h0IjsKICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOwogICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKICAgIH0KICAgIGdldCBwb3dlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5ICogdGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0ICogTWF0aC5QSTsKICAgIH0KICAgIHNldCBwb3dlcihwb3dlcikgewogICAgICB0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gKHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAqIE1hdGguUEkpOwogICAgfQogICAgY29weShzb3VyY2UpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UpOwogICAgICB0aGlzLndpZHRoID0gc291cmNlLndpZHRoOwogICAgICB0aGlzLmhlaWdodCA9IHNvdXJjZS5oZWlnaHQ7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdG9KU09OKG1ldGEpIHsKICAgICAgY29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTihtZXRhKTsKICAgICAgZGF0YS5vYmplY3Qud2lkdGggPSB0aGlzLndpZHRoOwogICAgICBkYXRhLm9iamVjdC5oZWlnaHQgPSB0aGlzLmhlaWdodDsKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgfTsKICBMaWdodFByb2JlID0gY2xhc3MgTGlnaHRQcm9iZSBleHRlbmRzIExpZ2h0IHsKICAgIGNvbnN0cnVjdG9yKHNoID0gbmV3IFNwaGVyaWNhbEhhcm1vbmljczMsIGludGVuc2l0eSA9IDEpIHsKICAgICAgc3VwZXIodW5kZWZpbmVkLCBpbnRlbnNpdHkpOwogICAgICB0aGlzLmlzTGlnaHRQcm9iZSA9IHRydWU7CiAgICAgIHRoaXMuc2ggPSBzaDsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5zaC5jb3B5KHNvdXJjZS5zaCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZnJvbUpTT04oanNvbikgewogICAgICB0aGlzLmludGVuc2l0eSA9IGpzb24uaW50ZW5zaXR5OwogICAgICB0aGlzLnNoLmZyb21BcnJheShqc29uLnNoKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB0b0pTT04obWV0YSkgewogICAgICBjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKG1ldGEpOwogICAgICBkYXRhLm9iamVjdC5zaCA9IHRoaXMuc2gudG9BcnJheSgpOwogICAgICByZXR1cm4gZGF0YTsKICAgIH0KICB9OwogIE1hdGVyaWFsTG9hZGVyID0gY2xhc3MgTWF0ZXJpYWxMb2FkZXIgZXh0ZW5kcyBMb2FkZXIgewogICAgY29uc3RydWN0b3IobWFuYWdlcikgewogICAgICBzdXBlcihtYW5hZ2VyKTsKICAgICAgdGhpcy50ZXh0dXJlcyA9IHt9OwogICAgfQogICAgbG9hZCh1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvcikgewogICAgICBjb25zdCBzY29wZSA9IHRoaXM7CiAgICAgIGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKHNjb3BlLm1hbmFnZXIpOwogICAgICBsb2FkZXIuc2V0UGF0aChzY29wZS5wYXRoKTsKICAgICAgbG9hZGVyLnNldFJlcXVlc3RIZWFkZXIoc2NvcGUucmVxdWVzdEhlYWRlcik7CiAgICAgIGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoc2NvcGUud2l0aENyZWRlbnRpYWxzKTsKICAgICAgbG9hZGVyLmxvYWQodXJsLCBmdW5jdGlvbih0ZXh0KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIG9uTG9hZChzY29wZS5wYXJzZShKU09OLnBhcnNlKHRleHQpKSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgaWYgKG9uRXJyb3IpIHsKICAgICAgICAgICAgb25FcnJvcihlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICB9CiAgICAgICAgICBzY29wZS5tYW5hZ2VyLml0ZW1FcnJvcih1cmwpOwogICAgICAgIH0KICAgICAgfSwgb25Qcm9ncmVzcywgb25FcnJvcik7CiAgICB9CiAgICBwYXJzZShqc29uKSB7CiAgICAgIGNvbnN0IHRleHR1cmVzID0gdGhpcy50ZXh0dXJlczsKICAgICAgZnVuY3Rpb24gZ2V0VGV4dHVyZShuYW1lKSB7CiAgICAgICAgaWYgKHRleHR1cmVzW25hbWVdID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlIiwgbmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0ZXh0dXJlc1tuYW1lXTsKICAgICAgfQogICAgICBjb25zdCBtYXRlcmlhbCA9IHRoaXMuY3JlYXRlTWF0ZXJpYWxGcm9tVHlwZShqc29uLnR5cGUpOwogICAgICBpZiAoanNvbi51dWlkICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwudXVpZCA9IGpzb24udXVpZDsKICAgICAgaWYgKGpzb24ubmFtZSAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLm5hbWUgPSBqc29uLm5hbWU7CiAgICAgIGlmIChqc29uLmNvbG9yICE9PSB1bmRlZmluZWQgJiYgbWF0ZXJpYWwuY29sb3IgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5jb2xvci5zZXRIZXgoanNvbi5jb2xvcik7CiAgICAgIGlmIChqc29uLnJvdWdobmVzcyAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLnJvdWdobmVzcyA9IGpzb24ucm91Z2huZXNzOwogICAgICBpZiAoanNvbi5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5tZXRhbG5lc3MgPSBqc29uLm1ldGFsbmVzczsKICAgICAgaWYgKGpzb24uc2hlZW4gIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5zaGVlbiA9IGpzb24uc2hlZW47CiAgICAgIGlmIChqc29uLnNoZWVuQ29sb3IgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5zaGVlbkNvbG9yID0gbmV3IENvbG9yKCkuc2V0SGV4KGpzb24uc2hlZW5Db2xvcik7CiAgICAgIGlmIChqc29uLnNoZWVuUm91Z2huZXNzICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgPSBqc29uLnNoZWVuUm91Z2huZXNzOwogICAgICBpZiAoanNvbi5lbWlzc2l2ZSAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLmVtaXNzaXZlICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuZW1pc3NpdmUuc2V0SGV4KGpzb24uZW1pc3NpdmUpOwogICAgICBpZiAoanNvbi5zcGVjdWxhciAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLnNwZWN1bGFyICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuc3BlY3VsYXIuc2V0SGV4KGpzb24uc3BlY3VsYXIpOwogICAgICBpZiAoanNvbi5zcGVjdWxhckludGVuc2l0eSAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLnNwZWN1bGFySW50ZW5zaXR5ID0ganNvbi5zcGVjdWxhckludGVuc2l0eTsKICAgICAgaWYgKGpzb24uc3BlY3VsYXJDb2xvciAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLnNldEhleChqc29uLnNwZWN1bGFyQ29sb3IpOwogICAgICBpZiAoanNvbi5zaGluaW5lc3MgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5zaGluaW5lc3MgPSBqc29uLnNoaW5pbmVzczsKICAgICAgaWYgKGpzb24uY2xlYXJjb2F0ICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuY2xlYXJjb2F0ID0ganNvbi5jbGVhcmNvYXQ7CiAgICAgIGlmIChqc29uLmNsZWFyY29hdFJvdWdobmVzcyAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IGpzb24uY2xlYXJjb2F0Um91Z2huZXNzOwogICAgICBpZiAoanNvbi5kaXNwZXJzaW9uICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuZGlzcGVyc2lvbiA9IGpzb24uZGlzcGVyc2lvbjsKICAgICAgaWYgKGpzb24uaXJpZGVzY2VuY2UgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5pcmlkZXNjZW5jZSA9IGpzb24uaXJpZGVzY2VuY2U7CiAgICAgIGlmIChqc29uLmlyaWRlc2NlbmNlSU9SICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuaXJpZGVzY2VuY2VJT1IgPSBqc29uLmlyaWRlc2NlbmNlSU9SOwogICAgICBpZiAoanNvbi5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSA9IGpzb24uaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZTsKICAgICAgaWYgKGpzb24udHJhbnNtaXNzaW9uICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwudHJhbnNtaXNzaW9uID0ganNvbi50cmFuc21pc3Npb247CiAgICAgIGlmIChqc29uLnRoaWNrbmVzcyAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLnRoaWNrbmVzcyA9IGpzb24udGhpY2tuZXNzOwogICAgICBpZiAoanNvbi5hdHRlbnVhdGlvbkRpc3RhbmNlICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZSA9IGpzb24uYXR0ZW51YXRpb25EaXN0YW5jZTsKICAgICAgaWYgKGpzb24uYXR0ZW51YXRpb25Db2xvciAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLmF0dGVudWF0aW9uQ29sb3IgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5hdHRlbnVhdGlvbkNvbG9yLnNldEhleChqc29uLmF0dGVudWF0aW9uQ29sb3IpOwogICAgICBpZiAoanNvbi5hbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuYW5pc290cm9weSA9IGpzb24uYW5pc290cm9weTsKICAgICAgaWYgKGpzb24uYW5pc290cm9weVJvdGF0aW9uICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuYW5pc290cm9weVJvdGF0aW9uID0ganNvbi5hbmlzb3Ryb3B5Um90YXRpb247CiAgICAgIGlmIChqc29uLmZvZyAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLmZvZyA9IGpzb24uZm9nOwogICAgICBpZiAoanNvbi5mbGF0U2hhZGluZyAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0ganNvbi5mbGF0U2hhZGluZzsKICAgICAgaWYgKGpzb24uYmxlbmRpbmcgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5ibGVuZGluZyA9IGpzb24uYmxlbmRpbmc7CiAgICAgIGlmIChqc29uLmNvbWJpbmUgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5jb21iaW5lID0ganNvbi5jb21iaW5lOwogICAgICBpZiAoanNvbi5zaWRlICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuc2lkZSA9IGpzb24uc2lkZTsKICAgICAgaWYgKGpzb24uc2hhZG93U2lkZSAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLnNoYWRvd1NpZGUgPSBqc29uLnNoYWRvd1NpZGU7CiAgICAgIGlmIChqc29uLm9wYWNpdHkgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5vcGFjaXR5ID0ganNvbi5vcGFjaXR5OwogICAgICBpZiAoanNvbi50cmFuc3BhcmVudCAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0ganNvbi50cmFuc3BhcmVudDsKICAgICAgaWYgKGpzb24uYWxwaGFUZXN0ICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuYWxwaGFUZXN0ID0ganNvbi5hbHBoYVRlc3Q7CiAgICAgIGlmIChqc29uLmFscGhhSGFzaCAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLmFscGhhSGFzaCA9IGpzb24uYWxwaGFIYXNoOwogICAgICBpZiAoanNvbi5kZXB0aEZ1bmMgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5kZXB0aEZ1bmMgPSBqc29uLmRlcHRoRnVuYzsKICAgICAgaWYgKGpzb24uZGVwdGhUZXN0ICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuZGVwdGhUZXN0ID0ganNvbi5kZXB0aFRlc3Q7CiAgICAgIGlmIChqc29uLmRlcHRoV3JpdGUgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5kZXB0aFdyaXRlID0ganNvbi5kZXB0aFdyaXRlOwogICAgICBpZiAoanNvbi5jb2xvcldyaXRlICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuY29sb3JXcml0ZSA9IGpzb24uY29sb3JXcml0ZTsKICAgICAgaWYgKGpzb24uYmxlbmRTcmMgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5ibGVuZFNyYyA9IGpzb24uYmxlbmRTcmM7CiAgICAgIGlmIChqc29uLmJsZW5kRHN0ICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuYmxlbmREc3QgPSBqc29uLmJsZW5kRHN0OwogICAgICBpZiAoanNvbi5ibGVuZEVxdWF0aW9uICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbiA9IGpzb24uYmxlbmRFcXVhdGlvbjsKICAgICAgaWYgKGpzb24uYmxlbmRTcmNBbHBoYSAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEgPSBqc29uLmJsZW5kU3JjQWxwaGE7CiAgICAgIGlmIChqc29uLmJsZW5kRHN0QWxwaGEgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5ibGVuZERzdEFscGhhID0ganNvbi5ibGVuZERzdEFscGhhOwogICAgICBpZiAoanNvbi5ibGVuZEVxdWF0aW9uQWxwaGEgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uQWxwaGEgPSBqc29uLmJsZW5kRXF1YXRpb25BbHBoYTsKICAgICAgaWYgKGpzb24uYmxlbmRDb2xvciAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsLmJsZW5kQ29sb3IgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5ibGVuZENvbG9yLnNldEhleChqc29uLmJsZW5kQ29sb3IpOwogICAgICBpZiAoanNvbi5ibGVuZEFscGhhICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuYmxlbmRBbHBoYSA9IGpzb24uYmxlbmRBbHBoYTsKICAgICAgaWYgKGpzb24uc3RlbmNpbFdyaXRlTWFzayAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLnN0ZW5jaWxXcml0ZU1hc2sgPSBqc29uLnN0ZW5jaWxXcml0ZU1hc2s7CiAgICAgIGlmIChqc29uLnN0ZW5jaWxGdW5jICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuc3RlbmNpbEZ1bmMgPSBqc29uLnN0ZW5jaWxGdW5jOwogICAgICBpZiAoanNvbi5zdGVuY2lsUmVmICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuc3RlbmNpbFJlZiA9IGpzb24uc3RlbmNpbFJlZjsKICAgICAgaWYgKGpzb24uc3RlbmNpbEZ1bmNNYXNrICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuc3RlbmNpbEZ1bmNNYXNrID0ganNvbi5zdGVuY2lsRnVuY01hc2s7CiAgICAgIGlmIChqc29uLnN0ZW5jaWxGYWlsICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuc3RlbmNpbEZhaWwgPSBqc29uLnN0ZW5jaWxGYWlsOwogICAgICBpZiAoanNvbi5zdGVuY2lsWkZhaWwgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5zdGVuY2lsWkZhaWwgPSBqc29uLnN0ZW5jaWxaRmFpbDsKICAgICAgaWYgKGpzb24uc3RlbmNpbFpQYXNzICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuc3RlbmNpbFpQYXNzID0ganNvbi5zdGVuY2lsWlBhc3M7CiAgICAgIGlmIChqc29uLnN0ZW5jaWxXcml0ZSAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLnN0ZW5jaWxXcml0ZSA9IGpzb24uc3RlbmNpbFdyaXRlOwogICAgICBpZiAoanNvbi53aXJlZnJhbWUgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC53aXJlZnJhbWUgPSBqc29uLndpcmVmcmFtZTsKICAgICAgaWYgKGpzb24ud2lyZWZyYW1lTGluZXdpZHRoICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoID0ganNvbi53aXJlZnJhbWVMaW5ld2lkdGg7CiAgICAgIGlmIChqc29uLndpcmVmcmFtZUxpbmVjYXAgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC53aXJlZnJhbWVMaW5lY2FwID0ganNvbi53aXJlZnJhbWVMaW5lY2FwOwogICAgICBpZiAoanNvbi53aXJlZnJhbWVMaW5lam9pbiAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVqb2luID0ganNvbi53aXJlZnJhbWVMaW5lam9pbjsKICAgICAgaWYgKGpzb24ucm90YXRpb24gIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5yb3RhdGlvbiA9IGpzb24ucm90YXRpb247CiAgICAgIGlmIChqc29uLmxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLmxpbmV3aWR0aCA9IGpzb24ubGluZXdpZHRoOwogICAgICBpZiAoanNvbi5kYXNoU2l6ZSAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLmRhc2hTaXplID0ganNvbi5kYXNoU2l6ZTsKICAgICAgaWYgKGpzb24uZ2FwU2l6ZSAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLmdhcFNpemUgPSBqc29uLmdhcFNpemU7CiAgICAgIGlmIChqc29uLnNjYWxlICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuc2NhbGUgPSBqc29uLnNjYWxlOwogICAgICBpZiAoanNvbi5wb2x5Z29uT2Zmc2V0ICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwucG9seWdvbk9mZnNldCA9IGpzb24ucG9seWdvbk9mZnNldDsKICAgICAgaWYgKGpzb24ucG9seWdvbk9mZnNldEZhY3RvciAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRGYWN0b3IgPSBqc29uLnBvbHlnb25PZmZzZXRGYWN0b3I7CiAgICAgIGlmIChqc29uLnBvbHlnb25PZmZzZXRVbml0cyAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRVbml0cyA9IGpzb24ucG9seWdvbk9mZnNldFVuaXRzOwogICAgICBpZiAoanNvbi5kaXRoZXJpbmcgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5kaXRoZXJpbmcgPSBqc29uLmRpdGhlcmluZzsKICAgICAgaWYgKGpzb24uYWxwaGFUb0NvdmVyYWdlICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuYWxwaGFUb0NvdmVyYWdlID0ganNvbi5hbHBoYVRvQ292ZXJhZ2U7CiAgICAgIGlmIChqc29uLnByZW11bHRpcGxpZWRBbHBoYSAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSA9IGpzb24ucHJlbXVsdGlwbGllZEFscGhhOwogICAgICBpZiAoanNvbi5mb3JjZVNpbmdsZVBhc3MgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5mb3JjZVNpbmdsZVBhc3MgPSBqc29uLmZvcmNlU2luZ2xlUGFzczsKICAgICAgaWYgKGpzb24udmlzaWJsZSAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLnZpc2libGUgPSBqc29uLnZpc2libGU7CiAgICAgIGlmIChqc29uLnRvbmVNYXBwZWQgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC50b25lTWFwcGVkID0ganNvbi50b25lTWFwcGVkOwogICAgICBpZiAoanNvbi51c2VyRGF0YSAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLnVzZXJEYXRhID0ganNvbi51c2VyRGF0YTsKICAgICAgaWYgKGpzb24udmVydGV4Q29sb3JzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBpZiAodHlwZW9mIGpzb24udmVydGV4Q29sb3JzID09PSAibnVtYmVyIikgewogICAgICAgICAgbWF0ZXJpYWwudmVydGV4Q29sb3JzID0ganNvbi52ZXJ0ZXhDb2xvcnMgPiAwID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSBqc29uLnZlcnRleENvbG9yczsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGpzb24udW5pZm9ybXMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBqc29uLnVuaWZvcm1zKSB7CiAgICAgICAgICBjb25zdCB1bmlmb3JtID0ganNvbi51bmlmb3Jtc1tuYW1lXTsKICAgICAgICAgIG1hdGVyaWFsLnVuaWZvcm1zW25hbWVdID0ge307CiAgICAgICAgICBzd2l0Y2ggKHVuaWZvcm0udHlwZSkgewogICAgICAgICAgICBjYXNlICJ0IjoKICAgICAgICAgICAgICBtYXRlcmlhbC51bmlmb3Jtc1tuYW1lXS52YWx1ZSA9IGdldFRleHR1cmUodW5pZm9ybS52YWx1ZSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImMiOgogICAgICAgICAgICAgIG1hdGVyaWFsLnVuaWZvcm1zW25hbWVdLnZhbHVlID0gbmV3IENvbG9yKCkuc2V0SGV4KHVuaWZvcm0udmFsdWUpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJ2MiI6CiAgICAgICAgICAgICAgbWF0ZXJpYWwudW5pZm9ybXNbbmFtZV0udmFsdWUgPSBuZXcgVmVjdG9yMigpLmZyb21BcnJheSh1bmlmb3JtLnZhbHVlKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAidjMiOgogICAgICAgICAgICAgIG1hdGVyaWFsLnVuaWZvcm1zW25hbWVdLnZhbHVlID0gbmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkodW5pZm9ybS52YWx1ZSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInY0IjoKICAgICAgICAgICAgICBtYXRlcmlhbC51bmlmb3Jtc1tuYW1lXS52YWx1ZSA9IG5ldyBWZWN0b3I0KCkuZnJvbUFycmF5KHVuaWZvcm0udmFsdWUpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJtMyI6CiAgICAgICAgICAgICAgbWF0ZXJpYWwudW5pZm9ybXNbbmFtZV0udmFsdWUgPSBuZXcgTWF0cml4MygpLmZyb21BcnJheSh1bmlmb3JtLnZhbHVlKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAibTQiOgogICAgICAgICAgICAgIG1hdGVyaWFsLnVuaWZvcm1zW25hbWVdLnZhbHVlID0gbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkodW5pZm9ybS52YWx1ZSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgbWF0ZXJpYWwudW5pZm9ybXNbbmFtZV0udmFsdWUgPSB1bmlmb3JtLnZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoanNvbi5kZWZpbmVzICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuZGVmaW5lcyA9IGpzb24uZGVmaW5lczsKICAgICAgaWYgKGpzb24udmVydGV4U2hhZGVyICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwudmVydGV4U2hhZGVyID0ganNvbi52ZXJ0ZXhTaGFkZXI7CiAgICAgIGlmIChqc29uLmZyYWdtZW50U2hhZGVyICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXIgPSBqc29uLmZyYWdtZW50U2hhZGVyOwogICAgICBpZiAoanNvbi5nbHNsVmVyc2lvbiAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLmdsc2xWZXJzaW9uID0ganNvbi5nbHNsVmVyc2lvbjsKICAgICAgaWYgKGpzb24uZXh0ZW5zaW9ucyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4ganNvbi5leHRlbnNpb25zKSB7CiAgICAgICAgICBtYXRlcmlhbC5leHRlbnNpb25zW2tleV0gPSBqc29uLmV4dGVuc2lvbnNba2V5XTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGpzb24ubGlnaHRzICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwubGlnaHRzID0ganNvbi5saWdodHM7CiAgICAgIGlmIChqc29uLmNsaXBwaW5nICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuY2xpcHBpbmcgPSBqc29uLmNsaXBwaW5nOwogICAgICBpZiAoanNvbi5zaXplICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuc2l6ZSA9IGpzb24uc2l6ZTsKICAgICAgaWYgKGpzb24uc2l6ZUF0dGVudWF0aW9uICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uID0ganNvbi5zaXplQXR0ZW51YXRpb247CiAgICAgIGlmIChqc29uLm1hcCAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLm1hcCA9IGdldFRleHR1cmUoanNvbi5tYXApOwogICAgICBpZiAoanNvbi5tYXRjYXAgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5tYXRjYXAgPSBnZXRUZXh0dXJlKGpzb24ubWF0Y2FwKTsKICAgICAgaWYgKGpzb24uYWxwaGFNYXAgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5hbHBoYU1hcCA9IGdldFRleHR1cmUoanNvbi5hbHBoYU1hcCk7CiAgICAgIGlmIChqc29uLmJ1bXBNYXAgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5idW1wTWFwID0gZ2V0VGV4dHVyZShqc29uLmJ1bXBNYXApOwogICAgICBpZiAoanNvbi5idW1wU2NhbGUgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5idW1wU2NhbGUgPSBqc29uLmJ1bXBTY2FsZTsKICAgICAgaWYgKGpzb24ubm9ybWFsTWFwICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwubm9ybWFsTWFwID0gZ2V0VGV4dHVyZShqc29uLm5vcm1hbE1hcCk7CiAgICAgIGlmIChqc29uLm5vcm1hbE1hcFR5cGUgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5ub3JtYWxNYXBUeXBlID0ganNvbi5ub3JtYWxNYXBUeXBlOwogICAgICBpZiAoanNvbi5ub3JtYWxTY2FsZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgbGV0IG5vcm1hbFNjYWxlID0ganNvbi5ub3JtYWxTY2FsZTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub3JtYWxTY2FsZSkgPT09IGZhbHNlKSB7CiAgICAgICAgICBub3JtYWxTY2FsZSA9IFtub3JtYWxTY2FsZSwgbm9ybWFsU2NhbGVdOwogICAgICAgIH0KICAgICAgICBtYXRlcmlhbC5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KG5vcm1hbFNjYWxlKTsKICAgICAgfQogICAgICBpZiAoanNvbi5kaXNwbGFjZW1lbnRNYXAgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgPSBnZXRUZXh0dXJlKGpzb24uZGlzcGxhY2VtZW50TWFwKTsKICAgICAgaWYgKGpzb24uZGlzcGxhY2VtZW50U2NhbGUgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZSA9IGpzb24uZGlzcGxhY2VtZW50U2NhbGU7CiAgICAgIGlmIChqc29uLmRpc3BsYWNlbWVudEJpYXMgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzID0ganNvbi5kaXNwbGFjZW1lbnRCaWFzOwogICAgICBpZiAoanNvbi5yb3VnaG5lc3NNYXAgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgPSBnZXRUZXh0dXJlKGpzb24ucm91Z2huZXNzTWFwKTsKICAgICAgaWYgKGpzb24ubWV0YWxuZXNzTWFwICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwubWV0YWxuZXNzTWFwID0gZ2V0VGV4dHVyZShqc29uLm1ldGFsbmVzc01hcCk7CiAgICAgIGlmIChqc29uLmVtaXNzaXZlTWFwICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuZW1pc3NpdmVNYXAgPSBnZXRUZXh0dXJlKGpzb24uZW1pc3NpdmVNYXApOwogICAgICBpZiAoanNvbi5lbWlzc2l2ZUludGVuc2l0eSAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLmVtaXNzaXZlSW50ZW5zaXR5ID0ganNvbi5lbWlzc2l2ZUludGVuc2l0eTsKICAgICAgaWYgKGpzb24uc3BlY3VsYXJNYXAgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5zcGVjdWxhck1hcCA9IGdldFRleHR1cmUoanNvbi5zcGVjdWxhck1hcCk7CiAgICAgIGlmIChqc29uLnNwZWN1bGFySW50ZW5zaXR5TWFwICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHlNYXAgPSBnZXRUZXh0dXJlKGpzb24uc3BlY3VsYXJJbnRlbnNpdHlNYXApOwogICAgICBpZiAoanNvbi5zcGVjdWxhckNvbG9yTWFwICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvck1hcCA9IGdldFRleHR1cmUoanNvbi5zcGVjdWxhckNvbG9yTWFwKTsKICAgICAgaWYgKGpzb24uZW52TWFwICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuZW52TWFwID0gZ2V0VGV4dHVyZShqc29uLmVudk1hcCk7CiAgICAgIGlmIChqc29uLmVudk1hcFJvdGF0aW9uICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuZW52TWFwUm90YXRpb24uZnJvbUFycmF5KGpzb24uZW52TWFwUm90YXRpb24pOwogICAgICBpZiAoanNvbi5lbnZNYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHkgPSBqc29uLmVudk1hcEludGVuc2l0eTsKICAgICAgaWYgKGpzb24ucmVmbGVjdGl2aXR5ICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwucmVmbGVjdGl2aXR5ID0ganNvbi5yZWZsZWN0aXZpdHk7CiAgICAgIGlmIChqc29uLnJlZnJhY3Rpb25SYXRpbyAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLnJlZnJhY3Rpb25SYXRpbyA9IGpzb24ucmVmcmFjdGlvblJhdGlvOwogICAgICBpZiAoanNvbi5saWdodE1hcCAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLmxpZ2h0TWFwID0gZ2V0VGV4dHVyZShqc29uLmxpZ2h0TWFwKTsKICAgICAgaWYgKGpzb24ubGlnaHRNYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eSA9IGpzb24ubGlnaHRNYXBJbnRlbnNpdHk7CiAgICAgIGlmIChqc29uLmFvTWFwICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuYW9NYXAgPSBnZXRUZXh0dXJlKGpzb24uYW9NYXApOwogICAgICBpZiAoanNvbi5hb01hcEludGVuc2l0eSAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLmFvTWFwSW50ZW5zaXR5ID0ganNvbi5hb01hcEludGVuc2l0eTsKICAgICAgaWYgKGpzb24uZ3JhZGllbnRNYXAgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5ncmFkaWVudE1hcCA9IGdldFRleHR1cmUoanNvbi5ncmFkaWVudE1hcCk7CiAgICAgIGlmIChqc29uLmNsZWFyY29hdE1hcCAhPT0gdW5kZWZpbmVkKQogICAgICAgIG1hdGVyaWFsLmNsZWFyY29hdE1hcCA9IGdldFRleHR1cmUoanNvbi5jbGVhcmNvYXRNYXApOwogICAgICBpZiAoanNvbi5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPSBnZXRUZXh0dXJlKGpzb24uY2xlYXJjb2F0Um91Z2huZXNzTWFwKTsKICAgICAgaWYgKGpzb24uY2xlYXJjb2F0Tm9ybWFsTWFwICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwID0gZ2V0VGV4dHVyZShqc29uLmNsZWFyY29hdE5vcm1hbE1hcCk7CiAgICAgIGlmIChqc29uLmNsZWFyY29hdE5vcm1hbFNjYWxlICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMigpLmZyb21BcnJheShqc29uLmNsZWFyY29hdE5vcm1hbFNjYWxlKTsKICAgICAgaWYgKGpzb24uaXJpZGVzY2VuY2VNYXAgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5pcmlkZXNjZW5jZU1hcCA9IGdldFRleHR1cmUoanNvbi5pcmlkZXNjZW5jZU1hcCk7CiAgICAgIGlmIChqc29uLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAgPSBnZXRUZXh0dXJlKGpzb24uaXJpZGVzY2VuY2VUaGlja25lc3NNYXApOwogICAgICBpZiAoanNvbi50cmFuc21pc3Npb25NYXAgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC50cmFuc21pc3Npb25NYXAgPSBnZXRUZXh0dXJlKGpzb24udHJhbnNtaXNzaW9uTWFwKTsKICAgICAgaWYgKGpzb24udGhpY2tuZXNzTWFwICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwudGhpY2tuZXNzTWFwID0gZ2V0VGV4dHVyZShqc29uLnRoaWNrbmVzc01hcCk7CiAgICAgIGlmIChqc29uLmFuaXNvdHJvcHlNYXAgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5hbmlzb3Ryb3B5TWFwID0gZ2V0VGV4dHVyZShqc29uLmFuaXNvdHJvcHlNYXApOwogICAgICBpZiAoanNvbi5zaGVlbkNvbG9yTWFwICE9PSB1bmRlZmluZWQpCiAgICAgICAgbWF0ZXJpYWwuc2hlZW5Db2xvck1hcCA9IGdldFRleHR1cmUoanNvbi5zaGVlbkNvbG9yTWFwKTsKICAgICAgaWYgKGpzb24uc2hlZW5Sb3VnaG5lc3NNYXAgIT09IHVuZGVmaW5lZCkKICAgICAgICBtYXRlcmlhbC5zaGVlblJvdWdobmVzc01hcCA9IGdldFRleHR1cmUoanNvbi5zaGVlblJvdWdobmVzc01hcCk7CiAgICAgIHJldHVybiBtYXRlcmlhbDsKICAgIH0KICAgIHNldFRleHR1cmVzKHZhbHVlKSB7CiAgICAgIHRoaXMudGV4dHVyZXMgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjcmVhdGVNYXRlcmlhbEZyb21UeXBlKHR5cGUpIHsKICAgICAgcmV0dXJuIE1hdGVyaWFsTG9hZGVyLmNyZWF0ZU1hdGVyaWFsRnJvbVR5cGUodHlwZSk7CiAgICB9CiAgICBzdGF0aWMgY3JlYXRlTWF0ZXJpYWxGcm9tVHlwZSh0eXBlKSB7CiAgICAgIGNvbnN0IG1hdGVyaWFsTGliID0gewogICAgICAgIFNoYWRvd01hdGVyaWFsLAogICAgICAgIFNwcml0ZU1hdGVyaWFsLAogICAgICAgIFJhd1NoYWRlck1hdGVyaWFsLAogICAgICAgIFNoYWRlck1hdGVyaWFsLAogICAgICAgIFBvaW50c01hdGVyaWFsLAogICAgICAgIE1lc2hQaHlzaWNhbE1hdGVyaWFsLAogICAgICAgIE1lc2hTdGFuZGFyZE1hdGVyaWFsLAogICAgICAgIE1lc2hQaG9uZ01hdGVyaWFsLAogICAgICAgIE1lc2hUb29uTWF0ZXJpYWwsCiAgICAgICAgTWVzaE5vcm1hbE1hdGVyaWFsLAogICAgICAgIE1lc2hMYW1iZXJ0TWF0ZXJpYWwsCiAgICAgICAgTWVzaERlcHRoTWF0ZXJpYWwsCiAgICAgICAgTWVzaERpc3RhbmNlTWF0ZXJpYWwsCiAgICAgICAgTWVzaEJhc2ljTWF0ZXJpYWwsCiAgICAgICAgTWVzaE1hdGNhcE1hdGVyaWFsLAogICAgICAgIExpbmVEYXNoZWRNYXRlcmlhbCwKICAgICAgICBMaW5lQmFzaWNNYXRlcmlhbCwKICAgICAgICBNYXRlcmlhbAogICAgICB9OwogICAgICByZXR1cm4gbmV3IG1hdGVyaWFsTGliW3R5cGVdOwogICAgfQogIH07CiAgSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgPSBjbGFzcyBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiOwogICAgICB0aGlzLmluc3RhbmNlQ291bnQgPSBJbmZpbml0eTsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5pbnN0YW5jZUNvdW50ID0gc291cmNlLmluc3RhbmNlQ291bnQ7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdG9KU09OKCkgewogICAgICBjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7CiAgICAgIGRhdGEuaW5zdGFuY2VDb3VudCA9IHRoaXMuaW5zdGFuY2VDb3VudDsKICAgICAgZGF0YS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ID0gdHJ1ZTsKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgfTsKICBCdWZmZXJHZW9tZXRyeUxvYWRlciA9IGNsYXNzIEJ1ZmZlckdlb21ldHJ5TG9hZGVyIGV4dGVuZHMgTG9hZGVyIHsKICAgIGNvbnN0cnVjdG9yKG1hbmFnZXIpIHsKICAgICAgc3VwZXIobWFuYWdlcik7CiAgICB9CiAgICBsb2FkKHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yKSB7CiAgICAgIGNvbnN0IHNjb3BlID0gdGhpczsKICAgICAgY29uc3QgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoc2NvcGUubWFuYWdlcik7CiAgICAgIGxvYWRlci5zZXRQYXRoKHNjb3BlLnBhdGgpOwogICAgICBsb2FkZXIuc2V0UmVxdWVzdEhlYWRlcihzY29wZS5yZXF1ZXN0SGVhZGVyKTsKICAgICAgbG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyhzY29wZS53aXRoQ3JlZGVudGlhbHMpOwogICAgICBsb2FkZXIubG9hZCh1cmwsIGZ1bmN0aW9uKHRleHQpIHsKICAgICAgICB0cnkgewogICAgICAgICAgb25Mb2FkKHNjb3BlLnBhcnNlKEpTT04ucGFyc2UodGV4dCkpKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBpZiAob25FcnJvcikgewogICAgICAgICAgICBvbkVycm9yKGUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICAgIH0KICAgICAgICAgIHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKHVybCk7CiAgICAgICAgfQogICAgICB9LCBvblByb2dyZXNzLCBvbkVycm9yKTsKICAgIH0KICAgIHBhcnNlKGpzb24pIHsKICAgICAgY29uc3QgaW50ZXJsZWF2ZWRCdWZmZXJNYXAgPSB7fTsKICAgICAgY29uc3QgYXJyYXlCdWZmZXJNYXAgPSB7fTsKICAgICAgZnVuY3Rpb24gZ2V0SW50ZXJsZWF2ZWRCdWZmZXIoanNvbjIsIHV1aWQpIHsKICAgICAgICBpZiAoaW50ZXJsZWF2ZWRCdWZmZXJNYXBbdXVpZF0gIT09IHVuZGVmaW5lZCkKICAgICAgICAgIHJldHVybiBpbnRlcmxlYXZlZEJ1ZmZlck1hcFt1dWlkXTsKICAgICAgICBjb25zdCBpbnRlcmxlYXZlZEJ1ZmZlcnMgPSBqc29uMi5pbnRlcmxlYXZlZEJ1ZmZlcnM7CiAgICAgICAgY29uc3QgaW50ZXJsZWF2ZWRCdWZmZXIgPSBpbnRlcmxlYXZlZEJ1ZmZlcnNbdXVpZF07CiAgICAgICAgY29uc3QgYnVmZmVyID0gZ2V0QXJyYXlCdWZmZXIoanNvbjIsIGludGVybGVhdmVkQnVmZmVyLmJ1ZmZlcik7CiAgICAgICAgY29uc3QgYXJyYXkgPSBnZXRUeXBlZEFycmF5KGludGVybGVhdmVkQnVmZmVyLnR5cGUsIGJ1ZmZlcik7CiAgICAgICAgY29uc3QgaWIgPSBuZXcgSW50ZXJsZWF2ZWRCdWZmZXIoYXJyYXksIGludGVybGVhdmVkQnVmZmVyLnN0cmlkZSk7CiAgICAgICAgaWIudXVpZCA9IGludGVybGVhdmVkQnVmZmVyLnV1aWQ7CiAgICAgICAgaW50ZXJsZWF2ZWRCdWZmZXJNYXBbdXVpZF0gPSBpYjsKICAgICAgICByZXR1cm4gaWI7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZ2V0QXJyYXlCdWZmZXIoanNvbjIsIHV1aWQpIHsKICAgICAgICBpZiAoYXJyYXlCdWZmZXJNYXBbdXVpZF0gIT09IHVuZGVmaW5lZCkKICAgICAgICAgIHJldHVybiBhcnJheUJ1ZmZlck1hcFt1dWlkXTsKICAgICAgICBjb25zdCBhcnJheUJ1ZmZlcnMgPSBqc29uMi5hcnJheUJ1ZmZlcnM7CiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhcnJheUJ1ZmZlcnNbdXVpZF07CiAgICAgICAgY29uc3QgYWIgPSBuZXcgVWludDMyQXJyYXkoYXJyYXlCdWZmZXIpLmJ1ZmZlcjsKICAgICAgICBhcnJheUJ1ZmZlck1hcFt1dWlkXSA9IGFiOwogICAgICAgIHJldHVybiBhYjsKICAgICAgfQogICAgICBjb25zdCBnZW9tZXRyeSA9IGpzb24uaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSA/IG5ldyBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSA6IG5ldyBCdWZmZXJHZW9tZXRyeTsKICAgICAgY29uc3QgaW5kZXggPSBqc29uLmRhdGEuaW5kZXg7CiAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29uc3QgdHlwZWRBcnJheSA9IGdldFR5cGVkQXJyYXkoaW5kZXgudHlwZSwgaW5kZXguYXJyYXkpOwogICAgICAgIGdlb21ldHJ5LnNldEluZGV4KG5ldyBCdWZmZXJBdHRyaWJ1dGUodHlwZWRBcnJheSwgMSkpOwogICAgICB9CiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBqc29uLmRhdGEuYXR0cmlidXRlczsKICAgICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cmlidXRlcykgewogICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNba2V5XTsKICAgICAgICBsZXQgYnVmZmVyQXR0cmlidXRlOwogICAgICAgIGlmIChhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSkgewogICAgICAgICAgY29uc3QgaW50ZXJsZWF2ZWRCdWZmZXIgPSBnZXRJbnRlcmxlYXZlZEJ1ZmZlcihqc29uLmRhdGEsIGF0dHJpYnV0ZS5kYXRhKTsKICAgICAgICAgIGJ1ZmZlckF0dHJpYnV0ZSA9IG5ldyBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZShpbnRlcmxlYXZlZEJ1ZmZlciwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUub2Zmc2V0LCBhdHRyaWJ1dGUubm9ybWFsaXplZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IHR5cGVkQXJyYXkgPSBnZXRUeXBlZEFycmF5KGF0dHJpYnV0ZS50eXBlLCBhdHRyaWJ1dGUuYXJyYXkpOwogICAgICAgICAgY29uc3QgYnVmZmVyQXR0cmlidXRlQ29uc3RyID0gYXR0cmlidXRlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlID8gSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIDogQnVmZmVyQXR0cmlidXRlOwogICAgICAgICAgYnVmZmVyQXR0cmlidXRlID0gbmV3IGJ1ZmZlckF0dHJpYnV0ZUNvbnN0cih0eXBlZEFycmF5LCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZS5ub3JtYWxpemVkKTsKICAgICAgICB9CiAgICAgICAgaWYgKGF0dHJpYnV0ZS5uYW1lICE9PSB1bmRlZmluZWQpCiAgICAgICAgICBidWZmZXJBdHRyaWJ1dGUubmFtZSA9IGF0dHJpYnV0ZS5uYW1lOwogICAgICAgIGlmIChhdHRyaWJ1dGUudXNhZ2UgIT09IHVuZGVmaW5lZCkKICAgICAgICAgIGJ1ZmZlckF0dHJpYnV0ZS5zZXRVc2FnZShhdHRyaWJ1dGUudXNhZ2UpOwogICAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZShrZXksIGJ1ZmZlckF0dHJpYnV0ZSk7CiAgICAgIH0KICAgICAgY29uc3QgbW9ycGhBdHRyaWJ1dGVzID0ganNvbi5kYXRhLm1vcnBoQXR0cmlidXRlczsKICAgICAgaWYgKG1vcnBoQXR0cmlidXRlcykgewogICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1vcnBoQXR0cmlidXRlcykgewogICAgICAgICAgY29uc3QgYXR0cmlidXRlQXJyYXkgPSBtb3JwaEF0dHJpYnV0ZXNba2V5XTsKICAgICAgICAgIGNvbnN0IGFycmF5ID0gW107CiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBhdHRyaWJ1dGVBcnJheS5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlQXJyYXlbaV07CiAgICAgICAgICAgIGxldCBidWZmZXJBdHRyaWJ1dGU7CiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSkgewogICAgICAgICAgICAgIGNvbnN0IGludGVybGVhdmVkQnVmZmVyID0gZ2V0SW50ZXJsZWF2ZWRCdWZmZXIoanNvbi5kYXRhLCBhdHRyaWJ1dGUuZGF0YSk7CiAgICAgICAgICAgICAgYnVmZmVyQXR0cmlidXRlID0gbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKGludGVybGVhdmVkQnVmZmVyLCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZS5vZmZzZXQsIGF0dHJpYnV0ZS5ub3JtYWxpemVkKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb25zdCB0eXBlZEFycmF5ID0gZ2V0VHlwZWRBcnJheShhdHRyaWJ1dGUudHlwZSwgYXR0cmlidXRlLmFycmF5KTsKICAgICAgICAgICAgICBidWZmZXJBdHRyaWJ1dGUgPSBuZXcgQnVmZmVyQXR0cmlidXRlKHR5cGVkQXJyYXksIGF0dHJpYnV0ZS5pdGVtU2l6ZSwgYXR0cmlidXRlLm5vcm1hbGl6ZWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUubmFtZSAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgIGJ1ZmZlckF0dHJpYnV0ZS5uYW1lID0gYXR0cmlidXRlLm5hbWU7CiAgICAgICAgICAgIGFycmF5LnB1c2goYnVmZmVyQXR0cmlidXRlKTsKICAgICAgICAgIH0KICAgICAgICAgIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlc1trZXldID0gYXJyYXk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IG1vcnBoVGFyZ2V0c1JlbGF0aXZlID0ganNvbi5kYXRhLm1vcnBoVGFyZ2V0c1JlbGF0aXZlOwogICAgICBpZiAobW9ycGhUYXJnZXRzUmVsYXRpdmUpIHsKICAgICAgICBnZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHRydWU7CiAgICAgIH0KICAgICAgY29uc3QgZ3JvdXBzID0ganNvbi5kYXRhLmdyb3VwcyB8fCBqc29uLmRhdGEuZHJhd2NhbGxzIHx8IGpzb24uZGF0YS5vZmZzZXRzOwogICAgICBpZiAoZ3JvdXBzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgbiA9IGdyb3Vwcy5sZW5ndGg7aSAhPT0gbjsgKytpKSB7CiAgICAgICAgICBjb25zdCBncm91cCA9IGdyb3Vwc1tpXTsKICAgICAgICAgIGdlb21ldHJ5LmFkZEdyb3VwKGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IGJvdW5kaW5nU3BoZXJlID0ganNvbi5kYXRhLmJvdW5kaW5nU3BoZXJlOwogICAgICBpZiAoYm91bmRpbmdTcGhlcmUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbnN0IGNlbnRlciA9IG5ldyBWZWN0b3IzOwogICAgICAgIGlmIChib3VuZGluZ1NwaGVyZS5jZW50ZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgY2VudGVyLmZyb21BcnJheShib3VuZGluZ1NwaGVyZS5jZW50ZXIpOwogICAgICAgIH0KICAgICAgICBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoY2VudGVyLCBib3VuZGluZ1NwaGVyZS5yYWRpdXMpOwogICAgICB9CiAgICAgIGlmIChqc29uLm5hbWUpCiAgICAgICAgZ2VvbWV0cnkubmFtZSA9IGpzb24ubmFtZTsKICAgICAgaWYgKGpzb24udXNlckRhdGEpCiAgICAgICAgZ2VvbWV0cnkudXNlckRhdGEgPSBqc29uLnVzZXJEYXRhOwogICAgICByZXR1cm4gZ2VvbWV0cnk7CiAgICB9CiAgfTsKICBPYmplY3RMb2FkZXIgPSBjbGFzcyBPYmplY3RMb2FkZXIgZXh0ZW5kcyBMb2FkZXIgewogICAgY29uc3RydWN0b3IobWFuYWdlcikgewogICAgICBzdXBlcihtYW5hZ2VyKTsKICAgIH0KICAgIGxvYWQodXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IpIHsKICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzOwogICAgICBjb25zdCBwYXRoID0gdGhpcy5wYXRoID09PSAiIiA/IExvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKHVybCkgOiB0aGlzLnBhdGg7CiAgICAgIHRoaXMucmVzb3VyY2VQYXRoID0gdGhpcy5yZXNvdXJjZVBhdGggfHwgcGF0aDsKICAgICAgY29uc3QgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIodGhpcy5tYW5hZ2VyKTsKICAgICAgbG9hZGVyLnNldFBhdGgodGhpcy5wYXRoKTsKICAgICAgbG9hZGVyLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKTsKICAgICAgbG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyh0aGlzLndpdGhDcmVkZW50aWFscyk7CiAgICAgIGxvYWRlci5sb2FkKHVybCwgZnVuY3Rpb24odGV4dCkgewogICAgICAgIGxldCBqc29uID0gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAganNvbiA9IEpTT04ucGFyc2UodGV4dCk7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgIGlmIChvbkVycm9yICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgIG9uRXJyb3IoZXJyb3IpOwogICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUU6T2JqZWN0TG9hZGVyOiBDYW4ndCBwYXJzZSAiICsgdXJsICsgIi4iLCBlcnJvci5tZXNzYWdlKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBqc29uLm1ldGFkYXRhOwogICAgICAgIGlmIChtZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICJnZW9tZXRyeSIpIHsKICAgICAgICAgIGlmIChvbkVycm9yICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgIG9uRXJyb3IobmV3IEVycm9yKCJUSFJFRS5PYmplY3RMb2FkZXI6IENhbid0IGxvYWQgIiArIHVybCkpOwogICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW4ndCBsb2FkICIgKyB1cmwpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzY29wZS5wYXJzZShqc29uLCBvbkxvYWQpOwogICAgICB9LCBvblByb2dyZXNzLCBvbkVycm9yKTsKICAgIH0KICAgIGFzeW5jIGxvYWRBc3luYyh1cmwsIG9uUHJvZ3Jlc3MpIHsKICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzOwogICAgICBjb25zdCBwYXRoID0gdGhpcy5wYXRoID09PSAiIiA/IExvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKHVybCkgOiB0aGlzLnBhdGg7CiAgICAgIHRoaXMucmVzb3VyY2VQYXRoID0gdGhpcy5yZXNvdXJjZVBhdGggfHwgcGF0aDsKICAgICAgY29uc3QgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIodGhpcy5tYW5hZ2VyKTsKICAgICAgbG9hZGVyLnNldFBhdGgodGhpcy5wYXRoKTsKICAgICAgbG9hZGVyLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKTsKICAgICAgbG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyh0aGlzLndpdGhDcmVkZW50aWFscyk7CiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBsb2FkZXIubG9hZEFzeW5jKHVybCwgb25Qcm9ncmVzcyk7CiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKHRleHQpOwogICAgICBjb25zdCBtZXRhZGF0YSA9IGpzb24ubWV0YWRhdGE7CiAgICAgIGlmIChtZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICJnZW9tZXRyeSIpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk9iamVjdExvYWRlcjogQ2FuJ3QgbG9hZCAiICsgdXJsKTsKICAgICAgfQogICAgICByZXR1cm4gYXdhaXQgc2NvcGUucGFyc2VBc3luYyhqc29uKTsKICAgIH0KICAgIHBhcnNlKGpzb24sIG9uTG9hZCkgewogICAgICBjb25zdCBhbmltYXRpb25zID0gdGhpcy5wYXJzZUFuaW1hdGlvbnMoanNvbi5hbmltYXRpb25zKTsKICAgICAgY29uc3Qgc2hhcGVzID0gdGhpcy5wYXJzZVNoYXBlcyhqc29uLnNoYXBlcyk7CiAgICAgIGNvbnN0IGdlb21ldHJpZXMgPSB0aGlzLnBhcnNlR2VvbWV0cmllcyhqc29uLmdlb21ldHJpZXMsIHNoYXBlcyk7CiAgICAgIGNvbnN0IGltYWdlcyA9IHRoaXMucGFyc2VJbWFnZXMoanNvbi5pbWFnZXMsIGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChvbkxvYWQgIT09IHVuZGVmaW5lZCkKICAgICAgICAgIG9uTG9hZChvYmplY3QpOwogICAgICB9KTsKICAgICAgY29uc3QgdGV4dHVyZXMgPSB0aGlzLnBhcnNlVGV4dHVyZXMoanNvbi50ZXh0dXJlcywgaW1hZ2VzKTsKICAgICAgY29uc3QgbWF0ZXJpYWxzID0gdGhpcy5wYXJzZU1hdGVyaWFscyhqc29uLm1hdGVyaWFscywgdGV4dHVyZXMpOwogICAgICBjb25zdCBvYmplY3QgPSB0aGlzLnBhcnNlT2JqZWN0KGpzb24ub2JqZWN0LCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMsIHRleHR1cmVzLCBhbmltYXRpb25zKTsKICAgICAgY29uc3Qgc2tlbGV0b25zID0gdGhpcy5wYXJzZVNrZWxldG9ucyhqc29uLnNrZWxldG9ucywgb2JqZWN0KTsKICAgICAgdGhpcy5iaW5kU2tlbGV0b25zKG9iamVjdCwgc2tlbGV0b25zKTsKICAgICAgdGhpcy5iaW5kTGlnaHRUYXJnZXRzKG9iamVjdCk7CiAgICAgIGlmIChvbkxvYWQgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGxldCBoYXNJbWFnZXMgPSBmYWxzZTsKICAgICAgICBmb3IgKGNvbnN0IHV1aWQgaW4gaW1hZ2VzKSB7CiAgICAgICAgICBpZiAoaW1hZ2VzW3V1aWRdLmRhdGEgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7CiAgICAgICAgICAgIGhhc0ltYWdlcyA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaGFzSW1hZ2VzID09PSBmYWxzZSkKICAgICAgICAgIG9uTG9hZChvYmplY3QpOwogICAgICB9CiAgICAgIHJldHVybiBvYmplY3Q7CiAgICB9CiAgICBhc3luYyBwYXJzZUFzeW5jKGpzb24pIHsKICAgICAgY29uc3QgYW5pbWF0aW9ucyA9IHRoaXMucGFyc2VBbmltYXRpb25zKGpzb24uYW5pbWF0aW9ucyk7CiAgICAgIGNvbnN0IHNoYXBlcyA9IHRoaXMucGFyc2VTaGFwZXMoanNvbi5zaGFwZXMpOwogICAgICBjb25zdCBnZW9tZXRyaWVzID0gdGhpcy5wYXJzZUdlb21ldHJpZXMoanNvbi5nZW9tZXRyaWVzLCBzaGFwZXMpOwogICAgICBjb25zdCBpbWFnZXMgPSBhd2FpdCB0aGlzLnBhcnNlSW1hZ2VzQXN5bmMoanNvbi5pbWFnZXMpOwogICAgICBjb25zdCB0ZXh0dXJlcyA9IHRoaXMucGFyc2VUZXh0dXJlcyhqc29uLnRleHR1cmVzLCBpbWFnZXMpOwogICAgICBjb25zdCBtYXRlcmlhbHMgPSB0aGlzLnBhcnNlTWF0ZXJpYWxzKGpzb24ubWF0ZXJpYWxzLCB0ZXh0dXJlcyk7CiAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMucGFyc2VPYmplY3QoanNvbi5vYmplY3QsIGdlb21ldHJpZXMsIG1hdGVyaWFscywgdGV4dHVyZXMsIGFuaW1hdGlvbnMpOwogICAgICBjb25zdCBza2VsZXRvbnMgPSB0aGlzLnBhcnNlU2tlbGV0b25zKGpzb24uc2tlbGV0b25zLCBvYmplY3QpOwogICAgICB0aGlzLmJpbmRTa2VsZXRvbnMob2JqZWN0LCBza2VsZXRvbnMpOwogICAgICB0aGlzLmJpbmRMaWdodFRhcmdldHMob2JqZWN0KTsKICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH0KICAgIHBhcnNlU2hhcGVzKGpzb24pIHsKICAgICAgY29uc3Qgc2hhcGVzID0ge307CiAgICAgIGlmIChqc29uICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGpzb24ubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHNoYXBlID0gbmV3IFNoYXBlKCkuZnJvbUpTT04oanNvbltpXSk7CiAgICAgICAgICBzaGFwZXNbc2hhcGUudXVpZF0gPSBzaGFwZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHNoYXBlczsKICAgIH0KICAgIHBhcnNlU2tlbGV0b25zKGpzb24sIG9iamVjdCkgewogICAgICBjb25zdCBza2VsZXRvbnMgPSB7fTsKICAgICAgY29uc3QgYm9uZXMgPSB7fTsKICAgICAgb2JqZWN0LnRyYXZlcnNlKGZ1bmN0aW9uKGNoaWxkKSB7CiAgICAgICAgaWYgKGNoaWxkLmlzQm9uZSkKICAgICAgICAgIGJvbmVzW2NoaWxkLnV1aWRdID0gY2hpbGQ7CiAgICAgIH0pOwogICAgICBpZiAoanNvbiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBza2VsZXRvbiA9IG5ldyBTa2VsZXRvbigpLmZyb21KU09OKGpzb25baV0sIGJvbmVzKTsKICAgICAgICAgIHNrZWxldG9uc1tza2VsZXRvbi51dWlkXSA9IHNrZWxldG9uOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gc2tlbGV0b25zOwogICAgfQogICAgcGFyc2VHZW9tZXRyaWVzKGpzb24sIHNoYXBlcykgewogICAgICBjb25zdCBnZW9tZXRyaWVzID0ge307CiAgICAgIGlmIChqc29uICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBjb25zdCBidWZmZXJHZW9tZXRyeUxvYWRlciA9IG5ldyBCdWZmZXJHZW9tZXRyeUxvYWRlcjsKICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGpzb24ubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICAgIGxldCBnZW9tZXRyeTsKICAgICAgICAgIGNvbnN0IGRhdGEgPSBqc29uW2ldOwogICAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAiQnVmZmVyR2VvbWV0cnkiOgogICAgICAgICAgICBjYXNlICJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSI6CiAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBidWZmZXJHZW9tZXRyeUxvYWRlci5wYXJzZShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiR2VvbWV0cnkiOgogICAgICAgICAgICAgIGlmICgiVEhSRUUiIGluIHdpbmRvdyAmJiAiTGVnYWN5SlNPTkxvYWRlciIgaW4gVEhSRUUpIHsKICAgICAgICAgICAgICAgIHZhciBnZW9tZXRyeUxvYWRlciA9IG5ldyBUSFJFRS5MZWdhY3lKU09OTG9hZGVyOwogICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeUxvYWRlci5wYXJzZShkYXRhLCB0aGlzLnJlc291cmNlUGF0aCkuZ2VvbWV0cnk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RIUkVFLk9iamVjdExvYWRlcjogWW91IGhhdmUgdG8gaW1wb3J0IExlZ2FjeUpTT05Mb2FkZXIgaW4gb3JkZXIgbG9hZCBnZW9tZXRyeSBkYXRhIG9mIHR5cGUgIkdlb21ldHJ5Ii4nKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgaWYgKGRhdGEudHlwZSBpbiBHZW9tZXRyaWVzKSB7CiAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IEdlb21ldHJpZXNbZGF0YS50eXBlXS5mcm9tSlNPTihkYXRhLCBzaGFwZXMpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFRIUkVFLk9iamVjdExvYWRlcjogVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSAiJHtkYXRhLnR5cGV9ImApOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGdlb21ldHJ5LnV1aWQgPSBkYXRhLnV1aWQ7CiAgICAgICAgICBpZiAoZGF0YS5uYW1lICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgIGdlb21ldHJ5Lm5hbWUgPSBkYXRhLm5hbWU7CiAgICAgICAgICBpZiAoZGF0YS51c2VyRGF0YSAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICBnZW9tZXRyeS51c2VyRGF0YSA9IGRhdGEudXNlckRhdGE7CiAgICAgICAgICBnZW9tZXRyaWVzW2RhdGEudXVpZF0gPSBnZW9tZXRyeTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGdlb21ldHJpZXM7CiAgICB9CiAgICBwYXJzZU1hdGVyaWFscyhqc29uLCB0ZXh0dXJlcykgewogICAgICBjb25zdCBjYWNoZSA9IHt9OwogICAgICBjb25zdCBtYXRlcmlhbHMgPSB7fTsKICAgICAgaWYgKGpzb24gIT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbnN0IGxvYWRlciA9IG5ldyBNYXRlcmlhbExvYWRlcjsKICAgICAgICBsb2FkZXIuc2V0VGV4dHVyZXModGV4dHVyZXMpOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0ganNvbi5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgICAgY29uc3QgZGF0YSA9IGpzb25baV07CiAgICAgICAgICBpZiAoY2FjaGVbZGF0YS51dWlkXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGNhY2hlW2RhdGEudXVpZF0gPSBsb2FkZXIucGFyc2UoZGF0YSk7CiAgICAgICAgICB9CiAgICAgICAgICBtYXRlcmlhbHNbZGF0YS51dWlkXSA9IGNhY2hlW2RhdGEudXVpZF07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBtYXRlcmlhbHM7CiAgICB9CiAgICBwYXJzZUFuaW1hdGlvbnMoanNvbikgewogICAgICBjb25zdCBhbmltYXRpb25zID0ge307CiAgICAgIGlmIChqc29uICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwganNvbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgZGF0YSA9IGpzb25baV07CiAgICAgICAgICBjb25zdCBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJzZShkYXRhKTsKICAgICAgICAgIGFuaW1hdGlvbnNbY2xpcC51dWlkXSA9IGNsaXA7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBhbmltYXRpb25zOwogICAgfQogICAgcGFyc2VJbWFnZXMoanNvbiwgb25Mb2FkKSB7CiAgICAgIGNvbnN0IHNjb3BlID0gdGhpczsKICAgICAgY29uc3QgaW1hZ2VzID0ge307CiAgICAgIGxldCBsb2FkZXI7CiAgICAgIGZ1bmN0aW9uIGxvYWRJbWFnZSh1cmwpIHsKICAgICAgICBzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCh1cmwpOwogICAgICAgIHJldHVybiBsb2FkZXIubG9hZCh1cmwsIGZ1bmN0aW9uKCkgewogICAgICAgICAgc2NvcGUubWFuYWdlci5pdGVtRW5kKHVybCk7CiAgICAgICAgfSwgdW5kZWZpbmVkLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKHVybCk7CiAgICAgICAgICBzY29wZS5tYW5hZ2VyLml0ZW1FbmQodXJsKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBmdW5jdGlvbiBkZXNlcmlhbGl6ZUltYWdlKGltYWdlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBpbWFnZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIGNvbnN0IHVybCA9IGltYWdlOwogICAgICAgICAgY29uc3QgcGF0aCA9IC9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KHVybCkgPyB1cmwgOiBzY29wZS5yZXNvdXJjZVBhdGggKyB1cmw7CiAgICAgICAgICByZXR1cm4gbG9hZEltYWdlKHBhdGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaW1hZ2UuZGF0YSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIGRhdGE6IGdldFR5cGVkQXJyYXkoaW1hZ2UudHlwZSwgaW1hZ2UuZGF0YSksCiAgICAgICAgICAgICAgd2lkdGg6IGltYWdlLndpZHRoLAogICAgICAgICAgICAgIGhlaWdodDogaW1hZ2UuaGVpZ2h0CiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGpzb24gIT09IHVuZGVmaW5lZCAmJiBqc29uLmxlbmd0aCA+IDApIHsKICAgICAgICBjb25zdCBtYW5hZ2VyID0gbmV3IExvYWRpbmdNYW5hZ2VyKG9uTG9hZCk7CiAgICAgICAgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKG1hbmFnZXIpOwogICAgICAgIGxvYWRlci5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTsKICAgICAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBqc29uLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICAgICAgY29uc3QgaW1hZ2UgPSBqc29uW2ldOwogICAgICAgICAgY29uc3QgdXJsID0gaW1hZ2UudXJsOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodXJsKSkgewogICAgICAgICAgICBjb25zdCBpbWFnZUFycmF5ID0gW107CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwLCBqbCA9IHVybC5sZW5ndGg7aiA8IGpsOyBqKyspIHsKICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VXJsID0gdXJsW2pdOwogICAgICAgICAgICAgIGNvbnN0IGRlc2VyaWFsaXplZEltYWdlID0gZGVzZXJpYWxpemVJbWFnZShjdXJyZW50VXJsKTsKICAgICAgICAgICAgICBpZiAoZGVzZXJpYWxpemVkSW1hZ2UgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmIChkZXNlcmlhbGl6ZWRJbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgaW1hZ2VBcnJheS5wdXNoKGRlc2VyaWFsaXplZEltYWdlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGltYWdlQXJyYXkucHVzaChuZXcgRGF0YVRleHR1cmUoZGVzZXJpYWxpemVkSW1hZ2UuZGF0YSwgZGVzZXJpYWxpemVkSW1hZ2Uud2lkdGgsIGRlc2VyaWFsaXplZEltYWdlLmhlaWdodCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpbWFnZXNbaW1hZ2UudXVpZF0gPSBuZXcgU291cmNlKGltYWdlQXJyYXkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgZGVzZXJpYWxpemVkSW1hZ2UgPSBkZXNlcmlhbGl6ZUltYWdlKGltYWdlLnVybCk7CiAgICAgICAgICAgIGltYWdlc1tpbWFnZS51dWlkXSA9IG5ldyBTb3VyY2UoZGVzZXJpYWxpemVkSW1hZ2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaW1hZ2VzOwogICAgfQogICAgYXN5bmMgcGFyc2VJbWFnZXNBc3luYyhqc29uKSB7CiAgICAgIGNvbnN0IHNjb3BlID0gdGhpczsKICAgICAgY29uc3QgaW1hZ2VzID0ge307CiAgICAgIGxldCBsb2FkZXI7CiAgICAgIGFzeW5jIGZ1bmN0aW9uIGRlc2VyaWFsaXplSW1hZ2UoaW1hZ2UpIHsKICAgICAgICBpZiAodHlwZW9mIGltYWdlID09PSAic3RyaW5nIikgewogICAgICAgICAgY29uc3QgdXJsID0gaW1hZ2U7CiAgICAgICAgICBjb25zdCBwYXRoID0gL14oXC9cLyl8KFthLXpdKzooXC9cLyk/KS9pLnRlc3QodXJsKSA/IHVybCA6IHNjb3BlLnJlc291cmNlUGF0aCArIHVybDsKICAgICAgICAgIHJldHVybiBhd2FpdCBsb2FkZXIubG9hZEFzeW5jKHBhdGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaW1hZ2UuZGF0YSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIGRhdGE6IGdldFR5cGVkQXJyYXkoaW1hZ2UudHlwZSwgaW1hZ2UuZGF0YSksCiAgICAgICAgICAgICAgd2lkdGg6IGltYWdlLndpZHRoLAogICAgICAgICAgICAgIGhlaWdodDogaW1hZ2UuaGVpZ2h0CiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGpzb24gIT09IHVuZGVmaW5lZCAmJiBqc29uLmxlbmd0aCA+IDApIHsKICAgICAgICBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIodGhpcy5tYW5hZ2VyKTsKICAgICAgICBsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlsID0ganNvbi5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGltYWdlID0ganNvbltpXTsKICAgICAgICAgIGNvbnN0IHVybCA9IGltYWdlLnVybDsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHVybCkpIHsKICAgICAgICAgICAgY29uc3QgaW1hZ2VBcnJheSA9IFtdOwogICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgamwgPSB1cmwubGVuZ3RoO2ogPCBqbDsgaisrKSB7CiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFVybCA9IHVybFtqXTsKICAgICAgICAgICAgICBjb25zdCBkZXNlcmlhbGl6ZWRJbWFnZSA9IGF3YWl0IGRlc2VyaWFsaXplSW1hZ2UoY3VycmVudFVybCk7CiAgICAgICAgICAgICAgaWYgKGRlc2VyaWFsaXplZEltYWdlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoZGVzZXJpYWxpemVkSW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgIGltYWdlQXJyYXkucHVzaChkZXNlcmlhbGl6ZWRJbWFnZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpbWFnZUFycmF5LnB1c2gobmV3IERhdGFUZXh0dXJlKGRlc2VyaWFsaXplZEltYWdlLmRhdGEsIGRlc2VyaWFsaXplZEltYWdlLndpZHRoLCBkZXNlcmlhbGl6ZWRJbWFnZS5oZWlnaHQpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW1hZ2VzW2ltYWdlLnV1aWRdID0gbmV3IFNvdXJjZShpbWFnZUFycmF5KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IGRlc2VyaWFsaXplZEltYWdlID0gYXdhaXQgZGVzZXJpYWxpemVJbWFnZShpbWFnZS51cmwpOwogICAgICAgICAgICBpbWFnZXNbaW1hZ2UudXVpZF0gPSBuZXcgU291cmNlKGRlc2VyaWFsaXplZEltYWdlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGltYWdlczsKICAgIH0KICAgIHBhcnNlVGV4dHVyZXMoanNvbiwgaW1hZ2VzKSB7CiAgICAgIGZ1bmN0aW9uIHBhcnNlQ29uc3RhbnQodmFsdWUsIHR5cGUpIHsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAibnVtYmVyIikKICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlci5wYXJzZVRleHR1cmU6IENvbnN0YW50IHNob3VsZCBiZSBpbiBudW1lcmljIGZvcm0uIiwgdmFsdWUpOwogICAgICAgIHJldHVybiB0eXBlW3ZhbHVlXTsKICAgICAgfQogICAgICBjb25zdCB0ZXh0dXJlcyA9IHt9OwogICAgICBpZiAoanNvbiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBkYXRhID0ganNvbltpXTsKICAgICAgICAgIGlmIChkYXRhLmltYWdlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCdUSFJFRS5PYmplY3RMb2FkZXI6IE5vICJpbWFnZSIgc3BlY2lmaWVkIGZvcicsIGRhdGEudXVpZCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaW1hZ2VzW2RhdGEuaW1hZ2VdID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZSIsIGRhdGEuaW1hZ2UpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3Qgc291cmNlID0gaW1hZ2VzW2RhdGEuaW1hZ2VdOwogICAgICAgICAgY29uc3QgaW1hZ2UgPSBzb3VyY2UuZGF0YTsKICAgICAgICAgIGxldCB0ZXh0dXJlOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW1hZ2UpKSB7CiAgICAgICAgICAgIHRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmU7CiAgICAgICAgICAgIGlmIChpbWFnZS5sZW5ndGggPT09IDYpCiAgICAgICAgICAgICAgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UuZGF0YSkgewogICAgICAgICAgICAgIHRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGV4dHVyZSA9IG5ldyBUZXh0dXJlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbWFnZSkKICAgICAgICAgICAgICB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHRleHR1cmUuc291cmNlID0gc291cmNlOwogICAgICAgICAgdGV4dHVyZS51dWlkID0gZGF0YS51dWlkOwogICAgICAgICAgaWYgKGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICB0ZXh0dXJlLm5hbWUgPSBkYXRhLm5hbWU7CiAgICAgICAgICBpZiAoZGF0YS5tYXBwaW5nICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHRleHR1cmUubWFwcGluZyA9IHBhcnNlQ29uc3RhbnQoZGF0YS5tYXBwaW5nLCBURVhUVVJFX01BUFBJTkcpOwogICAgICAgICAgaWYgKGRhdGEuY2hhbm5lbCAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICB0ZXh0dXJlLmNoYW5uZWwgPSBkYXRhLmNoYW5uZWw7CiAgICAgICAgICBpZiAoZGF0YS5vZmZzZXQgIT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgdGV4dHVyZS5vZmZzZXQuZnJvbUFycmF5KGRhdGEub2Zmc2V0KTsKICAgICAgICAgIGlmIChkYXRhLnJlcGVhdCAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICB0ZXh0dXJlLnJlcGVhdC5mcm9tQXJyYXkoZGF0YS5yZXBlYXQpOwogICAgICAgICAgaWYgKGRhdGEuY2VudGVyICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHRleHR1cmUuY2VudGVyLmZyb21BcnJheShkYXRhLmNlbnRlcik7CiAgICAgICAgICBpZiAoZGF0YS5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICB0ZXh0dXJlLnJvdGF0aW9uID0gZGF0YS5yb3RhdGlvbjsKICAgICAgICAgIGlmIChkYXRhLndyYXAgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICB0ZXh0dXJlLndyYXBTID0gcGFyc2VDb25zdGFudChkYXRhLndyYXBbMF0sIFRFWFRVUkVfV1JBUFBJTkcpOwogICAgICAgICAgICB0ZXh0dXJlLndyYXBUID0gcGFyc2VDb25zdGFudChkYXRhLndyYXBbMV0sIFRFWFRVUkVfV1JBUFBJTkcpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGRhdGEuZm9ybWF0ICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHRleHR1cmUuZm9ybWF0ID0gZGF0YS5mb3JtYXQ7CiAgICAgICAgICBpZiAoZGF0YS5pbnRlcm5hbEZvcm1hdCAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICB0ZXh0dXJlLmludGVybmFsRm9ybWF0ID0gZGF0YS5pbnRlcm5hbEZvcm1hdDsKICAgICAgICAgIGlmIChkYXRhLnR5cGUgIT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgdGV4dHVyZS50eXBlID0gZGF0YS50eXBlOwogICAgICAgICAgaWYgKGRhdGEuY29sb3JTcGFjZSAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICB0ZXh0dXJlLmNvbG9yU3BhY2UgPSBkYXRhLmNvbG9yU3BhY2U7CiAgICAgICAgICBpZiAoZGF0YS5taW5GaWx0ZXIgIT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgdGV4dHVyZS5taW5GaWx0ZXIgPSBwYXJzZUNvbnN0YW50KGRhdGEubWluRmlsdGVyLCBURVhUVVJFX0ZJTFRFUik7CiAgICAgICAgICBpZiAoZGF0YS5tYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgdGV4dHVyZS5tYWdGaWx0ZXIgPSBwYXJzZUNvbnN0YW50KGRhdGEubWFnRmlsdGVyLCBURVhUVVJFX0ZJTFRFUik7CiAgICAgICAgICBpZiAoZGF0YS5hbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHRleHR1cmUuYW5pc290cm9weSA9IGRhdGEuYW5pc290cm9weTsKICAgICAgICAgIGlmIChkYXRhLmZsaXBZICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHRleHR1cmUuZmxpcFkgPSBkYXRhLmZsaXBZOwogICAgICAgICAgaWYgKGRhdGEuZ2VuZXJhdGVNaXBtYXBzICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZGF0YS5nZW5lcmF0ZU1pcG1hcHM7CiAgICAgICAgICBpZiAoZGF0YS5wcmVtdWx0aXBseUFscGhhICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSA9IGRhdGEucHJlbXVsdGlwbHlBbHBoYTsKICAgICAgICAgIGlmIChkYXRhLnVucGFja0FsaWdubWVudCAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICB0ZXh0dXJlLnVucGFja0FsaWdubWVudCA9IGRhdGEudW5wYWNrQWxpZ25tZW50OwogICAgICAgICAgaWYgKGRhdGEuY29tcGFyZUZ1bmN0aW9uICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgIHRleHR1cmUuY29tcGFyZUZ1bmN0aW9uID0gZGF0YS5jb21wYXJlRnVuY3Rpb247CiAgICAgICAgICBpZiAoZGF0YS51c2VyRGF0YSAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICB0ZXh0dXJlLnVzZXJEYXRhID0gZGF0YS51c2VyRGF0YTsKICAgICAgICAgIHRleHR1cmVzW2RhdGEudXVpZF0gPSB0ZXh0dXJlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGV4dHVyZXM7CiAgICB9CiAgICBwYXJzZU9iamVjdChkYXRhLCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMsIHRleHR1cmVzLCBhbmltYXRpb25zKSB7CiAgICAgIGxldCBvYmplY3Q7CiAgICAgIGZ1bmN0aW9uIGdldEdlb21ldHJ5KG5hbWUpIHsKICAgICAgICBpZiAoZ2VvbWV0cmllc1tuYW1lXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5IiwgbmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBnZW9tZXRyaWVzW25hbWVdOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGdldE1hdGVyaWFsKG5hbWUpIHsKICAgICAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5hbWUpKSB7CiAgICAgICAgICBjb25zdCBhcnJheSA9IFtdOwogICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBuYW1lLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBuYW1lW2ldOwogICAgICAgICAgICBpZiAobWF0ZXJpYWxzW3V1aWRdID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsIiwgdXVpZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXJyYXkucHVzaChtYXRlcmlhbHNbdXVpZF0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICAgIH0KICAgICAgICBpZiAobWF0ZXJpYWxzW25hbWVdID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLCBuYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1hdGVyaWFsc1tuYW1lXTsKICAgICAgfQogICAgICBmdW5jdGlvbiBnZXRUZXh0dXJlKHV1aWQpIHsKICAgICAgICBpZiAodGV4dHVyZXNbdXVpZF0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlIiwgdXVpZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0ZXh0dXJlc1t1dWlkXTsKICAgICAgfQogICAgICBsZXQgZ2VvbWV0cnksIG1hdGVyaWFsOwogICAgICBzd2l0Y2ggKGRhdGEudHlwZSkgewogICAgICAgIGNhc2UgIlNjZW5lIjoKICAgICAgICAgIG9iamVjdCA9IG5ldyBTY2VuZTsKICAgICAgICAgIGlmIChkYXRhLmJhY2tncm91bmQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihkYXRhLmJhY2tncm91bmQpKSB7CiAgICAgICAgICAgICAgb2JqZWN0LmJhY2tncm91bmQgPSBuZXcgQ29sb3IoZGF0YS5iYWNrZ3JvdW5kKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBvYmplY3QuYmFja2dyb3VuZCA9IGdldFRleHR1cmUoZGF0YS5iYWNrZ3JvdW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGRhdGEuZW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBvYmplY3QuZW52aXJvbm1lbnQgPSBnZXRUZXh0dXJlKGRhdGEuZW52aXJvbm1lbnQpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGRhdGEuZm9nICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKGRhdGEuZm9nLnR5cGUgPT09ICJGb2ciKSB7CiAgICAgICAgICAgICAgb2JqZWN0LmZvZyA9IG5ldyBGb2coZGF0YS5mb2cuY29sb3IsIGRhdGEuZm9nLm5lYXIsIGRhdGEuZm9nLmZhcik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5mb2cudHlwZSA9PT0gIkZvZ0V4cDIiKSB7CiAgICAgICAgICAgICAgb2JqZWN0LmZvZyA9IG5ldyBGb2dFeHAyKGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5kZW5zaXR5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGF0YS5mb2cubmFtZSAhPT0gIiIpIHsKICAgICAgICAgICAgICBvYmplY3QuZm9nLm5hbWUgPSBkYXRhLmZvZy5uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGF0YS5iYWNrZ3JvdW5kQmx1cnJpbmVzcyAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICBvYmplY3QuYmFja2dyb3VuZEJsdXJyaW5lc3MgPSBkYXRhLmJhY2tncm91bmRCbHVycmluZXNzOwogICAgICAgICAgaWYgKGRhdGEuYmFja2dyb3VuZEludGVuc2l0eSAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICBvYmplY3QuYmFja2dyb3VuZEludGVuc2l0eSA9IGRhdGEuYmFja2dyb3VuZEludGVuc2l0eTsKICAgICAgICAgIGlmIChkYXRhLmJhY2tncm91bmRSb3RhdGlvbiAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICBvYmplY3QuYmFja2dyb3VuZFJvdGF0aW9uLmZyb21BcnJheShkYXRhLmJhY2tncm91bmRSb3RhdGlvbik7CiAgICAgICAgICBpZiAoZGF0YS5lbnZpcm9ubWVudEludGVuc2l0eSAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICBvYmplY3QuZW52aXJvbm1lbnRJbnRlbnNpdHkgPSBkYXRhLmVudmlyb25tZW50SW50ZW5zaXR5OwogICAgICAgICAgaWYgKGRhdGEuZW52aXJvbm1lbnRSb3RhdGlvbiAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICBvYmplY3QuZW52aXJvbm1lbnRSb3RhdGlvbi5mcm9tQXJyYXkoZGF0YS5lbnZpcm9ubWVudFJvdGF0aW9uKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlBlcnNwZWN0aXZlQ2FtZXJhIjoKICAgICAgICAgIG9iamVjdCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYShkYXRhLmZvdiwgZGF0YS5hc3BlY3QsIGRhdGEubmVhciwgZGF0YS5mYXIpOwogICAgICAgICAgaWYgKGRhdGEuZm9jdXMgIT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgb2JqZWN0LmZvY3VzID0gZGF0YS5mb2N1czsKICAgICAgICAgIGlmIChkYXRhLnpvb20gIT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgb2JqZWN0Lnpvb20gPSBkYXRhLnpvb207CiAgICAgICAgICBpZiAoZGF0YS5maWxtR2F1Z2UgIT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgb2JqZWN0LmZpbG1HYXVnZSA9IGRhdGEuZmlsbUdhdWdlOwogICAgICAgICAgaWYgKGRhdGEuZmlsbU9mZnNldCAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICBvYmplY3QuZmlsbU9mZnNldCA9IGRhdGEuZmlsbU9mZnNldDsKICAgICAgICAgIGlmIChkYXRhLnZpZXcgIT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgb2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKHt9LCBkYXRhLnZpZXcpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiT3J0aG9ncmFwaGljQ2FtZXJhIjoKICAgICAgICAgIG9iamVjdCA9IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoZGF0YS5sZWZ0LCBkYXRhLnJpZ2h0LCBkYXRhLnRvcCwgZGF0YS5ib3R0b20sIGRhdGEubmVhciwgZGF0YS5mYXIpOwogICAgICAgICAgaWYgKGRhdGEuem9vbSAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICBvYmplY3Quem9vbSA9IGRhdGEuem9vbTsKICAgICAgICAgIGlmIChkYXRhLnZpZXcgIT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgb2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKHt9LCBkYXRhLnZpZXcpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQW1iaWVudExpZ2h0IjoKICAgICAgICAgIG9iamVjdCA9IG5ldyBBbWJpZW50TGlnaHQoZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6CiAgICAgICAgICBvYmplY3QgPSBuZXcgRGlyZWN0aW9uYWxMaWdodChkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSk7CiAgICAgICAgICBvYmplY3QudGFyZ2V0ID0gZGF0YS50YXJnZXQgfHwgIiI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJQb2ludExpZ2h0IjoKICAgICAgICAgIG9iamVjdCA9IG5ldyBQb2ludExpZ2h0KGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLmRpc3RhbmNlLCBkYXRhLmRlY2F5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlJlY3RBcmVhTGlnaHQiOgogICAgICAgICAgb2JqZWN0ID0gbmV3IFJlY3RBcmVhTGlnaHQoZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlNwb3RMaWdodCI6CiAgICAgICAgICBvYmplY3QgPSBuZXcgU3BvdExpZ2h0KGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLmRpc3RhbmNlLCBkYXRhLmFuZ2xlLCBkYXRhLnBlbnVtYnJhLCBkYXRhLmRlY2F5KTsKICAgICAgICAgIG9iamVjdC50YXJnZXQgPSBkYXRhLnRhcmdldCB8fCAiIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkhlbWlzcGhlcmVMaWdodCI6CiAgICAgICAgICBvYmplY3QgPSBuZXcgSGVtaXNwaGVyZUxpZ2h0KGRhdGEuY29sb3IsIGRhdGEuZ3JvdW5kQ29sb3IsIGRhdGEuaW50ZW5zaXR5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkxpZ2h0UHJvYmUiOgogICAgICAgICAgb2JqZWN0ID0gbmV3IExpZ2h0UHJvYmUoKS5mcm9tSlNPTihkYXRhKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlNraW5uZWRNZXNoIjoKICAgICAgICAgIGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoZGF0YS5nZW9tZXRyeSk7CiAgICAgICAgICBtYXRlcmlhbCA9IGdldE1hdGVyaWFsKGRhdGEubWF0ZXJpYWwpOwogICAgICAgICAgb2JqZWN0ID0gbmV3IFNraW5uZWRNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCk7CiAgICAgICAgICBpZiAoZGF0YS5iaW5kTW9kZSAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICBvYmplY3QuYmluZE1vZGUgPSBkYXRhLmJpbmRNb2RlOwogICAgICAgICAgaWYgKGRhdGEuYmluZE1hdHJpeCAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICBvYmplY3QuYmluZE1hdHJpeC5mcm9tQXJyYXkoZGF0YS5iaW5kTWF0cml4KTsKICAgICAgICAgIGlmIChkYXRhLnNrZWxldG9uICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgIG9iamVjdC5za2VsZXRvbiA9IGRhdGEuc2tlbGV0b247CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJNZXNoIjoKICAgICAgICAgIGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoZGF0YS5nZW9tZXRyeSk7CiAgICAgICAgICBtYXRlcmlhbCA9IGdldE1hdGVyaWFsKGRhdGEubWF0ZXJpYWwpOwogICAgICAgICAgb2JqZWN0ID0gbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkluc3RhbmNlZE1lc2giOgogICAgICAgICAgZ2VvbWV0cnkgPSBnZXRHZW9tZXRyeShkYXRhLmdlb21ldHJ5KTsKICAgICAgICAgIG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoZGF0YS5tYXRlcmlhbCk7CiAgICAgICAgICBjb25zdCBjb3VudCA9IGRhdGEuY291bnQ7CiAgICAgICAgICBjb25zdCBpbnN0YW5jZU1hdHJpeCA9IGRhdGEuaW5zdGFuY2VNYXRyaXg7CiAgICAgICAgICBjb25zdCBpbnN0YW5jZUNvbG9yID0gZGF0YS5pbnN0YW5jZUNvbG9yOwogICAgICAgICAgb2JqZWN0ID0gbmV3IEluc3RhbmNlZE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsLCBjb3VudCk7CiAgICAgICAgICBvYmplY3QuaW5zdGFuY2VNYXRyaXggPSBuZXcgSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKG5ldyBGbG9hdDMyQXJyYXkoaW5zdGFuY2VNYXRyaXguYXJyYXkpLCAxNik7CiAgICAgICAgICBpZiAoaW5zdGFuY2VDb2xvciAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICBvYmplY3QuaW5zdGFuY2VDb2xvciA9IG5ldyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUobmV3IEZsb2F0MzJBcnJheShpbnN0YW5jZUNvbG9yLmFycmF5KSwgaW5zdGFuY2VDb2xvci5pdGVtU2l6ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJCYXRjaGVkTWVzaCI6CiAgICAgICAgICBnZW9tZXRyeSA9IGdldEdlb21ldHJ5KGRhdGEuZ2VvbWV0cnkpOwogICAgICAgICAgbWF0ZXJpYWwgPSBnZXRNYXRlcmlhbChkYXRhLm1hdGVyaWFsKTsKICAgICAgICAgIG9iamVjdCA9IG5ldyBCYXRjaGVkTWVzaChkYXRhLm1heEluc3RhbmNlQ291bnQsIGRhdGEubWF4VmVydGV4Q291bnQsIGRhdGEubWF4SW5kZXhDb3VudCwgbWF0ZXJpYWwpOwogICAgICAgICAgb2JqZWN0Lmdlb21ldHJ5ID0gZ2VvbWV0cnk7CiAgICAgICAgICBvYmplY3QucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCA9IGRhdGEucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZDsKICAgICAgICAgIG9iamVjdC5zb3J0T2JqZWN0cyA9IGRhdGEuc29ydE9iamVjdHM7CiAgICAgICAgICBvYmplY3QuX2RyYXdSYW5nZXMgPSBkYXRhLmRyYXdSYW5nZXM7CiAgICAgICAgICBvYmplY3QuX3Jlc2VydmVkUmFuZ2VzID0gZGF0YS5yZXNlcnZlZFJhbmdlczsKICAgICAgICAgIG9iamVjdC5fdmlzaWJpbGl0eSA9IGRhdGEudmlzaWJpbGl0eTsKICAgICAgICAgIG9iamVjdC5fYWN0aXZlID0gZGF0YS5hY3RpdmU7CiAgICAgICAgICBvYmplY3QuX2JvdW5kcyA9IGRhdGEuYm91bmRzLm1hcCgoYm91bmQpID0+IHsKICAgICAgICAgICAgY29uc3QgYm94ID0gbmV3IEJveDM7CiAgICAgICAgICAgIGJveC5taW4uZnJvbUFycmF5KGJvdW5kLmJveE1pbik7CiAgICAgICAgICAgIGJveC5tYXguZnJvbUFycmF5KGJvdW5kLmJveE1heCk7CiAgICAgICAgICAgIGNvbnN0IHNwaGVyZSA9IG5ldyBTcGhlcmU7CiAgICAgICAgICAgIHNwaGVyZS5yYWRpdXMgPSBib3VuZC5zcGhlcmVSYWRpdXM7CiAgICAgICAgICAgIHNwaGVyZS5jZW50ZXIuZnJvbUFycmF5KGJvdW5kLnNwaGVyZUNlbnRlcik7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgYm94SW5pdGlhbGl6ZWQ6IGJvdW5kLmJveEluaXRpYWxpemVkLAogICAgICAgICAgICAgIGJveCwKICAgICAgICAgICAgICBzcGhlcmVJbml0aWFsaXplZDogYm91bmQuc3BoZXJlSW5pdGlhbGl6ZWQsCiAgICAgICAgICAgICAgc3BoZXJlCiAgICAgICAgICAgIH07CiAgICAgICAgICB9KTsKICAgICAgICAgIG9iamVjdC5fbWF4SW5zdGFuY2VDb3VudCA9IGRhdGEubWF4SW5zdGFuY2VDb3VudDsKICAgICAgICAgIG9iamVjdC5fbWF4VmVydGV4Q291bnQgPSBkYXRhLm1heFZlcnRleENvdW50OwogICAgICAgICAgb2JqZWN0Ll9tYXhJbmRleENvdW50ID0gZGF0YS5tYXhJbmRleENvdW50OwogICAgICAgICAgb2JqZWN0Ll9nZW9tZXRyeUluaXRpYWxpemVkID0gZGF0YS5nZW9tZXRyeUluaXRpYWxpemVkOwogICAgICAgICAgb2JqZWN0Ll9nZW9tZXRyeUNvdW50ID0gZGF0YS5nZW9tZXRyeUNvdW50OwogICAgICAgICAgb2JqZWN0Ll9tYXRyaWNlc1RleHR1cmUgPSBnZXRUZXh0dXJlKGRhdGEubWF0cmljZXNUZXh0dXJlLnV1aWQpOwogICAgICAgICAgaWYgKGRhdGEuY29sb3JzVGV4dHVyZSAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgICBvYmplY3QuX2NvbG9yc1RleHR1cmUgPSBnZXRUZXh0dXJlKGRhdGEuY29sb3JzVGV4dHVyZS51dWlkKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkxPRCI6CiAgICAgICAgICBvYmplY3QgPSBuZXcgTE9EOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiTGluZSI6CiAgICAgICAgICBvYmplY3QgPSBuZXcgTGluZShnZXRHZW9tZXRyeShkYXRhLmdlb21ldHJ5KSwgZ2V0TWF0ZXJpYWwoZGF0YS5tYXRlcmlhbCkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiTGluZUxvb3AiOgogICAgICAgICAgb2JqZWN0ID0gbmV3IExpbmVMb29wKGdldEdlb21ldHJ5KGRhdGEuZ2VvbWV0cnkpLCBnZXRNYXRlcmlhbChkYXRhLm1hdGVyaWFsKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJMaW5lU2VnbWVudHMiOgogICAgICAgICAgb2JqZWN0ID0gbmV3IExpbmVTZWdtZW50cyhnZXRHZW9tZXRyeShkYXRhLmdlb21ldHJ5KSwgZ2V0TWF0ZXJpYWwoZGF0YS5tYXRlcmlhbCkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUG9pbnRDbG91ZCI6CiAgICAgICAgY2FzZSAiUG9pbnRzIjoKICAgICAgICAgIG9iamVjdCA9IG5ldyBQb2ludHMoZ2V0R2VvbWV0cnkoZGF0YS5nZW9tZXRyeSksIGdldE1hdGVyaWFsKGRhdGEubWF0ZXJpYWwpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlNwcml0ZSI6CiAgICAgICAgICBvYmplY3QgPSBuZXcgU3ByaXRlKGdldE1hdGVyaWFsKGRhdGEubWF0ZXJpYWwpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkdyb3VwIjoKICAgICAgICAgIG9iamVjdCA9IG5ldyBHcm91cDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkJvbmUiOgogICAgICAgICAgb2JqZWN0ID0gbmV3IEJvbmU7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgb2JqZWN0ID0gbmV3IE9iamVjdDNEOwogICAgICB9CiAgICAgIG9iamVjdC51dWlkID0gZGF0YS51dWlkOwogICAgICBpZiAoZGF0YS5uYW1lICE9PSB1bmRlZmluZWQpCiAgICAgICAgb2JqZWN0Lm5hbWUgPSBkYXRhLm5hbWU7CiAgICAgIGlmIChkYXRhLm1hdHJpeCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgb2JqZWN0Lm1hdHJpeC5mcm9tQXJyYXkoZGF0YS5tYXRyaXgpOwogICAgICAgIGlmIChkYXRhLm1hdHJpeEF1dG9VcGRhdGUgIT09IHVuZGVmaW5lZCkKICAgICAgICAgIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlID0gZGF0YS5tYXRyaXhBdXRvVXBkYXRlOwogICAgICAgIGlmIChvYmplY3QubWF0cml4QXV0b1VwZGF0ZSkKICAgICAgICAgIG9iamVjdC5tYXRyaXguZGVjb21wb3NlKG9iamVjdC5wb3NpdGlvbiwgb2JqZWN0LnF1YXRlcm5pb24sIG9iamVjdC5zY2FsZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGRhdGEucG9zaXRpb24gIT09IHVuZGVmaW5lZCkKICAgICAgICAgIG9iamVjdC5wb3NpdGlvbi5mcm9tQXJyYXkoZGF0YS5wb3NpdGlvbik7CiAgICAgICAgaWYgKGRhdGEucm90YXRpb24gIT09IHVuZGVmaW5lZCkKICAgICAgICAgIG9iamVjdC5yb3RhdGlvbi5mcm9tQXJyYXkoZGF0YS5yb3RhdGlvbik7CiAgICAgICAgaWYgKGRhdGEucXVhdGVybmlvbiAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgb2JqZWN0LnF1YXRlcm5pb24uZnJvbUFycmF5KGRhdGEucXVhdGVybmlvbik7CiAgICAgICAgaWYgKGRhdGEuc2NhbGUgIT09IHVuZGVmaW5lZCkKICAgICAgICAgIG9iamVjdC5zY2FsZS5mcm9tQXJyYXkoZGF0YS5zY2FsZSk7CiAgICAgIH0KICAgICAgaWYgKGRhdGEudXAgIT09IHVuZGVmaW5lZCkKICAgICAgICBvYmplY3QudXAuZnJvbUFycmF5KGRhdGEudXApOwogICAgICBpZiAoZGF0YS5jYXN0U2hhZG93ICE9PSB1bmRlZmluZWQpCiAgICAgICAgb2JqZWN0LmNhc3RTaGFkb3cgPSBkYXRhLmNhc3RTaGFkb3c7CiAgICAgIGlmIChkYXRhLnJlY2VpdmVTaGFkb3cgIT09IHVuZGVmaW5lZCkKICAgICAgICBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IGRhdGEucmVjZWl2ZVNoYWRvdzsKICAgICAgaWYgKGRhdGEuc2hhZG93KSB7CiAgICAgICAgaWYgKGRhdGEuc2hhZG93LmludGVuc2l0eSAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgb2JqZWN0LnNoYWRvdy5pbnRlbnNpdHkgPSBkYXRhLnNoYWRvdy5pbnRlbnNpdHk7CiAgICAgICAgaWYgKGRhdGEuc2hhZG93LmJpYXMgIT09IHVuZGVmaW5lZCkKICAgICAgICAgIG9iamVjdC5zaGFkb3cuYmlhcyA9IGRhdGEuc2hhZG93LmJpYXM7CiAgICAgICAgaWYgKGRhdGEuc2hhZG93Lm5vcm1hbEJpYXMgIT09IHVuZGVmaW5lZCkKICAgICAgICAgIG9iamVjdC5zaGFkb3cubm9ybWFsQmlhcyA9IGRhdGEuc2hhZG93Lm5vcm1hbEJpYXM7CiAgICAgICAgaWYgKGRhdGEuc2hhZG93LnJhZGl1cyAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgb2JqZWN0LnNoYWRvdy5yYWRpdXMgPSBkYXRhLnNoYWRvdy5yYWRpdXM7CiAgICAgICAgaWYgKGRhdGEuc2hhZG93Lm1hcFNpemUgIT09IHVuZGVmaW5lZCkKICAgICAgICAgIG9iamVjdC5zaGFkb3cubWFwU2l6ZS5mcm9tQXJyYXkoZGF0YS5zaGFkb3cubWFwU2l6ZSk7CiAgICAgICAgaWYgKGRhdGEuc2hhZG93LmNhbWVyYSAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgb2JqZWN0LnNoYWRvdy5jYW1lcmEgPSB0aGlzLnBhcnNlT2JqZWN0KGRhdGEuc2hhZG93LmNhbWVyYSk7CiAgICAgIH0KICAgICAgaWYgKGRhdGEudmlzaWJsZSAhPT0gdW5kZWZpbmVkKQogICAgICAgIG9iamVjdC52aXNpYmxlID0gZGF0YS52aXNpYmxlOwogICAgICBpZiAoZGF0YS5mcnVzdHVtQ3VsbGVkICE9PSB1bmRlZmluZWQpCiAgICAgICAgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBkYXRhLmZydXN0dW1DdWxsZWQ7CiAgICAgIGlmIChkYXRhLnJlbmRlck9yZGVyICE9PSB1bmRlZmluZWQpCiAgICAgICAgb2JqZWN0LnJlbmRlck9yZGVyID0gZGF0YS5yZW5kZXJPcmRlcjsKICAgICAgaWYgKGRhdGEudXNlckRhdGEgIT09IHVuZGVmaW5lZCkKICAgICAgICBvYmplY3QudXNlckRhdGEgPSBkYXRhLnVzZXJEYXRhOwogICAgICBpZiAoZGF0YS5sYXllcnMgIT09IHVuZGVmaW5lZCkKICAgICAgICBvYmplY3QubGF5ZXJzLm1hc2sgPSBkYXRhLmxheWVyczsKICAgICAgaWYgKGRhdGEuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZGF0YS5jaGlsZHJlbjsKICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIG9iamVjdC5hZGQodGhpcy5wYXJzZU9iamVjdChjaGlsZHJlbltpXSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzLCB0ZXh0dXJlcywgYW5pbWF0aW9ucykpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGF0YS5hbmltYXRpb25zICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBjb25zdCBvYmplY3RBbmltYXRpb25zID0gZGF0YS5hbmltYXRpb25zOwogICAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBvYmplY3RBbmltYXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBjb25zdCB1dWlkID0gb2JqZWN0QW5pbWF0aW9uc1tpXTsKICAgICAgICAgIG9iamVjdC5hbmltYXRpb25zLnB1c2goYW5pbWF0aW9uc1t1dWlkXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChkYXRhLnR5cGUgPT09ICJMT0QiKSB7CiAgICAgICAgaWYgKGRhdGEuYXV0b1VwZGF0ZSAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgb2JqZWN0LmF1dG9VcGRhdGUgPSBkYXRhLmF1dG9VcGRhdGU7CiAgICAgICAgY29uc3QgbGV2ZWxzID0gZGF0YS5sZXZlbHM7CiAgICAgICAgZm9yIChsZXQgbCA9IDA7bCA8IGxldmVscy5sZW5ndGg7IGwrKykgewogICAgICAgICAgY29uc3QgbGV2ZWwgPSBsZXZlbHNbbF07CiAgICAgICAgICBjb25zdCBjaGlsZCA9IG9iamVjdC5nZXRPYmplY3RCeVByb3BlcnR5KCJ1dWlkIiwgbGV2ZWwub2JqZWN0KTsKICAgICAgICAgIGlmIChjaGlsZCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG9iamVjdC5hZGRMZXZlbChjaGlsZCwgbGV2ZWwuZGlzdGFuY2UsIGxldmVsLmh5c3RlcmVzaXMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb2JqZWN0OwogICAgfQogICAgYmluZFNrZWxldG9ucyhvYmplY3QsIHNrZWxldG9ucykgewogICAgICBpZiAoT2JqZWN0LmtleXMoc2tlbGV0b25zKS5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuOwogICAgICBvYmplY3QudHJhdmVyc2UoZnVuY3Rpb24oY2hpbGQpIHsKICAgICAgICBpZiAoY2hpbGQuaXNTa2lubmVkTWVzaCA9PT0gdHJ1ZSAmJiBjaGlsZC5za2VsZXRvbiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBjb25zdCBza2VsZXRvbiA9IHNrZWxldG9uc1tjaGlsZC5za2VsZXRvbl07CiAgICAgICAgICBpZiAoc2tlbGV0b24gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogTm8gc2tlbGV0b24gZm91bmQgd2l0aCBVVUlEOiIsIGNoaWxkLnNrZWxldG9uKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoaWxkLmJpbmQoc2tlbGV0b24sIGNoaWxkLmJpbmRNYXRyaXgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICBiaW5kTGlnaHRUYXJnZXRzKG9iamVjdCkgewogICAgICBvYmplY3QudHJhdmVyc2UoZnVuY3Rpb24oY2hpbGQpIHsKICAgICAgICBpZiAoY2hpbGQuaXNEaXJlY3Rpb25hbExpZ2h0IHx8IGNoaWxkLmlzU3BvdExpZ2h0KSB7CiAgICAgICAgICBjb25zdCB1dWlkID0gY2hpbGQudGFyZ2V0OwogICAgICAgICAgY29uc3QgdGFyZ2V0ID0gb2JqZWN0LmdldE9iamVjdEJ5UHJvcGVydHkoInV1aWQiLCB1dWlkKTsKICAgICAgICAgIGlmICh0YXJnZXQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBjaGlsZC50YXJnZXQgPSB0YXJnZXQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjaGlsZC50YXJnZXQgPSBuZXcgT2JqZWN0M0Q7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9OwogIFRFWFRVUkVfTUFQUElORyA9IHsKICAgIFVWTWFwcGluZywKICAgIEN1YmVSZWZsZWN0aW9uTWFwcGluZywKICAgIEN1YmVSZWZyYWN0aW9uTWFwcGluZywKICAgIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLAogICAgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcsCiAgICBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZwogIH07CiAgVEVYVFVSRV9XUkFQUElORyA9IHsKICAgIFJlcGVhdFdyYXBwaW5nLAogICAgQ2xhbXBUb0VkZ2VXcmFwcGluZywKICAgIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcKICB9OwogIFRFWFRVUkVfRklMVEVSID0gewogICAgTmVhcmVzdEZpbHRlciwKICAgIE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyLAogICAgTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciwKICAgIExpbmVhckZpbHRlciwKICAgIExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIsCiAgICBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIKICB9OwogIEltYWdlQml0bWFwTG9hZGVyID0gY2xhc3MgSW1hZ2VCaXRtYXBMb2FkZXIgZXh0ZW5kcyBMb2FkZXIgewogICAgY29uc3RydWN0b3IobWFuYWdlcikgewogICAgICBzdXBlcihtYW5hZ2VyKTsKICAgICAgdGhpcy5pc0ltYWdlQml0bWFwTG9hZGVyID0gdHJ1ZTsKICAgICAgaWYgKHR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBjcmVhdGVJbWFnZUJpdG1hcCgpIG5vdCBzdXBwb3J0ZWQuIik7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBmZXRjaCA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBmZXRjaCgpIG5vdCBzdXBwb3J0ZWQuIik7CiAgICAgIH0KICAgICAgdGhpcy5vcHRpb25zID0geyBwcmVtdWx0aXBseUFscGhhOiAibm9uZSIgfTsKICAgIH0KICAgIHNldE9wdGlvbnMob3B0aW9ucykgewogICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGxvYWQodXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IpIHsKICAgICAgaWYgKHVybCA9PT0gdW5kZWZpbmVkKQogICAgICAgIHVybCA9ICIiOwogICAgICBpZiAodGhpcy5wYXRoICE9PSB1bmRlZmluZWQpCiAgICAgICAgdXJsID0gdGhpcy5wYXRoICsgdXJsOwogICAgICB1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCh1cmwpOwogICAgICBjb25zdCBzY29wZSA9IHRoaXM7CiAgICAgIGNvbnN0IGNhY2hlZCA9IENhY2hlLmdldCh1cmwpOwogICAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCh1cmwpOwogICAgICAgIGlmIChjYWNoZWQudGhlbikgewogICAgICAgICAgY2FjaGVkLnRoZW4oKGltYWdlQml0bWFwKSA9PiB7CiAgICAgICAgICAgIGlmIChvbkxvYWQpCiAgICAgICAgICAgICAgb25Mb2FkKGltYWdlQml0bWFwKTsKICAgICAgICAgICAgc2NvcGUubWFuYWdlci5pdGVtRW5kKHVybCk7CiAgICAgICAgICB9KS5jYXRjaCgoZSkgPT4gewogICAgICAgICAgICBpZiAob25FcnJvcikKICAgICAgICAgICAgICBvbkVycm9yKGUpOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAob25Mb2FkKQogICAgICAgICAgICBvbkxvYWQoY2FjaGVkKTsKICAgICAgICAgIHNjb3BlLm1hbmFnZXIuaXRlbUVuZCh1cmwpOwogICAgICAgIH0sIDApOwogICAgICAgIHJldHVybiBjYWNoZWQ7CiAgICAgIH0KICAgICAgY29uc3QgZmV0Y2hPcHRpb25zID0ge307CiAgICAgIGZldGNoT3B0aW9ucy5jcmVkZW50aWFscyA9IHRoaXMuY3Jvc3NPcmlnaW4gPT09ICJhbm9ueW1vdXMiID8gInNhbWUtb3JpZ2luIiA6ICJpbmNsdWRlIjsKICAgICAgZmV0Y2hPcHRpb25zLmhlYWRlcnMgPSB0aGlzLnJlcXVlc3RIZWFkZXI7CiAgICAgIGNvbnN0IHByb21pc2UgPSBmZXRjaCh1cmwsIGZldGNoT3B0aW9ucykudGhlbihmdW5jdGlvbihyZXMpIHsKICAgICAgICByZXR1cm4gcmVzLmJsb2IoKTsKICAgICAgfSkudGhlbihmdW5jdGlvbihibG9iKSB7CiAgICAgICAgcmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKGJsb2IsIE9iamVjdC5hc3NpZ24oc2NvcGUub3B0aW9ucywgeyBjb2xvclNwYWNlQ29udmVyc2lvbjogIm5vbmUiIH0pKTsKICAgICAgfSkudGhlbihmdW5jdGlvbihpbWFnZUJpdG1hcCkgewogICAgICAgIENhY2hlLmFkZCh1cmwsIGltYWdlQml0bWFwKTsKICAgICAgICBpZiAob25Mb2FkKQogICAgICAgICAgb25Mb2FkKGltYWdlQml0bWFwKTsKICAgICAgICBzY29wZS5tYW5hZ2VyLml0ZW1FbmQodXJsKTsKICAgICAgICByZXR1cm4gaW1hZ2VCaXRtYXA7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGUpIHsKICAgICAgICBpZiAob25FcnJvcikKICAgICAgICAgIG9uRXJyb3IoZSk7CiAgICAgICAgQ2FjaGUucmVtb3ZlKHVybCk7CiAgICAgICAgc2NvcGUubWFuYWdlci5pdGVtRXJyb3IodXJsKTsKICAgICAgICBzY29wZS5tYW5hZ2VyLml0ZW1FbmQodXJsKTsKICAgICAgfSk7CiAgICAgIENhY2hlLmFkZCh1cmwsIHByb21pc2UpOwogICAgICBzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCh1cmwpOwogICAgfQogIH07CiAgQXVkaW9Mb2FkZXIgPSBjbGFzcyBBdWRpb0xvYWRlciBleHRlbmRzIExvYWRlciB7CiAgICBjb25zdHJ1Y3RvcihtYW5hZ2VyKSB7CiAgICAgIHN1cGVyKG1hbmFnZXIpOwogICAgfQogICAgbG9hZCh1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvcikgewogICAgICBjb25zdCBzY29wZSA9IHRoaXM7CiAgICAgIGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKHRoaXMubWFuYWdlcik7CiAgICAgIGxvYWRlci5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7CiAgICAgIGxvYWRlci5zZXRQYXRoKHRoaXMucGF0aCk7CiAgICAgIGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlcik7CiAgICAgIGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHModGhpcy53aXRoQ3JlZGVudGlhbHMpOwogICAgICBsb2FkZXIubG9hZCh1cmwsIGZ1bmN0aW9uKGJ1ZmZlcikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBidWZmZXJDb3B5ID0gYnVmZmVyLnNsaWNlKDApOwogICAgICAgICAgY29uc3QgY29udGV4dCA9IEF1ZGlvQ29udGV4dC5nZXRDb250ZXh0KCk7CiAgICAgICAgICBjb250ZXh0LmRlY29kZUF1ZGlvRGF0YShidWZmZXJDb3B5LCBmdW5jdGlvbihhdWRpb0J1ZmZlcikgewogICAgICAgICAgICBvbkxvYWQoYXVkaW9CdWZmZXIpOwogICAgICAgICAgfSkuY2F0Y2goaGFuZGxlRXJyb3IpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGhhbmRsZUVycm9yKGUpOwogICAgICAgIH0KICAgICAgfSwgb25Qcm9ncmVzcywgb25FcnJvcik7CiAgICAgIGZ1bmN0aW9uIGhhbmRsZUVycm9yKGUpIHsKICAgICAgICBpZiAob25FcnJvcikgewogICAgICAgICAgb25FcnJvcihlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICB9CiAgICAgICAgc2NvcGUubWFuYWdlci5pdGVtRXJyb3IodXJsKTsKICAgICAgfQogICAgfQogIH07CiAgX2V5ZVJpZ2h0ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXg0OwogIF9leWVMZWZ0ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXg0OwogIF9wcm9qZWN0aW9uTWF0cml4ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXg0OwogIEFycmF5Q2FtZXJhID0gY2xhc3MgQXJyYXlDYW1lcmEgZXh0ZW5kcyBQZXJzcGVjdGl2ZUNhbWVyYSB7CiAgICBjb25zdHJ1Y3RvcihhcnJheSA9IFtdKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNBcnJheUNhbWVyYSA9IHRydWU7CiAgICAgIHRoaXMuY2FtZXJhcyA9IGFycmF5OwogICAgICB0aGlzLmluZGV4ID0gMDsKICAgIH0KICB9OwogIF9wb3NpdGlvbiQxID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9xdWF0ZXJuaW9uJDEgPSAvKiBAX19QVVJFX18gKi8gbmV3IFF1YXRlcm5pb247CiAgX3NjYWxlJDEgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX29yaWVudGF0aW9uJDEgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgQXVkaW9MaXN0ZW5lciA9IGNsYXNzIEF1ZGlvTGlzdGVuZXIgZXh0ZW5kcyBPYmplY3QzRCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy50eXBlID0gIkF1ZGlvTGlzdGVuZXIiOwogICAgICB0aGlzLmNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29udGV4dCgpOwogICAgICB0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpOwogICAgICB0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pOwogICAgICB0aGlzLmZpbHRlciA9IG51bGw7CiAgICAgIHRoaXMudGltZURlbHRhID0gMDsKICAgICAgdGhpcy5fY2xvY2sgPSBuZXcgQ2xvY2s7CiAgICB9CiAgICBnZXRJbnB1dCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZ2FpbjsKICAgIH0KICAgIHJlbW92ZUZpbHRlcigpIHsKICAgICAgaWYgKHRoaXMuZmlsdGVyICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXIpOwogICAgICAgIHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTsKICAgICAgICB0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMuZmlsdGVyID0gbnVsbDsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldEZpbHRlcigpIHsKICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyOwogICAgfQogICAgc2V0RmlsdGVyKHZhbHVlKSB7CiAgICAgIGlmICh0aGlzLmZpbHRlciAhPT0gbnVsbCkgewogICAgICAgIHRoaXMuZ2Fpbi5kaXNjb25uZWN0KHRoaXMuZmlsdGVyKTsKICAgICAgICB0aGlzLmZpbHRlci5kaXNjb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTsKICAgICAgfQogICAgICB0aGlzLmZpbHRlciA9IHZhbHVlOwogICAgICB0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmZpbHRlcik7CiAgICAgIHRoaXMuZmlsdGVyLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBnZXRNYXN0ZXJWb2x1bWUoKSB7CiAgICAgIHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTsKICAgIH0KICAgIHNldE1hc3RlclZvbHVtZSh2YWx1ZSkgewogICAgICB0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUodmFsdWUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgdXBkYXRlTWF0cml4V29ybGQoZm9yY2UpIHsKICAgICAgc3VwZXIudXBkYXRlTWF0cml4V29ybGQoZm9yY2UpOwogICAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMuY29udGV4dC5saXN0ZW5lcjsKICAgICAgY29uc3QgdXAgPSB0aGlzLnVwOwogICAgICB0aGlzLnRpbWVEZWx0YSA9IHRoaXMuX2Nsb2NrLmdldERlbHRhKCk7CiAgICAgIHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKF9wb3NpdGlvbiQxLCBfcXVhdGVybmlvbiQxLCBfc2NhbGUkMSk7CiAgICAgIF9vcmllbnRhdGlvbiQxLnNldCgwLCAwLCAtMSkuYXBwbHlRdWF0ZXJuaW9uKF9xdWF0ZXJuaW9uJDEpOwogICAgICBpZiAobGlzdGVuZXIucG9zaXRpb25YKSB7CiAgICAgICAgY29uc3QgZW5kVGltZSA9IHRoaXMuY29udGV4dC5jdXJyZW50VGltZSArIHRoaXMudGltZURlbHRhOwogICAgICAgIGxpc3RlbmVyLnBvc2l0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShfcG9zaXRpb24kMS54LCBlbmRUaW1lKTsKICAgICAgICBsaXN0ZW5lci5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoX3Bvc2l0aW9uJDEueSwgZW5kVGltZSk7CiAgICAgICAgbGlzdGVuZXIucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKF9wb3NpdGlvbiQxLnosIGVuZFRpbWUpOwogICAgICAgIGxpc3RlbmVyLmZvcndhcmRYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKF9vcmllbnRhdGlvbiQxLngsIGVuZFRpbWUpOwogICAgICAgIGxpc3RlbmVyLmZvcndhcmRZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKF9vcmllbnRhdGlvbiQxLnksIGVuZFRpbWUpOwogICAgICAgIGxpc3RlbmVyLmZvcndhcmRaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKF9vcmllbnRhdGlvbiQxLnosIGVuZFRpbWUpOwogICAgICAgIGxpc3RlbmVyLnVwWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSh1cC54LCBlbmRUaW1lKTsKICAgICAgICBsaXN0ZW5lci51cFkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUodXAueSwgZW5kVGltZSk7CiAgICAgICAgbGlzdGVuZXIudXBaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKHVwLnosIGVuZFRpbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGxpc3RlbmVyLnNldFBvc2l0aW9uKF9wb3NpdGlvbiQxLngsIF9wb3NpdGlvbiQxLnksIF9wb3NpdGlvbiQxLnopOwogICAgICAgIGxpc3RlbmVyLnNldE9yaWVudGF0aW9uKF9vcmllbnRhdGlvbiQxLngsIF9vcmllbnRhdGlvbiQxLnksIF9vcmllbnRhdGlvbiQxLnosIHVwLngsIHVwLnksIHVwLnopOwogICAgICB9CiAgICB9CiAgfTsKICBBdWRpbyA9IGNsYXNzIEF1ZGlvIGV4dGVuZHMgT2JqZWN0M0QgewogICAgY29uc3RydWN0b3IobGlzdGVuZXIpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy50eXBlID0gIkF1ZGlvIjsKICAgICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwogICAgICB0aGlzLmNvbnRleHQgPSBsaXN0ZW5lci5jb250ZXh0OwogICAgICB0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpOwogICAgICB0aGlzLmdhaW4uY29ubmVjdChsaXN0ZW5lci5nZXRJbnB1dCgpKTsKICAgICAgdGhpcy5hdXRvcGxheSA9IGZhbHNlOwogICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7CiAgICAgIHRoaXMuZGV0dW5lID0gMDsKICAgICAgdGhpcy5sb29wID0gZmFsc2U7CiAgICAgIHRoaXMubG9vcFN0YXJ0ID0gMDsKICAgICAgdGhpcy5sb29wRW5kID0gMDsKICAgICAgdGhpcy5vZmZzZXQgPSAwOwogICAgICB0aGlzLmR1cmF0aW9uID0gdW5kZWZpbmVkOwogICAgICB0aGlzLnBsYXliYWNrUmF0ZSA9IDE7CiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7CiAgICAgIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gdHJ1ZTsKICAgICAgdGhpcy5zb3VyY2UgPSBudWxsOwogICAgICB0aGlzLnNvdXJjZVR5cGUgPSAiZW1wdHkiOwogICAgICB0aGlzLl9zdGFydGVkQXQgPSAwOwogICAgICB0aGlzLl9wcm9ncmVzcyA9IDA7CiAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IGZhbHNlOwogICAgICB0aGlzLmZpbHRlcnMgPSBbXTsKICAgIH0KICAgIGdldE91dHB1dCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZ2FpbjsKICAgIH0KICAgIHNldE5vZGVTb3VyY2UoYXVkaW9Ob2RlKSB7CiAgICAgIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gZmFsc2U7CiAgICAgIHRoaXMuc291cmNlVHlwZSA9ICJhdWRpb05vZGUiOwogICAgICB0aGlzLnNvdXJjZSA9IGF1ZGlvTm9kZTsKICAgICAgdGhpcy5jb25uZWN0KCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0TWVkaWFFbGVtZW50U291cmNlKG1lZGlhRWxlbWVudCkgewogICAgICB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IGZhbHNlOwogICAgICB0aGlzLnNvdXJjZVR5cGUgPSAibWVkaWFOb2RlIjsKICAgICAgdGhpcy5zb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKG1lZGlhRWxlbWVudCk7CiAgICAgIHRoaXMuY29ubmVjdCgpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldE1lZGlhU3RyZWFtU291cmNlKG1lZGlhU3RyZWFtKSB7CiAgICAgIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gZmFsc2U7CiAgICAgIHRoaXMuc291cmNlVHlwZSA9ICJtZWRpYVN0cmVhbU5vZGUiOwogICAgICB0aGlzLnNvdXJjZSA9IHRoaXMuY29udGV4dC5jcmVhdGVNZWRpYVN0cmVhbVNvdXJjZShtZWRpYVN0cmVhbSk7CiAgICAgIHRoaXMuY29ubmVjdCgpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldEJ1ZmZlcihhdWRpb0J1ZmZlcikgewogICAgICB0aGlzLmJ1ZmZlciA9IGF1ZGlvQnVmZmVyOwogICAgICB0aGlzLnNvdXJjZVR5cGUgPSAiYnVmZmVyIjsKICAgICAgaWYgKHRoaXMuYXV0b3BsYXkpCiAgICAgICAgdGhpcy5wbGF5KCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgcGxheShkZWxheSA9IDApIHsKICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nID09PSB0cnVlKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLiIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAodGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5fc3RhcnRlZEF0ID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICsgZGVsYXk7CiAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTsKICAgICAgc291cmNlLmJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgICBzb3VyY2UubG9vcCA9IHRoaXMubG9vcDsKICAgICAgc291cmNlLmxvb3BTdGFydCA9IHRoaXMubG9vcFN0YXJ0OwogICAgICBzb3VyY2UubG9vcEVuZCA9IHRoaXMubG9vcEVuZDsKICAgICAgc291cmNlLm9uZW5kZWQgPSB0aGlzLm9uRW5kZWQuYmluZCh0aGlzKTsKICAgICAgc291cmNlLnN0YXJ0KHRoaXMuX3N0YXJ0ZWRBdCwgdGhpcy5fcHJvZ3Jlc3MgKyB0aGlzLm9mZnNldCwgdGhpcy5kdXJhdGlvbik7CiAgICAgIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTsKICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CiAgICAgIHRoaXMuc2V0RGV0dW5lKHRoaXMuZGV0dW5lKTsKICAgICAgdGhpcy5zZXRQbGF5YmFja1JhdGUodGhpcy5wbGF5YmFja1JhdGUpOwogICAgICByZXR1cm4gdGhpcy5jb25uZWN0KCk7CiAgICB9CiAgICBwYXVzZSgpIHsKICAgICAgaWYgKHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSkgewogICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSkgewogICAgICAgIHRoaXMuX3Byb2dyZXNzICs9IE1hdGgubWF4KHRoaXMuY29udGV4dC5jdXJyZW50VGltZSAtIHRoaXMuX3N0YXJ0ZWRBdCwgMCkgKiB0aGlzLnBsYXliYWNrUmF0ZTsKICAgICAgICBpZiAodGhpcy5sb29wID09PSB0cnVlKSB7CiAgICAgICAgICB0aGlzLl9wcm9ncmVzcyA9IHRoaXMuX3Byb2dyZXNzICUgKHRoaXMuZHVyYXRpb24gfHwgdGhpcy5idWZmZXIuZHVyYXRpb24pOwogICAgICAgIH0KICAgICAgICB0aGlzLnNvdXJjZS5zdG9wKCk7CiAgICAgICAgdGhpcy5zb3VyY2Uub25lbmRlZCA9IG51bGw7CiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHN0b3AoZGVsYXkgPSAwKSB7CiAgICAgIGlmICh0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLl9wcm9ncmVzcyA9IDA7CiAgICAgIGlmICh0aGlzLnNvdXJjZSAhPT0gbnVsbCkgewogICAgICAgIHRoaXMuc291cmNlLnN0b3AodGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICsgZGVsYXkpOwogICAgICAgIHRoaXMuc291cmNlLm9uZW5kZWQgPSBudWxsOwogICAgICB9CiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgY29ubmVjdCgpIHsKICAgICAgaWYgKHRoaXMuZmlsdGVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pOwogICAgICAgIGZvciAobGV0IGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICB0aGlzLmZpbHRlcnNbaSAtIDFdLmNvbm5lY3QodGhpcy5maWx0ZXJzW2ldKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGggLSAxXS5jb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc291cmNlLmNvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBkaXNjb25uZWN0KCkgewogICAgICBpZiAodGhpcy5fY29ubmVjdGVkID09PSBmYWxzZSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAodGhpcy5maWx0ZXJzLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzLnNvdXJjZS5kaXNjb25uZWN0KHRoaXMuZmlsdGVyc1swXSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDEsIGwgPSB0aGlzLmZpbHRlcnMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICAgIHRoaXMuZmlsdGVyc1tpIC0gMV0uZGlzY29ubmVjdCh0aGlzLmZpbHRlcnNbaV0pOwogICAgICAgIH0KICAgICAgICB0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aCAtIDFdLmRpc2Nvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTsKICAgICAgfQogICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBnZXRGaWx0ZXJzKCkgewogICAgICByZXR1cm4gdGhpcy5maWx0ZXJzOwogICAgfQogICAgc2V0RmlsdGVycyh2YWx1ZSkgewogICAgICBpZiAoIXZhbHVlKQogICAgICAgIHZhbHVlID0gW107CiAgICAgIGlmICh0aGlzLl9jb25uZWN0ZWQgPT09IHRydWUpIHsKICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTsKICAgICAgICB0aGlzLmZpbHRlcnMgPSB2YWx1ZS5zbGljZSgpOwogICAgICAgIHRoaXMuY29ubmVjdCgpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuZmlsdGVycyA9IHZhbHVlLnNsaWNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXREZXR1bmUodmFsdWUpIHsKICAgICAgdGhpcy5kZXR1bmUgPSB2YWx1ZTsKICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICYmIHRoaXMuc291cmNlLmRldHVuZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSh0aGlzLmRldHVuZSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLCAwLjAxKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldERldHVuZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuZGV0dW5lOwogICAgfQogICAgZ2V0RmlsdGVyKCkgewogICAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJzKClbMF07CiAgICB9CiAgICBzZXRGaWx0ZXIoZmlsdGVyKSB7CiAgICAgIHJldHVybiB0aGlzLnNldEZpbHRlcnMoZmlsdGVyID8gW2ZpbHRlcl0gOiBbXSk7CiAgICB9CiAgICBzZXRQbGF5YmFja1JhdGUodmFsdWUpIHsKICAgICAgaWYgKHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSkgewogICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMucGxheWJhY2tSYXRlID0gdmFsdWU7CiAgICAgIGlmICh0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSkgewogICAgICAgIHRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRUYXJnZXRBdFRpbWUodGhpcy5wbGF5YmFja1JhdGUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBnZXRQbGF5YmFja1JhdGUoKSB7CiAgICAgIHJldHVybiB0aGlzLnBsYXliYWNrUmF0ZTsKICAgIH0KICAgIG9uRW5kZWQoKSB7CiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7CiAgICAgIHRoaXMuX3Byb2dyZXNzID0gMDsKICAgIH0KICAgIGdldExvb3AoKSB7CiAgICAgIGlmICh0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5sb29wOwogICAgfQogICAgc2V0TG9vcCh2YWx1ZSkgewogICAgICBpZiAodGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5sb29wID0gdmFsdWU7CiAgICAgIGlmICh0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSkgewogICAgICAgIHRoaXMuc291cmNlLmxvb3AgPSB0aGlzLmxvb3A7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRMb29wU3RhcnQodmFsdWUpIHsKICAgICAgdGhpcy5sb29wU3RhcnQgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBzZXRMb29wRW5kKHZhbHVlKSB7CiAgICAgIHRoaXMubG9vcEVuZCA9IHZhbHVlOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldFZvbHVtZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlOwogICAgfQogICAgc2V0Vm9sdW1lKHZhbHVlKSB7CiAgICAgIHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSh2YWx1ZSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLCAwLjAxKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjb3B5KHNvdXJjZSwgcmVjdXJzaXZlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlLCByZWN1cnNpdmUpOwogICAgICBpZiAoc291cmNlLnNvdXJjZVR5cGUgIT09ICJidWZmZXIiKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogQXVkaW8gc291cmNlIHR5cGUgY2Fubm90IGJlIGNvcGllZC4iKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgICB0aGlzLmF1dG9wbGF5ID0gc291cmNlLmF1dG9wbGF5OwogICAgICB0aGlzLmJ1ZmZlciA9IHNvdXJjZS5idWZmZXI7CiAgICAgIHRoaXMuZGV0dW5lID0gc291cmNlLmRldHVuZTsKICAgICAgdGhpcy5sb29wID0gc291cmNlLmxvb3A7CiAgICAgIHRoaXMubG9vcFN0YXJ0ID0gc291cmNlLmxvb3BTdGFydDsKICAgICAgdGhpcy5sb29wRW5kID0gc291cmNlLmxvb3BFbmQ7CiAgICAgIHRoaXMub2Zmc2V0ID0gc291cmNlLm9mZnNldDsKICAgICAgdGhpcy5kdXJhdGlvbiA9IHNvdXJjZS5kdXJhdGlvbjsKICAgICAgdGhpcy5wbGF5YmFja1JhdGUgPSBzb3VyY2UucGxheWJhY2tSYXRlOwogICAgICB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IHNvdXJjZS5oYXNQbGF5YmFja0NvbnRyb2w7CiAgICAgIHRoaXMuc291cmNlVHlwZSA9IHNvdXJjZS5zb3VyY2VUeXBlOwogICAgICB0aGlzLmZpbHRlcnMgPSBzb3VyY2UuZmlsdGVycy5zbGljZSgpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGNsb25lKHJlY3Vyc2l2ZSkgewogICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5saXN0ZW5lcikuY29weSh0aGlzLCByZWN1cnNpdmUpOwogICAgfQogIH07CiAgX3Bvc2l0aW9uID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9xdWF0ZXJuaW9uID0gLyogQF9fUFVSRV9fICovIG5ldyBRdWF0ZXJuaW9uOwogIF9zY2FsZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBfb3JpZW50YXRpb24gPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgUG9zaXRpb25hbEF1ZGlvID0gY2xhc3MgUG9zaXRpb25hbEF1ZGlvIGV4dGVuZHMgQXVkaW8gewogICAgY29uc3RydWN0b3IobGlzdGVuZXIpIHsKICAgICAgc3VwZXIobGlzdGVuZXIpOwogICAgICB0aGlzLnBhbm5lciA9IHRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTsKICAgICAgdGhpcy5wYW5uZXIucGFubmluZ01vZGVsID0gIkhSVEYiOwogICAgICB0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbik7CiAgICB9CiAgICBjb25uZWN0KCkgewogICAgICBzdXBlci5jb25uZWN0KCk7CiAgICAgIHRoaXMucGFubmVyLmNvbm5lY3QodGhpcy5nYWluKTsKICAgIH0KICAgIGRpc2Nvbm5lY3QoKSB7CiAgICAgIHN1cGVyLmRpc2Nvbm5lY3QoKTsKICAgICAgdGhpcy5wYW5uZXIuZGlzY29ubmVjdCh0aGlzLmdhaW4pOwogICAgfQogICAgZ2V0T3V0cHV0KCkgewogICAgICByZXR1cm4gdGhpcy5wYW5uZXI7CiAgICB9CiAgICBnZXRSZWZEaXN0YW5jZSgpIHsKICAgICAgcmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlOwogICAgfQogICAgc2V0UmVmRGlzdGFuY2UodmFsdWUpIHsKICAgICAgdGhpcy5wYW5uZXIucmVmRGlzdGFuY2UgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBnZXRSb2xsb2ZmRmFjdG9yKCkgewogICAgICByZXR1cm4gdGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvcjsKICAgIH0KICAgIHNldFJvbGxvZmZGYWN0b3IodmFsdWUpIHsKICAgICAgdGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvciA9IHZhbHVlOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGdldERpc3RhbmNlTW9kZWwoKSB7CiAgICAgIHJldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsOwogICAgfQogICAgc2V0RGlzdGFuY2VNb2RlbCh2YWx1ZSkgewogICAgICB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsID0gdmFsdWU7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZ2V0TWF4RGlzdGFuY2UoKSB7CiAgICAgIHJldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZTsKICAgIH0KICAgIHNldE1heERpc3RhbmNlKHZhbHVlKSB7CiAgICAgIHRoaXMucGFubmVyLm1heERpc3RhbmNlID0gdmFsdWU7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0RGlyZWN0aW9uYWxDb25lKGNvbmVJbm5lckFuZ2xlLCBjb25lT3V0ZXJBbmdsZSwgY29uZU91dGVyR2FpbikgewogICAgICB0aGlzLnBhbm5lci5jb25lSW5uZXJBbmdsZSA9IGNvbmVJbm5lckFuZ2xlOwogICAgICB0aGlzLnBhbm5lci5jb25lT3V0ZXJBbmdsZSA9IGNvbmVPdXRlckFuZ2xlOwogICAgICB0aGlzLnBhbm5lci5jb25lT3V0ZXJHYWluID0gY29uZU91dGVyR2FpbjsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICB1cGRhdGVNYXRyaXhXb3JsZChmb3JjZSkgewogICAgICBzdXBlci51cGRhdGVNYXRyaXhXb3JsZChmb3JjZSk7CiAgICAgIGlmICh0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gdHJ1ZSAmJiB0aGlzLmlzUGxheWluZyA9PT0gZmFsc2UpCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShfcG9zaXRpb24sIF9xdWF0ZXJuaW9uLCBfc2NhbGUpOwogICAgICBfb3JpZW50YXRpb24uc2V0KDAsIDAsIDEpLmFwcGx5UXVhdGVybmlvbihfcXVhdGVybmlvbik7CiAgICAgIGNvbnN0IHBhbm5lciA9IHRoaXMucGFubmVyOwogICAgICBpZiAocGFubmVyLnBvc2l0aW9uWCkgewogICAgICAgIGNvbnN0IGVuZFRpbWUgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKyB0aGlzLmxpc3RlbmVyLnRpbWVEZWx0YTsKICAgICAgICBwYW5uZXIucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKF9wb3NpdGlvbi54LCBlbmRUaW1lKTsKICAgICAgICBwYW5uZXIucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKF9wb3NpdGlvbi55LCBlbmRUaW1lKTsKICAgICAgICBwYW5uZXIucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKF9wb3NpdGlvbi56LCBlbmRUaW1lKTsKICAgICAgICBwYW5uZXIub3JpZW50YXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKF9vcmllbnRhdGlvbi54LCBlbmRUaW1lKTsKICAgICAgICBwYW5uZXIub3JpZW50YXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKF9vcmllbnRhdGlvbi55LCBlbmRUaW1lKTsKICAgICAgICBwYW5uZXIub3JpZW50YXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKF9vcmllbnRhdGlvbi56LCBlbmRUaW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYW5uZXIuc2V0UG9zaXRpb24oX3Bvc2l0aW9uLngsIF9wb3NpdGlvbi55LCBfcG9zaXRpb24ueik7CiAgICAgICAgcGFubmVyLnNldE9yaWVudGF0aW9uKF9vcmllbnRhdGlvbi54LCBfb3JpZW50YXRpb24ueSwgX29yaWVudGF0aW9uLnopOwogICAgICB9CiAgICB9CiAgfTsKICBfcmVzZXJ2ZWRSZSA9IG5ldyBSZWdFeHAoIlsiICsgX1JFU0VSVkVEX0NIQVJTX1JFICsgIl0iLCAiZyIpOwogIF93b3JkQ2hhciA9ICJbXiIgKyBfUkVTRVJWRURfQ0hBUlNfUkUgKyAiXSI7CiAgX3dvcmRDaGFyT3JEb3QgPSAiW14iICsgX1JFU0VSVkVEX0NIQVJTX1JFLnJlcGxhY2UoIlxcLiIsICIiKSArICJdIjsKICBfZGlyZWN0b3J5UmUgPSAvKiBAX19QVVJFX18gKi8gLygoPzpXQytbXC86XSkqKS8uc291cmNlLnJlcGxhY2UoIldDIiwgX3dvcmRDaGFyKTsKICBfbm9kZVJlID0gLyogQF9fUFVSRV9fICovIC8oV0NPRCspPy8uc291cmNlLnJlcGxhY2UoIldDT0QiLCBfd29yZENoYXJPckRvdCk7CiAgX29iamVjdFJlID0gLyogQF9fUFVSRV9fICovIC8oPzpcLihXQyspKD86XFsoLispXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLCBfd29yZENoYXIpOwogIF9wcm9wZXJ0eVJlID0gLyogQF9fUFVSRV9fICovIC9cLihXQyspKD86XFsoLispXF0pPy8uc291cmNlLnJlcGxhY2UoIldDIiwgX3dvcmRDaGFyKTsKICBfdHJhY2tSZSA9IG5ldyBSZWdFeHAoIiIgKyAiXiIgKyBfZGlyZWN0b3J5UmUgKyBfbm9kZVJlICsgX29iamVjdFJlICsgX3Byb3BlcnR5UmUgKyAiJCIpOwogIF9zdXBwb3J0ZWRPYmplY3ROYW1lcyA9IFsibWF0ZXJpYWwiLCAibWF0ZXJpYWxzIiwgImJvbmVzIiwgIm1hcCJdOwogIFByb3BlcnR5QmluZGluZy5Db21wb3NpdGUgPSBDb21wb3NpdGU7CiAgUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5CaW5kaW5nVHlwZSA9IHsKICAgIERpcmVjdDogMCwKICAgIEVudGlyZUFycmF5OiAxLAogICAgQXJyYXlFbGVtZW50OiAyLAogICAgSGFzRnJvbVRvQXJyYXk6IDMKICB9OwogIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuVmVyc2lvbmluZyA9IHsKICAgIE5vbmU6IDAsCiAgICBOZWVkc1VwZGF0ZTogMSwKICAgIE1hdHJpeFdvcmxkTmVlZHNVcGRhdGU6IDIKICB9OwogIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuR2V0dGVyQnlCaW5kaW5nVHlwZSA9IFsKICAgIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX2dldFZhbHVlX2RpcmVjdCwKICAgIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX2dldFZhbHVlX2FycmF5LAogICAgUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fZ2V0VmFsdWVfYXJyYXlFbGVtZW50LAogICAgUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fZ2V0VmFsdWVfdG9BcnJheQogIF07CiAgUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZyA9IFsKICAgIFsKICAgICAgUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0LAogICAgICBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9kaXJlY3Rfc2V0TmVlZHNVcGRhdGUsCiAgICAgIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlCiAgICBdLAogICAgWwogICAgICBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheSwKICAgICAgUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlfc2V0TmVlZHNVcGRhdGUsCiAgICAgIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUKICAgIF0sCiAgICBbCiAgICAgIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5RWxlbWVudCwKICAgICAgUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlLAogICAgICBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZQogICAgXSwKICAgIFsKICAgICAgUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5LAogICAgICBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLl9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUsCiAgICAgIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlCiAgICBdCiAgXTsKICBfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoMSk7CiAgQW5pbWF0aW9uTWl4ZXIgPSBjbGFzcyBBbmltYXRpb25NaXhlciBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7CiAgICBjb25zdHJ1Y3Rvcihyb290KSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuX3Jvb3QgPSByb290OwogICAgICB0aGlzLl9pbml0TWVtb3J5TWFuYWdlcigpOwogICAgICB0aGlzLl9hY2N1SW5kZXggPSAwOwogICAgICB0aGlzLnRpbWUgPSAwOwogICAgICB0aGlzLnRpbWVTY2FsZSA9IDE7CiAgICB9CiAgICBfYmluZEFjdGlvbihhY3Rpb24sIHByb3RvdHlwZUFjdGlvbikgewogICAgICBjb25zdCByb290ID0gYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCwgdHJhY2tzID0gYWN0aW9uLl9jbGlwLnRyYWNrcywgblRyYWNrcyA9IHRyYWNrcy5sZW5ndGgsIGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzLCBpbnRlcnBvbGFudHMgPSBhY3Rpb24uX2ludGVycG9sYW50cywgcm9vdFV1aWQgPSByb290LnV1aWQsIGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lOwogICAgICBsZXQgYmluZGluZ3NCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFtyb290VXVpZF07CiAgICAgIGlmIChiaW5kaW5nc0J5TmFtZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgYmluZGluZ3NCeU5hbWUgPSB7fTsKICAgICAgICBiaW5kaW5nc0J5Um9vdFtyb290VXVpZF0gPSBiaW5kaW5nc0J5TmFtZTsKICAgICAgfQogICAgICBmb3IgKGxldCBpID0gMDtpICE9PSBuVHJhY2tzOyArK2kpIHsKICAgICAgICBjb25zdCB0cmFjayA9IHRyYWNrc1tpXSwgdHJhY2tOYW1lID0gdHJhY2submFtZTsKICAgICAgICBsZXQgYmluZGluZyA9IGJpbmRpbmdzQnlOYW1lW3RyYWNrTmFtZV07CiAgICAgICAgaWYgKGJpbmRpbmcgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgKytiaW5kaW5nLnJlZmVyZW5jZUNvdW50OwogICAgICAgICAgYmluZGluZ3NbaV0gPSBiaW5kaW5nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBiaW5kaW5nID0gYmluZGluZ3NbaV07CiAgICAgICAgICBpZiAoYmluZGluZyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmIChiaW5kaW5nLl9jYWNoZUluZGV4ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgKytiaW5kaW5nLnJlZmVyZW5jZUNvdW50OwogICAgICAgICAgICAgIHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyhiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHBhdGggPSBwcm90b3R5cGVBY3Rpb24gJiYgcHJvdG90eXBlQWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzW2ldLmJpbmRpbmcucGFyc2VkUGF0aDsKICAgICAgICAgIGJpbmRpbmcgPSBuZXcgUHJvcGVydHlNaXhlcihQcm9wZXJ0eUJpbmRpbmcuY3JlYXRlKHJvb3QsIHRyYWNrTmFtZSwgcGF0aCksIHRyYWNrLlZhbHVlVHlwZU5hbWUsIHRyYWNrLmdldFZhbHVlU2l6ZSgpKTsKICAgICAgICAgICsrYmluZGluZy5yZWZlcmVuY2VDb3VudDsKICAgICAgICAgIHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyhiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lKTsKICAgICAgICAgIGJpbmRpbmdzW2ldID0gYmluZGluZzsKICAgICAgICB9CiAgICAgICAgaW50ZXJwb2xhbnRzW2ldLnJlc3VsdEJ1ZmZlciA9IGJpbmRpbmcuYnVmZmVyOwogICAgICB9CiAgICB9CiAgICBfYWN0aXZhdGVBY3Rpb24oYWN0aW9uKSB7CiAgICAgIGlmICghdGhpcy5faXNBY3RpdmVBY3Rpb24oYWN0aW9uKSkgewogICAgICAgIGlmIChhY3Rpb24uX2NhY2hlSW5kZXggPT09IG51bGwpIHsKICAgICAgICAgIGNvbnN0IHJvb3RVdWlkID0gKGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QpLnV1aWQsIGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsIGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFtjbGlwVXVpZF07CiAgICAgICAgICB0aGlzLl9iaW5kQWN0aW9uKGFjdGlvbiwgYWN0aW9uc0ZvckNsaXAgJiYgYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWzBdKTsKICAgICAgICAgIHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKGFjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7aSAhPT0gbjsgKytpKSB7CiAgICAgICAgICBjb25zdCBiaW5kaW5nID0gYmluZGluZ3NbaV07CiAgICAgICAgICBpZiAoYmluZGluZy51c2VDb3VudCsrID09PSAwKSB7CiAgICAgICAgICAgIHRoaXMuX2xlbmRCaW5kaW5nKGJpbmRpbmcpOwogICAgICAgICAgICBiaW5kaW5nLnNhdmVPcmlnaW5hbFN0YXRlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX2xlbmRBY3Rpb24oYWN0aW9uKTsKICAgICAgfQogICAgfQogICAgX2RlYWN0aXZhdGVBY3Rpb24oYWN0aW9uKSB7CiAgICAgIGlmICh0aGlzLl9pc0FjdGl2ZUFjdGlvbihhY3Rpb24pKSB7CiAgICAgICAgY29uc3QgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7aSAhPT0gbjsgKytpKSB7CiAgICAgICAgICBjb25zdCBiaW5kaW5nID0gYmluZGluZ3NbaV07CiAgICAgICAgICBpZiAoLS1iaW5kaW5nLnVzZUNvdW50ID09PSAwKSB7CiAgICAgICAgICAgIGJpbmRpbmcucmVzdG9yZU9yaWdpbmFsU3RhdGUoKTsKICAgICAgICAgICAgdGhpcy5fdGFrZUJhY2tCaW5kaW5nKGJpbmRpbmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLl90YWtlQmFja0FjdGlvbihhY3Rpb24pOwogICAgICB9CiAgICB9CiAgICBfaW5pdE1lbW9yeU1hbmFnZXIoKSB7CiAgICAgIHRoaXMuX2FjdGlvbnMgPSBbXTsKICAgICAgdGhpcy5fbkFjdGl2ZUFjdGlvbnMgPSAwOwogICAgICB0aGlzLl9hY3Rpb25zQnlDbGlwID0ge307CiAgICAgIHRoaXMuX2JpbmRpbmdzID0gW107CiAgICAgIHRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDA7CiAgICAgIHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSA9IHt9OwogICAgICB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzID0gW107CiAgICAgIHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzID0gMDsKICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzOwogICAgICB0aGlzLnN0YXRzID0gewogICAgICAgIGFjdGlvbnM6IHsKICAgICAgICAgIGdldCB0b3RhbCgpIHsKICAgICAgICAgICAgcmV0dXJuIHNjb3BlLl9hY3Rpb25zLmxlbmd0aDsKICAgICAgICAgIH0sCiAgICAgICAgICBnZXQgaW5Vc2UoKSB7CiAgICAgICAgICAgIHJldHVybiBzY29wZS5fbkFjdGl2ZUFjdGlvbnM7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBiaW5kaW5nczogewogICAgICAgICAgZ2V0IHRvdGFsKCkgewogICAgICAgICAgICByZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDsKICAgICAgICAgIH0sCiAgICAgICAgICBnZXQgaW5Vc2UoKSB7CiAgICAgICAgICAgIHJldHVybiBzY29wZS5fbkFjdGl2ZUJpbmRpbmdzOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY29udHJvbEludGVycG9sYW50czogewogICAgICAgICAgZ2V0IHRvdGFsKCkgewogICAgICAgICAgICByZXR1cm4gc2NvcGUuX2NvbnRyb2xJbnRlcnBvbGFudHMubGVuZ3RoOwogICAgICAgICAgfSwKICAgICAgICAgIGdldCBpblVzZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHNjb3BlLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50czsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgICBfaXNBY3RpdmVBY3Rpb24oYWN0aW9uKSB7CiAgICAgIGNvbnN0IGluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4OwogICAgICByZXR1cm4gaW5kZXggIT09IG51bGwgJiYgaW5kZXggPCB0aGlzLl9uQWN0aXZlQWN0aW9uczsKICAgIH0KICAgIF9hZGRJbmFjdGl2ZUFjdGlvbihhY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCkgewogICAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucywgYWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXA7CiAgICAgIGxldCBhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbY2xpcFV1aWRdOwogICAgICBpZiAoYWN0aW9uc0ZvckNsaXAgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGFjdGlvbnNGb3JDbGlwID0gewogICAgICAgICAga25vd25BY3Rpb25zOiBbYWN0aW9uXSwKICAgICAgICAgIGFjdGlvbkJ5Um9vdDoge30KICAgICAgICB9OwogICAgICAgIGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IDA7CiAgICAgICAgYWN0aW9uc0J5Q2xpcFtjbGlwVXVpZF0gPSBhY3Rpb25zRm9yQ2xpcDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBrbm93bkFjdGlvbnMgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnM7CiAgICAgICAgYWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0ga25vd25BY3Rpb25zLmxlbmd0aDsKICAgICAgICBrbm93bkFjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICB9CiAgICAgIGFjdGlvbi5fY2FjaGVJbmRleCA9IGFjdGlvbnMubGVuZ3RoOwogICAgICBhY3Rpb25zLnB1c2goYWN0aW9uKTsKICAgICAgYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290W3Jvb3RVdWlkXSA9IGFjdGlvbjsKICAgIH0KICAgIF9yZW1vdmVJbmFjdGl2ZUFjdGlvbihhY3Rpb24pIHsKICAgICAgY29uc3QgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsIGxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbYWN0aW9ucy5sZW5ndGggLSAxXSwgY2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDsKICAgICAgbGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDsKICAgICAgYWN0aW9uc1tjYWNoZUluZGV4XSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjsKICAgICAgYWN0aW9ucy5wb3AoKTsKICAgICAgYWN0aW9uLl9jYWNoZUluZGV4ID0gbnVsbDsKICAgICAgY29uc3QgY2xpcFV1aWQgPSBhY3Rpb24uX2NsaXAudXVpZCwgYWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsIGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFtjbGlwVXVpZF0sIGtub3duQWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnMsIGxhc3RLbm93bkFjdGlvbiA9IGtub3duQWN0aW9uc0ZvckNsaXBba25vd25BY3Rpb25zRm9yQ2xpcC5sZW5ndGggLSAxXSwgYnlDbGlwQ2FjaGVJbmRleCA9IGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleDsKICAgICAgbGFzdEtub3duQWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gYnlDbGlwQ2FjaGVJbmRleDsKICAgICAga25vd25BY3Rpb25zRm9yQ2xpcFtieUNsaXBDYWNoZUluZGV4XSA9IGxhc3RLbm93bkFjdGlvbjsKICAgICAga25vd25BY3Rpb25zRm9yQ2xpcC5wb3AoKTsKICAgICAgYWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDsKICAgICAgY29uc3QgYWN0aW9uQnlSb290ID0gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290LCByb290VXVpZCA9IChhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290KS51dWlkOwogICAgICBkZWxldGUgYWN0aW9uQnlSb290W3Jvb3RVdWlkXTsKICAgICAgaWYgKGtub3duQWN0aW9uc0ZvckNsaXAubGVuZ3RoID09PSAwKSB7CiAgICAgICAgZGVsZXRlIGFjdGlvbnNCeUNsaXBbY2xpcFV1aWRdOwogICAgICB9CiAgICAgIHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oYWN0aW9uKTsKICAgIH0KICAgIF9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKGFjdGlvbikgewogICAgICBjb25zdCBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5nczsKICAgICAgZm9yIChsZXQgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7aSAhPT0gbjsgKytpKSB7CiAgICAgICAgY29uc3QgYmluZGluZyA9IGJpbmRpbmdzW2ldOwogICAgICAgIGlmICgtLWJpbmRpbmcucmVmZXJlbmNlQ291bnQgPT09IDApIHsKICAgICAgICAgIHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyhiaW5kaW5nKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIF9sZW5kQWN0aW9uKGFjdGlvbikgewogICAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucywgcHJldkluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LCBsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQWN0aW9ucysrLCBmaXJzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1tsYXN0QWN0aXZlSW5kZXhdOwogICAgICBhY3Rpb24uX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7CiAgICAgIGFjdGlvbnNbbGFzdEFjdGl2ZUluZGV4XSA9IGFjdGlvbjsKICAgICAgZmlyc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IHByZXZJbmRleDsKICAgICAgYWN0aW9uc1twcmV2SW5kZXhdID0gZmlyc3RJbmFjdGl2ZUFjdGlvbjsKICAgIH0KICAgIF90YWtlQmFja0FjdGlvbihhY3Rpb24pIHsKICAgICAgY29uc3QgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsIHByZXZJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCwgZmlyc3RJbmFjdGl2ZUluZGV4ID0gLS10aGlzLl9uQWN0aXZlQWN0aW9ucywgbGFzdEFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbZmlyc3RJbmFjdGl2ZUluZGV4XTsKICAgICAgYWN0aW9uLl9jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4OwogICAgICBhY3Rpb25zW2ZpcnN0SW5hY3RpdmVJbmRleF0gPSBhY3Rpb247CiAgICAgIGxhc3RBY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7CiAgICAgIGFjdGlvbnNbcHJldkluZGV4XSA9IGxhc3RBY3RpdmVBY3Rpb247CiAgICB9CiAgICBfYWRkSW5hY3RpdmVCaW5kaW5nKGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUpIHsKICAgICAgY29uc3QgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7CiAgICAgIGxldCBiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3Rbcm9vdFV1aWRdOwogICAgICBpZiAoYmluZGluZ0J5TmFtZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgYmluZGluZ0J5TmFtZSA9IHt9OwogICAgICAgIGJpbmRpbmdzQnlSb290W3Jvb3RVdWlkXSA9IGJpbmRpbmdCeU5hbWU7CiAgICAgIH0KICAgICAgYmluZGluZ0J5TmFtZVt0cmFja05hbWVdID0gYmluZGluZzsKICAgICAgYmluZGluZy5fY2FjaGVJbmRleCA9IGJpbmRpbmdzLmxlbmd0aDsKICAgICAgYmluZGluZ3MucHVzaChiaW5kaW5nKTsKICAgIH0KICAgIF9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoYmluZGluZykgewogICAgICBjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLCBwcm9wQmluZGluZyA9IGJpbmRpbmcuYmluZGluZywgcm9vdFV1aWQgPSBwcm9wQmluZGluZy5yb290Tm9kZS51dWlkLCB0cmFja05hbWUgPSBwcm9wQmluZGluZy5wYXRoLCBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSwgYmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290W3Jvb3RVdWlkXSwgbGFzdEluYWN0aXZlQmluZGluZyA9IGJpbmRpbmdzW2JpbmRpbmdzLmxlbmd0aCAtIDFdLCBjYWNoZUluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleDsKICAgICAgbGFzdEluYWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7CiAgICAgIGJpbmRpbmdzW2NhY2hlSW5kZXhdID0gbGFzdEluYWN0aXZlQmluZGluZzsKICAgICAgYmluZGluZ3MucG9wKCk7CiAgICAgIGRlbGV0ZSBiaW5kaW5nQnlOYW1lW3RyYWNrTmFtZV07CiAgICAgIGlmIChPYmplY3Qua2V5cyhiaW5kaW5nQnlOYW1lKS5sZW5ndGggPT09IDApIHsKICAgICAgICBkZWxldGUgYmluZGluZ3NCeVJvb3Rbcm9vdFV1aWRdOwogICAgICB9CiAgICB9CiAgICBfbGVuZEJpbmRpbmcoYmluZGluZykgewogICAgICBjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLCBwcmV2SW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4LCBsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQmluZGluZ3MrKywgZmlyc3RJbmFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1tsYXN0QWN0aXZlSW5kZXhdOwogICAgICBiaW5kaW5nLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4OwogICAgICBiaW5kaW5nc1tsYXN0QWN0aXZlSW5kZXhdID0gYmluZGluZzsKICAgICAgZmlyc3RJbmFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7CiAgICAgIGJpbmRpbmdzW3ByZXZJbmRleF0gPSBmaXJzdEluYWN0aXZlQmluZGluZzsKICAgIH0KICAgIF90YWtlQmFja0JpbmRpbmcoYmluZGluZykgewogICAgICBjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLCBwcmV2SW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4LCBmaXJzdEluYWN0aXZlSW5kZXggPSAtLXRoaXMuX25BY3RpdmVCaW5kaW5ncywgbGFzdEFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1tmaXJzdEluYWN0aXZlSW5kZXhdOwogICAgICBiaW5kaW5nLl9jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4OwogICAgICBiaW5kaW5nc1tmaXJzdEluYWN0aXZlSW5kZXhdID0gYmluZGluZzsKICAgICAgbGFzdEFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7CiAgICAgIGJpbmRpbmdzW3ByZXZJbmRleF0gPSBsYXN0QWN0aXZlQmluZGluZzsKICAgIH0KICAgIF9sZW5kQ29udHJvbEludGVycG9sYW50KCkgewogICAgICBjb25zdCBpbnRlcnBvbGFudHMgPSB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLCBsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cysrOwogICAgICBsZXQgaW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbbGFzdEFjdGl2ZUluZGV4XTsKICAgICAgaWYgKGludGVycG9sYW50ID09PSB1bmRlZmluZWQpIHsKICAgICAgICBpbnRlcnBvbGFudCA9IG5ldyBMaW5lYXJJbnRlcnBvbGFudChuZXcgRmxvYXQzMkFycmF5KDIpLCBuZXcgRmxvYXQzMkFycmF5KDIpLCAxLCBfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlcik7CiAgICAgICAgaW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4OwogICAgICAgIGludGVycG9sYW50c1tsYXN0QWN0aXZlSW5kZXhdID0gaW50ZXJwb2xhbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGludGVycG9sYW50OwogICAgfQogICAgX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KGludGVycG9sYW50KSB7CiAgICAgIGNvbnN0IGludGVycG9sYW50cyA9IHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsIHByZXZJbmRleCA9IGludGVycG9sYW50Ll9fY2FjaGVJbmRleCwgZmlyc3RJbmFjdGl2ZUluZGV4ID0gLS10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cywgbGFzdEFjdGl2ZUludGVycG9sYW50ID0gaW50ZXJwb2xhbnRzW2ZpcnN0SW5hY3RpdmVJbmRleF07CiAgICAgIGludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDsKICAgICAgaW50ZXJwb2xhbnRzW2ZpcnN0SW5hY3RpdmVJbmRleF0gPSBpbnRlcnBvbGFudDsKICAgICAgbGFzdEFjdGl2ZUludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IHByZXZJbmRleDsKICAgICAgaW50ZXJwb2xhbnRzW3ByZXZJbmRleF0gPSBsYXN0QWN0aXZlSW50ZXJwb2xhbnQ7CiAgICB9CiAgICBjbGlwQWN0aW9uKGNsaXAsIG9wdGlvbmFsUm9vdCwgYmxlbmRNb2RlKSB7CiAgICAgIGNvbnN0IHJvb3QgPSBvcHRpb25hbFJvb3QgfHwgdGhpcy5fcm9vdCwgcm9vdFV1aWQgPSByb290LnV1aWQ7CiAgICAgIGxldCBjbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICJzdHJpbmciID8gQW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKHJvb3QsIGNsaXApIDogY2xpcDsKICAgICAgY29uc3QgY2xpcFV1aWQgPSBjbGlwT2JqZWN0ICE9PSBudWxsID8gY2xpcE9iamVjdC51dWlkIDogY2xpcDsKICAgICAgY29uc3QgYWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwW2NsaXBVdWlkXTsKICAgICAgbGV0IHByb3RvdHlwZUFjdGlvbiA9IG51bGw7CiAgICAgIGlmIChibGVuZE1vZGUgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGlmIChjbGlwT2JqZWN0ICE9PSBudWxsKSB7CiAgICAgICAgICBibGVuZE1vZGUgPSBjbGlwT2JqZWN0LmJsZW5kTW9kZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYmxlbmRNb2RlID0gTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbnN0IGV4aXN0aW5nQWN0aW9uID0gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290W3Jvb3RVdWlkXTsKICAgICAgICBpZiAoZXhpc3RpbmdBY3Rpb24gIT09IHVuZGVmaW5lZCAmJiBleGlzdGluZ0FjdGlvbi5ibGVuZE1vZGUgPT09IGJsZW5kTW9kZSkgewogICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQWN0aW9uOwogICAgICAgIH0KICAgICAgICBwcm90b3R5cGVBY3Rpb24gPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbMF07CiAgICAgICAgaWYgKGNsaXBPYmplY3QgPT09IG51bGwpCiAgICAgICAgICBjbGlwT2JqZWN0ID0gcHJvdG90eXBlQWN0aW9uLl9jbGlwOwogICAgICB9CiAgICAgIGlmIChjbGlwT2JqZWN0ID09PSBudWxsKQogICAgICAgIHJldHVybiBudWxsOwogICAgICBjb25zdCBuZXdBY3Rpb24gPSBuZXcgQW5pbWF0aW9uQWN0aW9uKHRoaXMsIGNsaXBPYmplY3QsIG9wdGlvbmFsUm9vdCwgYmxlbmRNb2RlKTsKICAgICAgdGhpcy5fYmluZEFjdGlvbihuZXdBY3Rpb24sIHByb3RvdHlwZUFjdGlvbik7CiAgICAgIHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKG5ld0FjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkKTsKICAgICAgcmV0dXJuIG5ld0FjdGlvbjsKICAgIH0KICAgIGV4aXN0aW5nQWN0aW9uKGNsaXAsIG9wdGlvbmFsUm9vdCkgewogICAgICBjb25zdCByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsIHJvb3RVdWlkID0gcm9vdC51dWlkLCBjbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICJzdHJpbmciID8gQW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKHJvb3QsIGNsaXApIDogY2xpcCwgY2xpcFV1aWQgPSBjbGlwT2JqZWN0ID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCwgYWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwW2NsaXBVdWlkXTsKICAgICAgaWYgKGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm4gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290W3Jvb3RVdWlkXSB8fCBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgc3RvcEFsbEFjdGlvbigpIHsKICAgICAgY29uc3QgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsIG5BY3Rpb25zID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnM7CiAgICAgIGZvciAobGV0IGkgPSBuQWN0aW9ucyAtIDE7aSA+PSAwOyAtLWkpIHsKICAgICAgICBhY3Rpb25zW2ldLnN0b3AoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHVwZGF0ZShkZWx0YVRpbWUpIHsKICAgICAgZGVsdGFUaW1lICo9IHRoaXMudGltZVNjYWxlOwogICAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucywgbkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucywgdGltZSA9IHRoaXMudGltZSArPSBkZWx0YVRpbWUsIHRpbWVEaXJlY3Rpb24gPSBNYXRoLnNpZ24oZGVsdGFUaW1lKSwgYWNjdUluZGV4ID0gdGhpcy5fYWNjdUluZGV4IF49IDE7CiAgICAgIGZvciAobGV0IGkgPSAwO2kgIT09IG5BY3Rpb25zOyArK2kpIHsKICAgICAgICBjb25zdCBhY3Rpb24gPSBhY3Rpb25zW2ldOwogICAgICAgIGFjdGlvbi5fdXBkYXRlKHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4KTsKICAgICAgfQogICAgICBjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLCBuQmluZGluZ3MgPSB0aGlzLl9uQWN0aXZlQmluZGluZ3M7CiAgICAgIGZvciAobGV0IGkgPSAwO2kgIT09IG5CaW5kaW5nczsgKytpKSB7CiAgICAgICAgYmluZGluZ3NbaV0uYXBwbHkoYWNjdUluZGV4KTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHNldFRpbWUodGltZUluU2Vjb25kcykgewogICAgICB0aGlzLnRpbWUgPSAwOwogICAgICBmb3IgKGxldCBpID0gMDtpIDwgdGhpcy5fYWN0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgIHRoaXMuX2FjdGlvbnNbaV0udGltZSA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKHRpbWVJblNlY29uZHMpOwogICAgfQogICAgZ2V0Um9vdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3Jvb3Q7CiAgICB9CiAgICB1bmNhY2hlQ2xpcChjbGlwKSB7CiAgICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLCBjbGlwVXVpZCA9IGNsaXAudXVpZCwgYWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsIGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFtjbGlwVXVpZF07CiAgICAgIGlmIChhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29uc3QgYWN0aW9uc1RvUmVtb3ZlID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gYWN0aW9uc1RvUmVtb3ZlLmxlbmd0aDtpICE9PSBuOyArK2kpIHsKICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IGFjdGlvbnNUb1JlbW92ZVtpXTsKICAgICAgICAgIHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oYWN0aW9uKTsKICAgICAgICAgIGNvbnN0IGNhY2hlSW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsIGxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbYWN0aW9ucy5sZW5ndGggLSAxXTsKICAgICAgICAgIGFjdGlvbi5fY2FjaGVJbmRleCA9IG51bGw7CiAgICAgICAgICBhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsOwogICAgICAgICAgbGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDsKICAgICAgICAgIGFjdGlvbnNbY2FjaGVJbmRleF0gPSBsYXN0SW5hY3RpdmVBY3Rpb247CiAgICAgICAgICBhY3Rpb25zLnBvcCgpOwogICAgICAgICAgdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbihhY3Rpb24pOwogICAgICAgIH0KICAgICAgICBkZWxldGUgYWN0aW9uc0J5Q2xpcFtjbGlwVXVpZF07CiAgICAgIH0KICAgIH0KICAgIHVuY2FjaGVSb290KHJvb3QpIHsKICAgICAgY29uc3Qgcm9vdFV1aWQgPSByb290LnV1aWQsIGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwOwogICAgICBmb3IgKGNvbnN0IGNsaXBVdWlkIGluIGFjdGlvbnNCeUNsaXApIHsKICAgICAgICBjb25zdCBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zQnlDbGlwW2NsaXBVdWlkXS5hY3Rpb25CeVJvb3QsIGFjdGlvbiA9IGFjdGlvbkJ5Um9vdFtyb290VXVpZF07CiAgICAgICAgaWYgKGFjdGlvbiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGFjdGlvbik7CiAgICAgICAgICB0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbihhY3Rpb24pOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSwgYmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290W3Jvb3RVdWlkXTsKICAgICAgaWYgKGJpbmRpbmdCeU5hbWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGZvciAoY29uc3QgdHJhY2tOYW1lIGluIGJpbmRpbmdCeU5hbWUpIHsKICAgICAgICAgIGNvbnN0IGJpbmRpbmcgPSBiaW5kaW5nQnlOYW1lW3RyYWNrTmFtZV07CiAgICAgICAgICBiaW5kaW5nLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCk7CiAgICAgICAgICB0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoYmluZGluZyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB1bmNhY2hlQWN0aW9uKGNsaXAsIG9wdGlvbmFsUm9vdCkgewogICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmV4aXN0aW5nQWN0aW9uKGNsaXAsIG9wdGlvbmFsUm9vdCk7CiAgICAgIGlmIChhY3Rpb24gIT09IG51bGwpIHsKICAgICAgICB0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGFjdGlvbik7CiAgICAgICAgdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oYWN0aW9uKTsKICAgICAgfQogICAgfQogIH07CiAgUmVuZGVyVGFyZ2V0M0QgPSBjbGFzcyBSZW5kZXJUYXJnZXQzRCBleHRlbmRzIFJlbmRlclRhcmdldCB7CiAgICBjb25zdHJ1Y3Rvcih3aWR0aCA9IDEsIGhlaWdodCA9IDEsIGRlcHRoID0gMSwgb3B0aW9ucyA9IHt9KSB7CiAgICAgIHN1cGVyKHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMpOwogICAgICB0aGlzLmlzUmVuZGVyVGFyZ2V0M0QgPSB0cnVlOwogICAgICB0aGlzLmRlcHRoID0gZGVwdGg7CiAgICAgIHRoaXMudGV4dHVyZSA9IG5ldyBEYXRhM0RUZXh0dXJlKG51bGwsIHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsKICAgICAgdGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9IHRydWU7CiAgICB9CiAgfTsKICBSZW5kZXJUYXJnZXRBcnJheSA9IGNsYXNzIFJlbmRlclRhcmdldEFycmF5IGV4dGVuZHMgUmVuZGVyVGFyZ2V0IHsKICAgIGNvbnN0cnVjdG9yKHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZGVwdGggPSAxLCBvcHRpb25zID0ge30pIHsKICAgICAgc3VwZXIod2lkdGgsIGhlaWdodCwgb3B0aW9ucyk7CiAgICAgIHRoaXMuaXNSZW5kZXJUYXJnZXRBcnJheSA9IHRydWU7CiAgICAgIHRoaXMuZGVwdGggPSBkZXB0aDsKICAgICAgdGhpcy50ZXh0dXJlID0gbmV3IERhdGFBcnJheVRleHR1cmUobnVsbCwgd2lkdGgsIGhlaWdodCwgZGVwdGgpOwogICAgICB0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID0gdHJ1ZTsKICAgIH0KICB9OwogIFVuaWZvcm1zR3JvdXAgPSBjbGFzcyBVbmlmb3Jtc0dyb3VwIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmlzVW5pZm9ybXNHcm91cCA9IHRydWU7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiaWQiLCB7IHZhbHVlOiBfaWQrKyB9KTsKICAgICAgdGhpcy5uYW1lID0gIiI7CiAgICAgIHRoaXMudXNhZ2UgPSBTdGF0aWNEcmF3VXNhZ2U7CiAgICAgIHRoaXMudW5pZm9ybXMgPSBbXTsKICAgIH0KICAgIGFkZCh1bmlmb3JtKSB7CiAgICAgIHRoaXMudW5pZm9ybXMucHVzaCh1bmlmb3JtKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICByZW1vdmUodW5pZm9ybSkgewogICAgICBjb25zdCBpbmRleCA9IHRoaXMudW5pZm9ybXMuaW5kZXhPZih1bmlmb3JtKTsKICAgICAgaWYgKGluZGV4ICE9PSAtMSkKICAgICAgICB0aGlzLnVuaWZvcm1zLnNwbGljZShpbmRleCwgMSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0TmFtZShuYW1lKSB7CiAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgc2V0VXNhZ2UodmFsdWUpIHsKICAgICAgdGhpcy51c2FnZSA9IHZhbHVlOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGRpc3Bvc2UoKSB7CiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICJkaXNwb3NlIiB9KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICB0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTsKICAgICAgdGhpcy51c2FnZSA9IHNvdXJjZS51c2FnZTsKICAgICAgY29uc3QgdW5pZm9ybXNTb3VyY2UgPSBzb3VyY2UudW5pZm9ybXM7CiAgICAgIHRoaXMudW5pZm9ybXMubGVuZ3RoID0gMDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB1bmlmb3Jtc1NvdXJjZS5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgIGNvbnN0IHVuaWZvcm1zID0gQXJyYXkuaXNBcnJheSh1bmlmb3Jtc1NvdXJjZVtpXSkgPyB1bmlmb3Jtc1NvdXJjZVtpXSA6IFt1bmlmb3Jtc1NvdXJjZVtpXV07CiAgICAgICAgZm9yIChsZXQgaiA9IDA7aiA8IHVuaWZvcm1zLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICB0aGlzLnVuaWZvcm1zLnB1c2godW5pZm9ybXNbal0uY2xvbmUoKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgY2xvbmUoKSB7CiAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyk7CiAgICB9CiAgfTsKICBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciA9IGNsYXNzIEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyIGV4dGVuZHMgSW50ZXJsZWF2ZWRCdWZmZXIgewogICAgY29uc3RydWN0b3IoYXJyYXksIHN0cmlkZSwgbWVzaFBlckF0dHJpYnV0ZSA9IDEpIHsKICAgICAgc3VwZXIoYXJyYXksIHN0cmlkZSk7CiAgICAgIHRoaXMuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciA9IHRydWU7CiAgICAgIHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IG1lc2hQZXJBdHRyaWJ1dGU7CiAgICB9CiAgICBjb3B5KHNvdXJjZSkgewogICAgICBzdXBlci5jb3B5KHNvdXJjZSk7CiAgICAgIHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IHNvdXJjZS5tZXNoUGVyQXR0cmlidXRlOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGNsb25lKGRhdGEpIHsKICAgICAgY29uc3QgaWIgPSBzdXBlci5jbG9uZShkYXRhKTsKICAgICAgaWIubWVzaFBlckF0dHJpYnV0ZSA9IHRoaXMubWVzaFBlckF0dHJpYnV0ZTsKICAgICAgcmV0dXJuIGliOwogICAgfQogICAgdG9KU09OKGRhdGEpIHsKICAgICAgY29uc3QganNvbiA9IHN1cGVyLnRvSlNPTihkYXRhKTsKICAgICAganNvbi5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyID0gdHJ1ZTsKICAgICAganNvbi5tZXNoUGVyQXR0cmlidXRlID0gdGhpcy5tZXNoUGVyQXR0cmlidXRlOwogICAgICByZXR1cm4ganNvbjsKICAgIH0KICB9OwogIF9tYXRyaXggPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDQ7CiAgX3ZlY3RvciQ0ID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IyOwogIF9zdGFydFAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX3N0YXJ0RW5kID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF92ZWN0b3IkMyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBTcG90TGlnaHRIZWxwZXIgPSBjbGFzcyBTcG90TGlnaHRIZWxwZXIgZXh0ZW5kcyBPYmplY3QzRCB7CiAgICBjb25zdHJ1Y3RvcihsaWdodCwgY29sb3IpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5saWdodCA9IGxpZ2h0OwogICAgICB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKICAgICAgdGhpcy5jb2xvciA9IGNvbG9yOwogICAgICB0aGlzLnR5cGUgPSAiU3BvdExpZ2h0SGVscGVyIjsKICAgICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnk7CiAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IFsKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMSwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAxLAogICAgICAgIDAsCiAgICAgICAgMSwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAtMSwKICAgICAgICAwLAogICAgICAgIDEsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAxLAogICAgICAgIDEsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAtMSwKICAgICAgICAxCiAgICAgIF07CiAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gMSwgbCA9IDMyO2kgPCBsOyBpKyssIGorKykgewogICAgICAgIGNvbnN0IHAxID0gaSAvIGwgKiBNYXRoLlBJICogMjsKICAgICAgICBjb25zdCBwMiA9IGogLyBsICogTWF0aC5QSSAqIDI7CiAgICAgICAgcG9zaXRpb25zLnB1c2goTWF0aC5jb3MocDEpLCBNYXRoLnNpbihwMSksIDEsIE1hdGguY29zKHAyKSwgTWF0aC5zaW4ocDIpLCAxKTsKICAgICAgfQogICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUocG9zaXRpb25zLCAzKSk7CiAgICAgIGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKHsgZm9nOiBmYWxzZSwgdG9uZU1hcHBlZDogZmFsc2UgfSk7CiAgICAgIHRoaXMuY29uZSA9IG5ldyBMaW5lU2VnbWVudHMoZ2VvbWV0cnksIG1hdGVyaWFsKTsKICAgICAgdGhpcy5hZGQodGhpcy5jb25lKTsKICAgICAgdGhpcy51cGRhdGUoKTsKICAgIH0KICAgIGRpc3Bvc2UoKSB7CiAgICAgIHRoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAgIHRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCk7CiAgICB9CiAgICB1cGRhdGUoKSB7CiAgICAgIHRoaXMubGlnaHQudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpOwogICAgICB0aGlzLmxpZ2h0LnRhcmdldC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCBmYWxzZSk7CiAgICAgIGlmICh0aGlzLnBhcmVudCkgewogICAgICAgIHRoaXMucGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KHRydWUpOwogICAgICAgIHRoaXMubWF0cml4LmNvcHkodGhpcy5wYXJlbnQubWF0cml4V29ybGQpLmludmVydCgpLm11bHRpcGx5KHRoaXMubGlnaHQubWF0cml4V29ybGQpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMubWF0cml4LmNvcHkodGhpcy5saWdodC5tYXRyaXhXb3JsZCk7CiAgICAgIH0KICAgICAgdGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubGlnaHQubWF0cml4V29ybGQpOwogICAgICBjb25zdCBjb25lTGVuZ3RoID0gdGhpcy5saWdodC5kaXN0YW5jZSA/IHRoaXMubGlnaHQuZGlzdGFuY2UgOiAxMDAwOwogICAgICBjb25zdCBjb25lV2lkdGggPSBjb25lTGVuZ3RoICogTWF0aC50YW4odGhpcy5saWdodC5hbmdsZSk7CiAgICAgIHRoaXMuY29uZS5zY2FsZS5zZXQoY29uZVdpZHRoLCBjb25lV2lkdGgsIGNvbmVMZW5ndGgpOwogICAgICBfdmVjdG9yJDMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKTsKICAgICAgdGhpcy5jb25lLmxvb2tBdChfdmVjdG9yJDMpOwogICAgICBpZiAodGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKTsKICAgICAgfQogICAgfQogIH07CiAgX3ZlY3RvciQyID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9ib25lTWF0cml4ID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXg0OwogIF9tYXRyaXhXb3JsZEludiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4NDsKICBTa2VsZXRvbkhlbHBlciA9IGNsYXNzIFNrZWxldG9uSGVscGVyIGV4dGVuZHMgTGluZVNlZ21lbnRzIHsKICAgIGNvbnN0cnVjdG9yKG9iamVjdCkgewogICAgICBjb25zdCBib25lcyA9IGdldEJvbmVMaXN0KG9iamVjdCk7CiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5OwogICAgICBjb25zdCB2ZXJ0aWNlcyA9IFtdOwogICAgICBjb25zdCBjb2xvcnMgPSBbXTsKICAgICAgY29uc3QgY29sb3IxID0gbmV3IENvbG9yKDAsIDAsIDEpOwogICAgICBjb25zdCBjb2xvcjIgPSBuZXcgQ29sb3IoMCwgMSwgMCk7CiAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBib25lcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNvbnN0IGJvbmUgPSBib25lc1tpXTsKICAgICAgICBpZiAoYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lKSB7CiAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKDAsIDAsIDApOwogICAgICAgICAgdmVydGljZXMucHVzaCgwLCAwLCAwKTsKICAgICAgICAgIGNvbG9ycy5wdXNoKGNvbG9yMS5yLCBjb2xvcjEuZywgY29sb3IxLmIpOwogICAgICAgICAgY29sb3JzLnB1c2goY29sb3IyLnIsIGNvbG9yMi5nLCBjb2xvcjIuYik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh2ZXJ0aWNlcywgMykpOwogICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoImNvbG9yIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoY29sb3JzLCAzKSk7CiAgICAgIGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKHsgdmVydGV4Q29sb3JzOiB0cnVlLCBkZXB0aFRlc3Q6IGZhbHNlLCBkZXB0aFdyaXRlOiBmYWxzZSwgdG9uZU1hcHBlZDogZmFsc2UsIHRyYW5zcGFyZW50OiB0cnVlIH0pOwogICAgICBzdXBlcihnZW9tZXRyeSwgbWF0ZXJpYWwpOwogICAgICB0aGlzLmlzU2tlbGV0b25IZWxwZXIgPSB0cnVlOwogICAgICB0aGlzLnR5cGUgPSAiU2tlbGV0b25IZWxwZXIiOwogICAgICB0aGlzLnJvb3QgPSBvYmplY3Q7CiAgICAgIHRoaXMuYm9uZXMgPSBib25lczsKICAgICAgdGhpcy5tYXRyaXggPSBvYmplY3QubWF0cml4V29ybGQ7CiAgICAgIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwogICAgfQogICAgdXBkYXRlTWF0cml4V29ybGQoZm9yY2UpIHsKICAgICAgY29uc3QgYm9uZXMgPSB0aGlzLmJvbmVzOwogICAgICBjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpOwogICAgICBfbWF0cml4V29ybGRJbnYuY29weSh0aGlzLnJvb3QubWF0cml4V29ybGQpLmludmVydCgpOwogICAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7aSA8IGJvbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgYm9uZSA9IGJvbmVzW2ldOwogICAgICAgIGlmIChib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUpIHsKICAgICAgICAgIF9ib25lTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoX21hdHJpeFdvcmxkSW52LCBib25lLm1hdHJpeFdvcmxkKTsKICAgICAgICAgIF92ZWN0b3IkMi5zZXRGcm9tTWF0cml4UG9zaXRpb24oX2JvbmVNYXRyaXgpOwogICAgICAgICAgcG9zaXRpb24uc2V0WFlaKGosIF92ZWN0b3IkMi54LCBfdmVjdG9yJDIueSwgX3ZlY3RvciQyLnopOwogICAgICAgICAgX2JvbmVNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhfbWF0cml4V29ybGRJbnYsIGJvbmUucGFyZW50Lm1hdHJpeFdvcmxkKTsKICAgICAgICAgIF92ZWN0b3IkMi5zZXRGcm9tTWF0cml4UG9zaXRpb24oX2JvbmVNYXRyaXgpOwogICAgICAgICAgcG9zaXRpb24uc2V0WFlaKGogKyAxLCBfdmVjdG9yJDIueCwgX3ZlY3RvciQyLnksIF92ZWN0b3IkMi56KTsKICAgICAgICAgIGogKz0gMjsKICAgICAgICB9CiAgICAgIH0KICAgICAgZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgc3VwZXIudXBkYXRlTWF0cml4V29ybGQoZm9yY2UpOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgdGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAgIHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpOwogICAgfQogIH07CiAgUG9pbnRMaWdodEhlbHBlciA9IGNsYXNzIFBvaW50TGlnaHRIZWxwZXIgZXh0ZW5kcyBNZXNoIHsKICAgIGNvbnN0cnVjdG9yKGxpZ2h0LCBzcGhlcmVTaXplLCBjb2xvcikgewogICAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBTcGhlcmVHZW9tZXRyeShzcGhlcmVTaXplLCA0LCAyKTsKICAgICAgY29uc3QgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoeyB3aXJlZnJhbWU6IHRydWUsIGZvZzogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlIH0pOwogICAgICBzdXBlcihnZW9tZXRyeSwgbWF0ZXJpYWwpOwogICAgICB0aGlzLmxpZ2h0ID0gbGlnaHQ7CiAgICAgIHRoaXMuY29sb3IgPSBjb2xvcjsKICAgICAgdGhpcy50eXBlID0gIlBvaW50TGlnaHRIZWxwZXIiOwogICAgICB0aGlzLm1hdHJpeCA9IHRoaXMubGlnaHQubWF0cml4V29ybGQ7CiAgICAgIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwogICAgICB0aGlzLnVwZGF0ZSgpOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgdGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAgIHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpOwogICAgfQogICAgdXBkYXRlKCkgewogICAgICB0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTsKICAgICAgaWYgKHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKTsKICAgICAgfQogICAgfQogIH07CiAgX3ZlY3RvciQxID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9jb2xvcjEgPSAvKiBAX19QVVJFX18gKi8gbmV3IENvbG9yOwogIF9jb2xvcjIgPSAvKiBAX19QVVJFX18gKi8gbmV3IENvbG9yOwogIEhlbWlzcGhlcmVMaWdodEhlbHBlciA9IGNsYXNzIEhlbWlzcGhlcmVMaWdodEhlbHBlciBleHRlbmRzIE9iamVjdDNEIHsKICAgIGNvbnN0cnVjdG9yKGxpZ2h0LCBzaXplLCBjb2xvcikgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmxpZ2h0ID0gbGlnaHQ7CiAgICAgIHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7CiAgICAgIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwogICAgICB0aGlzLmNvbG9yID0gY29sb3I7CiAgICAgIHRoaXMudHlwZSA9ICJIZW1pc3BoZXJlTGlnaHRIZWxwZXIiOwogICAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBPY3RhaGVkcm9uR2VvbWV0cnkoc2l6ZSk7CiAgICAgIGdlb21ldHJ5LnJvdGF0ZVkoTWF0aC5QSSAqIDAuNSk7CiAgICAgIHRoaXMubWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoeyB3aXJlZnJhbWU6IHRydWUsIGZvZzogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlIH0pOwogICAgICBpZiAodGhpcy5jb2xvciA9PT0gdW5kZWZpbmVkKQogICAgICAgIHRoaXMubWF0ZXJpYWwudmVydGV4Q29sb3JzID0gdHJ1ZTsKICAgICAgY29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7CiAgICAgIGNvbnN0IGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkocG9zaXRpb24uY291bnQgKiAzKTsKICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCJjb2xvciIsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoY29sb3JzLCAzKSk7CiAgICAgIHRoaXMuYWRkKG5ldyBNZXNoKGdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsKSk7CiAgICAgIHRoaXMudXBkYXRlKCk7CiAgICB9CiAgICBkaXNwb3NlKCkgewogICAgICB0aGlzLmNoaWxkcmVuWzBdLmdlb21ldHJ5LmRpc3Bvc2UoKTsKICAgICAgdGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCk7CiAgICB9CiAgICB1cGRhdGUoKSB7CiAgICAgIGNvbnN0IG1lc2ggPSB0aGlzLmNoaWxkcmVuWzBdOwogICAgICBpZiAodGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgY29sb3JzID0gbWVzaC5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoImNvbG9yIik7CiAgICAgICAgX2NvbG9yMS5jb3B5KHRoaXMubGlnaHQuY29sb3IpOwogICAgICAgIF9jb2xvcjIuY29weSh0aGlzLmxpZ2h0Lmdyb3VuZENvbG9yKTsKICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGNvbG9ycy5jb3VudDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBjb2xvciA9IGkgPCBsIC8gMiA/IF9jb2xvcjEgOiBfY29sb3IyOwogICAgICAgICAgY29sb3JzLnNldFhZWihpLCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iKTsKICAgICAgICB9CiAgICAgICAgY29sb3JzLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgfQogICAgICB0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTsKICAgICAgbWVzaC5sb29rQXQoX3ZlY3RvciQxLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKS5uZWdhdGUoKSk7CiAgICB9CiAgfTsKICBHcmlkSGVscGVyID0gY2xhc3MgR3JpZEhlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7CiAgICBjb25zdHJ1Y3RvcihzaXplID0gMTAsIGRpdmlzaW9ucyA9IDEwLCBjb2xvcjEgPSA0NDczOTI0LCBjb2xvcjIgPSA4OTQ3ODQ4KSB7CiAgICAgIGNvbG9yMSA9IG5ldyBDb2xvcihjb2xvcjEpOwogICAgICBjb2xvcjIgPSBuZXcgQ29sb3IoY29sb3IyKTsKICAgICAgY29uc3QgY2VudGVyID0gZGl2aXNpb25zIC8gMjsKICAgICAgY29uc3Qgc3RlcCA9IHNpemUgLyBkaXZpc2lvbnM7CiAgICAgIGNvbnN0IGhhbGZTaXplID0gc2l6ZSAvIDI7CiAgICAgIGNvbnN0IHZlcnRpY2VzID0gW10sIGNvbG9ycyA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMCwgaiA9IDAsIGsgPSAtaGFsZlNpemU7aSA8PSBkaXZpc2lvbnM7IGkrKywgayArPSBzdGVwKSB7CiAgICAgICAgdmVydGljZXMucHVzaCgtaGFsZlNpemUsIDAsIGssIGhhbGZTaXplLCAwLCBrKTsKICAgICAgICB2ZXJ0aWNlcy5wdXNoKGssIDAsIC1oYWxmU2l6ZSwgaywgMCwgaGFsZlNpemUpOwogICAgICAgIGNvbnN0IGNvbG9yID0gaSA9PT0gY2VudGVyID8gY29sb3IxIDogY29sb3IyOwogICAgICAgIGNvbG9yLnRvQXJyYXkoY29sb3JzLCBqKTsKICAgICAgICBqICs9IDM7CiAgICAgICAgY29sb3IudG9BcnJheShjb2xvcnMsIGopOwogICAgICAgIGogKz0gMzsKICAgICAgICBjb2xvci50b0FycmF5KGNvbG9ycywgaik7CiAgICAgICAgaiArPSAzOwogICAgICAgIGNvbG9yLnRvQXJyYXkoY29sb3JzLCBqKTsKICAgICAgICBqICs9IDM7CiAgICAgIH0KICAgICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnk7CiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh2ZXJ0aWNlcywgMykpOwogICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoImNvbG9yIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoY29sb3JzLCAzKSk7CiAgICAgIGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKHsgdmVydGV4Q29sb3JzOiB0cnVlLCB0b25lTWFwcGVkOiBmYWxzZSB9KTsKICAgICAgc3VwZXIoZ2VvbWV0cnksIG1hdGVyaWFsKTsKICAgICAgdGhpcy50eXBlID0gIkdyaWRIZWxwZXIiOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgdGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAgIHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpOwogICAgfQogIH07CiAgUG9sYXJHcmlkSGVscGVyID0gY2xhc3MgUG9sYXJHcmlkSGVscGVyIGV4dGVuZHMgTGluZVNlZ21lbnRzIHsKICAgIGNvbnN0cnVjdG9yKHJhZGl1cyA9IDEwLCBzZWN0b3JzID0gMTYsIHJpbmdzID0gOCwgZGl2aXNpb25zID0gNjQsIGNvbG9yMSA9IDQ0NzM5MjQsIGNvbG9yMiA9IDg5NDc4NDgpIHsKICAgICAgY29sb3IxID0gbmV3IENvbG9yKGNvbG9yMSk7CiAgICAgIGNvbG9yMiA9IG5ldyBDb2xvcihjb2xvcjIpOwogICAgICBjb25zdCB2ZXJ0aWNlcyA9IFtdOwogICAgICBjb25zdCBjb2xvcnMgPSBbXTsKICAgICAgaWYgKHNlY3RvcnMgPiAxKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IHNlY3RvcnM7IGkrKykgewogICAgICAgICAgY29uc3QgdiA9IGkgLyBzZWN0b3JzICogKE1hdGguUEkgKiAyKTsKICAgICAgICAgIGNvbnN0IHggPSBNYXRoLnNpbih2KSAqIHJhZGl1czsKICAgICAgICAgIGNvbnN0IHogPSBNYXRoLmNvcyh2KSAqIHJhZGl1czsKICAgICAgICAgIHZlcnRpY2VzLnB1c2goMCwgMCwgMCk7CiAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKHgsIDAsIHopOwogICAgICAgICAgY29uc3QgY29sb3IgPSBpICYgMSA/IGNvbG9yMSA6IGNvbG9yMjsKICAgICAgICAgIGNvbG9ycy5wdXNoKGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIpOwogICAgICAgICAgY29sb3JzLnB1c2goY29sb3IuciwgY29sb3IuZywgY29sb3IuYik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwO2kgPCByaW5nczsgaSsrKSB7CiAgICAgICAgY29uc3QgY29sb3IgPSBpICYgMSA/IGNvbG9yMSA6IGNvbG9yMjsKICAgICAgICBjb25zdCByID0gcmFkaXVzIC0gcmFkaXVzIC8gcmluZ3MgKiBpOwogICAgICAgIGZvciAobGV0IGogPSAwO2ogPCBkaXZpc2lvbnM7IGorKykgewogICAgICAgICAgbGV0IHYgPSBqIC8gZGl2aXNpb25zICogKE1hdGguUEkgKiAyKTsKICAgICAgICAgIGxldCB4ID0gTWF0aC5zaW4odikgKiByOwogICAgICAgICAgbGV0IHogPSBNYXRoLmNvcyh2KSAqIHI7CiAgICAgICAgICB2ZXJ0aWNlcy5wdXNoKHgsIDAsIHopOwogICAgICAgICAgY29sb3JzLnB1c2goY29sb3IuciwgY29sb3IuZywgY29sb3IuYik7CiAgICAgICAgICB2ID0gKGogKyAxKSAvIGRpdmlzaW9ucyAqIChNYXRoLlBJICogMik7CiAgICAgICAgICB4ID0gTWF0aC5zaW4odikgKiByOwogICAgICAgICAgeiA9IE1hdGguY29zKHYpICogcjsKICAgICAgICAgIHZlcnRpY2VzLnB1c2goeCwgMCwgeik7CiAgICAgICAgICBjb2xvcnMucHVzaChjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnk7CiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh2ZXJ0aWNlcywgMykpOwogICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoImNvbG9yIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoY29sb3JzLCAzKSk7CiAgICAgIGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKHsgdmVydGV4Q29sb3JzOiB0cnVlLCB0b25lTWFwcGVkOiBmYWxzZSB9KTsKICAgICAgc3VwZXIoZ2VvbWV0cnksIG1hdGVyaWFsKTsKICAgICAgdGhpcy50eXBlID0gIlBvbGFyR3JpZEhlbHBlciI7CiAgICB9CiAgICBkaXNwb3NlKCkgewogICAgICB0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTsKICAgICAgdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7CiAgICB9CiAgfTsKICBfdjEgPSAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjM7CiAgX3YyID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF92MyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBEaXJlY3Rpb25hbExpZ2h0SGVscGVyID0gY2xhc3MgRGlyZWN0aW9uYWxMaWdodEhlbHBlciBleHRlbmRzIE9iamVjdDNEIHsKICAgIGNvbnN0cnVjdG9yKGxpZ2h0LCBzaXplLCBjb2xvcikgewogICAgICBzdXBlcigpOwogICAgICB0aGlzLmxpZ2h0ID0gbGlnaHQ7CiAgICAgIHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7CiAgICAgIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwogICAgICB0aGlzLmNvbG9yID0gY29sb3I7CiAgICAgIHRoaXMudHlwZSA9ICJEaXJlY3Rpb25hbExpZ2h0SGVscGVyIjsKICAgICAgaWYgKHNpemUgPT09IHVuZGVmaW5lZCkKICAgICAgICBzaXplID0gMTsKICAgICAgbGV0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5OwogICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoWwogICAgICAgIC1zaXplLAogICAgICAgIHNpemUsCiAgICAgICAgMCwKICAgICAgICBzaXplLAogICAgICAgIHNpemUsCiAgICAgICAgMCwKICAgICAgICBzaXplLAogICAgICAgIC1zaXplLAogICAgICAgIDAsCiAgICAgICAgLXNpemUsCiAgICAgICAgLXNpemUsCiAgICAgICAgMCwKICAgICAgICAtc2l6ZSwKICAgICAgICBzaXplLAogICAgICAgIDAKICAgICAgXSwgMykpOwogICAgICBjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCh7IGZvZzogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlIH0pOwogICAgICB0aGlzLmxpZ2h0UGxhbmUgPSBuZXcgTGluZShnZW9tZXRyeSwgbWF0ZXJpYWwpOwogICAgICB0aGlzLmFkZCh0aGlzLmxpZ2h0UGxhbmUpOwogICAgICBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeTsKICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKFswLCAwLCAwLCAwLCAwLCAxXSwgMykpOwogICAgICB0aGlzLnRhcmdldExpbmUgPSBuZXcgTGluZShnZW9tZXRyeSwgbWF0ZXJpYWwpOwogICAgICB0aGlzLmFkZCh0aGlzLnRhcmdldExpbmUpOwogICAgICB0aGlzLnVwZGF0ZSgpOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgdGhpcy5saWdodFBsYW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTsKICAgICAgdGhpcy5saWdodFBsYW5lLm1hdGVyaWFsLmRpc3Bvc2UoKTsKICAgICAgdGhpcy50YXJnZXRMaW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTsKICAgICAgdGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmRpc3Bvc2UoKTsKICAgIH0KICAgIHVwZGF0ZSgpIHsKICAgICAgdGhpcy5saWdodC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCBmYWxzZSk7CiAgICAgIHRoaXMubGlnaHQudGFyZ2V0LnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTsKICAgICAgX3YxLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKTsKICAgICAgX3YyLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCk7CiAgICAgIF92My5zdWJWZWN0b3JzKF92MiwgX3YxKTsKICAgICAgdGhpcy5saWdodFBsYW5lLmxvb2tBdChfdjIpOwogICAgICBpZiAodGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhpcy5saWdodFBsYW5lLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTsKICAgICAgICB0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpOwogICAgICAgIHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpOwogICAgICB9CiAgICAgIHRoaXMudGFyZ2V0TGluZS5sb29rQXQoX3YyKTsKICAgICAgdGhpcy50YXJnZXRMaW5lLnNjYWxlLnogPSBfdjMubGVuZ3RoKCk7CiAgICB9CiAgfTsKICBfdmVjdG9yID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIF9jYW1lcmEgPSAvKiBAX19QVVJFX18gKi8gbmV3IENhbWVyYTsKICBDYW1lcmFIZWxwZXIgPSBjbGFzcyBDYW1lcmFIZWxwZXIgZXh0ZW5kcyBMaW5lU2VnbWVudHMgewogICAgY29uc3RydWN0b3IoY2FtZXJhKSB7CiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5OwogICAgICBjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCh7IGNvbG9yOiAxNjc3NzIxNSwgdmVydGV4Q29sb3JzOiB0cnVlLCB0b25lTWFwcGVkOiBmYWxzZSB9KTsKICAgICAgY29uc3QgdmVydGljZXMgPSBbXTsKICAgICAgY29uc3QgY29sb3JzID0gW107CiAgICAgIGNvbnN0IHBvaW50TWFwID0ge307CiAgICAgIGFkZExpbmUoIm4xIiwgIm4yIik7CiAgICAgIGFkZExpbmUoIm4yIiwgIm40Iik7CiAgICAgIGFkZExpbmUoIm40IiwgIm4zIik7CiAgICAgIGFkZExpbmUoIm4zIiwgIm4xIik7CiAgICAgIGFkZExpbmUoImYxIiwgImYyIik7CiAgICAgIGFkZExpbmUoImYyIiwgImY0Iik7CiAgICAgIGFkZExpbmUoImY0IiwgImYzIik7CiAgICAgIGFkZExpbmUoImYzIiwgImYxIik7CiAgICAgIGFkZExpbmUoIm4xIiwgImYxIik7CiAgICAgIGFkZExpbmUoIm4yIiwgImYyIik7CiAgICAgIGFkZExpbmUoIm4zIiwgImYzIik7CiAgICAgIGFkZExpbmUoIm40IiwgImY0Iik7CiAgICAgIGFkZExpbmUoInAiLCAibjEiKTsKICAgICAgYWRkTGluZSgicCIsICJuMiIpOwogICAgICBhZGRMaW5lKCJwIiwgIm4zIik7CiAgICAgIGFkZExpbmUoInAiLCAibjQiKTsKICAgICAgYWRkTGluZSgidTEiLCAidTIiKTsKICAgICAgYWRkTGluZSgidTIiLCAidTMiKTsKICAgICAgYWRkTGluZSgidTMiLCAidTEiKTsKICAgICAgYWRkTGluZSgiYyIsICJ0Iik7CiAgICAgIGFkZExpbmUoInAiLCAiYyIpOwogICAgICBhZGRMaW5lKCJjbjEiLCAiY24yIik7CiAgICAgIGFkZExpbmUoImNuMyIsICJjbjQiKTsKICAgICAgYWRkTGluZSgiY2YxIiwgImNmMiIpOwogICAgICBhZGRMaW5lKCJjZjMiLCAiY2Y0Iik7CiAgICAgIGZ1bmN0aW9uIGFkZExpbmUoYSwgYikgewogICAgICAgIGFkZFBvaW50KGEpOwogICAgICAgIGFkZFBvaW50KGIpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGFkZFBvaW50KGlkKSB7CiAgICAgICAgdmVydGljZXMucHVzaCgwLCAwLCAwKTsKICAgICAgICBjb2xvcnMucHVzaCgwLCAwLCAwKTsKICAgICAgICBpZiAocG9pbnRNYXBbaWRdID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHBvaW50TWFwW2lkXSA9IFtdOwogICAgICAgIH0KICAgICAgICBwb2ludE1hcFtpZF0ucHVzaCh2ZXJ0aWNlcy5sZW5ndGggLyAzIC0gMSk7CiAgICAgIH0KICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKHZlcnRpY2VzLCAzKSk7CiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgiY29sb3IiLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShjb2xvcnMsIDMpKTsKICAgICAgc3VwZXIoZ2VvbWV0cnksIG1hdGVyaWFsKTsKICAgICAgdGhpcy50eXBlID0gIkNhbWVyYUhlbHBlciI7CiAgICAgIHRoaXMuY2FtZXJhID0gY2FtZXJhOwogICAgICBpZiAodGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCkKICAgICAgICB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CiAgICAgIHRoaXMubWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkOwogICAgICB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKICAgICAgdGhpcy5wb2ludE1hcCA9IHBvaW50TWFwOwogICAgICB0aGlzLnVwZGF0ZSgpOwogICAgICBjb25zdCBjb2xvckZydXN0dW0gPSBuZXcgQ29sb3IoMTY3NTUyMDApOwogICAgICBjb25zdCBjb2xvckNvbmUgPSBuZXcgQ29sb3IoMTY3MTE2ODApOwogICAgICBjb25zdCBjb2xvclVwID0gbmV3IENvbG9yKDQzNzc1KTsKICAgICAgY29uc3QgY29sb3JUYXJnZXQgPSBuZXcgQ29sb3IoMTY3NzcyMTUpOwogICAgICBjb25zdCBjb2xvckNyb3NzID0gbmV3IENvbG9yKDMzNTU0NDMpOwogICAgICB0aGlzLnNldENvbG9ycyhjb2xvckZydXN0dW0sIGNvbG9yQ29uZSwgY29sb3JVcCwgY29sb3JUYXJnZXQsIGNvbG9yQ3Jvc3MpOwogICAgfQogICAgc2V0Q29sb3JzKGZydXN0dW0sIGNvbmUsIHVwLCB0YXJnZXQsIGNyb3NzKSB7CiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKICAgICAgY29uc3QgY29sb3JBdHRyaWJ1dGUgPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoImNvbG9yIik7CiAgICAgIGNvbG9yQXR0cmlidXRlLnNldFhZWigwLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDEsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIpOwogICAgICBjb2xvckF0dHJpYnV0ZS5zZXRYWVooMiwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYik7CiAgICAgIGNvbG9yQXR0cmlidXRlLnNldFhZWigzLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDQsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIpOwogICAgICBjb2xvckF0dHJpYnV0ZS5zZXRYWVooNSwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYik7CiAgICAgIGNvbG9yQXR0cmlidXRlLnNldFhZWig2LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDcsIGZydXN0dW0uciwgZnJ1c3R1bS5nLCBmcnVzdHVtLmIpOwogICAgICBjb2xvckF0dHJpYnV0ZS5zZXRYWVooOCwgZnJ1c3R1bS5yLCBmcnVzdHVtLmcsIGZydXN0dW0uYik7CiAgICAgIGNvbG9yQXR0cmlidXRlLnNldFhZWig5LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDEwLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDExLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDEyLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDEzLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDE0LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDE1LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDE2LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDE3LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDE4LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDE5LCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDIwLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDIxLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDIyLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDIzLCBmcnVzdHVtLnIsIGZydXN0dW0uZywgZnJ1c3R1bS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDI0LCBjb25lLnIsIGNvbmUuZywgY29uZS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDI1LCBjb25lLnIsIGNvbmUuZywgY29uZS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDI2LCBjb25lLnIsIGNvbmUuZywgY29uZS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDI3LCBjb25lLnIsIGNvbmUuZywgY29uZS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDI4LCBjb25lLnIsIGNvbmUuZywgY29uZS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDI5LCBjb25lLnIsIGNvbmUuZywgY29uZS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDMwLCBjb25lLnIsIGNvbmUuZywgY29uZS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDMxLCBjb25lLnIsIGNvbmUuZywgY29uZS5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDMyLCB1cC5yLCB1cC5nLCB1cC5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDMzLCB1cC5yLCB1cC5nLCB1cC5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDM0LCB1cC5yLCB1cC5nLCB1cC5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDM1LCB1cC5yLCB1cC5nLCB1cC5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDM2LCB1cC5yLCB1cC5nLCB1cC5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDM3LCB1cC5yLCB1cC5nLCB1cC5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDM4LCB0YXJnZXQuciwgdGFyZ2V0LmcsIHRhcmdldC5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDM5LCB0YXJnZXQuciwgdGFyZ2V0LmcsIHRhcmdldC5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDQwLCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDQxLCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDQyLCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDQzLCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDQ0LCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDQ1LCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDQ2LCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDQ3LCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDQ4LCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUuc2V0WFlaKDQ5LCBjcm9zcy5yLCBjcm9zcy5nLCBjcm9zcy5iKTsKICAgICAgY29sb3JBdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgfQogICAgdXBkYXRlKCkgewogICAgICBjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CiAgICAgIGNvbnN0IHBvaW50TWFwID0gdGhpcy5wb2ludE1hcDsKICAgICAgY29uc3QgdyA9IDEsIGggPSAxOwogICAgICBfY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5jYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UpOwogICAgICBjb25zdCBuZWFyWiA9IHRoaXMuY2FtZXJhLmNvb3JkaW5hdGVTeXN0ZW0gPT09IFdlYkdMQ29vcmRpbmF0ZVN5c3RlbSA/IC0xIDogMDsKICAgICAgc2V0UG9pbnQoImMiLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIDAsIG5lYXJaKTsKICAgICAgc2V0UG9pbnQoInQiLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIDAsIDEpOwogICAgICBzZXRQb2ludCgibjEiLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0xLCAtMSwgbmVhclopOwogICAgICBzZXRQb2ludCgibjIiLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcsIC0xLCBuZWFyWik7CiAgICAgIHNldFBvaW50KCJuMyIsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLTEsIGgsIG5lYXJaKTsKICAgICAgc2V0UG9pbnQoIm40IiwgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCB3LCBoLCBuZWFyWik7CiAgICAgIHNldFBvaW50KCJmMSIsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLTEsIC0xLCAxKTsKICAgICAgc2V0UG9pbnQoImYyIiwgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCB3LCAtMSwgMSk7CiAgICAgIHNldFBvaW50KCJmMyIsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLTEsIGgsIDEpOwogICAgICBzZXRQb2ludCgiZjQiLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcsIGgsIDEpOwogICAgICBzZXRQb2ludCgidTEiLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcgKiAwLjcsIGggKiAxLjEsIG5lYXJaKTsKICAgICAgc2V0UG9pbnQoInUyIiwgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAtMSAqIDAuNywgaCAqIDEuMSwgbmVhclopOwogICAgICBzZXRQb2ludCgidTMiLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIGggKiAyLCBuZWFyWik7CiAgICAgIHNldFBvaW50KCJjZjEiLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0xLCAwLCAxKTsKICAgICAgc2V0UG9pbnQoImNmMiIsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgMCwgMSk7CiAgICAgIHNldFBvaW50KCJjZjMiLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIC0xLCAxKTsKICAgICAgc2V0UG9pbnQoImNmNCIsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgaCwgMSk7CiAgICAgIHNldFBvaW50KCJjbjEiLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0xLCAwLCBuZWFyWik7CiAgICAgIHNldFBvaW50KCJjbjIiLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcsIDAsIG5lYXJaKTsKICAgICAgc2V0UG9pbnQoImNuMyIsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgLTEsIG5lYXJaKTsKICAgICAgc2V0UG9pbnQoImNuNCIsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgaCwgbmVhclopOwogICAgICBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgdGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAgIHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpOwogICAgfQogIH07CiAgX2JveCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgQm94MzsKICBCb3hIZWxwZXIgPSBjbGFzcyBCb3hIZWxwZXIgZXh0ZW5kcyBMaW5lU2VnbWVudHMgewogICAgY29uc3RydWN0b3Iob2JqZWN0LCBjb2xvciA9IDE2Nzc2OTYwKSB7CiAgICAgIGNvbnN0IGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoWzAsIDEsIDEsIDIsIDIsIDMsIDMsIDAsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDQsIDAsIDQsIDEsIDUsIDIsIDYsIDMsIDddKTsKICAgICAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheSg4ICogMyk7CiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5OwogICAgICBnZW9tZXRyeS5zZXRJbmRleChuZXcgQnVmZmVyQXR0cmlidXRlKGluZGljZXMsIDEpKTsKICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBCdWZmZXJBdHRyaWJ1dGUocG9zaXRpb25zLCAzKSk7CiAgICAgIHN1cGVyKGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoeyBjb2xvciwgdG9uZU1hcHBlZDogZmFsc2UgfSkpOwogICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKICAgICAgdGhpcy50eXBlID0gIkJveEhlbHBlciI7CiAgICAgIHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwogICAgICB0aGlzLnVwZGF0ZSgpOwogICAgfQogICAgdXBkYXRlKG9iamVjdCkgewogICAgICBpZiAob2JqZWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLiIpOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9iamVjdCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgX2JveC5zZXRGcm9tT2JqZWN0KHRoaXMub2JqZWN0KTsKICAgICAgfQogICAgICBpZiAoX2JveC5pc0VtcHR5KCkpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBtaW4gPSBfYm94Lm1pbjsKICAgICAgY29uc3QgbWF4ID0gX2JveC5tYXg7CiAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgICBjb25zdCBhcnJheSA9IHBvc2l0aW9uLmFycmF5OwogICAgICBhcnJheVswXSA9IG1heC54OwogICAgICBhcnJheVsxXSA9IG1heC55OwogICAgICBhcnJheVsyXSA9IG1heC56OwogICAgICBhcnJheVszXSA9IG1pbi54OwogICAgICBhcnJheVs0XSA9IG1heC55OwogICAgICBhcnJheVs1XSA9IG1heC56OwogICAgICBhcnJheVs2XSA9IG1pbi54OwogICAgICBhcnJheVs3XSA9IG1pbi55OwogICAgICBhcnJheVs4XSA9IG1heC56OwogICAgICBhcnJheVs5XSA9IG1heC54OwogICAgICBhcnJheVsxMF0gPSBtaW4ueTsKICAgICAgYXJyYXlbMTFdID0gbWF4Lno7CiAgICAgIGFycmF5WzEyXSA9IG1heC54OwogICAgICBhcnJheVsxM10gPSBtYXgueTsKICAgICAgYXJyYXlbMTRdID0gbWluLno7CiAgICAgIGFycmF5WzE1XSA9IG1pbi54OwogICAgICBhcnJheVsxNl0gPSBtYXgueTsKICAgICAgYXJyYXlbMTddID0gbWluLno7CiAgICAgIGFycmF5WzE4XSA9IG1pbi54OwogICAgICBhcnJheVsxOV0gPSBtaW4ueTsKICAgICAgYXJyYXlbMjBdID0gbWluLno7CiAgICAgIGFycmF5WzIxXSA9IG1heC54OwogICAgICBhcnJheVsyMl0gPSBtaW4ueTsKICAgICAgYXJyYXlbMjNdID0gbWluLno7CiAgICAgIHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgdGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKICAgIH0KICAgIHNldEZyb21PYmplY3Qob2JqZWN0KSB7CiAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwogICAgICB0aGlzLnVwZGF0ZSgpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGNvcHkoc291cmNlLCByZWN1cnNpdmUpIHsKICAgICAgc3VwZXIuY29weShzb3VyY2UsIHJlY3Vyc2l2ZSk7CiAgICAgIHRoaXMub2JqZWN0ID0gc291cmNlLm9iamVjdDsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBkaXNwb3NlKCkgewogICAgICB0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTsKICAgICAgdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7CiAgICB9CiAgfTsKICBCb3gzSGVscGVyID0gY2xhc3MgQm94M0hlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7CiAgICBjb25zdHJ1Y3Rvcihib3gsIGNvbG9yID0gMTY3NzY5NjApIHsKICAgICAgY29uc3QgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheShbMCwgMSwgMSwgMiwgMiwgMywgMywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwgNCwgMSwgNSwgMiwgNiwgMywgN10pOwogICAgICBjb25zdCBwb3NpdGlvbnMgPSBbMSwgMSwgMSwgLTEsIDEsIDEsIC0xLCAtMSwgMSwgMSwgLTEsIDEsIDEsIDEsIC0xLCAtMSwgMSwgLTEsIC0xLCAtMSwgLTEsIDEsIC0xLCAtMV07CiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5OwogICAgICBnZW9tZXRyeS5zZXRJbmRleChuZXcgQnVmZmVyQXR0cmlidXRlKGluZGljZXMsIDEpKTsKICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9ucywgMykpOwogICAgICBzdXBlcihnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKHsgY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0pKTsKICAgICAgdGhpcy5ib3ggPSBib3g7CiAgICAgIHRoaXMudHlwZSA9ICJCb3gzSGVscGVyIjsKICAgICAgdGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKICAgIH0KICAgIHVwZGF0ZU1hdHJpeFdvcmxkKGZvcmNlKSB7CiAgICAgIGNvbnN0IGJveCA9IHRoaXMuYm94OwogICAgICBpZiAoYm94LmlzRW1wdHkoKSkKICAgICAgICByZXR1cm47CiAgICAgIGJveC5nZXRDZW50ZXIodGhpcy5wb3NpdGlvbik7CiAgICAgIGJveC5nZXRTaXplKHRoaXMuc2NhbGUpOwogICAgICB0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKDAuNSk7CiAgICAgIHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKGZvcmNlKTsKICAgIH0KICAgIGRpc3Bvc2UoKSB7CiAgICAgIHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpOwogICAgICB0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTsKICAgIH0KICB9OwogIFBsYW5lSGVscGVyID0gY2xhc3MgUGxhbmVIZWxwZXIgZXh0ZW5kcyBMaW5lIHsKICAgIGNvbnN0cnVjdG9yKHBsYW5lLCBzaXplID0gMSwgaGV4ID0gMTY3NzY5NjApIHsKICAgICAgY29uc3QgY29sb3IgPSBoZXg7CiAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IFsxLCAtMSwgMCwgLTEsIDEsIDAsIC0xLCAtMSwgMCwgMSwgMSwgMCwgLTEsIDEsIDAsIC0xLCAtMSwgMCwgMSwgLTEsIDAsIDEsIDEsIDBdOwogICAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeTsKICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9ucywgMykpOwogICAgICBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKICAgICAgc3VwZXIoZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCh7IGNvbG9yLCB0b25lTWFwcGVkOiBmYWxzZSB9KSk7CiAgICAgIHRoaXMudHlwZSA9ICJQbGFuZUhlbHBlciI7CiAgICAgIHRoaXMucGxhbmUgPSBwbGFuZTsKICAgICAgdGhpcy5zaXplID0gc2l6ZTsKICAgICAgY29uc3QgcG9zaXRpb25zMiA9IFsxLCAxLCAwLCAtMSwgMSwgMCwgLTEsIC0xLCAwLCAxLCAxLCAwLCAtMSwgLTEsIDAsIDEsIC0xLCAwXTsKICAgICAgY29uc3QgZ2VvbWV0cnkyID0gbmV3IEJ1ZmZlckdlb21ldHJ5OwogICAgICBnZW9tZXRyeTIuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uczIsIDMpKTsKICAgICAgZ2VvbWV0cnkyLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwogICAgICB0aGlzLmFkZChuZXcgTWVzaChnZW9tZXRyeTIsIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7IGNvbG9yLCBvcGFjaXR5OiAwLjIsIHRyYW5zcGFyZW50OiB0cnVlLCBkZXB0aFdyaXRlOiBmYWxzZSwgdG9uZU1hcHBlZDogZmFsc2UgfSkpKTsKICAgIH0KICAgIHVwZGF0ZU1hdHJpeFdvcmxkKGZvcmNlKSB7CiAgICAgIHRoaXMucG9zaXRpb24uc2V0KDAsIDAsIDApOwogICAgICB0aGlzLnNjYWxlLnNldCgwLjUgKiB0aGlzLnNpemUsIDAuNSAqIHRoaXMuc2l6ZSwgMSk7CiAgICAgIHRoaXMubG9va0F0KHRoaXMucGxhbmUubm9ybWFsKTsKICAgICAgdGhpcy50cmFuc2xhdGVaKC10aGlzLnBsYW5lLmNvbnN0YW50KTsKICAgICAgc3VwZXIudXBkYXRlTWF0cml4V29ybGQoZm9yY2UpOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgdGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAgIHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpOwogICAgICB0aGlzLmNoaWxkcmVuWzBdLmdlb21ldHJ5LmRpc3Bvc2UoKTsKICAgICAgdGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCk7CiAgICB9CiAgfTsKICBfYXhpcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMzsKICBBcnJvd0hlbHBlciA9IGNsYXNzIEFycm93SGVscGVyIGV4dGVuZHMgT2JqZWN0M0QgewogICAgY29uc3RydWN0b3IoZGlyID0gbmV3IFZlY3RvcjMoMCwgMCwgMSksIG9yaWdpbiA9IG5ldyBWZWN0b3IzKDAsIDAsIDApLCBsZW5ndGggPSAxLCBjb2xvciA9IDE2Nzc2OTYwLCBoZWFkTGVuZ3RoID0gbGVuZ3RoICogMC4yLCBoZWFkV2lkdGggPSBoZWFkTGVuZ3RoICogMC4yKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMudHlwZSA9ICJBcnJvd0hlbHBlciI7CiAgICAgIGlmIChfbGluZUdlb21ldHJ5ID09PSB1bmRlZmluZWQpIHsKICAgICAgICBfbGluZUdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5OwogICAgICAgIF9saW5lR2VvbWV0cnkuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKFswLCAwLCAwLCAwLCAxLCAwXSwgMykpOwogICAgICAgIF9jb25lR2VvbWV0cnkgPSBuZXcgQ3lsaW5kZXJHZW9tZXRyeSgwLCAwLjUsIDEsIDUsIDEpOwogICAgICAgIF9jb25lR2VvbWV0cnkudHJhbnNsYXRlKDAsIC0wLjUsIDApOwogICAgICB9CiAgICAgIHRoaXMucG9zaXRpb24uY29weShvcmlnaW4pOwogICAgICB0aGlzLmxpbmUgPSBuZXcgTGluZShfbGluZUdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoeyBjb2xvciwgdG9uZU1hcHBlZDogZmFsc2UgfSkpOwogICAgICB0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwogICAgICB0aGlzLmFkZCh0aGlzLmxpbmUpOwogICAgICB0aGlzLmNvbmUgPSBuZXcgTWVzaChfY29uZUdlb21ldHJ5LCBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoeyBjb2xvciwgdG9uZU1hcHBlZDogZmFsc2UgfSkpOwogICAgICB0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwogICAgICB0aGlzLmFkZCh0aGlzLmNvbmUpOwogICAgICB0aGlzLnNldERpcmVjdGlvbihkaXIpOwogICAgICB0aGlzLnNldExlbmd0aChsZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCk7CiAgICB9CiAgICBzZXREaXJlY3Rpb24oZGlyKSB7CiAgICAgIGlmIChkaXIueSA+IDAuOTk5OTkpIHsKICAgICAgICB0aGlzLnF1YXRlcm5pb24uc2V0KDAsIDAsIDAsIDEpOwogICAgICB9IGVsc2UgaWYgKGRpci55IDwgLTAuOTk5OTkpIHsKICAgICAgICB0aGlzLnF1YXRlcm5pb24uc2V0KDEsIDAsIDAsIDApOwogICAgICB9IGVsc2UgewogICAgICAgIF9heGlzLnNldChkaXIueiwgMCwgLWRpci54KS5ub3JtYWxpemUoKTsKICAgICAgICBjb25zdCByYWRpYW5zID0gTWF0aC5hY29zKGRpci55KTsKICAgICAgICB0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZShfYXhpcywgcmFkaWFucyk7CiAgICAgIH0KICAgIH0KICAgIHNldExlbmd0aChsZW5ndGgsIGhlYWRMZW5ndGggPSBsZW5ndGggKiAwLjIsIGhlYWRXaWR0aCA9IGhlYWRMZW5ndGggKiAwLjIpIHsKICAgICAgdGhpcy5saW5lLnNjYWxlLnNldCgxLCBNYXRoLm1heCgwLjAwMDEsIGxlbmd0aCAtIGhlYWRMZW5ndGgpLCAxKTsKICAgICAgdGhpcy5saW5lLnVwZGF0ZU1hdHJpeCgpOwogICAgICB0aGlzLmNvbmUuc2NhbGUuc2V0KGhlYWRXaWR0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoKTsKICAgICAgdGhpcy5jb25lLnBvc2l0aW9uLnkgPSBsZW5ndGg7CiAgICAgIHRoaXMuY29uZS51cGRhdGVNYXRyaXgoKTsKICAgIH0KICAgIHNldENvbG9yKGNvbG9yKSB7CiAgICAgIHRoaXMubGluZS5tYXRlcmlhbC5jb2xvci5zZXQoY29sb3IpOwogICAgICB0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KGNvbG9yKTsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlLCBmYWxzZSk7CiAgICAgIHRoaXMubGluZS5jb3B5KHNvdXJjZS5saW5lKTsKICAgICAgdGhpcy5jb25lLmNvcHkoc291cmNlLmNvbmUpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIGRpc3Bvc2UoKSB7CiAgICAgIHRoaXMubGluZS5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAgIHRoaXMubGluZS5tYXRlcmlhbC5kaXNwb3NlKCk7CiAgICAgIHRoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAgIHRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCk7CiAgICB9CiAgfTsKICBBeGVzSGVscGVyID0gY2xhc3MgQXhlc0hlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7CiAgICBjb25zdHJ1Y3RvcihzaXplID0gMSkgewogICAgICBjb25zdCB2ZXJ0aWNlcyA9IFsKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICBzaXplLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIHNpemUsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgc2l6ZQogICAgICBdOwogICAgICBjb25zdCBjb2xvcnMgPSBbCiAgICAgICAgMSwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMSwKICAgICAgICAwLjYsCiAgICAgICAgMCwKICAgICAgICAwLAogICAgICAgIDEsCiAgICAgICAgMCwKICAgICAgICAwLjYsCiAgICAgICAgMSwKICAgICAgICAwLAogICAgICAgIDAsCiAgICAgICAgMCwKICAgICAgICAxLAogICAgICAgIDAsCiAgICAgICAgMC42LAogICAgICAgIDEKICAgICAgXTsKICAgICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnk7CiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh2ZXJ0aWNlcywgMykpOwogICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoImNvbG9yIiwgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoY29sb3JzLCAzKSk7CiAgICAgIGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKHsgdmVydGV4Q29sb3JzOiB0cnVlLCB0b25lTWFwcGVkOiBmYWxzZSB9KTsKICAgICAgc3VwZXIoZ2VvbWV0cnksIG1hdGVyaWFsKTsKICAgICAgdGhpcy50eXBlID0gIkF4ZXNIZWxwZXIiOwogICAgfQogICAgc2V0Q29sb3JzKHhBeGlzQ29sb3IsIHlBeGlzQ29sb3IsIHpBeGlzQ29sb3IpIHsKICAgICAgY29uc3QgY29sb3IgPSBuZXcgQ29sb3I7CiAgICAgIGNvbnN0IGFycmF5ID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yLmFycmF5OwogICAgICBjb2xvci5zZXQoeEF4aXNDb2xvcik7CiAgICAgIGNvbG9yLnRvQXJyYXkoYXJyYXksIDApOwogICAgICBjb2xvci50b0FycmF5KGFycmF5LCAzKTsKICAgICAgY29sb3Iuc2V0KHlBeGlzQ29sb3IpOwogICAgICBjb2xvci50b0FycmF5KGFycmF5LCA2KTsKICAgICAgY29sb3IudG9BcnJheShhcnJheSwgOSk7CiAgICAgIGNvbG9yLnNldCh6QXhpc0NvbG9yKTsKICAgICAgY29sb3IudG9BcnJheShhcnJheSwgMTIpOwogICAgICBjb2xvci50b0FycmF5KGFycmF5LCAxNSk7CiAgICAgIHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgdGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAgIHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpOwogICAgfQogIH07CiAgQ29udHJvbHMgPSBjbGFzcyBDb250cm9scyBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7CiAgICBjb25zdHJ1Y3RvcihvYmplY3QsIGRvbUVsZW1lbnQgPSBudWxsKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwogICAgICB0aGlzLmRvbUVsZW1lbnQgPSBkb21FbGVtZW50OwogICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlOwogICAgICB0aGlzLnN0YXRlID0gLTE7CiAgICAgIHRoaXMua2V5cyA9IHt9OwogICAgICB0aGlzLm1vdXNlQnV0dG9ucyA9IHsgTEVGVDogbnVsbCwgTUlERExFOiBudWxsLCBSSUdIVDogbnVsbCB9OwogICAgICB0aGlzLnRvdWNoZXMgPSB7IE9ORTogbnVsbCwgVFdPOiBudWxsIH07CiAgICB9CiAgICBjb25uZWN0KCkge30KICAgIGRpc2Nvbm5lY3QoKSB7fQogICAgZGlzcG9zZSgpIHt9CiAgICB1cGRhdGUoKSB7fQogIH07CiAgVGV4dHVyZVV0aWxzID0gewogICAgY29udGFpbiwKICAgIGNvdmVyLAogICAgZmlsbCwKICAgIGdldEJ5dGVMZW5ndGgKICB9OwogIGlmICh0eXBlb2YgX19USFJFRV9ERVZUT09MU19fICE9PSAidW5kZWZpbmVkIikgewogICAgX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJyZWdpc3RlciIsIHsgZGV0YWlsOiB7CiAgICAgIHJldmlzaW9uOiBSRVZJU0lPTgogICAgfSB9KSk7CiAgfQogIGlmICh0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIikgewogICAgaWYgKHdpbmRvdy5fX1RIUkVFX18pIHsKICAgICAgY29uc29sZS53YXJuKCJXQVJOSU5HOiBNdWx0aXBsZSBpbnN0YW5jZXMgb2YgVGhyZWUuanMgYmVpbmcgaW1wb3J0ZWQuIik7CiAgICB9IGVsc2UgewogICAgICB3aW5kb3cuX19USFJFRV9fID0gUkVWSVNJT047CiAgICB9CiAgfQp9KTsKCi8vIG5vZGVfbW9kdWxlcy90aHJlZS9idWlsZC90aHJlZS5tb2R1bGUuanMKdmFyIGV4cG9ydHNfdGhyZWVfbW9kdWxlID0ge307Cl9fZXhwb3J0KGV4cG9ydHNfdGhyZWVfbW9kdWxlLCB7CiAgY3JlYXRlQ2FudmFzRWxlbWVudDogKCkgPT4gY3JlYXRlQ2FudmFzRWxlbWVudCwKICBaZXJvU3RlbmNpbE9wOiAoKSA9PiBaZXJvU3RlbmNpbE9wLAogIFplcm9TbG9wZUVuZGluZzogKCkgPT4gWmVyb1Nsb3BlRW5kaW5nLAogIFplcm9GYWN0b3I6ICgpID0+IFplcm9GYWN0b3IsCiAgWmVyb0N1cnZhdHVyZUVuZGluZzogKCkgPT4gWmVyb0N1cnZhdHVyZUVuZGluZywKICBXcmFwQXJvdW5kRW5kaW5nOiAoKSA9PiBXcmFwQXJvdW5kRW5kaW5nLAogIFdpcmVmcmFtZUdlb21ldHJ5OiAoKSA9PiBXaXJlZnJhbWVHZW9tZXRyeSwKICBXZWJYUkNvbnRyb2xsZXI6ICgpID0+IFdlYlhSQ29udHJvbGxlciwKICBXZWJHUFVDb29yZGluYXRlU3lzdGVtOiAoKSA9PiBXZWJHUFVDb29yZGluYXRlU3lzdGVtLAogIFdlYkdMVXRpbHM6ICgpID0+IFdlYkdMVXRpbHMsCiAgV2ViR0xSZW5kZXJlcjogKCkgPT4gV2ViR0xSZW5kZXJlciwKICBXZWJHTFJlbmRlclRhcmdldDogKCkgPT4gV2ViR0xSZW5kZXJUYXJnZXQsCiAgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0OiAoKSA9PiBXZWJHTEN1YmVSZW5kZXJUYXJnZXQsCiAgV2ViR0xDb29yZGluYXRlU3lzdGVtOiAoKSA9PiBXZWJHTENvb3JkaW5hdGVTeXN0ZW0sCiAgV2ViR0xBcnJheVJlbmRlclRhcmdldDogKCkgPT4gV2ViR0xBcnJheVJlbmRlclRhcmdldCwKICBXZWJHTDNEUmVuZGVyVGFyZ2V0OiAoKSA9PiBXZWJHTDNEUmVuZGVyVGFyZ2V0LAogIFZpZGVvVGV4dHVyZTogKCkgPT4gVmlkZW9UZXh0dXJlLAogIFZpZGVvRnJhbWVUZXh0dXJlOiAoKSA9PiBWaWRlb0ZyYW1lVGV4dHVyZSwKICBWZWN0b3JLZXlmcmFtZVRyYWNrOiAoKSA9PiBWZWN0b3JLZXlmcmFtZVRyYWNrLAogIFZlY3RvcjQ6ICgpID0+IFZlY3RvcjQsCiAgVmVjdG9yMzogKCkgPT4gVmVjdG9yMywKICBWZWN0b3IyOiAoKSA9PiBWZWN0b3IyLAogIFZTTVNoYWRvd01hcDogKCkgPT4gVlNNU2hhZG93TWFwLAogIFVuc2lnbmVkU2hvcnRUeXBlOiAoKSA9PiBVbnNpZ25lZFNob3J0VHlwZSwKICBVbnNpZ25lZFNob3J0NTU1MVR5cGU6ICgpID0+IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSwKICBVbnNpZ25lZFNob3J0NDQ0NFR5cGU6ICgpID0+IFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSwKICBVbnNpZ25lZEludFR5cGU6ICgpID0+IFVuc2lnbmVkSW50VHlwZSwKICBVbnNpZ25lZEludDU5OTlUeXBlOiAoKSA9PiBVbnNpZ25lZEludDU5OTlUeXBlLAogIFVuc2lnbmVkSW50MjQ4VHlwZTogKCkgPT4gVW5zaWduZWRJbnQyNDhUeXBlLAogIFVuc2lnbmVkQnl0ZVR5cGU6ICgpID0+IFVuc2lnbmVkQnl0ZVR5cGUsCiAgVW5pZm9ybXNVdGlsczogKCkgPT4gVW5pZm9ybXNVdGlscywKICBVbmlmb3Jtc0xpYjogKCkgPT4gVW5pZm9ybXNMaWIsCiAgVW5pZm9ybXNHcm91cDogKCkgPT4gVW5pZm9ybXNHcm91cCwKICBVbmlmb3JtOiAoKSA9PiBVbmlmb3JtLAogIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZTogKCkgPT4gVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLAogIFVpbnQ4QnVmZmVyQXR0cmlidXRlOiAoKSA9PiBVaW50OEJ1ZmZlckF0dHJpYnV0ZSwKICBVaW50MzJCdWZmZXJBdHRyaWJ1dGU6ICgpID0+IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSwKICBVaW50MTZCdWZmZXJBdHRyaWJ1dGU6ICgpID0+IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSwKICBVVk1hcHBpbmc6ICgpID0+IFVWTWFwcGluZywKICBUdWJlR2VvbWV0cnk6ICgpID0+IFR1YmVHZW9tZXRyeSwKICBUcmlhbmdsZXNEcmF3TW9kZTogKCkgPT4gVHJpYW5nbGVzRHJhd01vZGUsCiAgVHJpYW5nbGVTdHJpcERyYXdNb2RlOiAoKSA9PiBUcmlhbmdsZVN0cmlwRHJhd01vZGUsCiAgVHJpYW5nbGVGYW5EcmF3TW9kZTogKCkgPT4gVHJpYW5nbGVGYW5EcmF3TW9kZSwKICBUcmlhbmdsZTogKCkgPT4gVHJpYW5nbGUsCiAgVG9ydXNLbm90R2VvbWV0cnk6ICgpID0+IFRvcnVzS25vdEdlb21ldHJ5LAogIFRvcnVzR2VvbWV0cnk6ICgpID0+IFRvcnVzR2VvbWV0cnksCiAgVGltZXN0YW1wUXVlcnk6ICgpID0+IFRpbWVzdGFtcFF1ZXJ5LAogIFRleHR1cmVVdGlsczogKCkgPT4gVGV4dHVyZVV0aWxzLAogIFRleHR1cmVMb2FkZXI6ICgpID0+IFRleHR1cmVMb2FkZXIsCiAgVGV4dHVyZTogKCkgPT4gVGV4dHVyZSwKICBUZXRyYWhlZHJvbkdlb21ldHJ5OiAoKSA9PiBUZXRyYWhlZHJvbkdlb21ldHJ5LAogIFRhbmdlbnRTcGFjZU5vcm1hbE1hcDogKCkgPT4gVGFuZ2VudFNwYWNlTm9ybWFsTWFwLAogIFRPVUNIOiAoKSA9PiBUT1VDSCwKICBTdWJ0cmFjdGl2ZUJsZW5kaW5nOiAoKSA9PiBTdWJ0cmFjdGl2ZUJsZW5kaW5nLAogIFN1YnRyYWN0RXF1YXRpb246ICgpID0+IFN1YnRyYWN0RXF1YXRpb24sCiAgU3RyaW5nS2V5ZnJhbWVUcmFjazogKCkgPT4gU3RyaW5nS2V5ZnJhbWVUcmFjaywKICBTdHJlYW1SZWFkVXNhZ2U6ICgpID0+IFN0cmVhbVJlYWRVc2FnZSwKICBTdHJlYW1EcmF3VXNhZ2U6ICgpID0+IFN0cmVhbURyYXdVc2FnZSwKICBTdHJlYW1Db3B5VXNhZ2U6ICgpID0+IFN0cmVhbUNvcHlVc2FnZSwKICBTdGVyZW9DYW1lcmE6ICgpID0+IFN0ZXJlb0NhbWVyYSwKICBTdGF0aWNSZWFkVXNhZ2U6ICgpID0+IFN0YXRpY1JlYWRVc2FnZSwKICBTdGF0aWNEcmF3VXNhZ2U6ICgpID0+IFN0YXRpY0RyYXdVc2FnZSwKICBTdGF0aWNDb3B5VXNhZ2U6ICgpID0+IFN0YXRpY0NvcHlVc2FnZSwKICBTcmNDb2xvckZhY3RvcjogKCkgPT4gU3JjQ29sb3JGYWN0b3IsCiAgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvcjogKCkgPT4gU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciwKICBTcmNBbHBoYUZhY3RvcjogKCkgPT4gU3JjQWxwaGFGYWN0b3IsCiAgU3ByaXRlTWF0ZXJpYWw6ICgpID0+IFNwcml0ZU1hdGVyaWFsLAogIFNwcml0ZTogKCkgPT4gU3ByaXRlLAogIFNwb3RMaWdodEhlbHBlcjogKCkgPT4gU3BvdExpZ2h0SGVscGVyLAogIFNwb3RMaWdodDogKCkgPT4gU3BvdExpZ2h0LAogIFNwbGluZUN1cnZlOiAoKSA9PiBTcGxpbmVDdXJ2ZSwKICBTcGhlcmljYWxIYXJtb25pY3MzOiAoKSA9PiBTcGhlcmljYWxIYXJtb25pY3MzLAogIFNwaGVyaWNhbDogKCkgPT4gU3BoZXJpY2FsLAogIFNwaGVyZUdlb21ldHJ5OiAoKSA9PiBTcGhlcmVHZW9tZXRyeSwKICBTcGhlcmU6ICgpID0+IFNwaGVyZSwKICBTb3VyY2U6ICgpID0+IFNvdXJjZSwKICBTa2lubmVkTWVzaDogKCkgPT4gU2tpbm5lZE1lc2gsCiAgU2tlbGV0b25IZWxwZXI6ICgpID0+IFNrZWxldG9uSGVscGVyLAogIFNrZWxldG9uOiAoKSA9PiBTa2VsZXRvbiwKICBTaG9ydFR5cGU6ICgpID0+IFNob3J0VHlwZSwKICBTaGFwZVV0aWxzOiAoKSA9PiBTaGFwZVV0aWxzLAogIFNoYXBlUGF0aDogKCkgPT4gU2hhcGVQYXRoLAogIFNoYXBlR2VvbWV0cnk6ICgpID0+IFNoYXBlR2VvbWV0cnksCiAgU2hhcGU6ICgpID0+IFNoYXBlLAogIFNoYWRvd01hdGVyaWFsOiAoKSA9PiBTaGFkb3dNYXRlcmlhbCwKICBTaGFkZXJNYXRlcmlhbDogKCkgPT4gU2hhZGVyTWF0ZXJpYWwsCiAgU2hhZGVyTGliOiAoKSA9PiBTaGFkZXJMaWIsCiAgU2hhZGVyQ2h1bms6ICgpID0+IFNoYWRlckNodW5rLAogIFNjZW5lOiAoKSA9PiBTY2VuZSwKICBTUkdCVHJhbnNmZXI6ICgpID0+IFNSR0JUcmFuc2ZlciwKICBTUkdCQ29sb3JTcGFjZTogKCkgPT4gU1JHQkNvbG9yU3BhY2UsCiAgU0lHTkVEX1JFRF9SR1RDMV9Gb3JtYXQ6ICgpID0+IFNJR05FRF9SRURfUkdUQzFfRm9ybWF0LAogIFNJR05FRF9SRURfR1JFRU5fUkdUQzJfRm9ybWF0OiAoKSA9PiBTSUdORURfUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCwKICBSaW5nR2VvbWV0cnk6ICgpID0+IFJpbmdHZW9tZXRyeSwKICBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbjogKCkgPT4gUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24sCiAgUmVwbGFjZVN0ZW5jaWxPcDogKCkgPT4gUmVwbGFjZVN0ZW5jaWxPcCwKICBSZXBlYXRXcmFwcGluZzogKCkgPT4gUmVwZWF0V3JhcHBpbmcsCiAgUmVuZGVyVGFyZ2V0QXJyYXk6ICgpID0+IFJlbmRlclRhcmdldEFycmF5LAogIFJlbmRlclRhcmdldDNEOiAoKSA9PiBSZW5kZXJUYXJnZXQzRCwKICBSZW5kZXJUYXJnZXQ6ICgpID0+IFJlbmRlclRhcmdldCwKICBSZWluaGFyZFRvbmVNYXBwaW5nOiAoKSA9PiBSZWluaGFyZFRvbmVNYXBwaW5nLAogIFJlZEludGVnZXJGb3JtYXQ6ICgpID0+IFJlZEludGVnZXJGb3JtYXQsCiAgUmVkRm9ybWF0OiAoKSA9PiBSZWRGb3JtYXQsCiAgUmVjdEFyZWFMaWdodDogKCkgPT4gUmVjdEFyZWFMaWdodCwKICBSYXljYXN0ZXI6ICgpID0+IFJheWNhc3RlciwKICBSYXk6ICgpID0+IFJheSwKICBSYXdTaGFkZXJNYXRlcmlhbDogKCkgPT4gUmF3U2hhZGVyTWF0ZXJpYWwsCiAgUkdJbnRlZ2VyRm9ybWF0OiAoKSA9PiBSR0ludGVnZXJGb3JtYXQsCiAgUkdGb3JtYXQ6ICgpID0+IFJHRm9ybWF0LAogIFJHRGVwdGhQYWNraW5nOiAoKSA9PiBSR0RlcHRoUGFja2luZywKICBSR0JfUzNUQ19EWFQxX0Zvcm1hdDogKCkgPT4gUkdCX1MzVENfRFhUMV9Gb3JtYXQsCiAgUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQ6ICgpID0+IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0LAogIFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0OiAoKSA9PiBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCwKICBSR0JfRVRDMl9Gb3JtYXQ6ICgpID0+IFJHQl9FVEMyX0Zvcm1hdCwKICBSR0JfRVRDMV9Gb3JtYXQ6ICgpID0+IFJHQl9FVEMxX0Zvcm1hdCwKICBSR0JfQlBUQ19VTlNJR05FRF9Gb3JtYXQ6ICgpID0+IFJHQl9CUFRDX1VOU0lHTkVEX0Zvcm1hdCwKICBSR0JfQlBUQ19TSUdORURfRm9ybWF0OiAoKSA9PiBSR0JfQlBUQ19TSUdORURfRm9ybWF0LAogIFJHQkludGVnZXJGb3JtYXQ6ICgpID0+IFJHQkludGVnZXJGb3JtYXQsCiAgUkdCRm9ybWF0OiAoKSA9PiBSR0JGb3JtYXQsCiAgUkdCRGVwdGhQYWNraW5nOiAoKSA9PiBSR0JEZXB0aFBhY2tpbmcsCiAgUkdCQV9TM1RDX0RYVDVfRm9ybWF0OiAoKSA9PiBSR0JBX1MzVENfRFhUNV9Gb3JtYXQsCiAgUkdCQV9TM1RDX0RYVDNfRm9ybWF0OiAoKSA9PiBSR0JBX1MzVENfRFhUM19Gb3JtYXQsCiAgUkdCQV9TM1RDX0RYVDFfRm9ybWF0OiAoKSA9PiBSR0JBX1MzVENfRFhUMV9Gb3JtYXQsCiAgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0OiAoKSA9PiBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQsCiAgUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0OiAoKSA9PiBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQsCiAgUkdCQV9FVEMyX0VBQ19Gb3JtYXQ6ICgpID0+IFJHQkFfRVRDMl9FQUNfRm9ybWF0LAogIFJHQkFfQlBUQ19Gb3JtYXQ6ICgpID0+IFJHQkFfQlBUQ19Gb3JtYXQsCiAgUkdCQV9BU1RDXzh4OF9Gb3JtYXQ6ICgpID0+IFJHQkFfQVNUQ184eDhfRm9ybWF0LAogIFJHQkFfQVNUQ184eDZfRm9ybWF0OiAoKSA9PiBSR0JBX0FTVENfOHg2X0Zvcm1hdCwKICBSR0JBX0FTVENfOHg1X0Zvcm1hdDogKCkgPT4gUkdCQV9BU1RDXzh4NV9Gb3JtYXQsCiAgUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQ6ICgpID0+IFJHQkFfQVNUQ182eDZfRm9ybWF0LAogIFJHQkFfQVNUQ182eDVfRm9ybWF0OiAoKSA9PiBSR0JBX0FTVENfNng1X0Zvcm1hdCwKICBSR0JBX0FTVENfNXg1X0Zvcm1hdDogKCkgPT4gUkdCQV9BU1RDXzV4NV9Gb3JtYXQsCiAgUkdCQV9BU1RDXzV4NF9Gb3JtYXQ6ICgpID0+IFJHQkFfQVNUQ181eDRfRm9ybWF0LAogIFJHQkFfQVNUQ180eDRfRm9ybWF0OiAoKSA9PiBSR0JBX0FTVENfNHg0X0Zvcm1hdCwKICBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0OiAoKSA9PiBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0LAogIFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQ6ICgpID0+IFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQsCiAgUkdCQV9BU1RDXzEweDhfRm9ybWF0OiAoKSA9PiBSR0JBX0FTVENfMTB4OF9Gb3JtYXQsCiAgUkdCQV9BU1RDXzEweDZfRm9ybWF0OiAoKSA9PiBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQsCiAgUkdCQV9BU1RDXzEweDVfRm9ybWF0OiAoKSA9PiBSR0JBX0FTVENfMTB4NV9Gb3JtYXQsCiAgUkdCQV9BU1RDXzEweDEwX0Zvcm1hdDogKCkgPT4gUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCwKICBSR0JBSW50ZWdlckZvcm1hdDogKCkgPT4gUkdCQUludGVnZXJGb3JtYXQsCiAgUkdCQUZvcm1hdDogKCkgPT4gUkdCQUZvcm1hdCwKICBSR0JBRGVwdGhQYWNraW5nOiAoKSA9PiBSR0JBRGVwdGhQYWNraW5nLAogIFJFVklTSU9OOiAoKSA9PiBSRVZJU0lPTiwKICBSRURfUkdUQzFfRm9ybWF0OiAoKSA9PiBSRURfUkdUQzFfRm9ybWF0LAogIFJFRF9HUkVFTl9SR1RDMl9Gb3JtYXQ6ICgpID0+IFJFRF9HUkVFTl9SR1RDMl9Gb3JtYXQsCiAgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50OiAoKSA9PiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsCiAgUXVhdGVybmlvbktleWZyYW1lVHJhY2s6ICgpID0+IFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLAogIFF1YXRlcm5pb246ICgpID0+IFF1YXRlcm5pb24sCiAgUXVhZHJhdGljQmV6aWVyQ3VydmUzOiAoKSA9PiBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMsCiAgUXVhZHJhdGljQmV6aWVyQ3VydmU6ICgpID0+IFF1YWRyYXRpY0JlemllckN1cnZlLAogIFByb3BlcnR5TWl4ZXI6ICgpID0+IFByb3BlcnR5TWl4ZXIsCiAgUHJvcGVydHlCaW5kaW5nOiAoKSA9PiBQcm9wZXJ0eUJpbmRpbmcsCiAgUG9zaXRpb25hbEF1ZGlvOiAoKSA9PiBQb3NpdGlvbmFsQXVkaW8sCiAgUG9seWhlZHJvbkdlb21ldHJ5OiAoKSA9PiBQb2x5aGVkcm9uR2VvbWV0cnksCiAgUG9sYXJHcmlkSGVscGVyOiAoKSA9PiBQb2xhckdyaWRIZWxwZXIsCiAgUG9pbnRzTWF0ZXJpYWw6ICgpID0+IFBvaW50c01hdGVyaWFsLAogIFBvaW50czogKCkgPT4gUG9pbnRzLAogIFBvaW50TGlnaHRIZWxwZXI6ICgpID0+IFBvaW50TGlnaHRIZWxwZXIsCiAgUG9pbnRMaWdodDogKCkgPT4gUG9pbnRMaWdodCwKICBQbGFuZUhlbHBlcjogKCkgPT4gUGxhbmVIZWxwZXIsCiAgUGxhbmVHZW9tZXRyeTogKCkgPT4gUGxhbmVHZW9tZXRyeSwKICBQbGFuZTogKCkgPT4gUGxhbmUsCiAgUGVyc3BlY3RpdmVDYW1lcmE6ICgpID0+IFBlcnNwZWN0aXZlQ2FtZXJhLAogIFBhdGg6ICgpID0+IFBhdGgsCiAgUE1SRU1HZW5lcmF0b3I6ICgpID0+IFBNUkVNR2VuZXJhdG9yLAogIFBDRlNvZnRTaGFkb3dNYXA6ICgpID0+IFBDRlNvZnRTaGFkb3dNYXAsCiAgUENGU2hhZG93TWFwOiAoKSA9PiBQQ0ZTaGFkb3dNYXAsCiAgT3J0aG9ncmFwaGljQ2FtZXJhOiAoKSA9PiBPcnRob2dyYXBoaWNDYW1lcmEsCiAgT25lTWludXNTcmNDb2xvckZhY3RvcjogKCkgPT4gT25lTWludXNTcmNDb2xvckZhY3RvciwKICBPbmVNaW51c1NyY0FscGhhRmFjdG9yOiAoKSA9PiBPbmVNaW51c1NyY0FscGhhRmFjdG9yLAogIE9uZU1pbnVzRHN0Q29sb3JGYWN0b3I6ICgpID0+IE9uZU1pbnVzRHN0Q29sb3JGYWN0b3IsCiAgT25lTWludXNEc3RBbHBoYUZhY3RvcjogKCkgPT4gT25lTWludXNEc3RBbHBoYUZhY3RvciwKICBPbmVNaW51c0NvbnN0YW50Q29sb3JGYWN0b3I6ICgpID0+IE9uZU1pbnVzQ29uc3RhbnRDb2xvckZhY3RvciwKICBPbmVNaW51c0NvbnN0YW50QWxwaGFGYWN0b3I6ICgpID0+IE9uZU1pbnVzQ29uc3RhbnRBbHBoYUZhY3RvciwKICBPbmVGYWN0b3I6ICgpID0+IE9uZUZhY3RvciwKICBPY3RhaGVkcm9uR2VvbWV0cnk6ICgpID0+IE9jdGFoZWRyb25HZW9tZXRyeSwKICBPYmplY3RTcGFjZU5vcm1hbE1hcDogKCkgPT4gT2JqZWN0U3BhY2VOb3JtYWxNYXAsCiAgT2JqZWN0TG9hZGVyOiAoKSA9PiBPYmplY3RMb2FkZXIsCiAgT2JqZWN0M0Q6ICgpID0+IE9iamVjdDNELAogIE51bWJlcktleWZyYW1lVHJhY2s6ICgpID0+IE51bWJlcktleWZyYW1lVHJhY2ssCiAgTm90RXF1YWxTdGVuY2lsRnVuYzogKCkgPT4gTm90RXF1YWxTdGVuY2lsRnVuYywKICBOb3RFcXVhbERlcHRoOiAoKSA9PiBOb3RFcXVhbERlcHRoLAogIE5vdEVxdWFsQ29tcGFyZTogKCkgPT4gTm90RXF1YWxDb21wYXJlLAogIE5vcm1hbEJsZW5kaW5nOiAoKSA9PiBOb3JtYWxCbGVuZGluZywKICBOb3JtYWxBbmltYXRpb25CbGVuZE1vZGU6ICgpID0+IE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZSwKICBOb1RvbmVNYXBwaW5nOiAoKSA9PiBOb1RvbmVNYXBwaW5nLAogIE5vQ29sb3JTcGFjZTogKCkgPT4gTm9Db2xvclNwYWNlLAogIE5vQmxlbmRpbmc6ICgpID0+IE5vQmxlbmRpbmcsCiAgTmV2ZXJTdGVuY2lsRnVuYzogKCkgPT4gTmV2ZXJTdGVuY2lsRnVuYywKICBOZXZlckRlcHRoOiAoKSA9PiBOZXZlckRlcHRoLAogIE5ldmVyQ29tcGFyZTogKCkgPT4gTmV2ZXJDb21wYXJlLAogIE5ldXRyYWxUb25lTWFwcGluZzogKCkgPT4gTmV1dHJhbFRvbmVNYXBwaW5nLAogIE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyOiAoKSA9PiBOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlciwKICBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOiAoKSA9PiBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyLAogIE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyOiAoKSA9PiBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciwKICBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyOiAoKSA9PiBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyLAogIE5lYXJlc3RGaWx0ZXI6ICgpID0+IE5lYXJlc3RGaWx0ZXIsCiAgTXVsdGlwbHlPcGVyYXRpb246ICgpID0+IE11bHRpcGx5T3BlcmF0aW9uLAogIE11bHRpcGx5QmxlbmRpbmc6ICgpID0+IE11bHRpcGx5QmxlbmRpbmcsCiAgTWl4T3BlcmF0aW9uOiAoKSA9PiBNaXhPcGVyYXRpb24sCiAgTWlycm9yZWRSZXBlYXRXcmFwcGluZzogKCkgPT4gTWlycm9yZWRSZXBlYXRXcmFwcGluZywKICBNaW5FcXVhdGlvbjogKCkgPT4gTWluRXF1YXRpb24sCiAgTWVzaFRvb25NYXRlcmlhbDogKCkgPT4gTWVzaFRvb25NYXRlcmlhbCwKICBNZXNoU3RhbmRhcmRNYXRlcmlhbDogKCkgPT4gTWVzaFN0YW5kYXJkTWF0ZXJpYWwsCiAgTWVzaFBoeXNpY2FsTWF0ZXJpYWw6ICgpID0+IE1lc2hQaHlzaWNhbE1hdGVyaWFsLAogIE1lc2hQaG9uZ01hdGVyaWFsOiAoKSA9PiBNZXNoUGhvbmdNYXRlcmlhbCwKICBNZXNoTm9ybWFsTWF0ZXJpYWw6ICgpID0+IE1lc2hOb3JtYWxNYXRlcmlhbCwKICBNZXNoTWF0Y2FwTWF0ZXJpYWw6ICgpID0+IE1lc2hNYXRjYXBNYXRlcmlhbCwKICBNZXNoTGFtYmVydE1hdGVyaWFsOiAoKSA9PiBNZXNoTGFtYmVydE1hdGVyaWFsLAogIE1lc2hEaXN0YW5jZU1hdGVyaWFsOiAoKSA9PiBNZXNoRGlzdGFuY2VNYXRlcmlhbCwKICBNZXNoRGVwdGhNYXRlcmlhbDogKCkgPT4gTWVzaERlcHRoTWF0ZXJpYWwsCiAgTWVzaEJhc2ljTWF0ZXJpYWw6ICgpID0+IE1lc2hCYXNpY01hdGVyaWFsLAogIE1lc2g6ICgpID0+IE1lc2gsCiAgTWF4RXF1YXRpb246ICgpID0+IE1heEVxdWF0aW9uLAogIE1hdHJpeDQ6ICgpID0+IE1hdHJpeDQsCiAgTWF0cml4MzogKCkgPT4gTWF0cml4MywKICBNYXRyaXgyOiAoKSA9PiBNYXRyaXgyLAogIE1hdGhVdGlsczogKCkgPT4gTWF0aFV0aWxzLAogIE1hdGVyaWFsTG9hZGVyOiAoKSA9PiBNYXRlcmlhbExvYWRlciwKICBNYXRlcmlhbDogKCkgPT4gTWF0ZXJpYWwsCiAgTU9VU0U6ICgpID0+IE1PVVNFLAogIEx1bWluYW5jZUZvcm1hdDogKCkgPT4gTHVtaW5hbmNlRm9ybWF0LAogIEx1bWluYW5jZUFscGhhRm9ybWF0OiAoKSA9PiBMdW1pbmFuY2VBbHBoYUZvcm1hdCwKICBMb29wUmVwZWF0OiAoKSA9PiBMb29wUmVwZWF0LAogIExvb3BQaW5nUG9uZzogKCkgPT4gTG9vcFBpbmdQb25nLAogIExvb3BPbmNlOiAoKSA9PiBMb29wT25jZSwKICBMb2FkaW5nTWFuYWdlcjogKCkgPT4gTG9hZGluZ01hbmFnZXIsCiAgTG9hZGVyVXRpbHM6ICgpID0+IExvYWRlclV0aWxzLAogIExvYWRlcjogKCkgPT4gTG9hZGVyLAogIExpbmVhclRyYW5zZmVyOiAoKSA9PiBMaW5lYXJUcmFuc2ZlciwKICBMaW5lYXJUb25lTWFwcGluZzogKCkgPT4gTGluZWFyVG9uZU1hcHBpbmcsCiAgTGluZWFyU1JHQkNvbG9yU3BhY2U6ICgpID0+IExpbmVhclNSR0JDb2xvclNwYWNlLAogIExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6ICgpID0+IExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIsCiAgTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOiAoKSA9PiBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIsCiAgTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlcjogKCkgPT4gTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciwKICBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI6ICgpID0+IExpbmVhck1pcE1hcExpbmVhckZpbHRlciwKICBMaW5lYXJJbnRlcnBvbGFudDogKCkgPT4gTGluZWFySW50ZXJwb2xhbnQsCiAgTGluZWFyRmlsdGVyOiAoKSA9PiBMaW5lYXJGaWx0ZXIsCiAgTGluZVNlZ21lbnRzOiAoKSA9PiBMaW5lU2VnbWVudHMsCiAgTGluZUxvb3A6ICgpID0+IExpbmVMb29wLAogIExpbmVEYXNoZWRNYXRlcmlhbDogKCkgPT4gTGluZURhc2hlZE1hdGVyaWFsLAogIExpbmVDdXJ2ZTM6ICgpID0+IExpbmVDdXJ2ZTMsCiAgTGluZUN1cnZlOiAoKSA9PiBMaW5lQ3VydmUsCiAgTGluZUJhc2ljTWF0ZXJpYWw6ICgpID0+IExpbmVCYXNpY01hdGVyaWFsLAogIExpbmUzOiAoKSA9PiBMaW5lMywKICBMaW5lOiAoKSA9PiBMaW5lLAogIExpZ2h0UHJvYmU6ICgpID0+IExpZ2h0UHJvYmUsCiAgTGlnaHQ6ICgpID0+IExpZ2h0LAogIExlc3NTdGVuY2lsRnVuYzogKCkgPT4gTGVzc1N0ZW5jaWxGdW5jLAogIExlc3NFcXVhbFN0ZW5jaWxGdW5jOiAoKSA9PiBMZXNzRXF1YWxTdGVuY2lsRnVuYywKICBMZXNzRXF1YWxEZXB0aDogKCkgPT4gTGVzc0VxdWFsRGVwdGgsCiAgTGVzc0VxdWFsQ29tcGFyZTogKCkgPT4gTGVzc0VxdWFsQ29tcGFyZSwKICBMZXNzRGVwdGg6ICgpID0+IExlc3NEZXB0aCwKICBMZXNzQ29tcGFyZTogKCkgPT4gTGVzc0NvbXBhcmUsCiAgTGF5ZXJzOiAoKSA9PiBMYXllcnMsCiAgTGF0aGVHZW9tZXRyeTogKCkgPT4gTGF0aGVHZW9tZXRyeSwKICBMT0Q6ICgpID0+IExPRCwKICBLZXlmcmFtZVRyYWNrOiAoKSA9PiBLZXlmcmFtZVRyYWNrLAogIEtlZXBTdGVuY2lsT3A6ICgpID0+IEtlZXBTdGVuY2lsT3AsCiAgSW52ZXJ0U3RlbmNpbE9wOiAoKSA9PiBJbnZlcnRTdGVuY2lsT3AsCiAgSW50ZXJwb2xhdGVTbW9vdGg6ICgpID0+IEludGVycG9sYXRlU21vb3RoLAogIEludGVycG9sYXRlTGluZWFyOiAoKSA9PiBJbnRlcnBvbGF0ZUxpbmVhciwKICBJbnRlcnBvbGF0ZURpc2NyZXRlOiAoKSA9PiBJbnRlcnBvbGF0ZURpc2NyZXRlLAogIEludGVycG9sYW50OiAoKSA9PiBJbnRlcnBvbGFudCwKICBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZTogKCkgPT4gSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUsCiAgSW50ZXJsZWF2ZWRCdWZmZXI6ICgpID0+IEludGVybGVhdmVkQnVmZmVyLAogIEludFR5cGU6ICgpID0+IEludFR5cGUsCiAgSW50OEJ1ZmZlckF0dHJpYnV0ZTogKCkgPT4gSW50OEJ1ZmZlckF0dHJpYnV0ZSwKICBJbnQzMkJ1ZmZlckF0dHJpYnV0ZTogKCkgPT4gSW50MzJCdWZmZXJBdHRyaWJ1dGUsCiAgSW50MTZCdWZmZXJBdHRyaWJ1dGU6ICgpID0+IEludDE2QnVmZmVyQXR0cmlidXRlLAogIEluc3RhbmNlZE1lc2g6ICgpID0+IEluc3RhbmNlZE1lc2gsCiAgSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI6ICgpID0+IEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLAogIEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OiAoKSA9PiBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSwKICBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6ICgpID0+IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSwKICBJbmNyZW1lbnRXcmFwU3RlbmNpbE9wOiAoKSA9PiBJbmNyZW1lbnRXcmFwU3RlbmNpbE9wLAogIEluY3JlbWVudFN0ZW5jaWxPcDogKCkgPT4gSW5jcmVtZW50U3RlbmNpbE9wLAogIEltYWdlVXRpbHM6ICgpID0+IEltYWdlVXRpbHMsCiAgSW1hZ2VMb2FkZXI6ICgpID0+IEltYWdlTG9hZGVyLAogIEltYWdlQml0bWFwTG9hZGVyOiAoKSA9PiBJbWFnZUJpdG1hcExvYWRlciwKICBJY29zYWhlZHJvbkdlb21ldHJ5OiAoKSA9PiBJY29zYWhlZHJvbkdlb21ldHJ5LAogIEhlbWlzcGhlcmVMaWdodEhlbHBlcjogKCkgPT4gSGVtaXNwaGVyZUxpZ2h0SGVscGVyLAogIEhlbWlzcGhlcmVMaWdodDogKCkgPT4gSGVtaXNwaGVyZUxpZ2h0LAogIEhhbGZGbG9hdFR5cGU6ICgpID0+IEhhbGZGbG9hdFR5cGUsCiAgR3JvdXA6ICgpID0+IEdyb3VwLAogIEdyaWRIZWxwZXI6ICgpID0+IEdyaWRIZWxwZXIsCiAgR3JlYXRlclN0ZW5jaWxGdW5jOiAoKSA9PiBHcmVhdGVyU3RlbmNpbEZ1bmMsCiAgR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmM6ICgpID0+IEdyZWF0ZXJFcXVhbFN0ZW5jaWxGdW5jLAogIEdyZWF0ZXJFcXVhbERlcHRoOiAoKSA9PiBHcmVhdGVyRXF1YWxEZXB0aCwKICBHcmVhdGVyRXF1YWxDb21wYXJlOiAoKSA9PiBHcmVhdGVyRXF1YWxDb21wYXJlLAogIEdyZWF0ZXJEZXB0aDogKCkgPT4gR3JlYXRlckRlcHRoLAogIEdyZWF0ZXJDb21wYXJlOiAoKSA9PiBHcmVhdGVyQ29tcGFyZSwKICBHTFNMMzogKCkgPT4gR0xTTDMsCiAgR0xTTDE6ICgpID0+IEdMU0wxLAogIEdMQnVmZmVyQXR0cmlidXRlOiAoKSA9PiBHTEJ1ZmZlckF0dHJpYnV0ZSwKICBGcnVzdHVtOiAoKSA9PiBGcnVzdHVtLAogIEZyb250U2lkZTogKCkgPT4gRnJvbnRTaWRlLAogIEZyYW1lYnVmZmVyVGV4dHVyZTogKCkgPT4gRnJhbWVidWZmZXJUZXh0dXJlLAogIEZvZ0V4cDI6ICgpID0+IEZvZ0V4cDIsCiAgRm9nOiAoKSA9PiBGb2csCiAgRmxvYXRUeXBlOiAoKSA9PiBGbG9hdFR5cGUsCiAgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTogKCkgPT4gRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSwKICBGbG9hdDE2QnVmZmVyQXR0cmlidXRlOiAoKSA9PiBGbG9hdDE2QnVmZmVyQXR0cmlidXRlLAogIEZpbGVMb2FkZXI6ICgpID0+IEZpbGVMb2FkZXIsCiAgRXh0cnVkZUdlb21ldHJ5OiAoKSA9PiBFeHRydWRlR2VvbWV0cnksCiAgRXZlbnREaXNwYXRjaGVyOiAoKSA9PiBFdmVudERpc3BhdGNoZXIsCiAgRXVsZXI6ICgpID0+IEV1bGVyLAogIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOiAoKSA9PiBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZywKICBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzogKCkgPT4gRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsCiAgRXF1YWxTdGVuY2lsRnVuYzogKCkgPT4gRXF1YWxTdGVuY2lsRnVuYywKICBFcXVhbERlcHRoOiAoKSA9PiBFcXVhbERlcHRoLAogIEVxdWFsQ29tcGFyZTogKCkgPT4gRXF1YWxDb21wYXJlLAogIEVsbGlwc2VDdXJ2ZTogKCkgPT4gRWxsaXBzZUN1cnZlLAogIEVkZ2VzR2VvbWV0cnk6ICgpID0+IEVkZ2VzR2VvbWV0cnksCiAgRHluYW1pY1JlYWRVc2FnZTogKCkgPT4gRHluYW1pY1JlYWRVc2FnZSwKICBEeW5hbWljRHJhd1VzYWdlOiAoKSA9PiBEeW5hbWljRHJhd1VzYWdlLAogIER5bmFtaWNDb3B5VXNhZ2U6ICgpID0+IER5bmFtaWNDb3B5VXNhZ2UsCiAgRHN0Q29sb3JGYWN0b3I6ICgpID0+IERzdENvbG9yRmFjdG9yLAogIERzdEFscGhhRmFjdG9yOiAoKSA9PiBEc3RBbHBoYUZhY3RvciwKICBEb3VibGVTaWRlOiAoKSA9PiBEb3VibGVTaWRlLAogIERvZGVjYWhlZHJvbkdlb21ldHJ5OiAoKSA9PiBEb2RlY2FoZWRyb25HZW9tZXRyeSwKICBEaXNjcmV0ZUludGVycG9sYW50OiAoKSA9PiBEaXNjcmV0ZUludGVycG9sYW50LAogIERpcmVjdGlvbmFsTGlnaHRIZWxwZXI6ICgpID0+IERpcmVjdGlvbmFsTGlnaHRIZWxwZXIsCiAgRGlyZWN0aW9uYWxMaWdodDogKCkgPT4gRGlyZWN0aW9uYWxMaWdodCwKICBEZXRhY2hlZEJpbmRNb2RlOiAoKSA9PiBEZXRhY2hlZEJpbmRNb2RlLAogIERlcHRoVGV4dHVyZTogKCkgPT4gRGVwdGhUZXh0dXJlLAogIERlcHRoU3RlbmNpbEZvcm1hdDogKCkgPT4gRGVwdGhTdGVuY2lsRm9ybWF0LAogIERlcHRoRm9ybWF0OiAoKSA9PiBEZXB0aEZvcm1hdCwKICBEZWZhdWx0TG9hZGluZ01hbmFnZXI6ICgpID0+IERlZmF1bHRMb2FkaW5nTWFuYWdlciwKICBEZWNyZW1lbnRXcmFwU3RlbmNpbE9wOiAoKSA9PiBEZWNyZW1lbnRXcmFwU3RlbmNpbE9wLAogIERlY3JlbWVudFN0ZW5jaWxPcDogKCkgPT4gRGVjcmVtZW50U3RlbmNpbE9wLAogIERhdGFVdGlsczogKCkgPT4gRGF0YVV0aWxzLAogIERhdGFUZXh0dXJlTG9hZGVyOiAoKSA9PiBEYXRhVGV4dHVyZUxvYWRlciwKICBEYXRhVGV4dHVyZTogKCkgPT4gRGF0YVRleHR1cmUsCiAgRGF0YUFycmF5VGV4dHVyZTogKCkgPT4gRGF0YUFycmF5VGV4dHVyZSwKICBEYXRhM0RUZXh0dXJlOiAoKSA9PiBEYXRhM0RUZXh0dXJlLAogIEN5bGluZHJpY2FsOiAoKSA9PiBDeWxpbmRyaWNhbCwKICBDeWxpbmRlckdlb21ldHJ5OiAoKSA9PiBDeWxpbmRlckdlb21ldHJ5LAogIEN1c3RvbVRvbmVNYXBwaW5nOiAoKSA9PiBDdXN0b21Ub25lTWFwcGluZywKICBDdXN0b21CbGVuZGluZzogKCkgPT4gQ3VzdG9tQmxlbmRpbmcsCiAgQ3VydmVQYXRoOiAoKSA9PiBDdXJ2ZVBhdGgsCiAgQ3VydmU6ICgpID0+IEN1cnZlLAogIEN1bGxGYWNlTm9uZTogKCkgPT4gQ3VsbEZhY2VOb25lLAogIEN1bGxGYWNlRnJvbnRCYWNrOiAoKSA9PiBDdWxsRmFjZUZyb250QmFjaywKICBDdWxsRmFjZUZyb250OiAoKSA9PiBDdWxsRmFjZUZyb250LAogIEN1bGxGYWNlQmFjazogKCkgPT4gQ3VsbEZhY2VCYWNrLAogIEN1YmljSW50ZXJwb2xhbnQ6ICgpID0+IEN1YmljSW50ZXJwb2xhbnQsCiAgQ3ViaWNCZXppZXJDdXJ2ZTM6ICgpID0+IEN1YmljQmV6aWVyQ3VydmUzLAogIEN1YmljQmV6aWVyQ3VydmU6ICgpID0+IEN1YmljQmV6aWVyQ3VydmUsCiAgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6ICgpID0+IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLAogIEN1YmVUZXh0dXJlTG9hZGVyOiAoKSA9PiBDdWJlVGV4dHVyZUxvYWRlciwKICBDdWJlVGV4dHVyZTogKCkgPT4gQ3ViZVRleHR1cmUsCiAgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOiAoKSA9PiBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsCiAgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOiAoKSA9PiBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsCiAgQ3ViZUNhbWVyYTogKCkgPT4gQ3ViZUNhbWVyYSwKICBDb250cm9sczogKCkgPT4gQ29udHJvbHMsCiAgQ29uc3RhbnRDb2xvckZhY3RvcjogKCkgPT4gQ29uc3RhbnRDb2xvckZhY3RvciwKICBDb25zdGFudEFscGhhRmFjdG9yOiAoKSA9PiBDb25zdGFudEFscGhhRmFjdG9yLAogIENvbmVHZW9tZXRyeTogKCkgPT4gQ29uZUdlb21ldHJ5LAogIENvbXByZXNzZWRUZXh0dXJlTG9hZGVyOiAoKSA9PiBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciwKICBDb21wcmVzc2VkVGV4dHVyZTogKCkgPT4gQ29tcHJlc3NlZFRleHR1cmUsCiAgQ29tcHJlc3NlZEN1YmVUZXh0dXJlOiAoKSA9PiBDb21wcmVzc2VkQ3ViZVRleHR1cmUsCiAgQ29tcHJlc3NlZEFycmF5VGV4dHVyZTogKCkgPT4gQ29tcHJlc3NlZEFycmF5VGV4dHVyZSwKICBDb2xvck1hbmFnZW1lbnQ6ICgpID0+IENvbG9yTWFuYWdlbWVudCwKICBDb2xvcktleWZyYW1lVHJhY2s6ICgpID0+IENvbG9yS2V5ZnJhbWVUcmFjaywKICBDb2xvcjogKCkgPT4gQ29sb3IsCiAgQ2xvY2s6ICgpID0+IENsb2NrLAogIENsYW1wVG9FZGdlV3JhcHBpbmc6ICgpID0+IENsYW1wVG9FZGdlV3JhcHBpbmcsCiAgQ2lyY2xlR2VvbWV0cnk6ICgpID0+IENpcmNsZUdlb21ldHJ5LAogIENpbmVvblRvbmVNYXBwaW5nOiAoKSA9PiBDaW5lb25Ub25lTWFwcGluZywKICBDYXRtdWxsUm9tQ3VydmUzOiAoKSA9PiBDYXRtdWxsUm9tQ3VydmUzLAogIENhcHN1bGVHZW9tZXRyeTogKCkgPT4gQ2Fwc3VsZUdlb21ldHJ5LAogIENhbnZhc1RleHR1cmU6ICgpID0+IENhbnZhc1RleHR1cmUsCiAgQ2FtZXJhSGVscGVyOiAoKSA9PiBDYW1lcmFIZWxwZXIsCiAgQ2FtZXJhOiAoKSA9PiBDYW1lcmEsCiAgQ2FjaGU6ICgpID0+IENhY2hlLAogIEJ5dGVUeXBlOiAoKSA9PiBCeXRlVHlwZSwKICBCdWZmZXJHZW9tZXRyeUxvYWRlcjogKCkgPT4gQnVmZmVyR2VvbWV0cnlMb2FkZXIsCiAgQnVmZmVyR2VvbWV0cnk6ICgpID0+IEJ1ZmZlckdlb21ldHJ5LAogIEJ1ZmZlckF0dHJpYnV0ZTogKCkgPT4gQnVmZmVyQXR0cmlidXRlLAogIEJveEhlbHBlcjogKCkgPT4gQm94SGVscGVyLAogIEJveEdlb21ldHJ5OiAoKSA9PiBCb3hHZW9tZXRyeSwKICBCb3gzSGVscGVyOiAoKSA9PiBCb3gzSGVscGVyLAogIEJveDM6ICgpID0+IEJveDMsCiAgQm94MjogKCkgPT4gQm94MiwKICBCb29sZWFuS2V5ZnJhbWVUcmFjazogKCkgPT4gQm9vbGVhbktleWZyYW1lVHJhY2ssCiAgQm9uZTogKCkgPT4gQm9uZSwKICBCYXRjaGVkTWVzaDogKCkgPT4gQmF0Y2hlZE1lc2gsCiAgQmFzaWNTaGFkb3dNYXA6ICgpID0+IEJhc2ljU2hhZG93TWFwLAogIEJhc2ljRGVwdGhQYWNraW5nOiAoKSA9PiBCYXNpY0RlcHRoUGFja2luZywKICBCYWNrU2lkZTogKCkgPT4gQmFja1NpZGUsCiAgQXhlc0hlbHBlcjogKCkgPT4gQXhlc0hlbHBlciwKICBBdWRpb0xvYWRlcjogKCkgPT4gQXVkaW9Mb2FkZXIsCiAgQXVkaW9MaXN0ZW5lcjogKCkgPT4gQXVkaW9MaXN0ZW5lciwKICBBdWRpb0NvbnRleHQ6ICgpID0+IEF1ZGlvQ29udGV4dCwKICBBdWRpb0FuYWx5c2VyOiAoKSA9PiBBdWRpb0FuYWx5c2VyLAogIEF1ZGlvOiAoKSA9PiBBdWRpbywKICBBdHRhY2hlZEJpbmRNb2RlOiAoKSA9PiBBdHRhY2hlZEJpbmRNb2RlLAogIEFycm93SGVscGVyOiAoKSA9PiBBcnJvd0hlbHBlciwKICBBcnJheUNhbWVyYTogKCkgPT4gQXJyYXlDYW1lcmEsCiAgQXJjQ3VydmU6ICgpID0+IEFyY0N1cnZlLAogIEFuaW1hdGlvblV0aWxzOiAoKSA9PiBBbmltYXRpb25VdGlscywKICBBbmltYXRpb25PYmplY3RHcm91cDogKCkgPT4gQW5pbWF0aW9uT2JqZWN0R3JvdXAsCiAgQW5pbWF0aW9uTWl4ZXI6ICgpID0+IEFuaW1hdGlvbk1peGVyLAogIEFuaW1hdGlvbkxvYWRlcjogKCkgPT4gQW5pbWF0aW9uTG9hZGVyLAogIEFuaW1hdGlvbkNsaXA6ICgpID0+IEFuaW1hdGlvbkNsaXAsCiAgQW5pbWF0aW9uQWN0aW9uOiAoKSA9PiBBbmltYXRpb25BY3Rpb24sCiAgQW1iaWVudExpZ2h0OiAoKSA9PiBBbWJpZW50TGlnaHQsCiAgQWx3YXlzU3RlbmNpbEZ1bmM6ICgpID0+IEFsd2F5c1N0ZW5jaWxGdW5jLAogIEFsd2F5c0RlcHRoOiAoKSA9PiBBbHdheXNEZXB0aCwKICBBbHdheXNDb21wYXJlOiAoKSA9PiBBbHdheXNDb21wYXJlLAogIEFscGhhRm9ybWF0OiAoKSA9PiBBbHBoYUZvcm1hdCwKICBBZ1hUb25lTWFwcGluZzogKCkgPT4gQWdYVG9uZU1hcHBpbmcsCiAgQWRkaXRpdmVCbGVuZGluZzogKCkgPT4gQWRkaXRpdmVCbGVuZGluZywKICBBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZTogKCkgPT4gQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGUsCiAgQWRkT3BlcmF0aW9uOiAoKSA9PiBBZGRPcGVyYXRpb24sCiAgQWRkRXF1YXRpb246ICgpID0+IEFkZEVxdWF0aW9uLAogIEFDRVNGaWxtaWNUb25lTWFwcGluZzogKCkgPT4gQUNFU0ZpbG1pY1RvbmVNYXBwaW5nCn0pOwpmdW5jdGlvbiBXZWJHTEFuaW1hdGlvbigpIHsKICBsZXQgY29udGV4dCA9IG51bGw7CiAgbGV0IGlzQW5pbWF0aW5nID0gZmFsc2U7CiAgbGV0IGFuaW1hdGlvbkxvb3AgPSBudWxsOwogIGxldCByZXF1ZXN0SWQgPSBudWxsOwogIGZ1bmN0aW9uIG9uQW5pbWF0aW9uRnJhbWUodGltZSwgZnJhbWUpIHsKICAgIGFuaW1hdGlvbkxvb3AodGltZSwgZnJhbWUpOwogICAgcmVxdWVzdElkID0gY29udGV4dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUob25BbmltYXRpb25GcmFtZSk7CiAgfQogIHJldHVybiB7CiAgICBzdGFydDogZnVuY3Rpb24oKSB7CiAgICAgIGlmIChpc0FuaW1hdGluZyA9PT0gdHJ1ZSkKICAgICAgICByZXR1cm47CiAgICAgIGlmIChhbmltYXRpb25Mb29wID09PSBudWxsKQogICAgICAgIHJldHVybjsKICAgICAgcmVxdWVzdElkID0gY29udGV4dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUob25BbmltYXRpb25GcmFtZSk7CiAgICAgIGlzQW5pbWF0aW5nID0gdHJ1ZTsKICAgIH0sCiAgICBzdG9wOiBmdW5jdGlvbigpIHsKICAgICAgY29udGV4dC5jYW5jZWxBbmltYXRpb25GcmFtZShyZXF1ZXN0SWQpOwogICAgICBpc0FuaW1hdGluZyA9IGZhbHNlOwogICAgfSwKICAgIHNldEFuaW1hdGlvbkxvb3A6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgIGFuaW1hdGlvbkxvb3AgPSBjYWxsYmFjazsKICAgIH0sCiAgICBzZXRDb250ZXh0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICBjb250ZXh0ID0gdmFsdWU7CiAgICB9CiAgfTsKfQpmdW5jdGlvbiBXZWJHTEF0dHJpYnV0ZXMoZ2wpIHsKICBjb25zdCBidWZmZXJzID0gbmV3IFdlYWtNYXA7CiAgZnVuY3Rpb24gY3JlYXRlQnVmZmVyKGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSkgewogICAgY29uc3QgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7CiAgICBjb25zdCB1c2FnZSA9IGF0dHJpYnV0ZS51c2FnZTsKICAgIGNvbnN0IHNpemUgPSBhcnJheS5ieXRlTGVuZ3RoOwogICAgY29uc3QgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiAgICBnbC5iaW5kQnVmZmVyKGJ1ZmZlclR5cGUsIGJ1ZmZlcik7CiAgICBnbC5idWZmZXJEYXRhKGJ1ZmZlclR5cGUsIGFycmF5LCB1c2FnZSk7CiAgICBhdHRyaWJ1dGUub25VcGxvYWRDYWxsYmFjaygpOwogICAgbGV0IHR5cGU7CiAgICBpZiAoYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpIHsKICAgICAgdHlwZSA9IGdsLkZMT0FUOwogICAgfSBlbHNlIGlmIChhcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KSB7CiAgICAgIGlmIChhdHRyaWJ1dGUuaXNGbG9hdDE2QnVmZmVyQXR0cmlidXRlKSB7CiAgICAgICAgdHlwZSA9IGdsLkhBTEZfRkxPQVQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHlwZSA9IGdsLlVOU0lHTkVEX1NIT1JUOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGFycmF5IGluc3RhbmNlb2YgSW50MTZBcnJheSkgewogICAgICB0eXBlID0gZ2wuU0hPUlQ7CiAgICB9IGVsc2UgaWYgKGFycmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHsKICAgICAgdHlwZSA9IGdsLlVOU0lHTkVEX0lOVDsKICAgIH0gZWxzZSBpZiAoYXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5KSB7CiAgICAgIHR5cGUgPSBnbC5JTlQ7CiAgICB9IGVsc2UgaWYgKGFycmF5IGluc3RhbmNlb2YgSW50OEFycmF5KSB7CiAgICAgIHR5cGUgPSBnbC5CWVRFOwogICAgfSBlbHNlIGlmIChhcnJheSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKICAgICAgdHlwZSA9IGdsLlVOU0lHTkVEX0JZVEU7CiAgICB9IGVsc2UgaWYgKGFycmF5IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpIHsKICAgICAgdHlwZSA9IGdsLlVOU0lHTkVEX0JZVEU7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgYnVmZmVyIGRhdGEgZm9ybWF0OiAiICsgYXJyYXkpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgYnVmZmVyLAogICAgICB0eXBlLAogICAgICBieXRlc1BlckVsZW1lbnQ6IGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULAogICAgICB2ZXJzaW9uOiBhdHRyaWJ1dGUudmVyc2lvbiwKICAgICAgc2l6ZQogICAgfTsKICB9CiAgZnVuY3Rpb24gdXBkYXRlQnVmZmVyKGJ1ZmZlciwgYXR0cmlidXRlLCBidWZmZXJUeXBlKSB7CiAgICBjb25zdCBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTsKICAgIGNvbnN0IHVwZGF0ZVJhbmdlcyA9IGF0dHJpYnV0ZS51cGRhdGVSYW5nZXM7CiAgICBnbC5iaW5kQnVmZmVyKGJ1ZmZlclR5cGUsIGJ1ZmZlcik7CiAgICBpZiAodXBkYXRlUmFuZ2VzLmxlbmd0aCA9PT0gMCkgewogICAgICBnbC5idWZmZXJTdWJEYXRhKGJ1ZmZlclR5cGUsIDAsIGFycmF5KTsKICAgIH0gZWxzZSB7CiAgICAgIHVwZGF0ZVJhbmdlcy5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0IC0gYi5zdGFydCk7CiAgICAgIGxldCBtZXJnZUluZGV4ID0gMDsKICAgICAgZm9yIChsZXQgaSA9IDE7aSA8IHVwZGF0ZVJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNvbnN0IHByZXZpb3VzUmFuZ2UgPSB1cGRhdGVSYW5nZXNbbWVyZ2VJbmRleF07CiAgICAgICAgY29uc3QgcmFuZ2UgPSB1cGRhdGVSYW5nZXNbaV07CiAgICAgICAgaWYgKHJhbmdlLnN0YXJ0IDw9IHByZXZpb3VzUmFuZ2Uuc3RhcnQgKyBwcmV2aW91c1JhbmdlLmNvdW50ICsgMSkgewogICAgICAgICAgcHJldmlvdXNSYW5nZS5jb3VudCA9IE1hdGgubWF4KHByZXZpb3VzUmFuZ2UuY291bnQsIHJhbmdlLnN0YXJ0ICsgcmFuZ2UuY291bnQgLSBwcmV2aW91c1JhbmdlLnN0YXJ0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgKyttZXJnZUluZGV4OwogICAgICAgICAgdXBkYXRlUmFuZ2VzW21lcmdlSW5kZXhdID0gcmFuZ2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHVwZGF0ZVJhbmdlcy5sZW5ndGggPSBtZXJnZUluZGV4ICsgMTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB1cGRhdGVSYW5nZXMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICBjb25zdCByYW5nZSA9IHVwZGF0ZVJhbmdlc1tpXTsKICAgICAgICBnbC5idWZmZXJTdWJEYXRhKGJ1ZmZlclR5cGUsIHJhbmdlLnN0YXJ0ICogYXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIGFycmF5LCByYW5nZS5zdGFydCwgcmFuZ2UuY291bnQpOwogICAgICB9CiAgICAgIGF0dHJpYnV0ZS5jbGVhclVwZGF0ZVJhbmdlcygpOwogICAgfQogICAgYXR0cmlidXRlLm9uVXBsb2FkQ2FsbGJhY2soKTsKICB9CiAgZnVuY3Rpb24gZ2V0KGF0dHJpYnV0ZSkgewogICAgaWYgKGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKQogICAgICBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTsKICAgIHJldHVybiBidWZmZXJzLmdldChhdHRyaWJ1dGUpOwogIH0KICBmdW5jdGlvbiByZW1vdmUoYXR0cmlidXRlKSB7CiAgICBpZiAoYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpCiAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhOwogICAgY29uc3QgZGF0YSA9IGJ1ZmZlcnMuZ2V0KGF0dHJpYnV0ZSk7CiAgICBpZiAoZGF0YSkgewogICAgICBnbC5kZWxldGVCdWZmZXIoZGF0YS5idWZmZXIpOwogICAgICBidWZmZXJzLmRlbGV0ZShhdHRyaWJ1dGUpOwogICAgfQogIH0KICBmdW5jdGlvbiB1cGRhdGUoYXR0cmlidXRlLCBidWZmZXJUeXBlKSB7CiAgICBpZiAoYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpCiAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhOwogICAgaWYgKGF0dHJpYnV0ZS5pc0dMQnVmZmVyQXR0cmlidXRlKSB7CiAgICAgIGNvbnN0IGNhY2hlZCA9IGJ1ZmZlcnMuZ2V0KGF0dHJpYnV0ZSk7CiAgICAgIGlmICghY2FjaGVkIHx8IGNhY2hlZC52ZXJzaW9uIDwgYXR0cmlidXRlLnZlcnNpb24pIHsKICAgICAgICBidWZmZXJzLnNldChhdHRyaWJ1dGUsIHsKICAgICAgICAgIGJ1ZmZlcjogYXR0cmlidXRlLmJ1ZmZlciwKICAgICAgICAgIHR5cGU6IGF0dHJpYnV0ZS50eXBlLAogICAgICAgICAgYnl0ZXNQZXJFbGVtZW50OiBhdHRyaWJ1dGUuZWxlbWVudFNpemUsCiAgICAgICAgICB2ZXJzaW9uOiBhdHRyaWJ1dGUudmVyc2lvbgogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSBidWZmZXJzLmdldChhdHRyaWJ1dGUpOwogICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgewogICAgICBidWZmZXJzLnNldChhdHRyaWJ1dGUsIGNyZWF0ZUJ1ZmZlcihhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUpKTsKICAgIH0gZWxzZSBpZiAoZGF0YS52ZXJzaW9uIDwgYXR0cmlidXRlLnZlcnNpb24pIHsKICAgICAgaWYgKGRhdGEuc2l6ZSAhPT0gYXR0cmlidXRlLmFycmF5LmJ5dGVMZW5ndGgpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLldlYkdMQXR0cmlidXRlczogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBhdHRyaWJ1dGUncyBhcnJheSBidWZmZXIgZG9lcyBub3QgbWF0Y2ggdGhlIG9yaWdpbmFsIHNpemUuIFJlc2l6aW5nIGJ1ZmZlciBhdHRyaWJ1dGVzIGlzIG5vdCBzdXBwb3J0ZWQuIik7CiAgICAgIH0KICAgICAgdXBkYXRlQnVmZmVyKGRhdGEuYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUpOwogICAgICBkYXRhLnZlcnNpb24gPSBhdHRyaWJ1dGUudmVyc2lvbjsKICAgIH0KICB9CiAgcmV0dXJuIHsKICAgIGdldCwKICAgIHJlbW92ZSwKICAgIHVwZGF0ZQogIH07Cn0KZnVuY3Rpb24gV2ViR0xCYWNrZ3JvdW5kKHJlbmRlcmVyLCBjdWJlbWFwcywgY3ViZXV2bWFwcywgc3RhdGUsIG9iamVjdHMsIGFscGhhLCBwcmVtdWx0aXBsaWVkQWxwaGEpIHsKICBjb25zdCBjbGVhckNvbG9yID0gbmV3IENvbG9yKDApOwogIGxldCBjbGVhckFscGhhID0gYWxwaGEgPT09IHRydWUgPyAwIDogMTsKICBsZXQgcGxhbmVNZXNoOwogIGxldCBib3hNZXNoOwogIGxldCBjdXJyZW50QmFja2dyb3VuZCA9IG51bGw7CiAgbGV0IGN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiA9IDA7CiAgbGV0IGN1cnJlbnRUb25lbWFwcGluZyA9IG51bGw7CiAgZnVuY3Rpb24gZ2V0QmFja2dyb3VuZChzY2VuZSkgewogICAgbGV0IGJhY2tncm91bmQgPSBzY2VuZS5pc1NjZW5lID09PSB0cnVlID8gc2NlbmUuYmFja2dyb3VuZCA6IG51bGw7CiAgICBpZiAoYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzVGV4dHVyZSkgewogICAgICBjb25zdCB1c2VQTVJFTSA9IHNjZW5lLmJhY2tncm91bmRCbHVycmluZXNzID4gMDsKICAgICAgYmFja2dyb3VuZCA9ICh1c2VQTVJFTSA/IGN1YmV1dm1hcHMgOiBjdWJlbWFwcykuZ2V0KGJhY2tncm91bmQpOwogICAgfQogICAgcmV0dXJuIGJhY2tncm91bmQ7CiAgfQogIGZ1bmN0aW9uIHJlbmRlcihzY2VuZSkgewogICAgbGV0IGZvcmNlQ2xlYXIgPSBmYWxzZTsKICAgIGNvbnN0IGJhY2tncm91bmQgPSBnZXRCYWNrZ3JvdW5kKHNjZW5lKTsKICAgIGlmIChiYWNrZ3JvdW5kID09PSBudWxsKSB7CiAgICAgIHNldENsZWFyKGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEpOwogICAgfSBlbHNlIGlmIChiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXNDb2xvcikgewogICAgICBzZXRDbGVhcihiYWNrZ3JvdW5kLCAxKTsKICAgICAgZm9yY2VDbGVhciA9IHRydWU7CiAgICB9CiAgICBjb25zdCBlbnZpcm9ubWVudEJsZW5kTW9kZSA9IHJlbmRlcmVyLnhyLmdldEVudmlyb25tZW50QmxlbmRNb2RlKCk7CiAgICBpZiAoZW52aXJvbm1lbnRCbGVuZE1vZGUgPT09ICJhZGRpdGl2ZSIpIHsKICAgICAgc3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhcigwLCAwLCAwLCAxLCBwcmVtdWx0aXBsaWVkQWxwaGEpOwogICAgfSBlbHNlIGlmIChlbnZpcm9ubWVudEJsZW5kTW9kZSA9PT0gImFscGhhLWJsZW5kIikgewogICAgICBzdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKDAsIDAsIDAsIDAsIHByZW11bHRpcGxpZWRBbHBoYSk7CiAgICB9CiAgICBpZiAocmVuZGVyZXIuYXV0b0NsZWFyIHx8IGZvcmNlQ2xlYXIpIHsKICAgICAgc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KHRydWUpOwogICAgICBzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2sodHJ1ZSk7CiAgICAgIHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayh0cnVlKTsKICAgICAgcmVuZGVyZXIuY2xlYXIocmVuZGVyZXIuYXV0b0NsZWFyQ29sb3IsIHJlbmRlcmVyLmF1dG9DbGVhckRlcHRoLCByZW5kZXJlci5hdXRvQ2xlYXJTdGVuY2lsKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gYWRkVG9SZW5kZXJMaXN0KHJlbmRlckxpc3QsIHNjZW5lKSB7CiAgICBjb25zdCBiYWNrZ3JvdW5kID0gZ2V0QmFja2dyb3VuZChzY2VuZSk7CiAgICBpZiAoYmFja2dyb3VuZCAmJiAoYmFja2dyb3VuZC5pc0N1YmVUZXh0dXJlIHx8IGJhY2tncm91bmQubWFwcGluZyA9PT0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcpKSB7CiAgICAgIGlmIChib3hNZXNoID09PSB1bmRlZmluZWQpIHsKICAgICAgICBib3hNZXNoID0gbmV3IE1lc2gobmV3IEJveEdlb21ldHJ5KDFlNCwgMWU0LCAxZTQpLCBuZXcgU2hhZGVyTWF0ZXJpYWwoewogICAgICAgICAgbmFtZTogIkJhY2tncm91bmRDdWJlTWF0ZXJpYWwiLAogICAgICAgICAgdW5pZm9ybXM6IGNsb25lVW5pZm9ybXMoU2hhZGVyTGliLmJhY2tncm91bmRDdWJlLnVuaWZvcm1zKSwKICAgICAgICAgIHZlcnRleFNoYWRlcjogU2hhZGVyTGliLmJhY2tncm91bmRDdWJlLnZlcnRleFNoYWRlciwKICAgICAgICAgIGZyYWdtZW50U2hhZGVyOiBTaGFkZXJMaWIuYmFja2dyb3VuZEN1YmUuZnJhZ21lbnRTaGFkZXIsCiAgICAgICAgICBzaWRlOiBCYWNrU2lkZSwKICAgICAgICAgIGRlcHRoVGVzdDogZmFsc2UsCiAgICAgICAgICBkZXB0aFdyaXRlOiBmYWxzZSwKICAgICAgICAgIGZvZzogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgYm94TWVzaC5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoIm5vcm1hbCIpOwogICAgICAgIGJveE1lc2guZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCJ1diIpOwogICAgICAgIGJveE1lc2gub25CZWZvcmVSZW5kZXIgPSBmdW5jdGlvbihyZW5kZXJlcjIsIHNjZW5lMiwgY2FtZXJhKSB7CiAgICAgICAgICB0aGlzLm1hdHJpeFdvcmxkLmNvcHlQb3NpdGlvbihjYW1lcmEubWF0cml4V29ybGQpOwogICAgICAgIH07CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGJveE1lc2gubWF0ZXJpYWwsICJlbnZNYXAiLCB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy51bmlmb3Jtcy5lbnZNYXAudmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgb2JqZWN0cy51cGRhdGUoYm94TWVzaCk7CiAgICAgIH0KICAgICAgX2UxJDEuY29weShzY2VuZS5iYWNrZ3JvdW5kUm90YXRpb24pOwogICAgICBfZTEkMS54ICo9IC0xOwogICAgICBfZTEkMS55ICo9IC0xOwogICAgICBfZTEkMS56ICo9IC0xOwogICAgICBpZiAoYmFja2dyb3VuZC5pc0N1YmVUZXh0dXJlICYmIGJhY2tncm91bmQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID09PSBmYWxzZSkgewogICAgICAgIF9lMSQxLnkgKj0gLTE7CiAgICAgICAgX2UxJDEueiAqPSAtMTsKICAgICAgfQogICAgICBib3hNZXNoLm1hdGVyaWFsLnVuaWZvcm1zLmVudk1hcC52YWx1ZSA9IGJhY2tncm91bmQ7CiAgICAgIGJveE1lc2gubWF0ZXJpYWwudW5pZm9ybXMuZmxpcEVudk1hcC52YWx1ZSA9IGJhY2tncm91bmQuaXNDdWJlVGV4dHVyZSAmJiBiYWNrZ3JvdW5kLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSA9PT0gZmFsc2UgPyAtMSA6IDE7CiAgICAgIGJveE1lc2gubWF0ZXJpYWwudW5pZm9ybXMuYmFja2dyb3VuZEJsdXJyaW5lc3MudmFsdWUgPSBzY2VuZS5iYWNrZ3JvdW5kQmx1cnJpbmVzczsKICAgICAgYm94TWVzaC5tYXRlcmlhbC51bmlmb3Jtcy5iYWNrZ3JvdW5kSW50ZW5zaXR5LnZhbHVlID0gc2NlbmUuYmFja2dyb3VuZEludGVuc2l0eTsKICAgICAgYm94TWVzaC5tYXRlcmlhbC51bmlmb3Jtcy5iYWNrZ3JvdW5kUm90YXRpb24udmFsdWUuc2V0RnJvbU1hdHJpeDQoX20xJDEyLm1ha2VSb3RhdGlvbkZyb21FdWxlcihfZTEkMSkpOwogICAgICBib3hNZXNoLm1hdGVyaWFsLnRvbmVNYXBwZWQgPSBDb2xvck1hbmFnZW1lbnQuZ2V0VHJhbnNmZXIoYmFja2dyb3VuZC5jb2xvclNwYWNlKSAhPT0gU1JHQlRyYW5zZmVyOwogICAgICBpZiAoY3VycmVudEJhY2tncm91bmQgIT09IGJhY2tncm91bmQgfHwgY3VycmVudEJhY2tncm91bmRWZXJzaW9uICE9PSBiYWNrZ3JvdW5kLnZlcnNpb24gfHwgY3VycmVudFRvbmVtYXBwaW5nICE9PSByZW5kZXJlci50b25lTWFwcGluZykgewogICAgICAgIGJveE1lc2gubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICAgIGN1cnJlbnRCYWNrZ3JvdW5kID0gYmFja2dyb3VuZDsKICAgICAgICBjdXJyZW50QmFja2dyb3VuZFZlcnNpb24gPSBiYWNrZ3JvdW5kLnZlcnNpb247CiAgICAgICAgY3VycmVudFRvbmVtYXBwaW5nID0gcmVuZGVyZXIudG9uZU1hcHBpbmc7CiAgICAgIH0KICAgICAgYm94TWVzaC5sYXllcnMuZW5hYmxlQWxsKCk7CiAgICAgIHJlbmRlckxpc3QudW5zaGlmdChib3hNZXNoLCBib3hNZXNoLmdlb21ldHJ5LCBib3hNZXNoLm1hdGVyaWFsLCAwLCAwLCBudWxsKTsKICAgIH0gZWxzZSBpZiAoYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzVGV4dHVyZSkgewogICAgICBpZiAocGxhbmVNZXNoID09PSB1bmRlZmluZWQpIHsKICAgICAgICBwbGFuZU1lc2ggPSBuZXcgTWVzaChuZXcgUGxhbmVHZW9tZXRyeSgyLCAyKSwgbmV3IFNoYWRlck1hdGVyaWFsKHsKICAgICAgICAgIG5hbWU6ICJCYWNrZ3JvdW5kTWF0ZXJpYWwiLAogICAgICAgICAgdW5pZm9ybXM6IGNsb25lVW5pZm9ybXMoU2hhZGVyTGliLmJhY2tncm91bmQudW5pZm9ybXMpLAogICAgICAgICAgdmVydGV4U2hhZGVyOiBTaGFkZXJMaWIuYmFja2dyb3VuZC52ZXJ0ZXhTaGFkZXIsCiAgICAgICAgICBmcmFnbWVudFNoYWRlcjogU2hhZGVyTGliLmJhY2tncm91bmQuZnJhZ21lbnRTaGFkZXIsCiAgICAgICAgICBzaWRlOiBGcm9udFNpZGUsCiAgICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLAogICAgICAgICAgZGVwdGhXcml0ZTogZmFsc2UsCiAgICAgICAgICBmb2c6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICAgIHBsYW5lTWVzaC5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoIm5vcm1hbCIpOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwbGFuZU1lc2gubWF0ZXJpYWwsICJtYXAiLCB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy51bmlmb3Jtcy50MkQudmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgb2JqZWN0cy51cGRhdGUocGxhbmVNZXNoKTsKICAgICAgfQogICAgICBwbGFuZU1lc2gubWF0ZXJpYWwudW5pZm9ybXMudDJELnZhbHVlID0gYmFja2dyb3VuZDsKICAgICAgcGxhbmVNZXNoLm1hdGVyaWFsLnVuaWZvcm1zLmJhY2tncm91bmRJbnRlbnNpdHkudmFsdWUgPSBzY2VuZS5iYWNrZ3JvdW5kSW50ZW5zaXR5OwogICAgICBwbGFuZU1lc2gubWF0ZXJpYWwudG9uZU1hcHBlZCA9IENvbG9yTWFuYWdlbWVudC5nZXRUcmFuc2ZlcihiYWNrZ3JvdW5kLmNvbG9yU3BhY2UpICE9PSBTUkdCVHJhbnNmZXI7CiAgICAgIGlmIChiYWNrZ3JvdW5kLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUpIHsKICAgICAgICBiYWNrZ3JvdW5kLnVwZGF0ZU1hdHJpeCgpOwogICAgICB9CiAgICAgIHBsYW5lTWVzaC5tYXRlcmlhbC51bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KGJhY2tncm91bmQubWF0cml4KTsKICAgICAgaWYgKGN1cnJlbnRCYWNrZ3JvdW5kICE9PSBiYWNrZ3JvdW5kIHx8IGN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiAhPT0gYmFja2dyb3VuZC52ZXJzaW9uIHx8IGN1cnJlbnRUb25lbWFwcGluZyAhPT0gcmVuZGVyZXIudG9uZU1hcHBpbmcpIHsKICAgICAgICBwbGFuZU1lc2gubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICAgIGN1cnJlbnRCYWNrZ3JvdW5kID0gYmFja2dyb3VuZDsKICAgICAgICBjdXJyZW50QmFja2dyb3VuZFZlcnNpb24gPSBiYWNrZ3JvdW5kLnZlcnNpb247CiAgICAgICAgY3VycmVudFRvbmVtYXBwaW5nID0gcmVuZGVyZXIudG9uZU1hcHBpbmc7CiAgICAgIH0KICAgICAgcGxhbmVNZXNoLmxheWVycy5lbmFibGVBbGwoKTsKICAgICAgcmVuZGVyTGlzdC51bnNoaWZ0KHBsYW5lTWVzaCwgcGxhbmVNZXNoLmdlb21ldHJ5LCBwbGFuZU1lc2gubWF0ZXJpYWwsIDAsIDAsIG51bGwpOwogICAgfQogIH0KICBmdW5jdGlvbiBzZXRDbGVhcihjb2xvciwgYWxwaGEyKSB7CiAgICBjb2xvci5nZXRSR0IoX3JnYiwgZ2V0VW5saXRVbmlmb3JtQ29sb3JTcGFjZShyZW5kZXJlcikpOwogICAgc3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhcihfcmdiLnIsIF9yZ2IuZywgX3JnYi5iLCBhbHBoYTIsIHByZW11bHRpcGxpZWRBbHBoYSk7CiAgfQogIGZ1bmN0aW9uIGRpc3Bvc2UoKSB7CiAgICBpZiAoYm94TWVzaCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGJveE1lc2guZ2VvbWV0cnkuZGlzcG9zZSgpOwogICAgICBib3hNZXNoLm1hdGVyaWFsLmRpc3Bvc2UoKTsKICAgICAgYm94TWVzaCA9IHVuZGVmaW5lZDsKICAgIH0KICAgIGlmIChwbGFuZU1lc2ggIT09IHVuZGVmaW5lZCkgewogICAgICBwbGFuZU1lc2guZ2VvbWV0cnkuZGlzcG9zZSgpOwogICAgICBwbGFuZU1lc2gubWF0ZXJpYWwuZGlzcG9zZSgpOwogICAgICBwbGFuZU1lc2ggPSB1bmRlZmluZWQ7CiAgICB9CiAgfQogIHJldHVybiB7CiAgICBnZXRDbGVhckNvbG9yOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNsZWFyQ29sb3I7CiAgICB9LAogICAgc2V0Q2xlYXJDb2xvcjogZnVuY3Rpb24oY29sb3IsIGFscGhhMiA9IDEpIHsKICAgICAgY2xlYXJDb2xvci5zZXQoY29sb3IpOwogICAgICBjbGVhckFscGhhID0gYWxwaGEyOwogICAgICBzZXRDbGVhcihjbGVhckNvbG9yLCBjbGVhckFscGhhKTsKICAgIH0sCiAgICBnZXRDbGVhckFscGhhOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNsZWFyQWxwaGE7CiAgICB9LAogICAgc2V0Q2xlYXJBbHBoYTogZnVuY3Rpb24oYWxwaGEyKSB7CiAgICAgIGNsZWFyQWxwaGEgPSBhbHBoYTI7CiAgICAgIHNldENsZWFyKGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEpOwogICAgfSwKICAgIHJlbmRlciwKICAgIGFkZFRvUmVuZGVyTGlzdCwKICAgIGRpc3Bvc2UKICB9Owp9CmZ1bmN0aW9uIFdlYkdMQmluZGluZ1N0YXRlcyhnbCwgYXR0cmlidXRlcykgewogIGNvbnN0IG1heFZlcnRleEF0dHJpYnV0ZXMgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1ZFUlRFWF9BVFRSSUJTKTsKICBjb25zdCBiaW5kaW5nU3RhdGVzID0ge307CiAgY29uc3QgZGVmYXVsdFN0YXRlID0gY3JlYXRlQmluZGluZ1N0YXRlKG51bGwpOwogIGxldCBjdXJyZW50U3RhdGUgPSBkZWZhdWx0U3RhdGU7CiAgbGV0IGZvcmNlVXBkYXRlID0gZmFsc2U7CiAgZnVuY3Rpb24gc2V0dXAob2JqZWN0LCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnksIGluZGV4KSB7CiAgICBsZXQgdXBkYXRlQnVmZmVycyA9IGZhbHNlOwogICAgY29uc3Qgc3RhdGUgPSBnZXRCaW5kaW5nU3RhdGUoZ2VvbWV0cnksIHByb2dyYW0sIG1hdGVyaWFsKTsKICAgIGlmIChjdXJyZW50U3RhdGUgIT09IHN0YXRlKSB7CiAgICAgIGN1cnJlbnRTdGF0ZSA9IHN0YXRlOwogICAgICBiaW5kVmVydGV4QXJyYXlPYmplY3QoY3VycmVudFN0YXRlLm9iamVjdCk7CiAgICB9CiAgICB1cGRhdGVCdWZmZXJzID0gbmVlZHNVcGRhdGUob2JqZWN0LCBnZW9tZXRyeSwgcHJvZ3JhbSwgaW5kZXgpOwogICAgaWYgKHVwZGF0ZUJ1ZmZlcnMpCiAgICAgIHNhdmVDYWNoZShvYmplY3QsIGdlb21ldHJ5LCBwcm9ncmFtLCBpbmRleCk7CiAgICBpZiAoaW5kZXggIT09IG51bGwpIHsKICAgICAgYXR0cmlidXRlcy51cGRhdGUoaW5kZXgsIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSKTsKICAgIH0KICAgIGlmICh1cGRhdGVCdWZmZXJzIHx8IGZvcmNlVXBkYXRlKSB7CiAgICAgIGZvcmNlVXBkYXRlID0gZmFsc2U7CiAgICAgIHNldHVwVmVydGV4QXR0cmlidXRlcyhvYmplY3QsIG1hdGVyaWFsLCBwcm9ncmFtLCBnZW9tZXRyeSk7CiAgICAgIGlmIChpbmRleCAhPT0gbnVsbCkgewogICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGF0dHJpYnV0ZXMuZ2V0KGluZGV4KS5idWZmZXIpOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZVZlcnRleEFycmF5T2JqZWN0KCkgewogICAgcmV0dXJuIGdsLmNyZWF0ZVZlcnRleEFycmF5KCk7CiAgfQogIGZ1bmN0aW9uIGJpbmRWZXJ0ZXhBcnJheU9iamVjdCh2YW8pIHsKICAgIHJldHVybiBnbC5iaW5kVmVydGV4QXJyYXkodmFvKTsKICB9CiAgZnVuY3Rpb24gZGVsZXRlVmVydGV4QXJyYXlPYmplY3QodmFvKSB7CiAgICByZXR1cm4gZ2wuZGVsZXRlVmVydGV4QXJyYXkodmFvKTsKICB9CiAgZnVuY3Rpb24gZ2V0QmluZGluZ1N0YXRlKGdlb21ldHJ5LCBwcm9ncmFtLCBtYXRlcmlhbCkgewogICAgY29uc3Qgd2lyZWZyYW1lID0gbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlOwogICAgbGV0IHByb2dyYW1NYXAgPSBiaW5kaW5nU3RhdGVzW2dlb21ldHJ5LmlkXTsKICAgIGlmIChwcm9ncmFtTWFwID09PSB1bmRlZmluZWQpIHsKICAgICAgcHJvZ3JhbU1hcCA9IHt9OwogICAgICBiaW5kaW5nU3RhdGVzW2dlb21ldHJ5LmlkXSA9IHByb2dyYW1NYXA7CiAgICB9CiAgICBsZXQgc3RhdGVNYXAgPSBwcm9ncmFtTWFwW3Byb2dyYW0uaWRdOwogICAgaWYgKHN0YXRlTWFwID09PSB1bmRlZmluZWQpIHsKICAgICAgc3RhdGVNYXAgPSB7fTsKICAgICAgcHJvZ3JhbU1hcFtwcm9ncmFtLmlkXSA9IHN0YXRlTWFwOwogICAgfQogICAgbGV0IHN0YXRlID0gc3RhdGVNYXBbd2lyZWZyYW1lXTsKICAgIGlmIChzdGF0ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHN0YXRlID0gY3JlYXRlQmluZGluZ1N0YXRlKGNyZWF0ZVZlcnRleEFycmF5T2JqZWN0KCkpOwogICAgICBzdGF0ZU1hcFt3aXJlZnJhbWVdID0gc3RhdGU7CiAgICB9CiAgICByZXR1cm4gc3RhdGU7CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZUJpbmRpbmdTdGF0ZSh2YW8pIHsKICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBbXTsKICAgIGNvbnN0IGVuYWJsZWRBdHRyaWJ1dGVzID0gW107CiAgICBjb25zdCBhdHRyaWJ1dGVEaXZpc29ycyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7aSA8IG1heFZlcnRleEF0dHJpYnV0ZXM7IGkrKykgewogICAgICBuZXdBdHRyaWJ1dGVzW2ldID0gMDsKICAgICAgZW5hYmxlZEF0dHJpYnV0ZXNbaV0gPSAwOwogICAgICBhdHRyaWJ1dGVEaXZpc29yc1tpXSA9IDA7CiAgICB9CiAgICByZXR1cm4gewogICAgICBnZW9tZXRyeTogbnVsbCwKICAgICAgcHJvZ3JhbTogbnVsbCwKICAgICAgd2lyZWZyYW1lOiBmYWxzZSwKICAgICAgbmV3QXR0cmlidXRlcywKICAgICAgZW5hYmxlZEF0dHJpYnV0ZXMsCiAgICAgIGF0dHJpYnV0ZURpdmlzb3JzLAogICAgICBvYmplY3Q6IHZhbywKICAgICAgYXR0cmlidXRlczoge30sCiAgICAgIGluZGV4OiBudWxsCiAgICB9OwogIH0KICBmdW5jdGlvbiBuZWVkc1VwZGF0ZShvYmplY3QsIGdlb21ldHJ5LCBwcm9ncmFtLCBpbmRleCkgewogICAgY29uc3QgY2FjaGVkQXR0cmlidXRlcyA9IGN1cnJlbnRTdGF0ZS5hdHRyaWJ1dGVzOwogICAgY29uc3QgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlczsKICAgIGxldCBhdHRyaWJ1dGVzTnVtID0gMDsKICAgIGNvbnN0IHByb2dyYW1BdHRyaWJ1dGVzID0gcHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7CiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gcHJvZ3JhbUF0dHJpYnV0ZXMpIHsKICAgICAgY29uc3QgcHJvZ3JhbUF0dHJpYnV0ZSA9IHByb2dyYW1BdHRyaWJ1dGVzW25hbWVdOwogICAgICBpZiAocHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvbiA+PSAwKSB7CiAgICAgICAgY29uc3QgY2FjaGVkQXR0cmlidXRlID0gY2FjaGVkQXR0cmlidXRlc1tuYW1lXTsKICAgICAgICBsZXQgZ2VvbWV0cnlBdHRyaWJ1dGUgPSBnZW9tZXRyeUF0dHJpYnV0ZXNbbmFtZV07CiAgICAgICAgaWYgKGdlb21ldHJ5QXR0cmlidXRlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGlmIChuYW1lID09PSAiaW5zdGFuY2VNYXRyaXgiICYmIG9iamVjdC5pbnN0YW5jZU1hdHJpeCkKICAgICAgICAgICAgZ2VvbWV0cnlBdHRyaWJ1dGUgPSBvYmplY3QuaW5zdGFuY2VNYXRyaXg7CiAgICAgICAgICBpZiAobmFtZSA9PT0gImluc3RhbmNlQ29sb3IiICYmIG9iamVjdC5pbnN0YW5jZUNvbG9yKQogICAgICAgICAgICBnZW9tZXRyeUF0dHJpYnV0ZSA9IG9iamVjdC5pbnN0YW5jZUNvbG9yOwogICAgICAgIH0KICAgICAgICBpZiAoY2FjaGVkQXR0cmlidXRlID09PSB1bmRlZmluZWQpCiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAoY2FjaGVkQXR0cmlidXRlLmF0dHJpYnV0ZSAhPT0gZ2VvbWV0cnlBdHRyaWJ1dGUpCiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAoZ2VvbWV0cnlBdHRyaWJ1dGUgJiYgY2FjaGVkQXR0cmlidXRlLmRhdGEgIT09IGdlb21ldHJ5QXR0cmlidXRlLmRhdGEpCiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICBhdHRyaWJ1dGVzTnVtKys7CiAgICAgIH0KICAgIH0KICAgIGlmIChjdXJyZW50U3RhdGUuYXR0cmlidXRlc051bSAhPT0gYXR0cmlidXRlc051bSkKICAgICAgcmV0dXJuIHRydWU7CiAgICBpZiAoY3VycmVudFN0YXRlLmluZGV4ICE9PSBpbmRleCkKICAgICAgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGZ1bmN0aW9uIHNhdmVDYWNoZShvYmplY3QsIGdlb21ldHJ5LCBwcm9ncmFtLCBpbmRleCkgewogICAgY29uc3QgY2FjaGUgPSB7fTsKICAgIGNvbnN0IGF0dHJpYnV0ZXMyID0gZ2VvbWV0cnkuYXR0cmlidXRlczsKICAgIGxldCBhdHRyaWJ1dGVzTnVtID0gMDsKICAgIGNvbnN0IHByb2dyYW1BdHRyaWJ1dGVzID0gcHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7CiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gcHJvZ3JhbUF0dHJpYnV0ZXMpIHsKICAgICAgY29uc3QgcHJvZ3JhbUF0dHJpYnV0ZSA9IHByb2dyYW1BdHRyaWJ1dGVzW25hbWVdOwogICAgICBpZiAocHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvbiA+PSAwKSB7CiAgICAgICAgbGV0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMyW25hbWVdOwogICAgICAgIGlmIChhdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgaWYgKG5hbWUgPT09ICJpbnN0YW5jZU1hdHJpeCIgJiYgb2JqZWN0Lmluc3RhbmNlTWF0cml4KQogICAgICAgICAgICBhdHRyaWJ1dGUgPSBvYmplY3QuaW5zdGFuY2VNYXRyaXg7CiAgICAgICAgICBpZiAobmFtZSA9PT0gImluc3RhbmNlQ29sb3IiICYmIG9iamVjdC5pbnN0YW5jZUNvbG9yKQogICAgICAgICAgICBhdHRyaWJ1dGUgPSBvYmplY3QuaW5zdGFuY2VDb2xvcjsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGF0YSA9IHt9OwogICAgICAgIGRhdGEuYXR0cmlidXRlID0gYXR0cmlidXRlOwogICAgICAgIGlmIChhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLmRhdGEpIHsKICAgICAgICAgIGRhdGEuZGF0YSA9IGF0dHJpYnV0ZS5kYXRhOwogICAgICAgIH0KICAgICAgICBjYWNoZVtuYW1lXSA9IGRhdGE7CiAgICAgICAgYXR0cmlidXRlc051bSsrOwogICAgICB9CiAgICB9CiAgICBjdXJyZW50U3RhdGUuYXR0cmlidXRlcyA9IGNhY2hlOwogICAgY3VycmVudFN0YXRlLmF0dHJpYnV0ZXNOdW0gPSBhdHRyaWJ1dGVzTnVtOwogICAgY3VycmVudFN0YXRlLmluZGV4ID0gaW5kZXg7CiAgfQogIGZ1bmN0aW9uIGluaXRBdHRyaWJ1dGVzKCkgewogICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IGN1cnJlbnRTdGF0ZS5uZXdBdHRyaWJ1dGVzOwogICAgZm9yIChsZXQgaSA9IDAsIGlsID0gbmV3QXR0cmlidXRlcy5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgbmV3QXR0cmlidXRlc1tpXSA9IDA7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGVuYWJsZUF0dHJpYnV0ZShhdHRyaWJ1dGUpIHsKICAgIGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoYXR0cmlidXRlLCAwKTsKICB9CiAgZnVuY3Rpb24gZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcihhdHRyaWJ1dGUsIG1lc2hQZXJBdHRyaWJ1dGUpIHsKICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBjdXJyZW50U3RhdGUubmV3QXR0cmlidXRlczsKICAgIGNvbnN0IGVuYWJsZWRBdHRyaWJ1dGVzID0gY3VycmVudFN0YXRlLmVuYWJsZWRBdHRyaWJ1dGVzOwogICAgY29uc3QgYXR0cmlidXRlRGl2aXNvcnMgPSBjdXJyZW50U3RhdGUuYXR0cmlidXRlRGl2aXNvcnM7CiAgICBuZXdBdHRyaWJ1dGVzW2F0dHJpYnV0ZV0gPSAxOwogICAgaWYgKGVuYWJsZWRBdHRyaWJ1dGVzW2F0dHJpYnV0ZV0gPT09IDApIHsKICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoYXR0cmlidXRlKTsKICAgICAgZW5hYmxlZEF0dHJpYnV0ZXNbYXR0cmlidXRlXSA9IDE7CiAgICB9CiAgICBpZiAoYXR0cmlidXRlRGl2aXNvcnNbYXR0cmlidXRlXSAhPT0gbWVzaFBlckF0dHJpYnV0ZSkgewogICAgICBnbC52ZXJ0ZXhBdHRyaWJEaXZpc29yKGF0dHJpYnV0ZSwgbWVzaFBlckF0dHJpYnV0ZSk7CiAgICAgIGF0dHJpYnV0ZURpdmlzb3JzW2F0dHJpYnV0ZV0gPSBtZXNoUGVyQXR0cmlidXRlOwogICAgfQogIH0KICBmdW5jdGlvbiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcygpIHsKICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBjdXJyZW50U3RhdGUubmV3QXR0cmlidXRlczsKICAgIGNvbnN0IGVuYWJsZWRBdHRyaWJ1dGVzID0gY3VycmVudFN0YXRlLmVuYWJsZWRBdHRyaWJ1dGVzOwogICAgZm9yIChsZXQgaSA9IDAsIGlsID0gZW5hYmxlZEF0dHJpYnV0ZXMubGVuZ3RoO2kgPCBpbDsgaSsrKSB7CiAgICAgIGlmIChlbmFibGVkQXR0cmlidXRlc1tpXSAhPT0gbmV3QXR0cmlidXRlc1tpXSkgewogICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpKTsKICAgICAgICBlbmFibGVkQXR0cmlidXRlc1tpXSA9IDA7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gdmVydGV4QXR0cmliUG9pbnRlcihpbmRleCwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgc3RyaWRlLCBvZmZzZXQsIGludGVnZXIpIHsKICAgIGlmIChpbnRlZ2VyID09PSB0cnVlKSB7CiAgICAgIGdsLnZlcnRleEF0dHJpYklQb2ludGVyKGluZGV4LCBzaXplLCB0eXBlLCBzdHJpZGUsIG9mZnNldCk7CiAgICB9IGVsc2UgewogICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGluZGV4LCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIG9mZnNldCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHNldHVwVmVydGV4QXR0cmlidXRlcyhvYmplY3QsIG1hdGVyaWFsLCBwcm9ncmFtLCBnZW9tZXRyeSkgewogICAgaW5pdEF0dHJpYnV0ZXMoKTsKICAgIGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICBjb25zdCBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpOwogICAgY29uc3QgbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzID0gbWF0ZXJpYWwuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlczsKICAgIGZvciAoY29uc3QgbmFtZSBpbiBwcm9ncmFtQXR0cmlidXRlcykgewogICAgICBjb25zdCBwcm9ncmFtQXR0cmlidXRlID0gcHJvZ3JhbUF0dHJpYnV0ZXNbbmFtZV07CiAgICAgIGlmIChwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uID49IDApIHsKICAgICAgICBsZXQgZ2VvbWV0cnlBdHRyaWJ1dGUgPSBnZW9tZXRyeUF0dHJpYnV0ZXNbbmFtZV07CiAgICAgICAgaWYgKGdlb21ldHJ5QXR0cmlidXRlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGlmIChuYW1lID09PSAiaW5zdGFuY2VNYXRyaXgiICYmIG9iamVjdC5pbnN0YW5jZU1hdHJpeCkKICAgICAgICAgICAgZ2VvbWV0cnlBdHRyaWJ1dGUgPSBvYmplY3QuaW5zdGFuY2VNYXRyaXg7CiAgICAgICAgICBpZiAobmFtZSA9PT0gImluc3RhbmNlQ29sb3IiICYmIG9iamVjdC5pbnN0YW5jZUNvbG9yKQogICAgICAgICAgICBnZW9tZXRyeUF0dHJpYnV0ZSA9IG9iamVjdC5pbnN0YW5jZUNvbG9yOwogICAgICAgIH0KICAgICAgICBpZiAoZ2VvbWV0cnlBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGdlb21ldHJ5QXR0cmlidXRlLm5vcm1hbGl6ZWQ7CiAgICAgICAgICBjb25zdCBzaXplID0gZ2VvbWV0cnlBdHRyaWJ1dGUuaXRlbVNpemU7CiAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldChnZW9tZXRyeUF0dHJpYnV0ZSk7CiAgICAgICAgICBpZiAoYXR0cmlidXRlID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgY29uc3QgYnVmZmVyID0gYXR0cmlidXRlLmJ1ZmZlcjsKICAgICAgICAgIGNvbnN0IHR5cGUgPSBhdHRyaWJ1dGUudHlwZTsKICAgICAgICAgIGNvbnN0IGJ5dGVzUGVyRWxlbWVudCA9IGF0dHJpYnV0ZS5ieXRlc1BlckVsZW1lbnQ7CiAgICAgICAgICBjb25zdCBpbnRlZ2VyID0gdHlwZSA9PT0gZ2wuSU5UIHx8IHR5cGUgPT09IGdsLlVOU0lHTkVEX0lOVCB8fCBnZW9tZXRyeUF0dHJpYnV0ZS5ncHVUeXBlID09PSBJbnRUeXBlOwogICAgICAgICAgaWYgKGdlb21ldHJ5QXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpIHsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGdlb21ldHJ5QXR0cmlidXRlLmRhdGE7CiAgICAgICAgICAgIGNvbnN0IHN0cmlkZSA9IGRhdGEuc3RyaWRlOwogICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5vZmZzZXQ7CiAgICAgICAgICAgIGlmIChkYXRhLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIpIHsKICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvblNpemU7IGkrKykgewogICAgICAgICAgICAgICAgZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcihwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uICsgaSwgZGF0YS5tZXNoUGVyQXR0cmlidXRlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKG9iamVjdC5pc0luc3RhbmNlZE1lc2ggIT09IHRydWUgJiYgZ2VvbWV0cnkuX21heEluc3RhbmNlQ291bnQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgZ2VvbWV0cnkuX21heEluc3RhbmNlQ291bnQgPSBkYXRhLm1lc2hQZXJBdHRyaWJ1dGUgKiBkYXRhLmNvdW50OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvblNpemU7IGkrKykgewogICAgICAgICAgICAgICAgZW5hYmxlQXR0cmlidXRlKHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb24gKyBpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcik7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uU2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICAgdmVydGV4QXR0cmliUG9pbnRlcihwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uICsgaSwgc2l6ZSAvIHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb25TaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUgKiBieXRlc1BlckVsZW1lbnQsIChvZmZzZXQgKyBzaXplIC8gcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvblNpemUgKiBpKSAqIGJ5dGVzUGVyRWxlbWVudCwgaW50ZWdlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChnZW9tZXRyeUF0dHJpYnV0ZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSkgewogICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uU2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICAgICBlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb24gKyBpLCBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKG9iamVjdC5pc0luc3RhbmNlZE1lc2ggIT09IHRydWUgJiYgZ2VvbWV0cnkuX21heEluc3RhbmNlQ291bnQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgZ2VvbWV0cnkuX21heEluc3RhbmNlQ291bnQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICogZ2VvbWV0cnlBdHRyaWJ1dGUuY291bnQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uU2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICAgICBlbmFibGVBdHRyaWJ1dGUocHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvbiArIGkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb25TaXplOyBpKyspIHsKICAgICAgICAgICAgICB2ZXJ0ZXhBdHRyaWJQb2ludGVyKHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb24gKyBpLCBzaXplIC8gcHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvblNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHNpemUgKiBieXRlc1BlckVsZW1lbnQsIHNpemUgLyBwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uU2l6ZSAqIGkgKiBieXRlc1BlckVsZW1lbnQsIGludGVnZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgY29uc3QgdmFsdWUgPSBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbbmFtZV07CiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLmxlbmd0aCkgewogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIGdsLnZlcnRleEF0dHJpYjJmdihwcm9ncmFtQXR0cmlidXRlLmxvY2F0aW9uLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWIzZnYocHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvbiwgdmFsdWUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgZ2wudmVydGV4QXR0cmliNGZ2KHByb2dyYW1BdHRyaWJ1dGUubG9jYXRpb24sIHZhbHVlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWIxZnYocHJvZ3JhbUF0dHJpYnV0ZS5sb2NhdGlvbiwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBkaXNhYmxlVW51c2VkQXR0cmlidXRlcygpOwogIH0KICBmdW5jdGlvbiBkaXNwb3NlKCkgewogICAgcmVzZXQoKTsKICAgIGZvciAoY29uc3QgZ2VvbWV0cnlJZCBpbiBiaW5kaW5nU3RhdGVzKSB7CiAgICAgIGNvbnN0IHByb2dyYW1NYXAgPSBiaW5kaW5nU3RhdGVzW2dlb21ldHJ5SWRdOwogICAgICBmb3IgKGNvbnN0IHByb2dyYW1JZCBpbiBwcm9ncmFtTWFwKSB7CiAgICAgICAgY29uc3Qgc3RhdGVNYXAgPSBwcm9ncmFtTWFwW3Byb2dyYW1JZF07CiAgICAgICAgZm9yIChjb25zdCB3aXJlZnJhbWUgaW4gc3RhdGVNYXApIHsKICAgICAgICAgIGRlbGV0ZVZlcnRleEFycmF5T2JqZWN0KHN0YXRlTWFwW3dpcmVmcmFtZV0ub2JqZWN0KTsKICAgICAgICAgIGRlbGV0ZSBzdGF0ZU1hcFt3aXJlZnJhbWVdOwogICAgICAgIH0KICAgICAgICBkZWxldGUgcHJvZ3JhbU1hcFtwcm9ncmFtSWRdOwogICAgICB9CiAgICAgIGRlbGV0ZSBiaW5kaW5nU3RhdGVzW2dlb21ldHJ5SWRdOwogICAgfQogIH0KICBmdW5jdGlvbiByZWxlYXNlU3RhdGVzT2ZHZW9tZXRyeShnZW9tZXRyeSkgewogICAgaWYgKGJpbmRpbmdTdGF0ZXNbZ2VvbWV0cnkuaWRdID09PSB1bmRlZmluZWQpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IHByb2dyYW1NYXAgPSBiaW5kaW5nU3RhdGVzW2dlb21ldHJ5LmlkXTsKICAgIGZvciAoY29uc3QgcHJvZ3JhbUlkIGluIHByb2dyYW1NYXApIHsKICAgICAgY29uc3Qgc3RhdGVNYXAgPSBwcm9ncmFtTWFwW3Byb2dyYW1JZF07CiAgICAgIGZvciAoY29uc3Qgd2lyZWZyYW1lIGluIHN0YXRlTWFwKSB7CiAgICAgICAgZGVsZXRlVmVydGV4QXJyYXlPYmplY3Qoc3RhdGVNYXBbd2lyZWZyYW1lXS5vYmplY3QpOwogICAgICAgIGRlbGV0ZSBzdGF0ZU1hcFt3aXJlZnJhbWVdOwogICAgICB9CiAgICAgIGRlbGV0ZSBwcm9ncmFtTWFwW3Byb2dyYW1JZF07CiAgICB9CiAgICBkZWxldGUgYmluZGluZ1N0YXRlc1tnZW9tZXRyeS5pZF07CiAgfQogIGZ1bmN0aW9uIHJlbGVhc2VTdGF0ZXNPZlByb2dyYW0ocHJvZ3JhbSkgewogICAgZm9yIChjb25zdCBnZW9tZXRyeUlkIGluIGJpbmRpbmdTdGF0ZXMpIHsKICAgICAgY29uc3QgcHJvZ3JhbU1hcCA9IGJpbmRpbmdTdGF0ZXNbZ2VvbWV0cnlJZF07CiAgICAgIGlmIChwcm9ncmFtTWFwW3Byb2dyYW0uaWRdID09PSB1bmRlZmluZWQpCiAgICAgICAgY29udGludWU7CiAgICAgIGNvbnN0IHN0YXRlTWFwID0gcHJvZ3JhbU1hcFtwcm9ncmFtLmlkXTsKICAgICAgZm9yIChjb25zdCB3aXJlZnJhbWUgaW4gc3RhdGVNYXApIHsKICAgICAgICBkZWxldGVWZXJ0ZXhBcnJheU9iamVjdChzdGF0ZU1hcFt3aXJlZnJhbWVdLm9iamVjdCk7CiAgICAgICAgZGVsZXRlIHN0YXRlTWFwW3dpcmVmcmFtZV07CiAgICAgIH0KICAgICAgZGVsZXRlIHByb2dyYW1NYXBbcHJvZ3JhbS5pZF07CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJlc2V0KCkgewogICAgcmVzZXREZWZhdWx0U3RhdGUoKTsKICAgIGZvcmNlVXBkYXRlID0gdHJ1ZTsKICAgIGlmIChjdXJyZW50U3RhdGUgPT09IGRlZmF1bHRTdGF0ZSkKICAgICAgcmV0dXJuOwogICAgY3VycmVudFN0YXRlID0gZGVmYXVsdFN0YXRlOwogICAgYmluZFZlcnRleEFycmF5T2JqZWN0KGN1cnJlbnRTdGF0ZS5vYmplY3QpOwogIH0KICBmdW5jdGlvbiByZXNldERlZmF1bHRTdGF0ZSgpIHsKICAgIGRlZmF1bHRTdGF0ZS5nZW9tZXRyeSA9IG51bGw7CiAgICBkZWZhdWx0U3RhdGUucHJvZ3JhbSA9IG51bGw7CiAgICBkZWZhdWx0U3RhdGUud2lyZWZyYW1lID0gZmFsc2U7CiAgfQogIHJldHVybiB7CiAgICBzZXR1cCwKICAgIHJlc2V0LAogICAgcmVzZXREZWZhdWx0U3RhdGUsCiAgICBkaXNwb3NlLAogICAgcmVsZWFzZVN0YXRlc09mR2VvbWV0cnksCiAgICByZWxlYXNlU3RhdGVzT2ZQcm9ncmFtLAogICAgaW5pdEF0dHJpYnV0ZXMsCiAgICBlbmFibGVBdHRyaWJ1dGUsCiAgICBkaXNhYmxlVW51c2VkQXR0cmlidXRlcwogIH07Cn0KZnVuY3Rpb24gV2ViR0xCdWZmZXJSZW5kZXJlcihnbCwgZXh0ZW5zaW9ucywgaW5mbykgewogIGxldCBtb2RlOwogIGZ1bmN0aW9uIHNldE1vZGUodmFsdWUpIHsKICAgIG1vZGUgPSB2YWx1ZTsKICB9CiAgZnVuY3Rpb24gcmVuZGVyKHN0YXJ0LCBjb3VudCkgewogICAgZ2wuZHJhd0FycmF5cyhtb2RlLCBzdGFydCwgY291bnQpOwogICAgaW5mby51cGRhdGUoY291bnQsIG1vZGUsIDEpOwogIH0KICBmdW5jdGlvbiByZW5kZXJJbnN0YW5jZXMoc3RhcnQsIGNvdW50LCBwcmltY291bnQpIHsKICAgIGlmIChwcmltY291bnQgPT09IDApCiAgICAgIHJldHVybjsKICAgIGdsLmRyYXdBcnJheXNJbnN0YW5jZWQobW9kZSwgc3RhcnQsIGNvdW50LCBwcmltY291bnQpOwogICAgaW5mby51cGRhdGUoY291bnQsIG1vZGUsIHByaW1jb3VudCk7CiAgfQogIGZ1bmN0aW9uIHJlbmRlck11bHRpRHJhdyhzdGFydHMsIGNvdW50cywgZHJhd0NvdW50KSB7CiAgICBpZiAoZHJhd0NvdW50ID09PSAwKQogICAgICByZXR1cm47CiAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCgiV0VCR0xfbXVsdGlfZHJhdyIpOwogICAgZXh0ZW5zaW9uLm11bHRpRHJhd0FycmF5c1dFQkdMKG1vZGUsIHN0YXJ0cywgMCwgY291bnRzLCAwLCBkcmF3Q291bnQpOwogICAgbGV0IGVsZW1lbnRDb3VudCA9IDA7CiAgICBmb3IgKGxldCBpID0gMDtpIDwgZHJhd0NvdW50OyBpKyspIHsKICAgICAgZWxlbWVudENvdW50ICs9IGNvdW50c1tpXTsKICAgIH0KICAgIGluZm8udXBkYXRlKGVsZW1lbnRDb3VudCwgbW9kZSwgMSk7CiAgfQogIGZ1bmN0aW9uIHJlbmRlck11bHRpRHJhd0luc3RhbmNlcyhzdGFydHMsIGNvdW50cywgZHJhd0NvdW50LCBwcmltY291bnQpIHsKICAgIGlmIChkcmF3Q291bnQgPT09IDApCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCJXRUJHTF9tdWx0aV9kcmF3Iik7CiAgICBpZiAoZXh0ZW5zaW9uID09PSBudWxsKSB7CiAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBzdGFydHMubGVuZ3RoOyBpKyspIHsKICAgICAgICByZW5kZXJJbnN0YW5jZXMoc3RhcnRzW2ldLCBjb3VudHNbaV0sIHByaW1jb3VudFtpXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGV4dGVuc2lvbi5tdWx0aURyYXdBcnJheXNJbnN0YW5jZWRXRUJHTChtb2RlLCBzdGFydHMsIDAsIGNvdW50cywgMCwgcHJpbWNvdW50LCAwLCBkcmF3Q291bnQpOwogICAgICBsZXQgZWxlbWVudENvdW50ID0gMDsKICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IGRyYXdDb3VudDsgaSsrKSB7CiAgICAgICAgZWxlbWVudENvdW50ICs9IGNvdW50c1tpXSAqIHByaW1jb3VudFtpXTsKICAgICAgfQogICAgICBpbmZvLnVwZGF0ZShlbGVtZW50Q291bnQsIG1vZGUsIDEpOwogICAgfQogIH0KICB0aGlzLnNldE1vZGUgPSBzZXRNb2RlOwogIHRoaXMucmVuZGVyID0gcmVuZGVyOwogIHRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzOwogIHRoaXMucmVuZGVyTXVsdGlEcmF3ID0gcmVuZGVyTXVsdGlEcmF3OwogIHRoaXMucmVuZGVyTXVsdGlEcmF3SW5zdGFuY2VzID0gcmVuZGVyTXVsdGlEcmF3SW5zdGFuY2VzOwp9CmZ1bmN0aW9uIFdlYkdMQ2FwYWJpbGl0aWVzKGdsLCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzLCB1dGlscykgewogIGxldCBtYXhBbmlzb3Ryb3B5OwogIGZ1bmN0aW9uIGdldE1heEFuaXNvdHJvcHkoKSB7CiAgICBpZiAobWF4QW5pc290cm9weSAhPT0gdW5kZWZpbmVkKQogICAgICByZXR1cm4gbWF4QW5pc290cm9weTsKICAgIGlmIChleHRlbnNpb25zLmhhcygiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikgPT09IHRydWUpIHsKICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpOwogICAgICBtYXhBbmlzb3Ryb3B5ID0gZ2wuZ2V0UGFyYW1ldGVyKGV4dGVuc2lvbi5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQpOwogICAgfSBlbHNlIHsKICAgICAgbWF4QW5pc290cm9weSA9IDA7CiAgICB9CiAgICByZXR1cm4gbWF4QW5pc290cm9weTsKICB9CiAgZnVuY3Rpb24gdGV4dHVyZUZvcm1hdFJlYWRhYmxlKHRleHR1cmVGb3JtYXQpIHsKICAgIGlmICh0ZXh0dXJlRm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHV0aWxzLmNvbnZlcnQodGV4dHVyZUZvcm1hdCkgIT09IGdsLmdldFBhcmFtZXRlcihnbC5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIGZ1bmN0aW9uIHRleHR1cmVUeXBlUmVhZGFibGUodGV4dHVyZVR5cGUpIHsKICAgIGNvbnN0IGhhbGZGbG9hdFN1cHBvcnRlZEJ5RXh0ID0gdGV4dHVyZVR5cGUgPT09IEhhbGZGbG9hdFR5cGUgJiYgKGV4dGVuc2lvbnMuaGFzKCJFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQiKSB8fCBleHRlbnNpb25zLmhhcygiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIpKTsKICAgIGlmICh0ZXh0dXJlVHlwZSAhPT0gVW5zaWduZWRCeXRlVHlwZSAmJiB1dGlscy5jb252ZXJ0KHRleHR1cmVUeXBlKSAhPT0gZ2wuZ2V0UGFyYW1ldGVyKGdsLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSkgJiYgdGV4dHVyZVR5cGUgIT09IEZsb2F0VHlwZSAmJiAhaGFsZkZsb2F0U3VwcG9ydGVkQnlFeHQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIGZ1bmN0aW9uIGdldE1heFByZWNpc2lvbihwcmVjaXNpb24yKSB7CiAgICBpZiAocHJlY2lzaW9uMiA9PT0gImhpZ2hwIikgewogICAgICBpZiAoZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KGdsLlZFUlRFWF9TSEFERVIsIGdsLkhJR0hfRkxPQVQpLnByZWNpc2lvbiA+IDAgJiYgZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KGdsLkZSQUdNRU5UX1NIQURFUiwgZ2wuSElHSF9GTE9BVCkucHJlY2lzaW9uID4gMCkgewogICAgICAgIHJldHVybiAiaGlnaHAiOwogICAgICB9CiAgICAgIHByZWNpc2lvbjIgPSAibWVkaXVtcCI7CiAgICB9CiAgICBpZiAocHJlY2lzaW9uMiA9PT0gIm1lZGl1bXAiKSB7CiAgICAgIGlmIChnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoZ2wuVkVSVEVYX1NIQURFUiwgZ2wuTUVESVVNX0ZMT0FUKS5wcmVjaXNpb24gPiAwICYmIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdChnbC5GUkFHTUVOVF9TSEFERVIsIGdsLk1FRElVTV9GTE9BVCkucHJlY2lzaW9uID4gMCkgewogICAgICAgIHJldHVybiAibWVkaXVtcCI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAibG93cCI7CiAgfQogIGxldCBwcmVjaXNpb24gPSBwYXJhbWV0ZXJzLnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wcmVjaXNpb24gOiAiaGlnaHAiOwogIGNvbnN0IG1heFByZWNpc2lvbiA9IGdldE1heFByZWNpc2lvbihwcmVjaXNpb24pOwogIGlmIChtYXhQcmVjaXNpb24gIT09IHByZWNpc2lvbikgewogICAgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiIsIHByZWNpc2lvbiwgIm5vdCBzdXBwb3J0ZWQsIHVzaW5nIiwgbWF4UHJlY2lzaW9uLCAiaW5zdGVhZC4iKTsKICAgIHByZWNpc2lvbiA9IG1heFByZWNpc2lvbjsKICB9CiAgY29uc3QgbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA9IHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA9PT0gdHJ1ZTsKICBjb25zdCByZXZlcnNlRGVwdGhCdWZmZXIgPSBwYXJhbWV0ZXJzLnJldmVyc2VEZXB0aEJ1ZmZlciA9PT0gdHJ1ZSAmJiBleHRlbnNpb25zLmhhcygiRVhUX2NsaXBfY29udHJvbCIpOwogIGNvbnN0IG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKTsKICBjb25zdCBtYXhWZXJ0ZXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMpOwogIGNvbnN0IG1heFRleHR1cmVTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX1NJWkUpOwogIGNvbnN0IG1heEN1YmVtYXBTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUpOwogIGNvbnN0IG1heEF0dHJpYnV0ZXMgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1ZFUlRFWF9BVFRSSUJTKTsKICBjb25zdCBtYXhWZXJ0ZXhVbmlmb3JtcyA9IGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyk7CiAgY29uc3QgbWF4VmFyeWluZ3MgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1ZBUllJTkdfVkVDVE9SUyk7CiAgY29uc3QgbWF4RnJhZ21lbnRVbmlmb3JtcyA9IGdsLmdldFBhcmFtZXRlcihnbC5NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTKTsKICBjb25zdCB2ZXJ0ZXhUZXh0dXJlcyA9IG1heFZlcnRleFRleHR1cmVzID4gMDsKICBjb25zdCBtYXhTYW1wbGVzID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9TQU1QTEVTKTsKICByZXR1cm4gewogICAgaXNXZWJHTDI6IHRydWUsCiAgICBnZXRNYXhBbmlzb3Ryb3B5LAogICAgZ2V0TWF4UHJlY2lzaW9uLAogICAgdGV4dHVyZUZvcm1hdFJlYWRhYmxlLAogICAgdGV4dHVyZVR5cGVSZWFkYWJsZSwKICAgIHByZWNpc2lvbiwKICAgIGxvZ2FyaXRobWljRGVwdGhCdWZmZXIsCiAgICByZXZlcnNlRGVwdGhCdWZmZXIsCiAgICBtYXhUZXh0dXJlcywKICAgIG1heFZlcnRleFRleHR1cmVzLAogICAgbWF4VGV4dHVyZVNpemUsCiAgICBtYXhDdWJlbWFwU2l6ZSwKICAgIG1heEF0dHJpYnV0ZXMsCiAgICBtYXhWZXJ0ZXhVbmlmb3JtcywKICAgIG1heFZhcnlpbmdzLAogICAgbWF4RnJhZ21lbnRVbmlmb3JtcywKICAgIHZlcnRleFRleHR1cmVzLAogICAgbWF4U2FtcGxlcwogIH07Cn0KZnVuY3Rpb24gV2ViR0xDbGlwcGluZyhwcm9wZXJ0aWVzKSB7CiAgY29uc3Qgc2NvcGUgPSB0aGlzOwogIGxldCBnbG9iYWxTdGF0ZSA9IG51bGwsIG51bUdsb2JhbFBsYW5lcyA9IDAsIGxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2UsIHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZTsKICBjb25zdCBwbGFuZSA9IG5ldyBQbGFuZSwgdmlld05vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzLCB1bmlmb3JtID0geyB2YWx1ZTogbnVsbCwgbmVlZHNVcGRhdGU6IGZhbHNlIH07CiAgdGhpcy51bmlmb3JtID0gdW5pZm9ybTsKICB0aGlzLm51bVBsYW5lcyA9IDA7CiAgdGhpcy5udW1JbnRlcnNlY3Rpb24gPSAwOwogIHRoaXMuaW5pdCA9IGZ1bmN0aW9uKHBsYW5lcywgZW5hYmxlTG9jYWxDbGlwcGluZykgewogICAgY29uc3QgZW5hYmxlZCA9IHBsYW5lcy5sZW5ndGggIT09IDAgfHwgZW5hYmxlTG9jYWxDbGlwcGluZyB8fCBudW1HbG9iYWxQbGFuZXMgIT09IDAgfHwgbG9jYWxDbGlwcGluZ0VuYWJsZWQ7CiAgICBsb2NhbENsaXBwaW5nRW5hYmxlZCA9IGVuYWJsZUxvY2FsQ2xpcHBpbmc7CiAgICBudW1HbG9iYWxQbGFuZXMgPSBwbGFuZXMubGVuZ3RoOwogICAgcmV0dXJuIGVuYWJsZWQ7CiAgfTsKICB0aGlzLmJlZ2luU2hhZG93cyA9IGZ1bmN0aW9uKCkgewogICAgcmVuZGVyaW5nU2hhZG93cyA9IHRydWU7CiAgICBwcm9qZWN0UGxhbmVzKG51bGwpOwogIH07CiAgdGhpcy5lbmRTaGFkb3dzID0gZnVuY3Rpb24oKSB7CiAgICByZW5kZXJpbmdTaGFkb3dzID0gZmFsc2U7CiAgfTsKICB0aGlzLnNldEdsb2JhbFN0YXRlID0gZnVuY3Rpb24ocGxhbmVzLCBjYW1lcmEpIHsKICAgIGdsb2JhbFN0YXRlID0gcHJvamVjdFBsYW5lcyhwbGFuZXMsIGNhbWVyYSwgMCk7CiAgfTsKICB0aGlzLnNldFN0YXRlID0gZnVuY3Rpb24obWF0ZXJpYWwsIGNhbWVyYSwgdXNlQ2FjaGUpIHsKICAgIGNvbnN0IHsgY2xpcHBpbmdQbGFuZXM6IHBsYW5lcywgY2xpcEludGVyc2VjdGlvbiwgY2xpcFNoYWRvd3MgfSA9IG1hdGVyaWFsOwogICAgY29uc3QgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQobWF0ZXJpYWwpOwogICAgaWYgKCFsb2NhbENsaXBwaW5nRW5hYmxlZCB8fCBwbGFuZXMgPT09IG51bGwgfHwgcGxhbmVzLmxlbmd0aCA9PT0gMCB8fCByZW5kZXJpbmdTaGFkb3dzICYmICFjbGlwU2hhZG93cykgewogICAgICBpZiAocmVuZGVyaW5nU2hhZG93cykgewogICAgICAgIHByb2plY3RQbGFuZXMobnVsbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzZXRHbG9iYWxTdGF0ZSgpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCBuR2xvYmFsID0gcmVuZGVyaW5nU2hhZG93cyA/IDAgOiBudW1HbG9iYWxQbGFuZXMsIGxHbG9iYWwgPSBuR2xvYmFsICogNDsKICAgICAgbGV0IGRzdEFycmF5ID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLmNsaXBwaW5nU3RhdGUgfHwgbnVsbDsKICAgICAgdW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5OwogICAgICBkc3RBcnJheSA9IHByb2plY3RQbGFuZXMocGxhbmVzLCBjYW1lcmEsIGxHbG9iYWwsIHVzZUNhY2hlKTsKICAgICAgZm9yIChsZXQgaSA9IDA7aSAhPT0gbEdsb2JhbDsgKytpKSB7CiAgICAgICAgZHN0QXJyYXlbaV0gPSBnbG9iYWxTdGF0ZVtpXTsKICAgICAgfQogICAgICBtYXRlcmlhbFByb3BlcnRpZXMuY2xpcHBpbmdTdGF0ZSA9IGRzdEFycmF5OwogICAgICB0aGlzLm51bUludGVyc2VjdGlvbiA9IGNsaXBJbnRlcnNlY3Rpb24gPyB0aGlzLm51bVBsYW5lcyA6IDA7CiAgICAgIHRoaXMubnVtUGxhbmVzICs9IG5HbG9iYWw7CiAgICB9CiAgfTsKICBmdW5jdGlvbiByZXNldEdsb2JhbFN0YXRlKCkgewogICAgaWYgKHVuaWZvcm0udmFsdWUgIT09IGdsb2JhbFN0YXRlKSB7CiAgICAgIHVuaWZvcm0udmFsdWUgPSBnbG9iYWxTdGF0ZTsKICAgICAgdW5pZm9ybS5uZWVkc1VwZGF0ZSA9IG51bUdsb2JhbFBsYW5lcyA+IDA7CiAgICB9CiAgICBzY29wZS5udW1QbGFuZXMgPSBudW1HbG9iYWxQbGFuZXM7CiAgICBzY29wZS5udW1JbnRlcnNlY3Rpb24gPSAwOwogIH0KICBmdW5jdGlvbiBwcm9qZWN0UGxhbmVzKHBsYW5lcywgY2FtZXJhLCBkc3RPZmZzZXQsIHNraXBUcmFuc2Zvcm0pIHsKICAgIGNvbnN0IG5QbGFuZXMgPSBwbGFuZXMgIT09IG51bGwgPyBwbGFuZXMubGVuZ3RoIDogMDsKICAgIGxldCBkc3RBcnJheSA9IG51bGw7CiAgICBpZiAoblBsYW5lcyAhPT0gMCkgewogICAgICBkc3RBcnJheSA9IHVuaWZvcm0udmFsdWU7CiAgICAgIGlmIChza2lwVHJhbnNmb3JtICE9PSB0cnVlIHx8IGRzdEFycmF5ID09PSBudWxsKSB7CiAgICAgICAgY29uc3QgZmxhdFNpemUgPSBkc3RPZmZzZXQgKyBuUGxhbmVzICogNCwgdmlld01hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2U7CiAgICAgICAgdmlld05vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgodmlld01hdHJpeCk7CiAgICAgICAgaWYgKGRzdEFycmF5ID09PSBudWxsIHx8IGRzdEFycmF5Lmxlbmd0aCA8IGZsYXRTaXplKSB7CiAgICAgICAgICBkc3RBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoZmxhdFNpemUpOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMCwgaTQgPSBkc3RPZmZzZXQ7aSAhPT0gblBsYW5lczsgKytpLCBpNCArPSA0KSB7CiAgICAgICAgICBwbGFuZS5jb3B5KHBsYW5lc1tpXSkuYXBwbHlNYXRyaXg0KHZpZXdNYXRyaXgsIHZpZXdOb3JtYWxNYXRyaXgpOwogICAgICAgICAgcGxhbmUubm9ybWFsLnRvQXJyYXkoZHN0QXJyYXksIGk0KTsKICAgICAgICAgIGRzdEFycmF5W2k0ICsgM10gPSBwbGFuZS5jb25zdGFudDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5OwogICAgICB1bmlmb3JtLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgIH0KICAgIHNjb3BlLm51bVBsYW5lcyA9IG5QbGFuZXM7CiAgICBzY29wZS5udW1JbnRlcnNlY3Rpb24gPSAwOwogICAgcmV0dXJuIGRzdEFycmF5OwogIH0KfQpmdW5jdGlvbiBXZWJHTEN1YmVNYXBzKHJlbmRlcmVyKSB7CiAgbGV0IGN1YmVtYXBzID0gbmV3IFdlYWtNYXA7CiAgZnVuY3Rpb24gbWFwVGV4dHVyZU1hcHBpbmcodGV4dHVyZSwgbWFwcGluZykgewogICAgaWYgKG1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nKSB7CiAgICAgIHRleHR1cmUubWFwcGluZyA9IEN1YmVSZWZsZWN0aW9uTWFwcGluZzsKICAgIH0gZWxzZSBpZiAobWFwcGluZyA9PT0gRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcpIHsKICAgICAgdGV4dHVyZS5tYXBwaW5nID0gQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOwogICAgfQogICAgcmV0dXJuIHRleHR1cmU7CiAgfQogIGZ1bmN0aW9uIGdldCh0ZXh0dXJlKSB7CiAgICBpZiAodGV4dHVyZSAmJiB0ZXh0dXJlLmlzVGV4dHVyZSkgewogICAgICBjb25zdCBtYXBwaW5nID0gdGV4dHVyZS5tYXBwaW5nOwogICAgICBpZiAobWFwcGluZyA9PT0gRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcgfHwgbWFwcGluZyA9PT0gRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcpIHsKICAgICAgICBpZiAoY3ViZW1hcHMuaGFzKHRleHR1cmUpKSB7CiAgICAgICAgICBjb25zdCBjdWJlbWFwID0gY3ViZW1hcHMuZ2V0KHRleHR1cmUpLnRleHR1cmU7CiAgICAgICAgICByZXR1cm4gbWFwVGV4dHVyZU1hcHBpbmcoY3ViZW1hcCwgdGV4dHVyZS5tYXBwaW5nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlOwogICAgICAgICAgaWYgKGltYWdlICYmIGltYWdlLmhlaWdodCA+IDApIHsKICAgICAgICAgICAgY29uc3QgcmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMQ3ViZVJlbmRlclRhcmdldChpbWFnZS5oZWlnaHQpOwogICAgICAgICAgICByZW5kZXJUYXJnZXQuZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmUocmVuZGVyZXIsIHRleHR1cmUpOwogICAgICAgICAgICBjdWJlbWFwcy5zZXQodGV4dHVyZSwgcmVuZGVyVGFyZ2V0KTsKICAgICAgICAgICAgdGV4dHVyZS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgb25UZXh0dXJlRGlzcG9zZSk7CiAgICAgICAgICAgIHJldHVybiBtYXBUZXh0dXJlTWFwcGluZyhyZW5kZXJUYXJnZXQudGV4dHVyZSwgdGV4dHVyZS5tYXBwaW5nKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRleHR1cmU7CiAgfQogIGZ1bmN0aW9uIG9uVGV4dHVyZURpc3Bvc2UoZXZlbnQpIHsKICAgIGNvbnN0IHRleHR1cmUgPSBldmVudC50YXJnZXQ7CiAgICB0ZXh0dXJlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLCBvblRleHR1cmVEaXNwb3NlKTsKICAgIGNvbnN0IGN1YmVtYXAgPSBjdWJlbWFwcy5nZXQodGV4dHVyZSk7CiAgICBpZiAoY3ViZW1hcCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGN1YmVtYXBzLmRlbGV0ZSh0ZXh0dXJlKTsKICAgICAgY3ViZW1hcC5kaXNwb3NlKCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGRpc3Bvc2UoKSB7CiAgICBjdWJlbWFwcyA9IG5ldyBXZWFrTWFwOwogIH0KICByZXR1cm4gewogICAgZ2V0LAogICAgZGlzcG9zZQogIH07Cn0KCmNsYXNzIFBNUkVNR2VuZXJhdG9yIHsKICBjb25zdHJ1Y3RvcihyZW5kZXJlcikgewogICAgdGhpcy5fcmVuZGVyZXIgPSByZW5kZXJlcjsKICAgIHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0ID0gbnVsbDsKICAgIHRoaXMuX2xvZE1heCA9IDA7CiAgICB0aGlzLl9jdWJlU2l6ZSA9IDA7CiAgICB0aGlzLl9sb2RQbGFuZXMgPSBbXTsKICAgIHRoaXMuX3NpemVMb2RzID0gW107CiAgICB0aGlzLl9zaWdtYXMgPSBbXTsKICAgIHRoaXMuX2JsdXJNYXRlcmlhbCA9IG51bGw7CiAgICB0aGlzLl9jdWJlbWFwTWF0ZXJpYWwgPSBudWxsOwogICAgdGhpcy5fZXF1aXJlY3RNYXRlcmlhbCA9IG51bGw7CiAgICB0aGlzLl9jb21waWxlTWF0ZXJpYWwodGhpcy5fYmx1ck1hdGVyaWFsKTsKICB9CiAgZnJvbVNjZW5lKHNjZW5lLCBzaWdtYSA9IDAsIG5lYXIgPSAwLjEsIGZhciA9IDEwMCkgewogICAgX29sZFRhcmdldCA9IHRoaXMuX3JlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpOwogICAgX29sZEFjdGl2ZUN1YmVGYWNlID0gdGhpcy5fcmVuZGVyZXIuZ2V0QWN0aXZlQ3ViZUZhY2UoKTsKICAgIF9vbGRBY3RpdmVNaXBtYXBMZXZlbCA9IHRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZU1pcG1hcExldmVsKCk7CiAgICBfb2xkWHJFbmFibGVkID0gdGhpcy5fcmVuZGVyZXIueHIuZW5hYmxlZDsKICAgIHRoaXMuX3JlbmRlcmVyLnhyLmVuYWJsZWQgPSBmYWxzZTsKICAgIHRoaXMuX3NldFNpemUoMjU2KTsKICAgIGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IHRoaXMuX2FsbG9jYXRlVGFyZ2V0cygpOwogICAgY3ViZVVWUmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyID0gdHJ1ZTsKICAgIHRoaXMuX3NjZW5lVG9DdWJlVVYoc2NlbmUsIG5lYXIsIGZhciwgY3ViZVVWUmVuZGVyVGFyZ2V0KTsKICAgIGlmIChzaWdtYSA+IDApIHsKICAgICAgdGhpcy5fYmx1cihjdWJlVVZSZW5kZXJUYXJnZXQsIDAsIDAsIHNpZ21hKTsKICAgIH0KICAgIHRoaXMuX2FwcGx5UE1SRU0oY3ViZVVWUmVuZGVyVGFyZ2V0KTsKICAgIHRoaXMuX2NsZWFudXAoY3ViZVVWUmVuZGVyVGFyZ2V0KTsKICAgIHJldHVybiBjdWJlVVZSZW5kZXJUYXJnZXQ7CiAgfQogIGZyb21FcXVpcmVjdGFuZ3VsYXIoZXF1aXJlY3Rhbmd1bGFyLCByZW5kZXJUYXJnZXQgPSBudWxsKSB7CiAgICByZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUoZXF1aXJlY3Rhbmd1bGFyLCByZW5kZXJUYXJnZXQpOwogIH0KICBmcm9tQ3ViZW1hcChjdWJlbWFwLCByZW5kZXJUYXJnZXQgPSBudWxsKSB7CiAgICByZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUoY3ViZW1hcCwgcmVuZGVyVGFyZ2V0KTsKICB9CiAgY29tcGlsZUN1YmVtYXBTaGFkZXIoKSB7CiAgICBpZiAodGhpcy5fY3ViZW1hcE1hdGVyaWFsID09PSBudWxsKSB7CiAgICAgIHRoaXMuX2N1YmVtYXBNYXRlcmlhbCA9IF9nZXRDdWJlbWFwTWF0ZXJpYWwoKTsKICAgICAgdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2N1YmVtYXBNYXRlcmlhbCk7CiAgICB9CiAgfQogIGNvbXBpbGVFcXVpcmVjdGFuZ3VsYXJTaGFkZXIoKSB7CiAgICBpZiAodGhpcy5fZXF1aXJlY3RNYXRlcmlhbCA9PT0gbnVsbCkgewogICAgICB0aGlzLl9lcXVpcmVjdE1hdGVyaWFsID0gX2dldEVxdWlyZWN0TWF0ZXJpYWwoKTsKICAgICAgdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwpOwogICAgfQogIH0KICBkaXNwb3NlKCkgewogICAgdGhpcy5fZGlzcG9zZSgpOwogICAgaWYgKHRoaXMuX2N1YmVtYXBNYXRlcmlhbCAhPT0gbnVsbCkKICAgICAgdGhpcy5fY3ViZW1hcE1hdGVyaWFsLmRpc3Bvc2UoKTsKICAgIGlmICh0aGlzLl9lcXVpcmVjdE1hdGVyaWFsICE9PSBudWxsKQogICAgICB0aGlzLl9lcXVpcmVjdE1hdGVyaWFsLmRpc3Bvc2UoKTsKICB9CiAgX3NldFNpemUoY3ViZVNpemUpIHsKICAgIHRoaXMuX2xvZE1heCA9IE1hdGguZmxvb3IoTWF0aC5sb2cyKGN1YmVTaXplKSk7CiAgICB0aGlzLl9jdWJlU2l6ZSA9IE1hdGgucG93KDIsIHRoaXMuX2xvZE1heCk7CiAgfQogIF9kaXNwb3NlKCkgewogICAgaWYgKHRoaXMuX2JsdXJNYXRlcmlhbCAhPT0gbnVsbCkKICAgICAgdGhpcy5fYmx1ck1hdGVyaWFsLmRpc3Bvc2UoKTsKICAgIGlmICh0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldCAhPT0gbnVsbCkKICAgICAgdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQuZGlzcG9zZSgpOwogICAgZm9yIChsZXQgaSA9IDA7aSA8IHRoaXMuX2xvZFBsYW5lcy5sZW5ndGg7IGkrKykgewogICAgICB0aGlzLl9sb2RQbGFuZXNbaV0uZGlzcG9zZSgpOwogICAgfQogIH0KICBfY2xlYW51cChvdXRwdXRUYXJnZXQpIHsKICAgIHRoaXMuX3JlbmRlcmVyLnNldFJlbmRlclRhcmdldChfb2xkVGFyZ2V0LCBfb2xkQWN0aXZlQ3ViZUZhY2UsIF9vbGRBY3RpdmVNaXBtYXBMZXZlbCk7CiAgICB0aGlzLl9yZW5kZXJlci54ci5lbmFibGVkID0gX29sZFhyRW5hYmxlZDsKICAgIG91dHB1dFRhcmdldC5zY2lzc29yVGVzdCA9IGZhbHNlOwogICAgX3NldFZpZXdwb3J0KG91dHB1dFRhcmdldCwgMCwgMCwgb3V0cHV0VGFyZ2V0LndpZHRoLCBvdXRwdXRUYXJnZXQuaGVpZ2h0KTsKICB9CiAgX2Zyb21UZXh0dXJlKHRleHR1cmUsIHJlbmRlclRhcmdldCkgewogICAgaWYgKHRleHR1cmUubWFwcGluZyA9PT0gQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIHx8IHRleHR1cmUubWFwcGluZyA9PT0gQ3ViZVJlZnJhY3Rpb25NYXBwaW5nKSB7CiAgICAgIHRoaXMuX3NldFNpemUodGV4dHVyZS5pbWFnZS5sZW5ndGggPT09IDAgPyAxNiA6IHRleHR1cmUuaW1hZ2VbMF0ud2lkdGggfHwgdGV4dHVyZS5pbWFnZVswXS5pbWFnZS53aWR0aCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLl9zZXRTaXplKHRleHR1cmUuaW1hZ2Uud2lkdGggLyA0KTsKICAgIH0KICAgIF9vbGRUYXJnZXQgPSB0aGlzLl9yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTsKICAgIF9vbGRBY3RpdmVDdWJlRmFjZSA9IHRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZUN1YmVGYWNlKCk7CiAgICBfb2xkQWN0aXZlTWlwbWFwTGV2ZWwgPSB0aGlzLl9yZW5kZXJlci5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpOwogICAgX29sZFhyRW5hYmxlZCA9IHRoaXMuX3JlbmRlcmVyLnhyLmVuYWJsZWQ7CiAgICB0aGlzLl9yZW5kZXJlci54ci5lbmFibGVkID0gZmFsc2U7CiAgICBjb25zdCBjdWJlVVZSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQgfHwgdGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7CiAgICB0aGlzLl90ZXh0dXJlVG9DdWJlVVYodGV4dHVyZSwgY3ViZVVWUmVuZGVyVGFyZ2V0KTsKICAgIHRoaXMuX2FwcGx5UE1SRU0oY3ViZVVWUmVuZGVyVGFyZ2V0KTsKICAgIHRoaXMuX2NsZWFudXAoY3ViZVVWUmVuZGVyVGFyZ2V0KTsKICAgIHJldHVybiBjdWJlVVZSZW5kZXJUYXJnZXQ7CiAgfQogIF9hbGxvY2F0ZVRhcmdldHMoKSB7CiAgICBjb25zdCB3aWR0aCA9IDMgKiBNYXRoLm1heCh0aGlzLl9jdWJlU2l6ZSwgMTYgKiA3KTsKICAgIGNvbnN0IGhlaWdodCA9IDQgKiB0aGlzLl9jdWJlU2l6ZTsKICAgIGNvbnN0IHBhcmFtcyA9IHsKICAgICAgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsCiAgICAgIG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLAogICAgICBnZW5lcmF0ZU1pcG1hcHM6IGZhbHNlLAogICAgICB0eXBlOiBIYWxmRmxvYXRUeXBlLAogICAgICBmb3JtYXQ6IFJHQkFGb3JtYXQsCiAgICAgIGNvbG9yU3BhY2U6IExpbmVhclNSR0JDb2xvclNwYWNlLAogICAgICBkZXB0aEJ1ZmZlcjogZmFsc2UKICAgIH07CiAgICBjb25zdCBjdWJlVVZSZW5kZXJUYXJnZXQgPSBfY3JlYXRlUmVuZGVyVGFyZ2V0KHdpZHRoLCBoZWlnaHQsIHBhcmFtcyk7CiAgICBpZiAodGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQgPT09IG51bGwgfHwgdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQud2lkdGggIT09IHdpZHRoIHx8IHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LmhlaWdodCAhPT0gaGVpZ2h0KSB7CiAgICAgIGlmICh0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldCAhPT0gbnVsbCkgewogICAgICAgIHRoaXMuX2Rpc3Bvc2UoKTsKICAgICAgfQogICAgICB0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldCA9IF9jcmVhdGVSZW5kZXJUYXJnZXQod2lkdGgsIGhlaWdodCwgcGFyYW1zKTsKICAgICAgY29uc3QgeyBfbG9kTWF4IH0gPSB0aGlzOwogICAgICAoeyBzaXplTG9kczogdGhpcy5fc2l6ZUxvZHMsIGxvZFBsYW5lczogdGhpcy5fbG9kUGxhbmVzLCBzaWdtYXM6IHRoaXMuX3NpZ21hcyB9ID0gX2NyZWF0ZVBsYW5lcyhfbG9kTWF4KSk7CiAgICAgIHRoaXMuX2JsdXJNYXRlcmlhbCA9IF9nZXRCbHVyU2hhZGVyKF9sb2RNYXgsIHdpZHRoLCBoZWlnaHQpOwogICAgfQogICAgcmV0dXJuIGN1YmVVVlJlbmRlclRhcmdldDsKICB9CiAgX2NvbXBpbGVNYXRlcmlhbChtYXRlcmlhbCkgewogICAgY29uc3QgdG1wTWVzaCA9IG5ldyBNZXNoKHRoaXMuX2xvZFBsYW5lc1swXSwgbWF0ZXJpYWwpOwogICAgdGhpcy5fcmVuZGVyZXIuY29tcGlsZSh0bXBNZXNoLCBfZmxhdENhbWVyYSk7CiAgfQogIF9zY2VuZVRvQ3ViZVVWKHNjZW5lLCBuZWFyLCBmYXIsIGN1YmVVVlJlbmRlclRhcmdldCkgewogICAgY29uc3QgZm92MiA9IDkwOwogICAgY29uc3QgYXNwZWN0MiA9IDE7CiAgICBjb25zdCBjdWJlQ2FtZXJhID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKGZvdjIsIGFzcGVjdDIsIG5lYXIsIGZhcik7CiAgICBjb25zdCB1cFNpZ24gPSBbMSwgLTEsIDEsIDEsIDEsIDFdOwogICAgY29uc3QgZm9yd2FyZFNpZ24gPSBbMSwgMSwgMSwgLTEsIC0xLCAtMV07CiAgICBjb25zdCByZW5kZXJlciA9IHRoaXMuX3JlbmRlcmVyOwogICAgY29uc3Qgb3JpZ2luYWxBdXRvQ2xlYXIgPSByZW5kZXJlci5hdXRvQ2xlYXI7CiAgICBjb25zdCB0b25lTWFwcGluZyA9IHJlbmRlcmVyLnRvbmVNYXBwaW5nOwogICAgcmVuZGVyZXIuZ2V0Q2xlYXJDb2xvcihfY2xlYXJDb2xvcik7CiAgICByZW5kZXJlci50b25lTWFwcGluZyA9IE5vVG9uZU1hcHBpbmc7CiAgICByZW5kZXJlci5hdXRvQ2xlYXIgPSBmYWxzZTsKICAgIGNvbnN0IGJhY2tncm91bmRNYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7CiAgICAgIG5hbWU6ICJQTVJFTS5CYWNrZ3JvdW5kIiwKICAgICAgc2lkZTogQmFja1NpZGUsCiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLAogICAgICBkZXB0aFRlc3Q6IGZhbHNlCiAgICB9KTsKICAgIGNvbnN0IGJhY2tncm91bmRCb3ggPSBuZXcgTWVzaChuZXcgQm94R2VvbWV0cnksIGJhY2tncm91bmRNYXRlcmlhbCk7CiAgICBsZXQgdXNlU29saWRDb2xvciA9IGZhbHNlOwogICAgY29uc3QgYmFja2dyb3VuZCA9IHNjZW5lLmJhY2tncm91bmQ7CiAgICBpZiAoYmFja2dyb3VuZCkgewogICAgICBpZiAoYmFja2dyb3VuZC5pc0NvbG9yKSB7CiAgICAgICAgYmFja2dyb3VuZE1hdGVyaWFsLmNvbG9yLmNvcHkoYmFja2dyb3VuZCk7CiAgICAgICAgc2NlbmUuYmFja2dyb3VuZCA9IG51bGw7CiAgICAgICAgdXNlU29saWRDb2xvciA9IHRydWU7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGJhY2tncm91bmRNYXRlcmlhbC5jb2xvci5jb3B5KF9jbGVhckNvbG9yKTsKICAgICAgdXNlU29saWRDb2xvciA9IHRydWU7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMDtpIDwgNjsgaSsrKSB7CiAgICAgIGNvbnN0IGNvbCA9IGkgJSAzOwogICAgICBpZiAoY29sID09PSAwKSB7CiAgICAgICAgY3ViZUNhbWVyYS51cC5zZXQoMCwgdXBTaWduW2ldLCAwKTsKICAgICAgICBjdWJlQ2FtZXJhLmxvb2tBdChmb3J3YXJkU2lnbltpXSwgMCwgMCk7CiAgICAgIH0gZWxzZSBpZiAoY29sID09PSAxKSB7CiAgICAgICAgY3ViZUNhbWVyYS51cC5zZXQoMCwgMCwgdXBTaWduW2ldKTsKICAgICAgICBjdWJlQ2FtZXJhLmxvb2tBdCgwLCBmb3J3YXJkU2lnbltpXSwgMCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3ViZUNhbWVyYS51cC5zZXQoMCwgdXBTaWduW2ldLCAwKTsKICAgICAgICBjdWJlQ2FtZXJhLmxvb2tBdCgwLCAwLCBmb3J3YXJkU2lnbltpXSk7CiAgICAgIH0KICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuX2N1YmVTaXplOwogICAgICBfc2V0Vmlld3BvcnQoY3ViZVVWUmVuZGVyVGFyZ2V0LCBjb2wgKiBzaXplLCBpID4gMiA/IHNpemUgOiAwLCBzaXplLCBzaXplKTsKICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KGN1YmVVVlJlbmRlclRhcmdldCk7CiAgICAgIGlmICh1c2VTb2xpZENvbG9yKSB7CiAgICAgICAgcmVuZGVyZXIucmVuZGVyKGJhY2tncm91bmRCb3gsIGN1YmVDYW1lcmEpOwogICAgICB9CiAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY3ViZUNhbWVyYSk7CiAgICB9CiAgICBiYWNrZ3JvdW5kQm94Lmdlb21ldHJ5LmRpc3Bvc2UoKTsKICAgIGJhY2tncm91bmRCb3gubWF0ZXJpYWwuZGlzcG9zZSgpOwogICAgcmVuZGVyZXIudG9uZU1hcHBpbmcgPSB0b25lTWFwcGluZzsKICAgIHJlbmRlcmVyLmF1dG9DbGVhciA9IG9yaWdpbmFsQXV0b0NsZWFyOwogICAgc2NlbmUuYmFja2dyb3VuZCA9IGJhY2tncm91bmQ7CiAgfQogIF90ZXh0dXJlVG9DdWJlVVYodGV4dHVyZSwgY3ViZVVWUmVuZGVyVGFyZ2V0KSB7CiAgICBjb25zdCByZW5kZXJlciA9IHRoaXMuX3JlbmRlcmVyOwogICAgY29uc3QgaXNDdWJlVGV4dHVyZSA9IHRleHR1cmUubWFwcGluZyA9PT0gQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIHx8IHRleHR1cmUubWFwcGluZyA9PT0gQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOwogICAgaWYgKGlzQ3ViZVRleHR1cmUpIHsKICAgICAgaWYgKHRoaXMuX2N1YmVtYXBNYXRlcmlhbCA9PT0gbnVsbCkgewogICAgICAgIHRoaXMuX2N1YmVtYXBNYXRlcmlhbCA9IF9nZXRDdWJlbWFwTWF0ZXJpYWwoKTsKICAgICAgfQogICAgICB0aGlzLl9jdWJlbWFwTWF0ZXJpYWwudW5pZm9ybXMuZmxpcEVudk1hcC52YWx1ZSA9IHRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID09PSBmYWxzZSA/IC0xIDogMTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh0aGlzLl9lcXVpcmVjdE1hdGVyaWFsID09PSBudWxsKSB7CiAgICAgICAgdGhpcy5fZXF1aXJlY3RNYXRlcmlhbCA9IF9nZXRFcXVpcmVjdE1hdGVyaWFsKCk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG1hdGVyaWFsID0gaXNDdWJlVGV4dHVyZSA/IHRoaXMuX2N1YmVtYXBNYXRlcmlhbCA6IHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWw7CiAgICBjb25zdCBtZXNoID0gbmV3IE1lc2godGhpcy5fbG9kUGxhbmVzWzBdLCBtYXRlcmlhbCk7CiAgICBjb25zdCB1bmlmb3JtcyA9IG1hdGVyaWFsLnVuaWZvcm1zOwogICAgdW5pZm9ybXNbImVudk1hcCJdLnZhbHVlID0gdGV4dHVyZTsKICAgIGNvbnN0IHNpemUgPSB0aGlzLl9jdWJlU2l6ZTsKICAgIF9zZXRWaWV3cG9ydChjdWJlVVZSZW5kZXJUYXJnZXQsIDAsIDAsIDMgKiBzaXplLCAyICogc2l6ZSk7CiAgICByZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoY3ViZVVWUmVuZGVyVGFyZ2V0KTsKICAgIHJlbmRlcmVyLnJlbmRlcihtZXNoLCBfZmxhdENhbWVyYSk7CiAgfQogIF9hcHBseVBNUkVNKGN1YmVVVlJlbmRlclRhcmdldCkgewogICAgY29uc3QgcmVuZGVyZXIgPSB0aGlzLl9yZW5kZXJlcjsKICAgIGNvbnN0IGF1dG9DbGVhciA9IHJlbmRlcmVyLmF1dG9DbGVhcjsKICAgIHJlbmRlcmVyLmF1dG9DbGVhciA9IGZhbHNlOwogICAgY29uc3QgbiA9IHRoaXMuX2xvZFBsYW5lcy5sZW5ndGg7CiAgICBmb3IgKGxldCBpID0gMTtpIDwgbjsgaSsrKSB7CiAgICAgIGNvbnN0IHNpZ21hID0gTWF0aC5zcXJ0KHRoaXMuX3NpZ21hc1tpXSAqIHRoaXMuX3NpZ21hc1tpXSAtIHRoaXMuX3NpZ21hc1tpIC0gMV0gKiB0aGlzLl9zaWdtYXNbaSAtIDFdKTsKICAgICAgY29uc3QgcG9sZUF4aXMgPSBfYXhpc0RpcmVjdGlvbnNbKG4gLSBpIC0gMSkgJSBfYXhpc0RpcmVjdGlvbnMubGVuZ3RoXTsKICAgICAgdGhpcy5fYmx1cihjdWJlVVZSZW5kZXJUYXJnZXQsIGkgLSAxLCBpLCBzaWdtYSwgcG9sZUF4aXMpOwogICAgfQogICAgcmVuZGVyZXIuYXV0b0NsZWFyID0gYXV0b0NsZWFyOwogIH0KICBfYmx1cihjdWJlVVZSZW5kZXJUYXJnZXQsIGxvZEluLCBsb2RPdXQsIHNpZ21hLCBwb2xlQXhpcykgewogICAgY29uc3QgcGluZ1BvbmdSZW5kZXJUYXJnZXQgPSB0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldDsKICAgIHRoaXMuX2hhbGZCbHVyKGN1YmVVVlJlbmRlclRhcmdldCwgcGluZ1BvbmdSZW5kZXJUYXJnZXQsIGxvZEluLCBsb2RPdXQsIHNpZ21hLCAibGF0aXR1ZGluYWwiLCBwb2xlQXhpcyk7CiAgICB0aGlzLl9oYWxmQmx1cihwaW5nUG9uZ1JlbmRlclRhcmdldCwgY3ViZVVWUmVuZGVyVGFyZ2V0LCBsb2RPdXQsIGxvZE91dCwgc2lnbWEsICJsb25naXR1ZGluYWwiLCBwb2xlQXhpcyk7CiAgfQogIF9oYWxmQmx1cih0YXJnZXRJbiwgdGFyZ2V0T3V0LCBsb2RJbiwgbG9kT3V0LCBzaWdtYVJhZGlhbnMsIGRpcmVjdGlvbiwgcG9sZUF4aXMpIHsKICAgIGNvbnN0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7CiAgICBjb25zdCBibHVyTWF0ZXJpYWwgPSB0aGlzLl9ibHVyTWF0ZXJpYWw7CiAgICBpZiAoZGlyZWN0aW9uICE9PSAibGF0aXR1ZGluYWwiICYmIGRpcmVjdGlvbiAhPT0gImxvbmdpdHVkaW5hbCIpIHsKICAgICAgY29uc29sZS5lcnJvcigiYmx1ciBkaXJlY3Rpb24gbXVzdCBiZSBlaXRoZXIgbGF0aXR1ZGluYWwgb3IgbG9uZ2l0dWRpbmFsISIpOwogICAgfQogICAgY29uc3QgU1RBTkRBUkRfREVWSUFUSU9OUyA9IDM7CiAgICBjb25zdCBibHVyTWVzaCA9IG5ldyBNZXNoKHRoaXMuX2xvZFBsYW5lc1tsb2RPdXRdLCBibHVyTWF0ZXJpYWwpOwogICAgY29uc3QgYmx1clVuaWZvcm1zID0gYmx1ck1hdGVyaWFsLnVuaWZvcm1zOwogICAgY29uc3QgcGl4ZWxzID0gdGhpcy5fc2l6ZUxvZHNbbG9kSW5dIC0gMTsKICAgIGNvbnN0IHJhZGlhbnNQZXJQaXhlbCA9IGlzRmluaXRlKHNpZ21hUmFkaWFucykgPyBNYXRoLlBJIC8gKDIgKiBwaXhlbHMpIDogMiAqIE1hdGguUEkgLyAoMiAqIE1BWF9TQU1QTEVTIC0gMSk7CiAgICBjb25zdCBzaWdtYVBpeGVscyA9IHNpZ21hUmFkaWFucyAvIHJhZGlhbnNQZXJQaXhlbDsKICAgIGNvbnN0IHNhbXBsZXMgPSBpc0Zpbml0ZShzaWdtYVJhZGlhbnMpID8gMSArIE1hdGguZmxvb3IoU1RBTkRBUkRfREVWSUFUSU9OUyAqIHNpZ21hUGl4ZWxzKSA6IE1BWF9TQU1QTEVTOwogICAgaWYgKHNhbXBsZXMgPiBNQVhfU0FNUExFUykgewogICAgICBjb25zb2xlLndhcm4oYHNpZ21hUmFkaWFucywgJHtzaWdtYVJhZGlhbnN9LCBpcyB0b28gbGFyZ2UgYW5kIHdpbGwgY2xpcCwgYXMgaXQgcmVxdWVzdGVkICR7c2FtcGxlc30gc2FtcGxlcyB3aGVuIHRoZSBtYXhpbXVtIGlzIHNldCB0byAke01BWF9TQU1QTEVTfWApOwogICAgfQogICAgY29uc3Qgd2VpZ2h0cyA9IFtdOwogICAgbGV0IHN1bSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDtpIDwgTUFYX1NBTVBMRVM7ICsraSkgewogICAgICBjb25zdCB4MiA9IGkgLyBzaWdtYVBpeGVsczsKICAgICAgY29uc3Qgd2VpZ2h0ID0gTWF0aC5leHAoLXgyICogeDIgLyAyKTsKICAgICAgd2VpZ2h0cy5wdXNoKHdlaWdodCk7CiAgICAgIGlmIChpID09PSAwKSB7CiAgICAgICAgc3VtICs9IHdlaWdodDsKICAgICAgfSBlbHNlIGlmIChpIDwgc2FtcGxlcykgewogICAgICAgIHN1bSArPSAyICogd2VpZ2h0OwogICAgICB9CiAgICB9CiAgICBmb3IgKGxldCBpID0gMDtpIDwgd2VpZ2h0cy5sZW5ndGg7IGkrKykgewogICAgICB3ZWlnaHRzW2ldID0gd2VpZ2h0c1tpXSAvIHN1bTsKICAgIH0KICAgIGJsdXJVbmlmb3Jtc1siZW52TWFwIl0udmFsdWUgPSB0YXJnZXRJbi50ZXh0dXJlOwogICAgYmx1clVuaWZvcm1zWyJzYW1wbGVzIl0udmFsdWUgPSBzYW1wbGVzOwogICAgYmx1clVuaWZvcm1zWyJ3ZWlnaHRzIl0udmFsdWUgPSB3ZWlnaHRzOwogICAgYmx1clVuaWZvcm1zWyJsYXRpdHVkaW5hbCJdLnZhbHVlID0gZGlyZWN0aW9uID09PSAibGF0aXR1ZGluYWwiOwogICAgaWYgKHBvbGVBeGlzKSB7CiAgICAgIGJsdXJVbmlmb3Jtc1sicG9sZUF4aXMiXS52YWx1ZSA9IHBvbGVBeGlzOwogICAgfQogICAgY29uc3QgeyBfbG9kTWF4IH0gPSB0aGlzOwogICAgYmx1clVuaWZvcm1zWyJkVGhldGEiXS52YWx1ZSA9IHJhZGlhbnNQZXJQaXhlbDsKICAgIGJsdXJVbmlmb3Jtc1sibWlwSW50Il0udmFsdWUgPSBfbG9kTWF4IC0gbG9kSW47CiAgICBjb25zdCBvdXRwdXRTaXplID0gdGhpcy5fc2l6ZUxvZHNbbG9kT3V0XTsKICAgIGNvbnN0IHggPSAzICogb3V0cHV0U2l6ZSAqIChsb2RPdXQgPiBfbG9kTWF4IC0gTE9EX01JTiA/IGxvZE91dCAtIF9sb2RNYXggKyBMT0RfTUlOIDogMCk7CiAgICBjb25zdCB5ID0gNCAqICh0aGlzLl9jdWJlU2l6ZSAtIG91dHB1dFNpemUpOwogICAgX3NldFZpZXdwb3J0KHRhcmdldE91dCwgeCwgeSwgMyAqIG91dHB1dFNpemUsIDIgKiBvdXRwdXRTaXplKTsKICAgIHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCh0YXJnZXRPdXQpOwogICAgcmVuZGVyZXIucmVuZGVyKGJsdXJNZXNoLCBfZmxhdENhbWVyYSk7CiAgfQp9CmZ1bmN0aW9uIF9jcmVhdGVQbGFuZXMobG9kTWF4KSB7CiAgY29uc3QgbG9kUGxhbmVzID0gW107CiAgY29uc3Qgc2l6ZUxvZHMgPSBbXTsKICBjb25zdCBzaWdtYXMgPSBbXTsKICBsZXQgbG9kID0gbG9kTWF4OwogIGNvbnN0IHRvdGFsTG9kcyA9IGxvZE1heCAtIExPRF9NSU4gKyAxICsgRVhUUkFfTE9EX1NJR01BLmxlbmd0aDsKICBmb3IgKGxldCBpID0gMDtpIDwgdG90YWxMb2RzOyBpKyspIHsKICAgIGNvbnN0IHNpemVMb2QgPSBNYXRoLnBvdygyLCBsb2QpOwogICAgc2l6ZUxvZHMucHVzaChzaXplTG9kKTsKICAgIGxldCBzaWdtYSA9IDEgLyBzaXplTG9kOwogICAgaWYgKGkgPiBsb2RNYXggLSBMT0RfTUlOKSB7CiAgICAgIHNpZ21hID0gRVhUUkFfTE9EX1NJR01BW2kgLSBsb2RNYXggKyBMT0RfTUlOIC0gMV07CiAgICB9IGVsc2UgaWYgKGkgPT09IDApIHsKICAgICAgc2lnbWEgPSAwOwogICAgfQogICAgc2lnbWFzLnB1c2goc2lnbWEpOwogICAgY29uc3QgdGV4ZWxTaXplID0gMSAvIChzaXplTG9kIC0gMik7CiAgICBjb25zdCBtaW4gPSAtdGV4ZWxTaXplOwogICAgY29uc3QgbWF4ID0gMSArIHRleGVsU2l6ZTsKICAgIGNvbnN0IHV2MSA9IFttaW4sIG1pbiwgbWF4LCBtaW4sIG1heCwgbWF4LCBtaW4sIG1pbiwgbWF4LCBtYXgsIG1pbiwgbWF4XTsKICAgIGNvbnN0IGN1YmVGYWNlcyA9IDY7CiAgICBjb25zdCB2ZXJ0aWNlcyA9IDY7CiAgICBjb25zdCBwb3NpdGlvblNpemUgPSAzOwogICAgY29uc3QgdXZTaXplID0gMjsKICAgIGNvbnN0IGZhY2VJbmRleFNpemUgPSAxOwogICAgY29uc3QgcG9zaXRpb24gPSBuZXcgRmxvYXQzMkFycmF5KHBvc2l0aW9uU2l6ZSAqIHZlcnRpY2VzICogY3ViZUZhY2VzKTsKICAgIGNvbnN0IHV2ID0gbmV3IEZsb2F0MzJBcnJheSh1dlNpemUgKiB2ZXJ0aWNlcyAqIGN1YmVGYWNlcyk7CiAgICBjb25zdCBmYWNlSW5kZXggPSBuZXcgRmxvYXQzMkFycmF5KGZhY2VJbmRleFNpemUgKiB2ZXJ0aWNlcyAqIGN1YmVGYWNlcyk7CiAgICBmb3IgKGxldCBmYWNlID0gMDtmYWNlIDwgY3ViZUZhY2VzOyBmYWNlKyspIHsKICAgICAgY29uc3QgeCA9IGZhY2UgJSAzICogMiAvIDMgLSAxOwogICAgICBjb25zdCB5ID0gZmFjZSA+IDIgPyAwIDogLTE7CiAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gWwogICAgICAgIHgsCiAgICAgICAgeSwKICAgICAgICAwLAogICAgICAgIHggKyAyIC8gMywKICAgICAgICB5LAogICAgICAgIDAsCiAgICAgICAgeCArIDIgLyAzLAogICAgICAgIHkgKyAxLAogICAgICAgIDAsCiAgICAgICAgeCwKICAgICAgICB5LAogICAgICAgIDAsCiAgICAgICAgeCArIDIgLyAzLAogICAgICAgIHkgKyAxLAogICAgICAgIDAsCiAgICAgICAgeCwKICAgICAgICB5ICsgMSwKICAgICAgICAwCiAgICAgIF07CiAgICAgIHBvc2l0aW9uLnNldChjb29yZGluYXRlcywgcG9zaXRpb25TaXplICogdmVydGljZXMgKiBmYWNlKTsKICAgICAgdXYuc2V0KHV2MSwgdXZTaXplICogdmVydGljZXMgKiBmYWNlKTsKICAgICAgY29uc3QgZmlsbDIgPSBbZmFjZSwgZmFjZSwgZmFjZSwgZmFjZSwgZmFjZSwgZmFjZV07CiAgICAgIGZhY2VJbmRleC5zZXQoZmlsbDIsIGZhY2VJbmRleFNpemUgKiB2ZXJ0aWNlcyAqIGZhY2UpOwogICAgfQogICAgY29uc3QgcGxhbmVzID0gbmV3IEJ1ZmZlckdlb21ldHJ5OwogICAgcGxhbmVzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBwb3NpdGlvblNpemUpKTsKICAgIHBsYW5lcy5zZXRBdHRyaWJ1dGUoInV2IiwgbmV3IEJ1ZmZlckF0dHJpYnV0ZSh1diwgdXZTaXplKSk7CiAgICBwbGFuZXMuc2V0QXR0cmlidXRlKCJmYWNlSW5kZXgiLCBuZXcgQnVmZmVyQXR0cmlidXRlKGZhY2VJbmRleCwgZmFjZUluZGV4U2l6ZSkpOwogICAgbG9kUGxhbmVzLnB1c2gocGxhbmVzKTsKICAgIGlmIChsb2QgPiBMT0RfTUlOKSB7CiAgICAgIGxvZC0tOwogICAgfQogIH0KICByZXR1cm4geyBsb2RQbGFuZXMsIHNpemVMb2RzLCBzaWdtYXMgfTsKfQpmdW5jdGlvbiBfY3JlYXRlUmVuZGVyVGFyZ2V0KHdpZHRoLCBoZWlnaHQsIHBhcmFtcykgewogIGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCh3aWR0aCwgaGVpZ2h0LCBwYXJhbXMpOwogIGN1YmVVVlJlbmRlclRhcmdldC50ZXh0dXJlLm1hcHBpbmcgPSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzsKICBjdWJlVVZSZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lID0gIlBNUkVNLmN1YmVVdiI7CiAgY3ViZVVWUmVuZGVyVGFyZ2V0LnNjaXNzb3JUZXN0ID0gdHJ1ZTsKICByZXR1cm4gY3ViZVVWUmVuZGVyVGFyZ2V0Owp9CmZ1bmN0aW9uIF9zZXRWaWV3cG9ydCh0YXJnZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHsKICB0YXJnZXQudmlld3BvcnQuc2V0KHgsIHksIHdpZHRoLCBoZWlnaHQpOwogIHRhcmdldC5zY2lzc29yLnNldCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKfQpmdW5jdGlvbiBfZ2V0Qmx1clNoYWRlcihsb2RNYXgsIHdpZHRoLCBoZWlnaHQpIHsKICBjb25zdCB3ZWlnaHRzID0gbmV3IEZsb2F0MzJBcnJheShNQVhfU0FNUExFUyk7CiAgY29uc3QgcG9sZUF4aXMgPSBuZXcgVmVjdG9yMygwLCAxLCAwKTsKICBjb25zdCBzaGFkZXJNYXRlcmlhbCA9IG5ldyBTaGFkZXJNYXRlcmlhbCh7CiAgICBuYW1lOiAiU3BoZXJpY2FsR2F1c3NpYW5CbHVyIiwKICAgIGRlZmluZXM6IHsKICAgICAgbjogTUFYX1NBTVBMRVMsCiAgICAgIENVQkVVVl9URVhFTF9XSURUSDogMSAvIHdpZHRoLAogICAgICBDVUJFVVZfVEVYRUxfSEVJR0hUOiAxIC8gaGVpZ2h0LAogICAgICBDVUJFVVZfTUFYX01JUDogYCR7bG9kTWF4fS4wYAogICAgfSwKICAgIHVuaWZvcm1zOiB7CiAgICAgIGVudk1hcDogeyB2YWx1ZTogbnVsbCB9LAogICAgICBzYW1wbGVzOiB7IHZhbHVlOiAxIH0sCiAgICAgIHdlaWdodHM6IHsgdmFsdWU6IHdlaWdodHMgfSwKICAgICAgbGF0aXR1ZGluYWw6IHsgdmFsdWU6IGZhbHNlIH0sCiAgICAgIGRUaGV0YTogeyB2YWx1ZTogMCB9LAogICAgICBtaXBJbnQ6IHsgdmFsdWU6IDAgfSwKICAgICAgcG9sZUF4aXM6IHsgdmFsdWU6IHBvbGVBeGlzIH0KICAgIH0sCiAgICB2ZXJ0ZXhTaGFkZXI6IF9nZXRDb21tb25WZXJ0ZXhTaGFkZXIoKSwKICAgIGZyYWdtZW50U2hhZGVyOiBgCgoJCQlwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCQkJcHJlY2lzaW9uIG1lZGl1bXAgaW50OwoKCQkJdmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247CgoJCQl1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7CgkJCXVuaWZvcm0gaW50IHNhbXBsZXM7CgkJCXVuaWZvcm0gZmxvYXQgd2VpZ2h0c1sgbiBdOwoJCQl1bmlmb3JtIGJvb2wgbGF0aXR1ZGluYWw7CgkJCXVuaWZvcm0gZmxvYXQgZFRoZXRhOwoJCQl1bmlmb3JtIGZsb2F0IG1pcEludDsKCQkJdW5pZm9ybSB2ZWMzIHBvbGVBeGlzOwoKCQkJI2RlZmluZSBFTlZNQVBfVFlQRV9DVUJFX1VWCgkJCSNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+CgoJCQl2ZWMzIGdldFNhbXBsZSggZmxvYXQgdGhldGEsIHZlYzMgYXhpcyApIHsKCgkJCQlmbG9hdCBjb3NUaGV0YSA9IGNvcyggdGhldGEgKTsKCQkJCS8vIFJvZHJpZ3VlcycgYXhpcy1hbmdsZSByb3RhdGlvbgoJCQkJdmVjMyBzYW1wbGVEaXJlY3Rpb24gPSB2T3V0cHV0RGlyZWN0aW9uICogY29zVGhldGEKCQkJCQkrIGNyb3NzKCBheGlzLCB2T3V0cHV0RGlyZWN0aW9uICkgKiBzaW4oIHRoZXRhICkKCQkJCQkrIGF4aXMgKiBkb3QoIGF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKSAqICggMS4wIC0gY29zVGhldGEgKTsKCgkJCQlyZXR1cm4gYmlsaW5lYXJDdWJlVVYoIGVudk1hcCwgc2FtcGxlRGlyZWN0aW9uLCBtaXBJbnQgKTsKCgkJCX0KCgkJCXZvaWQgbWFpbigpIHsKCgkJCQl2ZWMzIGF4aXMgPSBsYXRpdHVkaW5hbCA/IHBvbGVBeGlzIDogY3Jvc3MoIHBvbGVBeGlzLCB2T3V0cHV0RGlyZWN0aW9uICk7CgoJCQkJaWYgKCBhbGwoIGVxdWFsKCBheGlzLCB2ZWMzKCAwLjAgKSApICkgKSB7CgoJCQkJCWF4aXMgPSB2ZWMzKCB2T3V0cHV0RGlyZWN0aW9uLnosIDAuMCwgLSB2T3V0cHV0RGlyZWN0aW9uLnggKTsKCgkJCQl9CgoJCQkJYXhpcyA9IG5vcm1hbGl6ZSggYXhpcyApOwoKCQkJCWdsX0ZyYWdDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApOwoJCQkJZ2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyAwIF0gKiBnZXRTYW1wbGUoIDAuMCwgYXhpcyApOwoKCQkJCWZvciAoIGludCBpID0gMTsgaSA8IG47IGkrKyApIHsKCgkJCQkJaWYgKCBpID49IHNhbXBsZXMgKSB7CgoJCQkJCQlicmVhazsKCgkJCQkJfQoKCQkJCQlmbG9hdCB0aGV0YSA9IGRUaGV0YSAqIGZsb2F0KCBpICk7CgkJCQkJZ2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyBpIF0gKiBnZXRTYW1wbGUoIC0xLjAgKiB0aGV0YSwgYXhpcyApOwoJCQkJCWdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgaSBdICogZ2V0U2FtcGxlKCB0aGV0YSwgYXhpcyApOwoKCQkJCX0KCgkJCX0KCQlgLAogICAgYmxlbmRpbmc6IE5vQmxlbmRpbmcsCiAgICBkZXB0aFRlc3Q6IGZhbHNlLAogICAgZGVwdGhXcml0ZTogZmFsc2UKICB9KTsKICByZXR1cm4gc2hhZGVyTWF0ZXJpYWw7Cn0KZnVuY3Rpb24gX2dldEVxdWlyZWN0TWF0ZXJpYWwoKSB7CiAgcmV0dXJuIG5ldyBTaGFkZXJNYXRlcmlhbCh7CiAgICBuYW1lOiAiRXF1aXJlY3Rhbmd1bGFyVG9DdWJlVVYiLAogICAgdW5pZm9ybXM6IHsKICAgICAgZW52TWFwOiB7IHZhbHVlOiBudWxsIH0KICAgIH0sCiAgICB2ZXJ0ZXhTaGFkZXI6IF9nZXRDb21tb25WZXJ0ZXhTaGFkZXIoKSwKICAgIGZyYWdtZW50U2hhZGVyOiBgCgoJCQlwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCQkJcHJlY2lzaW9uIG1lZGl1bXAgaW50OwoKCQkJdmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247CgoJCQl1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7CgoJCQkjaW5jbHVkZSA8Y29tbW9uPgoKCQkJdm9pZCBtYWluKCkgewoKCQkJCXZlYzMgb3V0cHV0RGlyZWN0aW9uID0gbm9ybWFsaXplKCB2T3V0cHV0RGlyZWN0aW9uICk7CgkJCQl2ZWMyIHV2ID0gZXF1aXJlY3RVdiggb3V0cHV0RGlyZWN0aW9uICk7CgoJCQkJZ2xfRnJhZ0NvbG9yID0gdmVjNCggdGV4dHVyZTJEICggZW52TWFwLCB1diApLnJnYiwgMS4wICk7CgoJCQl9CgkJYCwKICAgIGJsZW5kaW5nOiBOb0JsZW5kaW5nLAogICAgZGVwdGhUZXN0OiBmYWxzZSwKICAgIGRlcHRoV3JpdGU6IGZhbHNlCiAgfSk7Cn0KZnVuY3Rpb24gX2dldEN1YmVtYXBNYXRlcmlhbCgpIHsKICByZXR1cm4gbmV3IFNoYWRlck1hdGVyaWFsKHsKICAgIG5hbWU6ICJDdWJlbWFwVG9DdWJlVVYiLAogICAgdW5pZm9ybXM6IHsKICAgICAgZW52TWFwOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgIGZsaXBFbnZNYXA6IHsgdmFsdWU6IC0xIH0KICAgIH0sCiAgICB2ZXJ0ZXhTaGFkZXI6IF9nZXRDb21tb25WZXJ0ZXhTaGFkZXIoKSwKICAgIGZyYWdtZW50U2hhZGVyOiBgCgoJCQlwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCQkJcHJlY2lzaW9uIG1lZGl1bXAgaW50OwoKCQkJdW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwOwoKCQkJdmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247CgoJCQl1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDsKCgkJCXZvaWQgbWFpbigpIHsKCgkJCQlnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCB2ZWMzKCBmbGlwRW52TWFwICogdk91dHB1dERpcmVjdGlvbi54LCB2T3V0cHV0RGlyZWN0aW9uLnl6ICkgKTsKCgkJCX0KCQlgLAogICAgYmxlbmRpbmc6IE5vQmxlbmRpbmcsCiAgICBkZXB0aFRlc3Q6IGZhbHNlLAogICAgZGVwdGhXcml0ZTogZmFsc2UKICB9KTsKfQpmdW5jdGlvbiBfZ2V0Q29tbW9uVmVydGV4U2hhZGVyKCkgewogIHJldHVybiBgCgoJCXByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoJCXByZWNpc2lvbiBtZWRpdW1wIGludDsKCgkJYXR0cmlidXRlIGZsb2F0IGZhY2VJbmRleDsKCgkJdmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247CgoJCS8vIFJIIGNvb3JkaW5hdGUgc3lzdGVtOyBQTVJFTSBmYWNlLWluZGV4aW5nIGNvbnZlbnRpb24KCQl2ZWMzIGdldERpcmVjdGlvbiggdmVjMiB1diwgZmxvYXQgZmFjZSApIHsKCgkJCXV2ID0gMi4wICogdXYgLSAxLjA7CgoJCQl2ZWMzIGRpcmVjdGlvbiA9IHZlYzMoIHV2LCAxLjAgKTsKCgkJCWlmICggZmFjZSA9PSAwLjAgKSB7CgoJCQkJZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDsgLy8gKCAxLCB2LCB1ICkgcG9zIHgKCgkJCX0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkgewoKCQkJCWRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7CgkJCQlkaXJlY3Rpb24ueHogKj0gLTEuMDsgLy8gKCAtdSwgMSwgLXYgKSBwb3MgeQoKCQkJfSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7CgoJCQkJZGlyZWN0aW9uLnggKj0gLTEuMDsgLy8gKCAtdSwgdiwgMSApIHBvcyB6CgoJCQl9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHsKCgkJCQlkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4OwoJCQkJZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLTEsIHYsIC11ICkgbmVnIHgKCgkJCX0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkgewoKCQkJCWRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7CgkJCQlkaXJlY3Rpb24ueHkgKj0gLTEuMDsgLy8gKCAtdSwgLTEsIHYgKSBuZWcgeQoKCQkJfSBlbHNlIGlmICggZmFjZSA9PSA1LjAgKSB7CgoJCQkJZGlyZWN0aW9uLnogKj0gLTEuMDsgLy8gKCB1LCB2LCAtMSApIG5lZyB6CgoJCQl9CgoJCQlyZXR1cm4gZGlyZWN0aW9uOwoKCQl9CgoJCXZvaWQgbWFpbigpIHsKCgkJCXZPdXRwdXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oIHV2LCBmYWNlSW5kZXggKTsKCQkJZ2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7CgoJCX0KCWA7Cn0KZnVuY3Rpb24gV2ViR0xDdWJlVVZNYXBzKHJlbmRlcmVyKSB7CiAgbGV0IGN1YmVVVm1hcHMgPSBuZXcgV2Vha01hcDsKICBsZXQgcG1yZW1HZW5lcmF0b3IgPSBudWxsOwogIGZ1bmN0aW9uIGdldCh0ZXh0dXJlKSB7CiAgICBpZiAodGV4dHVyZSAmJiB0ZXh0dXJlLmlzVGV4dHVyZSkgewogICAgICBjb25zdCBtYXBwaW5nID0gdGV4dHVyZS5tYXBwaW5nOwogICAgICBjb25zdCBpc0VxdWlyZWN0TWFwID0gbWFwcGluZyA9PT0gRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcgfHwgbWFwcGluZyA9PT0gRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc7CiAgICAgIGNvbnN0IGlzQ3ViZU1hcCA9IG1hcHBpbmcgPT09IEN1YmVSZWZsZWN0aW9uTWFwcGluZyB8fCBtYXBwaW5nID09PSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc7CiAgICAgIGlmIChpc0VxdWlyZWN0TWFwIHx8IGlzQ3ViZU1hcCkgewogICAgICAgIGxldCByZW5kZXJUYXJnZXQgPSBjdWJlVVZtYXBzLmdldCh0ZXh0dXJlKTsKICAgICAgICBjb25zdCBjdXJyZW50UE1SRU1WZXJzaW9uID0gcmVuZGVyVGFyZ2V0ICE9PSB1bmRlZmluZWQgPyByZW5kZXJUYXJnZXQudGV4dHVyZS5wbXJlbVZlcnNpb24gOiAwOwogICAgICAgIGlmICh0ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSAmJiB0ZXh0dXJlLnBtcmVtVmVyc2lvbiAhPT0gY3VycmVudFBNUkVNVmVyc2lvbikgewogICAgICAgICAgaWYgKHBtcmVtR2VuZXJhdG9yID09PSBudWxsKQogICAgICAgICAgICBwbXJlbUdlbmVyYXRvciA9IG5ldyBQTVJFTUdlbmVyYXRvcihyZW5kZXJlcik7CiAgICAgICAgICByZW5kZXJUYXJnZXQgPSBpc0VxdWlyZWN0TWFwID8gcG1yZW1HZW5lcmF0b3IuZnJvbUVxdWlyZWN0YW5ndWxhcih0ZXh0dXJlLCByZW5kZXJUYXJnZXQpIDogcG1yZW1HZW5lcmF0b3IuZnJvbUN1YmVtYXAodGV4dHVyZSwgcmVuZGVyVGFyZ2V0KTsKICAgICAgICAgIHJlbmRlclRhcmdldC50ZXh0dXJlLnBtcmVtVmVyc2lvbiA9IHRleHR1cmUucG1yZW1WZXJzaW9uOwogICAgICAgICAgY3ViZVVWbWFwcy5zZXQodGV4dHVyZSwgcmVuZGVyVGFyZ2V0KTsKICAgICAgICAgIHJldHVybiByZW5kZXJUYXJnZXQudGV4dHVyZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHJlbmRlclRhcmdldCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHJldHVybiByZW5kZXJUYXJnZXQudGV4dHVyZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gdGV4dHVyZS5pbWFnZTsKICAgICAgICAgICAgaWYgKGlzRXF1aXJlY3RNYXAgJiYgaW1hZ2UgJiYgaW1hZ2UuaGVpZ2h0ID4gMCB8fCBpc0N1YmVNYXAgJiYgaW1hZ2UgJiYgaXNDdWJlVGV4dHVyZUNvbXBsZXRlKGltYWdlKSkgewogICAgICAgICAgICAgIGlmIChwbXJlbUdlbmVyYXRvciA9PT0gbnVsbCkKICAgICAgICAgICAgICAgIHBtcmVtR2VuZXJhdG9yID0gbmV3IFBNUkVNR2VuZXJhdG9yKHJlbmRlcmVyKTsKICAgICAgICAgICAgICByZW5kZXJUYXJnZXQgPSBpc0VxdWlyZWN0TWFwID8gcG1yZW1HZW5lcmF0b3IuZnJvbUVxdWlyZWN0YW5ndWxhcih0ZXh0dXJlKSA6IHBtcmVtR2VuZXJhdG9yLmZyb21DdWJlbWFwKHRleHR1cmUpOwogICAgICAgICAgICAgIHJlbmRlclRhcmdldC50ZXh0dXJlLnBtcmVtVmVyc2lvbiA9IHRleHR1cmUucG1yZW1WZXJzaW9uOwogICAgICAgICAgICAgIGN1YmVVVm1hcHMuc2V0KHRleHR1cmUsIHJlbmRlclRhcmdldCk7CiAgICAgICAgICAgICAgdGV4dHVyZS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgb25UZXh0dXJlRGlzcG9zZSk7CiAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlclRhcmdldC50ZXh0dXJlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGV4dHVyZTsKICB9CiAgZnVuY3Rpb24gaXNDdWJlVGV4dHVyZUNvbXBsZXRlKGltYWdlKSB7CiAgICBsZXQgY291bnQgPSAwOwogICAgY29uc3QgbGVuZ3RoID0gNjsKICAgIGZvciAobGV0IGkgPSAwO2kgPCBsZW5ndGg7IGkrKykgewogICAgICBpZiAoaW1hZ2VbaV0gIT09IHVuZGVmaW5lZCkKICAgICAgICBjb3VudCsrOwogICAgfQogICAgcmV0dXJuIGNvdW50ID09PSBsZW5ndGg7CiAgfQogIGZ1bmN0aW9uIG9uVGV4dHVyZURpc3Bvc2UoZXZlbnQpIHsKICAgIGNvbnN0IHRleHR1cmUgPSBldmVudC50YXJnZXQ7CiAgICB0ZXh0dXJlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLCBvblRleHR1cmVEaXNwb3NlKTsKICAgIGNvbnN0IGN1YmVtYXBVViA9IGN1YmVVVm1hcHMuZ2V0KHRleHR1cmUpOwogICAgaWYgKGN1YmVtYXBVViAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGN1YmVVVm1hcHMuZGVsZXRlKHRleHR1cmUpOwogICAgICBjdWJlbWFwVVYuZGlzcG9zZSgpOwogICAgfQogIH0KICBmdW5jdGlvbiBkaXNwb3NlKCkgewogICAgY3ViZVVWbWFwcyA9IG5ldyBXZWFrTWFwOwogICAgaWYgKHBtcmVtR2VuZXJhdG9yICE9PSBudWxsKSB7CiAgICAgIHBtcmVtR2VuZXJhdG9yLmRpc3Bvc2UoKTsKICAgICAgcG1yZW1HZW5lcmF0b3IgPSBudWxsOwogICAgfQogIH0KICByZXR1cm4gewogICAgZ2V0LAogICAgZGlzcG9zZQogIH07Cn0KZnVuY3Rpb24gV2ViR0xFeHRlbnNpb25zKGdsKSB7CiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9OwogIGZ1bmN0aW9uIGdldEV4dGVuc2lvbihuYW1lKSB7CiAgICBpZiAoZXh0ZW5zaW9uc1tuYW1lXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiBleHRlbnNpb25zW25hbWVdOwogICAgfQogICAgbGV0IGV4dGVuc2lvbjsKICAgIHN3aXRjaCAobmFtZSkgewogICAgICBjYXNlICJXRUJHTF9kZXB0aF90ZXh0dXJlIjoKICAgICAgICBleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oIldFQkdMX2RlcHRoX3RleHR1cmUiKSB8fCBnbC5nZXRFeHRlbnNpb24oIk1PWl9XRUJHTF9kZXB0aF90ZXh0dXJlIikgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfZGVwdGhfdGV4dHVyZSIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiOgogICAgICAgIGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbigiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCJNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIjoKICAgICAgICBleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIikgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCJNT1pfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKSB8fCBnbC5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiOgogICAgICAgIGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIikgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIik7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKG5hbWUpOwogICAgfQogICAgZXh0ZW5zaW9uc1tuYW1lXSA9IGV4dGVuc2lvbjsKICAgIHJldHVybiBleHRlbnNpb247CiAgfQogIHJldHVybiB7CiAgICBoYXM6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgcmV0dXJuIGdldEV4dGVuc2lvbihuYW1lKSAhPT0gbnVsbDsKICAgIH0sCiAgICBpbml0OiBmdW5jdGlvbigpIHsKICAgICAgZ2V0RXh0ZW5zaW9uKCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0Iik7CiAgICAgIGdldEV4dGVuc2lvbigiV0VCR0xfY2xpcF9jdWxsX2Rpc3RhbmNlIik7CiAgICAgIGdldEV4dGVuc2lvbigiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik7CiAgICAgIGdldEV4dGVuc2lvbigiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0Iik7CiAgICAgIGdldEV4dGVuc2lvbigiV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIik7CiAgICAgIGdldEV4dGVuc2lvbigiV0VCR0xfcmVuZGVyX3NoYXJlZF9leHBvbmVudCIpOwogICAgfSwKICAgIGdldDogZnVuY3Rpb24obmFtZSkgewogICAgICBjb25zdCBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24obmFtZSk7CiAgICAgIGlmIChleHRlbnNpb24gPT09IG51bGwpIHsKICAgICAgICB3YXJuT25jZSgiVEhSRUUuV2ViR0xSZW5kZXJlcjogIiArIG5hbWUgKyAiIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLiIpOwogICAgICB9CiAgICAgIHJldHVybiBleHRlbnNpb247CiAgICB9CiAgfTsKfQpmdW5jdGlvbiBXZWJHTEdlb21ldHJpZXMoZ2wsIGF0dHJpYnV0ZXMsIGluZm8sIGJpbmRpbmdTdGF0ZXMpIHsKICBjb25zdCBnZW9tZXRyaWVzID0ge307CiAgY29uc3Qgd2lyZWZyYW1lQXR0cmlidXRlcyA9IG5ldyBXZWFrTWFwOwogIGZ1bmN0aW9uIG9uR2VvbWV0cnlEaXNwb3NlKGV2ZW50KSB7CiAgICBjb25zdCBnZW9tZXRyeSA9IGV2ZW50LnRhcmdldDsKICAgIGlmIChnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCkgewogICAgICBhdHRyaWJ1dGVzLnJlbW92ZShnZW9tZXRyeS5pbmRleCk7CiAgICB9CiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZ2VvbWV0cnkuYXR0cmlidXRlcykgewogICAgICBhdHRyaWJ1dGVzLnJlbW92ZShnZW9tZXRyeS5hdHRyaWJ1dGVzW25hbWVdKTsKICAgIH0KICAgIGdlb21ldHJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLCBvbkdlb21ldHJ5RGlzcG9zZSk7CiAgICBkZWxldGUgZ2VvbWV0cmllc1tnZW9tZXRyeS5pZF07CiAgICBjb25zdCBhdHRyaWJ1dGUgPSB3aXJlZnJhbWVBdHRyaWJ1dGVzLmdldChnZW9tZXRyeSk7CiAgICBpZiAoYXR0cmlidXRlKSB7CiAgICAgIGF0dHJpYnV0ZXMucmVtb3ZlKGF0dHJpYnV0ZSk7CiAgICAgIHdpcmVmcmFtZUF0dHJpYnV0ZXMuZGVsZXRlKGdlb21ldHJ5KTsKICAgIH0KICAgIGJpbmRpbmdTdGF0ZXMucmVsZWFzZVN0YXRlc09mR2VvbWV0cnkoZ2VvbWV0cnkpOwogICAgaWYgKGdlb21ldHJ5LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgPT09IHRydWUpIHsKICAgICAgZGVsZXRlIGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50OwogICAgfQogICAgaW5mby5tZW1vcnkuZ2VvbWV0cmllcy0tOwogIH0KICBmdW5jdGlvbiBnZXQob2JqZWN0LCBnZW9tZXRyeSkgewogICAgaWYgKGdlb21ldHJpZXNbZ2VvbWV0cnkuaWRdID09PSB0cnVlKQogICAgICByZXR1cm4gZ2VvbWV0cnk7CiAgICBnZW9tZXRyeS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgb25HZW9tZXRyeURpc3Bvc2UpOwogICAgZ2VvbWV0cmllc1tnZW9tZXRyeS5pZF0gPSB0cnVlOwogICAgaW5mby5tZW1vcnkuZ2VvbWV0cmllcysrOwogICAgcmV0dXJuIGdlb21ldHJ5OwogIH0KICBmdW5jdGlvbiB1cGRhdGUoZ2VvbWV0cnkpIHsKICAgIGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZ2VvbWV0cnlBdHRyaWJ1dGVzKSB7CiAgICAgIGF0dHJpYnV0ZXMudXBkYXRlKGdlb21ldHJ5QXR0cmlidXRlc1tuYW1lXSwgZ2wuQVJSQVlfQlVGRkVSKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gdXBkYXRlV2lyZWZyYW1lQXR0cmlidXRlKGdlb21ldHJ5KSB7CiAgICBjb25zdCBpbmRpY2VzID0gW107CiAgICBjb25zdCBnZW9tZXRyeUluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7CiAgICBjb25zdCBnZW9tZXRyeVBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKICAgIGxldCB2ZXJzaW9uID0gMDsKICAgIGlmIChnZW9tZXRyeUluZGV4ICE9PSBudWxsKSB7CiAgICAgIGNvbnN0IGFycmF5ID0gZ2VvbWV0cnlJbmRleC5hcnJheTsKICAgICAgdmVyc2lvbiA9IGdlb21ldHJ5SW5kZXgudmVyc2lvbjsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7aSA8IGw7IGkgKz0gMykgewogICAgICAgIGNvbnN0IGEgPSBhcnJheVtpICsgMF07CiAgICAgICAgY29uc3QgYiA9IGFycmF5W2kgKyAxXTsKICAgICAgICBjb25zdCBjID0gYXJyYXlbaSArIDJdOwogICAgICAgIGluZGljZXMucHVzaChhLCBiLCBiLCBjLCBjLCBhKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChnZW9tZXRyeVBvc2l0aW9uICE9PSB1bmRlZmluZWQpIHsKICAgICAgY29uc3QgYXJyYXkgPSBnZW9tZXRyeVBvc2l0aW9uLmFycmF5OwogICAgICB2ZXJzaW9uID0gZ2VvbWV0cnlQb3NpdGlvbi52ZXJzaW9uOwogICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aCAvIDMgLSAxO2kgPCBsOyBpICs9IDMpIHsKICAgICAgICBjb25zdCBhID0gaSArIDA7CiAgICAgICAgY29uc3QgYiA9IGkgKyAxOwogICAgICAgIGNvbnN0IGMgPSBpICsgMjsKICAgICAgICBpbmRpY2VzLnB1c2goYSwgYiwgYiwgYywgYywgYSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG5ldyAoKGFycmF5TmVlZHNVaW50MzIoaW5kaWNlcykpID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlKShpbmRpY2VzLCAxKTsKICAgIGF0dHJpYnV0ZS52ZXJzaW9uID0gdmVyc2lvbjsKICAgIGNvbnN0IHByZXZpb3VzQXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlcy5nZXQoZ2VvbWV0cnkpOwogICAgaWYgKHByZXZpb3VzQXR0cmlidXRlKQogICAgICBhdHRyaWJ1dGVzLnJlbW92ZShwcmV2aW91c0F0dHJpYnV0ZSk7CiAgICB3aXJlZnJhbWVBdHRyaWJ1dGVzLnNldChnZW9tZXRyeSwgYXR0cmlidXRlKTsKICB9CiAgZnVuY3Rpb24gZ2V0V2lyZWZyYW1lQXR0cmlidXRlKGdlb21ldHJ5KSB7CiAgICBjb25zdCBjdXJyZW50QXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlcy5nZXQoZ2VvbWV0cnkpOwogICAgaWYgKGN1cnJlbnRBdHRyaWJ1dGUpIHsKICAgICAgY29uc3QgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4OwogICAgICBpZiAoZ2VvbWV0cnlJbmRleCAhPT0gbnVsbCkgewogICAgICAgIGlmIChjdXJyZW50QXR0cmlidXRlLnZlcnNpb24gPCBnZW9tZXRyeUluZGV4LnZlcnNpb24pIHsKICAgICAgICAgIHVwZGF0ZVdpcmVmcmFtZUF0dHJpYnV0ZShnZW9tZXRyeSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICB1cGRhdGVXaXJlZnJhbWVBdHRyaWJ1dGUoZ2VvbWV0cnkpOwogICAgfQogICAgcmV0dXJuIHdpcmVmcmFtZUF0dHJpYnV0ZXMuZ2V0KGdlb21ldHJ5KTsKICB9CiAgcmV0dXJuIHsKICAgIGdldCwKICAgIHVwZGF0ZSwKICAgIGdldFdpcmVmcmFtZUF0dHJpYnV0ZQogIH07Cn0KZnVuY3Rpb24gV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIoZ2wsIGV4dGVuc2lvbnMsIGluZm8pIHsKICBsZXQgbW9kZTsKICBmdW5jdGlvbiBzZXRNb2RlKHZhbHVlKSB7CiAgICBtb2RlID0gdmFsdWU7CiAgfQogIGxldCB0eXBlLCBieXRlc1BlckVsZW1lbnQ7CiAgZnVuY3Rpb24gc2V0SW5kZXgodmFsdWUpIHsKICAgIHR5cGUgPSB2YWx1ZS50eXBlOwogICAgYnl0ZXNQZXJFbGVtZW50ID0gdmFsdWUuYnl0ZXNQZXJFbGVtZW50OwogIH0KICBmdW5jdGlvbiByZW5kZXIoc3RhcnQsIGNvdW50KSB7CiAgICBnbC5kcmF3RWxlbWVudHMobW9kZSwgY291bnQsIHR5cGUsIHN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50KTsKICAgIGluZm8udXBkYXRlKGNvdW50LCBtb2RlLCAxKTsKICB9CiAgZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKHN0YXJ0LCBjb3VudCwgcHJpbWNvdW50KSB7CiAgICBpZiAocHJpbWNvdW50ID09PSAwKQogICAgICByZXR1cm47CiAgICBnbC5kcmF3RWxlbWVudHNJbnN0YW5jZWQobW9kZSwgY291bnQsIHR5cGUsIHN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50LCBwcmltY291bnQpOwogICAgaW5mby51cGRhdGUoY291bnQsIG1vZGUsIHByaW1jb3VudCk7CiAgfQogIGZ1bmN0aW9uIHJlbmRlck11bHRpRHJhdyhzdGFydHMsIGNvdW50cywgZHJhd0NvdW50KSB7CiAgICBpZiAoZHJhd0NvdW50ID09PSAwKQogICAgICByZXR1cm47CiAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCgiV0VCR0xfbXVsdGlfZHJhdyIpOwogICAgZXh0ZW5zaW9uLm11bHRpRHJhd0VsZW1lbnRzV0VCR0wobW9kZSwgY291bnRzLCAwLCB0eXBlLCBzdGFydHMsIDAsIGRyYXdDb3VudCk7CiAgICBsZXQgZWxlbWVudENvdW50ID0gMDsKICAgIGZvciAobGV0IGkgPSAwO2kgPCBkcmF3Q291bnQ7IGkrKykgewogICAgICBlbGVtZW50Q291bnQgKz0gY291bnRzW2ldOwogICAgfQogICAgaW5mby51cGRhdGUoZWxlbWVudENvdW50LCBtb2RlLCAxKTsKICB9CiAgZnVuY3Rpb24gcmVuZGVyTXVsdGlEcmF3SW5zdGFuY2VzKHN0YXJ0cywgY291bnRzLCBkcmF3Q291bnQsIHByaW1jb3VudCkgewogICAgaWYgKGRyYXdDb3VudCA9PT0gMCkKICAgICAgcmV0dXJuOwogICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoIldFQkdMX211bHRpX2RyYXciKTsKICAgIGlmIChleHRlbnNpb24gPT09IG51bGwpIHsKICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IHN0YXJ0cy5sZW5ndGg7IGkrKykgewogICAgICAgIHJlbmRlckluc3RhbmNlcyhzdGFydHNbaV0gLyBieXRlc1BlckVsZW1lbnQsIGNvdW50c1tpXSwgcHJpbWNvdW50W2ldKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZXh0ZW5zaW9uLm11bHRpRHJhd0VsZW1lbnRzSW5zdGFuY2VkV0VCR0wobW9kZSwgY291bnRzLCAwLCB0eXBlLCBzdGFydHMsIDAsIHByaW1jb3VudCwgMCwgZHJhd0NvdW50KTsKICAgICAgbGV0IGVsZW1lbnRDb3VudCA9IDA7CiAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBkcmF3Q291bnQ7IGkrKykgewogICAgICAgIGVsZW1lbnRDb3VudCArPSBjb3VudHNbaV0gKiBwcmltY291bnRbaV07CiAgICAgIH0KICAgICAgaW5mby51cGRhdGUoZWxlbWVudENvdW50LCBtb2RlLCAxKTsKICAgIH0KICB9CiAgdGhpcy5zZXRNb2RlID0gc2V0TW9kZTsKICB0aGlzLnNldEluZGV4ID0gc2V0SW5kZXg7CiAgdGhpcy5yZW5kZXIgPSByZW5kZXI7CiAgdGhpcy5yZW5kZXJJbnN0YW5jZXMgPSByZW5kZXJJbnN0YW5jZXM7CiAgdGhpcy5yZW5kZXJNdWx0aURyYXcgPSByZW5kZXJNdWx0aURyYXc7CiAgdGhpcy5yZW5kZXJNdWx0aURyYXdJbnN0YW5jZXMgPSByZW5kZXJNdWx0aURyYXdJbnN0YW5jZXM7Cn0KZnVuY3Rpb24gV2ViR0xJbmZvKGdsKSB7CiAgY29uc3QgbWVtb3J5ID0gewogICAgZ2VvbWV0cmllczogMCwKICAgIHRleHR1cmVzOiAwCiAgfTsKICBjb25zdCByZW5kZXIgPSB7CiAgICBmcmFtZTogMCwKICAgIGNhbGxzOiAwLAogICAgdHJpYW5nbGVzOiAwLAogICAgcG9pbnRzOiAwLAogICAgbGluZXM6IDAKICB9OwogIGZ1bmN0aW9uIHVwZGF0ZShjb3VudCwgbW9kZSwgaW5zdGFuY2VDb3VudCkgewogICAgcmVuZGVyLmNhbGxzKys7CiAgICBzd2l0Y2ggKG1vZGUpIHsKICAgICAgY2FzZSBnbC5UUklBTkdMRVM6CiAgICAgICAgcmVuZGVyLnRyaWFuZ2xlcyArPSBpbnN0YW5jZUNvdW50ICogKGNvdW50IC8gMyk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgZ2wuTElORVM6CiAgICAgICAgcmVuZGVyLmxpbmVzICs9IGluc3RhbmNlQ291bnQgKiAoY291bnQgLyAyKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBnbC5MSU5FX1NUUklQOgogICAgICAgIHJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogKGNvdW50IC0gMSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgZ2wuTElORV9MT09QOgogICAgICAgIHJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogY291bnQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgZ2wuUE9JTlRTOgogICAgICAgIHJlbmRlci5wb2ludHMgKz0gaW5zdGFuY2VDb3VudCAqIGNvdW50OwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMSW5mbzogVW5rbm93biBkcmF3IG1vZGU6IiwgbW9kZSk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJlc2V0KCkgewogICAgcmVuZGVyLmNhbGxzID0gMDsKICAgIHJlbmRlci50cmlhbmdsZXMgPSAwOwogICAgcmVuZGVyLnBvaW50cyA9IDA7CiAgICByZW5kZXIubGluZXMgPSAwOwogIH0KICByZXR1cm4gewogICAgbWVtb3J5LAogICAgcmVuZGVyLAogICAgcHJvZ3JhbXM6IG51bGwsCiAgICBhdXRvUmVzZXQ6IHRydWUsCiAgICByZXNldCwKICAgIHVwZGF0ZQogIH07Cn0KZnVuY3Rpb24gV2ViR0xNb3JwaHRhcmdldHMoZ2wsIGNhcGFiaWxpdGllcywgdGV4dHVyZXMpIHsKICBjb25zdCBtb3JwaFRleHR1cmVzID0gbmV3IFdlYWtNYXA7CiAgY29uc3QgbW9ycGggPSBuZXcgVmVjdG9yNDsKICBmdW5jdGlvbiB1cGRhdGUob2JqZWN0LCBnZW9tZXRyeSwgcHJvZ3JhbSkgewogICAgY29uc3Qgb2JqZWN0SW5mbHVlbmNlcyA9IG9iamVjdC5tb3JwaFRhcmdldEluZmx1ZW5jZXM7CiAgICBjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiB8fCBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsIHx8IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5jb2xvcjsKICAgIGNvbnN0IG1vcnBoVGFyZ2V0c0NvdW50ID0gbW9ycGhBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCA/IG1vcnBoQXR0cmlidXRlLmxlbmd0aCA6IDA7CiAgICBsZXQgZW50cnkgPSBtb3JwaFRleHR1cmVzLmdldChnZW9tZXRyeSk7CiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5jb3VudCAhPT0gbW9ycGhUYXJnZXRzQ291bnQpIHsKICAgICAgbGV0IGRpc3Bvc2VUZXh0dXJlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGV4dHVyZS5kaXNwb3NlKCk7CiAgICAgICAgbW9ycGhUZXh0dXJlcy5kZWxldGUoZ2VvbWV0cnkpOwogICAgICAgIGdlb21ldHJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLCBkaXNwb3NlVGV4dHVyZSk7CiAgICAgIH07CiAgICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKQogICAgICAgIGVudHJ5LnRleHR1cmUuZGlzcG9zZSgpOwogICAgICBjb25zdCBoYXNNb3JwaFBvc2l0aW9uID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uICE9PSB1bmRlZmluZWQ7CiAgICAgIGNvbnN0IGhhc01vcnBoTm9ybWFscyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWwgIT09IHVuZGVmaW5lZDsKICAgICAgY29uc3QgaGFzTW9ycGhDb2xvcnMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3IgIT09IHVuZGVmaW5lZDsKICAgICAgY29uc3QgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uIHx8IFtdOwogICAgICBjb25zdCBtb3JwaE5vcm1hbHMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsIHx8IFtdOwogICAgICBjb25zdCBtb3JwaENvbG9ycyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5jb2xvciB8fCBbXTsKICAgICAgbGV0IHZlcnRleERhdGFDb3VudCA9IDA7CiAgICAgIGlmIChoYXNNb3JwaFBvc2l0aW9uID09PSB0cnVlKQogICAgICAgIHZlcnRleERhdGFDb3VudCA9IDE7CiAgICAgIGlmIChoYXNNb3JwaE5vcm1hbHMgPT09IHRydWUpCiAgICAgICAgdmVydGV4RGF0YUNvdW50ID0gMjsKICAgICAgaWYgKGhhc01vcnBoQ29sb3JzID09PSB0cnVlKQogICAgICAgIHZlcnRleERhdGFDb3VudCA9IDM7CiAgICAgIGxldCB3aWR0aCA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQgKiB2ZXJ0ZXhEYXRhQ291bnQ7CiAgICAgIGxldCBoZWlnaHQgPSAxOwogICAgICBpZiAod2lkdGggPiBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZVNpemUpIHsKICAgICAgICBoZWlnaHQgPSBNYXRoLmNlaWwod2lkdGggLyBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZVNpemUpOwogICAgICAgIHdpZHRoID0gY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplOwogICAgICB9CiAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkod2lkdGggKiBoZWlnaHQgKiA0ICogbW9ycGhUYXJnZXRzQ291bnQpOwogICAgICBjb25zdCB0ZXh0dXJlID0gbmV3IERhdGFBcnJheVRleHR1cmUoYnVmZmVyLCB3aWR0aCwgaGVpZ2h0LCBtb3JwaFRhcmdldHNDb3VudCk7CiAgICAgIHRleHR1cmUudHlwZSA9IEZsb2F0VHlwZTsKICAgICAgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgIGNvbnN0IHZlcnRleERhdGFTdHJpZGUgPSB2ZXJ0ZXhEYXRhQ291bnQgKiA0OwogICAgICBmb3IgKGxldCBpID0gMDtpIDwgbW9ycGhUYXJnZXRzQ291bnQ7IGkrKykgewogICAgICAgIGNvbnN0IG1vcnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzW2ldOwogICAgICAgIGNvbnN0IG1vcnBoTm9ybWFsID0gbW9ycGhOb3JtYWxzW2ldOwogICAgICAgIGNvbnN0IG1vcnBoQ29sb3IgPSBtb3JwaENvbG9yc1tpXTsKICAgICAgICBjb25zdCBvZmZzZXQgPSB3aWR0aCAqIGhlaWdodCAqIDQgKiBpOwogICAgICAgIGZvciAobGV0IGogPSAwO2ogPCBtb3JwaFRhcmdldC5jb3VudDsgaisrKSB7CiAgICAgICAgICBjb25zdCBzdHJpZGUgPSBqICogdmVydGV4RGF0YVN0cmlkZTsKICAgICAgICAgIGlmIChoYXNNb3JwaFBvc2l0aW9uID09PSB0cnVlKSB7CiAgICAgICAgICAgIG1vcnBoLmZyb21CdWZmZXJBdHRyaWJ1dGUobW9ycGhUYXJnZXQsIGopOwogICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgc3RyaWRlICsgMF0gPSBtb3JwaC54OwogICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgc3RyaWRlICsgMV0gPSBtb3JwaC55OwogICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgc3RyaWRlICsgMl0gPSBtb3JwaC56OwogICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgc3RyaWRlICsgM10gPSAwOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGhhc01vcnBoTm9ybWFscyA9PT0gdHJ1ZSkgewogICAgICAgICAgICBtb3JwaC5mcm9tQnVmZmVyQXR0cmlidXRlKG1vcnBoTm9ybWFsLCBqKTsKICAgICAgICAgICAgYnVmZmVyW29mZnNldCArIHN0cmlkZSArIDRdID0gbW9ycGgueDsKICAgICAgICAgICAgYnVmZmVyW29mZnNldCArIHN0cmlkZSArIDVdID0gbW9ycGgueTsKICAgICAgICAgICAgYnVmZmVyW29mZnNldCArIHN0cmlkZSArIDZdID0gbW9ycGguejsKICAgICAgICAgICAgYnVmZmVyW29mZnNldCArIHN0cmlkZSArIDddID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChoYXNNb3JwaENvbG9ycyA9PT0gdHJ1ZSkgewogICAgICAgICAgICBtb3JwaC5mcm9tQnVmZmVyQXR0cmlidXRlKG1vcnBoQ29sb3IsIGopOwogICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgc3RyaWRlICsgOF0gPSBtb3JwaC54OwogICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgc3RyaWRlICsgOV0gPSBtb3JwaC55OwogICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgc3RyaWRlICsgMTBdID0gbW9ycGguejsKICAgICAgICAgICAgYnVmZmVyW29mZnNldCArIHN0cmlkZSArIDExXSA9IG1vcnBoQ29sb3IuaXRlbVNpemUgPT09IDQgPyBtb3JwaC53IDogMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZW50cnkgPSB7CiAgICAgICAgY291bnQ6IG1vcnBoVGFyZ2V0c0NvdW50LAogICAgICAgIHRleHR1cmUsCiAgICAgICAgc2l6ZTogbmV3IFZlY3RvcjIod2lkdGgsIGhlaWdodCkKICAgICAgfTsKICAgICAgbW9ycGhUZXh0dXJlcy5zZXQoZ2VvbWV0cnksIGVudHJ5KTsKICAgICAgZ2VvbWV0cnkuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIGRpc3Bvc2VUZXh0dXJlKTsKICAgIH0KICAgIGlmIChvYmplY3QuaXNJbnN0YW5jZWRNZXNoID09PSB0cnVlICYmIG9iamVjdC5tb3JwaFRleHR1cmUgIT09IG51bGwpIHsKICAgICAgcHJvZ3JhbS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGdsLCAibW9ycGhUZXh0dXJlIiwgb2JqZWN0Lm1vcnBoVGV4dHVyZSwgdGV4dHVyZXMpOwogICAgfSBlbHNlIHsKICAgICAgbGV0IG1vcnBoSW5mbHVlbmNlc1N1bSA9IDA7CiAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBvYmplY3RJbmZsdWVuY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbW9ycGhJbmZsdWVuY2VzU3VtICs9IG9iamVjdEluZmx1ZW5jZXNbaV07CiAgICAgIH0KICAgICAgY29uc3QgbW9ycGhCYXNlSW5mbHVlbmNlID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzUmVsYXRpdmUgPyAxIDogMSAtIG1vcnBoSW5mbHVlbmNlc1N1bTsKICAgICAgcHJvZ3JhbS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGdsLCAibW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlIiwgbW9ycGhCYXNlSW5mbHVlbmNlKTsKICAgICAgcHJvZ3JhbS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGdsLCAibW9ycGhUYXJnZXRJbmZsdWVuY2VzIiwgb2JqZWN0SW5mbHVlbmNlcyk7CiAgICB9CiAgICBwcm9ncmFtLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoZ2wsICJtb3JwaFRhcmdldHNUZXh0dXJlIiwgZW50cnkudGV4dHVyZSwgdGV4dHVyZXMpOwogICAgcHJvZ3JhbS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGdsLCAibW9ycGhUYXJnZXRzVGV4dHVyZVNpemUiLCBlbnRyeS5zaXplKTsKICB9CiAgcmV0dXJuIHsKICAgIHVwZGF0ZQogIH07Cn0KCmNsYXNzIFdlYkdMTXVsdGl2aWV3IHsKICBjb25zdHJ1Y3RvcihyZW5kZXJlciwgZXh0ZW5zaW9ucywgZ2wpIHsKICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjsKICAgIHRoaXMuREVGQVVMVF9OVU1WSUVXUyA9IDI7CiAgICB0aGlzLm1heE51bVZpZXdzID0gMDsKICAgIHRoaXMuZ2wgPSBnbDsKICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7CiAgICB0aGlzLmF2YWlsYWJsZSA9IHRoaXMuZXh0ZW5zaW9ucy5oYXMoIk9DVUxVU19tdWx0aXZpZXciKTsKICAgIGlmICh0aGlzLmF2YWlsYWJsZSkgewogICAgICBjb25zdCBleHRlbnNpb24gPSB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJPQ1VMVVNfbXVsdGl2aWV3Iik7CiAgICAgIHRoaXMubWF4TnVtVmlld3MgPSB0aGlzLmdsLmdldFBhcmFtZXRlcihleHRlbnNpb24uTUFYX1ZJRVdTX09WUik7CiAgICAgIHRoaXMubWF0NCA9IFtdOwogICAgICB0aGlzLm1hdDMgPSBbXTsKICAgICAgdGhpcy5jYW1lcmFBcnJheSA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDtpIDwgdGhpcy5tYXhOdW1WaWV3czsgaSsrKSB7CiAgICAgICAgdGhpcy5tYXQ0W2ldID0gbmV3IE1hdHJpeDQ7CiAgICAgICAgdGhpcy5tYXQzW2ldID0gbmV3IE1hdHJpeDM7CiAgICAgIH0KICAgIH0KICB9CiAgZ2V0Q2FtZXJhQXJyYXkoY2FtZXJhKSB7CiAgICBpZiAoY2FtZXJhLmlzQXJyYXlDYW1lcmEpCiAgICAgIHJldHVybiBjYW1lcmEuY2FtZXJhczsKICAgIHRoaXMuY2FtZXJhQXJyYXlbMF0gPSBjYW1lcmE7CiAgICByZXR1cm4gdGhpcy5jYW1lcmFBcnJheTsKICB9CiAgdXBkYXRlQ2FtZXJhUHJvamVjdGlvbk1hdHJpY2VzVW5pZm9ybShjYW1lcmEsIHVuaWZvcm1zKSB7CiAgICB2YXIgY2FtZXJhcyA9IHRoaXMuZ2V0Q2FtZXJhQXJyYXkoY2FtZXJhKTsKICAgIGZvciAodmFyIGkgPSAwO2kgPCBjYW1lcmFzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHRoaXMubWF0NFtpXS5jb3B5KGNhbWVyYXNbaV0ucHJvamVjdGlvbk1hdHJpeCk7CiAgICB9CiAgICB1bmlmb3Jtcy5zZXRWYWx1ZSh0aGlzLmdsLCAicHJvamVjdGlvbk1hdHJpY2VzIiwgdGhpcy5tYXQ0KTsKICB9CiAgdXBkYXRlQ2FtZXJhVmlld01hdHJpY2VzVW5pZm9ybShjYW1lcmEsIHVuaWZvcm1zKSB7CiAgICB2YXIgY2FtZXJhcyA9IHRoaXMuZ2V0Q2FtZXJhQXJyYXkoY2FtZXJhKTsKICAgIGZvciAodmFyIGkgPSAwO2kgPCBjYW1lcmFzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHRoaXMubWF0NFtpXS5jb3B5KGNhbWVyYXNbaV0ubWF0cml4V29ybGRJbnZlcnNlKTsKICAgIH0KICAgIHVuaWZvcm1zLnNldFZhbHVlKHRoaXMuZ2wsICJ2aWV3TWF0cmljZXMiLCB0aGlzLm1hdDQpOwogIH0KICB1cGRhdGVPYmplY3RNYXRyaWNlc1VuaWZvcm1zKG9iamVjdCwgY2FtZXJhLCB1bmlmb3JtcykgewogICAgdmFyIGNhbWVyYXMgPSB0aGlzLmdldENhbWVyYUFycmF5KGNhbWVyYSk7CiAgICBmb3IgKHZhciBpID0gMDtpIDwgY2FtZXJhcy5sZW5ndGg7IGkrKykgewogICAgICB0aGlzLm1hdDRbaV0ubXVsdGlwbHlNYXRyaWNlcyhjYW1lcmFzW2ldLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkKTsKICAgICAgdGhpcy5tYXQzW2ldLmdldE5vcm1hbE1hdHJpeCh0aGlzLm1hdDRbaV0pOwogICAgfQogICAgdW5pZm9ybXMuc2V0VmFsdWUodGhpcy5nbCwgIm1vZGVsVmlld01hdHJpY2VzIiwgdGhpcy5tYXQ0KTsKICAgIHVuaWZvcm1zLnNldFZhbHVlKHRoaXMuZ2wsICJub3JtYWxNYXRyaWNlcyIsIHRoaXMubWF0Myk7CiAgfQp9CmZ1bmN0aW9uIFdlYkdMT2JqZWN0cyhnbCwgZ2VvbWV0cmllcywgYXR0cmlidXRlcywgaW5mbykgewogIGxldCB1cGRhdGVNYXAgPSBuZXcgV2Vha01hcDsKICBmdW5jdGlvbiB1cGRhdGUob2JqZWN0KSB7CiAgICBjb25zdCBmcmFtZSA9IGluZm8ucmVuZGVyLmZyYW1lOwogICAgY29uc3QgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7CiAgICBjb25zdCBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXMuZ2V0KG9iamVjdCwgZ2VvbWV0cnkpOwogICAgaWYgKHVwZGF0ZU1hcC5nZXQoYnVmZmVyZ2VvbWV0cnkpICE9PSBmcmFtZSkgewogICAgICBnZW9tZXRyaWVzLnVwZGF0ZShidWZmZXJnZW9tZXRyeSk7CiAgICAgIHVwZGF0ZU1hcC5zZXQoYnVmZmVyZ2VvbWV0cnksIGZyYW1lKTsKICAgIH0KICAgIGlmIChvYmplY3QuaXNJbnN0YW5jZWRNZXNoKSB7CiAgICAgIGlmIChvYmplY3QuaGFzRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIG9uSW5zdGFuY2VkTWVzaERpc3Bvc2UpID09PSBmYWxzZSkgewogICAgICAgIG9iamVjdC5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgb25JbnN0YW5jZWRNZXNoRGlzcG9zZSk7CiAgICAgIH0KICAgICAgaWYgKHVwZGF0ZU1hcC5nZXQob2JqZWN0KSAhPT0gZnJhbWUpIHsKICAgICAgICBhdHRyaWJ1dGVzLnVwZGF0ZShvYmplY3QuaW5zdGFuY2VNYXRyaXgsIGdsLkFSUkFZX0JVRkZFUik7CiAgICAgICAgaWYgKG9iamVjdC5pbnN0YW5jZUNvbG9yICE9PSBudWxsKSB7CiAgICAgICAgICBhdHRyaWJ1dGVzLnVwZGF0ZShvYmplY3QuaW5zdGFuY2VDb2xvciwgZ2wuQVJSQVlfQlVGRkVSKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlTWFwLnNldChvYmplY3QsIGZyYW1lKTsKICAgICAgfQogICAgfQogICAgaWYgKG9iamVjdC5pc1NraW5uZWRNZXNoKSB7CiAgICAgIGNvbnN0IHNrZWxldG9uID0gb2JqZWN0LnNrZWxldG9uOwogICAgICBpZiAodXBkYXRlTWFwLmdldChza2VsZXRvbikgIT09IGZyYW1lKSB7CiAgICAgICAgc2tlbGV0b24udXBkYXRlKCk7CiAgICAgICAgdXBkYXRlTWFwLnNldChza2VsZXRvbiwgZnJhbWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gYnVmZmVyZ2VvbWV0cnk7CiAgfQogIGZ1bmN0aW9uIGRpc3Bvc2UoKSB7CiAgICB1cGRhdGVNYXAgPSBuZXcgV2Vha01hcDsKICB9CiAgZnVuY3Rpb24gb25JbnN0YW5jZWRNZXNoRGlzcG9zZShldmVudCkgewogICAgY29uc3QgaW5zdGFuY2VkTWVzaCA9IGV2ZW50LnRhcmdldDsKICAgIGluc3RhbmNlZE1lc2gucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIG9uSW5zdGFuY2VkTWVzaERpc3Bvc2UpOwogICAgYXR0cmlidXRlcy5yZW1vdmUoaW5zdGFuY2VkTWVzaC5pbnN0YW5jZU1hdHJpeCk7CiAgICBpZiAoaW5zdGFuY2VkTWVzaC5pbnN0YW5jZUNvbG9yICE9PSBudWxsKQogICAgICBhdHRyaWJ1dGVzLnJlbW92ZShpbnN0YW5jZWRNZXNoLmluc3RhbmNlQ29sb3IpOwogIH0KICByZXR1cm4gewogICAgdXBkYXRlLAogICAgZGlzcG9zZQogIH07Cn0KZnVuY3Rpb24gZmxhdHRlbihhcnJheSwgbkJsb2NrcywgYmxvY2tTaXplKSB7CiAgY29uc3QgZmlyc3RFbGVtID0gYXJyYXlbMF07CiAgaWYgKGZpcnN0RWxlbSA8PSAwIHx8IGZpcnN0RWxlbSA+IDApCiAgICByZXR1cm4gYXJyYXk7CiAgY29uc3QgbiA9IG5CbG9ja3MgKiBibG9ja1NpemU7CiAgbGV0IHIgPSBhcnJheUNhY2hlRjMyW25dOwogIGlmIChyID09PSB1bmRlZmluZWQpIHsKICAgIHIgPSBuZXcgRmxvYXQzMkFycmF5KG4pOwogICAgYXJyYXlDYWNoZUYzMltuXSA9IHI7CiAgfQogIGlmIChuQmxvY2tzICE9PSAwKSB7CiAgICBmaXJzdEVsZW0udG9BcnJheShyLCAwKTsKICAgIGZvciAobGV0IGkgPSAxLCBvZmZzZXQgPSAwO2kgIT09IG5CbG9ja3M7ICsraSkgewogICAgICBvZmZzZXQgKz0gYmxvY2tTaXplOwogICAgICBhcnJheVtpXS50b0FycmF5KHIsIG9mZnNldCk7CiAgICB9CiAgfQogIHJldHVybiByOwp9CmZ1bmN0aW9uIGFycmF5c0VxdWFsKGEsIGIpIHsKICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKQogICAgcmV0dXJuIGZhbHNlOwogIGZvciAobGV0IGkgPSAwLCBsID0gYS5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgaWYgKGFbaV0gIT09IGJbaV0pCiAgICAgIHJldHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gY29weUFycmF5KGEsIGIpIHsKICBmb3IgKGxldCBpID0gMCwgbCA9IGIubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgIGFbaV0gPSBiW2ldOwogIH0KfQpmdW5jdGlvbiBhbGxvY1RleFVuaXRzKHRleHR1cmVzLCBuKSB7CiAgbGV0IHIgPSBhcnJheUNhY2hlSTMyW25dOwogIGlmIChyID09PSB1bmRlZmluZWQpIHsKICAgIHIgPSBuZXcgSW50MzJBcnJheShuKTsKICAgIGFycmF5Q2FjaGVJMzJbbl0gPSByOwogIH0KICBmb3IgKGxldCBpID0gMDtpICE9PSBuOyArK2kpIHsKICAgIHJbaV0gPSB0ZXh0dXJlcy5hbGxvY2F0ZVRleHR1cmVVbml0KCk7CiAgfQogIHJldHVybiByOwp9CmZ1bmN0aW9uIHNldFZhbHVlVjFmKGdsLCB2KSB7CiAgY29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlOwogIGlmIChjYWNoZVswXSA9PT0gdikKICAgIHJldHVybjsKICBnbC51bmlmb3JtMWYodGhpcy5hZGRyLCB2KTsKICBjYWNoZVswXSA9IHY7Cn0KZnVuY3Rpb24gc2V0VmFsdWVWMmYoZ2wsIHYpIHsKICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7CiAgaWYgKHYueCAhPT0gdW5kZWZpbmVkKSB7CiAgICBpZiAoY2FjaGVbMF0gIT09IHYueCB8fCBjYWNoZVsxXSAhPT0gdi55KSB7CiAgICAgIGdsLnVuaWZvcm0yZih0aGlzLmFkZHIsIHYueCwgdi55KTsKICAgICAgY2FjaGVbMF0gPSB2Lng7CiAgICAgIGNhY2hlWzFdID0gdi55OwogICAgfQogIH0gZWxzZSB7CiAgICBpZiAoYXJyYXlzRXF1YWwoY2FjaGUsIHYpKQogICAgICByZXR1cm47CiAgICBnbC51bmlmb3JtMmZ2KHRoaXMuYWRkciwgdik7CiAgICBjb3B5QXJyYXkoY2FjaGUsIHYpOwogIH0KfQpmdW5jdGlvbiBzZXRWYWx1ZVYzZihnbCwgdikgewogIGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTsKICBpZiAodi54ICE9PSB1bmRlZmluZWQpIHsKICAgIGlmIChjYWNoZVswXSAhPT0gdi54IHx8IGNhY2hlWzFdICE9PSB2LnkgfHwgY2FjaGVbMl0gIT09IHYueikgewogICAgICBnbC51bmlmb3JtM2YodGhpcy5hZGRyLCB2LngsIHYueSwgdi56KTsKICAgICAgY2FjaGVbMF0gPSB2Lng7CiAgICAgIGNhY2hlWzFdID0gdi55OwogICAgICBjYWNoZVsyXSA9IHYuejsKICAgIH0KICB9IGVsc2UgaWYgKHYuciAhPT0gdW5kZWZpbmVkKSB7CiAgICBpZiAoY2FjaGVbMF0gIT09IHYuciB8fCBjYWNoZVsxXSAhPT0gdi5nIHx8IGNhY2hlWzJdICE9PSB2LmIpIHsKICAgICAgZ2wudW5pZm9ybTNmKHRoaXMuYWRkciwgdi5yLCB2LmcsIHYuYik7CiAgICAgIGNhY2hlWzBdID0gdi5yOwogICAgICBjYWNoZVsxXSA9IHYuZzsKICAgICAgY2FjaGVbMl0gPSB2LmI7CiAgICB9CiAgfSBlbHNlIHsKICAgIGlmIChhcnJheXNFcXVhbChjYWNoZSwgdikpCiAgICAgIHJldHVybjsKICAgIGdsLnVuaWZvcm0zZnYodGhpcy5hZGRyLCB2KTsKICAgIGNvcHlBcnJheShjYWNoZSwgdik7CiAgfQp9CmZ1bmN0aW9uIHNldFZhbHVlVjRmKGdsLCB2KSB7CiAgY29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlOwogIGlmICh2LnggIT09IHVuZGVmaW5lZCkgewogICAgaWYgKGNhY2hlWzBdICE9PSB2LnggfHwgY2FjaGVbMV0gIT09IHYueSB8fCBjYWNoZVsyXSAhPT0gdi56IHx8IGNhY2hlWzNdICE9PSB2LncpIHsKICAgICAgZ2wudW5pZm9ybTRmKHRoaXMuYWRkciwgdi54LCB2LnksIHYueiwgdi53KTsKICAgICAgY2FjaGVbMF0gPSB2Lng7CiAgICAgIGNhY2hlWzFdID0gdi55OwogICAgICBjYWNoZVsyXSA9IHYuejsKICAgICAgY2FjaGVbM10gPSB2Lnc7CiAgICB9CiAgfSBlbHNlIHsKICAgIGlmIChhcnJheXNFcXVhbChjYWNoZSwgdikpCiAgICAgIHJldHVybjsKICAgIGdsLnVuaWZvcm00ZnYodGhpcy5hZGRyLCB2KTsKICAgIGNvcHlBcnJheShjYWNoZSwgdik7CiAgfQp9CmZ1bmN0aW9uIHNldFZhbHVlTTIoZ2wsIHYpIHsKICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7CiAgY29uc3QgZWxlbWVudHMgPSB2LmVsZW1lbnRzOwogIGlmIChlbGVtZW50cyA9PT0gdW5kZWZpbmVkKSB7CiAgICBpZiAoYXJyYXlzRXF1YWwoY2FjaGUsIHYpKQogICAgICByZXR1cm47CiAgICBnbC51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwgZmFsc2UsIHYpOwogICAgY29weUFycmF5KGNhY2hlLCB2KTsKICB9IGVsc2UgewogICAgaWYgKGFycmF5c0VxdWFsKGNhY2hlLCBlbGVtZW50cykpCiAgICAgIHJldHVybjsKICAgIG1hdDJhcnJheS5zZXQoZWxlbWVudHMpOwogICAgZ2wudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsIGZhbHNlLCBtYXQyYXJyYXkpOwogICAgY29weUFycmF5KGNhY2hlLCBlbGVtZW50cyk7CiAgfQp9CmZ1bmN0aW9uIHNldFZhbHVlTTMoZ2wsIHYpIHsKICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7CiAgY29uc3QgZWxlbWVudHMgPSB2LmVsZW1lbnRzOwogIGlmIChlbGVtZW50cyA9PT0gdW5kZWZpbmVkKSB7CiAgICBpZiAoYXJyYXlzRXF1YWwoY2FjaGUsIHYpKQogICAgICByZXR1cm47CiAgICBnbC51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwgZmFsc2UsIHYpOwogICAgY29weUFycmF5KGNhY2hlLCB2KTsKICB9IGVsc2UgewogICAgaWYgKGFycmF5c0VxdWFsKGNhY2hlLCBlbGVtZW50cykpCiAgICAgIHJldHVybjsKICAgIG1hdDNhcnJheS5zZXQoZWxlbWVudHMpOwogICAgZ2wudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsIGZhbHNlLCBtYXQzYXJyYXkpOwogICAgY29weUFycmF5KGNhY2hlLCBlbGVtZW50cyk7CiAgfQp9CmZ1bmN0aW9uIHNldFZhbHVlTTQoZ2wsIHYpIHsKICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7CiAgY29uc3QgZWxlbWVudHMgPSB2LmVsZW1lbnRzOwogIGlmIChlbGVtZW50cyA9PT0gdW5kZWZpbmVkKSB7CiAgICBpZiAoYXJyYXlzRXF1YWwoY2FjaGUsIHYpKQogICAgICByZXR1cm47CiAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwgZmFsc2UsIHYpOwogICAgY29weUFycmF5KGNhY2hlLCB2KTsKICB9IGVsc2UgewogICAgaWYgKGFycmF5c0VxdWFsKGNhY2hlLCBlbGVtZW50cykpCiAgICAgIHJldHVybjsKICAgIG1hdDRhcnJheS5zZXQoZWxlbWVudHMpOwogICAgZ2wudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsIGZhbHNlLCBtYXQ0YXJyYXkpOwogICAgY29weUFycmF5KGNhY2hlLCBlbGVtZW50cyk7CiAgfQp9CmZ1bmN0aW9uIHNldFZhbHVlVjFpKGdsLCB2KSB7CiAgY29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlOwogIGlmIChjYWNoZVswXSA9PT0gdikKICAgIHJldHVybjsKICBnbC51bmlmb3JtMWkodGhpcy5hZGRyLCB2KTsKICBjYWNoZVswXSA9IHY7Cn0KZnVuY3Rpb24gc2V0VmFsdWVWMmkoZ2wsIHYpIHsKICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7CiAgaWYgKHYueCAhPT0gdW5kZWZpbmVkKSB7CiAgICBpZiAoY2FjaGVbMF0gIT09IHYueCB8fCBjYWNoZVsxXSAhPT0gdi55KSB7CiAgICAgIGdsLnVuaWZvcm0yaSh0aGlzLmFkZHIsIHYueCwgdi55KTsKICAgICAgY2FjaGVbMF0gPSB2Lng7CiAgICAgIGNhY2hlWzFdID0gdi55OwogICAgfQogIH0gZWxzZSB7CiAgICBpZiAoYXJyYXlzRXF1YWwoY2FjaGUsIHYpKQogICAgICByZXR1cm47CiAgICBnbC51bmlmb3JtMml2KHRoaXMuYWRkciwgdik7CiAgICBjb3B5QXJyYXkoY2FjaGUsIHYpOwogIH0KfQpmdW5jdGlvbiBzZXRWYWx1ZVYzaShnbCwgdikgewogIGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTsKICBpZiAodi54ICE9PSB1bmRlZmluZWQpIHsKICAgIGlmIChjYWNoZVswXSAhPT0gdi54IHx8IGNhY2hlWzFdICE9PSB2LnkgfHwgY2FjaGVbMl0gIT09IHYueikgewogICAgICBnbC51bmlmb3JtM2kodGhpcy5hZGRyLCB2LngsIHYueSwgdi56KTsKICAgICAgY2FjaGVbMF0gPSB2Lng7CiAgICAgIGNhY2hlWzFdID0gdi55OwogICAgICBjYWNoZVsyXSA9IHYuejsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGFycmF5c0VxdWFsKGNhY2hlLCB2KSkKICAgICAgcmV0dXJuOwogICAgZ2wudW5pZm9ybTNpdih0aGlzLmFkZHIsIHYpOwogICAgY29weUFycmF5KGNhY2hlLCB2KTsKICB9Cn0KZnVuY3Rpb24gc2V0VmFsdWVWNGkoZ2wsIHYpIHsKICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7CiAgaWYgKHYueCAhPT0gdW5kZWZpbmVkKSB7CiAgICBpZiAoY2FjaGVbMF0gIT09IHYueCB8fCBjYWNoZVsxXSAhPT0gdi55IHx8IGNhY2hlWzJdICE9PSB2LnogfHwgY2FjaGVbM10gIT09IHYudykgewogICAgICBnbC51bmlmb3JtNGkodGhpcy5hZGRyLCB2LngsIHYueSwgdi56LCB2LncpOwogICAgICBjYWNoZVswXSA9IHYueDsKICAgICAgY2FjaGVbMV0gPSB2Lnk7CiAgICAgIGNhY2hlWzJdID0gdi56OwogICAgICBjYWNoZVszXSA9IHYudzsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGFycmF5c0VxdWFsKGNhY2hlLCB2KSkKICAgICAgcmV0dXJuOwogICAgZ2wudW5pZm9ybTRpdih0aGlzLmFkZHIsIHYpOwogICAgY29weUFycmF5KGNhY2hlLCB2KTsKICB9Cn0KZnVuY3Rpb24gc2V0VmFsdWVWMXVpKGdsLCB2KSB7CiAgY29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlOwogIGlmIChjYWNoZVswXSA9PT0gdikKICAgIHJldHVybjsKICBnbC51bmlmb3JtMXVpKHRoaXMuYWRkciwgdik7CiAgY2FjaGVbMF0gPSB2Owp9CmZ1bmN0aW9uIHNldFZhbHVlVjJ1aShnbCwgdikgewogIGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTsKICBpZiAodi54ICE9PSB1bmRlZmluZWQpIHsKICAgIGlmIChjYWNoZVswXSAhPT0gdi54IHx8IGNhY2hlWzFdICE9PSB2LnkpIHsKICAgICAgZ2wudW5pZm9ybTJ1aSh0aGlzLmFkZHIsIHYueCwgdi55KTsKICAgICAgY2FjaGVbMF0gPSB2Lng7CiAgICAgIGNhY2hlWzFdID0gdi55OwogICAgfQogIH0gZWxzZSB7CiAgICBpZiAoYXJyYXlzRXF1YWwoY2FjaGUsIHYpKQogICAgICByZXR1cm47CiAgICBnbC51bmlmb3JtMnVpdih0aGlzLmFkZHIsIHYpOwogICAgY29weUFycmF5KGNhY2hlLCB2KTsKICB9Cn0KZnVuY3Rpb24gc2V0VmFsdWVWM3VpKGdsLCB2KSB7CiAgY29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlOwogIGlmICh2LnggIT09IHVuZGVmaW5lZCkgewogICAgaWYgKGNhY2hlWzBdICE9PSB2LnggfHwgY2FjaGVbMV0gIT09IHYueSB8fCBjYWNoZVsyXSAhPT0gdi56KSB7CiAgICAgIGdsLnVuaWZvcm0zdWkodGhpcy5hZGRyLCB2LngsIHYueSwgdi56KTsKICAgICAgY2FjaGVbMF0gPSB2Lng7CiAgICAgIGNhY2hlWzFdID0gdi55OwogICAgICBjYWNoZVsyXSA9IHYuejsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGFycmF5c0VxdWFsKGNhY2hlLCB2KSkKICAgICAgcmV0dXJuOwogICAgZ2wudW5pZm9ybTN1aXYodGhpcy5hZGRyLCB2KTsKICAgIGNvcHlBcnJheShjYWNoZSwgdik7CiAgfQp9CmZ1bmN0aW9uIHNldFZhbHVlVjR1aShnbCwgdikgewogIGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTsKICBpZiAodi54ICE9PSB1bmRlZmluZWQpIHsKICAgIGlmIChjYWNoZVswXSAhPT0gdi54IHx8IGNhY2hlWzFdICE9PSB2LnkgfHwgY2FjaGVbMl0gIT09IHYueiB8fCBjYWNoZVszXSAhPT0gdi53KSB7CiAgICAgIGdsLnVuaWZvcm00dWkodGhpcy5hZGRyLCB2LngsIHYueSwgdi56LCB2LncpOwogICAgICBjYWNoZVswXSA9IHYueDsKICAgICAgY2FjaGVbMV0gPSB2Lnk7CiAgICAgIGNhY2hlWzJdID0gdi56OwogICAgICBjYWNoZVszXSA9IHYudzsKICAgIH0KICB9IGVsc2UgewogICAgaWYgKGFycmF5c0VxdWFsKGNhY2hlLCB2KSkKICAgICAgcmV0dXJuOwogICAgZ2wudW5pZm9ybTR1aXYodGhpcy5hZGRyLCB2KTsKICAgIGNvcHlBcnJheShjYWNoZSwgdik7CiAgfQp9CmZ1bmN0aW9uIHNldFZhbHVlVDEoZ2wsIHYsIHRleHR1cmVzKSB7CiAgY29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlOwogIGNvbnN0IHVuaXQgPSB0ZXh0dXJlcy5hbGxvY2F0ZVRleHR1cmVVbml0KCk7CiAgaWYgKGNhY2hlWzBdICE9PSB1bml0KSB7CiAgICBnbC51bmlmb3JtMWkodGhpcy5hZGRyLCB1bml0KTsKICAgIGNhY2hlWzBdID0gdW5pdDsKICB9CiAgbGV0IGVtcHR5VGV4dHVyZTJEOwogIGlmICh0aGlzLnR5cGUgPT09IGdsLlNBTVBMRVJfMkRfU0hBRE9XKSB7CiAgICBlbXB0eVNoYWRvd1RleHR1cmUuY29tcGFyZUZ1bmN0aW9uID0gTGVzc0VxdWFsQ29tcGFyZTsKICAgIGVtcHR5VGV4dHVyZTJEID0gZW1wdHlTaGFkb3dUZXh0dXJlOwogIH0gZWxzZSB7CiAgICBlbXB0eVRleHR1cmUyRCA9IGVtcHR5VGV4dHVyZTsKICB9CiAgdGV4dHVyZXMuc2V0VGV4dHVyZTJEKHYgfHwgZW1wdHlUZXh0dXJlMkQsIHVuaXQpOwp9CmZ1bmN0aW9uIHNldFZhbHVlVDNEMShnbCwgdiwgdGV4dHVyZXMpIHsKICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7CiAgY29uc3QgdW5pdCA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKICBpZiAoY2FjaGVbMF0gIT09IHVuaXQpIHsKICAgIGdsLnVuaWZvcm0xaSh0aGlzLmFkZHIsIHVuaXQpOwogICAgY2FjaGVbMF0gPSB1bml0OwogIH0KICB0ZXh0dXJlcy5zZXRUZXh0dXJlM0QodiB8fCBlbXB0eTNkVGV4dHVyZSwgdW5pdCk7Cn0KZnVuY3Rpb24gc2V0VmFsdWVUNihnbCwgdiwgdGV4dHVyZXMpIHsKICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7CiAgY29uc3QgdW5pdCA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKICBpZiAoY2FjaGVbMF0gIT09IHVuaXQpIHsKICAgIGdsLnVuaWZvcm0xaSh0aGlzLmFkZHIsIHVuaXQpOwogICAgY2FjaGVbMF0gPSB1bml0OwogIH0KICB0ZXh0dXJlcy5zZXRUZXh0dXJlQ3ViZSh2IHx8IGVtcHR5Q3ViZVRleHR1cmUsIHVuaXQpOwp9CmZ1bmN0aW9uIHNldFZhbHVlVDJEQXJyYXkxKGdsLCB2LCB0ZXh0dXJlcykgewogIGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTsKICBjb25zdCB1bml0ID0gdGV4dHVyZXMuYWxsb2NhdGVUZXh0dXJlVW5pdCgpOwogIGlmIChjYWNoZVswXSAhPT0gdW5pdCkgewogICAgZ2wudW5pZm9ybTFpKHRoaXMuYWRkciwgdW5pdCk7CiAgICBjYWNoZVswXSA9IHVuaXQ7CiAgfQogIHRleHR1cmVzLnNldFRleHR1cmUyREFycmF5KHYgfHwgZW1wdHlBcnJheVRleHR1cmUsIHVuaXQpOwp9CmZ1bmN0aW9uIGdldFNpbmd1bGFyU2V0dGVyKHR5cGUpIHsKICBzd2l0Y2ggKHR5cGUpIHsKICAgIGNhc2UgNTEyNjoKICAgICAgcmV0dXJuIHNldFZhbHVlVjFmOwogICAgY2FzZSAzNTY2NDoKICAgICAgcmV0dXJuIHNldFZhbHVlVjJmOwogICAgY2FzZSAzNTY2NToKICAgICAgcmV0dXJuIHNldFZhbHVlVjNmOwogICAgY2FzZSAzNTY2NjoKICAgICAgcmV0dXJuIHNldFZhbHVlVjRmOwogICAgY2FzZSAzNTY3NDoKICAgICAgcmV0dXJuIHNldFZhbHVlTTI7CiAgICBjYXNlIDM1Njc1OgogICAgICByZXR1cm4gc2V0VmFsdWVNMzsKICAgIGNhc2UgMzU2NzY6CiAgICAgIHJldHVybiBzZXRWYWx1ZU00OwogICAgY2FzZSA1MTI0OgogICAgY2FzZSAzNTY3MDoKICAgICAgcmV0dXJuIHNldFZhbHVlVjFpOwogICAgY2FzZSAzNTY2NzoKICAgIGNhc2UgMzU2NzE6CiAgICAgIHJldHVybiBzZXRWYWx1ZVYyaTsKICAgIGNhc2UgMzU2Njg6CiAgICBjYXNlIDM1NjcyOgogICAgICByZXR1cm4gc2V0VmFsdWVWM2k7CiAgICBjYXNlIDM1NjY5OgogICAgY2FzZSAzNTY3MzoKICAgICAgcmV0dXJuIHNldFZhbHVlVjRpOwogICAgY2FzZSA1MTI1OgogICAgICByZXR1cm4gc2V0VmFsdWVWMXVpOwogICAgY2FzZSAzNjI5NDoKICAgICAgcmV0dXJuIHNldFZhbHVlVjJ1aTsKICAgIGNhc2UgMzYyOTU6CiAgICAgIHJldHVybiBzZXRWYWx1ZVYzdWk7CiAgICBjYXNlIDM2Mjk2OgogICAgICByZXR1cm4gc2V0VmFsdWVWNHVpOwogICAgY2FzZSAzNTY3ODoKICAgIGNhc2UgMzYxOTg6CiAgICBjYXNlIDM2Mjk4OgogICAgY2FzZSAzNjMwNjoKICAgIGNhc2UgMzU2ODI6CiAgICAgIHJldHVybiBzZXRWYWx1ZVQxOwogICAgY2FzZSAzNTY3OToKICAgIGNhc2UgMzYyOTk6CiAgICBjYXNlIDM2MzA3OgogICAgICByZXR1cm4gc2V0VmFsdWVUM0QxOwogICAgY2FzZSAzNTY4MDoKICAgIGNhc2UgMzYzMDA6CiAgICBjYXNlIDM2MzA4OgogICAgY2FzZSAzNjI5MzoKICAgICAgcmV0dXJuIHNldFZhbHVlVDY7CiAgICBjYXNlIDM2Mjg5OgogICAgY2FzZSAzNjMwMzoKICAgIGNhc2UgMzYzMTE6CiAgICBjYXNlIDM2MjkyOgogICAgICByZXR1cm4gc2V0VmFsdWVUMkRBcnJheTE7CiAgfQp9CmZ1bmN0aW9uIHNldFZhbHVlVjFmQXJyYXkoZ2wsIHYpIHsKICBnbC51bmlmb3JtMWZ2KHRoaXMuYWRkciwgdik7Cn0KZnVuY3Rpb24gc2V0VmFsdWVWMmZBcnJheShnbCwgdikgewogIGNvbnN0IGRhdGEgPSBmbGF0dGVuKHYsIHRoaXMuc2l6ZSwgMik7CiAgZ2wudW5pZm9ybTJmdih0aGlzLmFkZHIsIGRhdGEpOwp9CmZ1bmN0aW9uIHNldFZhbHVlVjNmQXJyYXkoZ2wsIHYpIHsKICBjb25zdCBkYXRhID0gZmxhdHRlbih2LCB0aGlzLnNpemUsIDMpOwogIGdsLnVuaWZvcm0zZnYodGhpcy5hZGRyLCBkYXRhKTsKfQpmdW5jdGlvbiBzZXRWYWx1ZVY0ZkFycmF5KGdsLCB2KSB7CiAgY29uc3QgZGF0YSA9IGZsYXR0ZW4odiwgdGhpcy5zaXplLCA0KTsKICBnbC51bmlmb3JtNGZ2KHRoaXMuYWRkciwgZGF0YSk7Cn0KZnVuY3Rpb24gc2V0VmFsdWVNMkFycmF5KGdsLCB2KSB7CiAgY29uc3QgZGF0YSA9IGZsYXR0ZW4odiwgdGhpcy5zaXplLCA0KTsKICBnbC51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwgZmFsc2UsIGRhdGEpOwp9CmZ1bmN0aW9uIHNldFZhbHVlTTNBcnJheShnbCwgdikgewogIGNvbnN0IGRhdGEgPSBmbGF0dGVuKHYsIHRoaXMuc2l6ZSwgOSk7CiAgZ2wudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsIGZhbHNlLCBkYXRhKTsKfQpmdW5jdGlvbiBzZXRWYWx1ZU00QXJyYXkoZ2wsIHYpIHsKICBjb25zdCBkYXRhID0gZmxhdHRlbih2LCB0aGlzLnNpemUsIDE2KTsKICBnbC51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwgZmFsc2UsIGRhdGEpOwp9CmZ1bmN0aW9uIHNldFZhbHVlVjFpQXJyYXkoZ2wsIHYpIHsKICBnbC51bmlmb3JtMWl2KHRoaXMuYWRkciwgdik7Cn0KZnVuY3Rpb24gc2V0VmFsdWVWMmlBcnJheShnbCwgdikgewogIGdsLnVuaWZvcm0yaXYodGhpcy5hZGRyLCB2KTsKfQpmdW5jdGlvbiBzZXRWYWx1ZVYzaUFycmF5KGdsLCB2KSB7CiAgZ2wudW5pZm9ybTNpdih0aGlzLmFkZHIsIHYpOwp9CmZ1bmN0aW9uIHNldFZhbHVlVjRpQXJyYXkoZ2wsIHYpIHsKICBnbC51bmlmb3JtNGl2KHRoaXMuYWRkciwgdik7Cn0KZnVuY3Rpb24gc2V0VmFsdWVWMXVpQXJyYXkoZ2wsIHYpIHsKICBnbC51bmlmb3JtMXVpdih0aGlzLmFkZHIsIHYpOwp9CmZ1bmN0aW9uIHNldFZhbHVlVjJ1aUFycmF5KGdsLCB2KSB7CiAgZ2wudW5pZm9ybTJ1aXYodGhpcy5hZGRyLCB2KTsKfQpmdW5jdGlvbiBzZXRWYWx1ZVYzdWlBcnJheShnbCwgdikgewogIGdsLnVuaWZvcm0zdWl2KHRoaXMuYWRkciwgdik7Cn0KZnVuY3Rpb24gc2V0VmFsdWVWNHVpQXJyYXkoZ2wsIHYpIHsKICBnbC51bmlmb3JtNHVpdih0aGlzLmFkZHIsIHYpOwp9CmZ1bmN0aW9uIHNldFZhbHVlVDFBcnJheShnbCwgdiwgdGV4dHVyZXMpIHsKICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7CiAgY29uc3QgbiA9IHYubGVuZ3RoOwogIGNvbnN0IHVuaXRzID0gYWxsb2NUZXhVbml0cyh0ZXh0dXJlcywgbik7CiAgaWYgKCFhcnJheXNFcXVhbChjYWNoZSwgdW5pdHMpKSB7CiAgICBnbC51bmlmb3JtMWl2KHRoaXMuYWRkciwgdW5pdHMpOwogICAgY29weUFycmF5KGNhY2hlLCB1bml0cyk7CiAgfQogIGZvciAobGV0IGkgPSAwO2kgIT09IG47ICsraSkgewogICAgdGV4dHVyZXMuc2V0VGV4dHVyZTJEKHZbaV0gfHwgZW1wdHlUZXh0dXJlLCB1bml0c1tpXSk7CiAgfQp9CmZ1bmN0aW9uIHNldFZhbHVlVDNEQXJyYXkoZ2wsIHYsIHRleHR1cmVzKSB7CiAgY29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlOwogIGNvbnN0IG4gPSB2Lmxlbmd0aDsKICBjb25zdCB1bml0cyA9IGFsbG9jVGV4VW5pdHModGV4dHVyZXMsIG4pOwogIGlmICghYXJyYXlzRXF1YWwoY2FjaGUsIHVuaXRzKSkgewogICAgZ2wudW5pZm9ybTFpdih0aGlzLmFkZHIsIHVuaXRzKTsKICAgIGNvcHlBcnJheShjYWNoZSwgdW5pdHMpOwogIH0KICBmb3IgKGxldCBpID0gMDtpICE9PSBuOyArK2kpIHsKICAgIHRleHR1cmVzLnNldFRleHR1cmUzRCh2W2ldIHx8IGVtcHR5M2RUZXh0dXJlLCB1bml0c1tpXSk7CiAgfQp9CmZ1bmN0aW9uIHNldFZhbHVlVDZBcnJheShnbCwgdiwgdGV4dHVyZXMpIHsKICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7CiAgY29uc3QgbiA9IHYubGVuZ3RoOwogIGNvbnN0IHVuaXRzID0gYWxsb2NUZXhVbml0cyh0ZXh0dXJlcywgbik7CiAgaWYgKCFhcnJheXNFcXVhbChjYWNoZSwgdW5pdHMpKSB7CiAgICBnbC51bmlmb3JtMWl2KHRoaXMuYWRkciwgdW5pdHMpOwogICAgY29weUFycmF5KGNhY2hlLCB1bml0cyk7CiAgfQogIGZvciAobGV0IGkgPSAwO2kgIT09IG47ICsraSkgewogICAgdGV4dHVyZXMuc2V0VGV4dHVyZUN1YmUodltpXSB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0c1tpXSk7CiAgfQp9CmZ1bmN0aW9uIHNldFZhbHVlVDJEQXJyYXlBcnJheShnbCwgdiwgdGV4dHVyZXMpIHsKICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7CiAgY29uc3QgbiA9IHYubGVuZ3RoOwogIGNvbnN0IHVuaXRzID0gYWxsb2NUZXhVbml0cyh0ZXh0dXJlcywgbik7CiAgaWYgKCFhcnJheXNFcXVhbChjYWNoZSwgdW5pdHMpKSB7CiAgICBnbC51bmlmb3JtMWl2KHRoaXMuYWRkciwgdW5pdHMpOwogICAgY29weUFycmF5KGNhY2hlLCB1bml0cyk7CiAgfQogIGZvciAobGV0IGkgPSAwO2kgIT09IG47ICsraSkgewogICAgdGV4dHVyZXMuc2V0VGV4dHVyZTJEQXJyYXkodltpXSB8fCBlbXB0eUFycmF5VGV4dHVyZSwgdW5pdHNbaV0pOwogIH0KfQpmdW5jdGlvbiBnZXRQdXJlQXJyYXlTZXR0ZXIodHlwZSkgewogIHN3aXRjaCAodHlwZSkgewogICAgY2FzZSA1MTI2OgogICAgICByZXR1cm4gc2V0VmFsdWVWMWZBcnJheTsKICAgIGNhc2UgMzU2NjQ6CiAgICAgIHJldHVybiBzZXRWYWx1ZVYyZkFycmF5OwogICAgY2FzZSAzNTY2NToKICAgICAgcmV0dXJuIHNldFZhbHVlVjNmQXJyYXk7CiAgICBjYXNlIDM1NjY2OgogICAgICByZXR1cm4gc2V0VmFsdWVWNGZBcnJheTsKICAgIGNhc2UgMzU2NzQ6CiAgICAgIHJldHVybiBzZXRWYWx1ZU0yQXJyYXk7CiAgICBjYXNlIDM1Njc1OgogICAgICByZXR1cm4gc2V0VmFsdWVNM0FycmF5OwogICAgY2FzZSAzNTY3NjoKICAgICAgcmV0dXJuIHNldFZhbHVlTTRBcnJheTsKICAgIGNhc2UgNTEyNDoKICAgIGNhc2UgMzU2NzA6CiAgICAgIHJldHVybiBzZXRWYWx1ZVYxaUFycmF5OwogICAgY2FzZSAzNTY2NzoKICAgIGNhc2UgMzU2NzE6CiAgICAgIHJldHVybiBzZXRWYWx1ZVYyaUFycmF5OwogICAgY2FzZSAzNTY2ODoKICAgIGNhc2UgMzU2NzI6CiAgICAgIHJldHVybiBzZXRWYWx1ZVYzaUFycmF5OwogICAgY2FzZSAzNTY2OToKICAgIGNhc2UgMzU2NzM6CiAgICAgIHJldHVybiBzZXRWYWx1ZVY0aUFycmF5OwogICAgY2FzZSA1MTI1OgogICAgICByZXR1cm4gc2V0VmFsdWVWMXVpQXJyYXk7CiAgICBjYXNlIDM2Mjk0OgogICAgICByZXR1cm4gc2V0VmFsdWVWMnVpQXJyYXk7CiAgICBjYXNlIDM2Mjk1OgogICAgICByZXR1cm4gc2V0VmFsdWVWM3VpQXJyYXk7CiAgICBjYXNlIDM2Mjk2OgogICAgICByZXR1cm4gc2V0VmFsdWVWNHVpQXJyYXk7CiAgICBjYXNlIDM1Njc4OgogICAgY2FzZSAzNjE5ODoKICAgIGNhc2UgMzYyOTg6CiAgICBjYXNlIDM2MzA2OgogICAgY2FzZSAzNTY4MjoKICAgICAgcmV0dXJuIHNldFZhbHVlVDFBcnJheTsKICAgIGNhc2UgMzU2Nzk6CiAgICBjYXNlIDM2Mjk5OgogICAgY2FzZSAzNjMwNzoKICAgICAgcmV0dXJuIHNldFZhbHVlVDNEQXJyYXk7CiAgICBjYXNlIDM1NjgwOgogICAgY2FzZSAzNjMwMDoKICAgIGNhc2UgMzYzMDg6CiAgICBjYXNlIDM2MjkzOgogICAgICByZXR1cm4gc2V0VmFsdWVUNkFycmF5OwogICAgY2FzZSAzNjI4OToKICAgIGNhc2UgMzYzMDM6CiAgICBjYXNlIDM2MzExOgogICAgY2FzZSAzNjI5MjoKICAgICAgcmV0dXJuIHNldFZhbHVlVDJEQXJyYXlBcnJheTsKICB9Cn0KCmNsYXNzIFNpbmdsZVVuaWZvcm0gewogIGNvbnN0cnVjdG9yKGlkLCBhY3RpdmVJbmZvLCBhZGRyKSB7CiAgICB0aGlzLmlkID0gaWQ7CiAgICB0aGlzLmFkZHIgPSBhZGRyOwogICAgdGhpcy5jYWNoZSA9IFtdOwogICAgdGhpcy50eXBlID0gYWN0aXZlSW5mby50eXBlOwogICAgdGhpcy5zZXRWYWx1ZSA9IGdldFNpbmd1bGFyU2V0dGVyKGFjdGl2ZUluZm8udHlwZSk7CiAgfQp9CgpjbGFzcyBQdXJlQXJyYXlVbmlmb3JtIHsKICBjb25zdHJ1Y3RvcihpZCwgYWN0aXZlSW5mbywgYWRkcikgewogICAgdGhpcy5pZCA9IGlkOwogICAgdGhpcy5hZGRyID0gYWRkcjsKICAgIHRoaXMuY2FjaGUgPSBbXTsKICAgIHRoaXMudHlwZSA9IGFjdGl2ZUluZm8udHlwZTsKICAgIHRoaXMuc2l6ZSA9IGFjdGl2ZUluZm8uc2l6ZTsKICAgIHRoaXMuc2V0VmFsdWUgPSBnZXRQdXJlQXJyYXlTZXR0ZXIoYWN0aXZlSW5mby50eXBlKTsKICB9Cn0KCmNsYXNzIFN0cnVjdHVyZWRVbmlmb3JtIHsKICBjb25zdHJ1Y3RvcihpZCkgewogICAgdGhpcy5pZCA9IGlkOwogICAgdGhpcy5zZXEgPSBbXTsKICAgIHRoaXMubWFwID0ge307CiAgfQogIHNldFZhbHVlKGdsLCB2YWx1ZSwgdGV4dHVyZXMpIHsKICAgIGNvbnN0IHNlcSA9IHRoaXMuc2VxOwogICAgZm9yIChsZXQgaSA9IDAsIG4gPSBzZXEubGVuZ3RoO2kgIT09IG47ICsraSkgewogICAgICBjb25zdCB1ID0gc2VxW2ldOwogICAgICB1LnNldFZhbHVlKGdsLCB2YWx1ZVt1LmlkXSwgdGV4dHVyZXMpOwogICAgfQogIH0KfQpmdW5jdGlvbiBhZGRVbmlmb3JtKGNvbnRhaW5lciwgdW5pZm9ybU9iamVjdCkgewogIGNvbnRhaW5lci5zZXEucHVzaCh1bmlmb3JtT2JqZWN0KTsKICBjb250YWluZXIubWFwW3VuaWZvcm1PYmplY3QuaWRdID0gdW5pZm9ybU9iamVjdDsKfQpmdW5jdGlvbiBwYXJzZVVuaWZvcm0oYWN0aXZlSW5mbywgYWRkciwgY29udGFpbmVyKSB7CiAgY29uc3QgcGF0aCA9IGFjdGl2ZUluZm8ubmFtZSwgcGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoOwogIFJlUGF0aFBhcnQubGFzdEluZGV4ID0gMDsKICB3aGlsZSAodHJ1ZSkgewogICAgY29uc3QgbWF0Y2ggPSBSZVBhdGhQYXJ0LmV4ZWMocGF0aCksIG1hdGNoRW5kID0gUmVQYXRoUGFydC5sYXN0SW5kZXg7CiAgICBsZXQgaWQgPSBtYXRjaFsxXTsKICAgIGNvbnN0IGlkSXNJbmRleCA9IG1hdGNoWzJdID09PSAiXSIsIHN1YnNjcmlwdCA9IG1hdGNoWzNdOwogICAgaWYgKGlkSXNJbmRleCkKICAgICAgaWQgPSBpZCB8IDA7CiAgICBpZiAoc3Vic2NyaXB0ID09PSB1bmRlZmluZWQgfHwgc3Vic2NyaXB0ID09PSAiWyIgJiYgbWF0Y2hFbmQgKyAyID09PSBwYXRoTGVuZ3RoKSB7CiAgICAgIGFkZFVuaWZvcm0oY29udGFpbmVyLCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCA/IG5ldyBTaW5nbGVVbmlmb3JtKGlkLCBhY3RpdmVJbmZvLCBhZGRyKSA6IG5ldyBQdXJlQXJyYXlVbmlmb3JtKGlkLCBhY3RpdmVJbmZvLCBhZGRyKSk7CiAgICAgIGJyZWFrOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgbWFwID0gY29udGFpbmVyLm1hcDsKICAgICAgbGV0IG5leHQgPSBtYXBbaWRdOwogICAgICBpZiAobmV4dCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgbmV4dCA9IG5ldyBTdHJ1Y3R1cmVkVW5pZm9ybShpZCk7CiAgICAgICAgYWRkVW5pZm9ybShjb250YWluZXIsIG5leHQpOwogICAgICB9CiAgICAgIGNvbnRhaW5lciA9IG5leHQ7CiAgICB9CiAgfQp9CgpjbGFzcyBXZWJHTFVuaWZvcm1zIHsKICBjb25zdHJ1Y3RvcihnbCwgcHJvZ3JhbSkgewogICAgdGhpcy5zZXEgPSBbXTsKICAgIHRoaXMubWFwID0ge307CiAgICBjb25zdCBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5BQ1RJVkVfVU5JRk9STVMpOwogICAgZm9yIChsZXQgaSA9IDA7aSA8IG47ICsraSkgewogICAgICBjb25zdCBpbmZvID0gZ2wuZ2V0QWN0aXZlVW5pZm9ybShwcm9ncmFtLCBpKSwgYWRkciA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCBpbmZvLm5hbWUpOwogICAgICBwYXJzZVVuaWZvcm0oaW5mbywgYWRkciwgdGhpcyk7CiAgICB9CiAgfQogIHNldFZhbHVlKGdsLCBuYW1lLCB2YWx1ZSwgdGV4dHVyZXMpIHsKICAgIGNvbnN0IHUgPSB0aGlzLm1hcFtuYW1lXTsKICAgIGlmICh1ICE9PSB1bmRlZmluZWQpCiAgICAgIHUuc2V0VmFsdWUoZ2wsIHZhbHVlLCB0ZXh0dXJlcyk7CiAgfQogIHNldE9wdGlvbmFsKGdsLCBvYmplY3QsIG5hbWUpIHsKICAgIGNvbnN0IHYgPSBvYmplY3RbbmFtZV07CiAgICBpZiAodiAhPT0gdW5kZWZpbmVkKQogICAgICB0aGlzLnNldFZhbHVlKGdsLCBuYW1lLCB2KTsKICB9CiAgc3RhdGljIHVwbG9hZChnbCwgc2VxLCB2YWx1ZXMsIHRleHR1cmVzKSB7CiAgICBmb3IgKGxldCBpID0gMCwgbiA9IHNlcS5sZW5ndGg7aSAhPT0gbjsgKytpKSB7CiAgICAgIGNvbnN0IHUgPSBzZXFbaV0sIHYgPSB2YWx1ZXNbdS5pZF07CiAgICAgIGlmICh2Lm5lZWRzVXBkYXRlICE9PSBmYWxzZSkgewogICAgICAgIHUuc2V0VmFsdWUoZ2wsIHYudmFsdWUsIHRleHR1cmVzKTsKICAgICAgfQogICAgfQogIH0KICBzdGF0aWMgc2VxV2l0aFZhbHVlKHNlcSwgdmFsdWVzKSB7CiAgICBjb25zdCByID0gW107CiAgICBmb3IgKGxldCBpID0gMCwgbiA9IHNlcS5sZW5ndGg7aSAhPT0gbjsgKytpKSB7CiAgICAgIGNvbnN0IHUgPSBzZXFbaV07CiAgICAgIGlmICh1LmlkIGluIHZhbHVlcykKICAgICAgICByLnB1c2godSk7CiAgICB9CiAgICByZXR1cm4gcjsKICB9Cn0KZnVuY3Rpb24gV2ViR0xTaGFkZXIoZ2wsIHR5cGUsIHN0cmluZykgewogIGNvbnN0IHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcih0eXBlKTsKICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzdHJpbmcpOwogIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTsKICByZXR1cm4gc2hhZGVyOwp9CmZ1bmN0aW9uIGhhbmRsZVNvdXJjZShzdHJpbmcsIGVycm9yTGluZSkgewogIGNvbnN0IGxpbmVzID0gc3RyaW5nLnNwbGl0KGAKYCk7CiAgY29uc3QgbGluZXMyID0gW107CiAgY29uc3QgZnJvbSA9IE1hdGgubWF4KGVycm9yTGluZSAtIDYsIDApOwogIGNvbnN0IHRvID0gTWF0aC5taW4oZXJyb3JMaW5lICsgNiwgbGluZXMubGVuZ3RoKTsKICBmb3IgKGxldCBpID0gZnJvbTtpIDwgdG87IGkrKykgewogICAgY29uc3QgbGluZSA9IGkgKyAxOwogICAgbGluZXMyLnB1c2goYCR7bGluZSA9PT0gZXJyb3JMaW5lID8gIj4iIDogIiAifSAke2xpbmV9OiAke2xpbmVzW2ldfWApOwogIH0KICByZXR1cm4gbGluZXMyLmpvaW4oYApgKTsKfQpmdW5jdGlvbiBnZXRFbmNvZGluZ0NvbXBvbmVudHMoY29sb3JTcGFjZSkgewogIENvbG9yTWFuYWdlbWVudC5fZ2V0TWF0cml4KF9tMCwgQ29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlLCBjb2xvclNwYWNlKTsKICBjb25zdCBlbmNvZGluZ01hdHJpeCA9IGBtYXQzKCAke19tMC5lbGVtZW50cy5tYXAoKHYpID0+IHYudG9GaXhlZCg0KSl9IClgOwogIHN3aXRjaCAoQ29sb3JNYW5hZ2VtZW50LmdldFRyYW5zZmVyKGNvbG9yU3BhY2UpKSB7CiAgICBjYXNlIExpbmVhclRyYW5zZmVyOgogICAgICByZXR1cm4gW2VuY29kaW5nTWF0cml4LCAiTGluZWFyVHJhbnNmZXJPRVRGIl07CiAgICBjYXNlIFNSR0JUcmFuc2ZlcjoKICAgICAgcmV0dXJuIFtlbmNvZGluZ01hdHJpeCwgInNSR0JUcmFuc2Zlck9FVEYiXTsKICAgIGRlZmF1bHQ6CiAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtOiBVbnN1cHBvcnRlZCBjb2xvciBzcGFjZTogIiwgY29sb3JTcGFjZSk7CiAgICAgIHJldHVybiBbZW5jb2RpbmdNYXRyaXgsICJMaW5lYXJUcmFuc2Zlck9FVEYiXTsKICB9Cn0KZnVuY3Rpb24gZ2V0U2hhZGVyRXJyb3JzKGdsLCBzaGFkZXIsIHR5cGUpIHsKICBjb25zdCBzdGF0dXMgPSBnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyk7CiAgY29uc3QgZXJyb3JzID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpLnRyaW0oKTsKICBpZiAoc3RhdHVzICYmIGVycm9ycyA9PT0gIiIpCiAgICByZXR1cm4gIiI7CiAgY29uc3QgZXJyb3JNYXRjaGVzID0gL0VSUk9SOiAwOihcZCspLy5leGVjKGVycm9ycyk7CiAgaWYgKGVycm9yTWF0Y2hlcykgewogICAgY29uc3QgZXJyb3JMaW5lID0gcGFyc2VJbnQoZXJyb3JNYXRjaGVzWzFdKTsKICAgIHJldHVybiB0eXBlLnRvVXBwZXJDYXNlKCkgKyBgCgpgICsgZXJyb3JzICsgYAoKYCArIGhhbmRsZVNvdXJjZShnbC5nZXRTaGFkZXJTb3VyY2Uoc2hhZGVyKSwgZXJyb3JMaW5lKTsKICB9IGVsc2UgewogICAgcmV0dXJuIGVycm9yczsKICB9Cn0KZnVuY3Rpb24gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKGZ1bmN0aW9uTmFtZSwgY29sb3JTcGFjZSkgewogIGNvbnN0IGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoY29sb3JTcGFjZSk7CiAgcmV0dXJuIFsKICAgIGB2ZWM0ICR7ZnVuY3Rpb25OYW1lfSggdmVjNCB2YWx1ZSApIHtgLAogICAgYAlyZXR1cm4gJHtjb21wb25lbnRzWzFdfSggdmVjNCggdmFsdWUucmdiICogJHtjb21wb25lbnRzWzBdfSwgdmFsdWUuYSApICk7YCwKICAgICJ9IgogIF0uam9pbihgCmApOwp9CmZ1bmN0aW9uIGdldFRvbmVNYXBwaW5nRnVuY3Rpb24oZnVuY3Rpb25OYW1lLCB0b25lTWFwcGluZykgewogIGxldCB0b25lTWFwcGluZ05hbWU7CiAgc3dpdGNoICh0b25lTWFwcGluZykgewogICAgY2FzZSBMaW5lYXJUb25lTWFwcGluZzoKICAgICAgdG9uZU1hcHBpbmdOYW1lID0gIkxpbmVhciI7CiAgICAgIGJyZWFrOwogICAgY2FzZSBSZWluaGFyZFRvbmVNYXBwaW5nOgogICAgICB0b25lTWFwcGluZ05hbWUgPSAiUmVpbmhhcmQiOwogICAgICBicmVhazsKICAgIGNhc2UgQ2luZW9uVG9uZU1hcHBpbmc6CiAgICAgIHRvbmVNYXBwaW5nTmFtZSA9ICJDaW5lb24iOwogICAgICBicmVhazsKICAgIGNhc2UgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nOgogICAgICB0b25lTWFwcGluZ05hbWUgPSAiQUNFU0ZpbG1pYyI7CiAgICAgIGJyZWFrOwogICAgY2FzZSBBZ1hUb25lTWFwcGluZzoKICAgICAgdG9uZU1hcHBpbmdOYW1lID0gIkFnWCI7CiAgICAgIGJyZWFrOwogICAgY2FzZSBOZXV0cmFsVG9uZU1hcHBpbmc6CiAgICAgIHRvbmVNYXBwaW5nTmFtZSA9ICJOZXV0cmFsIjsKICAgICAgYnJlYWs7CiAgICBjYXNlIEN1c3RvbVRvbmVNYXBwaW5nOgogICAgICB0b25lTWFwcGluZ05hbWUgPSAiQ3VzdG9tIjsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbTogVW5zdXBwb3J0ZWQgdG9uZU1hcHBpbmc6IiwgdG9uZU1hcHBpbmcpOwogICAgICB0b25lTWFwcGluZ05hbWUgPSAiTGluZWFyIjsKICB9CiAgcmV0dXJuICJ2ZWMzICIgKyBmdW5jdGlvbk5hbWUgKyAiKCB2ZWMzIGNvbG9yICkgeyByZXR1cm4gIiArIHRvbmVNYXBwaW5nTmFtZSArICJUb25lTWFwcGluZyggY29sb3IgKTsgfSI7Cn0KZnVuY3Rpb24gZ2V0THVtaW5hbmNlRnVuY3Rpb24oKSB7CiAgQ29sb3JNYW5hZ2VtZW50LmdldEx1bWluYW5jZUNvZWZmaWNpZW50cyhfdjAyKTsKICBjb25zdCByID0gX3YwMi54LnRvRml4ZWQoNCk7CiAgY29uc3QgZyA9IF92MDIueS50b0ZpeGVkKDQpOwogIGNvbnN0IGIgPSBfdjAyLnoudG9GaXhlZCg0KTsKICByZXR1cm4gWwogICAgImZsb2F0IGx1bWluYW5jZSggY29uc3QgaW4gdmVjMyByZ2IgKSB7IiwKICAgIGAJY29uc3QgdmVjMyB3ZWlnaHRzID0gdmVjMyggJHtyfSwgJHtnfSwgJHtifSApO2AsCiAgICAiXHRyZXR1cm4gZG90KCB3ZWlnaHRzLCByZ2IgKTsiLAogICAgIn0iCiAgXS5qb2luKGAKYCk7Cn0KZnVuY3Rpb24gZ2VuZXJhdGVWZXJ0ZXhFeHRlbnNpb25zKHBhcmFtZXRlcnMpIHsKICBjb25zdCBjaHVua3MgPSBbCiAgICBwYXJhbWV0ZXJzLmV4dGVuc2lvbkNsaXBDdWxsRGlzdGFuY2UgPyAiI2V4dGVuc2lvbiBHTF9BTkdMRV9jbGlwX2N1bGxfZGlzdGFuY2UgOiByZXF1aXJlIiA6ICIiLAogICAgcGFyYW1ldGVycy5leHRlbnNpb25NdWx0aURyYXcgPyAiI2V4dGVuc2lvbiBHTF9BTkdMRV9tdWx0aV9kcmF3IDogcmVxdWlyZSIgOiAiIgogIF07CiAgcmV0dXJuIGNodW5rcy5maWx0ZXIoZmlsdGVyRW1wdHlMaW5lKS5qb2luKGAKYCk7Cn0KZnVuY3Rpb24gZ2VuZXJhdGVEZWZpbmVzKGRlZmluZXMpIHsKICBjb25zdCBjaHVua3MgPSBbXTsKICBmb3IgKGNvbnN0IG5hbWUgaW4gZGVmaW5lcykgewogICAgY29uc3QgdmFsdWUgPSBkZWZpbmVzW25hbWVdOwogICAgaWYgKHZhbHVlID09PSBmYWxzZSkKICAgICAgY29udGludWU7CiAgICBjaHVua3MucHVzaCgiI2RlZmluZSAiICsgbmFtZSArICIgIiArIHZhbHVlKTsKICB9CiAgcmV0dXJuIGNodW5rcy5qb2luKGAKYCk7Cn0KZnVuY3Rpb24gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoZ2wsIHByb2dyYW0pIHsKICBjb25zdCBhdHRyaWJ1dGVzID0ge307CiAgY29uc3QgbiA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuQUNUSVZFX0FUVFJJQlVURVMpOwogIGZvciAobGV0IGkgPSAwO2kgPCBuOyBpKyspIHsKICAgIGNvbnN0IGluZm8gPSBnbC5nZXRBY3RpdmVBdHRyaWIocHJvZ3JhbSwgaSk7CiAgICBjb25zdCBuYW1lID0gaW5mby5uYW1lOwogICAgbGV0IGxvY2F0aW9uU2l6ZSA9IDE7CiAgICBpZiAoaW5mby50eXBlID09PSBnbC5GTE9BVF9NQVQyKQogICAgICBsb2NhdGlvblNpemUgPSAyOwogICAgaWYgKGluZm8udHlwZSA9PT0gZ2wuRkxPQVRfTUFUMykKICAgICAgbG9jYXRpb25TaXplID0gMzsKICAgIGlmIChpbmZvLnR5cGUgPT09IGdsLkZMT0FUX01BVDQpCiAgICAgIGxvY2F0aW9uU2l6ZSA9IDQ7CiAgICBhdHRyaWJ1dGVzW25hbWVdID0gewogICAgICB0eXBlOiBpbmZvLnR5cGUsCiAgICAgIGxvY2F0aW9uOiBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBuYW1lKSwKICAgICAgbG9jYXRpb25TaXplCiAgICB9OwogIH0KICByZXR1cm4gYXR0cmlidXRlczsKfQpmdW5jdGlvbiBmaWx0ZXJFbXB0eUxpbmUoc3RyaW5nKSB7CiAgcmV0dXJuIHN0cmluZyAhPT0gIiI7Cn0KZnVuY3Rpb24gcmVwbGFjZUxpZ2h0TnVtcyhzdHJpbmcsIHBhcmFtZXRlcnMpIHsKICBjb25zdCBudW1TcG90TGlnaHRDb29yZHMgPSBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodFNoYWRvd3MgKyBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodE1hcHMgLSBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwczsKICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL05VTV9ESVJfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtRGlyTGlnaHRzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1TcG90TGlnaHRzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9NQVBTL2csIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0TWFwcykucmVwbGFjZSgvTlVNX1NQT1RfTElHSFRfQ09PUkRTL2csIG51bVNwb3RMaWdodENvb3JkcykucmVwbGFjZSgvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1SZWN0QXJlYUxpZ2h0cykucmVwbGFjZSgvTlVNX1BPSU5UX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVBvaW50TGlnaHRzKS5yZXBsYWNlKC9OVU1fSEVNSV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1IZW1pTGlnaHRzKS5yZXBsYWNlKC9OVU1fRElSX0xJR0hUX1NIQURPV1MvZywgcGFyYW1ldGVycy5udW1EaXJMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX1NIQURPV1NfV0lUSF9NQVBTL2csIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9TSEFET1dTL2csIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0U2hhZG93cykucmVwbGFjZSgvTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MvZywgcGFyYW1ldGVycy5udW1Qb2ludExpZ2h0U2hhZG93cyk7Cn0KZnVuY3Rpb24gcmVwbGFjZUNsaXBwaW5nUGxhbmVOdW1zKHN0cmluZywgcGFyYW1ldGVycykgewogIHJldHVybiBzdHJpbmcucmVwbGFjZSgvTlVNX0NMSVBQSU5HX1BMQU5FUy9nLCBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzKS5yZXBsYWNlKC9VTklPTl9DTElQUElOR19QTEFORVMvZywgcGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcyAtIHBhcmFtZXRlcnMubnVtQ2xpcEludGVyc2VjdGlvbik7Cn0KZnVuY3Rpb24gcmVzb2x2ZUluY2x1ZGVzKHN0cmluZykgewogIHJldHVybiBzdHJpbmcucmVwbGFjZShpbmNsdWRlUGF0dGVybiwgaW5jbHVkZVJlcGxhY2VyKTsKfQpmdW5jdGlvbiBpbmNsdWRlUmVwbGFjZXIobWF0Y2gsIGluY2x1ZGUpIHsKICBsZXQgc3RyaW5nID0gU2hhZGVyQ2h1bmtbaW5jbHVkZV07CiAgaWYgKHN0cmluZyA9PT0gdW5kZWZpbmVkKSB7CiAgICBjb25zdCBuZXdJbmNsdWRlID0gc2hhZGVyQ2h1bmtNYXAuZ2V0KGluY2x1ZGUpOwogICAgaWYgKG5ld0luY2x1ZGUgIT09IHVuZGVmaW5lZCkgewogICAgICBzdHJpbmcgPSBTaGFkZXJDaHVua1tuZXdJbmNsdWRlXTsKICAgICAgY29uc29sZS53YXJuKCdUSFJFRS5XZWJHTFJlbmRlcmVyOiBTaGFkZXIgY2h1bmsgIiVzIiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgIiVzIiBpbnN0ZWFkLicsIGluY2x1ZGUsIG5ld0luY2x1ZGUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW4gbm90IHJlc29sdmUgI2luY2x1ZGUgPCIgKyBpbmNsdWRlICsgIj4iKTsKICAgIH0KICB9CiAgcmV0dXJuIHJlc29sdmVJbmNsdWRlcyhzdHJpbmcpOwp9CmZ1bmN0aW9uIHVucm9sbExvb3BzKHN0cmluZykgewogIHJldHVybiBzdHJpbmcucmVwbGFjZSh1bnJvbGxMb29wUGF0dGVybiwgbG9vcFJlcGxhY2VyKTsKfQpmdW5jdGlvbiBsb29wUmVwbGFjZXIobWF0Y2gsIHN0YXJ0LCBlbmQsIHNuaXBwZXQpIHsKICBsZXQgc3RyaW5nID0gIiI7CiAgZm9yIChsZXQgaSA9IHBhcnNlSW50KHN0YXJ0KTtpIDwgcGFyc2VJbnQoZW5kKTsgaSsrKSB7CiAgICBzdHJpbmcgKz0gc25pcHBldC5yZXBsYWNlKC9cW1xzKmlccypcXS9nLCAiWyAiICsgaSArICIgXSIpLnJlcGxhY2UoL1VOUk9MTEVEX0xPT1BfSU5ERVgvZywgaSk7CiAgfQogIHJldHVybiBzdHJpbmc7Cn0KZnVuY3Rpb24gZ2VuZXJhdGVQcmVjaXNpb24ocGFyYW1ldGVycykgewogIGxldCBwcmVjaXNpb25zdHJpbmcgPSBgcHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IGZsb2F0OwoJcHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IGludDsKCXByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSBzYW1wbGVyMkQ7CglwcmVjaXNpb24gJHtwYXJhbWV0ZXJzLnByZWNpc2lvbn0gc2FtcGxlckN1YmU7CglwcmVjaXNpb24gJHtwYXJhbWV0ZXJzLnByZWNpc2lvbn0gc2FtcGxlcjNEOwoJcHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IHNhbXBsZXIyREFycmF5OwoJcHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IHNhbXBsZXIyRFNoYWRvdzsKCXByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSBzYW1wbGVyQ3ViZVNoYWRvdzsKCXByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSBzYW1wbGVyMkRBcnJheVNoYWRvdzsKCXByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSBpc2FtcGxlcjJEOwoJcHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IGlzYW1wbGVyM0Q7CglwcmVjaXNpb24gJHtwYXJhbWV0ZXJzLnByZWNpc2lvbn0gaXNhbXBsZXJDdWJlOwoJcHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IGlzYW1wbGVyMkRBcnJheTsKCXByZWNpc2lvbiAke3BhcmFtZXRlcnMucHJlY2lzaW9ufSB1c2FtcGxlcjJEOwoJcHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IHVzYW1wbGVyM0Q7CglwcmVjaXNpb24gJHtwYXJhbWV0ZXJzLnByZWNpc2lvbn0gdXNhbXBsZXJDdWJlOwoJcHJlY2lzaW9uICR7cGFyYW1ldGVycy5wcmVjaXNpb259IHVzYW1wbGVyMkRBcnJheTsKCWA7CiAgaWYgKHBhcmFtZXRlcnMucHJlY2lzaW9uID09PSAiaGlnaHAiKSB7CiAgICBwcmVjaXNpb25zdHJpbmcgKz0gYAojZGVmaW5lIEhJR0hfUFJFQ0lTSU9OYDsKICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMucHJlY2lzaW9uID09PSAibWVkaXVtcCIpIHsKICAgIHByZWNpc2lvbnN0cmluZyArPSBgCiNkZWZpbmUgTUVESVVNX1BSRUNJU0lPTmA7CiAgfSBlbHNlIGlmIChwYXJhbWV0ZXJzLnByZWNpc2lvbiA9PT0gImxvd3AiKSB7CiAgICBwcmVjaXNpb25zdHJpbmcgKz0gYAojZGVmaW5lIExPV19QUkVDSVNJT05gOwogIH0KICByZXR1cm4gcHJlY2lzaW9uc3RyaW5nOwp9CmZ1bmN0aW9uIGdlbmVyYXRlU2hhZG93TWFwVHlwZURlZmluZShwYXJhbWV0ZXJzKSB7CiAgbGV0IHNoYWRvd01hcFR5cGVEZWZpbmUgPSAiU0hBRE9XTUFQX1RZUEVfQkFTSUMiOwogIGlmIChwYXJhbWV0ZXJzLnNoYWRvd01hcFR5cGUgPT09IFBDRlNoYWRvd01hcCkgewogICAgc2hhZG93TWFwVHlwZURlZmluZSA9ICJTSEFET1dNQVBfVFlQRV9QQ0YiOwogIH0gZWxzZSBpZiAocGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTb2Z0U2hhZG93TWFwKSB7CiAgICBzaGFkb3dNYXBUeXBlRGVmaW5lID0gIlNIQURPV01BUF9UWVBFX1BDRl9TT0ZUIjsKICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMuc2hhZG93TWFwVHlwZSA9PT0gVlNNU2hhZG93TWFwKSB7CiAgICBzaGFkb3dNYXBUeXBlRGVmaW5lID0gIlNIQURPV01BUF9UWVBFX1ZTTSI7CiAgfQogIHJldHVybiBzaGFkb3dNYXBUeXBlRGVmaW5lOwp9CmZ1bmN0aW9uIGdlbmVyYXRlRW52TWFwVHlwZURlZmluZShwYXJhbWV0ZXJzKSB7CiAgbGV0IGVudk1hcFR5cGVEZWZpbmUgPSAiRU5WTUFQX1RZUEVfQ1VCRSI7CiAgaWYgKHBhcmFtZXRlcnMuZW52TWFwKSB7CiAgICBzd2l0Y2ggKHBhcmFtZXRlcnMuZW52TWFwTW9kZSkgewogICAgICBjYXNlIEN1YmVSZWZsZWN0aW9uTWFwcGluZzoKICAgICAgY2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6CiAgICAgICAgZW52TWFwVHlwZURlZmluZSA9ICJFTlZNQVBfVFlQRV9DVUJFIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzoKICAgICAgICBlbnZNYXBUeXBlRGVmaW5lID0gIkVOVk1BUF9UWVBFX0NVQkVfVVYiOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KICByZXR1cm4gZW52TWFwVHlwZURlZmluZTsKfQpmdW5jdGlvbiBnZW5lcmF0ZUVudk1hcE1vZGVEZWZpbmUocGFyYW1ldGVycykgewogIGxldCBlbnZNYXBNb2RlRGVmaW5lID0gIkVOVk1BUF9NT0RFX1JFRkxFQ1RJT04iOwogIGlmIChwYXJhbWV0ZXJzLmVudk1hcCkgewogICAgc3dpdGNoIChwYXJhbWV0ZXJzLmVudk1hcE1vZGUpIHsKICAgICAgY2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6CiAgICAgICAgZW52TWFwTW9kZURlZmluZSA9ICJFTlZNQVBfTU9ERV9SRUZSQUNUSU9OIjsKICAgICAgICBicmVhazsKICAgIH0KICB9CiAgcmV0dXJuIGVudk1hcE1vZGVEZWZpbmU7Cn0KZnVuY3Rpb24gZ2VuZXJhdGVFbnZNYXBCbGVuZGluZ0RlZmluZShwYXJhbWV0ZXJzKSB7CiAgbGV0IGVudk1hcEJsZW5kaW5nRGVmaW5lID0gIkVOVk1BUF9CTEVORElOR19OT05FIjsKICBpZiAocGFyYW1ldGVycy5lbnZNYXApIHsKICAgIHN3aXRjaCAocGFyYW1ldGVycy5jb21iaW5lKSB7CiAgICAgIGNhc2UgTXVsdGlwbHlPcGVyYXRpb246CiAgICAgICAgZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAiRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBNaXhPcGVyYXRpb246CiAgICAgICAgZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAiRU5WTUFQX0JMRU5ESU5HX01JWCI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQWRkT3BlcmF0aW9uOgogICAgICAgIGVudk1hcEJsZW5kaW5nRGVmaW5lID0gIkVOVk1BUF9CTEVORElOR19BREQiOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KICByZXR1cm4gZW52TWFwQmxlbmRpbmdEZWZpbmU7Cn0KZnVuY3Rpb24gZ2VuZXJhdGVDdWJlVVZTaXplKHBhcmFtZXRlcnMpIHsKICBjb25zdCBpbWFnZUhlaWdodCA9IHBhcmFtZXRlcnMuZW52TWFwQ3ViZVVWSGVpZ2h0OwogIGlmIChpbWFnZUhlaWdodCA9PT0gbnVsbCkKICAgIHJldHVybiBudWxsOwogIGNvbnN0IG1heE1pcCA9IE1hdGgubG9nMihpbWFnZUhlaWdodCkgLSAyOwogIGNvbnN0IHRleGVsSGVpZ2h0ID0gMSAvIGltYWdlSGVpZ2h0OwogIGNvbnN0IHRleGVsV2lkdGggPSAxIC8gKDMgKiBNYXRoLm1heChNYXRoLnBvdygyLCBtYXhNaXApLCA3ICogMTYpKTsKICByZXR1cm4geyB0ZXhlbFdpZHRoLCB0ZXhlbEhlaWdodCwgbWF4TWlwIH07Cn0KZnVuY3Rpb24gV2ViR0xQcm9ncmFtKHJlbmRlcmVyLCBjYWNoZUtleSwgcGFyYW1ldGVycywgYmluZGluZ1N0YXRlcykgewogIGNvbnN0IGdsID0gcmVuZGVyZXIuZ2V0Q29udGV4dCgpOwogIGNvbnN0IGRlZmluZXMgPSBwYXJhbWV0ZXJzLmRlZmluZXM7CiAgbGV0IHZlcnRleFNoYWRlciA9IHBhcmFtZXRlcnMudmVydGV4U2hhZGVyOwogIGxldCBmcmFnbWVudFNoYWRlciA9IHBhcmFtZXRlcnMuZnJhZ21lbnRTaGFkZXI7CiAgY29uc3Qgc2hhZG93TWFwVHlwZURlZmluZSA9IGdlbmVyYXRlU2hhZG93TWFwVHlwZURlZmluZShwYXJhbWV0ZXJzKTsKICBjb25zdCBlbnZNYXBUeXBlRGVmaW5lID0gZ2VuZXJhdGVFbnZNYXBUeXBlRGVmaW5lKHBhcmFtZXRlcnMpOwogIGNvbnN0IGVudk1hcE1vZGVEZWZpbmUgPSBnZW5lcmF0ZUVudk1hcE1vZGVEZWZpbmUocGFyYW1ldGVycyk7CiAgY29uc3QgZW52TWFwQmxlbmRpbmdEZWZpbmUgPSBnZW5lcmF0ZUVudk1hcEJsZW5kaW5nRGVmaW5lKHBhcmFtZXRlcnMpOwogIGNvbnN0IGVudk1hcEN1YmVVVlNpemUgPSBnZW5lcmF0ZUN1YmVVVlNpemUocGFyYW1ldGVycyk7CiAgY29uc3QgY3VzdG9tVmVydGV4RXh0ZW5zaW9ucyA9IGdlbmVyYXRlVmVydGV4RXh0ZW5zaW9ucyhwYXJhbWV0ZXJzKTsKICBjb25zdCBjdXN0b21EZWZpbmVzID0gZ2VuZXJhdGVEZWZpbmVzKGRlZmluZXMpOwogIGNvbnN0IHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7CiAgbGV0IHByZWZpeFZlcnRleCwgcHJlZml4RnJhZ21lbnQ7CiAgbGV0IHZlcnNpb25TdHJpbmcgPSBwYXJhbWV0ZXJzLmdsc2xWZXJzaW9uID8gIiN2ZXJzaW9uICIgKyBwYXJhbWV0ZXJzLmdsc2xWZXJzaW9uICsgYApgIDogIiI7CiAgY29uc3QgbnVtTXVsdGl2aWV3Vmlld3MgPSBwYXJhbWV0ZXJzLm51bU11bHRpdmlld1ZpZXdzOwogIGlmIChwYXJhbWV0ZXJzLmlzUmF3U2hhZGVyTWF0ZXJpYWwpIHsKICAgIHByZWZpeFZlcnRleCA9IFsKICAgICAgIiNkZWZpbmUgU0hBREVSX1RZUEUgIiArIHBhcmFtZXRlcnMuc2hhZGVyVHlwZSwKICAgICAgIiNkZWZpbmUgU0hBREVSX05BTUUgIiArIHBhcmFtZXRlcnMuc2hhZGVyTmFtZSwKICAgICAgY3VzdG9tRGVmaW5lcwogICAgXS5maWx0ZXIoZmlsdGVyRW1wdHlMaW5lKS5qb2luKGAKYCk7CiAgICBpZiAocHJlZml4VmVydGV4Lmxlbmd0aCA+IDApIHsKICAgICAgcHJlZml4VmVydGV4ICs9IGAKYDsKICAgIH0KICAgIHByZWZpeEZyYWdtZW50ID0gWwogICAgICAiI2RlZmluZSBTSEFERVJfVFlQRSAiICsgcGFyYW1ldGVycy5zaGFkZXJUeXBlLAogICAgICAiI2RlZmluZSBTSEFERVJfTkFNRSAiICsgcGFyYW1ldGVycy5zaGFkZXJOYW1lLAogICAgICBjdXN0b21EZWZpbmVzCiAgICBdLmZpbHRlcihmaWx0ZXJFbXB0eUxpbmUpLmpvaW4oYApgKTsKICAgIGlmIChwcmVmaXhGcmFnbWVudC5sZW5ndGggPiAwKSB7CiAgICAgIHByZWZpeEZyYWdtZW50ICs9IGAKYDsKICAgIH0KICB9IGVsc2UgewogICAgcHJlZml4VmVydGV4ID0gWwogICAgICBnZW5lcmF0ZVByZWNpc2lvbihwYXJhbWV0ZXJzKSwKICAgICAgIiNkZWZpbmUgU0hBREVSX1RZUEUgIiArIHBhcmFtZXRlcnMuc2hhZGVyVHlwZSwKICAgICAgIiNkZWZpbmUgU0hBREVSX05BTUUgIiArIHBhcmFtZXRlcnMuc2hhZGVyTmFtZSwKICAgICAgY3VzdG9tRGVmaW5lcywKICAgICAgcGFyYW1ldGVycy5leHRlbnNpb25DbGlwQ3VsbERpc3RhbmNlID8gIiNkZWZpbmUgVVNFX0NMSVBfRElTVEFOQ0UiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuYmF0Y2hpbmcgPyAiI2RlZmluZSBVU0VfQkFUQ0hJTkciIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuYmF0Y2hpbmdDb2xvciA/ICIjZGVmaW5lIFVTRV9CQVRDSElOR19DT0xPUiIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5pbnN0YW5jaW5nID8gIiNkZWZpbmUgVVNFX0lOU1RBTkNJTkciIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuaW5zdGFuY2luZ0NvbG9yID8gIiNkZWZpbmUgVVNFX0lOU1RBTkNJTkdfQ09MT1IiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuaW5zdGFuY2luZ01vcnBoID8gIiNkZWZpbmUgVVNFX0lOU1RBTkNJTkdfTU9SUEgiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nID8gIiNkZWZpbmUgVVNFX0ZPRyIgOiAiIiwKICAgICAgcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2dFeHAyID8gIiNkZWZpbmUgRk9HX0VYUDIiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMubWFwID8gIiNkZWZpbmUgVVNFX01BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5lbnZNYXAgPyAiI2RlZmluZSBVU0VfRU5WTUFQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmVudk1hcCA/ICIjZGVmaW5lICIgKyBlbnZNYXBNb2RlRGVmaW5lIDogIiIsCiAgICAgIHBhcmFtZXRlcnMubGlnaHRNYXAgPyAiI2RlZmluZSBVU0VfTElHSFRNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuYW9NYXAgPyAiI2RlZmluZSBVU0VfQU9NQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuYnVtcE1hcCA/ICIjZGVmaW5lIFVTRV9CVU1QTUFQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMubm9ybWFsTWFwT2JqZWN0U3BhY2UgPyAiI2RlZmluZSBVU0VfTk9STUFMTUFQX09CSkVDVFNQQUNFIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLm5vcm1hbE1hcFRhbmdlbnRTcGFjZSA/ICIjZGVmaW5lIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmRpc3BsYWNlbWVudE1hcCA/ICIjZGVmaW5lIFVTRV9ESVNQTEFDRU1FTlRNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuZW1pc3NpdmVNYXAgPyAiI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuYW5pc290cm9weSA/ICIjZGVmaW5lIFVTRV9BTklTT1RST1BZIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmFuaXNvdHJvcHlNYXAgPyAiI2RlZmluZSBVU0VfQU5JU09UUk9QWU1BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5jbGVhcmNvYXRNYXAgPyAiI2RlZmluZSBVU0VfQ0xFQVJDT0FUTUFQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmNsZWFyY29hdFJvdWdobmVzc01hcCA/ICIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmNsZWFyY29hdE5vcm1hbE1hcCA/ICIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmlyaWRlc2NlbmNlTWFwID8gIiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFTUFQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwID8gIiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5zcGVjdWxhck1hcCA/ICIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5zcGVjdWxhckNvbG9yTWFwID8gIiNkZWZpbmUgVVNFX1NQRUNVTEFSX0NPTE9STUFQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnNwZWN1bGFySW50ZW5zaXR5TWFwID8gIiNkZWZpbmUgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5yb3VnaG5lc3NNYXAgPyAiI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICIjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuYWxwaGFNYXAgPyAiI2RlZmluZSBVU0VfQUxQSEFNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuYWxwaGFIYXNoID8gIiNkZWZpbmUgVVNFX0FMUEhBSEFTSCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy50cmFuc21pc3Npb24gPyAiI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnRyYW5zbWlzc2lvbk1hcCA/ICIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT05NQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMudGhpY2tuZXNzTWFwID8gIiNkZWZpbmUgVVNFX1RISUNLTkVTU01BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5zaGVlbkNvbG9yTWFwID8gIiNkZWZpbmUgVVNFX1NIRUVOX0NPTE9STUFQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnNoZWVuUm91Z2huZXNzTWFwID8gIiNkZWZpbmUgVVNFX1NIRUVOX1JPVUdITkVTU01BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5tYXBVdiA/ICIjZGVmaW5lIE1BUF9VViAiICsgcGFyYW1ldGVycy5tYXBVdiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmFscGhhTWFwVXYgPyAiI2RlZmluZSBBTFBIQU1BUF9VViAiICsgcGFyYW1ldGVycy5hbHBoYU1hcFV2IDogIiIsCiAgICAgIHBhcmFtZXRlcnMubGlnaHRNYXBVdiA/ICIjZGVmaW5lIExJR0hUTUFQX1VWICIgKyBwYXJhbWV0ZXJzLmxpZ2h0TWFwVXYgOiAiIiwKICAgICAgcGFyYW1ldGVycy5hb01hcFV2ID8gIiNkZWZpbmUgQU9NQVBfVVYgIiArIHBhcmFtZXRlcnMuYW9NYXBVdiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwVXYgPyAiI2RlZmluZSBFTUlTU0lWRU1BUF9VViAiICsgcGFyYW1ldGVycy5lbWlzc2l2ZU1hcFV2IDogIiIsCiAgICAgIHBhcmFtZXRlcnMuYnVtcE1hcFV2ID8gIiNkZWZpbmUgQlVNUE1BUF9VViAiICsgcGFyYW1ldGVycy5idW1wTWFwVXYgOiAiIiwKICAgICAgcGFyYW1ldGVycy5ub3JtYWxNYXBVdiA/ICIjZGVmaW5lIE5PUk1BTE1BUF9VViAiICsgcGFyYW1ldGVycy5ub3JtYWxNYXBVdiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmRpc3BsYWNlbWVudE1hcFV2ID8gIiNkZWZpbmUgRElTUExBQ0VNRU5UTUFQX1VWICIgKyBwYXJhbWV0ZXJzLmRpc3BsYWNlbWVudE1hcFV2IDogIiIsCiAgICAgIHBhcmFtZXRlcnMubWV0YWxuZXNzTWFwVXYgPyAiI2RlZmluZSBNRVRBTE5FU1NNQVBfVVYgIiArIHBhcmFtZXRlcnMubWV0YWxuZXNzTWFwVXYgOiAiIiwKICAgICAgcGFyYW1ldGVycy5yb3VnaG5lc3NNYXBVdiA/ICIjZGVmaW5lIFJPVUdITkVTU01BUF9VViAiICsgcGFyYW1ldGVycy5yb3VnaG5lc3NNYXBVdiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmFuaXNvdHJvcHlNYXBVdiA/ICIjZGVmaW5lIEFOSVNPVFJPUFlNQVBfVVYgIiArIHBhcmFtZXRlcnMuYW5pc290cm9weU1hcFV2IDogIiIsCiAgICAgIHBhcmFtZXRlcnMuY2xlYXJjb2F0TWFwVXYgPyAiI2RlZmluZSBDTEVBUkNPQVRNQVBfVVYgIiArIHBhcmFtZXRlcnMuY2xlYXJjb2F0TWFwVXYgOiAiIiwKICAgICAgcGFyYW1ldGVycy5jbGVhcmNvYXROb3JtYWxNYXBVdiA/ICIjZGVmaW5lIENMRUFSQ09BVF9OT1JNQUxNQVBfVVYgIiArIHBhcmFtZXRlcnMuY2xlYXJjb2F0Tm9ybWFsTWFwVXYgOiAiIiwKICAgICAgcGFyYW1ldGVycy5jbGVhcmNvYXRSb3VnaG5lc3NNYXBVdiA/ICIjZGVmaW5lIENMRUFSQ09BVF9ST1VHSE5FU1NNQVBfVVYgIiArIHBhcmFtZXRlcnMuY2xlYXJjb2F0Um91Z2huZXNzTWFwVXYgOiAiIiwKICAgICAgcGFyYW1ldGVycy5pcmlkZXNjZW5jZU1hcFV2ID8gIiNkZWZpbmUgSVJJREVTQ0VOQ0VNQVBfVVYgIiArIHBhcmFtZXRlcnMuaXJpZGVzY2VuY2VNYXBVdiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXYgPyAiI2RlZmluZSBJUklERVNDRU5DRV9USElDS05FU1NNQVBfVVYgIiArIHBhcmFtZXRlcnMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnNoZWVuQ29sb3JNYXBVdiA/ICIjZGVmaW5lIFNIRUVOX0NPTE9STUFQX1VWICIgKyBwYXJhbWV0ZXJzLnNoZWVuQ29sb3JNYXBVdiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnNoZWVuUm91Z2huZXNzTWFwVXYgPyAiI2RlZmluZSBTSEVFTl9ST1VHSE5FU1NNQVBfVVYgIiArIHBhcmFtZXRlcnMuc2hlZW5Sb3VnaG5lc3NNYXBVdiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnNwZWN1bGFyTWFwVXYgPyAiI2RlZmluZSBTUEVDVUxBUk1BUF9VViAiICsgcGFyYW1ldGVycy5zcGVjdWxhck1hcFV2IDogIiIsCiAgICAgIHBhcmFtZXRlcnMuc3BlY3VsYXJDb2xvck1hcFV2ID8gIiNkZWZpbmUgU1BFQ1VMQVJfQ09MT1JNQVBfVVYgIiArIHBhcmFtZXRlcnMuc3BlY3VsYXJDb2xvck1hcFV2IDogIiIsCiAgICAgIHBhcmFtZXRlcnMuc3BlY3VsYXJJbnRlbnNpdHlNYXBVdiA/ICIjZGVmaW5lIFNQRUNVTEFSX0lOVEVOU0lUWU1BUF9VViAiICsgcGFyYW1ldGVycy5zcGVjdWxhckludGVuc2l0eU1hcFV2IDogIiIsCiAgICAgIHBhcmFtZXRlcnMudHJhbnNtaXNzaW9uTWFwVXYgPyAiI2RlZmluZSBUUkFOU01JU1NJT05NQVBfVVYgIiArIHBhcmFtZXRlcnMudHJhbnNtaXNzaW9uTWFwVXYgOiAiIiwKICAgICAgcGFyYW1ldGVycy50aGlja25lc3NNYXBVdiA/ICIjZGVmaW5lIFRISUNLTkVTU01BUF9VViAiICsgcGFyYW1ldGVycy50aGlja25lc3NNYXBVdiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnZlcnRleFRhbmdlbnRzICYmIHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPT09IGZhbHNlID8gIiNkZWZpbmUgVVNFX1RBTkdFTlQiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMudmVydGV4Q29sb3JzID8gIiNkZWZpbmUgVVNFX0NPTE9SIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnZlcnRleEFscGhhcyA/ICIjZGVmaW5lIFVTRV9DT0xPUl9BTFBIQSIgOiAiIiwKICAgICAgcGFyYW1ldGVycy52ZXJ0ZXhVdjFzID8gIiNkZWZpbmUgVVNFX1VWMSIgOiAiIiwKICAgICAgcGFyYW1ldGVycy52ZXJ0ZXhVdjJzID8gIiNkZWZpbmUgVVNFX1VWMiIgOiAiIiwKICAgICAgcGFyYW1ldGVycy52ZXJ0ZXhVdjNzID8gIiNkZWZpbmUgVVNFX1VWMyIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5wb2ludHNVdnMgPyAiI2RlZmluZSBVU0VfUE9JTlRTX1VWIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nID8gIiNkZWZpbmUgRkxBVF9TSEFERUQiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuc2tpbm5pbmcgPyAiI2RlZmluZSBVU0VfU0tJTk5JTkciIDogIiIsCiAgICAgIHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzID8gIiNkZWZpbmUgVVNFX01PUlBIVEFSR0VUUyIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5tb3JwaE5vcm1hbHMgJiYgcGFyYW1ldGVycy5mbGF0U2hhZGluZyA9PT0gZmFsc2UgPyAiI2RlZmluZSBVU0VfTU9SUEhOT1JNQUxTIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLm1vcnBoQ29sb3JzID8gIiNkZWZpbmUgVVNFX01PUlBIQ09MT1JTIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0c0NvdW50ID4gMCA/ICIjZGVmaW5lIE1PUlBIVEFSR0VUU19URVhUVVJFX1NUUklERSAiICsgcGFyYW1ldGVycy5tb3JwaFRleHR1cmVTdHJpZGUgOiAiIiwKICAgICAgcGFyYW1ldGVycy5tb3JwaFRhcmdldHNDb3VudCA+IDAgPyAiI2RlZmluZSBNT1JQSFRBUkdFVFNfQ09VTlQgIiArIHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzQ291bnQgOiAiIiwKICAgICAgcGFyYW1ldGVycy5kb3VibGVTaWRlZCA/ICIjZGVmaW5lIERPVUJMRV9TSURFRCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5mbGlwU2lkZWQgPyAiI2RlZmluZSBGTElQX1NJREVEIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAiI2RlZmluZSBVU0VfU0hBRE9XTUFQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAiI2RlZmluZSAiICsgc2hhZG93TWFwVHlwZURlZmluZSA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnNpemVBdHRlbnVhdGlvbiA/ICIjZGVmaW5lIFVTRV9TSVpFQVRURU5VQVRJT04iIDogIiIsCiAgICAgIHBhcmFtZXRlcnMubnVtTGlnaHRQcm9iZXMgPiAwID8gIiNkZWZpbmUgVVNFX0xJR0hUX1BST0JFUyIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gIiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnJldmVyc2VEZXB0aEJ1ZmZlciA/ICIjZGVmaW5lIFVTRV9SRVZFUlNFREVQVEhCVUYiIDogIiIsCiAgICAgICJ1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7IiwKICAgICAgInVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7IiwKICAgICAgInVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OyIsCiAgICAgICJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLAogICAgICAidW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDsiLAogICAgICAidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsCiAgICAgICJ1bmlmb3JtIGJvb2wgaXNPcnRob2dyYXBoaWM7IiwKICAgICAgIiNpZmRlZiBVU0VfSU5TVEFOQ0lORyIsCiAgICAgICJcdGF0dHJpYnV0ZSBtYXQ0IGluc3RhbmNlTWF0cml4OyIsCiAgICAgICIjZW5kaWYiLAogICAgICAiI2lmZGVmIFVTRV9JTlNUQU5DSU5HX0NPTE9SIiwKICAgICAgIlx0YXR0cmlidXRlIHZlYzMgaW5zdGFuY2VDb2xvcjsiLAogICAgICAiI2VuZGlmIiwKICAgICAgIiNpZmRlZiBVU0VfSU5TVEFOQ0lOR19NT1JQSCIsCiAgICAgICJcdHVuaWZvcm0gc2FtcGxlcjJEIG1vcnBoVGV4dHVyZTsiLAogICAgICAiI2VuZGlmIiwKICAgICAgImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOyIsCiAgICAgICJhdHRyaWJ1dGUgdmVjMyBub3JtYWw7IiwKICAgICAgImF0dHJpYnV0ZSB2ZWMyIHV2OyIsCiAgICAgICIjaWZkZWYgVVNFX1VWMSIsCiAgICAgICJcdGF0dHJpYnV0ZSB2ZWMyIHV2MTsiLAogICAgICAiI2VuZGlmIiwKICAgICAgIiNpZmRlZiBVU0VfVVYyIiwKICAgICAgIlx0YXR0cmlidXRlIHZlYzIgdXYyOyIsCiAgICAgICIjZW5kaWYiLAogICAgICAiI2lmZGVmIFVTRV9VVjMiLAogICAgICAiXHRhdHRyaWJ1dGUgdmVjMiB1djM7IiwKICAgICAgIiNlbmRpZiIsCiAgICAgICIjaWZkZWYgVVNFX1RBTkdFTlQiLAogICAgICAiXHRhdHRyaWJ1dGUgdmVjNCB0YW5nZW50OyIsCiAgICAgICIjZW5kaWYiLAogICAgICAiI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApIiwKICAgICAgIlx0YXR0cmlidXRlIHZlYzQgY29sb3I7IiwKICAgICAgIiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApIiwKICAgICAgIlx0YXR0cmlidXRlIHZlYzMgY29sb3I7IiwKICAgICAgIiNlbmRpZiIsCiAgICAgICIjaWZkZWYgVVNFX1NLSU5OSU5HIiwKICAgICAgIlx0YXR0cmlidXRlIHZlYzQgc2tpbkluZGV4OyIsCiAgICAgICJcdGF0dHJpYnV0ZSB2ZWM0IHNraW5XZWlnaHQ7IiwKICAgICAgIiNlbmRpZiIsCiAgICAgIGAKYAogICAgXS5maWx0ZXIoZmlsdGVyRW1wdHlMaW5lKS5qb2luKGAKYCk7CiAgICBwcmVmaXhGcmFnbWVudCA9IFsKICAgICAgZ2VuZXJhdGVQcmVjaXNpb24ocGFyYW1ldGVycyksCiAgICAgICIjZGVmaW5lIFNIQURFUl9UWVBFICIgKyBwYXJhbWV0ZXJzLnNoYWRlclR5cGUsCiAgICAgICIjZGVmaW5lIFNIQURFUl9OQU1FICIgKyBwYXJhbWV0ZXJzLnNoYWRlck5hbWUsCiAgICAgIGN1c3RvbURlZmluZXMsCiAgICAgIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nID8gIiNkZWZpbmUgVVNFX0ZPRyIgOiAiIiwKICAgICAgcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2dFeHAyID8gIiNkZWZpbmUgRk9HX0VYUDIiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuYWxwaGFUb0NvdmVyYWdlID8gIiNkZWZpbmUgQUxQSEFfVE9fQ09WRVJBR0UiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMubWFwID8gIiNkZWZpbmUgVVNFX01BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5tYXRjYXAgPyAiI2RlZmluZSBVU0VfTUFUQ0FQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmVudk1hcCA/ICIjZGVmaW5lIFVTRV9FTlZNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuZW52TWFwID8gIiNkZWZpbmUgIiArIGVudk1hcFR5cGVEZWZpbmUgOiAiIiwKICAgICAgcGFyYW1ldGVycy5lbnZNYXAgPyAiI2RlZmluZSAiICsgZW52TWFwTW9kZURlZmluZSA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmVudk1hcCA/ICIjZGVmaW5lICIgKyBlbnZNYXBCbGVuZGluZ0RlZmluZSA6ICIiLAogICAgICBlbnZNYXBDdWJlVVZTaXplID8gIiNkZWZpbmUgQ1VCRVVWX1RFWEVMX1dJRFRIICIgKyBlbnZNYXBDdWJlVVZTaXplLnRleGVsV2lkdGggOiAiIiwKICAgICAgZW52TWFwQ3ViZVVWU2l6ZSA/ICIjZGVmaW5lIENVQkVVVl9URVhFTF9IRUlHSFQgIiArIGVudk1hcEN1YmVVVlNpemUudGV4ZWxIZWlnaHQgOiAiIiwKICAgICAgZW52TWFwQ3ViZVVWU2l6ZSA/ICIjZGVmaW5lIENVQkVVVl9NQVhfTUlQICIgKyBlbnZNYXBDdWJlVVZTaXplLm1heE1pcCArICIuMCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5saWdodE1hcCA/ICIjZGVmaW5lIFVTRV9MSUdIVE1BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5hb01hcCA/ICIjZGVmaW5lIFVTRV9BT01BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5idW1wTWFwID8gIiNkZWZpbmUgVVNFX0JVTVBNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMubm9ybWFsTWFwID8gIiNkZWZpbmUgVVNFX05PUk1BTE1BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5ub3JtYWxNYXBPYmplY3RTcGFjZSA/ICIjZGVmaW5lIFVTRV9OT1JNQUxNQVBfT0JKRUNUU1BBQ0UiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMubm9ybWFsTWFwVGFuZ2VudFNwYWNlID8gIiNkZWZpbmUgVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuZW1pc3NpdmVNYXAgPyAiI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuYW5pc290cm9weSA/ICIjZGVmaW5lIFVTRV9BTklTT1RST1BZIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmFuaXNvdHJvcHlNYXAgPyAiI2RlZmluZSBVU0VfQU5JU09UUk9QWU1BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5jbGVhcmNvYXQgPyAiI2RlZmluZSBVU0VfQ0xFQVJDT0FUIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmNsZWFyY29hdE1hcCA/ICIjZGVmaW5lIFVTRV9DTEVBUkNPQVRNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuY2xlYXJjb2F0Um91Z2huZXNzTWFwID8gIiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuY2xlYXJjb2F0Tm9ybWFsTWFwID8gIiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuZGlzcGVyc2lvbiA/ICIjZGVmaW5lIFVTRV9ESVNQRVJTSU9OIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmlyaWRlc2NlbmNlID8gIiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmlyaWRlc2NlbmNlTWFwID8gIiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFTUFQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwID8gIiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5zcGVjdWxhck1hcCA/ICIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5zcGVjdWxhckNvbG9yTWFwID8gIiNkZWZpbmUgVVNFX1NQRUNVTEFSX0NPTE9STUFQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnNwZWN1bGFySW50ZW5zaXR5TWFwID8gIiNkZWZpbmUgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5yb3VnaG5lc3NNYXAgPyAiI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICIjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuYWxwaGFNYXAgPyAiI2RlZmluZSBVU0VfQUxQSEFNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuYWxwaGFUZXN0ID8gIiNkZWZpbmUgVVNFX0FMUEhBVEVTVCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5hbHBoYUhhc2ggPyAiI2RlZmluZSBVU0VfQUxQSEFIQVNIIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnNoZWVuID8gIiNkZWZpbmUgVVNFX1NIRUVOIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnNoZWVuQ29sb3JNYXAgPyAiI2RlZmluZSBVU0VfU0hFRU5fQ09MT1JNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuc2hlZW5Sb3VnaG5lc3NNYXAgPyAiI2RlZmluZSBVU0VfU0hFRU5fUk9VR0hORVNTTUFQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnRyYW5zbWlzc2lvbiA/ICIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT04iIDogIiIsCiAgICAgIHBhcmFtZXRlcnMudHJhbnNtaXNzaW9uTWFwID8gIiNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTk1BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy50aGlja25lc3NNYXAgPyAiI2RlZmluZSBVU0VfVEhJQ0tORVNTTUFQIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLnZlcnRleFRhbmdlbnRzICYmIHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPT09IGZhbHNlID8gIiNkZWZpbmUgVVNFX1RBTkdFTlQiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMudmVydGV4Q29sb3JzIHx8IHBhcmFtZXRlcnMuaW5zdGFuY2luZ0NvbG9yIHx8IHBhcmFtZXRlcnMuYmF0Y2hpbmdDb2xvciA/ICIjZGVmaW5lIFVTRV9DT0xPUiIgOiAiIiwKICAgICAgcGFyYW1ldGVycy52ZXJ0ZXhBbHBoYXMgPyAiI2RlZmluZSBVU0VfQ09MT1JfQUxQSEEiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMudmVydGV4VXYxcyA/ICIjZGVmaW5lIFVTRV9VVjEiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMudmVydGV4VXYycyA/ICIjZGVmaW5lIFVTRV9VVjIiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMudmVydGV4VXYzcyA/ICIjZGVmaW5lIFVTRV9VVjMiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMucG9pbnRzVXZzID8gIiNkZWZpbmUgVVNFX1BPSU5UU19VViIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5ncmFkaWVudE1hcCA/ICIjZGVmaW5lIFVTRV9HUkFESUVOVE1BUCIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5mbGF0U2hhZGluZyA/ICIjZGVmaW5lIEZMQVRfU0hBREVEIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmRvdWJsZVNpZGVkID8gIiNkZWZpbmUgRE9VQkxFX1NJREVEIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmZsaXBTaWRlZCA/ICIjZGVmaW5lIEZMSVBfU0lERUQiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICIjZGVmaW5lIFVTRV9TSEFET1dNQVAiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICIjZGVmaW5lICIgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogIiIsCiAgICAgIHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhID8gIiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQSIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5udW1MaWdodFByb2JlcyA+IDAgPyAiI2RlZmluZSBVU0VfTElHSFRfUFJPQkVTIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmRlY29kZVZpZGVvVGV4dHVyZSA/ICIjZGVmaW5lIERFQ09ERV9WSURFT19URVhUVVJFIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLmRlY29kZVZpZGVvVGV4dHVyZUVtaXNzaXZlID8gIiNkZWZpbmUgREVDT0RFX1ZJREVPX1RFWFRVUkVfRU1JU1NJVkUiIDogIiIsCiAgICAgIHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA/ICIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRiIgOiAiIiwKICAgICAgcGFyYW1ldGVycy5yZXZlcnNlRGVwdGhCdWZmZXIgPyAiI2RlZmluZSBVU0VfUkVWRVJTRURFUFRIQlVGIiA6ICIiLAogICAgICAidW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7IiwKICAgICAgInVuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsiLAogICAgICAidW5pZm9ybSBib29sIGlzT3J0aG9ncmFwaGljOyIsCiAgICAgIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgPyAiI2RlZmluZSBUT05FX01BUFBJTkciIDogIiIsCiAgICAgIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgPyBTaGFkZXJDaHVua1sidG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCJdIDogIiIsCiAgICAgIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgPyBnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCJ0b25lTWFwcGluZyIsIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcpIDogIiIsCiAgICAgIHBhcmFtZXRlcnMuZGl0aGVyaW5nID8gIiNkZWZpbmUgRElUSEVSSU5HIiA6ICIiLAogICAgICBwYXJhbWV0ZXJzLm9wYXF1ZSA/ICIjZGVmaW5lIE9QQVFVRSIgOiAiIiwKICAgICAgU2hhZGVyQ2h1bmtbImNvbG9yc3BhY2VfcGFyc19mcmFnbWVudCJdLAogICAgICBnZXRUZXhlbEVuY29kaW5nRnVuY3Rpb24oImxpbmVhclRvT3V0cHV0VGV4ZWwiLCBwYXJhbWV0ZXJzLm91dHB1dENvbG9yU3BhY2UpLAogICAgICBnZXRMdW1pbmFuY2VGdW5jdGlvbigpLAogICAgICBwYXJhbWV0ZXJzLnVzZURlcHRoUGFja2luZyA/ICIjZGVmaW5lIERFUFRIX1BBQ0tJTkcgIiArIHBhcmFtZXRlcnMuZGVwdGhQYWNraW5nIDogIiIsCiAgICAgIGAKYAogICAgXS5maWx0ZXIoZmlsdGVyRW1wdHlMaW5lKS5qb2luKGAKYCk7CiAgfQogIHZlcnRleFNoYWRlciA9IHJlc29sdmVJbmNsdWRlcyh2ZXJ0ZXhTaGFkZXIpOwogIHZlcnRleFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXModmVydGV4U2hhZGVyLCBwYXJhbWV0ZXJzKTsKICB2ZXJ0ZXhTaGFkZXIgPSByZXBsYWNlQ2xpcHBpbmdQbGFuZU51bXModmVydGV4U2hhZGVyLCBwYXJhbWV0ZXJzKTsKICBmcmFnbWVudFNoYWRlciA9IHJlc29sdmVJbmNsdWRlcyhmcmFnbWVudFNoYWRlcik7CiAgZnJhZ21lbnRTaGFkZXIgPSByZXBsYWNlTGlnaHROdW1zKGZyYWdtZW50U2hhZGVyLCBwYXJhbWV0ZXJzKTsKICBmcmFnbWVudFNoYWRlciA9IHJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyhmcmFnbWVudFNoYWRlciwgcGFyYW1ldGVycyk7CiAgdmVydGV4U2hhZGVyID0gdW5yb2xsTG9vcHModmVydGV4U2hhZGVyKTsKICBmcmFnbWVudFNoYWRlciA9IHVucm9sbExvb3BzKGZyYWdtZW50U2hhZGVyKTsKICBpZiAocGFyYW1ldGVycy5pc1Jhd1NoYWRlck1hdGVyaWFsICE9PSB0cnVlKSB7CiAgICB2ZXJzaW9uU3RyaW5nID0gYCN2ZXJzaW9uIDMwMCBlcwpgOwogICAgcHJlZml4VmVydGV4ID0gWwogICAgICBjdXN0b21WZXJ0ZXhFeHRlbnNpb25zLAogICAgICAiI2RlZmluZSBhdHRyaWJ1dGUgaW4iLAogICAgICAiI2RlZmluZSB2YXJ5aW5nIG91dCIsCiAgICAgICIjZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlIgogICAgXS5qb2luKGAKYCkgKyBgCmAgKyBwcmVmaXhWZXJ0ZXg7CiAgICBwcmVmaXhGcmFnbWVudCA9IFsKICAgICAgIiNkZWZpbmUgdmFyeWluZyBpbiIsCiAgICAgIHBhcmFtZXRlcnMuZ2xzbFZlcnNpb24gPT09IEdMU0wzID8gIiIgOiAibGF5b3V0KGxvY2F0aW9uID0gMCkgb3V0IGhpZ2hwIHZlYzQgcGNfZnJhZ0NvbG9yOyIsCiAgICAgIHBhcmFtZXRlcnMuZ2xzbFZlcnNpb24gPT09IEdMU0wzID8gIiIgOiAiI2RlZmluZSBnbF9GcmFnQ29sb3IgcGNfZnJhZ0NvbG9yIiwKICAgICAgIiNkZWZpbmUgZ2xfRnJhZ0RlcHRoRVhUIGdsX0ZyYWdEZXB0aCIsCiAgICAgICIjZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlIiwKICAgICAgIiNkZWZpbmUgdGV4dHVyZUN1YmUgdGV4dHVyZSIsCiAgICAgICIjZGVmaW5lIHRleHR1cmUyRFByb2ogdGV4dHVyZVByb2oiLAogICAgICAiI2RlZmluZSB0ZXh0dXJlMkRMb2RFWFQgdGV4dHVyZUxvZCIsCiAgICAgICIjZGVmaW5lIHRleHR1cmUyRFByb2pMb2RFWFQgdGV4dHVyZVByb2pMb2QiLAogICAgICAiI2RlZmluZSB0ZXh0dXJlQ3ViZUxvZEVYVCB0ZXh0dXJlTG9kIiwKICAgICAgIiNkZWZpbmUgdGV4dHVyZTJER3JhZEVYVCB0ZXh0dXJlR3JhZCIsCiAgICAgICIjZGVmaW5lIHRleHR1cmUyRFByb2pHcmFkRVhUIHRleHR1cmVQcm9qR3JhZCIsCiAgICAgICIjZGVmaW5lIHRleHR1cmVDdWJlR3JhZEVYVCB0ZXh0dXJlR3JhZCIKICAgIF0uam9pbihgCmApICsgYApgICsgcHJlZml4RnJhZ21lbnQ7CiAgICBpZiAobnVtTXVsdGl2aWV3Vmlld3MgPiAwKSB7CiAgICAgIHByZWZpeFZlcnRleCA9IFsKICAgICAgICAiI2V4dGVuc2lvbiBHTF9PVlJfbXVsdGl2aWV3IDogcmVxdWlyZSIsCiAgICAgICAgImxheW91dChudW1fdmlld3MgPSAiICsgbnVtTXVsdGl2aWV3Vmlld3MgKyAiKSBpbjsiLAogICAgICAgICIjZGVmaW5lIFZJRVdfSUQgZ2xfVmlld0lEX09WUiIKICAgICAgXS5qb2luKGAKYCkgKyBgCmAgKyBwcmVmaXhWZXJ0ZXg7CiAgICAgIHByZWZpeFZlcnRleCA9IHByZWZpeFZlcnRleC5yZXBsYWNlKFsKICAgICAgICAidW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDsiLAogICAgICAgICJ1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsiLAogICAgICAgICJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLAogICAgICAgICJ1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4OyIKICAgICAgXS5qb2luKGAKYCksIFsKICAgICAgICAidW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpY2VzWyIgKyBudW1NdWx0aXZpZXdWaWV3cyArICJdOyIsCiAgICAgICAgInVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cmljZXNbIiArIG51bU11bHRpdmlld1ZpZXdzICsgIl07IiwKICAgICAgICAidW5pZm9ybSBtYXQ0IHZpZXdNYXRyaWNlc1siICsgbnVtTXVsdGl2aWV3Vmlld3MgKyAiXTsiLAogICAgICAgICJ1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cmljZXNbIiArIG51bU11bHRpdmlld1ZpZXdzICsgIl07IiwKICAgICAgICAiI2RlZmluZSBtb2RlbFZpZXdNYXRyaXggbW9kZWxWaWV3TWF0cmljZXNbVklFV19JRF0iLAogICAgICAgICIjZGVmaW5lIHByb2plY3Rpb25NYXRyaXggcHJvamVjdGlvbk1hdHJpY2VzW1ZJRVdfSURdIiwKICAgICAgICAiI2RlZmluZSB2aWV3TWF0cml4IHZpZXdNYXRyaWNlc1tWSUVXX0lEXSIsCiAgICAgICAgIiNkZWZpbmUgbm9ybWFsTWF0cml4IG5vcm1hbE1hdHJpY2VzW1ZJRVdfSURdIgogICAgICBdLmpvaW4oYApgKSk7CiAgICAgIHByZWZpeEZyYWdtZW50ID0gWwogICAgICAgICIjZXh0ZW5zaW9uIEdMX09WUl9tdWx0aXZpZXcgOiByZXF1aXJlIiwKICAgICAgICAiI2RlZmluZSBWSUVXX0lEIGdsX1ZpZXdJRF9PVlIiCiAgICAgIF0uam9pbihgCmApICsgYApgICsgcHJlZml4RnJhZ21lbnQ7CiAgICAgIHByZWZpeEZyYWdtZW50ID0gcHJlZml4RnJhZ21lbnQucmVwbGFjZSgidW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7IiwgWwogICAgICAgICJ1bmlmb3JtIG1hdDQgdmlld01hdHJpY2VzWyIgKyBudW1NdWx0aXZpZXdWaWV3cyArICJdOyIsCiAgICAgICAgIiNkZWZpbmUgdmlld01hdHJpeCB2aWV3TWF0cmljZXNbVklFV19JRF0iCiAgICAgIF0uam9pbihgCmApKTsKICAgIH0KICB9CiAgY29uc3QgdmVydGV4R2xzbCA9IHZlcnNpb25TdHJpbmcgKyBwcmVmaXhWZXJ0ZXggKyB2ZXJ0ZXhTaGFkZXI7CiAgY29uc3QgZnJhZ21lbnRHbHNsID0gdmVyc2lvblN0cmluZyArIHByZWZpeEZyYWdtZW50ICsgZnJhZ21lbnRTaGFkZXI7CiAgY29uc3QgZ2xWZXJ0ZXhTaGFkZXIgPSBXZWJHTFNoYWRlcihnbCwgZ2wuVkVSVEVYX1NIQURFUiwgdmVydGV4R2xzbCk7CiAgY29uc3QgZ2xGcmFnbWVudFNoYWRlciA9IFdlYkdMU2hhZGVyKGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50R2xzbCk7CiAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGdsVmVydGV4U2hhZGVyKTsKICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZ2xGcmFnbWVudFNoYWRlcik7CiAgaWYgKHBhcmFtZXRlcnMuaW5kZXgwQXR0cmlidXRlTmFtZSAhPT0gdW5kZWZpbmVkKSB7CiAgICBnbC5iaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgMCwgcGFyYW1ldGVycy5pbmRleDBBdHRyaWJ1dGVOYW1lKTsKICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzID09PSB0cnVlKSB7CiAgICBnbC5iaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgMCwgInBvc2l0aW9uIik7CiAgfQogIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pOwogIGZ1bmN0aW9uIG9uRmlyc3RVc2Uoc2VsZjIpIHsKICAgIGlmIChyZW5kZXJlci5kZWJ1Zy5jaGVja1NoYWRlckVycm9ycykgewogICAgICBjb25zdCBwcm9ncmFtTG9nID0gZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSkudHJpbSgpOwogICAgICBjb25zdCB2ZXJ0ZXhMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKGdsVmVydGV4U2hhZGVyKS50cmltKCk7CiAgICAgIGNvbnN0IGZyYWdtZW50TG9nID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyhnbEZyYWdtZW50U2hhZGVyKS50cmltKCk7CiAgICAgIGxldCBydW5uYWJsZSA9IHRydWU7CiAgICAgIGxldCBoYXZlRGlhZ25vc3RpY3MgPSB0cnVlOwogICAgICBpZiAoZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykgPT09IGZhbHNlKSB7CiAgICAgICAgcnVubmFibGUgPSBmYWxzZTsKICAgICAgICBpZiAodHlwZW9mIHJlbmRlcmVyLmRlYnVnLm9uU2hhZGVyRXJyb3IgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIHJlbmRlcmVyLmRlYnVnLm9uU2hhZGVyRXJyb3IoZ2wsIHByb2dyYW0sIGdsVmVydGV4U2hhZGVyLCBnbEZyYWdtZW50U2hhZGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgdmVydGV4RXJyb3JzID0gZ2V0U2hhZGVyRXJyb3JzKGdsLCBnbFZlcnRleFNoYWRlciwgInZlcnRleCIpOwogICAgICAgICAgY29uc3QgZnJhZ21lbnRFcnJvcnMgPSBnZXRTaGFkZXJFcnJvcnMoZ2wsIGdsRnJhZ21lbnRTaGFkZXIsICJmcmFnbWVudCIpOwogICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xQcm9ncmFtOiBTaGFkZXIgRXJyb3IgIiArIGdsLmdldEVycm9yKCkgKyAiIC0gIiArICJWQUxJREFURV9TVEFUVVMgIiArIGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuVkFMSURBVEVfU1RBVFVTKSArIGAKCmAgKyAiTWF0ZXJpYWwgTmFtZTogIiArIHNlbGYyLm5hbWUgKyBgCmAgKyAiTWF0ZXJpYWwgVHlwZTogIiArIHNlbGYyLnR5cGUgKyBgCgpgICsgIlByb2dyYW0gSW5mbyBMb2c6ICIgKyBwcm9ncmFtTG9nICsgYApgICsgdmVydGV4RXJyb3JzICsgYApgICsgZnJhZ21lbnRFcnJvcnMpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChwcm9ncmFtTG9nICE9PSAiIikgewogICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtOiBQcm9ncmFtIEluZm8gTG9nOiIsIHByb2dyYW1Mb2cpOwogICAgICB9IGVsc2UgaWYgKHZlcnRleExvZyA9PT0gIiIgfHwgZnJhZ21lbnRMb2cgPT09ICIiKSB7CiAgICAgICAgaGF2ZURpYWdub3N0aWNzID0gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGhhdmVEaWFnbm9zdGljcykgewogICAgICAgIHNlbGYyLmRpYWdub3N0aWNzID0gewogICAgICAgICAgcnVubmFibGUsCiAgICAgICAgICBwcm9ncmFtTG9nLAogICAgICAgICAgdmVydGV4U2hhZGVyOiB7CiAgICAgICAgICAgIGxvZzogdmVydGV4TG9nLAogICAgICAgICAgICBwcmVmaXg6IHByZWZpeFZlcnRleAogICAgICAgICAgfSwKICAgICAgICAgIGZyYWdtZW50U2hhZGVyOiB7CiAgICAgICAgICAgIGxvZzogZnJhZ21lbnRMb2csCiAgICAgICAgICAgIHByZWZpeDogcHJlZml4RnJhZ21lbnQKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CiAgICB9CiAgICBnbC5kZWxldGVTaGFkZXIoZ2xWZXJ0ZXhTaGFkZXIpOwogICAgZ2wuZGVsZXRlU2hhZGVyKGdsRnJhZ21lbnRTaGFkZXIpOwogICAgY2FjaGVkVW5pZm9ybXMgPSBuZXcgV2ViR0xVbmlmb3JtcyhnbCwgcHJvZ3JhbSk7CiAgICBjYWNoZWRBdHRyaWJ1dGVzID0gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoZ2wsIHByb2dyYW0pOwogIH0KICBsZXQgY2FjaGVkVW5pZm9ybXM7CiAgdGhpcy5nZXRVbmlmb3JtcyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGNhY2hlZFVuaWZvcm1zID09PSB1bmRlZmluZWQpIHsKICAgICAgb25GaXJzdFVzZSh0aGlzKTsKICAgIH0KICAgIHJldHVybiBjYWNoZWRVbmlmb3JtczsKICB9OwogIGxldCBjYWNoZWRBdHRyaWJ1dGVzOwogIHRoaXMuZ2V0QXR0cmlidXRlcyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGNhY2hlZEF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCkgewogICAgICBvbkZpcnN0VXNlKHRoaXMpOwogICAgfQogICAgcmV0dXJuIGNhY2hlZEF0dHJpYnV0ZXM7CiAgfTsKICBsZXQgcHJvZ3JhbVJlYWR5ID0gcGFyYW1ldGVycy5yZW5kZXJlckV4dGVuc2lvblBhcmFsbGVsU2hhZGVyQ29tcGlsZSA9PT0gZmFsc2U7CiAgdGhpcy5pc1JlYWR5ID0gZnVuY3Rpb24oKSB7CiAgICBpZiAocHJvZ3JhbVJlYWR5ID09PSBmYWxzZSkgewogICAgICBwcm9ncmFtUmVhZHkgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIENPTVBMRVRJT05fU1RBVFVTX0tIUik7CiAgICB9CiAgICByZXR1cm4gcHJvZ3JhbVJlYWR5OwogIH07CiAgdGhpcy5kZXN0cm95ID0gZnVuY3Rpb24oKSB7CiAgICBiaW5kaW5nU3RhdGVzLnJlbGVhc2VTdGF0ZXNPZlByb2dyYW0odGhpcyk7CiAgICBnbC5kZWxldGVQcm9ncmFtKHByb2dyYW0pOwogICAgdGhpcy5wcm9ncmFtID0gdW5kZWZpbmVkOwogIH07CiAgdGhpcy50eXBlID0gcGFyYW1ldGVycy5zaGFkZXJUeXBlOwogIHRoaXMubmFtZSA9IHBhcmFtZXRlcnMuc2hhZGVyTmFtZTsKICB0aGlzLmlkID0gcHJvZ3JhbUlkQ291bnQrKzsKICB0aGlzLmNhY2hlS2V5ID0gY2FjaGVLZXk7CiAgdGhpcy51c2VkVGltZXMgPSAxOwogIHRoaXMucHJvZ3JhbSA9IHByb2dyYW07CiAgdGhpcy52ZXJ0ZXhTaGFkZXIgPSBnbFZlcnRleFNoYWRlcjsKICB0aGlzLmZyYWdtZW50U2hhZGVyID0gZ2xGcmFnbWVudFNoYWRlcjsKICB0aGlzLm51bU11bHRpdmlld1ZpZXdzID0gbnVtTXVsdGl2aWV3Vmlld3M7CiAgcmV0dXJuIHRoaXM7Cn0KCmNsYXNzIFdlYkdMU2hhZGVyQ2FjaGUgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5zaGFkZXJDYWNoZSA9IG5ldyBNYXA7CiAgICB0aGlzLm1hdGVyaWFsQ2FjaGUgPSBuZXcgTWFwOwogIH0KICB1cGRhdGUobWF0ZXJpYWwpIHsKICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IG1hdGVyaWFsLnZlcnRleFNoYWRlcjsKICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXI7CiAgICBjb25zdCB2ZXJ0ZXhTaGFkZXJTdGFnZSA9IHRoaXMuX2dldFNoYWRlclN0YWdlKHZlcnRleFNoYWRlcik7CiAgICBjb25zdCBmcmFnbWVudFNoYWRlclN0YWdlID0gdGhpcy5fZ2V0U2hhZGVyU3RhZ2UoZnJhZ21lbnRTaGFkZXIpOwogICAgY29uc3QgbWF0ZXJpYWxTaGFkZXJzID0gdGhpcy5fZ2V0U2hhZGVyQ2FjaGVGb3JNYXRlcmlhbChtYXRlcmlhbCk7CiAgICBpZiAobWF0ZXJpYWxTaGFkZXJzLmhhcyh2ZXJ0ZXhTaGFkZXJTdGFnZSkgPT09IGZhbHNlKSB7CiAgICAgIG1hdGVyaWFsU2hhZGVycy5hZGQodmVydGV4U2hhZGVyU3RhZ2UpOwogICAgICB2ZXJ0ZXhTaGFkZXJTdGFnZS51c2VkVGltZXMrKzsKICAgIH0KICAgIGlmIChtYXRlcmlhbFNoYWRlcnMuaGFzKGZyYWdtZW50U2hhZGVyU3RhZ2UpID09PSBmYWxzZSkgewogICAgICBtYXRlcmlhbFNoYWRlcnMuYWRkKGZyYWdtZW50U2hhZGVyU3RhZ2UpOwogICAgICBmcmFnbWVudFNoYWRlclN0YWdlLnVzZWRUaW1lcysrOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQogIHJlbW92ZShtYXRlcmlhbCkgewogICAgY29uc3QgbWF0ZXJpYWxTaGFkZXJzID0gdGhpcy5tYXRlcmlhbENhY2hlLmdldChtYXRlcmlhbCk7CiAgICBmb3IgKGNvbnN0IHNoYWRlclN0YWdlIG9mIG1hdGVyaWFsU2hhZGVycykgewogICAgICBzaGFkZXJTdGFnZS51c2VkVGltZXMtLTsKICAgICAgaWYgKHNoYWRlclN0YWdlLnVzZWRUaW1lcyA9PT0gMCkKICAgICAgICB0aGlzLnNoYWRlckNhY2hlLmRlbGV0ZShzaGFkZXJTdGFnZS5jb2RlKTsKICAgIH0KICAgIHRoaXMubWF0ZXJpYWxDYWNoZS5kZWxldGUobWF0ZXJpYWwpOwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGdldFZlcnRleFNoYWRlcklEKG1hdGVyaWFsKSB7CiAgICByZXR1cm4gdGhpcy5fZ2V0U2hhZGVyU3RhZ2UobWF0ZXJpYWwudmVydGV4U2hhZGVyKS5pZDsKICB9CiAgZ2V0RnJhZ21lbnRTaGFkZXJJRChtYXRlcmlhbCkgewogICAgcmV0dXJuIHRoaXMuX2dldFNoYWRlclN0YWdlKG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyKS5pZDsKICB9CiAgZGlzcG9zZSgpIHsKICAgIHRoaXMuc2hhZGVyQ2FjaGUuY2xlYXIoKTsKICAgIHRoaXMubWF0ZXJpYWxDYWNoZS5jbGVhcigpOwogIH0KICBfZ2V0U2hhZGVyQ2FjaGVGb3JNYXRlcmlhbChtYXRlcmlhbCkgewogICAgY29uc3QgY2FjaGUgPSB0aGlzLm1hdGVyaWFsQ2FjaGU7CiAgICBsZXQgc2V0ID0gY2FjaGUuZ2V0KG1hdGVyaWFsKTsKICAgIGlmIChzZXQgPT09IHVuZGVmaW5lZCkgewogICAgICBzZXQgPSBuZXcgU2V0OwogICAgICBjYWNoZS5zZXQobWF0ZXJpYWwsIHNldCk7CiAgICB9CiAgICByZXR1cm4gc2V0OwogIH0KICBfZ2V0U2hhZGVyU3RhZ2UoY29kZSkgewogICAgY29uc3QgY2FjaGUgPSB0aGlzLnNoYWRlckNhY2hlOwogICAgbGV0IHN0YWdlID0gY2FjaGUuZ2V0KGNvZGUpOwogICAgaWYgKHN0YWdlID09PSB1bmRlZmluZWQpIHsKICAgICAgc3RhZ2UgPSBuZXcgV2ViR0xTaGFkZXJTdGFnZShjb2RlKTsKICAgICAgY2FjaGUuc2V0KGNvZGUsIHN0YWdlKTsKICAgIH0KICAgIHJldHVybiBzdGFnZTsKICB9Cn0KCmNsYXNzIFdlYkdMU2hhZGVyU3RhZ2UgewogIGNvbnN0cnVjdG9yKGNvZGUpIHsKICAgIHRoaXMuaWQgPSBfaWQyKys7CiAgICB0aGlzLmNvZGUgPSBjb2RlOwogICAgdGhpcy51c2VkVGltZXMgPSAwOwogIH0KfQpmdW5jdGlvbiBXZWJHTFByb2dyYW1zKHJlbmRlcmVyLCBjdWJlbWFwcywgY3ViZXV2bWFwcywgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzLCBiaW5kaW5nU3RhdGVzLCBjbGlwcGluZykgewogIGNvbnN0IF9wcm9ncmFtTGF5ZXJzID0gbmV3IExheWVyczsKICBjb25zdCBfY3VzdG9tU2hhZGVycyA9IG5ldyBXZWJHTFNoYWRlckNhY2hlOwogIGNvbnN0IF9hY3RpdmVDaGFubmVscyA9IG5ldyBTZXQ7CiAgY29uc3QgcHJvZ3JhbXMgPSBbXTsKICBjb25zdCBsb2dhcml0aG1pY0RlcHRoQnVmZmVyID0gY2FwYWJpbGl0aWVzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXI7CiAgY29uc3QgU1VQUE9SVFNfVkVSVEVYX1RFWFRVUkVTID0gY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzOwogIGxldCBwcmVjaXNpb24gPSBjYXBhYmlsaXRpZXMucHJlY2lzaW9uOwogIGNvbnN0IHNoYWRlcklEcyA9IHsKICAgIE1lc2hEZXB0aE1hdGVyaWFsOiAiZGVwdGgiLAogICAgTWVzaERpc3RhbmNlTWF0ZXJpYWw6ICJkaXN0YW5jZVJHQkEiLAogICAgTWVzaE5vcm1hbE1hdGVyaWFsOiAibm9ybWFsIiwKICAgIE1lc2hCYXNpY01hdGVyaWFsOiAiYmFzaWMiLAogICAgTWVzaExhbWJlcnRNYXRlcmlhbDogImxhbWJlcnQiLAogICAgTWVzaFBob25nTWF0ZXJpYWw6ICJwaG9uZyIsCiAgICBNZXNoVG9vbk1hdGVyaWFsOiAidG9vbiIsCiAgICBNZXNoU3RhbmRhcmRNYXRlcmlhbDogInBoeXNpY2FsIiwKICAgIE1lc2hQaHlzaWNhbE1hdGVyaWFsOiAicGh5c2ljYWwiLAogICAgTWVzaE1hdGNhcE1hdGVyaWFsOiAibWF0Y2FwIiwKICAgIExpbmVCYXNpY01hdGVyaWFsOiAiYmFzaWMiLAogICAgTGluZURhc2hlZE1hdGVyaWFsOiAiZGFzaGVkIiwKICAgIFBvaW50c01hdGVyaWFsOiAicG9pbnRzIiwKICAgIFNoYWRvd01hdGVyaWFsOiAic2hhZG93IiwKICAgIFNwcml0ZU1hdGVyaWFsOiAic3ByaXRlIgogIH07CiAgZnVuY3Rpb24gZ2V0Q2hhbm5lbCh2YWx1ZSkgewogICAgX2FjdGl2ZUNoYW5uZWxzLmFkZCh2YWx1ZSk7CiAgICBpZiAodmFsdWUgPT09IDApCiAgICAgIHJldHVybiAidXYiOwogICAgcmV0dXJuIGB1diR7dmFsdWV9YDsKICB9CiAgZnVuY3Rpb24gZ2V0UGFyYW1ldGVycyhtYXRlcmlhbCwgbGlnaHRzLCBzaGFkb3dzLCBzY2VuZSwgb2JqZWN0KSB7CiAgICBjb25zdCBmb2cgPSBzY2VuZS5mb2c7CiAgICBjb25zdCBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTsKICAgIGNvbnN0IGVudmlyb25tZW50ID0gbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA/IHNjZW5lLmVudmlyb25tZW50IDogbnVsbDsKICAgIGNvbnN0IGVudk1hcCA9IChtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID8gY3ViZXV2bWFwcyA6IGN1YmVtYXBzKS5nZXQobWF0ZXJpYWwuZW52TWFwIHx8IGVudmlyb25tZW50KTsKICAgIGNvbnN0IGVudk1hcEN1YmVVVkhlaWdodCA9ICEhZW52TWFwICYmIGVudk1hcC5tYXBwaW5nID09PSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyA/IGVudk1hcC5pbWFnZS5oZWlnaHQgOiBudWxsOwogICAgY29uc3Qgc2hhZGVySUQgPSBzaGFkZXJJRHNbbWF0ZXJpYWwudHlwZV07CiAgICBpZiAobWF0ZXJpYWwucHJlY2lzaW9uICE9PSBudWxsKSB7CiAgICAgIHByZWNpc2lvbiA9IGNhcGFiaWxpdGllcy5nZXRNYXhQcmVjaXNpb24obWF0ZXJpYWwucHJlY2lzaW9uKTsKICAgICAgaWYgKHByZWNpc2lvbiAhPT0gbWF0ZXJpYWwucHJlY2lzaW9uKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW0uZ2V0UGFyYW1ldGVyczoiLCBtYXRlcmlhbC5wcmVjaXNpb24sICJub3Qgc3VwcG9ydGVkLCB1c2luZyIsIHByZWNpc2lvbiwgImluc3RlYWQuIik7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG1vcnBoQXR0cmlidXRlID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uIHx8IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWwgfHwgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLmNvbG9yOwogICAgY29uc3QgbW9ycGhUYXJnZXRzQ291bnQgPSBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkID8gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoIDogMDsKICAgIGxldCBtb3JwaFRleHR1cmVTdHJpZGUgPSAwOwogICAgaWYgKGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiAhPT0gdW5kZWZpbmVkKQogICAgICBtb3JwaFRleHR1cmVTdHJpZGUgPSAxOwogICAgaWYgKGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWwgIT09IHVuZGVmaW5lZCkKICAgICAgbW9ycGhUZXh0dXJlU3RyaWRlID0gMjsKICAgIGlmIChnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3IgIT09IHVuZGVmaW5lZCkKICAgICAgbW9ycGhUZXh0dXJlU3RyaWRlID0gMzsKICAgIGxldCB2ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyOwogICAgbGV0IGN1c3RvbVZlcnRleFNoYWRlcklELCBjdXN0b21GcmFnbWVudFNoYWRlcklEOwogICAgaWYgKHNoYWRlcklEKSB7CiAgICAgIGNvbnN0IHNoYWRlciA9IFNoYWRlckxpYltzaGFkZXJJRF07CiAgICAgIHZlcnRleFNoYWRlciA9IHNoYWRlci52ZXJ0ZXhTaGFkZXI7CiAgICAgIGZyYWdtZW50U2hhZGVyID0gc2hhZGVyLmZyYWdtZW50U2hhZGVyOwogICAgfSBlbHNlIHsKICAgICAgdmVydGV4U2hhZGVyID0gbWF0ZXJpYWwudmVydGV4U2hhZGVyOwogICAgICBmcmFnbWVudFNoYWRlciA9IG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyOwogICAgICBfY3VzdG9tU2hhZGVycy51cGRhdGUobWF0ZXJpYWwpOwogICAgICBjdXN0b21WZXJ0ZXhTaGFkZXJJRCA9IF9jdXN0b21TaGFkZXJzLmdldFZlcnRleFNoYWRlcklEKG1hdGVyaWFsKTsKICAgICAgY3VzdG9tRnJhZ21lbnRTaGFkZXJJRCA9IF9jdXN0b21TaGFkZXJzLmdldEZyYWdtZW50U2hhZGVySUQobWF0ZXJpYWwpOwogICAgfQogICAgY29uc3QgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpOwogICAgY29uc3QgcmV2ZXJzZURlcHRoQnVmZmVyID0gcmVuZGVyZXIuc3RhdGUuYnVmZmVycy5kZXB0aC5nZXRSZXZlcnNlZCgpOwogICAgY29uc3QgbnVtTXVsdGl2aWV3Vmlld3MgPSBjdXJyZW50UmVuZGVyVGFyZ2V0ICYmIGN1cnJlbnRSZW5kZXJUYXJnZXQuaXNXZWJHTE11bHRpdmlld1JlbmRlclRhcmdldCA/IGN1cnJlbnRSZW5kZXJUYXJnZXQubnVtVmlld3MgOiAwOwogICAgY29uc3QgSVNfSU5TVEFOQ0VETUVTSCA9IG9iamVjdC5pc0luc3RhbmNlZE1lc2ggPT09IHRydWU7CiAgICBjb25zdCBJU19CQVRDSEVETUVTSCA9IG9iamVjdC5pc0JhdGNoZWRNZXNoID09PSB0cnVlOwogICAgY29uc3QgSEFTX01BUCA9ICEhbWF0ZXJpYWwubWFwOwogICAgY29uc3QgSEFTX01BVENBUCA9ICEhbWF0ZXJpYWwubWF0Y2FwOwogICAgY29uc3QgSEFTX0VOVk1BUCA9ICEhZW52TWFwOwogICAgY29uc3QgSEFTX0FPTUFQID0gISFtYXRlcmlhbC5hb01hcDsKICAgIGNvbnN0IEhBU19MSUdIVE1BUCA9ICEhbWF0ZXJpYWwubGlnaHRNYXA7CiAgICBjb25zdCBIQVNfQlVNUE1BUCA9ICEhbWF0ZXJpYWwuYnVtcE1hcDsKICAgIGNvbnN0IEhBU19OT1JNQUxNQVAgPSAhIW1hdGVyaWFsLm5vcm1hbE1hcDsKICAgIGNvbnN0IEhBU19ESVNQTEFDRU1FTlRNQVAgPSAhIW1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDsKICAgIGNvbnN0IEhBU19FTUlTU0lWRU1BUCA9ICEhbWF0ZXJpYWwuZW1pc3NpdmVNYXA7CiAgICBjb25zdCBIQVNfTUVUQUxORVNTTUFQID0gISFtYXRlcmlhbC5tZXRhbG5lc3NNYXA7CiAgICBjb25zdCBIQVNfUk9VR0hORVNTTUFQID0gISFtYXRlcmlhbC5yb3VnaG5lc3NNYXA7CiAgICBjb25zdCBIQVNfQU5JU09UUk9QWSA9IG1hdGVyaWFsLmFuaXNvdHJvcHkgPiAwOwogICAgY29uc3QgSEFTX0NMRUFSQ09BVCA9IG1hdGVyaWFsLmNsZWFyY29hdCA+IDA7CiAgICBjb25zdCBIQVNfRElTUEVSU0lPTiA9IG1hdGVyaWFsLmRpc3BlcnNpb24gPiAwOwogICAgY29uc3QgSEFTX0lSSURFU0NFTkNFID0gbWF0ZXJpYWwuaXJpZGVzY2VuY2UgPiAwOwogICAgY29uc3QgSEFTX1NIRUVOID0gbWF0ZXJpYWwuc2hlZW4gPiAwOwogICAgY29uc3QgSEFTX1RSQU5TTUlTU0lPTiA9IG1hdGVyaWFsLnRyYW5zbWlzc2lvbiA+IDA7CiAgICBjb25zdCBIQVNfQU5JU09UUk9QWU1BUCA9IEhBU19BTklTT1RST1BZICYmICEhbWF0ZXJpYWwuYW5pc290cm9weU1hcDsKICAgIGNvbnN0IEhBU19DTEVBUkNPQVRNQVAgPSBIQVNfQ0xFQVJDT0FUICYmICEhbWF0ZXJpYWwuY2xlYXJjb2F0TWFwOwogICAgY29uc3QgSEFTX0NMRUFSQ09BVF9OT1JNQUxNQVAgPSBIQVNfQ0xFQVJDT0FUICYmICEhbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwOwogICAgY29uc3QgSEFTX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAgPSBIQVNfQ0xFQVJDT0FUICYmICEhbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwOwogICAgY29uc3QgSEFTX0lSSURFU0NFTkNFTUFQID0gSEFTX0lSSURFU0NFTkNFICYmICEhbWF0ZXJpYWwuaXJpZGVzY2VuY2VNYXA7CiAgICBjb25zdCBIQVNfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQID0gSEFTX0lSSURFU0NFTkNFICYmICEhbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3NNYXA7CiAgICBjb25zdCBIQVNfU0hFRU5fQ09MT1JNQVAgPSBIQVNfU0hFRU4gJiYgISFtYXRlcmlhbC5zaGVlbkNvbG9yTWFwOwogICAgY29uc3QgSEFTX1NIRUVOX1JPVUdITkVTU01BUCA9IEhBU19TSEVFTiAmJiAhIW1hdGVyaWFsLnNoZWVuUm91Z2huZXNzTWFwOwogICAgY29uc3QgSEFTX1NQRUNVTEFSTUFQID0gISFtYXRlcmlhbC5zcGVjdWxhck1hcDsKICAgIGNvbnN0IEhBU19TUEVDVUxBUl9DT0xPUk1BUCA9ICEhbWF0ZXJpYWwuc3BlY3VsYXJDb2xvck1hcDsKICAgIGNvbnN0IEhBU19TUEVDVUxBUl9JTlRFTlNJVFlNQVAgPSAhIW1hdGVyaWFsLnNwZWN1bGFySW50ZW5zaXR5TWFwOwogICAgY29uc3QgSEFTX1RSQU5TTUlTU0lPTk1BUCA9IEhBU19UUkFOU01JU1NJT04gJiYgISFtYXRlcmlhbC50cmFuc21pc3Npb25NYXA7CiAgICBjb25zdCBIQVNfVEhJQ0tORVNTTUFQID0gSEFTX1RSQU5TTUlTU0lPTiAmJiAhIW1hdGVyaWFsLnRoaWNrbmVzc01hcDsKICAgIGNvbnN0IEhBU19HUkFESUVOVE1BUCA9ICEhbWF0ZXJpYWwuZ3JhZGllbnRNYXA7CiAgICBjb25zdCBIQVNfQUxQSEFNQVAgPSAhIW1hdGVyaWFsLmFscGhhTWFwOwogICAgY29uc3QgSEFTX0FMUEhBVEVTVCA9IG1hdGVyaWFsLmFscGhhVGVzdCA+IDA7CiAgICBjb25zdCBIQVNfQUxQSEFIQVNIID0gISFtYXRlcmlhbC5hbHBoYUhhc2g7CiAgICBjb25zdCBIQVNfRVhURU5TSU9OUyA9ICEhbWF0ZXJpYWwuZXh0ZW5zaW9uczsKICAgIGxldCB0b25lTWFwcGluZyA9IE5vVG9uZU1hcHBpbmc7CiAgICBpZiAobWF0ZXJpYWwudG9uZU1hcHBlZCkgewogICAgICBpZiAoY3VycmVudFJlbmRlclRhcmdldCA9PT0gbnVsbCB8fCBjdXJyZW50UmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgPT09IHRydWUpIHsKICAgICAgICB0b25lTWFwcGluZyA9IHJlbmRlcmVyLnRvbmVNYXBwaW5nOwogICAgICB9CiAgICB9CiAgICBjb25zdCBwYXJhbWV0ZXJzID0gewogICAgICBzaGFkZXJJRCwKICAgICAgc2hhZGVyVHlwZTogbWF0ZXJpYWwudHlwZSwKICAgICAgc2hhZGVyTmFtZTogbWF0ZXJpYWwubmFtZSwKICAgICAgdmVydGV4U2hhZGVyLAogICAgICBmcmFnbWVudFNoYWRlciwKICAgICAgZGVmaW5lczogbWF0ZXJpYWwuZGVmaW5lcywKICAgICAgY3VzdG9tVmVydGV4U2hhZGVySUQsCiAgICAgIGN1c3RvbUZyYWdtZW50U2hhZGVySUQsCiAgICAgIGlzUmF3U2hhZGVyTWF0ZXJpYWw6IG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgPT09IHRydWUsCiAgICAgIGdsc2xWZXJzaW9uOiBtYXRlcmlhbC5nbHNsVmVyc2lvbiwKICAgICAgcHJlY2lzaW9uLAogICAgICBiYXRjaGluZzogSVNfQkFUQ0hFRE1FU0gsCiAgICAgIGJhdGNoaW5nQ29sb3I6IElTX0JBVENIRURNRVNIICYmIG9iamVjdC5fY29sb3JzVGV4dHVyZSAhPT0gbnVsbCwKICAgICAgaW5zdGFuY2luZzogSVNfSU5TVEFOQ0VETUVTSCwKICAgICAgaW5zdGFuY2luZ0NvbG9yOiBJU19JTlNUQU5DRURNRVNIICYmIG9iamVjdC5pbnN0YW5jZUNvbG9yICE9PSBudWxsLAogICAgICBpbnN0YW5jaW5nTW9ycGg6IElTX0lOU1RBTkNFRE1FU0ggJiYgb2JqZWN0Lm1vcnBoVGV4dHVyZSAhPT0gbnVsbCwKICAgICAgc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogU1VQUE9SVFNfVkVSVEVYX1RFWFRVUkVTLAogICAgICBudW1NdWx0aXZpZXdWaWV3cywKICAgICAgb3V0cHV0Q29sb3JTcGFjZTogY3VycmVudFJlbmRlclRhcmdldCA9PT0gbnVsbCA/IHJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2UgOiBjdXJyZW50UmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgPT09IHRydWUgPyBjdXJyZW50UmVuZGVyVGFyZ2V0LnRleHR1cmUuY29sb3JTcGFjZSA6IExpbmVhclNSR0JDb2xvclNwYWNlLAogICAgICBhbHBoYVRvQ292ZXJhZ2U6ICEhbWF0ZXJpYWwuYWxwaGFUb0NvdmVyYWdlLAogICAgICBtYXA6IEhBU19NQVAsCiAgICAgIG1hdGNhcDogSEFTX01BVENBUCwKICAgICAgZW52TWFwOiBIQVNfRU5WTUFQLAogICAgICBlbnZNYXBNb2RlOiBIQVNfRU5WTUFQICYmIGVudk1hcC5tYXBwaW5nLAogICAgICBlbnZNYXBDdWJlVVZIZWlnaHQsCiAgICAgIGFvTWFwOiBIQVNfQU9NQVAsCiAgICAgIGxpZ2h0TWFwOiBIQVNfTElHSFRNQVAsCiAgICAgIGJ1bXBNYXA6IEhBU19CVU1QTUFQLAogICAgICBub3JtYWxNYXA6IEhBU19OT1JNQUxNQVAsCiAgICAgIGRpc3BsYWNlbWVudE1hcDogU1VQUE9SVFNfVkVSVEVYX1RFWFRVUkVTICYmIEhBU19ESVNQTEFDRU1FTlRNQVAsCiAgICAgIGVtaXNzaXZlTWFwOiBIQVNfRU1JU1NJVkVNQVAsCiAgICAgIG5vcm1hbE1hcE9iamVjdFNwYWNlOiBIQVNfTk9STUFMTUFQICYmIG1hdGVyaWFsLm5vcm1hbE1hcFR5cGUgPT09IE9iamVjdFNwYWNlTm9ybWFsTWFwLAogICAgICBub3JtYWxNYXBUYW5nZW50U3BhY2U6IEhBU19OT1JNQUxNQVAgJiYgbWF0ZXJpYWwubm9ybWFsTWFwVHlwZSA9PT0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwLAogICAgICBtZXRhbG5lc3NNYXA6IEhBU19NRVRBTE5FU1NNQVAsCiAgICAgIHJvdWdobmVzc01hcDogSEFTX1JPVUdITkVTU01BUCwKICAgICAgYW5pc290cm9weTogSEFTX0FOSVNPVFJPUFksCiAgICAgIGFuaXNvdHJvcHlNYXA6IEhBU19BTklTT1RST1BZTUFQLAogICAgICBjbGVhcmNvYXQ6IEhBU19DTEVBUkNPQVQsCiAgICAgIGNsZWFyY29hdE1hcDogSEFTX0NMRUFSQ09BVE1BUCwKICAgICAgY2xlYXJjb2F0Tm9ybWFsTWFwOiBIQVNfQ0xFQVJDT0FUX05PUk1BTE1BUCwKICAgICAgY2xlYXJjb2F0Um91Z2huZXNzTWFwOiBIQVNfQ0xFQVJDT0FUX1JPVUdITkVTU01BUCwKICAgICAgZGlzcGVyc2lvbjogSEFTX0RJU1BFUlNJT04sCiAgICAgIGlyaWRlc2NlbmNlOiBIQVNfSVJJREVTQ0VOQ0UsCiAgICAgIGlyaWRlc2NlbmNlTWFwOiBIQVNfSVJJREVTQ0VOQ0VNQVAsCiAgICAgIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwOiBIQVNfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQLAogICAgICBzaGVlbjogSEFTX1NIRUVOLAogICAgICBzaGVlbkNvbG9yTWFwOiBIQVNfU0hFRU5fQ09MT1JNQVAsCiAgICAgIHNoZWVuUm91Z2huZXNzTWFwOiBIQVNfU0hFRU5fUk9VR0hORVNTTUFQLAogICAgICBzcGVjdWxhck1hcDogSEFTX1NQRUNVTEFSTUFQLAogICAgICBzcGVjdWxhckNvbG9yTWFwOiBIQVNfU1BFQ1VMQVJfQ09MT1JNQVAsCiAgICAgIHNwZWN1bGFySW50ZW5zaXR5TWFwOiBIQVNfU1BFQ1VMQVJfSU5URU5TSVRZTUFQLAogICAgICB0cmFuc21pc3Npb246IEhBU19UUkFOU01JU1NJT04sCiAgICAgIHRyYW5zbWlzc2lvbk1hcDogSEFTX1RSQU5TTUlTU0lPTk1BUCwKICAgICAgdGhpY2tuZXNzTWFwOiBIQVNfVEhJQ0tORVNTTUFQLAogICAgICBncmFkaWVudE1hcDogSEFTX0dSQURJRU5UTUFQLAogICAgICBvcGFxdWU6IG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSBmYWxzZSAmJiBtYXRlcmlhbC5ibGVuZGluZyA9PT0gTm9ybWFsQmxlbmRpbmcgJiYgbWF0ZXJpYWwuYWxwaGFUb0NvdmVyYWdlID09PSBmYWxzZSwKICAgICAgYWxwaGFNYXA6IEhBU19BTFBIQU1BUCwKICAgICAgYWxwaGFUZXN0OiBIQVNfQUxQSEFURVNULAogICAgICBhbHBoYUhhc2g6IEhBU19BTFBIQUhBU0gsCiAgICAgIGNvbWJpbmU6IG1hdGVyaWFsLmNvbWJpbmUsCiAgICAgIG1hcFV2OiBIQVNfTUFQICYmIGdldENoYW5uZWwobWF0ZXJpYWwubWFwLmNoYW5uZWwpLAogICAgICBhb01hcFV2OiBIQVNfQU9NQVAgJiYgZ2V0Q2hhbm5lbChtYXRlcmlhbC5hb01hcC5jaGFubmVsKSwKICAgICAgbGlnaHRNYXBVdjogSEFTX0xJR0hUTUFQICYmIGdldENoYW5uZWwobWF0ZXJpYWwubGlnaHRNYXAuY2hhbm5lbCksCiAgICAgIGJ1bXBNYXBVdjogSEFTX0JVTVBNQVAgJiYgZ2V0Q2hhbm5lbChtYXRlcmlhbC5idW1wTWFwLmNoYW5uZWwpLAogICAgICBub3JtYWxNYXBVdjogSEFTX05PUk1BTE1BUCAmJiBnZXRDaGFubmVsKG1hdGVyaWFsLm5vcm1hbE1hcC5jaGFubmVsKSwKICAgICAgZGlzcGxhY2VtZW50TWFwVXY6IEhBU19ESVNQTEFDRU1FTlRNQVAgJiYgZ2V0Q2hhbm5lbChtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAuY2hhbm5lbCksCiAgICAgIGVtaXNzaXZlTWFwVXY6IEhBU19FTUlTU0lWRU1BUCAmJiBnZXRDaGFubmVsKG1hdGVyaWFsLmVtaXNzaXZlTWFwLmNoYW5uZWwpLAogICAgICBtZXRhbG5lc3NNYXBVdjogSEFTX01FVEFMTkVTU01BUCAmJiBnZXRDaGFubmVsKG1hdGVyaWFsLm1ldGFsbmVzc01hcC5jaGFubmVsKSwKICAgICAgcm91Z2huZXNzTWFwVXY6IEhBU19ST1VHSE5FU1NNQVAgJiYgZ2V0Q2hhbm5lbChtYXRlcmlhbC5yb3VnaG5lc3NNYXAuY2hhbm5lbCksCiAgICAgIGFuaXNvdHJvcHlNYXBVdjogSEFTX0FOSVNPVFJPUFlNQVAgJiYgZ2V0Q2hhbm5lbChtYXRlcmlhbC5hbmlzb3Ryb3B5TWFwLmNoYW5uZWwpLAogICAgICBjbGVhcmNvYXRNYXBVdjogSEFTX0NMRUFSQ09BVE1BUCAmJiBnZXRDaGFubmVsKG1hdGVyaWFsLmNsZWFyY29hdE1hcC5jaGFubmVsKSwKICAgICAgY2xlYXJjb2F0Tm9ybWFsTWFwVXY6IEhBU19DTEVBUkNPQVRfTk9STUFMTUFQICYmIGdldENoYW5uZWwobWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwLmNoYW5uZWwpLAogICAgICBjbGVhcmNvYXRSb3VnaG5lc3NNYXBVdjogSEFTX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAgJiYgZ2V0Q2hhbm5lbChtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAuY2hhbm5lbCksCiAgICAgIGlyaWRlc2NlbmNlTWFwVXY6IEhBU19JUklERVNDRU5DRU1BUCAmJiBnZXRDaGFubmVsKG1hdGVyaWFsLmlyaWRlc2NlbmNlTWFwLmNoYW5uZWwpLAogICAgICBpcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2OiBIQVNfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQICYmIGdldENoYW5uZWwobWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuY2hhbm5lbCksCiAgICAgIHNoZWVuQ29sb3JNYXBVdjogSEFTX1NIRUVOX0NPTE9STUFQICYmIGdldENoYW5uZWwobWF0ZXJpYWwuc2hlZW5Db2xvck1hcC5jaGFubmVsKSwKICAgICAgc2hlZW5Sb3VnaG5lc3NNYXBVdjogSEFTX1NIRUVOX1JPVUdITkVTU01BUCAmJiBnZXRDaGFubmVsKG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzTWFwLmNoYW5uZWwpLAogICAgICBzcGVjdWxhck1hcFV2OiBIQVNfU1BFQ1VMQVJNQVAgJiYgZ2V0Q2hhbm5lbChtYXRlcmlhbC5zcGVjdWxhck1hcC5jaGFubmVsKSwKICAgICAgc3BlY3VsYXJDb2xvck1hcFV2OiBIQVNfU1BFQ1VMQVJfQ09MT1JNQVAgJiYgZ2V0Q2hhbm5lbChtYXRlcmlhbC5zcGVjdWxhckNvbG9yTWFwLmNoYW5uZWwpLAogICAgICBzcGVjdWxhckludGVuc2l0eU1hcFV2OiBIQVNfU1BFQ1VMQVJfSU5URU5TSVRZTUFQICYmIGdldENoYW5uZWwobWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHlNYXAuY2hhbm5lbCksCiAgICAgIHRyYW5zbWlzc2lvbk1hcFV2OiBIQVNfVFJBTlNNSVNTSU9OTUFQICYmIGdldENoYW5uZWwobWF0ZXJpYWwudHJhbnNtaXNzaW9uTWFwLmNoYW5uZWwpLAogICAgICB0aGlja25lc3NNYXBVdjogSEFTX1RISUNLTkVTU01BUCAmJiBnZXRDaGFubmVsKG1hdGVyaWFsLnRoaWNrbmVzc01hcC5jaGFubmVsKSwKICAgICAgYWxwaGFNYXBVdjogSEFTX0FMUEhBTUFQICYmIGdldENoYW5uZWwobWF0ZXJpYWwuYWxwaGFNYXAuY2hhbm5lbCksCiAgICAgIHZlcnRleFRhbmdlbnRzOiAhIWdlb21ldHJ5LmF0dHJpYnV0ZXMudGFuZ2VudCAmJiAoSEFTX05PUk1BTE1BUCB8fCBIQVNfQU5JU09UUk9QWSksCiAgICAgIHZlcnRleENvbG9yczogbWF0ZXJpYWwudmVydGV4Q29sb3JzLAogICAgICB2ZXJ0ZXhBbHBoYXM6IG1hdGVyaWFsLnZlcnRleENvbG9ycyA9PT0gdHJ1ZSAmJiAhIWdlb21ldHJ5LmF0dHJpYnV0ZXMuY29sb3IgJiYgZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5pdGVtU2l6ZSA9PT0gNCwKICAgICAgcG9pbnRzVXZzOiBvYmplY3QuaXNQb2ludHMgPT09IHRydWUgJiYgISFnZW9tZXRyeS5hdHRyaWJ1dGVzLnV2ICYmIChIQVNfTUFQIHx8IEhBU19BTFBIQU1BUCksCiAgICAgIGZvZzogISFmb2csCiAgICAgIHVzZUZvZzogbWF0ZXJpYWwuZm9nID09PSB0cnVlLAogICAgICBmb2dFeHAyOiAhIWZvZyAmJiBmb2cuaXNGb2dFeHAyLAogICAgICBmbGF0U2hhZGluZzogbWF0ZXJpYWwuZmxhdFNoYWRpbmcgPT09IHRydWUsCiAgICAgIHNpemVBdHRlbnVhdGlvbjogbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uID09PSB0cnVlLAogICAgICBsb2dhcml0aG1pY0RlcHRoQnVmZmVyLAogICAgICByZXZlcnNlRGVwdGhCdWZmZXIsCiAgICAgIHNraW5uaW5nOiBvYmplY3QuaXNTa2lubmVkTWVzaCA9PT0gdHJ1ZSwKICAgICAgbW9ycGhUYXJnZXRzOiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gIT09IHVuZGVmaW5lZCwKICAgICAgbW9ycGhOb3JtYWxzOiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsICE9PSB1bmRlZmluZWQsCiAgICAgIG1vcnBoQ29sb3JzOiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3IgIT09IHVuZGVmaW5lZCwKICAgICAgbW9ycGhUYXJnZXRzQ291bnQsCiAgICAgIG1vcnBoVGV4dHVyZVN0cmlkZSwKICAgICAgbnVtRGlyTGlnaHRzOiBsaWdodHMuZGlyZWN0aW9uYWwubGVuZ3RoLAogICAgICBudW1Qb2ludExpZ2h0czogbGlnaHRzLnBvaW50Lmxlbmd0aCwKICAgICAgbnVtU3BvdExpZ2h0czogbGlnaHRzLnNwb3QubGVuZ3RoLAogICAgICBudW1TcG90TGlnaHRNYXBzOiBsaWdodHMuc3BvdExpZ2h0TWFwLmxlbmd0aCwKICAgICAgbnVtUmVjdEFyZWFMaWdodHM6IGxpZ2h0cy5yZWN0QXJlYS5sZW5ndGgsCiAgICAgIG51bUhlbWlMaWdodHM6IGxpZ2h0cy5oZW1pLmxlbmd0aCwKICAgICAgbnVtRGlyTGlnaHRTaGFkb3dzOiBsaWdodHMuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoLAogICAgICBudW1Qb2ludExpZ2h0U2hhZG93czogbGlnaHRzLnBvaW50U2hhZG93TWFwLmxlbmd0aCwKICAgICAgbnVtU3BvdExpZ2h0U2hhZG93czogbGlnaHRzLnNwb3RTaGFkb3dNYXAubGVuZ3RoLAogICAgICBudW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHM6IGxpZ2h0cy5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHMsCiAgICAgIG51bUxpZ2h0UHJvYmVzOiBsaWdodHMubnVtTGlnaHRQcm9iZXMsCiAgICAgIG51bUNsaXBwaW5nUGxhbmVzOiBjbGlwcGluZy5udW1QbGFuZXMsCiAgICAgIG51bUNsaXBJbnRlcnNlY3Rpb246IGNsaXBwaW5nLm51bUludGVyc2VjdGlvbiwKICAgICAgZGl0aGVyaW5nOiBtYXRlcmlhbC5kaXRoZXJpbmcsCiAgICAgIHNoYWRvd01hcEVuYWJsZWQ6IHJlbmRlcmVyLnNoYWRvd01hcC5lbmFibGVkICYmIHNoYWRvd3MubGVuZ3RoID4gMCwKICAgICAgc2hhZG93TWFwVHlwZTogcmVuZGVyZXIuc2hhZG93TWFwLnR5cGUsCiAgICAgIHRvbmVNYXBwaW5nLAogICAgICBkZWNvZGVWaWRlb1RleHR1cmU6IEhBU19NQVAgJiYgbWF0ZXJpYWwubWFwLmlzVmlkZW9UZXh0dXJlID09PSB0cnVlICYmIENvbG9yTWFuYWdlbWVudC5nZXRUcmFuc2ZlcihtYXRlcmlhbC5tYXAuY29sb3JTcGFjZSkgPT09IFNSR0JUcmFuc2ZlciwKICAgICAgZGVjb2RlVmlkZW9UZXh0dXJlRW1pc3NpdmU6IEhBU19FTUlTU0lWRU1BUCAmJiBtYXRlcmlhbC5lbWlzc2l2ZU1hcC5pc1ZpZGVvVGV4dHVyZSA9PT0gdHJ1ZSAmJiBDb2xvck1hbmFnZW1lbnQuZ2V0VHJhbnNmZXIobWF0ZXJpYWwuZW1pc3NpdmVNYXAuY29sb3JTcGFjZSkgPT09IFNSR0JUcmFuc2ZlciwKICAgICAgcHJlbXVsdGlwbGllZEFscGhhOiBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEsCiAgICAgIGRvdWJsZVNpZGVkOiBtYXRlcmlhbC5zaWRlID09PSBEb3VibGVTaWRlLAogICAgICBmbGlwU2lkZWQ6IG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlLAogICAgICB1c2VEZXB0aFBhY2tpbmc6IG1hdGVyaWFsLmRlcHRoUGFja2luZyA+PSAwLAogICAgICBkZXB0aFBhY2tpbmc6IG1hdGVyaWFsLmRlcHRoUGFja2luZyB8fCAwLAogICAgICBpbmRleDBBdHRyaWJ1dGVOYW1lOiBtYXRlcmlhbC5pbmRleDBBdHRyaWJ1dGVOYW1lLAogICAgICBleHRlbnNpb25DbGlwQ3VsbERpc3RhbmNlOiBIQVNfRVhURU5TSU9OUyAmJiBtYXRlcmlhbC5leHRlbnNpb25zLmNsaXBDdWxsRGlzdGFuY2UgPT09IHRydWUgJiYgZXh0ZW5zaW9ucy5oYXMoIldFQkdMX2NsaXBfY3VsbF9kaXN0YW5jZSIpLAogICAgICBleHRlbnNpb25NdWx0aURyYXc6IChIQVNfRVhURU5TSU9OUyAmJiBtYXRlcmlhbC5leHRlbnNpb25zLm11bHRpRHJhdyA9PT0gdHJ1ZSB8fCBJU19CQVRDSEVETUVTSCkgJiYgZXh0ZW5zaW9ucy5oYXMoIldFQkdMX211bHRpX2RyYXciKSwKICAgICAgcmVuZGVyZXJFeHRlbnNpb25QYXJhbGxlbFNoYWRlckNvbXBpbGU6IGV4dGVuc2lvbnMuaGFzKCJLSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGUiKSwKICAgICAgY3VzdG9tUHJvZ3JhbUNhY2hlS2V5OiBtYXRlcmlhbC5jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKQogICAgfTsKICAgIHBhcmFtZXRlcnMudmVydGV4VXYxcyA9IF9hY3RpdmVDaGFubmVscy5oYXMoMSk7CiAgICBwYXJhbWV0ZXJzLnZlcnRleFV2MnMgPSBfYWN0aXZlQ2hhbm5lbHMuaGFzKDIpOwogICAgcGFyYW1ldGVycy52ZXJ0ZXhVdjNzID0gX2FjdGl2ZUNoYW5uZWxzLmhhcygzKTsKICAgIF9hY3RpdmVDaGFubmVscy5jbGVhcigpOwogICAgcmV0dXJuIHBhcmFtZXRlcnM7CiAgfQogIGZ1bmN0aW9uIGdldFByb2dyYW1DYWNoZUtleShwYXJhbWV0ZXJzKSB7CiAgICBjb25zdCBhcnJheSA9IFtdOwogICAgaWYgKHBhcmFtZXRlcnMuc2hhZGVySUQpIHsKICAgICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLnNoYWRlcklEKTsKICAgIH0gZWxzZSB7CiAgICAgIGFycmF5LnB1c2gocGFyYW1ldGVycy5jdXN0b21WZXJ0ZXhTaGFkZXJJRCk7CiAgICAgIGFycmF5LnB1c2gocGFyYW1ldGVycy5jdXN0b21GcmFnbWVudFNoYWRlcklEKTsKICAgIH0KICAgIGlmIChwYXJhbWV0ZXJzLmRlZmluZXMgIT09IHVuZGVmaW5lZCkgewogICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gcGFyYW1ldGVycy5kZWZpbmVzKSB7CiAgICAgICAgYXJyYXkucHVzaChuYW1lKTsKICAgICAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMuZGVmaW5lc1tuYW1lXSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChwYXJhbWV0ZXJzLmlzUmF3U2hhZGVyTWF0ZXJpYWwgPT09IGZhbHNlKSB7CiAgICAgIGdldFByb2dyYW1DYWNoZUtleVBhcmFtZXRlcnMoYXJyYXksIHBhcmFtZXRlcnMpOwogICAgICBnZXRQcm9ncmFtQ2FjaGVLZXlCb29sZWFucyhhcnJheSwgcGFyYW1ldGVycyk7CiAgICAgIGFycmF5LnB1c2gocmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZSk7CiAgICB9CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMuY3VzdG9tUHJvZ3JhbUNhY2hlS2V5KTsKICAgIHJldHVybiBhcnJheS5qb2luKCk7CiAgfQogIGZ1bmN0aW9uIGdldFByb2dyYW1DYWNoZUtleVBhcmFtZXRlcnMoYXJyYXksIHBhcmFtZXRlcnMpIHsKICAgIGFycmF5LnB1c2gocGFyYW1ldGVycy5wcmVjaXNpb24pOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLm91dHB1dENvbG9yU3BhY2UpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLmVudk1hcE1vZGUpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLmVudk1hcEN1YmVVVkhlaWdodCk7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMubWFwVXYpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLmFscGhhTWFwVXYpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLmxpZ2h0TWFwVXYpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLmFvTWFwVXYpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLmJ1bXBNYXBVdik7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMubm9ybWFsTWFwVXYpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLmRpc3BsYWNlbWVudE1hcFV2KTsKICAgIGFycmF5LnB1c2gocGFyYW1ldGVycy5lbWlzc2l2ZU1hcFV2KTsKICAgIGFycmF5LnB1c2gocGFyYW1ldGVycy5tZXRhbG5lc3NNYXBVdik7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMucm91Z2huZXNzTWFwVXYpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLmFuaXNvdHJvcHlNYXBVdik7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMuY2xlYXJjb2F0TWFwVXYpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLmNsZWFyY29hdE5vcm1hbE1hcFV2KTsKICAgIGFycmF5LnB1c2gocGFyYW1ldGVycy5jbGVhcmNvYXRSb3VnaG5lc3NNYXBVdik7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMuaXJpZGVzY2VuY2VNYXBVdik7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdik7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMuc2hlZW5Db2xvck1hcFV2KTsKICAgIGFycmF5LnB1c2gocGFyYW1ldGVycy5zaGVlblJvdWdobmVzc01hcFV2KTsKICAgIGFycmF5LnB1c2gocGFyYW1ldGVycy5zcGVjdWxhck1hcFV2KTsKICAgIGFycmF5LnB1c2gocGFyYW1ldGVycy5zcGVjdWxhckNvbG9yTWFwVXYpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLnNwZWN1bGFySW50ZW5zaXR5TWFwVXYpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLnRyYW5zbWlzc2lvbk1hcFV2KTsKICAgIGFycmF5LnB1c2gocGFyYW1ldGVycy50aGlja25lc3NNYXBVdik7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMuY29tYmluZSk7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMuZm9nRXhwMik7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMuc2l6ZUF0dGVudWF0aW9uKTsKICAgIGFycmF5LnB1c2gocGFyYW1ldGVycy5tb3JwaFRhcmdldHNDb3VudCk7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMubW9ycGhBdHRyaWJ1dGVDb3VudCk7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMubnVtRGlyTGlnaHRzKTsKICAgIGFycmF5LnB1c2gocGFyYW1ldGVycy5udW1Qb2ludExpZ2h0cyk7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0cyk7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0TWFwcyk7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMubnVtSGVtaUxpZ2h0cyk7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMubnVtUmVjdEFyZWFMaWdodHMpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLm51bURpckxpZ2h0U2hhZG93cyk7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMubnVtUG9pbnRMaWdodFNoYWRvd3MpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLm51bVNwb3RMaWdodFNoYWRvd3MpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLm51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwcyk7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMubnVtTGlnaHRQcm9iZXMpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLnNoYWRvd01hcFR5cGUpOwogICAgYXJyYXkucHVzaChwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nKTsKICAgIGFycmF5LnB1c2gocGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcyk7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMubnVtQ2xpcEludGVyc2VjdGlvbik7CiAgICBhcnJheS5wdXNoKHBhcmFtZXRlcnMuZGVwdGhQYWNraW5nKTsKICB9CiAgZnVuY3Rpb24gZ2V0UHJvZ3JhbUNhY2hlS2V5Qm9vbGVhbnMoYXJyYXksIHBhcmFtZXRlcnMpIHsKICAgIF9wcm9ncmFtTGF5ZXJzLmRpc2FibGVBbGwoKTsKICAgIGlmIChwYXJhbWV0ZXJzLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMpCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSgwKTsKICAgIGlmIChwYXJhbWV0ZXJzLmluc3RhbmNpbmcpCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSgxKTsKICAgIGlmIChwYXJhbWV0ZXJzLmluc3RhbmNpbmdDb2xvcikKICAgICAgX3Byb2dyYW1MYXllcnMuZW5hYmxlKDIpOwogICAgaWYgKHBhcmFtZXRlcnMuaW5zdGFuY2luZ01vcnBoKQogICAgICBfcHJvZ3JhbUxheWVycy5lbmFibGUoMyk7CiAgICBpZiAocGFyYW1ldGVycy5tYXRjYXApCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSg0KTsKICAgIGlmIChwYXJhbWV0ZXJzLmVudk1hcCkKICAgICAgX3Byb2dyYW1MYXllcnMuZW5hYmxlKDUpOwogICAgaWYgKHBhcmFtZXRlcnMubm9ybWFsTWFwT2JqZWN0U3BhY2UpCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSg2KTsKICAgIGlmIChwYXJhbWV0ZXJzLm5vcm1hbE1hcFRhbmdlbnRTcGFjZSkKICAgICAgX3Byb2dyYW1MYXllcnMuZW5hYmxlKDcpOwogICAgaWYgKHBhcmFtZXRlcnMuY2xlYXJjb2F0KQogICAgICBfcHJvZ3JhbUxheWVycy5lbmFibGUoOCk7CiAgICBpZiAocGFyYW1ldGVycy5pcmlkZXNjZW5jZSkKICAgICAgX3Byb2dyYW1MYXllcnMuZW5hYmxlKDkpOwogICAgaWYgKHBhcmFtZXRlcnMuYWxwaGFUZXN0KQogICAgICBfcHJvZ3JhbUxheWVycy5lbmFibGUoMTApOwogICAgaWYgKHBhcmFtZXRlcnMudmVydGV4Q29sb3JzKQogICAgICBfcHJvZ3JhbUxheWVycy5lbmFibGUoMTEpOwogICAgaWYgKHBhcmFtZXRlcnMudmVydGV4QWxwaGFzKQogICAgICBfcHJvZ3JhbUxheWVycy5lbmFibGUoMTIpOwogICAgaWYgKHBhcmFtZXRlcnMudmVydGV4VXYxcykKICAgICAgX3Byb2dyYW1MYXllcnMuZW5hYmxlKDEzKTsKICAgIGlmIChwYXJhbWV0ZXJzLnZlcnRleFV2MnMpCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSgxNCk7CiAgICBpZiAocGFyYW1ldGVycy52ZXJ0ZXhVdjNzKQogICAgICBfcHJvZ3JhbUxheWVycy5lbmFibGUoMTUpOwogICAgaWYgKHBhcmFtZXRlcnMudmVydGV4VGFuZ2VudHMpCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSgxNik7CiAgICBpZiAocGFyYW1ldGVycy5hbmlzb3Ryb3B5KQogICAgICBfcHJvZ3JhbUxheWVycy5lbmFibGUoMTcpOwogICAgaWYgKHBhcmFtZXRlcnMuYWxwaGFIYXNoKQogICAgICBfcHJvZ3JhbUxheWVycy5lbmFibGUoMTgpOwogICAgaWYgKHBhcmFtZXRlcnMuYmF0Y2hpbmcpCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSgxOSk7CiAgICBpZiAocGFyYW1ldGVycy5kaXNwZXJzaW9uKQogICAgICBfcHJvZ3JhbUxheWVycy5lbmFibGUoMjApOwogICAgaWYgKHBhcmFtZXRlcnMuYmF0Y2hpbmdDb2xvcikKICAgICAgX3Byb2dyYW1MYXllcnMuZW5hYmxlKDIxKTsKICAgIGFycmF5LnB1c2goX3Byb2dyYW1MYXllcnMubWFzayk7CiAgICBfcHJvZ3JhbUxheWVycy5kaXNhYmxlQWxsKCk7CiAgICBpZiAocGFyYW1ldGVycy5mb2cpCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSgwKTsKICAgIGlmIChwYXJhbWV0ZXJzLnVzZUZvZykKICAgICAgX3Byb2dyYW1MYXllcnMuZW5hYmxlKDEpOwogICAgaWYgKHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcpCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSgyKTsKICAgIGlmIChwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIpCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSgzKTsKICAgIGlmIChwYXJhbWV0ZXJzLnJldmVyc2VEZXB0aEJ1ZmZlcikKICAgICAgX3Byb2dyYW1MYXllcnMuZW5hYmxlKDQpOwogICAgaWYgKHBhcmFtZXRlcnMuc2tpbm5pbmcpCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSg1KTsKICAgIGlmIChwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0cykKICAgICAgX3Byb2dyYW1MYXllcnMuZW5hYmxlKDYpOwogICAgaWYgKHBhcmFtZXRlcnMubW9ycGhOb3JtYWxzKQogICAgICBfcHJvZ3JhbUxheWVycy5lbmFibGUoNyk7CiAgICBpZiAocGFyYW1ldGVycy5tb3JwaENvbG9ycykKICAgICAgX3Byb2dyYW1MYXllcnMuZW5hYmxlKDgpOwogICAgaWYgKHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhKQogICAgICBfcHJvZ3JhbUxheWVycy5lbmFibGUoOSk7CiAgICBpZiAocGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkKQogICAgICBfcHJvZ3JhbUxheWVycy5lbmFibGUoMTApOwogICAgaWYgKHBhcmFtZXRlcnMuZG91YmxlU2lkZWQpCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSgxMSk7CiAgICBpZiAocGFyYW1ldGVycy5mbGlwU2lkZWQpCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSgxMik7CiAgICBpZiAocGFyYW1ldGVycy51c2VEZXB0aFBhY2tpbmcpCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSgxMyk7CiAgICBpZiAocGFyYW1ldGVycy5kaXRoZXJpbmcpCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSgxNCk7CiAgICBpZiAocGFyYW1ldGVycy50cmFuc21pc3Npb24pCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSgxNSk7CiAgICBpZiAocGFyYW1ldGVycy5zaGVlbikKICAgICAgX3Byb2dyYW1MYXllcnMuZW5hYmxlKDE2KTsKICAgIGlmIChwYXJhbWV0ZXJzLm9wYXF1ZSkKICAgICAgX3Byb2dyYW1MYXllcnMuZW5hYmxlKDE3KTsKICAgIGlmIChwYXJhbWV0ZXJzLnBvaW50c1V2cykKICAgICAgX3Byb2dyYW1MYXllcnMuZW5hYmxlKDE4KTsKICAgIGlmIChwYXJhbWV0ZXJzLmRlY29kZVZpZGVvVGV4dHVyZSkKICAgICAgX3Byb2dyYW1MYXllcnMuZW5hYmxlKDE5KTsKICAgIGlmIChwYXJhbWV0ZXJzLmRlY29kZVZpZGVvVGV4dHVyZUVtaXNzaXZlKQogICAgICBfcHJvZ3JhbUxheWVycy5lbmFibGUoMjApOwogICAgaWYgKHBhcmFtZXRlcnMuYWxwaGFUb0NvdmVyYWdlKQogICAgICBfcHJvZ3JhbUxheWVycy5lbmFibGUoMjEpOwogICAgaWYgKHBhcmFtZXRlcnMubnVtTXVsdGl2aWV3Vmlld3MpCiAgICAgIF9wcm9ncmFtTGF5ZXJzLmVuYWJsZSgyMSk7CiAgICBhcnJheS5wdXNoKF9wcm9ncmFtTGF5ZXJzLm1hc2spOwogIH0KICBmdW5jdGlvbiBnZXRVbmlmb3JtcyhtYXRlcmlhbCkgewogICAgY29uc3Qgc2hhZGVySUQgPSBzaGFkZXJJRHNbbWF0ZXJpYWwudHlwZV07CiAgICBsZXQgdW5pZm9ybXM7CiAgICBpZiAoc2hhZGVySUQpIHsKICAgICAgY29uc3Qgc2hhZGVyID0gU2hhZGVyTGliW3NoYWRlcklEXTsKICAgICAgdW5pZm9ybXMgPSBVbmlmb3Jtc1V0aWxzLmNsb25lKHNoYWRlci51bmlmb3Jtcyk7CiAgICB9IGVsc2UgewogICAgICB1bmlmb3JtcyA9IG1hdGVyaWFsLnVuaWZvcm1zOwogICAgfQogICAgcmV0dXJuIHVuaWZvcm1zOwogIH0KICBmdW5jdGlvbiBhY3F1aXJlUHJvZ3JhbShwYXJhbWV0ZXJzLCBjYWNoZUtleSkgewogICAgbGV0IHByb2dyYW07CiAgICBmb3IgKGxldCBwID0gMCwgcGwgPSBwcm9ncmFtcy5sZW5ndGg7cCA8IHBsOyBwKyspIHsKICAgICAgY29uc3QgcHJlZXhpc3RpbmdQcm9ncmFtID0gcHJvZ3JhbXNbcF07CiAgICAgIGlmIChwcmVleGlzdGluZ1Byb2dyYW0uY2FjaGVLZXkgPT09IGNhY2hlS2V5KSB7CiAgICAgICAgcHJvZ3JhbSA9IHByZWV4aXN0aW5nUHJvZ3JhbTsKICAgICAgICArK3Byb2dyYW0udXNlZFRpbWVzOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAocHJvZ3JhbSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHByb2dyYW0gPSBuZXcgV2ViR0xQcm9ncmFtKHJlbmRlcmVyLCBjYWNoZUtleSwgcGFyYW1ldGVycywgYmluZGluZ1N0YXRlcyk7CiAgICAgIHByb2dyYW1zLnB1c2gocHJvZ3JhbSk7CiAgICB9CiAgICByZXR1cm4gcHJvZ3JhbTsKICB9CiAgZnVuY3Rpb24gcmVsZWFzZVByb2dyYW0ocHJvZ3JhbSkgewogICAgaWYgKC0tcHJvZ3JhbS51c2VkVGltZXMgPT09IDApIHsKICAgICAgY29uc3QgaSA9IHByb2dyYW1zLmluZGV4T2YocHJvZ3JhbSk7CiAgICAgIHByb2dyYW1zW2ldID0gcHJvZ3JhbXNbcHJvZ3JhbXMubGVuZ3RoIC0gMV07CiAgICAgIHByb2dyYW1zLnBvcCgpOwogICAgICBwcm9ncmFtLmRlc3Ryb3koKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gcmVsZWFzZVNoYWRlckNhY2hlKG1hdGVyaWFsKSB7CiAgICBfY3VzdG9tU2hhZGVycy5yZW1vdmUobWF0ZXJpYWwpOwogIH0KICBmdW5jdGlvbiBkaXNwb3NlKCkgewogICAgX2N1c3RvbVNoYWRlcnMuZGlzcG9zZSgpOwogIH0KICByZXR1cm4gewogICAgZ2V0UGFyYW1ldGVycywKICAgIGdldFByb2dyYW1DYWNoZUtleSwKICAgIGdldFVuaWZvcm1zLAogICAgYWNxdWlyZVByb2dyYW0sCiAgICByZWxlYXNlUHJvZ3JhbSwKICAgIHJlbGVhc2VTaGFkZXJDYWNoZSwKICAgIHByb2dyYW1zLAogICAgZGlzcG9zZQogIH07Cn0KZnVuY3Rpb24gV2ViR0xQcm9wZXJ0aWVzKCkgewogIGxldCBwcm9wZXJ0aWVzID0gbmV3IFdlYWtNYXA7CiAgZnVuY3Rpb24gaGFzKG9iamVjdCkgewogICAgcmV0dXJuIHByb3BlcnRpZXMuaGFzKG9iamVjdCk7CiAgfQogIGZ1bmN0aW9uIGdldChvYmplY3QpIHsKICAgIGxldCBtYXAgPSBwcm9wZXJ0aWVzLmdldChvYmplY3QpOwogICAgaWYgKG1hcCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIG1hcCA9IHt9OwogICAgICBwcm9wZXJ0aWVzLnNldChvYmplY3QsIG1hcCk7CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KICBmdW5jdGlvbiByZW1vdmUob2JqZWN0KSB7CiAgICBwcm9wZXJ0aWVzLmRlbGV0ZShvYmplY3QpOwogIH0KICBmdW5jdGlvbiB1cGRhdGUob2JqZWN0LCBrZXksIHZhbHVlKSB7CiAgICBwcm9wZXJ0aWVzLmdldChvYmplY3QpW2tleV0gPSB2YWx1ZTsKICB9CiAgZnVuY3Rpb24gZGlzcG9zZSgpIHsKICAgIHByb3BlcnRpZXMgPSBuZXcgV2Vha01hcDsKICB9CiAgcmV0dXJuIHsKICAgIGhhcywKICAgIGdldCwKICAgIHJlbW92ZSwKICAgIHVwZGF0ZSwKICAgIGRpc3Bvc2UKICB9Owp9CmZ1bmN0aW9uIHBhaW50ZXJTb3J0U3RhYmxlKGEsIGIpIHsKICBpZiAoYS5ncm91cE9yZGVyICE9PSBiLmdyb3VwT3JkZXIpIHsKICAgIHJldHVybiBhLmdyb3VwT3JkZXIgLSBiLmdyb3VwT3JkZXI7CiAgfSBlbHNlIGlmIChhLnJlbmRlck9yZGVyICE9PSBiLnJlbmRlck9yZGVyKSB7CiAgICByZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7CiAgfSBlbHNlIGlmIChhLm1hdGVyaWFsLmlkICE9PSBiLm1hdGVyaWFsLmlkKSB7CiAgICByZXR1cm4gYS5tYXRlcmlhbC5pZCAtIGIubWF0ZXJpYWwuaWQ7CiAgfSBlbHNlIGlmIChhLnogIT09IGIueikgewogICAgcmV0dXJuIGEueiAtIGIuejsKICB9IGVsc2UgewogICAgcmV0dXJuIGEuaWQgLSBiLmlkOwogIH0KfQpmdW5jdGlvbiByZXZlcnNlUGFpbnRlclNvcnRTdGFibGUoYSwgYikgewogIGlmIChhLmdyb3VwT3JkZXIgIT09IGIuZ3JvdXBPcmRlcikgewogICAgcmV0dXJuIGEuZ3JvdXBPcmRlciAtIGIuZ3JvdXBPcmRlcjsKICB9IGVsc2UgaWYgKGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIpIHsKICAgIHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjsKICB9IGVsc2UgaWYgKGEueiAhPT0gYi56KSB7CiAgICByZXR1cm4gYi56IC0gYS56OwogIH0gZWxzZSB7CiAgICByZXR1cm4gYS5pZCAtIGIuaWQ7CiAgfQp9CmZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdCgpIHsKICBjb25zdCByZW5kZXJJdGVtcyA9IFtdOwogIGxldCByZW5kZXJJdGVtc0luZGV4ID0gMDsKICBjb25zdCBvcGFxdWUgPSBbXTsKICBjb25zdCB0cmFuc21pc3NpdmUgPSBbXTsKICBjb25zdCB0cmFuc3BhcmVudCA9IFtdOwogIGZ1bmN0aW9uIGluaXQoKSB7CiAgICByZW5kZXJJdGVtc0luZGV4ID0gMDsKICAgIG9wYXF1ZS5sZW5ndGggPSAwOwogICAgdHJhbnNtaXNzaXZlLmxlbmd0aCA9IDA7CiAgICB0cmFuc3BhcmVudC5sZW5ndGggPSAwOwogIH0KICBmdW5jdGlvbiBnZXROZXh0UmVuZGVySXRlbShvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXApIHsKICAgIGxldCByZW5kZXJJdGVtID0gcmVuZGVySXRlbXNbcmVuZGVySXRlbXNJbmRleF07CiAgICBpZiAocmVuZGVySXRlbSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJlbmRlckl0ZW0gPSB7CiAgICAgICAgaWQ6IG9iamVjdC5pZCwKICAgICAgICBvYmplY3QsCiAgICAgICAgZ2VvbWV0cnksCiAgICAgICAgbWF0ZXJpYWwsCiAgICAgICAgZ3JvdXBPcmRlciwKICAgICAgICByZW5kZXJPcmRlcjogb2JqZWN0LnJlbmRlck9yZGVyLAogICAgICAgIHosCiAgICAgICAgZ3JvdXAKICAgICAgfTsKICAgICAgcmVuZGVySXRlbXNbcmVuZGVySXRlbXNJbmRleF0gPSByZW5kZXJJdGVtOwogICAgfSBlbHNlIHsKICAgICAgcmVuZGVySXRlbS5pZCA9IG9iamVjdC5pZDsKICAgICAgcmVuZGVySXRlbS5vYmplY3QgPSBvYmplY3Q7CiAgICAgIHJlbmRlckl0ZW0uZ2VvbWV0cnkgPSBnZW9tZXRyeTsKICAgICAgcmVuZGVySXRlbS5tYXRlcmlhbCA9IG1hdGVyaWFsOwogICAgICByZW5kZXJJdGVtLmdyb3VwT3JkZXIgPSBncm91cE9yZGVyOwogICAgICByZW5kZXJJdGVtLnJlbmRlck9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyOwogICAgICByZW5kZXJJdGVtLnogPSB6OwogICAgICByZW5kZXJJdGVtLmdyb3VwID0gZ3JvdXA7CiAgICB9CiAgICByZW5kZXJJdGVtc0luZGV4Kys7CiAgICByZXR1cm4gcmVuZGVySXRlbTsKICB9CiAgZnVuY3Rpb24gcHVzaChvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXApIHsKICAgIGNvbnN0IHJlbmRlckl0ZW0gPSBnZXROZXh0UmVuZGVySXRlbShvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXApOwogICAgaWYgKG1hdGVyaWFsLnRyYW5zbWlzc2lvbiA+IDApIHsKICAgICAgdHJhbnNtaXNzaXZlLnB1c2gocmVuZGVySXRlbSk7CiAgICB9IGVsc2UgaWYgKG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlKSB7CiAgICAgIHRyYW5zcGFyZW50LnB1c2gocmVuZGVySXRlbSk7CiAgICB9IGVsc2UgewogICAgICBvcGFxdWUucHVzaChyZW5kZXJJdGVtKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gdW5zaGlmdChvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXApIHsKICAgIGNvbnN0IHJlbmRlckl0ZW0gPSBnZXROZXh0UmVuZGVySXRlbShvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXApOwogICAgaWYgKG1hdGVyaWFsLnRyYW5zbWlzc2lvbiA+IDApIHsKICAgICAgdHJhbnNtaXNzaXZlLnVuc2hpZnQocmVuZGVySXRlbSk7CiAgICB9IGVsc2UgaWYgKG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlKSB7CiAgICAgIHRyYW5zcGFyZW50LnVuc2hpZnQocmVuZGVySXRlbSk7CiAgICB9IGVsc2UgewogICAgICBvcGFxdWUudW5zaGlmdChyZW5kZXJJdGVtKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gc29ydChjdXN0b21PcGFxdWVTb3J0LCBjdXN0b21UcmFuc3BhcmVudFNvcnQpIHsKICAgIGlmIChvcGFxdWUubGVuZ3RoID4gMSkKICAgICAgb3BhcXVlLnNvcnQoY3VzdG9tT3BhcXVlU29ydCB8fCBwYWludGVyU29ydFN0YWJsZSk7CiAgICBpZiAodHJhbnNtaXNzaXZlLmxlbmd0aCA+IDEpCiAgICAgIHRyYW5zbWlzc2l2ZS5zb3J0KGN1c3RvbVRyYW5zcGFyZW50U29ydCB8fCByZXZlcnNlUGFpbnRlclNvcnRTdGFibGUpOwogICAgaWYgKHRyYW5zcGFyZW50Lmxlbmd0aCA+IDEpCiAgICAgIHRyYW5zcGFyZW50LnNvcnQoY3VzdG9tVHJhbnNwYXJlbnRTb3J0IHx8IHJldmVyc2VQYWludGVyU29ydFN0YWJsZSk7CiAgfQogIGZ1bmN0aW9uIGZpbmlzaCgpIHsKICAgIGZvciAobGV0IGkgPSByZW5kZXJJdGVtc0luZGV4LCBpbCA9IHJlbmRlckl0ZW1zLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICBjb25zdCByZW5kZXJJdGVtID0gcmVuZGVySXRlbXNbaV07CiAgICAgIGlmIChyZW5kZXJJdGVtLmlkID09PSBudWxsKQogICAgICAgIGJyZWFrOwogICAgICByZW5kZXJJdGVtLmlkID0gbnVsbDsKICAgICAgcmVuZGVySXRlbS5vYmplY3QgPSBudWxsOwogICAgICByZW5kZXJJdGVtLmdlb21ldHJ5ID0gbnVsbDsKICAgICAgcmVuZGVySXRlbS5tYXRlcmlhbCA9IG51bGw7CiAgICAgIHJlbmRlckl0ZW0uZ3JvdXAgPSBudWxsOwogICAgfQogIH0KICByZXR1cm4gewogICAgb3BhcXVlLAogICAgdHJhbnNtaXNzaXZlLAogICAgdHJhbnNwYXJlbnQsCiAgICBpbml0LAogICAgcHVzaCwKICAgIHVuc2hpZnQsCiAgICBmaW5pc2gsCiAgICBzb3J0CiAgfTsKfQpmdW5jdGlvbiBXZWJHTFJlbmRlckxpc3RzKCkgewogIGxldCBsaXN0cyA9IG5ldyBXZWFrTWFwOwogIGZ1bmN0aW9uIGdldChzY2VuZSwgcmVuZGVyQ2FsbERlcHRoKSB7CiAgICBjb25zdCBsaXN0QXJyYXkgPSBsaXN0cy5nZXQoc2NlbmUpOwogICAgbGV0IGxpc3Q7CiAgICBpZiAobGlzdEFycmF5ID09PSB1bmRlZmluZWQpIHsKICAgICAgbGlzdCA9IG5ldyBXZWJHTFJlbmRlckxpc3Q7CiAgICAgIGxpc3RzLnNldChzY2VuZSwgW2xpc3RdKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChyZW5kZXJDYWxsRGVwdGggPj0gbGlzdEFycmF5Lmxlbmd0aCkgewogICAgICAgIGxpc3QgPSBuZXcgV2ViR0xSZW5kZXJMaXN0OwogICAgICAgIGxpc3RBcnJheS5wdXNoKGxpc3QpOwogICAgICB9IGVsc2UgewogICAgICAgIGxpc3QgPSBsaXN0QXJyYXlbcmVuZGVyQ2FsbERlcHRoXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGxpc3Q7CiAgfQogIGZ1bmN0aW9uIGRpc3Bvc2UoKSB7CiAgICBsaXN0cyA9IG5ldyBXZWFrTWFwOwogIH0KICByZXR1cm4gewogICAgZ2V0LAogICAgZGlzcG9zZQogIH07Cn0KZnVuY3Rpb24gVW5pZm9ybXNDYWNoZSgpIHsKICBjb25zdCBsaWdodHMgPSB7fTsKICByZXR1cm4gewogICAgZ2V0OiBmdW5jdGlvbihsaWdodCkgewogICAgICBpZiAobGlnaHRzW2xpZ2h0LmlkXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIGxpZ2h0c1tsaWdodC5pZF07CiAgICAgIH0KICAgICAgbGV0IHVuaWZvcm1zOwogICAgICBzd2l0Y2ggKGxpZ2h0LnR5cGUpIHsKICAgICAgICBjYXNlICJEaXJlY3Rpb25hbExpZ2h0IjoKICAgICAgICAgIHVuaWZvcm1zID0gewogICAgICAgICAgICBkaXJlY3Rpb246IG5ldyBWZWN0b3IzLAogICAgICAgICAgICBjb2xvcjogbmV3IENvbG9yCiAgICAgICAgICB9OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiU3BvdExpZ2h0IjoKICAgICAgICAgIHVuaWZvcm1zID0gewogICAgICAgICAgICBwb3NpdGlvbjogbmV3IFZlY3RvcjMsCiAgICAgICAgICAgIGRpcmVjdGlvbjogbmV3IFZlY3RvcjMsCiAgICAgICAgICAgIGNvbG9yOiBuZXcgQ29sb3IsCiAgICAgICAgICAgIGRpc3RhbmNlOiAwLAogICAgICAgICAgICBjb25lQ29zOiAwLAogICAgICAgICAgICBwZW51bWJyYUNvczogMCwKICAgICAgICAgICAgZGVjYXk6IDAKICAgICAgICAgIH07CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJQb2ludExpZ2h0IjoKICAgICAgICAgIHVuaWZvcm1zID0gewogICAgICAgICAgICBwb3NpdGlvbjogbmV3IFZlY3RvcjMsCiAgICAgICAgICAgIGNvbG9yOiBuZXcgQ29sb3IsCiAgICAgICAgICAgIGRpc3RhbmNlOiAwLAogICAgICAgICAgICBkZWNheTogMAogICAgICAgICAgfTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkhlbWlzcGhlcmVMaWdodCI6CiAgICAgICAgICB1bmlmb3JtcyA9IHsKICAgICAgICAgICAgZGlyZWN0aW9uOiBuZXcgVmVjdG9yMywKICAgICAgICAgICAgc2t5Q29sb3I6IG5ldyBDb2xvciwKICAgICAgICAgICAgZ3JvdW5kQ29sb3I6IG5ldyBDb2xvcgogICAgICAgICAgfTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlJlY3RBcmVhTGlnaHQiOgogICAgICAgICAgdW5pZm9ybXMgPSB7CiAgICAgICAgICAgIGNvbG9yOiBuZXcgQ29sb3IsCiAgICAgICAgICAgIHBvc2l0aW9uOiBuZXcgVmVjdG9yMywKICAgICAgICAgICAgaGFsZldpZHRoOiBuZXcgVmVjdG9yMywKICAgICAgICAgICAgaGFsZkhlaWdodDogbmV3IFZlY3RvcjMKICAgICAgICAgIH07CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBsaWdodHNbbGlnaHQuaWRdID0gdW5pZm9ybXM7CiAgICAgIHJldHVybiB1bmlmb3JtczsKICAgIH0KICB9Owp9CmZ1bmN0aW9uIFNoYWRvd1VuaWZvcm1zQ2FjaGUoKSB7CiAgY29uc3QgbGlnaHRzID0ge307CiAgcmV0dXJuIHsKICAgIGdldDogZnVuY3Rpb24obGlnaHQpIHsKICAgICAgaWYgKGxpZ2h0c1tsaWdodC5pZF0gIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybiBsaWdodHNbbGlnaHQuaWRdOwogICAgICB9CiAgICAgIGxldCB1bmlmb3JtczsKICAgICAgc3dpdGNoIChsaWdodC50eXBlKSB7CiAgICAgICAgY2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6CiAgICAgICAgICB1bmlmb3JtcyA9IHsKICAgICAgICAgICAgc2hhZG93SW50ZW5zaXR5OiAxLAogICAgICAgICAgICBzaGFkb3dCaWFzOiAwLAogICAgICAgICAgICBzaGFkb3dOb3JtYWxCaWFzOiAwLAogICAgICAgICAgICBzaGFkb3dSYWRpdXM6IDEsCiAgICAgICAgICAgIHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyCiAgICAgICAgICB9OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiU3BvdExpZ2h0IjoKICAgICAgICAgIHVuaWZvcm1zID0gewogICAgICAgICAgICBzaGFkb3dJbnRlbnNpdHk6IDEsCiAgICAgICAgICAgIHNoYWRvd0JpYXM6IDAsCiAgICAgICAgICAgIHNoYWRvd05vcm1hbEJpYXM6IDAsCiAgICAgICAgICAgIHNoYWRvd1JhZGl1czogMSwKICAgICAgICAgICAgc2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIKICAgICAgICAgIH07CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJQb2ludExpZ2h0IjoKICAgICAgICAgIHVuaWZvcm1zID0gewogICAgICAgICAgICBzaGFkb3dJbnRlbnNpdHk6IDEsCiAgICAgICAgICAgIHNoYWRvd0JpYXM6IDAsCiAgICAgICAgICAgIHNoYWRvd05vcm1hbEJpYXM6IDAsCiAgICAgICAgICAgIHNoYWRvd1JhZGl1czogMSwKICAgICAgICAgICAgc2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIsCiAgICAgICAgICAgIHNoYWRvd0NhbWVyYU5lYXI6IDEsCiAgICAgICAgICAgIHNoYWRvd0NhbWVyYUZhcjogMTAwMAogICAgICAgICAgfTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGxpZ2h0c1tsaWdodC5pZF0gPSB1bmlmb3JtczsKICAgICAgcmV0dXJuIHVuaWZvcm1zOwogICAgfQogIH07Cn0KZnVuY3Rpb24gc2hhZG93Q2FzdGluZ0FuZFRleHR1cmluZ0xpZ2h0c0ZpcnN0KGxpZ2h0QSwgbGlnaHRCKSB7CiAgcmV0dXJuIChsaWdodEIuY2FzdFNoYWRvdyA/IDIgOiAwKSAtIChsaWdodEEuY2FzdFNoYWRvdyA/IDIgOiAwKSArIChsaWdodEIubWFwID8gMSA6IDApIC0gKGxpZ2h0QS5tYXAgPyAxIDogMCk7Cn0KZnVuY3Rpb24gV2ViR0xMaWdodHMoZXh0ZW5zaW9ucykgewogIGNvbnN0IGNhY2hlID0gbmV3IFVuaWZvcm1zQ2FjaGU7CiAgY29uc3Qgc2hhZG93Q2FjaGUgPSBTaGFkb3dVbmlmb3Jtc0NhY2hlKCk7CiAgY29uc3Qgc3RhdGUgPSB7CiAgICB2ZXJzaW9uOiAwLAogICAgaGFzaDogewogICAgICBkaXJlY3Rpb25hbExlbmd0aDogLTEsCiAgICAgIHBvaW50TGVuZ3RoOiAtMSwKICAgICAgc3BvdExlbmd0aDogLTEsCiAgICAgIHJlY3RBcmVhTGVuZ3RoOiAtMSwKICAgICAgaGVtaUxlbmd0aDogLTEsCiAgICAgIG51bURpcmVjdGlvbmFsU2hhZG93czogLTEsCiAgICAgIG51bVBvaW50U2hhZG93czogLTEsCiAgICAgIG51bVNwb3RTaGFkb3dzOiAtMSwKICAgICAgbnVtU3BvdE1hcHM6IC0xLAogICAgICBudW1MaWdodFByb2JlczogLTEKICAgIH0sCiAgICBhbWJpZW50OiBbMCwgMCwgMF0sCiAgICBwcm9iZTogW10sCiAgICBkaXJlY3Rpb25hbDogW10sCiAgICBkaXJlY3Rpb25hbFNoYWRvdzogW10sCiAgICBkaXJlY3Rpb25hbFNoYWRvd01hcDogW10sCiAgICBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDogW10sCiAgICBzcG90OiBbXSwKICAgIHNwb3RMaWdodE1hcDogW10sCiAgICBzcG90U2hhZG93OiBbXSwKICAgIHNwb3RTaGFkb3dNYXA6IFtdLAogICAgc3BvdExpZ2h0TWF0cml4OiBbXSwKICAgIHJlY3RBcmVhOiBbXSwKICAgIHJlY3RBcmVhTFRDMTogbnVsbCwKICAgIHJlY3RBcmVhTFRDMjogbnVsbCwKICAgIHBvaW50OiBbXSwKICAgIHBvaW50U2hhZG93OiBbXSwKICAgIHBvaW50U2hhZG93TWFwOiBbXSwKICAgIHBvaW50U2hhZG93TWF0cml4OiBbXSwKICAgIGhlbWk6IFtdLAogICAgbnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzOiAwLAogICAgbnVtTGlnaHRQcm9iZXM6IDAKICB9OwogIGZvciAobGV0IGkgPSAwO2kgPCA5OyBpKyspCiAgICBzdGF0ZS5wcm9iZS5wdXNoKG5ldyBWZWN0b3IzKTsKICBjb25zdCB2ZWN0b3IzID0gbmV3IFZlY3RvcjM7CiAgY29uc3QgbWF0cml4NCA9IG5ldyBNYXRyaXg0OwogIGNvbnN0IG1hdHJpeDQyID0gbmV3IE1hdHJpeDQ7CiAgZnVuY3Rpb24gc2V0dXAobGlnaHRzKSB7CiAgICBsZXQgciA9IDAsIGcgPSAwLCBiID0gMDsKICAgIGZvciAobGV0IGkgPSAwO2kgPCA5OyBpKyspCiAgICAgIHN0YXRlLnByb2JlW2ldLnNldCgwLCAwLCAwKTsKICAgIGxldCBkaXJlY3Rpb25hbExlbmd0aCA9IDA7CiAgICBsZXQgcG9pbnRMZW5ndGggPSAwOwogICAgbGV0IHNwb3RMZW5ndGggPSAwOwogICAgbGV0IHJlY3RBcmVhTGVuZ3RoID0gMDsKICAgIGxldCBoZW1pTGVuZ3RoID0gMDsKICAgIGxldCBudW1EaXJlY3Rpb25hbFNoYWRvd3MgPSAwOwogICAgbGV0IG51bVBvaW50U2hhZG93cyA9IDA7CiAgICBsZXQgbnVtU3BvdFNoYWRvd3MgPSAwOwogICAgbGV0IG51bVNwb3RNYXBzID0gMDsKICAgIGxldCBudW1TcG90U2hhZG93c1dpdGhNYXBzID0gMDsKICAgIGxldCBudW1MaWdodFByb2JlcyA9IDA7CiAgICBsaWdodHMuc29ydChzaGFkb3dDYXN0aW5nQW5kVGV4dHVyaW5nTGlnaHRzRmlyc3QpOwogICAgZm9yIChsZXQgaSA9IDAsIGwgPSBsaWdodHMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgY29uc3QgbGlnaHQgPSBsaWdodHNbaV07CiAgICAgIGNvbnN0IGNvbG9yID0gbGlnaHQuY29sb3I7CiAgICAgIGNvbnN0IGludGVuc2l0eSA9IGxpZ2h0LmludGVuc2l0eTsKICAgICAgY29uc3QgZGlzdGFuY2UgPSBsaWdodC5kaXN0YW5jZTsKICAgICAgY29uc3Qgc2hhZG93TWFwID0gbGlnaHQuc2hhZG93ICYmIGxpZ2h0LnNoYWRvdy5tYXAgPyBsaWdodC5zaGFkb3cubWFwLnRleHR1cmUgOiBudWxsOwogICAgICBpZiAobGlnaHQuaXNBbWJpZW50TGlnaHQpIHsKICAgICAgICByICs9IGNvbG9yLnIgKiBpbnRlbnNpdHk7CiAgICAgICAgZyArPSBjb2xvci5nICogaW50ZW5zaXR5OwogICAgICAgIGIgKz0gY29sb3IuYiAqIGludGVuc2l0eTsKICAgICAgfSBlbHNlIGlmIChsaWdodC5pc0xpZ2h0UHJvYmUpIHsKICAgICAgICBmb3IgKGxldCBqID0gMDtqIDwgOTsgaisrKSB7CiAgICAgICAgICBzdGF0ZS5wcm9iZVtqXS5hZGRTY2FsZWRWZWN0b3IobGlnaHQuc2guY29lZmZpY2llbnRzW2pdLCBpbnRlbnNpdHkpOwogICAgICAgIH0KICAgICAgICBudW1MaWdodFByb2JlcysrOwogICAgICB9IGVsc2UgaWYgKGxpZ2h0LmlzRGlyZWN0aW9uYWxMaWdodCkgewogICAgICAgIGNvbnN0IHVuaWZvcm1zID0gY2FjaGUuZ2V0KGxpZ2h0KTsKICAgICAgICB1bmlmb3Jtcy5jb2xvci5jb3B5KGxpZ2h0LmNvbG9yKS5tdWx0aXBseVNjYWxhcihsaWdodC5pbnRlbnNpdHkpOwogICAgICAgIGlmIChsaWdodC5jYXN0U2hhZG93KSB7CiAgICAgICAgICBjb25zdCBzaGFkb3cgPSBsaWdodC5zaGFkb3c7CiAgICAgICAgICBjb25zdCBzaGFkb3dVbmlmb3JtcyA9IHNoYWRvd0NhY2hlLmdldChsaWdodCk7CiAgICAgICAgICBzaGFkb3dVbmlmb3Jtcy5zaGFkb3dJbnRlbnNpdHkgPSBzaGFkb3cuaW50ZW5zaXR5OwogICAgICAgICAgc2hhZG93VW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzOwogICAgICAgICAgc2hhZG93VW5pZm9ybXMuc2hhZG93Tm9ybWFsQmlhcyA9IHNoYWRvdy5ub3JtYWxCaWFzOwogICAgICAgICAgc2hhZG93VW5pZm9ybXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1czsKICAgICAgICAgIHNoYWRvd1VuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTsKICAgICAgICAgIHN0YXRlLmRpcmVjdGlvbmFsU2hhZG93W2RpcmVjdGlvbmFsTGVuZ3RoXSA9IHNoYWRvd1VuaWZvcm1zOwogICAgICAgICAgc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXBbZGlyZWN0aW9uYWxMZW5ndGhdID0gc2hhZG93TWFwOwogICAgICAgICAgc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbZGlyZWN0aW9uYWxMZW5ndGhdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDsKICAgICAgICAgIG51bURpcmVjdGlvbmFsU2hhZG93cysrOwogICAgICAgIH0KICAgICAgICBzdGF0ZS5kaXJlY3Rpb25hbFtkaXJlY3Rpb25hbExlbmd0aF0gPSB1bmlmb3JtczsKICAgICAgICBkaXJlY3Rpb25hbExlbmd0aCsrOwogICAgICB9IGVsc2UgaWYgKGxpZ2h0LmlzU3BvdExpZ2h0KSB7CiAgICAgICAgY29uc3QgdW5pZm9ybXMgPSBjYWNoZS5nZXQobGlnaHQpOwogICAgICAgIHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihsaWdodC5tYXRyaXhXb3JsZCk7CiAgICAgICAgdW5pZm9ybXMuY29sb3IuY29weShjb2xvcikubXVsdGlwbHlTY2FsYXIoaW50ZW5zaXR5KTsKICAgICAgICB1bmlmb3Jtcy5kaXN0YW5jZSA9IGRpc3RhbmNlOwogICAgICAgIHVuaWZvcm1zLmNvbmVDb3MgPSBNYXRoLmNvcyhsaWdodC5hbmdsZSk7CiAgICAgICAgdW5pZm9ybXMucGVudW1icmFDb3MgPSBNYXRoLmNvcyhsaWdodC5hbmdsZSAqICgxIC0gbGlnaHQucGVudW1icmEpKTsKICAgICAgICB1bmlmb3Jtcy5kZWNheSA9IGxpZ2h0LmRlY2F5OwogICAgICAgIHN0YXRlLnNwb3Rbc3BvdExlbmd0aF0gPSB1bmlmb3JtczsKICAgICAgICBjb25zdCBzaGFkb3cgPSBsaWdodC5zaGFkb3c7CiAgICAgICAgaWYgKGxpZ2h0Lm1hcCkgewogICAgICAgICAgc3RhdGUuc3BvdExpZ2h0TWFwW251bVNwb3RNYXBzXSA9IGxpZ2h0Lm1hcDsKICAgICAgICAgIG51bVNwb3RNYXBzKys7CiAgICAgICAgICBzaGFkb3cudXBkYXRlTWF0cmljZXMobGlnaHQpOwogICAgICAgICAgaWYgKGxpZ2h0LmNhc3RTaGFkb3cpCiAgICAgICAgICAgIG51bVNwb3RTaGFkb3dzV2l0aE1hcHMrKzsKICAgICAgICB9CiAgICAgICAgc3RhdGUuc3BvdExpZ2h0TWF0cml4W3Nwb3RMZW5ndGhdID0gc2hhZG93Lm1hdHJpeDsKICAgICAgICBpZiAobGlnaHQuY2FzdFNoYWRvdykgewogICAgICAgICAgY29uc3Qgc2hhZG93VW5pZm9ybXMgPSBzaGFkb3dDYWNoZS5nZXQobGlnaHQpOwogICAgICAgICAgc2hhZG93VW5pZm9ybXMuc2hhZG93SW50ZW5zaXR5ID0gc2hhZG93LmludGVuc2l0eTsKICAgICAgICAgIHNoYWRvd1VuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhczsKICAgICAgICAgIHNoYWRvd1VuaWZvcm1zLnNoYWRvd05vcm1hbEJpYXMgPSBzaGFkb3cubm9ybWFsQmlhczsKICAgICAgICAgIHNoYWRvd1VuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7CiAgICAgICAgICBzaGFkb3dVbmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7CiAgICAgICAgICBzdGF0ZS5zcG90U2hhZG93W3Nwb3RMZW5ndGhdID0gc2hhZG93VW5pZm9ybXM7CiAgICAgICAgICBzdGF0ZS5zcG90U2hhZG93TWFwW3Nwb3RMZW5ndGhdID0gc2hhZG93TWFwOwogICAgICAgICAgbnVtU3BvdFNoYWRvd3MrKzsKICAgICAgICB9CiAgICAgICAgc3BvdExlbmd0aCsrOwogICAgICB9IGVsc2UgaWYgKGxpZ2h0LmlzUmVjdEFyZWFMaWdodCkgewogICAgICAgIGNvbnN0IHVuaWZvcm1zID0gY2FjaGUuZ2V0KGxpZ2h0KTsKICAgICAgICB1bmlmb3Jtcy5jb2xvci5jb3B5KGNvbG9yKS5tdWx0aXBseVNjYWxhcihpbnRlbnNpdHkpOwogICAgICAgIHVuaWZvcm1zLmhhbGZXaWR0aC5zZXQobGlnaHQud2lkdGggKiAwLjUsIDAsIDApOwogICAgICAgIHVuaWZvcm1zLmhhbGZIZWlnaHQuc2V0KDAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMCk7CiAgICAgICAgc3RhdGUucmVjdEFyZWFbcmVjdEFyZWFMZW5ndGhdID0gdW5pZm9ybXM7CiAgICAgICAgcmVjdEFyZWFMZW5ndGgrKzsKICAgICAgfSBlbHNlIGlmIChsaWdodC5pc1BvaW50TGlnaHQpIHsKICAgICAgICBjb25zdCB1bmlmb3JtcyA9IGNhY2hlLmdldChsaWdodCk7CiAgICAgICAgdW5pZm9ybXMuY29sb3IuY29weShsaWdodC5jb2xvcikubXVsdGlwbHlTY2FsYXIobGlnaHQuaW50ZW5zaXR5KTsKICAgICAgICB1bmlmb3Jtcy5kaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNlOwogICAgICAgIHVuaWZvcm1zLmRlY2F5ID0gbGlnaHQuZGVjYXk7CiAgICAgICAgaWYgKGxpZ2h0LmNhc3RTaGFkb3cpIHsKICAgICAgICAgIGNvbnN0IHNoYWRvdyA9IGxpZ2h0LnNoYWRvdzsKICAgICAgICAgIGNvbnN0IHNoYWRvd1VuaWZvcm1zID0gc2hhZG93Q2FjaGUuZ2V0KGxpZ2h0KTsKICAgICAgICAgIHNoYWRvd1VuaWZvcm1zLnNoYWRvd0ludGVuc2l0eSA9IHNoYWRvdy5pbnRlbnNpdHk7CiAgICAgICAgICBzaGFkb3dVbmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7CiAgICAgICAgICBzaGFkb3dVbmlmb3Jtcy5zaGFkb3dOb3JtYWxCaWFzID0gc2hhZG93Lm5vcm1hbEJpYXM7CiAgICAgICAgICBzaGFkb3dVbmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzOwogICAgICAgICAgc2hhZG93VW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplOwogICAgICAgICAgc2hhZG93VW5pZm9ybXMuc2hhZG93Q2FtZXJhTmVhciA9IHNoYWRvdy5jYW1lcmEubmVhcjsKICAgICAgICAgIHNoYWRvd1VuaWZvcm1zLnNoYWRvd0NhbWVyYUZhciA9IHNoYWRvdy5jYW1lcmEuZmFyOwogICAgICAgICAgc3RhdGUucG9pbnRTaGFkb3dbcG9pbnRMZW5ndGhdID0gc2hhZG93VW5pZm9ybXM7CiAgICAgICAgICBzdGF0ZS5wb2ludFNoYWRvd01hcFtwb2ludExlbmd0aF0gPSBzaGFkb3dNYXA7CiAgICAgICAgICBzdGF0ZS5wb2ludFNoYWRvd01hdHJpeFtwb2ludExlbmd0aF0gPSBsaWdodC5zaGFkb3cubWF0cml4OwogICAgICAgICAgbnVtUG9pbnRTaGFkb3dzKys7CiAgICAgICAgfQogICAgICAgIHN0YXRlLnBvaW50W3BvaW50TGVuZ3RoXSA9IHVuaWZvcm1zOwogICAgICAgIHBvaW50TGVuZ3RoKys7CiAgICAgIH0gZWxzZSBpZiAobGlnaHQuaXNIZW1pc3BoZXJlTGlnaHQpIHsKICAgICAgICBjb25zdCB1bmlmb3JtcyA9IGNhY2hlLmdldChsaWdodCk7CiAgICAgICAgdW5pZm9ybXMuc2t5Q29sb3IuY29weShsaWdodC5jb2xvcikubXVsdGlwbHlTY2FsYXIoaW50ZW5zaXR5KTsKICAgICAgICB1bmlmb3Jtcy5ncm91bmRDb2xvci5jb3B5KGxpZ2h0Lmdyb3VuZENvbG9yKS5tdWx0aXBseVNjYWxhcihpbnRlbnNpdHkpOwogICAgICAgIHN0YXRlLmhlbWlbaGVtaUxlbmd0aF0gPSB1bmlmb3JtczsKICAgICAgICBoZW1pTGVuZ3RoKys7CiAgICAgIH0KICAgIH0KICAgIGlmIChyZWN0QXJlYUxlbmd0aCA+IDApIHsKICAgICAgaWYgKGV4dGVuc2lvbnMuaGFzKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKSA9PT0gdHJ1ZSkgewogICAgICAgIHN0YXRlLnJlY3RBcmVhTFRDMSA9IFVuaWZvcm1zTGliLkxUQ19GTE9BVF8xOwogICAgICAgIHN0YXRlLnJlY3RBcmVhTFRDMiA9IFVuaWZvcm1zTGliLkxUQ19GTE9BVF8yOwogICAgICB9IGVsc2UgewogICAgICAgIHN0YXRlLnJlY3RBcmVhTFRDMSA9IFVuaWZvcm1zTGliLkxUQ19IQUxGXzE7CiAgICAgICAgc3RhdGUucmVjdEFyZWFMVEMyID0gVW5pZm9ybXNMaWIuTFRDX0hBTEZfMjsKICAgICAgfQogICAgfQogICAgc3RhdGUuYW1iaWVudFswXSA9IHI7CiAgICBzdGF0ZS5hbWJpZW50WzFdID0gZzsKICAgIHN0YXRlLmFtYmllbnRbMl0gPSBiOwogICAgY29uc3QgaGFzaCA9IHN0YXRlLmhhc2g7CiAgICBpZiAoaGFzaC5kaXJlY3Rpb25hbExlbmd0aCAhPT0gZGlyZWN0aW9uYWxMZW5ndGggfHwgaGFzaC5wb2ludExlbmd0aCAhPT0gcG9pbnRMZW5ndGggfHwgaGFzaC5zcG90TGVuZ3RoICE9PSBzcG90TGVuZ3RoIHx8IGhhc2gucmVjdEFyZWFMZW5ndGggIT09IHJlY3RBcmVhTGVuZ3RoIHx8IGhhc2guaGVtaUxlbmd0aCAhPT0gaGVtaUxlbmd0aCB8fCBoYXNoLm51bURpcmVjdGlvbmFsU2hhZG93cyAhPT0gbnVtRGlyZWN0aW9uYWxTaGFkb3dzIHx8IGhhc2gubnVtUG9pbnRTaGFkb3dzICE9PSBudW1Qb2ludFNoYWRvd3MgfHwgaGFzaC5udW1TcG90U2hhZG93cyAhPT0gbnVtU3BvdFNoYWRvd3MgfHwgaGFzaC5udW1TcG90TWFwcyAhPT0gbnVtU3BvdE1hcHMgfHwgaGFzaC5udW1MaWdodFByb2JlcyAhPT0gbnVtTGlnaHRQcm9iZXMpIHsKICAgICAgc3RhdGUuZGlyZWN0aW9uYWwubGVuZ3RoID0gZGlyZWN0aW9uYWxMZW5ndGg7CiAgICAgIHN0YXRlLnNwb3QubGVuZ3RoID0gc3BvdExlbmd0aDsKICAgICAgc3RhdGUucmVjdEFyZWEubGVuZ3RoID0gcmVjdEFyZWFMZW5ndGg7CiAgICAgIHN0YXRlLnBvaW50Lmxlbmd0aCA9IHBvaW50TGVuZ3RoOwogICAgICBzdGF0ZS5oZW1pLmxlbmd0aCA9IGhlbWlMZW5ndGg7CiAgICAgIHN0YXRlLmRpcmVjdGlvbmFsU2hhZG93Lmxlbmd0aCA9IG51bURpcmVjdGlvbmFsU2hhZG93czsKICAgICAgc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoID0gbnVtRGlyZWN0aW9uYWxTaGFkb3dzOwogICAgICBzdGF0ZS5wb2ludFNoYWRvdy5sZW5ndGggPSBudW1Qb2ludFNoYWRvd3M7CiAgICAgIHN0YXRlLnBvaW50U2hhZG93TWFwLmxlbmd0aCA9IG51bVBvaW50U2hhZG93czsKICAgICAgc3RhdGUuc3BvdFNoYWRvdy5sZW5ndGggPSBudW1TcG90U2hhZG93czsKICAgICAgc3RhdGUuc3BvdFNoYWRvd01hcC5sZW5ndGggPSBudW1TcG90U2hhZG93czsKICAgICAgc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgubGVuZ3RoID0gbnVtRGlyZWN0aW9uYWxTaGFkb3dzOwogICAgICBzdGF0ZS5wb2ludFNoYWRvd01hdHJpeC5sZW5ndGggPSBudW1Qb2ludFNoYWRvd3M7CiAgICAgIHN0YXRlLnNwb3RMaWdodE1hdHJpeC5sZW5ndGggPSBudW1TcG90U2hhZG93cyArIG51bVNwb3RNYXBzIC0gbnVtU3BvdFNoYWRvd3NXaXRoTWFwczsKICAgICAgc3RhdGUuc3BvdExpZ2h0TWFwLmxlbmd0aCA9IG51bVNwb3RNYXBzOwogICAgICBzdGF0ZS5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHMgPSBudW1TcG90U2hhZG93c1dpdGhNYXBzOwogICAgICBzdGF0ZS5udW1MaWdodFByb2JlcyA9IG51bUxpZ2h0UHJvYmVzOwogICAgICBoYXNoLmRpcmVjdGlvbmFsTGVuZ3RoID0gZGlyZWN0aW9uYWxMZW5ndGg7CiAgICAgIGhhc2gucG9pbnRMZW5ndGggPSBwb2ludExlbmd0aDsKICAgICAgaGFzaC5zcG90TGVuZ3RoID0gc3BvdExlbmd0aDsKICAgICAgaGFzaC5yZWN0QXJlYUxlbmd0aCA9IHJlY3RBcmVhTGVuZ3RoOwogICAgICBoYXNoLmhlbWlMZW5ndGggPSBoZW1pTGVuZ3RoOwogICAgICBoYXNoLm51bURpcmVjdGlvbmFsU2hhZG93cyA9IG51bURpcmVjdGlvbmFsU2hhZG93czsKICAgICAgaGFzaC5udW1Qb2ludFNoYWRvd3MgPSBudW1Qb2ludFNoYWRvd3M7CiAgICAgIGhhc2gubnVtU3BvdFNoYWRvd3MgPSBudW1TcG90U2hhZG93czsKICAgICAgaGFzaC5udW1TcG90TWFwcyA9IG51bVNwb3RNYXBzOwogICAgICBoYXNoLm51bUxpZ2h0UHJvYmVzID0gbnVtTGlnaHRQcm9iZXM7CiAgICAgIHN0YXRlLnZlcnNpb24gPSBuZXh0VmVyc2lvbisrOwogICAgfQogIH0KICBmdW5jdGlvbiBzZXR1cFZpZXcobGlnaHRzLCBjYW1lcmEpIHsKICAgIGxldCBkaXJlY3Rpb25hbExlbmd0aCA9IDA7CiAgICBsZXQgcG9pbnRMZW5ndGggPSAwOwogICAgbGV0IHNwb3RMZW5ndGggPSAwOwogICAgbGV0IHJlY3RBcmVhTGVuZ3RoID0gMDsKICAgIGxldCBoZW1pTGVuZ3RoID0gMDsKICAgIGNvbnN0IHZpZXdNYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlOwogICAgZm9yIChsZXQgaSA9IDAsIGwgPSBsaWdodHMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgY29uc3QgbGlnaHQgPSBsaWdodHNbaV07CiAgICAgIGlmIChsaWdodC5pc0RpcmVjdGlvbmFsTGlnaHQpIHsKICAgICAgICBjb25zdCB1bmlmb3JtcyA9IHN0YXRlLmRpcmVjdGlvbmFsW2RpcmVjdGlvbmFsTGVuZ3RoXTsKICAgICAgICB1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGxpZ2h0Lm1hdHJpeFdvcmxkKTsKICAgICAgICB2ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbihsaWdodC50YXJnZXQubWF0cml4V29ybGQpOwogICAgICAgIHVuaWZvcm1zLmRpcmVjdGlvbi5zdWIodmVjdG9yMyk7CiAgICAgICAgdW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbih2aWV3TWF0cml4KTsKICAgICAgICBkaXJlY3Rpb25hbExlbmd0aCsrOwogICAgICB9IGVsc2UgaWYgKGxpZ2h0LmlzU3BvdExpZ2h0KSB7CiAgICAgICAgY29uc3QgdW5pZm9ybXMgPSBzdGF0ZS5zcG90W3Nwb3RMZW5ndGhdOwogICAgICAgIHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihsaWdodC5tYXRyaXhXb3JsZCk7CiAgICAgICAgdW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KHZpZXdNYXRyaXgpOwogICAgICAgIHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obGlnaHQubWF0cml4V29ybGQpOwogICAgICAgIHZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCk7CiAgICAgICAgdW5pZm9ybXMuZGlyZWN0aW9uLnN1Yih2ZWN0b3IzKTsKICAgICAgICB1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKHZpZXdNYXRyaXgpOwogICAgICAgIHNwb3RMZW5ndGgrKzsKICAgICAgfSBlbHNlIGlmIChsaWdodC5pc1JlY3RBcmVhTGlnaHQpIHsKICAgICAgICBjb25zdCB1bmlmb3JtcyA9IHN0YXRlLnJlY3RBcmVhW3JlY3RBcmVhTGVuZ3RoXTsKICAgICAgICB1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obGlnaHQubWF0cml4V29ybGQpOwogICAgICAgIHVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCh2aWV3TWF0cml4KTsKICAgICAgICBtYXRyaXg0Mi5pZGVudGl0eSgpOwogICAgICAgIG1hdHJpeDQuY29weShsaWdodC5tYXRyaXhXb3JsZCk7CiAgICAgICAgbWF0cml4NC5wcmVtdWx0aXBseSh2aWV3TWF0cml4KTsKICAgICAgICBtYXRyaXg0Mi5leHRyYWN0Um90YXRpb24obWF0cml4NCk7CiAgICAgICAgdW5pZm9ybXMuaGFsZldpZHRoLnNldChsaWdodC53aWR0aCAqIDAuNSwgMCwgMCk7CiAgICAgICAgdW5pZm9ybXMuaGFsZkhlaWdodC5zZXQoMCwgbGlnaHQuaGVpZ2h0ICogMC41LCAwKTsKICAgICAgICB1bmlmb3Jtcy5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KG1hdHJpeDQyKTsKICAgICAgICB1bmlmb3Jtcy5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NChtYXRyaXg0Mik7CiAgICAgICAgcmVjdEFyZWFMZW5ndGgrKzsKICAgICAgfSBlbHNlIGlmIChsaWdodC5pc1BvaW50TGlnaHQpIHsKICAgICAgICBjb25zdCB1bmlmb3JtcyA9IHN0YXRlLnBvaW50W3BvaW50TGVuZ3RoXTsKICAgICAgICB1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obGlnaHQubWF0cml4V29ybGQpOwogICAgICAgIHVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCh2aWV3TWF0cml4KTsKICAgICAgICBwb2ludExlbmd0aCsrOwogICAgICB9IGVsc2UgaWYgKGxpZ2h0LmlzSGVtaXNwaGVyZUxpZ2h0KSB7CiAgICAgICAgY29uc3QgdW5pZm9ybXMgPSBzdGF0ZS5oZW1pW2hlbWlMZW5ndGhdOwogICAgICAgIHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obGlnaHQubWF0cml4V29ybGQpOwogICAgICAgIHVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24odmlld01hdHJpeCk7CiAgICAgICAgaGVtaUxlbmd0aCsrOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiB7CiAgICBzZXR1cCwKICAgIHNldHVwVmlldywKICAgIHN0YXRlCiAgfTsKfQpmdW5jdGlvbiBXZWJHTFJlbmRlclN0YXRlKGV4dGVuc2lvbnMpIHsKICBjb25zdCBsaWdodHMgPSBuZXcgV2ViR0xMaWdodHMoZXh0ZW5zaW9ucyk7CiAgY29uc3QgbGlnaHRzQXJyYXkgPSBbXTsKICBjb25zdCBzaGFkb3dzQXJyYXkgPSBbXTsKICBmdW5jdGlvbiBpbml0KGNhbWVyYSkgewogICAgc3RhdGUuY2FtZXJhID0gY2FtZXJhOwogICAgbGlnaHRzQXJyYXkubGVuZ3RoID0gMDsKICAgIHNoYWRvd3NBcnJheS5sZW5ndGggPSAwOwogIH0KICBmdW5jdGlvbiBwdXNoTGlnaHQobGlnaHQpIHsKICAgIGxpZ2h0c0FycmF5LnB1c2gobGlnaHQpOwogIH0KICBmdW5jdGlvbiBwdXNoU2hhZG93KHNoYWRvd0xpZ2h0KSB7CiAgICBzaGFkb3dzQXJyYXkucHVzaChzaGFkb3dMaWdodCk7CiAgfQogIGZ1bmN0aW9uIHNldHVwTGlnaHRzKCkgewogICAgbGlnaHRzLnNldHVwKGxpZ2h0c0FycmF5KTsKICB9CiAgZnVuY3Rpb24gc2V0dXBMaWdodHNWaWV3KGNhbWVyYSkgewogICAgbGlnaHRzLnNldHVwVmlldyhsaWdodHNBcnJheSwgY2FtZXJhKTsKICB9CiAgY29uc3Qgc3RhdGUgPSB7CiAgICBsaWdodHNBcnJheSwKICAgIHNoYWRvd3NBcnJheSwKICAgIGNhbWVyYTogbnVsbCwKICAgIGxpZ2h0cywKICAgIHRyYW5zbWlzc2lvblJlbmRlclRhcmdldDoge30KICB9OwogIHJldHVybiB7CiAgICBpbml0LAogICAgc3RhdGUsCiAgICBzZXR1cExpZ2h0cywKICAgIHNldHVwTGlnaHRzVmlldywKICAgIHB1c2hMaWdodCwKICAgIHB1c2hTaGFkb3cKICB9Owp9CmZ1bmN0aW9uIFdlYkdMUmVuZGVyU3RhdGVzKGV4dGVuc2lvbnMpIHsKICBsZXQgcmVuZGVyU3RhdGVzID0gbmV3IFdlYWtNYXA7CiAgZnVuY3Rpb24gZ2V0KHNjZW5lLCByZW5kZXJDYWxsRGVwdGggPSAwKSB7CiAgICBjb25zdCByZW5kZXJTdGF0ZUFycmF5ID0gcmVuZGVyU3RhdGVzLmdldChzY2VuZSk7CiAgICBsZXQgcmVuZGVyU3RhdGU7CiAgICBpZiAocmVuZGVyU3RhdGVBcnJheSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJlbmRlclN0YXRlID0gbmV3IFdlYkdMUmVuZGVyU3RhdGUoZXh0ZW5zaW9ucyk7CiAgICAgIHJlbmRlclN0YXRlcy5zZXQoc2NlbmUsIFtyZW5kZXJTdGF0ZV0pOwogICAgfSBlbHNlIHsKICAgICAgaWYgKHJlbmRlckNhbGxEZXB0aCA+PSByZW5kZXJTdGF0ZUFycmF5Lmxlbmd0aCkgewogICAgICAgIHJlbmRlclN0YXRlID0gbmV3IFdlYkdMUmVuZGVyU3RhdGUoZXh0ZW5zaW9ucyk7CiAgICAgICAgcmVuZGVyU3RhdGVBcnJheS5wdXNoKHJlbmRlclN0YXRlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlQXJyYXlbcmVuZGVyQ2FsbERlcHRoXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlbmRlclN0YXRlOwogIH0KICBmdW5jdGlvbiBkaXNwb3NlKCkgewogICAgcmVuZGVyU3RhdGVzID0gbmV3IFdlYWtNYXA7CiAgfQogIHJldHVybiB7CiAgICBnZXQsCiAgICBkaXNwb3NlCiAgfTsKfQpmdW5jdGlvbiBXZWJHTFNoYWRvd01hcChyZW5kZXJlciwgb2JqZWN0cywgY2FwYWJpbGl0aWVzKSB7CiAgbGV0IF9mcnVzdHVtMiA9IG5ldyBGcnVzdHVtOwogIGNvbnN0IF9zaGFkb3dNYXBTaXplID0gbmV3IFZlY3RvcjIsIF92aWV3cG9ydFNpemUgPSBuZXcgVmVjdG9yMiwgX3ZpZXdwb3J0ID0gbmV3IFZlY3RvcjQsIF9kZXB0aE1hdGVyaWFsID0gbmV3IE1lc2hEZXB0aE1hdGVyaWFsKHsgZGVwdGhQYWNraW5nOiBSR0JBRGVwdGhQYWNraW5nIH0pLCBfZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBNZXNoRGlzdGFuY2VNYXRlcmlhbCwgX21hdGVyaWFsQ2FjaGUgPSB7fSwgX21heFRleHR1cmVTaXplID0gY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplOwogIGNvbnN0IHNoYWRvd1NpZGUgPSB7IFtGcm9udFNpZGVdOiBCYWNrU2lkZSwgW0JhY2tTaWRlXTogRnJvbnRTaWRlLCBbRG91YmxlU2lkZV06IERvdWJsZVNpZGUgfTsKICBjb25zdCBzaGFkb3dNYXRlcmlhbFZlcnRpY2FsID0gbmV3IFNoYWRlck1hdGVyaWFsKHsKICAgIGRlZmluZXM6IHsKICAgICAgVlNNX1NBTVBMRVM6IDgKICAgIH0sCiAgICB1bmlmb3JtczogewogICAgICBzaGFkb3dfcGFzczogeyB2YWx1ZTogbnVsbCB9LAogICAgICByZXNvbHV0aW9uOiB7IHZhbHVlOiBuZXcgVmVjdG9yMiB9LAogICAgICByYWRpdXM6IHsgdmFsdWU6IDQgfQogICAgfSwKICAgIHZlcnRleFNoYWRlcjogdmVydGV4LAogICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50CiAgfSk7CiAgY29uc3Qgc2hhZG93TWF0ZXJpYWxIb3Jpem9udGFsID0gc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbC5jbG9uZSgpOwogIHNoYWRvd01hdGVyaWFsSG9yaXpvbnRhbC5kZWZpbmVzLkhPUklaT05UQUxfUEFTUyA9IDE7CiAgY29uc3QgZnVsbFNjcmVlblRyaSA9IG5ldyBCdWZmZXJHZW9tZXRyeTsKICBmdWxsU2NyZWVuVHJpLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgQnVmZmVyQXR0cmlidXRlKG5ldyBGbG9hdDMyQXJyYXkoWy0xLCAtMSwgMC41LCAzLCAtMSwgMC41LCAtMSwgMywgMC41XSksIDMpKTsKICBjb25zdCBmdWxsU2NyZWVuTWVzaCA9IG5ldyBNZXNoKGZ1bGxTY3JlZW5UcmksIHNoYWRvd01hdGVyaWFsVmVydGljYWwpOwogIGNvbnN0IHNjb3BlID0gdGhpczsKICB0aGlzLmVuYWJsZWQgPSBmYWxzZTsKICB0aGlzLmF1dG9VcGRhdGUgPSB0cnVlOwogIHRoaXMubmVlZHNVcGRhdGUgPSBmYWxzZTsKICB0aGlzLnR5cGUgPSBQQ0ZTaGFkb3dNYXA7CiAgbGV0IF9wcmV2aW91c1R5cGUgPSB0aGlzLnR5cGU7CiAgdGhpcy5yZW5kZXIgPSBmdW5jdGlvbihsaWdodHMsIHNjZW5lLCBjYW1lcmEpIHsKICAgIGlmIChzY29wZS5lbmFibGVkID09PSBmYWxzZSkKICAgICAgcmV0dXJuOwogICAgaWYgKHNjb3BlLmF1dG9VcGRhdGUgPT09IGZhbHNlICYmIHNjb3BlLm5lZWRzVXBkYXRlID09PSBmYWxzZSkKICAgICAgcmV0dXJuOwogICAgaWYgKGxpZ2h0cy5sZW5ndGggPT09IDApCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTsKICAgIGNvbnN0IGFjdGl2ZUN1YmVGYWNlID0gcmVuZGVyZXIuZ2V0QWN0aXZlQ3ViZUZhY2UoKTsKICAgIGNvbnN0IGFjdGl2ZU1pcG1hcExldmVsID0gcmVuZGVyZXIuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKTsKICAgIGNvbnN0IF9zdGF0ZSA9IHJlbmRlcmVyLnN0YXRlOwogICAgX3N0YXRlLnNldEJsZW5kaW5nKE5vQmxlbmRpbmcpOwogICAgX3N0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoMSwgMSwgMSwgMSk7CiAgICBfc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KHRydWUpOwogICAgX3N0YXRlLnNldFNjaXNzb3JUZXN0KGZhbHNlKTsKICAgIGNvbnN0IHRvVlNNID0gX3ByZXZpb3VzVHlwZSAhPT0gVlNNU2hhZG93TWFwICYmIHRoaXMudHlwZSA9PT0gVlNNU2hhZG93TWFwOwogICAgY29uc3QgZnJvbVZTTSA9IF9wcmV2aW91c1R5cGUgPT09IFZTTVNoYWRvd01hcCAmJiB0aGlzLnR5cGUgIT09IFZTTVNoYWRvd01hcDsKICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IGxpZ2h0cy5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgY29uc3QgbGlnaHQgPSBsaWdodHNbaV07CiAgICAgIGNvbnN0IHNoYWRvdyA9IGxpZ2h0LnNoYWRvdzsKICAgICAgaWYgKHNoYWRvdyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDoiLCBsaWdodCwgImhhcyBubyBzaGFkb3cuIik7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHNoYWRvdy5hdXRvVXBkYXRlID09PSBmYWxzZSAmJiBzaGFkb3cubmVlZHNVcGRhdGUgPT09IGZhbHNlKQogICAgICAgIGNvbnRpbnVlOwogICAgICBfc2hhZG93TWFwU2l6ZS5jb3B5KHNoYWRvdy5tYXBTaXplKTsKICAgICAgY29uc3Qgc2hhZG93RnJhbWVFeHRlbnRzID0gc2hhZG93LmdldEZyYW1lRXh0ZW50cygpOwogICAgICBfc2hhZG93TWFwU2l6ZS5tdWx0aXBseShzaGFkb3dGcmFtZUV4dGVudHMpOwogICAgICBfdmlld3BvcnRTaXplLmNvcHkoc2hhZG93Lm1hcFNpemUpOwogICAgICBpZiAoX3NoYWRvd01hcFNpemUueCA+IF9tYXhUZXh0dXJlU2l6ZSB8fCBfc2hhZG93TWFwU2l6ZS55ID4gX21heFRleHR1cmVTaXplKSB7CiAgICAgICAgaWYgKF9zaGFkb3dNYXBTaXplLnggPiBfbWF4VGV4dHVyZVNpemUpIHsKICAgICAgICAgIF92aWV3cG9ydFNpemUueCA9IE1hdGguZmxvb3IoX21heFRleHR1cmVTaXplIC8gc2hhZG93RnJhbWVFeHRlbnRzLngpOwogICAgICAgICAgX3NoYWRvd01hcFNpemUueCA9IF92aWV3cG9ydFNpemUueCAqIHNoYWRvd0ZyYW1lRXh0ZW50cy54OwogICAgICAgICAgc2hhZG93Lm1hcFNpemUueCA9IF92aWV3cG9ydFNpemUueDsKICAgICAgICB9CiAgICAgICAgaWYgKF9zaGFkb3dNYXBTaXplLnkgPiBfbWF4VGV4dHVyZVNpemUpIHsKICAgICAgICAgIF92aWV3cG9ydFNpemUueSA9IE1hdGguZmxvb3IoX21heFRleHR1cmVTaXplIC8gc2hhZG93RnJhbWVFeHRlbnRzLnkpOwogICAgICAgICAgX3NoYWRvd01hcFNpemUueSA9IF92aWV3cG9ydFNpemUueSAqIHNoYWRvd0ZyYW1lRXh0ZW50cy55OwogICAgICAgICAgc2hhZG93Lm1hcFNpemUueSA9IF92aWV3cG9ydFNpemUueTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHNoYWRvdy5tYXAgPT09IG51bGwgfHwgdG9WU00gPT09IHRydWUgfHwgZnJvbVZTTSA9PT0gdHJ1ZSkgewogICAgICAgIGNvbnN0IHBhcnMgPSB0aGlzLnR5cGUgIT09IFZTTVNoYWRvd01hcCA/IHsgbWluRmlsdGVyOiBOZWFyZXN0RmlsdGVyLCBtYWdGaWx0ZXI6IE5lYXJlc3RGaWx0ZXIgfSA6IHt9OwogICAgICAgIGlmIChzaGFkb3cubWFwICE9PSBudWxsKSB7CiAgICAgICAgICBzaGFkb3cubWFwLmRpc3Bvc2UoKTsKICAgICAgICB9CiAgICAgICAgc2hhZG93Lm1hcCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldChfc2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzKTsKICAgICAgICBzaGFkb3cubWFwLnRleHR1cmUubmFtZSA9IGxpZ2h0Lm5hbWUgKyAiLnNoYWRvd01hcCI7CiAgICAgICAgc2hhZG93LmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CiAgICAgIH0KICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHNoYWRvdy5tYXApOwogICAgICByZW5kZXJlci5jbGVhcigpOwogICAgICBjb25zdCB2aWV3cG9ydENvdW50ID0gc2hhZG93LmdldFZpZXdwb3J0Q291bnQoKTsKICAgICAgZm9yIChsZXQgdnAgPSAwO3ZwIDwgdmlld3BvcnRDb3VudDsgdnArKykgewogICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gc2hhZG93LmdldFZpZXdwb3J0KHZwKTsKICAgICAgICBfdmlld3BvcnQuc2V0KF92aWV3cG9ydFNpemUueCAqIHZpZXdwb3J0LngsIF92aWV3cG9ydFNpemUueSAqIHZpZXdwb3J0LnksIF92aWV3cG9ydFNpemUueCAqIHZpZXdwb3J0LnosIF92aWV3cG9ydFNpemUueSAqIHZpZXdwb3J0LncpOwogICAgICAgIF9zdGF0ZS52aWV3cG9ydChfdmlld3BvcnQpOwogICAgICAgIHNoYWRvdy51cGRhdGVNYXRyaWNlcyhsaWdodCwgdnApOwogICAgICAgIF9mcnVzdHVtMiA9IHNoYWRvdy5nZXRGcnVzdHVtKCk7CiAgICAgICAgcmVuZGVyT2JqZWN0KHNjZW5lLCBjYW1lcmEsIHNoYWRvdy5jYW1lcmEsIGxpZ2h0LCB0aGlzLnR5cGUpOwogICAgICB9CiAgICAgIGlmIChzaGFkb3cuaXNQb2ludExpZ2h0U2hhZG93ICE9PSB0cnVlICYmIHRoaXMudHlwZSA9PT0gVlNNU2hhZG93TWFwKSB7CiAgICAgICAgVlNNUGFzcyhzaGFkb3csIGNhbWVyYSk7CiAgICAgIH0KICAgICAgc2hhZG93Lm5lZWRzVXBkYXRlID0gZmFsc2U7CiAgICB9CiAgICBfcHJldmlvdXNUeXBlID0gdGhpcy50eXBlOwogICAgc2NvcGUubmVlZHNVcGRhdGUgPSBmYWxzZTsKICAgIHJlbmRlcmVyLnNldFJlbmRlclRhcmdldChjdXJyZW50UmVuZGVyVGFyZ2V0LCBhY3RpdmVDdWJlRmFjZSwgYWN0aXZlTWlwbWFwTGV2ZWwpOwogIH07CiAgZnVuY3Rpb24gVlNNUGFzcyhzaGFkb3csIGNhbWVyYSkgewogICAgY29uc3QgZ2VvbWV0cnkgPSBvYmplY3RzLnVwZGF0ZShmdWxsU2NyZWVuTWVzaCk7CiAgICBpZiAoc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbC5kZWZpbmVzLlZTTV9TQU1QTEVTICE9PSBzaGFkb3cuYmx1clNhbXBsZXMpIHsKICAgICAgc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbC5kZWZpbmVzLlZTTV9TQU1QTEVTID0gc2hhZG93LmJsdXJTYW1wbGVzOwogICAgICBzaGFkb3dNYXRlcmlhbEhvcml6b250YWwuZGVmaW5lcy5WU01fU0FNUExFUyA9IHNoYWRvdy5ibHVyU2FtcGxlczsKICAgICAgc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbC5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgIHNoYWRvd01hdGVyaWFsSG9yaXpvbnRhbC5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICB9CiAgICBpZiAoc2hhZG93Lm1hcFBhc3MgPT09IG51bGwpIHsKICAgICAgc2hhZG93Lm1hcFBhc3MgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoX3NoYWRvd01hcFNpemUueCwgX3NoYWRvd01hcFNpemUueSk7CiAgICB9CiAgICBzaGFkb3dNYXRlcmlhbFZlcnRpY2FsLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlID0gc2hhZG93Lm1hcC50ZXh0dXJlOwogICAgc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbC51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlID0gc2hhZG93Lm1hcFNpemU7CiAgICBzaGFkb3dNYXRlcmlhbFZlcnRpY2FsLnVuaWZvcm1zLnJhZGl1cy52YWx1ZSA9IHNoYWRvdy5yYWRpdXM7CiAgICByZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoc2hhZG93Lm1hcFBhc3MpOwogICAgcmVuZGVyZXIuY2xlYXIoKTsKICAgIHJlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdChjYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBzaGFkb3dNYXRlcmlhbFZlcnRpY2FsLCBmdWxsU2NyZWVuTWVzaCwgbnVsbCk7CiAgICBzaGFkb3dNYXRlcmlhbEhvcml6b250YWwudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWUgPSBzaGFkb3cubWFwUGFzcy50ZXh0dXJlOwogICAgc2hhZG93TWF0ZXJpYWxIb3Jpem9udGFsLnVuaWZvcm1zLnJlc29sdXRpb24udmFsdWUgPSBzaGFkb3cubWFwU2l6ZTsKICAgIHNoYWRvd01hdGVyaWFsSG9yaXpvbnRhbC51bmlmb3Jtcy5yYWRpdXMudmFsdWUgPSBzaGFkb3cucmFkaXVzOwogICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHNoYWRvdy5tYXApOwogICAgcmVuZGVyZXIuY2xlYXIoKTsKICAgIHJlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdChjYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBzaGFkb3dNYXRlcmlhbEhvcml6b250YWwsIGZ1bGxTY3JlZW5NZXNoLCBudWxsKTsKICB9CiAgZnVuY3Rpb24gZ2V0RGVwdGhNYXRlcmlhbChvYmplY3QsIG1hdGVyaWFsLCBsaWdodCwgdHlwZSkgewogICAgbGV0IHJlc3VsdCA9IG51bGw7CiAgICBjb25zdCBjdXN0b21NYXRlcmlhbCA9IGxpZ2h0LmlzUG9pbnRMaWdodCA9PT0gdHJ1ZSA/IG9iamVjdC5jdXN0b21EaXN0YW5jZU1hdGVyaWFsIDogb2JqZWN0LmN1c3RvbURlcHRoTWF0ZXJpYWw7CiAgICBpZiAoY3VzdG9tTWF0ZXJpYWwgIT09IHVuZGVmaW5lZCkgewogICAgICByZXN1bHQgPSBjdXN0b21NYXRlcmlhbDsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IGxpZ2h0LmlzUG9pbnRMaWdodCA9PT0gdHJ1ZSA/IF9kaXN0YW5jZU1hdGVyaWFsIDogX2RlcHRoTWF0ZXJpYWw7CiAgICAgIGlmIChyZW5kZXJlci5sb2NhbENsaXBwaW5nRW5hYmxlZCAmJiBtYXRlcmlhbC5jbGlwU2hhZG93cyA9PT0gdHJ1ZSAmJiBBcnJheS5pc0FycmF5KG1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzKSAmJiBtYXRlcmlhbC5jbGlwcGluZ1BsYW5lcy5sZW5ndGggIT09IDAgfHwgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICYmIG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlICE9PSAwIHx8IG1hdGVyaWFsLmFscGhhTWFwICYmIG1hdGVyaWFsLmFscGhhVGVzdCA+IDAgfHwgbWF0ZXJpYWwubWFwICYmIG1hdGVyaWFsLmFscGhhVGVzdCA+IDApIHsKICAgICAgICBjb25zdCBrZXlBID0gcmVzdWx0LnV1aWQsIGtleUIgPSBtYXRlcmlhbC51dWlkOwogICAgICAgIGxldCBtYXRlcmlhbHNGb3JWYXJpYW50ID0gX21hdGVyaWFsQ2FjaGVba2V5QV07CiAgICAgICAgaWYgKG1hdGVyaWFsc0ZvclZhcmlhbnQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgbWF0ZXJpYWxzRm9yVmFyaWFudCA9IHt9OwogICAgICAgICAgX21hdGVyaWFsQ2FjaGVba2V5QV0gPSBtYXRlcmlhbHNGb3JWYXJpYW50OwogICAgICAgIH0KICAgICAgICBsZXQgY2FjaGVkTWF0ZXJpYWwgPSBtYXRlcmlhbHNGb3JWYXJpYW50W2tleUJdOwogICAgICAgIGlmIChjYWNoZWRNYXRlcmlhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBjYWNoZWRNYXRlcmlhbCA9IHJlc3VsdC5jbG9uZSgpOwogICAgICAgICAgbWF0ZXJpYWxzRm9yVmFyaWFudFtrZXlCXSA9IGNhY2hlZE1hdGVyaWFsOwogICAgICAgICAgbWF0ZXJpYWwuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIG9uTWF0ZXJpYWxEaXNwb3NlKTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gY2FjaGVkTWF0ZXJpYWw7CiAgICAgIH0KICAgIH0KICAgIHJlc3VsdC52aXNpYmxlID0gbWF0ZXJpYWwudmlzaWJsZTsKICAgIHJlc3VsdC53aXJlZnJhbWUgPSBtYXRlcmlhbC53aXJlZnJhbWU7CiAgICBpZiAodHlwZSA9PT0gVlNNU2hhZG93TWFwKSB7CiAgICAgIHJlc3VsdC5zaWRlID0gbWF0ZXJpYWwuc2hhZG93U2lkZSAhPT0gbnVsbCA/IG1hdGVyaWFsLnNoYWRvd1NpZGUgOiBtYXRlcmlhbC5zaWRlOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0LnNpZGUgPSBtYXRlcmlhbC5zaGFkb3dTaWRlICE9PSBudWxsID8gbWF0ZXJpYWwuc2hhZG93U2lkZSA6IHNoYWRvd1NpZGVbbWF0ZXJpYWwuc2lkZV07CiAgICB9CiAgICByZXN1bHQuYWxwaGFNYXAgPSBtYXRlcmlhbC5hbHBoYU1hcDsKICAgIHJlc3VsdC5hbHBoYVRlc3QgPSBtYXRlcmlhbC5hbHBoYVRlc3Q7CiAgICByZXN1bHQubWFwID0gbWF0ZXJpYWwubWFwOwogICAgcmVzdWx0LmNsaXBTaGFkb3dzID0gbWF0ZXJpYWwuY2xpcFNoYWRvd3M7CiAgICByZXN1bHQuY2xpcHBpbmdQbGFuZXMgPSBtYXRlcmlhbC5jbGlwcGluZ1BsYW5lczsKICAgIHJlc3VsdC5jbGlwSW50ZXJzZWN0aW9uID0gbWF0ZXJpYWwuY2xpcEludGVyc2VjdGlvbjsKICAgIHJlc3VsdC5kaXNwbGFjZW1lbnRNYXAgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7CiAgICByZXN1bHQuZGlzcGxhY2VtZW50U2NhbGUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTsKICAgIHJlc3VsdC5kaXNwbGFjZW1lbnRCaWFzID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhczsKICAgIHJlc3VsdC53aXJlZnJhbWVMaW5ld2lkdGggPSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGg7CiAgICByZXN1bHQubGluZXdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoOwogICAgaWYgKGxpZ2h0LmlzUG9pbnRMaWdodCA9PT0gdHJ1ZSAmJiByZXN1bHQuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCA9PT0gdHJ1ZSkgewogICAgICBjb25zdCBtYXRlcmlhbFByb3BlcnRpZXMgPSByZW5kZXJlci5wcm9wZXJ0aWVzLmdldChyZXN1bHQpOwogICAgICBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHQgPSBsaWdodDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIHJlbmRlck9iamVjdChvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBsaWdodCwgdHlwZSkgewogICAgaWYgKG9iamVjdC52aXNpYmxlID09PSBmYWxzZSkKICAgICAgcmV0dXJuOwogICAgY29uc3QgdmlzaWJsZSA9IG9iamVjdC5sYXllcnMudGVzdChjYW1lcmEubGF5ZXJzKTsKICAgIGlmICh2aXNpYmxlICYmIChvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc0xpbmUgfHwgb2JqZWN0LmlzUG9pbnRzKSkgewogICAgICBpZiAoKG9iamVjdC5jYXN0U2hhZG93IHx8IG9iamVjdC5yZWNlaXZlU2hhZG93ICYmIHR5cGUgPT09IFZTTVNoYWRvd01hcCkgJiYgKCFvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bTIuaW50ZXJzZWN0c09iamVjdChvYmplY3QpKSkgewogICAgICAgIG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBvYmplY3QubWF0cml4V29ybGQpOwogICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gb2JqZWN0cy51cGRhdGUob2JqZWN0KTsKICAgICAgICBjb25zdCBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtYXRlcmlhbCkpIHsKICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwczsKICAgICAgICAgIGZvciAobGV0IGsgPSAwLCBrbCA9IGdyb3Vwcy5sZW5ndGg7ayA8IGtsOyBrKyspIHsKICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBncm91cHNba107CiAgICAgICAgICAgIGNvbnN0IGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFtncm91cC5tYXRlcmlhbEluZGV4XTsKICAgICAgICAgICAgaWYgKGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlKSB7CiAgICAgICAgICAgICAgY29uc3QgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwob2JqZWN0LCBncm91cE1hdGVyaWFsLCBsaWdodCwgdHlwZSk7CiAgICAgICAgICAgICAgb2JqZWN0Lm9uQmVmb3JlU2hhZG93KHJlbmRlcmVyLCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgZ3JvdXApOwogICAgICAgICAgICAgIHJlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdChzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBvYmplY3QsIGdyb3VwKTsKICAgICAgICAgICAgICBvYmplY3Qub25BZnRlclNoYWRvdyhyZW5kZXJlciwgb2JqZWN0LCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIGdyb3VwKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAobWF0ZXJpYWwudmlzaWJsZSkgewogICAgICAgICAgY29uc3QgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwob2JqZWN0LCBtYXRlcmlhbCwgbGlnaHQsIHR5cGUpOwogICAgICAgICAgb2JqZWN0Lm9uQmVmb3JlU2hhZG93KHJlbmRlcmVyLCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgbnVsbCk7CiAgICAgICAgICByZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3Qoc2hhZG93Q2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgb2JqZWN0LCBudWxsKTsKICAgICAgICAgIG9iamVjdC5vbkFmdGVyU2hhZG93KHJlbmRlcmVyLCBvYmplY3QsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgbnVsbCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjsKICAgIGZvciAobGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgcmVuZGVyT2JqZWN0KGNoaWxkcmVuW2ldLCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgbGlnaHQsIHR5cGUpOwogICAgfQogIH0KICBmdW5jdGlvbiBvbk1hdGVyaWFsRGlzcG9zZShldmVudCkgewogICAgY29uc3QgbWF0ZXJpYWwgPSBldmVudC50YXJnZXQ7CiAgICBtYXRlcmlhbC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgb25NYXRlcmlhbERpc3Bvc2UpOwogICAgZm9yIChjb25zdCBpZCBpbiBfbWF0ZXJpYWxDYWNoZSkgewogICAgICBjb25zdCBjYWNoZSA9IF9tYXRlcmlhbENhY2hlW2lkXTsKICAgICAgY29uc3QgdXVpZCA9IGV2ZW50LnRhcmdldC51dWlkOwogICAgICBpZiAodXVpZCBpbiBjYWNoZSkgewogICAgICAgIGNvbnN0IHNoYWRvd01hdGVyaWFsID0gY2FjaGVbdXVpZF07CiAgICAgICAgc2hhZG93TWF0ZXJpYWwuZGlzcG9zZSgpOwogICAgICAgIGRlbGV0ZSBjYWNoZVt1dWlkXTsKICAgICAgfQogICAgfQogIH0KfQpmdW5jdGlvbiBXZWJHTFN0YXRlKGdsLCBleHRlbnNpb25zKSB7CiAgZnVuY3Rpb24gQ29sb3JCdWZmZXIoKSB7CiAgICBsZXQgbG9ja2VkID0gZmFsc2U7CiAgICBjb25zdCBjb2xvciA9IG5ldyBWZWN0b3I0OwogICAgbGV0IGN1cnJlbnRDb2xvck1hc2sgPSBudWxsOwogICAgY29uc3QgY3VycmVudENvbG9yQ2xlYXIgPSBuZXcgVmVjdG9yNCgwLCAwLCAwLCAwKTsKICAgIHJldHVybiB7CiAgICAgIHNldE1hc2s6IGZ1bmN0aW9uKGNvbG9yTWFzaykgewogICAgICAgIGlmIChjdXJyZW50Q29sb3JNYXNrICE9PSBjb2xvck1hc2sgJiYgIWxvY2tlZCkgewogICAgICAgICAgZ2wuY29sb3JNYXNrKGNvbG9yTWFzaywgY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzayk7CiAgICAgICAgICBjdXJyZW50Q29sb3JNYXNrID0gY29sb3JNYXNrOwogICAgICAgIH0KICAgICAgfSwKICAgICAgc2V0TG9ja2VkOiBmdW5jdGlvbihsb2NrKSB7CiAgICAgICAgbG9ja2VkID0gbG9jazsKICAgICAgfSwKICAgICAgc2V0Q2xlYXI6IGZ1bmN0aW9uKHIsIGcsIGIsIGEsIHByZW11bHRpcGxpZWRBbHBoYSkgewogICAgICAgIGlmIChwcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUpIHsKICAgICAgICAgIHIgKj0gYTsKICAgICAgICAgIGcgKj0gYTsKICAgICAgICAgIGIgKj0gYTsKICAgICAgICB9CiAgICAgICAgY29sb3Iuc2V0KHIsIGcsIGIsIGEpOwogICAgICAgIGlmIChjdXJyZW50Q29sb3JDbGVhci5lcXVhbHMoY29sb3IpID09PSBmYWxzZSkgewogICAgICAgICAgZ2wuY2xlYXJDb2xvcihyLCBnLCBiLCBhKTsKICAgICAgICAgIGN1cnJlbnRDb2xvckNsZWFyLmNvcHkoY29sb3IpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcmVzZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGxvY2tlZCA9IGZhbHNlOwogICAgICAgIGN1cnJlbnRDb2xvck1hc2sgPSBudWxsOwogICAgICAgIGN1cnJlbnRDb2xvckNsZWFyLnNldCgtMSwgMCwgMCwgMCk7CiAgICAgIH0KICAgIH07CiAgfQogIGZ1bmN0aW9uIERlcHRoQnVmZmVyKCkgewogICAgbGV0IGxvY2tlZCA9IGZhbHNlOwogICAgbGV0IHJldmVyc2VkID0gZmFsc2U7CiAgICBsZXQgY3VycmVudERlcHRoTWFzayA9IG51bGw7CiAgICBsZXQgY3VycmVudERlcHRoRnVuYyA9IG51bGw7CiAgICBsZXQgY3VycmVudERlcHRoQ2xlYXIgPSBudWxsOwogICAgcmV0dXJuIHsKICAgICAgc2V0UmV2ZXJzZWQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgaWYgKHJldmVyc2VkICE9PSB2YWx1ZSkgewogICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9ucy5nZXQoIkVYVF9jbGlwX2NvbnRyb2wiKTsKICAgICAgICAgIGlmIChyZXZlcnNlZCkgewogICAgICAgICAgICBleHQuY2xpcENvbnRyb2xFWFQoZXh0LkxPV0VSX0xFRlRfRVhULCBleHQuWkVST19UT19PTkVfRVhUKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGV4dC5jbGlwQ29udHJvbEVYVChleHQuTE9XRVJfTEVGVF9FWFQsIGV4dC5ORUdBVElWRV9PTkVfVE9fT05FX0VYVCk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBvbGREZXB0aCA9IGN1cnJlbnREZXB0aENsZWFyOwogICAgICAgICAgY3VycmVudERlcHRoQ2xlYXIgPSBudWxsOwogICAgICAgICAgdGhpcy5zZXRDbGVhcihvbGREZXB0aCk7CiAgICAgICAgfQogICAgICAgIHJldmVyc2VkID0gdmFsdWU7CiAgICAgIH0sCiAgICAgIGdldFJldmVyc2VkOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcmV2ZXJzZWQ7CiAgICAgIH0sCiAgICAgIHNldFRlc3Q6IGZ1bmN0aW9uKGRlcHRoVGVzdCkgewogICAgICAgIGlmIChkZXB0aFRlc3QpIHsKICAgICAgICAgIGVuYWJsZShnbC5ERVBUSF9URVNUKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGlzYWJsZShnbC5ERVBUSF9URVNUKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHNldE1hc2s6IGZ1bmN0aW9uKGRlcHRoTWFzaykgewogICAgICAgIGlmIChjdXJyZW50RGVwdGhNYXNrICE9PSBkZXB0aE1hc2sgJiYgIWxvY2tlZCkgewogICAgICAgICAgZ2wuZGVwdGhNYXNrKGRlcHRoTWFzayk7CiAgICAgICAgICBjdXJyZW50RGVwdGhNYXNrID0gZGVwdGhNYXNrOwogICAgICAgIH0KICAgICAgfSwKICAgICAgc2V0RnVuYzogZnVuY3Rpb24oZGVwdGhGdW5jKSB7CiAgICAgICAgaWYgKHJldmVyc2VkKQogICAgICAgICAgZGVwdGhGdW5jID0gcmV2ZXJzZWRGdW5jc1tkZXB0aEZ1bmNdOwogICAgICAgIGlmIChjdXJyZW50RGVwdGhGdW5jICE9PSBkZXB0aEZ1bmMpIHsKICAgICAgICAgIHN3aXRjaCAoZGVwdGhGdW5jKSB7CiAgICAgICAgICAgIGNhc2UgTmV2ZXJEZXB0aDoKICAgICAgICAgICAgICBnbC5kZXB0aEZ1bmMoZ2wuTkVWRVIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEFsd2F5c0RlcHRoOgogICAgICAgICAgICAgIGdsLmRlcHRoRnVuYyhnbC5BTFdBWVMpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIExlc3NEZXB0aDoKICAgICAgICAgICAgICBnbC5kZXB0aEZ1bmMoZ2wuTEVTUyk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgTGVzc0VxdWFsRGVwdGg6CiAgICAgICAgICAgICAgZ2wuZGVwdGhGdW5jKGdsLkxFUVVBTCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgRXF1YWxEZXB0aDoKICAgICAgICAgICAgICBnbC5kZXB0aEZ1bmMoZ2wuRVFVQUwpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEdyZWF0ZXJFcXVhbERlcHRoOgogICAgICAgICAgICAgIGdsLmRlcHRoRnVuYyhnbC5HRVFVQUwpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEdyZWF0ZXJEZXB0aDoKICAgICAgICAgICAgICBnbC5kZXB0aEZ1bmMoZ2wuR1JFQVRFUik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgTm90RXF1YWxEZXB0aDoKICAgICAgICAgICAgICBnbC5kZXB0aEZ1bmMoZ2wuTk9URVFVQUwpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIGdsLmRlcHRoRnVuYyhnbC5MRVFVQUwpOwogICAgICAgICAgfQogICAgICAgICAgY3VycmVudERlcHRoRnVuYyA9IGRlcHRoRnVuYzsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHNldExvY2tlZDogZnVuY3Rpb24obG9jaykgewogICAgICAgIGxvY2tlZCA9IGxvY2s7CiAgICAgIH0sCiAgICAgIHNldENsZWFyOiBmdW5jdGlvbihkZXB0aCkgewogICAgICAgIGlmIChjdXJyZW50RGVwdGhDbGVhciAhPT0gZGVwdGgpIHsKICAgICAgICAgIGlmIChyZXZlcnNlZCkgewogICAgICAgICAgICBkZXB0aCA9IDEgLSBkZXB0aDsKICAgICAgICAgIH0KICAgICAgICAgIGdsLmNsZWFyRGVwdGgoZGVwdGgpOwogICAgICAgICAgY3VycmVudERlcHRoQ2xlYXIgPSBkZXB0aDsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgICBsb2NrZWQgPSBmYWxzZTsKICAgICAgICBjdXJyZW50RGVwdGhNYXNrID0gbnVsbDsKICAgICAgICBjdXJyZW50RGVwdGhGdW5jID0gbnVsbDsKICAgICAgICBjdXJyZW50RGVwdGhDbGVhciA9IG51bGw7CiAgICAgICAgcmV2ZXJzZWQgPSBmYWxzZTsKICAgICAgfQogICAgfTsKICB9CiAgZnVuY3Rpb24gU3RlbmNpbEJ1ZmZlcigpIHsKICAgIGxldCBsb2NrZWQgPSBmYWxzZTsKICAgIGxldCBjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsOwogICAgbGV0IGN1cnJlbnRTdGVuY2lsRnVuYyA9IG51bGw7CiAgICBsZXQgY3VycmVudFN0ZW5jaWxSZWYgPSBudWxsOwogICAgbGV0IGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBudWxsOwogICAgbGV0IGN1cnJlbnRTdGVuY2lsRmFpbCA9IG51bGw7CiAgICBsZXQgY3VycmVudFN0ZW5jaWxaRmFpbCA9IG51bGw7CiAgICBsZXQgY3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7CiAgICBsZXQgY3VycmVudFN0ZW5jaWxDbGVhciA9IG51bGw7CiAgICByZXR1cm4gewogICAgICBzZXRUZXN0OiBmdW5jdGlvbihzdGVuY2lsVGVzdCkgewogICAgICAgIGlmICghbG9ja2VkKSB7CiAgICAgICAgICBpZiAoc3RlbmNpbFRlc3QpIHsKICAgICAgICAgICAgZW5hYmxlKGdsLlNURU5DSUxfVEVTVCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkaXNhYmxlKGdsLlNURU5DSUxfVEVTVCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBzZXRNYXNrOiBmdW5jdGlvbihzdGVuY2lsTWFzaykgewogICAgICAgIGlmIChjdXJyZW50U3RlbmNpbE1hc2sgIT09IHN0ZW5jaWxNYXNrICYmICFsb2NrZWQpIHsKICAgICAgICAgIGdsLnN0ZW5jaWxNYXNrKHN0ZW5jaWxNYXNrKTsKICAgICAgICAgIGN1cnJlbnRTdGVuY2lsTWFzayA9IHN0ZW5jaWxNYXNrOwogICAgICAgIH0KICAgICAgfSwKICAgICAgc2V0RnVuYzogZnVuY3Rpb24oc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrKSB7CiAgICAgICAgaWYgKGN1cnJlbnRTdGVuY2lsRnVuYyAhPT0gc3RlbmNpbEZ1bmMgfHwgY3VycmVudFN0ZW5jaWxSZWYgIT09IHN0ZW5jaWxSZWYgfHwgY3VycmVudFN0ZW5jaWxGdW5jTWFzayAhPT0gc3RlbmNpbE1hc2spIHsKICAgICAgICAgIGdsLnN0ZW5jaWxGdW5jKHN0ZW5jaWxGdW5jLCBzdGVuY2lsUmVmLCBzdGVuY2lsTWFzayk7CiAgICAgICAgICBjdXJyZW50U3RlbmNpbEZ1bmMgPSBzdGVuY2lsRnVuYzsKICAgICAgICAgIGN1cnJlbnRTdGVuY2lsUmVmID0gc3RlbmNpbFJlZjsKICAgICAgICAgIGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBzdGVuY2lsTWFzazsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHNldE9wOiBmdW5jdGlvbihzdGVuY2lsRmFpbCwgc3RlbmNpbFpGYWlsLCBzdGVuY2lsWlBhc3MpIHsKICAgICAgICBpZiAoY3VycmVudFN0ZW5jaWxGYWlsICE9PSBzdGVuY2lsRmFpbCB8fCBjdXJyZW50U3RlbmNpbFpGYWlsICE9PSBzdGVuY2lsWkZhaWwgfHwgY3VycmVudFN0ZW5jaWxaUGFzcyAhPT0gc3RlbmNpbFpQYXNzKSB7CiAgICAgICAgICBnbC5zdGVuY2lsT3Aoc3RlbmNpbEZhaWwsIHN0ZW5jaWxaRmFpbCwgc3RlbmNpbFpQYXNzKTsKICAgICAgICAgIGN1cnJlbnRTdGVuY2lsRmFpbCA9IHN0ZW5jaWxGYWlsOwogICAgICAgICAgY3VycmVudFN0ZW5jaWxaRmFpbCA9IHN0ZW5jaWxaRmFpbDsKICAgICAgICAgIGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBzdGVuY2lsWlBhc3M7CiAgICAgICAgfQogICAgICB9LAogICAgICBzZXRMb2NrZWQ6IGZ1bmN0aW9uKGxvY2spIHsKICAgICAgICBsb2NrZWQgPSBsb2NrOwogICAgICB9LAogICAgICBzZXRDbGVhcjogZnVuY3Rpb24oc3RlbmNpbCkgewogICAgICAgIGlmIChjdXJyZW50U3RlbmNpbENsZWFyICE9PSBzdGVuY2lsKSB7CiAgICAgICAgICBnbC5jbGVhclN0ZW5jaWwoc3RlbmNpbCk7CiAgICAgICAgICBjdXJyZW50U3RlbmNpbENsZWFyID0gc3RlbmNpbDsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgICBsb2NrZWQgPSBmYWxzZTsKICAgICAgICBjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsOwogICAgICAgIGN1cnJlbnRTdGVuY2lsRnVuYyA9IG51bGw7CiAgICAgICAgY3VycmVudFN0ZW5jaWxSZWYgPSBudWxsOwogICAgICAgIGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBudWxsOwogICAgICAgIGN1cnJlbnRTdGVuY2lsRmFpbCA9IG51bGw7CiAgICAgICAgY3VycmVudFN0ZW5jaWxaRmFpbCA9IG51bGw7CiAgICAgICAgY3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7CiAgICAgICAgY3VycmVudFN0ZW5jaWxDbGVhciA9IG51bGw7CiAgICAgIH0KICAgIH07CiAgfQogIGNvbnN0IGNvbG9yQnVmZmVyID0gbmV3IENvbG9yQnVmZmVyOwogIGNvbnN0IGRlcHRoQnVmZmVyID0gbmV3IERlcHRoQnVmZmVyOwogIGNvbnN0IHN0ZW5jaWxCdWZmZXIgPSBuZXcgU3RlbmNpbEJ1ZmZlcjsKICBjb25zdCB1Ym9CaW5kaW5ncyA9IG5ldyBXZWFrTWFwOwogIGNvbnN0IHVib1Byb2dyYW1NYXAgPSBuZXcgV2Vha01hcDsKICBsZXQgZW5hYmxlZENhcGFiaWxpdGllcyA9IHt9OwogIGxldCBjdXJyZW50Qm91bmRGcmFtZWJ1ZmZlcnMgPSB7fTsKICBsZXQgY3VycmVudERyYXdidWZmZXJzID0gbmV3IFdlYWtNYXA7CiAgbGV0IGRlZmF1bHREcmF3YnVmZmVycyA9IFtdOwogIGxldCBjdXJyZW50UHJvZ3JhbSA9IG51bGw7CiAgbGV0IGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPSBmYWxzZTsKICBsZXQgY3VycmVudEJsZW5kaW5nID0gbnVsbDsKICBsZXQgY3VycmVudEJsZW5kRXF1YXRpb24gPSBudWxsOwogIGxldCBjdXJyZW50QmxlbmRTcmMgPSBudWxsOwogIGxldCBjdXJyZW50QmxlbmREc3QgPSBudWxsOwogIGxldCBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDsKICBsZXQgY3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsOwogIGxldCBjdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7CiAgbGV0IGN1cnJlbnRCbGVuZENvbG9yID0gbmV3IENvbG9yKDAsIDAsIDApOwogIGxldCBjdXJyZW50QmxlbmRBbHBoYSA9IDA7CiAgbGV0IGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IGZhbHNlOwogIGxldCBjdXJyZW50RmxpcFNpZGVkID0gbnVsbDsKICBsZXQgY3VycmVudEN1bGxGYWNlID0gbnVsbDsKICBsZXQgY3VycmVudExpbmVXaWR0aCA9IG51bGw7CiAgbGV0IGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gbnVsbDsKICBsZXQgY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IG51bGw7CiAgY29uc3QgbWF4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMpOwogIGxldCBsaW5lV2lkdGhBdmFpbGFibGUgPSBmYWxzZTsKICBsZXQgdmVyc2lvbiA9IDA7CiAgY29uc3QgZ2xWZXJzaW9uID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLlZFUlNJT04pOwogIGlmIChnbFZlcnNpb24uaW5kZXhPZigiV2ViR0wiKSAhPT0gLTEpIHsKICAgIHZlcnNpb24gPSBwYXJzZUZsb2F0KC9eV2ViR0wgKFxkKS8uZXhlYyhnbFZlcnNpb24pWzFdKTsKICAgIGxpbmVXaWR0aEF2YWlsYWJsZSA9IHZlcnNpb24gPj0gMTsKICB9IGVsc2UgaWYgKGdsVmVyc2lvbi5pbmRleE9mKCJPcGVuR0wgRVMiKSAhPT0gLTEpIHsKICAgIHZlcnNpb24gPSBwYXJzZUZsb2F0KC9eT3BlbkdMIEVTIChcZCkvLmV4ZWMoZ2xWZXJzaW9uKVsxXSk7CiAgICBsaW5lV2lkdGhBdmFpbGFibGUgPSB2ZXJzaW9uID49IDI7CiAgfQogIGxldCBjdXJyZW50VGV4dHVyZVNsb3QgPSBudWxsOwogIGxldCBjdXJyZW50Qm91bmRUZXh0dXJlcyA9IHt9OwogIGNvbnN0IHNjaXNzb3JQYXJhbSA9IGdsLmdldFBhcmFtZXRlcihnbC5TQ0lTU09SX0JPWCk7CiAgY29uc3Qgdmlld3BvcnRQYXJhbSA9IGdsLmdldFBhcmFtZXRlcihnbC5WSUVXUE9SVCk7CiAgY29uc3QgY3VycmVudFNjaXNzb3IgPSBuZXcgVmVjdG9yNCgpLmZyb21BcnJheShzY2lzc29yUGFyYW0pOwogIGNvbnN0IGN1cnJlbnRWaWV3cG9ydCA9IG5ldyBWZWN0b3I0KCkuZnJvbUFycmF5KHZpZXdwb3J0UGFyYW0pOwogIGZ1bmN0aW9uIGNyZWF0ZVRleHR1cmUodHlwZSwgdGFyZ2V0LCBjb3VudCwgZGltZW5zaW9ucykgewogICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KDQpOwogICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTsKICAgIGdsLmJpbmRUZXh0dXJlKHR5cGUsIHRleHR1cmUpOwogICAgZ2wudGV4UGFyYW1ldGVyaSh0eXBlLCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgZ2wudGV4UGFyYW1ldGVyaSh0eXBlLCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpOwogICAgZm9yIChsZXQgaSA9IDA7aSA8IGNvdW50OyBpKyspIHsKICAgICAgaWYgKHR5cGUgPT09IGdsLlRFWFRVUkVfM0QgfHwgdHlwZSA9PT0gZ2wuVEVYVFVSRV8yRF9BUlJBWSkgewogICAgICAgIGdsLnRleEltYWdlM0QodGFyZ2V0LCAwLCBnbC5SR0JBLCAxLCAxLCBkaW1lbnNpb25zLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBkYXRhKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnbC50ZXhJbWFnZTJEKHRhcmdldCArIGksIDAsIGdsLlJHQkEsIDEsIDEsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGRhdGEpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGV4dHVyZTsKICB9CiAgY29uc3QgZW1wdHlUZXh0dXJlcyA9IHt9OwogIGVtcHR5VGV4dHVyZXNbZ2wuVEVYVFVSRV8yRF0gPSBjcmVhdGVUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfMkQsIDEpOwogIGVtcHR5VGV4dHVyZXNbZ2wuVEVYVFVSRV9DVUJFX01BUF0gPSBjcmVhdGVUZXh0dXJlKGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGdsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCwgNik7CiAgZW1wdHlUZXh0dXJlc1tnbC5URVhUVVJFXzJEX0FSUkFZXSA9IGNyZWF0ZVRleHR1cmUoZ2wuVEVYVFVSRV8yRF9BUlJBWSwgZ2wuVEVYVFVSRV8yRF9BUlJBWSwgMSwgMSk7CiAgZW1wdHlUZXh0dXJlc1tnbC5URVhUVVJFXzNEXSA9IGNyZWF0ZVRleHR1cmUoZ2wuVEVYVFVSRV8zRCwgZ2wuVEVYVFVSRV8zRCwgMSwgMSk7CiAgY29sb3JCdWZmZXIuc2V0Q2xlYXIoMCwgMCwgMCwgMSk7CiAgZGVwdGhCdWZmZXIuc2V0Q2xlYXIoMSk7CiAgc3RlbmNpbEJ1ZmZlci5zZXRDbGVhcigwKTsKICBlbmFibGUoZ2wuREVQVEhfVEVTVCk7CiAgZGVwdGhCdWZmZXIuc2V0RnVuYyhMZXNzRXF1YWxEZXB0aCk7CiAgc2V0RmxpcFNpZGVkKGZhbHNlKTsKICBzZXRDdWxsRmFjZShDdWxsRmFjZUJhY2spOwogIGVuYWJsZShnbC5DVUxMX0ZBQ0UpOwogIHNldEJsZW5kaW5nKE5vQmxlbmRpbmcpOwogIGZ1bmN0aW9uIGVuYWJsZShpZCkgewogICAgaWYgKGVuYWJsZWRDYXBhYmlsaXRpZXNbaWRdICE9PSB0cnVlKSB7CiAgICAgIGdsLmVuYWJsZShpZCk7CiAgICAgIGVuYWJsZWRDYXBhYmlsaXRpZXNbaWRdID0gdHJ1ZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZGlzYWJsZShpZCkgewogICAgaWYgKGVuYWJsZWRDYXBhYmlsaXRpZXNbaWRdICE9PSBmYWxzZSkgewogICAgICBnbC5kaXNhYmxlKGlkKTsKICAgICAgZW5hYmxlZENhcGFiaWxpdGllc1tpZF0gPSBmYWxzZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gYmluZEZyYW1lYnVmZmVyKHRhcmdldCwgZnJhbWVidWZmZXIpIHsKICAgIGlmIChjdXJyZW50Qm91bmRGcmFtZWJ1ZmZlcnNbdGFyZ2V0XSAhPT0gZnJhbWVidWZmZXIpIHsKICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKHRhcmdldCwgZnJhbWVidWZmZXIpOwogICAgICBjdXJyZW50Qm91bmRGcmFtZWJ1ZmZlcnNbdGFyZ2V0XSA9IGZyYW1lYnVmZmVyOwogICAgICBpZiAodGFyZ2V0ID09PSBnbC5EUkFXX0ZSQU1FQlVGRkVSKSB7CiAgICAgICAgY3VycmVudEJvdW5kRnJhbWVidWZmZXJzW2dsLkZSQU1FQlVGRkVSXSA9IGZyYW1lYnVmZmVyOwogICAgICB9CiAgICAgIGlmICh0YXJnZXQgPT09IGdsLkZSQU1FQlVGRkVSKSB7CiAgICAgICAgY3VycmVudEJvdW5kRnJhbWVidWZmZXJzW2dsLkRSQVdfRlJBTUVCVUZGRVJdID0gZnJhbWVidWZmZXI7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGZ1bmN0aW9uIGRyYXdCdWZmZXJzKHJlbmRlclRhcmdldCwgZnJhbWVidWZmZXIpIHsKICAgIGxldCBkcmF3QnVmZmVyczIgPSBkZWZhdWx0RHJhd2J1ZmZlcnM7CiAgICBsZXQgbmVlZHNVcGRhdGUgPSBmYWxzZTsKICAgIGlmIChyZW5kZXJUYXJnZXQpIHsKICAgICAgZHJhd0J1ZmZlcnMyID0gY3VycmVudERyYXdidWZmZXJzLmdldChmcmFtZWJ1ZmZlcik7CiAgICAgIGlmIChkcmF3QnVmZmVyczIgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGRyYXdCdWZmZXJzMiA9IFtdOwogICAgICAgIGN1cnJlbnREcmF3YnVmZmVycy5zZXQoZnJhbWVidWZmZXIsIGRyYXdCdWZmZXJzMik7CiAgICAgIH0KICAgICAgY29uc3QgdGV4dHVyZXMgPSByZW5kZXJUYXJnZXQudGV4dHVyZXM7CiAgICAgIGlmIChkcmF3QnVmZmVyczIubGVuZ3RoICE9PSB0ZXh0dXJlcy5sZW5ndGggfHwgZHJhd0J1ZmZlcnMyWzBdICE9PSBnbC5DT0xPUl9BVFRBQ0hNRU5UMCkgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IHRleHR1cmVzLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICAgICAgZHJhd0J1ZmZlcnMyW2ldID0gZ2wuQ09MT1JfQVRUQUNITUVOVDAgKyBpOwogICAgICAgIH0KICAgICAgICBkcmF3QnVmZmVyczIubGVuZ3RoID0gdGV4dHVyZXMubGVuZ3RoOwogICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKGRyYXdCdWZmZXJzMlswXSAhPT0gZ2wuQkFDSykgewogICAgICAgIGRyYXdCdWZmZXJzMlswXSA9IGdsLkJBQ0s7CiAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBpZiAobmVlZHNVcGRhdGUpIHsKICAgICAgZ2wuZHJhd0J1ZmZlcnMoZHJhd0J1ZmZlcnMyKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gdXNlUHJvZ3JhbShwcm9ncmFtKSB7CiAgICBpZiAoY3VycmVudFByb2dyYW0gIT09IHByb2dyYW0pIHsKICAgICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtKTsKICAgICAgY3VycmVudFByb2dyYW0gPSBwcm9ncmFtOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgY29uc3QgZXF1YXRpb25Ub0dMID0gewogICAgW0FkZEVxdWF0aW9uXTogZ2wuRlVOQ19BREQsCiAgICBbU3VidHJhY3RFcXVhdGlvbl06IGdsLkZVTkNfU1VCVFJBQ1QsCiAgICBbUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb25dOiBnbC5GVU5DX1JFVkVSU0VfU1VCVFJBQ1QKICB9OwogIGVxdWF0aW9uVG9HTFtNaW5FcXVhdGlvbl0gPSBnbC5NSU47CiAgZXF1YXRpb25Ub0dMW01heEVxdWF0aW9uXSA9IGdsLk1BWDsKICBjb25zdCBmYWN0b3JUb0dMID0gewogICAgW1plcm9GYWN0b3JdOiBnbC5aRVJPLAogICAgW09uZUZhY3Rvcl06IGdsLk9ORSwKICAgIFtTcmNDb2xvckZhY3Rvcl06IGdsLlNSQ19DT0xPUiwKICAgIFtTcmNBbHBoYUZhY3Rvcl06IGdsLlNSQ19BTFBIQSwKICAgIFtTcmNBbHBoYVNhdHVyYXRlRmFjdG9yXTogZ2wuU1JDX0FMUEhBX1NBVFVSQVRFLAogICAgW0RzdENvbG9yRmFjdG9yXTogZ2wuRFNUX0NPTE9SLAogICAgW0RzdEFscGhhRmFjdG9yXTogZ2wuRFNUX0FMUEhBLAogICAgW09uZU1pbnVzU3JjQ29sb3JGYWN0b3JdOiBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SLAogICAgW09uZU1pbnVzU3JjQWxwaGFGYWN0b3JdOiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLAogICAgW09uZU1pbnVzRHN0Q29sb3JGYWN0b3JdOiBnbC5PTkVfTUlOVVNfRFNUX0NPTE9SLAogICAgW09uZU1pbnVzRHN0QWxwaGFGYWN0b3JdOiBnbC5PTkVfTUlOVVNfRFNUX0FMUEhBLAogICAgW0NvbnN0YW50Q29sb3JGYWN0b3JdOiBnbC5DT05TVEFOVF9DT0xPUiwKICAgIFtPbmVNaW51c0NvbnN0YW50Q29sb3JGYWN0b3JdOiBnbC5PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IsCiAgICBbQ29uc3RhbnRBbHBoYUZhY3Rvcl06IGdsLkNPTlNUQU5UX0FMUEhBLAogICAgW09uZU1pbnVzQ29uc3RhbnRBbHBoYUZhY3Rvcl06IGdsLk9ORV9NSU5VU19DT05TVEFOVF9BTFBIQQogIH07CiAgZnVuY3Rpb24gc2V0QmxlbmRpbmcoYmxlbmRpbmcsIGJsZW5kRXF1YXRpb24sIGJsZW5kU3JjLCBibGVuZERzdCwgYmxlbmRFcXVhdGlvbkFscGhhLCBibGVuZFNyY0FscGhhLCBibGVuZERzdEFscGhhLCBibGVuZENvbG9yLCBibGVuZEFscGhhLCBwcmVtdWx0aXBsaWVkQWxwaGEpIHsKICAgIGlmIChibGVuZGluZyA9PT0gTm9CbGVuZGluZykgewogICAgICBpZiAoY3VycmVudEJsZW5kaW5nRW5hYmxlZCA9PT0gdHJ1ZSkgewogICAgICAgIGRpc2FibGUoZ2wuQkxFTkQpOwogICAgICAgIGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPSBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoY3VycmVudEJsZW5kaW5nRW5hYmxlZCA9PT0gZmFsc2UpIHsKICAgICAgZW5hYmxlKGdsLkJMRU5EKTsKICAgICAgY3VycmVudEJsZW5kaW5nRW5hYmxlZCA9IHRydWU7CiAgICB9CiAgICBpZiAoYmxlbmRpbmcgIT09IEN1c3RvbUJsZW5kaW5nKSB7CiAgICAgIGlmIChibGVuZGluZyAhPT0gY3VycmVudEJsZW5kaW5nIHx8IHByZW11bHRpcGxpZWRBbHBoYSAhPT0gY3VycmVudFByZW11bHRpcGxlZEFscGhhKSB7CiAgICAgICAgaWYgKGN1cnJlbnRCbGVuZEVxdWF0aW9uICE9PSBBZGRFcXVhdGlvbiB8fCBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhICE9PSBBZGRFcXVhdGlvbikgewogICAgICAgICAgZ2wuYmxlbmRFcXVhdGlvbihnbC5GVU5DX0FERCk7CiAgICAgICAgICBjdXJyZW50QmxlbmRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uOwogICAgICAgICAgY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IEFkZEVxdWF0aW9uOwogICAgICAgIH0KICAgICAgICBpZiAocHJlbXVsdGlwbGllZEFscGhhKSB7CiAgICAgICAgICBzd2l0Y2ggKGJsZW5kaW5nKSB7CiAgICAgICAgICAgIGNhc2UgTm9ybWFsQmxlbmRpbmc6CiAgICAgICAgICAgICAgZ2wuYmxlbmRGdW5jU2VwYXJhdGUoZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEFkZGl0aXZlQmxlbmRpbmc6CiAgICAgICAgICAgICAgZ2wuYmxlbmRGdW5jKGdsLk9ORSwgZ2wuT05FKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOgogICAgICAgICAgICAgIGdsLmJsZW5kRnVuY1NlcGFyYXRlKGdsLlpFUk8sIGdsLk9ORV9NSU5VU19TUkNfQ09MT1IsIGdsLlpFUk8sIGdsLk9ORSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgTXVsdGlwbHlCbGVuZGluZzoKICAgICAgICAgICAgICBnbC5ibGVuZEZ1bmNTZXBhcmF0ZShnbC5aRVJPLCBnbC5TUkNfQ09MT1IsIGdsLlpFUk8sIGdsLlNSQ19BTFBIQSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZTogSW52YWxpZCBibGVuZGluZzogIiwgYmxlbmRpbmcpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzd2l0Y2ggKGJsZW5kaW5nKSB7CiAgICAgICAgICAgIGNhc2UgTm9ybWFsQmxlbmRpbmc6CiAgICAgICAgICAgICAgZ2wuYmxlbmRGdW5jU2VwYXJhdGUoZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEFkZGl0aXZlQmxlbmRpbmc6CiAgICAgICAgICAgICAgZ2wuYmxlbmRGdW5jKGdsLlNSQ19BTFBIQSwgZ2wuT05FKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOgogICAgICAgICAgICAgIGdsLmJsZW5kRnVuY1NlcGFyYXRlKGdsLlpFUk8sIGdsLk9ORV9NSU5VU19TUkNfQ09MT1IsIGdsLlpFUk8sIGdsLk9ORSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgTXVsdGlwbHlCbGVuZGluZzoKICAgICAgICAgICAgICBnbC5ibGVuZEZ1bmMoZ2wuWkVSTywgZ2wuU1JDX0NPTE9SKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLCBibGVuZGluZyk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7CiAgICAgICAgY3VycmVudEJsZW5kRHN0ID0gbnVsbDsKICAgICAgICBjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7CiAgICAgICAgY3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsOwogICAgICAgIGN1cnJlbnRCbGVuZENvbG9yLnNldCgwLCAwLCAwKTsKICAgICAgICBjdXJyZW50QmxlbmRBbHBoYSA9IDA7CiAgICAgICAgY3VycmVudEJsZW5kaW5nID0gYmxlbmRpbmc7CiAgICAgICAgY3VycmVudFByZW11bHRpcGxlZEFscGhhID0gcHJlbXVsdGlwbGllZEFscGhhOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGJsZW5kRXF1YXRpb25BbHBoYSA9IGJsZW5kRXF1YXRpb25BbHBoYSB8fCBibGVuZEVxdWF0aW9uOwogICAgYmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGEgfHwgYmxlbmRTcmM7CiAgICBibGVuZERzdEFscGhhID0gYmxlbmREc3RBbHBoYSB8fCBibGVuZERzdDsKICAgIGlmIChibGVuZEVxdWF0aW9uICE9PSBjdXJyZW50QmxlbmRFcXVhdGlvbiB8fCBibGVuZEVxdWF0aW9uQWxwaGEgIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEpIHsKICAgICAgZ2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKGVxdWF0aW9uVG9HTFtibGVuZEVxdWF0aW9uXSwgZXF1YXRpb25Ub0dMW2JsZW5kRXF1YXRpb25BbHBoYV0pOwogICAgICBjdXJyZW50QmxlbmRFcXVhdGlvbiA9IGJsZW5kRXF1YXRpb247CiAgICAgIGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBibGVuZEVxdWF0aW9uQWxwaGE7CiAgICB9CiAgICBpZiAoYmxlbmRTcmMgIT09IGN1cnJlbnRCbGVuZFNyYyB8fCBibGVuZERzdCAhPT0gY3VycmVudEJsZW5kRHN0IHx8IGJsZW5kU3JjQWxwaGEgIT09IGN1cnJlbnRCbGVuZFNyY0FscGhhIHx8IGJsZW5kRHN0QWxwaGEgIT09IGN1cnJlbnRCbGVuZERzdEFscGhhKSB7CiAgICAgIGdsLmJsZW5kRnVuY1NlcGFyYXRlKGZhY3RvclRvR0xbYmxlbmRTcmNdLCBmYWN0b3JUb0dMW2JsZW5kRHN0XSwgZmFjdG9yVG9HTFtibGVuZFNyY0FscGhhXSwgZmFjdG9yVG9HTFtibGVuZERzdEFscGhhXSk7CiAgICAgIGN1cnJlbnRCbGVuZFNyYyA9IGJsZW5kU3JjOwogICAgICBjdXJyZW50QmxlbmREc3QgPSBibGVuZERzdDsKICAgICAgY3VycmVudEJsZW5kU3JjQWxwaGEgPSBibGVuZFNyY0FscGhhOwogICAgICBjdXJyZW50QmxlbmREc3RBbHBoYSA9IGJsZW5kRHN0QWxwaGE7CiAgICB9CiAgICBpZiAoYmxlbmRDb2xvci5lcXVhbHMoY3VycmVudEJsZW5kQ29sb3IpID09PSBmYWxzZSB8fCBibGVuZEFscGhhICE9PSBjdXJyZW50QmxlbmRBbHBoYSkgewogICAgICBnbC5ibGVuZENvbG9yKGJsZW5kQ29sb3IuciwgYmxlbmRDb2xvci5nLCBibGVuZENvbG9yLmIsIGJsZW5kQWxwaGEpOwogICAgICBjdXJyZW50QmxlbmRDb2xvci5jb3B5KGJsZW5kQ29sb3IpOwogICAgICBjdXJyZW50QmxlbmRBbHBoYSA9IGJsZW5kQWxwaGE7CiAgICB9CiAgICBjdXJyZW50QmxlbmRpbmcgPSBibGVuZGluZzsKICAgIGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IGZhbHNlOwogIH0KICBmdW5jdGlvbiBzZXRNYXRlcmlhbChtYXRlcmlhbCwgZnJvbnRGYWNlQ1cpIHsKICAgIG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGUgPyBkaXNhYmxlKGdsLkNVTExfRkFDRSkgOiBlbmFibGUoZ2wuQ1VMTF9GQUNFKTsKICAgIGxldCBmbGlwU2lkZWQgPSBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZTsKICAgIGlmIChmcm9udEZhY2VDVykKICAgICAgZmxpcFNpZGVkID0gIWZsaXBTaWRlZDsKICAgIHNldEZsaXBTaWRlZChmbGlwU2lkZWQpOwogICAgbWF0ZXJpYWwuYmxlbmRpbmcgPT09IE5vcm1hbEJsZW5kaW5nICYmIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSBmYWxzZSA/IHNldEJsZW5kaW5nKE5vQmxlbmRpbmcpIDogc2V0QmxlbmRpbmcobWF0ZXJpYWwuYmxlbmRpbmcsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb24sIG1hdGVyaWFsLmJsZW5kU3JjLCBtYXRlcmlhbC5ibGVuZERzdCwgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbkFscGhhLCBtYXRlcmlhbC5ibGVuZFNyY0FscGhhLCBtYXRlcmlhbC5ibGVuZERzdEFscGhhLCBtYXRlcmlhbC5ibGVuZENvbG9yLCBtYXRlcmlhbC5ibGVuZEFscGhhLCBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEpOwogICAgZGVwdGhCdWZmZXIuc2V0RnVuYyhtYXRlcmlhbC5kZXB0aEZ1bmMpOwogICAgZGVwdGhCdWZmZXIuc2V0VGVzdChtYXRlcmlhbC5kZXB0aFRlc3QpOwogICAgZGVwdGhCdWZmZXIuc2V0TWFzayhtYXRlcmlhbC5kZXB0aFdyaXRlKTsKICAgIGNvbG9yQnVmZmVyLnNldE1hc2sobWF0ZXJpYWwuY29sb3JXcml0ZSk7CiAgICBjb25zdCBzdGVuY2lsV3JpdGUgPSBtYXRlcmlhbC5zdGVuY2lsV3JpdGU7CiAgICBzdGVuY2lsQnVmZmVyLnNldFRlc3Qoc3RlbmNpbFdyaXRlKTsKICAgIGlmIChzdGVuY2lsV3JpdGUpIHsKICAgICAgc3RlbmNpbEJ1ZmZlci5zZXRNYXNrKG1hdGVyaWFsLnN0ZW5jaWxXcml0ZU1hc2spOwogICAgICBzdGVuY2lsQnVmZmVyLnNldEZ1bmMobWF0ZXJpYWwuc3RlbmNpbEZ1bmMsIG1hdGVyaWFsLnN0ZW5jaWxSZWYsIG1hdGVyaWFsLnN0ZW5jaWxGdW5jTWFzayk7CiAgICAgIHN0ZW5jaWxCdWZmZXIuc2V0T3AobWF0ZXJpYWwuc3RlbmNpbEZhaWwsIG1hdGVyaWFsLnN0ZW5jaWxaRmFpbCwgbWF0ZXJpYWwuc3RlbmNpbFpQYXNzKTsKICAgIH0KICAgIHNldFBvbHlnb25PZmZzZXQobWF0ZXJpYWwucG9seWdvbk9mZnNldCwgbWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciwgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzKTsKICAgIG1hdGVyaWFsLmFscGhhVG9Db3ZlcmFnZSA9PT0gdHJ1ZSA/IGVuYWJsZShnbC5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpIDogZGlzYWJsZShnbC5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpOwogIH0KICBmdW5jdGlvbiBzZXRGbGlwU2lkZWQoZmxpcFNpZGVkKSB7CiAgICBpZiAoY3VycmVudEZsaXBTaWRlZCAhPT0gZmxpcFNpZGVkKSB7CiAgICAgIGlmIChmbGlwU2lkZWQpIHsKICAgICAgICBnbC5mcm9udEZhY2UoZ2wuQ1cpOwogICAgICB9IGVsc2UgewogICAgICAgIGdsLmZyb250RmFjZShnbC5DQ1cpOwogICAgICB9CiAgICAgIGN1cnJlbnRGbGlwU2lkZWQgPSBmbGlwU2lkZWQ7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHNldEN1bGxGYWNlKGN1bGxGYWNlKSB7CiAgICBpZiAoY3VsbEZhY2UgIT09IEN1bGxGYWNlTm9uZSkgewogICAgICBlbmFibGUoZ2wuQ1VMTF9GQUNFKTsKICAgICAgaWYgKGN1bGxGYWNlICE9PSBjdXJyZW50Q3VsbEZhY2UpIHsKICAgICAgICBpZiAoY3VsbEZhY2UgPT09IEN1bGxGYWNlQmFjaykgewogICAgICAgICAgZ2wuY3VsbEZhY2UoZ2wuQkFDSyk7CiAgICAgICAgfSBlbHNlIGlmIChjdWxsRmFjZSA9PT0gQ3VsbEZhY2VGcm9udCkgewogICAgICAgICAgZ2wuY3VsbEZhY2UoZ2wuRlJPTlQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBnbC5jdWxsRmFjZShnbC5GUk9OVF9BTkRfQkFDSyk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBkaXNhYmxlKGdsLkNVTExfRkFDRSk7CiAgICB9CiAgICBjdXJyZW50Q3VsbEZhY2UgPSBjdWxsRmFjZTsKICB9CiAgZnVuY3Rpb24gc2V0TGluZVdpZHRoKHdpZHRoKSB7CiAgICBpZiAod2lkdGggIT09IGN1cnJlbnRMaW5lV2lkdGgpIHsKICAgICAgaWYgKGxpbmVXaWR0aEF2YWlsYWJsZSkKICAgICAgICBnbC5saW5lV2lkdGgod2lkdGgpOwogICAgICBjdXJyZW50TGluZVdpZHRoID0gd2lkdGg7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHNldFBvbHlnb25PZmZzZXQocG9seWdvbk9mZnNldCwgZmFjdG9yLCB1bml0cykgewogICAgaWYgKHBvbHlnb25PZmZzZXQpIHsKICAgICAgZW5hYmxlKGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwpOwogICAgICBpZiAoY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgIT09IGZhY3RvciB8fCBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzICE9PSB1bml0cykgewogICAgICAgIGdsLnBvbHlnb25PZmZzZXQoZmFjdG9yLCB1bml0cyk7CiAgICAgICAgY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBmYWN0b3I7CiAgICAgICAgY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IHVuaXRzOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBkaXNhYmxlKGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwpOwogICAgfQogIH0KICBmdW5jdGlvbiBzZXRTY2lzc29yVGVzdChzY2lzc29yVGVzdCkgewogICAgaWYgKHNjaXNzb3JUZXN0KSB7CiAgICAgIGVuYWJsZShnbC5TQ0lTU09SX1RFU1QpOwogICAgfSBlbHNlIHsKICAgICAgZGlzYWJsZShnbC5TQ0lTU09SX1RFU1QpOwogICAgfQogIH0KICBmdW5jdGlvbiBhY3RpdmVUZXh0dXJlKHdlYmdsU2xvdCkgewogICAgaWYgKHdlYmdsU2xvdCA9PT0gdW5kZWZpbmVkKQogICAgICB3ZWJnbFNsb3QgPSBnbC5URVhUVVJFMCArIG1heFRleHR1cmVzIC0gMTsKICAgIGlmIChjdXJyZW50VGV4dHVyZVNsb3QgIT09IHdlYmdsU2xvdCkgewogICAgICBnbC5hY3RpdmVUZXh0dXJlKHdlYmdsU2xvdCk7CiAgICAgIGN1cnJlbnRUZXh0dXJlU2xvdCA9IHdlYmdsU2xvdDsKICAgIH0KICB9CiAgZnVuY3Rpb24gYmluZFRleHR1cmUod2ViZ2xUeXBlLCB3ZWJnbFRleHR1cmUsIHdlYmdsU2xvdCkgewogICAgaWYgKHdlYmdsU2xvdCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGlmIChjdXJyZW50VGV4dHVyZVNsb3QgPT09IG51bGwpIHsKICAgICAgICB3ZWJnbFNsb3QgPSBnbC5URVhUVVJFMCArIG1heFRleHR1cmVzIC0gMTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3ZWJnbFNsb3QgPSBjdXJyZW50VGV4dHVyZVNsb3Q7CiAgICAgIH0KICAgIH0KICAgIGxldCBib3VuZFRleHR1cmUgPSBjdXJyZW50Qm91bmRUZXh0dXJlc1t3ZWJnbFNsb3RdOwogICAgaWYgKGJvdW5kVGV4dHVyZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGJvdW5kVGV4dHVyZSA9IHsgdHlwZTogdW5kZWZpbmVkLCB0ZXh0dXJlOiB1bmRlZmluZWQgfTsKICAgICAgY3VycmVudEJvdW5kVGV4dHVyZXNbd2ViZ2xTbG90XSA9IGJvdW5kVGV4dHVyZTsKICAgIH0KICAgIGlmIChib3VuZFRleHR1cmUudHlwZSAhPT0gd2ViZ2xUeXBlIHx8IGJvdW5kVGV4dHVyZS50ZXh0dXJlICE9PSB3ZWJnbFRleHR1cmUpIHsKICAgICAgaWYgKGN1cnJlbnRUZXh0dXJlU2xvdCAhPT0gd2ViZ2xTbG90KSB7CiAgICAgICAgZ2wuYWN0aXZlVGV4dHVyZSh3ZWJnbFNsb3QpOwogICAgICAgIGN1cnJlbnRUZXh0dXJlU2xvdCA9IHdlYmdsU2xvdDsKICAgICAgfQogICAgICBnbC5iaW5kVGV4dHVyZSh3ZWJnbFR5cGUsIHdlYmdsVGV4dHVyZSB8fCBlbXB0eVRleHR1cmVzW3dlYmdsVHlwZV0pOwogICAgICBib3VuZFRleHR1cmUudHlwZSA9IHdlYmdsVHlwZTsKICAgICAgYm91bmRUZXh0dXJlLnRleHR1cmUgPSB3ZWJnbFRleHR1cmU7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHVuYmluZFRleHR1cmUoKSB7CiAgICBjb25zdCBib3VuZFRleHR1cmUgPSBjdXJyZW50Qm91bmRUZXh0dXJlc1tjdXJyZW50VGV4dHVyZVNsb3RdOwogICAgaWYgKGJvdW5kVGV4dHVyZSAhPT0gdW5kZWZpbmVkICYmIGJvdW5kVGV4dHVyZS50eXBlICE9PSB1bmRlZmluZWQpIHsKICAgICAgZ2wuYmluZFRleHR1cmUoYm91bmRUZXh0dXJlLnR5cGUsIG51bGwpOwogICAgICBib3VuZFRleHR1cmUudHlwZSA9IHVuZGVmaW5lZDsKICAgICAgYm91bmRUZXh0dXJlLnRleHR1cmUgPSB1bmRlZmluZWQ7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGNvbXByZXNzZWRUZXhJbWFnZTJEKCkgewogICAgdHJ5IHsKICAgICAgZ2wuY29tcHJlc3NlZFRleEltYWdlMkQuYXBwbHkoZ2wsIGFyZ3VtZW50cyk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsIGVycm9yKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gY29tcHJlc3NlZFRleEltYWdlM0QoKSB7CiAgICB0cnkgewogICAgICBnbC5jb21wcmVzc2VkVGV4SW1hZ2UzRC5hcHBseShnbCwgYXJndW1lbnRzKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IiwgZXJyb3IpOwogICAgfQogIH0KICBmdW5jdGlvbiB0ZXhTdWJJbWFnZTJEKCkgewogICAgdHJ5IHsKICAgICAgZ2wudGV4U3ViSW1hZ2UyRC5hcHBseShnbCwgYXJndW1lbnRzKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IiwgZXJyb3IpOwogICAgfQogIH0KICBmdW5jdGlvbiB0ZXhTdWJJbWFnZTNEKCkgewogICAgdHJ5IHsKICAgICAgZ2wudGV4U3ViSW1hZ2UzRC5hcHBseShnbCwgYXJndW1lbnRzKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IiwgZXJyb3IpOwogICAgfQogIH0KICBmdW5jdGlvbiBjb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCgpIHsKICAgIHRyeSB7CiAgICAgIGdsLmNvbXByZXNzZWRUZXhTdWJJbWFnZTJELmFwcGx5KGdsLCBhcmd1bWVudHMpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLCBlcnJvcik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKCkgewogICAgdHJ5IHsKICAgICAgZ2wuY29tcHJlc3NlZFRleFN1YkltYWdlM0QuYXBwbHkoZ2wsIGFyZ3VtZW50cyk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsIGVycm9yKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gdGV4U3RvcmFnZTJEKCkgewogICAgdHJ5IHsKICAgICAgZ2wudGV4U3RvcmFnZTJELmFwcGx5KGdsLCBhcmd1bWVudHMpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLCBlcnJvcik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHRleFN0b3JhZ2UzRCgpIHsKICAgIHRyeSB7CiAgICAgIGdsLnRleFN0b3JhZ2UzRC5hcHBseShnbCwgYXJndW1lbnRzKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IiwgZXJyb3IpOwogICAgfQogIH0KICBmdW5jdGlvbiB0ZXhJbWFnZTJEKCkgewogICAgdHJ5IHsKICAgICAgZ2wudGV4SW1hZ2UyRC5hcHBseShnbCwgYXJndW1lbnRzKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IiwgZXJyb3IpOwogICAgfQogIH0KICBmdW5jdGlvbiB0ZXhJbWFnZTNEKCkgewogICAgdHJ5IHsKICAgICAgZ2wudGV4SW1hZ2UzRC5hcHBseShnbCwgYXJndW1lbnRzKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IiwgZXJyb3IpOwogICAgfQogIH0KICBmdW5jdGlvbiBzY2lzc29yKHNjaXNzb3IyKSB7CiAgICBpZiAoY3VycmVudFNjaXNzb3IuZXF1YWxzKHNjaXNzb3IyKSA9PT0gZmFsc2UpIHsKICAgICAgZ2wuc2Npc3NvcihzY2lzc29yMi54LCBzY2lzc29yMi55LCBzY2lzc29yMi56LCBzY2lzc29yMi53KTsKICAgICAgY3VycmVudFNjaXNzb3IuY29weShzY2lzc29yMik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHZpZXdwb3J0KHZpZXdwb3J0MikgewogICAgaWYgKGN1cnJlbnRWaWV3cG9ydC5lcXVhbHModmlld3BvcnQyKSA9PT0gZmFsc2UpIHsKICAgICAgZ2wudmlld3BvcnQodmlld3BvcnQyLngsIHZpZXdwb3J0Mi55LCB2aWV3cG9ydDIueiwgdmlld3BvcnQyLncpOwogICAgICBjdXJyZW50Vmlld3BvcnQuY29weSh2aWV3cG9ydDIpOwogICAgfQogIH0KICBmdW5jdGlvbiB1cGRhdGVVQk9NYXBwaW5nKHVuaWZvcm1zR3JvdXAsIHByb2dyYW0pIHsKICAgIGxldCBtYXBwaW5nID0gdWJvUHJvZ3JhbU1hcC5nZXQocHJvZ3JhbSk7CiAgICBpZiAobWFwcGluZyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIG1hcHBpbmcgPSBuZXcgV2Vha01hcDsKICAgICAgdWJvUHJvZ3JhbU1hcC5zZXQocHJvZ3JhbSwgbWFwcGluZyk7CiAgICB9CiAgICBsZXQgYmxvY2tJbmRleCA9IG1hcHBpbmcuZ2V0KHVuaWZvcm1zR3JvdXApOwogICAgaWYgKGJsb2NrSW5kZXggPT09IHVuZGVmaW5lZCkgewogICAgICBibG9ja0luZGV4ID0gZ2wuZ2V0VW5pZm9ybUJsb2NrSW5kZXgocHJvZ3JhbSwgdW5pZm9ybXNHcm91cC5uYW1lKTsKICAgICAgbWFwcGluZy5zZXQodW5pZm9ybXNHcm91cCwgYmxvY2tJbmRleCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHVuaWZvcm1CbG9ja0JpbmRpbmcodW5pZm9ybXNHcm91cCwgcHJvZ3JhbSkgewogICAgY29uc3QgbWFwcGluZyA9IHVib1Byb2dyYW1NYXAuZ2V0KHByb2dyYW0pOwogICAgY29uc3QgYmxvY2tJbmRleCA9IG1hcHBpbmcuZ2V0KHVuaWZvcm1zR3JvdXApOwogICAgaWYgKHVib0JpbmRpbmdzLmdldChwcm9ncmFtKSAhPT0gYmxvY2tJbmRleCkgewogICAgICBnbC51bmlmb3JtQmxvY2tCaW5kaW5nKHByb2dyYW0sIGJsb2NrSW5kZXgsIHVuaWZvcm1zR3JvdXAuX19iaW5kaW5nUG9pbnRJbmRleCk7CiAgICAgIHVib0JpbmRpbmdzLnNldChwcm9ncmFtLCBibG9ja0luZGV4KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gcmVzZXQoKSB7CiAgICBnbC5kaXNhYmxlKGdsLkJMRU5EKTsKICAgIGdsLmRpc2FibGUoZ2wuQ1VMTF9GQUNFKTsKICAgIGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7CiAgICBnbC5kaXNhYmxlKGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwpOwogICAgZ2wuZGlzYWJsZShnbC5TQ0lTU09SX1RFU1QpOwogICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpOwogICAgZ2wuZGlzYWJsZShnbC5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpOwogICAgZ2wuYmxlbmRFcXVhdGlvbihnbC5GVU5DX0FERCk7CiAgICBnbC5ibGVuZEZ1bmMoZ2wuT05FLCBnbC5aRVJPKTsKICAgIGdsLmJsZW5kRnVuY1NlcGFyYXRlKGdsLk9ORSwgZ2wuWkVSTywgZ2wuT05FLCBnbC5aRVJPKTsKICAgIGdsLmJsZW5kQ29sb3IoMCwgMCwgMCwgMCk7CiAgICBnbC5jb2xvck1hc2sodHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApOwogICAgZ2wuZGVwdGhNYXNrKHRydWUpOwogICAgZ2wuZGVwdGhGdW5jKGdsLkxFU1MpOwogICAgZGVwdGhCdWZmZXIuc2V0UmV2ZXJzZWQoZmFsc2UpOwogICAgZ2wuY2xlYXJEZXB0aCgxKTsKICAgIGdsLnN0ZW5jaWxNYXNrKDQyOTQ5NjcyOTUpOwogICAgZ2wuc3RlbmNpbEZ1bmMoZ2wuQUxXQVlTLCAwLCA0Mjk0OTY3Mjk1KTsKICAgIGdsLnN0ZW5jaWxPcChnbC5LRUVQLCBnbC5LRUVQLCBnbC5LRUVQKTsKICAgIGdsLmNsZWFyU3RlbmNpbCgwKTsKICAgIGdsLmN1bGxGYWNlKGdsLkJBQ0spOwogICAgZ2wuZnJvbnRGYWNlKGdsLkNDVyk7CiAgICBnbC5wb2x5Z29uT2Zmc2V0KDAsIDApOwogICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCk7CiAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpOwogICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkRSQVdfRlJBTUVCVUZGRVIsIG51bGwpOwogICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLlJFQURfRlJBTUVCVUZGRVIsIG51bGwpOwogICAgZ2wudXNlUHJvZ3JhbShudWxsKTsKICAgIGdsLmxpbmVXaWR0aCgxKTsKICAgIGdsLnNjaXNzb3IoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KTsKICAgIGdsLnZpZXdwb3J0KDAsIDAsIGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCk7CiAgICBlbmFibGVkQ2FwYWJpbGl0aWVzID0ge307CiAgICBjdXJyZW50VGV4dHVyZVNsb3QgPSBudWxsOwogICAgY3VycmVudEJvdW5kVGV4dHVyZXMgPSB7fTsKICAgIGN1cnJlbnRCb3VuZEZyYW1lYnVmZmVycyA9IHt9OwogICAgY3VycmVudERyYXdidWZmZXJzID0gbmV3IFdlYWtNYXA7CiAgICBkZWZhdWx0RHJhd2J1ZmZlcnMgPSBbXTsKICAgIGN1cnJlbnRQcm9ncmFtID0gbnVsbDsKICAgIGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPSBmYWxzZTsKICAgIGN1cnJlbnRCbGVuZGluZyA9IG51bGw7CiAgICBjdXJyZW50QmxlbmRFcXVhdGlvbiA9IG51bGw7CiAgICBjdXJyZW50QmxlbmRTcmMgPSBudWxsOwogICAgY3VycmVudEJsZW5kRHN0ID0gbnVsbDsKICAgIGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsOwogICAgY3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsOwogICAgY3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsOwogICAgY3VycmVudEJsZW5kQ29sb3IgPSBuZXcgQ29sb3IoMCwgMCwgMCk7CiAgICBjdXJyZW50QmxlbmRBbHBoYSA9IDA7CiAgICBjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgPSBmYWxzZTsKICAgIGN1cnJlbnRGbGlwU2lkZWQgPSBudWxsOwogICAgY3VycmVudEN1bGxGYWNlID0gbnVsbDsKICAgIGN1cnJlbnRMaW5lV2lkdGggPSBudWxsOwogICAgY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBudWxsOwogICAgY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IG51bGw7CiAgICBjdXJyZW50U2Npc3Nvci5zZXQoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KTsKICAgIGN1cnJlbnRWaWV3cG9ydC5zZXQoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KTsKICAgIGNvbG9yQnVmZmVyLnJlc2V0KCk7CiAgICBkZXB0aEJ1ZmZlci5yZXNldCgpOwogICAgc3RlbmNpbEJ1ZmZlci5yZXNldCgpOwogIH0KICByZXR1cm4gewogICAgYnVmZmVyczogewogICAgICBjb2xvcjogY29sb3JCdWZmZXIsCiAgICAgIGRlcHRoOiBkZXB0aEJ1ZmZlciwKICAgICAgc3RlbmNpbDogc3RlbmNpbEJ1ZmZlcgogICAgfSwKICAgIGVuYWJsZSwKICAgIGRpc2FibGUsCiAgICBiaW5kRnJhbWVidWZmZXIsCiAgICBkcmF3QnVmZmVycywKICAgIHVzZVByb2dyYW0sCiAgICBzZXRCbGVuZGluZywKICAgIHNldE1hdGVyaWFsLAogICAgc2V0RmxpcFNpZGVkLAogICAgc2V0Q3VsbEZhY2UsCiAgICBzZXRMaW5lV2lkdGgsCiAgICBzZXRQb2x5Z29uT2Zmc2V0LAogICAgc2V0U2Npc3NvclRlc3QsCiAgICBhY3RpdmVUZXh0dXJlLAogICAgYmluZFRleHR1cmUsCiAgICB1bmJpbmRUZXh0dXJlLAogICAgY29tcHJlc3NlZFRleEltYWdlMkQsCiAgICBjb21wcmVzc2VkVGV4SW1hZ2UzRCwKICAgIHRleEltYWdlMkQsCiAgICB0ZXhJbWFnZTNELAogICAgdXBkYXRlVUJPTWFwcGluZywKICAgIHVuaWZvcm1CbG9ja0JpbmRpbmcsCiAgICB0ZXhTdG9yYWdlMkQsCiAgICB0ZXhTdG9yYWdlM0QsCiAgICB0ZXhTdWJJbWFnZTJELAogICAgdGV4U3ViSW1hZ2UzRCwKICAgIGNvbXByZXNzZWRUZXhTdWJJbWFnZTJELAogICAgY29tcHJlc3NlZFRleFN1YkltYWdlM0QsCiAgICBzY2lzc29yLAogICAgdmlld3BvcnQsCiAgICByZXNldAogIH07Cn0KZnVuY3Rpb24gV2ViR0xUZXh0dXJlcyhfZ2wsIGV4dGVuc2lvbnMsIHN0YXRlLCBwcm9wZXJ0aWVzLCBjYXBhYmlsaXRpZXMsIHV0aWxzLCBpbmZvKSB7CiAgY29uc3QgbXVsdGlzYW1wbGVkUlRURXh0ID0gZXh0ZW5zaW9ucy5oYXMoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpID8gZXh0ZW5zaW9ucy5nZXQoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpIDogbnVsbDsKICBjb25zdCBzdXBwb3J0c0ludmFsaWRhdGVGcmFtZWJ1ZmZlciA9IHR5cGVvZiBuYXZpZ2F0b3IgPT09ICJ1bmRlZmluZWQiID8gZmFsc2UgOiAvT2N1bHVzQnJvd3Nlci9nLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgY29uc3QgbXVsdGl2aWV3RXh0ID0gZXh0ZW5zaW9ucy5oYXMoIk9DVUxVU19tdWx0aXZpZXciKSA/IGV4dGVuc2lvbnMuZ2V0KCJPQ1VMVVNfbXVsdGl2aWV3IikgOiBudWxsOwogIGNvbnN0IF9pbWFnZURpbWVuc2lvbnMgPSBuZXcgVmVjdG9yMjsKICBjb25zdCBfdmlkZW9UZXh0dXJlcyA9IG5ldyBXZWFrTWFwOwogIGxldCBfY2FudmFzMjsKICBjb25zdCBfc291cmNlcyA9IG5ldyBXZWFrTWFwOwogIGxldCBfZGVmZXJyZWRVcGxvYWRzID0gW107CiAgbGV0IF9kZWZlclRleHR1cmVVcGxvYWRzID0gZmFsc2U7CiAgbGV0IHVzZU9mZnNjcmVlbkNhbnZhcyA9IGZhbHNlOwogIHRyeSB7CiAgICB1c2VPZmZzY3JlZW5DYW52YXMgPSB0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAidW5kZWZpbmVkIiAmJiBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsIDEpLmdldENvbnRleHQoIjJkIikgIT09IG51bGw7CiAgfSBjYXRjaCAoZXJyKSB7fQogIGZ1bmN0aW9uIGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KSB7CiAgICByZXR1cm4gdXNlT2Zmc2NyZWVuQ2FudmFzID8gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KSA6IGNyZWF0ZUVsZW1lbnROUygiY2FudmFzIik7CiAgfQogIGZ1bmN0aW9uIHJlc2l6ZUltYWdlKGltYWdlLCBuZWVkc05ld0NhbnZhcywgbWF4U2l6ZSkgewogICAgbGV0IHNjYWxlID0gMTsKICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBnZXREaW1lbnNpb25zKGltYWdlKTsKICAgIGlmIChkaW1lbnNpb25zLndpZHRoID4gbWF4U2l6ZSB8fCBkaW1lbnNpb25zLmhlaWdodCA+IG1heFNpemUpIHsKICAgICAgc2NhbGUgPSBtYXhTaXplIC8gTWF0aC5tYXgoZGltZW5zaW9ucy53aWR0aCwgZGltZW5zaW9ucy5oZWlnaHQpOwogICAgfQogICAgaWYgKHNjYWxlIDwgMSkgewogICAgICBpZiAodHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCB8fCB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICJ1bmRlZmluZWQiICYmIGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgdHlwZW9mIEltYWdlQml0bWFwICE9PSAidW5kZWZpbmVkIiAmJiBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwIHx8IHR5cGVvZiBWaWRlb0ZyYW1lICE9PSAidW5kZWZpbmVkIiAmJiBpbWFnZSBpbnN0YW5jZW9mIFZpZGVvRnJhbWUpIHsKICAgICAgICBjb25zdCB3aWR0aCA9IE1hdGguZmxvb3Ioc2NhbGUgKiBkaW1lbnNpb25zLndpZHRoKTsKICAgICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmZsb29yKHNjYWxlICogZGltZW5zaW9ucy5oZWlnaHQpOwogICAgICAgIGlmIChfY2FudmFzMiA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgX2NhbnZhczIgPSBjcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7CiAgICAgICAgY29uc3QgY2FudmFzID0gbmVlZHNOZXdDYW52YXMgPyBjcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCkgOiBfY2FudmFzMjsKICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDsKICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGhhcyBiZWVuIHJlc2l6ZWQgZnJvbSAoIiArIGRpbWVuc2lvbnMud2lkdGggKyAieCIgKyBkaW1lbnNpb25zLmhlaWdodCArICIpIHRvICgiICsgd2lkdGggKyAieCIgKyBoZWlnaHQgKyAiKS4iKTsKICAgICAgICByZXR1cm4gY2FudmFzOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICgiZGF0YSIgaW4gaW1hZ2UpIHsKICAgICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogSW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoIiArIGRpbWVuc2lvbnMud2lkdGggKyAieCIgKyBkaW1lbnNpb25zLmhlaWdodCArICIpLiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW1hZ2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpbWFnZTsKICB9CiAgZnVuY3Rpb24gdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKHRleHR1cmUpIHsKICAgIHJldHVybiB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwczsKICB9CiAgZnVuY3Rpb24gZ2VuZXJhdGVNaXBtYXAodGFyZ2V0KSB7CiAgICBfZ2wuZ2VuZXJhdGVNaXBtYXAodGFyZ2V0KTsKICB9CiAgZnVuY3Rpb24gZ2V0VGFyZ2V0VHlwZSh0ZXh0dXJlKSB7CiAgICBpZiAodGV4dHVyZS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCkKICAgICAgcmV0dXJuIF9nbC5URVhUVVJFX0NVQkVfTUFQOwogICAgaWYgKHRleHR1cmUuaXNXZWJHTDNEUmVuZGVyVGFyZ2V0KQogICAgICByZXR1cm4gX2dsLlRFWFRVUkVfM0Q7CiAgICBpZiAodGV4dHVyZS5pc1dlYkdMQXJyYXlSZW5kZXJUYXJnZXQgfHwgdGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUpCiAgICAgIHJldHVybiBfZ2wuVEVYVFVSRV8yRF9BUlJBWTsKICAgIHJldHVybiBfZ2wuVEVYVFVSRV8yRDsKICB9CiAgZnVuY3Rpb24gZ2V0SW50ZXJuYWxGb3JtYXQoaW50ZXJuYWxGb3JtYXROYW1lLCBnbEZvcm1hdCwgZ2xUeXBlLCBjb2xvclNwYWNlLCBmb3JjZUxpbmVhclRyYW5zZmVyID0gZmFsc2UpIHsKICAgIGlmIChpbnRlcm5hbEZvcm1hdE5hbWUgIT09IG51bGwpIHsKICAgICAgaWYgKF9nbFtpbnRlcm5hbEZvcm1hdE5hbWVdICE9PSB1bmRlZmluZWQpCiAgICAgICAgcmV0dXJuIF9nbFtpbnRlcm5hbEZvcm1hdE5hbWVdOwogICAgICBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gdXNlIG5vbi1leGlzdGluZyBXZWJHTCBpbnRlcm5hbCBmb3JtYXQgJyIgKyBpbnRlcm5hbEZvcm1hdE5hbWUgKyAiJyIpOwogICAgfQogICAgbGV0IGludGVybmFsRm9ybWF0ID0gZ2xGb3JtYXQ7CiAgICBpZiAoZ2xGb3JtYXQgPT09IF9nbC5SRUQpIHsKICAgICAgaWYgKGdsVHlwZSA9PT0gX2dsLkZMT0FUKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlIzMkY7CiAgICAgIGlmIChnbFR5cGUgPT09IF9nbC5IQUxGX0ZMT0FUKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlIxNkY7CiAgICAgIGlmIChnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9CWVRFKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlI4OwogICAgfQogICAgaWYgKGdsRm9ybWF0ID09PSBfZ2wuUkVEX0lOVEVHRVIpIHsKICAgICAgaWYgKGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX0JZVEUpCiAgICAgICAgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUjhVSTsKICAgICAgaWYgKGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX1NIT1JUKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlIxNlVJOwogICAgICBpZiAoZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfSU5UKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlIzMlVJOwogICAgICBpZiAoZ2xUeXBlID09PSBfZ2wuQllURSkKICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SOEk7CiAgICAgIGlmIChnbFR5cGUgPT09IF9nbC5TSE9SVCkKICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SMTZJOwogICAgICBpZiAoZ2xUeXBlID09PSBfZ2wuSU5UKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlIzMkk7CiAgICB9CiAgICBpZiAoZ2xGb3JtYXQgPT09IF9nbC5SRykgewogICAgICBpZiAoZ2xUeXBlID09PSBfZ2wuRkxPQVQpCiAgICAgICAgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkczMkY7CiAgICAgIGlmIChnbFR5cGUgPT09IF9nbC5IQUxGX0ZMT0FUKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlJHMTZGOwogICAgICBpZiAoZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfQllURSkKICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SRzg7CiAgICB9CiAgICBpZiAoZ2xGb3JtYXQgPT09IF9nbC5SR19JTlRFR0VSKSB7CiAgICAgIGlmIChnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9CWVRFKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlJHOFVJOwogICAgICBpZiAoZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfU0hPUlQpCiAgICAgICAgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkcxNlVJOwogICAgICBpZiAoZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfSU5UKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlJHMzJVSTsKICAgICAgaWYgKGdsVHlwZSA9PT0gX2dsLkJZVEUpCiAgICAgICAgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkc4STsKICAgICAgaWYgKGdsVHlwZSA9PT0gX2dsLlNIT1JUKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlJHMTZJOwogICAgICBpZiAoZ2xUeXBlID09PSBfZ2wuSU5UKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlJHMzJJOwogICAgfQogICAgaWYgKGdsRm9ybWF0ID09PSBfZ2wuUkdCX0lOVEVHRVIpIHsKICAgICAgaWYgKGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX0JZVEUpCiAgICAgICAgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkdCOFVJOwogICAgICBpZiAoZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfU0hPUlQpCiAgICAgICAgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkdCMTZVSTsKICAgICAgaWYgKGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX0lOVCkKICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0IzMlVJOwogICAgICBpZiAoZ2xUeXBlID09PSBfZ2wuQllURSkKICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0I4STsKICAgICAgaWYgKGdsVHlwZSA9PT0gX2dsLlNIT1JUKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQjE2STsKICAgICAgaWYgKGdsVHlwZSA9PT0gX2dsLklOVCkKICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0IzMkk7CiAgICB9CiAgICBpZiAoZ2xGb3JtYXQgPT09IF9nbC5SR0JBX0lOVEVHRVIpIHsKICAgICAgaWYgKGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX0JZVEUpCiAgICAgICAgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuUkdCQThVSTsKICAgICAgaWYgKGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX1NIT1JUKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQkExNlVJOwogICAgICBpZiAoZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfSU5UKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQkEzMlVJOwogICAgICBpZiAoZ2xUeXBlID09PSBfZ2wuQllURSkKICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0JBOEk7CiAgICAgIGlmIChnbFR5cGUgPT09IF9nbC5TSE9SVCkKICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0JBMTZJOwogICAgICBpZiAoZ2xUeXBlID09PSBfZ2wuSU5UKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQkEzMkk7CiAgICB9CiAgICBpZiAoZ2xGb3JtYXQgPT09IF9nbC5SR0IpIHsKICAgICAgaWYgKGdsVHlwZSA9PT0gX2dsLlVOU0lHTkVEX0lOVF81XzlfOV85X1JFVikKICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0I5X0U1OwogICAgfQogICAgaWYgKGdsRm9ybWF0ID09PSBfZ2wuUkdCQSkgewogICAgICBjb25zdCB0cmFuc2ZlciA9IGZvcmNlTGluZWFyVHJhbnNmZXIgPyBMaW5lYXJUcmFuc2ZlciA6IENvbG9yTWFuYWdlbWVudC5nZXRUcmFuc2Zlcihjb2xvclNwYWNlKTsKICAgICAgaWYgKGdsVHlwZSA9PT0gX2dsLkZMT0FUKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQkEzMkY7CiAgICAgIGlmIChnbFR5cGUgPT09IF9nbC5IQUxGX0ZMT0FUKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQkExNkY7CiAgICAgIGlmIChnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9CWVRFKQogICAgICAgIGludGVybmFsRm9ybWF0ID0gdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciA/IF9nbC5TUkdCOF9BTFBIQTggOiBfZ2wuUkdCQTg7CiAgICAgIGlmIChnbFR5cGUgPT09IF9nbC5VTlNJR05FRF9TSE9SVF80XzRfNF80KQogICAgICAgIGludGVybmFsRm9ybWF0ID0gX2dsLlJHQkE0OwogICAgICBpZiAoZ2xUeXBlID09PSBfZ2wuVU5TSUdORURfU0hPUlRfNV81XzVfMSkKICAgICAgICBpbnRlcm5hbEZvcm1hdCA9IF9nbC5SR0I1X0ExOwogICAgfQogICAgaWYgKGludGVybmFsRm9ybWF0ID09PSBfZ2wuUjE2RiB8fCBpbnRlcm5hbEZvcm1hdCA9PT0gX2dsLlIzMkYgfHwgaW50ZXJuYWxGb3JtYXQgPT09IF9nbC5SRzE2RiB8fCBpbnRlcm5hbEZvcm1hdCA9PT0gX2dsLlJHMzJGIHx8IGludGVybmFsRm9ybWF0ID09PSBfZ2wuUkdCQTE2RiB8fCBpbnRlcm5hbEZvcm1hdCA9PT0gX2dsLlJHQkEzMkYpIHsKICAgICAgZXh0ZW5zaW9ucy5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTsKICAgIH0KICAgIHJldHVybiBpbnRlcm5hbEZvcm1hdDsKICB9CiAgZnVuY3Rpb24gZ2V0SW50ZXJuYWxEZXB0aEZvcm1hdCh1c2VTdGVuY2lsLCBkZXB0aFR5cGUpIHsKICAgIGxldCBnbEludGVybmFsRm9ybWF0OwogICAgaWYgKHVzZVN0ZW5jaWwpIHsKICAgICAgaWYgKGRlcHRoVHlwZSA9PT0gbnVsbCB8fCBkZXB0aFR5cGUgPT09IFVuc2lnbmVkSW50VHlwZSB8fCBkZXB0aFR5cGUgPT09IFVuc2lnbmVkSW50MjQ4VHlwZSkgewogICAgICAgIGdsSW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEgyNF9TVEVOQ0lMODsKICAgICAgfSBlbHNlIGlmIChkZXB0aFR5cGUgPT09IEZsb2F0VHlwZSkgewogICAgICAgIGdsSW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEgzMkZfU1RFTkNJTDg7CiAgICAgIH0gZWxzZSBpZiAoZGVwdGhUeXBlID09PSBVbnNpZ25lZFNob3J0VHlwZSkgewogICAgICAgIGdsSW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEgyNF9TVEVOQ0lMODsKICAgICAgICBjb25zb2xlLndhcm4oIkRlcHRoVGV4dHVyZTogMTYgYml0IGRlcHRoIGF0dGFjaG1lbnQgaXMgbm90IHN1cHBvcnRlZCB3aXRoIHN0ZW5jaWwuIFVzaW5nIDI0LWJpdCBhdHRhY2htZW50LiIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoZGVwdGhUeXBlID09PSBudWxsIHx8IGRlcHRoVHlwZSA9PT0gVW5zaWduZWRJbnRUeXBlIHx8IGRlcHRoVHlwZSA9PT0gVW5zaWduZWRJbnQyNDhUeXBlKSB7CiAgICAgICAgZ2xJbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9DT01QT05FTlQyNDsKICAgICAgfSBlbHNlIGlmIChkZXB0aFR5cGUgPT09IEZsb2F0VHlwZSkgewogICAgICAgIGdsSW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UMzJGOwogICAgICB9IGVsc2UgaWYgKGRlcHRoVHlwZSA9PT0gVW5zaWduZWRTaG9ydFR5cGUpIHsKICAgICAgICBnbEludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX0NPTVBPTkVOVDE2OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZ2xJbnRlcm5hbEZvcm1hdDsKICB9CiAgZnVuY3Rpb24gZ2V0TWlwTGV2ZWxzKHRleHR1cmUsIGltYWdlKSB7CiAgICBpZiAodGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKHRleHR1cmUpID09PSB0cnVlIHx8IHRleHR1cmUuaXNGcmFtZWJ1ZmZlclRleHR1cmUgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlcikgewogICAgICByZXR1cm4gTWF0aC5sb2cyKE1hdGgubWF4KGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQpKSArIDE7CiAgICB9IGVsc2UgaWYgKHRleHR1cmUubWlwbWFwcyAhPT0gdW5kZWZpbmVkICYmIHRleHR1cmUubWlwbWFwcy5sZW5ndGggPiAwKSB7CiAgICAgIHJldHVybiB0ZXh0dXJlLm1pcG1hcHMubGVuZ3RoOwogICAgfSBlbHNlIGlmICh0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgJiYgQXJyYXkuaXNBcnJheSh0ZXh0dXJlLmltYWdlKSkgewogICAgICByZXR1cm4gaW1hZ2UubWlwbWFwcy5sZW5ndGg7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gMTsKICAgIH0KICB9CiAgZnVuY3Rpb24gb25UZXh0dXJlRGlzcG9zZShldmVudCkgewogICAgY29uc3QgdGV4dHVyZSA9IGV2ZW50LnRhcmdldDsKICAgIHRleHR1cmUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIG9uVGV4dHVyZURpc3Bvc2UpOwogICAgZGVhbGxvY2F0ZVRleHR1cmUodGV4dHVyZSk7CiAgICBpZiAodGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSkgewogICAgICBfdmlkZW9UZXh0dXJlcy5kZWxldGUodGV4dHVyZSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZShldmVudCkgewogICAgY29uc3QgcmVuZGVyVGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwogICAgcmVuZGVyVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLCBvblJlbmRlclRhcmdldERpc3Bvc2UpOwogICAgZGVhbGxvY2F0ZVJlbmRlclRhcmdldChyZW5kZXJUYXJnZXQpOwogIH0KICBmdW5jdGlvbiBkZWFsbG9jYXRlVGV4dHVyZSh0ZXh0dXJlKSB7CiAgICBjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KHRleHR1cmUpOwogICAgaWYgKHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID09PSB1bmRlZmluZWQpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IHNvdXJjZSA9IHRleHR1cmUuc291cmNlOwogICAgY29uc3Qgd2ViZ2xUZXh0dXJlcyA9IF9zb3VyY2VzLmdldChzb3VyY2UpOwogICAgaWYgKHdlYmdsVGV4dHVyZXMpIHsKICAgICAgY29uc3Qgd2ViZ2xUZXh0dXJlID0gd2ViZ2xUZXh0dXJlc1t0ZXh0dXJlUHJvcGVydGllcy5fX2NhY2hlS2V5XTsKICAgICAgd2ViZ2xUZXh0dXJlLnVzZWRUaW1lcy0tOwogICAgICBpZiAod2ViZ2xUZXh0dXJlLnVzZWRUaW1lcyA9PT0gMCkgewogICAgICAgIGRlbGV0ZVRleHR1cmUodGV4dHVyZSk7CiAgICAgIH0KICAgICAgaWYgKE9iamVjdC5rZXlzKHdlYmdsVGV4dHVyZXMpLmxlbmd0aCA9PT0gMCkgewogICAgICAgIF9zb3VyY2VzLmRlbGV0ZShzb3VyY2UpOwogICAgICB9CiAgICB9CiAgICBwcm9wZXJ0aWVzLnJlbW92ZSh0ZXh0dXJlKTsKICB9CiAgZnVuY3Rpb24gZGVsZXRlVGV4dHVyZSh0ZXh0dXJlKSB7CiAgICBjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KHRleHR1cmUpOwogICAgX2dsLmRlbGV0ZVRleHR1cmUodGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUpOwogICAgY29uc3Qgc291cmNlID0gdGV4dHVyZS5zb3VyY2U7CiAgICBjb25zdCB3ZWJnbFRleHR1cmVzID0gX3NvdXJjZXMuZ2V0KHNvdXJjZSk7CiAgICBkZWxldGUgd2ViZ2xUZXh0dXJlc1t0ZXh0dXJlUHJvcGVydGllcy5fX2NhY2hlS2V5XTsKICAgIGluZm8ubWVtb3J5LnRleHR1cmVzLS07CiAgfQogIGZ1bmN0aW9uIGRlYWxsb2NhdGVSZW5kZXJUYXJnZXQocmVuZGVyVGFyZ2V0KSB7CiAgICBjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQocmVuZGVyVGFyZ2V0KTsKICAgIGlmIChyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlKSB7CiAgICAgIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZGlzcG9zZSgpOwogICAgICBwcm9wZXJ0aWVzLnJlbW92ZShyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlKTsKICAgIH0KICAgIGlmIChyZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQpIHsKICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IDY7IGkrKykgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyW2ldKSkgewogICAgICAgICAgZm9yIChsZXQgbGV2ZWwgPSAwO2xldmVsIDwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbaV0ubGVuZ3RoOyBsZXZlbCsrKQogICAgICAgICAgICBfZ2wuZGVsZXRlRnJhbWVidWZmZXIocmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbaV1bbGV2ZWxdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX2dsLmRlbGV0ZUZyYW1lYnVmZmVyKHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyW2ldKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyKQogICAgICAgICAgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlcihyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlcltpXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyKSkgewogICAgICAgIGZvciAobGV0IGxldmVsID0gMDtsZXZlbCA8IHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLmxlbmd0aDsgbGV2ZWwrKykKICAgICAgICAgIF9nbC5kZWxldGVGcmFtZWJ1ZmZlcihyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlcltsZXZlbF0pOwogICAgICB9IGVsc2UgewogICAgICAgIF9nbC5kZWxldGVGcmFtZWJ1ZmZlcihyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlcik7CiAgICAgIH0KICAgICAgaWYgKHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyKQogICAgICAgIF9nbC5kZWxldGVSZW5kZXJidWZmZXIocmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIpOwogICAgICBpZiAocmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpCiAgICAgICAgX2dsLmRlbGV0ZUZyYW1lYnVmZmVyKHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKTsKICAgICAgaWYgKHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAocmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbaV0pCiAgICAgICAgICAgIF9nbC5kZWxldGVSZW5kZXJidWZmZXIocmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbaV0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAocmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIpCiAgICAgICAgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlcihyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcik7CiAgICB9CiAgICBjb25zdCB0ZXh0dXJlcyA9IHJlbmRlclRhcmdldC50ZXh0dXJlczsKICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IHRleHR1cmVzLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICBjb25zdCBhdHRhY2htZW50UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KHRleHR1cmVzW2ldKTsKICAgICAgaWYgKGF0dGFjaG1lbnRQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlKSB7CiAgICAgICAgX2dsLmRlbGV0ZVRleHR1cmUoYXR0YWNobWVudFByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUpOwogICAgICAgIGluZm8ubWVtb3J5LnRleHR1cmVzLS07CiAgICAgIH0KICAgICAgcHJvcGVydGllcy5yZW1vdmUodGV4dHVyZXNbaV0pOwogICAgfQogICAgcHJvcGVydGllcy5yZW1vdmUocmVuZGVyVGFyZ2V0KTsKICB9CiAgbGV0IHRleHR1cmVVbml0cyA9IDA7CiAgZnVuY3Rpb24gcmVzZXRUZXh0dXJlVW5pdHMoKSB7CiAgICB0ZXh0dXJlVW5pdHMgPSAwOwogIH0KICBmdW5jdGlvbiBhbGxvY2F0ZVRleHR1cmVVbml0KCkgewogICAgY29uc3QgdGV4dHVyZVVuaXQgPSB0ZXh0dXJlVW5pdHM7CiAgICBpZiAodGV4dHVyZVVuaXQgPj0gY2FwYWJpbGl0aWVzLm1heFRleHR1cmVzKSB7CiAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiICsgdGV4dHVyZVVuaXQgKyAiIHRleHR1cmUgdW5pdHMgd2hpbGUgdGhpcyBHUFUgc3VwcG9ydHMgb25seSAiICsgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVzKTsKICAgIH0KICAgIHRleHR1cmVVbml0cyArPSAxOwogICAgcmV0dXJuIHRleHR1cmVVbml0OwogIH0KICBmdW5jdGlvbiBnZXRUZXh0dXJlQ2FjaGVLZXkodGV4dHVyZSkgewogICAgY29uc3QgYXJyYXkgPSBbXTsKICAgIGFycmF5LnB1c2godGV4dHVyZS53cmFwUyk7CiAgICBhcnJheS5wdXNoKHRleHR1cmUud3JhcFQpOwogICAgYXJyYXkucHVzaCh0ZXh0dXJlLndyYXBSIHx8IDApOwogICAgYXJyYXkucHVzaCh0ZXh0dXJlLm1hZ0ZpbHRlcik7CiAgICBhcnJheS5wdXNoKHRleHR1cmUubWluRmlsdGVyKTsKICAgIGFycmF5LnB1c2godGV4dHVyZS5hbmlzb3Ryb3B5KTsKICAgIGFycmF5LnB1c2godGV4dHVyZS5pbnRlcm5hbEZvcm1hdCk7CiAgICBhcnJheS5wdXNoKHRleHR1cmUuZm9ybWF0KTsKICAgIGFycmF5LnB1c2godGV4dHVyZS50eXBlKTsKICAgIGFycmF5LnB1c2godGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMpOwogICAgYXJyYXkucHVzaCh0ZXh0dXJlLnByZW11bHRpcGx5QWxwaGEpOwogICAgYXJyYXkucHVzaCh0ZXh0dXJlLmZsaXBZKTsKICAgIGFycmF5LnB1c2godGV4dHVyZS51bnBhY2tBbGlnbm1lbnQpOwogICAgYXJyYXkucHVzaCh0ZXh0dXJlLmNvbG9yU3BhY2UpOwogICAgcmV0dXJuIGFycmF5LmpvaW4oKTsKICB9CiAgZnVuY3Rpb24gc2V0VGV4dHVyZTJEKHRleHR1cmUsIHNsb3QpIHsKICAgIGNvbnN0IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQodGV4dHVyZSk7CiAgICBpZiAodGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSkKICAgICAgdXBkYXRlVmlkZW9UZXh0dXJlKHRleHR1cmUpOwogICAgaWYgKHRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID09PSBmYWxzZSAmJiB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uKSB7CiAgICAgIGNvbnN0IGltYWdlID0gdGV4dHVyZS5pbWFnZTsKICAgICAgaWYgKGltYWdlID09PSBudWxsKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBubyBpbWFnZSBkYXRhIGZvdW5kLiIpOwogICAgICB9IGVsc2UgaWYgKGltYWdlLmNvbXBsZXRlID09PSBmYWxzZSkgewogICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZSIpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh1cGxvYWRUZXh0dXJlKHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90KSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgc3RhdGUuYmluZFRleHR1cmUoX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBfZ2wuVEVYVFVSRTAgKyBzbG90KTsKICB9CiAgZnVuY3Rpb24gc2V0VGV4dHVyZTJEQXJyYXkodGV4dHVyZSwgc2xvdCkgewogICAgY29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCh0ZXh0dXJlKTsKICAgIGlmICh0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uKSB7CiAgICAgIHVwbG9hZFRleHR1cmUodGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QpOwogICAgICByZXR1cm47CiAgICB9CiAgICBzdGF0ZS5iaW5kVGV4dHVyZShfZ2wuVEVYVFVSRV8yRF9BUlJBWSwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIF9nbC5URVhUVVJFMCArIHNsb3QpOwogIH0KICBmdW5jdGlvbiBzZXRUZXh0dXJlM0QodGV4dHVyZSwgc2xvdCkgewogICAgY29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCh0ZXh0dXJlKTsKICAgIGlmICh0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uKSB7CiAgICAgIHVwbG9hZFRleHR1cmUodGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QpOwogICAgICByZXR1cm47CiAgICB9CiAgICBzdGF0ZS5iaW5kVGV4dHVyZShfZ2wuVEVYVFVSRV8zRCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIF9nbC5URVhUVVJFMCArIHNsb3QpOwogIH0KICBmdW5jdGlvbiBzZXRUZXh0dXJlQ3ViZSh0ZXh0dXJlLCBzbG90KSB7CiAgICBjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KHRleHR1cmUpOwogICAgaWYgKHRleHR1cmUudmVyc2lvbiA+IDAgJiYgdGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uICE9PSB0ZXh0dXJlLnZlcnNpb24pIHsKICAgICAgdXBsb2FkQ3ViZVRleHR1cmUodGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QpOwogICAgICByZXR1cm47CiAgICB9CiAgICBzdGF0ZS5iaW5kVGV4dHVyZShfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIF9nbC5URVhUVVJFMCArIHNsb3QpOwogIH0KICBjb25zdCB3cmFwcGluZ1RvR0wgPSB7CiAgICBbUmVwZWF0V3JhcHBpbmddOiBfZ2wuUkVQRUFULAogICAgW0NsYW1wVG9FZGdlV3JhcHBpbmddOiBfZ2wuQ0xBTVBfVE9fRURHRSwKICAgIFtNaXJyb3JlZFJlcGVhdFdyYXBwaW5nXTogX2dsLk1JUlJPUkVEX1JFUEVBVAogIH07CiAgY29uc3QgZmlsdGVyVG9HTCA9IHsKICAgIFtOZWFyZXN0RmlsdGVyXTogX2dsLk5FQVJFU1QsCiAgICBbTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXJdOiBfZ2wuTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCwKICAgIFtOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyXTogX2dsLk5FQVJFU1RfTUlQTUFQX0xJTkVBUiwKICAgIFtMaW5lYXJGaWx0ZXJdOiBfZ2wuTElORUFSLAogICAgW0xpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXJdOiBfZ2wuTElORUFSX01JUE1BUF9ORUFSRVNULAogICAgW0xpbmVhck1pcG1hcExpbmVhckZpbHRlcl06IF9nbC5MSU5FQVJfTUlQTUFQX0xJTkVBUgogIH07CiAgY29uc3QgY29tcGFyZVRvR0wgPSB7CiAgICBbTmV2ZXJDb21wYXJlXTogX2dsLk5FVkVSLAogICAgW0Fsd2F5c0NvbXBhcmVdOiBfZ2wuQUxXQVlTLAogICAgW0xlc3NDb21wYXJlXTogX2dsLkxFU1MsCiAgICBbTGVzc0VxdWFsQ29tcGFyZV06IF9nbC5MRVFVQUwsCiAgICBbRXF1YWxDb21wYXJlXTogX2dsLkVRVUFMLAogICAgW0dyZWF0ZXJFcXVhbENvbXBhcmVdOiBfZ2wuR0VRVUFMLAogICAgW0dyZWF0ZXJDb21wYXJlXTogX2dsLkdSRUFURVIsCiAgICBbTm90RXF1YWxDb21wYXJlXTogX2dsLk5PVEVRVUFMCiAgfTsKICBmdW5jdGlvbiBzZXRUZXh0dXJlUGFyYW1ldGVycyh0ZXh0dXJlVHlwZSwgdGV4dHVyZSkgewogICAgaWYgKHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICYmIGV4dGVuc2lvbnMuaGFzKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKSA9PT0gZmFsc2UgJiYgKHRleHR1cmUubWFnRmlsdGVyID09PSBMaW5lYXJGaWx0ZXIgfHwgdGV4dHVyZS5tYWdGaWx0ZXIgPT09IExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIgfHwgdGV4dHVyZS5tYWdGaWx0ZXIgPT09IE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIgfHwgdGV4dHVyZS5tYWdGaWx0ZXIgPT09IExpbmVhck1pcG1hcExpbmVhckZpbHRlciB8fCB0ZXh0dXJlLm1pbkZpbHRlciA9PT0gTGluZWFyRmlsdGVyIHx8IHRleHR1cmUubWluRmlsdGVyID09PSBMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyIHx8IHRleHR1cmUubWluRmlsdGVyID09PSBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyIHx8IHRleHR1cmUubWluRmlsdGVyID09PSBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIpKSB7CiAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVW5hYmxlIHRvIHVzZSBsaW5lYXIgZmlsdGVyaW5nIHdpdGggZmxvYXRpbmcgcG9pbnQgdGV4dHVyZXMuIE9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLiIpOwogICAgfQogICAgX2dsLnRleFBhcmFtZXRlcmkodGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUywgd3JhcHBpbmdUb0dMW3RleHR1cmUud3JhcFNdKTsKICAgIF9nbC50ZXhQYXJhbWV0ZXJpKHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9XUkFQX1QsIHdyYXBwaW5nVG9HTFt0ZXh0dXJlLndyYXBUXSk7CiAgICBpZiAodGV4dHVyZVR5cGUgPT09IF9nbC5URVhUVVJFXzNEIHx8IHRleHR1cmVUeXBlID09PSBfZ2wuVEVYVFVSRV8yRF9BUlJBWSkgewogICAgICBfZ2wudGV4UGFyYW1ldGVyaSh0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9SLCB3cmFwcGluZ1RvR0xbdGV4dHVyZS53cmFwUl0pOwogICAgfQogICAgX2dsLnRleFBhcmFtZXRlcmkodGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01BR19GSUxURVIsIGZpbHRlclRvR0xbdGV4dHVyZS5tYWdGaWx0ZXJdKTsKICAgIF9nbC50ZXhQYXJhbWV0ZXJpKHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBmaWx0ZXJUb0dMW3RleHR1cmUubWluRmlsdGVyXSk7CiAgICBpZiAodGV4dHVyZS5jb21wYXJlRnVuY3Rpb24pIHsKICAgICAgX2dsLnRleFBhcmFtZXRlcmkodGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX0NPTVBBUkVfTU9ERSwgX2dsLkNPTVBBUkVfUkVGX1RPX1RFWFRVUkUpOwogICAgICBfZ2wudGV4UGFyYW1ldGVyaSh0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfQ09NUEFSRV9GVU5DLCBjb21wYXJlVG9HTFt0ZXh0dXJlLmNvbXBhcmVGdW5jdGlvbl0pOwogICAgfQogICAgaWYgKGV4dGVuc2lvbnMuaGFzKCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKSA9PT0gdHJ1ZSkgewogICAgICBpZiAodGV4dHVyZS5tYWdGaWx0ZXIgPT09IE5lYXJlc3RGaWx0ZXIpCiAgICAgICAgcmV0dXJuOwogICAgICBpZiAodGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhck1pcG1hcExpbmVhckZpbHRlcikKICAgICAgICByZXR1cm47CiAgICAgIGlmICh0ZXh0dXJlLnR5cGUgPT09IEZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmhhcygiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIikgPT09IGZhbHNlKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKHRleHR1cmUuYW5pc290cm9weSA+IDEgfHwgcHJvcGVydGllcy5nZXQodGV4dHVyZSkuX19jdXJyZW50QW5pc290cm9weSkgewogICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTsKICAgICAgICBfZ2wudGV4UGFyYW1ldGVyZih0ZXh0dXJlVHlwZSwgZXh0ZW5zaW9uLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULCBNYXRoLm1pbih0ZXh0dXJlLmFuaXNvdHJvcHksIGNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkpKTsKICAgICAgICBwcm9wZXJ0aWVzLmdldCh0ZXh0dXJlKS5fX2N1cnJlbnRBbmlzb3Ryb3B5ID0gdGV4dHVyZS5hbmlzb3Ryb3B5OwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGluaXRUZXh0dXJlKHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlKSB7CiAgICBsZXQgZm9yY2VVcGxvYWQgPSBmYWxzZTsKICAgIGlmICh0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID0gdHJ1ZTsKICAgICAgdGV4dHVyZS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgb25UZXh0dXJlRGlzcG9zZSk7CiAgICB9CiAgICBjb25zdCBzb3VyY2UgPSB0ZXh0dXJlLnNvdXJjZTsKICAgIGxldCB3ZWJnbFRleHR1cmVzID0gX3NvdXJjZXMuZ2V0KHNvdXJjZSk7CiAgICBpZiAod2ViZ2xUZXh0dXJlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHdlYmdsVGV4dHVyZXMgPSB7fTsKICAgICAgX3NvdXJjZXMuc2V0KHNvdXJjZSwgd2ViZ2xUZXh0dXJlcyk7CiAgICB9CiAgICBjb25zdCB0ZXh0dXJlQ2FjaGVLZXkgPSBnZXRUZXh0dXJlQ2FjaGVLZXkodGV4dHVyZSk7CiAgICBpZiAodGV4dHVyZUNhY2hlS2V5ICE9PSB0ZXh0dXJlUHJvcGVydGllcy5fX2NhY2hlS2V5KSB7CiAgICAgIGlmICh3ZWJnbFRleHR1cmVzW3RleHR1cmVDYWNoZUtleV0gPT09IHVuZGVmaW5lZCkgewogICAgICAgIHdlYmdsVGV4dHVyZXNbdGV4dHVyZUNhY2hlS2V5XSA9IHsKICAgICAgICAgIHRleHR1cmU6IF9nbC5jcmVhdGVUZXh0dXJlKCksCiAgICAgICAgICB1c2VkVGltZXM6IDAKICAgICAgICB9OwogICAgICAgIGluZm8ubWVtb3J5LnRleHR1cmVzKys7CiAgICAgICAgZm9yY2VVcGxvYWQgPSB0cnVlOwogICAgICB9CiAgICAgIHdlYmdsVGV4dHVyZXNbdGV4dHVyZUNhY2hlS2V5XS51c2VkVGltZXMrKzsKICAgICAgY29uc3Qgd2ViZ2xUZXh0dXJlID0gd2ViZ2xUZXh0dXJlc1t0ZXh0dXJlUHJvcGVydGllcy5fX2NhY2hlS2V5XTsKICAgICAgaWYgKHdlYmdsVGV4dHVyZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgd2ViZ2xUZXh0dXJlc1t0ZXh0dXJlUHJvcGVydGllcy5fX2NhY2hlS2V5XS51c2VkVGltZXMtLTsKICAgICAgICBpZiAod2ViZ2xUZXh0dXJlLnVzZWRUaW1lcyA9PT0gMCkgewogICAgICAgICAgZGVsZXRlVGV4dHVyZSh0ZXh0dXJlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGV4dHVyZVByb3BlcnRpZXMuX19jYWNoZUtleSA9IHRleHR1cmVDYWNoZUtleTsKICAgICAgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgPSB3ZWJnbFRleHR1cmVzW3RleHR1cmVDYWNoZUtleV0udGV4dHVyZTsKICAgIH0KICAgIHJldHVybiBmb3JjZVVwbG9hZDsKICB9CiAgZnVuY3Rpb24gc2V0RGVmZXJUZXh0dXJlVXBsb2FkcyhkZWZlckZsYWcpIHsKICAgIF9kZWZlclRleHR1cmVVcGxvYWRzID0gZGVmZXJGbGFnOwogIH0KICBmdW5jdGlvbiBydW5EZWZlcnJlZFVwbG9hZHMoKSB7CiAgICBjb25zdCBwcmV2aW91c0RlZmVyU2V0dGluZyA9IF9kZWZlclRleHR1cmVVcGxvYWRzOwogICAgX2RlZmVyVGV4dHVyZVVwbG9hZHMgPSBmYWxzZTsKICAgIGZvciAoY29uc3QgdXBsb2FkIG9mIF9kZWZlcnJlZFVwbG9hZHMpIHsKICAgICAgdXBsb2FkVGV4dHVyZSh1cGxvYWQudGV4dHVyZVByb3BlcnRpZXMsIHVwbG9hZC50ZXh0dXJlLCB1cGxvYWQuc2xvdCk7CiAgICAgIHVwbG9hZC50ZXh0dXJlLmlzUGVuZGluZ0RlZmVycmVkVXBsb2FkID0gZmFsc2U7CiAgICB9CiAgICBfZGVmZXJyZWRVcGxvYWRzID0gW107CiAgICBfZGVmZXJUZXh0dXJlVXBsb2FkcyA9IHByZXZpb3VzRGVmZXJTZXR0aW5nOwogIH0KICBmdW5jdGlvbiB1cGxvYWRUZXh0dXJlKHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90KSB7CiAgICBpZiAoX2RlZmVyVGV4dHVyZVVwbG9hZHMpIHsKICAgICAgaWYgKCF0ZXh0dXJlLmlzUGVuZGluZ0RlZmVycmVkVXBsb2FkKSB7CiAgICAgICAgdGV4dHVyZS5pc1BlbmRpbmdEZWZlcnJlZFVwbG9hZCA9IHRydWU7CiAgICAgICAgX2RlZmVycmVkVXBsb2Fkcy5wdXNoKHsgdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgbGV0IHRleHR1cmVUeXBlID0gX2dsLlRFWFRVUkVfMkQ7CiAgICBpZiAodGV4dHVyZS5pc0RhdGFBcnJheVRleHR1cmUgfHwgdGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUpCiAgICAgIHRleHR1cmVUeXBlID0gX2dsLlRFWFRVUkVfMkRfQVJSQVk7CiAgICBpZiAodGV4dHVyZS5pc0RhdGEzRFRleHR1cmUpCiAgICAgIHRleHR1cmVUeXBlID0gX2dsLlRFWFRVUkVfM0Q7CiAgICBjb25zdCBmb3JjZVVwbG9hZCA9IGluaXRUZXh0dXJlKHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlKTsKICAgIGNvbnN0IHNvdXJjZSA9IHRleHR1cmUuc291cmNlOwogICAgc3RhdGUuYmluZFRleHR1cmUodGV4dHVyZVR5cGUsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBfZ2wuVEVYVFVSRTAgKyBzbG90KTsKICAgIGNvbnN0IHNvdXJjZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldChzb3VyY2UpOwogICAgaWYgKHNvdXJjZS52ZXJzaW9uICE9PSBzb3VyY2VQcm9wZXJ0aWVzLl9fdmVyc2lvbiB8fCBmb3JjZVVwbG9hZCA9PT0gdHJ1ZSkgewogICAgICBzdGF0ZS5hY3RpdmVUZXh0dXJlKF9nbC5URVhUVVJFMCArIHNsb3QpOwogICAgICBjb25zdCB3b3JraW5nUHJpbWFyaWVzID0gQ29sb3JNYW5hZ2VtZW50LmdldFByaW1hcmllcyhDb2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2UpOwogICAgICBjb25zdCB0ZXh0dXJlUHJpbWFyaWVzID0gdGV4dHVyZS5jb2xvclNwYWNlID09PSBOb0NvbG9yU3BhY2UgPyBudWxsIDogQ29sb3JNYW5hZ2VtZW50LmdldFByaW1hcmllcyh0ZXh0dXJlLmNvbG9yU3BhY2UpOwogICAgICBjb25zdCB1bnBhY2tDb252ZXJzaW9uID0gdGV4dHVyZS5jb2xvclNwYWNlID09PSBOb0NvbG9yU3BhY2UgfHwgd29ya2luZ1ByaW1hcmllcyA9PT0gdGV4dHVyZVByaW1hcmllcyA/IF9nbC5OT05FIDogX2dsLkJST1dTRVJfREVGQVVMVF9XRUJHTDsKICAgICAgX2dsLnBpeGVsU3RvcmVpKF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0ZXh0dXJlLmZsaXBZKTsKICAgICAgX2dsLnBpeGVsU3RvcmVpKF9nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSk7CiAgICAgIF9nbC5waXhlbFN0b3JlaShfZ2wuVU5QQUNLX0FMSUdOTUVOVCwgdGV4dHVyZS51bnBhY2tBbGlnbm1lbnQpOwogICAgICBfZ2wucGl4ZWxTdG9yZWkoX2dsLlVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0wsIHVucGFja0NvbnZlcnNpb24pOwogICAgICBsZXQgaW1hZ2UgPSByZXNpemVJbWFnZSh0ZXh0dXJlLmltYWdlLCBmYWxzZSwgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplKTsKICAgICAgaW1hZ2UgPSB2ZXJpZnlDb2xvclNwYWNlKHRleHR1cmUsIGltYWdlKTsKICAgICAgY29uc3QgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KHRleHR1cmUuZm9ybWF0LCB0ZXh0dXJlLmNvbG9yU3BhY2UpOwogICAgICBjb25zdCBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KHRleHR1cmUudHlwZSk7CiAgICAgIGxldCBnbEludGVybmFsRm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQodGV4dHVyZS5pbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgdGV4dHVyZS5jb2xvclNwYWNlLCB0ZXh0dXJlLmlzVmlkZW9UZXh0dXJlKTsKICAgICAgc2V0VGV4dHVyZVBhcmFtZXRlcnModGV4dHVyZVR5cGUsIHRleHR1cmUpOwogICAgICBsZXQgbWlwbWFwOwogICAgICBjb25zdCBtaXBtYXBzID0gdGV4dHVyZS5taXBtYXBzOwogICAgICBjb25zdCB1c2VUZXhTdG9yYWdlID0gdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSAhPT0gdHJ1ZTsKICAgICAgY29uc3QgYWxsb2NhdGVNZW1vcnkgPSBzb3VyY2VQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IGZvcmNlVXBsb2FkID09PSB0cnVlOwogICAgICBjb25zdCBkYXRhUmVhZHkgPSBzb3VyY2UuZGF0YVJlYWR5OwogICAgICBjb25zdCBsZXZlbHMgPSBnZXRNaXBMZXZlbHModGV4dHVyZSwgaW1hZ2UpOwogICAgICBpZiAodGV4dHVyZS5pc0RlcHRoVGV4dHVyZSkgewogICAgICAgIGdsSW50ZXJuYWxGb3JtYXQgPSBnZXRJbnRlcm5hbERlcHRoRm9ybWF0KHRleHR1cmUuZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQsIHRleHR1cmUudHlwZSk7CiAgICAgICAgaWYgKGFsbG9jYXRlTWVtb3J5KSB7CiAgICAgICAgICBpZiAodXNlVGV4U3RvcmFnZSkgewogICAgICAgICAgICBzdGF0ZS50ZXhTdG9yYWdlMkQoX2dsLlRFWFRVUkVfMkQsIDEsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUudGV4SW1hZ2UyRChfZ2wuVEVYVFVSRV8yRCwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRleHR1cmUuaXNEYXRhVGV4dHVyZSkgewogICAgICAgIGlmIChtaXBtYXBzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGlmICh1c2VUZXhTdG9yYWdlICYmIGFsbG9jYXRlTWVtb3J5KSB7CiAgICAgICAgICAgIHN0YXRlLnRleFN0b3JhZ2UyRChfZ2wuVEVYVFVSRV8yRCwgbGV2ZWxzLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXBzWzBdLndpZHRoLCBtaXBtYXBzWzBdLmhlaWdodCk7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICAgICAgICBtaXBtYXAgPSBtaXBtYXBzW2ldOwogICAgICAgICAgICBpZiAodXNlVGV4U3RvcmFnZSkgewogICAgICAgICAgICAgIGlmIChkYXRhUmVhZHkpIHsKICAgICAgICAgICAgICAgIHN0YXRlLnRleFN1YkltYWdlMkQoX2dsLlRFWFRVUkVfMkQsIGksIDAsIDAsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzdGF0ZS50ZXhJbWFnZTJEKF9nbC5URVhUVVJFXzJELCBpLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHVzZVRleFN0b3JhZ2UpIHsKICAgICAgICAgICAgaWYgKGFsbG9jYXRlTWVtb3J5KSB7CiAgICAgICAgICAgICAgc3RhdGUudGV4U3RvcmFnZTJEKF9nbC5URVhUVVJFXzJELCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkYXRhUmVhZHkpIHsKICAgICAgICAgICAgICBzdGF0ZS50ZXhTdWJJbWFnZTJEKF9nbC5URVhUVVJFXzJELCAwLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZS5kYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUudGV4SW1hZ2UyRChfZ2wuVEVYVFVSRV8yRCwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSkgewogICAgICAgIGlmICh0ZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSkgewogICAgICAgICAgaWYgKHVzZVRleFN0b3JhZ2UgJiYgYWxsb2NhdGVNZW1vcnkpIHsKICAgICAgICAgICAgc3RhdGUudGV4U3RvcmFnZTNEKF9nbC5URVhUVVJFXzJEX0FSUkFZLCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcHNbMF0ud2lkdGgsIG1pcG1hcHNbMF0uaGVpZ2h0LCBpbWFnZS5kZXB0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICAgICAgICBtaXBtYXAgPSBtaXBtYXBzW2ldOwogICAgICAgICAgICBpZiAodGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQpIHsKICAgICAgICAgICAgICBpZiAoZ2xGb3JtYXQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICh1c2VUZXhTdG9yYWdlKSB7CiAgICAgICAgICAgICAgICAgIGlmIChkYXRhUmVhZHkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZS5sYXllclVwZGF0ZXMuc2l6ZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyQnl0ZUxlbmd0aCA9IGdldEJ5dGVMZW5ndGgobWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCB0ZXh0dXJlLmZvcm1hdCwgdGV4dHVyZS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXJJbmRleCBvZiB0ZXh0dXJlLmxheWVyVXBkYXRlcykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXllckRhdGEgPSBtaXBtYXAuZGF0YS5zdWJhcnJheShsYXllckluZGV4ICogbGF5ZXJCeXRlTGVuZ3RoIC8gbWlwbWFwLmRhdGEuQllURVNfUEVSX0VMRU1FTlQsIChsYXllckluZGV4ICsgMSkgKiBsYXllckJ5dGVMZW5ndGggLyBtaXBtYXAuZGF0YS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKF9nbC5URVhUVVJFXzJEX0FSUkFZLCBpLCAwLCAwLCBsYXllckluZGV4LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDEsIGdsRm9ybWF0LCBsYXllckRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5jbGVhckxheWVyVXBkYXRlcygpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRChfZ2wuVEVYVFVSRV8yRF9BUlJBWSwgaSwgMCwgMCwgMCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCBpbWFnZS5kZXB0aCwgZ2xGb3JtYXQsIG1pcG1hcC5kYXRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTNEKF9nbC5URVhUVVJFXzJEX0FSUkFZLCBpLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIGltYWdlLmRlcHRoLCAwLCBtaXBtYXAuZGF0YSwgMCwgMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnVwbG9hZFRleHR1cmUoKSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAodXNlVGV4U3RvcmFnZSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGFSZWFkeSkgewogICAgICAgICAgICAgICAgICBzdGF0ZS50ZXhTdWJJbWFnZTNEKF9nbC5URVhUVVJFXzJEX0FSUkFZLCBpLCAwLCAwLCAwLCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIGltYWdlLmRlcHRoLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHN0YXRlLnRleEltYWdlM0QoX2dsLlRFWFRVUkVfMkRfQVJSQVksIGksIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgaW1hZ2UuZGVwdGgsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHVzZVRleFN0b3JhZ2UgJiYgYWxsb2NhdGVNZW1vcnkpIHsKICAgICAgICAgICAgc3RhdGUudGV4U3RvcmFnZTJEKF9nbC5URVhUVVJFXzJELCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcHNbMF0ud2lkdGgsIG1pcG1hcHNbMF0uaGVpZ2h0KTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoO2kgPCBpbDsgaSsrKSB7CiAgICAgICAgICAgIG1pcG1hcCA9IG1pcG1hcHNbaV07CiAgICAgICAgICAgIGlmICh0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCQUZvcm1hdCkgewogICAgICAgICAgICAgIGlmIChnbEZvcm1hdCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKHVzZVRleFN0b3JhZ2UpIHsKICAgICAgICAgICAgICAgICAgaWYgKGRhdGFSZWFkeSkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKF9nbC5URVhUVVJFXzJELCBpLCAwLCAwLCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIGdsRm9ybWF0LCBtaXBtYXAuZGF0YSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKF9nbC5URVhUVVJFXzJELCBpLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmICh1c2VUZXhTdG9yYWdlKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YVJlYWR5KSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlLnRleFN1YkltYWdlMkQoX2dsLlRFWFRVUkVfMkQsIGksIDAsIDAsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdGF0ZS50ZXhJbWFnZTJEKF9nbC5URVhUVVJFXzJELCBpLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGV4dHVyZS5pc0RhdGFBcnJheVRleHR1cmUpIHsKICAgICAgICBpZiAodXNlVGV4U3RvcmFnZSkgewogICAgICAgICAgaWYgKGFsbG9jYXRlTWVtb3J5KSB7CiAgICAgICAgICAgIHN0YXRlLnRleFN0b3JhZ2UzRChfZ2wuVEVYVFVSRV8yRF9BUlJBWSwgbGV2ZWxzLCBnbEludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCBpbWFnZS5kZXB0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGF0YVJlYWR5KSB7CiAgICAgICAgICAgIGlmICh0ZXh0dXJlLmxheWVyVXBkYXRlcy5zaXplID4gMCkgewogICAgICAgICAgICAgIGNvbnN0IGxheWVyQnl0ZUxlbmd0aCA9IGdldEJ5dGVMZW5ndGgoaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgdGV4dHVyZS5mb3JtYXQsIHRleHR1cmUudHlwZSk7CiAgICAgICAgICAgICAgZm9yIChjb25zdCBsYXllckluZGV4IG9mIHRleHR1cmUubGF5ZXJVcGRhdGVzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBsYXllckRhdGEgPSBpbWFnZS5kYXRhLnN1YmFycmF5KGxheWVySW5kZXggKiBsYXllckJ5dGVMZW5ndGggLyBpbWFnZS5kYXRhLkJZVEVTX1BFUl9FTEVNRU5ULCAobGF5ZXJJbmRleCArIDEpICogbGF5ZXJCeXRlTGVuZ3RoIC8gaW1hZ2UuZGF0YS5CWVRFU19QRVJfRUxFTUVOVCk7CiAgICAgICAgICAgICAgICBzdGF0ZS50ZXhTdWJJbWFnZTNEKF9nbC5URVhUVVJFXzJEX0FSUkFZLCAwLCAwLCAwLCBsYXllckluZGV4LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAxLCBnbEZvcm1hdCwgZ2xUeXBlLCBsYXllckRhdGEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0ZXh0dXJlLmNsZWFyTGF5ZXJVcGRhdGVzKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc3RhdGUudGV4U3ViSW1hZ2UzRChfZ2wuVEVYVFVSRV8yRF9BUlJBWSwgMCwgMCwgMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgaW1hZ2UuZGVwdGgsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0YXRlLnRleEltYWdlM0QoX2dsLlRFWFRVUkVfMkRfQVJSQVksIDAsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIGltYWdlLmRlcHRoLCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZS5kYXRhKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGV4dHVyZS5pc0RhdGEzRFRleHR1cmUpIHsKICAgICAgICBpZiAodXNlVGV4U3RvcmFnZSkgewogICAgICAgICAgaWYgKGFsbG9jYXRlTWVtb3J5KSB7CiAgICAgICAgICAgIHN0YXRlLnRleFN0b3JhZ2UzRChfZ2wuVEVYVFVSRV8zRCwgbGV2ZWxzLCBnbEludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCBpbWFnZS5kZXB0aCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGF0YVJlYWR5KSB7CiAgICAgICAgICAgIHN0YXRlLnRleFN1YkltYWdlM0QoX2dsLlRFWFRVUkVfM0QsIDAsIDAsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIGltYWdlLmRlcHRoLCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZS5kYXRhKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUudGV4SW1hZ2UzRChfZ2wuVEVYVFVSRV8zRCwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgaW1hZ2UuZGVwdGgsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0ZXh0dXJlLmlzRnJhbWVidWZmZXJUZXh0dXJlKSB7CiAgICAgICAgaWYgKGFsbG9jYXRlTWVtb3J5KSB7CiAgICAgICAgICBpZiAodXNlVGV4U3RvcmFnZSkgewogICAgICAgICAgICBzdGF0ZS50ZXhTdG9yYWdlMkQoX2dsLlRFWFRVUkVfMkQsIGxldmVscywgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZXQgeyB3aWR0aCwgaGVpZ2h0IH0gPSBpbWFnZTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IGxldmVsczsgaSsrKSB7CiAgICAgICAgICAgICAgc3RhdGUudGV4SW1hZ2UyRChfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xJbnRlcm5hbEZvcm1hdCwgd2lkdGgsIGhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCk7CiAgICAgICAgICAgICAgd2lkdGggPj49IDE7CiAgICAgICAgICAgICAgaGVpZ2h0ID4+PSAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChtaXBtYXBzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGlmICh1c2VUZXhTdG9yYWdlICYmIGFsbG9jYXRlTWVtb3J5KSB7CiAgICAgICAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBnZXREaW1lbnNpb25zKG1pcG1hcHNbMF0pOwogICAgICAgICAgICBzdGF0ZS50ZXhTdG9yYWdlMkQoX2dsLlRFWFRVUkVfMkQsIGxldmVscywgZ2xJbnRlcm5hbEZvcm1hdCwgZGltZW5zaW9ucy53aWR0aCwgZGltZW5zaW9ucy5oZWlnaHQpOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgICAgICAgbWlwbWFwID0gbWlwbWFwc1tpXTsKICAgICAgICAgICAgaWYgKHVzZVRleFN0b3JhZ2UpIHsKICAgICAgICAgICAgICBpZiAoZGF0YVJlYWR5KSB7CiAgICAgICAgICAgICAgICBzdGF0ZS50ZXhTdWJJbWFnZTJEKF9nbC5URVhUVVJFXzJELCBpLCAwLCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzdGF0ZS50ZXhJbWFnZTJEKF9nbC5URVhUVVJFXzJELCBpLCBnbEludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAodXNlVGV4U3RvcmFnZSkgewogICAgICAgICAgICBpZiAoYWxsb2NhdGVNZW1vcnkpIHsKICAgICAgICAgICAgICBjb25zdCBkaW1lbnNpb25zID0gZ2V0RGltZW5zaW9ucyhpbWFnZSk7CiAgICAgICAgICAgICAgc3RhdGUudGV4U3RvcmFnZTJEKF9nbC5URVhUVVJFXzJELCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIGRpbWVuc2lvbnMud2lkdGgsIGRpbWVuc2lvbnMuaGVpZ2h0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGF0YVJlYWR5KSB7CiAgICAgICAgICAgICAgc3RhdGUudGV4U3ViSW1hZ2UyRChfZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZS50ZXhJbWFnZTJEKF9nbC5URVhUVVJFXzJELCAwLCBnbEludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHModGV4dHVyZSkpIHsKICAgICAgICBnZW5lcmF0ZU1pcG1hcCh0ZXh0dXJlVHlwZSk7CiAgICAgIH0KICAgICAgc291cmNlUHJvcGVydGllcy5fX3ZlcnNpb24gPSBzb3VyY2UudmVyc2lvbjsKICAgICAgaWYgKHRleHR1cmUub25VcGRhdGUpCiAgICAgICAgdGV4dHVyZS5vblVwZGF0ZSh0ZXh0dXJlKTsKICAgIH0KICAgIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjsKICAgIHJldHVybiB0cnVlOwogIH0KICBmdW5jdGlvbiB1cGxvYWRDdWJlVGV4dHVyZSh0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCkgewogICAgaWYgKHRleHR1cmUuaW1hZ2UubGVuZ3RoICE9PSA2KQogICAgICByZXR1cm47CiAgICBjb25zdCBmb3JjZVVwbG9hZCA9IGluaXRUZXh0dXJlKHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlKTsKICAgIGNvbnN0IHNvdXJjZSA9IHRleHR1cmUuc291cmNlOwogICAgc3RhdGUuYmluZFRleHR1cmUoX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBfZ2wuVEVYVFVSRTAgKyBzbG90KTsKICAgIGNvbnN0IHNvdXJjZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldChzb3VyY2UpOwogICAgaWYgKHNvdXJjZS52ZXJzaW9uICE9PSBzb3VyY2VQcm9wZXJ0aWVzLl9fdmVyc2lvbiB8fCBmb3JjZVVwbG9hZCA9PT0gdHJ1ZSkgewogICAgICBzdGF0ZS5hY3RpdmVUZXh0dXJlKF9nbC5URVhUVVJFMCArIHNsb3QpOwogICAgICBjb25zdCB3b3JraW5nUHJpbWFyaWVzID0gQ29sb3JNYW5hZ2VtZW50LmdldFByaW1hcmllcyhDb2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2UpOwogICAgICBjb25zdCB0ZXh0dXJlUHJpbWFyaWVzID0gdGV4dHVyZS5jb2xvclNwYWNlID09PSBOb0NvbG9yU3BhY2UgPyBudWxsIDogQ29sb3JNYW5hZ2VtZW50LmdldFByaW1hcmllcyh0ZXh0dXJlLmNvbG9yU3BhY2UpOwogICAgICBjb25zdCB1bnBhY2tDb252ZXJzaW9uID0gdGV4dHVyZS5jb2xvclNwYWNlID09PSBOb0NvbG9yU3BhY2UgfHwgd29ya2luZ1ByaW1hcmllcyA9PT0gdGV4dHVyZVByaW1hcmllcyA/IF9nbC5OT05FIDogX2dsLkJST1dTRVJfREVGQVVMVF9XRUJHTDsKICAgICAgX2dsLnBpeGVsU3RvcmVpKF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0ZXh0dXJlLmZsaXBZKTsKICAgICAgX2dsLnBpeGVsU3RvcmVpKF9nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIHRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSk7CiAgICAgIF9nbC5waXhlbFN0b3JlaShfZ2wuVU5QQUNLX0FMSUdOTUVOVCwgdGV4dHVyZS51bnBhY2tBbGlnbm1lbnQpOwogICAgICBfZ2wucGl4ZWxTdG9yZWkoX2dsLlVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0wsIHVucGFja0NvbnZlcnNpb24pOwogICAgICBjb25zdCBpc0NvbXByZXNzZWQgPSB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgfHwgdGV4dHVyZS5pbWFnZVswXS5pc0NvbXByZXNzZWRUZXh0dXJlOwogICAgICBjb25zdCBpc0RhdGFUZXh0dXJlID0gdGV4dHVyZS5pbWFnZVswXSAmJiB0ZXh0dXJlLmltYWdlWzBdLmlzRGF0YVRleHR1cmU7CiAgICAgIGNvbnN0IGN1YmVJbWFnZSA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMDtpIDwgNjsgaSsrKSB7CiAgICAgICAgaWYgKCFpc0NvbXByZXNzZWQgJiYgIWlzRGF0YVRleHR1cmUpIHsKICAgICAgICAgIGN1YmVJbWFnZVtpXSA9IHJlc2l6ZUltYWdlKHRleHR1cmUuaW1hZ2VbaV0sIHRydWUsIGNhcGFiaWxpdGllcy5tYXhDdWJlbWFwU2l6ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1YmVJbWFnZVtpXSA9IGlzRGF0YVRleHR1cmUgPyB0ZXh0dXJlLmltYWdlW2ldLmltYWdlIDogdGV4dHVyZS5pbWFnZVtpXTsKICAgICAgICB9CiAgICAgICAgY3ViZUltYWdlW2ldID0gdmVyaWZ5Q29sb3JTcGFjZSh0ZXh0dXJlLCBjdWJlSW1hZ2VbaV0pOwogICAgICB9CiAgICAgIGNvbnN0IGltYWdlID0gY3ViZUltYWdlWzBdLCBnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQodGV4dHVyZS5mb3JtYXQsIHRleHR1cmUuY29sb3JTcGFjZSksIGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQodGV4dHVyZS50eXBlKSwgZ2xJbnRlcm5hbEZvcm1hdCA9IGdldEludGVybmFsRm9ybWF0KHRleHR1cmUuaW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIHRleHR1cmUuY29sb3JTcGFjZSk7CiAgICAgIGNvbnN0IHVzZVRleFN0b3JhZ2UgPSB0ZXh0dXJlLmlzVmlkZW9UZXh0dXJlICE9PSB0cnVlOwogICAgICBjb25zdCBhbGxvY2F0ZU1lbW9yeSA9IHNvdXJjZVByb3BlcnRpZXMuX192ZXJzaW9uID09PSB1bmRlZmluZWQgfHwgZm9yY2VVcGxvYWQgPT09IHRydWU7CiAgICAgIGNvbnN0IGRhdGFSZWFkeSA9IHNvdXJjZS5kYXRhUmVhZHk7CiAgICAgIGxldCBsZXZlbHMgPSBnZXRNaXBMZXZlbHModGV4dHVyZSwgaW1hZ2UpOwogICAgICBzZXRUZXh0dXJlUGFyYW1ldGVycyhfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZSk7CiAgICAgIGxldCBtaXBtYXBzOwogICAgICBpZiAoaXNDb21wcmVzc2VkKSB7CiAgICAgICAgaWYgKHVzZVRleFN0b3JhZ2UgJiYgYWxsb2NhdGVNZW1vcnkpIHsKICAgICAgICAgIHN0YXRlLnRleFN0b3JhZ2UyRChfZ2wuVEVYVFVSRV9DVUJFX01BUCwgbGV2ZWxzLCBnbEludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0KTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IDY7IGkrKykgewogICAgICAgICAgbWlwbWFwcyA9IGN1YmVJbWFnZVtpXS5taXBtYXBzOwogICAgICAgICAgZm9yIChsZXQgaiA9IDA7aiA8IG1pcG1hcHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgY29uc3QgbWlwbWFwID0gbWlwbWFwc1tqXTsKICAgICAgICAgICAgaWYgKHRleHR1cmUuZm9ybWF0ICE9PSBSR0JBRm9ybWF0KSB7CiAgICAgICAgICAgICAgaWYgKGdsRm9ybWF0ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAodXNlVGV4U3RvcmFnZSkgewogICAgICAgICAgICAgICAgICBpZiAoZGF0YVJlYWR5KSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUuY29tcHJlc3NlZFRleFN1YkltYWdlMkQoX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGosIDAsIDAsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgZ2xGb3JtYXQsIG1pcG1hcC5kYXRhKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RhdGUuY29tcHJlc3NlZFRleEltYWdlMkQoX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGosIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgbWlwbWFwLmRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmICh1c2VUZXhTdG9yYWdlKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YVJlYWR5KSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlLnRleFN1YkltYWdlMkQoX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGosIDAsIDAsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdGF0ZS50ZXhJbWFnZTJEKF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBqLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWlwbWFwcyA9IHRleHR1cmUubWlwbWFwczsKICAgICAgICBpZiAodXNlVGV4U3RvcmFnZSAmJiBhbGxvY2F0ZU1lbW9yeSkgewogICAgICAgICAgaWYgKG1pcG1hcHMubGVuZ3RoID4gMCkKICAgICAgICAgICAgbGV2ZWxzKys7CiAgICAgICAgICBjb25zdCBkaW1lbnNpb25zID0gZ2V0RGltZW5zaW9ucyhjdWJlSW1hZ2VbMF0pOwogICAgICAgICAgc3RhdGUudGV4U3RvcmFnZTJEKF9nbC5URVhUVVJFX0NVQkVfTUFQLCBsZXZlbHMsIGdsSW50ZXJuYWxGb3JtYXQsIGRpbWVuc2lvbnMud2lkdGgsIGRpbWVuc2lvbnMuaGVpZ2h0KTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IDY7IGkrKykgewogICAgICAgICAgaWYgKGlzRGF0YVRleHR1cmUpIHsKICAgICAgICAgICAgaWYgKHVzZVRleFN0b3JhZ2UpIHsKICAgICAgICAgICAgICBpZiAoZGF0YVJlYWR5KSB7CiAgICAgICAgICAgICAgICBzdGF0ZS50ZXhTdWJJbWFnZTJEKF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCAwLCAwLCBjdWJlSW1hZ2VbaV0ud2lkdGgsIGN1YmVJbWFnZVtpXS5oZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIGN1YmVJbWFnZVtpXS5kYXRhKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc3RhdGUudGV4SW1hZ2UyRChfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgY3ViZUltYWdlW2ldLndpZHRoLCBjdWJlSW1hZ2VbaV0uaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBjdWJlSW1hZ2VbaV0uZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7aiA8IG1pcG1hcHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICBjb25zdCBtaXBtYXAgPSBtaXBtYXBzW2pdOwogICAgICAgICAgICAgIGNvbnN0IG1pcG1hcEltYWdlID0gbWlwbWFwLmltYWdlW2ldLmltYWdlOwogICAgICAgICAgICAgIGlmICh1c2VUZXhTdG9yYWdlKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YVJlYWR5KSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlLnRleFN1YkltYWdlMkQoX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGogKyAxLCAwLCAwLCBtaXBtYXBJbWFnZS53aWR0aCwgbWlwbWFwSW1hZ2UuaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXBJbWFnZS5kYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3RhdGUudGV4SW1hZ2UyRChfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiArIDEsIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcEltYWdlLndpZHRoLCBtaXBtYXBJbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcEltYWdlLmRhdGEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHVzZVRleFN0b3JhZ2UpIHsKICAgICAgICAgICAgICBpZiAoZGF0YVJlYWR5KSB7CiAgICAgICAgICAgICAgICBzdGF0ZS50ZXhTdWJJbWFnZTJEKF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCAwLCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBjdWJlSW1hZ2VbaV0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzdGF0ZS50ZXhJbWFnZTJEKF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCBnbEludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBjdWJlSW1hZ2VbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwO2ogPCBtaXBtYXBzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgY29uc3QgbWlwbWFwID0gbWlwbWFwc1tqXTsKICAgICAgICAgICAgICBpZiAodXNlVGV4U3RvcmFnZSkgewogICAgICAgICAgICAgICAgaWYgKGRhdGFSZWFkeSkgewogICAgICAgICAgICAgICAgICBzdGF0ZS50ZXhTdWJJbWFnZTJEKF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBqICsgMSwgMCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmltYWdlW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3RhdGUudGV4SW1hZ2UyRChfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiArIDEsIGdsSW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5pbWFnZVtpXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHModGV4dHVyZSkpIHsKICAgICAgICBnZW5lcmF0ZU1pcG1hcChfZ2wuVEVYVFVSRV9DVUJFX01BUCk7CiAgICAgIH0KICAgICAgc291cmNlUHJvcGVydGllcy5fX3ZlcnNpb24gPSBzb3VyY2UudmVyc2lvbjsKICAgICAgaWYgKHRleHR1cmUub25VcGRhdGUpCiAgICAgICAgdGV4dHVyZS5vblVwZGF0ZSh0ZXh0dXJlKTsKICAgIH0KICAgIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjsKICB9CiAgZnVuY3Rpb24gc2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoZnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCwgdGV4dHVyZSwgYXR0YWNobWVudCwgdGV4dHVyZVRhcmdldCwgbGV2ZWwpIHsKICAgIGNvbnN0IGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCh0ZXh0dXJlLmZvcm1hdCwgdGV4dHVyZS5jb2xvclNwYWNlKTsKICAgIGNvbnN0IGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQodGV4dHVyZS50eXBlKTsKICAgIGNvbnN0IGdsSW50ZXJuYWxGb3JtYXQgPSBnZXRJbnRlcm5hbEZvcm1hdCh0ZXh0dXJlLmludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCB0ZXh0dXJlLmNvbG9yU3BhY2UpOwogICAgY29uc3QgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KHJlbmRlclRhcmdldCk7CiAgICBjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KHRleHR1cmUpOwogICAgdGV4dHVyZVByb3BlcnRpZXMuX19yZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7CiAgICBpZiAoIXJlbmRlclRhcmdldFByb3BlcnRpZXMuX19oYXNFeHRlcm5hbFRleHR1cmVzKSB7CiAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgcmVuZGVyVGFyZ2V0LndpZHRoID4+IGxldmVsKTsKICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgcmVuZGVyVGFyZ2V0LmhlaWdodCA+PiBsZXZlbCk7CiAgICAgIGlmIChyZW5kZXJUYXJnZXQuaXNXZWJHTE11bHRpdmlld1JlbmRlclRhcmdldCA9PT0gdHJ1ZSkgewogICAgICAgIHN0YXRlLnRleFN0b3JhZ2UzRChfZ2wuVEVYVFVSRV8yRF9BUlJBWSwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0LCByZW5kZXJUYXJnZXQubnVtVmlld3MpOwogICAgICB9IGVsc2UgaWYgKHRleHR1cmVUYXJnZXQgPT09IF9nbC5URVhUVVJFXzNEIHx8IHRleHR1cmVUYXJnZXQgPT09IF9nbC5URVhUVVJFXzJEX0FSUkFZKSB7CiAgICAgICAgc3RhdGUudGV4SW1hZ2UzRCh0ZXh0dXJlVGFyZ2V0LCBsZXZlbCwgZ2xJbnRlcm5hbEZvcm1hdCwgd2lkdGgsIGhlaWdodCwgcmVuZGVyVGFyZ2V0LmRlcHRoLCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdGF0ZS50ZXhJbWFnZTJEKHRleHR1cmVUYXJnZXQsIGxldmVsLCBnbEludGVybmFsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsKTsKICAgICAgfQogICAgfQogICAgc3RhdGUuYmluZEZyYW1lYnVmZmVyKF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIpOwogICAgY29uc3QgbXVsdGlzYW1wbGVkID0gdXNlTXVsdGlzYW1wbGVkUlRUKHJlbmRlclRhcmdldCk7CiAgICBpZiAocmVuZGVyVGFyZ2V0LmlzV2ViR0xNdWx0aXZpZXdSZW5kZXJUYXJnZXQgPT09IHRydWUpIHsKICAgICAgaWYgKG11bHRpc2FtcGxlZCkgewogICAgICAgIG11bHRpdmlld0V4dC5mcmFtZWJ1ZmZlclRleHR1cmVNdWx0aXNhbXBsZU11bHRpdmlld09WUihfZ2wuRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIDAsIGdldFJlbmRlclRhcmdldFNhbXBsZXMocmVuZGVyVGFyZ2V0KSwgMCwgcmVuZGVyVGFyZ2V0Lm51bVZpZXdzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtdWx0aXZpZXdFeHQuZnJhbWVidWZmZXJUZXh0dXJlTXVsdGl2aWV3T1ZSKF9nbC5GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgMCwgMCwgcmVuZGVyVGFyZ2V0Lm51bVZpZXdzKTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0ZXh0dXJlVGFyZ2V0ID09PSBfZ2wuVEVYVFVSRV8yRCB8fCB0ZXh0dXJlVGFyZ2V0ID49IF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggJiYgdGV4dHVyZVRhcmdldCA8PSBfZ2wuVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aKSB7CiAgICAgIGlmIChtdWx0aXNhbXBsZWQpIHsKICAgICAgICBtdWx0aXNhbXBsZWRSVFRFeHQuZnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVChfZ2wuRlJBTUVCVUZGRVIsIGF0dGFjaG1lbnQsIHRleHR1cmVUYXJnZXQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCAwLCBnZXRSZW5kZXJUYXJnZXRTYW1wbGVzKHJlbmRlclRhcmdldCkpOwogICAgICB9IGVsc2UgewogICAgICAgIF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChfZ2wuRlJBTUVCVUZGRVIsIGF0dGFjaG1lbnQsIHRleHR1cmVUYXJnZXQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBsZXZlbCk7CiAgICAgIH0KICAgIH0KICAgIHN0YXRlLmJpbmRGcmFtZWJ1ZmZlcihfZ2wuRlJBTUVCVUZGRVIsIG51bGwpOwogIH0KICBmdW5jdGlvbiBzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UocmVuZGVyYnVmZmVyLCByZW5kZXJUYXJnZXQsIGlzTXVsdGlzYW1wbGUpIHsKICAgIF9nbC5iaW5kUmVuZGVyYnVmZmVyKF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlcik7CiAgICBpZiAocmVuZGVyVGFyZ2V0LmlzV2ViR0xNdWx0aXZpZXdSZW5kZXJUYXJnZXQgPT09IHRydWUpIHsKICAgICAgY29uc3QgdXNlTXVsdGlzYW1wbGUgPSB1c2VNdWx0aXNhbXBsZWRSVFQocmVuZGVyVGFyZ2V0KTsKICAgICAgY29uc3QgbnVtVmlld3MgPSByZW5kZXJUYXJnZXQubnVtVmlld3M7CiAgICAgIGNvbnN0IGRlcHRoVGV4dHVyZSA9IHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmU7CiAgICAgIGxldCBnbEludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX0NPTVBPTkVOVDI0OwogICAgICBsZXQgZ2xEZXB0aEF0dGFjaG1lbnQgPSBfZ2wuREVQVEhfQVRUQUNITUVOVDsKICAgICAgaWYgKGRlcHRoVGV4dHVyZSAmJiBkZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUpIHsKICAgICAgICBpZiAoZGVwdGhUZXh0dXJlLnR5cGUgPT09IEZsb2F0VHlwZSkgewogICAgICAgICAgZ2xJbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9DT01QT05FTlQzMkY7CiAgICAgICAgfSBlbHNlIGlmIChkZXB0aFRleHR1cmUudHlwZSA9PT0gVW5zaWduZWRJbnQyNDhUeXBlKSB7CiAgICAgICAgICBnbEludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIMjRfU1RFTkNJTDg7CiAgICAgICAgICBnbERlcHRoQXR0YWNobWVudCA9IF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxldCBkZXB0aFN0ZW5jaWxUZXh0dXJlID0gcHJvcGVydGllcy5nZXQocmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSkuX193ZWJnbFRleHR1cmU7CiAgICAgIGlmIChkZXB0aFN0ZW5jaWxUZXh0dXJlID09PSB1bmRlZmluZWQpIHsKICAgICAgICBkZXB0aFN0ZW5jaWxUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTsKICAgICAgICBfZ2wuYmluZFRleHR1cmUoX2dsLlRFWFRVUkVfMkRfQVJSQVksIGRlcHRoU3RlbmNpbFRleHR1cmUpOwogICAgICAgIF9nbC50ZXhTdG9yYWdlM0QoX2dsLlRFWFRVUkVfMkRfQVJSQVksIDEsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCwgbnVtVmlld3MpOwogICAgICB9CiAgICAgIGlmICh1c2VNdWx0aXNhbXBsZSkgewogICAgICAgIG11bHRpdmlld0V4dC5mcmFtZWJ1ZmZlclRleHR1cmVNdWx0aXNhbXBsZU11bHRpdmlld09WUihfZ2wuRlJBTUVCVUZGRVIsIGdsRGVwdGhBdHRhY2htZW50LCBkZXB0aFN0ZW5jaWxUZXh0dXJlLCAwLCBnZXRSZW5kZXJUYXJnZXRTYW1wbGVzKHJlbmRlclRhcmdldCksIDAsIG51bVZpZXdzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtdWx0aXZpZXdFeHQuZnJhbWVidWZmZXJUZXh0dXJlTXVsdGl2aWV3T1ZSKF9nbC5GUkFNRUJVRkZFUiwgZ2xEZXB0aEF0dGFjaG1lbnQsIGRlcHRoU3RlbmNpbFRleHR1cmUsIDAsIDAsIG51bVZpZXdzKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChyZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIpIHsKICAgICAgY29uc3QgZGVwdGhUZXh0dXJlID0gcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZTsKICAgICAgY29uc3QgZGVwdGhUeXBlID0gZGVwdGhUZXh0dXJlICYmIGRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSA/IGRlcHRoVGV4dHVyZS50eXBlIDogbnVsbDsKICAgICAgY29uc3QgZ2xJbnRlcm5hbEZvcm1hdCA9IGdldEludGVybmFsRGVwdGhGb3JtYXQocmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIsIGRlcHRoVHlwZSk7CiAgICAgIGNvbnN0IGdsQXR0YWNobWVudFR5cGUgPSByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciA/IF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQgOiBfZ2wuREVQVEhfQVRUQUNITUVOVDsKICAgICAgY29uc3Qgc2FtcGxlcyA9IGdldFJlbmRlclRhcmdldFNhbXBsZXMocmVuZGVyVGFyZ2V0KTsKICAgICAgY29uc3QgaXNVc2VNdWx0aXNhbXBsZWRSVFQgPSB1c2VNdWx0aXNhbXBsZWRSVFQocmVuZGVyVGFyZ2V0KTsKICAgICAgaWYgKGlzVXNlTXVsdGlzYW1wbGVkUlRUKSB7CiAgICAgICAgbXVsdGlzYW1wbGVkUlRURXh0LnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVChfZ2wuUkVOREVSQlVGRkVSLCBzYW1wbGVzLCBnbEludGVybmFsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQpOwogICAgICB9IGVsc2UgaWYgKGlzTXVsdGlzYW1wbGUpIHsKICAgICAgICBfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKF9nbC5SRU5ERVJCVUZGRVIsIHNhbXBsZXMsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoX2dsLlJFTkRFUkJVRkZFUiwgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0KTsKICAgICAgfQogICAgICBfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoX2dsLkZSQU1FQlVGRkVSLCBnbEF0dGFjaG1lbnRUeXBlLCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgdGV4dHVyZXMgPSByZW5kZXJUYXJnZXQudGV4dHVyZXM7CiAgICAgIGZvciAobGV0IGkgPSAwO2kgPCB0ZXh0dXJlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNvbnN0IHRleHR1cmUgPSB0ZXh0dXJlc1tpXTsKICAgICAgICBjb25zdCBnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQodGV4dHVyZS5mb3JtYXQsIHRleHR1cmUuY29sb3JTcGFjZSk7CiAgICAgICAgY29uc3QgZ2xUeXBlID0gdXRpbHMuY29udmVydCh0ZXh0dXJlLnR5cGUpOwogICAgICAgIGNvbnN0IGdsSW50ZXJuYWxGb3JtYXQgPSBnZXRJbnRlcm5hbEZvcm1hdCh0ZXh0dXJlLmludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCB0ZXh0dXJlLmNvbG9yU3BhY2UpOwogICAgICAgIGNvbnN0IHNhbXBsZXMgPSBnZXRSZW5kZXJUYXJnZXRTYW1wbGVzKHJlbmRlclRhcmdldCk7CiAgICAgICAgaWYgKGlzTXVsdGlzYW1wbGUgJiYgdXNlTXVsdGlzYW1wbGVkUlRUKHJlbmRlclRhcmdldCkgPT09IGZhbHNlKSB7CiAgICAgICAgICBfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKF9nbC5SRU5ERVJCVUZGRVIsIHNhbXBsZXMsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCk7CiAgICAgICAgfSBlbHNlIGlmICh1c2VNdWx0aXNhbXBsZWRSVFQocmVuZGVyVGFyZ2V0KSkgewogICAgICAgICAgbXVsdGlzYW1wbGVkUlRURXh0LnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVChfZ2wuUkVOREVSQlVGRkVSLCBzYW1wbGVzLCBnbEludGVybmFsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZShfZ2wuUkVOREVSQlVGRkVSLCBnbEludGVybmFsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgX2dsLmJpbmRSZW5kZXJidWZmZXIoX2dsLlJFTkRFUkJVRkZFUiwgbnVsbCk7CiAgfQogIGZ1bmN0aW9uIHNldHVwRGVwdGhUZXh0dXJlKGZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQpIHsKICAgIGNvbnN0IGlzQ3ViZSA9IHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQ7CiAgICBpZiAoaXNDdWJlKQogICAgICB0aHJvdyBuZXcgRXJyb3IoIkRlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICAgIHN0YXRlLmJpbmRGcmFtZWJ1ZmZlcihfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyKTsKICAgIGlmICghKHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgJiYgcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSkpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuRGVwdGhUZXh0dXJlIik7CiAgICB9CiAgICBjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUpOwogICAgdGV4dHVyZVByb3BlcnRpZXMuX19yZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7CiAgICBpZiAoIXRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlIHx8IHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggIT09IHJlbmRlclRhcmdldC53aWR0aCB8fCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCAhPT0gcmVuZGVyVGFyZ2V0LmhlaWdodCkgewogICAgICByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoID0gcmVuZGVyVGFyZ2V0LndpZHRoOwogICAgICByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCA9IHJlbmRlclRhcmdldC5oZWlnaHQ7CiAgICAgIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgfQogICAgaWYgKHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuZGVwdGggIT0gMSkgewogICAgICBzZXRUZXh0dXJlMkRBcnJheShyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLCAwKTsKICAgIH0gZWxzZSB7CiAgICAgIHNldFRleHR1cmUyRChyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLCAwKTsKICAgIH0KICAgIGNvbnN0IHdlYmdsRGVwdGhUZXh0dXJlID0gdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmU7CiAgICBjb25zdCBzYW1wbGVzID0gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyhyZW5kZXJUYXJnZXQpOwogICAgaWYgKHJlbmRlclRhcmdldC5pc1dlYkdMTXVsdGl2aWV3UmVuZGVyVGFyZ2V0ID09PSB0cnVlKSB7CiAgICAgIGNvbnN0IHVzZU11bHRpc2FtcGxlID0gdXNlTXVsdGlzYW1wbGVkUlRUKHJlbmRlclRhcmdldCk7CiAgICAgIGNvbnN0IG51bVZpZXdzID0gcmVuZGVyVGFyZ2V0Lm51bVZpZXdzOwogICAgICBpZiAocmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5mb3JtYXQgPT09IERlcHRoRm9ybWF0KSB7CiAgICAgICAgaWYgKHVzZU11bHRpc2FtcGxlKSB7CiAgICAgICAgICBtdWx0aXZpZXdFeHQuZnJhbWVidWZmZXJUZXh0dXJlTXVsdGlzYW1wbGVNdWx0aXZpZXdPVlIoX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfQVRUQUNITUVOVCwgd2ViZ2xEZXB0aFRleHR1cmUsIDAsIHNhbXBsZXMsIDAsIG51bVZpZXdzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbXVsdGl2aWV3RXh0LmZyYW1lYnVmZmVyVGV4dHVyZU11bHRpdmlld09WUihfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9BVFRBQ0hNRU5ULCB3ZWJnbERlcHRoVGV4dHVyZSwgMCwgMCwgbnVtVmlld3MpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0KSB7CiAgICAgICAgaWYgKHVzZU11bHRpc2FtcGxlKSB7CiAgICAgICAgICBtdWx0aXZpZXdFeHQuZnJhbWVidWZmZXJUZXh0dXJlTXVsdGlzYW1wbGVNdWx0aXZpZXdPVlIoX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULCB3ZWJnbERlcHRoVGV4dHVyZSwgMCwgc2FtcGxlcywgMCwgbnVtVmlld3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtdWx0aXZpZXdFeHQuZnJhbWVidWZmZXJUZXh0dXJlTXVsdGl2aWV3T1ZSKF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgd2ViZ2xEZXB0aFRleHR1cmUsIDAsIDAsIG51bVZpZXdzKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGRlcHRoVGV4dHVyZSBmb3JtYXQiKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID09PSBEZXB0aEZvcm1hdCkgewogICAgICAgIGlmICh1c2VNdWx0aXNhbXBsZWRSVFQocmVuZGVyVGFyZ2V0KSkgewogICAgICAgICAgbXVsdGlzYW1wbGVkUlRURXh0LmZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQoX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwLCBzYW1wbGVzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX0FUVEFDSE1FTlQsIF9nbC5URVhUVVJFXzJELCB3ZWJnbERlcHRoVGV4dHVyZSwgMCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQpIHsKICAgICAgICBpZiAodXNlTXVsdGlzYW1wbGVkUlRUKHJlbmRlclRhcmdldCkpIHsKICAgICAgICAgIG11bHRpc2FtcGxlZFJUVEV4dC5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwLCBzYW1wbGVzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgX2dsLlRFWFRVUkVfMkQsIHdlYmdsRGVwdGhUZXh0dXJlLCAwKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGRlcHRoVGV4dHVyZSBmb3JtYXQiKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBzZXR1cERlcHRoUmVuZGVyYnVmZmVyKHJlbmRlclRhcmdldCkgewogICAgY29uc3QgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KHJlbmRlclRhcmdldCk7CiAgICBjb25zdCBpc0N1YmUgPSByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgPT09IHRydWU7CiAgICBpZiAocmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX2JvdW5kRGVwdGhUZXh0dXJlICE9PSByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlKSB7CiAgICAgIGNvbnN0IGRlcHRoVGV4dHVyZSA9IHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmU7CiAgICAgIGlmIChyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fZGVwdGhEaXNwb3NlQ2FsbGJhY2spIHsKICAgICAgICByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fZGVwdGhEaXNwb3NlQ2FsbGJhY2soKTsKICAgICAgfQogICAgICBpZiAoZGVwdGhUZXh0dXJlKSB7CiAgICAgICAgY29uc3QgZGlzcG9zZUV2ZW50ID0gKCkgPT4gewogICAgICAgICAgZGVsZXRlIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX19ib3VuZERlcHRoVGV4dHVyZTsKICAgICAgICAgIGRlbGV0ZSByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fZGVwdGhEaXNwb3NlQ2FsbGJhY2s7CiAgICAgICAgICBkZXB0aFRleHR1cmUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIGRpc3Bvc2VFdmVudCk7CiAgICAgICAgfTsKICAgICAgICBkZXB0aFRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIGRpc3Bvc2VFdmVudCk7CiAgICAgICAgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX2RlcHRoRGlzcG9zZUNhbGxiYWNrID0gZGlzcG9zZUV2ZW50OwogICAgICB9CiAgICAgIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX19ib3VuZERlcHRoVGV4dHVyZSA9IGRlcHRoVGV4dHVyZTsKICAgIH0KICAgIGlmIChyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICYmICFyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fYXV0b0FsbG9jYXRlRGVwdGhCdWZmZXIpIHsKICAgICAgaWYgKGlzQ3ViZSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7CiAgICAgIHNldHVwRGVwdGhUZXh0dXJlKHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGlzQ3ViZSkgewogICAgICAgIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IDY7IGkrKykgewogICAgICAgICAgc3RhdGUuYmluZEZyYW1lYnVmZmVyKF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbaV0pOwogICAgICAgICAgaWYgKHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyW2ldID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbaV0gPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7CiAgICAgICAgICAgIHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZShyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlcltpXSwgcmVuZGVyVGFyZ2V0LCBmYWxzZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBnbEF0dGFjaG1lbnRUeXBlID0gcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgPyBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UIDogX2dsLkRFUFRIX0FUVEFDSE1FTlQ7CiAgICAgICAgICAgIGNvbnN0IHJlbmRlcmJ1ZmZlciA9IHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyW2ldOwogICAgICAgICAgICBfZ2wuYmluZFJlbmRlcmJ1ZmZlcihfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIpOwogICAgICAgICAgICBfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoX2dsLkZSQU1FQlVGRkVSLCBnbEF0dGFjaG1lbnRUeXBlLCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBzdGF0ZS5iaW5kRnJhbWVidWZmZXIoX2dsLkZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlcik7CiAgICAgICAgaWYgKHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gX2dsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpOwogICAgICAgICAgc2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyLCByZW5kZXJUYXJnZXQsIGZhbHNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgZ2xBdHRhY2htZW50VHlwZSA9IHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyID8gX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCA6IF9nbC5ERVBUSF9BVFRBQ0hNRU5UOwogICAgICAgICAgY29uc3QgcmVuZGVyYnVmZmVyID0gcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXI7CiAgICAgICAgICBfZ2wuYmluZFJlbmRlcmJ1ZmZlcihfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIpOwogICAgICAgICAgX2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKF9nbC5GUkFNRUJVRkZFUiwgZ2xBdHRhY2htZW50VHlwZSwgX2dsLlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHN0YXRlLmJpbmRGcmFtZWJ1ZmZlcihfZ2wuRlJBTUVCVUZGRVIsIG51bGwpOwogIH0KICBmdW5jdGlvbiByZWJpbmRUZXh0dXJlcyhyZW5kZXJUYXJnZXQsIGNvbG9yVGV4dHVyZSwgZGVwdGhUZXh0dXJlKSB7CiAgICBjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQocmVuZGVyVGFyZ2V0KTsKICAgIGlmIChjb2xvclRleHR1cmUgIT09IHVuZGVmaW5lZCkgewogICAgICBzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZShyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCByZW5kZXJUYXJnZXQudGV4dHVyZSwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV8yRCwgMCk7CiAgICB9CiAgICBpZiAoZGVwdGhUZXh0dXJlICE9PSB1bmRlZmluZWQpIHsKICAgICAgc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlcihyZW5kZXJUYXJnZXQpOwogICAgfQogIH0KICBmdW5jdGlvbiBzZXR1cFJlbmRlclRhcmdldChyZW5kZXJUYXJnZXQpIHsKICAgIGNvbnN0IHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTsKICAgIGNvbnN0IHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldChyZW5kZXJUYXJnZXQpOwogICAgY29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCh0ZXh0dXJlKTsKICAgIHJlbmRlclRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgb25SZW5kZXJUYXJnZXREaXNwb3NlKTsKICAgIGNvbnN0IHRleHR1cmVzID0gcmVuZGVyVGFyZ2V0LnRleHR1cmVzOwogICAgY29uc3QgaXNDdWJlID0gcmVuZGVyVGFyZ2V0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ID09PSB0cnVlOwogICAgY29uc3QgaXNNdWx0aXBsZVJlbmRlclRhcmdldHMgPSB0ZXh0dXJlcy5sZW5ndGggPiAxOwogICAgaWYgKCFpc011bHRpcGxlUmVuZGVyVGFyZ2V0cykgewogICAgICBpZiAodGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTsKICAgICAgfQogICAgICB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gPSB0ZXh0dXJlLnZlcnNpb247CiAgICAgIGluZm8ubWVtb3J5LnRleHR1cmVzKys7CiAgICB9CiAgICBpZiAoaXNDdWJlKSB7CiAgICAgIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyID0gW107CiAgICAgIGZvciAobGV0IGkgPSAwO2kgPCA2OyBpKyspIHsKICAgICAgICBpZiAodGV4dHVyZS5taXBtYXBzICYmIHRleHR1cmUubWlwbWFwcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlcltpXSA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbGV2ZWwgPSAwO2xldmVsIDwgdGV4dHVyZS5taXBtYXBzLmxlbmd0aDsgbGV2ZWwrKykgewogICAgICAgICAgICByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlcltpXVtsZXZlbF0gPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbaV0gPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmICh0ZXh0dXJlLm1pcG1hcHMgJiYgdGV4dHVyZS5taXBtYXBzLmxlbmd0aCA+IDApIHsKICAgICAgICByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IFtdOwogICAgICAgIGZvciAobGV0IGxldmVsID0gMDtsZXZlbCA8IHRleHR1cmUubWlwbWFwcy5sZW5ndGg7IGxldmVsKyspIHsKICAgICAgICAgIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyW2xldmVsXSA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgICB9CiAgICAgIGlmIChpc011bHRpcGxlUmVuZGVyVGFyZ2V0cykgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IHRleHR1cmVzLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICAgICAgY29uc3QgYXR0YWNobWVudFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCh0ZXh0dXJlc1tpXSk7CiAgICAgICAgICBpZiAoYXR0YWNobWVudFByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBhdHRhY2htZW50UHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7CiAgICAgICAgICAgIGluZm8ubWVtb3J5LnRleHR1cmVzKys7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChyZW5kZXJUYXJnZXQuc2FtcGxlcyA+IDAgJiYgdXNlTXVsdGlzYW1wbGVkUlRUKHJlbmRlclRhcmdldCkgPT09IGZhbHNlKSB7CiAgICAgICAgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIgPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTsKICAgICAgICByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciA9IFtdOwogICAgICAgIHN0YXRlLmJpbmRGcmFtZWJ1ZmZlcihfZ2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKTsKICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgdGV4dHVyZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IHRleHR1cmUyID0gdGV4dHVyZXNbaV07CiAgICAgICAgICByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltpXSA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTsKICAgICAgICAgIF9nbC5iaW5kUmVuZGVyYnVmZmVyKF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW2ldKTsKICAgICAgICAgIGNvbnN0IGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCh0ZXh0dXJlMi5mb3JtYXQsIHRleHR1cmUyLmNvbG9yU3BhY2UpOwogICAgICAgICAgY29uc3QgZ2xUeXBlID0gdXRpbHMuY29udmVydCh0ZXh0dXJlMi50eXBlKTsKICAgICAgICAgIGNvbnN0IGdsSW50ZXJuYWxGb3JtYXQgPSBnZXRJbnRlcm5hbEZvcm1hdCh0ZXh0dXJlMi5pbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgdGV4dHVyZTIuY29sb3JTcGFjZSwgcmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgPT09IHRydWUpOwogICAgICAgICAgY29uc3Qgc2FtcGxlcyA9IGdldFJlbmRlclRhcmdldFNhbXBsZXMocmVuZGVyVGFyZ2V0KTsKICAgICAgICAgIF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoX2dsLlJFTkRFUkJVRkZFUiwgc2FtcGxlcywgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0KTsKICAgICAgICAgIF9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihfZ2wuRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCArIGksIF9nbC5SRU5ERVJCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW2ldKTsKICAgICAgICB9CiAgICAgICAgX2dsLmJpbmRSZW5kZXJidWZmZXIoX2dsLlJFTkRFUkJVRkZFUiwgbnVsbCk7CiAgICAgICAgaWYgKHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlcikgewogICAgICAgICAgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIgPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7CiAgICAgICAgICBzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UocmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIsIHJlbmRlclRhcmdldCwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIHN0YXRlLmJpbmRGcmFtZWJ1ZmZlcihfZ2wuRlJBTUVCVUZGRVIsIG51bGwpOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNDdWJlKSB7CiAgICAgIHN0YXRlLmJpbmRUZXh0dXJlKF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSk7CiAgICAgIHNldFRleHR1cmVQYXJhbWV0ZXJzKF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlKTsKICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IDY7IGkrKykgewogICAgICAgIGlmICh0ZXh0dXJlLm1pcG1hcHMgJiYgdGV4dHVyZS5taXBtYXBzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGZvciAobGV0IGxldmVsID0gMDtsZXZlbCA8IHRleHR1cmUubWlwbWFwcy5sZW5ndGg7IGxldmVsKyspIHsKICAgICAgICAgICAgc2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUocmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbaV1bbGV2ZWxdLCByZW5kZXJUYXJnZXQsIHRleHR1cmUsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGxldmVsKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUocmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbaV0sIHJlbmRlclRhcmdldCwgdGV4dHVyZSwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgMCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHModGV4dHVyZSkpIHsKICAgICAgICBnZW5lcmF0ZU1pcG1hcChfZ2wuVEVYVFVSRV9DVUJFX01BUCk7CiAgICAgIH0KICAgICAgc3RhdGUudW5iaW5kVGV4dHVyZSgpOwogICAgfSBlbHNlIGlmIChpc011bHRpcGxlUmVuZGVyVGFyZ2V0cykgewogICAgICBmb3IgKGxldCBpID0gMCwgaWwgPSB0ZXh0dXJlcy5sZW5ndGg7aSA8IGlsOyBpKyspIHsKICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gdGV4dHVyZXNbaV07CiAgICAgICAgY29uc3QgYXR0YWNobWVudFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldChhdHRhY2htZW50KTsKICAgICAgICBzdGF0ZS5iaW5kVGV4dHVyZShfZ2wuVEVYVFVSRV8yRCwgYXR0YWNobWVudFByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUpOwogICAgICAgIHNldFRleHR1cmVQYXJhbWV0ZXJzKF9nbC5URVhUVVJFXzJELCBhdHRhY2htZW50KTsKICAgICAgICBzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZShyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBhdHRhY2htZW50LCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAgKyBpLCBfZ2wuVEVYVFVSRV8yRCwgMCk7CiAgICAgICAgaWYgKHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyhhdHRhY2htZW50KSkgewogICAgICAgICAgZ2VuZXJhdGVNaXBtYXAoX2dsLlRFWFRVUkVfMkQpOwogICAgICAgIH0KICAgICAgfQogICAgICBzdGF0ZS51bmJpbmRUZXh0dXJlKCk7CiAgICB9IGVsc2UgewogICAgICBsZXQgZ2xUZXh0dXJlVHlwZSA9IF9nbC5URVhUVVJFXzJEOwogICAgICBpZiAocmVuZGVyVGFyZ2V0LmlzV2ViR0wzRFJlbmRlclRhcmdldCB8fCByZW5kZXJUYXJnZXQuaXNXZWJHTEFycmF5UmVuZGVyVGFyZ2V0KSB7CiAgICAgICAgZ2xUZXh0dXJlVHlwZSA9IHJlbmRlclRhcmdldC5pc1dlYkdMM0RSZW5kZXJUYXJnZXQgPyBfZ2wuVEVYVFVSRV8zRCA6IF9nbC5URVhUVVJFXzJEX0FSUkFZOwogICAgICB9CiAgICAgIGlmIChyZW5kZXJUYXJnZXQuaXNXZWJHTE11bHRpdmlld1JlbmRlclRhcmdldCA9PT0gdHJ1ZSkgewogICAgICAgIGdsVGV4dHVyZVR5cGUgPSBfZ2wuVEVYVFVSRV8yRF9BUlJBWTsKICAgICAgfQogICAgICBzdGF0ZS5iaW5kVGV4dHVyZShnbFRleHR1cmVUeXBlLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSk7CiAgICAgIHNldFRleHR1cmVQYXJhbWV0ZXJzKGdsVGV4dHVyZVR5cGUsIHRleHR1cmUpOwogICAgICBpZiAodGV4dHVyZS5taXBtYXBzICYmIHRleHR1cmUubWlwbWFwcy5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9yIChsZXQgbGV2ZWwgPSAwO2xldmVsIDwgdGV4dHVyZS5taXBtYXBzLmxlbmd0aDsgbGV2ZWwrKykgewogICAgICAgICAgc2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUocmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbbGV2ZWxdLCByZW5kZXJUYXJnZXQsIHRleHR1cmUsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2xUZXh0dXJlVHlwZSwgbGV2ZWwpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZShyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCB0ZXh0dXJlLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsVGV4dHVyZVR5cGUsIDApOwogICAgICB9CiAgICAgIGlmICh0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHModGV4dHVyZSkpIHsKICAgICAgICBnZW5lcmF0ZU1pcG1hcChnbFRleHR1cmVUeXBlKTsKICAgICAgfQogICAgICBzdGF0ZS51bmJpbmRUZXh0dXJlKCk7CiAgICB9CiAgICBpZiAocmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyIHx8IHJlbmRlclRhcmdldC5pc1dlYkdMTXVsdGl2aWV3UmVuZGVyVGFyZ2V0ID09PSB0cnVlKSB7CiAgICAgIHRoaXMuc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlcihyZW5kZXJUYXJnZXQpOwogICAgfQogIH0KICBmdW5jdGlvbiB1cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAocmVuZGVyVGFyZ2V0KSB7CiAgICBjb25zdCB0ZXh0dXJlcyA9IHJlbmRlclRhcmdldC50ZXh0dXJlczsKICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IHRleHR1cmVzLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICBjb25zdCB0ZXh0dXJlID0gdGV4dHVyZXNbaV07CiAgICAgIGlmICh0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHModGV4dHVyZSkpIHsKICAgICAgICBjb25zdCB0YXJnZXRUeXBlID0gZ2V0VGFyZ2V0VHlwZShyZW5kZXJUYXJnZXQpOwogICAgICAgIGNvbnN0IHdlYmdsVGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0KHRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlOwogICAgICAgIHN0YXRlLmJpbmRUZXh0dXJlKHRhcmdldFR5cGUsIHdlYmdsVGV4dHVyZSk7CiAgICAgICAgZ2VuZXJhdGVNaXBtYXAodGFyZ2V0VHlwZSk7CiAgICAgICAgc3RhdGUudW5iaW5kVGV4dHVyZSgpOwogICAgICB9CiAgICB9CiAgfQogIGNvbnN0IGludmFsaWRhdGlvbkFycmF5UmVhZCA9IFtdOwogIGNvbnN0IGludmFsaWRhdGlvbkFycmF5RHJhdyA9IFtdOwogIGZ1bmN0aW9uIHVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCkgewogICAgaWYgKHJlbmRlclRhcmdldC5zYW1wbGVzID4gMCkgewogICAgICBpZiAodXNlTXVsdGlzYW1wbGVkUlRUKHJlbmRlclRhcmdldCkgPT09IGZhbHNlKSB7CiAgICAgICAgY29uc3QgdGV4dHVyZXMgPSByZW5kZXJUYXJnZXQudGV4dHVyZXM7CiAgICAgICAgY29uc3Qgd2lkdGggPSByZW5kZXJUYXJnZXQud2lkdGg7CiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcmVuZGVyVGFyZ2V0LmhlaWdodDsKICAgICAgICBsZXQgbWFzayA9IF9nbC5DT0xPUl9CVUZGRVJfQklUOwogICAgICAgIGNvbnN0IGRlcHRoU3R5bGUgPSByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciA/IF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQgOiBfZ2wuREVQVEhfQVRUQUNITUVOVDsKICAgICAgICBjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQocmVuZGVyVGFyZ2V0KTsKICAgICAgICBjb25zdCBpc011bHRpcGxlUmVuZGVyVGFyZ2V0cyA9IHRleHR1cmVzLmxlbmd0aCA+IDE7CiAgICAgICAgaWYgKGlzTXVsdGlwbGVSZW5kZXJUYXJnZXRzKSB7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgdGV4dHVyZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgc3RhdGUuYmluZEZyYW1lYnVmZmVyKF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpOwogICAgICAgICAgICBfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoX2dsLkZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAgKyBpLCBfZ2wuUkVOREVSQlVGRkVSLCBudWxsKTsKICAgICAgICAgICAgc3RhdGUuYmluZEZyYW1lYnVmZmVyKF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIpOwogICAgICAgICAgICBfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoX2dsLkRSQVdfRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCArIGksIF9nbC5URVhUVVJFXzJELCBudWxsLCAwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3RhdGUuYmluZEZyYW1lYnVmZmVyKF9nbC5SRUFEX0ZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7CiAgICAgICAgc3RhdGUuYmluZEZyYW1lYnVmZmVyKF9nbC5EUkFXX0ZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlcik7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IHRleHR1cmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAocmVuZGVyVGFyZ2V0LnJlc29sdmVEZXB0aEJ1ZmZlcikgewogICAgICAgICAgICBpZiAocmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyKQogICAgICAgICAgICAgIG1hc2sgfD0gX2dsLkRFUFRIX0JVRkZFUl9CSVQ7CiAgICAgICAgICAgIGlmIChyZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciAmJiByZW5kZXJUYXJnZXQucmVzb2x2ZVN0ZW5jaWxCdWZmZXIpCiAgICAgICAgICAgICAgbWFzayB8PSBfZ2wuU1RFTkNJTF9CVUZGRVJfQklUOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzTXVsdGlwbGVSZW5kZXJUYXJnZXRzKSB7CiAgICAgICAgICAgIF9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihfZ2wuUkVBRF9GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltpXSk7CiAgICAgICAgICAgIGNvbnN0IHdlYmdsVGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0KHRleHR1cmVzW2ldKS5fX3dlYmdsVGV4dHVyZTsKICAgICAgICAgICAgX2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKF9nbC5EUkFXX0ZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFXzJELCB3ZWJnbFRleHR1cmUsIDApOwogICAgICAgICAgfQogICAgICAgICAgX2dsLmJsaXRGcmFtZWJ1ZmZlcigwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBtYXNrLCBfZ2wuTkVBUkVTVCk7CiAgICAgICAgICBpZiAoc3VwcG9ydHNJbnZhbGlkYXRlRnJhbWVidWZmZXIgPT09IHRydWUpIHsKICAgICAgICAgICAgaW52YWxpZGF0aW9uQXJyYXlSZWFkLmxlbmd0aCA9IDA7CiAgICAgICAgICAgIGludmFsaWRhdGlvbkFycmF5RHJhdy5sZW5ndGggPSAwOwogICAgICAgICAgICBpbnZhbGlkYXRpb25BcnJheVJlYWQucHVzaChfZ2wuQ09MT1JfQVRUQUNITUVOVDAgKyBpKTsKICAgICAgICAgICAgaWYgKHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAmJiByZW5kZXJUYXJnZXQucmVzb2x2ZURlcHRoQnVmZmVyID09PSBmYWxzZSkgewogICAgICAgICAgICAgIGludmFsaWRhdGlvbkFycmF5UmVhZC5wdXNoKGRlcHRoU3R5bGUpOwogICAgICAgICAgICAgIGludmFsaWRhdGlvbkFycmF5RHJhdy5wdXNoKGRlcHRoU3R5bGUpOwogICAgICAgICAgICAgIF9nbC5pbnZhbGlkYXRlRnJhbWVidWZmZXIoX2dsLkRSQVdfRlJBTUVCVUZGRVIsIGludmFsaWRhdGlvbkFycmF5RHJhdyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2dsLmludmFsaWRhdGVGcmFtZWJ1ZmZlcihfZ2wuUkVBRF9GUkFNRUJVRkZFUiwgaW52YWxpZGF0aW9uQXJyYXlSZWFkKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3RhdGUuYmluZEZyYW1lYnVmZmVyKF9nbC5SRUFEX0ZSQU1FQlVGRkVSLCBudWxsKTsKICAgICAgICBzdGF0ZS5iaW5kRnJhbWVidWZmZXIoX2dsLkRSQVdfRlJBTUVCVUZGRVIsIG51bGwpOwogICAgICAgIGlmIChpc011bHRpcGxlUmVuZGVyVGFyZ2V0cykgewogICAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IHRleHR1cmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHN0YXRlLmJpbmRGcmFtZWJ1ZmZlcihfZ2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKTsKICAgICAgICAgICAgX2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKF9nbC5GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwICsgaSwgX2dsLlJFTkRFUkJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbaV0pOwogICAgICAgICAgICBjb25zdCB3ZWJnbFRleHR1cmUgPSBwcm9wZXJ0aWVzLmdldCh0ZXh0dXJlc1tpXSkuX193ZWJnbFRleHR1cmU7CiAgICAgICAgICAgIHN0YXRlLmJpbmRGcmFtZWJ1ZmZlcihfZ2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyKTsKICAgICAgICAgICAgX2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKF9nbC5EUkFXX0ZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAgKyBpLCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xUZXh0dXJlLCAwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3RhdGUuYmluZEZyYW1lYnVmZmVyKF9nbC5EUkFXX0ZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAmJiByZW5kZXJUYXJnZXQucmVzb2x2ZURlcHRoQnVmZmVyID09PSBmYWxzZSAmJiBzdXBwb3J0c0ludmFsaWRhdGVGcmFtZWJ1ZmZlcikgewogICAgICAgICAgY29uc3QgZGVwdGhTdHlsZSA9IHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyID8gX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCA6IF9nbC5ERVBUSF9BVFRBQ0hNRU5UOwogICAgICAgICAgX2dsLmludmFsaWRhdGVGcmFtZWJ1ZmZlcihfZ2wuRFJBV19GUkFNRUJVRkZFUiwgW2RlcHRoU3R5bGVdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyhyZW5kZXJUYXJnZXQpIHsKICAgIHJldHVybiBNYXRoLm1pbihjYXBhYmlsaXRpZXMubWF4U2FtcGxlcywgcmVuZGVyVGFyZ2V0LnNhbXBsZXMpOwogIH0KICBmdW5jdGlvbiB1c2VNdWx0aXNhbXBsZWRSVFQocmVuZGVyVGFyZ2V0KSB7CiAgICBjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQocmVuZGVyVGFyZ2V0KTsKICAgIHJldHVybiByZW5kZXJUYXJnZXQuc2FtcGxlcyA+IDAgJiYgZXh0ZW5zaW9ucy5oYXMoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpID09PSB0cnVlICYmIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX191c2VSZW5kZXJUb1RleHR1cmUgIT09IGZhbHNlOwogIH0KICBmdW5jdGlvbiB1cGRhdGVWaWRlb1RleHR1cmUodGV4dHVyZSkgewogICAgY29uc3QgZnJhbWUgPSBpbmZvLnJlbmRlci5mcmFtZTsKICAgIGlmIChfdmlkZW9UZXh0dXJlcy5nZXQodGV4dHVyZSkgIT09IGZyYW1lKSB7CiAgICAgIF92aWRlb1RleHR1cmVzLnNldCh0ZXh0dXJlLCBmcmFtZSk7CiAgICAgIHRleHR1cmUudXBkYXRlKCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHZlcmlmeUNvbG9yU3BhY2UodGV4dHVyZSwgaW1hZ2UpIHsKICAgIGNvbnN0IGNvbG9yU3BhY2UgPSB0ZXh0dXJlLmNvbG9yU3BhY2U7CiAgICBjb25zdCBmb3JtYXQgPSB0ZXh0dXJlLmZvcm1hdDsKICAgIGNvbnN0IHR5cGUgPSB0ZXh0dXJlLnR5cGU7CiAgICBpZiAodGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlID09PSB0cnVlIHx8IHRleHR1cmUuaXNWaWRlb1RleHR1cmUgPT09IHRydWUpCiAgICAgIHJldHVybiBpbWFnZTsKICAgIGlmIChjb2xvclNwYWNlICE9PSBMaW5lYXJTUkdCQ29sb3JTcGFjZSAmJiBjb2xvclNwYWNlICE9PSBOb0NvbG9yU3BhY2UpIHsKICAgICAgaWYgKENvbG9yTWFuYWdlbWVudC5nZXRUcmFuc2Zlcihjb2xvclNwYWNlKSA9PT0gU1JHQlRyYW5zZmVyKSB7CiAgICAgICAgaWYgKGZvcm1hdCAhPT0gUkdCQUZvcm1hdCB8fCB0eXBlICE9PSBVbnNpZ25lZEJ5dGVUeXBlKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXM6IHNSR0IgZW5jb2RlZCB0ZXh0dXJlcyBoYXZlIHRvIHVzZSBSR0JBRm9ybWF0IGFuZCBVbnNpZ25lZEJ5dGVUeXBlLiIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFRleHR1cmVzOiBVbnN1cHBvcnRlZCB0ZXh0dXJlIGNvbG9yIHNwYWNlOiIsIGNvbG9yU3BhY2UpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaW1hZ2U7CiAgfQogIGZ1bmN0aW9uIGdldERpbWVuc2lvbnMoaW1hZ2UpIHsKICAgIGlmICh0eXBlb2YgSFRNTEltYWdlRWxlbWVudCAhPT0gInVuZGVmaW5lZCIgJiYgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7CiAgICAgIF9pbWFnZURpbWVuc2lvbnMud2lkdGggPSBpbWFnZS5uYXR1cmFsV2lkdGggfHwgaW1hZ2Uud2lkdGg7CiAgICAgIF9pbWFnZURpbWVuc2lvbnMuaGVpZ2h0ID0gaW1hZ2UubmF0dXJhbEhlaWdodCB8fCBpbWFnZS5oZWlnaHQ7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBWaWRlb0ZyYW1lICE9PSAidW5kZWZpbmVkIiAmJiBpbWFnZSBpbnN0YW5jZW9mIFZpZGVvRnJhbWUpIHsKICAgICAgX2ltYWdlRGltZW5zaW9ucy53aWR0aCA9IGltYWdlLmRpc3BsYXlXaWR0aDsKICAgICAgX2ltYWdlRGltZW5zaW9ucy5oZWlnaHQgPSBpbWFnZS5kaXNwbGF5SGVpZ2h0OwogICAgfSBlbHNlIHsKICAgICAgX2ltYWdlRGltZW5zaW9ucy53aWR0aCA9IGltYWdlLndpZHRoOwogICAgICBfaW1hZ2VEaW1lbnNpb25zLmhlaWdodCA9IGltYWdlLmhlaWdodDsKICAgIH0KICAgIHJldHVybiBfaW1hZ2VEaW1lbnNpb25zOwogIH0KICB0aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQgPSBhbGxvY2F0ZVRleHR1cmVVbml0OwogIHRoaXMucmVzZXRUZXh0dXJlVW5pdHMgPSByZXNldFRleHR1cmVVbml0czsKICB0aGlzLnNldFRleHR1cmUyRCA9IHNldFRleHR1cmUyRDsKICB0aGlzLnNldFRleHR1cmUyREFycmF5ID0gc2V0VGV4dHVyZTJEQXJyYXk7CiAgdGhpcy5zZXRUZXh0dXJlM0QgPSBzZXRUZXh0dXJlM0Q7CiAgdGhpcy5zZXRUZXh0dXJlQ3ViZSA9IHNldFRleHR1cmVDdWJlOwogIHRoaXMucmViaW5kVGV4dHVyZXMgPSByZWJpbmRUZXh0dXJlczsKICB0aGlzLnVwbG9hZFRleHR1cmUgPSB1cGxvYWRUZXh0dXJlOwogIHRoaXMuc2V0dXBSZW5kZXJUYXJnZXQgPSBzZXR1cFJlbmRlclRhcmdldDsKICB0aGlzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCA9IHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcDsKICB0aGlzLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0ID0gdXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ7CiAgdGhpcy5zZXR1cERlcHRoVGV4dHVyZSA9IHNldHVwRGVwdGhUZXh0dXJlOwogIHRoaXMuc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciA9IHNldHVwRGVwdGhSZW5kZXJidWZmZXI7CiAgdGhpcy5zZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSA9IHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlOwogIHRoaXMudXNlTXVsdGlzYW1wbGVkUlRUID0gdXNlTXVsdGlzYW1wbGVkUlRUOwogIHRoaXMucnVuRGVmZXJyZWRVcGxvYWRzID0gcnVuRGVmZXJyZWRVcGxvYWRzOwogIHRoaXMuc2V0RGVmZXJUZXh0dXJlVXBsb2FkcyA9IHNldERlZmVyVGV4dHVyZVVwbG9hZHM7Cn0KZnVuY3Rpb24gV2ViR0xVdGlscyhnbCwgZXh0ZW5zaW9ucykgewogIGZ1bmN0aW9uIGNvbnZlcnQocCwgY29sb3JTcGFjZSA9IE5vQ29sb3JTcGFjZSkgewogICAgbGV0IGV4dGVuc2lvbjsKICAgIGNvbnN0IHRyYW5zZmVyID0gQ29sb3JNYW5hZ2VtZW50LmdldFRyYW5zZmVyKGNvbG9yU3BhY2UpOwogICAgaWYgKHAgPT09IFVuc2lnbmVkQnl0ZVR5cGUpCiAgICAgIHJldHVybiBnbC5VTlNJR05FRF9CWVRFOwogICAgaWYgKHAgPT09IFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSkKICAgICAgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ7CiAgICBpZiAocCA9PT0gVW5zaWduZWRTaG9ydDU1NTFUeXBlKQogICAgICByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlRfNV81XzVfMTsKICAgIGlmIChwID09PSBVbnNpZ25lZEludDU5OTlUeXBlKQogICAgICByZXR1cm4gZ2wuVU5TSUdORURfSU5UXzVfOV85XzlfUkVWOwogICAgaWYgKHAgPT09IEJ5dGVUeXBlKQogICAgICByZXR1cm4gZ2wuQllURTsKICAgIGlmIChwID09PSBTaG9ydFR5cGUpCiAgICAgIHJldHVybiBnbC5TSE9SVDsKICAgIGlmIChwID09PSBVbnNpZ25lZFNob3J0VHlwZSkKICAgICAgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUOwogICAgaWYgKHAgPT09IEludFR5cGUpCiAgICAgIHJldHVybiBnbC5JTlQ7CiAgICBpZiAocCA9PT0gVW5zaWduZWRJbnRUeXBlKQogICAgICByZXR1cm4gZ2wuVU5TSUdORURfSU5UOwogICAgaWYgKHAgPT09IEZsb2F0VHlwZSkKICAgICAgcmV0dXJuIGdsLkZMT0FUOwogICAgaWYgKHAgPT09IEhhbGZGbG9hdFR5cGUpCiAgICAgIHJldHVybiBnbC5IQUxGX0ZMT0FUOwogICAgaWYgKHAgPT09IEFscGhhRm9ybWF0KQogICAgICByZXR1cm4gZ2wuQUxQSEE7CiAgICBpZiAocCA9PT0gUkdCRm9ybWF0KQogICAgICByZXR1cm4gZ2wuUkdCOwogICAgaWYgKHAgPT09IFJHQkFGb3JtYXQpCiAgICAgIHJldHVybiBnbC5SR0JBOwogICAgaWYgKHAgPT09IEx1bWluYW5jZUZvcm1hdCkKICAgICAgcmV0dXJuIGdsLkxVTUlOQU5DRTsKICAgIGlmIChwID09PSBMdW1pbmFuY2VBbHBoYUZvcm1hdCkKICAgICAgcmV0dXJuIGdsLkxVTUlOQU5DRV9BTFBIQTsKICAgIGlmIChwID09PSBEZXB0aEZvcm1hdCkKICAgICAgcmV0dXJuIGdsLkRFUFRIX0NPTVBPTkVOVDsKICAgIGlmIChwID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQpCiAgICAgIHJldHVybiBnbC5ERVBUSF9TVEVOQ0lMOwogICAgaWYgKHAgPT09IFJlZEZvcm1hdCkKICAgICAgcmV0dXJuIGdsLlJFRDsKICAgIGlmIChwID09PSBSZWRJbnRlZ2VyRm9ybWF0KQogICAgICByZXR1cm4gZ2wuUkVEX0lOVEVHRVI7CiAgICBpZiAocCA9PT0gUkdGb3JtYXQpCiAgICAgIHJldHVybiBnbC5SRzsKICAgIGlmIChwID09PSBSR0ludGVnZXJGb3JtYXQpCiAgICAgIHJldHVybiBnbC5SR19JTlRFR0VSOwogICAgaWYgKHAgPT09IFJHQkFJbnRlZ2VyRm9ybWF0KQogICAgICByZXR1cm4gZ2wuUkdCQV9JTlRFR0VSOwogICAgaWYgKHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0IHx8IHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCB8fCBwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDVfRm9ybWF0KSB7CiAgICAgIGlmICh0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyKSB7CiAgICAgICAgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjX3NyZ2IiKTsKICAgICAgICBpZiAoZXh0ZW5zaW9uICE9PSBudWxsKSB7CiAgICAgICAgICBpZiAocCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQpCiAgICAgICAgICAgIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCX1MzVENfRFhUMV9FWFQ7CiAgICAgICAgICBpZiAocCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0KQogICAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDFfRVhUOwogICAgICAgICAgaWYgKHAgPT09IFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCkKICAgICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0JfQUxQSEFfUzNUQ19EWFQzX0VYVDsKICAgICAgICAgIGlmIChwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQpCiAgICAgICAgICAgIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUNV9FWFQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKTsKICAgICAgICBpZiAoZXh0ZW5zaW9uICE9PSBudWxsKSB7CiAgICAgICAgICBpZiAocCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQpCiAgICAgICAgICAgIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDsKICAgICAgICAgIGlmIChwID09PSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQpCiAgICAgICAgICAgIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7CiAgICAgICAgICBpZiAocCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0KQogICAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUOwogICAgICAgICAgaWYgKHAgPT09IFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCkKICAgICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAocCA9PT0gUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0IHx8IHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCkgewogICAgICBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIik7CiAgICAgIGlmIChleHRlbnNpb24gIT09IG51bGwpIHsKICAgICAgICBpZiAocCA9PT0gUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQpCiAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUc7CiAgICAgICAgaWYgKHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0KQogICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HOwogICAgICAgIGlmIChwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQpCiAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HOwogICAgICAgIGlmIChwID09PSBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQpCiAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBpZiAocCA9PT0gUkdCX0VUQzFfRm9ybWF0IHx8IHAgPT09IFJHQl9FVEMyX0Zvcm1hdCB8fCBwID09PSBSR0JBX0VUQzJfRUFDX0Zvcm1hdCkgewogICAgICBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YyIpOwogICAgICBpZiAoZXh0ZW5zaW9uICE9PSBudWxsKSB7CiAgICAgICAgaWYgKHAgPT09IFJHQl9FVEMxX0Zvcm1hdCB8fCBwID09PSBSR0JfRVRDMl9Gb3JtYXQpCiAgICAgICAgICByZXR1cm4gdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0VUQzIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0I4X0VUQzI7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfRVRDMl9FQUNfRm9ybWF0KQogICAgICAgICAgcmV0dXJuIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfRVRDMl9FQUMgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQzsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgaWYgKHAgPT09IFJHQkFfQVNUQ180eDRfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ181eDRfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ181eDVfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ182eDVfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ182eDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ184eDVfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ184eDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ184eDhfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMHg1X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEweDhfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0KSB7CiAgICAgIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXN0YyIpOwogICAgICBpZiAoZXh0ZW5zaW9uICE9PSBudWxsKSB7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfQVNUQ180eDRfRm9ybWF0KQogICAgICAgICAgcmV0dXJuIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ180eDRfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzR4NF9LSFI7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfQVNUQ181eDRfRm9ybWF0KQogICAgICAgICAgcmV0dXJuIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ181eDRfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzV4NF9LSFI7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfQVNUQ181eDVfRm9ybWF0KQogICAgICAgICAgcmV0dXJuIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ181eDVfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzV4NV9LSFI7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfQVNUQ182eDVfRm9ybWF0KQogICAgICAgICAgcmV0dXJuIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ182eDVfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzZ4NV9LSFI7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfQVNUQ182eDZfRm9ybWF0KQogICAgICAgICAgcmV0dXJuIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ182eDZfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzZ4Nl9LSFI7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfQVNUQ184eDVfRm9ybWF0KQogICAgICAgICAgcmV0dXJuIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ184eDVfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzh4NV9LSFI7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfQVNUQ184eDZfRm9ybWF0KQogICAgICAgICAgcmV0dXJuIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ184eDZfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzh4Nl9LSFI7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfQVNUQ184eDhfRm9ybWF0KQogICAgICAgICAgcmV0dXJuIHRyYW5zZmVyID09PSBTUkdCVHJhbnNmZXIgPyBleHRlbnNpb24uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ184eDhfS0hSIDogZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9BU1RDXzh4OF9LSFI7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfQVNUQ18xMHg1X0Zvcm1hdCkKICAgICAgICAgIHJldHVybiB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4NV9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4NV9LSFI7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCkKICAgICAgICAgIHJldHVybiB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4Nl9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4Nl9LSFI7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfQVNUQ18xMHg4X0Zvcm1hdCkKICAgICAgICAgIHJldHVybiB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4OF9LSFIgOiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4OF9LSFI7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQpCiAgICAgICAgICByZXR1cm4gdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDEwX0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHgxMF9LSFI7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQpCiAgICAgICAgICByZXR1cm4gdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEyeDEwX0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMngxMF9LSFI7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQpCiAgICAgICAgICByZXR1cm4gdHJhbnNmZXIgPT09IFNSR0JUcmFuc2ZlciA/IGV4dGVuc2lvbi5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEyeDEyX0tIUiA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMngxMl9LSFI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KICAgIGlmIChwID09PSBSR0JBX0JQVENfRm9ybWF0IHx8IHAgPT09IFJHQl9CUFRDX1NJR05FRF9Gb3JtYXQgfHwgcCA9PT0gUkdCX0JQVENfVU5TSUdORURfRm9ybWF0KSB7CiAgICAgIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCJFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9icHRjIik7CiAgICAgIGlmIChleHRlbnNpb24gIT09IG51bGwpIHsKICAgICAgICBpZiAocCA9PT0gUkdCQV9CUFRDX0Zvcm1hdCkKICAgICAgICAgIHJldHVybiB0cmFuc2ZlciA9PT0gU1JHQlRyYW5zZmVyID8gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9CUFRDX1VOT1JNX0VYVCA6IGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfQlBUQ19VTk9STV9FWFQ7CiAgICAgICAgaWYgKHAgPT09IFJHQl9CUFRDX1NJR05FRF9Gb3JtYXQpCiAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX0JQVENfU0lHTkVEX0ZMT0FUX0VYVDsKICAgICAgICBpZiAocCA9PT0gUkdCX0JQVENfVU5TSUdORURfRm9ybWF0KQogICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9CUFRDX1VOU0lHTkVEX0ZMT0FUX0VYVDsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgaWYgKHAgPT09IFJFRF9SR1RDMV9Gb3JtYXQgfHwgcCA9PT0gU0lHTkVEX1JFRF9SR1RDMV9Gb3JtYXQgfHwgcCA9PT0gUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCB8fCBwID09PSBTSUdORURfUkVEX0dSRUVOX1JHVEMyX0Zvcm1hdCkgewogICAgICBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCgiRVhUX3RleHR1cmVfY29tcHJlc3Npb25fcmd0YyIpOwogICAgICBpZiAoZXh0ZW5zaW9uICE9PSBudWxsKSB7CiAgICAgICAgaWYgKHAgPT09IFJHQkFfQlBUQ19Gb3JtYXQpCiAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkVEX1JHVEMxX0VYVDsKICAgICAgICBpZiAocCA9PT0gU0lHTkVEX1JFRF9SR1RDMV9Gb3JtYXQpCiAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU0lHTkVEX1JFRF9SR1RDMV9FWFQ7CiAgICAgICAgaWYgKHAgPT09IFJFRF9HUkVFTl9SR1RDMl9Gb3JtYXQpCiAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkVEX0dSRUVOX1JHVEMyX0VYVDsKICAgICAgICBpZiAocCA9PT0gU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9Gb3JtYXQpCiAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9FWFQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KICAgIGlmIChwID09PSBVbnNpZ25lZEludDI0OFR5cGUpCiAgICAgIHJldHVybiBnbC5VTlNJR05FRF9JTlRfMjRfODsKICAgIHJldHVybiBnbFtwXSAhPT0gdW5kZWZpbmVkID8gZ2xbcF0gOiBudWxsOwogIH0KICByZXR1cm4geyBjb252ZXJ0IH07Cn0KCmNsYXNzIFdlYlhSRGVwdGhTZW5zaW5nIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMudGV4dHVyZSA9IG51bGw7CiAgICB0aGlzLm1lc2ggPSBudWxsOwogICAgdGhpcy5kZXB0aE5lYXIgPSAwOwogICAgdGhpcy5kZXB0aEZhciA9IDA7CiAgfQogIGluaXQocmVuZGVyZXIsIGRlcHRoRGF0YSwgcmVuZGVyU3RhdGUpIHsKICAgIGlmICh0aGlzLnRleHR1cmUgPT09IG51bGwpIHsKICAgICAgY29uc3QgdGV4dHVyZSA9IG5ldyBUZXh0dXJlOwogICAgICBjb25zdCB0ZXhQcm9wcyA9IHJlbmRlcmVyLnByb3BlcnRpZXMuZ2V0KHRleHR1cmUpOwogICAgICB0ZXhQcm9wcy5fX3dlYmdsVGV4dHVyZSA9IGRlcHRoRGF0YS50ZXh0dXJlOwogICAgICBpZiAoZGVwdGhEYXRhLmRlcHRoTmVhciAhPT0gcmVuZGVyU3RhdGUuZGVwdGhOZWFyIHx8IGRlcHRoRGF0YS5kZXB0aEZhciAhPT0gcmVuZGVyU3RhdGUuZGVwdGhGYXIpIHsKICAgICAgICB0aGlzLmRlcHRoTmVhciA9IGRlcHRoRGF0YS5kZXB0aE5lYXI7CiAgICAgICAgdGhpcy5kZXB0aEZhciA9IGRlcHRoRGF0YS5kZXB0aEZhcjsKICAgICAgfQogICAgICB0aGlzLnRleHR1cmUgPSB0ZXh0dXJlOwogICAgfQogIH0KICBnZXRNZXNoKGNhbWVyYVhSKSB7CiAgICBpZiAodGhpcy50ZXh0dXJlICE9PSBudWxsKSB7CiAgICAgIGlmICh0aGlzLm1lc2ggPT09IG51bGwpIHsKICAgICAgICBjb25zdCB2aWV3cG9ydCA9IGNhbWVyYVhSLmNhbWVyYXNbMF0udmlld3BvcnQ7CiAgICAgICAgY29uc3QgbWF0ZXJpYWwgPSBuZXcgU2hhZGVyTWF0ZXJpYWwoewogICAgICAgICAgdmVydGV4U2hhZGVyOiBfb2NjbHVzaW9uX3ZlcnRleCwKICAgICAgICAgIGZyYWdtZW50U2hhZGVyOiBfb2NjbHVzaW9uX2ZyYWdtZW50LAogICAgICAgICAgdW5pZm9ybXM6IHsKICAgICAgICAgICAgZGVwdGhDb2xvcjogeyB2YWx1ZTogdGhpcy50ZXh0dXJlIH0sCiAgICAgICAgICAgIGRlcHRoV2lkdGg6IHsgdmFsdWU6IHZpZXdwb3J0LnogfSwKICAgICAgICAgICAgZGVwdGhIZWlnaHQ6IHsgdmFsdWU6IHZpZXdwb3J0LncgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHRoaXMubWVzaCA9IG5ldyBNZXNoKG5ldyBQbGFuZUdlb21ldHJ5KDIwLCAyMCksIG1hdGVyaWFsKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXMubWVzaDsKICB9CiAgcmVzZXQoKSB7CiAgICB0aGlzLnRleHR1cmUgPSBudWxsOwogICAgdGhpcy5tZXNoID0gbnVsbDsKICB9CiAgZ2V0RGVwdGhUZXh0dXJlKCkgewogICAgcmV0dXJuIHRoaXMudGV4dHVyZTsKICB9Cn0KZnVuY3Rpb24gV2ViR0xNYXRlcmlhbHMocmVuZGVyZXIsIHByb3BlcnRpZXMpIHsKICBmdW5jdGlvbiByZWZyZXNoVHJhbnNmb3JtVW5pZm9ybShtYXAsIHVuaWZvcm0pIHsKICAgIGlmIChtYXAubWF0cml4QXV0b1VwZGF0ZSA9PT0gdHJ1ZSkgewogICAgICBtYXAudXBkYXRlTWF0cml4KCk7CiAgICB9CiAgICB1bmlmb3JtLnZhbHVlLmNvcHkobWFwLm1hdHJpeCk7CiAgfQogIGZ1bmN0aW9uIHJlZnJlc2hGb2dVbmlmb3Jtcyh1bmlmb3JtcywgZm9nKSB7CiAgICBmb2cuY29sb3IuZ2V0UkdCKHVuaWZvcm1zLmZvZ0NvbG9yLnZhbHVlLCBnZXRVbmxpdFVuaWZvcm1Db2xvclNwYWNlKHJlbmRlcmVyKSk7CiAgICBpZiAoZm9nLmlzRm9nKSB7CiAgICAgIHVuaWZvcm1zLmZvZ05lYXIudmFsdWUgPSBmb2cubmVhcjsKICAgICAgdW5pZm9ybXMuZm9nRmFyLnZhbHVlID0gZm9nLmZhcjsKICAgIH0gZWxzZSBpZiAoZm9nLmlzRm9nRXhwMikgewogICAgICB1bmlmb3Jtcy5mb2dEZW5zaXR5LnZhbHVlID0gZm9nLmRlbnNpdHk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJlZnJlc2hNYXRlcmlhbFVuaWZvcm1zKHVuaWZvcm1zLCBtYXRlcmlhbCwgcGl4ZWxSYXRpbywgaGVpZ2h0LCB0cmFuc21pc3Npb25SZW5kZXJUYXJnZXQpIHsKICAgIGlmIChtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsKSB7CiAgICAgIHJlZnJlc2hVbmlmb3Jtc0NvbW1vbih1bmlmb3JtcywgbWF0ZXJpYWwpOwogICAgfSBlbHNlIGlmIChtYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwpIHsKICAgICAgcmVmcmVzaFVuaWZvcm1zQ29tbW9uKHVuaWZvcm1zLCBtYXRlcmlhbCk7CiAgICB9IGVsc2UgaWYgKG1hdGVyaWFsLmlzTWVzaFRvb25NYXRlcmlhbCkgewogICAgICByZWZyZXNoVW5pZm9ybXNDb21tb24odW5pZm9ybXMsIG1hdGVyaWFsKTsKICAgICAgcmVmcmVzaFVuaWZvcm1zVG9vbih1bmlmb3JtcywgbWF0ZXJpYWwpOwogICAgfSBlbHNlIGlmIChtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsKSB7CiAgICAgIHJlZnJlc2hVbmlmb3Jtc0NvbW1vbih1bmlmb3JtcywgbWF0ZXJpYWwpOwogICAgICByZWZyZXNoVW5pZm9ybXNQaG9uZyh1bmlmb3JtcywgbWF0ZXJpYWwpOwogICAgfSBlbHNlIGlmIChtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsKSB7CiAgICAgIHJlZnJlc2hVbmlmb3Jtc0NvbW1vbih1bmlmb3JtcywgbWF0ZXJpYWwpOwogICAgICByZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCh1bmlmb3JtcywgbWF0ZXJpYWwpOwogICAgICBpZiAobWF0ZXJpYWwuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCkgewogICAgICAgIHJlZnJlc2hVbmlmb3Jtc1BoeXNpY2FsKHVuaWZvcm1zLCBtYXRlcmlhbCwgdHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0KTsKICAgICAgfQogICAgfSBlbHNlIGlmIChtYXRlcmlhbC5pc01lc2hNYXRjYXBNYXRlcmlhbCkgewogICAgICByZWZyZXNoVW5pZm9ybXNDb21tb24odW5pZm9ybXMsIG1hdGVyaWFsKTsKICAgICAgcmVmcmVzaFVuaWZvcm1zTWF0Y2FwKHVuaWZvcm1zLCBtYXRlcmlhbCk7CiAgICB9IGVsc2UgaWYgKG1hdGVyaWFsLmlzTWVzaERlcHRoTWF0ZXJpYWwpIHsKICAgICAgcmVmcmVzaFVuaWZvcm1zQ29tbW9uKHVuaWZvcm1zLCBtYXRlcmlhbCk7CiAgICB9IGVsc2UgaWYgKG1hdGVyaWFsLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwpIHsKICAgICAgcmVmcmVzaFVuaWZvcm1zQ29tbW9uKHVuaWZvcm1zLCBtYXRlcmlhbCk7CiAgICAgIHJlZnJlc2hVbmlmb3Jtc0Rpc3RhbmNlKHVuaWZvcm1zLCBtYXRlcmlhbCk7CiAgICB9IGVsc2UgaWYgKG1hdGVyaWFsLmlzTWVzaE5vcm1hbE1hdGVyaWFsKSB7CiAgICAgIHJlZnJlc2hVbmlmb3Jtc0NvbW1vbih1bmlmb3JtcywgbWF0ZXJpYWwpOwogICAgfSBlbHNlIGlmIChtYXRlcmlhbC5pc0xpbmVCYXNpY01hdGVyaWFsKSB7CiAgICAgIHJlZnJlc2hVbmlmb3Jtc0xpbmUodW5pZm9ybXMsIG1hdGVyaWFsKTsKICAgICAgaWYgKG1hdGVyaWFsLmlzTGluZURhc2hlZE1hdGVyaWFsKSB7CiAgICAgICAgcmVmcmVzaFVuaWZvcm1zRGFzaCh1bmlmb3JtcywgbWF0ZXJpYWwpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG1hdGVyaWFsLmlzUG9pbnRzTWF0ZXJpYWwpIHsKICAgICAgcmVmcmVzaFVuaWZvcm1zUG9pbnRzKHVuaWZvcm1zLCBtYXRlcmlhbCwgcGl4ZWxSYXRpbywgaGVpZ2h0KTsKICAgIH0gZWxzZSBpZiAobWF0ZXJpYWwuaXNTcHJpdGVNYXRlcmlhbCkgewogICAgICByZWZyZXNoVW5pZm9ybXNTcHJpdGVzKHVuaWZvcm1zLCBtYXRlcmlhbCk7CiAgICB9IGVsc2UgaWYgKG1hdGVyaWFsLmlzU2hhZG93TWF0ZXJpYWwpIHsKICAgICAgdW5pZm9ybXMuY29sb3IudmFsdWUuY29weShtYXRlcmlhbC5jb2xvcik7CiAgICAgIHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5OwogICAgfSBlbHNlIGlmIChtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsKSB7CiAgICAgIG1hdGVyaWFsLnVuaWZvcm1zTmVlZFVwZGF0ZSA9IGZhbHNlOwogICAgfQogIH0KICBmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNDb21tb24odW5pZm9ybXMsIG1hdGVyaWFsKSB7CiAgICB1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTsKICAgIGlmIChtYXRlcmlhbC5jb2xvcikgewogICAgICB1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlLmNvcHkobWF0ZXJpYWwuY29sb3IpOwogICAgfQogICAgaWYgKG1hdGVyaWFsLmVtaXNzaXZlKSB7CiAgICAgIHVuaWZvcm1zLmVtaXNzaXZlLnZhbHVlLmNvcHkobWF0ZXJpYWwuZW1pc3NpdmUpLm11bHRpcGx5U2NhbGFyKG1hdGVyaWFsLmVtaXNzaXZlSW50ZW5zaXR5KTsKICAgIH0KICAgIGlmIChtYXRlcmlhbC5tYXApIHsKICAgICAgdW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwOwogICAgICByZWZyZXNoVHJhbnNmb3JtVW5pZm9ybShtYXRlcmlhbC5tYXAsIHVuaWZvcm1zLm1hcFRyYW5zZm9ybSk7CiAgICB9CiAgICBpZiAobWF0ZXJpYWwuYWxwaGFNYXApIHsKICAgICAgdW5pZm9ybXMuYWxwaGFNYXAudmFsdWUgPSBtYXRlcmlhbC5hbHBoYU1hcDsKICAgICAgcmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0obWF0ZXJpYWwuYWxwaGFNYXAsIHVuaWZvcm1zLmFscGhhTWFwVHJhbnNmb3JtKTsKICAgIH0KICAgIGlmIChtYXRlcmlhbC5idW1wTWFwKSB7CiAgICAgIHVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5idW1wTWFwOwogICAgICByZWZyZXNoVHJhbnNmb3JtVW5pZm9ybShtYXRlcmlhbC5idW1wTWFwLCB1bmlmb3Jtcy5idW1wTWFwVHJhbnNmb3JtKTsKICAgICAgdW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuYnVtcFNjYWxlOwogICAgICBpZiAobWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUpIHsKICAgICAgICB1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgKj0gLTE7CiAgICAgIH0KICAgIH0KICAgIGlmIChtYXRlcmlhbC5ub3JtYWxNYXApIHsKICAgICAgdW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwOwogICAgICByZWZyZXNoVHJhbnNmb3JtVW5pZm9ybShtYXRlcmlhbC5ub3JtYWxNYXAsIHVuaWZvcm1zLm5vcm1hbE1hcFRyYW5zZm9ybSk7CiAgICAgIHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkobWF0ZXJpYWwubm9ybWFsU2NhbGUpOwogICAgICBpZiAobWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUpIHsKICAgICAgICB1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKTsKICAgICAgfQogICAgfQogICAgaWYgKG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCkgewogICAgICB1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7CiAgICAgIHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCwgdW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwVHJhbnNmb3JtKTsKICAgICAgdW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTsKICAgICAgdW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7CiAgICB9CiAgICBpZiAobWF0ZXJpYWwuZW1pc3NpdmVNYXApIHsKICAgICAgdW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDsKICAgICAgcmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0obWF0ZXJpYWwuZW1pc3NpdmVNYXAsIHVuaWZvcm1zLmVtaXNzaXZlTWFwVHJhbnNmb3JtKTsKICAgIH0KICAgIGlmIChtYXRlcmlhbC5zcGVjdWxhck1hcCkgewogICAgICB1bmlmb3Jtcy5zcGVjdWxhck1hcC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwOwogICAgICByZWZyZXNoVHJhbnNmb3JtVW5pZm9ybShtYXRlcmlhbC5zcGVjdWxhck1hcCwgdW5pZm9ybXMuc3BlY3VsYXJNYXBUcmFuc2Zvcm0pOwogICAgfQogICAgaWYgKG1hdGVyaWFsLmFscGhhVGVzdCA+IDApIHsKICAgICAgdW5pZm9ybXMuYWxwaGFUZXN0LnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFUZXN0OwogICAgfQogICAgY29uc3QgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQobWF0ZXJpYWwpOwogICAgY29uc3QgZW52TWFwID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLmVudk1hcDsKICAgIGNvbnN0IGVudk1hcFJvdGF0aW9uID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLmVudk1hcFJvdGF0aW9uOwogICAgaWYgKGVudk1hcCkgewogICAgICB1bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBlbnZNYXA7CiAgICAgIF9lMS5jb3B5KGVudk1hcFJvdGF0aW9uKTsKICAgICAgX2UxLnggKj0gLTE7CiAgICAgIF9lMS55ICo9IC0xOwogICAgICBfZTEueiAqPSAtMTsKICAgICAgaWYgKGVudk1hcC5pc0N1YmVUZXh0dXJlICYmIGVudk1hcC5pc1JlbmRlclRhcmdldFRleHR1cmUgPT09IGZhbHNlKSB7CiAgICAgICAgX2UxLnkgKj0gLTE7CiAgICAgICAgX2UxLnogKj0gLTE7CiAgICAgIH0KICAgICAgdW5pZm9ybXMuZW52TWFwUm90YXRpb24udmFsdWUuc2V0RnJvbU1hdHJpeDQoX20xMi5tYWtlUm90YXRpb25Gcm9tRXVsZXIoX2UxKSk7CiAgICAgIHVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWUgPSBlbnZNYXAuaXNDdWJlVGV4dHVyZSAmJiBlbnZNYXAuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID09PSBmYWxzZSA/IC0xIDogMTsKICAgICAgdW5pZm9ybXMucmVmbGVjdGl2aXR5LnZhbHVlID0gbWF0ZXJpYWwucmVmbGVjdGl2aXR5OwogICAgICB1bmlmb3Jtcy5pb3IudmFsdWUgPSBtYXRlcmlhbC5pb3I7CiAgICAgIHVuaWZvcm1zLnJlZnJhY3Rpb25SYXRpby52YWx1ZSA9IG1hdGVyaWFsLnJlZnJhY3Rpb25SYXRpbzsKICAgIH0KICAgIGlmIChtYXRlcmlhbC5saWdodE1hcCkgewogICAgICB1bmlmb3Jtcy5saWdodE1hcC52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwOwogICAgICB1bmlmb3Jtcy5saWdodE1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5OwogICAgICByZWZyZXNoVHJhbnNmb3JtVW5pZm9ybShtYXRlcmlhbC5saWdodE1hcCwgdW5pZm9ybXMubGlnaHRNYXBUcmFuc2Zvcm0pOwogICAgfQogICAgaWYgKG1hdGVyaWFsLmFvTWFwKSB7CiAgICAgIHVuaWZvcm1zLmFvTWFwLnZhbHVlID0gbWF0ZXJpYWwuYW9NYXA7CiAgICAgIHVuaWZvcm1zLmFvTWFwSW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHk7CiAgICAgIHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKG1hdGVyaWFsLmFvTWFwLCB1bmlmb3Jtcy5hb01hcFRyYW5zZm9ybSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0xpbmUodW5pZm9ybXMsIG1hdGVyaWFsKSB7CiAgICB1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlLmNvcHkobWF0ZXJpYWwuY29sb3IpOwogICAgdW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7CiAgICBpZiAobWF0ZXJpYWwubWFwKSB7CiAgICAgIHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDsKICAgICAgcmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0obWF0ZXJpYWwubWFwLCB1bmlmb3Jtcy5tYXBUcmFuc2Zvcm0pOwogICAgfQogIH0KICBmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNEYXNoKHVuaWZvcm1zLCBtYXRlcmlhbCkgewogICAgdW5pZm9ybXMuZGFzaFNpemUudmFsdWUgPSBtYXRlcmlhbC5kYXNoU2l6ZTsKICAgIHVuaWZvcm1zLnRvdGFsU2l6ZS52YWx1ZSA9IG1hdGVyaWFsLmRhc2hTaXplICsgbWF0ZXJpYWwuZ2FwU2l6ZTsKICAgIHVuaWZvcm1zLnNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuc2NhbGU7CiAgfQogIGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BvaW50cyh1bmlmb3JtcywgbWF0ZXJpYWwsIHBpeGVsUmF0aW8sIGhlaWdodCkgewogICAgdW5pZm9ybXMuZGlmZnVzZS52YWx1ZS5jb3B5KG1hdGVyaWFsLmNvbG9yKTsKICAgIHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5OwogICAgdW5pZm9ybXMuc2l6ZS52YWx1ZSA9IG1hdGVyaWFsLnNpemUgKiBwaXhlbFJhdGlvOwogICAgdW5pZm9ybXMuc2NhbGUudmFsdWUgPSBoZWlnaHQgKiAwLjU7CiAgICBpZiAobWF0ZXJpYWwubWFwKSB7CiAgICAgIHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDsKICAgICAgcmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0obWF0ZXJpYWwubWFwLCB1bmlmb3Jtcy51dlRyYW5zZm9ybSk7CiAgICB9CiAgICBpZiAobWF0ZXJpYWwuYWxwaGFNYXApIHsKICAgICAgdW5pZm9ybXMuYWxwaGFNYXAudmFsdWUgPSBtYXRlcmlhbC5hbHBoYU1hcDsKICAgICAgcmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0obWF0ZXJpYWwuYWxwaGFNYXAsIHVuaWZvcm1zLmFscGhhTWFwVHJhbnNmb3JtKTsKICAgIH0KICAgIGlmIChtYXRlcmlhbC5hbHBoYVRlc3QgPiAwKSB7CiAgICAgIHVuaWZvcm1zLmFscGhhVGVzdC52YWx1ZSA9IG1hdGVyaWFsLmFscGhhVGVzdDsKICAgIH0KICB9CiAgZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zU3ByaXRlcyh1bmlmb3JtcywgbWF0ZXJpYWwpIHsKICAgIHVuaWZvcm1zLmRpZmZ1c2UudmFsdWUuY29weShtYXRlcmlhbC5jb2xvcik7CiAgICB1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTsKICAgIHVuaWZvcm1zLnJvdGF0aW9uLnZhbHVlID0gbWF0ZXJpYWwucm90YXRpb247CiAgICBpZiAobWF0ZXJpYWwubWFwKSB7CiAgICAgIHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDsKICAgICAgcmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0obWF0ZXJpYWwubWFwLCB1bmlmb3Jtcy5tYXBUcmFuc2Zvcm0pOwogICAgfQogICAgaWYgKG1hdGVyaWFsLmFscGhhTWFwKSB7CiAgICAgIHVuaWZvcm1zLmFscGhhTWFwLnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFNYXA7CiAgICAgIHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKG1hdGVyaWFsLmFscGhhTWFwLCB1bmlmb3Jtcy5hbHBoYU1hcFRyYW5zZm9ybSk7CiAgICB9CiAgICBpZiAobWF0ZXJpYWwuYWxwaGFUZXN0ID4gMCkgewogICAgICB1bmlmb3Jtcy5hbHBoYVRlc3QudmFsdWUgPSBtYXRlcmlhbC5hbHBoYVRlc3Q7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Bob25nKHVuaWZvcm1zLCBtYXRlcmlhbCkgewogICAgdW5pZm9ybXMuc3BlY3VsYXIudmFsdWUuY29weShtYXRlcmlhbC5zcGVjdWxhcik7CiAgICB1bmlmb3Jtcy5zaGluaW5lc3MudmFsdWUgPSBNYXRoLm1heChtYXRlcmlhbC5zaGluaW5lc3MsIDAuMDAwMSk7CiAgfQogIGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Rvb24odW5pZm9ybXMsIG1hdGVyaWFsKSB7CiAgICBpZiAobWF0ZXJpYWwuZ3JhZGllbnRNYXApIHsKICAgICAgdW5pZm9ybXMuZ3JhZGllbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5ncmFkaWVudE1hcDsKICAgIH0KICB9CiAgZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zU3RhbmRhcmQodW5pZm9ybXMsIG1hdGVyaWFsKSB7CiAgICB1bmlmb3Jtcy5tZXRhbG5lc3MudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3M7CiAgICBpZiAobWF0ZXJpYWwubWV0YWxuZXNzTWFwKSB7CiAgICAgIHVuaWZvcm1zLm1ldGFsbmVzc01hcC52YWx1ZSA9IG1hdGVyaWFsLm1ldGFsbmVzc01hcDsKICAgICAgcmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0obWF0ZXJpYWwubWV0YWxuZXNzTWFwLCB1bmlmb3Jtcy5tZXRhbG5lc3NNYXBUcmFuc2Zvcm0pOwogICAgfQogICAgdW5pZm9ybXMucm91Z2huZXNzLnZhbHVlID0gbWF0ZXJpYWwucm91Z2huZXNzOwogICAgaWYgKG1hdGVyaWFsLnJvdWdobmVzc01hcCkgewogICAgICB1bmlmb3Jtcy5yb3VnaG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5yb3VnaG5lc3NNYXA7CiAgICAgIHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKG1hdGVyaWFsLnJvdWdobmVzc01hcCwgdW5pZm9ybXMucm91Z2huZXNzTWFwVHJhbnNmb3JtKTsKICAgIH0KICAgIGlmIChtYXRlcmlhbC5lbnZNYXApIHsKICAgICAgdW5pZm9ybXMuZW52TWFwSW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwuZW52TWFwSW50ZW5zaXR5OwogICAgfQogIH0KICBmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNQaHlzaWNhbCh1bmlmb3JtcywgbWF0ZXJpYWwsIHRyYW5zbWlzc2lvblJlbmRlclRhcmdldCkgewogICAgdW5pZm9ybXMuaW9yLnZhbHVlID0gbWF0ZXJpYWwuaW9yOwogICAgaWYgKG1hdGVyaWFsLnNoZWVuID4gMCkgewogICAgICB1bmlmb3Jtcy5zaGVlbkNvbG9yLnZhbHVlLmNvcHkobWF0ZXJpYWwuc2hlZW5Db2xvcikubXVsdGlwbHlTY2FsYXIobWF0ZXJpYWwuc2hlZW4pOwogICAgICB1bmlmb3Jtcy5zaGVlblJvdWdobmVzcy52YWx1ZSA9IG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzOwogICAgICBpZiAobWF0ZXJpYWwuc2hlZW5Db2xvck1hcCkgewogICAgICAgIHVuaWZvcm1zLnNoZWVuQ29sb3JNYXAudmFsdWUgPSBtYXRlcmlhbC5zaGVlbkNvbG9yTWFwOwogICAgICAgIHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKG1hdGVyaWFsLnNoZWVuQ29sb3JNYXAsIHVuaWZvcm1zLnNoZWVuQ29sb3JNYXBUcmFuc2Zvcm0pOwogICAgICB9CiAgICAgIGlmIChtYXRlcmlhbC5zaGVlblJvdWdobmVzc01hcCkgewogICAgICAgIHVuaWZvcm1zLnNoZWVuUm91Z2huZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3NNYXA7CiAgICAgICAgcmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0obWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3NNYXAsIHVuaWZvcm1zLnNoZWVuUm91Z2huZXNzTWFwVHJhbnNmb3JtKTsKICAgICAgfQogICAgfQogICAgaWYgKG1hdGVyaWFsLmNsZWFyY29hdCA+IDApIHsKICAgICAgdW5pZm9ybXMuY2xlYXJjb2F0LnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJjb2F0OwogICAgICB1bmlmb3Jtcy5jbGVhcmNvYXRSb3VnaG5lc3MudmFsdWUgPSBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3M7CiAgICAgIGlmIChtYXRlcmlhbC5jbGVhcmNvYXRNYXApIHsKICAgICAgICB1bmlmb3Jtcy5jbGVhcmNvYXRNYXAudmFsdWUgPSBtYXRlcmlhbC5jbGVhcmNvYXRNYXA7CiAgICAgICAgcmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0obWF0ZXJpYWwuY2xlYXJjb2F0TWFwLCB1bmlmb3Jtcy5jbGVhcmNvYXRNYXBUcmFuc2Zvcm0pOwogICAgICB9CiAgICAgIGlmIChtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3NNYXApIHsKICAgICAgICB1bmlmb3Jtcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3NNYXA7CiAgICAgICAgcmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0obWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwLCB1bmlmb3Jtcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXBUcmFuc2Zvcm0pOwogICAgICB9CiAgICAgIGlmIChtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXApIHsKICAgICAgICB1bmlmb3Jtcy5jbGVhcmNvYXROb3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXA7CiAgICAgICAgcmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0obWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwLCB1bmlmb3Jtcy5jbGVhcmNvYXROb3JtYWxNYXBUcmFuc2Zvcm0pOwogICAgICAgIHVuaWZvcm1zLmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLmNvcHkobWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpOwogICAgICAgIGlmIChtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSkgewogICAgICAgICAgdW5pZm9ybXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobWF0ZXJpYWwuZGlzcGVyc2lvbiA+IDApIHsKICAgICAgdW5pZm9ybXMuZGlzcGVyc2lvbi52YWx1ZSA9IG1hdGVyaWFsLmRpc3BlcnNpb247CiAgICB9CiAgICBpZiAobWF0ZXJpYWwuaXJpZGVzY2VuY2UgPiAwKSB7CiAgICAgIHVuaWZvcm1zLmlyaWRlc2NlbmNlLnZhbHVlID0gbWF0ZXJpYWwuaXJpZGVzY2VuY2U7CiAgICAgIHVuaWZvcm1zLmlyaWRlc2NlbmNlSU9SLnZhbHVlID0gbWF0ZXJpYWwuaXJpZGVzY2VuY2VJT1I7CiAgICAgIHVuaWZvcm1zLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bS52YWx1ZSA9IG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2VbMF07CiAgICAgIHVuaWZvcm1zLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bS52YWx1ZSA9IG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2VbMV07CiAgICAgIGlmIChtYXRlcmlhbC5pcmlkZXNjZW5jZU1hcCkgewogICAgICAgIHVuaWZvcm1zLmlyaWRlc2NlbmNlTWFwLnZhbHVlID0gbWF0ZXJpYWwuaXJpZGVzY2VuY2VNYXA7CiAgICAgICAgcmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0obWF0ZXJpYWwuaXJpZGVzY2VuY2VNYXAsIHVuaWZvcm1zLmlyaWRlc2NlbmNlTWFwVHJhbnNmb3JtKTsKICAgICAgfQogICAgICBpZiAobWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3NNYXApIHsKICAgICAgICB1bmlmb3Jtcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcC52YWx1ZSA9IG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwOwogICAgICAgIHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKG1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLCB1bmlmb3Jtcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcFRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChtYXRlcmlhbC50cmFuc21pc3Npb24gPiAwKSB7CiAgICAgIHVuaWZvcm1zLnRyYW5zbWlzc2lvbi52YWx1ZSA9IG1hdGVyaWFsLnRyYW5zbWlzc2lvbjsKICAgICAgdW5pZm9ybXMudHJhbnNtaXNzaW9uU2FtcGxlck1hcC52YWx1ZSA9IHRyYW5zbWlzc2lvblJlbmRlclRhcmdldC50ZXh0dXJlOwogICAgICB1bmlmb3Jtcy50cmFuc21pc3Npb25TYW1wbGVyU2l6ZS52YWx1ZS5zZXQodHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0LndpZHRoLCB0cmFuc21pc3Npb25SZW5kZXJUYXJnZXQuaGVpZ2h0KTsKICAgICAgaWYgKG1hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcCkgewogICAgICAgIHVuaWZvcm1zLnRyYW5zbWlzc2lvbk1hcC52YWx1ZSA9IG1hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcDsKICAgICAgICByZWZyZXNoVHJhbnNmb3JtVW5pZm9ybShtYXRlcmlhbC50cmFuc21pc3Npb25NYXAsIHVuaWZvcm1zLnRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybSk7CiAgICAgIH0KICAgICAgdW5pZm9ybXMudGhpY2tuZXNzLnZhbHVlID0gbWF0ZXJpYWwudGhpY2tuZXNzOwogICAgICBpZiAobWF0ZXJpYWwudGhpY2tuZXNzTWFwKSB7CiAgICAgICAgdW5pZm9ybXMudGhpY2tuZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwudGhpY2tuZXNzTWFwOwogICAgICAgIHJlZnJlc2hUcmFuc2Zvcm1Vbmlmb3JtKG1hdGVyaWFsLnRoaWNrbmVzc01hcCwgdW5pZm9ybXMudGhpY2tuZXNzTWFwVHJhbnNmb3JtKTsKICAgICAgfQogICAgICB1bmlmb3Jtcy5hdHRlbnVhdGlvbkRpc3RhbmNlLnZhbHVlID0gbWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZTsKICAgICAgdW5pZm9ybXMuYXR0ZW51YXRpb25Db2xvci52YWx1ZS5jb3B5KG1hdGVyaWFsLmF0dGVudWF0aW9uQ29sb3IpOwogICAgfQogICAgaWYgKG1hdGVyaWFsLmFuaXNvdHJvcHkgPiAwKSB7CiAgICAgIHVuaWZvcm1zLmFuaXNvdHJvcHlWZWN0b3IudmFsdWUuc2V0KG1hdGVyaWFsLmFuaXNvdHJvcHkgKiBNYXRoLmNvcyhtYXRlcmlhbC5hbmlzb3Ryb3B5Um90YXRpb24pLCBtYXRlcmlhbC5hbmlzb3Ryb3B5ICogTWF0aC5zaW4obWF0ZXJpYWwuYW5pc290cm9weVJvdGF0aW9uKSk7CiAgICAgIGlmIChtYXRlcmlhbC5hbmlzb3Ryb3B5TWFwKSB7CiAgICAgICAgdW5pZm9ybXMuYW5pc290cm9weU1hcC52YWx1ZSA9IG1hdGVyaWFsLmFuaXNvdHJvcHlNYXA7CiAgICAgICAgcmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0obWF0ZXJpYWwuYW5pc290cm9weU1hcCwgdW5pZm9ybXMuYW5pc290cm9weU1hcFRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH0KICAgIHVuaWZvcm1zLnNwZWN1bGFySW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHk7CiAgICB1bmlmb3Jtcy5zcGVjdWxhckNvbG9yLnZhbHVlLmNvcHkobWF0ZXJpYWwuc3BlY3VsYXJDb2xvcik7CiAgICBpZiAobWF0ZXJpYWwuc3BlY3VsYXJDb2xvck1hcCkgewogICAgICB1bmlmb3Jtcy5zcGVjdWxhckNvbG9yTWFwLnZhbHVlID0gbWF0ZXJpYWwuc3BlY3VsYXJDb2xvck1hcDsKICAgICAgcmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0obWF0ZXJpYWwuc3BlY3VsYXJDb2xvck1hcCwgdW5pZm9ybXMuc3BlY3VsYXJDb2xvck1hcFRyYW5zZm9ybSk7CiAgICB9CiAgICBpZiAobWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHlNYXApIHsKICAgICAgdW5pZm9ybXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAudmFsdWUgPSBtYXRlcmlhbC5zcGVjdWxhckludGVuc2l0eU1hcDsKICAgICAgcmVmcmVzaFRyYW5zZm9ybVVuaWZvcm0obWF0ZXJpYWwuc3BlY3VsYXJJbnRlbnNpdHlNYXAsIHVuaWZvcm1zLnNwZWN1bGFySW50ZW5zaXR5TWFwVHJhbnNmb3JtKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTWF0Y2FwKHVuaWZvcm1zLCBtYXRlcmlhbCkgewogICAgaWYgKG1hdGVyaWFsLm1hdGNhcCkgewogICAgICB1bmlmb3Jtcy5tYXRjYXAudmFsdWUgPSBtYXRlcmlhbC5tYXRjYXA7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rpc3RhbmNlKHVuaWZvcm1zLCBtYXRlcmlhbCkgewogICAgY29uc3QgbGlnaHQgPSBwcm9wZXJ0aWVzLmdldChtYXRlcmlhbCkubGlnaHQ7CiAgICB1bmlmb3Jtcy5yZWZlcmVuY2VQb3NpdGlvbi52YWx1ZS5zZXRGcm9tTWF0cml4UG9zaXRpb24obGlnaHQubWF0cml4V29ybGQpOwogICAgdW5pZm9ybXMubmVhckRpc3RhbmNlLnZhbHVlID0gbGlnaHQuc2hhZG93LmNhbWVyYS5uZWFyOwogICAgdW5pZm9ybXMuZmFyRGlzdGFuY2UudmFsdWUgPSBsaWdodC5zaGFkb3cuY2FtZXJhLmZhcjsKICB9CiAgcmV0dXJuIHsKICAgIHJlZnJlc2hGb2dVbmlmb3JtcywKICAgIHJlZnJlc2hNYXRlcmlhbFVuaWZvcm1zCiAgfTsKfQpmdW5jdGlvbiBXZWJHTFVuaWZvcm1zR3JvdXBzKGdsLCBpbmZvLCBjYXBhYmlsaXRpZXMsIHN0YXRlKSB7CiAgbGV0IGJ1ZmZlcnMgPSB7fTsKICBsZXQgdXBkYXRlTGlzdCA9IHt9OwogIGxldCBhbGxvY2F0ZWRCaW5kaW5nUG9pbnRzID0gW107CiAgY29uc3QgbWF4QmluZGluZ1BvaW50cyA9IGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVU5JRk9STV9CVUZGRVJfQklORElOR1MpOwogIGZ1bmN0aW9uIGJpbmQodW5pZm9ybXNHcm91cCwgcHJvZ3JhbSkgewogICAgY29uc3Qgd2ViZ2xQcm9ncmFtID0gcHJvZ3JhbS5wcm9ncmFtOwogICAgc3RhdGUudW5pZm9ybUJsb2NrQmluZGluZyh1bmlmb3Jtc0dyb3VwLCB3ZWJnbFByb2dyYW0pOwogIH0KICBmdW5jdGlvbiB1cGRhdGUodW5pZm9ybXNHcm91cCwgcHJvZ3JhbSkgewogICAgbGV0IGJ1ZmZlciA9IGJ1ZmZlcnNbdW5pZm9ybXNHcm91cC5pZF07CiAgICBpZiAoYnVmZmVyID09PSB1bmRlZmluZWQpIHsKICAgICAgcHJlcGFyZVVuaWZvcm1zR3JvdXAodW5pZm9ybXNHcm91cCk7CiAgICAgIGJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlcih1bmlmb3Jtc0dyb3VwKTsKICAgICAgYnVmZmVyc1t1bmlmb3Jtc0dyb3VwLmlkXSA9IGJ1ZmZlcjsKICAgICAgdW5pZm9ybXNHcm91cC5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgb25Vbmlmb3Jtc0dyb3Vwc0Rpc3Bvc2UpOwogICAgfQogICAgY29uc3Qgd2ViZ2xQcm9ncmFtID0gcHJvZ3JhbS5wcm9ncmFtOwogICAgc3RhdGUudXBkYXRlVUJPTWFwcGluZyh1bmlmb3Jtc0dyb3VwLCB3ZWJnbFByb2dyYW0pOwogICAgY29uc3QgZnJhbWUgPSBpbmZvLnJlbmRlci5mcmFtZTsKICAgIGlmICh1cGRhdGVMaXN0W3VuaWZvcm1zR3JvdXAuaWRdICE9PSBmcmFtZSkgewogICAgICB1cGRhdGVCdWZmZXJEYXRhKHVuaWZvcm1zR3JvdXApOwogICAgICB1cGRhdGVMaXN0W3VuaWZvcm1zR3JvdXAuaWRdID0gZnJhbWU7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlcih1bmlmb3Jtc0dyb3VwKSB7CiAgICBjb25zdCBiaW5kaW5nUG9pbnRJbmRleCA9IGFsbG9jYXRlQmluZGluZ1BvaW50SW5kZXgoKTsKICAgIHVuaWZvcm1zR3JvdXAuX19iaW5kaW5nUG9pbnRJbmRleCA9IGJpbmRpbmdQb2ludEluZGV4OwogICAgY29uc3QgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiAgICBjb25zdCBzaXplID0gdW5pZm9ybXNHcm91cC5fX3NpemU7CiAgICBjb25zdCB1c2FnZSA9IHVuaWZvcm1zR3JvdXAudXNhZ2U7CiAgICBnbC5iaW5kQnVmZmVyKGdsLlVOSUZPUk1fQlVGRkVSLCBidWZmZXIpOwogICAgZ2wuYnVmZmVyRGF0YShnbC5VTklGT1JNX0JVRkZFUiwgc2l6ZSwgdXNhZ2UpOwogICAgZ2wuYmluZEJ1ZmZlcihnbC5VTklGT1JNX0JVRkZFUiwgbnVsbCk7CiAgICBnbC5iaW5kQnVmZmVyQmFzZShnbC5VTklGT1JNX0JVRkZFUiwgYmluZGluZ1BvaW50SW5kZXgsIGJ1ZmZlcik7CiAgICByZXR1cm4gYnVmZmVyOwogIH0KICBmdW5jdGlvbiBhbGxvY2F0ZUJpbmRpbmdQb2ludEluZGV4KCkgewogICAgZm9yIChsZXQgaSA9IDA7aSA8IG1heEJpbmRpbmdQb2ludHM7IGkrKykgewogICAgICBpZiAoYWxsb2NhdGVkQmluZGluZ1BvaW50cy5pbmRleE9mKGkpID09PSAtMSkgewogICAgICAgIGFsbG9jYXRlZEJpbmRpbmdQb2ludHMucHVzaChpKTsKICAgICAgICByZXR1cm4gaTsKICAgICAgfQogICAgfQogICAgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlcjogTWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzbHkgdXNhYmxlIHVuaWZvcm1zIGdyb3VwcyByZWFjaGVkLiIpOwogICAgcmV0dXJuIDA7CiAgfQogIGZ1bmN0aW9uIHVwZGF0ZUJ1ZmZlckRhdGEodW5pZm9ybXNHcm91cCkgewogICAgY29uc3QgYnVmZmVyID0gYnVmZmVyc1t1bmlmb3Jtc0dyb3VwLmlkXTsKICAgIGNvbnN0IHVuaWZvcm1zID0gdW5pZm9ybXNHcm91cC51bmlmb3JtczsKICAgIGNvbnN0IGNhY2hlID0gdW5pZm9ybXNHcm91cC5fX2NhY2hlOwogICAgZ2wuYmluZEJ1ZmZlcihnbC5VTklGT1JNX0JVRkZFUiwgYnVmZmVyKTsKICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IHVuaWZvcm1zLmxlbmd0aDtpIDwgaWw7IGkrKykgewogICAgICBjb25zdCB1bmlmb3JtQXJyYXkgPSBBcnJheS5pc0FycmF5KHVuaWZvcm1zW2ldKSA/IHVuaWZvcm1zW2ldIDogW3VuaWZvcm1zW2ldXTsKICAgICAgZm9yIChsZXQgaiA9IDAsIGpsID0gdW5pZm9ybUFycmF5Lmxlbmd0aDtqIDwgamw7IGorKykgewogICAgICAgIGNvbnN0IHVuaWZvcm0gPSB1bmlmb3JtQXJyYXlbal07CiAgICAgICAgaWYgKGhhc1VuaWZvcm1DaGFuZ2VkKHVuaWZvcm0sIGksIGosIGNhY2hlKSA9PT0gdHJ1ZSkgewogICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdW5pZm9ybS5fX29mZnNldDsKICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodW5pZm9ybS52YWx1ZSkgPyB1bmlmb3JtLnZhbHVlIDogW3VuaWZvcm0udmFsdWVdOwogICAgICAgICAgbGV0IGFycmF5T2Zmc2V0ID0gMDsKICAgICAgICAgIGZvciAobGV0IGsgPSAwO2sgPCB2YWx1ZXMubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNba107CiAgICAgICAgICAgIGNvbnN0IGluZm8yID0gZ2V0VW5pZm9ybVNpemUodmFsdWUpOwogICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAibnVtYmVyIiB8fCB0eXBlb2YgdmFsdWUgPT09ICJib29sZWFuIikgewogICAgICAgICAgICAgIHVuaWZvcm0uX19kYXRhWzBdID0gdmFsdWU7CiAgICAgICAgICAgICAgZ2wuYnVmZmVyU3ViRGF0YShnbC5VTklGT1JNX0JVRkZFUiwgb2Zmc2V0ICsgYXJyYXlPZmZzZXQsIHVuaWZvcm0uX19kYXRhKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pc01hdHJpeDMpIHsKICAgICAgICAgICAgICB1bmlmb3JtLl9fZGF0YVswXSA9IHZhbHVlLmVsZW1lbnRzWzBdOwogICAgICAgICAgICAgIHVuaWZvcm0uX19kYXRhWzFdID0gdmFsdWUuZWxlbWVudHNbMV07CiAgICAgICAgICAgICAgdW5pZm9ybS5fX2RhdGFbMl0gPSB2YWx1ZS5lbGVtZW50c1syXTsKICAgICAgICAgICAgICB1bmlmb3JtLl9fZGF0YVszXSA9IDA7CiAgICAgICAgICAgICAgdW5pZm9ybS5fX2RhdGFbNF0gPSB2YWx1ZS5lbGVtZW50c1szXTsKICAgICAgICAgICAgICB1bmlmb3JtLl9fZGF0YVs1XSA9IHZhbHVlLmVsZW1lbnRzWzRdOwogICAgICAgICAgICAgIHVuaWZvcm0uX19kYXRhWzZdID0gdmFsdWUuZWxlbWVudHNbNV07CiAgICAgICAgICAgICAgdW5pZm9ybS5fX2RhdGFbN10gPSAwOwogICAgICAgICAgICAgIHVuaWZvcm0uX19kYXRhWzhdID0gdmFsdWUuZWxlbWVudHNbNl07CiAgICAgICAgICAgICAgdW5pZm9ybS5fX2RhdGFbOV0gPSB2YWx1ZS5lbGVtZW50c1s3XTsKICAgICAgICAgICAgICB1bmlmb3JtLl9fZGF0YVsxMF0gPSB2YWx1ZS5lbGVtZW50c1s4XTsKICAgICAgICAgICAgICB1bmlmb3JtLl9fZGF0YVsxMV0gPSAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhbHVlLnRvQXJyYXkodW5pZm9ybS5fX2RhdGEsIGFycmF5T2Zmc2V0KTsKICAgICAgICAgICAgICBhcnJheU9mZnNldCArPSBpbmZvMi5zdG9yYWdlIC8gRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBnbC5idWZmZXJTdWJEYXRhKGdsLlVOSUZPUk1fQlVGRkVSLCBvZmZzZXQsIHVuaWZvcm0uX19kYXRhKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGdsLmJpbmRCdWZmZXIoZ2wuVU5JRk9STV9CVUZGRVIsIG51bGwpOwogIH0KICBmdW5jdGlvbiBoYXNVbmlmb3JtQ2hhbmdlZCh1bmlmb3JtLCBpbmRleCwgaW5kZXhBcnJheSwgY2FjaGUpIHsKICAgIGNvbnN0IHZhbHVlID0gdW5pZm9ybS52YWx1ZTsKICAgIGNvbnN0IGluZGV4U3RyaW5nID0gaW5kZXggKyAiXyIgKyBpbmRleEFycmF5OwogICAgaWYgKGNhY2hlW2luZGV4U3RyaW5nXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJudW1iZXIiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgY2FjaGVbaW5kZXhTdHJpbmddID0gdmFsdWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2FjaGVbaW5kZXhTdHJpbmddID0gdmFsdWUuY2xvbmUoKTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGNhY2hlZE9iamVjdCA9IGNhY2hlW2luZGV4U3RyaW5nXTsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gIm51bWJlciIgfHwgdHlwZW9mIHZhbHVlID09PSAiYm9vbGVhbiIpIHsKICAgICAgICBpZiAoY2FjaGVkT2JqZWN0ICE9PSB2YWx1ZSkgewogICAgICAgICAgY2FjaGVbaW5kZXhTdHJpbmddID0gdmFsdWU7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGNhY2hlZE9iamVjdC5lcXVhbHModmFsdWUpID09PSBmYWxzZSkgewogICAgICAgICAgY2FjaGVkT2JqZWN0LmNvcHkodmFsdWUpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGZ1bmN0aW9uIHByZXBhcmVVbmlmb3Jtc0dyb3VwKHVuaWZvcm1zR3JvdXApIHsKICAgIGNvbnN0IHVuaWZvcm1zID0gdW5pZm9ybXNHcm91cC51bmlmb3JtczsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgY29uc3QgY2h1bmtTaXplID0gMTY7CiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHVuaWZvcm1zLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgIGNvbnN0IHVuaWZvcm1BcnJheSA9IEFycmF5LmlzQXJyYXkodW5pZm9ybXNbaV0pID8gdW5pZm9ybXNbaV0gOiBbdW5pZm9ybXNbaV1dOwogICAgICBmb3IgKGxldCBqID0gMCwgamwgPSB1bmlmb3JtQXJyYXkubGVuZ3RoO2ogPCBqbDsgaisrKSB7CiAgICAgICAgY29uc3QgdW5pZm9ybSA9IHVuaWZvcm1BcnJheVtqXTsKICAgICAgICBjb25zdCB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KHVuaWZvcm0udmFsdWUpID8gdW5pZm9ybS52YWx1ZSA6IFt1bmlmb3JtLnZhbHVlXTsKICAgICAgICBmb3IgKGxldCBrID0gMCwga2wgPSB2YWx1ZXMubGVuZ3RoO2sgPCBrbDsgaysrKSB7CiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1trXTsKICAgICAgICAgIGNvbnN0IGluZm8yID0gZ2V0VW5pZm9ybVNpemUodmFsdWUpOwogICAgICAgICAgY29uc3QgY2h1bmtPZmZzZXQyID0gb2Zmc2V0ICUgY2h1bmtTaXplOwogICAgICAgICAgY29uc3QgY2h1bmtQYWRkaW5nID0gY2h1bmtPZmZzZXQyICUgaW5mbzIuYm91bmRhcnk7CiAgICAgICAgICBjb25zdCBjaHVua1N0YXJ0ID0gY2h1bmtPZmZzZXQyICsgY2h1bmtQYWRkaW5nOwogICAgICAgICAgb2Zmc2V0ICs9IGNodW5rUGFkZGluZzsKICAgICAgICAgIGlmIChjaHVua1N0YXJ0ICE9PSAwICYmIGNodW5rU2l6ZSAtIGNodW5rU3RhcnQgPCBpbmZvMi5zdG9yYWdlKSB7CiAgICAgICAgICAgIG9mZnNldCArPSBjaHVua1NpemUgLSBjaHVua1N0YXJ0OwogICAgICAgICAgfQogICAgICAgICAgdW5pZm9ybS5fX2RhdGEgPSBuZXcgRmxvYXQzMkFycmF5KGluZm8yLnN0b3JhZ2UgLyBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpOwogICAgICAgICAgdW5pZm9ybS5fX29mZnNldCA9IG9mZnNldDsKICAgICAgICAgIG9mZnNldCArPSBpbmZvMi5zdG9yYWdlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3QgY2h1bmtPZmZzZXQgPSBvZmZzZXQgJSBjaHVua1NpemU7CiAgICBpZiAoY2h1bmtPZmZzZXQgPiAwKQogICAgICBvZmZzZXQgKz0gY2h1bmtTaXplIC0gY2h1bmtPZmZzZXQ7CiAgICB1bmlmb3Jtc0dyb3VwLl9fc2l6ZSA9IG9mZnNldDsKICAgIHVuaWZvcm1zR3JvdXAuX19jYWNoZSA9IHt9OwogICAgcmV0dXJuIHRoaXM7CiAgfQogIGZ1bmN0aW9uIGdldFVuaWZvcm1TaXplKHZhbHVlKSB7CiAgICBjb25zdCBpbmZvMiA9IHsKICAgICAgYm91bmRhcnk6IDAsCiAgICAgIHN0b3JhZ2U6IDAKICAgIH07CiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAibnVtYmVyIiB8fCB0eXBlb2YgdmFsdWUgPT09ICJib29sZWFuIikgewogICAgICBpbmZvMi5ib3VuZGFyeSA9IDQ7CiAgICAgIGluZm8yLnN0b3JhZ2UgPSA0OwogICAgfSBlbHNlIGlmICh2YWx1ZS5pc1ZlY3RvcjIpIHsKICAgICAgaW5mbzIuYm91bmRhcnkgPSA4OwogICAgICBpbmZvMi5zdG9yYWdlID0gODsKICAgIH0gZWxzZSBpZiAodmFsdWUuaXNWZWN0b3IzIHx8IHZhbHVlLmlzQ29sb3IpIHsKICAgICAgaW5mbzIuYm91bmRhcnkgPSAxNjsKICAgICAgaW5mbzIuc3RvcmFnZSA9IDEyOwogICAgfSBlbHNlIGlmICh2YWx1ZS5pc1ZlY3RvcjQpIHsKICAgICAgaW5mbzIuYm91bmRhcnkgPSAxNjsKICAgICAgaW5mbzIuc3RvcmFnZSA9IDE2OwogICAgfSBlbHNlIGlmICh2YWx1ZS5pc01hdHJpeDMpIHsKICAgICAgaW5mbzIuYm91bmRhcnkgPSA0ODsKICAgICAgaW5mbzIuc3RvcmFnZSA9IDQ4OwogICAgfSBlbHNlIGlmICh2YWx1ZS5pc01hdHJpeDQpIHsKICAgICAgaW5mbzIuYm91bmRhcnkgPSA2NDsKICAgICAgaW5mbzIuc3RvcmFnZSA9IDY0OwogICAgfSBlbHNlIGlmICh2YWx1ZS5pc1RleHR1cmUpIHsKICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIHNhbXBsZXJzIGNhbiBub3QgYmUgcGFydCBvZiBhbiB1bmlmb3JtcyBncm91cC4iKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVW5zdXBwb3J0ZWQgdW5pZm9ybSB2YWx1ZSB0eXBlLiIsIHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBpbmZvMjsKICB9CiAgZnVuY3Rpb24gb25Vbmlmb3Jtc0dyb3Vwc0Rpc3Bvc2UoZXZlbnQpIHsKICAgIGNvbnN0IHVuaWZvcm1zR3JvdXAgPSBldmVudC50YXJnZXQ7CiAgICB1bmlmb3Jtc0dyb3VwLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLCBvblVuaWZvcm1zR3JvdXBzRGlzcG9zZSk7CiAgICBjb25zdCBpbmRleCA9IGFsbG9jYXRlZEJpbmRpbmdQb2ludHMuaW5kZXhPZih1bmlmb3Jtc0dyb3VwLl9fYmluZGluZ1BvaW50SW5kZXgpOwogICAgYWxsb2NhdGVkQmluZGluZ1BvaW50cy5zcGxpY2UoaW5kZXgsIDEpOwogICAgZ2wuZGVsZXRlQnVmZmVyKGJ1ZmZlcnNbdW5pZm9ybXNHcm91cC5pZF0pOwogICAgZGVsZXRlIGJ1ZmZlcnNbdW5pZm9ybXNHcm91cC5pZF07CiAgICBkZWxldGUgdXBkYXRlTGlzdFt1bmlmb3Jtc0dyb3VwLmlkXTsKICB9CiAgZnVuY3Rpb24gZGlzcG9zZSgpIHsKICAgIGZvciAoY29uc3QgaWQgaW4gYnVmZmVycykgewogICAgICBnbC5kZWxldGVCdWZmZXIoYnVmZmVyc1tpZF0pOwogICAgfQogICAgYWxsb2NhdGVkQmluZGluZ1BvaW50cyA9IFtdOwogICAgYnVmZmVycyA9IHt9OwogICAgdXBkYXRlTGlzdCA9IHt9OwogIH0KICByZXR1cm4gewogICAgYmluZCwKICAgIHVwZGF0ZSwKICAgIGRpc3Bvc2UKICB9Owp9CgpjbGFzcyBXZWJHTFJlbmRlcmVyIHsKICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHsKICAgIGNvbnN0IHsKICAgICAgY2FudmFzID0gY3JlYXRlQ2FudmFzRWxlbWVudCgpLAogICAgICBjb250ZXh0ID0gbnVsbCwKICAgICAgZGVwdGggPSB0cnVlLAogICAgICBzdGVuY2lsID0gZmFsc2UsCiAgICAgIGFscGhhID0gZmFsc2UsCiAgICAgIGFudGlhbGlhcyA9IGZhbHNlLAogICAgICBwcmVtdWx0aXBsaWVkQWxwaGEgPSB0cnVlLAogICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXIgPSBmYWxzZSwKICAgICAgcG93ZXJQcmVmZXJlbmNlID0gImRlZmF1bHQiLAogICAgICBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0ID0gZmFsc2UsCiAgICAgIHJldmVyc2VEZXB0aEJ1ZmZlciA9IGZhbHNlLAogICAgICBtdWx0aXZpZXdTdGVyZW8gPSBmYWxzZQogICAgfSA9IHBhcmFtZXRlcnM7CiAgICB0aGlzLmlzV2ViR0xSZW5kZXJlciA9IHRydWU7CiAgICBsZXQgX2FscGhhOwogICAgaWYgKGNvbnRleHQgIT09IG51bGwpIHsKICAgICAgaWYgKHR5cGVvZiBXZWJHTFJlbmRlcmluZ0NvbnRleHQgIT09ICJ1bmRlZmluZWQiICYmIGNvbnRleHQgaW5zdGFuY2VvZiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6IFdlYkdMIDEgaXMgbm90IHN1cHBvcnRlZCBzaW5jZSByMTYzLiIpOwogICAgICB9CiAgICAgIF9hbHBoYSA9IGNvbnRleHQuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKS5hbHBoYTsKICAgIH0gZWxzZSB7CiAgICAgIF9hbHBoYSA9IGFscGhhOwogICAgfQogICAgY29uc3QgdWludENsZWFyQ29sb3IgPSBuZXcgVWludDMyQXJyYXkoNCk7CiAgICBjb25zdCBpbnRDbGVhckNvbG9yID0gbmV3IEludDMyQXJyYXkoNCk7CiAgICBsZXQgY3VycmVudFJlbmRlckxpc3QgPSBudWxsOwogICAgbGV0IGN1cnJlbnRSZW5kZXJTdGF0ZSA9IG51bGw7CiAgICBjb25zdCByZW5kZXJMaXN0U3RhY2sgPSBbXTsKICAgIGNvbnN0IHJlbmRlclN0YXRlU3RhY2sgPSBbXTsKICAgIHRoaXMuZG9tRWxlbWVudCA9IGNhbnZhczsKICAgIHRoaXMuZGVidWcgPSB7CiAgICAgIGNoZWNrU2hhZGVyRXJyb3JzOiB0cnVlLAogICAgICBvblNoYWRlckVycm9yOiBudWxsCiAgICB9OwogICAgdGhpcy5hdXRvQ2xlYXIgPSB0cnVlOwogICAgdGhpcy5hdXRvQ2xlYXJDb2xvciA9IHRydWU7CiAgICB0aGlzLmF1dG9DbGVhckRlcHRoID0gdHJ1ZTsKICAgIHRoaXMuYXV0b0NsZWFyU3RlbmNpbCA9IHRydWU7CiAgICB0aGlzLnNvcnRPYmplY3RzID0gdHJ1ZTsKICAgIHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBbXTsKICAgIHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZTsKICAgIHRoaXMuX291dHB1dENvbG9yU3BhY2UgPSBTUkdCQ29sb3JTcGFjZTsKICAgIHRoaXMudG9uZU1hcHBpbmcgPSBOb1RvbmVNYXBwaW5nOwogICAgdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlID0gMTsKICAgIGNvbnN0IF90aGlzID0gdGhpczsKICAgIGxldCBfaXNDb250ZXh0TG9zdCA9IGZhbHNlOwogICAgbGV0IF9jdXJyZW50QWN0aXZlQ3ViZUZhY2UgPSAwOwogICAgbGV0IF9jdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWwgPSAwOwogICAgbGV0IF9jdXJyZW50UmVuZGVyVGFyZ2V0ID0gbnVsbDsKICAgIGxldCBfY3VycmVudE1hdGVyaWFsSWQgPSAtMTsKICAgIGxldCBfY3VycmVudENhbWVyYSA9IG51bGw7CiAgICBjb25zdCBfY3VycmVudFZpZXdwb3J0ID0gbmV3IFZlY3RvcjQ7CiAgICBjb25zdCBfY3VycmVudFNjaXNzb3IgPSBuZXcgVmVjdG9yNDsKICAgIGxldCBfY3VycmVudFNjaXNzb3JUZXN0ID0gbnVsbDsKICAgIGNvbnN0IF9jdXJyZW50Q2xlYXJDb2xvciA9IG5ldyBDb2xvcigwKTsKICAgIGxldCBfY3VycmVudENsZWFyQWxwaGEgPSAwOwogICAgbGV0IF93aWR0aCA9IGNhbnZhcy53aWR0aDsKICAgIGxldCBfaGVpZ2h0ID0gY2FudmFzLmhlaWdodDsKICAgIGxldCBfcGl4ZWxSYXRpbyA9IDE7CiAgICBsZXQgX29wYXF1ZVNvcnQgPSBudWxsOwogICAgbGV0IF90cmFuc3BhcmVudFNvcnQgPSBudWxsOwogICAgY29uc3QgX3ZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoMCwgMCwgX3dpZHRoLCBfaGVpZ2h0KTsKICAgIGNvbnN0IF9zY2lzc29yID0gbmV3IFZlY3RvcjQoMCwgMCwgX3dpZHRoLCBfaGVpZ2h0KTsKICAgIGxldCBfc2Npc3NvclRlc3QgPSBmYWxzZTsKICAgIGNvbnN0IF9mcnVzdHVtMiA9IG5ldyBGcnVzdHVtOwogICAgbGV0IF9jbGlwcGluZ0VuYWJsZWQgPSBmYWxzZTsKICAgIGxldCBfbG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZTsKICAgIHRoaXMudHJhbnNtaXNzaW9uUmVzb2x1dGlvblNjYWxlID0gMTsKICAgIGNvbnN0IF9jdXJyZW50UHJvamVjdGlvbk1hdHJpeCA9IG5ldyBNYXRyaXg0OwogICAgY29uc3QgX3Byb2pTY3JlZW5NYXRyaXgyID0gbmV3IE1hdHJpeDQ7CiAgICBjb25zdCBfdmVjdG9yMzIgPSBuZXcgVmVjdG9yMzsKICAgIGNvbnN0IF92ZWN0b3I0ID0gbmV3IFZlY3RvcjQ7CiAgICBjb25zdCBfZW1wdHlTY2VuZSA9IHsgYmFja2dyb3VuZDogbnVsbCwgZm9nOiBudWxsLCBlbnZpcm9ubWVudDogbnVsbCwgb3ZlcnJpZGVNYXRlcmlhbDogbnVsbCwgaXNTY2VuZTogdHJ1ZSB9OwogICAgbGV0IF9yZW5kZXJCYWNrZ3JvdW5kID0gZmFsc2U7CiAgICBmdW5jdGlvbiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgewogICAgICByZXR1cm4gX2N1cnJlbnRSZW5kZXJUYXJnZXQgPT09IG51bGwgPyBfcGl4ZWxSYXRpbyA6IDE7CiAgICB9CiAgICBsZXQgX2dsID0gY29udGV4dDsKICAgIGZ1bmN0aW9uIGdldENvbnRleHQoY29udGV4dE5hbWUsIGNvbnRleHRBdHRyaWJ1dGVzKSB7CiAgICAgIHJldHVybiBjYW52YXMuZ2V0Q29udGV4dChjb250ZXh0TmFtZSwgY29udGV4dEF0dHJpYnV0ZXMpOwogICAgfQogICAgdHJ5IHsKICAgICAgY29uc3QgY29udGV4dEF0dHJpYnV0ZXMgPSB7CiAgICAgICAgYWxwaGE6IHRydWUsCiAgICAgICAgZGVwdGgsCiAgICAgICAgc3RlbmNpbCwKICAgICAgICBhbnRpYWxpYXMsCiAgICAgICAgcHJlbXVsdGlwbGllZEFscGhhLAogICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlciwKICAgICAgICBwb3dlclByZWZlcmVuY2UsCiAgICAgICAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdAogICAgICB9OwogICAgICBpZiAoInNldEF0dHJpYnV0ZSIgaW4gY2FudmFzKQogICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoImRhdGEtZW5naW5lIiwgYHRocmVlLmpzIHIke1JFVklTSU9OfWApOwogICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0bG9zdCIsIG9uQ29udGV4dExvc3QsIGZhbHNlKTsKICAgICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIiwgb25Db250ZXh0UmVzdG9yZSwgZmFsc2UpOwogICAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0Y3JlYXRpb25lcnJvciIsIG9uQ29udGV4dENyZWF0aW9uRXJyb3IsIGZhbHNlKTsKICAgICAgaWYgKF9nbCA9PT0gbnVsbCkgewogICAgICAgIGNvbnN0IGNvbnRleHROYW1lID0gIndlYmdsMiI7CiAgICAgICAgX2dsID0gZ2V0Q29udGV4dChjb250ZXh0TmFtZSwgY29udGV4dEF0dHJpYnV0ZXMpOwogICAgICAgIGlmIChfZ2wgPT09IG51bGwpIHsKICAgICAgICAgIGlmIChnZXRDb250ZXh0KGNvbnRleHROYW1lKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQuIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiICsgZXJyb3IubWVzc2FnZSk7CiAgICAgIHRocm93IGVycm9yOwogICAgfQogICAgbGV0IGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcywgc3RhdGUsIGluZm87CiAgICBsZXQgcHJvcGVydGllcywgdGV4dHVyZXMsIGN1YmVtYXBzLCBjdWJldXZtYXBzLCBhdHRyaWJ1dGVzLCBnZW9tZXRyaWVzLCBvYmplY3RzOwogICAgbGV0IHByb2dyYW1DYWNoZSwgbWF0ZXJpYWxzLCByZW5kZXJMaXN0cywgcmVuZGVyU3RhdGVzLCBjbGlwcGluZywgc2hhZG93TWFwOwogICAgbGV0IG11bHRpdmlldzsKICAgIGxldCBiYWNrZ3JvdW5kLCBtb3JwaHRhcmdldHMsIGJ1ZmZlclJlbmRlcmVyLCBpbmRleGVkQnVmZmVyUmVuZGVyZXI7CiAgICBsZXQgdXRpbHMsIGJpbmRpbmdTdGF0ZXMsIHVuaWZvcm1zR3JvdXBzOwogICAgZnVuY3Rpb24gaW5pdEdMQ29udGV4dCgpIHsKICAgICAgZXh0ZW5zaW9ucyA9IG5ldyBXZWJHTEV4dGVuc2lvbnMoX2dsKTsKICAgICAgZXh0ZW5zaW9ucy5pbml0KCk7CiAgICAgIHV0aWxzID0gbmV3IFdlYkdMVXRpbHMoX2dsLCBleHRlbnNpb25zKTsKICAgICAgY2FwYWJpbGl0aWVzID0gbmV3IFdlYkdMQ2FwYWJpbGl0aWVzKF9nbCwgZXh0ZW5zaW9ucywgcGFyYW1ldGVycywgdXRpbHMpOwogICAgICBzdGF0ZSA9IG5ldyBXZWJHTFN0YXRlKF9nbCwgZXh0ZW5zaW9ucyk7CiAgICAgIGlmIChjYXBhYmlsaXRpZXMucmV2ZXJzZURlcHRoQnVmZmVyICYmIHJldmVyc2VEZXB0aEJ1ZmZlcikgewogICAgICAgIHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0UmV2ZXJzZWQodHJ1ZSk7CiAgICAgIH0KICAgICAgaW5mbyA9IG5ldyBXZWJHTEluZm8oX2dsKTsKICAgICAgcHJvcGVydGllcyA9IG5ldyBXZWJHTFByb3BlcnRpZXM7CiAgICAgIHRleHR1cmVzID0gbmV3IFdlYkdMVGV4dHVyZXMoX2dsLCBleHRlbnNpb25zLCBzdGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCB1dGlscywgaW5mbyk7CiAgICAgIGN1YmVtYXBzID0gbmV3IFdlYkdMQ3ViZU1hcHMoX3RoaXMpOwogICAgICBjdWJldXZtYXBzID0gbmV3IFdlYkdMQ3ViZVVWTWFwcyhfdGhpcyk7CiAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgV2ViR0xBdHRyaWJ1dGVzKF9nbCk7CiAgICAgIGJpbmRpbmdTdGF0ZXMgPSBuZXcgV2ViR0xCaW5kaW5nU3RhdGVzKF9nbCwgYXR0cmlidXRlcyk7CiAgICAgIGdlb21ldHJpZXMgPSBuZXcgV2ViR0xHZW9tZXRyaWVzKF9nbCwgYXR0cmlidXRlcywgaW5mbywgYmluZGluZ1N0YXRlcyk7CiAgICAgIG9iamVjdHMgPSBuZXcgV2ViR0xPYmplY3RzKF9nbCwgZ2VvbWV0cmllcywgYXR0cmlidXRlcywgaW5mbyk7CiAgICAgIG1vcnBodGFyZ2V0cyA9IG5ldyBXZWJHTE1vcnBodGFyZ2V0cyhfZ2wsIGNhcGFiaWxpdGllcywgdGV4dHVyZXMpOwogICAgICBjbGlwcGluZyA9IG5ldyBXZWJHTENsaXBwaW5nKHByb3BlcnRpZXMpOwogICAgICBwcm9ncmFtQ2FjaGUgPSBuZXcgV2ViR0xQcm9ncmFtcyhfdGhpcywgY3ViZW1hcHMsIGN1YmV1dm1hcHMsIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcywgYmluZGluZ1N0YXRlcywgY2xpcHBpbmcpOwogICAgICBtYXRlcmlhbHMgPSBuZXcgV2ViR0xNYXRlcmlhbHMoX3RoaXMsIHByb3BlcnRpZXMpOwogICAgICByZW5kZXJMaXN0cyA9IG5ldyBXZWJHTFJlbmRlckxpc3RzOwogICAgICByZW5kZXJTdGF0ZXMgPSBuZXcgV2ViR0xSZW5kZXJTdGF0ZXMoZXh0ZW5zaW9ucyk7CiAgICAgIGJhY2tncm91bmQgPSBuZXcgV2ViR0xCYWNrZ3JvdW5kKF90aGlzLCBjdWJlbWFwcywgY3ViZXV2bWFwcywgc3RhdGUsIG9iamVjdHMsIF9hbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhKTsKICAgICAgbXVsdGl2aWV3ID0gbmV3IFdlYkdMTXVsdGl2aWV3KF90aGlzLCBleHRlbnNpb25zLCBfZ2wpOwogICAgICBzaGFkb3dNYXAgPSBuZXcgV2ViR0xTaGFkb3dNYXAoX3RoaXMsIG9iamVjdHMsIGNhcGFiaWxpdGllcyk7CiAgICAgIHVuaWZvcm1zR3JvdXBzID0gbmV3IFdlYkdMVW5pZm9ybXNHcm91cHMoX2dsLCBpbmZvLCBjYXBhYmlsaXRpZXMsIHN0YXRlKTsKICAgICAgYnVmZmVyUmVuZGVyZXIgPSBuZXcgV2ViR0xCdWZmZXJSZW5kZXJlcihfZ2wsIGV4dGVuc2lvbnMsIGluZm8pOwogICAgICBpbmRleGVkQnVmZmVyUmVuZGVyZXIgPSBuZXcgV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIoX2dsLCBleHRlbnNpb25zLCBpbmZvKTsKICAgICAgaW5mby5wcm9ncmFtcyA9IHByb2dyYW1DYWNoZS5wcm9ncmFtczsKICAgICAgX3RoaXMuY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzOwogICAgICBfdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKICAgICAgX3RoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CiAgICAgIF90aGlzLnJlbmRlckxpc3RzID0gcmVuZGVyTGlzdHM7CiAgICAgIF90aGlzLnNoYWRvd01hcCA9IHNoYWRvd01hcDsKICAgICAgX3RoaXMuc3RhdGUgPSBzdGF0ZTsKICAgICAgX3RoaXMuaW5mbyA9IGluZm87CiAgICB9CiAgICBpbml0R0xDb250ZXh0KCk7CiAgICBjb25zdCB4ciA9IG5ldyBXZWJYUk1hbmFnZXIoX3RoaXMsIF9nbCk7CiAgICB0aGlzLnhyID0geHI7CiAgICB0aGlzLmdldENvbnRleHQgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIF9nbDsKICAgIH07CiAgICB0aGlzLmdldENvbnRleHRBdHRyaWJ1dGVzID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBfZ2wuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKTsKICAgIH07CiAgICB0aGlzLmZvcmNlQ29udGV4dExvc3MgPSBmdW5jdGlvbigpIHsKICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2xvc2VfY29udGV4dCIpOwogICAgICBpZiAoZXh0ZW5zaW9uKQogICAgICAgIGV4dGVuc2lvbi5sb3NlQ29udGV4dCgpOwogICAgfTsKICAgIHRoaXMuZm9yY2VDb250ZXh0UmVzdG9yZSA9IGZ1bmN0aW9uKCkgewogICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7CiAgICAgIGlmIChleHRlbnNpb24pCiAgICAgICAgZXh0ZW5zaW9uLnJlc3RvcmVDb250ZXh0KCk7CiAgICB9OwogICAgdGhpcy5nZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBfcGl4ZWxSYXRpbzsKICAgIH07CiAgICB0aGlzLnNldFBpeGVsUmF0aW8gPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm47CiAgICAgIF9waXhlbFJhdGlvID0gdmFsdWU7CiAgICAgIHRoaXMuc2V0U2l6ZShfd2lkdGgsIF9oZWlnaHQsIGZhbHNlKTsKICAgIH07CiAgICB0aGlzLmdldFNpemUgPSBmdW5jdGlvbih0YXJnZXQpIHsKICAgICAgcmV0dXJuIHRhcmdldC5zZXQoX3dpZHRoLCBfaGVpZ2h0KTsKICAgIH07CiAgICB0aGlzLnNldFNpemUgPSBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0LCB1cGRhdGVTdHlsZSA9IHRydWUpIHsKICAgICAgaWYgKHhyLmlzUHJlc2VudGluZykgewogICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ2FuJ3QgY2hhbmdlIHNpemUgd2hpbGUgVlIgZGV2aWNlIGlzIHByZXNlbnRpbmcuIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF93aWR0aCA9IHdpZHRoOwogICAgICBfaGVpZ2h0ID0gaGVpZ2h0OwogICAgICBjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKHdpZHRoICogX3BpeGVsUmF0aW8pOwogICAgICBjYW52YXMuaGVpZ2h0ID0gTWF0aC5mbG9vcihoZWlnaHQgKiBfcGl4ZWxSYXRpbyk7CiAgICAgIGlmICh1cGRhdGVTdHlsZSA9PT0gdHJ1ZSkgewogICAgICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgInB4IjsKICAgICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgInB4IjsKICAgICAgfQogICAgICB0aGlzLnNldFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogICAgfTsKICAgIHRoaXMuZ2V0RHJhd2luZ0J1ZmZlclNpemUgPSBmdW5jdGlvbih0YXJnZXQpIHsKICAgICAgcmV0dXJuIHRhcmdldC5zZXQoX3dpZHRoICogX3BpeGVsUmF0aW8sIF9oZWlnaHQgKiBfcGl4ZWxSYXRpbykuZmxvb3IoKTsKICAgIH07CiAgICB0aGlzLnNldERyYXdpbmdCdWZmZXJTaXplID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCwgcGl4ZWxSYXRpbykgewogICAgICBfd2lkdGggPSB3aWR0aDsKICAgICAgX2hlaWdodCA9IGhlaWdodDsKICAgICAgX3BpeGVsUmF0aW8gPSBwaXhlbFJhdGlvOwogICAgICBjYW52YXMud2lkdGggPSBNYXRoLmZsb29yKHdpZHRoICogcGl4ZWxSYXRpbyk7CiAgICAgIGNhbnZhcy5oZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCAqIHBpeGVsUmF0aW8pOwogICAgICB0aGlzLnNldFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogICAgfTsKICAgIHRoaXMuZ2V0Q3VycmVudFZpZXdwb3J0ID0gZnVuY3Rpb24odGFyZ2V0KSB7CiAgICAgIHJldHVybiB0YXJnZXQuY29weShfY3VycmVudFZpZXdwb3J0KTsKICAgIH07CiAgICB0aGlzLmdldFZpZXdwb3J0ID0gZnVuY3Rpb24odGFyZ2V0KSB7CiAgICAgIHJldHVybiB0YXJnZXQuY29weShfdmlld3BvcnQpOwogICAgfTsKICAgIHRoaXMuc2V0Vmlld3BvcnQgPSBmdW5jdGlvbih4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgIGlmICh4LmlzVmVjdG9yNCkgewogICAgICAgIF92aWV3cG9ydC5zZXQoeC54LCB4LnksIHgueiwgeC53KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfdmlld3BvcnQuc2V0KHgsIHksIHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICAgIHN0YXRlLnZpZXdwb3J0KF9jdXJyZW50Vmlld3BvcnQuY29weShfdmlld3BvcnQpLm11bHRpcGx5U2NhbGFyKF9waXhlbFJhdGlvKS5yb3VuZCgpKTsKICAgIH07CiAgICB0aGlzLmdldFNjaXNzb3IgPSBmdW5jdGlvbih0YXJnZXQpIHsKICAgICAgcmV0dXJuIHRhcmdldC5jb3B5KF9zY2lzc29yKTsKICAgIH07CiAgICB0aGlzLnNldFNjaXNzb3IgPSBmdW5jdGlvbih4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgIGlmICh4LmlzVmVjdG9yNCkgewogICAgICAgIF9zY2lzc29yLnNldCh4LngsIHgueSwgeC56LCB4LncpOwogICAgICB9IGVsc2UgewogICAgICAgIF9zY2lzc29yLnNldCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfQogICAgICBzdGF0ZS5zY2lzc29yKF9jdXJyZW50U2Npc3Nvci5jb3B5KF9zY2lzc29yKS5tdWx0aXBseVNjYWxhcihfcGl4ZWxSYXRpbykucm91bmQoKSk7CiAgICB9OwogICAgdGhpcy5nZXRTY2lzc29yVGVzdCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gX3NjaXNzb3JUZXN0OwogICAgfTsKICAgIHRoaXMuc2V0U2Npc3NvclRlc3QgPSBmdW5jdGlvbihib29sZWFuKSB7CiAgICAgIHN0YXRlLnNldFNjaXNzb3JUZXN0KF9zY2lzc29yVGVzdCA9IGJvb2xlYW4pOwogICAgfTsKICAgIHRoaXMuc2V0T3BhcXVlU29ydCA9IGZ1bmN0aW9uKG1ldGhvZCkgewogICAgICBfb3BhcXVlU29ydCA9IG1ldGhvZDsKICAgIH07CiAgICB0aGlzLnNldFRyYW5zcGFyZW50U29ydCA9IGZ1bmN0aW9uKG1ldGhvZCkgewogICAgICBfdHJhbnNwYXJlbnRTb3J0ID0gbWV0aG9kOwogICAgfTsKICAgIHRoaXMuZ2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uKHRhcmdldCkgewogICAgICByZXR1cm4gdGFyZ2V0LmNvcHkoYmFja2dyb3VuZC5nZXRDbGVhckNvbG9yKCkpOwogICAgfTsKICAgIHRoaXMuc2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uKCkgewogICAgICBiYWNrZ3JvdW5kLnNldENsZWFyQ29sb3IuYXBwbHkoYmFja2dyb3VuZCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0aGlzLmdldENsZWFyQWxwaGEgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGJhY2tncm91bmQuZ2V0Q2xlYXJBbHBoYSgpOwogICAgfTsKICAgIHRoaXMuc2V0Q2xlYXJBbHBoYSA9IGZ1bmN0aW9uKCkgewogICAgICBiYWNrZ3JvdW5kLnNldENsZWFyQWxwaGEuYXBwbHkoYmFja2dyb3VuZCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0aGlzLmNsZWFyID0gZnVuY3Rpb24oY29sb3IgPSB0cnVlLCBkZXB0aDIgPSB0cnVlLCBzdGVuY2lsMiA9IHRydWUpIHsKICAgICAgbGV0IGJpdHMgPSAwOwogICAgICBpZiAoY29sb3IpIHsKICAgICAgICBsZXQgaXNJbnRlZ2VyRm9ybWF0ID0gZmFsc2U7CiAgICAgICAgaWYgKF9jdXJyZW50UmVuZGVyVGFyZ2V0ICE9PSBudWxsKSB7CiAgICAgICAgICBjb25zdCB0YXJnZXRGb3JtYXQgPSBfY3VycmVudFJlbmRlclRhcmdldC50ZXh0dXJlLmZvcm1hdDsKICAgICAgICAgIGlzSW50ZWdlckZvcm1hdCA9IHRhcmdldEZvcm1hdCA9PT0gUkdCQUludGVnZXJGb3JtYXQgfHwgdGFyZ2V0Rm9ybWF0ID09PSBSR0ludGVnZXJGb3JtYXQgfHwgdGFyZ2V0Rm9ybWF0ID09PSBSZWRJbnRlZ2VyRm9ybWF0OwogICAgICAgIH0KICAgICAgICBpZiAoaXNJbnRlZ2VyRm9ybWF0KSB7CiAgICAgICAgICBjb25zdCB0YXJnZXRUeXBlID0gX2N1cnJlbnRSZW5kZXJUYXJnZXQudGV4dHVyZS50eXBlOwogICAgICAgICAgY29uc3QgaXNVbnNpZ25lZFR5cGUgPSB0YXJnZXRUeXBlID09PSBVbnNpZ25lZEJ5dGVUeXBlIHx8IHRhcmdldFR5cGUgPT09IFVuc2lnbmVkSW50VHlwZSB8fCB0YXJnZXRUeXBlID09PSBVbnNpZ25lZFNob3J0VHlwZSB8fCB0YXJnZXRUeXBlID09PSBVbnNpZ25lZEludDI0OFR5cGUgfHwgdGFyZ2V0VHlwZSA9PT0gVW5zaWduZWRTaG9ydDQ0NDRUeXBlIHx8IHRhcmdldFR5cGUgPT09IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZTsKICAgICAgICAgIGNvbnN0IGNsZWFyQ29sb3IgPSBiYWNrZ3JvdW5kLmdldENsZWFyQ29sb3IoKTsKICAgICAgICAgIGNvbnN0IGEgPSBiYWNrZ3JvdW5kLmdldENsZWFyQWxwaGEoKTsKICAgICAgICAgIGNvbnN0IHIgPSBjbGVhckNvbG9yLnI7CiAgICAgICAgICBjb25zdCBnID0gY2xlYXJDb2xvci5nOwogICAgICAgICAgY29uc3QgYiA9IGNsZWFyQ29sb3IuYjsKICAgICAgICAgIGlmIChpc1Vuc2lnbmVkVHlwZSkgewogICAgICAgICAgICB1aW50Q2xlYXJDb2xvclswXSA9IHI7CiAgICAgICAgICAgIHVpbnRDbGVhckNvbG9yWzFdID0gZzsKICAgICAgICAgICAgdWludENsZWFyQ29sb3JbMl0gPSBiOwogICAgICAgICAgICB1aW50Q2xlYXJDb2xvclszXSA9IGE7CiAgICAgICAgICAgIF9nbC5jbGVhckJ1ZmZlcnVpdihfZ2wuQ09MT1IsIDAsIHVpbnRDbGVhckNvbG9yKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGludENsZWFyQ29sb3JbMF0gPSByOwogICAgICAgICAgICBpbnRDbGVhckNvbG9yWzFdID0gZzsKICAgICAgICAgICAgaW50Q2xlYXJDb2xvclsyXSA9IGI7CiAgICAgICAgICAgIGludENsZWFyQ29sb3JbM10gPSBhOwogICAgICAgICAgICBfZ2wuY2xlYXJCdWZmZXJpdihfZ2wuQ09MT1IsIDAsIGludENsZWFyQ29sb3IpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBiaXRzIHw9IF9nbC5DT0xPUl9CVUZGRVJfQklUOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGVwdGgyKSB7CiAgICAgICAgYml0cyB8PSBfZ2wuREVQVEhfQlVGRkVSX0JJVDsKICAgICAgfQogICAgICBpZiAoc3RlbmNpbDIpIHsKICAgICAgICBiaXRzIHw9IF9nbC5TVEVOQ0lMX0JVRkZFUl9CSVQ7CiAgICAgICAgdGhpcy5zdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0TWFzayg0Mjk0OTY3Mjk1KTsKICAgICAgfQogICAgICBfZ2wuY2xlYXIoYml0cyk7CiAgICB9OwogICAgdGhpcy5jbGVhckNvbG9yID0gZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuY2xlYXIodHJ1ZSwgZmFsc2UsIGZhbHNlKTsKICAgIH07CiAgICB0aGlzLmNsZWFyRGVwdGggPSBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5jbGVhcihmYWxzZSwgdHJ1ZSwgZmFsc2UpOwogICAgfTsKICAgIHRoaXMuY2xlYXJTdGVuY2lsID0gZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuY2xlYXIoZmFsc2UsIGZhbHNlLCB0cnVlKTsKICAgIH07CiAgICB0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHsKICAgICAgY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLCBvbkNvbnRleHRMb3N0LCBmYWxzZSk7CiAgICAgIGNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsIG9uQ29udGV4dFJlc3RvcmUsIGZhbHNlKTsKICAgICAgY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGNyZWF0aW9uZXJyb3IiLCBvbkNvbnRleHRDcmVhdGlvbkVycm9yLCBmYWxzZSk7CiAgICAgIGJhY2tncm91bmQuZGlzcG9zZSgpOwogICAgICByZW5kZXJMaXN0cy5kaXNwb3NlKCk7CiAgICAgIHJlbmRlclN0YXRlcy5kaXNwb3NlKCk7CiAgICAgIHByb3BlcnRpZXMuZGlzcG9zZSgpOwogICAgICBjdWJlbWFwcy5kaXNwb3NlKCk7CiAgICAgIGN1YmV1dm1hcHMuZGlzcG9zZSgpOwogICAgICBvYmplY3RzLmRpc3Bvc2UoKTsKICAgICAgYmluZGluZ1N0YXRlcy5kaXNwb3NlKCk7CiAgICAgIHVuaWZvcm1zR3JvdXBzLmRpc3Bvc2UoKTsKICAgICAgcHJvZ3JhbUNhY2hlLmRpc3Bvc2UoKTsKICAgICAgeHIuZGlzcG9zZSgpOwogICAgICB4ci5yZW1vdmVFdmVudExpc3RlbmVyKCJzZXNzaW9uc3RhcnQiLCBvblhSU2Vzc2lvblN0YXJ0KTsKICAgICAgeHIucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Vzc2lvbmVuZCIsIG9uWFJTZXNzaW9uRW5kKTsKICAgICAgYW5pbWF0aW9uLnN0b3AoKTsKICAgIH07CiAgICBmdW5jdGlvbiBvbkNvbnRleHRMb3N0KGV2ZW50KSB7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGNvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IExvc3QuIik7CiAgICAgIF9pc0NvbnRleHRMb3N0ID0gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIG9uQ29udGV4dFJlc3RvcmUoKSB7CiAgICAgIGNvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IFJlc3RvcmVkLiIpOwogICAgICBfaXNDb250ZXh0TG9zdCA9IGZhbHNlOwogICAgICBjb25zdCBpbmZvQXV0b1Jlc2V0ID0gaW5mby5hdXRvUmVzZXQ7CiAgICAgIGNvbnN0IHNoYWRvd01hcEVuYWJsZWQgPSBzaGFkb3dNYXAuZW5hYmxlZDsKICAgICAgY29uc3Qgc2hhZG93TWFwQXV0b1VwZGF0ZSA9IHNoYWRvd01hcC5hdXRvVXBkYXRlOwogICAgICBjb25zdCBzaGFkb3dNYXBOZWVkc1VwZGF0ZSA9IHNoYWRvd01hcC5uZWVkc1VwZGF0ZTsKICAgICAgY29uc3Qgc2hhZG93TWFwVHlwZSA9IHNoYWRvd01hcC50eXBlOwogICAgICBpbml0R0xDb250ZXh0KCk7CiAgICAgIGluZm8uYXV0b1Jlc2V0ID0gaW5mb0F1dG9SZXNldDsKICAgICAgc2hhZG93TWFwLmVuYWJsZWQgPSBzaGFkb3dNYXBFbmFibGVkOwogICAgICBzaGFkb3dNYXAuYXV0b1VwZGF0ZSA9IHNoYWRvd01hcEF1dG9VcGRhdGU7CiAgICAgIHNoYWRvd01hcC5uZWVkc1VwZGF0ZSA9IHNoYWRvd01hcE5lZWRzVXBkYXRlOwogICAgICBzaGFkb3dNYXAudHlwZSA9IHNoYWRvd01hcFR5cGU7CiAgICB9CiAgICBmdW5jdGlvbiBvbkNvbnRleHRDcmVhdGlvbkVycm9yKGV2ZW50KSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6IEEgV2ViR0wgY29udGV4dCBjb3VsZCBub3QgYmUgY3JlYXRlZC4gUmVhc29uOiAiLCBldmVudC5zdGF0dXNNZXNzYWdlKTsKICAgIH0KICAgIGZ1bmN0aW9uIG9uTWF0ZXJpYWxEaXNwb3NlKGV2ZW50KSB7CiAgICAgIGNvbnN0IG1hdGVyaWFsID0gZXZlbnQudGFyZ2V0OwogICAgICBtYXRlcmlhbC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIiwgb25NYXRlcmlhbERpc3Bvc2UpOwogICAgICBkZWFsbG9jYXRlTWF0ZXJpYWwobWF0ZXJpYWwpOwogICAgfQogICAgZnVuY3Rpb24gZGVhbGxvY2F0ZU1hdGVyaWFsKG1hdGVyaWFsKSB7CiAgICAgIHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2VzKG1hdGVyaWFsKTsKICAgICAgcHJvcGVydGllcy5yZW1vdmUobWF0ZXJpYWwpOwogICAgfQogICAgZnVuY3Rpb24gcmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZXMobWF0ZXJpYWwpIHsKICAgICAgY29uc3QgcHJvZ3JhbXMgPSBwcm9wZXJ0aWVzLmdldChtYXRlcmlhbCkucHJvZ3JhbXM7CiAgICAgIGlmIChwcm9ncmFtcyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcHJvZ3JhbXMuZm9yRWFjaChmdW5jdGlvbihwcm9ncmFtKSB7CiAgICAgICAgICBwcm9ncmFtQ2FjaGUucmVsZWFzZVByb2dyYW0ocHJvZ3JhbSk7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwpIHsKICAgICAgICAgIHByb2dyYW1DYWNoZS5yZWxlYXNlU2hhZGVyQ2FjaGUobWF0ZXJpYWwpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QgPSBmdW5jdGlvbihjYW1lcmEsIHNjZW5lLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXApIHsKICAgICAgaWYgKHNjZW5lID09PSBudWxsKQogICAgICAgIHNjZW5lID0gX2VtcHR5U2NlbmU7CiAgICAgIGNvbnN0IGZyb250RmFjZUNXID0gb2JqZWN0LmlzTWVzaCAmJiBvYmplY3QubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKSA8IDA7CiAgICAgIGNvbnN0IHByb2dyYW0gPSBzZXRQcm9ncmFtKGNhbWVyYSwgc2NlbmUsIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0KTsKICAgICAgc3RhdGUuc2V0TWF0ZXJpYWwobWF0ZXJpYWwsIGZyb250RmFjZUNXKTsKICAgICAgbGV0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7CiAgICAgIGxldCByYW5nZUZhY3RvciA9IDE7CiAgICAgIGlmIChtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUpIHsKICAgICAgICBpbmRleCA9IGdlb21ldHJpZXMuZ2V0V2lyZWZyYW1lQXR0cmlidXRlKGdlb21ldHJ5KTsKICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkKICAgICAgICAgIHJldHVybjsKICAgICAgICByYW5nZUZhY3RvciA9IDI7CiAgICAgIH0KICAgICAgY29uc3QgZHJhd1JhbmdlID0gZ2VvbWV0cnkuZHJhd1JhbmdlOwogICAgICBjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247CiAgICAgIGxldCBkcmF3U3RhcnQgPSBkcmF3UmFuZ2Uuc3RhcnQgKiByYW5nZUZhY3RvcjsKICAgICAgbGV0IGRyYXdFbmQgPSAoZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50KSAqIHJhbmdlRmFjdG9yOwogICAgICBpZiAoZ3JvdXAgIT09IG51bGwpIHsKICAgICAgICBkcmF3U3RhcnQgPSBNYXRoLm1heChkcmF3U3RhcnQsIGdyb3VwLnN0YXJ0ICogcmFuZ2VGYWN0b3IpOwogICAgICAgIGRyYXdFbmQgPSBNYXRoLm1pbihkcmF3RW5kLCAoZ3JvdXAuc3RhcnQgKyBncm91cC5jb3VudCkgKiByYW5nZUZhY3Rvcik7CiAgICAgIH0KICAgICAgaWYgKGluZGV4ICE9PSBudWxsKSB7CiAgICAgICAgZHJhd1N0YXJ0ID0gTWF0aC5tYXgoZHJhd1N0YXJ0LCAwKTsKICAgICAgICBkcmF3RW5kID0gTWF0aC5taW4oZHJhd0VuZCwgaW5kZXguY291bnQpOwogICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uICE9PSB1bmRlZmluZWQgJiYgcG9zaXRpb24gIT09IG51bGwpIHsKICAgICAgICBkcmF3U3RhcnQgPSBNYXRoLm1heChkcmF3U3RhcnQsIDApOwogICAgICAgIGRyYXdFbmQgPSBNYXRoLm1pbihkcmF3RW5kLCBwb3NpdGlvbi5jb3VudCk7CiAgICAgIH0KICAgICAgY29uc3QgZHJhd0NvdW50ID0gZHJhd0VuZCAtIGRyYXdTdGFydDsKICAgICAgaWYgKGRyYXdDb3VudCA8IDAgfHwgZHJhd0NvdW50ID09PSBJbmZpbml0eSkKICAgICAgICByZXR1cm47CiAgICAgIGJpbmRpbmdTdGF0ZXMuc2V0dXAob2JqZWN0LCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnksIGluZGV4KTsKICAgICAgbGV0IGF0dHJpYnV0ZTsKICAgICAgbGV0IHJlbmRlcmVyID0gYnVmZmVyUmVuZGVyZXI7CiAgICAgIGlmIChpbmRleCAhPT0gbnVsbCkgewogICAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KGluZGV4KTsKICAgICAgICByZW5kZXJlciA9IGluZGV4ZWRCdWZmZXJSZW5kZXJlcjsKICAgICAgICByZW5kZXJlci5zZXRJbmRleChhdHRyaWJ1dGUpOwogICAgICB9CiAgICAgIGlmIChvYmplY3QuaXNNZXNoKSB7CiAgICAgICAgaWYgKG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSkgewogICAgICAgICAgc3RhdGUuc2V0TGluZVdpZHRoKG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aCAqIGdldFRhcmdldFBpeGVsUmF0aW8oKSk7CiAgICAgICAgICByZW5kZXJlci5zZXRNb2RlKF9nbC5MSU5FUyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlbmRlcmVyLnNldE1vZGUoX2dsLlRSSUFOR0xFUyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG9iamVjdC5pc0xpbmUpIHsKICAgICAgICBsZXQgbGluZVdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoOwogICAgICAgIGlmIChsaW5lV2lkdGggPT09IHVuZGVmaW5lZCkKICAgICAgICAgIGxpbmVXaWR0aCA9IDE7CiAgICAgICAgc3RhdGUuc2V0TGluZVdpZHRoKGxpbmVXaWR0aCAqIGdldFRhcmdldFBpeGVsUmF0aW8oKSk7CiAgICAgICAgaWYgKG9iamVjdC5pc0xpbmVTZWdtZW50cykgewogICAgICAgICAgcmVuZGVyZXIuc2V0TW9kZShfZ2wuTElORVMpOwogICAgICAgIH0gZWxzZSBpZiAob2JqZWN0LmlzTGluZUxvb3ApIHsKICAgICAgICAgIHJlbmRlcmVyLnNldE1vZGUoX2dsLkxJTkVfTE9PUCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlbmRlcmVyLnNldE1vZGUoX2dsLkxJTkVfU1RSSVApOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChvYmplY3QuaXNQb2ludHMpIHsKICAgICAgICByZW5kZXJlci5zZXRNb2RlKF9nbC5QT0lOVFMpOwogICAgICB9IGVsc2UgaWYgKG9iamVjdC5pc1Nwcml0ZSkgewogICAgICAgIHJlbmRlcmVyLnNldE1vZGUoX2dsLlRSSUFOR0xFUyk7CiAgICAgIH0KICAgICAgaWYgKG9iamVjdC5pc0JhdGNoZWRNZXNoKSB7CiAgICAgICAgaWYgKG9iamVjdC5fbXVsdGlEcmF3SW5zdGFuY2VzICE9PSBudWxsKSB7CiAgICAgICAgICByZW5kZXJlci5yZW5kZXJNdWx0aURyYXdJbnN0YW5jZXMob2JqZWN0Ll9tdWx0aURyYXdTdGFydHMsIG9iamVjdC5fbXVsdGlEcmF3Q291bnRzLCBvYmplY3QuX211bHRpRHJhd0NvdW50LCBvYmplY3QuX211bHRpRHJhd0luc3RhbmNlcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghZXh0ZW5zaW9ucy5nZXQoIldFQkdMX211bHRpX2RyYXciKSkgewogICAgICAgICAgICBjb25zdCBzdGFydHMgPSBvYmplY3QuX211bHRpRHJhd1N0YXJ0czsKICAgICAgICAgICAgY29uc3QgY291bnRzID0gb2JqZWN0Ll9tdWx0aURyYXdDb3VudHM7CiAgICAgICAgICAgIGNvbnN0IGRyYXdDb3VudDIgPSBvYmplY3QuX211bHRpRHJhd0NvdW50OwogICAgICAgICAgICBjb25zdCBieXRlc1BlckVsZW1lbnQgPSBpbmRleCA/IGF0dHJpYnV0ZXMuZ2V0KGluZGV4KS5ieXRlc1BlckVsZW1lbnQgOiAxOwogICAgICAgICAgICBjb25zdCB1bmlmb3JtcyA9IHByb3BlcnRpZXMuZ2V0KG1hdGVyaWFsKS5jdXJyZW50UHJvZ3JhbS5nZXRVbmlmb3JtcygpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgZHJhd0NvdW50MjsgaSsrKSB7CiAgICAgICAgICAgICAgdW5pZm9ybXMuc2V0VmFsdWUoX2dsLCAiX2dsX0RyYXdJRCIsIGkpOwogICAgICAgICAgICAgIHJlbmRlcmVyLnJlbmRlcihzdGFydHNbaV0gLyBieXRlc1BlckVsZW1lbnQsIGNvdW50c1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlbmRlcmVyLnJlbmRlck11bHRpRHJhdyhvYmplY3QuX211bHRpRHJhd1N0YXJ0cywgb2JqZWN0Ll9tdWx0aURyYXdDb3VudHMsIG9iamVjdC5fbXVsdGlEcmF3Q291bnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChvYmplY3QuaXNJbnN0YW5jZWRNZXNoKSB7CiAgICAgICAgcmVuZGVyZXIucmVuZGVySW5zdGFuY2VzKGRyYXdTdGFydCwgZHJhd0NvdW50LCBvYmplY3QuY291bnQpOwogICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkpIHsKICAgICAgICBjb25zdCBtYXhJbnN0YW5jZUNvdW50ID0gZ2VvbWV0cnkuX21heEluc3RhbmNlQ291bnQgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50IDogSW5maW5pdHk7CiAgICAgICAgY29uc3QgaW5zdGFuY2VDb3VudCA9IE1hdGgubWluKGdlb21ldHJ5Lmluc3RhbmNlQ291bnQsIG1heEluc3RhbmNlQ291bnQpOwogICAgICAgIHJlbmRlcmVyLnJlbmRlckluc3RhbmNlcyhkcmF3U3RhcnQsIGRyYXdDb3VudCwgaW5zdGFuY2VDb3VudCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVuZGVyZXIucmVuZGVyKGRyYXdTdGFydCwgZHJhd0NvdW50KTsKICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIHByZXBhcmVNYXRlcmlhbChtYXRlcmlhbCwgc2NlbmUsIG9iamVjdCkgewogICAgICBpZiAobWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWUgJiYgbWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZSAmJiBtYXRlcmlhbC5mb3JjZVNpbmdsZVBhc3MgPT09IGZhbHNlKSB7CiAgICAgICAgbWF0ZXJpYWwuc2lkZSA9IEJhY2tTaWRlOwogICAgICAgIG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgICBnZXRQcm9ncmFtKG1hdGVyaWFsLCBzY2VuZSwgb2JqZWN0KTsKICAgICAgICBtYXRlcmlhbC5zaWRlID0gRnJvbnRTaWRlOwogICAgICAgIG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgICBnZXRQcm9ncmFtKG1hdGVyaWFsLCBzY2VuZSwgb2JqZWN0KTsKICAgICAgICBtYXRlcmlhbC5zaWRlID0gRG91YmxlU2lkZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnZXRQcm9ncmFtKG1hdGVyaWFsLCBzY2VuZSwgb2JqZWN0KTsKICAgICAgfQogICAgfQogICAgdGhpcy5jb21waWxlID0gZnVuY3Rpb24oc2NlbmUsIGNhbWVyYSwgdGFyZ2V0U2NlbmUgPSBudWxsKSB7CiAgICAgIGlmICh0YXJnZXRTY2VuZSA9PT0gbnVsbCkKICAgICAgICB0YXJnZXRTY2VuZSA9IHNjZW5lOwogICAgICBjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KHRhcmdldFNjZW5lKTsKICAgICAgY3VycmVudFJlbmRlclN0YXRlLmluaXQoY2FtZXJhKTsKICAgICAgcmVuZGVyU3RhdGVTdGFjay5wdXNoKGN1cnJlbnRSZW5kZXJTdGF0ZSk7CiAgICAgIHRhcmdldFNjZW5lLnRyYXZlcnNlVmlzaWJsZShmdW5jdGlvbihvYmplY3QpIHsKICAgICAgICBpZiAob2JqZWN0LmlzTGlnaHQgJiYgb2JqZWN0LmxheWVycy50ZXN0KGNhbWVyYS5sYXllcnMpKSB7CiAgICAgICAgICBjdXJyZW50UmVuZGVyU3RhdGUucHVzaExpZ2h0KG9iamVjdCk7CiAgICAgICAgICBpZiAob2JqZWN0LmNhc3RTaGFkb3cpIHsKICAgICAgICAgICAgY3VycmVudFJlbmRlclN0YXRlLnB1c2hTaGFkb3cob2JqZWN0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICBpZiAoc2NlbmUgIT09IHRhcmdldFNjZW5lKSB7CiAgICAgICAgc2NlbmUudHJhdmVyc2VWaXNpYmxlKGZ1bmN0aW9uKG9iamVjdCkgewogICAgICAgICAgaWYgKG9iamVjdC5pc0xpZ2h0ICYmIG9iamVjdC5sYXllcnMudGVzdChjYW1lcmEubGF5ZXJzKSkgewogICAgICAgICAgICBjdXJyZW50UmVuZGVyU3RhdGUucHVzaExpZ2h0KG9iamVjdCk7CiAgICAgICAgICAgIGlmIChvYmplY3QuY2FzdFNoYWRvdykgewogICAgICAgICAgICAgIGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoU2hhZG93KG9iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICBjdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHMoKTsKICAgICAgY29uc3QgbWF0ZXJpYWxzMiA9IG5ldyBTZXQ7CiAgICAgIHNjZW5lLnRyYXZlcnNlKGZ1bmN0aW9uKG9iamVjdCkgewogICAgICAgIGlmICghKG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzUG9pbnRzIHx8IG9iamVjdC5pc0xpbmUgfHwgb2JqZWN0LmlzU3ByaXRlKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDsKICAgICAgICBpZiAobWF0ZXJpYWwpIHsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1hdGVyaWFsKSkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgbWF0ZXJpYWwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBjb25zdCBtYXRlcmlhbDIgPSBtYXRlcmlhbFtpXTsKICAgICAgICAgICAgICBwcmVwYXJlTWF0ZXJpYWwobWF0ZXJpYWwyLCB0YXJnZXRTY2VuZSwgb2JqZWN0KTsKICAgICAgICAgICAgICBtYXRlcmlhbHMyLmFkZChtYXRlcmlhbDIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmVwYXJlTWF0ZXJpYWwobWF0ZXJpYWwsIHRhcmdldFNjZW5lLCBvYmplY3QpOwogICAgICAgICAgICBtYXRlcmlhbHMyLmFkZChtYXRlcmlhbCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmVuZGVyU3RhdGVTdGFjay5wb3AoKTsKICAgICAgY3VycmVudFJlbmRlclN0YXRlID0gbnVsbDsKICAgICAgcmV0dXJuIG1hdGVyaWFsczI7CiAgICB9OwogICAgdGhpcy5jb21waWxlQXN5bmMgPSBmdW5jdGlvbihzY2VuZSwgY2FtZXJhLCB0YXJnZXRTY2VuZSA9IG51bGwpIHsKICAgICAgY29uc3QgbWF0ZXJpYWxzMiA9IHRoaXMuY29tcGlsZShzY2VuZSwgY2FtZXJhLCB0YXJnZXRTY2VuZSk7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgICAgIGZ1bmN0aW9uIGNoZWNrTWF0ZXJpYWxzUmVhZHkoKSB7CiAgICAgICAgICBtYXRlcmlhbHMyLmZvckVhY2goZnVuY3Rpb24obWF0ZXJpYWwpIHsKICAgICAgICAgICAgY29uc3QgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQobWF0ZXJpYWwpOwogICAgICAgICAgICBjb25zdCBwcm9ncmFtID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLmN1cnJlbnRQcm9ncmFtOwogICAgICAgICAgICBpZiAocHJvZ3JhbS5pc1JlYWR5KCkpIHsKICAgICAgICAgICAgICBtYXRlcmlhbHMyLmRlbGV0ZShtYXRlcmlhbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKG1hdGVyaWFsczIuc2l6ZSA9PT0gMCkgewogICAgICAgICAgICByZXNvbHZlKHNjZW5lKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgc2V0VGltZW91dChjaGVja01hdGVyaWFsc1JlYWR5LCAxMCk7CiAgICAgICAgfQogICAgICAgIGlmIChleHRlbnNpb25zLmdldCgiS0hSX3BhcmFsbGVsX3NoYWRlcl9jb21waWxlIikgIT09IG51bGwpIHsKICAgICAgICAgIGNoZWNrTWF0ZXJpYWxzUmVhZHkoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2V0VGltZW91dChjaGVja01hdGVyaWFsc1JlYWR5LCAxMCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH07CiAgICBsZXQgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrID0gbnVsbDsKICAgIGZ1bmN0aW9uIG9uQW5pbWF0aW9uRnJhbWUodGltZSkgewogICAgICBpZiAob25BbmltYXRpb25GcmFtZUNhbGxiYWNrKQogICAgICAgIG9uQW5pbWF0aW9uRnJhbWVDYWxsYmFjayh0aW1lKTsKICAgIH0KICAgIGZ1bmN0aW9uIG9uWFJTZXNzaW9uU3RhcnQoKSB7CiAgICAgIGFuaW1hdGlvbi5zdG9wKCk7CiAgICB9CiAgICBmdW5jdGlvbiBvblhSU2Vzc2lvbkVuZCgpIHsKICAgICAgYW5pbWF0aW9uLnN0YXJ0KCk7CiAgICB9CiAgICBjb25zdCBhbmltYXRpb24gPSBuZXcgV2ViR0xBbmltYXRpb247CiAgICBhbmltYXRpb24uc2V0QW5pbWF0aW9uTG9vcChvbkFuaW1hdGlvbkZyYW1lKTsKICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gInVuZGVmaW5lZCIpCiAgICAgIGFuaW1hdGlvbi5zZXRDb250ZXh0KHNlbGYpOwogICAgdGhpcy5zZXRBbmltYXRpb25Mb29wID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgIHhyLnNldEFuaW1hdGlvbkxvb3AoY2FsbGJhY2spOwogICAgICBjYWxsYmFjayA9PT0gbnVsbCA/IGFuaW1hdGlvbi5zdG9wKCkgOiBhbmltYXRpb24uc3RhcnQoKTsKICAgIH07CiAgICB4ci5hZGRFdmVudExpc3RlbmVyKCJzZXNzaW9uc3RhcnQiLCBvblhSU2Vzc2lvblN0YXJ0KTsKICAgIHhyLmFkZEV2ZW50TGlzdGVuZXIoInNlc3Npb25lbmQiLCBvblhSU2Vzc2lvbkVuZCk7CiAgICB0aGlzLnJlbmRlciA9IGZ1bmN0aW9uKHNjZW5lLCBjYW1lcmEpIHsKICAgICAgaWYgKGNhbWVyYSAhPT0gdW5kZWZpbmVkICYmIGNhbWVyYS5pc0NhbWVyYSAhPT0gdHJ1ZSkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyOiBjYW1lcmEgaXMgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkNhbWVyYS4iKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKF9pc0NvbnRleHRMb3N0ID09PSB0cnVlKQogICAgICAgIHJldHVybjsKICAgICAgaWYgKHNjZW5lLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSA9PT0gdHJ1ZSkKICAgICAgICBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCgpOwogICAgICBpZiAoY2FtZXJhLnBhcmVudCA9PT0gbnVsbCAmJiBjYW1lcmEubWF0cml4V29ybGRBdXRvVXBkYXRlID09PSB0cnVlKQogICAgICAgIGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpOwogICAgICBpZiAoeHIuZW5hYmxlZCA9PT0gdHJ1ZSAmJiB4ci5pc1ByZXNlbnRpbmcgPT09IHRydWUpIHsKICAgICAgICBpZiAoeHIuY2FtZXJhQXV0b1VwZGF0ZSA9PT0gdHJ1ZSkKICAgICAgICAgIHhyLnVwZGF0ZUNhbWVyYShjYW1lcmEpOwogICAgICAgIGNhbWVyYSA9IHhyLmdldENhbWVyYSgpOwogICAgICB9CiAgICAgIGlmIChzY2VuZS5pc1NjZW5lID09PSB0cnVlKQogICAgICAgIHNjZW5lLm9uQmVmb3JlUmVuZGVyKF90aGlzLCBzY2VuZSwgY2FtZXJhLCBfY3VycmVudFJlbmRlclRhcmdldCk7CiAgICAgIGN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlcy5nZXQoc2NlbmUsIHJlbmRlclN0YXRlU3RhY2subGVuZ3RoKTsKICAgICAgY3VycmVudFJlbmRlclN0YXRlLmluaXQoY2FtZXJhKTsKICAgICAgcmVuZGVyU3RhdGVTdGFjay5wdXNoKGN1cnJlbnRSZW5kZXJTdGF0ZSk7CiAgICAgIF9wcm9qU2NyZWVuTWF0cml4Mi5tdWx0aXBseU1hdHJpY2VzKGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTsKICAgICAgX2ZydXN0dW0yLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KF9wcm9qU2NyZWVuTWF0cml4Mik7CiAgICAgIF9sb2NhbENsaXBwaW5nRW5hYmxlZCA9IHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQ7CiAgICAgIF9jbGlwcGluZ0VuYWJsZWQgPSBjbGlwcGluZy5pbml0KHRoaXMuY2xpcHBpbmdQbGFuZXMsIF9sb2NhbENsaXBwaW5nRW5hYmxlZCk7CiAgICAgIGN1cnJlbnRSZW5kZXJMaXN0ID0gcmVuZGVyTGlzdHMuZ2V0KHNjZW5lLCByZW5kZXJMaXN0U3RhY2subGVuZ3RoKTsKICAgICAgY3VycmVudFJlbmRlckxpc3QuaW5pdCgpOwogICAgICByZW5kZXJMaXN0U3RhY2sucHVzaChjdXJyZW50UmVuZGVyTGlzdCk7CiAgICAgIGlmICh4ci5lbmFibGVkID09PSB0cnVlICYmIHhyLmlzUHJlc2VudGluZyA9PT0gdHJ1ZSkgewogICAgICAgIGNvbnN0IGRlcHRoU2Vuc2luZ01lc2ggPSBfdGhpcy54ci5nZXREZXB0aFNlbnNpbmdNZXNoKCk7CiAgICAgICAgaWYgKGRlcHRoU2Vuc2luZ01lc2ggIT09IG51bGwpIHsKICAgICAgICAgIHByb2plY3RPYmplY3QoZGVwdGhTZW5zaW5nTWVzaCwgY2FtZXJhLCAtSW5maW5pdHksIF90aGlzLnNvcnRPYmplY3RzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcHJvamVjdE9iamVjdChzY2VuZSwgY2FtZXJhLCAwLCBfdGhpcy5zb3J0T2JqZWN0cyk7CiAgICAgIGN1cnJlbnRSZW5kZXJMaXN0LmZpbmlzaCgpOwogICAgICBpZiAoX3RoaXMuc29ydE9iamVjdHMgPT09IHRydWUpIHsKICAgICAgICBjdXJyZW50UmVuZGVyTGlzdC5zb3J0KF9vcGFxdWVTb3J0LCBfdHJhbnNwYXJlbnRTb3J0KTsKICAgICAgfQogICAgICBfcmVuZGVyQmFja2dyb3VuZCA9IHhyLmVuYWJsZWQgPT09IGZhbHNlIHx8IHhyLmlzUHJlc2VudGluZyA9PT0gZmFsc2UgfHwgeHIuaGFzRGVwdGhTZW5zaW5nKCkgPT09IGZhbHNlOwogICAgICBpZiAoX3JlbmRlckJhY2tncm91bmQpIHsKICAgICAgICBiYWNrZ3JvdW5kLmFkZFRvUmVuZGVyTGlzdChjdXJyZW50UmVuZGVyTGlzdCwgc2NlbmUpOwogICAgICB9CiAgICAgIHRoaXMuaW5mby5yZW5kZXIuZnJhbWUrKzsKICAgICAgaWYgKF9jbGlwcGluZ0VuYWJsZWQgPT09IHRydWUpCiAgICAgICAgY2xpcHBpbmcuYmVnaW5TaGFkb3dzKCk7CiAgICAgIGNvbnN0IHNoYWRvd3NBcnJheSA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5zaGFkb3dzQXJyYXk7CiAgICAgIHNoYWRvd01hcC5yZW5kZXIoc2hhZG93c0FycmF5LCBzY2VuZSwgY2FtZXJhKTsKICAgICAgaWYgKF9jbGlwcGluZ0VuYWJsZWQgPT09IHRydWUpCiAgICAgICAgY2xpcHBpbmcuZW5kU2hhZG93cygpOwogICAgICBpZiAodGhpcy5pbmZvLmF1dG9SZXNldCA9PT0gdHJ1ZSkKICAgICAgICB0aGlzLmluZm8ucmVzZXQoKTsKICAgICAgY29uc3Qgb3BhcXVlT2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0Lm9wYXF1ZTsKICAgICAgY29uc3QgdHJhbnNtaXNzaXZlT2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0LnRyYW5zbWlzc2l2ZTsKICAgICAgY3VycmVudFJlbmRlclN0YXRlLnNldHVwTGlnaHRzKCk7CiAgICAgIGlmIChjYW1lcmEuaXNBcnJheUNhbWVyYSkgewogICAgICAgIGNvbnN0IGNhbWVyYXMgPSBjYW1lcmEuY2FtZXJhczsKICAgICAgICBpZiAodHJhbnNtaXNzaXZlT2JqZWN0cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGNhbWVyYXMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgY2FtZXJhMiA9IGNhbWVyYXNbaV07CiAgICAgICAgICAgIHJlbmRlclRyYW5zbWlzc2lvblBhc3Mob3BhcXVlT2JqZWN0cywgdHJhbnNtaXNzaXZlT2JqZWN0cywgc2NlbmUsIGNhbWVyYTIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoX3JlbmRlckJhY2tncm91bmQpCiAgICAgICAgICBiYWNrZ3JvdW5kLnJlbmRlcihzY2VuZSk7CiAgICAgICAgaWYgKHhyLmVuYWJsZWQgJiYgeHIuaXNNdWx0aXZpZXcpIHsKICAgICAgICAgIHRleHR1cmVzLnNldERlZmVyVGV4dHVyZVVwbG9hZHModHJ1ZSk7CiAgICAgICAgICByZW5kZXJTY2VuZShjdXJyZW50UmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYSwgY2FtZXJhLmNhbWVyYXNbMF0udmlld3BvcnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGNhbWVyYXMubGVuZ3RoO2kgPCBsOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgY2FtZXJhMiA9IGNhbWVyYXNbaV07CiAgICAgICAgICAgIHJlbmRlclNjZW5lKGN1cnJlbnRSZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhMiwgY2FtZXJhMi52aWV3cG9ydCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0cmFuc21pc3NpdmVPYmplY3RzLmxlbmd0aCA+IDApCiAgICAgICAgICByZW5kZXJUcmFuc21pc3Npb25QYXNzKG9wYXF1ZU9iamVjdHMsIHRyYW5zbWlzc2l2ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEpOwogICAgICAgIGlmIChfcmVuZGVyQmFja2dyb3VuZCkKICAgICAgICAgIGJhY2tncm91bmQucmVuZGVyKHNjZW5lKTsKICAgICAgICByZW5kZXJTY2VuZShjdXJyZW50UmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYSk7CiAgICAgIH0KICAgICAgaWYgKF9jdXJyZW50UmVuZGVyVGFyZ2V0ICE9PSBudWxsICYmIF9jdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWwgPT09IDApIHsKICAgICAgICB0ZXh0dXJlcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldChfY3VycmVudFJlbmRlclRhcmdldCk7CiAgICAgICAgdGV4dHVyZXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKF9jdXJyZW50UmVuZGVyVGFyZ2V0KTsKICAgICAgfQogICAgICBpZiAoc2NlbmUuaXNTY2VuZSA9PT0gdHJ1ZSkKICAgICAgICBzY2VuZS5vbkFmdGVyUmVuZGVyKF90aGlzLCBzY2VuZSwgY2FtZXJhKTsKICAgICAgYmluZGluZ1N0YXRlcy5yZXNldERlZmF1bHRTdGF0ZSgpOwogICAgICBfY3VycmVudE1hdGVyaWFsSWQgPSAtMTsKICAgICAgX2N1cnJlbnRDYW1lcmEgPSBudWxsOwogICAgICByZW5kZXJTdGF0ZVN0YWNrLnBvcCgpOwogICAgICBpZiAocmVuZGVyU3RhdGVTdGFjay5sZW5ndGggPiAwKSB7CiAgICAgICAgY3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVTdGFja1tyZW5kZXJTdGF0ZVN0YWNrLmxlbmd0aCAtIDFdOwogICAgICAgIGlmIChfY2xpcHBpbmdFbmFibGVkID09PSB0cnVlKQogICAgICAgICAgY2xpcHBpbmcuc2V0R2xvYmFsU3RhdGUoX3RoaXMuY2xpcHBpbmdQbGFuZXMsIGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5jYW1lcmEpOwogICAgICB9IGVsc2UgewogICAgICAgIGN1cnJlbnRSZW5kZXJTdGF0ZSA9IG51bGw7CiAgICAgIH0KICAgICAgcmVuZGVyTGlzdFN0YWNrLnBvcCgpOwogICAgICBpZiAocmVuZGVyTGlzdFN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICBjdXJyZW50UmVuZGVyTGlzdCA9IHJlbmRlckxpc3RTdGFja1tyZW5kZXJMaXN0U3RhY2subGVuZ3RoIC0gMV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlbmRlckxpc3QgPSBudWxsOwogICAgICB9CiAgICB9OwogICAgZnVuY3Rpb24gcHJvamVjdE9iamVjdChvYmplY3QsIGNhbWVyYSwgZ3JvdXBPcmRlciwgc29ydE9iamVjdHMpIHsKICAgICAgaWYgKG9iamVjdC52aXNpYmxlID09PSBmYWxzZSkKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IHZpc2libGUgPSBvYmplY3QubGF5ZXJzLnRlc3QoY2FtZXJhLmxheWVycyk7CiAgICAgIGlmICh2aXNpYmxlKSB7CiAgICAgICAgaWYgKG9iamVjdC5pc0dyb3VwKSB7CiAgICAgICAgICBncm91cE9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyOwogICAgICAgIH0gZWxzZSBpZiAob2JqZWN0LmlzTE9EKSB7CiAgICAgICAgICBpZiAob2JqZWN0LmF1dG9VcGRhdGUgPT09IHRydWUpCiAgICAgICAgICAgIG9iamVjdC51cGRhdGUoY2FtZXJhKTsKICAgICAgICB9IGVsc2UgaWYgKG9iamVjdC5pc0xpZ2h0KSB7CiAgICAgICAgICBjdXJyZW50UmVuZGVyU3RhdGUucHVzaExpZ2h0KG9iamVjdCk7CiAgICAgICAgICBpZiAob2JqZWN0LmNhc3RTaGFkb3cpIHsKICAgICAgICAgICAgY3VycmVudFJlbmRlclN0YXRlLnB1c2hTaGFkb3cob2JqZWN0KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG9iamVjdC5pc1Nwcml0ZSkgewogICAgICAgICAgaWYgKCFvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bTIuaW50ZXJzZWN0c1Nwcml0ZShvYmplY3QpKSB7CiAgICAgICAgICAgIGlmIChzb3J0T2JqZWN0cykgewogICAgICAgICAgICAgIF92ZWN0b3I0LnNldEZyb21NYXRyaXhQb3NpdGlvbihvYmplY3QubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NChfcHJvalNjcmVlbk1hdHJpeDIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gb2JqZWN0cy51cGRhdGUob2JqZWN0KTsKICAgICAgICAgICAgY29uc3QgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7CiAgICAgICAgICAgIGlmIChtYXRlcmlhbC52aXNpYmxlKSB7CiAgICAgICAgICAgICAgY3VycmVudFJlbmRlckxpc3QucHVzaChvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgX3ZlY3RvcjQueiwgbnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMpIHsKICAgICAgICAgIGlmICghb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0yLmludGVyc2VjdHNPYmplY3Qob2JqZWN0KSkgewogICAgICAgICAgICBjb25zdCBnZW9tZXRyeSA9IG9iamVjdHMudXBkYXRlKG9iamVjdCk7CiAgICAgICAgICAgIGNvbnN0IG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsOwogICAgICAgICAgICBpZiAoc29ydE9iamVjdHMpIHsKICAgICAgICAgICAgICBpZiAob2JqZWN0LmJvdW5kaW5nU3BoZXJlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGlmIChvYmplY3QuYm91bmRpbmdTcGhlcmUgPT09IG51bGwpCiAgICAgICAgICAgICAgICAgIG9iamVjdC5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKICAgICAgICAgICAgICAgIF92ZWN0b3I0LmNvcHkob2JqZWN0LmJvdW5kaW5nU3BoZXJlLmNlbnRlcik7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCkKICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CiAgICAgICAgICAgICAgICBfdmVjdG9yNC5jb3B5KGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNlbnRlcik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF92ZWN0b3I0LmFwcGx5TWF0cml4NChvYmplY3QubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NChfcHJvalNjcmVlbk1hdHJpeDIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1hdGVyaWFsKSkgewogICAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwczsKICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBncm91cHNbaV07CiAgICAgICAgICAgICAgICBjb25zdCBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbZ3JvdXAubWF0ZXJpYWxJbmRleF07CiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBNYXRlcmlhbCAmJiBncm91cE1hdGVyaWFsLnZpc2libGUpIHsKICAgICAgICAgICAgICAgICAgY3VycmVudFJlbmRlckxpc3QucHVzaChvYmplY3QsIGdlb21ldHJ5LCBncm91cE1hdGVyaWFsLCBncm91cE9yZGVyLCBfdmVjdG9yNC56LCBncm91cCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGVyaWFsLnZpc2libGUpIHsKICAgICAgICAgICAgICBjdXJyZW50UmVuZGVyTGlzdC5wdXNoKG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCBfdmVjdG9yNC56LCBudWxsKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7aSA8IGw7IGkrKykgewogICAgICAgIHByb2plY3RPYmplY3QoY2hpbGRyZW5baV0sIGNhbWVyYSwgZ3JvdXBPcmRlciwgc29ydE9iamVjdHMpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiByZW5kZXJTY2VuZShjdXJyZW50UmVuZGVyTGlzdDIsIHNjZW5lLCBjYW1lcmEsIHZpZXdwb3J0KSB7CiAgICAgIGNvbnN0IG9wYXF1ZU9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdDIub3BhcXVlOwogICAgICBjb25zdCB0cmFuc21pc3NpdmVPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3QyLnRyYW5zbWlzc2l2ZTsKICAgICAgY29uc3QgdHJhbnNwYXJlbnRPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3QyLnRyYW5zcGFyZW50OwogICAgICBjdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHNWaWV3KGNhbWVyYSk7CiAgICAgIGlmIChfY2xpcHBpbmdFbmFibGVkID09PSB0cnVlKQogICAgICAgIGNsaXBwaW5nLnNldEdsb2JhbFN0YXRlKF90aGlzLmNsaXBwaW5nUGxhbmVzLCBjYW1lcmEpOwogICAgICBpZiAodmlld3BvcnQpCiAgICAgICAgc3RhdGUudmlld3BvcnQoX2N1cnJlbnRWaWV3cG9ydC5jb3B5KHZpZXdwb3J0KSk7CiAgICAgIGlmIChvcGFxdWVPYmplY3RzLmxlbmd0aCA+IDApCiAgICAgICAgcmVuZGVyT2JqZWN0cyhvcGFxdWVPYmplY3RzLCBzY2VuZSwgY2FtZXJhKTsKICAgICAgaWYgKHRyYW5zbWlzc2l2ZU9iamVjdHMubGVuZ3RoID4gMCkKICAgICAgICByZW5kZXJPYmplY3RzKHRyYW5zbWlzc2l2ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEpOwogICAgICBpZiAodHJhbnNwYXJlbnRPYmplY3RzLmxlbmd0aCA+IDApCiAgICAgICAgcmVuZGVyT2JqZWN0cyh0cmFuc3BhcmVudE9iamVjdHMsIHNjZW5lLCBjYW1lcmEpOwogICAgICBzdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QodHJ1ZSk7CiAgICAgIHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayh0cnVlKTsKICAgICAgc3RhdGUuYnVmZmVycy5jb2xvci5zZXRNYXNrKHRydWUpOwogICAgICBzdGF0ZS5zZXRQb2x5Z29uT2Zmc2V0KGZhbHNlKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlbmRlclRyYW5zbWlzc2lvblBhc3Mob3BhcXVlT2JqZWN0cywgdHJhbnNtaXNzaXZlT2JqZWN0cywgc2NlbmUsIGNhbWVyYSkgewogICAgICBjb25zdCBvdmVycmlkZU1hdGVyaWFsID0gc2NlbmUuaXNTY2VuZSA9PT0gdHJ1ZSA/IHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgOiBudWxsOwogICAgICBpZiAob3ZlcnJpZGVNYXRlcmlhbCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnRyYW5zbWlzc2lvblJlbmRlclRhcmdldFtjYW1lcmEuaWRdID09PSB1bmRlZmluZWQpIHsKICAgICAgICBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUudHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0W2NhbWVyYS5pZF0gPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSwgewogICAgICAgICAgZ2VuZXJhdGVNaXBtYXBzOiB0cnVlLAogICAgICAgICAgdHlwZTogZXh0ZW5zaW9ucy5oYXMoIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIpIHx8IGV4dGVuc2lvbnMuaGFzKCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0IikgPyBIYWxmRmxvYXRUeXBlIDogVW5zaWduZWRCeXRlVHlwZSwKICAgICAgICAgIG1pbkZpbHRlcjogTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyLAogICAgICAgICAgc2FtcGxlczogNCwKICAgICAgICAgIHN0ZW5jaWxCdWZmZXI6IHN0ZW5jaWwsCiAgICAgICAgICByZXNvbHZlRGVwdGhCdWZmZXI6IGZhbHNlLAogICAgICAgICAgcmVzb2x2ZVN0ZW5jaWxCdWZmZXI6IGZhbHNlLAogICAgICAgICAgY29sb3JTcGFjZTogQ29sb3JNYW5hZ2VtZW50LndvcmtpbmdDb2xvclNwYWNlCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgY29uc3QgdHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0ID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnRyYW5zbWlzc2lvblJlbmRlclRhcmdldFtjYW1lcmEuaWRdOwogICAgICBjb25zdCBhY3RpdmVWaWV3cG9ydCA9IGNhbWVyYS52aWV3cG9ydCB8fCBfY3VycmVudFZpZXdwb3J0OwogICAgICB0cmFuc21pc3Npb25SZW5kZXJUYXJnZXQuc2V0U2l6ZShhY3RpdmVWaWV3cG9ydC56ICogX3RoaXMudHJhbnNtaXNzaW9uUmVzb2x1dGlvblNjYWxlLCBhY3RpdmVWaWV3cG9ydC53ICogX3RoaXMudHJhbnNtaXNzaW9uUmVzb2x1dGlvblNjYWxlKTsKICAgICAgY29uc3QgY3VycmVudFJlbmRlclRhcmdldCA9IF90aGlzLmdldFJlbmRlclRhcmdldCgpOwogICAgICBfdGhpcy5zZXRSZW5kZXJUYXJnZXQodHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0KTsKICAgICAgX3RoaXMuZ2V0Q2xlYXJDb2xvcihfY3VycmVudENsZWFyQ29sb3IpOwogICAgICBfY3VycmVudENsZWFyQWxwaGEgPSBfdGhpcy5nZXRDbGVhckFscGhhKCk7CiAgICAgIGlmIChfY3VycmVudENsZWFyQWxwaGEgPCAxKQogICAgICAgIF90aGlzLnNldENsZWFyQ29sb3IoMTY3NzcyMTUsIDAuNSk7CiAgICAgIF90aGlzLmNsZWFyKCk7CiAgICAgIGlmIChfcmVuZGVyQmFja2dyb3VuZCkKICAgICAgICBiYWNrZ3JvdW5kLnJlbmRlcihzY2VuZSk7CiAgICAgIGNvbnN0IGN1cnJlbnRUb25lTWFwcGluZyA9IF90aGlzLnRvbmVNYXBwaW5nOwogICAgICBfdGhpcy50b25lTWFwcGluZyA9IE5vVG9uZU1hcHBpbmc7CiAgICAgIGNvbnN0IGN1cnJlbnRDYW1lcmFWaWV3cG9ydCA9IGNhbWVyYS52aWV3cG9ydDsKICAgICAgaWYgKGNhbWVyYS52aWV3cG9ydCAhPT0gdW5kZWZpbmVkKQogICAgICAgIGNhbWVyYS52aWV3cG9ydCA9IHVuZGVmaW5lZDsKICAgICAgY3VycmVudFJlbmRlclN0YXRlLnNldHVwTGlnaHRzVmlldyhjYW1lcmEpOwogICAgICBpZiAoX2NsaXBwaW5nRW5hYmxlZCA9PT0gdHJ1ZSkKICAgICAgICBjbGlwcGluZy5zZXRHbG9iYWxTdGF0ZShfdGhpcy5jbGlwcGluZ1BsYW5lcywgY2FtZXJhKTsKICAgICAgcmVuZGVyT2JqZWN0cyhvcGFxdWVPYmplY3RzLCBzY2VuZSwgY2FtZXJhKTsKICAgICAgdGV4dHVyZXMudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQodHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0KTsKICAgICAgdGV4dHVyZXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKHRyYW5zbWlzc2lvblJlbmRlclRhcmdldCk7CiAgICAgIGlmIChleHRlbnNpb25zLmhhcygiV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIikgPT09IGZhbHNlKSB7CiAgICAgICAgbGV0IHJlbmRlclRhcmdldE5lZWRzVXBkYXRlID0gZmFsc2U7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0cmFuc21pc3NpdmVPYmplY3RzLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICBjb25zdCByZW5kZXJJdGVtID0gdHJhbnNtaXNzaXZlT2JqZWN0c1tpXTsKICAgICAgICAgIGNvbnN0IG9iamVjdCA9IHJlbmRlckl0ZW0ub2JqZWN0OwogICAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSByZW5kZXJJdGVtLmdlb21ldHJ5OwogICAgICAgICAgY29uc3QgbWF0ZXJpYWwgPSByZW5kZXJJdGVtLm1hdGVyaWFsOwogICAgICAgICAgY29uc3QgZ3JvdXAgPSByZW5kZXJJdGVtLmdyb3VwOwogICAgICAgICAgaWYgKG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGUgJiYgb2JqZWN0LmxheWVycy50ZXN0KGNhbWVyYS5sYXllcnMpKSB7CiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTaWRlID0gbWF0ZXJpYWwuc2lkZTsKICAgICAgICAgICAgbWF0ZXJpYWwuc2lkZSA9IEJhY2tTaWRlOwogICAgICAgICAgICBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgICAgIHJlbmRlck9iamVjdChvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXApOwogICAgICAgICAgICBtYXRlcmlhbC5zaWRlID0gY3VycmVudFNpZGU7CiAgICAgICAgICAgIG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgcmVuZGVyVGFyZ2V0TmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocmVuZGVyVGFyZ2V0TmVlZHNVcGRhdGUgPT09IHRydWUpIHsKICAgICAgICAgIHRleHR1cmVzLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KHRyYW5zbWlzc2lvblJlbmRlclRhcmdldCk7CiAgICAgICAgICB0ZXh0dXJlcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAodHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgX3RoaXMuc2V0UmVuZGVyVGFyZ2V0KGN1cnJlbnRSZW5kZXJUYXJnZXQpOwogICAgICBfdGhpcy5zZXRDbGVhckNvbG9yKF9jdXJyZW50Q2xlYXJDb2xvciwgX2N1cnJlbnRDbGVhckFscGhhKTsKICAgICAgaWYgKGN1cnJlbnRDYW1lcmFWaWV3cG9ydCAhPT0gdW5kZWZpbmVkKQogICAgICAgIGNhbWVyYS52aWV3cG9ydCA9IGN1cnJlbnRDYW1lcmFWaWV3cG9ydDsKICAgICAgX3RoaXMudG9uZU1hcHBpbmcgPSBjdXJyZW50VG9uZU1hcHBpbmc7CiAgICB9CiAgICBmdW5jdGlvbiByZW5kZXJPYmplY3RzKHJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEpIHsKICAgICAgY29uc3Qgb3ZlcnJpZGVNYXRlcmlhbCA9IHNjZW5lLmlzU2NlbmUgPT09IHRydWUgPyBzY2VuZS5vdmVycmlkZU1hdGVyaWFsIDogbnVsbDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSByZW5kZXJMaXN0Lmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgY29uc3QgcmVuZGVySXRlbSA9IHJlbmRlckxpc3RbaV07CiAgICAgICAgY29uc3Qgb2JqZWN0ID0gcmVuZGVySXRlbS5vYmplY3Q7CiAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSByZW5kZXJJdGVtLmdlb21ldHJ5OwogICAgICAgIGNvbnN0IG1hdGVyaWFsID0gb3ZlcnJpZGVNYXRlcmlhbCA9PT0gbnVsbCA/IHJlbmRlckl0ZW0ubWF0ZXJpYWwgOiBvdmVycmlkZU1hdGVyaWFsOwogICAgICAgIGNvbnN0IGdyb3VwID0gcmVuZGVySXRlbS5ncm91cDsKICAgICAgICBpZiAob2JqZWN0LmxheWVycy50ZXN0KGNhbWVyYS5sYXllcnMpKSB7CiAgICAgICAgICByZW5kZXJPYmplY3Qob2JqZWN0LCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHJlbmRlck9iamVjdChvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXApIHsKICAgICAgb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwKTsKICAgICAgb2JqZWN0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIG9iamVjdC5tYXRyaXhXb3JsZCk7CiAgICAgIG9iamVjdC5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KG9iamVjdC5tb2RlbFZpZXdNYXRyaXgpOwogICAgICBtYXRlcmlhbC5vbkJlZm9yZVJlbmRlcihfdGhpcywgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG9iamVjdCwgZ3JvdXApOwogICAgICBpZiAobWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWUgJiYgbWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZSAmJiBtYXRlcmlhbC5mb3JjZVNpbmdsZVBhc3MgPT09IGZhbHNlKSB7CiAgICAgICAgbWF0ZXJpYWwuc2lkZSA9IEJhY2tTaWRlOwogICAgICAgIG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgICBfdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QoY2FtZXJhLCBzY2VuZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBvYmplY3QsIGdyb3VwKTsKICAgICAgICBtYXRlcmlhbC5zaWRlID0gRnJvbnRTaWRlOwogICAgICAgIG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgICBfdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QoY2FtZXJhLCBzY2VuZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBvYmplY3QsIGdyb3VwKTsKICAgICAgICBtYXRlcmlhbC5zaWRlID0gRG91YmxlU2lkZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QoY2FtZXJhLCBzY2VuZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBvYmplY3QsIGdyb3VwKTsKICAgICAgfQogICAgICBvYmplY3Qub25BZnRlclJlbmRlcihfdGhpcywgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRQcm9ncmFtKG1hdGVyaWFsLCBzY2VuZSwgb2JqZWN0KSB7CiAgICAgIGlmIChzY2VuZS5pc1NjZW5lICE9PSB0cnVlKQogICAgICAgIHNjZW5lID0gX2VtcHR5U2NlbmU7CiAgICAgIGNvbnN0IG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KG1hdGVyaWFsKTsKICAgICAgY29uc3QgbGlnaHRzID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLmxpZ2h0czsKICAgICAgY29uc3Qgc2hhZG93c0FycmF5ID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnNoYWRvd3NBcnJheTsKICAgICAgY29uc3QgbGlnaHRzU3RhdGVWZXJzaW9uID0gbGlnaHRzLnN0YXRlLnZlcnNpb247CiAgICAgIGNvbnN0IHBhcmFtZXRlcnMyID0gcHJvZ3JhbUNhY2hlLmdldFBhcmFtZXRlcnMobWF0ZXJpYWwsIGxpZ2h0cy5zdGF0ZSwgc2hhZG93c0FycmF5LCBzY2VuZSwgb2JqZWN0KTsKICAgICAgY29uc3QgcHJvZ3JhbUNhY2hlS2V5ID0gcHJvZ3JhbUNhY2hlLmdldFByb2dyYW1DYWNoZUtleShwYXJhbWV0ZXJzMik7CiAgICAgIGxldCBwcm9ncmFtcyA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtczsKICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLmVudmlyb25tZW50ID0gbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA/IHNjZW5lLmVudmlyb25tZW50IDogbnVsbDsKICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLmZvZyA9IHNjZW5lLmZvZzsKICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLmVudk1hcCA9IChtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID8gY3ViZXV2bWFwcyA6IGN1YmVtYXBzKS5nZXQobWF0ZXJpYWwuZW52TWFwIHx8IG1hdGVyaWFsUHJvcGVydGllcy5lbnZpcm9ubWVudCk7CiAgICAgIG1hdGVyaWFsUHJvcGVydGllcy5lbnZNYXBSb3RhdGlvbiA9IG1hdGVyaWFsUHJvcGVydGllcy5lbnZpcm9ubWVudCAhPT0gbnVsbCAmJiBtYXRlcmlhbC5lbnZNYXAgPT09IG51bGwgPyBzY2VuZS5lbnZpcm9ubWVudFJvdGF0aW9uIDogbWF0ZXJpYWwuZW52TWFwUm90YXRpb247CiAgICAgIGlmIChwcm9ncmFtcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgbWF0ZXJpYWwuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIG9uTWF0ZXJpYWxEaXNwb3NlKTsKICAgICAgICBwcm9ncmFtcyA9IG5ldyBNYXA7CiAgICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW1zID0gcHJvZ3JhbXM7CiAgICAgIH0KICAgICAgbGV0IHByb2dyYW0gPSBwcm9ncmFtcy5nZXQocHJvZ3JhbUNhY2hlS2V5KTsKICAgICAgaWYgKHByb2dyYW0gIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlmIChtYXRlcmlhbFByb3BlcnRpZXMuY3VycmVudFByb2dyYW0gPT09IHByb2dyYW0gJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c1N0YXRlVmVyc2lvbiA9PT0gbGlnaHRzU3RhdGVWZXJzaW9uKSB7CiAgICAgICAgICB1cGRhdGVDb21tb25NYXRlcmlhbFByb3BlcnRpZXMobWF0ZXJpYWwsIHBhcmFtZXRlcnMyKTsKICAgICAgICAgIHJldHVybiBwcm9ncmFtOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBwYXJhbWV0ZXJzMi51bmlmb3JtcyA9IHByb2dyYW1DYWNoZS5nZXRVbmlmb3JtcyhtYXRlcmlhbCk7CiAgICAgICAgbWF0ZXJpYWwub25CZWZvcmVDb21waWxlKHBhcmFtZXRlcnMyLCBfdGhpcyk7CiAgICAgICAgcHJvZ3JhbSA9IHByb2dyYW1DYWNoZS5hY3F1aXJlUHJvZ3JhbShwYXJhbWV0ZXJzMiwgcHJvZ3JhbUNhY2hlS2V5KTsKICAgICAgICBwcm9ncmFtcy5zZXQocHJvZ3JhbUNhY2hlS2V5LCBwcm9ncmFtKTsKICAgICAgICBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXMgPSBwYXJhbWV0ZXJzMi51bmlmb3JtczsKICAgICAgfQogICAgICBjb25zdCB1bmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3JtczsKICAgICAgaWYgKCFtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICYmICFtYXRlcmlhbC5pc1Jhd1NoYWRlck1hdGVyaWFsIHx8IG1hdGVyaWFsLmNsaXBwaW5nID09PSB0cnVlKSB7CiAgICAgICAgdW5pZm9ybXMuY2xpcHBpbmdQbGFuZXMgPSBjbGlwcGluZy51bmlmb3JtOwogICAgICB9CiAgICAgIHVwZGF0ZUNvbW1vbk1hdGVyaWFsUHJvcGVydGllcyhtYXRlcmlhbCwgcGFyYW1ldGVyczIpOwogICAgICBtYXRlcmlhbFByb3BlcnRpZXMubmVlZHNMaWdodHMgPSBtYXRlcmlhbE5lZWRzTGlnaHRzKG1hdGVyaWFsKTsKICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c1N0YXRlVmVyc2lvbiA9IGxpZ2h0c1N0YXRlVmVyc2lvbjsKICAgICAgaWYgKG1hdGVyaWFsUHJvcGVydGllcy5uZWVkc0xpZ2h0cykgewogICAgICAgIHVuaWZvcm1zLmFtYmllbnRMaWdodENvbG9yLnZhbHVlID0gbGlnaHRzLnN0YXRlLmFtYmllbnQ7CiAgICAgICAgdW5pZm9ybXMubGlnaHRQcm9iZS52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wcm9iZTsKICAgICAgICB1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbDsKICAgICAgICB1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0U2hhZG93cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvdzsKICAgICAgICB1bmlmb3Jtcy5zcG90TGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLnNwb3Q7CiAgICAgICAgdW5pZm9ybXMuc3BvdExpZ2h0U2hhZG93cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93OwogICAgICAgIHVuaWZvcm1zLnJlY3RBcmVhTGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLnJlY3RBcmVhOwogICAgICAgIHVuaWZvcm1zLmx0Y18xLnZhbHVlID0gbGlnaHRzLnN0YXRlLnJlY3RBcmVhTFRDMTsKICAgICAgICB1bmlmb3Jtcy5sdGNfMi52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5yZWN0QXJlYUxUQzI7CiAgICAgICAgdW5pZm9ybXMucG9pbnRMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnQ7CiAgICAgICAgdW5pZm9ybXMucG9pbnRMaWdodFNoYWRvd3MudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnRTaGFkb3c7CiAgICAgICAgdW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5oZW1pOwogICAgICAgIHVuaWZvcm1zLmRpcmVjdGlvbmFsU2hhZG93TWFwLnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWFwOwogICAgICAgIHVuaWZvcm1zLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4OwogICAgICAgIHVuaWZvcm1zLnNwb3RTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUuc3BvdFNoYWRvd01hcDsKICAgICAgICB1bmlmb3Jtcy5zcG90TGlnaHRNYXRyaXgudmFsdWUgPSBsaWdodHMuc3RhdGUuc3BvdExpZ2h0TWF0cml4OwogICAgICAgIHVuaWZvcm1zLnNwb3RMaWdodE1hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90TGlnaHRNYXA7CiAgICAgICAgdW5pZm9ybXMucG9pbnRTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnRTaGFkb3dNYXA7CiAgICAgICAgdW5pZm9ybXMucG9pbnRTaGFkb3dNYXRyaXgudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnRTaGFkb3dNYXRyaXg7CiAgICAgIH0KICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLmN1cnJlbnRQcm9ncmFtID0gcHJvZ3JhbTsKICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCA9IG51bGw7CiAgICAgIHJldHVybiBwcm9ncmFtOwogICAgfQogICAgZnVuY3Rpb24gZ2V0VW5pZm9ybUxpc3QobWF0ZXJpYWxQcm9wZXJ0aWVzKSB7CiAgICAgIGlmIChtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0ID09PSBudWxsKSB7CiAgICAgICAgY29uc3QgcHJvZ1VuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLmN1cnJlbnRQcm9ncmFtLmdldFVuaWZvcm1zKCk7CiAgICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCA9IFdlYkdMVW5pZm9ybXMuc2VxV2l0aFZhbHVlKHByb2dVbmlmb3Jtcy5zZXEsIG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtcyk7CiAgICAgIH0KICAgICAgcmV0dXJuIG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3Q7CiAgICB9CiAgICBmdW5jdGlvbiB1cGRhdGVDb21tb25NYXRlcmlhbFByb3BlcnRpZXMobWF0ZXJpYWwsIHBhcmFtZXRlcnMyKSB7CiAgICAgIGNvbnN0IG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KG1hdGVyaWFsKTsKICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLm91dHB1dENvbG9yU3BhY2UgPSBwYXJhbWV0ZXJzMi5vdXRwdXRDb2xvclNwYWNlOwogICAgICBtYXRlcmlhbFByb3BlcnRpZXMuYmF0Y2hpbmcgPSBwYXJhbWV0ZXJzMi5iYXRjaGluZzsKICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLmJhdGNoaW5nQ29sb3IgPSBwYXJhbWV0ZXJzMi5iYXRjaGluZ0NvbG9yOwogICAgICBtYXRlcmlhbFByb3BlcnRpZXMuaW5zdGFuY2luZyA9IHBhcmFtZXRlcnMyLmluc3RhbmNpbmc7CiAgICAgIG1hdGVyaWFsUHJvcGVydGllcy5pbnN0YW5jaW5nQ29sb3IgPSBwYXJhbWV0ZXJzMi5pbnN0YW5jaW5nQ29sb3I7CiAgICAgIG1hdGVyaWFsUHJvcGVydGllcy5pbnN0YW5jaW5nTW9ycGggPSBwYXJhbWV0ZXJzMi5pbnN0YW5jaW5nTW9ycGg7CiAgICAgIG1hdGVyaWFsUHJvcGVydGllcy5za2lubmluZyA9IHBhcmFtZXRlcnMyLnNraW5uaW5nOwogICAgICBtYXRlcmlhbFByb3BlcnRpZXMubW9ycGhUYXJnZXRzID0gcGFyYW1ldGVyczIubW9ycGhUYXJnZXRzOwogICAgICBtYXRlcmlhbFByb3BlcnRpZXMubW9ycGhOb3JtYWxzID0gcGFyYW1ldGVyczIubW9ycGhOb3JtYWxzOwogICAgICBtYXRlcmlhbFByb3BlcnRpZXMubW9ycGhDb2xvcnMgPSBwYXJhbWV0ZXJzMi5tb3JwaENvbG9yczsKICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLm1vcnBoVGFyZ2V0c0NvdW50ID0gcGFyYW1ldGVyczIubW9ycGhUYXJnZXRzQ291bnQ7CiAgICAgIG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyA9IHBhcmFtZXRlcnMyLm51bUNsaXBwaW5nUGxhbmVzOwogICAgICBtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uID0gcGFyYW1ldGVyczIubnVtQ2xpcEludGVyc2VjdGlvbjsKICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLnZlcnRleEFscGhhcyA9IHBhcmFtZXRlcnMyLnZlcnRleEFscGhhczsKICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLnZlcnRleFRhbmdlbnRzID0gcGFyYW1ldGVyczIudmVydGV4VGFuZ2VudHM7CiAgICAgIG1hdGVyaWFsUHJvcGVydGllcy50b25lTWFwcGluZyA9IHBhcmFtZXRlcnMyLnRvbmVNYXBwaW5nOwogICAgICBtYXRlcmlhbFByb3BlcnRpZXMubnVtTXVsdGl2aWV3Vmlld3MgPSBwYXJhbWV0ZXJzMi5udW1NdWx0aXZpZXdWaWV3czsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFByb2dyYW0oY2FtZXJhLCBzY2VuZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBvYmplY3QpIHsKICAgICAgaWYgKHNjZW5lLmlzU2NlbmUgIT09IHRydWUpCiAgICAgICAgc2NlbmUgPSBfZW1wdHlTY2VuZTsKICAgICAgdGV4dHVyZXMucmVzZXRUZXh0dXJlVW5pdHMoKTsKICAgICAgY29uc3QgZm9nID0gc2NlbmUuZm9nOwogICAgICBjb25zdCBlbnZpcm9ubWVudCA9IG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPyBzY2VuZS5lbnZpcm9ubWVudCA6IG51bGw7CiAgICAgIGNvbnN0IGNvbG9yU3BhY2UgPSBfY3VycmVudFJlbmRlclRhcmdldCA9PT0gbnVsbCA/IF90aGlzLm91dHB1dENvbG9yU3BhY2UgOiBfY3VycmVudFJlbmRlclRhcmdldC5pc1hSUmVuZGVyVGFyZ2V0ID09PSB0cnVlID8gX2N1cnJlbnRSZW5kZXJUYXJnZXQudGV4dHVyZS5jb2xvclNwYWNlIDogTGluZWFyU1JHQkNvbG9yU3BhY2U7CiAgICAgIGNvbnN0IGVudk1hcCA9IChtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID8gY3ViZXV2bWFwcyA6IGN1YmVtYXBzKS5nZXQobWF0ZXJpYWwuZW52TWFwIHx8IGVudmlyb25tZW50KTsKICAgICAgY29uc3QgdmVydGV4QWxwaGFzID0gbWF0ZXJpYWwudmVydGV4Q29sb3JzID09PSB0cnVlICYmICEhZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvciAmJiBnZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yLml0ZW1TaXplID09PSA0OwogICAgICBjb25zdCB2ZXJ0ZXhUYW5nZW50cyA9ICEhZ2VvbWV0cnkuYXR0cmlidXRlcy50YW5nZW50ICYmICghIW1hdGVyaWFsLm5vcm1hbE1hcCB8fCBtYXRlcmlhbC5hbmlzb3Ryb3B5ID4gMCk7CiAgICAgIGNvbnN0IG1vcnBoVGFyZ2V0cyA9ICEhZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgICBjb25zdCBtb3JwaE5vcm1hbHMgPSAhIWdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWw7CiAgICAgIGNvbnN0IG1vcnBoQ29sb3JzID0gISFnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3I7CiAgICAgIGxldCB0b25lTWFwcGluZyA9IE5vVG9uZU1hcHBpbmc7CiAgICAgIGlmIChtYXRlcmlhbC50b25lTWFwcGVkKSB7CiAgICAgICAgaWYgKF9jdXJyZW50UmVuZGVyVGFyZ2V0ID09PSBudWxsIHx8IF9jdXJyZW50UmVuZGVyVGFyZ2V0LmlzWFJSZW5kZXJUYXJnZXQgPT09IHRydWUpIHsKICAgICAgICAgIHRvbmVNYXBwaW5nID0gX3RoaXMudG9uZU1hcHBpbmc7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IG51bU11bHRpdmlld1ZpZXdzID0gX2N1cnJlbnRSZW5kZXJUYXJnZXQgJiYgX2N1cnJlbnRSZW5kZXJUYXJnZXQuaXNXZWJHTE11bHRpdmlld1JlbmRlclRhcmdldCA/IF9jdXJyZW50UmVuZGVyVGFyZ2V0Lm51bVZpZXdzIDogMDsKICAgICAgY29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gfHwgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCB8fCBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuY29sb3I7CiAgICAgIGNvbnN0IG1vcnBoVGFyZ2V0c0NvdW50ID0gbW9ycGhBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCA/IG1vcnBoQXR0cmlidXRlLmxlbmd0aCA6IDA7CiAgICAgIGNvbnN0IG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KG1hdGVyaWFsKTsKICAgICAgY29uc3QgbGlnaHRzID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLmxpZ2h0czsKICAgICAgaWYgKF9jbGlwcGluZ0VuYWJsZWQgPT09IHRydWUpIHsKICAgICAgICBpZiAoX2xvY2FsQ2xpcHBpbmdFbmFibGVkID09PSB0cnVlIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEpIHsKICAgICAgICAgIGNvbnN0IHVzZUNhY2hlID0gY2FtZXJhID09PSBfY3VycmVudENhbWVyYSAmJiBtYXRlcmlhbC5pZCA9PT0gX2N1cnJlbnRNYXRlcmlhbElkOwogICAgICAgICAgY2xpcHBpbmcuc2V0U3RhdGUobWF0ZXJpYWwsIGNhbWVyYSwgdXNlQ2FjaGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgbmVlZHNQcm9ncmFtQ2hhbmdlID0gZmFsc2U7CiAgICAgIGlmIChtYXRlcmlhbC52ZXJzaW9uID09PSBtYXRlcmlhbFByb3BlcnRpZXMuX192ZXJzaW9uKSB7CiAgICAgICAgaWYgKG1hdGVyaWFsUHJvcGVydGllcy5uZWVkc0xpZ2h0cyAmJiBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzU3RhdGVWZXJzaW9uICE9PSBsaWdodHMuc3RhdGUudmVyc2lvbikgewogICAgICAgICAgbmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKG1hdGVyaWFsUHJvcGVydGllcy5vdXRwdXRDb2xvclNwYWNlICE9PSBjb2xvclNwYWNlKSB7CiAgICAgICAgICBuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAob2JqZWN0LmlzQmF0Y2hlZE1lc2ggJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmJhdGNoaW5nID09PSBmYWxzZSkgewogICAgICAgICAgbmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKCFvYmplY3QuaXNCYXRjaGVkTWVzaCAmJiBtYXRlcmlhbFByb3BlcnRpZXMuYmF0Y2hpbmcgPT09IHRydWUpIHsKICAgICAgICAgIG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChvYmplY3QuaXNCYXRjaGVkTWVzaCAmJiBtYXRlcmlhbFByb3BlcnRpZXMuYmF0Y2hpbmdDb2xvciA9PT0gdHJ1ZSAmJiBvYmplY3QuY29sb3JUZXh0dXJlID09PSBudWxsKSB7CiAgICAgICAgICBuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAob2JqZWN0LmlzQmF0Y2hlZE1lc2ggJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmJhdGNoaW5nQ29sb3IgPT09IGZhbHNlICYmIG9iamVjdC5jb2xvclRleHR1cmUgIT09IG51bGwpIHsKICAgICAgICAgIG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChvYmplY3QuaXNJbnN0YW5jZWRNZXNoICYmIG1hdGVyaWFsUHJvcGVydGllcy5pbnN0YW5jaW5nID09PSBmYWxzZSkgewogICAgICAgICAgbmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKCFvYmplY3QuaXNJbnN0YW5jZWRNZXNoICYmIG1hdGVyaWFsUHJvcGVydGllcy5pbnN0YW5jaW5nID09PSB0cnVlKSB7CiAgICAgICAgICBuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAob2JqZWN0LmlzU2tpbm5lZE1lc2ggJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLnNraW5uaW5nID09PSBmYWxzZSkgewogICAgICAgICAgbmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKCFvYmplY3QuaXNTa2lubmVkTWVzaCAmJiBtYXRlcmlhbFByb3BlcnRpZXMuc2tpbm5pbmcgPT09IHRydWUpIHsKICAgICAgICAgIG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChvYmplY3QuaXNJbnN0YW5jZWRNZXNoICYmIG1hdGVyaWFsUHJvcGVydGllcy5pbnN0YW5jaW5nQ29sb3IgPT09IHRydWUgJiYgb2JqZWN0Lmluc3RhbmNlQ29sb3IgPT09IG51bGwpIHsKICAgICAgICAgIG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChvYmplY3QuaXNJbnN0YW5jZWRNZXNoICYmIG1hdGVyaWFsUHJvcGVydGllcy5pbnN0YW5jaW5nQ29sb3IgPT09IGZhbHNlICYmIG9iamVjdC5pbnN0YW5jZUNvbG9yICE9PSBudWxsKSB7CiAgICAgICAgICBuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAob2JqZWN0LmlzSW5zdGFuY2VkTWVzaCAmJiBtYXRlcmlhbFByb3BlcnRpZXMuaW5zdGFuY2luZ01vcnBoID09PSB0cnVlICYmIG9iamVjdC5tb3JwaFRleHR1cmUgPT09IG51bGwpIHsKICAgICAgICAgIG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChvYmplY3QuaXNJbnN0YW5jZWRNZXNoICYmIG1hdGVyaWFsUHJvcGVydGllcy5pbnN0YW5jaW5nTW9ycGggPT09IGZhbHNlICYmIG9iamVjdC5tb3JwaFRleHR1cmUgIT09IG51bGwpIHsKICAgICAgICAgIG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChtYXRlcmlhbFByb3BlcnRpZXMuZW52TWFwICE9PSBlbnZNYXApIHsKICAgICAgICAgIG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChtYXRlcmlhbC5mb2cgPT09IHRydWUgJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmZvZyAhPT0gZm9nKSB7CiAgICAgICAgICBuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAobWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzICE9PSB1bmRlZmluZWQgJiYgKG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyAhPT0gY2xpcHBpbmcubnVtUGxhbmVzIHx8IG1hdGVyaWFsUHJvcGVydGllcy5udW1JbnRlcnNlY3Rpb24gIT09IGNsaXBwaW5nLm51bUludGVyc2VjdGlvbikpIHsKICAgICAgICAgIG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChtYXRlcmlhbFByb3BlcnRpZXMudmVydGV4QWxwaGFzICE9PSB2ZXJ0ZXhBbHBoYXMpIHsKICAgICAgICAgIG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChtYXRlcmlhbFByb3BlcnRpZXMudmVydGV4VGFuZ2VudHMgIT09IHZlcnRleFRhbmdlbnRzKSB7CiAgICAgICAgICBuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAobWF0ZXJpYWxQcm9wZXJ0aWVzLm1vcnBoVGFyZ2V0cyAhPT0gbW9ycGhUYXJnZXRzKSB7CiAgICAgICAgICBuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAobWF0ZXJpYWxQcm9wZXJ0aWVzLm1vcnBoTm9ybWFscyAhPT0gbW9ycGhOb3JtYWxzKSB7CiAgICAgICAgICBuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAobWF0ZXJpYWxQcm9wZXJ0aWVzLm1vcnBoQ29sb3JzICE9PSBtb3JwaENvbG9ycykgewogICAgICAgICAgbmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKG1hdGVyaWFsUHJvcGVydGllcy50b25lTWFwcGluZyAhPT0gdG9uZU1hcHBpbmcpIHsKICAgICAgICAgIG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChtYXRlcmlhbFByb3BlcnRpZXMubW9ycGhUYXJnZXRzQ291bnQgIT09IG1vcnBoVGFyZ2V0c0NvdW50KSB7CiAgICAgICAgICBuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAobWF0ZXJpYWxQcm9wZXJ0aWVzLm51bU11bHRpdmlld1ZpZXdzICE9PSBudW1NdWx0aXZpZXdWaWV3cykgewogICAgICAgICAgbmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTsKICAgICAgICBtYXRlcmlhbFByb3BlcnRpZXMuX192ZXJzaW9uID0gbWF0ZXJpYWwudmVyc2lvbjsKICAgICAgfQogICAgICBsZXQgcHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5jdXJyZW50UHJvZ3JhbTsKICAgICAgaWYgKG5lZWRzUHJvZ3JhbUNoYW5nZSA9PT0gdHJ1ZSkgewogICAgICAgIHByb2dyYW0gPSBnZXRQcm9ncmFtKG1hdGVyaWFsLCBzY2VuZSwgb2JqZWN0KTsKICAgICAgfQogICAgICBsZXQgcmVmcmVzaFByb2dyYW0gPSBmYWxzZTsKICAgICAgbGV0IHJlZnJlc2hNYXRlcmlhbCA9IGZhbHNlOwogICAgICBsZXQgcmVmcmVzaExpZ2h0cyA9IGZhbHNlOwogICAgICBjb25zdCBwX3VuaWZvcm1zID0gcHJvZ3JhbS5nZXRVbmlmb3JtcygpLCBtX3VuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zOwogICAgICBpZiAoc3RhdGUudXNlUHJvZ3JhbShwcm9ncmFtLnByb2dyYW0pKSB7CiAgICAgICAgcmVmcmVzaFByb2dyYW0gPSB0cnVlOwogICAgICAgIHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7CiAgICAgICAgcmVmcmVzaExpZ2h0cyA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKG1hdGVyaWFsLmlkICE9PSBfY3VycmVudE1hdGVyaWFsSWQpIHsKICAgICAgICBfY3VycmVudE1hdGVyaWFsSWQgPSBtYXRlcmlhbC5pZDsKICAgICAgICByZWZyZXNoTWF0ZXJpYWwgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChyZWZyZXNoUHJvZ3JhbSB8fCBfY3VycmVudENhbWVyYSAhPT0gY2FtZXJhKSB7CiAgICAgICAgaWYgKHByb2dyYW0ubnVtTXVsdGl2aWV3Vmlld3MgPiAwKSB7CiAgICAgICAgICBtdWx0aXZpZXcudXBkYXRlQ2FtZXJhUHJvamVjdGlvbk1hdHJpY2VzVW5pZm9ybShjYW1lcmEsIHBfdW5pZm9ybXMpOwogICAgICAgICAgbXVsdGl2aWV3LnVwZGF0ZUNhbWVyYVZpZXdNYXRyaWNlc1VuaWZvcm0oY2FtZXJhLCBwX3VuaWZvcm1zKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgcmV2ZXJzZURlcHRoQnVmZmVyMiA9IHN0YXRlLmJ1ZmZlcnMuZGVwdGguZ2V0UmV2ZXJzZWQoKTsKICAgICAgICAgIGlmIChyZXZlcnNlRGVwdGhCdWZmZXIyKSB7CiAgICAgICAgICAgIF9jdXJyZW50UHJvamVjdGlvbk1hdHJpeC5jb3B5KGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4KTsKICAgICAgICAgICAgdG9Ob3JtYWxpemVkUHJvamVjdGlvbk1hdHJpeChfY3VycmVudFByb2plY3Rpb25NYXRyaXgpOwogICAgICAgICAgICB0b1JldmVyc2VkUHJvamVjdGlvbk1hdHJpeChfY3VycmVudFByb2plY3Rpb25NYXRyaXgpOwogICAgICAgICAgICBwX3VuaWZvcm1zLnNldFZhbHVlKF9nbCwgInByb2plY3Rpb25NYXRyaXgiLCBfY3VycmVudFByb2plY3Rpb25NYXRyaXgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcF91bmlmb3Jtcy5zZXRWYWx1ZShfZ2wsICJwcm9qZWN0aW9uTWF0cml4IiwgY2FtZXJhLnByb2plY3Rpb25NYXRyaXgpOwogICAgICAgICAgfQogICAgICAgICAgcF91bmlmb3Jtcy5zZXRWYWx1ZShfZ2wsICJ2aWV3TWF0cml4IiwgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHVDYW1Qb3MgPSBwX3VuaWZvcm1zLm1hcC5jYW1lcmFQb3NpdGlvbjsKICAgICAgICBpZiAodUNhbVBvcyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB1Q2FtUG9zLnNldFZhbHVlKF9nbCwgX3ZlY3RvcjMyLnNldEZyb21NYXRyaXhQb3NpdGlvbihjYW1lcmEubWF0cml4V29ybGQpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNhcGFiaWxpdGllcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyKSB7CiAgICAgICAgICBwX3VuaWZvcm1zLnNldFZhbHVlKF9nbCwgImxvZ0RlcHRoQnVmRkMiLCAyIC8gKE1hdGgubG9nKGNhbWVyYS5mYXIgKyAxKSAvIE1hdGguTE4yKSk7CiAgICAgICAgfQogICAgICAgIGlmIChtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsIHx8IG1hdGVyaWFsLmlzTWVzaFRvb25NYXRlcmlhbCB8fCBtYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgfHwgbWF0ZXJpYWwuaXNNZXNoQmFzaWNNYXRlcmlhbCB8fCBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8IG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwpIHsKICAgICAgICAgIHBfdW5pZm9ybXMuc2V0VmFsdWUoX2dsLCAiaXNPcnRob2dyYXBoaWMiLCBjYW1lcmEuaXNPcnRob2dyYXBoaWNDYW1lcmEgPT09IHRydWUpOwogICAgICAgIH0KICAgICAgICBpZiAoX2N1cnJlbnRDYW1lcmEgIT09IGNhbWVyYSkgewogICAgICAgICAgX2N1cnJlbnRDYW1lcmEgPSBjYW1lcmE7CiAgICAgICAgICByZWZyZXNoTWF0ZXJpYWwgPSB0cnVlOwogICAgICAgICAgcmVmcmVzaExpZ2h0cyA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvYmplY3QuaXNTa2lubmVkTWVzaCkgewogICAgICAgIHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoX2dsLCBvYmplY3QsICJiaW5kTWF0cml4Iik7CiAgICAgICAgcF91bmlmb3Jtcy5zZXRPcHRpb25hbChfZ2wsIG9iamVjdCwgImJpbmRNYXRyaXhJbnZlcnNlIik7CiAgICAgICAgY29uc3Qgc2tlbGV0b24gPSBvYmplY3Quc2tlbGV0b247CiAgICAgICAgaWYgKHNrZWxldG9uKSB7CiAgICAgICAgICBpZiAoc2tlbGV0b24uYm9uZVRleHR1cmUgPT09IG51bGwpCiAgICAgICAgICAgIHNrZWxldG9uLmNvbXB1dGVCb25lVGV4dHVyZSgpOwogICAgICAgICAgcF91bmlmb3Jtcy5zZXRWYWx1ZShfZ2wsICJib25lVGV4dHVyZSIsIHNrZWxldG9uLmJvbmVUZXh0dXJlLCB0ZXh0dXJlcyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvYmplY3QuaXNCYXRjaGVkTWVzaCkgewogICAgICAgIHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoX2dsLCBvYmplY3QsICJiYXRjaGluZ1RleHR1cmUiKTsKICAgICAgICBwX3VuaWZvcm1zLnNldFZhbHVlKF9nbCwgImJhdGNoaW5nVGV4dHVyZSIsIG9iamVjdC5fbWF0cmljZXNUZXh0dXJlLCB0ZXh0dXJlcyk7CiAgICAgICAgcF91bmlmb3Jtcy5zZXRPcHRpb25hbChfZ2wsIG9iamVjdCwgImJhdGNoaW5nSWRUZXh0dXJlIik7CiAgICAgICAgcF91bmlmb3Jtcy5zZXRWYWx1ZShfZ2wsICJiYXRjaGluZ0lkVGV4dHVyZSIsIG9iamVjdC5faW5kaXJlY3RUZXh0dXJlLCB0ZXh0dXJlcyk7CiAgICAgICAgcF91bmlmb3Jtcy5zZXRPcHRpb25hbChfZ2wsIG9iamVjdCwgImJhdGNoaW5nQ29sb3JUZXh0dXJlIik7CiAgICAgICAgaWYgKG9iamVjdC5fY29sb3JzVGV4dHVyZSAhPT0gbnVsbCkgewogICAgICAgICAgcF91bmlmb3Jtcy5zZXRWYWx1ZShfZ2wsICJiYXRjaGluZ0NvbG9yVGV4dHVyZSIsIG9iamVjdC5fY29sb3JzVGV4dHVyZSwgdGV4dHVyZXMpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7CiAgICAgIGlmIChtb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gIT09IHVuZGVmaW5lZCB8fCBtb3JwaEF0dHJpYnV0ZXMubm9ybWFsICE9PSB1bmRlZmluZWQgfHwgbW9ycGhBdHRyaWJ1dGVzLmNvbG9yICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBtb3JwaHRhcmdldHMudXBkYXRlKG9iamVjdCwgZ2VvbWV0cnksIHByb2dyYW0pOwogICAgICB9CiAgICAgIGlmIChyZWZyZXNoTWF0ZXJpYWwgfHwgbWF0ZXJpYWxQcm9wZXJ0aWVzLnJlY2VpdmVTaGFkb3cgIT09IG9iamVjdC5yZWNlaXZlU2hhZG93KSB7CiAgICAgICAgbWF0ZXJpYWxQcm9wZXJ0aWVzLnJlY2VpdmVTaGFkb3cgPSBvYmplY3QucmVjZWl2ZVNoYWRvdzsKICAgICAgICBwX3VuaWZvcm1zLnNldFZhbHVlKF9nbCwgInJlY2VpdmVTaGFkb3ciLCBvYmplY3QucmVjZWl2ZVNoYWRvdyk7CiAgICAgIH0KICAgICAgaWYgKG1hdGVyaWFsLmlzTWVzaEdvdXJhdWRNYXRlcmlhbCAmJiBtYXRlcmlhbC5lbnZNYXAgIT09IG51bGwpIHsKICAgICAgICBtX3VuaWZvcm1zLmVudk1hcC52YWx1ZSA9IGVudk1hcDsKICAgICAgICBtX3VuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWUgPSBlbnZNYXAuaXNDdWJlVGV4dHVyZSAmJiBlbnZNYXAuaXNSZW5kZXJUYXJnZXRUZXh0dXJlID09PSBmYWxzZSA/IC0xIDogMTsKICAgICAgfQogICAgICBpZiAobWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCAmJiBtYXRlcmlhbC5lbnZNYXAgPT09IG51bGwgJiYgc2NlbmUuZW52aXJvbm1lbnQgIT09IG51bGwpIHsKICAgICAgICBtX3VuaWZvcm1zLmVudk1hcEludGVuc2l0eS52YWx1ZSA9IHNjZW5lLmVudmlyb25tZW50SW50ZW5zaXR5OwogICAgICB9CiAgICAgIGlmIChyZWZyZXNoTWF0ZXJpYWwpIHsKICAgICAgICBwX3VuaWZvcm1zLnNldFZhbHVlKF9nbCwgInRvbmVNYXBwaW5nRXhwb3N1cmUiLCBfdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlKTsKICAgICAgICBpZiAobWF0ZXJpYWxQcm9wZXJ0aWVzLm5lZWRzTGlnaHRzKSB7CiAgICAgICAgICBtYXJrVW5pZm9ybXNMaWdodHNOZWVkc1VwZGF0ZShtX3VuaWZvcm1zLCByZWZyZXNoTGlnaHRzKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZvZyAmJiBtYXRlcmlhbC5mb2cgPT09IHRydWUpIHsKICAgICAgICAgIG1hdGVyaWFscy5yZWZyZXNoRm9nVW5pZm9ybXMobV91bmlmb3JtcywgZm9nKTsKICAgICAgICB9CiAgICAgICAgbWF0ZXJpYWxzLnJlZnJlc2hNYXRlcmlhbFVuaWZvcm1zKG1fdW5pZm9ybXMsIG1hdGVyaWFsLCBfcGl4ZWxSYXRpbywgX2hlaWdodCwgY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnRyYW5zbWlzc2lvblJlbmRlclRhcmdldFtjYW1lcmEuaWRdKTsKICAgICAgICBXZWJHTFVuaWZvcm1zLnVwbG9hZChfZ2wsIGdldFVuaWZvcm1MaXN0KG1hdGVyaWFsUHJvcGVydGllcyksIG1fdW5pZm9ybXMsIHRleHR1cmVzKTsKICAgICAgfQogICAgICBpZiAobWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCAmJiBtYXRlcmlhbC51bmlmb3Jtc05lZWRVcGRhdGUgPT09IHRydWUpIHsKICAgICAgICBXZWJHTFVuaWZvcm1zLnVwbG9hZChfZ2wsIGdldFVuaWZvcm1MaXN0KG1hdGVyaWFsUHJvcGVydGllcyksIG1fdW5pZm9ybXMsIHRleHR1cmVzKTsKICAgICAgICBtYXRlcmlhbC51bmlmb3Jtc05lZWRVcGRhdGUgPSBmYWxzZTsKICAgICAgfQogICAgICBpZiAobWF0ZXJpYWwuaXNTcHJpdGVNYXRlcmlhbCkgewogICAgICAgIHBfdW5pZm9ybXMuc2V0VmFsdWUoX2dsLCAiY2VudGVyIiwgb2JqZWN0LmNlbnRlcik7CiAgICAgIH0KICAgICAgaWYgKHByb2dyYW0ubnVtTXVsdGl2aWV3Vmlld3MgPiAwKSB7CiAgICAgICAgbXVsdGl2aWV3LnVwZGF0ZU9iamVjdE1hdHJpY2VzVW5pZm9ybXMob2JqZWN0LCBjYW1lcmEsIHBfdW5pZm9ybXMpOwogICAgICB9IGVsc2UgewogICAgICAgIHBfdW5pZm9ybXMuc2V0VmFsdWUoX2dsLCAibW9kZWxWaWV3TWF0cml4Iiwgb2JqZWN0Lm1vZGVsVmlld01hdHJpeCk7CiAgICAgICAgcF91bmlmb3Jtcy5zZXRWYWx1ZShfZ2wsICJub3JtYWxNYXRyaXgiLCBvYmplY3Qubm9ybWFsTWF0cml4KTsKICAgICAgfQogICAgICBwX3VuaWZvcm1zLnNldFZhbHVlKF9nbCwgIm1vZGVsTWF0cml4Iiwgb2JqZWN0Lm1hdHJpeFdvcmxkKTsKICAgICAgaWYgKG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgfHwgbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCkgewogICAgICAgIGNvbnN0IGdyb3VwcyA9IG1hdGVyaWFsLnVuaWZvcm1zR3JvdXBzOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDtpIDwgbDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBncm91cCA9IGdyb3Vwc1tpXTsKICAgICAgICAgIHVuaWZvcm1zR3JvdXBzLnVwZGF0ZShncm91cCwgcHJvZ3JhbSk7CiAgICAgICAgICB1bmlmb3Jtc0dyb3Vwcy5iaW5kKGdyb3VwLCBwcm9ncmFtKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHByb2dyYW07CiAgICB9CiAgICBmdW5jdGlvbiBtYXJrVW5pZm9ybXNMaWdodHNOZWVkc1VwZGF0ZSh1bmlmb3JtcywgdmFsdWUpIHsKICAgICAgdW5pZm9ybXMuYW1iaWVudExpZ2h0Q29sb3IubmVlZHNVcGRhdGUgPSB2YWx1ZTsKICAgICAgdW5pZm9ybXMubGlnaHRQcm9iZS5uZWVkc1VwZGF0ZSA9IHZhbHVlOwogICAgICB1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlOwogICAgICB1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZSA9IHZhbHVlOwogICAgICB1bmlmb3Jtcy5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlOwogICAgICB1bmlmb3Jtcy5wb2ludExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZSA9IHZhbHVlOwogICAgICB1bmlmb3Jtcy5zcG90TGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7CiAgICAgIHVuaWZvcm1zLnNwb3RMaWdodFNoYWRvd3MubmVlZHNVcGRhdGUgPSB2YWx1ZTsKICAgICAgdW5pZm9ybXMucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTsKICAgICAgdW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlOwogICAgfQogICAgZnVuY3Rpb24gbWF0ZXJpYWxOZWVkc0xpZ2h0cyhtYXRlcmlhbCkgewogICAgICByZXR1cm4gbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsIHx8IG1hdGVyaWFsLmlzTWVzaFRvb25NYXRlcmlhbCB8fCBtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsIHx8IG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHwgbWF0ZXJpYWwuaXNTaGFkb3dNYXRlcmlhbCB8fCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICYmIG1hdGVyaWFsLmxpZ2h0cyA9PT0gdHJ1ZTsKICAgIH0KICAgIHRoaXMuc2V0VGV4dHVyZTJEID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB3YXJuZWQgPSBmYWxzZTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmUyRCh0ZXh0dXJlLCBzbG90KSB7CiAgICAgICAgaWYgKHRleHR1cmUgJiYgdGV4dHVyZS5pc1dlYkdMUmVuZGVyVGFyZ2V0KSB7CiAgICAgICAgICBpZiAoIXdhcm5lZCkgewogICAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXIuc2V0VGV4dHVyZTJEOiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLiIpOwogICAgICAgICAgICB3YXJuZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgdGV4dHVyZSA9IHRleHR1cmUudGV4dHVyZTsKICAgICAgICB9CiAgICAgICAgdGV4dHVyZXMuc2V0VGV4dHVyZTJEKHRleHR1cmUsIHNsb3QpOwogICAgICB9OwogICAgfSgpOwogICAgdGhpcy5nZXRBY3RpdmVDdWJlRmFjZSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gX2N1cnJlbnRBY3RpdmVDdWJlRmFjZTsKICAgIH07CiAgICB0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBfY3VycmVudEFjdGl2ZU1pcG1hcExldmVsOwogICAgfTsKICAgIHRoaXMuZ2V0UmVuZGVyVGFyZ2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBfY3VycmVudFJlbmRlclRhcmdldDsKICAgIH07CiAgICB0aGlzLnNldFJlbmRlclRhcmdldFRleHR1cmVzID0gZnVuY3Rpb24ocmVuZGVyVGFyZ2V0LCBjb2xvclRleHR1cmUsIGRlcHRoVGV4dHVyZSkgewogICAgICBwcm9wZXJ0aWVzLmdldChyZW5kZXJUYXJnZXQudGV4dHVyZSkuX193ZWJnbFRleHR1cmUgPSBjb2xvclRleHR1cmU7CiAgICAgIHByb3BlcnRpZXMuZ2V0KHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlID0gZGVwdGhUZXh0dXJlOwogICAgICBjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQocmVuZGVyVGFyZ2V0KTsKICAgICAgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX2hhc0V4dGVybmFsVGV4dHVyZXMgPSB0cnVlOwogICAgICByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fYXV0b0FsbG9jYXRlRGVwdGhCdWZmZXIgPSBkZXB0aFRleHR1cmUgPT09IHVuZGVmaW5lZDsKICAgICAgaWYgKCFyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fYXV0b0FsbG9jYXRlRGVwdGhCdWZmZXIgJiYgKCFfY3VycmVudFJlbmRlclRhcmdldCB8fCAhX2N1cnJlbnRSZW5kZXJUYXJnZXQuaXNXZWJHTE11bHRpdmlld1JlbmRlclRhcmdldCkpIHsKICAgICAgICBpZiAoZXh0ZW5zaW9ucy5oYXMoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpID09PSB0cnVlKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFJlbmRlci10by10ZXh0dXJlIGV4dGVuc2lvbiB3YXMgZGlzYWJsZWQgYmVjYXVzZSBhbiBleHRlcm5hbCB0ZXh0dXJlIHdhcyBwcm92aWRlZCIpOwogICAgICAgICAgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3VzZVJlbmRlclRvVGV4dHVyZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIHRoaXMuc2V0UmVuZGVyVGFyZ2V0RnJhbWVidWZmZXIgPSBmdW5jdGlvbihyZW5kZXJUYXJnZXQsIGRlZmF1bHRGcmFtZWJ1ZmZlcikgewogICAgICBjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQocmVuZGVyVGFyZ2V0KTsKICAgICAgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgPSBkZWZhdWx0RnJhbWVidWZmZXI7CiAgICAgIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX191c2VEZWZhdWx0RnJhbWVidWZmZXIgPSBkZWZhdWx0RnJhbWVidWZmZXIgPT09IHVuZGVmaW5lZDsKICAgIH07CiAgICBjb25zdCBfc2NyYXRjaEZyYW1lQnVmZmVyID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7CiAgICB0aGlzLnNldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uKHJlbmRlclRhcmdldCwgYWN0aXZlQ3ViZUZhY2UgPSAwLCBhY3RpdmVNaXBtYXBMZXZlbCA9IDApIHsKICAgICAgaWYgKHJlbmRlclRhcmdldCA9PT0gbnVsbCAmJiB0aGlzLnhyLmlzUHJlc2VudGluZykgewogICAgICAgIHJlbmRlclRhcmdldCA9IHRoaXMueHIuZ2V0UmVuZGVyVGFyZ2V0KCk7CiAgICAgIH0KICAgICAgX2N1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7CiAgICAgIF9jdXJyZW50QWN0aXZlQ3ViZUZhY2UgPSBhY3RpdmVDdWJlRmFjZTsKICAgICAgX2N1cnJlbnRBY3RpdmVNaXBtYXBMZXZlbCA9IGFjdGl2ZU1pcG1hcExldmVsOwogICAgICBsZXQgdXNlRGVmYXVsdEZyYW1lYnVmZmVyID0gdHJ1ZTsKICAgICAgbGV0IGZyYW1lYnVmZmVyID0gbnVsbDsKICAgICAgbGV0IGlzQ3ViZSA9IGZhbHNlOwogICAgICBsZXQgaXNSZW5kZXJUYXJnZXQzRCA9IGZhbHNlOwogICAgICBpZiAocmVuZGVyVGFyZ2V0KSB7CiAgICAgICAgY29uc3QgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KHJlbmRlclRhcmdldCk7CiAgICAgICAgaWYgKHJlbmRlclRhcmdldFByb3BlcnRpZXMuX191c2VEZWZhdWx0RnJhbWVidWZmZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgc3RhdGUuYmluZEZyYW1lYnVmZmVyKF9nbC5GUkFNRUJVRkZFUiwgbnVsbCk7CiAgICAgICAgICB1c2VEZWZhdWx0RnJhbWVidWZmZXIgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgaWYgKHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHRleHR1cmVzLnNldHVwUmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCk7CiAgICAgICAgfSBlbHNlIGlmIChyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9faGFzRXh0ZXJuYWxUZXh0dXJlcykgewogICAgICAgICAgdGV4dHVyZXMucmViaW5kVGV4dHVyZXMocmVuZGVyVGFyZ2V0LCBwcm9wZXJ0aWVzLmdldChyZW5kZXJUYXJnZXQudGV4dHVyZSkuX193ZWJnbFRleHR1cmUsIHByb3BlcnRpZXMuZ2V0KHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlKTsKICAgICAgICB9IGVsc2UgaWYgKHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlcikgewogICAgICAgICAgY29uc3QgZGVwdGhUZXh0dXJlID0gcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZTsKICAgICAgICAgIGlmIChyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fYm91bmREZXB0aFRleHR1cmUgIT09IGRlcHRoVGV4dHVyZSkgewogICAgICAgICAgICBpZiAoZGVwdGhUZXh0dXJlICE9PSBudWxsICYmIHByb3BlcnRpZXMuaGFzKGRlcHRoVGV4dHVyZSkgJiYgKHJlbmRlclRhcmdldC53aWR0aCAhPT0gZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoIHx8IHJlbmRlclRhcmdldC5oZWlnaHQgIT09IGRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQpKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXZWJHTFJlbmRlclRhcmdldDogQXR0YWNoZWQgRGVwdGhUZXh0dXJlIGlzIGluaXRpYWxpemVkIHRvIHRoZSBpbmNvcnJlY3Qgc2l6ZS4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0ZXh0dXJlcy5zZXR1cERlcHRoUmVuZGVyYnVmZmVyKHJlbmRlclRhcmdldCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTsKICAgICAgICBpZiAodGV4dHVyZS5pc0RhdGEzRFRleHR1cmUgfHwgdGV4dHVyZS5pc0RhdGFBcnJheVRleHR1cmUgfHwgdGV4dHVyZS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUpIHsKICAgICAgICAgIGlzUmVuZGVyVGFyZ2V0M0QgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBfX3dlYmdsRnJhbWVidWZmZXIgPSBwcm9wZXJ0aWVzLmdldChyZW5kZXJUYXJnZXQpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjsKICAgICAgICBpZiAocmVuZGVyVGFyZ2V0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KSB7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShfX3dlYmdsRnJhbWVidWZmZXJbYWN0aXZlQ3ViZUZhY2VdKSkgewogICAgICAgICAgICBmcmFtZWJ1ZmZlciA9IF9fd2ViZ2xGcmFtZWJ1ZmZlclthY3RpdmVDdWJlRmFjZV1bYWN0aXZlTWlwbWFwTGV2ZWxdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnJhbWVidWZmZXIgPSBfX3dlYmdsRnJhbWVidWZmZXJbYWN0aXZlQ3ViZUZhY2VdOwogICAgICAgICAgfQogICAgICAgICAgaXNDdWJlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKHJlbmRlclRhcmdldC5zYW1wbGVzID4gMCAmJiB0ZXh0dXJlcy51c2VNdWx0aXNhbXBsZWRSVFQocmVuZGVyVGFyZ2V0KSA9PT0gZmFsc2UpIHsKICAgICAgICAgIGZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQocmVuZGVyVGFyZ2V0KS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KF9fd2ViZ2xGcmFtZWJ1ZmZlcikpIHsKICAgICAgICAgICAgZnJhbWVidWZmZXIgPSBfX3dlYmdsRnJhbWVidWZmZXJbYWN0aXZlTWlwbWFwTGV2ZWxdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZnJhbWVidWZmZXIgPSBfX3dlYmdsRnJhbWVidWZmZXI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9jdXJyZW50Vmlld3BvcnQuY29weShyZW5kZXJUYXJnZXQudmlld3BvcnQpOwogICAgICAgIF9jdXJyZW50U2Npc3Nvci5jb3B5KHJlbmRlclRhcmdldC5zY2lzc29yKTsKICAgICAgICBfY3VycmVudFNjaXNzb3JUZXN0ID0gcmVuZGVyVGFyZ2V0LnNjaXNzb3JUZXN0OwogICAgICB9IGVsc2UgewogICAgICAgIF9jdXJyZW50Vmlld3BvcnQuY29weShfdmlld3BvcnQpLm11bHRpcGx5U2NhbGFyKF9waXhlbFJhdGlvKS5mbG9vcigpOwogICAgICAgIF9jdXJyZW50U2Npc3Nvci5jb3B5KF9zY2lzc29yKS5tdWx0aXBseVNjYWxhcihfcGl4ZWxSYXRpbykuZmxvb3IoKTsKICAgICAgICBfY3VycmVudFNjaXNzb3JUZXN0ID0gX3NjaXNzb3JUZXN0OwogICAgICB9CiAgICAgIGlmIChhY3RpdmVNaXBtYXBMZXZlbCAhPT0gMCkgewogICAgICAgIGZyYW1lYnVmZmVyID0gX3NjcmF0Y2hGcmFtZUJ1ZmZlcjsKICAgICAgfQogICAgICBjb25zdCBmcmFtZWJ1ZmZlckJvdW5kID0gc3RhdGUuYmluZEZyYW1lYnVmZmVyKF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIpOwogICAgICBpZiAoZnJhbWVidWZmZXJCb3VuZCAmJiB1c2VEZWZhdWx0RnJhbWVidWZmZXIpIHsKICAgICAgICBzdGF0ZS5kcmF3QnVmZmVycyhyZW5kZXJUYXJnZXQsIGZyYW1lYnVmZmVyKTsKICAgICAgfQogICAgICBzdGF0ZS52aWV3cG9ydChfY3VycmVudFZpZXdwb3J0KTsKICAgICAgc3RhdGUuc2Npc3NvcihfY3VycmVudFNjaXNzb3IpOwogICAgICBzdGF0ZS5zZXRTY2lzc29yVGVzdChfY3VycmVudFNjaXNzb3JUZXN0KTsKICAgICAgaWYgKGlzQ3ViZSkgewogICAgICAgIGNvbnN0IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQocmVuZGVyVGFyZ2V0LnRleHR1cmUpOwogICAgICAgIF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChfZ2wuRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGFjdGl2ZUN1YmVGYWNlLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgYWN0aXZlTWlwbWFwTGV2ZWwpOwogICAgICB9IGVsc2UgaWYgKGlzUmVuZGVyVGFyZ2V0M0QpIHsKICAgICAgICBjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KHJlbmRlclRhcmdldC50ZXh0dXJlKTsKICAgICAgICBjb25zdCBsYXllciA9IGFjdGl2ZUN1YmVGYWNlOwogICAgICAgIF9nbC5mcmFtZWJ1ZmZlclRleHR1cmVMYXllcihfZ2wuRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIGFjdGl2ZU1pcG1hcExldmVsLCBsYXllcik7CiAgICAgIH0gZWxzZSBpZiAocmVuZGVyVGFyZ2V0ICE9PSBudWxsICYmIGFjdGl2ZU1pcG1hcExldmVsICE9PSAwKSB7CiAgICAgICAgY29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldChyZW5kZXJUYXJnZXQudGV4dHVyZSk7CiAgICAgICAgX2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKF9nbC5GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIGFjdGl2ZU1pcG1hcExldmVsKTsKICAgICAgfQogICAgICBfY3VycmVudE1hdGVyaWFsSWQgPSAtMTsKICAgIH07CiAgICB0aGlzLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHMgPSBmdW5jdGlvbihyZW5kZXJUYXJnZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJ1ZmZlciwgYWN0aXZlQ3ViZUZhY2VJbmRleCkgewogICAgICBpZiAoIShyZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXQpKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LiIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBsZXQgZnJhbWVidWZmZXIgPSBwcm9wZXJ0aWVzLmdldChyZW5kZXJUYXJnZXQpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjsKICAgICAgaWYgKHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCAmJiBhY3RpdmVDdWJlRmFjZUluZGV4ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBmcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyW2FjdGl2ZUN1YmVGYWNlSW5kZXhdOwogICAgICB9CiAgICAgIGlmIChmcmFtZWJ1ZmZlcikgewogICAgICAgIHN0YXRlLmJpbmRGcmFtZWJ1ZmZlcihfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyKTsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlOwogICAgICAgICAgY29uc3QgdGV4dHVyZUZvcm1hdCA9IHRleHR1cmUuZm9ybWF0OwogICAgICAgICAgY29uc3QgdGV4dHVyZVR5cGUgPSB0ZXh0dXJlLnR5cGU7CiAgICAgICAgICBpZiAoIWNhcGFiaWxpdGllcy50ZXh0dXJlRm9ybWF0UmVhZGFibGUodGV4dHVyZUZvcm1hdCkpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFJHQkEgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBmb3JtYXQuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghY2FwYWJpbGl0aWVzLnRleHR1cmVUeXBlUmVhZGFibGUodGV4dHVyZVR5cGUpKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4iKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHggPj0gMCAmJiB4IDw9IHJlbmRlclRhcmdldC53aWR0aCAtIHdpZHRoICYmICh5ID49IDAgJiYgeSA8PSByZW5kZXJUYXJnZXQuaGVpZ2h0IC0gaGVpZ2h0KSkgewogICAgICAgICAgICBfZ2wucmVhZFBpeGVscyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB1dGlscy5jb252ZXJ0KHRleHR1cmVGb3JtYXQpLCB1dGlscy5jb252ZXJ0KHRleHR1cmVUeXBlKSwgYnVmZmVyKTsKICAgICAgICAgIH0KICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgY29uc3QgZnJhbWVidWZmZXIyID0gX2N1cnJlbnRSZW5kZXJUYXJnZXQgIT09IG51bGwgPyBwcm9wZXJ0aWVzLmdldChfY3VycmVudFJlbmRlclRhcmdldCkuX193ZWJnbEZyYW1lYnVmZmVyIDogbnVsbDsKICAgICAgICAgIHN0YXRlLmJpbmRGcmFtZWJ1ZmZlcihfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyMik7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgdGhpcy5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzQXN5bmMgPSBhc3luYyBmdW5jdGlvbihyZW5kZXJUYXJnZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJ1ZmZlciwgYWN0aXZlQ3ViZUZhY2VJbmRleCkgewogICAgICBpZiAoIShyZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXQpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQuIik7CiAgICAgIH0KICAgICAgbGV0IGZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQocmVuZGVyVGFyZ2V0KS5fX3dlYmdsRnJhbWVidWZmZXI7CiAgICAgIGlmIChyZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgJiYgYWN0aXZlQ3ViZUZhY2VJbmRleCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlclthY3RpdmVDdWJlRmFjZUluZGV4XTsKICAgICAgfQogICAgICBpZiAoZnJhbWVidWZmZXIpIHsKICAgICAgICBjb25zdCB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7CiAgICAgICAgY29uc3QgdGV4dHVyZUZvcm1hdCA9IHRleHR1cmUuZm9ybWF0OwogICAgICAgIGNvbnN0IHRleHR1cmVUeXBlID0gdGV4dHVyZS50eXBlOwogICAgICAgIGlmICghY2FwYWJpbGl0aWVzLnRleHR1cmVGb3JtYXRSZWFkYWJsZSh0ZXh0dXJlRm9ybWF0KSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHNBc3luYzogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWNhcGFiaWxpdGllcy50ZXh0dXJlVHlwZVJlYWRhYmxlKHRleHR1cmVUeXBlKSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHNBc3luYzogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKHggPj0gMCAmJiB4IDw9IHJlbmRlclRhcmdldC53aWR0aCAtIHdpZHRoICYmICh5ID49IDAgJiYgeSA8PSByZW5kZXJUYXJnZXQuaGVpZ2h0IC0gaGVpZ2h0KSkgewogICAgICAgICAgc3RhdGUuYmluZEZyYW1lYnVmZmVyKF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIpOwogICAgICAgICAgY29uc3QgZ2xCdWZmZXIgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7CiAgICAgICAgICBfZ2wuYmluZEJ1ZmZlcihfZ2wuUElYRUxfUEFDS19CVUZGRVIsIGdsQnVmZmVyKTsKICAgICAgICAgIF9nbC5idWZmZXJEYXRhKF9nbC5QSVhFTF9QQUNLX0JVRkZFUiwgYnVmZmVyLmJ5dGVMZW5ndGgsIF9nbC5TVFJFQU1fUkVBRCk7CiAgICAgICAgICBfZ2wucmVhZFBpeGVscyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB1dGlscy5jb252ZXJ0KHRleHR1cmVGb3JtYXQpLCB1dGlscy5jb252ZXJ0KHRleHR1cmVUeXBlKSwgMCk7CiAgICAgICAgICBjb25zdCBjdXJyRnJhbWVidWZmZXIgPSBfY3VycmVudFJlbmRlclRhcmdldCAhPT0gbnVsbCA/IHByb3BlcnRpZXMuZ2V0KF9jdXJyZW50UmVuZGVyVGFyZ2V0KS5fX3dlYmdsRnJhbWVidWZmZXIgOiBudWxsOwogICAgICAgICAgc3RhdGUuYmluZEZyYW1lYnVmZmVyKF9nbC5GUkFNRUJVRkZFUiwgY3VyckZyYW1lYnVmZmVyKTsKICAgICAgICAgIGNvbnN0IHN5bmMgPSBfZ2wuZmVuY2VTeW5jKF9nbC5TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURSwgMCk7CiAgICAgICAgICBfZ2wuZmx1c2goKTsKICAgICAgICAgIGF3YWl0IHByb2JlQXN5bmMoX2dsLCBzeW5jLCA0KTsKICAgICAgICAgIF9nbC5iaW5kQnVmZmVyKF9nbC5QSVhFTF9QQUNLX0JVRkZFUiwgZ2xCdWZmZXIpOwogICAgICAgICAgX2dsLmdldEJ1ZmZlclN1YkRhdGEoX2dsLlBJWEVMX1BBQ0tfQlVGRkVSLCAwLCBidWZmZXIpOwogICAgICAgICAgX2dsLmRlbGV0ZUJ1ZmZlcihnbEJ1ZmZlcik7CiAgICAgICAgICBfZ2wuZGVsZXRlU3luYyhzeW5jKTsKICAgICAgICAgIHJldHVybiBidWZmZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzQXN5bmM6IHJlcXVlc3RlZCByZWFkIGJvdW5kcyBhcmUgb3V0IG9mIHJhbmdlLiIpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIHRoaXMuY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlID0gZnVuY3Rpb24odGV4dHVyZSwgcG9zaXRpb24gPSBudWxsLCBsZXZlbCA9IDApIHsKICAgICAgaWYgKHRleHR1cmUuaXNUZXh0dXJlICE9PSB0cnVlKSB7CiAgICAgICAgd2Fybk9uY2UoIldlYkdMUmVuZGVyZXI6IGNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZSBmdW5jdGlvbiBzaWduYXR1cmUgaGFzIGNoYW5nZWQuIik7CiAgICAgICAgcG9zaXRpb24gPSBhcmd1bWVudHNbMF0gfHwgbnVsbDsKICAgICAgICB0ZXh0dXJlID0gYXJndW1lbnRzWzFdOwogICAgICB9CiAgICAgIGNvbnN0IGxldmVsU2NhbGUgPSBNYXRoLnBvdygyLCAtbGV2ZWwpOwogICAgICBjb25zdCB3aWR0aCA9IE1hdGguZmxvb3IodGV4dHVyZS5pbWFnZS53aWR0aCAqIGxldmVsU2NhbGUpOwogICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmZsb29yKHRleHR1cmUuaW1hZ2UuaGVpZ2h0ICogbGV2ZWxTY2FsZSk7CiAgICAgIGNvbnN0IHggPSBwb3NpdGlvbiAhPT0gbnVsbCA/IHBvc2l0aW9uLnggOiAwOwogICAgICBjb25zdCB5ID0gcG9zaXRpb24gIT09IG51bGwgPyBwb3NpdGlvbi55IDogMDsKICAgICAgdGV4dHVyZXMuc2V0VGV4dHVyZTJEKHRleHR1cmUsIDApOwogICAgICBfZ2wuY29weVRleFN1YkltYWdlMkQoX2dsLlRFWFRVUkVfMkQsIGxldmVsLCAwLCAwLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgc3RhdGUudW5iaW5kVGV4dHVyZSgpOwogICAgfTsKICAgIGNvbnN0IF9zcmNGcmFtZWJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgY29uc3QgX2RzdEZyYW1lYnVmZmVyID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7CiAgICB0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlID0gZnVuY3Rpb24oc3JjVGV4dHVyZSwgZHN0VGV4dHVyZSwgc3JjUmVnaW9uID0gbnVsbCwgZHN0UG9zaXRpb24gPSBudWxsLCBzcmNMZXZlbCA9IDAsIGRzdExldmVsID0gbnVsbCkgewogICAgICBpZiAoc3JjVGV4dHVyZS5pc1RleHR1cmUgIT09IHRydWUpIHsKICAgICAgICB3YXJuT25jZSgiV2ViR0xSZW5kZXJlcjogY29weVRleHR1cmVUb1RleHR1cmUgZnVuY3Rpb24gc2lnbmF0dXJlIGhhcyBjaGFuZ2VkLiIpOwogICAgICAgIGRzdFBvc2l0aW9uID0gYXJndW1lbnRzWzBdIHx8IG51bGw7CiAgICAgICAgc3JjVGV4dHVyZSA9IGFyZ3VtZW50c1sxXTsKICAgICAgICBkc3RUZXh0dXJlID0gYXJndW1lbnRzWzJdOwogICAgICAgIGRzdExldmVsID0gYXJndW1lbnRzWzNdIHx8IDA7CiAgICAgICAgc3JjUmVnaW9uID0gbnVsbDsKICAgICAgfQogICAgICBpZiAoZHN0TGV2ZWwgPT09IG51bGwpIHsKICAgICAgICBpZiAoc3JjTGV2ZWwgIT09IDApIHsKICAgICAgICAgIHdhcm5PbmNlKCJXZWJHTFJlbmRlcmVyOiBjb3B5VGV4dHVyZVRvVGV4dHVyZSBmdW5jdGlvbiBzaWduYXR1cmUgaGFzIGNoYW5nZWQgdG8gc3VwcG9ydCBzcmMgYW5kIGRzdCBtaXBtYXAgbGV2ZWxzLiIpOwogICAgICAgICAgZHN0TGV2ZWwgPSBzcmNMZXZlbDsKICAgICAgICAgIHNyY0xldmVsID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZHN0TGV2ZWwgPSAwOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgd2lkdGgsIGhlaWdodCwgZGVwdGgyLCBtaW5YLCBtaW5ZLCBtaW5aOwogICAgICBsZXQgZHN0WCwgZHN0WSwgZHN0WjsKICAgICAgY29uc3QgaW1hZ2UgPSBzcmNUZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgPyBzcmNUZXh0dXJlLm1pcG1hcHNbZHN0TGV2ZWxdIDogc3JjVGV4dHVyZS5pbWFnZTsKICAgICAgaWYgKHNyY1JlZ2lvbiAhPT0gbnVsbCkgewogICAgICAgIHdpZHRoID0gc3JjUmVnaW9uLm1heC54IC0gc3JjUmVnaW9uLm1pbi54OwogICAgICAgIGhlaWdodCA9IHNyY1JlZ2lvbi5tYXgueSAtIHNyY1JlZ2lvbi5taW4ueTsKICAgICAgICBkZXB0aDIgPSBzcmNSZWdpb24uaXNCb3gzID8gc3JjUmVnaW9uLm1heC56IC0gc3JjUmVnaW9uLm1pbi56IDogMTsKICAgICAgICBtaW5YID0gc3JjUmVnaW9uLm1pbi54OwogICAgICAgIG1pblkgPSBzcmNSZWdpb24ubWluLnk7CiAgICAgICAgbWluWiA9IHNyY1JlZ2lvbi5pc0JveDMgPyBzcmNSZWdpb24ubWluLnogOiAwOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGxldmVsU2NhbGUgPSBNYXRoLnBvdygyLCAtc3JjTGV2ZWwpOwogICAgICAgIHdpZHRoID0gTWF0aC5mbG9vcihpbWFnZS53aWR0aCAqIGxldmVsU2NhbGUpOwogICAgICAgIGhlaWdodCA9IE1hdGguZmxvb3IoaW1hZ2UuaGVpZ2h0ICogbGV2ZWxTY2FsZSk7CiAgICAgICAgaWYgKHNyY1RleHR1cmUuaXNEYXRhQXJyYXlUZXh0dXJlKSB7CiAgICAgICAgICBkZXB0aDIgPSBpbWFnZS5kZXB0aDsKICAgICAgICB9IGVsc2UgaWYgKHNyY1RleHR1cmUuaXNEYXRhM0RUZXh0dXJlKSB7CiAgICAgICAgICBkZXB0aDIgPSBNYXRoLmZsb29yKGltYWdlLmRlcHRoICogbGV2ZWxTY2FsZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRlcHRoMiA9IDE7CiAgICAgICAgfQogICAgICAgIG1pblggPSAwOwogICAgICAgIG1pblkgPSAwOwogICAgICAgIG1pblogPSAwOwogICAgICB9CiAgICAgIGlmIChkc3RQb3NpdGlvbiAhPT0gbnVsbCkgewogICAgICAgIGRzdFggPSBkc3RQb3NpdGlvbi54OwogICAgICAgIGRzdFkgPSBkc3RQb3NpdGlvbi55OwogICAgICAgIGRzdFogPSBkc3RQb3NpdGlvbi56OwogICAgICB9IGVsc2UgewogICAgICAgIGRzdFggPSAwOwogICAgICAgIGRzdFkgPSAwOwogICAgICAgIGRzdFogPSAwOwogICAgICB9CiAgICAgIGNvbnN0IGdsRm9ybWF0ID0gdXRpbHMuY29udmVydChkc3RUZXh0dXJlLmZvcm1hdCk7CiAgICAgIGNvbnN0IGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoZHN0VGV4dHVyZS50eXBlKTsKICAgICAgbGV0IGdsVGFyZ2V0OwogICAgICBpZiAoZHN0VGV4dHVyZS5pc0RhdGEzRFRleHR1cmUpIHsKICAgICAgICB0ZXh0dXJlcy5zZXRUZXh0dXJlM0QoZHN0VGV4dHVyZSwgMCk7CiAgICAgICAgZ2xUYXJnZXQgPSBfZ2wuVEVYVFVSRV8zRDsKICAgICAgfSBlbHNlIGlmIChkc3RUZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSB8fCBkc3RUZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSkgewogICAgICAgIHRleHR1cmVzLnNldFRleHR1cmUyREFycmF5KGRzdFRleHR1cmUsIDApOwogICAgICAgIGdsVGFyZ2V0ID0gX2dsLlRFWFRVUkVfMkRfQVJSQVk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGV4dHVyZXMuc2V0VGV4dHVyZTJEKGRzdFRleHR1cmUsIDApOwogICAgICAgIGdsVGFyZ2V0ID0gX2dsLlRFWFRVUkVfMkQ7CiAgICAgIH0KICAgICAgX2dsLnBpeGVsU3RvcmVpKF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCBkc3RUZXh0dXJlLmZsaXBZKTsKICAgICAgX2dsLnBpeGVsU3RvcmVpKF9nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIGRzdFRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSk7CiAgICAgIF9nbC5waXhlbFN0b3JlaShfZ2wuVU5QQUNLX0FMSUdOTUVOVCwgZHN0VGV4dHVyZS51bnBhY2tBbGlnbm1lbnQpOwogICAgICBjb25zdCBjdXJyZW50VW5wYWNrUm93TGVuID0gX2dsLmdldFBhcmFtZXRlcihfZ2wuVU5QQUNLX1JPV19MRU5HVEgpOwogICAgICBjb25zdCBjdXJyZW50VW5wYWNrSW1hZ2VIZWlnaHQgPSBfZ2wuZ2V0UGFyYW1ldGVyKF9nbC5VTlBBQ0tfSU1BR0VfSEVJR0hUKTsKICAgICAgY29uc3QgY3VycmVudFVucGFja1NraXBQaXhlbHMgPSBfZ2wuZ2V0UGFyYW1ldGVyKF9nbC5VTlBBQ0tfU0tJUF9QSVhFTFMpOwogICAgICBjb25zdCBjdXJyZW50VW5wYWNrU2tpcFJvd3MgPSBfZ2wuZ2V0UGFyYW1ldGVyKF9nbC5VTlBBQ0tfU0tJUF9ST1dTKTsKICAgICAgY29uc3QgY3VycmVudFVucGFja1NraXBJbWFnZXMgPSBfZ2wuZ2V0UGFyYW1ldGVyKF9nbC5VTlBBQ0tfU0tJUF9JTUFHRVMpOwogICAgICBfZ2wucGl4ZWxTdG9yZWkoX2dsLlVOUEFDS19ST1dfTEVOR1RILCBpbWFnZS53aWR0aCk7CiAgICAgIF9nbC5waXhlbFN0b3JlaShfZ2wuVU5QQUNLX0lNQUdFX0hFSUdIVCwgaW1hZ2UuaGVpZ2h0KTsKICAgICAgX2dsLnBpeGVsU3RvcmVpKF9nbC5VTlBBQ0tfU0tJUF9QSVhFTFMsIG1pblgpOwogICAgICBfZ2wucGl4ZWxTdG9yZWkoX2dsLlVOUEFDS19TS0lQX1JPV1MsIG1pblkpOwogICAgICBfZ2wucGl4ZWxTdG9yZWkoX2dsLlVOUEFDS19TS0lQX0lNQUdFUywgbWluWik7CiAgICAgIGNvbnN0IGlzU3JjM0QgPSBzcmNUZXh0dXJlLmlzRGF0YUFycmF5VGV4dHVyZSB8fCBzcmNUZXh0dXJlLmlzRGF0YTNEVGV4dHVyZTsKICAgICAgY29uc3QgaXNEc3QzRCA9IGRzdFRleHR1cmUuaXNEYXRhQXJyYXlUZXh0dXJlIHx8IGRzdFRleHR1cmUuaXNEYXRhM0RUZXh0dXJlOwogICAgICBpZiAoc3JjVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSkgewogICAgICAgIGNvbnN0IHNyY1RleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoc3JjVGV4dHVyZSk7CiAgICAgICAgY29uc3QgZHN0VGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldChkc3RUZXh0dXJlKTsKICAgICAgICBjb25zdCBzcmNSZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoc3JjVGV4dHVyZVByb3BlcnRpZXMuX19yZW5kZXJUYXJnZXQpOwogICAgICAgIGNvbnN0IGRzdFJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldChkc3RUZXh0dXJlUHJvcGVydGllcy5fX3JlbmRlclRhcmdldCk7CiAgICAgICAgc3RhdGUuYmluZEZyYW1lYnVmZmVyKF9nbC5SRUFEX0ZSQU1FQlVGRkVSLCBzcmNSZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlcik7CiAgICAgICAgc3RhdGUuYmluZEZyYW1lYnVmZmVyKF9nbC5EUkFXX0ZSQU1FQlVGRkVSLCBkc3RSZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlcik7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IGRlcHRoMjsgaSsrKSB7CiAgICAgICAgICBpZiAoaXNTcmMzRCkgewogICAgICAgICAgICBfZ2wuZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIoX2dsLlJFQURfRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgcHJvcGVydGllcy5nZXQoc3JjVGV4dHVyZSkuX193ZWJnbFRleHR1cmUsIHNyY0xldmVsLCBtaW5aICsgaSk7CiAgICAgICAgICAgIF9nbC5mcmFtZWJ1ZmZlclRleHR1cmVMYXllcihfZ2wuRFJBV19GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBwcm9wZXJ0aWVzLmdldChkc3RUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSwgZHN0TGV2ZWwsIGRzdFogKyBpKTsKICAgICAgICAgIH0KICAgICAgICAgIF9nbC5ibGl0RnJhbWVidWZmZXIobWluWCwgbWluWSwgd2lkdGgsIGhlaWdodCwgZHN0WCwgZHN0WSwgd2lkdGgsIGhlaWdodCwgX2dsLkRFUFRIX0JVRkZFUl9CSVQsIF9nbC5ORUFSRVNUKTsKICAgICAgICB9CiAgICAgICAgc3RhdGUuYmluZEZyYW1lYnVmZmVyKF9nbC5SRUFEX0ZSQU1FQlVGRkVSLCBudWxsKTsKICAgICAgICBzdGF0ZS5iaW5kRnJhbWVidWZmZXIoX2dsLkRSQVdfRlJBTUVCVUZGRVIsIG51bGwpOwogICAgICB9IGVsc2UgaWYgKHNyY0xldmVsICE9PSAwIHx8IHNyY1RleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlIHx8IHByb3BlcnRpZXMuaGFzKHNyY1RleHR1cmUpKSB7CiAgICAgICAgY29uc3Qgc3JjVGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldChzcmNUZXh0dXJlKTsKICAgICAgICBjb25zdCBkc3RUZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KGRzdFRleHR1cmUpOwogICAgICAgIHN0YXRlLmJpbmRGcmFtZWJ1ZmZlcihfZ2wuUkVBRF9GUkFNRUJVRkZFUiwgX3NyY0ZyYW1lYnVmZmVyKTsKICAgICAgICBzdGF0ZS5iaW5kRnJhbWVidWZmZXIoX2dsLkRSQVdfRlJBTUVCVUZGRVIsIF9kc3RGcmFtZWJ1ZmZlcik7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IGRlcHRoMjsgaSsrKSB7CiAgICAgICAgICBpZiAoaXNTcmMzRCkgewogICAgICAgICAgICBfZ2wuZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIoX2dsLlJFQURfRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgc3JjVGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIHNyY0xldmVsLCBtaW5aICsgaSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoX2dsLlJFQURfRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfMkQsIHNyY1RleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBzcmNMZXZlbCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNEc3QzRCkgewogICAgICAgICAgICBfZ2wuZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIoX2dsLkRSQVdfRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZHN0VGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIGRzdExldmVsLCBkc3RaICsgaSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoX2dsLkRSQVdfRlJBTUVCVUZGRVIsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfMkQsIGRzdFRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBkc3RMZXZlbCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3JjTGV2ZWwgIT09IDApIHsKICAgICAgICAgICAgX2dsLmJsaXRGcmFtZWJ1ZmZlcihtaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0LCBkc3RYLCBkc3RZLCB3aWR0aCwgaGVpZ2h0LCBfZ2wuQ09MT1JfQlVGRkVSX0JJVCwgX2dsLk5FQVJFU1QpOwogICAgICAgICAgfSBlbHNlIGlmIChpc0RzdDNEKSB7CiAgICAgICAgICAgIF9nbC5jb3B5VGV4U3ViSW1hZ2UzRChnbFRhcmdldCwgZHN0TGV2ZWwsIGRzdFgsIGRzdFksIGRzdFogKyBpLCBtaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9nbC5jb3B5VGV4U3ViSW1hZ2UyRChnbFRhcmdldCwgZHN0TGV2ZWwsIGRzdFgsIGRzdFksIG1pblgsIG1pblksIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdGF0ZS5iaW5kRnJhbWVidWZmZXIoX2dsLlJFQURfRlJBTUVCVUZGRVIsIG51bGwpOwogICAgICAgIHN0YXRlLmJpbmRGcmFtZWJ1ZmZlcihfZ2wuRFJBV19GUkFNRUJVRkZFUiwgbnVsbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlzRHN0M0QpIHsKICAgICAgICAgIGlmIChzcmNUZXh0dXJlLmlzRGF0YVRleHR1cmUgfHwgc3JjVGV4dHVyZS5pc0RhdGEzRFRleHR1cmUpIHsKICAgICAgICAgICAgX2dsLnRleFN1YkltYWdlM0QoZ2xUYXJnZXQsIGRzdExldmVsLCBkc3RYLCBkc3RZLCBkc3RaLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aDIsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEpOwogICAgICAgICAgfSBlbHNlIGlmIChkc3RUZXh0dXJlLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSkgewogICAgICAgICAgICBfZ2wuY29tcHJlc3NlZFRleFN1YkltYWdlM0QoZ2xUYXJnZXQsIGRzdExldmVsLCBkc3RYLCBkc3RZLCBkc3RaLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aDIsIGdsRm9ybWF0LCBpbWFnZS5kYXRhKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9nbC50ZXhTdWJJbWFnZTNEKGdsVGFyZ2V0LCBkc3RMZXZlbCwgZHN0WCwgZHN0WSwgZHN0Wiwgd2lkdGgsIGhlaWdodCwgZGVwdGgyLCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChzcmNUZXh0dXJlLmlzRGF0YVRleHR1cmUpIHsKICAgICAgICAgICAgX2dsLnRleFN1YkltYWdlMkQoX2dsLlRFWFRVUkVfMkQsIGRzdExldmVsLCBkc3RYLCBkc3RZLCB3aWR0aCwgaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZS5kYXRhKTsKICAgICAgICAgIH0gZWxzZSBpZiAoc3JjVGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlKSB7CiAgICAgICAgICAgIF9nbC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRChfZ2wuVEVYVFVSRV8yRCwgZHN0TGV2ZWwsIGRzdFgsIGRzdFksIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIGdsRm9ybWF0LCBpbWFnZS5kYXRhKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9nbC50ZXhTdWJJbWFnZTJEKF9nbC5URVhUVVJFXzJELCBkc3RMZXZlbCwgZHN0WCwgZHN0WSwgd2lkdGgsIGhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBfZ2wucGl4ZWxTdG9yZWkoX2dsLlVOUEFDS19ST1dfTEVOR1RILCBjdXJyZW50VW5wYWNrUm93TGVuKTsKICAgICAgX2dsLnBpeGVsU3RvcmVpKF9nbC5VTlBBQ0tfSU1BR0VfSEVJR0hULCBjdXJyZW50VW5wYWNrSW1hZ2VIZWlnaHQpOwogICAgICBfZ2wucGl4ZWxTdG9yZWkoX2dsLlVOUEFDS19TS0lQX1BJWEVMUywgY3VycmVudFVucGFja1NraXBQaXhlbHMpOwogICAgICBfZ2wucGl4ZWxTdG9yZWkoX2dsLlVOUEFDS19TS0lQX1JPV1MsIGN1cnJlbnRVbnBhY2tTa2lwUm93cyk7CiAgICAgIF9nbC5waXhlbFN0b3JlaShfZ2wuVU5QQUNLX1NLSVBfSU1BR0VTLCBjdXJyZW50VW5wYWNrU2tpcEltYWdlcyk7CiAgICAgIGlmIChkc3RMZXZlbCA9PT0gMCAmJiBkc3RUZXh0dXJlLmdlbmVyYXRlTWlwbWFwcykgewogICAgICAgIF9nbC5nZW5lcmF0ZU1pcG1hcChnbFRhcmdldCk7CiAgICAgIH0KICAgICAgc3RhdGUudW5iaW5kVGV4dHVyZSgpOwogICAgfTsKICAgIHRoaXMuY29weVRleHR1cmVUb1RleHR1cmUzRCA9IGZ1bmN0aW9uKHNyY1RleHR1cmUsIGRzdFRleHR1cmUsIHNyY1JlZ2lvbiA9IG51bGwsIGRzdFBvc2l0aW9uID0gbnVsbCwgbGV2ZWwgPSAwKSB7CiAgICAgIGlmIChzcmNUZXh0dXJlLmlzVGV4dHVyZSAhPT0gdHJ1ZSkgewogICAgICAgIHdhcm5PbmNlKCJXZWJHTFJlbmRlcmVyOiBjb3B5VGV4dHVyZVRvVGV4dHVyZTNEIGZ1bmN0aW9uIHNpZ25hdHVyZSBoYXMgY2hhbmdlZC4iKTsKICAgICAgICBzcmNSZWdpb24gPSBhcmd1bWVudHNbMF0gfHwgbnVsbDsKICAgICAgICBkc3RQb3NpdGlvbiA9IGFyZ3VtZW50c1sxXSB8fCBudWxsOwogICAgICAgIHNyY1RleHR1cmUgPSBhcmd1bWVudHNbMl07CiAgICAgICAgZHN0VGV4dHVyZSA9IGFyZ3VtZW50c1szXTsKICAgICAgICBsZXZlbCA9IGFyZ3VtZW50c1s0XSB8fCAwOwogICAgICB9CiAgICAgIHdhcm5PbmNlKCdXZWJHTFJlbmRlcmVyOiBjb3B5VGV4dHVyZVRvVGV4dHVyZTNEIGZ1bmN0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAiY29weVRleHR1cmVUb1RleHR1cmUiIGluc3RlYWQuJyk7CiAgICAgIHJldHVybiB0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlKHNyY1RleHR1cmUsIGRzdFRleHR1cmUsIHNyY1JlZ2lvbiwgZHN0UG9zaXRpb24sIGxldmVsKTsKICAgIH07CiAgICB0aGlzLmluaXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlvbih0YXJnZXQpIHsKICAgICAgaWYgKHByb3BlcnRpZXMuZ2V0KHRhcmdldCkuX193ZWJnbEZyYW1lYnVmZmVyID09PSB1bmRlZmluZWQpIHsKICAgICAgICB0ZXh0dXJlcy5zZXR1cFJlbmRlclRhcmdldCh0YXJnZXQpOwogICAgICB9CiAgICB9OwogICAgdGhpcy5pbml0VGV4dHVyZSA9IGZ1bmN0aW9uKHRleHR1cmUpIHsKICAgICAgaWYgKHRleHR1cmUuaXNDdWJlVGV4dHVyZSkgewogICAgICAgIHRleHR1cmVzLnNldFRleHR1cmVDdWJlKHRleHR1cmUsIDApOwogICAgICB9IGVsc2UgaWYgKHRleHR1cmUuaXNEYXRhM0RUZXh0dXJlKSB7CiAgICAgICAgdGV4dHVyZXMuc2V0VGV4dHVyZTNEKHRleHR1cmUsIDApOwogICAgICB9IGVsc2UgaWYgKHRleHR1cmUuaXNEYXRhQXJyYXlUZXh0dXJlIHx8IHRleHR1cmUuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlKSB7CiAgICAgICAgdGV4dHVyZXMuc2V0VGV4dHVyZTJEQXJyYXkodGV4dHVyZSwgMCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGV4dHVyZXMuc2V0VGV4dHVyZTJEKHRleHR1cmUsIDApOwogICAgICB9CiAgICAgIHN0YXRlLnVuYmluZFRleHR1cmUoKTsKICAgIH07CiAgICB0aGlzLnJlc2V0U3RhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgX2N1cnJlbnRBY3RpdmVDdWJlRmFjZSA9IDA7CiAgICAgIF9jdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWwgPSAwOwogICAgICBfY3VycmVudFJlbmRlclRhcmdldCA9IG51bGw7CiAgICAgIHN0YXRlLnJlc2V0KCk7CiAgICAgIGJpbmRpbmdTdGF0ZXMucmVzZXQoKTsKICAgIH07CiAgICBpZiAodHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIiwgeyBkZXRhaWw6IHRoaXMgfSkpOwogICAgfQogIH0KICBnZXQgY29vcmRpbmF0ZVN5c3RlbSgpIHsKICAgIHJldHVybiBXZWJHTENvb3JkaW5hdGVTeXN0ZW07CiAgfQogIGdldCBvdXRwdXRDb2xvclNwYWNlKCkgewogICAgcmV0dXJuIHRoaXMuX291dHB1dENvbG9yU3BhY2U7CiAgfQogIHNldCBvdXRwdXRDb2xvclNwYWNlKGNvbG9yU3BhY2UpIHsKICAgIHRoaXMuX291dHB1dENvbG9yU3BhY2UgPSBjb2xvclNwYWNlOwogICAgY29uc3QgZ2wgPSB0aGlzLmdldENvbnRleHQoKTsKICAgIGdsLmRyYXdpbmdCdWZmZXJDb2xvcnNwYWNlID0gQ29sb3JNYW5hZ2VtZW50Ll9nZXREcmF3aW5nQnVmZmVyQ29sb3JTcGFjZShjb2xvclNwYWNlKTsKICAgIGdsLnVucGFja0NvbG9yU3BhY2UgPSBDb2xvck1hbmFnZW1lbnQuX2dldFVucGFja0NvbG9yU3BhY2UoKTsKICB9Cn0KdmFyIGFscGhhaGFzaF9mcmFnbWVudCA9IGAjaWZkZWYgVVNFX0FMUEhBSEFTSAoJaWYgKCBkaWZmdXNlQ29sb3IuYSA8IGdldEFscGhhSGFzaFRocmVzaG9sZCggdlBvc2l0aW9uICkgKSBkaXNjYXJkOwojZW5kaWZgLCBhbHBoYWhhc2hfcGFyc19mcmFnbWVudCA9IGAjaWZkZWYgVVNFX0FMUEhBSEFTSAoJY29uc3QgZmxvYXQgQUxQSEFfSEFTSF9TQ0FMRSA9IDAuMDU7CglmbG9hdCBoYXNoMkQoIHZlYzIgdmFsdWUgKSB7CgkJcmV0dXJuIGZyYWN0KCAxLjBlNCAqIHNpbiggMTcuMCAqIHZhbHVlLnggKyAwLjEgKiB2YWx1ZS55ICkgKiAoIDAuMSArIGFicyggc2luKCAxMy4wICogdmFsdWUueSArIHZhbHVlLnggKSApICkgKTsKCX0KCWZsb2F0IGhhc2gzRCggdmVjMyB2YWx1ZSApIHsKCQlyZXR1cm4gaGFzaDJEKCB2ZWMyKCBoYXNoMkQoIHZhbHVlLnh5ICksIHZhbHVlLnogKSApOwoJfQoJZmxvYXQgZ2V0QWxwaGFIYXNoVGhyZXNob2xkKCB2ZWMzIHBvc2l0aW9uICkgewoJCWZsb2F0IG1heERlcml2ID0gbWF4KAoJCQlsZW5ndGgoIGRGZHgoIHBvc2l0aW9uLnh5eiApICksCgkJCWxlbmd0aCggZEZkeSggcG9zaXRpb24ueHl6ICkgKQoJCSk7CgkJZmxvYXQgcGl4U2NhbGUgPSAxLjAgLyAoIEFMUEhBX0hBU0hfU0NBTEUgKiBtYXhEZXJpdiApOwoJCXZlYzIgcGl4U2NhbGVzID0gdmVjMigKCQkJZXhwMiggZmxvb3IoIGxvZzIoIHBpeFNjYWxlICkgKSApLAoJCQlleHAyKCBjZWlsKCBsb2cyKCBwaXhTY2FsZSApICkgKQoJCSk7CgkJdmVjMiBhbHBoYSA9IHZlYzIoCgkJCWhhc2gzRCggZmxvb3IoIHBpeFNjYWxlcy54ICogcG9zaXRpb24ueHl6ICkgKSwKCQkJaGFzaDNEKCBmbG9vciggcGl4U2NhbGVzLnkgKiBwb3NpdGlvbi54eXogKSApCgkJKTsKCQlmbG9hdCBsZXJwRmFjdG9yID0gZnJhY3QoIGxvZzIoIHBpeFNjYWxlICkgKTsKCQlmbG9hdCB4ID0gKCAxLjAgLSBsZXJwRmFjdG9yICkgKiBhbHBoYS54ICsgbGVycEZhY3RvciAqIGFscGhhLnk7CgkJZmxvYXQgYSA9IG1pbiggbGVycEZhY3RvciwgMS4wIC0gbGVycEZhY3RvciApOwoJCXZlYzMgY2FzZXMgPSB2ZWMzKAoJCQl4ICogeCAvICggMi4wICogYSAqICggMS4wIC0gYSApICksCgkJCSggeCAtIDAuNSAqIGEgKSAvICggMS4wIC0gYSApLAoJCQkxLjAgLSAoICggMS4wIC0geCApICogKCAxLjAgLSB4ICkgLyAoIDIuMCAqIGEgKiAoIDEuMCAtIGEgKSApICkKCQkpOwoJCWZsb2F0IHRocmVzaG9sZCA9ICggeCA8ICggMS4wIC0gYSApICkKCQkJPyAoICggeCA8IGEgKSA/IGNhc2VzLnggOiBjYXNlcy55ICkKCQkJOiBjYXNlcy56OwoJCXJldHVybiBjbGFtcCggdGhyZXNob2xkICwgMS4wZS02LCAxLjAgKTsKCX0KI2VuZGlmYCwgYWxwaGFtYXBfZnJhZ21lbnQgPSBgI2lmZGVmIFVTRV9BTFBIQU1BUAoJZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdkFscGhhTWFwVXYgKS5nOwojZW5kaWZgLCBhbHBoYW1hcF9wYXJzX2ZyYWdtZW50ID0gYCNpZmRlZiBVU0VfQUxQSEFNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwOwojZW5kaWZgLCBhbHBoYXRlc3RfZnJhZ21lbnQgPSBgI2lmZGVmIFVTRV9BTFBIQVRFU1QKCSNpZmRlZiBBTFBIQV9UT19DT1ZFUkFHRQoJZGlmZnVzZUNvbG9yLmEgPSBzbW9vdGhzdGVwKCBhbHBoYVRlc3QsIGFscGhhVGVzdCArIGZ3aWR0aCggZGlmZnVzZUNvbG9yLmEgKSwgZGlmZnVzZUNvbG9yLmEgKTsKCWlmICggZGlmZnVzZUNvbG9yLmEgPT0gMC4wICkgZGlzY2FyZDsKCSNlbHNlCglpZiAoIGRpZmZ1c2VDb2xvci5hIDwgYWxwaGFUZXN0ICkgZGlzY2FyZDsKCSNlbmRpZgojZW5kaWZgLCBhbHBoYXRlc3RfcGFyc19mcmFnbWVudCA9IGAjaWZkZWYgVVNFX0FMUEhBVEVTVAoJdW5pZm9ybSBmbG9hdCBhbHBoYVRlc3Q7CiNlbmRpZmAsIGFvbWFwX2ZyYWdtZW50ID0gYCNpZmRlZiBVU0VfQU9NQVAKCWZsb2F0IGFtYmllbnRPY2NsdXNpb24gPSAoIHRleHR1cmUyRCggYW9NYXAsIHZBb01hcFV2ICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gYW1iaWVudE9jY2x1c2lvbjsKCSNpZiBkZWZpbmVkKCBVU0VfQ0xFQVJDT0FUICkgCgkJY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdCAqPSBhbWJpZW50T2NjbHVzaW9uOwoJI2VuZGlmCgkjaWYgZGVmaW5lZCggVVNFX1NIRUVOICkgCgkJc2hlZW5TcGVjdWxhckluZGlyZWN0ICo9IGFtYmllbnRPY2NsdXNpb247CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggU1RBTkRBUkQgKQoJCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciApICk7CgkJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqPSBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5yb3VnaG5lc3MgKTsKCSNlbmRpZgojZW5kaWZgLCBhb21hcF9wYXJzX2ZyYWdtZW50ID0gYCNpZmRlZiBVU0VfQU9NQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGFvTWFwOwoJdW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTsKI2VuZGlmYCwgYmF0Y2hpbmdfcGFyc192ZXJ0ZXggPSBgI2lmZGVmIFVTRV9CQVRDSElORwoJI2lmICEgZGVmaW5lZCggR0xfQU5HTEVfbXVsdGlfZHJhdyApCgkjZGVmaW5lIGdsX0RyYXdJRCBfZ2xfRHJhd0lECgl1bmlmb3JtIGludCBfZ2xfRHJhd0lEOwoJI2VuZGlmCgl1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBiYXRjaGluZ1RleHR1cmU7Cgl1bmlmb3JtIGhpZ2hwIHVzYW1wbGVyMkQgYmF0Y2hpbmdJZFRleHR1cmU7CgltYXQ0IGdldEJhdGNoaW5nTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nVGV4dHVyZSwgMCApLng7CgkJaW50IGogPSBpbnQoIGkgKSAqIDQ7CgkJaW50IHggPSBqICUgc2l6ZTsKCQlpbnQgeSA9IGogLyBzaXplOwoJCXZlYzQgdjEgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4LCB5ICksIDAgKTsKCQl2ZWM0IHYyID0gdGV4ZWxGZXRjaCggYmF0Y2hpbmdUZXh0dXJlLCBpdmVjMiggeCArIDEsIHkgKSwgMCApOwoJCXZlYzQgdjMgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4ICsgMiwgeSApLCAwICk7CgkJdmVjNCB2NCA9IHRleGVsRmV0Y2goIGJhdGNoaW5nVGV4dHVyZSwgaXZlYzIoIHggKyAzLCB5ICksIDAgKTsKCQlyZXR1cm4gbWF0NCggdjEsIHYyLCB2MywgdjQgKTsKCX0KCWZsb2F0IGdldEluZGlyZWN0SW5kZXgoIGNvbnN0IGluIGludCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nSWRUZXh0dXJlLCAwICkueDsKCQlpbnQgeCA9IGkgJSBzaXplOwoJCWludCB5ID0gaSAvIHNpemU7CgkJcmV0dXJuIGZsb2F0KCB0ZXhlbEZldGNoKCBiYXRjaGluZ0lkVGV4dHVyZSwgaXZlYzIoIHgsIHkgKSwgMCApLnIgKTsKCX0KI2VuZGlmCiNpZmRlZiBVU0VfQkFUQ0hJTkdfQ09MT1IKCXVuaWZvcm0gc2FtcGxlcjJEIGJhdGNoaW5nQ29sb3JUZXh0dXJlOwoJdmVjMyBnZXRCYXRjaGluZ0NvbG9yKCBjb25zdCBpbiBmbG9hdCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nQ29sb3JUZXh0dXJlLCAwICkueDsKCQlpbnQgaiA9IGludCggaSApOwoJCWludCB4ID0gaiAlIHNpemU7CgkJaW50IHkgPSBqIC8gc2l6ZTsKCQlyZXR1cm4gdGV4ZWxGZXRjaCggYmF0Y2hpbmdDb2xvclRleHR1cmUsIGl2ZWMyKCB4LCB5ICksIDAgKS5yZ2I7Cgl9CiNlbmRpZmAsIGJhdGNoaW5nX3ZlcnRleCA9IGAjaWZkZWYgVVNFX0JBVENISU5HCgltYXQ0IGJhdGNoaW5nTWF0cml4ID0gZ2V0QmF0Y2hpbmdNYXRyaXgoIGdldEluZGlyZWN0SW5kZXgoIGdsX0RyYXdJRCApICk7CiNlbmRpZmAsIGJlZ2luX3ZlcnRleCA9IGB2ZWMzIHRyYW5zZm9ybWVkID0gdmVjMyggcG9zaXRpb24gKTsKI2lmZGVmIFVTRV9BTFBIQUhBU0gKCXZQb3NpdGlvbiA9IHZlYzMoIHBvc2l0aW9uICk7CiNlbmRpZmAsIGJlZ2lubm9ybWFsX3ZlcnRleCA9IGB2ZWMzIG9iamVjdE5vcm1hbCA9IHZlYzMoIG5vcm1hbCApOwojaWZkZWYgVVNFX1RBTkdFTlQKCXZlYzMgb2JqZWN0VGFuZ2VudCA9IHZlYzMoIHRhbmdlbnQueHl6ICk7CiNlbmRpZmAsIGJzZGZzID0gYGZsb2F0IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKSB7CglyZXR1cm4gMC4yNTsKfQpmbG9hdCBEX0JsaW5uUGhvbmcoIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7CglyZXR1cm4gUkVDSVBST0NBTF9QSSAqICggc2hpbmluZXNzICogMC41ICsgMS4wICkgKiBwb3coIGRvdE5ILCBzaGluaW5lc3MgKTsKfQp2ZWMzIEJSREZfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVjMyBsaWdodERpciwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7Cgl2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGxpZ2h0RGlyICsgdmlld0RpciApOwoJZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApOwoJZmxvYXQgZG90VkggPSBzYXR1cmF0ZSggZG90KCB2aWV3RGlyLCBoYWxmRGlyICkgKTsKCXZlYzMgRiA9IEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgMS4wLCBkb3RWSCApOwoJZmxvYXQgRyA9IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKTsKCWZsb2F0IEQgPSBEX0JsaW5uUGhvbmcoIHNoaW5pbmVzcywgZG90TkggKTsKCXJldHVybiBGICogKCBHICogRCApOwp9IC8vIHZhbGlkYXRlZGAsIGlyaWRlc2NlbmNlX2ZyYWdtZW50ID0gYCNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCWNvbnN0IG1hdDMgWFlaX1RPX1JFQzcwOSA9IG1hdDMoCgkJIDMuMjQwNDU0MiwgLTAuOTY5MjY2MCwgIDAuMDU1NjQzNCwKCQktMS41MzcxMzg1LCAgMS44NzYwMTA4LCAtMC4yMDQwMjU5LAoJCS0wLjQ5ODUzMTQsICAwLjA0MTU1NjAsICAxLjA1NzIyNTIKCSk7Cgl2ZWMzIEZyZXNuZWwwVG9Jb3IoIHZlYzMgZnJlc25lbDAgKSB7CgkJdmVjMyBzcXJ0RjAgPSBzcXJ0KCBmcmVzbmVsMCApOwoJCXJldHVybiAoIHZlYzMoIDEuMCApICsgc3FydEYwICkgLyAoIHZlYzMoIDEuMCApIC0gc3FydEYwICk7Cgl9Cgl2ZWMzIElvclRvRnJlc25lbDAoIHZlYzMgdHJhbnNtaXR0ZWRJb3IsIGZsb2F0IGluY2lkZW50SW9yICkgewoJCXJldHVybiBwb3cyKCAoIHRyYW5zbWl0dGVkSW9yIC0gdmVjMyggaW5jaWRlbnRJb3IgKSApIC8gKCB0cmFuc21pdHRlZElvciArIHZlYzMoIGluY2lkZW50SW9yICkgKSApOwoJfQoJZmxvYXQgSW9yVG9GcmVzbmVsMCggZmxvYXQgdHJhbnNtaXR0ZWRJb3IsIGZsb2F0IGluY2lkZW50SW9yICkgewoJCXJldHVybiBwb3cyKCAoIHRyYW5zbWl0dGVkSW9yIC0gaW5jaWRlbnRJb3IgKSAvICggdHJhbnNtaXR0ZWRJb3IgKyBpbmNpZGVudElvciApKTsKCX0KCXZlYzMgZXZhbFNlbnNpdGl2aXR5KCBmbG9hdCBPUEQsIHZlYzMgc2hpZnQgKSB7CgkJZmxvYXQgcGhhc2UgPSAyLjAgKiBQSSAqIE9QRCAqIDEuMGUtOTsKCQl2ZWMzIHZhbCA9IHZlYzMoIDUuNDg1NmUtMTMsIDQuNDIwMWUtMTMsIDUuMjQ4MWUtMTMgKTsKCQl2ZWMzIHBvcyA9IHZlYzMoIDEuNjgxMGUrMDYsIDEuNzk1M2UrMDYsIDIuMjA4NGUrMDYgKTsKCQl2ZWMzIHZhciA9IHZlYzMoIDQuMzI3OGUrMDksIDkuMzA0NmUrMDksIDYuNjEyMWUrMDkgKTsKCQl2ZWMzIHh5eiA9IHZhbCAqIHNxcnQoIDIuMCAqIFBJICogdmFyICkgKiBjb3MoIHBvcyAqIHBoYXNlICsgc2hpZnQgKSAqIGV4cCggLSBwb3cyKCBwaGFzZSApICogdmFyICk7CgkJeHl6LnggKz0gOS43NDcwZS0xNCAqIHNxcnQoIDIuMCAqIFBJICogNC41MjgyZSswOSApICogY29zKCAyLjIzOTllKzA2ICogcGhhc2UgKyBzaGlmdFsgMCBdICkgKiBleHAoIC0gNC41MjgyZSswOSAqIHBvdzIoIHBoYXNlICkgKTsKCQl4eXogLz0gMS4wNjg1ZS03OwoJCXZlYzMgcmdiID0gWFlaX1RPX1JFQzcwOSAqIHh5ejsKCQlyZXR1cm4gcmdiOwoJfQoJdmVjMyBldmFsSXJpZGVzY2VuY2UoIGZsb2F0IG91dHNpZGVJT1IsIGZsb2F0IGV0YTIsIGZsb2F0IGNvc1RoZXRhMSwgZmxvYXQgdGhpbkZpbG1UaGlja25lc3MsIHZlYzMgYmFzZUYwICkgewoJCXZlYzMgSTsKCQlmbG9hdCBpcmlkZXNjZW5jZUlPUiA9IG1peCggb3V0c2lkZUlPUiwgZXRhMiwgc21vb3Roc3RlcCggMC4wLCAwLjAzLCB0aGluRmlsbVRoaWNrbmVzcyApICk7CgkJZmxvYXQgc2luVGhldGEyU3EgPSBwb3cyKCBvdXRzaWRlSU9SIC8gaXJpZGVzY2VuY2VJT1IgKSAqICggMS4wIC0gcG93MiggY29zVGhldGExICkgKTsKCQlmbG9hdCBjb3NUaGV0YTJTcSA9IDEuMCAtIHNpblRoZXRhMlNxOwoJCWlmICggY29zVGhldGEyU3EgPCAwLjAgKSB7CgkJCXJldHVybiB2ZWMzKCAxLjAgKTsKCQl9CgkJZmxvYXQgY29zVGhldGEyID0gc3FydCggY29zVGhldGEyU3EgKTsKCQlmbG9hdCBSMCA9IElvclRvRnJlc25lbDAoIGlyaWRlc2NlbmNlSU9SLCBvdXRzaWRlSU9SICk7CgkJZmxvYXQgUjEyID0gRl9TY2hsaWNrKCBSMCwgMS4wLCBjb3NUaGV0YTEgKTsKCQlmbG9hdCBUMTIxID0gMS4wIC0gUjEyOwoJCWZsb2F0IHBoaTEyID0gMC4wOwoJCWlmICggaXJpZGVzY2VuY2VJT1IgPCBvdXRzaWRlSU9SICkgcGhpMTIgPSBQSTsKCQlmbG9hdCBwaGkyMSA9IFBJIC0gcGhpMTI7CgkJdmVjMyBiYXNlSU9SID0gRnJlc25lbDBUb0lvciggY2xhbXAoIGJhc2VGMCwgMC4wLCAwLjk5OTkgKSApOwkJdmVjMyBSMSA9IElvclRvRnJlc25lbDAoIGJhc2VJT1IsIGlyaWRlc2NlbmNlSU9SICk7CgkJdmVjMyBSMjMgPSBGX1NjaGxpY2soIFIxLCAxLjAsIGNvc1RoZXRhMiApOwoJCXZlYzMgcGhpMjMgPSB2ZWMzKCAwLjAgKTsKCQlpZiAoIGJhc2VJT1JbIDAgXSA8IGlyaWRlc2NlbmNlSU9SICkgcGhpMjNbIDAgXSA9IFBJOwoJCWlmICggYmFzZUlPUlsgMSBdIDwgaXJpZGVzY2VuY2VJT1IgKSBwaGkyM1sgMSBdID0gUEk7CgkJaWYgKCBiYXNlSU9SWyAyIF0gPCBpcmlkZXNjZW5jZUlPUiApIHBoaTIzWyAyIF0gPSBQSTsKCQlmbG9hdCBPUEQgPSAyLjAgKiBpcmlkZXNjZW5jZUlPUiAqIHRoaW5GaWxtVGhpY2tuZXNzICogY29zVGhldGEyOwoJCXZlYzMgcGhpID0gdmVjMyggcGhpMjEgKSArIHBoaTIzOwoJCXZlYzMgUjEyMyA9IGNsYW1wKCBSMTIgKiBSMjMsIDFlLTUsIDAuOTk5OSApOwoJCXZlYzMgcjEyMyA9IHNxcnQoIFIxMjMgKTsKCQl2ZWMzIFJzID0gcG93MiggVDEyMSApICogUjIzIC8gKCB2ZWMzKCAxLjAgKSAtIFIxMjMgKTsKCQl2ZWMzIEMwID0gUjEyICsgUnM7CgkJSSA9IEMwOwoJCXZlYzMgQ20gPSBScyAtIFQxMjE7CgkJZm9yICggaW50IG0gPSAxOyBtIDw9IDI7ICsrIG0gKSB7CgkJCUNtICo9IHIxMjM7CgkJCXZlYzMgU20gPSAyLjAgKiBldmFsU2Vuc2l0aXZpdHkoIGZsb2F0KCBtICkgKiBPUEQsIGZsb2F0KCBtICkgKiBwaGkgKTsKCQkJSSArPSBDbSAqIFNtOwoJCX0KCQlyZXR1cm4gbWF4KCBJLCB2ZWMzKCAwLjAgKSApOwoJfQojZW5kaWZgLCBidW1wbWFwX3BhcnNfZnJhZ21lbnQgPSBgI2lmZGVmIFVTRV9CVU1QTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBidW1wTWFwOwoJdW5pZm9ybSBmbG9hdCBidW1wU2NhbGU7Cgl2ZWMyIGRIZHh5X2Z3ZCgpIHsKCQl2ZWMyIGRTVGR4ID0gZEZkeCggdkJ1bXBNYXBVdiApOwoJCXZlYzIgZFNUZHkgPSBkRmR5KCB2QnVtcE1hcFV2ICk7CgkJZmxvYXQgSGxsID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2QnVtcE1hcFV2ICkueDsKCQlmbG9hdCBkQnggPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZCdW1wTWFwVXYgKyBkU1RkeCApLnggLSBIbGw7CgkJZmxvYXQgZEJ5ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2QnVtcE1hcFV2ICsgZFNUZHkgKS54IC0gSGxsOwoJCXJldHVybiB2ZWMyKCBkQngsIGRCeSApOwoJfQoJdmVjMyBwZXJ0dXJiTm9ybWFsQXJiKCB2ZWMzIHN1cmZfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiBkSGR4eSwgZmxvYXQgZmFjZURpcmVjdGlvbiApIHsKCQl2ZWMzIHZTaWdtYVggPSBub3JtYWxpemUoIGRGZHgoIHN1cmZfcG9zLnh5eiApICk7CgkJdmVjMyB2U2lnbWFZID0gbm9ybWFsaXplKCBkRmR5KCBzdXJmX3Bvcy54eXogKSApOwoJCXZlYzMgdk4gPSBzdXJmX25vcm07CgkJdmVjMyBSMSA9IGNyb3NzKCB2U2lnbWFZLCB2TiApOwoJCXZlYzMgUjIgPSBjcm9zcyggdk4sIHZTaWdtYVggKTsKCQlmbG9hdCBmRGV0ID0gZG90KCB2U2lnbWFYLCBSMSApICogZmFjZURpcmVjdGlvbjsKCQl2ZWMzIHZHcmFkID0gc2lnbiggZkRldCApICogKCBkSGR4eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTsKCQlyZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZEZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7Cgl9CiNlbmRpZmAsIGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudCA9IGAjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAKCXZlYzQgcGxhbmU7CgkjaWZkZWYgQUxQSEFfVE9fQ09WRVJBR0UKCQlmbG9hdCBkaXN0YW5jZVRvUGxhbmUsIGRpc3RhbmNlR3JhZGllbnQ7CgkJZmxvYXQgY2xpcE9wYWNpdHkgPSAxLjA7CgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCWZvciAoIGludCBpID0gMDsgaSA8IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHsKCQkJcGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdOwoJCQlkaXN0YW5jZVRvUGxhbmUgPSAtIGRvdCggdkNsaXBQb3NpdGlvbiwgcGxhbmUueHl6ICkgKyBwbGFuZS53OwoJCQlkaXN0YW5jZUdyYWRpZW50ID0gZndpZHRoKCBkaXN0YW5jZVRvUGxhbmUgKSAvIDIuMDsKCQkJY2xpcE9wYWNpdHkgKj0gc21vb3Roc3RlcCggLSBkaXN0YW5jZUdyYWRpZW50LCBkaXN0YW5jZUdyYWRpZW50LCBkaXN0YW5jZVRvUGxhbmUgKTsKCQkJaWYgKCBjbGlwT3BhY2l0eSA9PSAwLjAgKSBkaXNjYXJkOwoJCX0KCQkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJCSNpZiBVTklPTl9DTElQUElOR19QTEFORVMgPCBOVU1fQ0xJUFBJTkdfUExBTkVTCgkJCWZsb2F0IHVuaW9uQ2xpcE9wYWNpdHkgPSAxLjA7CgkJCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCQkJZm9yICggaW50IGkgPSBVTklPTl9DTElQUElOR19QTEFORVM7IGkgPCBOVU1fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkgewoJCQkJcGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdOwoJCQkJZGlzdGFuY2VUb1BsYW5lID0gLSBkb3QoIHZDbGlwUG9zaXRpb24sIHBsYW5lLnh5eiApICsgcGxhbmUudzsKCQkJCWRpc3RhbmNlR3JhZGllbnQgPSBmd2lkdGgoIGRpc3RhbmNlVG9QbGFuZSApIC8gMi4wOwoJCQkJdW5pb25DbGlwT3BhY2l0eSAqPSAxLjAgLSBzbW9vdGhzdGVwKCAtIGRpc3RhbmNlR3JhZGllbnQsIGRpc3RhbmNlR3JhZGllbnQsIGRpc3RhbmNlVG9QbGFuZSApOwoJCQl9CgkJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkJCWNsaXBPcGFjaXR5ICo9IDEuMCAtIHVuaW9uQ2xpcE9wYWNpdHk7CgkJI2VuZGlmCgkJZGlmZnVzZUNvbG9yLmEgKj0gY2xpcE9wYWNpdHk7CgkJaWYgKCBkaWZmdXNlQ29sb3IuYSA9PSAwLjAgKSBkaXNjYXJkOwoJI2Vsc2UKCQkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0CgkJZm9yICggaW50IGkgPSAwOyBpIDwgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkgewoJCQlwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07CgkJCWlmICggZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSBkaXNjYXJkOwoJCX0KCQkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJCSNpZiBVTklPTl9DTElQUElOR19QTEFORVMgPCBOVU1fQ0xJUFBJTkdfUExBTkVTCgkJCWJvb2wgY2xpcHBlZCA9IHRydWU7CgkJCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCQkJZm9yICggaW50IGkgPSBVTklPTl9DTElQUElOR19QTEFORVM7IGkgPCBOVU1fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkgewoJCQkJcGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdOwoJCQkJY2xpcHBlZCA9ICggZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSAmJiBjbGlwcGVkOwoJCQl9CgkJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkJCWlmICggY2xpcHBlZCApIGRpc2NhcmQ7CgkJI2VuZGlmCgkjZW5kaWYKI2VuZGlmYCwgY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQgPSBgI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwCgl2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjsKCXVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdOwojZW5kaWZgLCBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXggPSBgI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwCgl2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjsKI2VuZGlmYCwgY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCA9IGAjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAKCXZDbGlwUG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwojZW5kaWZgLCBjb2xvcl9mcmFnbWVudCA9IGAjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkKCWRpZmZ1c2VDb2xvciAqPSB2Q29sb3I7CiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApCglkaWZmdXNlQ29sb3IucmdiICo9IHZDb2xvcjsKI2VuZGlmYCwgY29sb3JfcGFyc19mcmFnbWVudCA9IGAjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkKCXZhcnlpbmcgdmVjNCB2Q29sb3I7CiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApCgl2YXJ5aW5nIHZlYzMgdkNvbG9yOwojZW5kaWZgLCBjb2xvcl9wYXJzX3ZlcnRleCA9IGAjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkKCXZhcnlpbmcgdmVjNCB2Q29sb3I7CiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9JTlNUQU5DSU5HX0NPTE9SICkgfHwgZGVmaW5lZCggVVNFX0JBVENISU5HX0NPTE9SICkKCXZhcnlpbmcgdmVjMyB2Q29sb3I7CiNlbmRpZmAsIGNvbG9yX3ZlcnRleCA9IGAjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkKCXZDb2xvciA9IHZlYzQoIDEuMCApOwojZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfSU5TVEFOQ0lOR19DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9CQVRDSElOR19DT0xPUiApCgl2Q29sb3IgPSB2ZWMzKCAxLjAgKTsKI2VuZGlmCiNpZmRlZiBVU0VfQ09MT1IKCXZDb2xvciAqPSBjb2xvcjsKI2VuZGlmCiNpZmRlZiBVU0VfSU5TVEFOQ0lOR19DT0xPUgoJdkNvbG9yLnh5eiAqPSBpbnN0YW5jZUNvbG9yLnh5ejsKI2VuZGlmCiNpZmRlZiBVU0VfQkFUQ0hJTkdfQ09MT1IKCXZlYzMgYmF0Y2hpbmdDb2xvciA9IGdldEJhdGNoaW5nQ29sb3IoIGdldEluZGlyZWN0SW5kZXgoIGdsX0RyYXdJRCApICk7Cgl2Q29sb3IueHl6ICo9IGJhdGNoaW5nQ29sb3IueHl6OwojZW5kaWZgLCBjb21tb24gPSBgI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MwojZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE3OTU4NgojZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ4OTY2CiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4Mzc5MDcKI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0MzA5MTg5NTM1CiNkZWZpbmUgRVBTSUxPTiAxZS02CiNpZm5kZWYgc2F0dXJhdGUKI2RlZmluZSBzYXR1cmF0ZSggYSApIGNsYW1wKCBhLCAwLjAsIDEuMCApCiNlbmRpZgojZGVmaW5lIHdoaXRlQ29tcGxlbWVudCggYSApICggMS4wIC0gc2F0dXJhdGUoIGEgKSApCmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH0KdmVjMyBwb3cyKCBjb25zdCBpbiB2ZWMzIHggKSB7IHJldHVybiB4Kng7IH0KZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9CmZsb2F0IHBvdzQoIGNvbnN0IGluIGZsb2F0IHggKSB7IGZsb2F0IHgyID0geCp4OyByZXR1cm4geDIqeDI7IH0KZmxvYXQgbWF4MyggY29uc3QgaW4gdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9CmZsb2F0IGF2ZXJhZ2UoIGNvbnN0IGluIHZlYzMgdiApIHsgcmV0dXJuIGRvdCggdiwgdmVjMyggMC4zMzMzMzMzICkgKTsgfQpoaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkgewoJY29uc3QgaGlnaHAgZmxvYXQgYSA9IDEyLjk4OTgsIGIgPSA3OC4yMzMsIGMgPSA0Mzc1OC41NDUzOwoJaGlnaHAgZmxvYXQgZHQgPSBkb3QoIHV2Lnh5LCB2ZWMyKCBhLGIgKSApLCBzbiA9IG1vZCggZHQsIFBJICk7CglyZXR1cm4gZnJhY3QoIHNpbiggc24gKSAqIGMgKTsKfQojaWZkZWYgSElHSF9QUkVDSVNJT04KCWZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHsgcmV0dXJuIGxlbmd0aCggdiApOyB9CiNlbHNlCglmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7CgkJZmxvYXQgbWF4Q29tcG9uZW50ID0gbWF4MyggYWJzKCB2ICkgKTsKCQlyZXR1cm4gbGVuZ3RoKCB2IC8gbWF4Q29tcG9uZW50ICkgKiBtYXhDb21wb25lbnQ7Cgl9CiNlbmRpZgpzdHJ1Y3QgSW5jaWRlbnRMaWdodCB7Cgl2ZWMzIGNvbG9yOwoJdmVjMyBkaXJlY3Rpb247Cglib29sIHZpc2libGU7Cn07CnN0cnVjdCBSZWZsZWN0ZWRMaWdodCB7Cgl2ZWMzIGRpcmVjdERpZmZ1c2U7Cgl2ZWMzIGRpcmVjdFNwZWN1bGFyOwoJdmVjMyBpbmRpcmVjdERpZmZ1c2U7Cgl2ZWMzIGluZGlyZWN0U3BlY3VsYXI7Cn07CiNpZmRlZiBVU0VfQUxQSEFIQVNICgl2YXJ5aW5nIHZlYzMgdlBvc2l0aW9uOwojZW5kaWYKdmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHsKCXJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApOwp9CnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkgewoJcmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBkaXIsIDAuMCApICogbWF0cml4ICkueHl6ICk7Cn0KbWF0MyB0cmFuc3Bvc2VNYXQzKCBjb25zdCBpbiBtYXQzIG0gKSB7CgltYXQzIHRtcDsKCXRtcFsgMCBdID0gdmVjMyggbVsgMCBdLngsIG1bIDEgXS54LCBtWyAyIF0ueCApOwoJdG1wWyAxIF0gPSB2ZWMzKCBtWyAwIF0ueSwgbVsgMSBdLnksIG1bIDIgXS55ICk7Cgl0bXBbIDIgXSA9IHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTsKCXJldHVybiB0bXA7Cn0KYm9vbCBpc1BlcnNwZWN0aXZlTWF0cml4KCBtYXQ0IG0gKSB7CglyZXR1cm4gbVsgMiBdWyAzIF0gPT0gLSAxLjA7Cn0KdmVjMiBlcXVpcmVjdFV2KCBpbiB2ZWMzIGRpciApIHsKCWZsb2F0IHUgPSBhdGFuKCBkaXIueiwgZGlyLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41OwoJZmxvYXQgdiA9IGFzaW4oIGNsYW1wKCBkaXIueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41OwoJcmV0dXJuIHZlYzIoIHUsIHYgKTsKfQp2ZWMzIEJSREZfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7CglyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjsKfQp2ZWMzIEZfU2NobGljayggY29uc3QgaW4gdmVjMyBmMCwgY29uc3QgaW4gZmxvYXQgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHsKCWZsb2F0IGZyZXNuZWwgPSBleHAyKCAoIC0gNS41NTQ3MyAqIGRvdFZIIC0gNi45ODMxNiApICogZG90VkggKTsKCXJldHVybiBmMCAqICggMS4wIC0gZnJlc25lbCApICsgKCBmOTAgKiBmcmVzbmVsICk7Cn0KZmxvYXQgRl9TY2hsaWNrKCBjb25zdCBpbiBmbG9hdCBmMCwgY29uc3QgaW4gZmxvYXQgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHsKCWZsb2F0IGZyZXNuZWwgPSBleHAyKCAoIC0gNS41NTQ3MyAqIGRvdFZIIC0gNi45ODMxNiApICogZG90VkggKTsKCXJldHVybiBmMCAqICggMS4wIC0gZnJlc25lbCApICsgKCBmOTAgKiBmcmVzbmVsICk7Cn0gLy8gdmFsaWRhdGVkYCwgY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50ID0gYCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWCgkjZGVmaW5lIGN1YmVVVl9taW5NaXBMZXZlbCA0LjAKCSNkZWZpbmUgY3ViZVVWX21pblRpbGVTaXplIDE2LjAKCWZsb2F0IGdldEZhY2UoIHZlYzMgZGlyZWN0aW9uICkgewoJCXZlYzMgYWJzRGlyZWN0aW9uID0gYWJzKCBkaXJlY3Rpb24gKTsKCQlmbG9hdCBmYWNlID0gLSAxLjA7CgkJaWYgKCBhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi56ICkgewoJCQlpZiAoIGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0aW9uLnkgKQoJCQkJZmFjZSA9IGRpcmVjdGlvbi54ID4gMC4wID8gMC4wIDogMy4wOwoJCQllbHNlCgkJCQlmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxLjAgOiA0LjA7CgkJfSBlbHNlIHsKCQkJaWYgKCBhYnNEaXJlY3Rpb24ueiA+IGFic0RpcmVjdGlvbi55ICkKCQkJCWZhY2UgPSBkaXJlY3Rpb24ueiA+IDAuMCA/IDIuMCA6IDUuMDsKCQkJZWxzZQoJCQkJZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMS4wIDogNC4wOwoJCX0KCQlyZXR1cm4gZmFjZTsKCX0KCXZlYzIgZ2V0VVYoIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBmYWNlICkgewoJCXZlYzIgdXY7CgkJaWYgKCBmYWNlID09IDAuMCApIHsKCQkJdXYgPSB2ZWMyKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnggKTsKCQl9IGVsc2UgaWYgKCBmYWNlID09IDEuMCApIHsKCQkJdXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCAtIGRpcmVjdGlvbi56ICkgLyBhYnMoIGRpcmVjdGlvbi55ICk7CgkJfSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7CgkJCXV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTsKCQl9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHsKCQkJdXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueCApOwoJCX0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkgewoJCQl1diA9IHZlYzIoIC0gZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56ICkgLyBhYnMoIGRpcmVjdGlvbi55ICk7CgkJfSBlbHNlIHsKCQkJdXYgPSB2ZWMyKCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTsKCQl9CgkJcmV0dXJuIDAuNSAqICggdXYgKyAxLjAgKTsKCX0KCXZlYzMgYmlsaW5lYXJDdWJlVVYoIHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBtaXBJbnQgKSB7CgkJZmxvYXQgZmFjZSA9IGdldEZhY2UoIGRpcmVjdGlvbiApOwoJCWZsb2F0IGZpbHRlckludCA9IG1heCggY3ViZVVWX21pbk1pcExldmVsIC0gbWlwSW50LCAwLjAgKTsKCQltaXBJbnQgPSBtYXgoIG1pcEludCwgY3ViZVVWX21pbk1pcExldmVsICk7CgkJZmxvYXQgZmFjZVNpemUgPSBleHAyKCBtaXBJbnQgKTsKCQloaWdocCB2ZWMyIHV2ID0gZ2V0VVYoIGRpcmVjdGlvbiwgZmFjZSApICogKCBmYWNlU2l6ZSAtIDIuMCApICsgMS4wOwoJCWlmICggZmFjZSA+IDIuMCApIHsKCQkJdXYueSArPSBmYWNlU2l6ZTsKCQkJZmFjZSAtPSAzLjA7CgkJfQoJCXV2LnggKz0gZmFjZSAqIGZhY2VTaXplOwoJCXV2LnggKz0gZmlsdGVySW50ICogMy4wICogY3ViZVVWX21pblRpbGVTaXplOwoJCXV2LnkgKz0gNC4wICogKCBleHAyKCBDVUJFVVZfTUFYX01JUCApIC0gZmFjZVNpemUgKTsKCQl1di54ICo9IENVQkVVVl9URVhFTF9XSURUSDsKCQl1di55ICo9IENVQkVVVl9URVhFTF9IRUlHSFQ7CgkJI2lmZGVmIHRleHR1cmUyREdyYWRFWFQKCQkJcmV0dXJuIHRleHR1cmUyREdyYWRFWFQoIGVudk1hcCwgdXYsIHZlYzIoIDAuMCApLCB2ZWMyKCAwLjAgKSApLnJnYjsKCQkjZWxzZQoJCQlyZXR1cm4gdGV4dHVyZTJEKCBlbnZNYXAsIHV2ICkucmdiOwoJCSNlbmRpZgoJfQoJI2RlZmluZSBjdWJlVVZfcjAgMS4wCgkjZGVmaW5lIGN1YmVVVl9tMCAtIDIuMAoJI2RlZmluZSBjdWJlVVZfcjEgMC44CgkjZGVmaW5lIGN1YmVVVl9tMSAtIDEuMAoJI2RlZmluZSBjdWJlVVZfcjQgMC40CgkjZGVmaW5lIGN1YmVVVl9tNCAyLjAKCSNkZWZpbmUgY3ViZVVWX3I1IDAuMzA1CgkjZGVmaW5lIGN1YmVVVl9tNSAzLjAKCSNkZWZpbmUgY3ViZVVWX3I2IDAuMjEKCSNkZWZpbmUgY3ViZVVWX202IDQuMAoJZmxvYXQgcm91Z2huZXNzVG9NaXAoIGZsb2F0IHJvdWdobmVzcyApIHsKCQlmbG9hdCBtaXAgPSAwLjA7CgkJaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3IxICkgewoJCQltaXAgPSAoIGN1YmVVVl9yMCAtIHJvdWdobmVzcyApICogKCBjdWJlVVZfbTEgLSBjdWJlVVZfbTAgKSAvICggY3ViZVVWX3IwIC0gY3ViZVVWX3IxICkgKyBjdWJlVVZfbTA7CgkJfSBlbHNlIGlmICggcm91Z2huZXNzID49IGN1YmVVVl9yNCApIHsKCQkJbWlwID0gKCBjdWJlVVZfcjEgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX200IC0gY3ViZVVWX20xICkgLyAoIGN1YmVVVl9yMSAtIGN1YmVVVl9yNCApICsgY3ViZVVWX20xOwoJCX0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSBjdWJlVVZfcjUgKSB7CgkJCW1pcCA9ICggY3ViZVVWX3I0IC0gcm91Z2huZXNzICkgKiAoIGN1YmVVVl9tNSAtIGN1YmVVVl9tNCApIC8gKCBjdWJlVVZfcjQgLSBjdWJlVVZfcjUgKSArIGN1YmVVVl9tNDsKCQl9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3I2ICkgewoJCQltaXAgPSAoIGN1YmVVVl9yNSAtIHJvdWdobmVzcyApICogKCBjdWJlVVZfbTYgLSBjdWJlVVZfbTUgKSAvICggY3ViZVVWX3I1IC0gY3ViZVVWX3I2ICkgKyBjdWJlVVZfbTU7CgkJfSBlbHNlIHsKCQkJbWlwID0gLSAyLjAgKiBsb2cyKCAxLjE2ICogcm91Z2huZXNzICk7CQl9CgkJcmV0dXJuIG1pcDsKCX0KCXZlYzQgdGV4dHVyZUN1YmVVViggc2FtcGxlcjJEIGVudk1hcCwgdmVjMyBzYW1wbGVEaXIsIGZsb2F0IHJvdWdobmVzcyApIHsKCQlmbG9hdCBtaXAgPSBjbGFtcCggcm91Z2huZXNzVG9NaXAoIHJvdWdobmVzcyApLCBjdWJlVVZfbTAsIENVQkVVVl9NQVhfTUlQICk7CgkJZmxvYXQgbWlwRiA9IGZyYWN0KCBtaXAgKTsKCQlmbG9hdCBtaXBJbnQgPSBmbG9vciggbWlwICk7CgkJdmVjMyBjb2xvcjAgPSBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXIsIG1pcEludCApOwoJCWlmICggbWlwRiA9PSAwLjAgKSB7CgkJCXJldHVybiB2ZWM0KCBjb2xvcjAsIDEuMCApOwoJCX0gZWxzZSB7CgkJCXZlYzMgY29sb3IxID0gYmlsaW5lYXJDdWJlVVYoIGVudk1hcCwgc2FtcGxlRGlyLCBtaXBJbnQgKyAxLjAgKTsKCQkJcmV0dXJuIHZlYzQoIG1peCggY29sb3IwLCBjb2xvcjEsIG1pcEYgKSwgMS4wICk7CgkJfQoJfQojZW5kaWZgLCBkZWZhdWx0bm9ybWFsX3ZlcnRleCA9IGB2ZWMzIHRyYW5zZm9ybWVkTm9ybWFsID0gb2JqZWN0Tm9ybWFsOwojaWZkZWYgVVNFX1RBTkdFTlQKCXZlYzMgdHJhbnNmb3JtZWRUYW5nZW50ID0gb2JqZWN0VGFuZ2VudDsKI2VuZGlmCiNpZmRlZiBVU0VfQkFUQ0hJTkcKCW1hdDMgYm0gPSBtYXQzKCBiYXRjaGluZ01hdHJpeCApOwoJdHJhbnNmb3JtZWROb3JtYWwgLz0gdmVjMyggZG90KCBibVsgMCBdLCBibVsgMCBdICksIGRvdCggYm1bIDEgXSwgYm1bIDEgXSApLCBkb3QoIGJtWyAyIF0sIGJtWyAyIF0gKSApOwoJdHJhbnNmb3JtZWROb3JtYWwgPSBibSAqIHRyYW5zZm9ybWVkTm9ybWFsOwoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJdHJhbnNmb3JtZWRUYW5nZW50ID0gYm0gKiB0cmFuc2Zvcm1lZFRhbmdlbnQ7CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfSU5TVEFOQ0lORwoJbWF0MyBpbSA9IG1hdDMoIGluc3RhbmNlTWF0cml4ICk7Cgl0cmFuc2Zvcm1lZE5vcm1hbCAvPSB2ZWMzKCBkb3QoIGltWyAwIF0sIGltWyAwIF0gKSwgZG90KCBpbVsgMSBdLCBpbVsgMSBdICksIGRvdCggaW1bIDIgXSwgaW1bIDIgXSApICk7Cgl0cmFuc2Zvcm1lZE5vcm1hbCA9IGltICogdHJhbnNmb3JtZWROb3JtYWw7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQl0cmFuc2Zvcm1lZFRhbmdlbnQgPSBpbSAqIHRyYW5zZm9ybWVkVGFuZ2VudDsKCSNlbmRpZgojZW5kaWYKdHJhbnNmb3JtZWROb3JtYWwgPSBub3JtYWxNYXRyaXggKiB0cmFuc2Zvcm1lZE5vcm1hbDsKI2lmZGVmIEZMSVBfU0lERUQKCXRyYW5zZm9ybWVkTm9ybWFsID0gLSB0cmFuc2Zvcm1lZE5vcm1hbDsKI2VuZGlmCiNpZmRlZiBVU0VfVEFOR0VOVAoJdHJhbnNmb3JtZWRUYW5nZW50ID0gKCBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZFRhbmdlbnQsIDAuMCApICkueHl6OwoJI2lmZGVmIEZMSVBfU0lERUQKCQl0cmFuc2Zvcm1lZFRhbmdlbnQgPSAtIHRyYW5zZm9ybWVkVGFuZ2VudDsKCSNlbmRpZgojZW5kaWZgLCBkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXggPSBgI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDsKCXVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50U2NhbGU7Cgl1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7CiNlbmRpZmAsIGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXggPSBgI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVAKCXRyYW5zZm9ybWVkICs9IG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB2RGlzcGxhY2VtZW50TWFwVXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7CiNlbmRpZmAsIGVtaXNzaXZlbWFwX2ZyYWdtZW50ID0gYCNpZmRlZiBVU0VfRU1JU1NJVkVNQVAKCXZlYzQgZW1pc3NpdmVDb2xvciA9IHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZFbWlzc2l2ZU1hcFV2ICk7CgkjaWZkZWYgREVDT0RFX1ZJREVPX1RFWFRVUkVfRU1JU1NJVkUKCQllbWlzc2l2ZUNvbG9yID0gc1JHQlRyYW5zZmVyRU9URiggZW1pc3NpdmVDb2xvciApOwoJI2VuZGlmCgl0b3RhbEVtaXNzaXZlUmFkaWFuY2UgKj0gZW1pc3NpdmVDb2xvci5yZ2I7CiNlbmRpZmAsIGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQgPSBgI2lmZGVmIFVTRV9FTUlTU0lWRU1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7CiNlbmRpZmAsIGNvbG9yc3BhY2VfZnJhZ21lbnQgPSAiZ2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7IiwgY29sb3JzcGFjZV9wYXJzX2ZyYWdtZW50ID0gYHZlYzQgTGluZWFyVHJhbnNmZXJPRVRGKCBpbiB2ZWM0IHZhbHVlICkgewoJcmV0dXJuIHZhbHVlOwp9CnZlYzQgc1JHQlRyYW5zZmVyRU9URiggaW4gdmVjNCB2YWx1ZSApIHsKCXJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHZhbHVlLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHZhbHVlLmEgKTsKfQp2ZWM0IHNSR0JUcmFuc2Zlck9FVEYoIGluIHZlYzQgdmFsdWUgKSB7CglyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS5hICk7Cn1gLCBlbnZtYXBfZnJhZ21lbnQgPSBgI2lmZGVmIFVTRV9FTlZNQVAKCSNpZmRlZiBFTlZfV09STERQT1MKCQl2ZWMzIGNhbWVyYVRvRnJhZzsKCQlpZiAoIGlzT3J0aG9ncmFwaGljICkgewoJCQljYW1lcmFUb0ZyYWcgPSBub3JtYWxpemUoIHZlYzMoIC0gdmlld01hdHJpeFsgMCBdWyAyIF0sIC0gdmlld01hdHJpeFsgMSBdWyAyIF0sIC0gdmlld01hdHJpeFsgMiBdWyAyIF0gKSApOwoJCX0gZWxzZSB7CgkJCWNhbWVyYVRvRnJhZyA9IG5vcm1hbGl6ZSggdldvcmxkUG9zaXRpb24gLSBjYW1lcmFQb3NpdGlvbiApOwoJCX0KCQl2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7CgkJI2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT04KCQkJdmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggY2FtZXJhVG9GcmFnLCB3b3JsZE5vcm1hbCApOwoJCSNlbHNlCgkJCXZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIGNhbWVyYVRvRnJhZywgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApOwoJCSNlbmRpZgoJI2Vsc2UKCQl2ZWMzIHJlZmxlY3RWZWMgPSB2UmVmbGVjdDsKCSNlbmRpZgoJI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkUKCQl2ZWM0IGVudkNvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgZW52TWFwUm90YXRpb24gKiB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICkgKTsKCSNlbHNlCgkJdmVjNCBlbnZDb2xvciA9IHZlYzQoIDAuMCApOwoJI2VuZGlmCgkjaWZkZWYgRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZCgkJb3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgb3V0Z29pbmdMaWdodCAqIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApOwoJI2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX01JWCApCgkJb3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7CgkjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfQUREICkKCQlvdXRnb2luZ0xpZ2h0ICs9IGVudkNvbG9yLnh5eiAqIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHk7CgkjZW5kaWYKI2VuZGlmYCwgZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50ID0gYCNpZmRlZiBVU0VfRU5WTUFQCgl1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTsKCXVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDsKCXVuaWZvcm0gbWF0MyBlbnZNYXBSb3RhdGlvbjsKCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFCgkJdW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7CgkjZWxzZQoJCXVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDsKCSNlbmRpZgoJCiNlbmRpZmAsIGVudm1hcF9wYXJzX2ZyYWdtZW50ID0gYCNpZmRlZiBVU0VfRU5WTUFQCgl1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTsKCSNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIHx8IGRlZmluZWQoIExBTUJFUlQgKQoJCSNkZWZpbmUgRU5WX1dPUkxEUE9TCgkjZW5kaWYKCSNpZmRlZiBFTlZfV09STERQT1MKCQl2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CgkJdW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87CgkjZWxzZQoJCXZhcnlpbmcgdmVjMyB2UmVmbGVjdDsKCSNlbmRpZgojZW5kaWZgLCBlbnZtYXBfcGFyc192ZXJ0ZXggPSBgI2lmZGVmIFVTRV9FTlZNQVAKCSNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIHx8IGRlZmluZWQoIExBTUJFUlQgKQoJCSNkZWZpbmUgRU5WX1dPUkxEUE9TCgkjZW5kaWYKCSNpZmRlZiBFTlZfV09STERQT1MKCQkKCQl2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CgkjZWxzZQoJCXZhcnlpbmcgdmVjMyB2UmVmbGVjdDsKCQl1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbzsKCSNlbmRpZgojZW5kaWZgLCBlbnZtYXBfdmVydGV4ID0gYCNpZmRlZiBVU0VfRU5WTUFQCgkjaWZkZWYgRU5WX1dPUkxEUE9TCgkJdldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejsKCSNlbHNlCgkJdmVjMyBjYW1lcmFUb1ZlcnRleDsKCQlpZiAoIGlzT3J0aG9ncmFwaGljICkgewoJCQljYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggdmVjMyggLSB2aWV3TWF0cml4WyAwIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAxIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAyIF1bIDIgXSApICk7CgkJfSBlbHNlIHsKCQkJY2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHdvcmxkUG9zaXRpb24ueHl6IC0gY2FtZXJhUG9zaXRpb24gKTsKCQl9CgkJdmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7CgkJI2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT04KCQkJdlJlZmxlY3QgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTsKCQkjZWxzZQoJCQl2UmVmbGVjdCA9IHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7CgkJI2VuZGlmCgkjZW5kaWYKI2VuZGlmYCwgZm9nX3ZlcnRleCA9IGAjaWZkZWYgVVNFX0ZPRwoJdkZvZ0RlcHRoID0gLSBtdlBvc2l0aW9uLno7CiNlbmRpZmAsIGZvZ19wYXJzX3ZlcnRleCA9IGAjaWZkZWYgVVNFX0ZPRwoJdmFyeWluZyBmbG9hdCB2Rm9nRGVwdGg7CiNlbmRpZmAsIGZvZ19mcmFnbWVudCA9IGAjaWZkZWYgVVNFX0ZPRwoJI2lmZGVmIEZPR19FWFAyCgkJZmxvYXQgZm9nRmFjdG9yID0gMS4wIC0gZXhwKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogdkZvZ0RlcHRoICogdkZvZ0RlcHRoICk7CgkjZWxzZQoJCWZsb2F0IGZvZ0ZhY3RvciA9IHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgdkZvZ0RlcHRoICk7CgkjZW5kaWYKCWdsX0ZyYWdDb2xvci5yZ2IgPSBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTsKI2VuZGlmYCwgZm9nX3BhcnNfZnJhZ21lbnQgPSBgI2lmZGVmIFVTRV9GT0cKCXVuaWZvcm0gdmVjMyBmb2dDb2xvcjsKCXZhcnlpbmcgZmxvYXQgdkZvZ0RlcHRoOwoJI2lmZGVmIEZPR19FWFAyCgkJdW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5OwoJI2Vsc2UKCQl1bmlmb3JtIGZsb2F0IGZvZ05lYXI7CgkJdW5pZm9ybSBmbG9hdCBmb2dGYXI7CgkjZW5kaWYKI2VuZGlmYCwgZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudCA9IGAjaWZkZWYgVVNFX0dSQURJRU5UTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDsKI2VuZGlmCnZlYzMgZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCB2ZWMzIG5vcm1hbCwgdmVjMyBsaWdodERpcmVjdGlvbiApIHsKCWZsb2F0IGRvdE5MID0gZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7Cgl2ZWMyIGNvb3JkID0gdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApOwoJI2lmZGVmIFVTRV9HUkFESUVOVE1BUAoJCXJldHVybiB2ZWMzKCB0ZXh0dXJlMkQoIGdyYWRpZW50TWFwLCBjb29yZCApLnIgKTsKCSNlbHNlCgkJdmVjMiBmdyA9IGZ3aWR0aCggY29vcmQgKSAqIDAuNTsKCQlyZXR1cm4gbWl4KCB2ZWMzKCAwLjcgKSwgdmVjMyggMS4wICksIHNtb290aHN0ZXAoIDAuNyAtIGZ3LngsIDAuNyArIGZ3LngsIGNvb3JkLnggKSApOwoJI2VuZGlmCn1gLCBsaWdodG1hcF9wYXJzX2ZyYWdtZW50ID0gYCNpZmRlZiBVU0VfTElHSFRNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0TWFwOwoJdW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTsKI2VuZGlmYCwgbGlnaHRzX2xhbWJlcnRfZnJhZ21lbnQgPSBgTGFtYmVydE1hdGVyaWFsIG1hdGVyaWFsOwptYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiOwptYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoID0gc3BlY3VsYXJTdHJlbmd0aDtgLCBsaWdodHNfbGFtYmVydF9wYXJzX2ZyYWdtZW50ID0gYHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwpzdHJ1Y3QgTGFtYmVydE1hdGVyaWFsIHsKCXZlYzMgZGlmZnVzZUNvbG9yOwoJZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDsKfTsKdm9pZCBSRV9EaXJlY3RfTGFtYmVydCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gTGFtYmVydE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlOb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7Cgl2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yOwoJcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQp2b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9MYW1iZXJ0KCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIExhbWJlcnRNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7Cn0KI2RlZmluZSBSRV9EaXJlY3QJCQkJUkVfRGlyZWN0X0xhbWJlcnQKI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2UJCVJFX0luZGlyZWN0RGlmZnVzZV9MYW1iZXJ0YCwgbGlnaHRzX3BhcnNfYmVnaW4gPSBgdW5pZm9ybSBib29sIHJlY2VpdmVTaGFkb3c7CnVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjsKI2lmIGRlZmluZWQoIFVTRV9MSUdIVF9QUk9CRVMgKQoJdW5pZm9ybSB2ZWMzIGxpZ2h0UHJvYmVbIDkgXTsKI2VuZGlmCnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7CglmbG9hdCB4ID0gbm9ybWFsLngsIHkgPSBub3JtYWwueSwgeiA9IG5vcm1hbC56OwoJdmVjMyByZXN1bHQgPSBzaENvZWZmaWNpZW50c1sgMCBdICogMC44ODYyMjc7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDEgXSAqIDIuMCAqIDAuNTExNjY0ICogeTsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6OwoJcmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDQgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHk7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDUgXSAqIDIuMCAqIDAuNDI5MDQzICogeSAqIHo7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDcgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHo7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDggXSAqIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICk7CglyZXR1cm4gcmVzdWx0Owp9CnZlYzMgZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgbGlnaHRQcm9iZVsgOSBdLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHsKCXZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTsKCXZlYzMgaXJyYWRpYW5jZSA9IHNoR2V0SXJyYWRpYW5jZUF0KCB3b3JsZE5vcm1hbCwgbGlnaHRQcm9iZSApOwoJcmV0dXJuIGlycmFkaWFuY2U7Cn0KdmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkgewoJdmVjMyBpcnJhZGlhbmNlID0gYW1iaWVudExpZ2h0Q29sb3I7CglyZXR1cm4gaXJyYWRpYW5jZTsKfQpmbG9hdCBnZXREaXN0YW5jZUF0dGVudWF0aW9uKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHsKCWZsb2F0IGRpc3RhbmNlRmFsbG9mZiA9IDEuMCAvIG1heCggcG93KCBsaWdodERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTsKCWlmICggY3V0b2ZmRGlzdGFuY2UgPiAwLjAgKSB7CgkJZGlzdGFuY2VGYWxsb2ZmICo9IHBvdzIoIHNhdHVyYXRlKCAxLjAgLSBwb3c0KCBsaWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKSApICk7Cgl9CglyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmOwp9CmZsb2F0IGdldFNwb3RBdHRlbnVhdGlvbiggY29uc3QgaW4gZmxvYXQgY29uZUNvc2luZSwgY29uc3QgaW4gZmxvYXQgcGVudW1icmFDb3NpbmUsIGNvbnN0IGluIGZsb2F0IGFuZ2xlQ29zaW5lICkgewoJcmV0dXJuIHNtb290aHN0ZXAoIGNvbmVDb3NpbmUsIHBlbnVtYnJhQ29zaW5lLCBhbmdsZUNvc2luZSApOwp9CiNpZiBOVU1fRElSX0xJR0hUUyA+IDAKCXN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHsKCQl2ZWMzIGRpcmVjdGlvbjsKCQl2ZWMzIGNvbG9yOwoJfTsKCXVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0c1sgTlVNX0RJUl9MSUdIVFMgXTsKCXZvaWQgZ2V0RGlyZWN0aW9uYWxMaWdodEluZm8oIGNvbnN0IGluIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodCwgb3V0IEluY2lkZW50TGlnaHQgbGlnaHQgKSB7CgkJbGlnaHQuY29sb3IgPSBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yOwoJCWxpZ2h0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uOwoJCWxpZ2h0LnZpc2libGUgPSB0cnVlOwoJfQojZW5kaWYKI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwCglzdHJ1Y3QgUG9pbnRMaWdodCB7CgkJdmVjMyBwb3NpdGlvbjsKCQl2ZWMzIGNvbG9yOwoJCWZsb2F0IGRpc3RhbmNlOwoJCWZsb2F0IGRlY2F5OwoJfTsKCXVuaWZvcm0gUG9pbnRMaWdodCBwb2ludExpZ2h0c1sgTlVNX1BPSU5UX0xJR0hUUyBdOwoJdm9pZCBnZXRQb2ludExpZ2h0SW5mbyggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIG91dCBJbmNpZGVudExpZ2h0IGxpZ2h0ICkgewoJCXZlYzMgbFZlY3RvciA9IHBvaW50TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeVBvc2l0aW9uOwoJCWxpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApOwoJCWZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTsKCQlsaWdodC5jb2xvciA9IHBvaW50TGlnaHQuY29sb3I7CgkJbGlnaHQuY29sb3IgKj0gZ2V0RGlzdGFuY2VBdHRlbnVhdGlvbiggbGlnaHREaXN0YW5jZSwgcG9pbnRMaWdodC5kaXN0YW5jZSwgcG9pbnRMaWdodC5kZWNheSApOwoJCWxpZ2h0LnZpc2libGUgPSAoIGxpZ2h0LmNvbG9yICE9IHZlYzMoIDAuMCApICk7Cgl9CiNlbmRpZgojaWYgTlVNX1NQT1RfTElHSFRTID4gMAoJc3RydWN0IFNwb3RMaWdodCB7CgkJdmVjMyBwb3NpdGlvbjsKCQl2ZWMzIGRpcmVjdGlvbjsKCQl2ZWMzIGNvbG9yOwoJCWZsb2F0IGRpc3RhbmNlOwoJCWZsb2F0IGRlY2F5OwoJCWZsb2F0IGNvbmVDb3M7CgkJZmxvYXQgcGVudW1icmFDb3M7Cgl9OwoJdW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07Cgl2b2lkIGdldFNwb3RMaWdodEluZm8oIGNvbnN0IGluIFNwb3RMaWdodCBzcG90TGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgb3V0IEluY2lkZW50TGlnaHQgbGlnaHQgKSB7CgkJdmVjMyBsVmVjdG9yID0gc3BvdExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnlQb3NpdGlvbjsKCQlsaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTsKCQlmbG9hdCBhbmdsZUNvcyA9IGRvdCggbGlnaHQuZGlyZWN0aW9uLCBzcG90TGlnaHQuZGlyZWN0aW9uICk7CgkJZmxvYXQgc3BvdEF0dGVudWF0aW9uID0gZ2V0U3BvdEF0dGVudWF0aW9uKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApOwoJCWlmICggc3BvdEF0dGVudWF0aW9uID4gMC4wICkgewoJCQlmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7CgkJCWxpZ2h0LmNvbG9yID0gc3BvdExpZ2h0LmNvbG9yICogc3BvdEF0dGVudWF0aW9uOwoJCQlsaWdodC5jb2xvciAqPSBnZXREaXN0YW5jZUF0dGVudWF0aW9uKCBsaWdodERpc3RhbmNlLCBzcG90TGlnaHQuZGlzdGFuY2UsIHNwb3RMaWdodC5kZWNheSApOwoJCQlsaWdodC52aXNpYmxlID0gKCBsaWdodC5jb2xvciAhPSB2ZWMzKCAwLjAgKSApOwoJCX0gZWxzZSB7CgkJCWxpZ2h0LmNvbG9yID0gdmVjMyggMC4wICk7CgkJCWxpZ2h0LnZpc2libGUgPSBmYWxzZTsKCQl9Cgl9CiNlbmRpZgojaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwCglzdHJ1Y3QgUmVjdEFyZWFMaWdodCB7CgkJdmVjMyBjb2xvcjsKCQl2ZWMzIHBvc2l0aW9uOwoJCXZlYzMgaGFsZldpZHRoOwoJCXZlYzMgaGFsZkhlaWdodDsKCX07Cgl1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMTsJdW5pZm9ybSBzYW1wbGVyMkQgbHRjXzI7Cgl1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07CiNlbmRpZgojaWYgTlVNX0hFTUlfTElHSFRTID4gMAoJc3RydWN0IEhlbWlzcGhlcmVMaWdodCB7CgkJdmVjMyBkaXJlY3Rpb247CgkJdmVjMyBza3lDb2xvcjsKCQl2ZWMzIGdyb3VuZENvbG9yOwoJfTsKCXVuaWZvcm0gSGVtaXNwaGVyZUxpZ2h0IGhlbWlzcGhlcmVMaWdodHNbIE5VTV9IRU1JX0xJR0hUUyBdOwoJdmVjMyBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBIZW1pc3BoZXJlTGlnaHQgaGVtaUxpZ2h0LCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHsKCQlmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7CgkJZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgPSAwLjUgKiBkb3ROTCArIDAuNTsKCQl2ZWMzIGlycmFkaWFuY2UgPSBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApOwoJCXJldHVybiBpcnJhZGlhbmNlOwoJfQojZW5kaWZgLCBlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudCA9IGAjaWZkZWYgVVNFX0VOVk1BUAoJdmVjMyBnZXRJQkxJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHsKCQkjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVgoJCQl2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7CgkJCXZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIGVudk1hcFJvdGF0aW9uICogd29ybGROb3JtYWwsIDEuMCApOwoJCQlyZXR1cm4gUEkgKiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7CgkJI2Vsc2UKCQkJcmV0dXJuIHZlYzMoIDAuMCApOwoJCSNlbmRpZgoJfQoJdmVjMyBnZXRJQkxSYWRpYW5jZSggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkgewoJCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWCgkJCXZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIC0gdmlld0Rpciwgbm9ybWFsICk7CgkJCXJlZmxlY3RWZWMgPSBub3JtYWxpemUoIG1peCggcmVmbGVjdFZlYywgbm9ybWFsLCByb3VnaG5lc3MgKiByb3VnaG5lc3MpICk7CgkJCXJlZmxlY3RWZWMgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCByZWZsZWN0VmVjLCB2aWV3TWF0cml4ICk7CgkJCXZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIGVudk1hcFJvdGF0aW9uICogcmVmbGVjdFZlYywgcm91Z2huZXNzICk7CgkJCXJldHVybiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7CgkJI2Vsc2UKCQkJcmV0dXJuIHZlYzMoIDAuMCApOwoJCSNlbmRpZgoJfQoJI2lmZGVmIFVTRV9BTklTT1RST1BZCgkJdmVjMyBnZXRJQkxBbmlzb3Ryb3B5UmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBiaXRhbmdlbnQsIGNvbnN0IGluIGZsb2F0IGFuaXNvdHJvcHkgKSB7CgkJCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWCgkJCQl2ZWMzIGJlbnROb3JtYWwgPSBjcm9zcyggYml0YW5nZW50LCB2aWV3RGlyICk7CgkJCQliZW50Tm9ybWFsID0gbm9ybWFsaXplKCBjcm9zcyggYmVudE5vcm1hbCwgYml0YW5nZW50ICkgKTsKCQkJCWJlbnROb3JtYWwgPSBub3JtYWxpemUoIG1peCggYmVudE5vcm1hbCwgbm9ybWFsLCBwb3cyKCBwb3cyKCAxLjAgLSBhbmlzb3Ryb3B5ICogKCAxLjAgLSByb3VnaG5lc3MgKSApICkgKSApOwoJCQkJcmV0dXJuIGdldElCTFJhZGlhbmNlKCB2aWV3RGlyLCBiZW50Tm9ybWFsLCByb3VnaG5lc3MgKTsKCQkJI2Vsc2UKCQkJCXJldHVybiB2ZWMzKCAwLjAgKTsKCQkJI2VuZGlmCgkJfQoJI2VuZGlmCiNlbmRpZmAsIGxpZ2h0c190b29uX2ZyYWdtZW50ID0gYFRvb25NYXRlcmlhbCBtYXRlcmlhbDsKbWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjtgLCBsaWdodHNfdG9vbl9wYXJzX2ZyYWdtZW50ID0gYHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwpzdHJ1Y3QgVG9vbk1hdGVyaWFsIHsKCXZlYzMgZGlmZnVzZUNvbG9yOwp9Owp2b2lkIFJFX0RpcmVjdF9Ub29uKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBUb29uTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJdmVjMyBpcnJhZGlhbmNlID0gZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCBnZW9tZXRyeU5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjsKCXJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7Cn0Kdm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfVG9vbiggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBUb29uTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwp9CiNkZWZpbmUgUkVfRGlyZWN0CQkJCVJFX0RpcmVjdF9Ub29uCiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlCQlSRV9JbmRpcmVjdERpZmZ1c2VfVG9vbmAsIGxpZ2h0c19waG9uZ19mcmFnbWVudCA9IGBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7Cm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7Cm1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBzcGVjdWxhcjsKbWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgPSBzaGluaW5lc3M7Cm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggPSBzcGVjdWxhclN0cmVuZ3RoO2AsIGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50ID0gYHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwpzdHJ1Y3QgQmxpbm5QaG9uZ01hdGVyaWFsIHsKCXZlYzMgZGlmZnVzZUNvbG9yOwoJdmVjMyBzcGVjdWxhckNvbG9yOwoJZmxvYXQgc3BlY3VsYXJTaGluaW5lc3M7CglmbG9hdCBzcGVjdWxhclN0cmVuZ3RoOwp9Owp2b2lkIFJFX0RpcmVjdF9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeU5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTsKCXZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7CglyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwoJcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIEJSREZfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDsKfQp2b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7Cn0KI2RlZmluZSBSRV9EaXJlY3QJCQkJUkVfRGlyZWN0X0JsaW5uUGhvbmcKI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2UJCVJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nYCwgbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50ID0gYFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWw7Cm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2IgKiAoIDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApOwp2ZWMzIGR4eSA9IG1heCggYWJzKCBkRmR4KCBub25QZXJ0dXJiZWROb3JtYWwgKSApLCBhYnMoIGRGZHkoIG5vblBlcnR1cmJlZE5vcm1hbCApICkgKTsKZmxvYXQgZ2VvbWV0cnlSb3VnaG5lc3MgPSBtYXgoIG1heCggZHh5LngsIGR4eS55ICksIGR4eS56ICk7Cm1hdGVyaWFsLnJvdWdobmVzcyA9IG1heCggcm91Z2huZXNzRmFjdG9yLCAwLjA1MjUgKTttYXRlcmlhbC5yb3VnaG5lc3MgKz0gZ2VvbWV0cnlSb3VnaG5lc3M7Cm1hdGVyaWFsLnJvdWdobmVzcyA9IG1pbiggbWF0ZXJpYWwucm91Z2huZXNzLCAxLjAgKTsKI2lmZGVmIElPUgoJbWF0ZXJpYWwuaW9yID0gaW9yOwoJI2lmZGVmIFVTRV9TUEVDVUxBUgoJCWZsb2F0IHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yID0gc3BlY3VsYXJJbnRlbnNpdHk7CgkJdmVjMyBzcGVjdWxhckNvbG9yRmFjdG9yID0gc3BlY3VsYXJDb2xvcjsKCQkjaWZkZWYgVVNFX1NQRUNVTEFSX0NPTE9STUFQCgkJCXNwZWN1bGFyQ29sb3JGYWN0b3IgKj0gdGV4dHVyZTJEKCBzcGVjdWxhckNvbG9yTWFwLCB2U3BlY3VsYXJDb2xvck1hcFV2ICkucmdiOwoJCSNlbmRpZgoJCSNpZmRlZiBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQCgkJCXNwZWN1bGFySW50ZW5zaXR5RmFjdG9yICo9IHRleHR1cmUyRCggc3BlY3VsYXJJbnRlbnNpdHlNYXAsIHZTcGVjdWxhckludGVuc2l0eU1hcFV2ICkuYTsKCQkjZW5kaWYKCQltYXRlcmlhbC5zcGVjdWxhckY5MCA9IG1peCggc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IsIDEuMCwgbWV0YWxuZXNzRmFjdG9yICk7CgkjZWxzZQoJCWZsb2F0IHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yID0gMS4wOwoJCXZlYzMgc3BlY3VsYXJDb2xvckZhY3RvciA9IHZlYzMoIDEuMCApOwoJCW1hdGVyaWFsLnNwZWN1bGFyRjkwID0gMS4wOwoJI2VuZGlmCgltYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCBtaW4oIHBvdzIoICggbWF0ZXJpYWwuaW9yIC0gMS4wICkgLyAoIG1hdGVyaWFsLmlvciArIDEuMCApICkgKiBzcGVjdWxhckNvbG9yRmFjdG9yLCB2ZWMzKCAxLjAgKSApICogc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IsIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApOwojZWxzZQoJbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggdmVjMyggMC4wNCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTsKCW1hdGVyaWFsLnNwZWN1bGFyRjkwID0gMS4wOwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVQKCW1hdGVyaWFsLmNsZWFyY29hdCA9IGNsZWFyY29hdDsKCW1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IGNsZWFyY29hdFJvdWdobmVzczsKCW1hdGVyaWFsLmNsZWFyY29hdEYwID0gdmVjMyggMC4wNCApOwoJbWF0ZXJpYWwuY2xlYXJjb2F0RjkwID0gMS4wOwoJI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVAKCQltYXRlcmlhbC5jbGVhcmNvYXQgKj0gdGV4dHVyZTJEKCBjbGVhcmNvYXRNYXAsIHZDbGVhcmNvYXRNYXBVdiApLng7CgkjZW5kaWYKCSNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUAoJCW1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyAqPSB0ZXh0dXJlMkQoIGNsZWFyY29hdFJvdWdobmVzc01hcCwgdkNsZWFyY29hdFJvdWdobmVzc01hcFV2ICkueTsKCSNlbmRpZgoJbWF0ZXJpYWwuY2xlYXJjb2F0ID0gc2F0dXJhdGUoIG1hdGVyaWFsLmNsZWFyY29hdCApOwltYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBtYXgoIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgMC4wNTI1ICk7CgltYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKz0gZ2VvbWV0cnlSb3VnaG5lc3M7CgltYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBtaW4oIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgMS4wICk7CiNlbmRpZgojaWZkZWYgVVNFX0RJU1BFUlNJT04KCW1hdGVyaWFsLmRpc3BlcnNpb24gPSBkaXNwZXJzaW9uOwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJbWF0ZXJpYWwuaXJpZGVzY2VuY2UgPSBpcmlkZXNjZW5jZTsKCW1hdGVyaWFsLmlyaWRlc2NlbmNlSU9SID0gaXJpZGVzY2VuY2VJT1I7CgkjaWZkZWYgVVNFX0lSSURFU0NFTkNFTUFQCgkJbWF0ZXJpYWwuaXJpZGVzY2VuY2UgKj0gdGV4dHVyZTJEKCBpcmlkZXNjZW5jZU1hcCwgdklyaWRlc2NlbmNlTWFwVXYgKS5yOwoJI2VuZGlmCgkjaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUAoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzID0gKGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bSAtIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bSkgKiB0ZXh0dXJlMkQoIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLCB2SXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdiApLmcgKyBpcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW07CgkjZWxzZQoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlVGhpY2tuZXNzID0gaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX1NIRUVOCgltYXRlcmlhbC5zaGVlbkNvbG9yID0gc2hlZW5Db2xvcjsKCSNpZmRlZiBVU0VfU0hFRU5fQ09MT1JNQVAKCQltYXRlcmlhbC5zaGVlbkNvbG9yICo9IHRleHR1cmUyRCggc2hlZW5Db2xvck1hcCwgdlNoZWVuQ29sb3JNYXBVdiApLnJnYjsKCSNlbmRpZgoJbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgPSBjbGFtcCggc2hlZW5Sb3VnaG5lc3MsIDAuMDcsIDEuMCApOwoJI2lmZGVmIFVTRV9TSEVFTl9ST1VHSE5FU1NNQVAKCQltYXRlcmlhbC5zaGVlblJvdWdobmVzcyAqPSB0ZXh0dXJlMkQoIHNoZWVuUm91Z2huZXNzTWFwLCB2U2hlZW5Sb3VnaG5lc3NNYXBVdiApLmE7CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfQU5JU09UUk9QWQoJI2lmZGVmIFVTRV9BTklTT1RST1BZTUFQCgkJbWF0MiBhbmlzb3Ryb3B5TWF0ID0gbWF0MiggYW5pc290cm9weVZlY3Rvci54LCBhbmlzb3Ryb3B5VmVjdG9yLnksIC0gYW5pc290cm9weVZlY3Rvci55LCBhbmlzb3Ryb3B5VmVjdG9yLnggKTsKCQl2ZWMzIGFuaXNvdHJvcHlQb2xhciA9IHRleHR1cmUyRCggYW5pc290cm9weU1hcCwgdkFuaXNvdHJvcHlNYXBVdiApLnJnYjsKCQl2ZWMyIGFuaXNvdHJvcHlWID0gYW5pc290cm9weU1hdCAqIG5vcm1hbGl6ZSggMi4wICogYW5pc290cm9weVBvbGFyLnJnIC0gdmVjMiggMS4wICkgKSAqIGFuaXNvdHJvcHlQb2xhci5iOwoJI2Vsc2UKCQl2ZWMyIGFuaXNvdHJvcHlWID0gYW5pc290cm9weVZlY3RvcjsKCSNlbmRpZgoJbWF0ZXJpYWwuYW5pc290cm9weSA9IGxlbmd0aCggYW5pc290cm9weVYgKTsKCWlmKCBtYXRlcmlhbC5hbmlzb3Ryb3B5ID09IDAuMCApIHsKCQlhbmlzb3Ryb3B5ViA9IHZlYzIoIDEuMCwgMC4wICk7Cgl9IGVsc2UgewoJCWFuaXNvdHJvcHlWIC89IG1hdGVyaWFsLmFuaXNvdHJvcHk7CgkJbWF0ZXJpYWwuYW5pc290cm9weSA9IHNhdHVyYXRlKCBtYXRlcmlhbC5hbmlzb3Ryb3B5ICk7Cgl9CgltYXRlcmlhbC5hbHBoYVQgPSBtaXgoIHBvdzIoIG1hdGVyaWFsLnJvdWdobmVzcyApLCAxLjAsIHBvdzIoIG1hdGVyaWFsLmFuaXNvdHJvcHkgKSApOwoJbWF0ZXJpYWwuYW5pc290cm9weVQgPSB0Ym5bIDAgXSAqIGFuaXNvdHJvcHlWLnggKyB0Ym5bIDEgXSAqIGFuaXNvdHJvcHlWLnk7CgltYXRlcmlhbC5hbmlzb3Ryb3B5QiA9IHRiblsgMSBdICogYW5pc290cm9weVYueCAtIHRiblsgMCBdICogYW5pc290cm9weVYueTsKI2VuZGlmYCwgbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQgPSBgc3RydWN0IFBoeXNpY2FsTWF0ZXJpYWwgewoJdmVjMyBkaWZmdXNlQ29sb3I7CglmbG9hdCByb3VnaG5lc3M7Cgl2ZWMzIHNwZWN1bGFyQ29sb3I7CglmbG9hdCBzcGVjdWxhckY5MDsKCWZsb2F0IGRpc3BlcnNpb247CgkjaWZkZWYgVVNFX0NMRUFSQ09BVAoJCWZsb2F0IGNsZWFyY29hdDsKCQlmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7CgkJdmVjMyBjbGVhcmNvYXRGMDsKCQlmbG9hdCBjbGVhcmNvYXRGOTA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCQlmbG9hdCBpcmlkZXNjZW5jZTsKCQlmbG9hdCBpcmlkZXNjZW5jZUlPUjsKCQlmbG9hdCBpcmlkZXNjZW5jZVRoaWNrbmVzczsKCQl2ZWMzIGlyaWRlc2NlbmNlRnJlc25lbDsKCQl2ZWMzIGlyaWRlc2NlbmNlRjA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU4KCQl2ZWMzIHNoZWVuQ29sb3I7CgkJZmxvYXQgc2hlZW5Sb3VnaG5lc3M7CgkjZW5kaWYKCSNpZmRlZiBJT1IKCQlmbG9hdCBpb3I7CgkjZW5kaWYKCSNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OCgkJZmxvYXQgdHJhbnNtaXNzaW9uOwoJCWZsb2F0IHRyYW5zbWlzc2lvbkFscGhhOwoJCWZsb2F0IHRoaWNrbmVzczsKCQlmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlOwoJCXZlYzMgYXR0ZW51YXRpb25Db2xvcjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9BTklTT1RST1BZCgkJZmxvYXQgYW5pc290cm9weTsKCQlmbG9hdCBhbHBoYVQ7CgkJdmVjMyBhbmlzb3Ryb3B5VDsKCQl2ZWMzIGFuaXNvdHJvcHlCOwoJI2VuZGlmCn07CnZlYzMgY2xlYXJjb2F0U3BlY3VsYXJEaXJlY3QgPSB2ZWMzKCAwLjAgKTsKdmVjMyBjbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0ID0gdmVjMyggMC4wICk7CnZlYzMgc2hlZW5TcGVjdWxhckRpcmVjdCA9IHZlYzMoIDAuMCApOwp2ZWMzIHNoZWVuU3BlY3VsYXJJbmRpcmVjdCA9IHZlYzMoMC4wICk7CnZlYzMgU2NobGlja190b19GMCggY29uc3QgaW4gdmVjMyBmLCBjb25zdCBpbiBmbG9hdCBmOTAsIGNvbnN0IGluIGZsb2F0IGRvdFZIICkgewogICAgZmxvYXQgeCA9IGNsYW1wKCAxLjAgLSBkb3RWSCwgMC4wLCAxLjAgKTsKICAgIGZsb2F0IHgyID0geCAqIHg7CiAgICBmbG9hdCB4NSA9IGNsYW1wKCB4ICogeDIgKiB4MiwgMC4wLCAwLjk5OTkgKTsKICAgIHJldHVybiAoIGYgLSB2ZWMzKCBmOTAgKSAqIHg1ICkgLyAoIDEuMCAtIHg1ICk7Cn0KZmxvYXQgVl9HR1hfU21pdGhDb3JyZWxhdGVkKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkgewoJZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApOwoJZmxvYXQgZ3YgPSBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApOwoJZmxvYXQgZ2wgPSBkb3ROViAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApOwoJcmV0dXJuIDAuNSAvIG1heCggZ3YgKyBnbCwgRVBTSUxPTiApOwp9CmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7CglmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7CglmbG9hdCBkZW5vbSA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7CglyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTsKfQojaWZkZWYgVVNFX0FOSVNPVFJPUFkKCWZsb2F0IFZfR0dYX1NtaXRoQ29ycmVsYXRlZF9Bbmlzb3Ryb3BpYyggY29uc3QgaW4gZmxvYXQgYWxwaGFULCBjb25zdCBpbiBmbG9hdCBhbHBoYUIsIGNvbnN0IGluIGZsb2F0IGRvdFRWLCBjb25zdCBpbiBmbG9hdCBkb3RCViwgY29uc3QgaW4gZmxvYXQgZG90VEwsIGNvbnN0IGluIGZsb2F0IGRvdEJMLCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7CgkJZmxvYXQgZ3YgPSBkb3ROTCAqIGxlbmd0aCggdmVjMyggYWxwaGFUICogZG90VFYsIGFscGhhQiAqIGRvdEJWLCBkb3ROViApICk7CgkJZmxvYXQgZ2wgPSBkb3ROViAqIGxlbmd0aCggdmVjMyggYWxwaGFUICogZG90VEwsIGFscGhhQiAqIGRvdEJMLCBkb3ROTCApICk7CgkJZmxvYXQgdiA9IDAuNSAvICggZ3YgKyBnbCApOwoJCXJldHVybiBzYXR1cmF0ZSh2KTsKCX0KCWZsb2F0IERfR0dYX0FuaXNvdHJvcGljKCBjb25zdCBpbiBmbG9hdCBhbHBoYVQsIGNvbnN0IGluIGZsb2F0IGFscGhhQiwgY29uc3QgaW4gZmxvYXQgZG90TkgsIGNvbnN0IGluIGZsb2F0IGRvdFRILCBjb25zdCBpbiBmbG9hdCBkb3RCSCApIHsKCQlmbG9hdCBhMiA9IGFscGhhVCAqIGFscGhhQjsKCQloaWdocCB2ZWMzIHYgPSB2ZWMzKCBhbHBoYUIgKiBkb3RUSCwgYWxwaGFUICogZG90QkgsIGEyICogZG90TkggKTsKCQloaWdocCBmbG9hdCB2MiA9IGRvdCggdiwgdiApOwoJCWZsb2F0IHcyID0gYTIgLyB2MjsKCQlyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyICogcG93MiAoIHcyICk7Cgl9CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVAoJdmVjMyBCUkRGX0dHWF9DbGVhcmNvYXQoIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwpIHsKCQl2ZWMzIGYwID0gbWF0ZXJpYWwuY2xlYXJjb2F0RjA7CgkJZmxvYXQgZjkwID0gbWF0ZXJpYWwuY2xlYXJjb2F0RjkwOwoJCWZsb2F0IHJvdWdobmVzcyA9IG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzczsKCQlmbG9hdCBhbHBoYSA9IHBvdzIoIHJvdWdobmVzcyApOwoJCXZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggbGlnaHREaXIgKyB2aWV3RGlyICk7CgkJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGxpZ2h0RGlyICkgKTsKCQlmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7CgkJZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApOwoJCWZsb2F0IGRvdFZIID0gc2F0dXJhdGUoIGRvdCggdmlld0RpciwgaGFsZkRpciApICk7CgkJdmVjMyBGID0gRl9TY2hsaWNrKCBmMCwgZjkwLCBkb3RWSCApOwoJCWZsb2F0IFYgPSBWX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGFscGhhLCBkb3ROTCwgZG90TlYgKTsKCQlmbG9hdCBEID0gRF9HR1goIGFscGhhLCBkb3ROSCApOwoJCXJldHVybiBGICogKCBWICogRCApOwoJfQojZW5kaWYKdmVjMyBCUkRGX0dHWCggY29uc3QgaW4gdmVjMyBsaWdodERpciwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCApIHsKCXZlYzMgZjAgPSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yOwoJZmxvYXQgZjkwID0gbWF0ZXJpYWwuc3BlY3VsYXJGOTA7CglmbG9hdCByb3VnaG5lc3MgPSBtYXRlcmlhbC5yb3VnaG5lc3M7CglmbG9hdCBhbHBoYSA9IHBvdzIoIHJvdWdobmVzcyApOwoJdmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTsKCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBsaWdodERpciApICk7CglmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7CglmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaGFsZkRpciApICk7CglmbG9hdCBkb3RWSCA9IHNhdHVyYXRlKCBkb3QoIHZpZXdEaXIsIGhhbGZEaXIgKSApOwoJdmVjMyBGID0gRl9TY2hsaWNrKCBmMCwgZjkwLCBkb3RWSCApOwoJI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJCUYgPSBtaXgoIEYsIG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2UgKTsKCSNlbmRpZgoJI2lmZGVmIFVTRV9BTklTT1RST1BZCgkJZmxvYXQgZG90VEwgPSBkb3QoIG1hdGVyaWFsLmFuaXNvdHJvcHlULCBsaWdodERpciApOwoJCWZsb2F0IGRvdFRWID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5VCwgdmlld0RpciApOwoJCWZsb2F0IGRvdFRIID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5VCwgaGFsZkRpciApOwoJCWZsb2F0IGRvdEJMID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5QiwgbGlnaHREaXIgKTsKCQlmbG9hdCBkb3RCViA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weUIsIHZpZXdEaXIgKTsKCQlmbG9hdCBkb3RCSCA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weUIsIGhhbGZEaXIgKTsKCQlmbG9hdCBWID0gVl9HR1hfU21pdGhDb3JyZWxhdGVkX0FuaXNvdHJvcGljKCBtYXRlcmlhbC5hbHBoYVQsIGFscGhhLCBkb3RUViwgZG90QlYsIGRvdFRMLCBkb3RCTCwgZG90TlYsIGRvdE5MICk7CgkJZmxvYXQgRCA9IERfR0dYX0FuaXNvdHJvcGljKCBtYXRlcmlhbC5hbHBoYVQsIGFscGhhLCBkb3ROSCwgZG90VEgsIGRvdEJIICk7CgkjZWxzZQoJCWZsb2F0IFYgPSBWX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGFscGhhLCBkb3ROTCwgZG90TlYgKTsKCQlmbG9hdCBEID0gRF9HR1goIGFscGhhLCBkb3ROSCApOwoJI2VuZGlmCglyZXR1cm4gRiAqICggViAqIEQgKTsKfQp2ZWMyIExUQ19VdiggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHsKCWNvbnN0IGZsb2F0IExVVF9TSVpFID0gNjQuMDsKCWNvbnN0IGZsb2F0IExVVF9TQ0FMRSA9ICggTFVUX1NJWkUgLSAxLjAgKSAvIExVVF9TSVpFOwoJY29uc3QgZmxvYXQgTFVUX0JJQVMgPSAwLjUgLyBMVVRfU0laRTsKCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggTiwgViApICk7Cgl2ZWMyIHV2ID0gdmVjMiggcm91Z2huZXNzLCBzcXJ0KCAxLjAgLSBkb3ROViApICk7Cgl1diA9IHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7CglyZXR1cm4gdXY7Cn0KZmxvYXQgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIGYgKSB7CglmbG9hdCBsID0gbGVuZ3RoKCBmICk7CglyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7Cn0KdmVjMyBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgdjEsIGNvbnN0IGluIHZlYzMgdjIgKSB7CglmbG9hdCB4ID0gZG90KCB2MSwgdjIgKTsKCWZsb2F0IHkgPSBhYnMoIHggKTsKCWZsb2F0IGEgPSAwLjg1NDM5ODUgKyAoIDAuNDk2NTE1NSArIDAuMDE0NTIwNiAqIHkgKSAqIHk7CglmbG9hdCBiID0gMy40MTc1OTQwICsgKCA0LjE2MTY3MjQgKyB5ICkgKiB5OwoJZmxvYXQgdiA9IGEgLyBiOwoJZmxvYXQgdGhldGFfc2ludGhldGEgPSAoIHggPiAwLjAgKSA/IHYgOiAwLjUgKiBpbnZlcnNlc3FydCggbWF4KCAxLjAgLSB4ICogeCwgMWUtNyApICkgLSB2OwoJcmV0dXJuIGNyb3NzKCB2MSwgdjIgKSAqIHRoZXRhX3NpbnRoZXRhOwp9CnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkgewoJdmVjMyB2MSA9IHJlY3RDb29yZHNbIDEgXSAtIHJlY3RDb29yZHNbIDAgXTsKCXZlYzMgdjIgPSByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07Cgl2ZWMzIGxpZ2h0Tm9ybWFsID0gY3Jvc3MoIHYxLCB2MiApOwoJaWYoIGRvdCggbGlnaHROb3JtYWwsIFAgLSByZWN0Q29vcmRzWyAwIF0gKSA8IDAuMCApIHJldHVybiB2ZWMzKCAwLjAgKTsKCXZlYzMgVDEsIFQyOwoJVDEgPSBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTsKCVQyID0gLSBjcm9zcyggTiwgVDEgKTsKCW1hdDMgbWF0ID0gbUludiAqIHRyYW5zcG9zZU1hdDMoIG1hdDMoIFQxLCBUMiwgTiApICk7Cgl2ZWMzIGNvb3Jkc1sgNCBdOwoJY29vcmRzWyAwIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDAgXSAtIFAgKTsKCWNvb3Jkc1sgMSBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAxIF0gLSBQICk7Cgljb29yZHNbIDIgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApOwoJY29vcmRzWyAzIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDMgXSAtIFAgKTsKCWNvb3Jkc1sgMCBdID0gbm9ybWFsaXplKCBjb29yZHNbIDAgXSApOwoJY29vcmRzWyAxIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7Cgljb29yZHNbIDIgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAyIF0gKTsKCWNvb3Jkc1sgMyBdID0gbm9ybWFsaXplKCBjb29yZHNbIDMgXSApOwoJdmVjMyB2ZWN0b3JGb3JtRmFjdG9yID0gdmVjMyggMC4wICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAwIF0sIGNvb3Jkc1sgMSBdICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAxIF0sIGNvb3Jkc1sgMiBdICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAzIF0sIGNvb3Jkc1sgMCBdICk7CglmbG9hdCByZXN1bHQgPSBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3RvckZvcm1GYWN0b3IgKTsKCXJldHVybiB2ZWMzKCByZXN1bHQgKTsKfQojaWYgZGVmaW5lZCggVVNFX1NIRUVOICkKZmxvYXQgRF9DaGFybGllKCBmbG9hdCByb3VnaG5lc3MsIGZsb2F0IGRvdE5IICkgewoJZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTsKCWZsb2F0IGludkFscGhhID0gMS4wIC8gYWxwaGE7CglmbG9hdCBjb3MyaCA9IGRvdE5IICogZG90Tkg7CglmbG9hdCBzaW4yaCA9IG1heCggMS4wIC0gY29zMmgsIDAuMDA3ODEyNSApOwoJcmV0dXJuICggMi4wICsgaW52QWxwaGEgKSAqIHBvdyggc2luMmgsIGludkFscGhhICogMC41ICkgLyAoIDIuMCAqIFBJICk7Cn0KZmxvYXQgVl9OZXViZWx0KCBmbG9hdCBkb3ROViwgZmxvYXQgZG90TkwgKSB7CglyZXR1cm4gc2F0dXJhdGUoIDEuMCAvICggNC4wICogKCBkb3ROTCArIGRvdE5WIC0gZG90TkwgKiBkb3ROViApICkgKTsKfQp2ZWMzIEJSREZfU2hlZW4oIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIHZlYzMgc2hlZW5Db2xvciwgY29uc3QgaW4gZmxvYXQgc2hlZW5Sb3VnaG5lc3MgKSB7Cgl2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGxpZ2h0RGlyICsgdmlld0RpciApOwoJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGxpZ2h0RGlyICkgKTsKCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTsKCWZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTsKCWZsb2F0IEQgPSBEX0NoYXJsaWUoIHNoZWVuUm91Z2huZXNzLCBkb3ROSCApOwoJZmxvYXQgViA9IFZfTmV1YmVsdCggZG90TlYsIGRvdE5MICk7CglyZXR1cm4gc2hlZW5Db2xvciAqICggRCAqIFYgKTsKfQojZW5kaWYKZmxvYXQgSUJMU2hlZW5CUkRGKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7CglmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7CglmbG9hdCByMiA9IHJvdWdobmVzcyAqIHJvdWdobmVzczsKCWZsb2F0IGEgPSByb3VnaG5lc3MgPCAwLjI1ID8gLTMzOS4yICogcjIgKyAxNjEuNCAqIHJvdWdobmVzcyAtIDI1LjkgOiAtOC40OCAqIHIyICsgMTQuMyAqIHJvdWdobmVzcyAtIDkuOTU7CglmbG9hdCBiID0gcm91Z2huZXNzIDwgMC4yNSA/IDQ0LjAgKiByMiAtIDIzLjcgKiByb3VnaG5lc3MgKyAzLjI2IDogMS45NyAqIHIyIC0gMy4yNyAqIHJvdWdobmVzcyArIDAuNzI7CglmbG9hdCBERyA9IGV4cCggYSAqIGRvdE5WICsgYiApICsgKCByb3VnaG5lc3MgPCAwLjI1ID8gMC4wIDogMC4xICogKCByb3VnaG5lc3MgLSAwLjI1ICkgKTsKCXJldHVybiBzYXR1cmF0ZSggREcgKiBSRUNJUFJPQ0FMX1BJICk7Cn0KdmVjMiBERkdBcHByb3goIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHsKCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTsKCWNvbnN0IHZlYzQgYzAgPSB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApOwoJY29uc3QgdmVjNCBjMSA9IHZlYzQoIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7Cgl2ZWM0IHIgPSByb3VnaG5lc3MgKiBjMCArIGMxOwoJZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7Cgl2ZWMyIGZhYiA9IHZlYzIoIC0gMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7CglyZXR1cm4gZmFiOwp9CnZlYzMgRW52aXJvbm1lbnRCUkRGKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7Cgl2ZWMyIGZhYiA9IERGR0FwcHJveCggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTsKCXJldHVybiBzcGVjdWxhckNvbG9yICogZmFiLnggKyBzcGVjdWxhckY5MCAqIGZhYi55Owp9CiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKdm9pZCBjb21wdXRlTXVsdGlzY2F0dGVyaW5nSXJpZGVzY2VuY2UoIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc3BlY3VsYXJGOTAsIGNvbnN0IGluIGZsb2F0IGlyaWRlc2NlbmNlLCBjb25zdCBpbiB2ZWMzIGlyaWRlc2NlbmNlRjAsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgaW5vdXQgdmVjMyBzaW5nbGVTY2F0dGVyLCBpbm91dCB2ZWMzIG11bHRpU2NhdHRlciApIHsKI2Vsc2UKdm9pZCBjb21wdXRlTXVsdGlzY2F0dGVyaW5nKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGlub3V0IHZlYzMgc2luZ2xlU2NhdHRlciwgaW5vdXQgdmVjMyBtdWx0aVNjYXR0ZXIgKSB7CiNlbmRpZgoJdmVjMiBmYWIgPSBERkdBcHByb3goIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7CgkjaWZkZWYgVVNFX0lSSURFU0NFTkNFCgkJdmVjMyBGciA9IG1peCggc3BlY3VsYXJDb2xvciwgaXJpZGVzY2VuY2VGMCwgaXJpZGVzY2VuY2UgKTsKCSNlbHNlCgkJdmVjMyBGciA9IHNwZWN1bGFyQ29sb3I7CgkjZW5kaWYKCXZlYzMgRnNzRXNzID0gRnIgKiBmYWIueCArIHNwZWN1bGFyRjkwICogZmFiLnk7CglmbG9hdCBFc3MgPSBmYWIueCArIGZhYi55OwoJZmxvYXQgRW1zID0gMS4wIC0gRXNzOwoJdmVjMyBGYXZnID0gRnIgKyAoIDEuMCAtIEZyICkgKiAwLjA0NzYxOTsJdmVjMyBGbXMgPSBGc3NFc3MgKiBGYXZnIC8gKCAxLjAgLSBFbXMgKiBGYXZnICk7CglzaW5nbGVTY2F0dGVyICs9IEZzc0VzczsKCW11bHRpU2NhdHRlciArPSBGbXMgKiBFbXM7Cn0KI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMAoJdm9pZCBSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwoIGNvbnN0IGluIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CgkJdmVjMyBub3JtYWwgPSBnZW9tZXRyeU5vcm1hbDsKCQl2ZWMzIHZpZXdEaXIgPSBnZW9tZXRyeVZpZXdEaXI7CgkJdmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5UG9zaXRpb247CgkJdmVjMyBsaWdodFBvcyA9IHJlY3RBcmVhTGlnaHQucG9zaXRpb247CgkJdmVjMyBoYWxmV2lkdGggPSByZWN0QXJlYUxpZ2h0LmhhbGZXaWR0aDsKCQl2ZWMzIGhhbGZIZWlnaHQgPSByZWN0QXJlYUxpZ2h0LmhhbGZIZWlnaHQ7CgkJdmVjMyBsaWdodENvbG9yID0gcmVjdEFyZWFMaWdodC5jb2xvcjsKCQlmbG9hdCByb3VnaG5lc3MgPSBtYXRlcmlhbC5yb3VnaG5lc3M7CgkJdmVjMyByZWN0Q29vcmRzWyA0IF07CgkJcmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0OwkJcmVjdENvb3Jkc1sgMSBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0OwoJCXJlY3RDb29yZHNbIDIgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoICsgaGFsZkhlaWdodDsKCQlyZWN0Q29vcmRzWyAzIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7CgkJdmVjMiB1diA9IExUQ19Vdiggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTsKCQl2ZWM0IHQxID0gdGV4dHVyZTJEKCBsdGNfMSwgdXYgKTsKCQl2ZWM0IHQyID0gdGV4dHVyZTJEKCBsdGNfMiwgdXYgKTsKCQltYXQzIG1JbnYgPSBtYXQzKAoJCQl2ZWMzKCB0MS54LCAwLCB0MS55ICksCgkJCXZlYzMoICAgIDAsIDEsICAgIDAgKSwKCQkJdmVjMyggdDEueiwgMCwgdDEudyApCgkJKTsKCQl2ZWMzIGZyZXNuZWwgPSAoIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKiB0Mi54ICsgKCB2ZWMzKCAxLjAgKSAtIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKSAqIHQyLnkgKTsKCQlyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBsaWdodENvbG9yICogZnJlc25lbCAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbUludiwgcmVjdENvb3JkcyApOwoJCXJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gbGlnaHRDb2xvciAqIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbWF0MyggMS4wICksIHJlY3RDb29yZHMgKTsKCX0KI2VuZGlmCnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlOb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7Cgl2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yOwoJI2lmZGVmIFVTRV9DTEVBUkNPQVQKCQlmbG9hdCBkb3ROTGNjID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7CgkJdmVjMyBjY0lycmFkaWFuY2UgPSBkb3ROTGNjICogZGlyZWN0TGlnaHQuY29sb3I7CgkJY2xlYXJjb2F0U3BlY3VsYXJEaXJlY3QgKz0gY2NJcnJhZGlhbmNlICogQlJERl9HR1hfQ2xlYXJjb2F0KCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsICk7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU4KCQlzaGVlblNwZWN1bGFyRGlyZWN0ICs9IGlycmFkaWFuY2UgKiBCUkRGX1NoZWVuKCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnNoZWVuQ29sb3IsIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzICk7CgkjZW5kaWYKCXJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGlycmFkaWFuY2UgKiBCUkRGX0dHWCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbCApOwoJcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQp2b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQp2b2lkIFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgcmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBjbGVhcmNvYXRSYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQpIHsKCSNpZmRlZiBVU0VfQ0xFQVJDT0FUCgkJY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdCArPSBjbGVhcmNvYXRSYWRpYW5jZSAqIEVudmlyb25tZW50QlJERiggZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgbWF0ZXJpYWwuY2xlYXJjb2F0RjAsIG1hdGVyaWFsLmNsZWFyY29hdEY5MCwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU4KCQlzaGVlblNwZWN1bGFySW5kaXJlY3QgKz0gaXJyYWRpYW5jZSAqIG1hdGVyaWFsLnNoZWVuQ29sb3IgKiBJQkxTaGVlbkJSREYoIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzICk7CgkjZW5kaWYKCXZlYzMgc2luZ2xlU2NhdHRlcmluZyA9IHZlYzMoIDAuMCApOwoJdmVjMyBtdWx0aVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlID0gaXJyYWRpYW5jZSAqIFJFQ0lQUk9DQUxfUEk7CgkjaWZkZWYgVVNFX0lSSURFU0NFTkNFCgkJY29tcHV0ZU11bHRpc2NhdHRlcmluZ0lyaWRlc2NlbmNlKCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2UsIG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCwgbWF0ZXJpYWwucm91Z2huZXNzLCBzaW5nbGVTY2F0dGVyaW5nLCBtdWx0aVNjYXR0ZXJpbmcgKTsKCSNlbHNlCgkJY29tcHV0ZU11bHRpc2NhdHRlcmluZyggZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsIG1hdGVyaWFsLnJvdWdobmVzcywgc2luZ2xlU2NhdHRlcmluZywgbXVsdGlTY2F0dGVyaW5nICk7CgkjZW5kaWYKCXZlYzMgdG90YWxTY2F0dGVyaW5nID0gc2luZ2xlU2NhdHRlcmluZyArIG11bHRpU2NhdHRlcmluZzsKCXZlYzMgZGlmZnVzZSA9IG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqICggMS4wIC0gbWF4KCBtYXgoIHRvdGFsU2NhdHRlcmluZy5yLCB0b3RhbFNjYXR0ZXJpbmcuZyApLCB0b3RhbFNjYXR0ZXJpbmcuYiApICk7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IHJhZGlhbmNlICogc2luZ2xlU2NhdHRlcmluZzsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlOwoJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGRpZmZ1c2UgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7Cn0KI2RlZmluZSBSRV9EaXJlY3QJCQkJUkVfRGlyZWN0X1BoeXNpY2FsCiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhCQlSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwKI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2UJCVJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbAojZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXIJCVJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWwKZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkgewoJcmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTsKfWAsIGxpZ2h0c19mcmFnbWVudF9iZWdpbiA9IGAKdmVjMyBnZW9tZXRyeVBvc2l0aW9uID0gLSB2Vmlld1Bvc2l0aW9uOwp2ZWMzIGdlb21ldHJ5Tm9ybWFsID0gbm9ybWFsOwp2ZWMzIGdlb21ldHJ5Vmlld0RpciA9ICggaXNPcnRob2dyYXBoaWMgKSA/IHZlYzMoIDAsIDAsIDEgKSA6IG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApOwp2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsID0gdmVjMyggMC4wICk7CiNpZmRlZiBVU0VfQ0xFQVJDT0FUCglnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCA9IGNsZWFyY29hdE5vcm1hbDsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCWZsb2F0IGRvdE5WaSA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyICkgKTsKCWlmICggbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MgPT0gMC4wICkgewoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlID0gMC4wOwoJfSBlbHNlIHsKCQltYXRlcmlhbC5pcmlkZXNjZW5jZSA9IHNhdHVyYXRlKCBtYXRlcmlhbC5pcmlkZXNjZW5jZSApOwoJfQoJaWYgKCBtYXRlcmlhbC5pcmlkZXNjZW5jZSA+IDAuMCApIHsKCQltYXRlcmlhbC5pcmlkZXNjZW5jZUZyZXNuZWwgPSBldmFsSXJpZGVzY2VuY2UoIDEuMCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2VJT1IsIGRvdE5WaSwgbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKTsKCQltYXRlcmlhbC5pcmlkZXNjZW5jZUYwID0gU2NobGlja190b19GMCggbWF0ZXJpYWwuaXJpZGVzY2VuY2VGcmVzbmVsLCAxLjAsIGRvdE5WaSApOwoJfQojZW5kaWYKSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDsKI2lmICggTlVNX1BPSU5UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKQoJUG9pbnRMaWdodCBwb2ludExpZ2h0OwoJI2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAKCVBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodFNoYWRvdzsKCSNlbmRpZgoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHsKCQlwb2ludExpZ2h0ID0gcG9pbnRMaWdodHNbIGkgXTsKCQlnZXRQb2ludExpZ2h0SW5mbyggcG9pbnRMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZGlyZWN0TGlnaHQgKTsKCQkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTICkKCQlwb2ludExpZ2h0U2hhZG93ID0gcG9pbnRMaWdodFNoYWRvd3NbIGkgXTsKCQlkaXJlY3RMaWdodC5jb2xvciAqPSAoIGRpcmVjdExpZ2h0LnZpc2libGUgJiYgcmVjZWl2ZVNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dJbnRlbnNpdHksIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93QmlhcywgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0sIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFGYXIgKSA6IDEuMDsKCQkjZW5kaWYKCQlSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWYKI2lmICggTlVNX1NQT1RfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApCglTcG90TGlnaHQgc3BvdExpZ2h0OwoJdmVjNCBzcG90Q29sb3I7Cgl2ZWMzIHNwb3RMaWdodENvb3JkOwoJYm9vbCBpblNwb3RMaWdodE1hcDsKCSNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDAKCVNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3c7CgkjZW5kaWYKCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHsKCQlzcG90TGlnaHQgPSBzcG90TGlnaHRzWyBpIF07CgkJZ2V0U3BvdExpZ2h0SW5mbyggc3BvdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBkaXJlY3RMaWdodCApOwoJCSNpZiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUyApCgkJI2RlZmluZSBTUE9UX0xJR0hUX01BUF9JTkRFWCBVTlJPTExFRF9MT09QX0lOREVYCgkJI2VsaWYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyApCgkJI2RlZmluZSBTUE9UX0xJR0hUX01BUF9JTkRFWCBOVU1fU1BPVF9MSUdIVF9NQVBTCgkJI2Vsc2UKCQkjZGVmaW5lIFNQT1RfTElHSFRfTUFQX0lOREVYICggVU5ST0xMRURfTE9PUF9JTkRFWCAtIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUyApCgkJI2VuZGlmCgkJI2lmICggU1BPVF9MSUdIVF9NQVBfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9NQVBTICkKCQkJc3BvdExpZ2h0Q29vcmQgPSB2U3BvdExpZ2h0Q29vcmRbIGkgXS54eXogLyB2U3BvdExpZ2h0Q29vcmRbIGkgXS53OwoJCQlpblNwb3RMaWdodE1hcCA9IGFsbCggbGVzc1RoYW4oIGFicyggc3BvdExpZ2h0Q29vcmQgKiAyLiAtIDEuICksIHZlYzMoIDEuMCApICkgKTsKCQkJc3BvdENvbG9yID0gdGV4dHVyZTJEKCBzcG90TGlnaHRNYXBbIFNQT1RfTElHSFRfTUFQX0lOREVYIF0sIHNwb3RMaWdodENvb3JkLnh5ICk7CgkJCWRpcmVjdExpZ2h0LmNvbG9yID0gaW5TcG90TGlnaHRNYXAgPyBkaXJlY3RMaWdodC5jb2xvciAqIHNwb3RDb2xvci5yZ2IgOiBkaXJlY3RMaWdodC5jb2xvcjsKCQkjZW5kaWYKCQkjdW5kZWYgU1BPVF9MSUdIVF9NQVBfSU5ERVgKCQkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKQoJCXNwb3RMaWdodFNoYWRvdyA9IHNwb3RMaWdodFNoYWRvd3NbIGkgXTsKCQlkaXJlY3RMaWdodC5jb2xvciAqPSAoIGRpcmVjdExpZ2h0LnZpc2libGUgJiYgcmVjZWl2ZVNoYWRvdyApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93SW50ZW5zaXR5LCBzcG90TGlnaHRTaGFkb3cuc2hhZG93Qmlhcywgc3BvdExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdlNwb3RMaWdodENvb3JkWyBpIF0gKSA6IDEuMDsKCQkjZW5kaWYKCQlSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWYKI2lmICggTlVNX0RJUl9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0ICkKCURpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDsKCSNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMAoJRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93OwoJI2VuZGlmCgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHsKCQlkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTsKCQlnZXREaXJlY3Rpb25hbExpZ2h0SW5mbyggZGlyZWN0aW9uYWxMaWdodCwgZGlyZWN0TGlnaHQgKTsKCQkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUyApCgkJZGlyZWN0aW9uYWxMaWdodFNoYWRvdyA9IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBpIF07CgkJZGlyZWN0TGlnaHQuY29sb3IgKj0gKCBkaXJlY3RMaWdodC52aXNpYmxlICYmIHJlY2VpdmVTaGFkb3cgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd0ludGVuc2l0eSwgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wOwoJCSNlbmRpZgoJCVJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5UG9zaXRpb24sIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTsKCX0KCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCiNlbmRpZgojaWYgKCBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3RfUmVjdEFyZWEgKQoJUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0OwoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1JFQ1RfQVJFQV9MSUdIVFM7IGkgKysgKSB7CgkJcmVjdEFyZWFMaWdodCA9IHJlY3RBcmVhTGlnaHRzWyBpIF07CgkJUkVfRGlyZWN0X1JlY3RBcmVhKCByZWN0QXJlYUxpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWYKI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApCgl2ZWMzIGlibElycmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgaXJyYWRpYW5jZSA9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7CgkjaWYgZGVmaW5lZCggVVNFX0xJR0hUX1BST0JFUyApCgkJaXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnlOb3JtYWwgKTsKCSNlbmRpZgoJI2lmICggTlVNX0hFTUlfTElHSFRTID4gMCApCgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHsKCQkJaXJyYWRpYW5jZSArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5Tm9ybWFsICk7CgkJfQoJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkjZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyICkKCXZlYzMgcmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgY2xlYXJjb2F0UmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKI2VuZGlmYCwgbGlnaHRzX2ZyYWdtZW50X21hcHMgPSBgI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApCgkjaWZkZWYgVVNFX0xJR0hUTUFQCgkJdmVjNCBsaWdodE1hcFRleGVsID0gdGV4dHVyZTJEKCBsaWdodE1hcCwgdkxpZ2h0TWFwVXYgKTsKCQl2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IGxpZ2h0TWFwVGV4ZWwucmdiICogbGlnaHRNYXBJbnRlbnNpdHk7CgkJaXJyYWRpYW5jZSArPSBsaWdodE1hcElycmFkaWFuY2U7CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggU1RBTkRBUkQgKSAmJiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWICkKCQlpYmxJcnJhZGlhbmNlICs9IGdldElCTElycmFkaWFuY2UoIGdlb21ldHJ5Tm9ybWFsICk7CgkjZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApCgkjaWZkZWYgVVNFX0FOSVNPVFJPUFkKCQlyYWRpYW5jZSArPSBnZXRJQkxBbmlzb3Ryb3B5UmFkaWFuY2UoIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnJvdWdobmVzcywgbWF0ZXJpYWwuYW5pc290cm9weUIsIG1hdGVyaWFsLmFuaXNvdHJvcHkgKTsKCSNlbHNlCgkJcmFkaWFuY2UgKz0gZ2V0SUJMUmFkaWFuY2UoIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnJvdWdobmVzcyApOwoJI2VuZGlmCgkjaWZkZWYgVVNFX0NMRUFSQ09BVAoJCWNsZWFyY29hdFJhZGlhbmNlICs9IGdldElCTFJhZGlhbmNlKCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTsKCSNlbmRpZgojZW5kaWZgLCBsaWdodHNfZnJhZ21lbnRfZW5kID0gYCNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKQoJUkVfSW5kaXJlY3REaWZmdXNlKCBpcnJhZGlhbmNlLCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7CiNlbmRpZgojaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApCglSRV9JbmRpcmVjdFNwZWN1bGFyKCByYWRpYW5jZSwgaWJsSXJyYWRpYW5jZSwgY2xlYXJjb2F0UmFkaWFuY2UsIGdlb21ldHJ5UG9zaXRpb24sIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTsKI2VuZGlmYCwgbG9nZGVwdGhidWZfZnJhZ21lbnQgPSBgI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApCglnbF9GcmFnRGVwdGggPSB2SXNQZXJzcGVjdGl2ZSA9PSAwLjAgPyBnbF9GcmFnQ29vcmQueiA6IGxvZzIoIHZGcmFnRGVwdGggKSAqIGxvZ0RlcHRoQnVmRkMgKiAwLjU7CiNlbmRpZmAsIGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQgPSBgI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApCgl1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7Cgl2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7Cgl2YXJ5aW5nIGZsb2F0IHZJc1BlcnNwZWN0aXZlOwojZW5kaWZgLCBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCA9IGAjaWZkZWYgVVNFX0xPR0RFUFRIQlVGCgl2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7Cgl2YXJ5aW5nIGZsb2F0IHZJc1BlcnNwZWN0aXZlOwojZW5kaWZgLCBsb2dkZXB0aGJ1Zl92ZXJ0ZXggPSBgI2lmZGVmIFVTRV9MT0dERVBUSEJVRgoJdkZyYWdEZXB0aCA9IDEuMCArIGdsX1Bvc2l0aW9uLnc7Cgl2SXNQZXJzcGVjdGl2ZSA9IGZsb2F0KCBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICkgKTsKI2VuZGlmYCwgbWFwX2ZyYWdtZW50ID0gYCNpZmRlZiBVU0VfTUFQCgl2ZWM0IHNhbXBsZWREaWZmdXNlQ29sb3IgPSB0ZXh0dXJlMkQoIG1hcCwgdk1hcFV2ICk7CgkjaWZkZWYgREVDT0RFX1ZJREVPX1RFWFRVUkUKCQlzYW1wbGVkRGlmZnVzZUNvbG9yID0gc1JHQlRyYW5zZmVyRU9URiggc2FtcGxlZERpZmZ1c2VDb2xvciApOwoJI2VuZGlmCglkaWZmdXNlQ29sb3IgKj0gc2FtcGxlZERpZmZ1c2VDb2xvcjsKI2VuZGlmYCwgbWFwX3BhcnNfZnJhZ21lbnQgPSBgI2lmZGVmIFVTRV9NQVAKCXVuaWZvcm0gc2FtcGxlcjJEIG1hcDsKI2VuZGlmYCwgbWFwX3BhcnRpY2xlX2ZyYWdtZW50ID0gYCNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkKCSNpZiBkZWZpbmVkKCBVU0VfUE9JTlRTX1VWICkKCQl2ZWMyIHV2ID0gdlV2OwoJI2Vsc2UKCQl2ZWMyIHV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIGdsX1BvaW50Q29vcmQueCwgMS4wIC0gZ2xfUG9pbnRDb29yZC55LCAxICkgKS54eTsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9NQVAKCWRpZmZ1c2VDb2xvciAqPSB0ZXh0dXJlMkQoIG1hcCwgdXYgKTsKI2VuZGlmCiNpZmRlZiBVU0VfQUxQSEFNQVAKCWRpZmZ1c2VDb2xvci5hICo9IHRleHR1cmUyRCggYWxwaGFNYXAsIHV2ICkuZzsKI2VuZGlmYCwgbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQgPSBgI2lmIGRlZmluZWQoIFVTRV9QT0lOVFNfVVYgKQoJdmFyeWluZyB2ZWMyIHZVdjsKI2Vsc2UKCSNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkKCQl1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBtYXA7CiNlbmRpZgojaWZkZWYgVVNFX0FMUEhBTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDsKI2VuZGlmYCwgbWV0YWxuZXNzbWFwX2ZyYWdtZW50ID0gYGZsb2F0IG1ldGFsbmVzc0ZhY3RvciA9IG1ldGFsbmVzczsKI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVAKCXZlYzQgdGV4ZWxNZXRhbG5lc3MgPSB0ZXh0dXJlMkQoIG1ldGFsbmVzc01hcCwgdk1ldGFsbmVzc01hcFV2ICk7CgltZXRhbG5lc3NGYWN0b3IgKj0gdGV4ZWxNZXRhbG5lc3MuYjsKI2VuZGlmYCwgbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSBgI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIG1ldGFsbmVzc01hcDsKI2VuZGlmYCwgbW9ycGhpbnN0YW5jZV92ZXJ0ZXggPSBgI2lmZGVmIFVTRV9JTlNUQU5DSU5HX01PUlBICglmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIE1PUlBIVEFSR0VUU19DT1VOVCBdOwoJZmxvYXQgbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlID0gdGV4ZWxGZXRjaCggbW9ycGhUZXh0dXJlLCBpdmVjMiggMCwgZ2xfSW5zdGFuY2VJRCApLCAwICkucjsKCWZvciAoIGludCBpID0gMDsgaSA8IE1PUlBIVEFSR0VUU19DT1VOVDsgaSArKyApIHsKCQltb3JwaFRhcmdldEluZmx1ZW5jZXNbaV0gPSAgdGV4ZWxGZXRjaCggbW9ycGhUZXh0dXJlLCBpdmVjMiggaSArIDEsIGdsX0luc3RhbmNlSUQgKSwgMCApLnI7Cgl9CiNlbmRpZmAsIG1vcnBoY29sb3JfdmVydGV4ID0gYCNpZiBkZWZpbmVkKCBVU0VfTU9SUEhDT0xPUlMgKQoJdkNvbG9yICo9IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZTsKCWZvciAoIGludCBpID0gMDsgaSA8IE1PUlBIVEFSR0VUU19DT1VOVDsgaSArKyApIHsKCQkjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkKCQkJaWYgKCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSAhPSAwLjAgKSB2Q29sb3IgKz0gZ2V0TW9ycGgoIGdsX1ZlcnRleElELCBpLCAyICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTsKCQkjZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKQoJCQlpZiAoIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICE9IDAuMCApIHZDb2xvciArPSBnZXRNb3JwaCggZ2xfVmVydGV4SUQsIGksIDIgKS5yZ2IgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTsKCQkjZW5kaWYKCX0KI2VuZGlmYCwgbW9ycGhub3JtYWxfdmVydGV4ID0gYCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTCglvYmplY3ROb3JtYWwgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlOwoJZm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkgewoJCWlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gIT0gMC4wICkgb2JqZWN0Tm9ybWFsICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMSApLnh5eiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdOwoJfQojZW5kaWZgLCBtb3JwaHRhcmdldF9wYXJzX3ZlcnRleCA9IGAjaWZkZWYgVVNFX01PUlBIVEFSR0VUUwoJI2lmbmRlZiBVU0VfSU5TVEFOQ0lOR19NT1JQSAoJCXVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlOwoJCXVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBNT1JQSFRBUkdFVFNfQ09VTlQgXTsKCSNlbmRpZgoJdW5pZm9ybSBzYW1wbGVyMkRBcnJheSBtb3JwaFRhcmdldHNUZXh0dXJlOwoJdW5pZm9ybSBpdmVjMiBtb3JwaFRhcmdldHNUZXh0dXJlU2l6ZTsKCXZlYzQgZ2V0TW9ycGgoIGNvbnN0IGluIGludCB2ZXJ0ZXhJbmRleCwgY29uc3QgaW4gaW50IG1vcnBoVGFyZ2V0SW5kZXgsIGNvbnN0IGluIGludCBvZmZzZXQgKSB7CgkJaW50IHRleGVsSW5kZXggPSB2ZXJ0ZXhJbmRleCAqIE1PUlBIVEFSR0VUU19URVhUVVJFX1NUUklERSArIG9mZnNldDsKCQlpbnQgeSA9IHRleGVsSW5kZXggLyBtb3JwaFRhcmdldHNUZXh0dXJlU2l6ZS54OwoJCWludCB4ID0gdGV4ZWxJbmRleCAtIHkgKiBtb3JwaFRhcmdldHNUZXh0dXJlU2l6ZS54OwoJCWl2ZWMzIG1vcnBoVVYgPSBpdmVjMyggeCwgeSwgbW9ycGhUYXJnZXRJbmRleCApOwoJCXJldHVybiB0ZXhlbEZldGNoKCBtb3JwaFRhcmdldHNUZXh0dXJlLCBtb3JwaFVWLCAwICk7Cgl9CiNlbmRpZmAsIG1vcnBodGFyZ2V0X3ZlcnRleCA9IGAjaWZkZWYgVVNFX01PUlBIVEFSR0VUUwoJdHJhbnNmb3JtZWQgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlOwoJZm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkgewoJCWlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gIT0gMC4wICkgdHJhbnNmb3JtZWQgKz0gZ2V0TW9ycGgoIGdsX1ZlcnRleElELCBpLCAwICkueHl6ICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07Cgl9CiNlbmRpZmAsIG5vcm1hbF9mcmFnbWVudF9iZWdpbiA9IGBmbG9hdCBmYWNlRGlyZWN0aW9uID0gZ2xfRnJvbnRGYWNpbmcgPyAxLjAgOiAtIDEuMDsKI2lmZGVmIEZMQVRfU0hBREVECgl2ZWMzIGZkeCA9IGRGZHgoIHZWaWV3UG9zaXRpb24gKTsKCXZlYzMgZmR5ID0gZEZkeSggdlZpZXdQb3NpdGlvbiApOwoJdmVjMyBub3JtYWwgPSBub3JtYWxpemUoIGNyb3NzKCBmZHgsIGZkeSApICk7CiNlbHNlCgl2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggdk5vcm1hbCApOwoJI2lmZGVmIERPVUJMRV9TSURFRAoJCW5vcm1hbCAqPSBmYWNlRGlyZWN0aW9uOwoJI2VuZGlmCiNlbmRpZgojaWYgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKSB8fCBkZWZpbmVkKCBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9BTklTT1RST1BZICkKCSNpZmRlZiBVU0VfVEFOR0VOVAoJCW1hdDMgdGJuID0gbWF0Myggbm9ybWFsaXplKCB2VGFuZ2VudCApLCBub3JtYWxpemUoIHZCaXRhbmdlbnQgKSwgbm9ybWFsICk7CgkjZWxzZQoJCW1hdDMgdGJuID0gZ2V0VGFuZ2VudEZyYW1lKCAtIHZWaWV3UG9zaXRpb24sIG5vcm1hbCwKCQkjaWYgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApCgkJCXZOb3JtYWxNYXBVdgoJCSNlbGlmIGRlZmluZWQoIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQICkKCQkJdkNsZWFyY29hdE5vcm1hbE1hcFV2CgkJI2Vsc2UKCQkJdlV2CgkJI2VuZGlmCgkJKTsKCSNlbmRpZgoJI2lmIGRlZmluZWQoIERPVUJMRV9TSURFRCApICYmICEgZGVmaW5lZCggRkxBVF9TSEFERUQgKQoJCXRiblswXSAqPSBmYWNlRGlyZWN0aW9uOwoJCXRiblsxXSAqPSBmYWNlRGlyZWN0aW9uOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAKCSNpZmRlZiBVU0VfVEFOR0VOVAoJCW1hdDMgdGJuMiA9IG1hdDMoIG5vcm1hbGl6ZSggdlRhbmdlbnQgKSwgbm9ybWFsaXplKCB2Qml0YW5nZW50ICksIG5vcm1hbCApOwoJI2Vsc2UKCQltYXQzIHRibjIgPSBnZXRUYW5nZW50RnJhbWUoIC0gdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCB2Q2xlYXJjb2F0Tm9ybWFsTWFwVXYgKTsKCSNlbmRpZgoJI2lmIGRlZmluZWQoIERPVUJMRV9TSURFRCApICYmICEgZGVmaW5lZCggRkxBVF9TSEFERUQgKQoJCXRibjJbMF0gKj0gZmFjZURpcmVjdGlvbjsKCQl0Ym4yWzFdICo9IGZhY2VEaXJlY3Rpb247CgkjZW5kaWYKI2VuZGlmCnZlYzMgbm9uUGVydHVyYmVkTm9ybWFsID0gbm9ybWFsO2AsIG5vcm1hbF9mcmFnbWVudF9tYXBzID0gYCNpZmRlZiBVU0VfTk9STUFMTUFQX09CSkVDVFNQQUNFCglub3JtYWwgPSB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdk5vcm1hbE1hcFV2ICkueHl6ICogMi4wIC0gMS4wOwoJI2lmZGVmIEZMSVBfU0lERUQKCQlub3JtYWwgPSAtIG5vcm1hbDsKCSNlbmRpZgoJI2lmZGVmIERPVUJMRV9TSURFRAoJCW5vcm1hbCA9IG5vcm1hbCAqIGZhY2VEaXJlY3Rpb247CgkjZW5kaWYKCW5vcm1hbCA9IG5vcm1hbGl6ZSggbm9ybWFsTWF0cml4ICogbm9ybWFsICk7CiNlbGlmIGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFICkKCXZlYzMgbWFwTiA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2Tm9ybWFsTWFwVXYgKS54eXogKiAyLjAgLSAxLjA7CgltYXBOLnh5ICo9IG5vcm1hbFNjYWxlOwoJbm9ybWFsID0gbm9ybWFsaXplKCB0Ym4gKiBtYXBOICk7CiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkKCW5vcm1hbCA9IHBlcnR1cmJOb3JtYWxBcmIoIC0gdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBkSGR4eV9md2QoKSwgZmFjZURpcmVjdGlvbiApOwojZW5kaWZgLCBub3JtYWxfcGFyc19mcmFnbWVudCA9IGAjaWZuZGVmIEZMQVRfU0hBREVECgl2YXJ5aW5nIHZlYzMgdk5vcm1hbDsKCSNpZmRlZiBVU0VfVEFOR0VOVAoJCXZhcnlpbmcgdmVjMyB2VGFuZ2VudDsKCQl2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDsKCSNlbmRpZgojZW5kaWZgLCBub3JtYWxfcGFyc192ZXJ0ZXggPSBgI2lmbmRlZiBGTEFUX1NIQURFRAoJdmFyeWluZyB2ZWMzIHZOb3JtYWw7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQl2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7CgkJdmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7CgkjZW5kaWYKI2VuZGlmYCwgbm9ybWFsX3ZlcnRleCA9IGAjaWZuZGVmIEZMQVRfU0hBREVECgl2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApOwoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJdlRhbmdlbnQgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApOwoJCXZCaXRhbmdlbnQgPSBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7CgkjZW5kaWYKI2VuZGlmYCwgbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQgPSBgI2lmZGVmIFVTRV9OT1JNQUxNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbE1hcDsKCXVuaWZvcm0gdmVjMiBub3JtYWxTY2FsZTsKI2VuZGlmCiNpZmRlZiBVU0VfTk9STUFMTUFQX09CSkVDVFNQQUNFCgl1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4OwojZW5kaWYKI2lmICEgZGVmaW5lZCAoIFVTRV9UQU5HRU5UICkgJiYgKCBkZWZpbmVkICggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKSB8fCBkZWZpbmVkICggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU5JU09UUk9QWSApICkKCW1hdDMgZ2V0VGFuZ2VudEZyYW1lKCB2ZWMzIGV5ZV9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIHV2ICkgewoJCXZlYzMgcTAgPSBkRmR4KCBleWVfcG9zLnh5eiApOwoJCXZlYzMgcTEgPSBkRmR5KCBleWVfcG9zLnh5eiApOwoJCXZlYzIgc3QwID0gZEZkeCggdXYuc3QgKTsKCQl2ZWMyIHN0MSA9IGRGZHkoIHV2LnN0ICk7CgkJdmVjMyBOID0gc3VyZl9ub3JtOwoJCXZlYzMgcTFwZXJwID0gY3Jvc3MoIHExLCBOICk7CgkJdmVjMyBxMHBlcnAgPSBjcm9zcyggTiwgcTAgKTsKCQl2ZWMzIFQgPSBxMXBlcnAgKiBzdDAueCArIHEwcGVycCAqIHN0MS54OwoJCXZlYzMgQiA9IHExcGVycCAqIHN0MC55ICsgcTBwZXJwICogc3QxLnk7CgkJZmxvYXQgZGV0ID0gbWF4KCBkb3QoIFQsIFQgKSwgZG90KCBCLCBCICkgKTsKCQlmbG9hdCBzY2FsZSA9ICggZGV0ID09IDAuMCApID8gMC4wIDogaW52ZXJzZXNxcnQoIGRldCApOwoJCXJldHVybiBtYXQzKCBUICogc2NhbGUsIEIgKiBzY2FsZSwgTiApOwoJfQojZW5kaWZgLCBjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luID0gYCNpZmRlZiBVU0VfQ0xFQVJDT0FUCgl2ZWMzIGNsZWFyY29hdE5vcm1hbCA9IG5vblBlcnR1cmJlZE5vcm1hbDsKI2VuZGlmYCwgY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzID0gYCNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJdmVjMyBjbGVhcmNvYXRNYXBOID0gdGV4dHVyZTJEKCBjbGVhcmNvYXROb3JtYWxNYXAsIHZDbGVhcmNvYXROb3JtYWxNYXBVdiApLnh5eiAqIDIuMCAtIDEuMDsKCWNsZWFyY29hdE1hcE4ueHkgKj0gY2xlYXJjb2F0Tm9ybWFsU2NhbGU7CgljbGVhcmNvYXROb3JtYWwgPSBub3JtYWxpemUoIHRibjIgKiBjbGVhcmNvYXRNYXBOICk7CiNlbmRpZmAsIGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50ID0gYCNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXRNYXA7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdE5vcm1hbE1hcDsKCXVuaWZvcm0gdmVjMiBjbGVhcmNvYXROb3JtYWxTY2FsZTsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0Um91Z2huZXNzTWFwOwojZW5kaWZgLCBpcmlkZXNjZW5jZV9wYXJzX2ZyYWdtZW50ID0gYCNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGlyaWRlc2NlbmNlTWFwOwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwOwojZW5kaWZgLCBvcGFxdWVfZnJhZ21lbnQgPSBgI2lmZGVmIE9QQVFVRQpkaWZmdXNlQ29sb3IuYSA9IDEuMDsKI2VuZGlmCiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OCmRpZmZ1c2VDb2xvci5hICo9IG1hdGVyaWFsLnRyYW5zbWlzc2lvbkFscGhhOwojZW5kaWYKZ2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtgLCBwYWNraW5nID0gYHZlYzMgcGFja05vcm1hbFRvUkdCKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHsKCXJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41Owp9CnZlYzMgdW5wYWNrUkdCVG9Ob3JtYWwoIGNvbnN0IGluIHZlYzMgcmdiICkgewoJcmV0dXJuIDIuMCAqIHJnYi54eXogLSAxLjA7Cn0KY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2Ljtjb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCA9IDEuIC8gMjU2LjsKY29uc3QgZmxvYXQgSW52MjU1ID0gMS4gLyAyNTUuOwpjb25zdCB2ZWM0IFBhY2tGYWN0b3JzID0gdmVjNCggMS4wLCAyNTYuMCwgMjU2LjAgKiAyNTYuMCwgMjU2LjAgKiAyNTYuMCAqIDI1Ni4wICk7CmNvbnN0IHZlYzIgVW5wYWNrRmFjdG9yczIgPSB2ZWMyKCBVbnBhY2tEb3duc2NhbGUsIDEuMCAvIFBhY2tGYWN0b3JzLmcgKTsKY29uc3QgdmVjMyBVbnBhY2tGYWN0b3JzMyA9IHZlYzMoIFVucGFja0Rvd25zY2FsZSAvIFBhY2tGYWN0b3JzLnJnLCAxLjAgLyBQYWNrRmFjdG9ycy5iICk7CmNvbnN0IHZlYzQgVW5wYWNrRmFjdG9yczQgPSB2ZWM0KCBVbnBhY2tEb3duc2NhbGUgLyBQYWNrRmFjdG9ycy5yZ2IsIDEuMCAvIFBhY2tGYWN0b3JzLmEgKTsKdmVjNCBwYWNrRGVwdGhUb1JHQkEoIGNvbnN0IGluIGZsb2F0IHYgKSB7CglpZiggdiA8PSAwLjAgKQoJCXJldHVybiB2ZWM0KCAwLiwgMC4sIDAuLCAwLiApOwoJaWYoIHYgPj0gMS4wICkKCQlyZXR1cm4gdmVjNCggMS4sIDEuLCAxLiwgMS4gKTsKCWZsb2F0IHZ1ZjsKCWZsb2F0IGFmID0gbW9kZiggdiAqIFBhY2tGYWN0b3JzLmEsIHZ1ZiApOwoJZmxvYXQgYmYgPSBtb2RmKCB2dWYgKiBTaGlmdFJpZ2h0OCwgdnVmICk7CglmbG9hdCBnZiA9IG1vZGYoIHZ1ZiAqIFNoaWZ0UmlnaHQ4LCB2dWYgKTsKCXJldHVybiB2ZWM0KCB2dWYgKiBJbnYyNTUsIGdmICogUGFja1Vwc2NhbGUsIGJmICogUGFja1Vwc2NhbGUsIGFmICk7Cn0KdmVjMyBwYWNrRGVwdGhUb1JHQiggY29uc3QgaW4gZmxvYXQgdiApIHsKCWlmKCB2IDw9IDAuMCApCgkJcmV0dXJuIHZlYzMoIDAuLCAwLiwgMC4gKTsKCWlmKCB2ID49IDEuMCApCgkJcmV0dXJuIHZlYzMoIDEuLCAxLiwgMS4gKTsKCWZsb2F0IHZ1ZjsKCWZsb2F0IGJmID0gbW9kZiggdiAqIFBhY2tGYWN0b3JzLmIsIHZ1ZiApOwoJZmxvYXQgZ2YgPSBtb2RmKCB2dWYgKiBTaGlmdFJpZ2h0OCwgdnVmICk7CglyZXR1cm4gdmVjMyggdnVmICogSW52MjU1LCBnZiAqIFBhY2tVcHNjYWxlLCBiZiApOwp9CnZlYzIgcGFja0RlcHRoVG9SRyggY29uc3QgaW4gZmxvYXQgdiApIHsKCWlmKCB2IDw9IDAuMCApCgkJcmV0dXJuIHZlYzIoIDAuLCAwLiApOwoJaWYoIHYgPj0gMS4wICkKCQlyZXR1cm4gdmVjMiggMS4sIDEuICk7CglmbG9hdCB2dWY7CglmbG9hdCBnZiA9IG1vZGYoIHYgKiAyNTYuLCB2dWYgKTsKCXJldHVybiB2ZWMyKCB2dWYgKiBJbnYyNTUsIGdmICk7Cn0KZmxvYXQgdW5wYWNrUkdCQVRvRGVwdGgoIGNvbnN0IGluIHZlYzQgdiApIHsKCXJldHVybiBkb3QoIHYsIFVucGFja0ZhY3RvcnM0ICk7Cn0KZmxvYXQgdW5wYWNrUkdCVG9EZXB0aCggY29uc3QgaW4gdmVjMyB2ICkgewoJcmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9yczMgKTsKfQpmbG9hdCB1bnBhY2tSR1RvRGVwdGgoIGNvbnN0IGluIHZlYzIgdiApIHsKCXJldHVybiB2LnIgKiBVbnBhY2tGYWN0b3JzMi5yICsgdi5nICogVW5wYWNrRmFjdG9yczIuZzsKfQp2ZWM0IHBhY2sySGFsZlRvUkdCQSggY29uc3QgaW4gdmVjMiB2ICkgewoJdmVjNCByID0gdmVjNCggdi54LCBmcmFjdCggdi54ICogMjU1LjAgKSwgdi55LCBmcmFjdCggdi55ICogMjU1LjAgKSApOwoJcmV0dXJuIHZlYzQoIHIueCAtIHIueSAvIDI1NS4wLCByLnksIHIueiAtIHIudyAvIDI1NS4wLCByLncgKTsKfQp2ZWMyIHVucGFja1JHQkFUbzJIYWxmKCBjb25zdCBpbiB2ZWM0IHYgKSB7CglyZXR1cm4gdmVjMiggdi54ICsgKCB2LnkgLyAyNTUuMCApLCB2LnogKyAoIHYudyAvIDI1NS4wICkgKTsKfQpmbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7CglyZXR1cm4gKCB2aWV3WiArIG5lYXIgKSAvICggbmVhciAtIGZhciApOwp9CmZsb2F0IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgZGVwdGgsIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHsKCXJldHVybiBkZXB0aCAqICggbmVhciAtIGZhciApIC0gbmVhcjsKfQpmbG9hdCB2aWV3WlRvUGVyc3BlY3RpdmVEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHsKCXJldHVybiAoICggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICggKCBmYXIgLSBuZWFyICkgKiB2aWV3WiApOwp9CmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBkZXB0aCwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkgewoJcmV0dXJuICggbmVhciAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIGRlcHRoIC0gZmFyICk7Cn1gLCBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50ID0gYCNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBCglnbF9GcmFnQ29sb3IucmdiICo9IGdsX0ZyYWdDb2xvci5hOwojZW5kaWZgLCBwcm9qZWN0X3ZlcnRleCA9IGB2ZWM0IG12UG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7CiNpZmRlZiBVU0VfQkFUQ0hJTkcKCW12UG9zaXRpb24gPSBiYXRjaGluZ01hdHJpeCAqIG12UG9zaXRpb247CiNlbmRpZgojaWZkZWYgVVNFX0lOU1RBTkNJTkcKCW12UG9zaXRpb24gPSBpbnN0YW5jZU1hdHJpeCAqIG12UG9zaXRpb247CiNlbmRpZgptdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogbXZQb3NpdGlvbjsKZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtgLCBkaXRoZXJpbmdfZnJhZ21lbnQgPSBgI2lmZGVmIERJVEhFUklORwoJZ2xfRnJhZ0NvbG9yLnJnYiA9IGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApOwojZW5kaWZgLCBkaXRoZXJpbmdfcGFyc19mcmFnbWVudCA9IGAjaWZkZWYgRElUSEVSSU5HCgl2ZWMzIGRpdGhlcmluZyggdmVjMyBjb2xvciApIHsKCQlmbG9hdCBncmlkX3Bvc2l0aW9uID0gcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7CgkJdmVjMyBkaXRoZXJfc2hpZnRfUkdCID0gdmVjMyggMC4yNSAvIDI1NS4wLCAtMC4yNSAvIDI1NS4wLCAwLjI1IC8gMjU1LjAgKTsKCQlkaXRoZXJfc2hpZnRfUkdCID0gbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApOwoJCXJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9SR0I7Cgl9CiNlbmRpZmAsIHJvdWdobmVzc21hcF9mcmFnbWVudCA9IGBmbG9hdCByb3VnaG5lc3NGYWN0b3IgPSByb3VnaG5lc3M7CiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQCgl2ZWM0IHRleGVsUm91Z2huZXNzID0gdGV4dHVyZTJEKCByb3VnaG5lc3NNYXAsIHZSb3VnaG5lc3NNYXBVdiApOwoJcm91Z2huZXNzRmFjdG9yICo9IHRleGVsUm91Z2huZXNzLmc7CiNlbmRpZmAsIHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50ID0gYCNpZmRlZiBVU0VfUk9VR0hORVNTTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7CiNlbmRpZmAsIHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50ID0gYCNpZiBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwCgl2YXJ5aW5nIHZlYzQgdlNwb3RMaWdodENvb3JkWyBOVU1fU1BPVF9MSUdIVF9DT09SRFMgXTsKI2VuZGlmCiNpZiBOVU1fU1BPVF9MSUdIVF9NQVBTID4gMAoJdW5pZm9ybSBzYW1wbGVyMkQgc3BvdExpZ2h0TWFwWyBOVU1fU1BPVF9MSUdIVF9NQVBTIF07CiNlbmRpZgojaWZkZWYgVVNFX1NIQURPV01BUAoJI2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAKCQl1bmlmb3JtIHNhbXBsZXIyRCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07CgkJdmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTsKCQlzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodFNoYWRvdyB7CgkJCWZsb2F0IHNoYWRvd0ludGVuc2l0eTsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJfTsKCQl1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCgkjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDAKCQl1bmlmb3JtIHNhbXBsZXIyRCBzcG90U2hhZG93TWFwWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07CgkJc3RydWN0IFNwb3RMaWdodFNoYWRvdyB7CgkJCWZsb2F0IHNoYWRvd0ludGVuc2l0eTsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJfTsKCQl1bmlmb3JtIFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3dzWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07CgkjZW5kaWYKCSNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAKCQl1bmlmb3JtIHNhbXBsZXIyRCBwb2ludFNoYWRvd01hcFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTsKCQl2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07CgkJc3RydWN0IFBvaW50TGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dJbnRlbnNpdHk7CgkJCWZsb2F0IHNoYWRvd0JpYXM7CgkJCWZsb2F0IHNoYWRvd05vcm1hbEJpYXM7CgkJCWZsb2F0IHNoYWRvd1JhZGl1czsKCQkJdmVjMiBzaGFkb3dNYXBTaXplOwoJCQlmbG9hdCBzaGFkb3dDYW1lcmFOZWFyOwoJCQlmbG9hdCBzaGFkb3dDYW1lcmFGYXI7CgkJfTsKCQl1bmlmb3JtIFBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodFNoYWRvd3NbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07CgkjZW5kaWYKCWZsb2F0IHRleHR1cmUyRENvbXBhcmUoIHNhbXBsZXIyRCBkZXB0aHMsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7CgkJcmV0dXJuIHN0ZXAoIGNvbXBhcmUsIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIGRlcHRocywgdXYgKSApICk7Cgl9Cgl2ZWMyIHRleHR1cmUyRERpc3RyaWJ1dGlvbiggc2FtcGxlcjJEIHNoYWRvdywgdmVjMiB1diApIHsKCQlyZXR1cm4gdW5wYWNrUkdCQVRvMkhhbGYoIHRleHR1cmUyRCggc2hhZG93LCB1diApICk7Cgl9CglmbG9hdCBWU01TaGFkb3cgKHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKXsKCQlmbG9hdCBvY2NsdXNpb24gPSAxLjA7CgkJdmVjMiBkaXN0cmlidXRpb24gPSB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNoYWRvdywgdXYgKTsKCQlmbG9hdCBoYXJkX3NoYWRvdyA9IHN0ZXAoIGNvbXBhcmUgLCBkaXN0cmlidXRpb24ueCApOwoJCWlmIChoYXJkX3NoYWRvdyAhPSAxLjAgKSB7CgkJCWZsb2F0IGRpc3RhbmNlID0gY29tcGFyZSAtIGRpc3RyaWJ1dGlvbi54IDsKCQkJZmxvYXQgdmFyaWFuY2UgPSBtYXgoIDAuMDAwMDAsIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKTsKCQkJZmxvYXQgc29mdG5lc3NfcHJvYmFiaWxpdHkgPSB2YXJpYW5jZSAvICh2YXJpYW5jZSArIGRpc3RhbmNlICogZGlzdGFuY2UgKTsJCQlzb2Z0bmVzc19wcm9iYWJpbGl0eSA9IGNsYW1wKCAoIHNvZnRuZXNzX3Byb2JhYmlsaXR5IC0gMC4zICkgLyAoIDAuOTUgLSAwLjMgKSwgMC4wLCAxLjAgKTsJCQlvY2NsdXNpb24gPSBjbGFtcCggbWF4KCBoYXJkX3NoYWRvdywgc29mdG5lc3NfcHJvYmFiaWxpdHkgKSwgMC4wLCAxLjAgKTsKCQl9CgkJcmV0dXJuIG9jY2x1c2lvbjsKCX0KCWZsb2F0IGdldFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dJbnRlbnNpdHksIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCApIHsKCQlmbG9hdCBzaGFkb3cgPSAxLjA7CgkJc2hhZG93Q29vcmQueHl6IC89IHNoYWRvd0Nvb3JkLnc7CgkJc2hhZG93Q29vcmQueiArPSBzaGFkb3dCaWFzOwoJCWJvb2wgaW5GcnVzdHVtID0gc2hhZG93Q29vcmQueCA+PSAwLjAgJiYgc2hhZG93Q29vcmQueCA8PSAxLjAgJiYgc2hhZG93Q29vcmQueSA+PSAwLjAgJiYgc2hhZG93Q29vcmQueSA8PSAxLjA7CgkJYm9vbCBmcnVzdHVtVGVzdCA9IGluRnJ1c3R1bSAmJiBzaGFkb3dDb29yZC56IDw9IDEuMDsKCQlpZiAoIGZydXN0dW1UZXN0ICkgewoJCSNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKQoJCQl2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTsKCQkJZmxvYXQgZHgwID0gLSB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1czsKCQkJZmxvYXQgZHkwID0gLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1czsKCQkJZmxvYXQgZHgxID0gKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1czsKCQkJZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1czsKCQkJZmxvYXQgZHgyID0gZHgwIC8gMi4wOwoJCQlmbG9hdCBkeTIgPSBkeTAgLyAyLjA7CgkJCWZsb2F0IGR4MyA9IGR4MSAvIDIuMDsKCQkJZmxvYXQgZHkzID0gZHkxIC8gMi4wOwoJCQlzaGFkb3cgPSAoCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nvb3JkLnogKQoJCQkpICogKCAxLjAgLyAxNy4wICk7CgkJI2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKQoJCQl2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTsKCQkJZmxvYXQgZHggPSB0ZXhlbFNpemUueDsKCQkJZmxvYXQgZHkgPSB0ZXhlbFNpemUueTsKCQkJdmVjMiB1diA9IHNoYWRvd0Nvb3JkLnh5OwoJCQl2ZWMyIGYgPSBmcmFjdCggdXYgKiBzaGFkb3dNYXBTaXplICsgMC41ICk7CgkJCXV2IC09IGYgKiB0ZXhlbFNpemU7CgkJCXNoYWRvdyA9ICgKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYsIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgZHkgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB0ZXhlbFNpemUsIHNoYWRvd0Nvb3JkLnogKSArCgkJCQltaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgZi54ICkgKwoJCQkJbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSBmLnggKSArCgkJCQltaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAwLjAsIC1keSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAwLjAsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgZi55ICkgKwoJCQkJbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCBkeCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSBmLnkgKSArCgkJCQltaXgoIG1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIC1keCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkJICB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJCSAgZi54ICksCgkJCQkJIG1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIC1keCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCQkgIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCQkgIGYueCApLAoJCQkJCSBmLnkgKQoJCQkpICogKCAxLjAgLyA5LjAgKTsKCQkjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKQoJCQlzaGFkb3cgPSBWU01TaGFkb3coIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKTsKCQkjZWxzZQoJCQlzaGFkb3cgPSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7CgkJI2VuZGlmCgkJfQoJCXJldHVybiBtaXgoIDEuMCwgc2hhZG93LCBzaGFkb3dJbnRlbnNpdHkgKTsKCX0KCXZlYzIgY3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHsKCQl2ZWMzIGFic1YgPSBhYnMoIHYgKTsKCQlmbG9hdCBzY2FsZVRvQ3ViZSA9IDEuMCAvIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKTsKCQlhYnNWICo9IHNjYWxlVG9DdWJlOwoJCXYgKj0gc2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTsKCQl2ZWMyIHBsYW5hciA9IHYueHk7CgkJZmxvYXQgYWxtb3N0QVRleGVsID0gMS41ICogdGV4ZWxTaXplWTsKCQlmbG9hdCBhbG1vc3RPbmUgPSAxLjAgLSBhbG1vc3RBVGV4ZWw7CgkJaWYgKCBhYnNWLnogPj0gYWxtb3N0T25lICkgewoJCQlpZiAoIHYueiA+IDAuMCApCgkJCQlwbGFuYXIueCA9IDQuMCAtIHYueDsKCQl9IGVsc2UgaWYgKCBhYnNWLnggPj0gYWxtb3N0T25lICkgewoJCQlmbG9hdCBzaWduWCA9IHNpZ24oIHYueCApOwoJCQlwbGFuYXIueCA9IHYueiAqIHNpZ25YICsgMi4wICogc2lnblg7CgkJfSBlbHNlIGlmICggYWJzVi55ID49IGFsbW9zdE9uZSApIHsKCQkJZmxvYXQgc2lnblkgPSBzaWduKCB2LnkgKTsKCQkJcGxhbmFyLnggPSB2LnggKyAyLjAgKiBzaWduWSArIDIuMDsKCQkJcGxhbmFyLnkgPSB2LnogKiBzaWduWSAtIDIuMDsKCQl9CgkJcmV0dXJuIHZlYzIoIDAuMTI1LCAwLjI1ICkgKiBwbGFuYXIgKyB2ZWMyKCAwLjM3NSwgMC43NSApOwoJfQoJZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93SW50ZW5zaXR5LCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQsIGZsb2F0IHNoYWRvd0NhbWVyYU5lYXIsIGZsb2F0IHNoYWRvd0NhbWVyYUZhciApIHsKCQlmbG9hdCBzaGFkb3cgPSAxLjA7CgkJdmVjMyBsaWdodFRvUG9zaXRpb24gPSBzaGFkb3dDb29yZC54eXo7CgkJCgkJZmxvYXQgbGlnaHRUb1Bvc2l0aW9uTGVuZ3RoID0gbGVuZ3RoKCBsaWdodFRvUG9zaXRpb24gKTsKCQlpZiAoIGxpZ2h0VG9Qb3NpdGlvbkxlbmd0aCAtIHNoYWRvd0NhbWVyYUZhciA8PSAwLjAgJiYgbGlnaHRUb1Bvc2l0aW9uTGVuZ3RoIC0gc2hhZG93Q2FtZXJhTmVhciA+PSAwLjAgKSB7CgkJCWZsb2F0IGRwID0gKCBsaWdodFRvUG9zaXRpb25MZW5ndGggLSBzaGFkb3dDYW1lcmFOZWFyICkgLyAoIHNoYWRvd0NhbWVyYUZhciAtIHNoYWRvd0NhbWVyYU5lYXIgKTsJCQlkcCArPSBzaGFkb3dCaWFzOwoJCQl2ZWMzIGJkM0QgPSBub3JtYWxpemUoIGxpZ2h0VG9Qb3NpdGlvbiApOwoJCQl2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gKCBzaGFkb3dNYXBTaXplICogdmVjMiggNC4wLCAyLjAgKSApOwoJCQkjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKQoJCQkJdmVjMiBvZmZzZXQgPSB2ZWMyKCAtIDEsIDEgKSAqIHNoYWRvd1JhZGl1cyAqIHRleGVsU2l6ZS55OwoJCQkJc2hhZG93ID0gKAoJCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKQoJCQkJKSAqICggMS4wIC8gOS4wICk7CgkJCSNlbHNlCgkJCQlzaGFkb3cgPSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApOwoJCQkjZW5kaWYKCQl9CgkJcmV0dXJuIG1peCggMS4wLCBzaGFkb3csIHNoYWRvd0ludGVuc2l0eSApOwoJfQojZW5kaWZgLCBzaGFkb3dtYXBfcGFyc192ZXJ0ZXggPSBgI2lmIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyA+IDAKCXVuaWZvcm0gbWF0NCBzcG90TGlnaHRNYXRyaXhbIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyBdOwoJdmFyeWluZyB2ZWM0IHZTcG90TGlnaHRDb29yZFsgTlVNX1NQT1RfTElHSFRfQ09PUkRTIF07CiNlbmRpZgojaWZkZWYgVVNFX1NIQURPV01BUAoJI2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAKCQl1bmlmb3JtIG1hdDQgZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJCXZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07CgkJc3RydWN0IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dJbnRlbnNpdHk7CgkJCWZsb2F0IHNoYWRvd0JpYXM7CgkJCWZsb2F0IHNoYWRvd05vcm1hbEJpYXM7CgkJCWZsb2F0IHNoYWRvd1JhZGl1czsKCQkJdmVjMiBzaGFkb3dNYXBTaXplOwoJCX07CgkJdW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTsKCSNlbmRpZgoJI2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwCgkJc3RydWN0IFNwb3RMaWdodFNoYWRvdyB7CgkJCWZsb2F0IHNoYWRvd0ludGVuc2l0eTsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJfTsKCQl1bmlmb3JtIFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3dzWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07CgkjZW5kaWYKCSNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAKCQl1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07CgkJdmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93SW50ZW5zaXR5OwoJCQlmbG9hdCBzaGFkb3dCaWFzOwoJCQlmbG9hdCBzaGFkb3dOb3JtYWxCaWFzOwoJCQlmbG9hdCBzaGFkb3dSYWRpdXM7CgkJCXZlYzIgc2hhZG93TWFwU2l6ZTsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhRmFyOwoJCX07CgkJdW5pZm9ybSBQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3dzWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCiNlbmRpZmAsIHNoYWRvd21hcF92ZXJ0ZXggPSBgI2lmICggZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMCB8fCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAgKSApIHx8ICggTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMCApCgl2ZWMzIHNoYWRvd1dvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggdHJhbnNmb3JtZWROb3JtYWwsIHZpZXdNYXRyaXggKTsKCXZlYzQgc2hhZG93V29ybGRQb3NpdGlvbjsKI2VuZGlmCiNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkKCSNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwCgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHsKCQkJc2hhZG93V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24gKyB2ZWM0KCBzaGFkb3dXb3JsZE5vcm1hbCAqIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhcywgMCApOwoJCQl2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdID0gZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247CgkJfQoJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkjZW5kaWYKCSNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAKCQkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0CgkJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7CgkJCXNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uICsgdmVjNCggc2hhZG93V29ybGROb3JtYWwgKiBwb2ludExpZ2h0U2hhZG93c1sgaSBdLnNoYWRvd05vcm1hbEJpYXMsIDAgKTsKCQkJdlBvaW50U2hhZG93Q29vcmRbIGkgXSA9IHBvaW50U2hhZG93TWF0cml4WyBpIF0gKiBzaGFkb3dXb3JsZFBvc2l0aW9uOwoJCX0KCQkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCiNlbmRpZgojaWYgTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMAoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRfQ09PUkRTOyBpICsrICkgewoJCXNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uOwoJCSNpZiAoIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyApCgkJCXNoYWRvd1dvcmxkUG9zaXRpb24ueHl6ICs9IHNoYWRvd1dvcmxkTm9ybWFsICogc3BvdExpZ2h0U2hhZG93c1sgaSBdLnNoYWRvd05vcm1hbEJpYXM7CgkJI2VuZGlmCgkJdlNwb3RMaWdodENvb3JkWyBpIF0gPSBzcG90TGlnaHRNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWZgLCBzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQgPSBgZmxvYXQgZ2V0U2hhZG93TWFzaygpIHsKCWZsb2F0IHNoYWRvdyA9IDEuMDsKCSNpZmRlZiBVU0VfU0hBRE9XTUFQCgkjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMAoJRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0OwoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkgewoJCWRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdOwoJCXNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93SW50ZW5zaXR5LCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDAKCVNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHQ7CgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkgewoJCXNwb3RMaWdodCA9IHNwb3RMaWdodFNoYWRvd3NbIGkgXTsKCQlzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0ludGVuc2l0eSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90TGlnaHRDb29yZFsgaSBdICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwCglQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHQ7CgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHsKCQlwb2ludExpZ2h0ID0gcG9pbnRMaWdodFNoYWRvd3NbIGkgXTsKCQlzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93SW50ZW5zaXR5LCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjZW5kaWYKCXJldHVybiBzaGFkb3c7Cn1gLCBza2luYmFzZV92ZXJ0ZXggPSBgI2lmZGVmIFVTRV9TS0lOTklORwoJbWF0NCBib25lTWF0WCA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC54ICk7CgltYXQ0IGJvbmVNYXRZID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnkgKTsKCW1hdDQgYm9uZU1hdFogPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApOwoJbWF0NCBib25lTWF0VyA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC53ICk7CiNlbmRpZmAsIHNraW5uaW5nX3BhcnNfdmVydGV4ID0gYCNpZmRlZiBVU0VfU0tJTk5JTkcKCXVuaWZvcm0gbWF0NCBiaW5kTWF0cml4OwoJdW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXhJbnZlcnNlOwoJdW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgYm9uZVRleHR1cmU7CgltYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7CgkJaW50IHNpemUgPSB0ZXh0dXJlU2l6ZSggYm9uZVRleHR1cmUsIDAgKS54OwoJCWludCBqID0gaW50KCBpICkgKiA0OwoJCWludCB4ID0gaiAlIHNpemU7CgkJaW50IHkgPSBqIC8gc2l6ZTsKCQl2ZWM0IHYxID0gdGV4ZWxGZXRjaCggYm9uZVRleHR1cmUsIGl2ZWMyKCB4LCB5ICksIDAgKTsKCQl2ZWM0IHYyID0gdGV4ZWxGZXRjaCggYm9uZVRleHR1cmUsIGl2ZWMyKCB4ICsgMSwgeSApLCAwICk7CgkJdmVjNCB2MyA9IHRleGVsRmV0Y2goIGJvbmVUZXh0dXJlLCBpdmVjMiggeCArIDIsIHkgKSwgMCApOwoJCXZlYzQgdjQgPSB0ZXhlbEZldGNoKCBib25lVGV4dHVyZSwgaXZlYzIoIHggKyAzLCB5ICksIDAgKTsKCQlyZXR1cm4gbWF0NCggdjEsIHYyLCB2MywgdjQgKTsKCX0KI2VuZGlmYCwgc2tpbm5pbmdfdmVydGV4ID0gYCNpZmRlZiBVU0VfU0tJTk5JTkcKCXZlYzQgc2tpblZlcnRleCA9IGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7Cgl2ZWM0IHNraW5uZWQgPSB2ZWM0KCAwLjAgKTsKCXNraW5uZWQgKz0gYm9uZU1hdFggKiBza2luVmVydGV4ICogc2tpbldlaWdodC54OwoJc2tpbm5lZCArPSBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnk7Cglza2lubmVkICs9IGJvbmVNYXRaICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQuejsKCXNraW5uZWQgKz0gYm9uZU1hdFcgKiBza2luVmVydGV4ICogc2tpbldlaWdodC53OwoJdHJhbnNmb3JtZWQgPSAoIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbm5lZCApLnh5ejsKI2VuZGlmYCwgc2tpbm5vcm1hbF92ZXJ0ZXggPSBgI2lmZGVmIFVTRV9TS0lOTklORwoJbWF0NCBza2luTWF0cml4ID0gbWF0NCggMC4wICk7Cglza2luTWF0cml4ICs9IHNraW5XZWlnaHQueCAqIGJvbmVNYXRYOwoJc2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnkgKiBib25lTWF0WTsKCXNraW5NYXRyaXggKz0gc2tpbldlaWdodC56ICogYm9uZU1hdFo7Cglza2luTWF0cml4ICs9IHNraW5XZWlnaHQudyAqIGJvbmVNYXRXOwoJc2tpbk1hdHJpeCA9IGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbk1hdHJpeCAqIGJpbmRNYXRyaXg7CglvYmplY3ROb3JtYWwgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejsKCSNpZmRlZiBVU0VfVEFOR0VOVAoJCW9iamVjdFRhbmdlbnQgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0VGFuZ2VudCwgMC4wICkgKS54eXo7CgkjZW5kaWYKI2VuZGlmYCwgc3BlY3VsYXJtYXBfZnJhZ21lbnQgPSBgZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDsKI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdmVjNCB0ZXhlbFNwZWN1bGFyID0gdGV4dHVyZTJEKCBzcGVjdWxhck1hcCwgdlNwZWN1bGFyTWFwVXYgKTsKCXNwZWN1bGFyU3RyZW5ndGggPSB0ZXhlbFNwZWN1bGFyLnI7CiNlbHNlCglzcGVjdWxhclN0cmVuZ3RoID0gMS4wOwojZW5kaWZgLCBzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50ID0gYCNpZmRlZiBVU0VfU1BFQ1VMQVJNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFyTWFwOwojZW5kaWZgLCB0b25lbWFwcGluZ19mcmFnbWVudCA9IGAjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HICkKCWdsX0ZyYWdDb2xvci5yZ2IgPSB0b25lTWFwcGluZyggZ2xfRnJhZ0NvbG9yLnJnYiApOwojZW5kaWZgLCB0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50ID0gYCNpZm5kZWYgc2F0dXJhdGUKI2RlZmluZSBzYXR1cmF0ZSggYSApIGNsYW1wKCBhLCAwLjAsIDEuMCApCiNlbmRpZgp1bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7CnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7CglyZXR1cm4gc2F0dXJhdGUoIHRvbmVNYXBwaW5nRXhwb3N1cmUgKiBjb2xvciApOwp9CnZlYzMgUmVpbmhhcmRUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHsKCWNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7CglyZXR1cm4gc2F0dXJhdGUoIGNvbG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTsKfQp2ZWMzIENpbmVvblRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgewoJY29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTsKCWNvbG9yID0gbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApOwoJcmV0dXJuIHBvdyggKCBjb2xvciAqICggNi4yICogY29sb3IgKyAwLjUgKSApIC8gKCBjb2xvciAqICggNi4yICogY29sb3IgKyAxLjcgKSArIDAuMDYgKSwgdmVjMyggMi4yICkgKTsKfQp2ZWMzIFJSVEFuZE9EVEZpdCggdmVjMyB2ICkgewoJdmVjMyBhID0gdiAqICggdiArIDAuMDI0NTc4NiApIC0gMC4wMDAwOTA1Mzc7Cgl2ZWMzIGIgPSB2ICogKCAwLjk4MzcyOSAqIHYgKyAwLjQzMjk1MTAgKSArIDAuMjM4MDgxOwoJcmV0dXJuIGEgLyBiOwp9CnZlYzMgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgewoJY29uc3QgbWF0MyBBQ0VTSW5wdXRNYXQgPSBtYXQzKAoJCXZlYzMoIDAuNTk3MTksIDAuMDc2MDAsIDAuMDI4NDAgKSwJCXZlYzMoIDAuMzU0NTgsIDAuOTA4MzQsIDAuMTMzODMgKSwKCQl2ZWMzKCAwLjA0ODIzLCAwLjAxNTY2LCAwLjgzNzc3ICkKCSk7Cgljb25zdCBtYXQzIEFDRVNPdXRwdXRNYXQgPSBtYXQzKAoJCXZlYzMoICAxLjYwNDc1LCAtMC4xMDIwOCwgLTAuMDAzMjcgKSwJCXZlYzMoIC0wLjUzMTA4LCAgMS4xMDgxMywgLTAuMDcyNzYgKSwKCQl2ZWMzKCAtMC4wNzM2NywgLTAuMDA2MDUsICAxLjA3NjAyICkKCSk7Cgljb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlIC8gMC42OwoJY29sb3IgPSBBQ0VTSW5wdXRNYXQgKiBjb2xvcjsKCWNvbG9yID0gUlJUQW5kT0RURml0KCBjb2xvciApOwoJY29sb3IgPSBBQ0VTT3V0cHV0TWF0ICogY29sb3I7CglyZXR1cm4gc2F0dXJhdGUoIGNvbG9yICk7Cn0KY29uc3QgbWF0MyBMSU5FQVJfUkVDMjAyMF9UT19MSU5FQVJfU1JHQiA9IG1hdDMoCgl2ZWMzKCAxLjY2MDUsIC0gMC4xMjQ2LCAtIDAuMDE4MiApLAoJdmVjMyggLSAwLjU4NzYsIDEuMTMyOSwgLSAwLjEwMDYgKSwKCXZlYzMoIC0gMC4wNzI4LCAtIDAuMDA4MywgMS4xMTg3ICkKKTsKY29uc3QgbWF0MyBMSU5FQVJfU1JHQl9UT19MSU5FQVJfUkVDMjAyMCA9IG1hdDMoCgl2ZWMzKCAwLjYyNzQsIDAuMDY5MSwgMC4wMTY0ICksCgl2ZWMzKCAwLjMyOTMsIDAuOTE5NSwgMC4wODgwICksCgl2ZWMzKCAwLjA0MzMsIDAuMDExMywgMC44OTU2ICkKKTsKdmVjMyBhZ3hEZWZhdWx0Q29udHJhc3RBcHByb3goIHZlYzMgeCApIHsKCXZlYzMgeDIgPSB4ICogeDsKCXZlYzMgeDQgPSB4MiAqIHgyOwoJcmV0dXJuICsgMTUuNSAqIHg0ICogeDIKCQktIDQwLjE0ICogeDQgKiB4CgkJKyAzMS45NiAqIHg0CgkJLSA2Ljg2OCAqIHgyICogeAoJCSsgMC40Mjk4ICogeDIKCQkrIDAuMTE5MSAqIHgKCQktIDAuMDAyMzI7Cn0KdmVjMyBBZ1hUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHsKCWNvbnN0IG1hdDMgQWdYSW5zZXRNYXRyaXggPSBtYXQzKAoJCXZlYzMoIDAuODU2NjI3MTUzMzE1OTgzLCAwLjEzNzMxODk3MjkyOTg0NywgMC4xMTE4OTgyMTI5OTk5NSApLAoJCXZlYzMoIDAuMDk1MTIxMjQwNTM4MTU4OCwgMC43NjEyNDE5OTA2MDI1OTEsIDAuMDc2Nzk5NDE4NjAzMTkwMyApLAoJCXZlYzMoIDAuMDQ4MjUxNjA2MTQ1ODU4MywgMC4xMDE0MzkwMzY0Njc1NjIsIDAuODExMzAyMzY4Mzk2ODU5ICkKCSk7Cgljb25zdCBtYXQzIEFnWE91dHNldE1hdHJpeCA9IG1hdDMoCgkJdmVjMyggMS4xMjcxMDA1ODE4MTQ0MzY4LCAtIDAuMTQxMzI5NzYzNDk4NDM4MywgLSAwLjE0MTMyOTc2MzQ5ODQzODI2ICksCgkJdmVjMyggLSAwLjExMDYwNjY0MzA5NjYwMzIzLCAxLjE1NzgyMzcwMjIxNjI3MiwgLSAwLjExMDYwNjY0MzA5NjYwMjk0ICksCgkJdmVjMyggLSAwLjAxNjQ5MzkzODcxNzgzNDU3MywgLSAwLjAxNjQ5MzkzODcxNzgzNDI1NywgMS4yNTE5MzY0MDY1OTUwNDA1ICkKCSk7Cgljb25zdCBmbG9hdCBBZ3hNaW5FdiA9IC0gMTIuNDczOTM7CWNvbnN0IGZsb2F0IEFneE1heEV2ID0gNC4wMjYwNjk7Cgljb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlOwoJY29sb3IgPSBMSU5FQVJfU1JHQl9UT19MSU5FQVJfUkVDMjAyMCAqIGNvbG9yOwoJY29sb3IgPSBBZ1hJbnNldE1hdHJpeCAqIGNvbG9yOwoJY29sb3IgPSBtYXgoIGNvbG9yLCAxZS0xMCApOwljb2xvciA9IGxvZzIoIGNvbG9yICk7Cgljb2xvciA9ICggY29sb3IgLSBBZ3hNaW5FdiApIC8gKCBBZ3hNYXhFdiAtIEFneE1pbkV2ICk7Cgljb2xvciA9IGNsYW1wKCBjb2xvciwgMC4wLCAxLjAgKTsKCWNvbG9yID0gYWd4RGVmYXVsdENvbnRyYXN0QXBwcm94KCBjb2xvciApOwoJY29sb3IgPSBBZ1hPdXRzZXRNYXRyaXggKiBjb2xvcjsKCWNvbG9yID0gcG93KCBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciApLCB2ZWMzKCAyLjIgKSApOwoJY29sb3IgPSBMSU5FQVJfUkVDMjAyMF9UT19MSU5FQVJfU1JHQiAqIGNvbG9yOwoJY29sb3IgPSBjbGFtcCggY29sb3IsIDAuMCwgMS4wICk7CglyZXR1cm4gY29sb3I7Cn0KdmVjMyBOZXV0cmFsVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7Cgljb25zdCBmbG9hdCBTdGFydENvbXByZXNzaW9uID0gMC44IC0gMC4wNDsKCWNvbnN0IGZsb2F0IERlc2F0dXJhdGlvbiA9IDAuMTU7Cgljb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlOwoJZmxvYXQgeCA9IG1pbiggY29sb3IuciwgbWluKCBjb2xvci5nLCBjb2xvci5iICkgKTsKCWZsb2F0IG9mZnNldCA9IHggPCAwLjA4ID8geCAtIDYuMjUgKiB4ICogeCA6IDAuMDQ7Cgljb2xvciAtPSBvZmZzZXQ7CglmbG9hdCBwZWFrID0gbWF4KCBjb2xvci5yLCBtYXgoIGNvbG9yLmcsIGNvbG9yLmIgKSApOwoJaWYgKCBwZWFrIDwgU3RhcnRDb21wcmVzc2lvbiApIHJldHVybiBjb2xvcjsKCWZsb2F0IGQgPSAxLiAtIFN0YXJ0Q29tcHJlc3Npb247CglmbG9hdCBuZXdQZWFrID0gMS4gLSBkICogZCAvICggcGVhayArIGQgLSBTdGFydENvbXByZXNzaW9uICk7Cgljb2xvciAqPSBuZXdQZWFrIC8gcGVhazsKCWZsb2F0IGcgPSAxLiAtIDEuIC8gKCBEZXNhdHVyYXRpb24gKiAoIHBlYWsgLSBuZXdQZWFrICkgKyAxLiApOwoJcmV0dXJuIG1peCggY29sb3IsIHZlYzMoIG5ld1BlYWsgKSwgZyApOwp9CnZlYzMgQ3VzdG9tVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7IHJldHVybiBjb2xvcjsgfWAsIHRyYW5zbWlzc2lvbl9mcmFnbWVudCA9IGAjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJbWF0ZXJpYWwudHJhbnNtaXNzaW9uID0gdHJhbnNtaXNzaW9uOwoJbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEgPSAxLjA7CgltYXRlcmlhbC50aGlja25lc3MgPSB0aGlja25lc3M7CgltYXRlcmlhbC5hdHRlbnVhdGlvbkRpc3RhbmNlID0gYXR0ZW51YXRpb25EaXN0YW5jZTsKCW1hdGVyaWFsLmF0dGVudWF0aW9uQ29sb3IgPSBhdHRlbnVhdGlvbkNvbG9yOwoJI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVAKCQltYXRlcmlhbC50cmFuc21pc3Npb24gKj0gdGV4dHVyZTJEKCB0cmFuc21pc3Npb25NYXAsIHZUcmFuc21pc3Npb25NYXBVdiApLnI7CgkjZW5kaWYKCSNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQCgkJbWF0ZXJpYWwudGhpY2tuZXNzICo9IHRleHR1cmUyRCggdGhpY2tuZXNzTWFwLCB2VGhpY2tuZXNzTWFwVXYgKS5nOwoJI2VuZGlmCgl2ZWMzIHBvcyA9IHZXb3JsZFBvc2l0aW9uOwoJdmVjMyB2ID0gbm9ybWFsaXplKCBjYW1lcmFQb3NpdGlvbiAtIHBvcyApOwoJdmVjMyBuID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7Cgl2ZWM0IHRyYW5zbWl0dGVkID0gZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbigKCQluLCB2LCBtYXRlcmlhbC5yb3VnaG5lc3MsIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsCgkJcG9zLCBtb2RlbE1hdHJpeCwgdmlld01hdHJpeCwgcHJvamVjdGlvbk1hdHJpeCwgbWF0ZXJpYWwuZGlzcGVyc2lvbiwgbWF0ZXJpYWwuaW9yLCBtYXRlcmlhbC50aGlja25lc3MsCgkJbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciwgbWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZSApOwoJbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEgPSBtaXgoIG1hdGVyaWFsLnRyYW5zbWlzc2lvbkFscGhhLCB0cmFuc21pdHRlZC5hLCBtYXRlcmlhbC50cmFuc21pc3Npb24gKTsKCXRvdGFsRGlmZnVzZSA9IG1peCggdG90YWxEaWZmdXNlLCB0cmFuc21pdHRlZC5yZ2IsIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiApOwojZW5kaWZgLCB0cmFuc21pc3Npb25fcGFyc19mcmFnbWVudCA9IGAjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJdW5pZm9ybSBmbG9hdCB0cmFuc21pc3Npb247Cgl1bmlmb3JtIGZsb2F0IHRoaWNrbmVzczsKCXVuaWZvcm0gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZTsKCXVuaWZvcm0gdmVjMyBhdHRlbnVhdGlvbkNvbG9yOwoJI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25NYXA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQCgkJdW5pZm9ybSBzYW1wbGVyMkQgdGhpY2tuZXNzTWFwOwoJI2VuZGlmCgl1bmlmb3JtIHZlYzIgdHJhbnNtaXNzaW9uU2FtcGxlclNpemU7Cgl1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25TYW1wbGVyTWFwOwoJdW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OwoJdW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7Cgl2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CglmbG9hdCB3MCggZmxvYXQgYSApIHsKCQlyZXR1cm4gKCAxLjAgLyA2LjAgKSAqICggYSAqICggYSAqICggLSBhICsgMy4wICkgLSAzLjAgKSArIDEuMCApOwoJfQoJZmxvYXQgdzEoIGZsb2F0IGEgKSB7CgkJcmV0dXJuICggMS4wIC8gNi4wICkgKiAoIGEgKiAgYSAqICggMy4wICogYSAtIDYuMCApICsgNC4wICk7Cgl9CglmbG9hdCB3MiggZmxvYXQgYSApewoJCXJldHVybiAoIDEuMCAvIDYuMCApICogKCBhICogKCBhICogKCAtIDMuMCAqIGEgKyAzLjAgKSArIDMuMCApICsgMS4wICk7Cgl9CglmbG9hdCB3MyggZmxvYXQgYSApIHsKCQlyZXR1cm4gKCAxLjAgLyA2LjAgKSAqICggYSAqIGEgKiBhICk7Cgl9CglmbG9hdCBnMCggZmxvYXQgYSApIHsKCQlyZXR1cm4gdzAoIGEgKSArIHcxKCBhICk7Cgl9CglmbG9hdCBnMSggZmxvYXQgYSApIHsKCQlyZXR1cm4gdzIoIGEgKSArIHczKCBhICk7Cgl9CglmbG9hdCBoMCggZmxvYXQgYSApIHsKCQlyZXR1cm4gLSAxLjAgKyB3MSggYSApIC8gKCB3MCggYSApICsgdzEoIGEgKSApOwoJfQoJZmxvYXQgaDEoIGZsb2F0IGEgKSB7CgkJcmV0dXJuIDEuMCArIHczKCBhICkgLyAoIHcyKCBhICkgKyB3MyggYSApICk7Cgl9Cgl2ZWM0IGJpY3ViaWMoIHNhbXBsZXIyRCB0ZXgsIHZlYzIgdXYsIHZlYzQgdGV4ZWxTaXplLCBmbG9hdCBsb2QgKSB7CgkJdXYgPSB1diAqIHRleGVsU2l6ZS56dyArIDAuNTsKCQl2ZWMyIGl1diA9IGZsb29yKCB1diApOwoJCXZlYzIgZnV2ID0gZnJhY3QoIHV2ICk7CgkJZmxvYXQgZzB4ID0gZzAoIGZ1di54ICk7CgkJZmxvYXQgZzF4ID0gZzEoIGZ1di54ICk7CgkJZmxvYXQgaDB4ID0gaDAoIGZ1di54ICk7CgkJZmxvYXQgaDF4ID0gaDEoIGZ1di54ICk7CgkJZmxvYXQgaDB5ID0gaDAoIGZ1di55ICk7CgkJZmxvYXQgaDF5ID0gaDEoIGZ1di55ICk7CgkJdmVjMiBwMCA9ICggdmVjMiggaXV2LnggKyBoMHgsIGl1di55ICsgaDB5ICkgLSAwLjUgKSAqIHRleGVsU2l6ZS54eTsKCQl2ZWMyIHAxID0gKCB2ZWMyKCBpdXYueCArIGgxeCwgaXV2LnkgKyBoMHkgKSAtIDAuNSApICogdGV4ZWxTaXplLnh5OwoJCXZlYzIgcDIgPSAoIHZlYzIoIGl1di54ICsgaDB4LCBpdXYueSArIGgxeSApIC0gMC41ICkgKiB0ZXhlbFNpemUueHk7CgkJdmVjMiBwMyA9ICggdmVjMiggaXV2LnggKyBoMXgsIGl1di55ICsgaDF5ICkgLSAwLjUgKSAqIHRleGVsU2l6ZS54eTsKCQlyZXR1cm4gZzAoIGZ1di55ICkgKiAoIGcweCAqIHRleHR1cmVMb2QoIHRleCwgcDAsIGxvZCApICsgZzF4ICogdGV4dHVyZUxvZCggdGV4LCBwMSwgbG9kICkgKSArCgkJCWcxKCBmdXYueSApICogKCBnMHggKiB0ZXh0dXJlTG9kKCB0ZXgsIHAyLCBsb2QgKSArIGcxeCAqIHRleHR1cmVMb2QoIHRleCwgcDMsIGxvZCApICk7Cgl9Cgl2ZWM0IHRleHR1cmVCaWN1YmljKCBzYW1wbGVyMkQgc2FtcGxlciwgdmVjMiB1diwgZmxvYXQgbG9kICkgewoJCXZlYzIgZkxvZFNpemUgPSB2ZWMyKCB0ZXh0dXJlU2l6ZSggc2FtcGxlciwgaW50KCBsb2QgKSApICk7CgkJdmVjMiBjTG9kU2l6ZSA9IHZlYzIoIHRleHR1cmVTaXplKCBzYW1wbGVyLCBpbnQoIGxvZCArIDEuMCApICkgKTsKCQl2ZWMyIGZMb2RTaXplSW52ID0gMS4wIC8gZkxvZFNpemU7CgkJdmVjMiBjTG9kU2l6ZUludiA9IDEuMCAvIGNMb2RTaXplOwoJCXZlYzQgZlNhbXBsZSA9IGJpY3ViaWMoIHNhbXBsZXIsIHV2LCB2ZWM0KCBmTG9kU2l6ZUludiwgZkxvZFNpemUgKSwgZmxvb3IoIGxvZCApICk7CgkJdmVjNCBjU2FtcGxlID0gYmljdWJpYyggc2FtcGxlciwgdXYsIHZlYzQoIGNMb2RTaXplSW52LCBjTG9kU2l6ZSApLCBjZWlsKCBsb2QgKSApOwoJCXJldHVybiBtaXgoIGZTYW1wbGUsIGNTYW1wbGUsIGZyYWN0KCBsb2QgKSApOwoJfQoJdmVjMyBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIGNvbnN0IGluIHZlYzMgbiwgY29uc3QgaW4gdmVjMyB2LCBjb25zdCBpbiBmbG9hdCB0aGlja25lc3MsIGNvbnN0IGluIGZsb2F0IGlvciwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCApIHsKCQl2ZWMzIHJlZnJhY3Rpb25WZWN0b3IgPSByZWZyYWN0KCAtIHYsIG5vcm1hbGl6ZSggbiApLCAxLjAgLyBpb3IgKTsKCQl2ZWMzIG1vZGVsU2NhbGU7CgkJbW9kZWxTY2FsZS54ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMCBdLnh5eiApICk7CgkJbW9kZWxTY2FsZS55ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLnh5eiApICk7CgkJbW9kZWxTY2FsZS56ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMiBdLnh5eiApICk7CgkJcmV0dXJuIG5vcm1hbGl6ZSggcmVmcmFjdGlvblZlY3RvciApICogdGhpY2tuZXNzICogbW9kZWxTY2FsZTsKCX0KCWZsb2F0IGFwcGx5SW9yVG9Sb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgaW9yICkgewoJCXJldHVybiByb3VnaG5lc3MgKiBjbGFtcCggaW9yICogMi4wIC0gMi4wLCAwLjAsIDEuMCApOwoJfQoJdmVjNCBnZXRUcmFuc21pc3Npb25TYW1wbGUoIGNvbnN0IGluIHZlYzIgZnJhZ0Nvb3JkLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGZsb2F0IGlvciApIHsKCQlmbG9hdCBsb2QgPSBsb2cyKCB0cmFuc21pc3Npb25TYW1wbGVyU2l6ZS54ICkgKiBhcHBseUlvclRvUm91Z2huZXNzKCByb3VnaG5lc3MsIGlvciApOwoJCXJldHVybiB0ZXh0dXJlQmljdWJpYyggdHJhbnNtaXNzaW9uU2FtcGxlck1hcCwgZnJhZ0Nvb3JkLnh5LCBsb2QgKTsKCX0KCXZlYzMgdm9sdW1lQXR0ZW51YXRpb24oIGNvbnN0IGluIGZsb2F0IHRyYW5zbWlzc2lvbkRpc3RhbmNlLCBjb25zdCBpbiB2ZWMzIGF0dGVudWF0aW9uQ29sb3IsIGNvbnN0IGluIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2UgKSB7CgkJaWYgKCBpc2luZiggYXR0ZW51YXRpb25EaXN0YW5jZSApICkgewoJCQlyZXR1cm4gdmVjMyggMS4wICk7CgkJfSBlbHNlIHsKCQkJdmVjMyBhdHRlbnVhdGlvbkNvZWZmaWNpZW50ID0gLWxvZyggYXR0ZW51YXRpb25Db2xvciApIC8gYXR0ZW51YXRpb25EaXN0YW5jZTsKCQkJdmVjMyB0cmFuc21pdHRhbmNlID0gZXhwKCAtIGF0dGVudWF0aW9uQ29lZmZpY2llbnQgKiB0cmFuc21pc3Npb25EaXN0YW5jZSApOwkJCXJldHVybiB0cmFuc21pdHRhbmNlOwoJCX0KCX0KCXZlYzQgZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbiggY29uc3QgaW4gdmVjMyBuLCBjb25zdCBpbiB2ZWMzIHYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IsCgkJY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzcGVjdWxhckY5MCwgY29uc3QgaW4gdmVjMyBwb3NpdGlvbiwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCwKCQljb25zdCBpbiBtYXQ0IHZpZXdNYXRyaXgsIGNvbnN0IGluIG1hdDQgcHJvak1hdHJpeCwgY29uc3QgaW4gZmxvYXQgZGlzcGVyc2lvbiwgY29uc3QgaW4gZmxvYXQgaW9yLCBjb25zdCBpbiBmbG9hdCB0aGlja25lc3MsCgkJY29uc3QgaW4gdmVjMyBhdHRlbnVhdGlvbkNvbG9yLCBjb25zdCBpbiBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlICkgewoJCXZlYzQgdHJhbnNtaXR0ZWRMaWdodDsKCQl2ZWMzIHRyYW5zbWl0dGFuY2U7CgkJI2lmZGVmIFVTRV9ESVNQRVJTSU9OCgkJCWZsb2F0IGhhbGZTcHJlYWQgPSAoIGlvciAtIDEuMCApICogMC4wMjUgKiBkaXNwZXJzaW9uOwoJCQl2ZWMzIGlvcnMgPSB2ZWMzKCBpb3IgLSBoYWxmU3ByZWFkLCBpb3IsIGlvciArIGhhbGZTcHJlYWQgKTsKCQkJZm9yICggaW50IGkgPSAwOyBpIDwgMzsgaSArKyApIHsKCQkJCXZlYzMgdHJhbnNtaXNzaW9uUmF5ID0gZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KCBuLCB2LCB0aGlja25lc3MsIGlvcnNbIGkgXSwgbW9kZWxNYXRyaXggKTsKCQkJCXZlYzMgcmVmcmFjdGVkUmF5RXhpdCA9IHBvc2l0aW9uICsgdHJhbnNtaXNzaW9uUmF5OwoJCQkJdmVjNCBuZGNQb3MgPSBwcm9qTWF0cml4ICogdmlld01hdHJpeCAqIHZlYzQoIHJlZnJhY3RlZFJheUV4aXQsIDEuMCApOwoJCQkJdmVjMiByZWZyYWN0aW9uQ29vcmRzID0gbmRjUG9zLnh5IC8gbmRjUG9zLnc7CgkJCQlyZWZyYWN0aW9uQ29vcmRzICs9IDEuMDsKCQkJCXJlZnJhY3Rpb25Db29yZHMgLz0gMi4wOwoJCQkJdmVjNCB0cmFuc21pc3Npb25TYW1wbGUgPSBnZXRUcmFuc21pc3Npb25TYW1wbGUoIHJlZnJhY3Rpb25Db29yZHMsIHJvdWdobmVzcywgaW9yc1sgaSBdICk7CgkJCQl0cmFuc21pdHRlZExpZ2h0WyBpIF0gPSB0cmFuc21pc3Npb25TYW1wbGVbIGkgXTsKCQkJCXRyYW5zbWl0dGVkTGlnaHQuYSArPSB0cmFuc21pc3Npb25TYW1wbGUuYTsKCQkJCXRyYW5zbWl0dGFuY2VbIGkgXSA9IGRpZmZ1c2VDb2xvclsgaSBdICogdm9sdW1lQXR0ZW51YXRpb24oIGxlbmd0aCggdHJhbnNtaXNzaW9uUmF5ICksIGF0dGVudWF0aW9uQ29sb3IsIGF0dGVudWF0aW9uRGlzdGFuY2UgKVsgaSBdOwoJCQl9CgkJCXRyYW5zbWl0dGVkTGlnaHQuYSAvPSAzLjA7CgkJI2Vsc2UKCQkJdmVjMyB0cmFuc21pc3Npb25SYXkgPSBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIG4sIHYsIHRoaWNrbmVzcywgaW9yLCBtb2RlbE1hdHJpeCApOwoJCQl2ZWMzIHJlZnJhY3RlZFJheUV4aXQgPSBwb3NpdGlvbiArIHRyYW5zbWlzc2lvblJheTsKCQkJdmVjNCBuZGNQb3MgPSBwcm9qTWF0cml4ICogdmlld01hdHJpeCAqIHZlYzQoIHJlZnJhY3RlZFJheUV4aXQsIDEuMCApOwoJCQl2ZWMyIHJlZnJhY3Rpb25Db29yZHMgPSBuZGNQb3MueHkgLyBuZGNQb3MudzsKCQkJcmVmcmFjdGlvbkNvb3JkcyArPSAxLjA7CgkJCXJlZnJhY3Rpb25Db29yZHMgLz0gMi4wOwoJCQl0cmFuc21pdHRlZExpZ2h0ID0gZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKCByZWZyYWN0aW9uQ29vcmRzLCByb3VnaG5lc3MsIGlvciApOwoJCQl0cmFuc21pdHRhbmNlID0gZGlmZnVzZUNvbG9yICogdm9sdW1lQXR0ZW51YXRpb24oIGxlbmd0aCggdHJhbnNtaXNzaW9uUmF5ICksIGF0dGVudWF0aW9uQ29sb3IsIGF0dGVudWF0aW9uRGlzdGFuY2UgKTsKCQkjZW5kaWYKCQl2ZWMzIGF0dGVudWF0ZWRDb2xvciA9IHRyYW5zbWl0dGFuY2UgKiB0cmFuc21pdHRlZExpZ2h0LnJnYjsKCQl2ZWMzIEYgPSBFbnZpcm9ubWVudEJSREYoIG4sIHYsIHNwZWN1bGFyQ29sb3IsIHNwZWN1bGFyRjkwLCByb3VnaG5lc3MgKTsKCQlmbG9hdCB0cmFuc21pdHRhbmNlRmFjdG9yID0gKCB0cmFuc21pdHRhbmNlLnIgKyB0cmFuc21pdHRhbmNlLmcgKyB0cmFuc21pdHRhbmNlLmIgKSAvIDMuMDsKCQlyZXR1cm4gdmVjNCggKCAxLjAgLSBGICkgKiBhdHRlbnVhdGVkQ29sb3IsIDEuMCAtICggMS4wIC0gdHJhbnNtaXR0ZWRMaWdodC5hICkgKiB0cmFuc21pdHRhbmNlRmFjdG9yICk7Cgl9CiNlbmRpZmAsIHV2X3BhcnNfZnJhZ21lbnQgPSBgI2lmIGRlZmluZWQoIFVTRV9VViApIHx8IGRlZmluZWQoIFVTRV9BTklTT1RST1BZICkKCXZhcnlpbmcgdmVjMiB2VXY7CiNlbmRpZgojaWZkZWYgVVNFX01BUAoJdmFyeWluZyB2ZWMyIHZNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQUxQSEFNQVAKCXZhcnlpbmcgdmVjMiB2QWxwaGFNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTElHSFRNQVAKCXZhcnlpbmcgdmVjMiB2TGlnaHRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQU9NQVAKCXZhcnlpbmcgdmVjMiB2QW9NYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQlVNUE1BUAoJdmFyeWluZyB2ZWMyIHZCdW1wTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX05PUk1BTE1BUAoJdmFyeWluZyB2ZWMyIHZOb3JtYWxNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfRU1JU1NJVkVNQVAKCXZhcnlpbmcgdmVjMiB2RW1pc3NpdmVNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQCgl2YXJ5aW5nIHZlYzIgdk1ldGFsbmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVAKCXZhcnlpbmcgdmVjMiB2Um91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVAKCXZhcnlpbmcgdmVjMiB2QW5pc290cm9weU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVAKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0Tm9ybWFsTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0Um91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFTUFQCgl2YXJ5aW5nIHZlYzIgdklyaWRlc2NlbmNlTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUAoJdmFyeWluZyB2ZWMyIHZJcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUAoJdmFyeWluZyB2ZWMyIHZTaGVlbkNvbG9yTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NIRUVOX1JPVUdITkVTU01BUAoJdmFyeWluZyB2ZWMyIHZTaGVlblJvdWdobmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdmFyeWluZyB2ZWMyIHZTcGVjdWxhck1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUl9DT0xPUk1BUAoJdmFyeWluZyB2ZWMyIHZTcGVjdWxhckNvbG9yTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUAoJdmFyeWluZyB2ZWMyIHZTcGVjdWxhckludGVuc2l0eU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVAKCXVuaWZvcm0gbWF0MyB0cmFuc21pc3Npb25NYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlRyYW5zbWlzc2lvbk1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9USElDS05FU1NNQVAKCXVuaWZvcm0gbWF0MyB0aGlja25lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlRoaWNrbmVzc01hcFV2OwojZW5kaWZgLCB1dl9wYXJzX3ZlcnRleCA9IGAjaWYgZGVmaW5lZCggVVNFX1VWICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKQoJdmFyeWluZyB2ZWMyIHZVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTUFQCgl1bmlmb3JtIG1hdDMgbWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQUxQSEFNQVAKCXVuaWZvcm0gbWF0MyBhbHBoYU1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2QWxwaGFNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTElHSFRNQVAKCXVuaWZvcm0gbWF0MyBsaWdodE1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2TGlnaHRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQU9NQVAKCXVuaWZvcm0gbWF0MyBhb01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2QW9NYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQlVNUE1BUAoJdW5pZm9ybSBtYXQzIGJ1bXBNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkJ1bXBNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTk9STUFMTUFQCgl1bmlmb3JtIG1hdDMgbm9ybWFsTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZOb3JtYWxNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgl1bmlmb3JtIG1hdDMgZGlzcGxhY2VtZW50TWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZEaXNwbGFjZW1lbnRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfRU1JU1NJVkVNQVAKCXVuaWZvcm0gbWF0MyBlbWlzc2l2ZU1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2RW1pc3NpdmVNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQCgl1bmlmb3JtIG1hdDMgbWV0YWxuZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZNZXRhbG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQCgl1bmlmb3JtIG1hdDMgcm91Z2huZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZSb3VnaG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUAoJdW5pZm9ybSBtYXQzIGFuaXNvdHJvcHlNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkFuaXNvdHJvcHlNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQCgl1bmlmb3JtIG1hdDMgY2xlYXJjb2F0TWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJdW5pZm9ybSBtYXQzIGNsZWFyY29hdE5vcm1hbE1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0Tm9ybWFsTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAKCXVuaWZvcm0gbWF0MyBjbGVhcmNvYXRSb3VnaG5lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkNsZWFyY29hdFJvdWdobmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUAoJdW5pZm9ybSBtYXQzIHNoZWVuQ29sb3JNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNoZWVuQ29sb3JNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgl1bmlmb3JtIG1hdDMgc2hlZW5Sb3VnaG5lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNoZWVuUm91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFTUFQCgl1bmlmb3JtIG1hdDMgaXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdklyaWRlc2NlbmNlTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUAoJdW5pZm9ybSBtYXQzIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZJcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdW5pZm9ybSBtYXQzIHNwZWN1bGFyTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZTcGVjdWxhck1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUl9DT0xPUk1BUAoJdW5pZm9ybSBtYXQzIHNwZWN1bGFyQ29sb3JNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyQ29sb3JNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQCgl1bmlmb3JtIG1hdDMgc3BlY3VsYXJJbnRlbnNpdHlNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFySW50ZW5zaXR5TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUAoJdW5pZm9ybSBtYXQzIHRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2VHJhbnNtaXNzaW9uTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1RISUNLTkVTU01BUAoJdW5pZm9ybSBtYXQzIHRoaWNrbmVzc01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2VGhpY2tuZXNzTWFwVXY7CiNlbmRpZmAsIHV2X3ZlcnRleCA9IGAjaWYgZGVmaW5lZCggVVNFX1VWICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKQoJdlV2ID0gdmVjMyggdXYsIDEgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfTUFQCgl2TWFwVXYgPSAoIG1hcFRyYW5zZm9ybSAqIHZlYzMoIE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0FMUEhBTUFQCgl2QWxwaGFNYXBVdiA9ICggYWxwaGFNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBBTFBIQU1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0xJR0hUTUFQCgl2TGlnaHRNYXBVdiA9ICggbGlnaHRNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBMSUdIVE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0FPTUFQCgl2QW9NYXBVdiA9ICggYW9NYXBUcmFuc2Zvcm0gKiB2ZWMzKCBBT01BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0JVTVBNQVAKCXZCdW1wTWFwVXYgPSAoIGJ1bXBNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBCVU1QTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfTk9STUFMTUFQCgl2Tm9ybWFsTWFwVXYgPSAoIG5vcm1hbE1hcFRyYW5zZm9ybSAqIHZlYzMoIE5PUk1BTE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUAoJdkRpc3BsYWNlbWVudE1hcFV2ID0gKCBkaXNwbGFjZW1lbnRNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBESVNQTEFDRU1FTlRNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9FTUlTU0lWRU1BUAoJdkVtaXNzaXZlTWFwVXYgPSAoIGVtaXNzaXZlTWFwVHJhbnNmb3JtICogdmVjMyggRU1JU1NJVkVNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVAKCXZNZXRhbG5lc3NNYXBVdiA9ICggbWV0YWxuZXNzTWFwVHJhbnNmb3JtICogdmVjMyggTUVUQUxORVNTTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQCgl2Um91Z2huZXNzTWFwVXYgPSAoIHJvdWdobmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIFJPVUdITkVTU01BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVAKCXZBbmlzb3Ryb3B5TWFwVXYgPSAoIGFuaXNvdHJvcHlNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBBTklTT1RST1BZTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQCgl2Q2xlYXJjb2F0TWFwVXYgPSAoIGNsZWFyY29hdE1hcFRyYW5zZm9ybSAqIHZlYzMoIENMRUFSQ09BVE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAKCXZDbGVhcmNvYXROb3JtYWxNYXBVdiA9ICggY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtICogdmVjMyggQ0xFQVJDT0FUX05PUk1BTE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAKCXZDbGVhcmNvYXRSb3VnaG5lc3NNYXBVdiA9ICggY2xlYXJjb2F0Um91Z2huZXNzTWFwVHJhbnNmb3JtICogdmVjMyggQ0xFQVJDT0FUX1JPVUdITkVTU01BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFTUFQCgl2SXJpZGVzY2VuY2VNYXBVdiA9ICggaXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBJUklERVNDRU5DRU1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUAoJdklyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXYgPSAoIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVHJhbnNmb3JtICogdmVjMyggSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU5fQ09MT1JNQVAKCXZTaGVlbkNvbG9yTWFwVXYgPSAoIHNoZWVuQ29sb3JNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBTSEVFTl9DT0xPUk1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1NIRUVOX1JPVUdITkVTU01BUAoJdlNoZWVuUm91Z2huZXNzTWFwVXYgPSAoIHNoZWVuUm91Z2huZXNzTWFwVHJhbnNmb3JtICogdmVjMyggU0hFRU5fUk9VR0hORVNTTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVAKCXZTcGVjdWxhck1hcFV2ID0gKCBzcGVjdWxhck1hcFRyYW5zZm9ybSAqIHZlYzMoIFNQRUNVTEFSTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAKCXZTcGVjdWxhckNvbG9yTWFwVXYgPSAoIHNwZWN1bGFyQ29sb3JNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBTUEVDVUxBUl9DT0xPUk1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUAoJdlNwZWN1bGFySW50ZW5zaXR5TWFwVXYgPSAoIHNwZWN1bGFySW50ZW5zaXR5TWFwVHJhbnNmb3JtICogdmVjMyggU1BFQ1VMQVJfSU5URU5TSVRZTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQCgl2VHJhbnNtaXNzaW9uTWFwVXYgPSAoIHRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybSAqIHZlYzMoIFRSQU5TTUlTU0lPTk1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1RISUNLTkVTU01BUAoJdlRoaWNrbmVzc01hcFV2ID0gKCB0aGlja25lc3NNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBUSElDS05FU1NNQVBfVVYsIDEgKSApLnh5OwojZW5kaWZgLCB3b3JsZHBvc192ZXJ0ZXggPSBgI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkKCBESVNUQU5DRSApIHx8IGRlZmluZWQgKCBVU0VfU0hBRE9XTUFQICkgfHwgZGVmaW5lZCAoIFVTRV9UUkFOU01JU1NJT04gKSB8fCBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwCgl2ZWM0IHdvcmxkUG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7CgkjaWZkZWYgVVNFX0JBVENISU5HCgkJd29ybGRQb3NpdGlvbiA9IGJhdGNoaW5nTWF0cml4ICogd29ybGRQb3NpdGlvbjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9JTlNUQU5DSU5HCgkJd29ybGRQb3NpdGlvbiA9IGluc3RhbmNlTWF0cml4ICogd29ybGRQb3NpdGlvbjsKCSNlbmRpZgoJd29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4ICogd29ybGRQb3NpdGlvbjsKI2VuZGlmYCwgdmVydGV4JGggPSBgdmFyeWluZyB2ZWMyIHZVdjsKdW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtOwp2b2lkIG1haW4oKSB7Cgl2VXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggdXYsIDEgKSApLnh5OwoJZ2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbi54eSwgMS4wLCAxLjAgKTsKfWAsIGZyYWdtZW50JGggPSBgdW5pZm9ybSBzYW1wbGVyMkQgdDJEOwp1bmlmb3JtIGZsb2F0IGJhY2tncm91bmRJbnRlbnNpdHk7CnZhcnlpbmcgdmVjMiB2VXY7CnZvaWQgbWFpbigpIHsKCXZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQoIHQyRCwgdlV2ICk7CgkjaWZkZWYgREVDT0RFX1ZJREVPX1RFWFRVUkUKCQl0ZXhDb2xvciA9IHZlYzQoIG1peCggcG93KCB0ZXhDb2xvci5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdGV4Q29sb3IucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB0ZXhDb2xvci5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdGV4Q29sb3IudyApOwoJI2VuZGlmCgl0ZXhDb2xvci5yZ2IgKj0gYmFja2dyb3VuZEludGVuc2l0eTsKCWdsX0ZyYWdDb2xvciA9IHRleENvbG9yOwoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+Cn1gLCB2ZXJ0ZXgkZyA9IGB2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgp2b2lkIG1haW4oKSB7Cgl2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApOwoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCWdsX1Bvc2l0aW9uLnogPSBnbF9Qb3NpdGlvbi53Owp9YCwgZnJhZ21lbnQkZyA9IGAjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRQoJdW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7CiNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKQoJdW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwOwojZW5kaWYKdW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwOwp1bmlmb3JtIGZsb2F0IGJhY2tncm91bmRCbHVycmluZXNzOwp1bmlmb3JtIGZsb2F0IGJhY2tncm91bmRJbnRlbnNpdHk7CnVuaWZvcm0gbWF0MyBiYWNrZ3JvdW5kUm90YXRpb247CnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFCgkJdmVjNCB0ZXhDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIGJhY2tncm91bmRSb3RhdGlvbiAqIHZlYzMoIGZsaXBFbnZNYXAgKiB2V29ybGREaXJlY3Rpb24ueCwgdldvcmxkRGlyZWN0aW9uLnl6ICkgKTsKCSNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKQoJCXZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIGJhY2tncm91bmRSb3RhdGlvbiAqIHZXb3JsZERpcmVjdGlvbiwgYmFja2dyb3VuZEJsdXJyaW5lc3MgKTsKCSNlbHNlCgkJdmVjNCB0ZXhDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApOwoJI2VuZGlmCgl0ZXhDb2xvci5yZ2IgKj0gYmFja2dyb3VuZEludGVuc2l0eTsKCWdsX0ZyYWdDb2xvciA9IHRleENvbG9yOwoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+Cn1gLCB2ZXJ0ZXgkZiA9IGB2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgp2b2lkIG1haW4oKSB7Cgl2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApOwoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCWdsX1Bvc2l0aW9uLnogPSBnbF9Qb3NpdGlvbi53Owp9YCwgZnJhZ21lbnQkZiA9IGB1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlOwp1bmlmb3JtIGZsb2F0IHRGbGlwOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CnZvaWQgbWFpbigpIHsKCXZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlQ3ViZSggdEN1YmUsIHZlYzMoIHRGbGlwICogdldvcmxkRGlyZWN0aW9uLngsIHZXb3JsZERpcmVjdGlvbi55eiApICk7CglnbF9GcmFnQ29sb3IgPSB0ZXhDb2xvcjsKCWdsX0ZyYWdDb2xvci5hICo9IG9wYWNpdHk7CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KfWAsIHZlcnRleCRlID0gYCNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2YXJ5aW5nIHZlYzIgdkhpZ2hQcmVjaXNpb25aVzsKdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVAKCQkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2VuZGlmCgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZIaWdoUHJlY2lzaW9uWlcgPSBnbF9Qb3NpdGlvbi56dzsKfWAsIGZyYWdtZW50JGUgPSBgI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMAoJdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojZW5kaWYKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4KdmFyeWluZyB2ZWMyIHZIaWdoUHJlY2lzaW9uWlc7CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMS4wICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMAoJCWRpZmZ1c2VDb2xvci5hID0gb3BhY2l0eTsKCSNlbmRpZgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJZmxvYXQgZnJhZ0Nvb3JkWiA9IDAuNSAqIHZIaWdoUHJlY2lzaW9uWldbMF0gLyB2SGlnaFByZWNpc2lvblpXWzFdICsgMC41OwoJI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMAoJCWdsX0ZyYWdDb2xvciA9IHZlYzQoIHZlYzMoIDEuMCAtIGZyYWdDb29yZFogKSwgb3BhY2l0eSApOwoJI2VsaWYgREVQVEhfUEFDS0lORyA9PSAzMjAxCgkJZ2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBmcmFnQ29vcmRaICk7CgkjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDIKCQlnbF9GcmFnQ29sb3IgPSB2ZWM0KCBwYWNrRGVwdGhUb1JHQiggZnJhZ0Nvb3JkWiApLCAxLjAgKTsKCSNlbGlmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMwoJCWdsX0ZyYWdDb2xvciA9IHZlYzQoIHBhY2tEZXB0aFRvUkcoIGZyYWdDb29yZFogKSwgMC4wLCAxLjAgKTsKCSNlbmRpZgp9YCwgdmVydGV4JGQgPSBgI2RlZmluZSBESVNUQU5DRQp2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVAKCQkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2VuZGlmCgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7Cn1gLCBmcmFnbWVudCRkID0gYCNkZWZpbmUgRElTVEFOQ0UKdW5pZm9ybSB2ZWMzIHJlZmVyZW5jZVBvc2l0aW9uOwp1bmlmb3JtIGZsb2F0IG5lYXJEaXN0YW5jZTsKdW5pZm9ybSBmbG9hdCBmYXJEaXN0YW5jZTsKdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbiAoKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCWZsb2F0IGRpc3QgPSBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTsKCWRpc3QgPSAoIGRpc3QgLSBuZWFyRGlzdGFuY2UgKSAvICggZmFyRGlzdGFuY2UgLSBuZWFyRGlzdGFuY2UgKTsKCWRpc3QgPSBzYXR1cmF0ZSggZGlzdCApOwoJZ2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7Cn1gLCB2ZXJ0ZXgkYyA9IGB2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgp2b2lkIG1haW4oKSB7Cgl2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApOwoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KfWAsIGZyYWdtZW50JGMgPSBgdW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0Owp2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgp2b2lkIG1haW4oKSB7Cgl2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7Cgl2ZWMyIHNhbXBsZVVWID0gZXF1aXJlY3RVdiggZGlyZWN0aW9uICk7CglnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTsKCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50Pgp9YCwgdmVydGV4JGIgPSBgdW5pZm9ybSBmbG9hdCBzY2FsZTsKYXR0cmlidXRlIGZsb2F0IGxpbmVEaXN0YW5jZTsKdmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCXZMaW5lRGlzdGFuY2UgPSBzY2FsZSAqIGxpbmVEaXN0YW5jZTsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsIGZyYWdtZW50JGIgPSBgdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKdW5pZm9ybSBmbG9hdCBkYXNoU2l6ZTsKdW5pZm9ybSBmbG9hdCB0b3RhbFNpemU7CnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJaWYgKCBtb2QoIHZMaW5lRGlzdGFuY2UsIHRvdGFsU2l6ZSApID4gZGFzaFNpemUgKSB7CgkJZGlzY2FyZDsKCX0KCXZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCW91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiOwoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50Pgp9YCwgdmVydGV4JGEgPSBgI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2lmIGRlZmluZWQgKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCAoIFVTRV9TS0lOTklORyApCgkJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJCSNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD4KCSNlbmRpZgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+Cn1gLCBmcmFnbWVudCRhID0gYHVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpZm5kZWYgRkxBVF9TSEFERUQKCXZhcnlpbmcgdmVjMyB2Tm9ybWFsOwojZW5kaWYKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PgoJUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTsKCSNpZmRlZiBVU0VfTElHSFRNQVAKCQl2ZWM0IGxpZ2h0TWFwVGV4ZWwgPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2TGlnaHRNYXBVdiApOwoJCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBsaWdodE1hcFRleGVsLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5ICogUkVDSVBST0NBTF9QSTsKCSNlbHNlCgkJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZlYzMoIDEuMCApOwoJI2VuZGlmCgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gZGlmZnVzZUNvbG9yLnJnYjsKCXZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTsKCSNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCwgdmVydGV4JDkgPSBgI2RlZmluZSBMQU1CRVJUCnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8dXZfdmVydGV4PgoJI2luY2x1ZGUgPGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgoJdlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCwgZnJhZ21lbnQkOSA9IGAjZGVmaW5lIExBTUJFUlQKdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJzZGZzPgojaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0c19sYW1iZXJ0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTsKCXZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxpZ2h0c19sYW1iZXJ0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPgoJI2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTsKCSNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCwgdmVydGV4JDggPSBgI2RlZmluZSBNQVRDQVAKdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6Owp9YCwgZnJhZ21lbnQkOCA9IGAjZGVmaW5lIE1BVENBUAp1bmlmb3JtIHZlYzMgZGlmZnVzZTsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5Owp1bmlmb3JtIHNhbXBsZXIyRCBtYXRjYXA7CnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+Cgl2ZWMzIHZpZXdEaXIgPSBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTsKCXZlYzMgeCA9IG5vcm1hbGl6ZSggdmVjMyggdmlld0Rpci56LCAwLjAsIC0gdmlld0Rpci54ICkgKTsKCXZlYzMgeSA9IGNyb3NzKCB2aWV3RGlyLCB4ICk7Cgl2ZWMyIHV2ID0gdmVjMiggZG90KCB4LCBub3JtYWwgKSwgZG90KCB5LCBub3JtYWwgKSApICogMC40OTUgKyAwLjU7CgkjaWZkZWYgVVNFX01BVENBUAoJCXZlYzQgbWF0Y2FwQ29sb3IgPSB0ZXh0dXJlMkQoIG1hdGNhcCwgdXYgKTsKCSNlbHNlCgkJdmVjNCBtYXRjYXBDb2xvciA9IHZlYzQoIHZlYzMoIG1peCggMC4yLCAwLjgsIHV2LnkgKSApLCAxLjAgKTsKCSNlbmRpZgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYiAqIG1hdGNhcENvbG9yLnJnYjsKCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KCSNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+Cn1gLCB2ZXJ0ZXgkNyA9IGAjZGVmaW5lIE5PUk1BTAojaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFICkKCXZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojZW5kaWYKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSApCgl2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejsKI2VuZGlmCn1gLCBmcmFnbWVudCQ3ID0gYCNkZWZpbmUgTk9STUFMCnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSApCgl2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2VuZGlmCiNpbmNsdWRlIDxwYWNraW5nPgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+CglnbF9GcmFnQ29sb3IgPSB2ZWM0KCBwYWNrTm9ybWFsVG9SR0IoIG5vcm1hbCApLCBkaWZmdXNlQ29sb3IuYSApOwoJI2lmZGVmIE9QQVFVRQoJCWdsX0ZyYWdDb2xvci5hID0gMS4wOwoJI2VuZGlmCn1gLCB2ZXJ0ZXgkNiA9IGAjZGVmaW5lIFBIT05HCnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8dXZfdmVydGV4PgoJI2luY2x1ZGUgPGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgoJdlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCwgZnJhZ21lbnQkNiA9IGAjZGVmaW5lIFBIT05HCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gdmVjMyBzcGVjdWxhcjsKdW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxic2Rmcz4KI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJdmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX3Bob25nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPgoJI2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTsKCSNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCwgdmVydGV4JDUgPSBgI2RlZmluZSBTVEFOREFSRAp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2lmZGVmIFVTRV9UUkFOU01JU1NJT04KCXZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjsKI2VuZGlmCiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+Cgl2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejsKCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4PgojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJdldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejsKI2VuZGlmCn1gLCBmcmFnbWVudCQ1ID0gYCNkZWZpbmUgU1RBTkRBUkQKI2lmZGVmIFBIWVNJQ0FMCgkjZGVmaW5lIElPUgoJI2RlZmluZSBVU0VfU1BFQ1VMQVIKI2VuZGlmCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzOwp1bmlmb3JtIGZsb2F0IG1ldGFsbmVzczsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaWZkZWYgSU9SCgl1bmlmb3JtIGZsb2F0IGlvcjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVIKCXVuaWZvcm0gZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHk7Cgl1bmlmb3JtIHZlYzMgc3BlY3VsYXJDb2xvcjsKCSNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhckNvbG9yTWFwOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFySW50ZW5zaXR5TWFwOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVAoJdW5pZm9ybSBmbG9hdCBjbGVhcmNvYXQ7Cgl1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzczsKI2VuZGlmCiNpZmRlZiBVU0VfRElTUEVSU0lPTgoJdW5pZm9ybSBmbG9hdCBkaXNwZXJzaW9uOwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJdW5pZm9ybSBmbG9hdCBpcmlkZXNjZW5jZTsKCXVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2VJT1I7Cgl1bmlmb3JtIGZsb2F0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTsKCXVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtOwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTgoJdW5pZm9ybSB2ZWMzIHNoZWVuQ29sb3I7Cgl1bmlmb3JtIGZsb2F0IHNoZWVuUm91Z2huZXNzOwoJI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNoZWVuQ29sb3JNYXA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgkJdW5pZm9ybSBzYW1wbGVyMkQgc2hlZW5Sb3VnaG5lc3NNYXA7CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfQU5JU09UUk9QWQoJdW5pZm9ybSB2ZWMyIGFuaXNvdHJvcHlWZWN0b3I7CgkjaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCBhbmlzb3Ryb3B5TWFwOwoJI2VuZGlmCiNlbmRpZgp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGlyaWRlc2NlbmNlX2ZyYWdtZW50PgojaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHRyYW5zbWlzc2lvbl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8aXJpZGVzY2VuY2VfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCVJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7Cgl2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHJvdWdobmVzc21hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD4KCSNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD4KCXZlYzMgdG90YWxEaWZmdXNlID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTsKCXZlYzMgdG90YWxTcGVjdWxhciA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhcjsKCSNpbmNsdWRlIDx0cmFuc21pc3Npb25fZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSB0b3RhbERpZmZ1c2UgKyB0b3RhbFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlOwoJI2lmZGVmIFVTRV9TSEVFTgoJCWZsb2F0IHNoZWVuRW5lcmd5Q29tcCA9IDEuMCAtIDAuMTU3ICogbWF4MyggbWF0ZXJpYWwuc2hlZW5Db2xvciApOwoJCW91dGdvaW5nTGlnaHQgPSBvdXRnb2luZ0xpZ2h0ICogc2hlZW5FbmVyZ3lDb21wICsgc2hlZW5TcGVjdWxhckRpcmVjdCArIHNoZWVuU3BlY3VsYXJJbmRpcmVjdDsKCSNlbmRpZgoJI2lmZGVmIFVTRV9DTEVBUkNPQVQKCQlmbG9hdCBkb3ROVmNjID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGdlb21ldHJ5Vmlld0RpciApICk7CgkJdmVjMyBGY2MgPSBGX1NjaGxpY2soIG1hdGVyaWFsLmNsZWFyY29hdEYwLCBtYXRlcmlhbC5jbGVhcmNvYXRGOTAsIGRvdE5WY2MgKTsKCQlvdXRnb2luZ0xpZ2h0ID0gb3V0Z29pbmdMaWdodCAqICggMS4wIC0gbWF0ZXJpYWwuY2xlYXJjb2F0ICogRmNjICkgKyAoIGNsZWFyY29hdFNwZWN1bGFyRGlyZWN0ICsgY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdCApICogbWF0ZXJpYWwuY2xlYXJjb2F0OwoJI2VuZGlmCgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCwgdmVydGV4JDQgPSBgI2RlZmluZSBUT09OCnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8dXZfdmVydGV4PgoJI2luY2x1ZGUgPGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgoJdlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsIGZyYWdtZW50JDQgPSBgI2RlZmluZSBUT09OCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJzZGZzPgojaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJdmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX3Rvb25fZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+CgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlOwoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD4KfWAsIHZlcnRleCQzID0gYHVuaWZvcm0gZmxvYXQgc2l6ZTsKdW5pZm9ybSBmbG9hdCBzY2FsZTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4KI2lmZGVmIFVTRV9QT0lOVFNfVVYKCXZhcnlpbmcgdmVjMiB2VXY7Cgl1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07CiNlbmRpZgp2b2lkIG1haW4oKSB7CgkjaWZkZWYgVVNFX1BPSU5UU19VVgoJCXZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7CgkjZW5kaWYKCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCWdsX1BvaW50U2l6ZSA9IHNpemU7CgkjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTgoJCWJvb2wgaXNQZXJzcGVjdGl2ZSA9IGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKTsKCQlpZiAoIGlzUGVyc3BlY3RpdmUgKSBnbF9Qb2ludFNpemUgKj0gKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7CgkjZW5kaWYKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsIGZyYWdtZW50JDMgPSBgdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWFwX3BhcnRpY2xlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+CglvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjsKCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KfWAsIHZlcnRleCQyID0gYCNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsIGZyYWdtZW50JDIgPSBgdW5pZm9ybSB2ZWMzIGNvbG9yOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxwYWNraW5nPgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxic2Rmcz4KI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFza19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CglnbF9GcmFnQ29sb3IgPSB2ZWM0KCBjb2xvciwgb3BhY2l0eSAqICggMS4wIC0gZ2V0U2hhZG93TWFzaygpICkgKTsKCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KfWAsIHZlcnRleCQxID0gYHVuaWZvcm0gZmxvYXQgcm90YXRpb247CnVuaWZvcm0gdmVjMiBjZW50ZXI7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8dXZfdmVydGV4PgoJdmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4WyAzIF07Cgl2ZWMyIHNjYWxlID0gdmVjMiggbGVuZ3RoKCBtb2RlbE1hdHJpeFsgMCBdLnh5eiApLCBsZW5ndGgoIG1vZGVsTWF0cml4WyAxIF0ueHl6ICkgKTsKCSNpZm5kZWYgVVNFX1NJWkVBVFRFTlVBVElPTgoJCWJvb2wgaXNQZXJzcGVjdGl2ZSA9IGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKTsKCQlpZiAoIGlzUGVyc3BlY3RpdmUgKSBzY2FsZSAqPSAtIG12UG9zaXRpb24uejsKCSNlbmRpZgoJdmVjMiBhbGlnbmVkUG9zaXRpb24gPSAoIHBvc2l0aW9uLnh5IC0gKCBjZW50ZXIgLSB2ZWMyKCAwLjUgKSApICkgKiBzY2FsZTsKCXZlYzIgcm90YXRlZFBvc2l0aW9uOwoJcm90YXRlZFBvc2l0aW9uLnggPSBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCAtIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55OwoJcm90YXRlZFBvc2l0aW9uLnkgPSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55OwoJbXZQb3NpdGlvbi54eSArPSByb3RhdGVkUG9zaXRpb247CglnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+Cn1gLCBmcmFnbWVudCQxID0gYHVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCW91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiOwoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KfWAsIFNoYWRlckNodW5rLCBVbmlmb3Jtc0xpYiwgU2hhZGVyTGliLCBfcmdiLCBfZTEkMSwgX20xJDEyLCBMT0RfTUlOID0gNCwgRVhUUkFfTE9EX1NJR01BLCBNQVhfU0FNUExFUyA9IDIwLCBfZmxhdENhbWVyYSwgX2NsZWFyQ29sb3IsIF9vbGRUYXJnZXQgPSBudWxsLCBfb2xkQWN0aXZlQ3ViZUZhY2UgPSAwLCBfb2xkQWN0aXZlTWlwbWFwTGV2ZWwgPSAwLCBfb2xkWHJFbmFibGVkID0gZmFsc2UsIFBISSwgSU5WX1BISSwgX2F4aXNEaXJlY3Rpb25zLCBlbXB0eVRleHR1cmUsIGVtcHR5U2hhZG93VGV4dHVyZSwgZW1wdHlBcnJheVRleHR1cmUsIGVtcHR5M2RUZXh0dXJlLCBlbXB0eUN1YmVUZXh0dXJlLCBhcnJheUNhY2hlRjMyLCBhcnJheUNhY2hlSTMyLCBtYXQ0YXJyYXksIG1hdDNhcnJheSwgbWF0MmFycmF5LCBSZVBhdGhQYXJ0LCBDT01QTEVUSU9OX1NUQVRVU19LSFIgPSAzNzI5NywgcHJvZ3JhbUlkQ291bnQgPSAwLCBfbTAsIF92MDIsIGluY2x1ZGVQYXR0ZXJuLCBzaGFkZXJDaHVua01hcCwgdW5yb2xsTG9vcFBhdHRlcm4sIF9pZDIgPSAwLCBuZXh0VmVyc2lvbiA9IDAsIHZlcnRleCA9IGB2b2lkIG1haW4oKSB7CglnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLCAxLjAgKTsKfWAsIGZyYWdtZW50ID0gYHVuaWZvcm0gc2FtcGxlcjJEIHNoYWRvd19wYXNzOwp1bmlmb3JtIHZlYzIgcmVzb2x1dGlvbjsKdW5pZm9ybSBmbG9hdCByYWRpdXM7CiNpbmNsdWRlIDxwYWNraW5nPgp2b2lkIG1haW4oKSB7Cgljb25zdCBmbG9hdCBzYW1wbGVzID0gZmxvYXQoIFZTTV9TQU1QTEVTICk7CglmbG9hdCBtZWFuID0gMC4wOwoJZmxvYXQgc3F1YXJlZF9tZWFuID0gMC4wOwoJZmxvYXQgdXZTdHJpZGUgPSBzYW1wbGVzIDw9IDEuMCA/IDAuMCA6IDIuMCAvICggc2FtcGxlcyAtIDEuMCApOwoJZmxvYXQgdXZTdGFydCA9IHNhbXBsZXMgPD0gMS4wID8gMC4wIDogLSAxLjA7Cglmb3IgKCBmbG9hdCBpID0gMC4wOyBpIDwgc2FtcGxlczsgaSArKyApIHsKCQlmbG9hdCB1dk9mZnNldCA9IHV2U3RhcnQgKyBpICogdXZTdHJpZGU7CgkJI2lmZGVmIEhPUklaT05UQUxfUEFTUwoJCQl2ZWMyIGRpc3RyaWJ1dGlvbiA9IHVucGFja1JHQkFUbzJIYWxmKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIHV2T2Zmc2V0LCAwLjAgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7CgkJCW1lYW4gKz0gZGlzdHJpYnV0aW9uLng7CgkJCXNxdWFyZWRfbWVhbiArPSBkaXN0cmlidXRpb24ueSAqIGRpc3RyaWJ1dGlvbi55ICsgZGlzdHJpYnV0aW9uLnggKiBkaXN0cmlidXRpb24ueDsKCQkjZWxzZQoJCQlmbG9hdCBkZXB0aCA9IHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgdXZPZmZzZXQgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7CgkJCW1lYW4gKz0gZGVwdGg7CgkJCXNxdWFyZWRfbWVhbiArPSBkZXB0aCAqIGRlcHRoOwoJCSNlbmRpZgoJfQoJbWVhbiA9IG1lYW4gLyBzYW1wbGVzOwoJc3F1YXJlZF9tZWFuID0gc3F1YXJlZF9tZWFuIC8gc2FtcGxlczsKCWZsb2F0IHN0ZF9kZXYgPSBzcXJ0KCBzcXVhcmVkX21lYW4gLSBtZWFuICogbWVhbiApOwoJZ2xfRnJhZ0NvbG9yID0gcGFjazJIYWxmVG9SR0JBKCB2ZWMyKCBtZWFuLCBzdGRfZGV2ICkgKTsKfWAsIHJldmVyc2VkRnVuY3MsIFdlYkdMTXVsdGl2aWV3UmVuZGVyVGFyZ2V0LCBfb2NjbHVzaW9uX3ZlcnRleCA9IGAKdm9pZCBtYWluKCkgewoKCWdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApOwoKfWAsIF9vY2NsdXNpb25fZnJhZ21lbnQgPSBgCnVuaWZvcm0gc2FtcGxlcjJEQXJyYXkgZGVwdGhDb2xvcjsKdW5pZm9ybSBmbG9hdCBkZXB0aFdpZHRoOwp1bmlmb3JtIGZsb2F0IGRlcHRoSGVpZ2h0OwoKdm9pZCBtYWluKCkgewoKCXZlYzIgY29vcmQgPSB2ZWMyKCBnbF9GcmFnQ29vcmQueCAvIGRlcHRoV2lkdGgsIGdsX0ZyYWdDb29yZC55IC8gZGVwdGhIZWlnaHQgKTsKCglpZiAoIGNvb3JkLnggPj0gMS4wICkgewoKCQlnbF9GcmFnRGVwdGggPSB0ZXh0dXJlKCBkZXB0aENvbG9yLCB2ZWMzKCBjb29yZC54IC0gMS4wLCBjb29yZC55LCAxICkgKS5yOwoKCX0gZWxzZSB7CgoJCWdsX0ZyYWdEZXB0aCA9IHRleHR1cmUoIGRlcHRoQ29sb3IsIHZlYzMoIGNvb3JkLngsIGNvb3JkLnksIDAgKSApLnI7CgoJfQoKfWAsIFdlYlhSTWFuYWdlciwgX2UxLCBfbTEyOwp2YXIgaW5pdF90aHJlZV9tb2R1bGUgPSBfX2VzbSgoKSA9PiB7CiAgaW5pdF90aHJlZV9jb3JlKCk7CiAgaW5pdF90aHJlZV9jb3JlKCk7CiAgU2hhZGVyQ2h1bmsgPSB7CiAgICBhbHBoYWhhc2hfZnJhZ21lbnQsCiAgICBhbHBoYWhhc2hfcGFyc19mcmFnbWVudCwKICAgIGFscGhhbWFwX2ZyYWdtZW50LAogICAgYWxwaGFtYXBfcGFyc19mcmFnbWVudCwKICAgIGFscGhhdGVzdF9mcmFnbWVudCwKICAgIGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50LAogICAgYW9tYXBfZnJhZ21lbnQsCiAgICBhb21hcF9wYXJzX2ZyYWdtZW50LAogICAgYmF0Y2hpbmdfcGFyc192ZXJ0ZXgsCiAgICBiYXRjaGluZ192ZXJ0ZXgsCiAgICBiZWdpbl92ZXJ0ZXgsCiAgICBiZWdpbm5vcm1hbF92ZXJ0ZXgsCiAgICBic2RmcywKICAgIGlyaWRlc2NlbmNlX2ZyYWdtZW50LAogICAgYnVtcG1hcF9wYXJzX2ZyYWdtZW50LAogICAgY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50LAogICAgY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQsCiAgICBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXgsCiAgICBjbGlwcGluZ19wbGFuZXNfdmVydGV4LAogICAgY29sb3JfZnJhZ21lbnQsCiAgICBjb2xvcl9wYXJzX2ZyYWdtZW50LAogICAgY29sb3JfcGFyc192ZXJ0ZXgsCiAgICBjb2xvcl92ZXJ0ZXgsCiAgICBjb21tb24sCiAgICBjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQsCiAgICBkZWZhdWx0bm9ybWFsX3ZlcnRleCwKICAgIGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleCwKICAgIGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXgsCiAgICBlbWlzc2l2ZW1hcF9mcmFnbWVudCwKICAgIGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQsCiAgICBjb2xvcnNwYWNlX2ZyYWdtZW50LAogICAgY29sb3JzcGFjZV9wYXJzX2ZyYWdtZW50LAogICAgZW52bWFwX2ZyYWdtZW50LAogICAgZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50LAogICAgZW52bWFwX3BhcnNfZnJhZ21lbnQsCiAgICBlbnZtYXBfcGFyc192ZXJ0ZXgsCiAgICBlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudCwKICAgIGVudm1hcF92ZXJ0ZXgsCiAgICBmb2dfdmVydGV4LAogICAgZm9nX3BhcnNfdmVydGV4LAogICAgZm9nX2ZyYWdtZW50LAogICAgZm9nX3BhcnNfZnJhZ21lbnQsCiAgICBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50LAogICAgbGlnaHRtYXBfcGFyc19mcmFnbWVudCwKICAgIGxpZ2h0c19sYW1iZXJ0X2ZyYWdtZW50LAogICAgbGlnaHRzX2xhbWJlcnRfcGFyc19mcmFnbWVudCwKICAgIGxpZ2h0c19wYXJzX2JlZ2luLAogICAgbGlnaHRzX3Rvb25fZnJhZ21lbnQsCiAgICBsaWdodHNfdG9vbl9wYXJzX2ZyYWdtZW50LAogICAgbGlnaHRzX3Bob25nX2ZyYWdtZW50LAogICAgbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQsCiAgICBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQsCiAgICBsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudCwKICAgIGxpZ2h0c19mcmFnbWVudF9iZWdpbiwKICAgIGxpZ2h0c19mcmFnbWVudF9tYXBzLAogICAgbGlnaHRzX2ZyYWdtZW50X2VuZCwKICAgIGxvZ2RlcHRoYnVmX2ZyYWdtZW50LAogICAgbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCwKICAgIGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4LAogICAgbG9nZGVwdGhidWZfdmVydGV4LAogICAgbWFwX2ZyYWdtZW50LAogICAgbWFwX3BhcnNfZnJhZ21lbnQsCiAgICBtYXBfcGFydGljbGVfZnJhZ21lbnQsCiAgICBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCwKICAgIG1ldGFsbmVzc21hcF9mcmFnbWVudCwKICAgIG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50LAogICAgbW9ycGhpbnN0YW5jZV92ZXJ0ZXgsCiAgICBtb3JwaGNvbG9yX3ZlcnRleCwKICAgIG1vcnBobm9ybWFsX3ZlcnRleCwKICAgIG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4LAogICAgbW9ycGh0YXJnZXRfdmVydGV4LAogICAgbm9ybWFsX2ZyYWdtZW50X2JlZ2luLAogICAgbm9ybWFsX2ZyYWdtZW50X21hcHMsCiAgICBub3JtYWxfcGFyc19mcmFnbWVudCwKICAgIG5vcm1hbF9wYXJzX3ZlcnRleCwKICAgIG5vcm1hbF92ZXJ0ZXgsCiAgICBub3JtYWxtYXBfcGFyc19mcmFnbWVudCwKICAgIGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW4sCiAgICBjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHMsCiAgICBjbGVhcmNvYXRfcGFyc19mcmFnbWVudCwKICAgIGlyaWRlc2NlbmNlX3BhcnNfZnJhZ21lbnQsCiAgICBvcGFxdWVfZnJhZ21lbnQsCiAgICBwYWNraW5nLAogICAgcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudCwKICAgIHByb2plY3RfdmVydGV4LAogICAgZGl0aGVyaW5nX2ZyYWdtZW50LAogICAgZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQsCiAgICByb3VnaG5lc3NtYXBfZnJhZ21lbnQsCiAgICByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCwKICAgIHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50LAogICAgc2hhZG93bWFwX3BhcnNfdmVydGV4LAogICAgc2hhZG93bWFwX3ZlcnRleCwKICAgIHNoYWRvd21hc2tfcGFyc19mcmFnbWVudCwKICAgIHNraW5iYXNlX3ZlcnRleCwKICAgIHNraW5uaW5nX3BhcnNfdmVydGV4LAogICAgc2tpbm5pbmdfdmVydGV4LAogICAgc2tpbm5vcm1hbF92ZXJ0ZXgsCiAgICBzcGVjdWxhcm1hcF9mcmFnbWVudCwKICAgIHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQsCiAgICB0b25lbWFwcGluZ19mcmFnbWVudCwKICAgIHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQsCiAgICB0cmFuc21pc3Npb25fZnJhZ21lbnQsCiAgICB0cmFuc21pc3Npb25fcGFyc19mcmFnbWVudCwKICAgIHV2X3BhcnNfZnJhZ21lbnQsCiAgICB1dl9wYXJzX3ZlcnRleCwKICAgIHV2X3ZlcnRleCwKICAgIHdvcmxkcG9zX3ZlcnRleCwKICAgIGJhY2tncm91bmRfdmVydDogdmVydGV4JGgsCiAgICBiYWNrZ3JvdW5kX2ZyYWc6IGZyYWdtZW50JGgsCiAgICBiYWNrZ3JvdW5kQ3ViZV92ZXJ0OiB2ZXJ0ZXgkZywKICAgIGJhY2tncm91bmRDdWJlX2ZyYWc6IGZyYWdtZW50JGcsCiAgICBjdWJlX3ZlcnQ6IHZlcnRleCRmLAogICAgY3ViZV9mcmFnOiBmcmFnbWVudCRmLAogICAgZGVwdGhfdmVydDogdmVydGV4JGUsCiAgICBkZXB0aF9mcmFnOiBmcmFnbWVudCRlLAogICAgZGlzdGFuY2VSR0JBX3ZlcnQ6IHZlcnRleCRkLAogICAgZGlzdGFuY2VSR0JBX2ZyYWc6IGZyYWdtZW50JGQsCiAgICBlcXVpcmVjdF92ZXJ0OiB2ZXJ0ZXgkYywKICAgIGVxdWlyZWN0X2ZyYWc6IGZyYWdtZW50JGMsCiAgICBsaW5lZGFzaGVkX3ZlcnQ6IHZlcnRleCRiLAogICAgbGluZWRhc2hlZF9mcmFnOiBmcmFnbWVudCRiLAogICAgbWVzaGJhc2ljX3ZlcnQ6IHZlcnRleCRhLAogICAgbWVzaGJhc2ljX2ZyYWc6IGZyYWdtZW50JGEsCiAgICBtZXNobGFtYmVydF92ZXJ0OiB2ZXJ0ZXgkOSwKICAgIG1lc2hsYW1iZXJ0X2ZyYWc6IGZyYWdtZW50JDksCiAgICBtZXNobWF0Y2FwX3ZlcnQ6IHZlcnRleCQ4LAogICAgbWVzaG1hdGNhcF9mcmFnOiBmcmFnbWVudCQ4LAogICAgbWVzaG5vcm1hbF92ZXJ0OiB2ZXJ0ZXgkNywKICAgIG1lc2hub3JtYWxfZnJhZzogZnJhZ21lbnQkNywKICAgIG1lc2hwaG9uZ192ZXJ0OiB2ZXJ0ZXgkNiwKICAgIG1lc2hwaG9uZ19mcmFnOiBmcmFnbWVudCQ2LAogICAgbWVzaHBoeXNpY2FsX3ZlcnQ6IHZlcnRleCQ1LAogICAgbWVzaHBoeXNpY2FsX2ZyYWc6IGZyYWdtZW50JDUsCiAgICBtZXNodG9vbl92ZXJ0OiB2ZXJ0ZXgkNCwKICAgIG1lc2h0b29uX2ZyYWc6IGZyYWdtZW50JDQsCiAgICBwb2ludHNfdmVydDogdmVydGV4JDMsCiAgICBwb2ludHNfZnJhZzogZnJhZ21lbnQkMywKICAgIHNoYWRvd192ZXJ0OiB2ZXJ0ZXgkMiwKICAgIHNoYWRvd19mcmFnOiBmcmFnbWVudCQyLAogICAgc3ByaXRlX3ZlcnQ6IHZlcnRleCQxLAogICAgc3ByaXRlX2ZyYWc6IGZyYWdtZW50JDEKICB9OwogIFVuaWZvcm1zTGliID0gewogICAgY29tbW9uOiB7CiAgICAgIGRpZmZ1c2U6IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgQ29sb3IoMTY3NzcyMTUpIH0sCiAgICAgIG9wYWNpdHk6IHsgdmFsdWU6IDEgfSwKICAgICAgbWFwOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgIG1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzIH0sCiAgICAgIGFscGhhTWFwOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgIGFscGhhTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDMgfSwKICAgICAgYWxwaGFUZXN0OiB7IHZhbHVlOiAwIH0KICAgIH0sCiAgICBzcGVjdWxhcm1hcDogewogICAgICBzcGVjdWxhck1hcDogeyB2YWx1ZTogbnVsbCB9LAogICAgICBzcGVjdWxhck1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzIH0KICAgIH0sCiAgICBlbnZtYXA6IHsKICAgICAgZW52TWFwOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgIGVudk1hcFJvdGF0aW9uOiB7IHZhbHVlOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDMgfSwKICAgICAgZmxpcEVudk1hcDogeyB2YWx1ZTogLTEgfSwKICAgICAgcmVmbGVjdGl2aXR5OiB7IHZhbHVlOiAxIH0sCiAgICAgIGlvcjogeyB2YWx1ZTogMS41IH0sCiAgICAgIHJlZnJhY3Rpb25SYXRpbzogeyB2YWx1ZTogMC45OCB9CiAgICB9LAogICAgYW9tYXA6IHsKICAgICAgYW9NYXA6IHsgdmFsdWU6IG51bGwgfSwKICAgICAgYW9NYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfSwKICAgICAgYW9NYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4MyB9CiAgICB9LAogICAgbGlnaHRtYXA6IHsKICAgICAgbGlnaHRNYXA6IHsgdmFsdWU6IG51bGwgfSwKICAgICAgbGlnaHRNYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfSwKICAgICAgbGlnaHRNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4MyB9CiAgICB9LAogICAgYnVtcG1hcDogewogICAgICBidW1wTWFwOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgIGJ1bXBNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4MyB9LAogICAgICBidW1wU2NhbGU6IHsgdmFsdWU6IDEgfQogICAgfSwKICAgIG5vcm1hbG1hcDogewogICAgICBub3JtYWxNYXA6IHsgdmFsdWU6IG51bGwgfSwKICAgICAgbm9ybWFsTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDMgfSwKICAgICAgbm9ybWFsU2NhbGU6IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMigxLCAxKSB9CiAgICB9LAogICAgZGlzcGxhY2VtZW50bWFwOiB7CiAgICAgIGRpc3BsYWNlbWVudE1hcDogeyB2YWx1ZTogbnVsbCB9LAogICAgICBkaXNwbGFjZW1lbnRNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4MyB9LAogICAgICBkaXNwbGFjZW1lbnRTY2FsZTogeyB2YWx1ZTogMSB9LAogICAgICBkaXNwbGFjZW1lbnRCaWFzOiB7IHZhbHVlOiAwIH0KICAgIH0sCiAgICBlbWlzc2l2ZW1hcDogewogICAgICBlbWlzc2l2ZU1hcDogeyB2YWx1ZTogbnVsbCB9LAogICAgICBlbWlzc2l2ZU1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzIH0KICAgIH0sCiAgICBtZXRhbG5lc3NtYXA6IHsKICAgICAgbWV0YWxuZXNzTWFwOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgIG1ldGFsbmVzc01hcFRyYW5zZm9ybTogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzIH0KICAgIH0sCiAgICByb3VnaG5lc3NtYXA6IHsKICAgICAgcm91Z2huZXNzTWFwOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgIHJvdWdobmVzc01hcFRyYW5zZm9ybTogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzIH0KICAgIH0sCiAgICBncmFkaWVudG1hcDogewogICAgICBncmFkaWVudE1hcDogeyB2YWx1ZTogbnVsbCB9CiAgICB9LAogICAgZm9nOiB7CiAgICAgIGZvZ0RlbnNpdHk6IHsgdmFsdWU6IDAuMDAwMjUgfSwKICAgICAgZm9nTmVhcjogeyB2YWx1ZTogMSB9LAogICAgICBmb2dGYXI6IHsgdmFsdWU6IDIwMDAgfSwKICAgICAgZm9nQ29sb3I6IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgQ29sb3IoMTY3NzcyMTUpIH0KICAgIH0sCiAgICBsaWdodHM6IHsKICAgICAgYW1iaWVudExpZ2h0Q29sb3I6IHsgdmFsdWU6IFtdIH0sCiAgICAgIGxpZ2h0UHJvYmU6IHsgdmFsdWU6IFtdIH0sCiAgICAgIGRpcmVjdGlvbmFsTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczogewogICAgICAgIGRpcmVjdGlvbjoge30sCiAgICAgICAgY29sb3I6IHt9CiAgICAgIH0gfSwKICAgICAgZGlyZWN0aW9uYWxMaWdodFNoYWRvd3M6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7CiAgICAgICAgc2hhZG93SW50ZW5zaXR5OiAxLAogICAgICAgIHNoYWRvd0JpYXM6IHt9LAogICAgICAgIHNoYWRvd05vcm1hbEJpYXM6IHt9LAogICAgICAgIHNoYWRvd1JhZGl1czoge30sCiAgICAgICAgc2hhZG93TWFwU2l6ZToge30KICAgICAgfSB9LAogICAgICBkaXJlY3Rpb25hbFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSwKICAgICAgZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sCiAgICAgIHNwb3RMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7CiAgICAgICAgY29sb3I6IHt9LAogICAgICAgIHBvc2l0aW9uOiB7fSwKICAgICAgICBkaXJlY3Rpb246IHt9LAogICAgICAgIGRpc3RhbmNlOiB7fSwKICAgICAgICBjb25lQ29zOiB7fSwKICAgICAgICBwZW51bWJyYUNvczoge30sCiAgICAgICAgZGVjYXk6IHt9CiAgICAgIH0gfSwKICAgICAgc3BvdExpZ2h0U2hhZG93czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHsKICAgICAgICBzaGFkb3dJbnRlbnNpdHk6IDEsCiAgICAgICAgc2hhZG93Qmlhczoge30sCiAgICAgICAgc2hhZG93Tm9ybWFsQmlhczoge30sCiAgICAgICAgc2hhZG93UmFkaXVzOiB7fSwKICAgICAgICBzaGFkb3dNYXBTaXplOiB7fQogICAgICB9IH0sCiAgICAgIHNwb3RMaWdodE1hcDogeyB2YWx1ZTogW10gfSwKICAgICAgc3BvdFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSwKICAgICAgc3BvdExpZ2h0TWF0cml4OiB7IHZhbHVlOiBbXSB9LAogICAgICBwb2ludExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHsKICAgICAgICBjb2xvcjoge30sCiAgICAgICAgcG9zaXRpb246IHt9LAogICAgICAgIGRlY2F5OiB7fSwKICAgICAgICBkaXN0YW5jZToge30KICAgICAgfSB9LAogICAgICBwb2ludExpZ2h0U2hhZG93czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHsKICAgICAgICBzaGFkb3dJbnRlbnNpdHk6IDEsCiAgICAgICAgc2hhZG93Qmlhczoge30sCiAgICAgICAgc2hhZG93Tm9ybWFsQmlhczoge30sCiAgICAgICAgc2hhZG93UmFkaXVzOiB7fSwKICAgICAgICBzaGFkb3dNYXBTaXplOiB7fSwKICAgICAgICBzaGFkb3dDYW1lcmFOZWFyOiB7fSwKICAgICAgICBzaGFkb3dDYW1lcmFGYXI6IHt9CiAgICAgIH0gfSwKICAgICAgcG9pbnRTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sCiAgICAgIHBvaW50U2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LAogICAgICBoZW1pc3BoZXJlTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczogewogICAgICAgIGRpcmVjdGlvbjoge30sCiAgICAgICAgc2t5Q29sb3I6IHt9LAogICAgICAgIGdyb3VuZENvbG9yOiB7fQogICAgICB9IH0sCiAgICAgIHJlY3RBcmVhTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczogewogICAgICAgIGNvbG9yOiB7fSwKICAgICAgICBwb3NpdGlvbjoge30sCiAgICAgICAgd2lkdGg6IHt9LAogICAgICAgIGhlaWdodDoge30KICAgICAgfSB9LAogICAgICBsdGNfMTogeyB2YWx1ZTogbnVsbCB9LAogICAgICBsdGNfMjogeyB2YWx1ZTogbnVsbCB9CiAgICB9LAogICAgcG9pbnRzOiB7CiAgICAgIGRpZmZ1c2U6IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgQ29sb3IoMTY3NzcyMTUpIH0sCiAgICAgIG9wYWNpdHk6IHsgdmFsdWU6IDEgfSwKICAgICAgc2l6ZTogeyB2YWx1ZTogMSB9LAogICAgICBzY2FsZTogeyB2YWx1ZTogMSB9LAogICAgICBtYXA6IHsgdmFsdWU6IG51bGwgfSwKICAgICAgYWxwaGFNYXA6IHsgdmFsdWU6IG51bGwgfSwKICAgICAgYWxwaGFNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4MyB9LAogICAgICBhbHBoYVRlc3Q6IHsgdmFsdWU6IDAgfSwKICAgICAgdXZUcmFuc2Zvcm06IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4MyB9CiAgICB9LAogICAgc3ByaXRlOiB7CiAgICAgIGRpZmZ1c2U6IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgQ29sb3IoMTY3NzcyMTUpIH0sCiAgICAgIG9wYWNpdHk6IHsgdmFsdWU6IDEgfSwKICAgICAgY2VudGVyOiB7IHZhbHVlOiAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjIoMC41LCAwLjUpIH0sCiAgICAgIHJvdGF0aW9uOiB7IHZhbHVlOiAwIH0sCiAgICAgIG1hcDogeyB2YWx1ZTogbnVsbCB9LAogICAgICBtYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4MyB9LAogICAgICBhbHBoYU1hcDogeyB2YWx1ZTogbnVsbCB9LAogICAgICBhbHBoYU1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzIH0sCiAgICAgIGFscGhhVGVzdDogeyB2YWx1ZTogMCB9CiAgICB9CiAgfTsKICBTaGFkZXJMaWIgPSB7CiAgICBiYXNpYzogewogICAgICB1bmlmb3JtczogLyogQF9fUFVSRV9fICovIG1lcmdlVW5pZm9ybXMoWwogICAgICAgIFVuaWZvcm1zTGliLmNvbW1vbiwKICAgICAgICBVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5lbnZtYXAsCiAgICAgICAgVW5pZm9ybXNMaWIuYW9tYXAsCiAgICAgICAgVW5pZm9ybXNMaWIubGlnaHRtYXAsCiAgICAgICAgVW5pZm9ybXNMaWIuZm9nCiAgICAgIF0pLAogICAgICB2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hiYXNpY192ZXJ0LAogICAgICBmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGJhc2ljX2ZyYWcKICAgIH0sCiAgICBsYW1iZXJ0OiB7CiAgICAgIHVuaWZvcm1zOiAvKiBAX19QVVJFX18gKi8gbWVyZ2VVbmlmb3JtcyhbCiAgICAgICAgVW5pZm9ybXNMaWIuY29tbW9uLAogICAgICAgIFVuaWZvcm1zTGliLnNwZWN1bGFybWFwLAogICAgICAgIFVuaWZvcm1zTGliLmVudm1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5hb21hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5saWdodG1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5idW1wbWFwLAogICAgICAgIFVuaWZvcm1zTGliLm5vcm1hbG1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsCiAgICAgICAgVW5pZm9ybXNMaWIuZm9nLAogICAgICAgIFVuaWZvcm1zTGliLmxpZ2h0cywKICAgICAgICB7CiAgICAgICAgICBlbWlzc2l2ZTogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBDb2xvcigwKSB9CiAgICAgICAgfQogICAgICBdKSwKICAgICAgdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobGFtYmVydF92ZXJ0LAogICAgICBmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGxhbWJlcnRfZnJhZwogICAgfSwKICAgIHBob25nOiB7CiAgICAgIHVuaWZvcm1zOiAvKiBAX19QVVJFX18gKi8gbWVyZ2VVbmlmb3JtcyhbCiAgICAgICAgVW5pZm9ybXNMaWIuY29tbW9uLAogICAgICAgIFVuaWZvcm1zTGliLnNwZWN1bGFybWFwLAogICAgICAgIFVuaWZvcm1zTGliLmVudm1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5hb21hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5saWdodG1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5idW1wbWFwLAogICAgICAgIFVuaWZvcm1zTGliLm5vcm1hbG1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsCiAgICAgICAgVW5pZm9ybXNMaWIuZm9nLAogICAgICAgIFVuaWZvcm1zTGliLmxpZ2h0cywKICAgICAgICB7CiAgICAgICAgICBlbWlzc2l2ZTogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBDb2xvcigwKSB9LAogICAgICAgICAgc3BlY3VsYXI6IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgQ29sb3IoMTExODQ4MSkgfSwKICAgICAgICAgIHNoaW5pbmVzczogeyB2YWx1ZTogMzAgfQogICAgICAgIH0KICAgICAgXSksCiAgICAgIHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBob25nX3ZlcnQsCiAgICAgIGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGhvbmdfZnJhZwogICAgfSwKICAgIHN0YW5kYXJkOiB7CiAgICAgIHVuaWZvcm1zOiAvKiBAX19QVVJFX18gKi8gbWVyZ2VVbmlmb3JtcyhbCiAgICAgICAgVW5pZm9ybXNMaWIuY29tbW9uLAogICAgICAgIFVuaWZvcm1zTGliLmVudm1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5hb21hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5saWdodG1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5idW1wbWFwLAogICAgICAgIFVuaWZvcm1zTGliLm5vcm1hbG1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsCiAgICAgICAgVW5pZm9ybXNMaWIucm91Z2huZXNzbWFwLAogICAgICAgIFVuaWZvcm1zTGliLm1ldGFsbmVzc21hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5mb2csCiAgICAgICAgVW5pZm9ybXNMaWIubGlnaHRzLAogICAgICAgIHsKICAgICAgICAgIGVtaXNzaXZlOiB7IHZhbHVlOiAvKiBAX19QVVJFX18gKi8gbmV3IENvbG9yKDApIH0sCiAgICAgICAgICByb3VnaG5lc3M6IHsgdmFsdWU6IDEgfSwKICAgICAgICAgIG1ldGFsbmVzczogeyB2YWx1ZTogMCB9LAogICAgICAgICAgZW52TWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH0KICAgICAgICB9CiAgICAgIF0pLAogICAgICB2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF92ZXJ0LAogICAgICBmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWcKICAgIH0sCiAgICB0b29uOiB7CiAgICAgIHVuaWZvcm1zOiAvKiBAX19QVVJFX18gKi8gbWVyZ2VVbmlmb3JtcyhbCiAgICAgICAgVW5pZm9ybXNMaWIuY29tbW9uLAogICAgICAgIFVuaWZvcm1zTGliLmFvbWFwLAogICAgICAgIFVuaWZvcm1zTGliLmxpZ2h0bWFwLAogICAgICAgIFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLAogICAgICAgIFVuaWZvcm1zTGliLmJ1bXBtYXAsCiAgICAgICAgVW5pZm9ybXNMaWIubm9ybWFsbWFwLAogICAgICAgIFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5ncmFkaWVudG1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5mb2csCiAgICAgICAgVW5pZm9ybXNMaWIubGlnaHRzLAogICAgICAgIHsKICAgICAgICAgIGVtaXNzaXZlOiB7IHZhbHVlOiAvKiBAX19QVVJFX18gKi8gbmV3IENvbG9yKDApIH0KICAgICAgICB9CiAgICAgIF0pLAogICAgICB2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2h0b29uX3ZlcnQsCiAgICAgIGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNodG9vbl9mcmFnCiAgICB9LAogICAgbWF0Y2FwOiB7CiAgICAgIHVuaWZvcm1zOiAvKiBAX19QVVJFX18gKi8gbWVyZ2VVbmlmb3JtcyhbCiAgICAgICAgVW5pZm9ybXNMaWIuY29tbW9uLAogICAgICAgIFVuaWZvcm1zTGliLmJ1bXBtYXAsCiAgICAgICAgVW5pZm9ybXNMaWIubm9ybWFsbWFwLAogICAgICAgIFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCwKICAgICAgICBVbmlmb3Jtc0xpYi5mb2csCiAgICAgICAgewogICAgICAgICAgbWF0Y2FwOiB7IHZhbHVlOiBudWxsIH0KICAgICAgICB9CiAgICAgIF0pLAogICAgICB2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2htYXRjYXBfdmVydCwKICAgICAgZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2htYXRjYXBfZnJhZwogICAgfSwKICAgIHBvaW50czogewogICAgICB1bmlmb3JtczogLyogQF9fUFVSRV9fICovIG1lcmdlVW5pZm9ybXMoWwogICAgICAgIFVuaWZvcm1zTGliLnBvaW50cywKICAgICAgICBVbmlmb3Jtc0xpYi5mb2cKICAgICAgXSksCiAgICAgIHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsucG9pbnRzX3ZlcnQsCiAgICAgIGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfZnJhZwogICAgfSwKICAgIGRhc2hlZDogewogICAgICB1bmlmb3JtczogLyogQF9fUFVSRV9fICovIG1lcmdlVW5pZm9ybXMoWwogICAgICAgIFVuaWZvcm1zTGliLmNvbW1vbiwKICAgICAgICBVbmlmb3Jtc0xpYi5mb2csCiAgICAgICAgewogICAgICAgICAgc2NhbGU6IHsgdmFsdWU6IDEgfSwKICAgICAgICAgIGRhc2hTaXplOiB7IHZhbHVlOiAxIH0sCiAgICAgICAgICB0b3RhbFNpemU6IHsgdmFsdWU6IDIgfQogICAgICAgIH0KICAgICAgXSksCiAgICAgIHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF92ZXJ0LAogICAgICBmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF9mcmFnCiAgICB9LAogICAgZGVwdGg6IHsKICAgICAgdW5pZm9ybXM6IC8qIEBfX1BVUkVfXyAqLyBtZXJnZVVuaWZvcm1zKFsKICAgICAgICBVbmlmb3Jtc0xpYi5jb21tb24sCiAgICAgICAgVW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwCiAgICAgIF0pLAogICAgICB2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmRlcHRoX3ZlcnQsCiAgICAgIGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF9mcmFnCiAgICB9LAogICAgbm9ybWFsOiB7CiAgICAgIHVuaWZvcm1zOiAvKiBAX19QVVJFX18gKi8gbWVyZ2VVbmlmb3JtcyhbCiAgICAgICAgVW5pZm9ybXNMaWIuY29tbW9uLAogICAgICAgIFVuaWZvcm1zTGliLmJ1bXBtYXAsCiAgICAgICAgVW5pZm9ybXNMaWIubm9ybWFsbWFwLAogICAgICAgIFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCwKICAgICAgICB7CiAgICAgICAgICBvcGFjaXR5OiB7IHZhbHVlOiAxIH0KICAgICAgICB9CiAgICAgIF0pLAogICAgICB2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hub3JtYWxfdmVydCwKICAgICAgZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hub3JtYWxfZnJhZwogICAgfSwKICAgIHNwcml0ZTogewogICAgICB1bmlmb3JtczogLyogQF9fUFVSRV9fICovIG1lcmdlVW5pZm9ybXMoWwogICAgICAgIFVuaWZvcm1zTGliLnNwcml0ZSwKICAgICAgICBVbmlmb3Jtc0xpYi5mb2cKICAgICAgXSksCiAgICAgIHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuc3ByaXRlX3ZlcnQsCiAgICAgIGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5zcHJpdGVfZnJhZwogICAgfSwKICAgIGJhY2tncm91bmQ6IHsKICAgICAgdW5pZm9ybXM6IHsKICAgICAgICB1dlRyYW5zZm9ybTogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzIH0sCiAgICAgICAgdDJEOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgICAgYmFja2dyb3VuZEludGVuc2l0eTogeyB2YWx1ZTogMSB9CiAgICAgIH0sCiAgICAgIHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuYmFja2dyb3VuZF92ZXJ0LAogICAgICBmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuYmFja2dyb3VuZF9mcmFnCiAgICB9LAogICAgYmFja2dyb3VuZEN1YmU6IHsKICAgICAgdW5pZm9ybXM6IHsKICAgICAgICBlbnZNYXA6IHsgdmFsdWU6IG51bGwgfSwKICAgICAgICBmbGlwRW52TWFwOiB7IHZhbHVlOiAtMSB9LAogICAgICAgIGJhY2tncm91bmRCbHVycmluZXNzOiB7IHZhbHVlOiAwIH0sCiAgICAgICAgYmFja2dyb3VuZEludGVuc2l0eTogeyB2YWx1ZTogMSB9LAogICAgICAgIGJhY2tncm91bmRSb3RhdGlvbjogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzIH0KICAgICAgfSwKICAgICAgdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5iYWNrZ3JvdW5kQ3ViZV92ZXJ0LAogICAgICBmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuYmFja2dyb3VuZEN1YmVfZnJhZwogICAgfSwKICAgIGN1YmU6IHsKICAgICAgdW5pZm9ybXM6IHsKICAgICAgICB0Q3ViZTogeyB2YWx1ZTogbnVsbCB9LAogICAgICAgIHRGbGlwOiB7IHZhbHVlOiAtMSB9LAogICAgICAgIG9wYWNpdHk6IHsgdmFsdWU6IDEgfQogICAgICB9LAogICAgICB2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmN1YmVfdmVydCwKICAgICAgZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmN1YmVfZnJhZwogICAgfSwKICAgIGVxdWlyZWN0OiB7CiAgICAgIHVuaWZvcm1zOiB7CiAgICAgICAgdEVxdWlyZWN0OiB7IHZhbHVlOiBudWxsIH0KICAgICAgfSwKICAgICAgdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5lcXVpcmVjdF92ZXJ0LAogICAgICBmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3RfZnJhZwogICAgfSwKICAgIGRpc3RhbmNlUkdCQTogewogICAgICB1bmlmb3JtczogLyogQF9fUFVSRV9fICovIG1lcmdlVW5pZm9ybXMoWwogICAgICAgIFVuaWZvcm1zTGliLmNvbW1vbiwKICAgICAgICBVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsCiAgICAgICAgewogICAgICAgICAgcmVmZXJlbmNlUG9zaXRpb246IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMyB9LAogICAgICAgICAgbmVhckRpc3RhbmNlOiB7IHZhbHVlOiAxIH0sCiAgICAgICAgICBmYXJEaXN0YW5jZTogeyB2YWx1ZTogMTAwMCB9CiAgICAgICAgfQogICAgICBdKSwKICAgICAgdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kaXN0YW5jZVJHQkFfdmVydCwKICAgICAgZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmRpc3RhbmNlUkdCQV9mcmFnCiAgICB9LAogICAgc2hhZG93OiB7CiAgICAgIHVuaWZvcm1zOiAvKiBAX19QVVJFX18gKi8gbWVyZ2VVbmlmb3JtcyhbCiAgICAgICAgVW5pZm9ybXNMaWIubGlnaHRzLAogICAgICAgIFVuaWZvcm1zTGliLmZvZywKICAgICAgICB7CiAgICAgICAgICBjb2xvcjogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBDb2xvcigwKSB9LAogICAgICAgICAgb3BhY2l0eTogeyB2YWx1ZTogMSB9CiAgICAgICAgfQogICAgICBdKSwKICAgICAgdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5zaGFkb3dfdmVydCwKICAgICAgZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLnNoYWRvd19mcmFnCiAgICB9CiAgfTsKICBTaGFkZXJMaWIucGh5c2ljYWwgPSB7CiAgICB1bmlmb3JtczogLyogQF9fUFVSRV9fICovIG1lcmdlVW5pZm9ybXMoWwogICAgICBTaGFkZXJMaWIuc3RhbmRhcmQudW5pZm9ybXMsCiAgICAgIHsKICAgICAgICBjbGVhcmNvYXQ6IHsgdmFsdWU6IDAgfSwKICAgICAgICBjbGVhcmNvYXRNYXA6IHsgdmFsdWU6IG51bGwgfSwKICAgICAgICBjbGVhcmNvYXRNYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4MyB9LAogICAgICAgIGNsZWFyY29hdE5vcm1hbE1hcDogeyB2YWx1ZTogbnVsbCB9LAogICAgICAgIGNsZWFyY29hdE5vcm1hbE1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzIH0sCiAgICAgICAgY2xlYXJjb2F0Tm9ybWFsU2NhbGU6IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMigxLCAxKSB9LAogICAgICAgIGNsZWFyY29hdFJvdWdobmVzczogeyB2YWx1ZTogMCB9LAogICAgICAgIGNsZWFyY29hdFJvdWdobmVzc01hcDogeyB2YWx1ZTogbnVsbCB9LAogICAgICAgIGNsZWFyY29hdFJvdWdobmVzc01hcFRyYW5zZm9ybTogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzIH0sCiAgICAgICAgZGlzcGVyc2lvbjogeyB2YWx1ZTogMCB9LAogICAgICAgIGlyaWRlc2NlbmNlOiB7IHZhbHVlOiAwIH0sCiAgICAgICAgaXJpZGVzY2VuY2VNYXA6IHsgdmFsdWU6IG51bGwgfSwKICAgICAgICBpcmlkZXNjZW5jZU1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzIH0sCiAgICAgICAgaXJpZGVzY2VuY2VJT1I6IHsgdmFsdWU6IDEuMyB9LAogICAgICAgIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTogeyB2YWx1ZTogMTAwIH0sCiAgICAgICAgaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtOiB7IHZhbHVlOiA0MDAgfSwKICAgICAgICBpcmlkZXNjZW5jZVRoaWNrbmVzc01hcDogeyB2YWx1ZTogbnVsbCB9LAogICAgICAgIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDMgfSwKICAgICAgICBzaGVlbjogeyB2YWx1ZTogMCB9LAogICAgICAgIHNoZWVuQ29sb3I6IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgQ29sb3IoMCkgfSwKICAgICAgICBzaGVlbkNvbG9yTWFwOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgICAgc2hlZW5Db2xvck1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzIH0sCiAgICAgICAgc2hlZW5Sb3VnaG5lc3M6IHsgdmFsdWU6IDEgfSwKICAgICAgICBzaGVlblJvdWdobmVzc01hcDogeyB2YWx1ZTogbnVsbCB9LAogICAgICAgIHNoZWVuUm91Z2huZXNzTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDMgfSwKICAgICAgICB0cmFuc21pc3Npb246IHsgdmFsdWU6IDAgfSwKICAgICAgICB0cmFuc21pc3Npb25NYXA6IHsgdmFsdWU6IG51bGwgfSwKICAgICAgICB0cmFuc21pc3Npb25NYXBUcmFuc2Zvcm06IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4MyB9LAogICAgICAgIHRyYW5zbWlzc2lvblNhbXBsZXJTaXplOiB7IHZhbHVlOiAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjIgfSwKICAgICAgICB0cmFuc21pc3Npb25TYW1wbGVyTWFwOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgICAgdGhpY2tuZXNzOiB7IHZhbHVlOiAwIH0sCiAgICAgICAgdGhpY2tuZXNzTWFwOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgICAgdGhpY2tuZXNzTWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDMgfSwKICAgICAgICBhdHRlbnVhdGlvbkRpc3RhbmNlOiB7IHZhbHVlOiAwIH0sCiAgICAgICAgYXR0ZW51YXRpb25Db2xvcjogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBDb2xvcigwKSB9LAogICAgICAgIHNwZWN1bGFyQ29sb3I6IHsgdmFsdWU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgQ29sb3IoMSwgMSwgMSkgfSwKICAgICAgICBzcGVjdWxhckNvbG9yTWFwOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgICAgc3BlY3VsYXJDb2xvck1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzIH0sCiAgICAgICAgc3BlY3VsYXJJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfSwKICAgICAgICBzcGVjdWxhckludGVuc2l0eU1hcDogeyB2YWx1ZTogbnVsbCB9LAogICAgICAgIHNwZWN1bGFySW50ZW5zaXR5TWFwVHJhbnNmb3JtOiB7IHZhbHVlOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hdHJpeDMgfSwKICAgICAgICBhbmlzb3Ryb3B5VmVjdG9yOiB7IHZhbHVlOiAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjIgfSwKICAgICAgICBhbmlzb3Ryb3B5TWFwOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgICAgYW5pc290cm9weU1hcFRyYW5zZm9ybTogeyB2YWx1ZTogLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXgzIH0KICAgICAgfQogICAgXSksCiAgICB2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF92ZXJ0LAogICAgZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF9mcmFnCiAgfTsKICBfcmdiID0geyByOiAwLCBiOiAwLCBnOiAwIH07CiAgX2UxJDEgPSAvKiBAX19QVVJFX18gKi8gbmV3IEV1bGVyOwogIF9tMSQxMiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4NDsKICBFWFRSQV9MT0RfU0lHTUEgPSBbMC4xMjUsIDAuMjE1LCAwLjM1LCAwLjQ0NiwgMC41MjYsIDAuNTgyXTsKICBfZmxhdENhbWVyYSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhOwogIF9jbGVhckNvbG9yID0gLyogQF9fUFVSRV9fICovIG5ldyBDb2xvcjsKICBQSEkgPSAoMSArIE1hdGguc3FydCg1KSkgLyAyOwogIElOVl9QSEkgPSAxIC8gUEhJOwogIF9heGlzRGlyZWN0aW9ucyA9IFsKICAgIC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMygtUEhJLCBJTlZfUEhJLCAwKSwKICAgIC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMyhQSEksIElOVl9QSEksIDApLAogICAgLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzKC1JTlZfUEhJLCAwLCBQSEkpLAogICAgLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzKElOVl9QSEksIDAsIFBISSksCiAgICAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjMoMCwgUEhJLCAtSU5WX1BISSksCiAgICAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjMoMCwgUEhJLCBJTlZfUEhJKSwKICAgIC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMygtMSwgMSwgLTEpLAogICAgLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzKDEsIDEsIC0xKSwKICAgIC8qIEBfX1BVUkVfXyAqLyBuZXcgVmVjdG9yMygtMSwgMSwgMSksCiAgICAvKiBAX19QVVJFX18gKi8gbmV3IFZlY3RvcjMoMSwgMSwgMSkKICBdOwogIGVtcHR5VGV4dHVyZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVGV4dHVyZTsKICBlbXB0eVNoYWRvd1RleHR1cmUgPSAvKiBAX19QVVJFX18gKi8gbmV3IERlcHRoVGV4dHVyZSgxLCAxKTsKICBlbXB0eUFycmF5VGV4dHVyZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0YUFycmF5VGV4dHVyZTsKICBlbXB0eTNkVGV4dHVyZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0YTNEVGV4dHVyZTsKICBlbXB0eUN1YmVUZXh0dXJlID0gLyogQF9fUFVSRV9fICovIG5ldyBDdWJlVGV4dHVyZTsKICBhcnJheUNhY2hlRjMyID0gW107CiAgYXJyYXlDYWNoZUkzMiA9IFtdOwogIG1hdDRhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpOwogIG1hdDNhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7CiAgbWF0MmFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSg0KTsKICBSZVBhdGhQYXJ0ID0gLyhcdyspKFxdKT8oXFt8XC4pPy9nOwogIF9tMCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWF0cml4MzsKICBfdjAyID0gLyogQF9fUFVSRV9fICovIG5ldyBWZWN0b3IzOwogIGluY2x1ZGVQYXR0ZXJuID0gL15bIFx0XSojaW5jbHVkZSArPChbXHdcZC4vXSspPi9nbTsKICBzaGFkZXJDaHVua01hcCA9IG5ldyBNYXA7CiAgdW5yb2xsTG9vcFBhdHRlcm4gPSAvI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxzK2ZvclxzKlwoXHMqaW50XHMraVxzKj1ccyooXGQrKVxzKjtccyppXHMqPFxzKihcZCspXHMqO1xzKmlccypcK1wrXHMqXClccyp7KFtcc1xTXSs/KX1ccysjcHJhZ21hIHVucm9sbF9sb29wX2VuZC9nOwogIHJldmVyc2VkRnVuY3MgPSB7CiAgICBbTmV2ZXJEZXB0aF06IEFsd2F5c0RlcHRoLAogICAgW0xlc3NEZXB0aF06IEdyZWF0ZXJEZXB0aCwKICAgIFtFcXVhbERlcHRoXTogTm90RXF1YWxEZXB0aCwKICAgIFtMZXNzRXF1YWxEZXB0aF06IEdyZWF0ZXJFcXVhbERlcHRoLAogICAgW0Fsd2F5c0RlcHRoXTogTmV2ZXJEZXB0aCwKICAgIFtHcmVhdGVyRGVwdGhdOiBMZXNzRGVwdGgsCiAgICBbTm90RXF1YWxEZXB0aF06IEVxdWFsRGVwdGgsCiAgICBbR3JlYXRlckVxdWFsRGVwdGhdOiBMZXNzRXF1YWxEZXB0aAogIH07CiAgV2ViR0xNdWx0aXZpZXdSZW5kZXJUYXJnZXQgPSBjbGFzcyBXZWJHTE11bHRpdmlld1JlbmRlclRhcmdldCBleHRlbmRzIFdlYkdMUmVuZGVyVGFyZ2V0IHsKICAgIGNvbnN0cnVjdG9yKHdpZHRoLCBoZWlnaHQsIG51bVZpZXdzLCBvcHRpb25zID0ge30pIHsKICAgICAgc3VwZXIod2lkdGgsIGhlaWdodCwgb3B0aW9ucyk7CiAgICAgIHRoaXMuZGVwdGhCdWZmZXIgPSBmYWxzZTsKICAgICAgdGhpcy5zdGVuY2lsQnVmZmVyID0gZmFsc2U7CiAgICAgIHRoaXMubnVtVmlld3MgPSBudW1WaWV3czsKICAgIH0KICAgIGNvcHkoc291cmNlKSB7CiAgICAgIHN1cGVyLmNvcHkoc291cmNlKTsKICAgICAgdGhpcy5udW1WaWV3cyA9IHNvdXJjZS5udW1WaWV3czsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgfTsKICBXZWJHTE11bHRpdmlld1JlbmRlclRhcmdldC5wcm90b3R5cGUuaXNXZWJHTE11bHRpdmlld1JlbmRlclRhcmdldCA9IHRydWU7CiAgV2ViWFJNYW5hZ2VyID0gY2xhc3MgV2ViWFJNYW5hZ2VyIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHsKICAgIGNvbnN0cnVjdG9yKHJlbmRlcmVyLCBnbCwgZXh0ZW5zaW9ucywgdXNlTXVsdGl2aWV3KSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIGNvbnN0IHNjb3BlID0gdGhpczsKICAgICAgbGV0IHNlc3Npb24gPSBudWxsOwogICAgICBsZXQgZnJhbWVidWZmZXJTY2FsZUZhY3RvciA9IDE7CiAgICAgIHZhciBwb3NlVGFyZ2V0ID0gbnVsbDsKICAgICAgbGV0IHJlZmVyZW5jZVNwYWNlID0gbnVsbDsKICAgICAgbGV0IHJlZmVyZW5jZVNwYWNlVHlwZSA9ICJsb2NhbC1mbG9vciI7CiAgICAgIGxldCBmb3ZlYXRpb24gPSAxOwogICAgICBsZXQgY3VzdG9tUmVmZXJlbmNlU3BhY2UgPSBudWxsOwogICAgICBsZXQgcG9zZSA9IG51bGw7CiAgICAgIHZhciBsYXllcnMgPSBbXTsKICAgICAgbGV0IGdsQmluZGluZyA9IG51bGw7CiAgICAgIGxldCBnbFByb2pMYXllciA9IG51bGw7CiAgICAgIGxldCBnbEJhc2VMYXllciA9IG51bGw7CiAgICAgIGxldCB4ckZyYW1lID0gbnVsbDsKICAgICAgY29uc3QgZGVwdGhTZW5zaW5nID0gbmV3IFdlYlhSRGVwdGhTZW5zaW5nOwogICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZ2wuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKTsKICAgICAgbGV0IGluaXRpYWxSZW5kZXJUYXJnZXQgPSBudWxsOwogICAgICBsZXQgbmV3UmVuZGVyVGFyZ2V0ID0gbnVsbDsKICAgICAgY29uc3QgY29udHJvbGxlcnMgPSBbXTsKICAgICAgY29uc3QgY29udHJvbGxlcklucHV0U291cmNlcyA9IFtdOwogICAgICBjb25zdCBjdXJyZW50U2l6ZSA9IG5ldyBWZWN0b3IyOwogICAgICBsZXQgY3VycmVudFBpeGVsUmF0aW8gPSBudWxsOwogICAgICBjb25zdCBjYW1lcmFMID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhOwogICAgICBjYW1lcmFMLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQ7CiAgICAgIGNvbnN0IGNhbWVyYVIgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmE7CiAgICAgIGNhbWVyYVIudmlld3BvcnQgPSBuZXcgVmVjdG9yNDsKICAgICAgY29uc3QgY2FtZXJhcyA9IFtjYW1lcmFMLCBjYW1lcmFSXTsKICAgICAgY29uc3QgY2FtZXJhWFIgPSBuZXcgQXJyYXlDYW1lcmE7CiAgICAgIGxldCBfY3VycmVudERlcHRoTmVhciA9IG51bGw7CiAgICAgIGxldCBfY3VycmVudERlcHRoRmFyID0gbnVsbDsKICAgICAgdGhpcy5jYW1lcmFBdXRvVXBkYXRlID0gdHJ1ZTsKICAgICAgdGhpcy5sYXllcnNFbmFibGVkID0gZmFsc2U7CiAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlOwogICAgICB0aGlzLmlzUHJlc2VudGluZyA9IGZhbHNlOwogICAgICB0aGlzLmlzTXVsdGl2aWV3ID0gZmFsc2U7CiAgICAgIHRoaXMuZ2V0Q2FtZXJhUG9zZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBwb3NlOwogICAgICB9OwogICAgICB0aGlzLmdldENvbnRyb2xsZXIgPSBmdW5jdGlvbihpbmRleCkgewogICAgICAgIGxldCBjb250cm9sbGVyID0gY29udHJvbGxlcnNbaW5kZXhdOwogICAgICAgIGlmIChjb250cm9sbGVyID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGNvbnRyb2xsZXIgPSBuZXcgV2ViWFJDb250cm9sbGVyOwogICAgICAgICAgY29udHJvbGxlcnNbaW5kZXhdID0gY29udHJvbGxlcjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZ2V0VGFyZ2V0UmF5U3BhY2UoKTsKICAgICAgfTsKICAgICAgdGhpcy5nZXRDb250cm9sbGVyR3JpcCA9IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgbGV0IGNvbnRyb2xsZXIgPSBjb250cm9sbGVyc1tpbmRleF07CiAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgY29udHJvbGxlciA9IG5ldyBXZWJYUkNvbnRyb2xsZXI7CiAgICAgICAgICBjb250cm9sbGVyc1tpbmRleF0gPSBjb250cm9sbGVyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29udHJvbGxlci5nZXRHcmlwU3BhY2UoKTsKICAgICAgfTsKICAgICAgdGhpcy5nZXRIYW5kID0gZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICBsZXQgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzW2luZGV4XTsKICAgICAgICBpZiAoY29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBjb250cm9sbGVyID0gbmV3IFdlYlhSQ29udHJvbGxlcjsKICAgICAgICAgIGNvbnRyb2xsZXJzW2luZGV4XSA9IGNvbnRyb2xsZXI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb250cm9sbGVyLmdldEhhbmRTcGFjZSgpOwogICAgICB9OwogICAgICBmdW5jdGlvbiBvblNlc3Npb25FdmVudChldmVudCkgewogICAgICAgIGNvbnN0IGNvbnRyb2xsZXJJbmRleCA9IGNvbnRyb2xsZXJJbnB1dFNvdXJjZXMuaW5kZXhPZihldmVudC5pbnB1dFNvdXJjZSk7CiAgICAgICAgaWYgKGNvbnRyb2xsZXJJbmRleCA9PT0gLTEpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzW2NvbnRyb2xsZXJJbmRleF07CiAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgY29udHJvbGxlci51cGRhdGUoZXZlbnQuaW5wdXRTb3VyY2UsIGV2ZW50LmZyYW1lLCBjdXN0b21SZWZlcmVuY2VTcGFjZSB8fCByZWZlcmVuY2VTcGFjZSk7CiAgICAgICAgICBjb250cm9sbGVyLmRpc3BhdGNoRXZlbnQoeyB0eXBlOiBldmVudC50eXBlLCBkYXRhOiBldmVudC5pbnB1dFNvdXJjZSB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gb25TZXNzaW9uRW5kKCkgewogICAgICAgIHNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0Iiwgb25TZXNzaW9uRXZlbnQpOwogICAgICAgIHNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLCBvblNlc3Npb25FdmVudCk7CiAgICAgICAgc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3RlbmQiLCBvblNlc3Npb25FdmVudCk7CiAgICAgICAgc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJzcXVlZXplIiwgb25TZXNzaW9uRXZlbnQpOwogICAgICAgIHNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZXN0YXJ0Iiwgb25TZXNzaW9uRXZlbnQpOwogICAgICAgIHNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZWVuZCIsIG9uU2Vzc2lvbkV2ZW50KTsKICAgICAgICBzZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZCIsIG9uU2Vzc2lvbkVuZCk7CiAgICAgICAgc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJpbnB1dHNvdXJjZXNjaGFuZ2UiLCBvbklucHV0U291cmNlc0NoYW5nZSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IGNvbnRyb2xsZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBpbnB1dFNvdXJjZSA9IGNvbnRyb2xsZXJJbnB1dFNvdXJjZXNbaV07CiAgICAgICAgICBpZiAoaW5wdXRTb3VyY2UgPT09IG51bGwpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgY29udHJvbGxlcklucHV0U291cmNlc1tpXSA9IG51bGw7CiAgICAgICAgICBjb250cm9sbGVyc1tpXS5kaXNjb25uZWN0KGlucHV0U291cmNlKTsKICAgICAgICB9CiAgICAgICAgX2N1cnJlbnREZXB0aE5lYXIgPSBudWxsOwogICAgICAgIF9jdXJyZW50RGVwdGhGYXIgPSBudWxsOwogICAgICAgIGRlcHRoU2Vuc2luZy5yZXNldCgpOwogICAgICAgIHNjb3BlLmlzUHJlc2VudGluZyA9IGZhbHNlOwogICAgICAgIHJlbmRlcmVyLnNldFJlbmRlclRhcmdldChpbml0aWFsUmVuZGVyVGFyZ2V0KTsKICAgICAgICBnbEJhc2VMYXllciA9IG51bGw7CiAgICAgICAgZ2xQcm9qTGF5ZXIgPSBudWxsOwogICAgICAgIGdsQmluZGluZyA9IG51bGw7CiAgICAgICAgc2Vzc2lvbiA9IG51bGw7CiAgICAgICAgbmV3UmVuZGVyVGFyZ2V0ID0gbnVsbDsKICAgICAgICBhbmltYXRpb24uc3RvcCgpOwogICAgICAgIHJlbmRlcmVyLnNldFBpeGVsUmF0aW8oY3VycmVudFBpeGVsUmF0aW8pOwogICAgICAgIHJlbmRlcmVyLnNldFNpemUoY3VycmVudFNpemUud2lkdGgsIGN1cnJlbnRTaXplLmhlaWdodCwgZmFsc2UpOwogICAgICAgIHNjb3BlLmRpc3BhdGNoRXZlbnQoeyB0eXBlOiAic2Vzc2lvbmVuZCIgfSk7CiAgICAgIH0KICAgICAgdGhpcy5zZXRGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBmcmFtZWJ1ZmZlclNjYWxlRmFjdG9yID0gdmFsdWU7CiAgICAgICAgaWYgKHNjb3BlLmlzUHJlc2VudGluZyA9PT0gdHJ1ZSkgewogICAgICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IENhbm5vdCBjaGFuZ2UgZnJhbWVidWZmZXIgc2NhbGUgd2hpbGUgcHJlc2VudGluZy4iKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHRoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICByZWZlcmVuY2VTcGFjZVR5cGUgPSB2YWx1ZTsKICAgICAgICBpZiAoc2NvcGUuaXNQcmVzZW50aW5nID09PSB0cnVlKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oIlRIUkVFLldlYlhSTWFuYWdlcjogQ2Fubm90IGNoYW5nZSByZWZlcmVuY2Ugc3BhY2UgdHlwZSB3aGlsZSBwcmVzZW50aW5nLiIpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgdGhpcy5nZXRSZWZlcmVuY2VTcGFjZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBjdXN0b21SZWZlcmVuY2VTcGFjZSB8fCByZWZlcmVuY2VTcGFjZTsKICAgICAgfTsKICAgICAgdGhpcy5zZXRSZWZlcmVuY2VTcGFjZSA9IGZ1bmN0aW9uKHNwYWNlKSB7CiAgICAgICAgY3VzdG9tUmVmZXJlbmNlU3BhY2UgPSBzcGFjZTsKICAgICAgfTsKICAgICAgdGhpcy5nZXRCYXNlTGF5ZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZ2xQcm9qTGF5ZXIgIT09IG51bGwgPyBnbFByb2pMYXllciA6IGdsQmFzZUxheWVyOwogICAgICB9OwogICAgICB0aGlzLmdldEJpbmRpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZ2xCaW5kaW5nOwogICAgICB9OwogICAgICB0aGlzLmdldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBuZXdSZW5kZXJUYXJnZXQ7CiAgICAgIH07CiAgICAgIHRoaXMuZ2V0RnJhbWUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geHJGcmFtZTsKICAgICAgfTsKICAgICAgdGhpcy5nZXRTZXNzaW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHNlc3Npb247CiAgICAgIH07CiAgICAgIHRoaXMuc2V0U2Vzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgc2Vzc2lvbiA9IHZhbHVlOwogICAgICAgIGlmIChzZXNzaW9uICE9PSBudWxsKSB7CiAgICAgICAgICBpbml0aWFsUmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7CiAgICAgICAgICBzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdCIsIG9uU2Vzc2lvbkV2ZW50KTsKICAgICAgICAgIHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLCBvblNlc3Npb25FdmVudCk7CiAgICAgICAgICBzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGVuZCIsIG9uU2Vzc2lvbkV2ZW50KTsKICAgICAgICAgIHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZSIsIG9uU2Vzc2lvbkV2ZW50KTsKICAgICAgICAgIHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZXN0YXJ0Iiwgb25TZXNzaW9uRXZlbnQpOwogICAgICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJzcXVlZXplZW5kIiwgb25TZXNzaW9uRXZlbnQpOwogICAgICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJlbmQiLCBvblNlc3Npb25FbmQpOwogICAgICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJpbnB1dHNvdXJjZXNjaGFuZ2UiLCBvbklucHV0U291cmNlc0NoYW5nZSk7CiAgICAgICAgICBpZiAoYXR0cmlidXRlcy54ckNvbXBhdGlibGUgIT09IHRydWUpIHsKICAgICAgICAgICAgYXdhaXQgZ2wubWFrZVhSQ29tcGF0aWJsZSgpOwogICAgICAgICAgfQogICAgICAgICAgY3VycmVudFBpeGVsUmF0aW8gPSByZW5kZXJlci5nZXRQaXhlbFJhdGlvKCk7CiAgICAgICAgICByZW5kZXJlci5nZXRTaXplKGN1cnJlbnRTaXplKTsKICAgICAgICAgIGNvbnN0IHVzZUxheWVycyA9IHR5cGVvZiBYUldlYkdMQmluZGluZyAhPT0gInVuZGVmaW5lZCIgJiYgImNyZWF0ZVByb2plY3Rpb25MYXllciIgaW4gWFJXZWJHTEJpbmRpbmcucHJvdG90eXBlOwogICAgICAgICAgaWYgKCF1c2VMYXllcnMpIHsKICAgICAgICAgICAgY29uc3QgbGF5ZXJJbml0ID0gewogICAgICAgICAgICAgIGFudGlhbGlhczogYXR0cmlidXRlcy5hbnRpYWxpYXMsCiAgICAgICAgICAgICAgYWxwaGE6IHRydWUsCiAgICAgICAgICAgICAgZGVwdGg6IGF0dHJpYnV0ZXMuZGVwdGgsCiAgICAgICAgICAgICAgc3RlbmNpbDogYXR0cmlidXRlcy5zdGVuY2lsLAogICAgICAgICAgICAgIGZyYW1lYnVmZmVyU2NhbGVGYWN0b3IKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZ2xCYXNlTGF5ZXIgPSBuZXcgWFJXZWJHTExheWVyKHNlc3Npb24sIGdsLCBsYXllckluaXQpOwogICAgICAgICAgICBzZXNzaW9uLnVwZGF0ZVJlbmRlclN0YXRlKHsgYmFzZUxheWVyOiBnbEJhc2VMYXllciB9KTsKICAgICAgICAgICAgcmVuZGVyZXIuc2V0UGl4ZWxSYXRpbygxKTsKICAgICAgICAgICAgcmVuZGVyZXIuc2V0U2l6ZShnbEJhc2VMYXllci5mcmFtZWJ1ZmZlcldpZHRoLCBnbEJhc2VMYXllci5mcmFtZWJ1ZmZlckhlaWdodCwgZmFsc2UpOwogICAgICAgICAgICBuZXdSZW5kZXJUYXJnZXQgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoZ2xCYXNlTGF5ZXIuZnJhbWVidWZmZXJXaWR0aCwgZ2xCYXNlTGF5ZXIuZnJhbWVidWZmZXJIZWlnaHQsIHsKICAgICAgICAgICAgICBmb3JtYXQ6IFJHQkFGb3JtYXQsCiAgICAgICAgICAgICAgdHlwZTogVW5zaWduZWRCeXRlVHlwZSwKICAgICAgICAgICAgICBjb2xvclNwYWNlOiByZW5kZXJlci5vdXRwdXRDb2xvclNwYWNlLAogICAgICAgICAgICAgIHN0ZW5jaWxCdWZmZXI6IGF0dHJpYnV0ZXMuc3RlbmNpbAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxldCBkZXB0aEZvcm1hdCA9IG51bGw7CiAgICAgICAgICAgIGxldCBkZXB0aFR5cGUgPSBudWxsOwogICAgICAgICAgICBsZXQgZ2xEZXB0aEZvcm1hdCA9IG51bGw7CiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLmRlcHRoKSB7CiAgICAgICAgICAgICAgZ2xEZXB0aEZvcm1hdCA9IGF0dHJpYnV0ZXMuc3RlbmNpbCA/IGdsLkRFUFRIMjRfU1RFTkNJTDggOiBnbC5ERVBUSF9DT01QT05FTlQyNDsKICAgICAgICAgICAgICBkZXB0aEZvcm1hdCA9IGF0dHJpYnV0ZXMuc3RlbmNpbCA/IERlcHRoU3RlbmNpbEZvcm1hdCA6IERlcHRoRm9ybWF0OwogICAgICAgICAgICAgIGRlcHRoVHlwZSA9IGF0dHJpYnV0ZXMuc3RlbmNpbCA/IFVuc2lnbmVkSW50MjQ4VHlwZSA6IFVuc2lnbmVkSW50VHlwZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzY29wZS5pc011bHRpdmlldyA9IHVzZU11bHRpdmlldyAmJiBleHRlbnNpb25zLmhhcygiT0NVTFVTX211bHRpdmlldyIpOwogICAgICAgICAgICBjb25zdCBwcm9qZWN0aW9ubGF5ZXJJbml0ID0gewogICAgICAgICAgICAgIGNvbG9yRm9ybWF0OiBnbC5SR0JBOCwKICAgICAgICAgICAgICBkZXB0aEZvcm1hdDogZ2xEZXB0aEZvcm1hdCwKICAgICAgICAgICAgICBzY2FsZUZhY3RvcjogZnJhbWVidWZmZXJTY2FsZUZhY3RvcgogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc2NvcGUuaXNNdWx0aXZpZXcpIHsKICAgICAgICAgICAgICBwcm9qZWN0aW9ubGF5ZXJJbml0LnRleHR1cmVUeXBlID0gInRleHR1cmUtYXJyYXkiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdsQmluZGluZyA9IG5ldyBYUldlYkdMQmluZGluZyhzZXNzaW9uLCBnbCk7CiAgICAgICAgICAgIGdsUHJvakxheWVyID0gZ2xCaW5kaW5nLmNyZWF0ZVByb2plY3Rpb25MYXllcihwcm9qZWN0aW9ubGF5ZXJJbml0KTsKICAgICAgICAgICAgc2Vzc2lvbi51cGRhdGVSZW5kZXJTdGF0ZSh7IGxheWVyczogW2dsUHJvakxheWVyXSB9KTsKICAgICAgICAgICAgcmVuZGVyZXIuc2V0UGl4ZWxSYXRpbygxKTsKICAgICAgICAgICAgcmVuZGVyZXIuc2V0U2l6ZShnbFByb2pMYXllci50ZXh0dXJlV2lkdGgsIGdsUHJvakxheWVyLnRleHR1cmVIZWlnaHQsIGZhbHNlKTsKICAgICAgICAgICAgY29uc3QgcmVuZGVyVGFyZ2V0T3B0aW9ucyA9IHsKICAgICAgICAgICAgICBmb3JtYXQ6IFJHQkFGb3JtYXQsCiAgICAgICAgICAgICAgdHlwZTogVW5zaWduZWRCeXRlVHlwZSwKICAgICAgICAgICAgICBkZXB0aFRleHR1cmU6IG5ldyBEZXB0aFRleHR1cmUoZ2xQcm9qTGF5ZXIudGV4dHVyZVdpZHRoLCBnbFByb2pMYXllci50ZXh0dXJlSGVpZ2h0LCBkZXB0aFR5cGUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGRlcHRoRm9ybWF0KSwKICAgICAgICAgICAgICBzdGVuY2lsQnVmZmVyOiBhdHRyaWJ1dGVzLnN0ZW5jaWwsCiAgICAgICAgICAgICAgY29sb3JTcGFjZTogcmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZSwKICAgICAgICAgICAgICBzYW1wbGVzOiBhdHRyaWJ1dGVzLmFudGlhbGlhcyA/IDQgOiAwLAogICAgICAgICAgICAgIHJlc29sdmVEZXB0aEJ1ZmZlcjogZ2xQcm9qTGF5ZXIuaWdub3JlRGVwdGhWYWx1ZXMgPT09IGZhbHNlCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChzY29wZS5pc011bHRpdmlldykgewogICAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCJPQ1VMVVNfbXVsdGl2aWV3Iik7CiAgICAgICAgICAgICAgdGhpcy5tYXhOdW1WaWV3cyA9IGdsLmdldFBhcmFtZXRlcihleHRlbnNpb24uTUFYX1ZJRVdTX09WUik7CiAgICAgICAgICAgICAgbmV3UmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMTXVsdGl2aWV3UmVuZGVyVGFyZ2V0KGdsUHJvakxheWVyLnRleHR1cmVXaWR0aCwgZ2xQcm9qTGF5ZXIudGV4dHVyZUhlaWdodCwgMiwgcmVuZGVyVGFyZ2V0T3B0aW9ucyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbmV3UmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KGdsUHJvakxheWVyLnRleHR1cmVXaWR0aCwgZ2xQcm9qTGF5ZXIudGV4dHVyZUhlaWdodCwgcmVuZGVyVGFyZ2V0T3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG5ld1JlbmRlclRhcmdldC5pc1hSUmVuZGVyVGFyZ2V0ID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuc2V0Rm92ZWF0aW9uKGZvdmVhdGlvbik7CiAgICAgICAgICBjdXN0b21SZWZlcmVuY2VTcGFjZSA9IG51bGw7CiAgICAgICAgICByZWZlcmVuY2VTcGFjZSA9IGF3YWl0IHNlc3Npb24ucmVxdWVzdFJlZmVyZW5jZVNwYWNlKHJlZmVyZW5jZVNwYWNlVHlwZSk7CiAgICAgICAgICBhbmltYXRpb24uc2V0Q29udGV4dChzZXNzaW9uKTsKICAgICAgICAgIGFuaW1hdGlvbi5zdGFydCgpOwogICAgICAgICAgc2NvcGUuaXNQcmVzZW50aW5nID0gdHJ1ZTsKICAgICAgICAgIHNjb3BlLmRpc3BhdGNoRXZlbnQoeyB0eXBlOiAic2Vzc2lvbnN0YXJ0IiB9KTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHRoaXMuZ2V0RW52aXJvbm1lbnRCbGVuZE1vZGUgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoc2Vzc2lvbiAhPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIHNlc3Npb24uZW52aXJvbm1lbnRCbGVuZE1vZGU7CiAgICAgICAgfQogICAgICB9OwogICAgICB0aGlzLmFkZExheWVyID0gZnVuY3Rpb24obGF5ZXIpIHsKICAgICAgICBpZiAoIXdpbmRvdy5YUldlYkdMQmluZGluZyB8fCAhdGhpcy5sYXllcnNFbmFibGVkIHx8ICFzZXNzaW9uKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxheWVycy5wdXNoKGxheWVyKTsKICAgICAgICB0aGlzLnVwZGF0ZUxheWVycygpOwogICAgICB9OwogICAgICB0aGlzLnJlbW92ZUxheWVyID0gZnVuY3Rpb24obGF5ZXIpIHsKICAgICAgICBsYXllcnMuc3BsaWNlKGxheWVycy5pbmRleE9mKGxheWVyKSwgMSk7CiAgICAgICAgaWYgKCF3aW5kb3cuWFJXZWJHTEJpbmRpbmcgfHwgIXRoaXMubGF5ZXJzRW5hYmxlZCB8fCAhc2Vzc2lvbikgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLnVwZGF0ZUxheWVycygpOwogICAgICB9OwogICAgICB0aGlzLnVwZGF0ZUxheWVycyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBsYXllcnNDb3B5ID0gbGF5ZXJzLm1hcChmdW5jdGlvbih4KSB7CiAgICAgICAgICByZXR1cm4geDsKICAgICAgICB9KTsKICAgICAgICBsYXllcnNDb3B5LnVuc2hpZnQoc2Vzc2lvbi5yZW5kZXJTdGF0ZS5sYXllcnNbMF0pOwogICAgICAgIHNlc3Npb24udXBkYXRlUmVuZGVyU3RhdGUoeyBsYXllcnM6IGxheWVyc0NvcHkgfSk7CiAgICAgIH07CiAgICAgIHRoaXMuZ2V0RGVwdGhUZXh0dXJlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRlcHRoU2Vuc2luZy5nZXREZXB0aFRleHR1cmUoKTsKICAgICAgfTsKICAgICAgZnVuY3Rpb24gb25JbnB1dFNvdXJjZXNDaGFuZ2UoZXZlbnQpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgZXZlbnQucmVtb3ZlZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgaW5wdXRTb3VyY2UgPSBldmVudC5yZW1vdmVkW2ldOwogICAgICAgICAgY29uc3QgaW5kZXggPSBjb250cm9sbGVySW5wdXRTb3VyY2VzLmluZGV4T2YoaW5wdXRTb3VyY2UpOwogICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgY29udHJvbGxlcklucHV0U291cmNlc1tpbmRleF0gPSBudWxsOwogICAgICAgICAgICBjb250cm9sbGVyc1tpbmRleF0uZGlzY29ubmVjdChpbnB1dFNvdXJjZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwO2kgPCBldmVudC5hZGRlZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgaW5wdXRTb3VyY2UgPSBldmVudC5hZGRlZFtpXTsKICAgICAgICAgIGxldCBjb250cm9sbGVySW5kZXggPSBjb250cm9sbGVySW5wdXRTb3VyY2VzLmluZGV4T2YoaW5wdXRTb3VyY2UpOwogICAgICAgICAgaWYgKGNvbnRyb2xsZXJJbmRleCA9PT0gLTEpIHsKICAgICAgICAgICAgZm9yIChsZXQgaTIgPSAwO2kyIDwgY29udHJvbGxlcnMubGVuZ3RoOyBpMisrKSB7CiAgICAgICAgICAgICAgaWYgKGkyID49IGNvbnRyb2xsZXJJbnB1dFNvdXJjZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBjb250cm9sbGVySW5wdXRTb3VyY2VzLnB1c2goaW5wdXRTb3VyY2UpOwogICAgICAgICAgICAgICAgY29udHJvbGxlckluZGV4ID0gaTI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2xsZXJJbnB1dFNvdXJjZXNbaTJdID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBjb250cm9sbGVySW5wdXRTb3VyY2VzW2kyXSA9IGlucHV0U291cmNlOwogICAgICAgICAgICAgICAgY29udHJvbGxlckluZGV4ID0gaTI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJJbmRleCA9PT0gLTEpCiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBjb250cm9sbGVyID0gY29udHJvbGxlcnNbY29udHJvbGxlckluZGV4XTsKICAgICAgICAgIGlmIChjb250cm9sbGVyKSB7CiAgICAgICAgICAgIGNvbnRyb2xsZXIuY29ubmVjdChpbnB1dFNvdXJjZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IGNhbWVyYUxQb3MgPSBuZXcgVmVjdG9yMzsKICAgICAgY29uc3QgY2FtZXJhUlBvcyA9IG5ldyBWZWN0b3IzOwogICAgICBmdW5jdGlvbiBzZXRQcm9qZWN0aW9uRnJvbVVuaW9uKGNhbWVyYSwgY2FtZXJhTDIsIGNhbWVyYVIyKSB7CiAgICAgICAgY2FtZXJhTFBvcy5zZXRGcm9tTWF0cml4UG9zaXRpb24oY2FtZXJhTDIubWF0cml4V29ybGQpOwogICAgICAgIGNhbWVyYVJQb3Muc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGNhbWVyYVIyLm1hdHJpeFdvcmxkKTsKICAgICAgICBjb25zdCBpcGQgPSBjYW1lcmFMUG9zLmRpc3RhbmNlVG8oY2FtZXJhUlBvcyk7CiAgICAgICAgY29uc3QgcHJvakwgPSBjYW1lcmFMMi5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzOwogICAgICAgIGNvbnN0IHByb2pSID0gY2FtZXJhUjIucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50czsKICAgICAgICBjb25zdCBuZWFyID0gcHJvakxbMTRdIC8gKHByb2pMWzEwXSAtIDEpOwogICAgICAgIGNvbnN0IGZhciA9IHByb2pMWzE0XSAvIChwcm9qTFsxMF0gKyAxKTsKICAgICAgICBjb25zdCB0b3BGb3YgPSAocHJvakxbOV0gKyAxKSAvIHByb2pMWzVdOwogICAgICAgIGNvbnN0IGJvdHRvbUZvdiA9IChwcm9qTFs5XSAtIDEpIC8gcHJvakxbNV07CiAgICAgICAgY29uc3QgbGVmdEZvdiA9IChwcm9qTFs4XSAtIDEpIC8gcHJvakxbMF07CiAgICAgICAgY29uc3QgcmlnaHRGb3YgPSAocHJvalJbOF0gKyAxKSAvIHByb2pSWzBdOwogICAgICAgIGNvbnN0IGxlZnQgPSBuZWFyICogbGVmdEZvdjsKICAgICAgICBjb25zdCByaWdodCA9IG5lYXIgKiByaWdodEZvdjsKICAgICAgICBjb25zdCB6T2Zmc2V0ID0gaXBkIC8gKC1sZWZ0Rm92ICsgcmlnaHRGb3YpOwogICAgICAgIGNvbnN0IHhPZmZzZXQgPSB6T2Zmc2V0ICogLWxlZnRGb3Y7CiAgICAgICAgY2FtZXJhTDIubWF0cml4V29ybGQuZGVjb21wb3NlKGNhbWVyYS5wb3NpdGlvbiwgY2FtZXJhLnF1YXRlcm5pb24sIGNhbWVyYS5zY2FsZSk7CiAgICAgICAgY2FtZXJhLnRyYW5zbGF0ZVgoeE9mZnNldCk7CiAgICAgICAgY2FtZXJhLnRyYW5zbGF0ZVooek9mZnNldCk7CiAgICAgICAgY2FtZXJhLm1hdHJpeFdvcmxkLmNvbXBvc2UoY2FtZXJhLnBvc2l0aW9uLCBjYW1lcmEucXVhdGVybmlvbiwgY2FtZXJhLnNjYWxlKTsKICAgICAgICBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoY2FtZXJhLm1hdHJpeFdvcmxkKS5pbnZlcnQoKTsKICAgICAgICBpZiAocHJvakxbMTBdID09PSAtMSkgewogICAgICAgICAgY2FtZXJhLnByb2plY3Rpb25NYXRyaXguY29weShjYW1lcmFMMi5wcm9qZWN0aW9uTWF0cml4KTsKICAgICAgICAgIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KGNhbWVyYUwyLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgbmVhcjIgPSBuZWFyICsgek9mZnNldDsKICAgICAgICAgIGNvbnN0IGZhcjIgPSBmYXIgKyB6T2Zmc2V0OwogICAgICAgICAgY29uc3QgbGVmdDIgPSBsZWZ0IC0geE9mZnNldDsKICAgICAgICAgIGNvbnN0IHJpZ2h0MiA9IHJpZ2h0ICsgKGlwZCAtIHhPZmZzZXQpOwogICAgICAgICAgY29uc3QgdG9wMiA9IHRvcEZvdiAqIGZhciAvIGZhcjIgKiBuZWFyMjsKICAgICAgICAgIGNvbnN0IGJvdHRvbTIgPSBib3R0b21Gb3YgKiBmYXIgLyBmYXIyICogbmVhcjI7CiAgICAgICAgICBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUobGVmdDIsIHJpZ2h0MiwgdG9wMiwgYm90dG9tMiwgbmVhcjIsIGZhcjIpOwogICAgICAgICAgY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoY2FtZXJhLnByb2plY3Rpb25NYXRyaXgpLmludmVydCgpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiB1cGRhdGVDYW1lcmEoY2FtZXJhLCBwYXJlbnQpIHsKICAgICAgICBpZiAocGFyZW50ID09PSBudWxsKSB7CiAgICAgICAgICBjYW1lcmEubWF0cml4V29ybGQuY29weShjYW1lcmEubWF0cml4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2FtZXJhLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXMocGFyZW50Lm1hdHJpeFdvcmxkLCBjYW1lcmEubWF0cml4KTsKICAgICAgICB9CiAgICAgICAgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KGNhbWVyYS5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk7CiAgICAgIH0KICAgICAgdGhpcy5zZXRQb3NlVGFyZ2V0ID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgaWYgKG9iamVjdCAhPT0gdW5kZWZpbmVkKQogICAgICAgICAgcG9zZVRhcmdldCA9IG9iamVjdDsKICAgICAgfTsKICAgICAgdGhpcy51cGRhdGVDYW1lcmEgPSBmdW5jdGlvbihjYW1lcmEpIHsKICAgICAgICBpZiAoc2Vzc2lvbiA9PT0gbnVsbCkKICAgICAgICAgIHJldHVybjsKICAgICAgICBsZXQgZGVwdGhOZWFyID0gY2FtZXJhLm5lYXI7CiAgICAgICAgbGV0IGRlcHRoRmFyID0gY2FtZXJhLmZhcjsKICAgICAgICBpZiAoZGVwdGhTZW5zaW5nLnRleHR1cmUgIT09IG51bGwpIHsKICAgICAgICAgIGlmIChkZXB0aFNlbnNpbmcuZGVwdGhOZWFyID4gMCkKICAgICAgICAgICAgZGVwdGhOZWFyID0gZGVwdGhTZW5zaW5nLmRlcHRoTmVhcjsKICAgICAgICAgIGlmIChkZXB0aFNlbnNpbmcuZGVwdGhGYXIgPiAwKQogICAgICAgICAgICBkZXB0aEZhciA9IGRlcHRoU2Vuc2luZy5kZXB0aEZhcjsKICAgICAgICB9CiAgICAgICAgY2FtZXJhWFIubmVhciA9IGNhbWVyYVIubmVhciA9IGNhbWVyYUwubmVhciA9IGRlcHRoTmVhcjsKICAgICAgICBjYW1lcmFYUi5mYXIgPSBjYW1lcmFSLmZhciA9IGNhbWVyYUwuZmFyID0gZGVwdGhGYXI7CiAgICAgICAgaWYgKF9jdXJyZW50RGVwdGhOZWFyICE9PSBjYW1lcmFYUi5uZWFyIHx8IF9jdXJyZW50RGVwdGhGYXIgIT09IGNhbWVyYVhSLmZhcikgewogICAgICAgICAgc2Vzc2lvbi51cGRhdGVSZW5kZXJTdGF0ZSh7CiAgICAgICAgICAgIGRlcHRoTmVhcjogY2FtZXJhWFIubmVhciwKICAgICAgICAgICAgZGVwdGhGYXI6IGNhbWVyYVhSLmZhcgogICAgICAgICAgfSk7CiAgICAgICAgICBfY3VycmVudERlcHRoTmVhciA9IGNhbWVyYVhSLm5lYXI7CiAgICAgICAgICBfY3VycmVudERlcHRoRmFyID0gY2FtZXJhWFIuZmFyOwogICAgICAgIH0KICAgICAgICBjYW1lcmFMLmxheWVycy5tYXNrID0gY2FtZXJhLmxheWVycy5tYXNrIHwgMjsKICAgICAgICBjYW1lcmFSLmxheWVycy5tYXNrID0gY2FtZXJhLmxheWVycy5tYXNrIHwgNDsKICAgICAgICBjYW1lcmFYUi5sYXllcnMubWFzayA9IGNhbWVyYUwubGF5ZXJzLm1hc2sgfCBjYW1lcmFSLmxheWVycy5tYXNrOwogICAgICAgIGNvbnN0IGNhbWVyYXMyID0gY2FtZXJhWFIuY2FtZXJhczsKICAgICAgICB2YXIgb2JqZWN0ID0gcG9zZVRhcmdldCB8fCBjYW1lcmE7CiAgICAgICAgY29uc3QgcGFyZW50ID0gb2JqZWN0LnBhcmVudDsKICAgICAgICB1cGRhdGVDYW1lcmEoY2FtZXJhWFIsIHBhcmVudCk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7aSA8IGNhbWVyYXMyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB1cGRhdGVDYW1lcmEoY2FtZXJhczJbaV0sIHBhcmVudCk7CiAgICAgICAgfQogICAgICAgIGlmIChjYW1lcmFzMi5sZW5ndGggPT09IDIpIHsKICAgICAgICAgIHNldFByb2plY3Rpb25Gcm9tVW5pb24oY2FtZXJhWFIsIGNhbWVyYUwsIGNhbWVyYVIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjYW1lcmFYUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4KTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlVXNlckNhbWVyYShjYW1lcmEsIGNhbWVyYVhSLCBvYmplY3QpOwogICAgICB9OwogICAgICBmdW5jdGlvbiB1cGRhdGVVc2VyQ2FtZXJhKGNhbWVyYSwgY2FtZXJhWFIyLCBvYmplY3QpIHsKICAgICAgICBjYW1lcmFYUjIubWF0cml4V29ybGQuZGVjb21wb3NlKGNhbWVyYVhSMi5wb3NpdGlvbiwgY2FtZXJhWFIyLnF1YXRlcm5pb24sIGNhbWVyYVhSMi5zY2FsZSk7CiAgICAgICAgaWYgKG9iamVjdC5wYXJlbnQgPT09IG51bGwpIHsKICAgICAgICAgIG9iamVjdC5tYXRyaXguY29weShjYW1lcmFYUjIubWF0cml4V29ybGQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvYmplY3QubWF0cml4LmNvcHkob2JqZWN0LnBhcmVudC5tYXRyaXhXb3JsZCk7CiAgICAgICAgICBvYmplY3QubWF0cml4LmludmVydCgpOwogICAgICAgICAgb2JqZWN0Lm1hdHJpeC5tdWx0aXBseShjYW1lcmFYUjIubWF0cml4V29ybGQpOwogICAgICAgIH0KICAgICAgICBvYmplY3QubWF0cml4LmRlY29tcG9zZShvYmplY3QucG9zaXRpb24sIG9iamVjdC5xdWF0ZXJuaW9uLCBvYmplY3Quc2NhbGUpOwogICAgICAgIG9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTsKICAgICAgICBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jb3B5KGNhbWVyYVhSMi5wcm9qZWN0aW9uTWF0cml4KTsKICAgICAgICBjYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weShjYW1lcmFYUjIucHJvamVjdGlvbk1hdHJpeEludmVyc2UpOwogICAgICAgIGlmIChjYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSkgewogICAgICAgICAgY2FtZXJhLmZvdiA9IFJBRDJERUcgKiAyICogTWF0aC5hdGFuKDEgLyBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1s1XSk7CiAgICAgICAgICBjYW1lcmEuem9vbSA9IDE7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuZ2V0Q2FtZXJhID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGNhbWVyYVhSOwogICAgICB9OwogICAgICB0aGlzLmdldEZvdmVhdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChnbFByb2pMYXllciA9PT0gbnVsbCAmJiBnbEJhc2VMYXllciA9PT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZm92ZWF0aW9uOwogICAgICB9OwogICAgICB0aGlzLnNldEZvdmVhdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgZm92ZWF0aW9uID0gdmFsdWU7CiAgICAgICAgaWYgKGdsUHJvakxheWVyICE9PSBudWxsKSB7CiAgICAgICAgICBnbFByb2pMYXllci5maXhlZEZvdmVhdGlvbiA9IHZhbHVlOwogICAgICAgIH0KICAgICAgICBpZiAoZ2xCYXNlTGF5ZXIgIT09IG51bGwgJiYgZ2xCYXNlTGF5ZXIuZml4ZWRGb3ZlYXRpb24gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgZ2xCYXNlTGF5ZXIuZml4ZWRGb3ZlYXRpb24gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHRoaXMuaGFzRGVwdGhTZW5zaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRlcHRoU2Vuc2luZy50ZXh0dXJlICE9PSBudWxsOwogICAgICB9OwogICAgICB0aGlzLmdldERlcHRoU2Vuc2luZ01lc2ggPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZGVwdGhTZW5zaW5nLmdldE1lc2goY2FtZXJhWFIpOwogICAgICB9OwogICAgICBsZXQgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrID0gbnVsbDsKICAgICAgZnVuY3Rpb24gb25BbmltYXRpb25GcmFtZSh0aW1lLCBmcmFtZSkgewogICAgICAgIHBvc2UgPSBmcmFtZS5nZXRWaWV3ZXJQb3NlKGN1c3RvbVJlZmVyZW5jZVNwYWNlIHx8IHJlZmVyZW5jZVNwYWNlKTsKICAgICAgICB4ckZyYW1lID0gZnJhbWU7CiAgICAgICAgaWYgKHBvc2UgIT09IG51bGwpIHsKICAgICAgICAgIGNvbnN0IHZpZXdzID0gcG9zZS52aWV3czsKICAgICAgICAgIGlmIChnbEJhc2VMYXllciAhPT0gbnVsbCkgewogICAgICAgICAgICByZW5kZXJlci5zZXRSZW5kZXJUYXJnZXRGcmFtZWJ1ZmZlcihuZXdSZW5kZXJUYXJnZXQsIGdsQmFzZUxheWVyLmZyYW1lYnVmZmVyKTsKICAgICAgICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KG5ld1JlbmRlclRhcmdldCk7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgY2FtZXJhWFJOZWVkc1VwZGF0ZSA9IGZhbHNlOwogICAgICAgICAgaWYgKHZpZXdzLmxlbmd0aCAhPT0gY2FtZXJhWFIuY2FtZXJhcy5sZW5ndGgpIHsKICAgICAgICAgICAgY2FtZXJhWFIuY2FtZXJhcy5sZW5ndGggPSAwOwogICAgICAgICAgICBjYW1lcmFYUk5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAobGV0IGkgPSAwO2kgPCB2aWV3cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBjb25zdCB2aWV3ID0gdmlld3NbaV07CiAgICAgICAgICAgIGxldCB2aWV3cG9ydCA9IG51bGw7CiAgICAgICAgICAgIGlmIChnbEJhc2VMYXllciAhPT0gbnVsbCkgewogICAgICAgICAgICAgIHZpZXdwb3J0ID0gZ2xCYXNlTGF5ZXIuZ2V0Vmlld3BvcnQodmlldyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY29uc3QgZ2xTdWJJbWFnZSA9IGdsQmluZGluZy5nZXRWaWV3U3ViSW1hZ2UoZ2xQcm9qTGF5ZXIsIHZpZXcpOwogICAgICAgICAgICAgIHZpZXdwb3J0ID0gZ2xTdWJJbWFnZS52aWV3cG9ydDsKICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkgewogICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0VGV4dHVyZXMobmV3UmVuZGVyVGFyZ2V0LCBnbFN1YkltYWdlLmNvbG9yVGV4dHVyZSwgZ2xQcm9qTGF5ZXIuaWdub3JlRGVwdGhWYWx1ZXMgPyB1bmRlZmluZWQgOiBnbFN1YkltYWdlLmRlcHRoU3RlbmNpbFRleHR1cmUpOwogICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KG5ld1JlbmRlclRhcmdldCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBjYW1lcmEgPSBjYW1lcmFzW2ldOwogICAgICAgICAgICBpZiAoY2FtZXJhID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICBjYW1lcmEgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmE7CiAgICAgICAgICAgICAgY2FtZXJhLmxheWVycy5lbmFibGUoaSk7CiAgICAgICAgICAgICAgY2FtZXJhLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQ7CiAgICAgICAgICAgICAgY2FtZXJhc1tpXSA9IGNhbWVyYTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYW1lcmEubWF0cml4LmZyb21BcnJheSh2aWV3LnRyYW5zZm9ybS5tYXRyaXgpOwogICAgICAgICAgICBjYW1lcmEubWF0cml4LmRlY29tcG9zZShjYW1lcmEucG9zaXRpb24sIGNhbWVyYS5xdWF0ZXJuaW9uLCBjYW1lcmEuc2NhbGUpOwogICAgICAgICAgICBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkodmlldy5wcm9qZWN0aW9uTWF0cml4KTsKICAgICAgICAgICAgY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoY2FtZXJhLnByb2plY3Rpb25NYXRyaXgpLmludmVydCgpOwogICAgICAgICAgICBjYW1lcmEudmlld3BvcnQuc2V0KHZpZXdwb3J0LngsIHZpZXdwb3J0LnksIHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQpOwogICAgICAgICAgICBpZiAoaSA9PT0gMCkgewogICAgICAgICAgICAgIGNhbWVyYVhSLm1hdHJpeC5jb3B5KGNhbWVyYS5tYXRyaXgpOwogICAgICAgICAgICAgIGNhbWVyYVhSLm1hdHJpeC5kZWNvbXBvc2UoY2FtZXJhWFIucG9zaXRpb24sIGNhbWVyYVhSLnF1YXRlcm5pb24sIGNhbWVyYVhSLnNjYWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2FtZXJhWFJOZWVkc1VwZGF0ZSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgIGNhbWVyYVhSLmNhbWVyYXMucHVzaChjYW1lcmEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBlbmFibGVkRmVhdHVyZXMgPSBzZXNzaW9uLmVuYWJsZWRGZWF0dXJlczsKICAgICAgICAgIGNvbnN0IGdwdURlcHRoU2Vuc2luZ0VuYWJsZWQgPSBlbmFibGVkRmVhdHVyZXMgJiYgZW5hYmxlZEZlYXR1cmVzLmluY2x1ZGVzKCJkZXB0aC1zZW5zaW5nIikgJiYgc2Vzc2lvbi5kZXB0aFVzYWdlID09ICJncHUtb3B0aW1pemVkIjsKICAgICAgICAgIGlmIChncHVEZXB0aFNlbnNpbmdFbmFibGVkICYmIGdsQmluZGluZykgewogICAgICAgICAgICBjb25zdCBkZXB0aERhdGEgPSBnbEJpbmRpbmcuZ2V0RGVwdGhJbmZvcm1hdGlvbih2aWV3c1swXSk7CiAgICAgICAgICAgIGlmIChkZXB0aERhdGEgJiYgZGVwdGhEYXRhLmlzVmFsaWQgJiYgZGVwdGhEYXRhLnRleHR1cmUpIHsKICAgICAgICAgICAgICBkZXB0aFNlbnNpbmcuaW5pdChyZW5kZXJlciwgZGVwdGhEYXRhLCBzZXNzaW9uLnJlbmRlclN0YXRlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDtpIDwgY29udHJvbGxlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGlucHV0U291cmNlID0gY29udHJvbGxlcklucHV0U291cmNlc1tpXTsKICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBjb250cm9sbGVyc1tpXTsKICAgICAgICAgIGlmIChpbnB1dFNvdXJjZSAhPT0gbnVsbCAmJiBjb250cm9sbGVyICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29udHJvbGxlci51cGRhdGUoaW5wdXRTb3VyY2UsIGZyYW1lLCBjdXN0b21SZWZlcmVuY2VTcGFjZSB8fCByZWZlcmVuY2VTcGFjZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2spCiAgICAgICAgICBvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sodGltZSwgZnJhbWUpOwogICAgICAgIGlmIChmcmFtZS5kZXRlY3RlZFBsYW5lcykgewogICAgICAgICAgc2NvcGUuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICJwbGFuZXNkZXRlY3RlZCIsIGRhdGE6IGZyYW1lIH0pOwogICAgICAgIH0KICAgICAgICB4ckZyYW1lID0gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBhbmltYXRpb24gPSBuZXcgV2ViR0xBbmltYXRpb247CiAgICAgIGFuaW1hdGlvbi5zZXRBbmltYXRpb25Mb29wKG9uQW5pbWF0aW9uRnJhbWUpOwogICAgICB0aGlzLnNldEFuaW1hdGlvbkxvb3AgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgIG9uQW5pbWF0aW9uRnJhbWVDYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICB9OwogICAgICB0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHt9OwogICAgfQogIH07CiAgX2UxID0gLyogQF9fUFVSRV9fICovIG5ldyBFdWxlcjsKICBfbTEyID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXRyaXg0Owp9KTsKCi8vIG5vZGVfbW9kdWxlcy9hZnJhbWUvZGlzdC9hZnJhbWUtbWFzdGVyLm1vZHVsZS5taW4uanMKdmFyIGV4cG9ydHNfYWZyYW1lX21hc3Rlcl9tb2R1bGVfbWluID0ge307Cl9fZXhwb3J0KGV4cG9ydHNfYWZyYW1lX21hc3Rlcl9tb2R1bGVfbWluLCB7CiAgZGVmYXVsdDogKCkgPT4gVmMKfSk7CmZ1bmN0aW9uIGkoZSkgewogIHZhciByID0gbltlXTsKICBpZiAociAhPT0gdW5kZWZpbmVkKQogICAgcmV0dXJuIHIuZXhwb3J0czsKICB2YXIgbyA9IG5bZV0gPSB7IGlkOiBlLCBleHBvcnRzOiB7fSB9OwogIHJldHVybiB0W2VdKG8sIG8uZXhwb3J0cywgaSksIG8uZXhwb3J0czsKfQpmdW5jdGlvbiBiKGUsIHQyLCBuMikgewogIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChlLCB0MiksIG4yKTsKfQpmdW5jdGlvbiB5KGUsIHQyKSB7CiAgcmV0dXJuIGUuaW5kZXhPZih0MikgPiAtMTsKfQpmdW5jdGlvbiBJKGUsIHQyKSB7CiAgcmV0dXJuIGUuYXBwbHkobnVsbCwgdDIpOwp9CmZ1bmN0aW9uIFMoZSkgewogIHZhciB0MiA9IE0uZXhlYyhlKTsKICByZXR1cm4gdDIgPyB0MlsxXS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihlMikgewogICAgcmV0dXJuIHBhcnNlRmxvYXQoZTIpOwogIH0pIDogW107Cn0KZnVuY3Rpb24gRChlLCB0MikgewogIHZhciBuMiA9IFMoZSksIGkyID0gYihMLnVuZChuMlswXSkgPyAxIDogbjJbMF0sIDAuMSwgMTAwKSwgcjIgPSBiKEwudW5kKG4yWzFdKSA/IDEwMCA6IG4yWzFdLCAwLjEsIDEwMCksIG8yID0gYihMLnVuZChuMlsyXSkgPyAxMCA6IG4yWzJdLCAwLjEsIDEwMCksIHMyID0gYihMLnVuZChuMlszXSkgPyAwIDogbjJbM10sIDAuMSwgMTAwKSwgYTIgPSBNYXRoLnNxcnQocjIgLyBpMiksIEEyID0gbzIgLyAoMiAqIE1hdGguc3FydChyMiAqIGkyKSksIGwyID0gQTIgPCAxID8gYTIgKiBNYXRoLnNxcnQoMSAtIEEyICogQTIpIDogMCwgYzIgPSBBMiA8IDEgPyAoQTIgKiBhMiAtIHMyKSAvIGwyIDogLXMyICsgYTI7CiAgZnVuY3Rpb24gaDIoZTIpIHsKICAgIHZhciBuMyA9IHQyID8gdDIgKiBlMiAvIDEwMDAgOiBlMjsKICAgIHJldHVybiBuMyA9IEEyIDwgMSA/IE1hdGguZXhwKC1uMyAqIEEyICogYTIpICogKDEgKiBNYXRoLmNvcyhsMiAqIG4zKSArIGMyICogTWF0aC5zaW4obDIgKiBuMykpIDogKDEgKyBjMiAqIG4zKSAqIE1hdGguZXhwKC1uMyAqIGEyKSwgZTIgPT09IDAgfHwgZTIgPT09IDEgPyBlMiA6IDEgLSBuMzsKICB9CiAgcmV0dXJuIHQyID8gaDIgOiBmdW5jdGlvbigpIHsKICAgIHZhciB0MyA9IEIuc3ByaW5nc1tlXTsKICAgIGlmICh0MykKICAgICAgcmV0dXJuIHQzOwogICAgZm9yICh2YXIgbjMgPSAxIC8gNiwgaTMgPSAwLCByMyA9IDA7OyApCiAgICAgIGlmIChoMihpMyArPSBuMykgPT09IDEpIHsKICAgICAgICBpZiAoKytyMyA+PSAxNikKICAgICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UKICAgICAgICByMyA9IDA7CiAgICB2YXIgbzMgPSBpMyAqIG4zICogMTAwMDsKICAgIHJldHVybiBCLnNwcmluZ3NbZV0gPSBvMywgbzM7CiAgfTsKfQpmdW5jdGlvbiBrKGUsIHQyKSB7CiAgZSA9PT0gdW5kZWZpbmVkICYmIChlID0gMSksIHQyID09PSB1bmRlZmluZWQgJiYgKHQyID0gMC41KTsKICB2YXIgbjIgPSBiKGUsIDEsIDEwKSwgaTIgPSBiKHQyLCAwLjEsIDIpOwogIHJldHVybiBmdW5jdGlvbihlMikgewogICAgcmV0dXJuIGUyID09PSAwIHx8IGUyID09PSAxID8gZTIgOiAtbjIgKiBNYXRoLnBvdygyLCAxMCAqIChlMiAtIDEpKSAqIE1hdGguc2luKChlMiAtIDEgLSBpMiAvICgyICogTWF0aC5QSSkgKiBNYXRoLmFzaW4oMSAvIG4yKSkgKiAoMiAqIE1hdGguUEkpIC8gaTIpOwogIH07Cn0KZnVuY3Rpb24gVChlKSB7CiAgcmV0dXJuIGUgPT09IHVuZGVmaW5lZCAmJiAoZSA9IDEwKSwgZnVuY3Rpb24odDIpIHsKICAgIHJldHVybiBNYXRoLnJvdW5kKHQyICogZSkgKiAoMSAvIGUpOwogIH07Cn0KZnVuY3Rpb24gVShlLCB0MikgewogIGlmIChMLmZuYyhlKSkKICAgIHJldHVybiBlOwogIHZhciBuMiA9IGUuc3BsaXQoIigiKVswXSwgaTIgPSBGW24yXSwgcjIgPSBTKGUpOwogIHN3aXRjaCAobjIpIHsKICAgIGNhc2UgInNwcmluZyI6CiAgICAgIHJldHVybiBEKGUsIHQyKTsKICAgIGNhc2UgImN1YmljQmV6aWVyIjoKICAgICAgcmV0dXJuIEkoUiwgcjIpOwogICAgY2FzZSAic3RlcHMiOgogICAgICByZXR1cm4gSShULCByMik7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gTC5mbmMoaTIpID8gSShpMiwgcjIpIDogSShSLCBpMik7CiAgfQp9CmZ1bmN0aW9uIE8oZSkgewogIHRyeSB7CiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlKTsKICB9IGNhdGNoIChlMikgewogICAgcmV0dXJuOwogIH0KfQpmdW5jdGlvbiBHKGUsIHQyKSB7CiAgZm9yICh2YXIgbjIgPSBQLCBpMiA9IGUubGVuZ3RoLCByMiA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMiA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgbzIgPSAwO28yIDwgaTI7IG8yKyspCiAgICBpZiAobzIgaW4gZSkgewogICAgICB2YXIgczIgPSBlW28yXTsKICAgICAgdDIuY2FsbChyMiwgczIsIG8yLCBlKSAmJiBuMi5wdXNoKHMyKTsKICAgIH0KICByZXR1cm4gKFAgPSBlKS5sZW5ndGggPSAwLCBuMjsKfQpmdW5jdGlvbiBOKGUsIHQyKSB7CiAgdDIgfHwgKHQyID0gW10pOwogIGZvciAodmFyIG4yID0gMCwgaTIgPSBlLmxlbmd0aDtuMiA8IGkyOyBuMisrKSB7CiAgICB2YXIgcjIgPSBlW24yXTsKICAgIEFycmF5LmlzQXJyYXkocjIpID8gTihyMiwgdDIpIDogdDIucHVzaChyMik7CiAgfQogIHJldHVybiB0MjsKfQpmdW5jdGlvbiBqKGUpIHsKICByZXR1cm4gTC5hcnIoZSkgPyBlIDogKEwuc3RyKGUpICYmIChlID0gTyhlKSB8fCBlKSwgZSBpbnN0YW5jZW9mIE5vZGVMaXN0IHx8IGUgaW5zdGFuY2VvZiBIVE1MQ29sbGVjdGlvbiA/IFtdLnNsaWNlLmNhbGwoZSkgOiBbZV0pOwp9CmZ1bmN0aW9uIF8oZSwgdDIpIHsKICByZXR1cm4gZS5zb21lKGZ1bmN0aW9uKGUyKSB7CiAgICByZXR1cm4gZTIgPT09IHQyOwogIH0pOwp9CmZ1bmN0aW9uIEgoZSkgewogIHZhciB0MiA9IHt9OwogIGZvciAodmFyIG4yIGluIGUpCiAgICB0MltuMl0gPSBlW24yXTsKICByZXR1cm4gdDI7Cn0KZnVuY3Rpb24gcShlLCB0MikgewogIHZhciBuMiA9IEgoZSk7CiAgZm9yICh2YXIgaTIgaW4gZSkKICAgIG4yW2kyXSA9IHQyLmhhc093blByb3BlcnR5KGkyKSA/IHQyW2kyXSA6IGVbaTJdOwogIHJldHVybiBuMjsKfQpmdW5jdGlvbiBWKGUsIHQyKSB7CiAgdmFyIG4yID0gSChlKTsKICBmb3IgKHZhciBpMiBpbiB0MikKICAgIG4yW2kyXSA9IEwudW5kKGVbaTJdKSA/IHQyW2kyXSA6IGVbaTJdOwogIHJldHVybiBuMjsKfQpmdW5jdGlvbiBaKGUpIHsKICB2YXIgdDIgPSBYLmV4ZWMoZSk7CiAgaWYgKHQyKQogICAgcmV0dXJuIHQyWzJdOwp9CmZ1bmN0aW9uICQoZSwgdDIpIHsKICByZXR1cm4gTC5mbmMoZSkgPyBlKHQyLnRhcmdldCwgdDIuaWQsIHQyLnRvdGFsKSA6IGU7Cn0KZnVuY3Rpb24gZWUoZSwgdDIpIHsKICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUodDIpOwp9CmZ1bmN0aW9uIHRlKGUsIHQyLCBuMikgewogIGlmIChfKFtuMiwgImRlZyIsICJyYWQiLCAidHVybiJdLCBaKHQyKSkpCiAgICByZXR1cm4gdDI7CiAgdmFyIGkyID0gQi5DU1NbdDIgKyBuMl07CiAgaWYgKCFMLnVuZChpMikpCiAgICByZXR1cm4gaTI7CiAgdmFyIHIyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlLnRhZ05hbWUpLCBvMiA9IGUucGFyZW50Tm9kZSAmJiBlLnBhcmVudE5vZGUgIT09IGRvY3VtZW50ID8gZS5wYXJlbnROb2RlIDogZG9jdW1lbnQuYm9keTsKICBvMi5hcHBlbmRDaGlsZChyMiksIHIyLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIiwgcjIuc3R5bGUud2lkdGggPSAxMDAgKyBuMjsKICB2YXIgczIgPSAxMDAgLyByMi5vZmZzZXRXaWR0aDsKICBvMi5yZW1vdmVDaGlsZChyMik7CiAgdmFyIGEyID0gczIgKiBwYXJzZUZsb2F0KHQyKTsKICByZXR1cm4gQi5DU1NbdDIgKyBuMl0gPSBhMiwgYTI7Cn0KZnVuY3Rpb24gbmUoZSwgdDIsIG4yKSB7CiAgaWYgKHQyIGluIGUuc3R5bGUpIHsKICAgIHZhciBpMiA9IHQyLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICIkMS0kMiIpLnRvTG93ZXJDYXNlKCksIHIyID0gZS5zdHlsZVt0Ml0gfHwgZ2V0Q29tcHV0ZWRTdHlsZShlKS5nZXRQcm9wZXJ0eVZhbHVlKGkyKSB8fCAiMCI7CiAgICByZXR1cm4gbjIgPyB0ZShlLCByMiwgbjIpIDogcjI7CiAgfQp9CmZ1bmN0aW9uIGllKGUsIHQyKSB7CiAgcmV0dXJuIEwuZG9tKGUpICYmICFMLmlucChlKSAmJiAoZWUoZSwgdDIpIHx8IEwuc3ZnKGUpICYmIGVbdDJdKSA/ICJhdHRyaWJ1dGUiIDogTC5kb20oZSkgJiYgXyh2LCB0MikgPyAidHJhbnNmb3JtIiA6IEwuZG9tKGUpICYmIHQyICE9PSAidHJhbnNmb3JtIiAmJiBuZShlLCB0MikgPyAiY3NzIiA6IGVbdDJdICE9IG51bGwgPyAib2JqZWN0IiA6IHVuZGVmaW5lZDsKfQpmdW5jdGlvbiBvZShlKSB7CiAgaWYgKEwuZG9tKGUpKSB7CiAgICBmb3IgKHZhciB0MiwgbjIgPSBlLnN0eWxlLnRyYW5zZm9ybSB8fCAiIiwgaTIgPSBuZXcgTWFwO3QyID0gcmUuZXhlYyhuMik7ICkKICAgICAgaTIuc2V0KHQyWzFdLCB0MlsyXSk7CiAgICByZXR1cm4gaTI7CiAgfQp9CmZ1bmN0aW9uIHNlKGUsIHQyLCBuMiwgaTIpIHsKICBzd2l0Y2ggKGllKGUsIHQyKSkgewogICAgY2FzZSAidHJhbnNmb3JtIjoKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUyLCB0MywgbjMsIGkzKSB7CiAgICAgICAgdmFyIHIyID0geSh0MywgInNjYWxlIikgPyAxIDogMCArIGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgICByZXR1cm4geShlMywgInRyYW5zbGF0ZSIpIHx8IGUzID09PSAicGVyc3BlY3RpdmUiID8gInB4IiA6IHkoZTMsICJyb3RhdGUiKSB8fCB5KGUzLCAic2tldyIpID8gImRlZyIgOiB1bmRlZmluZWQ7CiAgICAgICAgfSh0MyksIG8yID0gb2UoZTIpLmdldCh0MykgfHwgcjI7CiAgICAgICAgcmV0dXJuIG4zICYmIChuMy50cmFuc2Zvcm1zLmxpc3Quc2V0KHQzLCBvMiksIG4zLnRyYW5zZm9ybXMubGFzdCA9IHQzKSwgaTMgPyB0ZShlMiwgbzIsIGkzKSA6IG8yOwogICAgICB9KGUsIHQyLCBpMiwgbjIpOwogICAgY2FzZSAiY3NzIjoKICAgICAgcmV0dXJuIG5lKGUsIHQyLCBuMik7CiAgICBjYXNlICJhdHRyaWJ1dGUiOgogICAgICByZXR1cm4gZWUoZSwgdDIpOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGVbdDJdIHx8IDA7CiAgfQp9CmZ1bmN0aW9uIEFlKGUsIHQyKSB7CiAgdmFyIG4yID0gYWUuZXhlYyhlKTsKICBpZiAoIW4yKQogICAgcmV0dXJuIGU7CiAgdmFyIGkyID0gWihlKSB8fCAwLCByMiA9IHBhcnNlRmxvYXQodDIpLCBvMiA9IHBhcnNlRmxvYXQoZS5yZXBsYWNlKG4yWzBdLCAiIikpOwogIHN3aXRjaCAobjJbMF1bMF0pIHsKICAgIGNhc2UgIisiOgogICAgICByZXR1cm4gcjIgKyBvMiArIGkyOwogICAgY2FzZSAiLSI6CiAgICAgIHJldHVybiByMiAtIG8yICsgaTI7CiAgICBjYXNlICIqIjoKICAgICAgcmV0dXJuIHIyICogbzIgKyBpMjsKICB9Cn0KZnVuY3Rpb24gY2UoZSwgdDIpIHsKICBpZiAoTC5jb2woZSkpCiAgICByZXR1cm4gZnVuY3Rpb24oZTIpIHsKICAgICAgcmV0dXJuIEwucmdiKGUyKSA/ICh0MyA9IGUyLCAobjMgPSB6LmV4ZWModDMpKSA/ICJyZ2JhKCIgKyBuM1sxXSArICIsMSkiIDogdDMpIDogTC5oZXgoZTIpID8gZnVuY3Rpb24oZTMpIHsKICAgICAgICB2YXIgdDQgPSBlMy5yZXBsYWNlKFksIGZ1bmN0aW9uKGU0LCB0NSwgbjUsIGkzKSB7CiAgICAgICAgICByZXR1cm4gdDUgKyB0NSArIG41ICsgbjUgKyBpMyArIGkzOwogICAgICAgIH0pLCBuNCA9IEsuZXhlYyh0NCk7CiAgICAgICAgcmV0dXJuICJyZ2JhKCIgKyBwYXJzZUludChuNFsxXSwgMTYpICsgIiwiICsgcGFyc2VJbnQobjRbMl0sIDE2KSArICIsIiArIHBhcnNlSW50KG40WzNdLCAxNikgKyAiLDEpIjsKICAgICAgfShlMikgOiBMLmhzbChlMikgPyBmdW5jdGlvbihlMykgewogICAgICAgIHZhciB0NCwgbjQsIGkzLCByMiA9IFcuZXhlYyhlMykgfHwgSi5leGVjKGUzKSwgbzIgPSBwYXJzZUludChyMlsxXSwgMTApIC8gMzYwLCBzMiA9IHBhcnNlSW50KHIyWzJdLCAxMCkgLyAxMDAsIGEyID0gcGFyc2VJbnQocjJbM10sIDEwKSAvIDEwMCwgQTIgPSByMls0XSB8fCAxOwogICAgICAgIGZ1bmN0aW9uIGwyKGU0LCB0NSwgbjUpIHsKICAgICAgICAgIHJldHVybiBuNSA8IDAgJiYgKG41ICs9IDEpLCBuNSA+IDEgJiYgKG41IC09IDEpLCBuNSA8IDEgLyA2ID8gZTQgKyA2ICogKHQ1IC0gZTQpICogbjUgOiBuNSA8IDAuNSA/IHQ1IDogbjUgPCAyIC8gMyA/IGU0ICsgKHQ1IC0gZTQpICogKDIgLyAzIC0gbjUpICogNiA6IGU0OwogICAgICAgIH0KICAgICAgICBpZiAoczIgPT0gMCkKICAgICAgICAgIHQ0ID0gbjQgPSBpMyA9IGEyOwogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIGMyID0gYTIgPCAwLjUgPyBhMiAqICgxICsgczIpIDogYTIgKyBzMiAtIGEyICogczIsIGgyID0gMiAqIGEyIC0gYzI7CiAgICAgICAgICB0NCA9IGwyKGgyLCBjMiwgbzIgKyAxIC8gMyksIG40ID0gbDIoaDIsIGMyLCBvMiksIGkzID0gbDIoaDIsIGMyLCBvMiAtIDEgLyAzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJyZ2JhKCIgKyAyNTUgKiB0NCArICIsIiArIDI1NSAqIG40ICsgIiwiICsgMjU1ICogaTMgKyAiLCIgKyBBMiArICIpIjsKICAgICAgfShlMikgOiB1bmRlZmluZWQ7CiAgICAgIHZhciB0MywgbjM7CiAgICB9KGUpOwogIHZhciBuMiA9IFooZSksIGkyID0gbjIgPyBlLnN1YnN0cigwLCBlLmxlbmd0aCAtIG4yLmxlbmd0aCkgOiBlOwogIHJldHVybiB0MiAmJiAhbGUudGVzdChlKSA/IGkyICsgdDIgOiBpMjsKfQpmdW5jdGlvbiBoZShlLCB0MikgewogIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codDIueCAtIGUueCwgMikgKyBNYXRoLnBvdyh0Mi55IC0gZS55LCAyKSk7Cn0KZnVuY3Rpb24gZGUoZSkgewogIGZvciAodmFyIHQyLCBuMiA9IGUucG9pbnRzLCBpMiA9IDAsIHIyID0gMDtyMiA8IG4yLm51bWJlck9mSXRlbXM7IHIyKyspIHsKICAgIHZhciBvMiA9IG4yLmdldEl0ZW0ocjIpOwogICAgcjIgPiAwICYmIChpMiArPSBoZSh0MiwgbzIpKSwgdDIgPSBvMjsKICB9CiAgcmV0dXJuIGkyOwp9CmZ1bmN0aW9uIHVlKGUpIHsKICBpZiAoZS5nZXRUb3RhbExlbmd0aCkKICAgIHJldHVybiBlLmdldFRvdGFsTGVuZ3RoKCk7CiAgc3dpdGNoIChlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSkgewogICAgY2FzZSAiY2lyY2xlIjoKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgcmV0dXJuIDIgKiBNYXRoLlBJICogZWUoZTIsICJyIik7CiAgICAgIH0oZSk7CiAgICBjYXNlICJyZWN0IjoKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgcmV0dXJuIDIgKiBlZShlMiwgIndpZHRoIikgKyAyICogZWUoZTIsICJoZWlnaHQiKTsKICAgICAgfShlKTsKICAgIGNhc2UgImxpbmUiOgogICAgICByZXR1cm4gZnVuY3Rpb24oZTIpIHsKICAgICAgICByZXR1cm4gaGUoeyB4OiBlZShlMiwgIngxIiksIHk6IGVlKGUyLCAieTEiKSB9LCB7IHg6IGVlKGUyLCAieDIiKSwgeTogZWUoZTIsICJ5MiIpIH0pOwogICAgICB9KGUpOwogICAgY2FzZSAicG9seWxpbmUiOgogICAgICByZXR1cm4gZGUoZSk7CiAgICBjYXNlICJwb2x5Z29uIjoKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgdmFyIHQyID0gZTIucG9pbnRzOwogICAgICAgIHJldHVybiBkZShlMikgKyBoZSh0Mi5nZXRJdGVtKHQyLm51bWJlck9mSXRlbXMgLSAxKSwgdDIuZ2V0SXRlbSgwKSk7CiAgICAgIH0oZSk7CiAgfQp9CmZ1bmN0aW9uIGdlKGUsIHQyKSB7CiAgdmFyIG4yID0gdDIgfHwge30sIGkyID0gbjIuZWwgfHwgZnVuY3Rpb24oZTIpIHsKICAgIGZvciAodmFyIHQzID0gZTIucGFyZW50Tm9kZTtMLnN2Zyh0MykgJiYgKHQzID0gdDMucGFyZW50Tm9kZSwgTC5zdmcodDMucGFyZW50Tm9kZSkpOyApCiAgICAgIDsKICAgIHJldHVybiB0MzsKICB9KGUpLCByMiA9IGkyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBvMiA9IGVlKGkyLCAidmlld0JveCIpLCBzMiA9IHIyLndpZHRoLCBhMiA9IHIyLmhlaWdodCwgQTIgPSBuMi52aWV3Qm94IHx8IChvMiA/IG8yLnNwbGl0KCIgIikgOiBbMCwgMCwgczIsIGEyXSk7CiAgcmV0dXJuIHsgZWw6IGkyLCB2aWV3Qm94OiBBMiwgeDogQTJbMF0gLyAxLCB5OiBBMlsxXSAvIDEsIHc6IHMyIC8gQTJbMl0sIGg6IGEyIC8gQTJbM10gfTsKfQpmdW5jdGlvbiBwZShlLCB0MikgewogIGZ1bmN0aW9uIG4yKG4zKSB7CiAgICBuMyA9PT0gdW5kZWZpbmVkICYmIChuMyA9IDApOwogICAgdmFyIGkzID0gdDIgKyBuMyA+PSAxID8gdDIgKyBuMyA6IDA7CiAgICByZXR1cm4gZS5lbC5nZXRQb2ludEF0TGVuZ3RoKGkzKTsKICB9CiAgdmFyIGkyID0gZ2UoZS5lbCwgZS5zdmcpLCByMiA9IG4yKCksIG8yID0gbjIoLTEpLCBzMiA9IG4yKDEpOwogIHN3aXRjaCAoZS5wcm9wZXJ0eSkgewogICAgY2FzZSAieCI6CiAgICAgIHJldHVybiAocjIueCAtIGkyLngpICogaTIudzsKICAgIGNhc2UgInkiOgogICAgICByZXR1cm4gKHIyLnkgLSBpMi55KSAqIGkyLmg7CiAgICBjYXNlICJhbmdsZSI6CiAgICAgIHJldHVybiAxODAgKiBNYXRoLmF0YW4yKHMyLnkgLSBvMi55LCBzMi54IC0gbzIueCkgLyBNYXRoLlBJOwogIH0KfQpmdW5jdGlvbiBtZShlLCB0MikgewogIHZhciBuMiA9IGNlKEwucHRoKGUpID8gZS50b3RhbExlbmd0aCA6IGUsIHQyKSArICIiOwogIHJldHVybiB7IG9yaWdpbmFsOiBuMiwgbnVtYmVyczogbjIubWF0Y2goZmUpID8gbjIubWF0Y2goZmUpLm1hcChOdW1iZXIpIDogWzBdLCBzdHJpbmdzOiBMLnN0cihlKSB8fCB0MiA/IG4yLnNwbGl0KGZlKSA6IFtdIH07Cn0KZnVuY3Rpb24gRWUoZSkgewogIHJldHVybiBHKGUgPyBOKEwuYXJyKGUpID8gZS5tYXAoaikgOiBqKGUpKSA6IFtdLCBmdW5jdGlvbihlMiwgdDIsIG4yKSB7CiAgICByZXR1cm4gbjIuaW5kZXhPZihlMikgPT09IHQyOwogIH0pOwp9CmZ1bmN0aW9uIENlKGUpIHsKICB2YXIgdDIgPSBFZShlKTsKICByZXR1cm4gdDIubWFwKGZ1bmN0aW9uKGUyLCBuMikgewogICAgcmV0dXJuIHsgdGFyZ2V0OiBlMiwgaWQ6IG4yLCB0b3RhbDogdDIubGVuZ3RoLCB0cmFuc2Zvcm1zOiB7IGxpc3Q6IG9lKGUyKSB9IH07CiAgfSk7Cn0KZnVuY3Rpb24gQmUoZSwgdDIpIHsKICB2YXIgbjIgPSBIKHQyKTsKICBpZiAodmUudGVzdChuMi5lYXNpbmcpICYmIChuMi5kdXJhdGlvbiA9IEQobjIuZWFzaW5nKSksIEwuYXJyKGUpKSB7CiAgICB2YXIgaTIgPSBlLmxlbmd0aDsKICAgIGkyICE9PSAyIHx8IEwub2JqKGVbMF0pID8gTC5mbmModDIuZHVyYXRpb24pIHx8IChuMi5kdXJhdGlvbiA9IHQyLmR1cmF0aW9uIC8gaTIpIDogZSA9IHsgdmFsdWU6IGUgfTsKICB9CiAgdmFyIHIyID0gTC5hcnIoZSkgPyBlIDogW2VdOwogIHJldHVybiByMi5tYXAoZnVuY3Rpb24oZTIsIG4zKSB7CiAgICB2YXIgaTMgPSBMLm9iaihlMikgJiYgIUwucHRoKGUyKSA/IGUyIDogeyB2YWx1ZTogZTIgfTsKICAgIHJldHVybiBMLnVuZChpMy5kZWxheSkgJiYgKGkzLmRlbGF5ID0gbjMgPyAwIDogdDIuZGVsYXkpLCBMLnVuZChpMy5lbmREZWxheSkgJiYgKGkzLmVuZERlbGF5ID0gbjMgPT09IHIyLmxlbmd0aCAtIDEgPyB0Mi5lbmREZWxheSA6IDApLCBpMzsKICB9KS5tYXAoZnVuY3Rpb24oZTIpIHsKICAgIHJldHVybiBWKGUyLCBuMik7CiAgfSk7Cn0KZnVuY3Rpb24geWUoZSwgdDIpIHsKICBmb3IgKHZhciBuMiA9IENlKGUpLCBpMiA9IDAsIHIyID0gbjIubGVuZ3RoO2kyIDwgcjI7IGkyKyspIHsKICAgIHZhciBvMiA9IG4yW2kyXTsKICAgIGZvciAodmFyIHMyIGluIHQyKSB7CiAgICAgIHZhciBhMiA9ICQodDJbczJdLCBvMiksIEEyID0gbzIudGFyZ2V0LCBsMiA9IFooYTIpLCBjMiA9IHNlKEEyLCBzMiwgbDIsIG8yKSwgaDIgPSBBZShjZShhMiwgbDIgfHwgWihjMikpLCBjMiksIGQyID0gaWUoQTIsIHMyKTsKICAgICAgYmVbZDJdKEEyLCBzMiwgaDIsIG8yLnRyYW5zZm9ybXMsIHRydWUpOwogICAgfQogIH0KfQpmdW5jdGlvbiBJZShlLCB0MikgewogIHJldHVybiBHKE4oZS5tYXAoZnVuY3Rpb24oZTIpIHsKICAgIHJldHVybiB0Mi5tYXAoZnVuY3Rpb24odDMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUzLCB0NCkgewogICAgICAgIHZhciBuMiA9IGllKGUzLnRhcmdldCwgdDQubmFtZSk7CiAgICAgICAgaWYgKG4yKSB7CiAgICAgICAgICB2YXIgaTIgPSBmdW5jdGlvbihlNCwgdDUpIHsKICAgICAgICAgICAgdmFyIG4zOwogICAgICAgICAgICByZXR1cm4gZTQudHdlZW5zLm1hcChmdW5jdGlvbihpMykgewogICAgICAgICAgICAgIHZhciByMyA9IGZ1bmN0aW9uKGU1LCB0NikgewogICAgICAgICAgICAgICAgdmFyIG40ID0ge307CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpNCBpbiBlNSkgewogICAgICAgICAgICAgICAgICB2YXIgcjQgPSAkKGU1W2k0XSwgdDYpOwogICAgICAgICAgICAgICAgICBMLmFycihyNCkgJiYgKHI0ID0gcjQubWFwKGZ1bmN0aW9uKGU2KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoZTYsIHQ2KTsKICAgICAgICAgICAgICAgICAgfSkpLmxlbmd0aCA9PT0gMSAmJiAocjQgPSByNFswXSksIG40W2k0XSA9IHI0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG40LmR1cmF0aW9uID0gcGFyc2VGbG9hdChuNC5kdXJhdGlvbiksIG40LmRlbGF5ID0gcGFyc2VGbG9hdChuNC5kZWxheSksIG40OwogICAgICAgICAgICAgIH0oaTMsIHQ1KSwgbzIgPSByMy52YWx1ZSwgczIgPSBMLmFycihvMikgPyBvMlsxXSA6IG8yLCBhMiA9IFooczIpLCBBMiA9IHNlKHQ1LnRhcmdldCwgZTQubmFtZSwgYTIsIHQ1KSwgbDIgPSBuMyA/IG4zLnRvLm9yaWdpbmFsIDogQTIsIGMyID0gTC5hcnIobzIpID8gbzJbMF0gOiBsMiwgaDIgPSBaKGMyKSB8fCBaKEEyKSwgZDIgPSBhMiB8fCBoMjsKICAgICAgICAgICAgICByZXR1cm4gTC51bmQoczIpICYmIChzMiA9IGwyKSwgcjMuZnJvbSA9IG1lKGMyLCBkMiksIHIzLnRvID0gbWUoQWUoczIsIGMyKSwgZDIpLCByMy5zdGFydCA9IG4zID8gbjMuZW5kIDogMCwgcjMuZW5kID0gcjMuc3RhcnQgKyByMy5kZWxheSArIHIzLmR1cmF0aW9uICsgcjMuZW5kRGVsYXksIHIzLmVhc2luZyA9IFUocjMuZWFzaW5nLCByMy5kdXJhdGlvbiksIHIzLmlzUGF0aCA9IEwucHRoKG8yKSwgcjMuaXNDb2xvciA9IEwuY29sKHIzLmZyb20ub3JpZ2luYWwpLCByMy5pc0NvbG9yICYmIChyMy5yb3VuZCA9IDEpLCBuMyA9IHIzLCByMzsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KHQ0LCBlMyksIHIyID0gaTJbaTIubGVuZ3RoIC0gMV07CiAgICAgICAgICByZXR1cm4geyB0eXBlOiBuMiwgcHJvcGVydHk6IHQ0Lm5hbWUsIGFuaW1hdGFibGU6IGUzLCB0d2VlbnM6IGkyLCBkdXJhdGlvbjogcjIuZW5kLCBkZWxheTogaTJbMF0uZGVsYXksIGVuZERlbGF5OiByMi5lbmREZWxheSB9OwogICAgICAgIH0KICAgICAgfShlMiwgdDMpOwogICAgfSk7CiAgfSkpLCBmdW5jdGlvbihlMikgewogICAgcmV0dXJuICFMLnVuZChlMik7CiAgfSk7Cn0KZnVuY3Rpb24gd2UoZSwgdDIpIHsKICB2YXIgbjIgPSBlLmxlbmd0aCwgaTIgPSBmdW5jdGlvbihlMikgewogICAgcmV0dXJuIGUyLnRpbWVsaW5lT2Zmc2V0ID8gZTIudGltZWxpbmVPZmZzZXQgOiAwOwogIH0sIHIyID0ge307CiAgcmV0dXJuIHIyLmR1cmF0aW9uID0gbjIgPyBNYXRoLm1heC5hcHBseShNYXRoLCBlLm1hcChmdW5jdGlvbihlMikgewogICAgcmV0dXJuIGkyKGUyKSArIGUyLmR1cmF0aW9uOwogIH0pKSA6IHQyLmR1cmF0aW9uLCByMi5kZWxheSA9IG4yID8gTWF0aC5taW4uYXBwbHkoTWF0aCwgZS5tYXAoZnVuY3Rpb24oZTIpIHsKICAgIHJldHVybiBpMihlMikgKyBlMi5kZWxheTsKICB9KSkgOiB0Mi5kZWxheSwgcjIuZW5kRGVsYXkgPSBuMiA/IHIyLmR1cmF0aW9uIC0gTWF0aC5tYXguYXBwbHkoTWF0aCwgZS5tYXAoZnVuY3Rpb24oZTIpIHsKICAgIHJldHVybiBpMihlMikgKyBlMi5kdXJhdGlvbiAtIGUyLmVuZERlbGF5OwogIH0pKSA6IHQyLmVuZERlbGF5LCByMjsKfQpmdW5jdGlvbiBEZShlKSB7CiAgZSA9PT0gdW5kZWZpbmVkICYmIChlID0ge30pOwogIHZhciB0MiwgbjIgPSAwLCBpMiA9IDAsIHIyID0gMCwgbzIgPSAwLCBzMiA9IG51bGw7CiAgZnVuY3Rpb24gYTIoKSB7CiAgICByZXR1cm4gd2luZG93LlByb21pc2UgJiYgbmV3IFByb21pc2UoZnVuY3Rpb24oZTIpIHsKICAgICAgcmV0dXJuIHMyID0gZTI7CiAgICB9KTsKICB9CiAgdmFyIEEyID0gYTIoKSwgbDIgPSBmdW5jdGlvbihlMikgewogICAgdmFyIHQzID0gcShFLCBlMiksIG4zID0gcShDLCBlMiksIGkzID0gZnVuY3Rpb24oZTMsIHQ0KSB7CiAgICAgIHZhciBuNCA9IFtdLCBpNCA9IHQ0LmtleWZyYW1lczsKICAgICAgZm9yICh2YXIgcjQgaW4gaTQgJiYgKHQ0ID0gVihmdW5jdGlvbihlNCkgewogICAgICAgIGZvciAodmFyIHQ1ID0gRyhOKGU0Lm1hcChmdW5jdGlvbihlNSkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGU1KTsKICAgICAgICB9KSksIGZ1bmN0aW9uKGU1KSB7CiAgICAgICAgICByZXR1cm4gTC5rZXkoZTUpOwogICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbihlNSwgdDYpIHsKICAgICAgICAgIHJldHVybiBlNS5pbmRleE9mKHQ2KSA8IDAgJiYgZTUucHVzaCh0NiksIGU1OwogICAgICAgIH0sIFtdKSwgbjUgPSB7fSwgaTUgPSBmdW5jdGlvbihpNikgewogICAgICAgICAgdmFyIHI2ID0gdDVbaTZdOwogICAgICAgICAgbjVbcjZdID0gZTQubWFwKGZ1bmN0aW9uKGU1KSB7CiAgICAgICAgICAgIHZhciB0NiA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBuNiBpbiBlNSkKICAgICAgICAgICAgICBMLmtleShuNikgPyBuNiA9PSByNiAmJiAodDYudmFsdWUgPSBlNVtuNl0pIDogdDZbbjZdID0gZTVbbjZdOwogICAgICAgICAgICByZXR1cm4gdDY7CiAgICAgICAgICB9KTsKICAgICAgICB9LCByNSA9IDA7cjUgPCB0NS5sZW5ndGg7IHI1KyspCiAgICAgICAgICBpNShyNSk7CiAgICAgICAgcmV0dXJuIG41OwogICAgICB9KGk0KSwgdDQpKSwgdDQpCiAgICAgICAgTC5rZXkocjQpICYmIG40LnB1c2goeyBuYW1lOiByNCwgdHdlZW5zOiBCZSh0NFtyNF0sIGUzKSB9KTsKICAgICAgcmV0dXJuIG40OwogICAgfShuMywgZTIpLCByMyA9IENlKGUyLnRhcmdldHMpLCBvMyA9IEllKHIzLCBpMyksIHMzID0gd2UobzMsIG4zKSwgYTMgPSBRZTsKICAgIHJldHVybiBRZSsrLCBWKHQzLCB7IGlkOiBhMywgY2hpbGRyZW46IFtdLCBhbmltYXRhYmxlczogcjMsIGFuaW1hdGlvbnM6IG8zLCBkdXJhdGlvbjogczMuZHVyYXRpb24sIGRlbGF5OiBzMy5kZWxheSwgZW5kRGVsYXk6IHMzLmVuZERlbGF5IH0pOwogIH0oZSk7CiAgZnVuY3Rpb24gYzIoKSB7CiAgICBsMi5yZXZlcnNlZCA9ICFsMi5yZXZlcnNlZDsKICAgIGZvciAodmFyIGUyID0gMCwgbjMgPSB0Mi5sZW5ndGg7ZTIgPCBuMzsgZTIrKykKICAgICAgdDJbZTJdLnJldmVyc2VkID0gbDIucmV2ZXJzZWQ7CiAgfQogIGZ1bmN0aW9uIGgyKGUyKSB7CiAgICByZXR1cm4gbDIucmV2ZXJzZWQgPyBsMi5kdXJhdGlvbiAtIGUyIDogZTI7CiAgfQogIGZ1bmN0aW9uIGQyKCkgewogICAgbjIgPSAwLCBpMiA9IGgyKGwyLmN1cnJlbnRUaW1lKSAqICgxIC8gRGUuc3BlZWQpOwogIH0KICBmdW5jdGlvbiB1MihlMiwgdDMpIHsKICAgIHQzICYmIHQzLnNlZWsoZTIgLSB0My50aW1lbGluZU9mZnNldCk7CiAgfQogIGZ1bmN0aW9uIGcyKGUyKSB7CiAgICBmb3IgKHZhciB0MyA9IDAsIG4zID0gbDIuYW5pbWF0aW9ucywgaTMgPSBuMy5sZW5ndGg7dDMgPCBpMzsgKSB7CiAgICAgIHZhciByMyA9IG4zW3QzXSwgbzMgPSByMy5hbmltYXRhYmxlLCBzMyA9IHIzLnR3ZWVucywgYTMgPSBzMy5sZW5ndGggLSAxLCBBMyA9IHMzW2EzXTsKICAgICAgYTMgJiYgKEEzID0gRyhzMywgZnVuY3Rpb24odDQpIHsKICAgICAgICByZXR1cm4gZTIgPCB0NC5lbmQ7CiAgICAgIH0pWzBdIHx8IEEzKTsKICAgICAgZm9yICh2YXIgYzMgPSBiKGUyIC0gQTMuc3RhcnQgLSBBMy5kZWxheSwgMCwgQTMuZHVyYXRpb24pIC8gQTMuZHVyYXRpb24sIGgzID0gaXNOYU4oYzMpID8gMSA6IEEzLmVhc2luZyhjMyksIGQzID0gQTMudG8uc3RyaW5ncywgdTMgPSBBMy5yb3VuZCwgZzMgPSBbXSwgcDMgPSBBMy50by5udW1iZXJzLmxlbmd0aCwgZjMgPSB1bmRlZmluZWQsIG0yID0gMDttMiA8IHAzOyBtMisrKSB7CiAgICAgICAgdmFyIEUyID0gdW5kZWZpbmVkLCBDMiA9IEEzLnRvLm51bWJlcnNbbTJdLCB2MiA9IEEzLmZyb20ubnVtYmVyc1ttMl0gfHwgMDsKICAgICAgICBFMiA9IEEzLmlzUGF0aCA/IHBlKEEzLnZhbHVlLCBoMyAqIEMyKSA6IHYyICsgaDMgKiAoQzIgLSB2MiksIHUzICYmIChBMy5pc0NvbG9yICYmIG0yID4gMiB8fCAoRTIgPSBNYXRoLnJvdW5kKEUyICogdTMpIC8gdTMpKSwgZzMucHVzaChFMik7CiAgICAgIH0KICAgICAgdmFyIEIyID0gZDMubGVuZ3RoOwogICAgICBpZiAoQjIpIHsKICAgICAgICBmMyA9IGQzWzBdOwogICAgICAgIGZvciAodmFyIHkyID0gMDt5MiA8IEIyOyB5MisrKSB7CiAgICAgICAgICBkM1t5Ml07CiAgICAgICAgICB2YXIgSTIgPSBkM1t5MiArIDFdLCB3MiA9IGczW3kyXTsKICAgICAgICAgIGlzTmFOKHcyKSB8fCAoZjMgKz0gSTIgPyB3MiArIEkyIDogdzIgKyAiICIpOwogICAgICAgIH0KICAgICAgfSBlbHNlCiAgICAgICAgZjMgPSBnM1swXTsKICAgICAgYmVbcjMudHlwZV0obzMudGFyZ2V0LCByMy5wcm9wZXJ0eSwgZjMsIG8zLnRyYW5zZm9ybXMpLCByMy5jdXJyZW50VmFsdWUgPSBmMywgdDMrKzsKICAgIH0KICB9CiAgZnVuY3Rpb24gcDIoZTIpIHsKICAgIGwyW2UyXSAmJiAhbDIucGFzc1Rocm91Z2ggJiYgbDJbZTJdKGwyKTsKICB9CiAgZnVuY3Rpb24gZjIoZTIpIHsKICAgIHZhciB7IGR1cmF0aW9uOiBkMywgZGVsYXk6IGYzIH0gPSBsMiwgbTIgPSBkMyAtIGwyLmVuZERlbGF5LCBFMiA9IGgyKGUyKTsKICAgIGwyLnByb2dyZXNzID0gYihFMiAvIGQzICogMTAwLCAwLCAxMDApLCBsMi5yZXZlcnNlUGxheWJhY2sgPSBFMiA8IGwyLmN1cnJlbnRUaW1lLCB0MiAmJiBmdW5jdGlvbihlMykgewogICAgICBpZiAobDIucmV2ZXJzZVBsYXliYWNrKQogICAgICAgIGZvciAodmFyIG4zID0gbzI7bjMtLTsgKQogICAgICAgICAgdTIoZTMsIHQyW24zXSk7CiAgICAgIGVsc2UKICAgICAgICBmb3IgKHZhciBpMyA9IDA7aTMgPCBvMjsgaTMrKykKICAgICAgICAgIHUyKGUzLCB0MltpM10pOwogICAgfShFMiksICFsMi5iZWdhbiAmJiBsMi5jdXJyZW50VGltZSA+IDAgJiYgKGwyLmJlZ2FuID0gdHJ1ZSwgcDIoImJlZ2luIiksIHAyKCJsb29wQmVnaW4iKSksIEUyIDw9IGYzICYmIGwyLmN1cnJlbnRUaW1lICE9PSAwICYmIGcyKDApLCAoRTIgPj0gbTIgJiYgbDIuY3VycmVudFRpbWUgIT09IGQzIHx8ICFkMykgJiYgZzIoZDMpLCBFMiA+IGYzICYmIEUyIDwgbTIgPyAobDIuY2hhbmdlQmVnYW4gfHwgKGwyLmNoYW5nZUJlZ2FuID0gdHJ1ZSwgbDIuY2hhbmdlQ29tcGxldGVkID0gZmFsc2UsIHAyKCJjaGFuZ2VCZWdpbiIpKSwgcDIoImNoYW5nZSIpLCBnMihFMikpIDogbDIuY2hhbmdlQmVnYW4gJiYgKGwyLmNoYW5nZUNvbXBsZXRlZCA9IHRydWUsIGwyLmNoYW5nZUJlZ2FuID0gZmFsc2UsIHAyKCJjaGFuZ2VDb21wbGV0ZSIpKSwgbDIuY3VycmVudFRpbWUgPSBiKEUyLCAwLCBkMyksIGwyLmJlZ2FuICYmIHAyKCJ1cGRhdGUiKSwgZTIgPj0gZDMgJiYgKGkyID0gMCwgbDIucmVtYWluaW5nICYmIGwyLnJlbWFpbmluZyAhPT0gdHJ1ZSAmJiBsMi5yZW1haW5pbmctLSwgbDIucmVtYWluaW5nID8gKG4yID0gcjIsIHAyKCJsb29wQ29tcGxldGUiKSwgcDIoImxvb3BCZWdpbiIpLCBsMi5kaXJlY3Rpb24gPT09ICJhbHRlcm5hdGUiICYmIGMyKCkpIDogKGwyLnBhdXNlZCA9IHRydWUsIGwyLmNvbXBsZXRlZCB8fCAobDIuY29tcGxldGVkID0gdHJ1ZSwgcDIoImxvb3BDb21wbGV0ZSIpLCBwMigiY29tcGxldGUiKSwgKCJQcm9taXNlIiBpbiB3aW5kb3cpICYmIChzMigpLCBBMiA9IGEyKCkpKSkpOwogIH0KICByZXR1cm4gbDIucmVzZXQgPSBmdW5jdGlvbigpIHsKICAgIHZhciBlMiA9IGwyLmRpcmVjdGlvbjsKICAgIGwyLnBhc3NUaHJvdWdoID0gZmFsc2UsIGwyLmN1cnJlbnRUaW1lID0gMCwgbDIucHJvZ3Jlc3MgPSAwLCBsMi5wYXVzZWQgPSB0cnVlLCBsMi5iZWdhbiA9IGZhbHNlLCBsMi5jaGFuZ2VCZWdhbiA9IGZhbHNlLCBsMi5jb21wbGV0ZWQgPSBmYWxzZSwgbDIuY2hhbmdlQ29tcGxldGVkID0gZmFsc2UsIGwyLnJldmVyc2VQbGF5YmFjayA9IGZhbHNlLCBsMi5yZXZlcnNlZCA9IGUyID09PSAicmV2ZXJzZSIsIGwyLnJlbWFpbmluZyA9IGwyLmxvb3AsIHQyID0gbDIuY2hpbGRyZW47CiAgICBmb3IgKHZhciBuMyA9IG8yID0gdDIubGVuZ3RoO24zLS07ICkKICAgICAgbDIuY2hpbGRyZW5bbjNdLnJlc2V0KCk7CiAgICAobDIucmV2ZXJzZWQgJiYgbDIubG9vcCAhPT0gdHJ1ZSB8fCBlMiA9PT0gImFsdGVybmF0ZSIgJiYgbDIubG9vcCA9PT0gMSkgJiYgbDIucmVtYWluaW5nKyssIGcyKDApOwogIH0sIGwyLnNldCA9IGZ1bmN0aW9uKGUyLCB0MykgewogICAgcmV0dXJuIHllKGUyLCB0MyksIGwyOwogIH0sIGwyLnRpY2sgPSBmdW5jdGlvbihlMikgewogICAgcjIgPSBlMiwgbjIgfHwgKG4yID0gcjIpLCBmMigocjIgKyAoaTIgLSBuMikpICogRGUuc3BlZWQpOwogIH0sIGwyLnNlZWsgPSBmdW5jdGlvbihlMikgewogICAgZjIoaDIoZTIpKTsKICB9LCBsMi5wYXVzZSA9IGZ1bmN0aW9uKCkgewogICAgbDIucGF1c2VkID0gdHJ1ZSwgZDIoKTsKICB9LCBsMi5wbGF5ID0gZnVuY3Rpb24oKSB7CiAgICBsMi5wYXVzZWQgJiYgKGwyLnBhdXNlZCA9IGZhbHNlLCBMZS5wdXNoKGwyKSwgZDIoKSwgeGUgfHwgU2UoKSk7CiAgfSwgbDIucmV2ZXJzZSA9IGZ1bmN0aW9uKCkgewogICAgYzIoKSwgZDIoKTsKICB9LCBsMi5yZXN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICBsMi5yZXNldCgpLCBsMi5wbGF5KCk7CiAgfSwgbDIuZmluaXNoZWQgPSBBMiwgbDIucmVzZXQoKSwgbDIuYXV0b3BsYXkgJiYgbDIucGxheSgpLCBsMjsKfQpmdW5jdGlvbiBrZShlLCB0MikgewogIGZvciAodmFyIG4yID0gdDIubGVuZ3RoO24yLS07ICkKICAgIF8oZSwgdDJbbjJdLmFuaW1hdGFibGUudGFyZ2V0KSAmJiB0Mi5zcGxpY2UobjIsIDEpOwp9CmZ1bmN0aW9uIE9lKCkgewogIGxldCBlLCB0MjsKICBmdW5jdGlvbiBuMihlMiwgdDMsIG4zLCBpMiwgcjIsIG8yKSB7CiAgICBjb25zdCBzMiA9IG8yLm51bV9jb21wb25lbnRzKCksIGEyID0gbjMubnVtX3BvaW50cygpICogczIsIEEyID0gYTIgKiByMi5CWVRFU19QRVJfRUxFTUVOVCwgbDIgPSBmdW5jdGlvbihlMywgdDQpIHsKICAgICAgc3dpdGNoICh0NCkgewogICAgICAgIGNhc2UgRmxvYXQzMkFycmF5OgogICAgICAgICAgcmV0dXJuIGUzLkRUX0ZMT0FUMzI7CiAgICAgICAgY2FzZSBJbnQ4QXJyYXk6CiAgICAgICAgICByZXR1cm4gZTMuRFRfSU5UODsKICAgICAgICBjYXNlIEludDE2QXJyYXk6CiAgICAgICAgICByZXR1cm4gZTMuRFRfSU5UMTY7CiAgICAgICAgY2FzZSBJbnQzMkFycmF5OgogICAgICAgICAgcmV0dXJuIGUzLkRUX0lOVDMyOwogICAgICAgIGNhc2UgVWludDhBcnJheToKICAgICAgICAgIHJldHVybiBlMy5EVF9VSU5UODsKICAgICAgICBjYXNlIFVpbnQxNkFycmF5OgogICAgICAgICAgcmV0dXJuIGUzLkRUX1VJTlQxNjsKICAgICAgICBjYXNlIFVpbnQzMkFycmF5OgogICAgICAgICAgcmV0dXJuIGUzLkRUX1VJTlQzMjsKICAgICAgfQogICAgfShlMiwgcjIpLCBjMiA9IGUyLl9tYWxsb2MoQTIpOwogICAgdDMuR2V0QXR0cmlidXRlRGF0YUFycmF5Rm9yQWxsUG9pbnRzKG4zLCBvMiwgbDIsIEEyLCBjMik7CiAgICBjb25zdCBoMiA9IG5ldyByMihlMi5IRUFQRjMyLmJ1ZmZlciwgYzIsIGEyKS5zbGljZSgpOwogICAgcmV0dXJuIGUyLl9mcmVlKGMyKSwgeyBuYW1lOiBpMiwgYXJyYXk6IGgyLCBpdGVtU2l6ZTogczIgfTsKICB9CiAgb25tZXNzYWdlID0gZnVuY3Rpb24oaTIpIHsKICAgIGNvbnN0IHIyID0gaTIuZGF0YTsKICAgIHN3aXRjaCAocjIudHlwZSkgewogICAgICBjYXNlICJpbml0IjoKICAgICAgICBlID0gcjIuZGVjb2RlckNvbmZpZywgdDIgPSBuZXcgUHJvbWlzZShmdW5jdGlvbih0MykgewogICAgICAgICAgZS5vbk1vZHVsZUxvYWRlZCA9IGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgICAgIHQzKHsgZHJhY286IGUyIH0pOwogICAgICAgICAgfSwgRHJhY29EZWNvZGVyTW9kdWxlKGUpOwogICAgICAgIH0pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJkZWNvZGUiOgogICAgICAgIGNvbnN0IHsgYnVmZmVyOiBpMywgdGFza0NvbmZpZzogbzIgfSA9IHIyOwogICAgICAgIHQyLnRoZW4oKGUyKSA9PiB7CiAgICAgICAgICBjb25zdCB0MyA9IGUyLmRyYWNvLCBzMiA9IG5ldyB0My5EZWNvZGVyOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZTMgPSBmdW5jdGlvbihlNCwgdDQsIGk0LCByMykgewogICAgICAgICAgICAgIGNvbnN0IHsgYXR0cmlidXRlSURzOiBvMywgYXR0cmlidXRlVHlwZXM6IHMzIH0gPSByMzsKICAgICAgICAgICAgICBsZXQgYTMsIEEyOwogICAgICAgICAgICAgIGNvbnN0IGwyID0gdDQuR2V0RW5jb2RlZEdlb21ldHJ5VHlwZShpNCk7CiAgICAgICAgICAgICAgaWYgKGwyID09PSBlNC5UUklBTkdVTEFSX01FU0gpCiAgICAgICAgICAgICAgICBhMyA9IG5ldyBlNC5NZXNoLCBBMiA9IHQ0LkRlY29kZUFycmF5VG9NZXNoKGk0LCBpNC5ieXRlTGVuZ3RoLCBhMyk7CiAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAobDIgIT09IGU0LlBPSU5UX0NMT1VEKQogICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkRSQUNPTG9hZGVyOiBVbmV4cGVjdGVkIGdlb21ldHJ5IHR5cGUuIik7CiAgICAgICAgICAgICAgICBhMyA9IG5ldyBlNC5Qb2ludENsb3VkLCBBMiA9IHQ0LkRlY29kZUFycmF5VG9Qb2ludENsb3VkKGk0LCBpNC5ieXRlTGVuZ3RoLCBhMyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICghQTIub2soKSB8fCBhMy5wdHIgPT09IDApCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkRSQUNPTG9hZGVyOiBEZWNvZGluZyBmYWlsZWQ6ICIgKyBBMi5lcnJvcl9tc2coKSk7CiAgICAgICAgICAgICAgY29uc3QgYzIgPSB7IGluZGV4OiBudWxsLCBhdHRyaWJ1dGVzOiBbXSB9OwogICAgICAgICAgICAgIGZvciAoY29uc3QgaTUgaW4gbzMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IEEzID0gc2VsZltzM1tpNV1dOwogICAgICAgICAgICAgICAgbGV0IGwzLCBoMjsKICAgICAgICAgICAgICAgIGlmIChyMy51c2VVbmlxdWVJRHMpCiAgICAgICAgICAgICAgICAgIGgyID0gbzNbaTVdLCBsMyA9IHQ0LkdldEF0dHJpYnV0ZUJ5VW5pcXVlSWQoYTMsIGgyKTsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICBpZiAoaDIgPSB0NC5HZXRBdHRyaWJ1dGVJZChhMywgZTRbbzNbaTVdXSksIGgyID09PSAtMSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgbDMgPSB0NC5HZXRBdHRyaWJ1dGUoYTMsIGgyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGQyID0gbjIoZTQsIHQ0LCBhMywgaTUsIEEzLCBsMyk7CiAgICAgICAgICAgICAgICBpNSA9PT0gImNvbG9yIiAmJiAoZDIudmVydGV4Q29sb3JTcGFjZSA9IHIzLnZlcnRleENvbG9yU3BhY2UpLCBjMi5hdHRyaWJ1dGVzLnB1c2goZDIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gbDIgPT09IGU0LlRSSUFOR1VMQVJfTUVTSCAmJiAoYzIuaW5kZXggPSBmdW5jdGlvbihlNSwgdDUsIG4zKSB7CiAgICAgICAgICAgICAgICBjb25zdCBpNSA9IDMgKiBuMy5udW1fZmFjZXMoKSwgcjQgPSA0ICogaTUsIG80ID0gZTUuX21hbGxvYyhyNCk7CiAgICAgICAgICAgICAgICB0NS5HZXRUcmlhbmdsZXNVSW50MzJBcnJheShuMywgcjQsIG80KTsKICAgICAgICAgICAgICAgIGNvbnN0IHM0ID0gbmV3IFVpbnQzMkFycmF5KGU1LkhFQVBGMzIuYnVmZmVyLCBvNCwgaTUpLnNsaWNlKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZTUuX2ZyZWUobzQpLCB7IGFycmF5OiBzNCwgaXRlbVNpemU6IDEgfTsKICAgICAgICAgICAgICB9KGU0LCB0NCwgYTMpKSwgZTQuZGVzdHJveShhMyksIGMyOwogICAgICAgICAgICB9KHQzLCBzMiwgbmV3IEludDhBcnJheShpMyksIG8yKSwgYTIgPSBlMy5hdHRyaWJ1dGVzLm1hcCgoZTQpID0+IGU0LmFycmF5LmJ1ZmZlcik7CiAgICAgICAgICAgIGUzLmluZGV4ICYmIGEyLnB1c2goZTMuaW5kZXguYXJyYXkuYnVmZmVyKSwgc2VsZi5wb3N0TWVzc2FnZSh7IHR5cGU6ICJkZWNvZGUiLCBpZDogcjIuaWQsIGdlb21ldHJ5OiBlMyB9LCBhMik7CiAgICAgICAgICB9IGNhdGNoIChlMykgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKGUzKSwgc2VsZi5wb3N0TWVzc2FnZSh7IHR5cGU6ICJlcnJvciIsIGlkOiByMi5pZCwgZXJyb3I6IGUzLm1lc3NhZ2UgfSk7CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0My5kZXN0cm95KHMyKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KICB9Owp9CmZ1bmN0aW9uIFBlKGUsIHQyLCBuMiA9IHRydWUpIHsKICBpZiAoIXQyIHx8ICF0Mi5pc1JlYWR5KQogICAgdGhyb3cgbmV3IEVycm9yKCJCdWZmZXJHZW9tZXRyeVV0aWxzOiBJbml0aWFsaXplZCBNaWtrVFNwYWNlIGxpYnJhcnkgcmVxdWlyZWQuIik7CiAgaWYgKCFlLmhhc0F0dHJpYnV0ZSgicG9zaXRpb24iKSB8fCAhZS5oYXNBdHRyaWJ1dGUoIm5vcm1hbCIpIHx8ICFlLmhhc0F0dHJpYnV0ZSgidXYiKSkKICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyR2VvbWV0cnlVdGlsczogVGFuZ2VudHMgcmVxdWlyZSAicG9zaXRpb24iLCAibm9ybWFsIiwgYW5kICJ1diIgYXR0cmlidXRlcy4nKTsKICBmdW5jdGlvbiBpMihlMikgewogICAgaWYgKGUyLm5vcm1hbGl6ZWQgfHwgZTIuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSkgewogICAgICBjb25zdCB0MyA9IG5ldyBGbG9hdDMyQXJyYXkoZTIuY291bnQgKiBlMi5pdGVtU2l6ZSk7CiAgICAgIGZvciAobGV0IG4zID0gMCwgaTMgPSAwO24zIDwgZTIuY291bnQ7IG4zKyspCiAgICAgICAgdDNbaTMrK10gPSBlMi5nZXRYKG4zKSwgdDNbaTMrK10gPSBlMi5nZXRZKG4zKSwgZTIuaXRlbVNpemUgPiAyICYmICh0M1tpMysrXSA9IGUyLmdldFoobjMpKTsKICAgICAgcmV0dXJuIHQzOwogICAgfQogICAgcmV0dXJuIGUyLmFycmF5IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ID8gZTIuYXJyYXkgOiBuZXcgRmxvYXQzMkFycmF5KGUyLmFycmF5KTsKICB9CiAgY29uc3QgcjIgPSBlLmluZGV4ID8gZS50b05vbkluZGV4ZWQoKSA6IGUsIG8yID0gdDIuZ2VuZXJhdGVUYW5nZW50cyhpMihyMi5hdHRyaWJ1dGVzLnBvc2l0aW9uKSwgaTIocjIuYXR0cmlidXRlcy5ub3JtYWwpLCBpMihyMi5hdHRyaWJ1dGVzLnV2KSk7CiAgaWYgKG4yKQogICAgZm9yIChsZXQgZTIgPSAzO2UyIDwgbzIubGVuZ3RoOyBlMiArPSA0KQogICAgICBvMltlMl0gKj0gLTE7CiAgcmV0dXJuIHIyLnNldEF0dHJpYnV0ZSgidGFuZ2VudCIsIG5ldyBSZS5CdWZmZXJBdHRyaWJ1dGUobzIsIDQpKSwgZSAhPT0gcjIgJiYgZS5jb3B5KHIyKSwgZTsKfQpmdW5jdGlvbiBHZShlLCB0MiA9IGZhbHNlKSB7CiAgY29uc3QgbjIgPSBlWzBdLmluZGV4ICE9PSBudWxsLCBpMiA9IG5ldyBTZXQoT2JqZWN0LmtleXMoZVswXS5hdHRyaWJ1dGVzKSksIHIyID0gbmV3IFNldChPYmplY3Qua2V5cyhlWzBdLm1vcnBoQXR0cmlidXRlcykpLCBvMiA9IHt9LCBzMiA9IHt9LCBhMiA9IGVbMF0ubW9ycGhUYXJnZXRzUmVsYXRpdmUsIEEyID0gbmV3IFJlLkJ1ZmZlckdlb21ldHJ5OwogIGxldCBsMiA9IDA7CiAgZm9yIChsZXQgYzIgPSAwO2MyIDwgZS5sZW5ndGg7ICsrYzIpIHsKICAgIGNvbnN0IGgyID0gZVtjMl07CiAgICBsZXQgZDIgPSAwOwogICAgaWYgKG4yICE9PSAoaDIuaW5kZXggIT09IG51bGwpKQogICAgICByZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIgKyBjMiArICIuIEFsbCBnZW9tZXRyaWVzIG11c3QgaGF2ZSBjb21wYXRpYmxlIGF0dHJpYnV0ZXM7IG1ha2Ugc3VyZSBpbmRleCBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uIiksIG51bGw7CiAgICBmb3IgKGNvbnN0IGUyIGluIGgyLmF0dHJpYnV0ZXMpIHsKICAgICAgaWYgKCFpMi5oYXMoZTIpKQogICAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIiArIGMyICsgJy4gQWxsIGdlb21ldHJpZXMgbXVzdCBoYXZlIGNvbXBhdGlibGUgYXR0cmlidXRlczsgbWFrZSBzdXJlICInICsgZTIgKyAnIiBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uJyksIG51bGw7CiAgICAgIG8yW2UyXSA9PT0gdW5kZWZpbmVkICYmIChvMltlMl0gPSBbXSksIG8yW2UyXS5wdXNoKGgyLmF0dHJpYnV0ZXNbZTJdKSwgZDIrKzsKICAgIH0KICAgIGlmIChkMiAhPT0gaTIuc2l6ZSkKICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiICsgYzIgKyAiLiBNYWtlIHN1cmUgYWxsIGdlb21ldHJpZXMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgYXR0cmlidXRlcy4iKSwgbnVsbDsKICAgIGlmIChhMiAhPT0gaDIubW9ycGhUYXJnZXRzUmVsYXRpdmUpCiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIiArIGMyICsgIi4gLm1vcnBoVGFyZ2V0c1JlbGF0aXZlIG11c3QgYmUgY29uc2lzdGVudCB0aHJvdWdob3V0IGFsbCBnZW9tZXRyaWVzLiIpLCBudWxsOwogICAgZm9yIChjb25zdCBlMiBpbiBoMi5tb3JwaEF0dHJpYnV0ZXMpIHsKICAgICAgaWYgKCFyMi5oYXMoZTIpKQogICAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIiArIGMyICsgIi4gIC5tb3JwaEF0dHJpYnV0ZXMgbXVzdCBiZSBjb25zaXN0ZW50IHRocm91Z2hvdXQgYWxsIGdlb21ldHJpZXMuIiksIG51bGw7CiAgICAgIHMyW2UyXSA9PT0gdW5kZWZpbmVkICYmIChzMltlMl0gPSBbXSksIHMyW2UyXS5wdXNoKGgyLm1vcnBoQXR0cmlidXRlc1tlMl0pOwogICAgfQogICAgaWYgKHQyKSB7CiAgICAgIGxldCBlMjsKICAgICAgaWYgKG4yKQogICAgICAgIGUyID0gaDIuaW5kZXguY291bnQ7CiAgICAgIGVsc2UgewogICAgICAgIGlmIChoMi5hdHRyaWJ1dGVzLnBvc2l0aW9uID09PSB1bmRlZmluZWQpCiAgICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIgKyBjMiArICIuIFRoZSBnZW9tZXRyeSBtdXN0IGhhdmUgZWl0aGVyIGFuIGluZGV4IG9yIGEgcG9zaXRpb24gYXR0cmlidXRlIiksIG51bGw7CiAgICAgICAgZTIgPSBoMi5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50OwogICAgICB9CiAgICAgIEEyLmFkZEdyb3VwKGwyLCBlMiwgYzIpLCBsMiArPSBlMjsKICAgIH0KICB9CiAgaWYgKG4yKSB7CiAgICBsZXQgdDMgPSAwOwogICAgY29uc3QgbjMgPSBbXTsKICAgIGZvciAobGV0IGkzID0gMDtpMyA8IGUubGVuZ3RoOyArK2kzKSB7CiAgICAgIGNvbnN0IHIzID0gZVtpM10uaW5kZXg7CiAgICAgIGZvciAobGV0IGUyID0gMDtlMiA8IHIzLmNvdW50OyArK2UyKQogICAgICAgIG4zLnB1c2gocjMuZ2V0WChlMikgKyB0Myk7CiAgICAgIHQzICs9IGVbaTNdLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQ7CiAgICB9CiAgICBBMi5zZXRJbmRleChuMyk7CiAgfQogIGZvciAoY29uc3QgZTIgaW4gbzIpIHsKICAgIGNvbnN0IHQzID0gTmUobzJbZTJdKTsKICAgIGlmICghdDMpCiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdoaWxlIHRyeWluZyB0byBtZXJnZSB0aGUgIiArIGUyICsgIiBhdHRyaWJ1dGUuIiksIG51bGw7CiAgICBBMi5zZXRBdHRyaWJ1dGUoZTIsIHQzKTsKICB9CiAgZm9yIChjb25zdCBlMiBpbiBzMikgewogICAgY29uc3QgdDMgPSBzMltlMl1bMF0ubGVuZ3RoOwogICAgaWYgKHQzID09PSAwKQogICAgICBicmVhazsKICAgIEEyLm1vcnBoQXR0cmlidXRlcyA9IEEyLm1vcnBoQXR0cmlidXRlcyB8fCB7fSwgQTIubW9ycGhBdHRyaWJ1dGVzW2UyXSA9IFtdOwogICAgZm9yIChsZXQgbjMgPSAwO24zIDwgdDM7ICsrbjMpIHsKICAgICAgY29uc3QgdDQgPSBbXTsKICAgICAgZm9yIChsZXQgaTQgPSAwO2k0IDwgczJbZTJdLmxlbmd0aDsgKytpNCkKICAgICAgICB0NC5wdXNoKHMyW2UyXVtpNF1bbjNdKTsKICAgICAgY29uc3QgaTMgPSBOZSh0NCk7CiAgICAgIGlmICghaTMpCiAgICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2hpbGUgdHJ5aW5nIHRvIG1lcmdlIHRoZSAiICsgZTIgKyAiIG1vcnBoQXR0cmlidXRlLiIpLCBudWxsOwogICAgICBBMi5tb3JwaEF0dHJpYnV0ZXNbZTJdLnB1c2goaTMpOwogICAgfQogIH0KICByZXR1cm4gQTI7Cn0KZnVuY3Rpb24gTmUoZSkgewogIGxldCB0MiwgbjIsIGkyLCByMiA9IC0xLCBvMiA9IDA7CiAgZm9yIChsZXQgczMgPSAwO3MzIDwgZS5sZW5ndGg7ICsrczMpIHsKICAgIGNvbnN0IGEzID0gZVtzM107CiAgICBpZiAodDIgPT09IHVuZGVmaW5lZCAmJiAodDIgPSBhMy5hcnJheS5jb25zdHJ1Y3RvciksIHQyICE9PSBhMy5hcnJheS5jb25zdHJ1Y3RvcikKICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5hcnJheSBtdXN0IGJlIG9mIGNvbnNpc3RlbnQgYXJyYXkgdHlwZXMgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksIG51bGw7CiAgICBpZiAobjIgPT09IHVuZGVmaW5lZCAmJiAobjIgPSBhMy5pdGVtU2l6ZSksIG4yICE9PSBhMy5pdGVtU2l6ZSkKICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5pdGVtU2l6ZSBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksIG51bGw7CiAgICBpZiAoaTIgPT09IHVuZGVmaW5lZCAmJiAoaTIgPSBhMy5ub3JtYWxpemVkKSwgaTIgIT09IGEzLm5vcm1hbGl6ZWQpCiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUubm9ybWFsaXplZCBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksIG51bGw7CiAgICBpZiAocjIgPT09IC0xICYmIChyMiA9IGEzLmdwdVR5cGUpLCByMiAhPT0gYTMuZ3B1VHlwZSkKICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5ncHVUeXBlIG11c3QgYmUgY29uc2lzdGVudCBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSwgbnVsbDsKICAgIG8yICs9IGEzLmNvdW50ICogbjI7CiAgfQogIGNvbnN0IHMyID0gbmV3IHQyKG8yKSwgYTIgPSBuZXcgUmUuQnVmZmVyQXR0cmlidXRlKHMyLCBuMiwgaTIpOwogIGxldCBBMiA9IDA7CiAgZm9yIChsZXQgdDMgPSAwO3QzIDwgZS5sZW5ndGg7ICsrdDMpIHsKICAgIGNvbnN0IGkzID0gZVt0M107CiAgICBpZiAoaTMuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSkgewogICAgICBjb25zdCBlMiA9IEEyIC8gbjI7CiAgICAgIGZvciAobGV0IHQ0ID0gMCwgcjMgPSBpMy5jb3VudDt0NCA8IHIzOyB0NCsrKQogICAgICAgIGZvciAobGV0IHI0ID0gMDtyNCA8IG4yOyByNCsrKSB7CiAgICAgICAgICBjb25zdCBuMyA9IGkzLmdldENvbXBvbmVudCh0NCwgcjQpOwogICAgICAgICAgYTIuc2V0Q29tcG9uZW50KHQ0ICsgZTIsIHI0LCBuMyk7CiAgICAgICAgfQogICAgfSBlbHNlCiAgICAgIHMyLnNldChpMy5hcnJheSwgQTIpOwogICAgQTIgKz0gaTMuY291bnQgKiBuMjsKICB9CiAgcmV0dXJuIHIyICE9PSB1bmRlZmluZWQgJiYgKGEyLmdwdVR5cGUgPSByMiksIGEyOwp9CmZ1bmN0aW9uIGplKGUpIHsKICByZXR1cm4gZS5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIHx8IGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSA/IEhlKGUpIDogZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA/IG5ldyBSZS5JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoKS5jb3B5KGUpIDogbmV3IFJlLkJ1ZmZlckF0dHJpYnV0ZSgpLmNvcHkoZSk7Cn0KZnVuY3Rpb24gX2UoZSkgewogIGxldCB0MiwgbjIgPSAwLCBpMiA9IDA7CiAgZm9yIChsZXQgcjMgPSAwLCBvMyA9IGUubGVuZ3RoO3IzIDwgbzM7ICsrcjMpIHsKICAgIGNvbnN0IG80ID0gZVtyM107CiAgICBpZiAodDIgPT09IHVuZGVmaW5lZCAmJiAodDIgPSBvNC5hcnJheS5jb25zdHJ1Y3RvciksIHQyICE9PSBvNC5hcnJheS5jb25zdHJ1Y3RvcikKICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoIkF0dHJpYnV0ZUJ1ZmZlcnMgb2YgZGlmZmVyZW50IHR5cGVzIGNhbm5vdCBiZSBpbnRlcmxlYXZlZCIpLCBudWxsOwogICAgbjIgKz0gbzQuYXJyYXkubGVuZ3RoLCBpMiArPSBvNC5pdGVtU2l6ZTsKICB9CiAgY29uc3QgcjIgPSBuZXcgUmUuSW50ZXJsZWF2ZWRCdWZmZXIobmV3IHQyKG4yKSwgaTIpOwogIGxldCBvMiA9IDA7CiAgY29uc3QgczIgPSBbXSwgYTIgPSBbImdldFgiLCAiZ2V0WSIsICJnZXRaIiwgImdldFciXSwgQTIgPSBbInNldFgiLCAic2V0WSIsICJzZXRaIiwgInNldFciXTsKICBmb3IgKGxldCB0MyA9IDAsIG4zID0gZS5sZW5ndGg7dDMgPCBuMzsgdDMrKykgewogICAgY29uc3QgbjQgPSBlW3QzXSwgaTMgPSBuNC5pdGVtU2l6ZSwgbDIgPSBuNC5jb3VudCwgYzIgPSBuZXcgUmUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUocjIsIGkzLCBvMiwgbjQubm9ybWFsaXplZCk7CiAgICBzMi5wdXNoKGMyKSwgbzIgKz0gaTM7CiAgICBmb3IgKGxldCBlMiA9IDA7ZTIgPCBsMjsgZTIrKykKICAgICAgZm9yIChsZXQgdDQgPSAwO3Q0IDwgaTM7IHQ0KyspCiAgICAgICAgYzJbQTJbdDRdXShlMiwgbjRbYTJbdDRdXShlMikpOwogIH0KICByZXR1cm4gczI7Cn0KZnVuY3Rpb24gSGUoZSkgewogIGNvbnN0IHQyID0gZS5kYXRhLmFycmF5LmNvbnN0cnVjdG9yLCBuMiA9IGUuY291bnQsIGkyID0gZS5pdGVtU2l6ZSwgcjIgPSBlLm5vcm1hbGl6ZWQsIG8yID0gbmV3IHQyKG4yICogaTIpOwogIGxldCBzMjsKICBzMiA9IGUuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSA/IG5ldyBSZS5JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUobzIsIGkyLCByMiwgZS5tZXNoUGVyQXR0cmlidXRlKSA6IG5ldyBSZS5CdWZmZXJBdHRyaWJ1dGUobzIsIGkyLCByMik7CiAgZm9yIChsZXQgdDMgPSAwO3QzIDwgbjI7IHQzKyspCiAgICBzMi5zZXRYKHQzLCBlLmdldFgodDMpKSwgaTIgPj0gMiAmJiBzMi5zZXRZKHQzLCBlLmdldFkodDMpKSwgaTIgPj0gMyAmJiBzMi5zZXRaKHQzLCBlLmdldFoodDMpKSwgaTIgPj0gNCAmJiBzMi5zZXRXKHQzLCBlLmdldFcodDMpKTsKICByZXR1cm4gczI7Cn0KZnVuY3Rpb24gcWUoZSkgewogIGNvbnN0IHsgYXR0cmlidXRlczogdDIsIG1vcnBoVGFyZ2V0czogbjIgfSA9IGUsIGkyID0gbmV3IE1hcDsKICBmb3IgKGNvbnN0IGUyIGluIHQyKSB7CiAgICBjb25zdCBuMyA9IHQyW2UyXTsKICAgIG4zLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgJiYgKGkyLmhhcyhuMykgfHwgaTIuc2V0KG4zLCBIZShuMykpLCB0MltlMl0gPSBpMi5nZXQobjMpKTsKICB9CiAgZm9yIChjb25zdCBlMiBpbiBuMikgewogICAgY29uc3QgdDMgPSBuMltlMl07CiAgICB0My5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICYmIChpMi5oYXModDMpIHx8IGkyLnNldCh0MywgSGUodDMpKSwgbjJbZTJdID0gaTIuZ2V0KHQzKSk7CiAgfQp9CmZ1bmN0aW9uIFZlKGUpIHsKICBsZXQgdDIgPSAwOwogIGZvciAoY29uc3QgbjMgaW4gZS5hdHRyaWJ1dGVzKSB7CiAgICBjb25zdCBpMiA9IGUuZ2V0QXR0cmlidXRlKG4zKTsKICAgIHQyICs9IGkyLmNvdW50ICogaTIuaXRlbVNpemUgKiBpMi5hcnJheS5CWVRFU19QRVJfRUxFTUVOVDsKICB9CiAgY29uc3QgbjIgPSBlLmdldEluZGV4KCk7CiAgcmV0dXJuIHQyICs9IG4yID8gbjIuY291bnQgKiBuMi5pdGVtU2l6ZSAqIG4yLmFycmF5LkJZVEVTX1BFUl9FTEVNRU5UIDogMCwgdDI7Cn0KZnVuY3Rpb24gemUoZSwgdDIgPSAwLjAwMDEpIHsKICB0MiA9IE1hdGgubWF4KHQyLCBOdW1iZXIuRVBTSUxPTik7CiAgY29uc3QgbjIgPSB7fSwgaTIgPSBlLmdldEluZGV4KCksIHIyID0gZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksIG8yID0gaTIgPyBpMi5jb3VudCA6IHIyLmNvdW50OwogIGxldCBzMiA9IDA7CiAgY29uc3QgYTIgPSBPYmplY3Qua2V5cyhlLmF0dHJpYnV0ZXMpLCBBMiA9IHt9LCBsMiA9IHt9LCBjMiA9IFtdLCBoMiA9IFsiZ2V0WCIsICJnZXRZIiwgImdldFoiLCAiZ2V0VyJdLCBkMiA9IFsic2V0WCIsICJzZXRZIiwgInNldFoiLCAic2V0VyJdOwogIGZvciAobGV0IHQzID0gMCwgbjMgPSBhMi5sZW5ndGg7dDMgPCBuMzsgdDMrKykgewogICAgY29uc3QgbjQgPSBhMlt0M10sIGkzID0gZS5hdHRyaWJ1dGVzW240XTsKICAgIEEyW240XSA9IG5ldyBpMy5jb25zdHJ1Y3RvcihuZXcgaTMuYXJyYXkuY29uc3RydWN0b3IoaTMuY291bnQgKiBpMy5pdGVtU2l6ZSksIGkzLml0ZW1TaXplLCBpMy5ub3JtYWxpemVkKTsKICAgIGNvbnN0IHIzID0gZS5tb3JwaEF0dHJpYnV0ZXNbbjRdOwogICAgcjMgJiYgKGwyW240XSB8fCAobDJbbjRdID0gW10pLCByMy5mb3JFYWNoKChlMiwgdDQpID0+IHsKICAgICAgY29uc3QgaTQgPSBuZXcgZTIuYXJyYXkuY29uc3RydWN0b3IoZTIuY291bnQgKiBlMi5pdGVtU2l6ZSk7CiAgICAgIGwyW240XVt0NF0gPSBuZXcgZTIuY29uc3RydWN0b3IoaTQsIGUyLml0ZW1TaXplLCBlMi5ub3JtYWxpemVkKTsKICAgIH0pKTsKICB9CiAgY29uc3QgdTIgPSAwLjUgKiB0MiwgZzIgPSBNYXRoLmxvZzEwKDEgLyB0MiksIHAyID0gTWF0aC5wb3coMTAsIGcyKSwgZjIgPSB1MiAqIHAyOwogIGZvciAobGV0IHQzID0gMDt0MyA8IG8yOyB0MysrKSB7CiAgICBjb25zdCByMyA9IGkyID8gaTIuZ2V0WCh0MykgOiB0MzsKICAgIGxldCBvMyA9ICIiOwogICAgZm9yIChsZXQgdDQgPSAwLCBuMyA9IGEyLmxlbmd0aDt0NCA8IG4zOyB0NCsrKSB7CiAgICAgIGNvbnN0IG40ID0gYTJbdDRdLCBpMyA9IGUuZ2V0QXR0cmlidXRlKG40KSwgczMgPSBpMy5pdGVtU2l6ZTsKICAgICAgZm9yIChsZXQgZTIgPSAwO2UyIDwgczM7IGUyKyspCiAgICAgICAgbzMgKz0gfn4oaTNbaDJbZTJdXShyMykgKiBwMiArIGYyKSArICIsIjsKICAgIH0KICAgIGlmIChvMyBpbiBuMikKICAgICAgYzIucHVzaChuMltvM10pOwogICAgZWxzZSB7CiAgICAgIGZvciAobGV0IHQ0ID0gMCwgbjMgPSBhMi5sZW5ndGg7dDQgPCBuMzsgdDQrKykgewogICAgICAgIGNvbnN0IG40ID0gYTJbdDRdLCBpMyA9IGUuZ2V0QXR0cmlidXRlKG40KSwgbzQgPSBlLm1vcnBoQXR0cmlidXRlc1tuNF0sIGMzID0gaTMuaXRlbVNpemUsIHUzID0gQTJbbjRdLCBnMyA9IGwyW240XTsKICAgICAgICBmb3IgKGxldCBlMiA9IDA7ZTIgPCBjMzsgZTIrKykgewogICAgICAgICAgY29uc3QgdDUgPSBoMltlMl0sIG41ID0gZDJbZTJdOwogICAgICAgICAgaWYgKHUzW241XShzMiwgaTNbdDVdKHIzKSksIG80KQogICAgICAgICAgICBmb3IgKGxldCBlMyA9IDAsIGk0ID0gbzQubGVuZ3RoO2UzIDwgaTQ7IGUzKyspCiAgICAgICAgICAgICAgZzNbZTNdW241XShzMiwgbzRbZTNdW3Q1XShyMykpOwogICAgICAgIH0KICAgICAgfQogICAgICBuMltvM10gPSBzMiwgYzIucHVzaChzMiksIHMyKys7CiAgICB9CiAgfQogIGNvbnN0IG0yID0gZS5jbG9uZSgpOwogIGZvciAoY29uc3QgdDMgaW4gZS5hdHRyaWJ1dGVzKSB7CiAgICBjb25zdCBlMiA9IEEyW3QzXTsKICAgIGlmIChtMi5zZXRBdHRyaWJ1dGUodDMsIG5ldyBlMi5jb25zdHJ1Y3RvcihlMi5hcnJheS5zbGljZSgwLCBzMiAqIGUyLml0ZW1TaXplKSwgZTIuaXRlbVNpemUsIGUyLm5vcm1hbGl6ZWQpKSwgdDMgaW4gbDIpCiAgICAgIGZvciAobGV0IGUzID0gMDtlMyA8IGwyW3QzXS5sZW5ndGg7IGUzKyspIHsKICAgICAgICBjb25zdCBuMyA9IGwyW3QzXVtlM107CiAgICAgICAgbTIubW9ycGhBdHRyaWJ1dGVzW3QzXVtlM10gPSBuZXcgbjMuY29uc3RydWN0b3IobjMuYXJyYXkuc2xpY2UoMCwgczIgKiBuMy5pdGVtU2l6ZSksIG4zLml0ZW1TaXplLCBuMy5ub3JtYWxpemVkKTsKICAgICAgfQogIH0KICByZXR1cm4gbTIuc2V0SW5kZXgoYzIpLCBtMjsKfQpmdW5jdGlvbiBZZShlLCB0MikgewogIGlmICh0MiA9PT0gUmUuVHJpYW5nbGVzRHJhd01vZGUpCiAgICByZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzLnRvVHJpYW5nbGVzRHJhd01vZGUoKTogR2VvbWV0cnkgYWxyZWFkeSBkZWZpbmVkIGFzIHRyaWFuZ2xlcy4iKSwgZTsKICBpZiAodDIgPT09IFJlLlRyaWFuZ2xlRmFuRHJhd01vZGUgfHwgdDIgPT09IFJlLlRyaWFuZ2xlU3RyaXBEcmF3TW9kZSkgewogICAgbGV0IG4yID0gZS5nZXRJbmRleCgpOwogICAgaWYgKG4yID09PSBudWxsKSB7CiAgICAgIGNvbnN0IHQzID0gW10sIGkzID0gZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7CiAgICAgIGlmIChpMyA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzLnRvVHJpYW5nbGVzRHJhd01vZGUoKTogVW5kZWZpbmVkIHBvc2l0aW9uIGF0dHJpYnV0ZS4gUHJvY2Vzc2luZyBub3QgcG9zc2libGUuIiksIGU7CiAgICAgIGZvciAobGV0IGUyID0gMDtlMiA8IGkzLmNvdW50OyBlMisrKQogICAgICAgIHQzLnB1c2goZTIpOwogICAgICBlLnNldEluZGV4KHQzKSwgbjIgPSBlLmdldEluZGV4KCk7CiAgICB9CiAgICBjb25zdCBpMiA9IG4yLmNvdW50IC0gMiwgcjIgPSBbXTsKICAgIGlmICh0MiA9PT0gUmUuVHJpYW5nbGVGYW5EcmF3TW9kZSkKICAgICAgZm9yIChsZXQgZTIgPSAxO2UyIDw9IGkyOyBlMisrKQogICAgICAgIHIyLnB1c2gobjIuZ2V0WCgwKSksIHIyLnB1c2gobjIuZ2V0WChlMikpLCByMi5wdXNoKG4yLmdldFgoZTIgKyAxKSk7CiAgICBlbHNlCiAgICAgIGZvciAobGV0IGUyID0gMDtlMiA8IGkyOyBlMisrKQogICAgICAgIGUyICUgMiA9PSAwID8gKHIyLnB1c2gobjIuZ2V0WChlMikpLCByMi5wdXNoKG4yLmdldFgoZTIgKyAxKSksIHIyLnB1c2gobjIuZ2V0WChlMiArIDIpKSkgOiAocjIucHVzaChuMi5nZXRYKGUyICsgMikpLCByMi5wdXNoKG4yLmdldFgoZTIgKyAxKSksIHIyLnB1c2gobjIuZ2V0WChlMikpKTsKICAgIHIyLmxlbmd0aCAvIDMgIT09IGkyICYmIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHMudG9UcmlhbmdsZXNEcmF3TW9kZSgpOiBVbmFibGUgdG8gZ2VuZXJhdGUgY29ycmVjdCBhbW91bnQgb2YgdHJpYW5nbGVzLiIpOwogICAgY29uc3QgbzIgPSBlLmNsb25lKCk7CiAgICByZXR1cm4gbzIuc2V0SW5kZXgocjIpLCBvMi5jbGVhckdyb3VwcygpLCBvMjsKICB9CiAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHMudG9UcmlhbmdsZXNEcmF3TW9kZSgpOiBVbmtub3duIGRyYXcgbW9kZToiLCB0MiksIGU7Cn0KZnVuY3Rpb24gS2UoZSkgewogIGNvbnN0IHQyID0gbmV3IFJlLlZlY3RvcjMsIG4yID0gbmV3IFJlLlZlY3RvcjMsIGkyID0gbmV3IFJlLlZlY3RvcjMsIHIyID0gbmV3IFJlLlZlY3RvcjMsIG8yID0gbmV3IFJlLlZlY3RvcjMsIHMyID0gbmV3IFJlLlZlY3RvcjMsIGEyID0gbmV3IFJlLlZlY3RvcjMsIEEyID0gbmV3IFJlLlZlY3RvcjMsIGwyID0gbmV3IFJlLlZlY3RvcjM7CiAgZnVuY3Rpb24gYzIoZTIsIGMzLCBoMywgZDMsIHUzLCBnMywgcDMsIGYzKSB7CiAgICB0Mi5mcm9tQnVmZmVyQXR0cmlidXRlKGMzLCB1MyksIG4yLmZyb21CdWZmZXJBdHRyaWJ1dGUoYzMsIGczKSwgaTIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShjMywgcDMpOwogICAgY29uc3QgbTMgPSBlMi5tb3JwaFRhcmdldEluZmx1ZW5jZXM7CiAgICBpZiAoaDMgJiYgbTMpIHsKICAgICAgYTIuc2V0KDAsIDAsIDApLCBBMi5zZXQoMCwgMCwgMCksIGwyLnNldCgwLCAwLCAwKTsKICAgICAgZm9yIChsZXQgZTMgPSAwLCBjNCA9IGgzLmxlbmd0aDtlMyA8IGM0OyBlMysrKSB7CiAgICAgICAgY29uc3QgYzUgPSBtM1tlM10sIGY0ID0gaDNbZTNdOwogICAgICAgIGM1ICE9PSAwICYmIChyMi5mcm9tQnVmZmVyQXR0cmlidXRlKGY0LCB1MyksIG8yLmZyb21CdWZmZXJBdHRyaWJ1dGUoZjQsIGczKSwgczIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmNCwgcDMpLCBkMyA/IChhMi5hZGRTY2FsZWRWZWN0b3IocjIsIGM1KSwgQTIuYWRkU2NhbGVkVmVjdG9yKG8yLCBjNSksIGwyLmFkZFNjYWxlZFZlY3RvcihzMiwgYzUpKSA6IChhMi5hZGRTY2FsZWRWZWN0b3IocjIuc3ViKHQyKSwgYzUpLCBBMi5hZGRTY2FsZWRWZWN0b3IobzIuc3ViKG4yKSwgYzUpLCBsMi5hZGRTY2FsZWRWZWN0b3IoczIuc3ViKGkyKSwgYzUpKSk7CiAgICAgIH0KICAgICAgdDIuYWRkKGEyKSwgbjIuYWRkKEEyKSwgaTIuYWRkKGwyKTsKICAgIH0KICAgIGUyLmlzU2tpbm5lZE1lc2ggJiYgKGUyLmFwcGx5Qm9uZVRyYW5zZm9ybSh1MywgdDIpLCBlMi5hcHBseUJvbmVUcmFuc2Zvcm0oZzMsIG4yKSwgZTIuYXBwbHlCb25lVHJhbnNmb3JtKHAzLCBpMikpLCBmM1szICogdTMgKyAwXSA9IHQyLngsIGYzWzMgKiB1MyArIDFdID0gdDIueSwgZjNbMyAqIHUzICsgMl0gPSB0Mi56LCBmM1szICogZzMgKyAwXSA9IG4yLngsIGYzWzMgKiBnMyArIDFdID0gbjIueSwgZjNbMyAqIGczICsgMl0gPSBuMi56LCBmM1szICogcDMgKyAwXSA9IGkyLngsIGYzWzMgKiBwMyArIDFdID0gaTIueSwgZjNbMyAqIHAzICsgMl0gPSBpMi56OwogIH0KICBjb25zdCB7IGdlb21ldHJ5OiBoMiwgbWF0ZXJpYWw6IGQyIH0gPSBlOwogIGxldCB1MiwgZzIsIHAyOwogIGNvbnN0IGYyID0gaDIuaW5kZXgsIG0yID0gaDIuYXR0cmlidXRlcy5wb3NpdGlvbiwgRTIgPSBoMi5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sIEMyID0gaDIubW9ycGhUYXJnZXRzUmVsYXRpdmUsIHYyID0gaDIuYXR0cmlidXRlcy5ub3JtYWwsIEIyID0gaDIubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLCBiMiA9IGgyLmdyb3VwcywgeTIgPSBoMi5kcmF3UmFuZ2U7CiAgbGV0IEkyLCB3MiwgeDIsIFEyLCBMMiwgTTIsIFMyOwogIGNvbnN0IEQyID0gbmV3IEZsb2F0MzJBcnJheShtMi5jb3VudCAqIG0yLml0ZW1TaXplKSwgazIgPSBuZXcgRmxvYXQzMkFycmF5KHYyLmNvdW50ICogdjIuaXRlbVNpemUpOwogIGlmIChmMiAhPT0gbnVsbCkKICAgIGlmIChBcnJheS5pc0FycmF5KGQyKSkKICAgICAgZm9yIChJMiA9IDAsIHgyID0gYjIubGVuZ3RoO0kyIDwgeDI7IEkyKyspCiAgICAgICAgZm9yIChMMiA9IGIyW0kyXSwgTTIgPSBNYXRoLm1heChMMi5zdGFydCwgeTIuc3RhcnQpLCBTMiA9IE1hdGgubWluKEwyLnN0YXJ0ICsgTDIuY291bnQsIHkyLnN0YXJ0ICsgeTIuY291bnQpLCB3MiA9IE0yLCBRMiA9IFMyO3cyIDwgUTI7IHcyICs9IDMpCiAgICAgICAgICB1MiA9IGYyLmdldFgodzIpLCBnMiA9IGYyLmdldFgodzIgKyAxKSwgcDIgPSBmMi5nZXRYKHcyICsgMiksIGMyKGUsIG0yLCBFMiwgQzIsIHUyLCBnMiwgcDIsIEQyKSwgYzIoZSwgdjIsIEIyLCBDMiwgdTIsIGcyLCBwMiwgazIpOwogICAgZWxzZQogICAgICBmb3IgKE0yID0gTWF0aC5tYXgoMCwgeTIuc3RhcnQpLCBTMiA9IE1hdGgubWluKGYyLmNvdW50LCB5Mi5zdGFydCArIHkyLmNvdW50KSwgSTIgPSBNMiwgeDIgPSBTMjtJMiA8IHgyOyBJMiArPSAzKQogICAgICAgIHUyID0gZjIuZ2V0WChJMiksIGcyID0gZjIuZ2V0WChJMiArIDEpLCBwMiA9IGYyLmdldFgoSTIgKyAyKSwgYzIoZSwgbTIsIEUyLCBDMiwgdTIsIGcyLCBwMiwgRDIpLCBjMihlLCB2MiwgQjIsIEMyLCB1MiwgZzIsIHAyLCBrMik7CiAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkMikpCiAgICBmb3IgKEkyID0gMCwgeDIgPSBiMi5sZW5ndGg7STIgPCB4MjsgSTIrKykKICAgICAgZm9yIChMMiA9IGIyW0kyXSwgTTIgPSBNYXRoLm1heChMMi5zdGFydCwgeTIuc3RhcnQpLCBTMiA9IE1hdGgubWluKEwyLnN0YXJ0ICsgTDIuY291bnQsIHkyLnN0YXJ0ICsgeTIuY291bnQpLCB3MiA9IE0yLCBRMiA9IFMyO3cyIDwgUTI7IHcyICs9IDMpCiAgICAgICAgdTIgPSB3MiwgZzIgPSB3MiArIDEsIHAyID0gdzIgKyAyLCBjMihlLCBtMiwgRTIsIEMyLCB1MiwgZzIsIHAyLCBEMiksIGMyKGUsIHYyLCBCMiwgQzIsIHUyLCBnMiwgcDIsIGsyKTsKICBlbHNlCiAgICBmb3IgKE0yID0gTWF0aC5tYXgoMCwgeTIuc3RhcnQpLCBTMiA9IE1hdGgubWluKG0yLmNvdW50LCB5Mi5zdGFydCArIHkyLmNvdW50KSwgSTIgPSBNMiwgeDIgPSBTMjtJMiA8IHgyOyBJMiArPSAzKQogICAgICB1MiA9IEkyLCBnMiA9IEkyICsgMSwgcDIgPSBJMiArIDIsIGMyKGUsIG0yLCBFMiwgQzIsIHUyLCBnMiwgcDIsIEQyKSwgYzIoZSwgdjIsIEIyLCBDMiwgdTIsIGcyLCBwMiwgazIpOwogIHJldHVybiB7IHBvc2l0aW9uQXR0cmlidXRlOiBtMiwgbm9ybWFsQXR0cmlidXRlOiB2MiwgbW9ycGhlZFBvc2l0aW9uQXR0cmlidXRlOiBuZXcgUmUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShEMiwgMyksIG1vcnBoZWROb3JtYWxBdHRyaWJ1dGU6IG5ldyBSZS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKGsyLCAzKSB9Owp9CmZ1bmN0aW9uIFdlKGUpIHsKICBpZiAoZS5ncm91cHMubGVuZ3RoID09PSAwKQogICAgcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUdyb3VwcygpOiBObyBncm91cHMgYXJlIGRlZmluZWQuIE5vdGhpbmcgdG8gbWVyZ2UuIiksIGU7CiAgbGV0IHQyID0gZS5ncm91cHM7CiAgaWYgKHQyID0gdDIuc29ydCgoZTIsIHQzKSA9PiBlMi5tYXRlcmlhbEluZGV4ICE9PSB0My5tYXRlcmlhbEluZGV4ID8gZTIubWF0ZXJpYWxJbmRleCAtIHQzLm1hdGVyaWFsSW5kZXggOiBlMi5zdGFydCAtIHQzLnN0YXJ0KSwgZS5nZXRJbmRleCgpID09PSBudWxsKSB7CiAgICBjb25zdCB0MyA9IGUuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLCBuMyA9IFtdOwogICAgZm9yIChsZXQgZTIgPSAwO2UyIDwgdDMuY291bnQ7IGUyICs9IDMpCiAgICAgIG4zLnB1c2goZTIsIGUyICsgMSwgZTIgKyAyKTsKICAgIGUuc2V0SW5kZXgobjMpOwogIH0KICBjb25zdCBuMiA9IGUuZ2V0SW5kZXgoKSwgaTIgPSBbXTsKICBmb3IgKGxldCBlMiA9IDA7ZTIgPCB0Mi5sZW5ndGg7IGUyKyspIHsKICAgIGNvbnN0IHIzID0gdDJbZTJdLCBvMyA9IHIzLnN0YXJ0LCBzMiA9IG8zICsgcjMuY291bnQ7CiAgICBmb3IgKGxldCBlMyA9IG8zO2UzIDwgczI7IGUzKyspCiAgICAgIGkyLnB1c2gobjIuZ2V0WChlMykpOwogIH0KICBlLmRpc3Bvc2UoKSwgZS5zZXRJbmRleChpMik7CiAgbGV0IHIyID0gMDsKICBmb3IgKGxldCBlMiA9IDA7ZTIgPCB0Mi5sZW5ndGg7IGUyKyspIHsKICAgIGNvbnN0IG4zID0gdDJbZTJdOwogICAgbjMuc3RhcnQgPSByMiwgcjIgKz0gbjMuY291bnQ7CiAgfQogIGxldCBvMiA9IHQyWzBdOwogIGUuZ3JvdXBzID0gW28yXTsKICBmb3IgKGxldCBuMyA9IDE7bjMgPCB0Mi5sZW5ndGg7IG4zKyspIHsKICAgIGNvbnN0IGkzID0gdDJbbjNdOwogICAgbzIubWF0ZXJpYWxJbmRleCA9PT0gaTMubWF0ZXJpYWxJbmRleCA/IG8yLmNvdW50ICs9IGkzLmNvdW50IDogKG8yID0gaTMsIGUuZ3JvdXBzLnB1c2gobzIpKTsKICB9CiAgcmV0dXJuIGU7Cn0KZnVuY3Rpb24gSmUoZSwgdDIgPSBNYXRoLlBJIC8gMykgewogIGNvbnN0IG4yID0gTWF0aC5jb3ModDIpLCBpMiA9IDEwMCAqICgxICsgMC4wMDAwMDAwMDAxKSwgcjIgPSBbbmV3IFJlLlZlY3RvcjMsIG5ldyBSZS5WZWN0b3IzLCBuZXcgUmUuVmVjdG9yM10sIG8yID0gbmV3IFJlLlZlY3RvcjMsIHMyID0gbmV3IFJlLlZlY3RvcjMsIGEyID0gbmV3IFJlLlZlY3RvcjMsIEEyID0gbmV3IFJlLlZlY3RvcjM7CiAgZnVuY3Rpb24gbDIoZTIpIHsKICAgIHJldHVybiBgJHt+fihlMi54ICogaTIpfSwke35+KGUyLnkgKiBpMil9LCR7fn4oZTIueiAqIGkyKX1gOwogIH0KICBjb25zdCBjMiA9IGUuaW5kZXggPyBlLnRvTm9uSW5kZXhlZCgpIDogZSwgaDIgPSBjMi5hdHRyaWJ1dGVzLnBvc2l0aW9uLCBkMiA9IHt9OwogIGZvciAobGV0IGUyID0gMCwgdDMgPSBoMi5jb3VudCAvIDM7ZTIgPCB0MzsgZTIrKykgewogICAgY29uc3QgdDQgPSAzICogZTIsIG4zID0gcjJbMF0uZnJvbUJ1ZmZlckF0dHJpYnV0ZShoMiwgdDQgKyAwKSwgaTMgPSByMlsxXS5mcm9tQnVmZmVyQXR0cmlidXRlKGgyLCB0NCArIDEpLCBhMyA9IHIyWzJdLmZyb21CdWZmZXJBdHRyaWJ1dGUoaDIsIHQ0ICsgMik7CiAgICBvMi5zdWJWZWN0b3JzKGEzLCBpMyksIHMyLnN1YlZlY3RvcnMobjMsIGkzKTsKICAgIGNvbnN0IEEzID0gbmV3IFJlLlZlY3RvcjMoKS5jcm9zc1ZlY3RvcnMobzIsIHMyKS5ub3JtYWxpemUoKTsKICAgIGZvciAobGV0IGUzID0gMDtlMyA8IDM7IGUzKyspIHsKICAgICAgY29uc3QgdDUgPSBsMihyMltlM10pOwogICAgICB0NSBpbiBkMiB8fCAoZDJbdDVdID0gW10pLCBkMlt0NV0ucHVzaChBMyk7CiAgICB9CiAgfQogIGNvbnN0IHUyID0gbmV3IEZsb2F0MzJBcnJheSgzICogaDIuY291bnQpLCBnMiA9IG5ldyBSZS5CdWZmZXJBdHRyaWJ1dGUodTIsIDMsIGZhbHNlKTsKICBmb3IgKGxldCBlMiA9IDAsIHQzID0gaDIuY291bnQgLyAzO2UyIDwgdDM7IGUyKyspIHsKICAgIGNvbnN0IHQ0ID0gMyAqIGUyLCBpMyA9IHIyWzBdLmZyb21CdWZmZXJBdHRyaWJ1dGUoaDIsIHQ0ICsgMCksIGMzID0gcjJbMV0uZnJvbUJ1ZmZlckF0dHJpYnV0ZShoMiwgdDQgKyAxKSwgdTMgPSByMlsyXS5mcm9tQnVmZmVyQXR0cmlidXRlKGgyLCB0NCArIDIpOwogICAgbzIuc3ViVmVjdG9ycyh1MywgYzMpLCBzMi5zdWJWZWN0b3JzKGkzLCBjMyksIGEyLmNyb3NzVmVjdG9ycyhvMiwgczIpLm5vcm1hbGl6ZSgpOwogICAgZm9yIChsZXQgZTMgPSAwO2UzIDwgMzsgZTMrKykgewogICAgICBjb25zdCBpNCA9IGQyW2wyKHIyW2UzXSldOwogICAgICBBMi5zZXQoMCwgMCwgMCk7CiAgICAgIGZvciAobGV0IGU0ID0gMCwgdDUgPSBpNC5sZW5ndGg7ZTQgPCB0NTsgZTQrKykgewogICAgICAgIGNvbnN0IHQ2ID0gaTRbZTRdOwogICAgICAgIGEyLmRvdCh0NikgPiBuMiAmJiBBMi5hZGQodDYpOwogICAgICB9CiAgICAgIEEyLm5vcm1hbGl6ZSgpLCBnMi5zZXRYWVoodDQgKyBlMywgQTIueCwgQTIueSwgQTIueik7CiAgICB9CiAgfQogIHJldHVybiBjMi5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsIGcyKSwgYzI7Cn0KZnVuY3Rpb24gWmUoKSB7CiAgbGV0IGUgPSB7fTsKICByZXR1cm4geyBnZXQ6IGZ1bmN0aW9uKHQyKSB7CiAgICByZXR1cm4gZVt0Ml07CiAgfSwgYWRkOiBmdW5jdGlvbih0MiwgbjIpIHsKICAgIGVbdDJdID0gbjI7CiAgfSwgcmVtb3ZlOiBmdW5jdGlvbih0MikgewogICAgZGVsZXRlIGVbdDJdOwogIH0sIHJlbW92ZUFsbDogZnVuY3Rpb24oKSB7CiAgICBlID0ge307CiAgfSB9Owp9CgpjbGFzcyBldCB7CiAgY29uc3RydWN0b3IoZSkgewogICAgdGhpcy5wYXJzZXIgPSBlLCB0aGlzLm5hbWUgPSAkZS5LSFJfTElHSFRTX1BVTkNUVUFMLCB0aGlzLmNhY2hlID0geyByZWZzOiB7fSwgdXNlczoge30gfTsKICB9CiAgX21hcmtEZWZzKCkgewogICAgY29uc3QgZSA9IHRoaXMucGFyc2VyLCB0MiA9IHRoaXMucGFyc2VyLmpzb24ubm9kZXMgfHwgW107CiAgICBmb3IgKGxldCBuMiA9IDAsIGkyID0gdDIubGVuZ3RoO24yIDwgaTI7IG4yKyspIHsKICAgICAgY29uc3QgaTMgPSB0MltuMl07CiAgICAgIGkzLmV4dGVuc2lvbnMgJiYgaTMuZXh0ZW5zaW9uc1t0aGlzLm5hbWVdICYmIGkzLmV4dGVuc2lvbnNbdGhpcy5uYW1lXS5saWdodCAhPT0gdW5kZWZpbmVkICYmIGUuX2FkZE5vZGVSZWYodGhpcy5jYWNoZSwgaTMuZXh0ZW5zaW9uc1t0aGlzLm5hbWVdLmxpZ2h0KTsKICAgIH0KICB9CiAgX2xvYWRMaWdodChlKSB7CiAgICBjb25zdCB0MiA9IHRoaXMucGFyc2VyLCBuMiA9ICJsaWdodDoiICsgZTsKICAgIGxldCBpMiA9IHQyLmNhY2hlLmdldChuMik7CiAgICBpZiAoaTIpCiAgICAgIHJldHVybiBpMjsKICAgIGNvbnN0IHIyID0gdDIuanNvbiwgbzIgPSAoKHIyLmV4dGVuc2lvbnMgJiYgcjIuZXh0ZW5zaW9uc1t0aGlzLm5hbWVdIHx8IHt9KS5saWdodHMgfHwgW10pW2VdOwogICAgbGV0IHMyOwogICAgY29uc3QgYTIgPSBuZXcgUmUuQ29sb3IoMTY3NzcyMTUpOwogICAgbzIuY29sb3IgIT09IHVuZGVmaW5lZCAmJiBhMi5zZXRSR0IobzIuY29sb3JbMF0sIG8yLmNvbG9yWzFdLCBvMi5jb2xvclsyXSwgUmUuTGluZWFyU1JHQkNvbG9yU3BhY2UpOwogICAgY29uc3QgQTIgPSBvMi5yYW5nZSAhPT0gdW5kZWZpbmVkID8gbzIucmFuZ2UgOiAwOwogICAgc3dpdGNoIChvMi50eXBlKSB7CiAgICAgIGNhc2UgImRpcmVjdGlvbmFsIjoKICAgICAgICBzMiA9IG5ldyBSZS5EaXJlY3Rpb25hbExpZ2h0KGEyKSwgczIudGFyZ2V0LnBvc2l0aW9uLnNldCgwLCAwLCAtMSksIHMyLmFkZChzMi50YXJnZXQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJwb2ludCI6CiAgICAgICAgczIgPSBuZXcgUmUuUG9pbnRMaWdodChhMiksIHMyLmRpc3RhbmNlID0gQTI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInNwb3QiOgogICAgICAgIHMyID0gbmV3IFJlLlNwb3RMaWdodChhMiksIHMyLmRpc3RhbmNlID0gQTIsIG8yLnNwb3QgPSBvMi5zcG90IHx8IHt9LCBvMi5zcG90LmlubmVyQ29uZUFuZ2xlID0gbzIuc3BvdC5pbm5lckNvbmVBbmdsZSAhPT0gdW5kZWZpbmVkID8gbzIuc3BvdC5pbm5lckNvbmVBbmdsZSA6IDAsIG8yLnNwb3Qub3V0ZXJDb25lQW5nbGUgPSBvMi5zcG90Lm91dGVyQ29uZUFuZ2xlICE9PSB1bmRlZmluZWQgPyBvMi5zcG90Lm91dGVyQ29uZUFuZ2xlIDogTWF0aC5QSSAvIDQsIHMyLmFuZ2xlID0gbzIuc3BvdC5vdXRlckNvbmVBbmdsZSwgczIucGVudW1icmEgPSAxIC0gbzIuc3BvdC5pbm5lckNvbmVBbmdsZSAvIG8yLnNwb3Qub3V0ZXJDb25lQW5nbGUsIHMyLnRhcmdldC5wb3NpdGlvbi5zZXQoMCwgMCwgLTEpLCBzMi5hZGQoczIudGFyZ2V0KTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkdMVEZMb2FkZXI6IFVuZXhwZWN0ZWQgbGlnaHQgdHlwZTogIiArIG8yLnR5cGUpOwogICAgfQogICAgcmV0dXJuIHMyLnBvc2l0aW9uLnNldCgwLCAwLCAwKSwgVXQoczIsIG8yKSwgbzIuaW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgJiYgKHMyLmludGVuc2l0eSA9IG8yLmludGVuc2l0eSksIHMyLm5hbWUgPSB0Mi5jcmVhdGVVbmlxdWVOYW1lKG8yLm5hbWUgfHwgImxpZ2h0XyIgKyBlKSwgaTIgPSBQcm9taXNlLnJlc29sdmUoczIpLCB0Mi5jYWNoZS5hZGQobjIsIGkyKSwgaTI7CiAgfQogIGdldERlcGVuZGVuY3koZSwgdDIpIHsKICAgIGlmIChlID09PSAibGlnaHQiKQogICAgICByZXR1cm4gdGhpcy5fbG9hZExpZ2h0KHQyKTsKICB9CiAgY3JlYXRlTm9kZUF0dGFjaG1lbnQoZSkgewogICAgY29uc3QgdDIgPSB0aGlzLCBuMiA9IHRoaXMucGFyc2VyLCBpMiA9IG4yLmpzb24ubm9kZXNbZV0sIHIyID0gKGkyLmV4dGVuc2lvbnMgJiYgaTIuZXh0ZW5zaW9uc1t0aGlzLm5hbWVdIHx8IHt9KS5saWdodDsKICAgIHJldHVybiByMiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMuX2xvYWRMaWdodChyMikudGhlbihmdW5jdGlvbihlMikgewogICAgICByZXR1cm4gbjIuX2dldE5vZGVSZWYodDIuY2FjaGUsIHIyLCBlMik7CiAgICB9KTsKICB9Cn0KCmNsYXNzIHR0IHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMubmFtZSA9ICRlLktIUl9NQVRFUklBTFNfVU5MSVQ7CiAgfQogIGdldE1hdGVyaWFsVHlwZSgpIHsKICAgIHJldHVybiBSZS5NZXNoQmFzaWNNYXRlcmlhbDsKICB9CiAgZXh0ZW5kUGFyYW1zKGUsIHQyLCBuMikgewogICAgY29uc3QgaTIgPSBbXTsKICAgIGUuY29sb3IgPSBuZXcgUmUuQ29sb3IoMSwgMSwgMSksIGUub3BhY2l0eSA9IDE7CiAgICBjb25zdCByMiA9IHQyLnBick1ldGFsbGljUm91Z2huZXNzOwogICAgaWYgKHIyKSB7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHIyLmJhc2VDb2xvckZhY3RvcikpIHsKICAgICAgICBjb25zdCB0MyA9IHIyLmJhc2VDb2xvckZhY3RvcjsKICAgICAgICBlLmNvbG9yLnNldFJHQih0M1swXSwgdDNbMV0sIHQzWzJdLCBSZS5MaW5lYXJTUkdCQ29sb3JTcGFjZSksIGUub3BhY2l0eSA9IHQzWzNdOwogICAgICB9CiAgICAgIHIyLmJhc2VDb2xvclRleHR1cmUgIT09IHVuZGVmaW5lZCAmJiBpMi5wdXNoKG4yLmFzc2lnblRleHR1cmUoZSwgIm1hcCIsIHIyLmJhc2VDb2xvclRleHR1cmUsIFJlLlNSR0JDb2xvclNwYWNlKSk7CiAgICB9CiAgICByZXR1cm4gUHJvbWlzZS5hbGwoaTIpOwogIH0KfQoKY2xhc3MgbnQgewogIGNvbnN0cnVjdG9yKGUpIHsKICAgIHRoaXMucGFyc2VyID0gZSwgdGhpcy5uYW1lID0gJGUuS0hSX01BVEVSSUFMU19FTUlTU0lWRV9TVFJFTkdUSDsKICB9CiAgZXh0ZW5kTWF0ZXJpYWxQYXJhbXMoZSwgdDIpIHsKICAgIGNvbnN0IG4yID0gdGhpcy5wYXJzZXIuanNvbi5tYXRlcmlhbHNbZV07CiAgICBpZiAoIW4yLmV4dGVuc2lvbnMgfHwgIW4yLmV4dGVuc2lvbnNbdGhpcy5uYW1lXSkKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgY29uc3QgaTIgPSBuMi5leHRlbnNpb25zW3RoaXMubmFtZV0uZW1pc3NpdmVTdHJlbmd0aDsKICAgIHJldHVybiBpMiAhPT0gdW5kZWZpbmVkICYmICh0Mi5lbWlzc2l2ZUludGVuc2l0eSA9IGkyKSwgUHJvbWlzZS5yZXNvbHZlKCk7CiAgfQp9CgpjbGFzcyBpdCB7CiAgY29uc3RydWN0b3IoZSkgewogICAgdGhpcy5wYXJzZXIgPSBlLCB0aGlzLm5hbWUgPSAkZS5LSFJfTUFURVJJQUxTX0NMRUFSQ09BVDsKICB9CiAgZ2V0TWF0ZXJpYWxUeXBlKGUpIHsKICAgIGNvbnN0IHQyID0gdGhpcy5wYXJzZXIuanNvbi5tYXRlcmlhbHNbZV07CiAgICByZXR1cm4gdDIuZXh0ZW5zaW9ucyAmJiB0Mi5leHRlbnNpb25zW3RoaXMubmFtZV0gPyBSZS5NZXNoUGh5c2ljYWxNYXRlcmlhbCA6IG51bGw7CiAgfQogIGV4dGVuZE1hdGVyaWFsUGFyYW1zKGUsIHQyKSB7CiAgICBjb25zdCBuMiA9IHRoaXMucGFyc2VyLCBpMiA9IG4yLmpzb24ubWF0ZXJpYWxzW2VdOwogICAgaWYgKCFpMi5leHRlbnNpb25zIHx8ICFpMi5leHRlbnNpb25zW3RoaXMubmFtZV0pCiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgIGNvbnN0IHIyID0gW10sIG8yID0gaTIuZXh0ZW5zaW9uc1t0aGlzLm5hbWVdOwogICAgaWYgKG8yLmNsZWFyY29hdEZhY3RvciAhPT0gdW5kZWZpbmVkICYmICh0Mi5jbGVhcmNvYXQgPSBvMi5jbGVhcmNvYXRGYWN0b3IpLCBvMi5jbGVhcmNvYXRUZXh0dXJlICE9PSB1bmRlZmluZWQgJiYgcjIucHVzaChuMi5hc3NpZ25UZXh0dXJlKHQyLCAiY2xlYXJjb2F0TWFwIiwgbzIuY2xlYXJjb2F0VGV4dHVyZSkpLCBvMi5jbGVhcmNvYXRSb3VnaG5lc3NGYWN0b3IgIT09IHVuZGVmaW5lZCAmJiAodDIuY2xlYXJjb2F0Um91Z2huZXNzID0gbzIuY2xlYXJjb2F0Um91Z2huZXNzRmFjdG9yKSwgbzIuY2xlYXJjb2F0Um91Z2huZXNzVGV4dHVyZSAhPT0gdW5kZWZpbmVkICYmIHIyLnB1c2gobjIuYXNzaWduVGV4dHVyZSh0MiwgImNsZWFyY29hdFJvdWdobmVzc01hcCIsIG8yLmNsZWFyY29hdFJvdWdobmVzc1RleHR1cmUpKSwgbzIuY2xlYXJjb2F0Tm9ybWFsVGV4dHVyZSAhPT0gdW5kZWZpbmVkICYmIChyMi5wdXNoKG4yLmFzc2lnblRleHR1cmUodDIsICJjbGVhcmNvYXROb3JtYWxNYXAiLCBvMi5jbGVhcmNvYXROb3JtYWxUZXh0dXJlKSksIG8yLmNsZWFyY29hdE5vcm1hbFRleHR1cmUuc2NhbGUgIT09IHVuZGVmaW5lZCkpIHsKICAgICAgY29uc3QgZTIgPSBvMi5jbGVhcmNvYXROb3JtYWxUZXh0dXJlLnNjYWxlOwogICAgICB0Mi5jbGVhcmNvYXROb3JtYWxTY2FsZSA9IG5ldyBSZS5WZWN0b3IyKGUyLCBlMik7CiAgICB9CiAgICByZXR1cm4gUHJvbWlzZS5hbGwocjIpOwogIH0KfQoKY2xhc3MgcnQgewogIGNvbnN0cnVjdG9yKGUpIHsKICAgIHRoaXMucGFyc2VyID0gZSwgdGhpcy5uYW1lID0gJGUuS0hSX01BVEVSSUFMU19ESVNQRVJTSU9OOwogIH0KICBnZXRNYXRlcmlhbFR5cGUoZSkgewogICAgY29uc3QgdDIgPSB0aGlzLnBhcnNlci5qc29uLm1hdGVyaWFsc1tlXTsKICAgIHJldHVybiB0Mi5leHRlbnNpb25zICYmIHQyLmV4dGVuc2lvbnNbdGhpcy5uYW1lXSA/IFJlLk1lc2hQaHlzaWNhbE1hdGVyaWFsIDogbnVsbDsKICB9CiAgZXh0ZW5kTWF0ZXJpYWxQYXJhbXMoZSwgdDIpIHsKICAgIGNvbnN0IG4yID0gdGhpcy5wYXJzZXIuanNvbi5tYXRlcmlhbHNbZV07CiAgICBpZiAoIW4yLmV4dGVuc2lvbnMgfHwgIW4yLmV4dGVuc2lvbnNbdGhpcy5uYW1lXSkKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgY29uc3QgaTIgPSBuMi5leHRlbnNpb25zW3RoaXMubmFtZV07CiAgICByZXR1cm4gdDIuZGlzcGVyc2lvbiA9IGkyLmRpc3BlcnNpb24gIT09IHVuZGVmaW5lZCA/IGkyLmRpc3BlcnNpb24gOiAwLCBQcm9taXNlLnJlc29sdmUoKTsKICB9Cn0KCmNsYXNzIG90IHsKICBjb25zdHJ1Y3RvcihlKSB7CiAgICB0aGlzLnBhcnNlciA9IGUsIHRoaXMubmFtZSA9ICRlLktIUl9NQVRFUklBTFNfSVJJREVTQ0VOQ0U7CiAgfQogIGdldE1hdGVyaWFsVHlwZShlKSB7CiAgICBjb25zdCB0MiA9IHRoaXMucGFyc2VyLmpzb24ubWF0ZXJpYWxzW2VdOwogICAgcmV0dXJuIHQyLmV4dGVuc2lvbnMgJiYgdDIuZXh0ZW5zaW9uc1t0aGlzLm5hbWVdID8gUmUuTWVzaFBoeXNpY2FsTWF0ZXJpYWwgOiBudWxsOwogIH0KICBleHRlbmRNYXRlcmlhbFBhcmFtcyhlLCB0MikgewogICAgY29uc3QgbjIgPSB0aGlzLnBhcnNlciwgaTIgPSBuMi5qc29uLm1hdGVyaWFsc1tlXTsKICAgIGlmICghaTIuZXh0ZW5zaW9ucyB8fCAhaTIuZXh0ZW5zaW9uc1t0aGlzLm5hbWVdKQogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICBjb25zdCByMiA9IFtdLCBvMiA9IGkyLmV4dGVuc2lvbnNbdGhpcy5uYW1lXTsKICAgIHJldHVybiBvMi5pcmlkZXNjZW5jZUZhY3RvciAhPT0gdW5kZWZpbmVkICYmICh0Mi5pcmlkZXNjZW5jZSA9IG8yLmlyaWRlc2NlbmNlRmFjdG9yKSwgbzIuaXJpZGVzY2VuY2VUZXh0dXJlICE9PSB1bmRlZmluZWQgJiYgcjIucHVzaChuMi5hc3NpZ25UZXh0dXJlKHQyLCAiaXJpZGVzY2VuY2VNYXAiLCBvMi5pcmlkZXNjZW5jZVRleHR1cmUpKSwgbzIuaXJpZGVzY2VuY2VJb3IgIT09IHVuZGVmaW5lZCAmJiAodDIuaXJpZGVzY2VuY2VJT1IgPSBvMi5pcmlkZXNjZW5jZUlvciksIHQyLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UgPT09IHVuZGVmaW5lZCAmJiAodDIuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSA9IFsxMDAsIDQwMF0pLCBvMi5pcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW0gIT09IHVuZGVmaW5lZCAmJiAodDIuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZVswXSA9IG8yLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bSksIG8yLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bSAhPT0gdW5kZWZpbmVkICYmICh0Mi5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlWzFdID0gbzIuaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtKSwgbzIuaXJpZGVzY2VuY2VUaGlja25lc3NUZXh0dXJlICE9PSB1bmRlZmluZWQgJiYgcjIucHVzaChuMi5hc3NpZ25UZXh0dXJlKHQyLCAiaXJpZGVzY2VuY2VUaGlja25lc3NNYXAiLCBvMi5pcmlkZXNjZW5jZVRoaWNrbmVzc1RleHR1cmUpKSwgUHJvbWlzZS5hbGwocjIpOwogIH0KfQoKY2xhc3Mgc3QgewogIGNvbnN0cnVjdG9yKGUpIHsKICAgIHRoaXMucGFyc2VyID0gZSwgdGhpcy5uYW1lID0gJGUuS0hSX01BVEVSSUFMU19TSEVFTjsKICB9CiAgZ2V0TWF0ZXJpYWxUeXBlKGUpIHsKICAgIGNvbnN0IHQyID0gdGhpcy5wYXJzZXIuanNvbi5tYXRlcmlhbHNbZV07CiAgICByZXR1cm4gdDIuZXh0ZW5zaW9ucyAmJiB0Mi5leHRlbnNpb25zW3RoaXMubmFtZV0gPyBSZS5NZXNoUGh5c2ljYWxNYXRlcmlhbCA6IG51bGw7CiAgfQogIGV4dGVuZE1hdGVyaWFsUGFyYW1zKGUsIHQyKSB7CiAgICBjb25zdCBuMiA9IHRoaXMucGFyc2VyLCBpMiA9IG4yLmpzb24ubWF0ZXJpYWxzW2VdOwogICAgaWYgKCFpMi5leHRlbnNpb25zIHx8ICFpMi5leHRlbnNpb25zW3RoaXMubmFtZV0pCiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgIGNvbnN0IHIyID0gW107CiAgICB0Mi5zaGVlbkNvbG9yID0gbmV3IFJlLkNvbG9yKDAsIDAsIDApLCB0Mi5zaGVlblJvdWdobmVzcyA9IDAsIHQyLnNoZWVuID0gMTsKICAgIGNvbnN0IG8yID0gaTIuZXh0ZW5zaW9uc1t0aGlzLm5hbWVdOwogICAgaWYgKG8yLnNoZWVuQ29sb3JGYWN0b3IgIT09IHVuZGVmaW5lZCkgewogICAgICBjb25zdCBlMiA9IG8yLnNoZWVuQ29sb3JGYWN0b3I7CiAgICAgIHQyLnNoZWVuQ29sb3Iuc2V0UkdCKGUyWzBdLCBlMlsxXSwgZTJbMl0sIFJlLkxpbmVhclNSR0JDb2xvclNwYWNlKTsKICAgIH0KICAgIHJldHVybiBvMi5zaGVlblJvdWdobmVzc0ZhY3RvciAhPT0gdW5kZWZpbmVkICYmICh0Mi5zaGVlblJvdWdobmVzcyA9IG8yLnNoZWVuUm91Z2huZXNzRmFjdG9yKSwgbzIuc2hlZW5Db2xvclRleHR1cmUgIT09IHVuZGVmaW5lZCAmJiByMi5wdXNoKG4yLmFzc2lnblRleHR1cmUodDIsICJzaGVlbkNvbG9yTWFwIiwgbzIuc2hlZW5Db2xvclRleHR1cmUsIFJlLlNSR0JDb2xvclNwYWNlKSksIG8yLnNoZWVuUm91Z2huZXNzVGV4dHVyZSAhPT0gdW5kZWZpbmVkICYmIHIyLnB1c2gobjIuYXNzaWduVGV4dHVyZSh0MiwgInNoZWVuUm91Z2huZXNzTWFwIiwgbzIuc2hlZW5Sb3VnaG5lc3NUZXh0dXJlKSksIFByb21pc2UuYWxsKHIyKTsKICB9Cn0KCmNsYXNzIGF0IHsKICBjb25zdHJ1Y3RvcihlKSB7CiAgICB0aGlzLnBhcnNlciA9IGUsIHRoaXMubmFtZSA9ICRlLktIUl9NQVRFUklBTFNfVFJBTlNNSVNTSU9OOwogIH0KICBnZXRNYXRlcmlhbFR5cGUoZSkgewogICAgY29uc3QgdDIgPSB0aGlzLnBhcnNlci5qc29uLm1hdGVyaWFsc1tlXTsKICAgIHJldHVybiB0Mi5leHRlbnNpb25zICYmIHQyLmV4dGVuc2lvbnNbdGhpcy5uYW1lXSA/IFJlLk1lc2hQaHlzaWNhbE1hdGVyaWFsIDogbnVsbDsKICB9CiAgZXh0ZW5kTWF0ZXJpYWxQYXJhbXMoZSwgdDIpIHsKICAgIGNvbnN0IG4yID0gdGhpcy5wYXJzZXIsIGkyID0gbjIuanNvbi5tYXRlcmlhbHNbZV07CiAgICBpZiAoIWkyLmV4dGVuc2lvbnMgfHwgIWkyLmV4dGVuc2lvbnNbdGhpcy5uYW1lXSkKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgY29uc3QgcjIgPSBbXSwgbzIgPSBpMi5leHRlbnNpb25zW3RoaXMubmFtZV07CiAgICByZXR1cm4gbzIudHJhbnNtaXNzaW9uRmFjdG9yICE9PSB1bmRlZmluZWQgJiYgKHQyLnRyYW5zbWlzc2lvbiA9IG8yLnRyYW5zbWlzc2lvbkZhY3RvciksIG8yLnRyYW5zbWlzc2lvblRleHR1cmUgIT09IHVuZGVmaW5lZCAmJiByMi5wdXNoKG4yLmFzc2lnblRleHR1cmUodDIsICJ0cmFuc21pc3Npb25NYXAiLCBvMi50cmFuc21pc3Npb25UZXh0dXJlKSksIFByb21pc2UuYWxsKHIyKTsKICB9Cn0KCmNsYXNzIEF0IHsKICBjb25zdHJ1Y3RvcihlKSB7CiAgICB0aGlzLnBhcnNlciA9IGUsIHRoaXMubmFtZSA9ICRlLktIUl9NQVRFUklBTFNfVk9MVU1FOwogIH0KICBnZXRNYXRlcmlhbFR5cGUoZSkgewogICAgY29uc3QgdDIgPSB0aGlzLnBhcnNlci5qc29uLm1hdGVyaWFsc1tlXTsKICAgIHJldHVybiB0Mi5leHRlbnNpb25zICYmIHQyLmV4dGVuc2lvbnNbdGhpcy5uYW1lXSA/IFJlLk1lc2hQaHlzaWNhbE1hdGVyaWFsIDogbnVsbDsKICB9CiAgZXh0ZW5kTWF0ZXJpYWxQYXJhbXMoZSwgdDIpIHsKICAgIGNvbnN0IG4yID0gdGhpcy5wYXJzZXIsIGkyID0gbjIuanNvbi5tYXRlcmlhbHNbZV07CiAgICBpZiAoIWkyLmV4dGVuc2lvbnMgfHwgIWkyLmV4dGVuc2lvbnNbdGhpcy5uYW1lXSkKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgY29uc3QgcjIgPSBbXSwgbzIgPSBpMi5leHRlbnNpb25zW3RoaXMubmFtZV07CiAgICB0Mi50aGlja25lc3MgPSBvMi50aGlja25lc3NGYWN0b3IgIT09IHVuZGVmaW5lZCA/IG8yLnRoaWNrbmVzc0ZhY3RvciA6IDAsIG8yLnRoaWNrbmVzc1RleHR1cmUgIT09IHVuZGVmaW5lZCAmJiByMi5wdXNoKG4yLmFzc2lnblRleHR1cmUodDIsICJ0aGlja25lc3NNYXAiLCBvMi50aGlja25lc3NUZXh0dXJlKSksIHQyLmF0dGVudWF0aW9uRGlzdGFuY2UgPSBvMi5hdHRlbnVhdGlvbkRpc3RhbmNlIHx8IDEgLyAwOwogICAgY29uc3QgczIgPSBvMi5hdHRlbnVhdGlvbkNvbG9yIHx8IFsxLCAxLCAxXTsKICAgIHJldHVybiB0Mi5hdHRlbnVhdGlvbkNvbG9yID0gbmV3IFJlLkNvbG9yKCkuc2V0UkdCKHMyWzBdLCBzMlsxXSwgczJbMl0sIFJlLkxpbmVhclNSR0JDb2xvclNwYWNlKSwgUHJvbWlzZS5hbGwocjIpOwogIH0KfQoKY2xhc3MgbHQgewogIGNvbnN0cnVjdG9yKGUpIHsKICAgIHRoaXMucGFyc2VyID0gZSwgdGhpcy5uYW1lID0gJGUuS0hSX01BVEVSSUFMU19JT1I7CiAgfQogIGdldE1hdGVyaWFsVHlwZShlKSB7CiAgICBjb25zdCB0MiA9IHRoaXMucGFyc2VyLmpzb24ubWF0ZXJpYWxzW2VdOwogICAgcmV0dXJuIHQyLmV4dGVuc2lvbnMgJiYgdDIuZXh0ZW5zaW9uc1t0aGlzLm5hbWVdID8gUmUuTWVzaFBoeXNpY2FsTWF0ZXJpYWwgOiBudWxsOwogIH0KICBleHRlbmRNYXRlcmlhbFBhcmFtcyhlLCB0MikgewogICAgY29uc3QgbjIgPSB0aGlzLnBhcnNlci5qc29uLm1hdGVyaWFsc1tlXTsKICAgIGlmICghbjIuZXh0ZW5zaW9ucyB8fCAhbjIuZXh0ZW5zaW9uc1t0aGlzLm5hbWVdKQogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICBjb25zdCBpMiA9IG4yLmV4dGVuc2lvbnNbdGhpcy5uYW1lXTsKICAgIHJldHVybiB0Mi5pb3IgPSBpMi5pb3IgIT09IHVuZGVmaW5lZCA/IGkyLmlvciA6IDEuNSwgUHJvbWlzZS5yZXNvbHZlKCk7CiAgfQp9CgpjbGFzcyBjdCB7CiAgY29uc3RydWN0b3IoZSkgewogICAgdGhpcy5wYXJzZXIgPSBlLCB0aGlzLm5hbWUgPSAkZS5LSFJfTUFURVJJQUxTX1NQRUNVTEFSOwogIH0KICBnZXRNYXRlcmlhbFR5cGUoZSkgewogICAgY29uc3QgdDIgPSB0aGlzLnBhcnNlci5qc29uLm1hdGVyaWFsc1tlXTsKICAgIHJldHVybiB0Mi5leHRlbnNpb25zICYmIHQyLmV4dGVuc2lvbnNbdGhpcy5uYW1lXSA/IFJlLk1lc2hQaHlzaWNhbE1hdGVyaWFsIDogbnVsbDsKICB9CiAgZXh0ZW5kTWF0ZXJpYWxQYXJhbXMoZSwgdDIpIHsKICAgIGNvbnN0IG4yID0gdGhpcy5wYXJzZXIsIGkyID0gbjIuanNvbi5tYXRlcmlhbHNbZV07CiAgICBpZiAoIWkyLmV4dGVuc2lvbnMgfHwgIWkyLmV4dGVuc2lvbnNbdGhpcy5uYW1lXSkKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgY29uc3QgcjIgPSBbXSwgbzIgPSBpMi5leHRlbnNpb25zW3RoaXMubmFtZV07CiAgICB0Mi5zcGVjdWxhckludGVuc2l0eSA9IG8yLnNwZWN1bGFyRmFjdG9yICE9PSB1bmRlZmluZWQgPyBvMi5zcGVjdWxhckZhY3RvciA6IDEsIG8yLnNwZWN1bGFyVGV4dHVyZSAhPT0gdW5kZWZpbmVkICYmIHIyLnB1c2gobjIuYXNzaWduVGV4dHVyZSh0MiwgInNwZWN1bGFySW50ZW5zaXR5TWFwIiwgbzIuc3BlY3VsYXJUZXh0dXJlKSk7CiAgICBjb25zdCBzMiA9IG8yLnNwZWN1bGFyQ29sb3JGYWN0b3IgfHwgWzEsIDEsIDFdOwogICAgcmV0dXJuIHQyLnNwZWN1bGFyQ29sb3IgPSBuZXcgUmUuQ29sb3IoKS5zZXRSR0IoczJbMF0sIHMyWzFdLCBzMlsyXSwgUmUuTGluZWFyU1JHQkNvbG9yU3BhY2UpLCBvMi5zcGVjdWxhckNvbG9yVGV4dHVyZSAhPT0gdW5kZWZpbmVkICYmIHIyLnB1c2gobjIuYXNzaWduVGV4dHVyZSh0MiwgInNwZWN1bGFyQ29sb3JNYXAiLCBvMi5zcGVjdWxhckNvbG9yVGV4dHVyZSwgUmUuU1JHQkNvbG9yU3BhY2UpKSwgUHJvbWlzZS5hbGwocjIpOwogIH0KfQoKY2xhc3MgaHQgewogIGNvbnN0cnVjdG9yKGUpIHsKICAgIHRoaXMucGFyc2VyID0gZSwgdGhpcy5uYW1lID0gJGUuRVhUX01BVEVSSUFMU19CVU1QOwogIH0KICBnZXRNYXRlcmlhbFR5cGUoZSkgewogICAgY29uc3QgdDIgPSB0aGlzLnBhcnNlci5qc29uLm1hdGVyaWFsc1tlXTsKICAgIHJldHVybiB0Mi5leHRlbnNpb25zICYmIHQyLmV4dGVuc2lvbnNbdGhpcy5uYW1lXSA/IFJlLk1lc2hQaHlzaWNhbE1hdGVyaWFsIDogbnVsbDsKICB9CiAgZXh0ZW5kTWF0ZXJpYWxQYXJhbXMoZSwgdDIpIHsKICAgIGNvbnN0IG4yID0gdGhpcy5wYXJzZXIsIGkyID0gbjIuanNvbi5tYXRlcmlhbHNbZV07CiAgICBpZiAoIWkyLmV4dGVuc2lvbnMgfHwgIWkyLmV4dGVuc2lvbnNbdGhpcy5uYW1lXSkKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgY29uc3QgcjIgPSBbXSwgbzIgPSBpMi5leHRlbnNpb25zW3RoaXMubmFtZV07CiAgICByZXR1cm4gdDIuYnVtcFNjYWxlID0gbzIuYnVtcEZhY3RvciAhPT0gdW5kZWZpbmVkID8gbzIuYnVtcEZhY3RvciA6IDEsIG8yLmJ1bXBUZXh0dXJlICE9PSB1bmRlZmluZWQgJiYgcjIucHVzaChuMi5hc3NpZ25UZXh0dXJlKHQyLCAiYnVtcE1hcCIsIG8yLmJ1bXBUZXh0dXJlKSksIFByb21pc2UuYWxsKHIyKTsKICB9Cn0KCmNsYXNzIGR0IHsKICBjb25zdHJ1Y3RvcihlKSB7CiAgICB0aGlzLnBhcnNlciA9IGUsIHRoaXMubmFtZSA9ICRlLktIUl9NQVRFUklBTFNfQU5JU09UUk9QWTsKICB9CiAgZ2V0TWF0ZXJpYWxUeXBlKGUpIHsKICAgIGNvbnN0IHQyID0gdGhpcy5wYXJzZXIuanNvbi5tYXRlcmlhbHNbZV07CiAgICByZXR1cm4gdDIuZXh0ZW5zaW9ucyAmJiB0Mi5leHRlbnNpb25zW3RoaXMubmFtZV0gPyBSZS5NZXNoUGh5c2ljYWxNYXRlcmlhbCA6IG51bGw7CiAgfQogIGV4dGVuZE1hdGVyaWFsUGFyYW1zKGUsIHQyKSB7CiAgICBjb25zdCBuMiA9IHRoaXMucGFyc2VyLCBpMiA9IG4yLmpzb24ubWF0ZXJpYWxzW2VdOwogICAgaWYgKCFpMi5leHRlbnNpb25zIHx8ICFpMi5leHRlbnNpb25zW3RoaXMubmFtZV0pCiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgIGNvbnN0IHIyID0gW10sIG8yID0gaTIuZXh0ZW5zaW9uc1t0aGlzLm5hbWVdOwogICAgcmV0dXJuIG8yLmFuaXNvdHJvcHlTdHJlbmd0aCAhPT0gdW5kZWZpbmVkICYmICh0Mi5hbmlzb3Ryb3B5ID0gbzIuYW5pc290cm9weVN0cmVuZ3RoKSwgbzIuYW5pc290cm9weVJvdGF0aW9uICE9PSB1bmRlZmluZWQgJiYgKHQyLmFuaXNvdHJvcHlSb3RhdGlvbiA9IG8yLmFuaXNvdHJvcHlSb3RhdGlvbiksIG8yLmFuaXNvdHJvcHlUZXh0dXJlICE9PSB1bmRlZmluZWQgJiYgcjIucHVzaChuMi5hc3NpZ25UZXh0dXJlKHQyLCAiYW5pc290cm9weU1hcCIsIG8yLmFuaXNvdHJvcHlUZXh0dXJlKSksIFByb21pc2UuYWxsKHIyKTsKICB9Cn0KCmNsYXNzIHV0IHsKICBjb25zdHJ1Y3RvcihlKSB7CiAgICB0aGlzLnBhcnNlciA9IGUsIHRoaXMubmFtZSA9ICRlLktIUl9URVhUVVJFX0JBU0lTVTsKICB9CiAgbG9hZFRleHR1cmUoZSkgewogICAgY29uc3QgdDIgPSB0aGlzLnBhcnNlciwgbjIgPSB0Mi5qc29uLCBpMiA9IG4yLnRleHR1cmVzW2VdOwogICAgaWYgKCFpMi5leHRlbnNpb25zIHx8ICFpMi5leHRlbnNpb25zW3RoaXMubmFtZV0pCiAgICAgIHJldHVybiBudWxsOwogICAgY29uc3QgcjIgPSBpMi5leHRlbnNpb25zW3RoaXMubmFtZV0sIG8yID0gdDIub3B0aW9ucy5rdHgyTG9hZGVyOwogICAgaWYgKCFvMikgewogICAgICBpZiAobjIuZXh0ZW5zaW9uc1JlcXVpcmVkICYmIG4yLmV4dGVuc2lvbnNSZXF1aXJlZC5pbmRleE9mKHRoaXMubmFtZSkgPj0gMCkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkdMVEZMb2FkZXI6IHNldEtUWDJMb2FkZXIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGxvYWRpbmcgS1RYMiB0ZXh0dXJlcyIpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiB0Mi5sb2FkVGV4dHVyZUltYWdlKGUsIHIyLnNvdXJjZSwgbzIpOwogIH0KfQoKY2xhc3MgZ3QgewogIGNvbnN0cnVjdG9yKGUpIHsKICAgIHRoaXMucGFyc2VyID0gZSwgdGhpcy5uYW1lID0gJGUuRVhUX1RFWFRVUkVfV0VCUCwgdGhpcy5pc1N1cHBvcnRlZCA9IG51bGw7CiAgfQogIGxvYWRUZXh0dXJlKGUpIHsKICAgIGNvbnN0IHQyID0gdGhpcy5uYW1lLCBuMiA9IHRoaXMucGFyc2VyLCBpMiA9IG4yLmpzb24sIHIyID0gaTIudGV4dHVyZXNbZV07CiAgICBpZiAoIXIyLmV4dGVuc2lvbnMgfHwgIXIyLmV4dGVuc2lvbnNbdDJdKQogICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IG8yID0gcjIuZXh0ZW5zaW9uc1t0Ml0sIHMyID0gaTIuaW1hZ2VzW28yLnNvdXJjZV07CiAgICBsZXQgYTIgPSBuMi50ZXh0dXJlTG9hZGVyOwogICAgaWYgKHMyLnVyaSkgewogICAgICBjb25zdCBlMiA9IG4yLm9wdGlvbnMubWFuYWdlci5nZXRIYW5kbGVyKHMyLnVyaSk7CiAgICAgIGUyICE9PSBudWxsICYmIChhMiA9IGUyKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmRldGVjdFN1cHBvcnQoKS50aGVuKGZ1bmN0aW9uKHIzKSB7CiAgICAgIGlmIChyMykKICAgICAgICByZXR1cm4gbjIubG9hZFRleHR1cmVJbWFnZShlLCBvMi5zb3VyY2UsIGEyKTsKICAgICAgaWYgKGkyLmV4dGVuc2lvbnNSZXF1aXJlZCAmJiBpMi5leHRlbnNpb25zUmVxdWlyZWQuaW5kZXhPZih0MikgPj0gMCkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkdMVEZMb2FkZXI6IFdlYlAgcmVxdWlyZWQgYnkgYXNzZXQgYnV0IHVuc3VwcG9ydGVkLiIpOwogICAgICByZXR1cm4gbjIubG9hZFRleHR1cmUoZSk7CiAgICB9KTsKICB9CiAgZGV0ZWN0U3VwcG9ydCgpIHsKICAgIHJldHVybiB0aGlzLmlzU3VwcG9ydGVkIHx8ICh0aGlzLmlzU3VwcG9ydGVkID0gbmV3IFByb21pc2UoZnVuY3Rpb24oZSkgewogICAgICBjb25zdCB0MiA9IG5ldyBJbWFnZTsKICAgICAgdDIuc3JjID0gImRhdGE6aW1hZ2Uvd2VicDtiYXNlNjQsVWtsR1JpSUFBQUJYUlVKUVZsQTRJQllBQUFBd0FRQ2RBU29CQUFFQURzRCtKYVFBQTNBQUFBQUEiLCB0Mi5vbmxvYWQgPSB0Mi5vbmVycm9yID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZSh0Mi5oZWlnaHQgPT09IDEpOwogICAgICB9OwogICAgfSkpLCB0aGlzLmlzU3VwcG9ydGVkOwogIH0KfQoKY2xhc3MgcHQgewogIGNvbnN0cnVjdG9yKGUpIHsKICAgIHRoaXMucGFyc2VyID0gZSwgdGhpcy5uYW1lID0gJGUuRVhUX1RFWFRVUkVfQVZJRiwgdGhpcy5pc1N1cHBvcnRlZCA9IG51bGw7CiAgfQogIGxvYWRUZXh0dXJlKGUpIHsKICAgIGNvbnN0IHQyID0gdGhpcy5uYW1lLCBuMiA9IHRoaXMucGFyc2VyLCBpMiA9IG4yLmpzb24sIHIyID0gaTIudGV4dHVyZXNbZV07CiAgICBpZiAoIXIyLmV4dGVuc2lvbnMgfHwgIXIyLmV4dGVuc2lvbnNbdDJdKQogICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IG8yID0gcjIuZXh0ZW5zaW9uc1t0Ml0sIHMyID0gaTIuaW1hZ2VzW28yLnNvdXJjZV07CiAgICBsZXQgYTIgPSBuMi50ZXh0dXJlTG9hZGVyOwogICAgaWYgKHMyLnVyaSkgewogICAgICBjb25zdCBlMiA9IG4yLm9wdGlvbnMubWFuYWdlci5nZXRIYW5kbGVyKHMyLnVyaSk7CiAgICAgIGUyICE9PSBudWxsICYmIChhMiA9IGUyKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmRldGVjdFN1cHBvcnQoKS50aGVuKGZ1bmN0aW9uKHIzKSB7CiAgICAgIGlmIChyMykKICAgICAgICByZXR1cm4gbjIubG9hZFRleHR1cmVJbWFnZShlLCBvMi5zb3VyY2UsIGEyKTsKICAgICAgaWYgKGkyLmV4dGVuc2lvbnNSZXF1aXJlZCAmJiBpMi5leHRlbnNpb25zUmVxdWlyZWQuaW5kZXhPZih0MikgPj0gMCkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkdMVEZMb2FkZXI6IEFWSUYgcmVxdWlyZWQgYnkgYXNzZXQgYnV0IHVuc3VwcG9ydGVkLiIpOwogICAgICByZXR1cm4gbjIubG9hZFRleHR1cmUoZSk7CiAgICB9KTsKICB9CiAgZGV0ZWN0U3VwcG9ydCgpIHsKICAgIHJldHVybiB0aGlzLmlzU3VwcG9ydGVkIHx8ICh0aGlzLmlzU3VwcG9ydGVkID0gbmV3IFByb21pc2UoZnVuY3Rpb24oZSkgewogICAgICBjb25zdCB0MiA9IG5ldyBJbWFnZTsKICAgICAgdDIuc3JjID0gImRhdGE6aW1hZ2UvYXZpZjtiYXNlNjQsQUFBQUlHWjBlWEJoZG1sbUFBQUFBR0YyYVdadGFXWXhiV2xoWmsxQk1VSUFBQUR5YldWMFlRQUFBQUFBQUFBb2FHUnNjZ0FBQUFBQUFBQUFjR2xqZEFBQUFBQUFBQUFBQUFBQUFHeHBZbUYyYVdZQUFBQUFEbkJwZEcwQUFBQUFBQUVBQUFBZWFXeHZZd0FBQUFCRUFBQUJBQUVBQUFBQkFBQUJHZ0FBQUJjQUFBQW9hV2x1WmdBQUFBQUFBUUFBQUJwcGJtWmxBZ0FBQUFBQkFBQmhkakF4UTI5c2IzSUFBQUFBYW1sd2NuQUFBQUJMYVhCamJ3QUFBQlJwYzNCbEFBQUFBQUFBQUFFQUFBQUJBQUFBRUhCcGVHa0FBQUFBQXdnSUNBQUFBQXhoZGpGRGdRQU1BQUFBQUJOamIyeHlibU5zZUFBQ0FBSUFCb0FBQUFBWGFYQnRZUUFBQUFBQUFBQUJBQUVFQVFLREJBQUFBQjl0WkdGMEVnQUtDQmdBQm9nUUVEUWdNZ2tRQUFBQUI4ZFNMZkk9IiwgdDIub25sb2FkID0gdDIub25lcnJvciA9IGZ1bmN0aW9uKCkgewogICAgICAgIGUodDIuaGVpZ2h0ID09PSAxKTsKICAgICAgfTsKICAgIH0pKSwgdGhpcy5pc1N1cHBvcnRlZDsKICB9Cn0KCmNsYXNzIGZ0IHsKICBjb25zdHJ1Y3RvcihlKSB7CiAgICB0aGlzLm5hbWUgPSAkZS5FWFRfTUVTSE9QVF9DT01QUkVTU0lPTiwgdGhpcy5wYXJzZXIgPSBlOwogIH0KICBsb2FkQnVmZmVyVmlldyhlKSB7CiAgICBjb25zdCB0MiA9IHRoaXMucGFyc2VyLmpzb24sIG4yID0gdDIuYnVmZmVyVmlld3NbZV07CiAgICBpZiAobjIuZXh0ZW5zaW9ucyAmJiBuMi5leHRlbnNpb25zW3RoaXMubmFtZV0pIHsKICAgICAgY29uc3QgZTIgPSBuMi5leHRlbnNpb25zW3RoaXMubmFtZV0sIGkyID0gdGhpcy5wYXJzZXIuZ2V0RGVwZW5kZW5jeSgiYnVmZmVyIiwgZTIuYnVmZmVyKSwgcjIgPSB0aGlzLnBhcnNlci5vcHRpb25zLm1lc2hvcHREZWNvZGVyOwogICAgICBpZiAoIXIyIHx8ICFyMi5zdXBwb3J0ZWQpIHsKICAgICAgICBpZiAodDIuZXh0ZW5zaW9uc1JlcXVpcmVkICYmIHQyLmV4dGVuc2lvbnNSZXF1aXJlZC5pbmRleE9mKHRoaXMubmFtZSkgPj0gMCkKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVEhSRUUuR0xURkxvYWRlcjogc2V0TWVzaG9wdERlY29kZXIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGxvYWRpbmcgY29tcHJlc3NlZCBmaWxlcyIpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBpMi50aGVuKGZ1bmN0aW9uKHQzKSB7CiAgICAgICAgY29uc3QgbjMgPSBlMi5ieXRlT2Zmc2V0IHx8IDAsIGkzID0gZTIuYnl0ZUxlbmd0aCB8fCAwLCBvMiA9IGUyLmNvdW50LCBzMiA9IGUyLmJ5dGVTdHJpZGUsIGEyID0gbmV3IFVpbnQ4QXJyYXkodDMsIG4zLCBpMyk7CiAgICAgICAgcmV0dXJuIHIyLmRlY29kZUdsdGZCdWZmZXJBc3luYyA/IHIyLmRlY29kZUdsdGZCdWZmZXJBc3luYyhvMiwgczIsIGEyLCBlMi5tb2RlLCBlMi5maWx0ZXIpLnRoZW4oZnVuY3Rpb24oZTMpIHsKICAgICAgICAgIHJldHVybiBlMy5idWZmZXI7CiAgICAgICAgfSkgOiByMi5yZWFkeS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgdDQgPSBuZXcgQXJyYXlCdWZmZXIobzIgKiBzMik7CiAgICAgICAgICByZXR1cm4gcjIuZGVjb2RlR2x0ZkJ1ZmZlcihuZXcgVWludDhBcnJheSh0NCksIG8yLCBzMiwgYTIsIGUyLm1vZGUsIGUyLmZpbHRlciksIHQ0OwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQoKY2xhc3MgbXQgewogIGNvbnN0cnVjdG9yKGUpIHsKICAgIHRoaXMubmFtZSA9ICRlLkVYVF9NRVNIX0dQVV9JTlNUQU5DSU5HLCB0aGlzLnBhcnNlciA9IGU7CiAgfQogIGNyZWF0ZU5vZGVNZXNoKGUpIHsKICAgIGNvbnN0IHQyID0gdGhpcy5wYXJzZXIuanNvbiwgbjIgPSB0Mi5ub2Rlc1tlXTsKICAgIGlmICghbjIuZXh0ZW5zaW9ucyB8fCAhbjIuZXh0ZW5zaW9uc1t0aGlzLm5hbWVdIHx8IG4yLm1lc2ggPT09IHVuZGVmaW5lZCkKICAgICAgcmV0dXJuIG51bGw7CiAgICBjb25zdCBpMiA9IHQyLm1lc2hlc1tuMi5tZXNoXTsKICAgIGZvciAoY29uc3QgZTIgb2YgaTIucHJpbWl0aXZlcykKICAgICAgaWYgKGUyLm1vZGUgIT09IHh0LlRSSUFOR0xFUyAmJiBlMi5tb2RlICE9PSB4dC5UUklBTkdMRV9TVFJJUCAmJiBlMi5tb2RlICE9PSB4dC5UUklBTkdMRV9GQU4gJiYgZTIubW9kZSAhPT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiBudWxsOwogICAgY29uc3QgcjIgPSBuMi5leHRlbnNpb25zW3RoaXMubmFtZV0uYXR0cmlidXRlcywgbzIgPSBbXSwgczIgPSB7fTsKICAgIGZvciAoY29uc3QgZTIgaW4gcjIpCiAgICAgIG8yLnB1c2godGhpcy5wYXJzZXIuZ2V0RGVwZW5kZW5jeSgiYWNjZXNzb3IiLCByMltlMl0pLnRoZW4oKHQzKSA9PiAoczJbZTJdID0gdDMsIHMyW2UyXSkpKTsKICAgIHJldHVybiBvMi5sZW5ndGggPCAxID8gbnVsbCA6IChvMi5wdXNoKHRoaXMucGFyc2VyLmNyZWF0ZU5vZGVNZXNoKGUpKSwgUHJvbWlzZS5hbGwobzIpLnRoZW4oKGUyKSA9PiB7CiAgICAgIGNvbnN0IHQzID0gZTIucG9wKCksIG4zID0gdDMuaXNHcm91cCA/IHQzLmNoaWxkcmVuIDogW3QzXSwgaTMgPSBlMlswXS5jb3VudCwgcjMgPSBbXTsKICAgICAgZm9yIChjb25zdCBlMyBvZiBuMykgewogICAgICAgIGNvbnN0IHQ0ID0gbmV3IFJlLk1hdHJpeDQsIG40ID0gbmV3IFJlLlZlY3RvcjMsIG8zID0gbmV3IFJlLlF1YXRlcm5pb24sIGEyID0gbmV3IFJlLlZlY3RvcjMoMSwgMSwgMSksIEEyID0gbmV3IFJlLkluc3RhbmNlZE1lc2goZTMuZ2VvbWV0cnksIGUzLm1hdGVyaWFsLCBpMyk7CiAgICAgICAgZm9yIChsZXQgZTQgPSAwO2U0IDwgaTM7IGU0KyspCiAgICAgICAgICBzMi5UUkFOU0xBVElPTiAmJiBuNC5mcm9tQnVmZmVyQXR0cmlidXRlKHMyLlRSQU5TTEFUSU9OLCBlNCksIHMyLlJPVEFUSU9OICYmIG8zLmZyb21CdWZmZXJBdHRyaWJ1dGUoczIuUk9UQVRJT04sIGU0KSwgczIuU0NBTEUgJiYgYTIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzMi5TQ0FMRSwgZTQpLCBBMi5zZXRNYXRyaXhBdChlNCwgdDQuY29tcG9zZShuNCwgbzMsIGEyKSk7CiAgICAgICAgZm9yIChjb25zdCB0NSBpbiBzMikKICAgICAgICAgIGlmICh0NSA9PT0gIl9DT0xPUl8wIikgewogICAgICAgICAgICBjb25zdCBlNCA9IHMyW3Q1XTsKICAgICAgICAgICAgQTIuaW5zdGFuY2VDb2xvciA9IG5ldyBSZS5JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoZTQuYXJyYXksIGU0Lml0ZW1TaXplLCBlNC5ub3JtYWxpemVkKTsKICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICB0NSAhPT0gIlRSQU5TTEFUSU9OIiAmJiB0NSAhPT0gIlJPVEFUSU9OIiAmJiB0NSAhPT0gIlNDQUxFIiAmJiBlMy5nZW9tZXRyeS5zZXRBdHRyaWJ1dGUodDUsIHMyW3Q1XSk7CiAgICAgICAgUmUuT2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbChBMiwgZTMpLCB0aGlzLnBhcnNlci5hc3NpZ25GaW5hbE1hdGVyaWFsKEEyKSwgcjMucHVzaChBMik7CiAgICAgIH0KICAgICAgcmV0dXJuIHQzLmlzR3JvdXAgPyAodDMuY2xlYXIoKSwgdDMuYWRkKC4uLnIzKSwgdDMpIDogcjNbMF07CiAgICB9KSk7CiAgfQp9CgpjbGFzcyBDdCB7CiAgY29uc3RydWN0b3IoZSkgewogICAgdGhpcy5uYW1lID0gJGUuS0hSX0JJTkFSWV9HTFRGLCB0aGlzLmNvbnRlbnQgPSBudWxsLCB0aGlzLmJvZHkgPSBudWxsOwogICAgY29uc3QgdDIgPSBuZXcgRGF0YVZpZXcoZSwgMCwgMTIpLCBuMiA9IG5ldyBUZXh0RGVjb2RlcjsKICAgIGlmICh0aGlzLmhlYWRlciA9IHsgbWFnaWM6IG4yLmRlY29kZShuZXcgVWludDhBcnJheShlLnNsaWNlKDAsIDQpKSksIHZlcnNpb246IHQyLmdldFVpbnQzMig0LCB0cnVlKSwgbGVuZ3RoOiB0Mi5nZXRVaW50MzIoOCwgdHJ1ZSkgfSwgdGhpcy5oZWFkZXIubWFnaWMgIT09IEV0KQogICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkdMVEZMb2FkZXI6IFVuc3VwcG9ydGVkIGdsVEYtQmluYXJ5IGhlYWRlci4iKTsKICAgIGlmICh0aGlzLmhlYWRlci52ZXJzaW9uIDwgMikKICAgICAgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5HTFRGTG9hZGVyOiBMZWdhY3kgYmluYXJ5IGZpbGUgZGV0ZWN0ZWQuIik7CiAgICBjb25zdCBpMiA9IHRoaXMuaGVhZGVyLmxlbmd0aCAtIDEyLCByMiA9IG5ldyBEYXRhVmlldyhlLCAxMik7CiAgICBsZXQgbzIgPSAwOwogICAgZm9yICg7bzIgPCBpMjsgKSB7CiAgICAgIGNvbnN0IHQzID0gcjIuZ2V0VWludDMyKG8yLCB0cnVlKTsKICAgICAgbzIgKz0gNDsKICAgICAgY29uc3QgaTMgPSByMi5nZXRVaW50MzIobzIsIHRydWUpOwogICAgICBpZiAobzIgKz0gNCwgaTMgPT09IDEzMTM4MjE1MTQpIHsKICAgICAgICBjb25zdCBpNCA9IG5ldyBVaW50OEFycmF5KGUsIDEyICsgbzIsIHQzKTsKICAgICAgICB0aGlzLmNvbnRlbnQgPSBuMi5kZWNvZGUoaTQpOwogICAgICB9IGVsc2UgaWYgKGkzID09PSA1MTMwNTYyKSB7CiAgICAgICAgY29uc3QgbjMgPSAxMiArIG8yOwogICAgICAgIHRoaXMuYm9keSA9IGUuc2xpY2UobjMsIG4zICsgdDMpOwogICAgICB9CiAgICAgIG8yICs9IHQzOwogICAgfQogICAgaWYgKHRoaXMuY29udGVudCA9PT0gbnVsbCkKICAgICAgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5HTFRGTG9hZGVyOiBKU09OIGNvbnRlbnQgbm90IGZvdW5kLiIpOwogIH0KfQoKY2xhc3MgdnQgewogIGNvbnN0cnVjdG9yKGUsIHQyKSB7CiAgICBpZiAoIXQyKQogICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkdMVEZMb2FkZXI6IE5vIERSQUNPTG9hZGVyIGluc3RhbmNlIHByb3ZpZGVkLiIpOwogICAgdGhpcy5uYW1lID0gJGUuS0hSX0RSQUNPX01FU0hfQ09NUFJFU1NJT04sIHRoaXMuanNvbiA9IGUsIHRoaXMuZHJhY29Mb2FkZXIgPSB0MiwgdGhpcy5kcmFjb0xvYWRlci5wcmVsb2FkKCk7CiAgfQogIGRlY29kZVByaW1pdGl2ZShlLCB0MikgewogICAgY29uc3QgbjIgPSB0aGlzLmpzb24sIGkyID0gdGhpcy5kcmFjb0xvYWRlciwgcjIgPSBlLmV4dGVuc2lvbnNbdGhpcy5uYW1lXS5idWZmZXJWaWV3LCBvMiA9IGUuZXh0ZW5zaW9uc1t0aGlzLm5hbWVdLmF0dHJpYnV0ZXMsIHMyID0ge30sIGEyID0ge30sIEEyID0ge307CiAgICBmb3IgKGNvbnN0IGUyIGluIG8yKSB7CiAgICAgIGNvbnN0IHQzID0gRHRbZTJdIHx8IGUyLnRvTG93ZXJDYXNlKCk7CiAgICAgIHMyW3QzXSA9IG8yW2UyXTsKICAgIH0KICAgIGZvciAoY29uc3QgdDMgaW4gZS5hdHRyaWJ1dGVzKSB7CiAgICAgIGNvbnN0IGkzID0gRHRbdDNdIHx8IHQzLnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmIChvMlt0M10gIT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbnN0IHIzID0gbjIuYWNjZXNzb3JzW2UuYXR0cmlidXRlc1t0M11dLCBvMyA9IFF0W3IzLmNvbXBvbmVudFR5cGVdOwogICAgICAgIEEyW2kzXSA9IG8zLm5hbWUsIGEyW2kzXSA9IHIzLm5vcm1hbGl6ZWQgPT09IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0Mi5nZXREZXBlbmRlbmN5KCJidWZmZXJWaWV3IiwgcjIpLnRoZW4oZnVuY3Rpb24oZTIpIHsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQzLCBuMykgewogICAgICAgIGkyLmRlY29kZURyYWNvRmlsZShlMiwgZnVuY3Rpb24oZTMpIHsKICAgICAgICAgIGZvciAoY29uc3QgdDQgaW4gZTMuYXR0cmlidXRlcykgewogICAgICAgICAgICBjb25zdCBuNCA9IGUzLmF0dHJpYnV0ZXNbdDRdLCBpMyA9IGEyW3Q0XTsKICAgICAgICAgICAgaTMgIT09IHVuZGVmaW5lZCAmJiAobjQubm9ybWFsaXplZCA9IGkzKTsKICAgICAgICAgIH0KICAgICAgICAgIHQzKGUzKTsKICAgICAgICB9LCBzMiwgQTIsIFJlLkxpbmVhclNSR0JDb2xvclNwYWNlLCBuMyk7CiAgICAgIH0pOwogICAgfSk7CiAgfQp9CgpjbGFzcyBCdCB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLm5hbWUgPSAkZS5LSFJfVEVYVFVSRV9UUkFOU0ZPUk07CiAgfQogIGV4dGVuZFRleHR1cmUoZSwgdDIpIHsKICAgIHJldHVybiB0Mi50ZXhDb29yZCAhPT0gdW5kZWZpbmVkICYmIHQyLnRleENvb3JkICE9PSBlLmNoYW5uZWwgfHwgdDIub2Zmc2V0ICE9PSB1bmRlZmluZWQgfHwgdDIucm90YXRpb24gIT09IHVuZGVmaW5lZCB8fCB0Mi5zY2FsZSAhPT0gdW5kZWZpbmVkID8gKGUgPSBlLmNsb25lKCksIHQyLnRleENvb3JkICE9PSB1bmRlZmluZWQgJiYgKGUuY2hhbm5lbCA9IHQyLnRleENvb3JkKSwgdDIub2Zmc2V0ICE9PSB1bmRlZmluZWQgJiYgZS5vZmZzZXQuZnJvbUFycmF5KHQyLm9mZnNldCksIHQyLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgJiYgKGUucm90YXRpb24gPSB0Mi5yb3RhdGlvbiksIHQyLnNjYWxlICE9PSB1bmRlZmluZWQgJiYgZS5yZXBlYXQuZnJvbUFycmF5KHQyLnNjYWxlKSwgZS5uZWVkc1VwZGF0ZSA9IHRydWUsIGUpIDogZTsKICB9Cn0KCmNsYXNzIGJ0IHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMubmFtZSA9ICRlLktIUl9NRVNIX1FVQU5USVpBVElPTjsKICB9Cn0KZnVuY3Rpb24gUnQoZSkgewogIHJldHVybiBlLkRlZmF1bHRNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICYmIChlLkRlZmF1bHRNYXRlcmlhbCA9IG5ldyBSZS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IGNvbG9yOiAxNjc3NzIxNSwgZW1pc3NpdmU6IDAsIG1ldGFsbmVzczogMSwgcm91Z2huZXNzOiAxLCB0cmFuc3BhcmVudDogZmFsc2UsIGRlcHRoVGVzdDogdHJ1ZSwgc2lkZTogUmUuRnJvbnRTaWRlIH0pKSwgZS5EZWZhdWx0TWF0ZXJpYWw7Cn0KZnVuY3Rpb24gRnQoZSwgdDIsIG4yKSB7CiAgZm9yIChjb25zdCBpMiBpbiBuMi5leHRlbnNpb25zKQogICAgZVtpMl0gPT09IHVuZGVmaW5lZCAmJiAodDIudXNlckRhdGEuZ2x0ZkV4dGVuc2lvbnMgPSB0Mi51c2VyRGF0YS5nbHRmRXh0ZW5zaW9ucyB8fCB7fSwgdDIudXNlckRhdGEuZ2x0ZkV4dGVuc2lvbnNbaTJdID0gbjIuZXh0ZW5zaW9uc1tpMl0pOwp9CmZ1bmN0aW9uIFV0KGUsIHQyKSB7CiAgdDIuZXh0cmFzICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiB0Mi5leHRyYXMgPT0gIm9iamVjdCIgPyBPYmplY3QuYXNzaWduKGUudXNlckRhdGEsIHQyLmV4dHJhcykgOiBjb25zb2xlLndhcm4oIlRIUkVFLkdMVEZMb2FkZXI6IElnbm9yaW5nIHByaW1pdGl2ZSB0eXBlIC5leHRyYXMsICIgKyB0Mi5leHRyYXMpKTsKfQpmdW5jdGlvbiBPdChlLCB0MikgewogIGlmIChlLnVwZGF0ZU1vcnBoVGFyZ2V0cygpLCB0Mi53ZWlnaHRzICE9PSB1bmRlZmluZWQpCiAgICBmb3IgKGxldCBuMiA9IDAsIGkyID0gdDIud2VpZ2h0cy5sZW5ndGg7bjIgPCBpMjsgbjIrKykKICAgICAgZS5tb3JwaFRhcmdldEluZmx1ZW5jZXNbbjJdID0gdDIud2VpZ2h0c1tuMl07CiAgaWYgKHQyLmV4dHJhcyAmJiBBcnJheS5pc0FycmF5KHQyLmV4dHJhcy50YXJnZXROYW1lcykpIHsKICAgIGNvbnN0IG4yID0gdDIuZXh0cmFzLnRhcmdldE5hbWVzOwogICAgaWYgKGUubW9ycGhUYXJnZXRJbmZsdWVuY2VzLmxlbmd0aCA9PT0gbjIubGVuZ3RoKSB7CiAgICAgIGUubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307CiAgICAgIGZvciAobGV0IHQzID0gMCwgaTIgPSBuMi5sZW5ndGg7dDMgPCBpMjsgdDMrKykKICAgICAgICBlLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtuMlt0M11dID0gdDM7CiAgICB9IGVsc2UKICAgICAgY29uc29sZS53YXJuKCJUSFJFRS5HTFRGTG9hZGVyOiBJbnZhbGlkIGV4dHJhcy50YXJnZXROYW1lcyBsZW5ndGguIElnbm9yaW5nIG5hbWVzLiIpOwogIH0KfQpmdW5jdGlvbiBQdChlKSB7CiAgbGV0IHQyOwogIGNvbnN0IG4yID0gZS5leHRlbnNpb25zICYmIGUuZXh0ZW5zaW9uc1skZS5LSFJfRFJBQ09fTUVTSF9DT01QUkVTU0lPTl07CiAgaWYgKHQyID0gbjIgPyAiZHJhY286IiArIG4yLmJ1ZmZlclZpZXcgKyAiOiIgKyBuMi5pbmRpY2VzICsgIjoiICsgR3QobjIuYXR0cmlidXRlcykgOiBlLmluZGljZXMgKyAiOiIgKyBHdChlLmF0dHJpYnV0ZXMpICsgIjoiICsgZS5tb2RlLCBlLnRhcmdldHMgIT09IHVuZGVmaW5lZCkKICAgIGZvciAobGV0IG4zID0gMCwgaTIgPSBlLnRhcmdldHMubGVuZ3RoO24zIDwgaTI7IG4zKyspCiAgICAgIHQyICs9ICI6IiArIEd0KGUudGFyZ2V0c1tuM10pOwogIHJldHVybiB0MjsKfQpmdW5jdGlvbiBHdChlKSB7CiAgbGV0IHQyID0gIiI7CiAgY29uc3QgbjIgPSBPYmplY3Qua2V5cyhlKS5zb3J0KCk7CiAgZm9yIChsZXQgaTIgPSAwLCByMiA9IG4yLmxlbmd0aDtpMiA8IHIyOyBpMisrKQogICAgdDIgKz0gbjJbaTJdICsgIjoiICsgZVtuMltpMl1dICsgIjsiOwogIHJldHVybiB0MjsKfQpmdW5jdGlvbiBOdChlKSB7CiAgc3dpdGNoIChlKSB7CiAgICBjYXNlIEludDhBcnJheToKICAgICAgcmV0dXJuIDEgLyAxMjc7CiAgICBjYXNlIFVpbnQ4QXJyYXk6CiAgICAgIHJldHVybiAxIC8gMjU1OwogICAgY2FzZSBJbnQxNkFycmF5OgogICAgICByZXR1cm4gMSAvIDMyNzY3OwogICAgY2FzZSBVaW50MTZBcnJheToKICAgICAgcmV0dXJuIDEgLyA2NTUzNTsKICAgIGRlZmF1bHQ6CiAgICAgIHRocm93IG5ldyBFcnJvcigiVEhSRUUuR0xURkxvYWRlcjogVW5zdXBwb3J0ZWQgbm9ybWFsaXplZCBhY2Nlc3NvciBjb21wb25lbnQgdHlwZS4iKTsKICB9Cn0KCmNsYXNzIF90IHsKICBjb25zdHJ1Y3RvcihlID0ge30sIHQyID0ge30pIHsKICAgIHRoaXMuanNvbiA9IGUsIHRoaXMuZXh0ZW5zaW9ucyA9IHt9LCB0aGlzLnBsdWdpbnMgPSB7fSwgdGhpcy5vcHRpb25zID0gdDIsIHRoaXMuY2FjaGUgPSBuZXcgWmUsIHRoaXMuYXNzb2NpYXRpb25zID0gbmV3IE1hcCwgdGhpcy5wcmltaXRpdmVDYWNoZSA9IHt9LCB0aGlzLm5vZGVDYWNoZSA9IHt9LCB0aGlzLm1lc2hDYWNoZSA9IHsgcmVmczoge30sIHVzZXM6IHt9IH0sIHRoaXMuY2FtZXJhQ2FjaGUgPSB7IHJlZnM6IHt9LCB1c2VzOiB7fSB9LCB0aGlzLmxpZ2h0Q2FjaGUgPSB7IHJlZnM6IHt9LCB1c2VzOiB7fSB9LCB0aGlzLnNvdXJjZUNhY2hlID0ge30sIHRoaXMudGV4dHVyZUNhY2hlID0ge30sIHRoaXMubm9kZU5hbWVzVXNlZCA9IHt9OwogICAgbGV0IG4yID0gZmFsc2UsIGkyID0gLTEsIHIyID0gZmFsc2UsIG8yID0gLTE7CiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPSAidW5kZWZpbmVkIikgewogICAgICBjb25zdCBlMiA9IG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICAgIG4yID0gL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChlMikgPT09IHRydWU7CiAgICAgIGNvbnN0IHQzID0gZTIubWF0Y2goL1ZlcnNpb25cLyhcZCspLyk7CiAgICAgIGkyID0gbjIgJiYgdDMgPyBwYXJzZUludCh0M1sxXSwgMTApIDogLTEsIHIyID0gZTIuaW5kZXhPZigiRmlyZWZveCIpID4gLTEsIG8yID0gcjIgPyBlMi5tYXRjaCgvRmlyZWZveFwvKFswLTldKylcLi8pWzFdIDogLTE7CiAgICB9CiAgICB0eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXAgPT0gInVuZGVmaW5lZCIgfHwgbjIgJiYgaTIgPCAxNyB8fCByMiAmJiBvMiA8IDk4ID8gdGhpcy50ZXh0dXJlTG9hZGVyID0gbmV3IFJlLlRleHR1cmVMb2FkZXIodGhpcy5vcHRpb25zLm1hbmFnZXIpIDogdGhpcy50ZXh0dXJlTG9hZGVyID0gbmV3IFJlLkltYWdlQml0bWFwTG9hZGVyKHRoaXMub3B0aW9ucy5tYW5hZ2VyKSwgdGhpcy50ZXh0dXJlTG9hZGVyLnNldENyb3NzT3JpZ2luKHRoaXMub3B0aW9ucy5jcm9zc09yaWdpbiksIHRoaXMudGV4dHVyZUxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMub3B0aW9ucy5yZXF1ZXN0SGVhZGVyKSwgdGhpcy5maWxlTG9hZGVyID0gbmV3IFJlLkZpbGVMb2FkZXIodGhpcy5vcHRpb25zLm1hbmFnZXIpLCB0aGlzLmZpbGVMb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLCB0aGlzLm9wdGlvbnMuY3Jvc3NPcmlnaW4gPT09ICJ1c2UtY3JlZGVudGlhbHMiICYmIHRoaXMuZmlsZUxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHModHJ1ZSk7CiAgfQogIHNldEV4dGVuc2lvbnMoZSkgewogICAgdGhpcy5leHRlbnNpb25zID0gZTsKICB9CiAgc2V0UGx1Z2lucyhlKSB7CiAgICB0aGlzLnBsdWdpbnMgPSBlOwogIH0KICBwYXJzZShlLCB0MikgewogICAgY29uc3QgbjIgPSB0aGlzLCBpMiA9IHRoaXMuanNvbiwgcjIgPSB0aGlzLmV4dGVuc2lvbnM7CiAgICB0aGlzLmNhY2hlLnJlbW92ZUFsbCgpLCB0aGlzLm5vZGVDYWNoZSA9IHt9LCB0aGlzLl9pbnZva2VBbGwoZnVuY3Rpb24oZTIpIHsKICAgICAgcmV0dXJuIGUyLl9tYXJrRGVmcyAmJiBlMi5fbWFya0RlZnMoKTsKICAgIH0pLCBQcm9taXNlLmFsbCh0aGlzLl9pbnZva2VBbGwoZnVuY3Rpb24oZTIpIHsKICAgICAgcmV0dXJuIGUyLmJlZm9yZVJvb3QgJiYgZTIuYmVmb3JlUm9vdCgpOwogICAgfSkpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBQcm9taXNlLmFsbChbbjIuZ2V0RGVwZW5kZW5jaWVzKCJzY2VuZSIpLCBuMi5nZXREZXBlbmRlbmNpZXMoImFuaW1hdGlvbiIpLCBuMi5nZXREZXBlbmRlbmNpZXMoImNhbWVyYSIpXSk7CiAgICB9KS50aGVuKGZ1bmN0aW9uKHQzKSB7CiAgICAgIGNvbnN0IG8yID0geyBzY2VuZTogdDNbMF1baTIuc2NlbmUgfHwgMF0sIHNjZW5lczogdDNbMF0sIGFuaW1hdGlvbnM6IHQzWzFdLCBjYW1lcmFzOiB0M1syXSwgYXNzZXQ6IGkyLmFzc2V0LCBwYXJzZXI6IG4yLCB1c2VyRGF0YToge30gfTsKICAgICAgcmV0dXJuIEZ0KHIyLCBvMiwgaTIpLCBVdChvMiwgaTIpLCBQcm9taXNlLmFsbChuMi5faW52b2tlQWxsKGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgcmV0dXJuIGUyLmFmdGVyUm9vdCAmJiBlMi5hZnRlclJvb3QobzIpOwogICAgICB9KSkudGhlbihmdW5jdGlvbigpIHsKICAgICAgICBmb3IgKGNvbnN0IGUyIG9mIG8yLnNjZW5lcykKICAgICAgICAgIGUyLnVwZGF0ZU1hdHJpeFdvcmxkKCk7CiAgICAgICAgZShvMik7CiAgICAgIH0pOwogICAgfSkuY2F0Y2godDIpOwogIH0KICBfbWFya0RlZnMoKSB7CiAgICBjb25zdCBlID0gdGhpcy5qc29uLm5vZGVzIHx8IFtdLCB0MiA9IHRoaXMuanNvbi5za2lucyB8fCBbXSwgbjIgPSB0aGlzLmpzb24ubWVzaGVzIHx8IFtdOwogICAgZm9yIChsZXQgbjMgPSAwLCBpMiA9IHQyLmxlbmd0aDtuMyA8IGkyOyBuMysrKSB7CiAgICAgIGNvbnN0IGkzID0gdDJbbjNdLmpvaW50czsKICAgICAgZm9yIChsZXQgdDMgPSAwLCBuNCA9IGkzLmxlbmd0aDt0MyA8IG40OyB0MysrKQogICAgICAgIGVbaTNbdDNdXS5pc0JvbmUgPSB0cnVlOwogICAgfQogICAgZm9yIChsZXQgdDMgPSAwLCBpMiA9IGUubGVuZ3RoO3QzIDwgaTI7IHQzKyspIHsKICAgICAgY29uc3QgaTMgPSBlW3QzXTsKICAgICAgaTMubWVzaCAhPT0gdW5kZWZpbmVkICYmICh0aGlzLl9hZGROb2RlUmVmKHRoaXMubWVzaENhY2hlLCBpMy5tZXNoKSwgaTMuc2tpbiAhPT0gdW5kZWZpbmVkICYmIChuMltpMy5tZXNoXS5pc1NraW5uZWRNZXNoID0gdHJ1ZSkpLCBpMy5jYW1lcmEgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9hZGROb2RlUmVmKHRoaXMuY2FtZXJhQ2FjaGUsIGkzLmNhbWVyYSk7CiAgICB9CiAgfQogIF9hZGROb2RlUmVmKGUsIHQyKSB7CiAgICB0MiAhPT0gdW5kZWZpbmVkICYmIChlLnJlZnNbdDJdID09PSB1bmRlZmluZWQgJiYgKGUucmVmc1t0Ml0gPSBlLnVzZXNbdDJdID0gMCksIGUucmVmc1t0Ml0rKyk7CiAgfQogIF9nZXROb2RlUmVmKGUsIHQyLCBuMikgewogICAgaWYgKGUucmVmc1t0Ml0gPD0gMSkKICAgICAgcmV0dXJuIG4yOwogICAgY29uc3QgaTIgPSBuMi5jbG9uZSgpLCByMiA9IChlMiwgdDMpID0+IHsKICAgICAgY29uc3QgbjMgPSB0aGlzLmFzc29jaWF0aW9ucy5nZXQoZTIpOwogICAgICBuMyAhPSBudWxsICYmIHRoaXMuYXNzb2NpYXRpb25zLnNldCh0MywgbjMpOwogICAgICBmb3IgKGNvbnN0IFtuNCwgaTNdIG9mIGUyLmNoaWxkcmVuLmVudHJpZXMoKSkKICAgICAgICByMihpMywgdDMuY2hpbGRyZW5bbjRdKTsKICAgIH07CiAgICByZXR1cm4gcjIobjIsIGkyKSwgaTIubmFtZSArPSAiX2luc3RhbmNlXyIgKyBlLnVzZXNbdDJdKyssIGkyOwogIH0KICBfaW52b2tlT25lKGUpIHsKICAgIGNvbnN0IHQyID0gT2JqZWN0LnZhbHVlcyh0aGlzLnBsdWdpbnMpOwogICAgdDIucHVzaCh0aGlzKTsKICAgIGZvciAobGV0IG4yID0gMDtuMiA8IHQyLmxlbmd0aDsgbjIrKykgewogICAgICBjb25zdCBpMiA9IGUodDJbbjJdKTsKICAgICAgaWYgKGkyKQogICAgICAgIHJldHVybiBpMjsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBfaW52b2tlQWxsKGUpIHsKICAgIGNvbnN0IHQyID0gT2JqZWN0LnZhbHVlcyh0aGlzLnBsdWdpbnMpOwogICAgdDIudW5zaGlmdCh0aGlzKTsKICAgIGNvbnN0IG4yID0gW107CiAgICBmb3IgKGxldCBpMiA9IDA7aTIgPCB0Mi5sZW5ndGg7IGkyKyspIHsKICAgICAgY29uc3QgcjIgPSBlKHQyW2kyXSk7CiAgICAgIHIyICYmIG4yLnB1c2gocjIpOwogICAgfQogICAgcmV0dXJuIG4yOwogIH0KICBnZXREZXBlbmRlbmN5KGUsIHQyKSB7CiAgICBjb25zdCBuMiA9IGUgKyAiOiIgKyB0MjsKICAgIGxldCBpMiA9IHRoaXMuY2FjaGUuZ2V0KG4yKTsKICAgIGlmICghaTIpIHsKICAgICAgc3dpdGNoIChlKSB7CiAgICAgICAgY2FzZSAic2NlbmUiOgogICAgICAgICAgaTIgPSB0aGlzLmxvYWRTY2VuZSh0Mik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJub2RlIjoKICAgICAgICAgIGkyID0gdGhpcy5faW52b2tlT25lKGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgICAgIHJldHVybiBlMi5sb2FkTm9kZSAmJiBlMi5sb2FkTm9kZSh0Mik7CiAgICAgICAgICB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIm1lc2giOgogICAgICAgICAgaTIgPSB0aGlzLl9pbnZva2VPbmUoZnVuY3Rpb24oZTIpIHsKICAgICAgICAgICAgcmV0dXJuIGUyLmxvYWRNZXNoICYmIGUyLmxvYWRNZXNoKHQyKTsKICAgICAgICAgIH0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiYWNjZXNzb3IiOgogICAgICAgICAgaTIgPSB0aGlzLmxvYWRBY2Nlc3Nvcih0Mik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJidWZmZXJWaWV3IjoKICAgICAgICAgIGkyID0gdGhpcy5faW52b2tlT25lKGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgICAgIHJldHVybiBlMi5sb2FkQnVmZmVyVmlldyAmJiBlMi5sb2FkQnVmZmVyVmlldyh0Mik7CiAgICAgICAgICB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImJ1ZmZlciI6CiAgICAgICAgICBpMiA9IHRoaXMubG9hZEJ1ZmZlcih0Mik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtYXRlcmlhbCI6CiAgICAgICAgICBpMiA9IHRoaXMuX2ludm9rZU9uZShmdW5jdGlvbihlMikgewogICAgICAgICAgICByZXR1cm4gZTIubG9hZE1hdGVyaWFsICYmIGUyLmxvYWRNYXRlcmlhbCh0Mik7CiAgICAgICAgICB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInRleHR1cmUiOgogICAgICAgICAgaTIgPSB0aGlzLl9pbnZva2VPbmUoZnVuY3Rpb24oZTIpIHsKICAgICAgICAgICAgcmV0dXJuIGUyLmxvYWRUZXh0dXJlICYmIGUyLmxvYWRUZXh0dXJlKHQyKTsKICAgICAgICAgIH0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAic2tpbiI6CiAgICAgICAgICBpMiA9IHRoaXMubG9hZFNraW4odDIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiYW5pbWF0aW9uIjoKICAgICAgICAgIGkyID0gdGhpcy5faW52b2tlT25lKGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgICAgIHJldHVybiBlMi5sb2FkQW5pbWF0aW9uICYmIGUyLmxvYWRBbmltYXRpb24odDIpOwogICAgICAgICAgfSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjYW1lcmEiOgogICAgICAgICAgaTIgPSB0aGlzLmxvYWRDYW1lcmEodDIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGlmIChpMiA9IHRoaXMuX2ludm9rZU9uZShmdW5jdGlvbihuMykgewogICAgICAgICAgICByZXR1cm4gbjMgIT0gdGhpcyAmJiBuMy5nZXREZXBlbmRlbmN5ICYmIG4zLmdldERlcGVuZGVuY3koZSwgdDIpOwogICAgICAgICAgfSksICFpMikKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHR5cGU6ICIgKyBlKTsKICAgICAgfQogICAgICB0aGlzLmNhY2hlLmFkZChuMiwgaTIpOwogICAgfQogICAgcmV0dXJuIGkyOwogIH0KICBnZXREZXBlbmRlbmNpZXMoZSkgewogICAgbGV0IHQyID0gdGhpcy5jYWNoZS5nZXQoZSk7CiAgICBpZiAoIXQyKSB7CiAgICAgIGNvbnN0IG4yID0gdGhpcywgaTIgPSB0aGlzLmpzb25bZSArIChlID09PSAibWVzaCIgPyAiZXMiIDogInMiKV0gfHwgW107CiAgICAgIHQyID0gUHJvbWlzZS5hbGwoaTIubWFwKGZ1bmN0aW9uKHQzLCBpMykgewogICAgICAgIHJldHVybiBuMi5nZXREZXBlbmRlbmN5KGUsIGkzKTsKICAgICAgfSkpLCB0aGlzLmNhY2hlLmFkZChlLCB0Mik7CiAgICB9CiAgICByZXR1cm4gdDI7CiAgfQogIGxvYWRCdWZmZXIoZSkgewogICAgY29uc3QgdDIgPSB0aGlzLmpzb24uYnVmZmVyc1tlXSwgbjIgPSB0aGlzLmZpbGVMb2FkZXI7CiAgICBpZiAodDIudHlwZSAmJiB0Mi50eXBlICE9PSAiYXJyYXlidWZmZXIiKQogICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkdMVEZMb2FkZXI6ICIgKyB0Mi50eXBlICsgIiBidWZmZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLiIpOwogICAgaWYgKHQyLnVyaSA9PT0gdW5kZWZpbmVkICYmIGUgPT09IDApCiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5leHRlbnNpb25zWyRlLktIUl9CSU5BUllfR0xURl0uYm9keSk7CiAgICBjb25zdCBpMiA9IHRoaXMub3B0aW9uczsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlMiwgcjIpIHsKICAgICAgbjIubG9hZChSZS5Mb2FkZXJVdGlscy5yZXNvbHZlVVJMKHQyLnVyaSwgaTIucGF0aCksIGUyLCB1bmRlZmluZWQsIGZ1bmN0aW9uKCkgewogICAgICAgIHIyKG5ldyBFcnJvcignVEhSRUUuR0xURkxvYWRlcjogRmFpbGVkIHRvIGxvYWQgYnVmZmVyICInICsgdDIudXJpICsgJyIuJykpOwogICAgICB9KTsKICAgIH0pOwogIH0KICBsb2FkQnVmZmVyVmlldyhlKSB7CiAgICBjb25zdCB0MiA9IHRoaXMuanNvbi5idWZmZXJWaWV3c1tlXTsKICAgIHJldHVybiB0aGlzLmdldERlcGVuZGVuY3koImJ1ZmZlciIsIHQyLmJ1ZmZlcikudGhlbihmdW5jdGlvbihlMikgewogICAgICBjb25zdCBuMiA9IHQyLmJ5dGVMZW5ndGggfHwgMCwgaTIgPSB0Mi5ieXRlT2Zmc2V0IHx8IDA7CiAgICAgIHJldHVybiBlMi5zbGljZShpMiwgaTIgKyBuMik7CiAgICB9KTsKICB9CiAgbG9hZEFjY2Vzc29yKGUpIHsKICAgIGNvbnN0IHQyID0gdGhpcywgbjIgPSB0aGlzLmpzb24sIGkyID0gdGhpcy5qc29uLmFjY2Vzc29yc1tlXTsKICAgIGlmIChpMi5idWZmZXJWaWV3ID09PSB1bmRlZmluZWQgJiYgaTIuc3BhcnNlID09PSB1bmRlZmluZWQpIHsKICAgICAgY29uc3QgZTIgPSBTdFtpMi50eXBlXSwgdDMgPSBRdFtpMi5jb21wb25lbnRUeXBlXSwgbjMgPSBpMi5ub3JtYWxpemVkID09PSB0cnVlLCByMyA9IG5ldyB0MyhpMi5jb3VudCAqIGUyKTsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgUmUuQnVmZmVyQXR0cmlidXRlKHIzLCBlMiwgbjMpKTsKICAgIH0KICAgIGNvbnN0IHIyID0gW107CiAgICByZXR1cm4gaTIuYnVmZmVyVmlldyAhPT0gdW5kZWZpbmVkID8gcjIucHVzaCh0aGlzLmdldERlcGVuZGVuY3koImJ1ZmZlclZpZXciLCBpMi5idWZmZXJWaWV3KSkgOiByMi5wdXNoKG51bGwpLCBpMi5zcGFyc2UgIT09IHVuZGVmaW5lZCAmJiAocjIucHVzaCh0aGlzLmdldERlcGVuZGVuY3koImJ1ZmZlclZpZXciLCBpMi5zcGFyc2UuaW5kaWNlcy5idWZmZXJWaWV3KSksIHIyLnB1c2godGhpcy5nZXREZXBlbmRlbmN5KCJidWZmZXJWaWV3IiwgaTIuc3BhcnNlLnZhbHVlcy5idWZmZXJWaWV3KSkpLCBQcm9taXNlLmFsbChyMikudGhlbihmdW5jdGlvbihlMikgewogICAgICBjb25zdCByMyA9IGUyWzBdLCBvMiA9IFN0W2kyLnR5cGVdLCBzMiA9IFF0W2kyLmNvbXBvbmVudFR5cGVdLCBhMiA9IHMyLkJZVEVTX1BFUl9FTEVNRU5ULCBBMiA9IGEyICogbzIsIGwyID0gaTIuYnl0ZU9mZnNldCB8fCAwLCBjMiA9IGkyLmJ1ZmZlclZpZXcgIT09IHVuZGVmaW5lZCA/IG4yLmJ1ZmZlclZpZXdzW2kyLmJ1ZmZlclZpZXddLmJ5dGVTdHJpZGUgOiB1bmRlZmluZWQsIGgyID0gaTIubm9ybWFsaXplZCA9PT0gdHJ1ZTsKICAgICAgbGV0IGQyLCB1MjsKICAgICAgaWYgKGMyICYmIGMyICE9PSBBMikgewogICAgICAgIGNvbnN0IGUzID0gTWF0aC5mbG9vcihsMiAvIGMyKSwgbjMgPSAiSW50ZXJsZWF2ZWRCdWZmZXI6IiArIGkyLmJ1ZmZlclZpZXcgKyAiOiIgKyBpMi5jb21wb25lbnRUeXBlICsgIjoiICsgZTMgKyAiOiIgKyBpMi5jb3VudDsKICAgICAgICBsZXQgQTMgPSB0Mi5jYWNoZS5nZXQobjMpOwogICAgICAgIEEzIHx8IChkMiA9IG5ldyBzMihyMywgZTMgKiBjMiwgaTIuY291bnQgKiBjMiAvIGEyKSwgQTMgPSBuZXcgUmUuSW50ZXJsZWF2ZWRCdWZmZXIoZDIsIGMyIC8gYTIpLCB0Mi5jYWNoZS5hZGQobjMsIEEzKSksIHUyID0gbmV3IFJlLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKEEzLCBvMiwgbDIgJSBjMiAvIGEyLCBoMik7CiAgICAgIH0gZWxzZQogICAgICAgIGQyID0gcjMgPT09IG51bGwgPyBuZXcgczIoaTIuY291bnQgKiBvMikgOiBuZXcgczIocjMsIGwyLCBpMi5jb3VudCAqIG8yKSwgdTIgPSBuZXcgUmUuQnVmZmVyQXR0cmlidXRlKGQyLCBvMiwgaDIpOwogICAgICBpZiAoaTIuc3BhcnNlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBjb25zdCB0MyA9IFN0LlNDQUxBUiwgbjMgPSBRdFtpMi5zcGFyc2UuaW5kaWNlcy5jb21wb25lbnRUeXBlXSwgYTMgPSBpMi5zcGFyc2UuaW5kaWNlcy5ieXRlT2Zmc2V0IHx8IDAsIEEzID0gaTIuc3BhcnNlLnZhbHVlcy5ieXRlT2Zmc2V0IHx8IDAsIGwzID0gbmV3IG4zKGUyWzFdLCBhMywgaTIuc3BhcnNlLmNvdW50ICogdDMpLCBjMyA9IG5ldyBzMihlMlsyXSwgQTMsIGkyLnNwYXJzZS5jb3VudCAqIG8yKTsKICAgICAgICByMyAhPT0gbnVsbCAmJiAodTIgPSBuZXcgUmUuQnVmZmVyQXR0cmlidXRlKHUyLmFycmF5LnNsaWNlKCksIHUyLml0ZW1TaXplLCB1Mi5ub3JtYWxpemVkKSksIHUyLm5vcm1hbGl6ZWQgPSBmYWxzZTsKICAgICAgICBmb3IgKGxldCBlMyA9IDAsIHQ0ID0gbDMubGVuZ3RoO2UzIDwgdDQ7IGUzKyspIHsKICAgICAgICAgIGNvbnN0IHQ1ID0gbDNbZTNdOwogICAgICAgICAgaWYgKHUyLnNldFgodDUsIGMzW2UzICogbzJdKSwgbzIgPj0gMiAmJiB1Mi5zZXRZKHQ1LCBjM1tlMyAqIG8yICsgMV0pLCBvMiA+PSAzICYmIHUyLnNldFoodDUsIGMzW2UzICogbzIgKyAyXSksIG8yID49IDQgJiYgdTIuc2V0Vyh0NSwgYzNbZTMgKiBvMiArIDNdKSwgbzIgPj0gNSkKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5HTFRGTG9hZGVyOiBVbnN1cHBvcnRlZCBpdGVtU2l6ZSBpbiBzcGFyc2UgQnVmZmVyQXR0cmlidXRlLiIpOwogICAgICAgIH0KICAgICAgICB1Mi5ub3JtYWxpemVkID0gaDI7CiAgICAgIH0KICAgICAgcmV0dXJuIHUyOwogICAgfSk7CiAgfQogIGxvYWRUZXh0dXJlKGUpIHsKICAgIGNvbnN0IHQyID0gdGhpcy5qc29uLCBuMiA9IHRoaXMub3B0aW9ucywgaTIgPSB0Mi50ZXh0dXJlc1tlXS5zb3VyY2UsIHIyID0gdDIuaW1hZ2VzW2kyXTsKICAgIGxldCBvMiA9IHRoaXMudGV4dHVyZUxvYWRlcjsKICAgIGlmIChyMi51cmkpIHsKICAgICAgY29uc3QgZTIgPSBuMi5tYW5hZ2VyLmdldEhhbmRsZXIocjIudXJpKTsKICAgICAgZTIgIT09IG51bGwgJiYgKG8yID0gZTIpOwogICAgfQogICAgcmV0dXJuIHRoaXMubG9hZFRleHR1cmVJbWFnZShlLCBpMiwgbzIpOwogIH0KICBsb2FkVGV4dHVyZUltYWdlKGUsIHQyLCBuMikgewogICAgY29uc3QgaTIgPSB0aGlzLCByMiA9IHRoaXMuanNvbiwgbzIgPSByMi50ZXh0dXJlc1tlXSwgczIgPSByMi5pbWFnZXNbdDJdLCBhMiA9IChzMi51cmkgfHwgczIuYnVmZmVyVmlldykgKyAiOiIgKyBvMi5zYW1wbGVyOwogICAgaWYgKHRoaXMudGV4dHVyZUNhY2hlW2EyXSkKICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZUNhY2hlW2EyXTsKICAgIGNvbnN0IEEyID0gdGhpcy5sb2FkSW1hZ2VTb3VyY2UodDIsIG4yKS50aGVuKGZ1bmN0aW9uKHQzKSB7CiAgICAgIHQzLmZsaXBZID0gZmFsc2UsIHQzLm5hbWUgPSBvMi5uYW1lIHx8IHMyLm5hbWUgfHwgIiIsIHQzLm5hbWUgPT09ICIiICYmIHR5cGVvZiBzMi51cmkgPT0gInN0cmluZyIgJiYgczIudXJpLnN0YXJ0c1dpdGgoImRhdGE6aW1hZ2UvIikgPT09IGZhbHNlICYmICh0My5uYW1lID0gczIudXJpKTsKICAgICAgY29uc3QgbjMgPSAocjIuc2FtcGxlcnMgfHwge30pW28yLnNhbXBsZXJdIHx8IHt9OwogICAgICByZXR1cm4gdDMubWFnRmlsdGVyID0gTHRbbjMubWFnRmlsdGVyXSB8fCBSZS5MaW5lYXJGaWx0ZXIsIHQzLm1pbkZpbHRlciA9IEx0W24zLm1pbkZpbHRlcl0gfHwgUmUuTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyLCB0My53cmFwUyA9IE10W24zLndyYXBTXSB8fCBSZS5SZXBlYXRXcmFwcGluZywgdDMud3JhcFQgPSBNdFtuMy53cmFwVF0gfHwgUmUuUmVwZWF0V3JhcHBpbmcsIHQzLmdlbmVyYXRlTWlwbWFwcyA9ICF0My5pc0NvbXByZXNzZWRUZXh0dXJlICYmIHQzLm1pbkZpbHRlciAhPT0gUmUuTmVhcmVzdEZpbHRlciAmJiB0My5taW5GaWx0ZXIgIT09IFJlLkxpbmVhckZpbHRlciwgaTIuYXNzb2NpYXRpb25zLnNldCh0MywgeyB0ZXh0dXJlczogZSB9KSwgdDM7CiAgICB9KS5jYXRjaChmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9KTsKICAgIHJldHVybiB0aGlzLnRleHR1cmVDYWNoZVthMl0gPSBBMiwgQTI7CiAgfQogIGxvYWRJbWFnZVNvdXJjZShlLCB0MikgewogICAgY29uc3QgbjIgPSB0aGlzLmpzb24sIGkyID0gdGhpcy5vcHRpb25zOwogICAgaWYgKHRoaXMuc291cmNlQ2FjaGVbZV0gIT09IHVuZGVmaW5lZCkKICAgICAgcmV0dXJuIHRoaXMuc291cmNlQ2FjaGVbZV0udGhlbigoZTIpID0+IGUyLmNsb25lKCkpOwogICAgY29uc3QgcjIgPSBuMi5pbWFnZXNbZV0sIG8yID0gc2VsZi5VUkwgfHwgc2VsZi53ZWJraXRVUkw7CiAgICBsZXQgczIgPSByMi51cmkgfHwgIiIsIGEyID0gZmFsc2U7CiAgICBpZiAocjIuYnVmZmVyVmlldyAhPT0gdW5kZWZpbmVkKQogICAgICBzMiA9IHRoaXMuZ2V0RGVwZW5kZW5jeSgiYnVmZmVyVmlldyIsIHIyLmJ1ZmZlclZpZXcpLnRoZW4oZnVuY3Rpb24oZTIpIHsKICAgICAgICBhMiA9IHRydWU7CiAgICAgICAgY29uc3QgdDMgPSBuZXcgQmxvYihbZTJdLCB7IHR5cGU6IHIyLm1pbWVUeXBlIH0pOwogICAgICAgIHJldHVybiBzMiA9IG8yLmNyZWF0ZU9iamVjdFVSTCh0MyksIHMyOwogICAgICB9KTsKICAgIGVsc2UgaWYgKHIyLnVyaSA9PT0gdW5kZWZpbmVkKQogICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkdMVEZMb2FkZXI6IEltYWdlICIgKyBlICsgIiBpcyBtaXNzaW5nIFVSSSBhbmQgYnVmZmVyVmlldyIpOwogICAgY29uc3QgQTIgPSBQcm9taXNlLnJlc29sdmUoczIpLnRoZW4oZnVuY3Rpb24oZTIpIHsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4zLCByMykgewogICAgICAgIGxldCBvMyA9IG4zOwogICAgICAgIHQyLmlzSW1hZ2VCaXRtYXBMb2FkZXIgPT09IHRydWUgJiYgKG8zID0gZnVuY3Rpb24oZTMpIHsKICAgICAgICAgIGNvbnN0IHQzID0gbmV3IFJlLlRleHR1cmUoZTMpOwogICAgICAgICAgdDMubmVlZHNVcGRhdGUgPSB0cnVlLCBuMyh0Myk7CiAgICAgICAgfSksIHQyLmxvYWQoUmUuTG9hZGVyVXRpbHMucmVzb2x2ZVVSTChlMiwgaTIucGF0aCksIG8zLCB1bmRlZmluZWQsIHIzKTsKICAgICAgfSk7CiAgICB9KS50aGVuKGZ1bmN0aW9uKGUyKSB7CiAgICAgIHZhciB0MzsKICAgICAgcmV0dXJuIGEyID09PSB0cnVlICYmIG8yLnJldm9rZU9iamVjdFVSTChzMiksIFV0KGUyLCByMiksIGUyLnVzZXJEYXRhLm1pbWVUeXBlID0gcjIubWltZVR5cGUgfHwgKCh0MyA9IHIyLnVyaSkuc2VhcmNoKC9cLmpwZT9nKCR8XD8pL2kpID4gMCB8fCB0My5zZWFyY2goL15kYXRhXDppbWFnZVwvanBlZy8pID09PSAwID8gImltYWdlL2pwZWciIDogdDMuc2VhcmNoKC9cLndlYnAoJHxcPykvaSkgPiAwIHx8IHQzLnNlYXJjaCgvXmRhdGFcOmltYWdlXC93ZWJwLykgPT09IDAgPyAiaW1hZ2Uvd2VicCIgOiB0My5zZWFyY2goL1wua3R4MigkfFw/KS9pKSA+IDAgfHwgdDMuc2VhcmNoKC9eZGF0YVw6aW1hZ2VcL2t0eDIvKSA9PT0gMCA/ICJpbWFnZS9rdHgyIiA6ICJpbWFnZS9wbmciKSwgZTI7CiAgICB9KS5jYXRjaChmdW5jdGlvbihlMikgewogICAgICB0aHJvdyBjb25zb2xlLmVycm9yKCJUSFJFRS5HTFRGTG9hZGVyOiBDb3VsZG4ndCBsb2FkIHRleHR1cmUiLCBzMiksIGUyOwogICAgfSk7CiAgICByZXR1cm4gdGhpcy5zb3VyY2VDYWNoZVtlXSA9IEEyLCBBMjsKICB9CiAgYXNzaWduVGV4dHVyZShlLCB0MiwgbjIsIGkyKSB7CiAgICBjb25zdCByMiA9IHRoaXM7CiAgICByZXR1cm4gdGhpcy5nZXREZXBlbmRlbmN5KCJ0ZXh0dXJlIiwgbjIuaW5kZXgpLnRoZW4oZnVuY3Rpb24obzIpIHsKICAgICAgaWYgKCFvMikKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgaWYgKG4yLnRleENvb3JkICE9PSB1bmRlZmluZWQgJiYgbjIudGV4Q29vcmQgPiAwICYmICgobzIgPSBvMi5jbG9uZSgpKS5jaGFubmVsID0gbjIudGV4Q29vcmQpLCByMi5leHRlbnNpb25zWyRlLktIUl9URVhUVVJFX1RSQU5TRk9STV0pIHsKICAgICAgICBjb25zdCBlMiA9IG4yLmV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZCA/IG4yLmV4dGVuc2lvbnNbJGUuS0hSX1RFWFRVUkVfVFJBTlNGT1JNXSA6IHVuZGVmaW5lZDsKICAgICAgICBpZiAoZTIpIHsKICAgICAgICAgIGNvbnN0IHQzID0gcjIuYXNzb2NpYXRpb25zLmdldChvMik7CiAgICAgICAgICBvMiA9IHIyLmV4dGVuc2lvbnNbJGUuS0hSX1RFWFRVUkVfVFJBTlNGT1JNXS5leHRlbmRUZXh0dXJlKG8yLCBlMiksIHIyLmFzc29jaWF0aW9ucy5zZXQobzIsIHQzKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGkyICE9PSB1bmRlZmluZWQgJiYgKG8yLmNvbG9yU3BhY2UgPSBpMiksIGVbdDJdID0gbzIsIG8yOwogICAgfSk7CiAgfQogIGFzc2lnbkZpbmFsTWF0ZXJpYWwoZSkgewogICAgY29uc3QgdDIgPSBlLmdlb21ldHJ5OwogICAgbGV0IG4yID0gZS5tYXRlcmlhbDsKICAgIGNvbnN0IGkyID0gdDIuYXR0cmlidXRlcy50YW5nZW50ID09PSB1bmRlZmluZWQsIHIyID0gdDIuYXR0cmlidXRlcy5jb2xvciAhPT0gdW5kZWZpbmVkLCBvMiA9IHQyLmF0dHJpYnV0ZXMubm9ybWFsID09PSB1bmRlZmluZWQ7CiAgICBpZiAoZS5pc1BvaW50cykgewogICAgICBjb25zdCBlMiA9ICJQb2ludHNNYXRlcmlhbDoiICsgbjIudXVpZDsKICAgICAgbGV0IHQzID0gdGhpcy5jYWNoZS5nZXQoZTIpOwogICAgICB0MyB8fCAodDMgPSBuZXcgUmUuUG9pbnRzTWF0ZXJpYWwsIFJlLk1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwodDMsIG4yKSwgdDMuY29sb3IuY29weShuMi5jb2xvciksIHQzLm1hcCA9IG4yLm1hcCwgdDMuc2l6ZUF0dGVudWF0aW9uID0gZmFsc2UsIHRoaXMuY2FjaGUuYWRkKGUyLCB0MykpLCBuMiA9IHQzOwogICAgfSBlbHNlIGlmIChlLmlzTGluZSkgewogICAgICBjb25zdCBlMiA9ICJMaW5lQmFzaWNNYXRlcmlhbDoiICsgbjIudXVpZDsKICAgICAgbGV0IHQzID0gdGhpcy5jYWNoZS5nZXQoZTIpOwogICAgICB0MyB8fCAodDMgPSBuZXcgUmUuTGluZUJhc2ljTWF0ZXJpYWwsIFJlLk1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwodDMsIG4yKSwgdDMuY29sb3IuY29weShuMi5jb2xvciksIHQzLm1hcCA9IG4yLm1hcCwgdGhpcy5jYWNoZS5hZGQoZTIsIHQzKSksIG4yID0gdDM7CiAgICB9CiAgICBpZiAoaTIgfHwgcjIgfHwgbzIpIHsKICAgICAgbGV0IGUyID0gIkNsb25lZE1hdGVyaWFsOiIgKyBuMi51dWlkICsgIjoiOwogICAgICBpMiAmJiAoZTIgKz0gImRlcml2YXRpdmUtdGFuZ2VudHM6IiksIHIyICYmIChlMiArPSAidmVydGV4LWNvbG9yczoiKSwgbzIgJiYgKGUyICs9ICJmbGF0LXNoYWRpbmc6Iik7CiAgICAgIGxldCB0MyA9IHRoaXMuY2FjaGUuZ2V0KGUyKTsKICAgICAgdDMgfHwgKHQzID0gbjIuY2xvbmUoKSwgcjIgJiYgKHQzLnZlcnRleENvbG9ycyA9IHRydWUpLCBvMiAmJiAodDMuZmxhdFNoYWRpbmcgPSB0cnVlKSwgaTIgJiYgKHQzLm5vcm1hbFNjYWxlICYmICh0My5ub3JtYWxTY2FsZS55ICo9IC0xKSwgdDMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgJiYgKHQzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnkgKj0gLTEpKSwgdGhpcy5jYWNoZS5hZGQoZTIsIHQzKSwgdGhpcy5hc3NvY2lhdGlvbnMuc2V0KHQzLCB0aGlzLmFzc29jaWF0aW9ucy5nZXQobjIpKSksIG4yID0gdDM7CiAgICB9CiAgICBlLm1hdGVyaWFsID0gbjI7CiAgfQogIGdldE1hdGVyaWFsVHlwZSgpIHsKICAgIHJldHVybiBSZS5NZXNoU3RhbmRhcmRNYXRlcmlhbDsKICB9CiAgbG9hZE1hdGVyaWFsKGUpIHsKICAgIGNvbnN0IHQyID0gdGhpcywgbjIgPSB0aGlzLmpzb24sIGkyID0gdGhpcy5leHRlbnNpb25zLCByMiA9IG4yLm1hdGVyaWFsc1tlXTsKICAgIGxldCBvMjsKICAgIGNvbnN0IHMyID0ge30sIGEyID0gW107CiAgICBpZiAoKHIyLmV4dGVuc2lvbnMgfHwge30pWyRlLktIUl9NQVRFUklBTFNfVU5MSVRdKSB7CiAgICAgIGNvbnN0IGUyID0gaTJbJGUuS0hSX01BVEVSSUFMU19VTkxJVF07CiAgICAgIG8yID0gZTIuZ2V0TWF0ZXJpYWxUeXBlKCksIGEyLnB1c2goZTIuZXh0ZW5kUGFyYW1zKHMyLCByMiwgdDIpKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IG4zID0gcjIucGJyTWV0YWxsaWNSb3VnaG5lc3MgfHwge307CiAgICAgIGlmIChzMi5jb2xvciA9IG5ldyBSZS5Db2xvcigxLCAxLCAxKSwgczIub3BhY2l0eSA9IDEsIEFycmF5LmlzQXJyYXkobjMuYmFzZUNvbG9yRmFjdG9yKSkgewogICAgICAgIGNvbnN0IGUyID0gbjMuYmFzZUNvbG9yRmFjdG9yOwogICAgICAgIHMyLmNvbG9yLnNldFJHQihlMlswXSwgZTJbMV0sIGUyWzJdLCBSZS5MaW5lYXJTUkdCQ29sb3JTcGFjZSksIHMyLm9wYWNpdHkgPSBlMlszXTsKICAgICAgfQogICAgICBuMy5iYXNlQ29sb3JUZXh0dXJlICE9PSB1bmRlZmluZWQgJiYgYTIucHVzaCh0Mi5hc3NpZ25UZXh0dXJlKHMyLCAibWFwIiwgbjMuYmFzZUNvbG9yVGV4dHVyZSwgUmUuU1JHQkNvbG9yU3BhY2UpKSwgczIubWV0YWxuZXNzID0gbjMubWV0YWxsaWNGYWN0b3IgIT09IHVuZGVmaW5lZCA/IG4zLm1ldGFsbGljRmFjdG9yIDogMSwgczIucm91Z2huZXNzID0gbjMucm91Z2huZXNzRmFjdG9yICE9PSB1bmRlZmluZWQgPyBuMy5yb3VnaG5lc3NGYWN0b3IgOiAxLCBuMy5tZXRhbGxpY1JvdWdobmVzc1RleHR1cmUgIT09IHVuZGVmaW5lZCAmJiAoYTIucHVzaCh0Mi5hc3NpZ25UZXh0dXJlKHMyLCAibWV0YWxuZXNzTWFwIiwgbjMubWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlKSksIGEyLnB1c2godDIuYXNzaWduVGV4dHVyZShzMiwgInJvdWdobmVzc01hcCIsIG4zLm1ldGFsbGljUm91Z2huZXNzVGV4dHVyZSkpKSwgbzIgPSB0aGlzLl9pbnZva2VPbmUoZnVuY3Rpb24odDMpIHsKICAgICAgICByZXR1cm4gdDMuZ2V0TWF0ZXJpYWxUeXBlICYmIHQzLmdldE1hdGVyaWFsVHlwZShlKTsKICAgICAgfSksIGEyLnB1c2goUHJvbWlzZS5hbGwodGhpcy5faW52b2tlQWxsKGZ1bmN0aW9uKHQzKSB7CiAgICAgICAgcmV0dXJuIHQzLmV4dGVuZE1hdGVyaWFsUGFyYW1zICYmIHQzLmV4dGVuZE1hdGVyaWFsUGFyYW1zKGUsIHMyKTsKICAgICAgfSkpKTsKICAgIH0KICAgIHIyLmRvdWJsZVNpZGVkID09PSB0cnVlICYmIChzMi5zaWRlID0gUmUuRG91YmxlU2lkZSk7CiAgICBjb25zdCBBMiA9IHIyLmFscGhhTW9kZSB8fCAiT1BBUVVFIjsKICAgIGlmIChBMiA9PT0gIkJMRU5EIiA/IChzMi50cmFuc3BhcmVudCA9IHRydWUsIHMyLmRlcHRoV3JpdGUgPSBmYWxzZSkgOiAoczIudHJhbnNwYXJlbnQgPSBmYWxzZSwgQTIgPT09ICJNQVNLIiAmJiAoczIuYWxwaGFUZXN0ID0gcjIuYWxwaGFDdXRvZmYgIT09IHVuZGVmaW5lZCA/IHIyLmFscGhhQ3V0b2ZmIDogMC41KSksIHIyLm5vcm1hbFRleHR1cmUgIT09IHVuZGVmaW5lZCAmJiBvMiAhPT0gUmUuTWVzaEJhc2ljTWF0ZXJpYWwgJiYgKGEyLnB1c2godDIuYXNzaWduVGV4dHVyZShzMiwgIm5vcm1hbE1hcCIsIHIyLm5vcm1hbFRleHR1cmUpKSwgczIubm9ybWFsU2NhbGUgPSBuZXcgUmUuVmVjdG9yMigxLCAxKSwgcjIubm9ybWFsVGV4dHVyZS5zY2FsZSAhPT0gdW5kZWZpbmVkKSkgewogICAgICBjb25zdCBlMiA9IHIyLm5vcm1hbFRleHR1cmUuc2NhbGU7CiAgICAgIHMyLm5vcm1hbFNjYWxlLnNldChlMiwgZTIpOwogICAgfQogICAgaWYgKHIyLm9jY2x1c2lvblRleHR1cmUgIT09IHVuZGVmaW5lZCAmJiBvMiAhPT0gUmUuTWVzaEJhc2ljTWF0ZXJpYWwgJiYgKGEyLnB1c2godDIuYXNzaWduVGV4dHVyZShzMiwgImFvTWFwIiwgcjIub2NjbHVzaW9uVGV4dHVyZSkpLCByMi5vY2NsdXNpb25UZXh0dXJlLnN0cmVuZ3RoICE9PSB1bmRlZmluZWQgJiYgKHMyLmFvTWFwSW50ZW5zaXR5ID0gcjIub2NjbHVzaW9uVGV4dHVyZS5zdHJlbmd0aCkpLCByMi5lbWlzc2l2ZUZhY3RvciAhPT0gdW5kZWZpbmVkICYmIG8yICE9PSBSZS5NZXNoQmFzaWNNYXRlcmlhbCkgewogICAgICBjb25zdCBlMiA9IHIyLmVtaXNzaXZlRmFjdG9yOwogICAgICBzMi5lbWlzc2l2ZSA9IG5ldyBSZS5Db2xvcigpLnNldFJHQihlMlswXSwgZTJbMV0sIGUyWzJdLCBSZS5MaW5lYXJTUkdCQ29sb3JTcGFjZSk7CiAgICB9CiAgICByZXR1cm4gcjIuZW1pc3NpdmVUZXh0dXJlICE9PSB1bmRlZmluZWQgJiYgbzIgIT09IFJlLk1lc2hCYXNpY01hdGVyaWFsICYmIGEyLnB1c2godDIuYXNzaWduVGV4dHVyZShzMiwgImVtaXNzaXZlTWFwIiwgcjIuZW1pc3NpdmVUZXh0dXJlLCBSZS5TUkdCQ29sb3JTcGFjZSkpLCBQcm9taXNlLmFsbChhMikudGhlbihmdW5jdGlvbigpIHsKICAgICAgY29uc3QgbjMgPSBuZXcgbzIoczIpOwogICAgICByZXR1cm4gcjIubmFtZSAmJiAobjMubmFtZSA9IHIyLm5hbWUpLCBVdChuMywgcjIpLCB0Mi5hc3NvY2lhdGlvbnMuc2V0KG4zLCB7IG1hdGVyaWFsczogZSB9KSwgcjIuZXh0ZW5zaW9ucyAmJiBGdChpMiwgbjMsIHIyKSwgbjM7CiAgICB9KTsKICB9CiAgY3JlYXRlVW5pcXVlTmFtZShlKSB7CiAgICBjb25zdCB0MiA9IFJlLlByb3BlcnR5QmluZGluZy5zYW5pdGl6ZU5vZGVOYW1lKGUgfHwgIiIpOwogICAgcmV0dXJuIHQyIGluIHRoaXMubm9kZU5hbWVzVXNlZCA/IHQyICsgIl8iICsgKyt0aGlzLm5vZGVOYW1lc1VzZWRbdDJdIDogKHRoaXMubm9kZU5hbWVzVXNlZFt0Ml0gPSAwLCB0Mik7CiAgfQogIGxvYWRHZW9tZXRyaWVzKGUpIHsKICAgIGNvbnN0IHQyID0gdGhpcywgbjIgPSB0aGlzLmV4dGVuc2lvbnMsIGkyID0gdGhpcy5wcmltaXRpdmVDYWNoZTsKICAgIGZ1bmN0aW9uIHIyKGUyKSB7CiAgICAgIHJldHVybiBuMlskZS5LSFJfRFJBQ09fTUVTSF9DT01QUkVTU0lPTl0uZGVjb2RlUHJpbWl0aXZlKGUyLCB0MikudGhlbihmdW5jdGlvbihuMykgewogICAgICAgIHJldHVybiBIdChuMywgZTIsIHQyKTsKICAgICAgfSk7CiAgICB9CiAgICBjb25zdCBvMiA9IFtdOwogICAgZm9yIChsZXQgbjMgPSAwLCBzMiA9IGUubGVuZ3RoO24zIDwgczI7IG4zKyspIHsKICAgICAgY29uc3QgczMgPSBlW24zXSwgYTIgPSBQdChzMyksIEEyID0gaTJbYTJdOwogICAgICBpZiAoQTIpCiAgICAgICAgbzIucHVzaChBMi5wcm9taXNlKTsKICAgICAgZWxzZSB7CiAgICAgICAgbGV0IGUyOwogICAgICAgIGUyID0gczMuZXh0ZW5zaW9ucyAmJiBzMy5leHRlbnNpb25zWyRlLktIUl9EUkFDT19NRVNIX0NPTVBSRVNTSU9OXSA/IHIyKHMzKSA6IEh0KG5ldyBSZS5CdWZmZXJHZW9tZXRyeSwgczMsIHQyKSwgaTJbYTJdID0geyBwcmltaXRpdmU6IHMzLCBwcm9taXNlOiBlMiB9LCBvMi5wdXNoKGUyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIFByb21pc2UuYWxsKG8yKTsKICB9CiAgbG9hZE1lc2goZSkgewogICAgY29uc3QgdDIgPSB0aGlzLCBuMiA9IHRoaXMuanNvbiwgaTIgPSB0aGlzLmV4dGVuc2lvbnMsIHIyID0gbjIubWVzaGVzW2VdLCBvMiA9IHIyLnByaW1pdGl2ZXMsIHMyID0gW107CiAgICBmb3IgKGxldCBlMiA9IDAsIHQzID0gbzIubGVuZ3RoO2UyIDwgdDM7IGUyKyspIHsKICAgICAgY29uc3QgdDQgPSBvMltlMl0ubWF0ZXJpYWwgPT09IHVuZGVmaW5lZCA/IFJ0KHRoaXMuY2FjaGUpIDogdGhpcy5nZXREZXBlbmRlbmN5KCJtYXRlcmlhbCIsIG8yW2UyXS5tYXRlcmlhbCk7CiAgICAgIHMyLnB1c2godDQpOwogICAgfQogICAgcmV0dXJuIHMyLnB1c2godDIubG9hZEdlb21ldHJpZXMobzIpKSwgUHJvbWlzZS5hbGwoczIpLnRoZW4oZnVuY3Rpb24objMpIHsKICAgICAgY29uc3QgczMgPSBuMy5zbGljZSgwLCBuMy5sZW5ndGggLSAxKSwgYTIgPSBuM1tuMy5sZW5ndGggLSAxXSwgQTIgPSBbXTsKICAgICAgZm9yIChsZXQgbjQgPSAwLCBsMyA9IGEyLmxlbmd0aDtuNCA8IGwzOyBuNCsrKSB7CiAgICAgICAgY29uc3QgbDQgPSBhMltuNF0sIGMyID0gbzJbbjRdOwogICAgICAgIGxldCBoMjsKICAgICAgICBjb25zdCBkMiA9IHMzW240XTsKICAgICAgICBpZiAoYzIubW9kZSA9PT0geHQuVFJJQU5HTEVTIHx8IGMyLm1vZGUgPT09IHh0LlRSSUFOR0xFX1NUUklQIHx8IGMyLm1vZGUgPT09IHh0LlRSSUFOR0xFX0ZBTiB8fCBjMi5tb2RlID09PSB1bmRlZmluZWQpCiAgICAgICAgICBoMiA9IHIyLmlzU2tpbm5lZE1lc2ggPT09IHRydWUgPyBuZXcgUmUuU2tpbm5lZE1lc2gobDQsIGQyKSA6IG5ldyBSZS5NZXNoKGw0LCBkMiksIGgyLmlzU2tpbm5lZE1lc2ggPT09IHRydWUgJiYgaDIubm9ybWFsaXplU2tpbldlaWdodHMoKSwgYzIubW9kZSA9PT0geHQuVFJJQU5HTEVfU1RSSVAgPyBoMi5nZW9tZXRyeSA9IFllKGgyLmdlb21ldHJ5LCBSZS5UcmlhbmdsZVN0cmlwRHJhd01vZGUpIDogYzIubW9kZSA9PT0geHQuVFJJQU5HTEVfRkFOICYmIChoMi5nZW9tZXRyeSA9IFllKGgyLmdlb21ldHJ5LCBSZS5UcmlhbmdsZUZhbkRyYXdNb2RlKSk7CiAgICAgICAgZWxzZSBpZiAoYzIubW9kZSA9PT0geHQuTElORVMpCiAgICAgICAgICBoMiA9IG5ldyBSZS5MaW5lU2VnbWVudHMobDQsIGQyKTsKICAgICAgICBlbHNlIGlmIChjMi5tb2RlID09PSB4dC5MSU5FX1NUUklQKQogICAgICAgICAgaDIgPSBuZXcgUmUuTGluZShsNCwgZDIpOwogICAgICAgIGVsc2UgaWYgKGMyLm1vZGUgPT09IHh0LkxJTkVfTE9PUCkKICAgICAgICAgIGgyID0gbmV3IFJlLkxpbmVMb29wKGw0LCBkMik7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBpZiAoYzIubW9kZSAhPT0geHQuUE9JTlRTKQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkdMVEZMb2FkZXI6IFByaW1pdGl2ZSBtb2RlIHVuc3VwcG9ydGVkOiAiICsgYzIubW9kZSk7CiAgICAgICAgICBoMiA9IG5ldyBSZS5Qb2ludHMobDQsIGQyKTsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmtleXMoaDIuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzKS5sZW5ndGggPiAwICYmIE90KGgyLCByMiksIGgyLm5hbWUgPSB0Mi5jcmVhdGVVbmlxdWVOYW1lKHIyLm5hbWUgfHwgIm1lc2hfIiArIGUpLCBVdChoMiwgcjIpLCBjMi5leHRlbnNpb25zICYmIEZ0KGkyLCBoMiwgYzIpLCB0Mi5hc3NpZ25GaW5hbE1hdGVyaWFsKGgyKSwgQTIucHVzaChoMik7CiAgICAgIH0KICAgICAgZm9yIChsZXQgbjQgPSAwLCBpMyA9IEEyLmxlbmd0aDtuNCA8IGkzOyBuNCsrKQogICAgICAgIHQyLmFzc29jaWF0aW9ucy5zZXQoQTJbbjRdLCB7IG1lc2hlczogZSwgcHJpbWl0aXZlczogbjQgfSk7CiAgICAgIGlmIChBMi5sZW5ndGggPT09IDEpCiAgICAgICAgcmV0dXJuIHIyLmV4dGVuc2lvbnMgJiYgRnQoaTIsIEEyWzBdLCByMiksIEEyWzBdOwogICAgICBjb25zdCBsMiA9IG5ldyBSZS5Hcm91cDsKICAgICAgcjIuZXh0ZW5zaW9ucyAmJiBGdChpMiwgbDIsIHIyKSwgdDIuYXNzb2NpYXRpb25zLnNldChsMiwgeyBtZXNoZXM6IGUgfSk7CiAgICAgIGZvciAobGV0IGUyID0gMCwgdDMgPSBBMi5sZW5ndGg7ZTIgPCB0MzsgZTIrKykKICAgICAgICBsMi5hZGQoQTJbZTJdKTsKICAgICAgcmV0dXJuIGwyOwogICAgfSk7CiAgfQogIGxvYWRDYW1lcmEoZSkgewogICAgbGV0IHQyOwogICAgY29uc3QgbjIgPSB0aGlzLmpzb24uY2FtZXJhc1tlXSwgaTIgPSBuMltuMi50eXBlXTsKICAgIGlmIChpMikKICAgICAgcmV0dXJuIG4yLnR5cGUgPT09ICJwZXJzcGVjdGl2ZSIgPyB0MiA9IG5ldyBSZS5QZXJzcGVjdGl2ZUNhbWVyYShSZS5NYXRoVXRpbHMucmFkVG9EZWcoaTIueWZvdiksIGkyLmFzcGVjdFJhdGlvIHx8IDEsIGkyLnpuZWFyIHx8IDEsIGkyLnpmYXIgfHwgMjAwMDAwMCkgOiBuMi50eXBlID09PSAib3J0aG9ncmFwaGljIiAmJiAodDIgPSBuZXcgUmUuT3J0aG9ncmFwaGljQ2FtZXJhKC1pMi54bWFnLCBpMi54bWFnLCBpMi55bWFnLCAtaTIueW1hZywgaTIuem5lYXIsIGkyLnpmYXIpKSwgbjIubmFtZSAmJiAodDIubmFtZSA9IHRoaXMuY3JlYXRlVW5pcXVlTmFtZShuMi5uYW1lKSksIFV0KHQyLCBuMiksIFByb21pc2UucmVzb2x2ZSh0Mik7CiAgICBjb25zb2xlLndhcm4oIlRIUkVFLkdMVEZMb2FkZXI6IE1pc3NpbmcgY2FtZXJhIHBhcmFtZXRlcnMuIik7CiAgfQogIGxvYWRTa2luKGUpIHsKICAgIGNvbnN0IHQyID0gdGhpcy5qc29uLnNraW5zW2VdLCBuMiA9IFtdOwogICAgZm9yIChsZXQgZTIgPSAwLCBpMiA9IHQyLmpvaW50cy5sZW5ndGg7ZTIgPCBpMjsgZTIrKykKICAgICAgbjIucHVzaCh0aGlzLl9sb2FkTm9kZVNoYWxsb3codDIuam9pbnRzW2UyXSkpOwogICAgcmV0dXJuIHQyLmludmVyc2VCaW5kTWF0cmljZXMgIT09IHVuZGVmaW5lZCA/IG4yLnB1c2godGhpcy5nZXREZXBlbmRlbmN5KCJhY2Nlc3NvciIsIHQyLmludmVyc2VCaW5kTWF0cmljZXMpKSA6IG4yLnB1c2gobnVsbCksIFByb21pc2UuYWxsKG4yKS50aGVuKGZ1bmN0aW9uKGUyKSB7CiAgICAgIGNvbnN0IG4zID0gZTIucG9wKCksIGkyID0gZTIsIHIyID0gW10sIG8yID0gW107CiAgICAgIGZvciAobGV0IGUzID0gMCwgczIgPSBpMi5sZW5ndGg7ZTMgPCBzMjsgZTMrKykgewogICAgICAgIGNvbnN0IHMzID0gaTJbZTNdOwogICAgICAgIGlmIChzMykgewogICAgICAgICAgcjIucHVzaChzMyk7CiAgICAgICAgICBjb25zdCB0MyA9IG5ldyBSZS5NYXRyaXg0OwogICAgICAgICAgbjMgIT09IG51bGwgJiYgdDMuZnJvbUFycmF5KG4zLmFycmF5LCAxNiAqIGUzKSwgbzIucHVzaCh0Myk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICBjb25zb2xlLndhcm4oJ1RIUkVFLkdMVEZMb2FkZXI6IEpvaW50ICIlcyIgY291bGQgbm90IGJlIGZvdW5kLicsIHQyLmpvaW50c1tlM10pOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgUmUuU2tlbGV0b24ocjIsIG8yKTsKICAgIH0pOwogIH0KICBsb2FkQW5pbWF0aW9uKGUpIHsKICAgIGNvbnN0IHQyID0gdGhpcy5qc29uLCBuMiA9IHRoaXMsIGkyID0gdDIuYW5pbWF0aW9uc1tlXSwgcjIgPSBpMi5uYW1lID8gaTIubmFtZSA6ICJhbmltYXRpb25fIiArIGUsIG8yID0gW10sIHMyID0gW10sIGEyID0gW10sIEEyID0gW10sIGwyID0gW107CiAgICBmb3IgKGxldCBlMiA9IDAsIHQzID0gaTIuY2hhbm5lbHMubGVuZ3RoO2UyIDwgdDM7IGUyKyspIHsKICAgICAgY29uc3QgdDQgPSBpMi5jaGFubmVsc1tlMl0sIG4zID0gaTIuc2FtcGxlcnNbdDQuc2FtcGxlcl0sIHIzID0gdDQudGFyZ2V0LCBjMiA9IHIzLm5vZGUsIGgyID0gaTIucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkID8gaTIucGFyYW1ldGVyc1tuMy5pbnB1dF0gOiBuMy5pbnB1dCwgZDIgPSBpMi5wYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgPyBpMi5wYXJhbWV0ZXJzW24zLm91dHB1dF0gOiBuMy5vdXRwdXQ7CiAgICAgIHIzLm5vZGUgIT09IHVuZGVmaW5lZCAmJiAobzIucHVzaCh0aGlzLmdldERlcGVuZGVuY3koIm5vZGUiLCBjMikpLCBzMi5wdXNoKHRoaXMuZ2V0RGVwZW5kZW5jeSgiYWNjZXNzb3IiLCBoMikpLCBhMi5wdXNoKHRoaXMuZ2V0RGVwZW5kZW5jeSgiYWNjZXNzb3IiLCBkMikpLCBBMi5wdXNoKG4zKSwgbDIucHVzaChyMykpOwogICAgfQogICAgcmV0dXJuIFByb21pc2UuYWxsKFtQcm9taXNlLmFsbChvMiksIFByb21pc2UuYWxsKHMyKSwgUHJvbWlzZS5hbGwoYTIpLCBQcm9taXNlLmFsbChBMiksIFByb21pc2UuYWxsKGwyKV0pLnRoZW4oZnVuY3Rpb24oZTIpIHsKICAgICAgY29uc3QgdDMgPSBlMlswXSwgaTMgPSBlMlsxXSwgbzMgPSBlMlsyXSwgczMgPSBlMlszXSwgYTMgPSBlMls0XSwgQTMgPSBbXTsKICAgICAgZm9yIChsZXQgZTMgPSAwLCByMyA9IHQzLmxlbmd0aDtlMyA8IHIzOyBlMysrKSB7CiAgICAgICAgY29uc3QgcjQgPSB0M1tlM10sIGwzID0gaTNbZTNdLCBjMiA9IG8zW2UzXSwgaDIgPSBzM1tlM10sIGQyID0gYTNbZTNdOwogICAgICAgIGlmIChyNCA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgY29udGludWU7CiAgICAgICAgcjQudXBkYXRlTWF0cml4ICYmIHI0LnVwZGF0ZU1hdHJpeCgpOwogICAgICAgIGNvbnN0IHUyID0gbjIuX2NyZWF0ZUFuaW1hdGlvblRyYWNrcyhyNCwgbDMsIGMyLCBoMiwgZDIpOwogICAgICAgIGlmICh1MikKICAgICAgICAgIGZvciAobGV0IGU0ID0gMDtlNCA8IHUyLmxlbmd0aDsgZTQrKykKICAgICAgICAgICAgQTMucHVzaCh1MltlNF0pOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgUmUuQW5pbWF0aW9uQ2xpcChyMiwgdW5kZWZpbmVkLCBBMyk7CiAgICB9KTsKICB9CiAgY3JlYXRlTm9kZU1lc2goZSkgewogICAgY29uc3QgdDIgPSB0aGlzLmpzb24sIG4yID0gdGhpcywgaTIgPSB0Mi5ub2Rlc1tlXTsKICAgIHJldHVybiBpMi5tZXNoID09PSB1bmRlZmluZWQgPyBudWxsIDogbjIuZ2V0RGVwZW5kZW5jeSgibWVzaCIsIGkyLm1lc2gpLnRoZW4oZnVuY3Rpb24oZTIpIHsKICAgICAgY29uc3QgdDMgPSBuMi5fZ2V0Tm9kZVJlZihuMi5tZXNoQ2FjaGUsIGkyLm1lc2gsIGUyKTsKICAgICAgcmV0dXJuIGkyLndlaWdodHMgIT09IHVuZGVmaW5lZCAmJiB0My50cmF2ZXJzZShmdW5jdGlvbihlMykgewogICAgICAgIGlmIChlMy5pc01lc2gpCiAgICAgICAgICBmb3IgKGxldCB0NCA9IDAsIG4zID0gaTIud2VpZ2h0cy5sZW5ndGg7dDQgPCBuMzsgdDQrKykKICAgICAgICAgICAgZTMubW9ycGhUYXJnZXRJbmZsdWVuY2VzW3Q0XSA9IGkyLndlaWdodHNbdDRdOwogICAgICB9KSwgdDM7CiAgICB9KTsKICB9CiAgbG9hZE5vZGUoZSkgewogICAgY29uc3QgdDIgPSB0aGlzLCBuMiA9IHRoaXMuanNvbi5ub2Rlc1tlXSwgaTIgPSB0Mi5fbG9hZE5vZGVTaGFsbG93KGUpLCByMiA9IFtdLCBvMiA9IG4yLmNoaWxkcmVuIHx8IFtdOwogICAgZm9yIChsZXQgZTIgPSAwLCBuMyA9IG8yLmxlbmd0aDtlMiA8IG4zOyBlMisrKQogICAgICByMi5wdXNoKHQyLmdldERlcGVuZGVuY3koIm5vZGUiLCBvMltlMl0pKTsKICAgIGNvbnN0IHMyID0gbjIuc2tpbiA9PT0gdW5kZWZpbmVkID8gUHJvbWlzZS5yZXNvbHZlKG51bGwpIDogdDIuZ2V0RGVwZW5kZW5jeSgic2tpbiIsIG4yLnNraW4pOwogICAgcmV0dXJuIFByb21pc2UuYWxsKFtpMiwgUHJvbWlzZS5hbGwocjIpLCBzMl0pLnRoZW4oZnVuY3Rpb24oZTIpIHsKICAgICAgY29uc3QgdDMgPSBlMlswXSwgbjMgPSBlMlsxXSwgaTMgPSBlMlsyXTsKICAgICAgaTMgIT09IG51bGwgJiYgdDMudHJhdmVyc2UoZnVuY3Rpb24oZTMpIHsKICAgICAgICBlMy5pc1NraW5uZWRNZXNoICYmIGUzLmJpbmQoaTMsIGp0KTsKICAgICAgfSk7CiAgICAgIGZvciAobGV0IGUzID0gMCwgaTQgPSBuMy5sZW5ndGg7ZTMgPCBpNDsgZTMrKykKICAgICAgICB0My5hZGQobjNbZTNdKTsKICAgICAgcmV0dXJuIHQzOwogICAgfSk7CiAgfQogIF9sb2FkTm9kZVNoYWxsb3coZSkgewogICAgY29uc3QgdDIgPSB0aGlzLmpzb24sIG4yID0gdGhpcy5leHRlbnNpb25zLCBpMiA9IHRoaXM7CiAgICBpZiAodGhpcy5ub2RlQ2FjaGVbZV0gIT09IHVuZGVmaW5lZCkKICAgICAgcmV0dXJuIHRoaXMubm9kZUNhY2hlW2VdOwogICAgY29uc3QgcjIgPSB0Mi5ub2Rlc1tlXSwgbzIgPSByMi5uYW1lID8gaTIuY3JlYXRlVW5pcXVlTmFtZShyMi5uYW1lKSA6ICIiLCBzMiA9IFtdLCBhMiA9IGkyLl9pbnZva2VPbmUoZnVuY3Rpb24odDMpIHsKICAgICAgcmV0dXJuIHQzLmNyZWF0ZU5vZGVNZXNoICYmIHQzLmNyZWF0ZU5vZGVNZXNoKGUpOwogICAgfSk7CiAgICByZXR1cm4gYTIgJiYgczIucHVzaChhMiksIHIyLmNhbWVyYSAhPT0gdW5kZWZpbmVkICYmIHMyLnB1c2goaTIuZ2V0RGVwZW5kZW5jeSgiY2FtZXJhIiwgcjIuY2FtZXJhKS50aGVuKGZ1bmN0aW9uKGUyKSB7CiAgICAgIHJldHVybiBpMi5fZ2V0Tm9kZVJlZihpMi5jYW1lcmFDYWNoZSwgcjIuY2FtZXJhLCBlMik7CiAgICB9KSksIGkyLl9pbnZva2VBbGwoZnVuY3Rpb24odDMpIHsKICAgICAgcmV0dXJuIHQzLmNyZWF0ZU5vZGVBdHRhY2htZW50ICYmIHQzLmNyZWF0ZU5vZGVBdHRhY2htZW50KGUpOwogICAgfSkuZm9yRWFjaChmdW5jdGlvbihlMikgewogICAgICBzMi5wdXNoKGUyKTsKICAgIH0pLCB0aGlzLm5vZGVDYWNoZVtlXSA9IFByb21pc2UuYWxsKHMyKS50aGVuKGZ1bmN0aW9uKHQzKSB7CiAgICAgIGxldCBzMzsKICAgICAgaWYgKHMzID0gcjIuaXNCb25lID09PSB0cnVlID8gbmV3IFJlLkJvbmUgOiB0My5sZW5ndGggPiAxID8gbmV3IFJlLkdyb3VwIDogdDMubGVuZ3RoID09PSAxID8gdDNbMF0gOiBuZXcgUmUuT2JqZWN0M0QsIHMzICE9PSB0M1swXSkKICAgICAgICBmb3IgKGxldCBlMiA9IDAsIG4zID0gdDMubGVuZ3RoO2UyIDwgbjM7IGUyKyspCiAgICAgICAgICBzMy5hZGQodDNbZTJdKTsKICAgICAgaWYgKHIyLm5hbWUgJiYgKHMzLnVzZXJEYXRhLm5hbWUgPSByMi5uYW1lLCBzMy5uYW1lID0gbzIpLCBVdChzMywgcjIpLCByMi5leHRlbnNpb25zICYmIEZ0KG4yLCBzMywgcjIpLCByMi5tYXRyaXggIT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbnN0IGUyID0gbmV3IFJlLk1hdHJpeDQ7CiAgICAgICAgZTIuZnJvbUFycmF5KHIyLm1hdHJpeCksIHMzLmFwcGx5TWF0cml4NChlMik7CiAgICAgIH0gZWxzZQogICAgICAgIHIyLnRyYW5zbGF0aW9uICE9PSB1bmRlZmluZWQgJiYgczMucG9zaXRpb24uZnJvbUFycmF5KHIyLnRyYW5zbGF0aW9uKSwgcjIucm90YXRpb24gIT09IHVuZGVmaW5lZCAmJiBzMy5xdWF0ZXJuaW9uLmZyb21BcnJheShyMi5yb3RhdGlvbiksIHIyLnNjYWxlICE9PSB1bmRlZmluZWQgJiYgczMuc2NhbGUuZnJvbUFycmF5KHIyLnNjYWxlKTsKICAgICAgcmV0dXJuIGkyLmFzc29jaWF0aW9ucy5oYXMoczMpIHx8IGkyLmFzc29jaWF0aW9ucy5zZXQoczMsIHt9KSwgaTIuYXNzb2NpYXRpb25zLmdldChzMykubm9kZXMgPSBlLCBzMzsKICAgIH0pLCB0aGlzLm5vZGVDYWNoZVtlXTsKICB9CiAgbG9hZFNjZW5lKGUpIHsKICAgIGNvbnN0IHQyID0gdGhpcy5leHRlbnNpb25zLCBuMiA9IHRoaXMuanNvbi5zY2VuZXNbZV0sIGkyID0gdGhpcywgcjIgPSBuZXcgUmUuR3JvdXA7CiAgICBuMi5uYW1lICYmIChyMi5uYW1lID0gaTIuY3JlYXRlVW5pcXVlTmFtZShuMi5uYW1lKSksIFV0KHIyLCBuMiksIG4yLmV4dGVuc2lvbnMgJiYgRnQodDIsIHIyLCBuMik7CiAgICBjb25zdCBvMiA9IG4yLm5vZGVzIHx8IFtdLCBzMiA9IFtdOwogICAgZm9yIChsZXQgZTIgPSAwLCB0MyA9IG8yLmxlbmd0aDtlMiA8IHQzOyBlMisrKQogICAgICBzMi5wdXNoKGkyLmdldERlcGVuZGVuY3koIm5vZGUiLCBvMltlMl0pKTsKICAgIHJldHVybiBQcm9taXNlLmFsbChzMikudGhlbihmdW5jdGlvbihlMikgewogICAgICBmb3IgKGxldCB0MyA9IDAsIG4zID0gZTIubGVuZ3RoO3QzIDwgbjM7IHQzKyspCiAgICAgICAgcjIuYWRkKGUyW3QzXSk7CiAgICAgIHJldHVybiBpMi5hc3NvY2lhdGlvbnMgPSAoKGUzKSA9PiB7CiAgICAgICAgY29uc3QgdDMgPSBuZXcgTWFwOwogICAgICAgIGZvciAoY29uc3QgW2U0LCBuM10gb2YgaTIuYXNzb2NpYXRpb25zKQogICAgICAgICAgKGU0IGluc3RhbmNlb2YgUmUuTWF0ZXJpYWwgfHwgZTQgaW5zdGFuY2VvZiBSZS5UZXh0dXJlKSAmJiB0My5zZXQoZTQsIG4zKTsKICAgICAgICByZXR1cm4gZTMudHJhdmVyc2UoKGU0KSA9PiB7CiAgICAgICAgICBjb25zdCBuMyA9IGkyLmFzc29jaWF0aW9ucy5nZXQoZTQpOwogICAgICAgICAgbjMgIT0gbnVsbCAmJiB0My5zZXQoZTQsIG4zKTsKICAgICAgICB9KSwgdDM7CiAgICAgIH0pKHIyKSwgcjI7CiAgICB9KTsKICB9CiAgX2NyZWF0ZUFuaW1hdGlvblRyYWNrcyhlLCB0MiwgbjIsIGkyLCByMikgewogICAgY29uc3QgbzIgPSBbXSwgczIgPSBlLm5hbWUgPyBlLm5hbWUgOiBlLnV1aWQsIGEyID0gW107CiAgICBsZXQgQTI7CiAgICBzd2l0Y2ggKGt0W3IyLnBhdGhdID09PSBrdC53ZWlnaHRzID8gZS50cmF2ZXJzZShmdW5jdGlvbihlMikgewogICAgICBlMi5tb3JwaFRhcmdldEluZmx1ZW5jZXMgJiYgYTIucHVzaChlMi5uYW1lID8gZTIubmFtZSA6IGUyLnV1aWQpOwogICAgfSkgOiBhMi5wdXNoKHMyKSwga3RbcjIucGF0aF0pIHsKICAgICAgY2FzZSBrdC53ZWlnaHRzOgogICAgICAgIEEyID0gUmUuTnVtYmVyS2V5ZnJhbWVUcmFjazsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBrdC5yb3RhdGlvbjoKICAgICAgICBBMiA9IFJlLlF1YXRlcm5pb25LZXlmcmFtZVRyYWNrOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIGt0LnBvc2l0aW9uOgogICAgICBjYXNlIGt0LnNjYWxlOgogICAgICAgIEEyID0gUmUuVmVjdG9yS2V5ZnJhbWVUcmFjazsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBBMiA9IG4yLml0ZW1TaXplID09PSAxID8gUmUuTnVtYmVyS2V5ZnJhbWVUcmFjayA6IFJlLlZlY3RvcktleWZyYW1lVHJhY2s7CiAgICB9CiAgICBjb25zdCBsMiA9IGkyLmludGVycG9sYXRpb24gIT09IHVuZGVmaW5lZCA/IFR0W2kyLmludGVycG9sYXRpb25dIDogUmUuSW50ZXJwb2xhdGVMaW5lYXIsIGMyID0gdGhpcy5fZ2V0QXJyYXlGcm9tQWNjZXNzb3IobjIpOwogICAgZm9yIChsZXQgZTIgPSAwLCBuMyA9IGEyLmxlbmd0aDtlMiA8IG4zOyBlMisrKSB7CiAgICAgIGNvbnN0IG40ID0gbmV3IEEyKGEyW2UyXSArICIuIiArIGt0W3IyLnBhdGhdLCB0Mi5hcnJheSwgYzIsIGwyKTsKICAgICAgaTIuaW50ZXJwb2xhdGlvbiA9PT0gIkNVQklDU1BMSU5FIiAmJiB0aGlzLl9jcmVhdGVDdWJpY1NwbGluZVRyYWNrSW50ZXJwb2xhbnQobjQpLCBvMi5wdXNoKG40KTsKICAgIH0KICAgIHJldHVybiBvMjsKICB9CiAgX2dldEFycmF5RnJvbUFjY2Vzc29yKGUpIHsKICAgIGxldCB0MiA9IGUuYXJyYXk7CiAgICBpZiAoZS5ub3JtYWxpemVkKSB7CiAgICAgIGNvbnN0IGUyID0gTnQodDIuY29uc3RydWN0b3IpLCBuMiA9IG5ldyBGbG9hdDMyQXJyYXkodDIubGVuZ3RoKTsKICAgICAgZm9yIChsZXQgaTIgPSAwLCByMiA9IHQyLmxlbmd0aDtpMiA8IHIyOyBpMisrKQogICAgICAgIG4yW2kyXSA9IHQyW2kyXSAqIGUyOwogICAgICB0MiA9IG4yOwogICAgfQogICAgcmV0dXJuIHQyOwogIH0KICBfY3JlYXRlQ3ViaWNTcGxpbmVUcmFja0ludGVycG9sYW50KGUpIHsKICAgIGUuY3JlYXRlSW50ZXJwb2xhbnQgPSBmdW5jdGlvbihlMikgewogICAgICByZXR1cm4gbmV3ICh0aGlzIGluc3RhbmNlb2YgUmUuUXVhdGVybmlvbktleWZyYW1lVHJhY2sgPyB3dCA6IHl0KSh0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSAvIDMsIGUyKTsKICAgIH0sIGUuY3JlYXRlSW50ZXJwb2xhbnQuaXNJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUgPSB0cnVlOwogIH0KfQpmdW5jdGlvbiBIdChlLCB0MiwgbjIpIHsKICBjb25zdCBpMiA9IHQyLmF0dHJpYnV0ZXMsIHIyID0gW107CiAgZnVuY3Rpb24gbzIodDMsIGkzKSB7CiAgICByZXR1cm4gbjIuZ2V0RGVwZW5kZW5jeSgiYWNjZXNzb3IiLCB0MykudGhlbihmdW5jdGlvbih0NCkgewogICAgICBlLnNldEF0dHJpYnV0ZShpMywgdDQpOwogICAgfSk7CiAgfQogIGZvciAoY29uc3QgdDMgaW4gaTIpIHsKICAgIGNvbnN0IG4zID0gRHRbdDNdIHx8IHQzLnRvTG93ZXJDYXNlKCk7CiAgICBuMyBpbiBlLmF0dHJpYnV0ZXMgfHwgcjIucHVzaChvMihpMlt0M10sIG4zKSk7CiAgfQogIGlmICh0Mi5pbmRpY2VzICE9PSB1bmRlZmluZWQgJiYgIWUuaW5kZXgpIHsKICAgIGNvbnN0IGkzID0gbjIuZ2V0RGVwZW5kZW5jeSgiYWNjZXNzb3IiLCB0Mi5pbmRpY2VzKS50aGVuKGZ1bmN0aW9uKHQzKSB7CiAgICAgIGUuc2V0SW5kZXgodDMpOwogICAgfSk7CiAgICByMi5wdXNoKGkzKTsKICB9CiAgcmV0dXJuIFJlLkNvbG9yTWFuYWdlbWVudC53b3JraW5nQ29sb3JTcGFjZSAhPT0gUmUuTGluZWFyU1JHQkNvbG9yU3BhY2UgJiYgIkNPTE9SXzAiIGluIGkyICYmIGNvbnNvbGUud2FybihgVEhSRUUuR0xURkxvYWRlcjogQ29udmVydGluZyB2ZXJ0ZXggY29sb3JzIGZyb20gInNyZ2ItbGluZWFyIiB0byAiJHtSZS5Db2xvck1hbmFnZW1lbnQud29ya2luZ0NvbG9yU3BhY2V9IiBub3Qgc3VwcG9ydGVkLmApLCBVdChlLCB0MiksIGZ1bmN0aW9uKGUyLCB0MywgbjMpIHsKICAgIGNvbnN0IGkzID0gdDMuYXR0cmlidXRlcywgcjMgPSBuZXcgUmUuQm94MzsKICAgIGlmIChpMy5QT1NJVElPTiA9PT0gdW5kZWZpbmVkKQogICAgICByZXR1cm47CiAgICB7CiAgICAgIGNvbnN0IGUzID0gbjMuanNvbi5hY2Nlc3NvcnNbaTMuUE9TSVRJT05dLCB0NCA9IGUzLm1pbiwgbzQgPSBlMy5tYXg7CiAgICAgIGlmICh0NCA9PT0gdW5kZWZpbmVkIHx8IG80ID09PSB1bmRlZmluZWQpCiAgICAgICAgcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJUSFJFRS5HTFRGTG9hZGVyOiBNaXNzaW5nIG1pbi9tYXggcHJvcGVydGllcyBmb3IgYWNjZXNzb3IgUE9TSVRJT04uIik7CiAgICAgIGlmIChyMy5zZXQobmV3IFJlLlZlY3RvcjModDRbMF0sIHQ0WzFdLCB0NFsyXSksIG5ldyBSZS5WZWN0b3IzKG80WzBdLCBvNFsxXSwgbzRbMl0pKSwgZTMubm9ybWFsaXplZCkgewogICAgICAgIGNvbnN0IHQ1ID0gTnQoUXRbZTMuY29tcG9uZW50VHlwZV0pOwogICAgICAgIHIzLm1pbi5tdWx0aXBseVNjYWxhcih0NSksIHIzLm1heC5tdWx0aXBseVNjYWxhcih0NSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG8zID0gdDMudGFyZ2V0czsKICAgIGlmIChvMyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnN0IGUzID0gbmV3IFJlLlZlY3RvcjMsIHQ0ID0gbmV3IFJlLlZlY3RvcjM7CiAgICAgIGZvciAobGV0IGk0ID0gMCwgcjQgPSBvMy5sZW5ndGg7aTQgPCByNDsgaTQrKykgewogICAgICAgIGNvbnN0IHI1ID0gbzNbaTRdOwogICAgICAgIGlmIChyNS5QT1NJVElPTiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBjb25zdCBpNSA9IG4zLmpzb24uYWNjZXNzb3JzW3I1LlBPU0lUSU9OXSwgbzQgPSBpNS5taW4sIHMzID0gaTUubWF4OwogICAgICAgICAgaWYgKG80ICE9PSB1bmRlZmluZWQgJiYgczMgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAodDQuc2V0WChNYXRoLm1heChNYXRoLmFicyhvNFswXSksIE1hdGguYWJzKHMzWzBdKSkpLCB0NC5zZXRZKE1hdGgubWF4KE1hdGguYWJzKG80WzFdKSwgTWF0aC5hYnMoczNbMV0pKSksIHQ0LnNldFooTWF0aC5tYXgoTWF0aC5hYnMobzRbMl0pLCBNYXRoLmFicyhzM1syXSkpKSwgaTUubm9ybWFsaXplZCkgewogICAgICAgICAgICAgIGNvbnN0IGU0ID0gTnQoUXRbaTUuY29tcG9uZW50VHlwZV0pOwogICAgICAgICAgICAgIHQ0Lm11bHRpcGx5U2NhbGFyKGU0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlMy5tYXgodDQpOwogICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIGNvbnNvbGUud2FybigiVEhSRUUuR0xURkxvYWRlcjogTWlzc2luZyBtaW4vbWF4IHByb3BlcnRpZXMgZm9yIGFjY2Vzc29yIFBPU0lUSU9OLiIpOwogICAgICAgIH0KICAgICAgfQogICAgICByMy5leHBhbmRCeVZlY3RvcihlMyk7CiAgICB9CiAgICBlMi5ib3VuZGluZ0JveCA9IHIzOwogICAgY29uc3QgczIgPSBuZXcgUmUuU3BoZXJlOwogICAgcjMuZ2V0Q2VudGVyKHMyLmNlbnRlciksIHMyLnJhZGl1cyA9IHIzLm1pbi5kaXN0YW5jZVRvKHIzLm1heCkgLyAyLCBlMi5ib3VuZGluZ1NwaGVyZSA9IHMyOwogIH0oZSwgdDIsIG4yKSwgUHJvbWlzZS5hbGwocjIpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdDIudGFyZ2V0cyAhPT0gdW5kZWZpbmVkID8gZnVuY3Rpb24oZTIsIHQzLCBuMykgewogICAgICBsZXQgaTMgPSBmYWxzZSwgcjMgPSBmYWxzZSwgbzMgPSBmYWxzZTsKICAgICAgZm9yIChsZXQgZTMgPSAwLCBuNCA9IHQzLmxlbmd0aDtlMyA8IG40OyBlMysrKSB7CiAgICAgICAgY29uc3QgbjUgPSB0M1tlM107CiAgICAgICAgaWYgKG41LlBPU0lUSU9OICE9PSB1bmRlZmluZWQgJiYgKGkzID0gdHJ1ZSksIG41Lk5PUk1BTCAhPT0gdW5kZWZpbmVkICYmIChyMyA9IHRydWUpLCBuNS5DT0xPUl8wICE9PSB1bmRlZmluZWQgJiYgKG8zID0gdHJ1ZSksIGkzICYmIHIzICYmIG8zKQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKCFpMyAmJiAhcjMgJiYgIW8zKQogICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZTIpOwogICAgICBjb25zdCBzMiA9IFtdLCBhMiA9IFtdLCBBMiA9IFtdOwogICAgICBmb3IgKGxldCBsMiA9IDAsIGMyID0gdDMubGVuZ3RoO2wyIDwgYzI7IGwyKyspIHsKICAgICAgICBjb25zdCBjMyA9IHQzW2wyXTsKICAgICAgICBpZiAoaTMpIHsKICAgICAgICAgIGNvbnN0IHQ0ID0gYzMuUE9TSVRJT04gIT09IHVuZGVmaW5lZCA/IG4zLmdldERlcGVuZGVuY3koImFjY2Vzc29yIiwgYzMuUE9TSVRJT04pIDogZTIuYXR0cmlidXRlcy5wb3NpdGlvbjsKICAgICAgICAgIHMyLnB1c2godDQpOwogICAgICAgIH0KICAgICAgICBpZiAocjMpIHsKICAgICAgICAgIGNvbnN0IHQ0ID0gYzMuTk9STUFMICE9PSB1bmRlZmluZWQgPyBuMy5nZXREZXBlbmRlbmN5KCJhY2Nlc3NvciIsIGMzLk5PUk1BTCkgOiBlMi5hdHRyaWJ1dGVzLm5vcm1hbDsKICAgICAgICAgIGEyLnB1c2godDQpOwogICAgICAgIH0KICAgICAgICBpZiAobzMpIHsKICAgICAgICAgIGNvbnN0IHQ0ID0gYzMuQ09MT1JfMCAhPT0gdW5kZWZpbmVkID8gbjMuZ2V0RGVwZW5kZW5jeSgiYWNjZXNzb3IiLCBjMy5DT0xPUl8wKSA6IGUyLmF0dHJpYnV0ZXMuY29sb3I7CiAgICAgICAgICBBMi5wdXNoKHQ0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtQcm9taXNlLmFsbChzMiksIFByb21pc2UuYWxsKGEyKSwgUHJvbWlzZS5hbGwoQTIpXSkudGhlbihmdW5jdGlvbih0NCkgewogICAgICAgIGNvbnN0IG40ID0gdDRbMF0sIHMzID0gdDRbMV0sIGEzID0gdDRbMl07CiAgICAgICAgcmV0dXJuIGkzICYmIChlMi5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gPSBuNCksIHIzICYmIChlMi5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsID0gczMpLCBvMyAmJiAoZTIubW9ycGhBdHRyaWJ1dGVzLmNvbG9yID0gYTMpLCBlMi5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHRydWUsIGUyOwogICAgICB9KTsKICAgIH0oZSwgdDIudGFyZ2V0cywgbjIpIDogZTsKICB9KTsKfQoKY2xhc3MgcXQgewogIGNvbnN0cnVjdG9yKGUgPSA0KSB7CiAgICB0aGlzLnBvb2wgPSBlLCB0aGlzLnF1ZXVlID0gW10sIHRoaXMud29ya2VycyA9IFtdLCB0aGlzLndvcmtlcnNSZXNvbHZlID0gW10sIHRoaXMud29ya2VyU3RhdHVzID0gMDsKICB9CiAgX2luaXRXb3JrZXIoZSkgewogICAgaWYgKCF0aGlzLndvcmtlcnNbZV0pIHsKICAgICAgY29uc3QgdDIgPSB0aGlzLndvcmtlckNyZWF0b3IoKTsKICAgICAgdDIuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIHRoaXMuX29uTWVzc2FnZS5iaW5kKHRoaXMsIGUpKSwgdGhpcy53b3JrZXJzW2VdID0gdDI7CiAgICB9CiAgfQogIF9nZXRJZGxlV29ya2VyKCkgewogICAgZm9yIChsZXQgZSA9IDA7ZSA8IHRoaXMucG9vbDsgZSsrKQogICAgICBpZiAoISh0aGlzLndvcmtlclN0YXR1cyAmIDEgPDwgZSkpCiAgICAgICAgcmV0dXJuIGU7CiAgICByZXR1cm4gLTE7CiAgfQogIF9vbk1lc3NhZ2UoZSwgdDIpIHsKICAgIGNvbnN0IG4yID0gdGhpcy53b3JrZXJzUmVzb2x2ZVtlXTsKICAgIGlmIChuMiAmJiBuMih0MiksIHRoaXMucXVldWUubGVuZ3RoKSB7CiAgICAgIGNvbnN0IHsgcmVzb2x2ZTogdDMsIG1zZzogbjMsIHRyYW5zZmVyOiBpMiB9ID0gdGhpcy5xdWV1ZS5zaGlmdCgpOwogICAgICB0aGlzLndvcmtlcnNSZXNvbHZlW2VdID0gdDMsIHRoaXMud29ya2Vyc1tlXS5wb3N0TWVzc2FnZShuMywgaTIpOwogICAgfSBlbHNlCiAgICAgIHRoaXMud29ya2VyU3RhdHVzIF49IDEgPDwgZTsKICB9CiAgc2V0V29ya2VyQ3JlYXRvcihlKSB7CiAgICB0aGlzLndvcmtlckNyZWF0b3IgPSBlOwogIH0KICBzZXRXb3JrZXJMaW1pdChlKSB7CiAgICB0aGlzLnBvb2wgPSBlOwogIH0KICBwb3N0TWVzc2FnZShlLCB0MikgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChuMikgPT4gewogICAgICBjb25zdCBpMiA9IHRoaXMuX2dldElkbGVXb3JrZXIoKTsKICAgICAgaTIgIT09IC0xID8gKHRoaXMuX2luaXRXb3JrZXIoaTIpLCB0aGlzLndvcmtlclN0YXR1cyB8PSAxIDw8IGkyLCB0aGlzLndvcmtlcnNSZXNvbHZlW2kyXSA9IG4yLCB0aGlzLndvcmtlcnNbaTJdLnBvc3RNZXNzYWdlKGUsIHQyKSkgOiB0aGlzLnF1ZXVlLnB1c2goeyByZXNvbHZlOiBuMiwgbXNnOiBlLCB0cmFuc2ZlcjogdDIgfSk7CiAgICB9KTsKICB9CiAgZGlzcG9zZSgpIHsKICAgIHRoaXMud29ya2Vycy5mb3JFYWNoKChlKSA9PiBlLnRlcm1pbmF0ZSgpKSwgdGhpcy53b3JrZXJzUmVzb2x2ZS5sZW5ndGggPSAwLCB0aGlzLndvcmtlcnMubGVuZ3RoID0gMCwgdGhpcy5xdWV1ZS5sZW5ndGggPSAwLCB0aGlzLndvcmtlclN0YXR1cyA9IDA7CiAgfQp9CgpjbGFzcyBhbiB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLnZrRm9ybWF0ID0gMCwgdGhpcy50eXBlU2l6ZSA9IDEsIHRoaXMucGl4ZWxXaWR0aCA9IDAsIHRoaXMucGl4ZWxIZWlnaHQgPSAwLCB0aGlzLnBpeGVsRGVwdGggPSAwLCB0aGlzLmxheWVyQ291bnQgPSAwLCB0aGlzLmZhY2VDb3VudCA9IDEsIHRoaXMuc3VwZXJjb21wcmVzc2lvblNjaGVtZSA9IDAsIHRoaXMubGV2ZWxzID0gW10sIHRoaXMuZGF0YUZvcm1hdERlc2NyaXB0b3IgPSBbeyB2ZW5kb3JJZDogMCwgZGVzY3JpcHRvclR5cGU6IDAsIGRlc2NyaXB0b3JCbG9ja1NpemU6IDAsIHZlcnNpb25OdW1iZXI6IDIsIGNvbG9yTW9kZWw6IDAsIGNvbG9yUHJpbWFyaWVzOiAxLCB0cmFuc2ZlckZ1bmN0aW9uOiAyLCBmbGFnczogMCwgdGV4ZWxCbG9ja0RpbWVuc2lvbjogWzAsIDAsIDAsIDBdLCBieXRlc1BsYW5lOiBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0sIHNhbXBsZXM6IFtdIH1dLCB0aGlzLmtleVZhbHVlID0ge30sIHRoaXMuZ2xvYmFsRGF0YSA9IG51bGw7CiAgfQp9CgpjbGFzcyBBbiB7CiAgY29uc3RydWN0b3IoZSwgdDIsIG4yLCBpMikgewogICAgdGhpcy5fZGF0YVZpZXcgPSB1bmRlZmluZWQsIHRoaXMuX2xpdHRsZUVuZGlhbiA9IHVuZGVmaW5lZCwgdGhpcy5fb2Zmc2V0ID0gdW5kZWZpbmVkLCB0aGlzLl9kYXRhVmlldyA9IG5ldyBEYXRhVmlldyhlLmJ1ZmZlciwgZS5ieXRlT2Zmc2V0ICsgdDIsIG4yKSwgdGhpcy5fbGl0dGxlRW5kaWFuID0gaTIsIHRoaXMuX29mZnNldCA9IDA7CiAgfQogIF9uZXh0VWludDgoKSB7CiAgICBjb25zdCBlID0gdGhpcy5fZGF0YVZpZXcuZ2V0VWludDgodGhpcy5fb2Zmc2V0KTsKICAgIHJldHVybiB0aGlzLl9vZmZzZXQgKz0gMSwgZTsKICB9CiAgX25leHRVaW50MTYoKSB7CiAgICBjb25zdCBlID0gdGhpcy5fZGF0YVZpZXcuZ2V0VWludDE2KHRoaXMuX29mZnNldCwgdGhpcy5fbGl0dGxlRW5kaWFuKTsKICAgIHJldHVybiB0aGlzLl9vZmZzZXQgKz0gMiwgZTsKICB9CiAgX25leHRVaW50MzIoKSB7CiAgICBjb25zdCBlID0gdGhpcy5fZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMuX29mZnNldCwgdGhpcy5fbGl0dGxlRW5kaWFuKTsKICAgIHJldHVybiB0aGlzLl9vZmZzZXQgKz0gNCwgZTsKICB9CiAgX25leHRVaW50NjQoKSB7CiAgICBjb25zdCBlID0gdGhpcy5fZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMuX29mZnNldCwgdGhpcy5fbGl0dGxlRW5kaWFuKSArIDIgKiogMzIgKiB0aGlzLl9kYXRhVmlldy5nZXRVaW50MzIodGhpcy5fb2Zmc2V0ICsgNCwgdGhpcy5fbGl0dGxlRW5kaWFuKTsKICAgIHJldHVybiB0aGlzLl9vZmZzZXQgKz0gOCwgZTsKICB9CiAgX25leHRJbnQzMigpIHsKICAgIGNvbnN0IGUgPSB0aGlzLl9kYXRhVmlldy5nZXRJbnQzMih0aGlzLl9vZmZzZXQsIHRoaXMuX2xpdHRsZUVuZGlhbik7CiAgICByZXR1cm4gdGhpcy5fb2Zmc2V0ICs9IDQsIGU7CiAgfQogIF9uZXh0VWludDhBcnJheShlKSB7CiAgICBjb25zdCB0MiA9IG5ldyBVaW50OEFycmF5KHRoaXMuX2RhdGFWaWV3LmJ1ZmZlciwgdGhpcy5fZGF0YVZpZXcuYnl0ZU9mZnNldCArIHRoaXMuX29mZnNldCwgZSk7CiAgICByZXR1cm4gdGhpcy5fb2Zmc2V0ICs9IGUsIHQyOwogIH0KICBfc2tpcChlKSB7CiAgICByZXR1cm4gdGhpcy5fb2Zmc2V0ICs9IGUsIHRoaXM7CiAgfQogIF9zY2FuKGUsIHQyKSB7CiAgICB0MiA9PT0gdW5kZWZpbmVkICYmICh0MiA9IDApOwogICAgY29uc3QgbjIgPSB0aGlzLl9vZmZzZXQ7CiAgICBsZXQgaTIgPSAwOwogICAgZm9yICg7dGhpcy5fZGF0YVZpZXcuZ2V0VWludDgodGhpcy5fb2Zmc2V0KSAhPT0gdDIgJiYgaTIgPCBlOyApCiAgICAgIGkyKyssIHRoaXMuX29mZnNldCsrOwogICAgcmV0dXJuIGkyIDwgZSAmJiB0aGlzLl9vZmZzZXQrKywgbmV3IFVpbnQ4QXJyYXkodGhpcy5fZGF0YVZpZXcuYnVmZmVyLCB0aGlzLl9kYXRhVmlldy5ieXRlT2Zmc2V0ICsgbjIsIGkyKTsKICB9Cn0KZnVuY3Rpb24gY24oZSkgewogIHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZSk7Cn0KCmNsYXNzIGZuIHsKICBpbml0KCkgewogICAgcmV0dXJuIGRuIHx8IChkbiA9IHR5cGVvZiBmZXRjaCAhPSAidW5kZWZpbmVkIiA/IGZldGNoKCJkYXRhOmFwcGxpY2F0aW9uL3dhc207YmFzZTY0LCIgKyBtbikudGhlbigoZSkgPT4gZS5hcnJheUJ1ZmZlcigpKS50aGVuKChlKSA9PiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLCBwbikpLnRoZW4odGhpcy5faW5pdCkgOiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShobi5mcm9tKG1uLCAiYmFzZTY0IiksIHBuKS50aGVuKHRoaXMuX2luaXQpLCBkbik7CiAgfQogIF9pbml0KGUpIHsKICAgIHVuID0gZS5pbnN0YW5jZSwgcG4uZW52LmVtc2NyaXB0ZW5fbm90aWZ5X21lbW9yeV9ncm93dGgoMCk7CiAgfQogIGRlY29kZShlLCB0MiA9IDApIHsKICAgIGlmICghdW4pCiAgICAgIHRocm93IG5ldyBFcnJvcigiWlNURERlY29kZXI6IEF3YWl0IC5pbml0KCkgYmVmb3JlIGRlY29kaW5nLiIpOwogICAgY29uc3QgbjIgPSBlLmJ5dGVMZW5ndGgsIGkyID0gdW4uZXhwb3J0cy5tYWxsb2MobjIpOwogICAgZ24uc2V0KGUsIGkyKSwgdDIgPSB0MiB8fCBOdW1iZXIodW4uZXhwb3J0cy5aU1REX2ZpbmREZWNvbXByZXNzZWRTaXplKGkyLCBuMikpOwogICAgY29uc3QgcjIgPSB1bi5leHBvcnRzLm1hbGxvYyh0MiksIG8yID0gdW4uZXhwb3J0cy5aU1REX2RlY29tcHJlc3MocjIsIHQyLCBpMiwgbjIpLCBzMiA9IGduLnNsaWNlKHIyLCByMiArIG8yKTsKICAgIHJldHVybiB1bi5leHBvcnRzLmZyZWUoaTIpLCB1bi5leHBvcnRzLmZyZWUocjIpLCBzMjsKICB9Cn0KZnVuY3Rpb24gd24oZSkgewogIGNvbnN0IHQyID0gZS5kYXRhRm9ybWF0RGVzY3JpcHRvclswXTsKICByZXR1cm4gdDIuY29sb3JQcmltYXJpZXMgPT09IDEgPyB0Mi50cmFuc2ZlckZ1bmN0aW9uID09PSAyID8gUmUuU1JHQkNvbG9yU3BhY2UgOiBSZS5MaW5lYXJTUkdCQ29sb3JTcGFjZSA6IHQyLmNvbG9yUHJpbWFyaWVzID09PSAxMCA/IHQyLnRyYW5zZmVyRnVuY3Rpb24gPT09IDIgPyAiZGlzcGxheS1wMyIgOiAiZGlzcGxheS1wMy1saW5lYXIiIDogKHQyLmNvbG9yUHJpbWFyaWVzID09PSAwIHx8IGNvbnNvbGUud2FybihgVEhSRUUuS1RYMkxvYWRlcjogVW5zdXBwb3J0ZWQgY29sb3IgcHJpbWFyaWVzLCAiJHt0Mi5jb2xvclByaW1hcmllc30iYCksIFJlLk5vQ29sb3JTcGFjZSk7Cn0KCmNsYXNzIF9uIHsKICBjb25zdHJ1Y3RvcihlID0gbmV3IFJlLlZlY3RvcjMsIHQyID0gbmV3IFJlLlZlY3RvcjMsIG4yID0gbmV3IFJlLk1hdHJpeDMpIHsKICAgIHRoaXMuY2VudGVyID0gZSwgdGhpcy5oYWxmU2l6ZSA9IHQyLCB0aGlzLnJvdGF0aW9uID0gbjI7CiAgfQogIHNldChlLCB0MiwgbjIpIHsKICAgIHJldHVybiB0aGlzLmNlbnRlciA9IGUsIHRoaXMuaGFsZlNpemUgPSB0MiwgdGhpcy5yb3RhdGlvbiA9IG4yLCB0aGlzOwogIH0KICBjb3B5KGUpIHsKICAgIHJldHVybiB0aGlzLmNlbnRlci5jb3B5KGUuY2VudGVyKSwgdGhpcy5oYWxmU2l6ZS5jb3B5KGUuaGFsZlNpemUpLCB0aGlzLnJvdGF0aW9uLmNvcHkoZS5yb3RhdGlvbiksIHRoaXM7CiAgfQogIGNsb25lKCkgewogICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKTsKICB9CiAgZ2V0U2l6ZShlKSB7CiAgICByZXR1cm4gZS5jb3B5KHRoaXMuaGFsZlNpemUpLm11bHRpcGx5U2NhbGFyKDIpOwogIH0KICBjbGFtcFBvaW50KGUsIHQyKSB7CiAgICBjb25zdCBuMiA9IHRoaXMuaGFsZlNpemU7CiAgICBSbi5zdWJWZWN0b3JzKGUsIHRoaXMuY2VudGVyKSwgdGhpcy5yb3RhdGlvbi5leHRyYWN0QmFzaXMoRG4sIGtuLCBUbiksIHQyLmNvcHkodGhpcy5jZW50ZXIpOwogICAgY29uc3QgaTIgPSBSZS5NYXRoVXRpbHMuY2xhbXAoUm4uZG90KERuKSwgLW4yLngsIG4yLngpOwogICAgdDIuYWRkKERuLm11bHRpcGx5U2NhbGFyKGkyKSk7CiAgICBjb25zdCByMiA9IFJlLk1hdGhVdGlscy5jbGFtcChSbi5kb3Qoa24pLCAtbjIueSwgbjIueSk7CiAgICB0Mi5hZGQoa24ubXVsdGlwbHlTY2FsYXIocjIpKTsKICAgIGNvbnN0IG8yID0gUmUuTWF0aFV0aWxzLmNsYW1wKFJuLmRvdChUbiksIC1uMi56LCBuMi56KTsKICAgIHJldHVybiB0Mi5hZGQoVG4ubXVsdGlwbHlTY2FsYXIobzIpKSwgdDI7CiAgfQogIGNvbnRhaW5zUG9pbnQoZSkgewogICAgcmV0dXJuIFJuLnN1YlZlY3RvcnMoZSwgdGhpcy5jZW50ZXIpLCB0aGlzLnJvdGF0aW9uLmV4dHJhY3RCYXNpcyhEbiwga24sIFRuKSwgTWF0aC5hYnMoUm4uZG90KERuKSkgPD0gdGhpcy5oYWxmU2l6ZS54ICYmIE1hdGguYWJzKFJuLmRvdChrbikpIDw9IHRoaXMuaGFsZlNpemUueSAmJiBNYXRoLmFicyhSbi5kb3QoVG4pKSA8PSB0aGlzLmhhbGZTaXplLno7CiAgfQogIGludGVyc2VjdHNCb3gzKGUpIHsKICAgIHJldHVybiB0aGlzLmludGVyc2VjdHNPQkIoSG4uZnJvbUJveDMoZSkpOwogIH0KICBpbnRlcnNlY3RzU3BoZXJlKGUpIHsKICAgIHJldHVybiB0aGlzLmNsYW1wUG9pbnQoZS5jZW50ZXIsIFVuKSwgVW4uZGlzdGFuY2VUb1NxdWFyZWQoZS5jZW50ZXIpIDw9IGUucmFkaXVzICogZS5yYWRpdXM7CiAgfQogIGludGVyc2VjdHNPQkIoZSwgdDIgPSBOdW1iZXIuRVBTSUxPTikgewogICAgeG4uYyA9IHRoaXMuY2VudGVyLCB4bi5lWzBdID0gdGhpcy5oYWxmU2l6ZS54LCB4bi5lWzFdID0gdGhpcy5oYWxmU2l6ZS55LCB4bi5lWzJdID0gdGhpcy5oYWxmU2l6ZS56LCB0aGlzLnJvdGF0aW9uLmV4dHJhY3RCYXNpcyh4bi51WzBdLCB4bi51WzFdLCB4bi51WzJdKSwgUW4uYyA9IGUuY2VudGVyLCBRbi5lWzBdID0gZS5oYWxmU2l6ZS54LCBRbi5lWzFdID0gZS5oYWxmU2l6ZS55LCBRbi5lWzJdID0gZS5oYWxmU2l6ZS56LCBlLnJvdGF0aW9uLmV4dHJhY3RCYXNpcyhRbi51WzBdLCBRbi51WzFdLCBRbi51WzJdKTsKICAgIGZvciAobGV0IGUyID0gMDtlMiA8IDM7IGUyKyspCiAgICAgIGZvciAobGV0IHQzID0gMDt0MyA8IDM7IHQzKyspCiAgICAgICAgTG5bZTJdW3QzXSA9IHhuLnVbZTJdLmRvdChRbi51W3QzXSk7CiAgICBSbi5zdWJWZWN0b3JzKFFuLmMsIHhuLmMpLCBTblswXSA9IFJuLmRvdCh4bi51WzBdKSwgU25bMV0gPSBSbi5kb3QoeG4udVsxXSksIFNuWzJdID0gUm4uZG90KHhuLnVbMl0pOwogICAgZm9yIChsZXQgZTIgPSAwO2UyIDwgMzsgZTIrKykKICAgICAgZm9yIChsZXQgbjMgPSAwO24zIDwgMzsgbjMrKykKICAgICAgICBNbltlMl1bbjNdID0gTWF0aC5hYnMoTG5bZTJdW24zXSkgKyB0MjsKICAgIGxldCBuMiwgaTI7CiAgICBmb3IgKGxldCBlMiA9IDA7ZTIgPCAzOyBlMisrKQogICAgICBpZiAobjIgPSB4bi5lW2UyXSwgaTIgPSBRbi5lWzBdICogTW5bZTJdWzBdICsgUW4uZVsxXSAqIE1uW2UyXVsxXSArIFFuLmVbMl0gKiBNbltlMl1bMl0sIE1hdGguYWJzKFNuW2UyXSkgPiBuMiArIGkyKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIGZvciAobGV0IGUyID0gMDtlMiA8IDM7IGUyKyspCiAgICAgIGlmIChuMiA9IHhuLmVbMF0gKiBNblswXVtlMl0gKyB4bi5lWzFdICogTW5bMV1bZTJdICsgeG4uZVsyXSAqIE1uWzJdW2UyXSwgaTIgPSBRbi5lW2UyXSwgTWF0aC5hYnMoU25bMF0gKiBMblswXVtlMl0gKyBTblsxXSAqIExuWzFdW2UyXSArIFNuWzJdICogTG5bMl1bZTJdKSA+IG4yICsgaTIpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIG4yID0geG4uZVsxXSAqIE1uWzJdWzBdICsgeG4uZVsyXSAqIE1uWzFdWzBdLCBpMiA9IFFuLmVbMV0gKiBNblswXVsyXSArIFFuLmVbMl0gKiBNblswXVsxXSwgIShNYXRoLmFicyhTblsyXSAqIExuWzFdWzBdIC0gU25bMV0gKiBMblsyXVswXSkgPiBuMiArIGkyIHx8IChuMiA9IHhuLmVbMV0gKiBNblsyXVsxXSArIHhuLmVbMl0gKiBNblsxXVsxXSwgaTIgPSBRbi5lWzBdICogTW5bMF1bMl0gKyBRbi5lWzJdICogTW5bMF1bMF0sIE1hdGguYWJzKFNuWzJdICogTG5bMV1bMV0gLSBTblsxXSAqIExuWzJdWzFdKSA+IG4yICsgaTIgfHwgKG4yID0geG4uZVsxXSAqIE1uWzJdWzJdICsgeG4uZVsyXSAqIE1uWzFdWzJdLCBpMiA9IFFuLmVbMF0gKiBNblswXVsxXSArIFFuLmVbMV0gKiBNblswXVswXSwgTWF0aC5hYnMoU25bMl0gKiBMblsxXVsyXSAtIFNuWzFdICogTG5bMl1bMl0pID4gbjIgKyBpMiB8fCAobjIgPSB4bi5lWzBdICogTW5bMl1bMF0gKyB4bi5lWzJdICogTW5bMF1bMF0sIGkyID0gUW4uZVsxXSAqIE1uWzFdWzJdICsgUW4uZVsyXSAqIE1uWzFdWzFdLCBNYXRoLmFicyhTblswXSAqIExuWzJdWzBdIC0gU25bMl0gKiBMblswXVswXSkgPiBuMiArIGkyIHx8IChuMiA9IHhuLmVbMF0gKiBNblsyXVsxXSArIHhuLmVbMl0gKiBNblswXVsxXSwgaTIgPSBRbi5lWzBdICogTW5bMV1bMl0gKyBRbi5lWzJdICogTW5bMV1bMF0sIE1hdGguYWJzKFNuWzBdICogTG5bMl1bMV0gLSBTblsyXSAqIExuWzBdWzFdKSA+IG4yICsgaTIgfHwgKG4yID0geG4uZVswXSAqIE1uWzJdWzJdICsgeG4uZVsyXSAqIE1uWzBdWzJdLCBpMiA9IFFuLmVbMF0gKiBNblsxXVsxXSArIFFuLmVbMV0gKiBNblsxXVswXSwgTWF0aC5hYnMoU25bMF0gKiBMblsyXVsyXSAtIFNuWzJdICogTG5bMF1bMl0pID4gbjIgKyBpMiB8fCAobjIgPSB4bi5lWzBdICogTW5bMV1bMF0gKyB4bi5lWzFdICogTW5bMF1bMF0sIGkyID0gUW4uZVsxXSAqIE1uWzJdWzJdICsgUW4uZVsyXSAqIE1uWzJdWzFdLCBNYXRoLmFicyhTblsxXSAqIExuWzBdWzBdIC0gU25bMF0gKiBMblsxXVswXSkgPiBuMiArIGkyIHx8IChuMiA9IHhuLmVbMF0gKiBNblsxXVsxXSArIHhuLmVbMV0gKiBNblswXVsxXSwgaTIgPSBRbi5lWzBdICogTW5bMl1bMl0gKyBRbi5lWzJdICogTW5bMl1bMF0sIE1hdGguYWJzKFNuWzFdICogTG5bMF1bMV0gLSBTblswXSAqIExuWzFdWzFdKSA+IG4yICsgaTIgfHwgKG4yID0geG4uZVswXSAqIE1uWzFdWzJdICsgeG4uZVsxXSAqIE1uWzBdWzJdLCBpMiA9IFFuLmVbMF0gKiBNblsyXVsxXSArIFFuLmVbMV0gKiBNblsyXVswXSwgTWF0aC5hYnMoU25bMV0gKiBMblswXVsyXSAtIFNuWzBdICogTG5bMV1bMl0pID4gbjIgKyBpMikpKSkpKSkpKTsKICB9CiAgaW50ZXJzZWN0c1BsYW5lKGUpIHsKICAgIHRoaXMucm90YXRpb24uZXh0cmFjdEJhc2lzKERuLCBrbiwgVG4pOwogICAgY29uc3QgdDIgPSB0aGlzLmhhbGZTaXplLnggKiBNYXRoLmFicyhlLm5vcm1hbC5kb3QoRG4pKSArIHRoaXMuaGFsZlNpemUueSAqIE1hdGguYWJzKGUubm9ybWFsLmRvdChrbikpICsgdGhpcy5oYWxmU2l6ZS56ICogTWF0aC5hYnMoZS5ub3JtYWwuZG90KFRuKSksIG4yID0gZS5ub3JtYWwuZG90KHRoaXMuY2VudGVyKSAtIGUuY29uc3RhbnQ7CiAgICByZXR1cm4gTWF0aC5hYnMobjIpIDw9IHQyOwogIH0KICBpbnRlcnNlY3RSYXkoZSwgdDIpIHsKICAgIHJldHVybiB0aGlzLmdldFNpemUoRm4pLCBQbi5zZXRGcm9tQ2VudGVyQW5kU2l6ZShSbi5zZXQoMCwgMCwgMCksIEZuKSwgR24uc2V0RnJvbU1hdHJpeDModGhpcy5yb3RhdGlvbiksIEduLnNldFBvc2l0aW9uKHRoaXMuY2VudGVyKSwgTm4uY29weShHbikuaW52ZXJ0KCksIGpuLmNvcHkoZSkuYXBwbHlNYXRyaXg0KE5uKSwgam4uaW50ZXJzZWN0Qm94KFBuLCB0MikgPyB0Mi5hcHBseU1hdHJpeDQoR24pIDogbnVsbDsKICB9CiAgaW50ZXJzZWN0c1JheShlKSB7CiAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3RSYXkoZSwgUm4pICE9PSBudWxsOwogIH0KICBmcm9tQm94MyhlKSB7CiAgICByZXR1cm4gZS5nZXRDZW50ZXIodGhpcy5jZW50ZXIpLCBlLmdldFNpemUodGhpcy5oYWxmU2l6ZSkubXVsdGlwbHlTY2FsYXIoMC41KSwgdGhpcy5yb3RhdGlvbi5pZGVudGl0eSgpLCB0aGlzOwogIH0KICBlcXVhbHMoZSkgewogICAgcmV0dXJuIGUuY2VudGVyLmVxdWFscyh0aGlzLmNlbnRlcikgJiYgZS5oYWxmU2l6ZS5lcXVhbHModGhpcy5oYWxmU2l6ZSkgJiYgZS5yb3RhdGlvbi5lcXVhbHModGhpcy5yb3RhdGlvbik7CiAgfQogIGFwcGx5TWF0cml4NChlKSB7CiAgICBjb25zdCB0MiA9IGUuZWxlbWVudHM7CiAgICBsZXQgbjIgPSBSbi5zZXQodDJbMF0sIHQyWzFdLCB0MlsyXSkubGVuZ3RoKCk7CiAgICBjb25zdCBpMiA9IFJuLnNldCh0Mls0XSwgdDJbNV0sIHQyWzZdKS5sZW5ndGgoKSwgcjIgPSBSbi5zZXQodDJbOF0sIHQyWzldLCB0MlsxMF0pLmxlbmd0aCgpOwogICAgZS5kZXRlcm1pbmFudCgpIDwgMCAmJiAobjIgPSAtbjIpLCBPbi5zZXRGcm9tTWF0cml4NChlKTsKICAgIGNvbnN0IG8yID0gMSAvIG4yLCBzMiA9IDEgLyBpMiwgYTIgPSAxIC8gcjI7CiAgICByZXR1cm4gT24uZWxlbWVudHNbMF0gKj0gbzIsIE9uLmVsZW1lbnRzWzFdICo9IG8yLCBPbi5lbGVtZW50c1syXSAqPSBvMiwgT24uZWxlbWVudHNbM10gKj0gczIsIE9uLmVsZW1lbnRzWzRdICo9IHMyLCBPbi5lbGVtZW50c1s1XSAqPSBzMiwgT24uZWxlbWVudHNbNl0gKj0gYTIsIE9uLmVsZW1lbnRzWzddICo9IGEyLCBPbi5lbGVtZW50c1s4XSAqPSBhMiwgdGhpcy5yb3RhdGlvbi5tdWx0aXBseShPbiksIHRoaXMuaGFsZlNpemUueCAqPSBuMiwgdGhpcy5oYWxmU2l6ZS55ICo9IGkyLCB0aGlzLmhhbGZTaXplLnogKj0gcjIsIFJuLnNldEZyb21NYXRyaXhQb3NpdGlvbihlKSwgdGhpcy5jZW50ZXIuYWRkKFJuKSwgdGhpczsKICB9Cn0KZnVuY3Rpb24gdGkoKSB7CiAgY29uc3QgZSA9IHsgb2JqZWN0czogW10sIG9iamVjdDoge30sIHZlcnRpY2VzOiBbXSwgbm9ybWFsczogW10sIGNvbG9yczogW10sIHV2czogW10sIG1hdGVyaWFsczoge30sIG1hdGVyaWFsTGlicmFyaWVzOiBbXSwgc3RhcnRPYmplY3Q6IGZ1bmN0aW9uKGUyLCB0MikgewogICAgaWYgKHRoaXMub2JqZWN0ICYmIHRoaXMub2JqZWN0LmZyb21EZWNsYXJhdGlvbiA9PT0gZmFsc2UpCiAgICAgIHJldHVybiB0aGlzLm9iamVjdC5uYW1lID0gZTIsIHZvaWQgKHRoaXMub2JqZWN0LmZyb21EZWNsYXJhdGlvbiA9IHQyICE9PSBmYWxzZSk7CiAgICBjb25zdCBuMiA9IHRoaXMub2JqZWN0ICYmIHR5cGVvZiB0aGlzLm9iamVjdC5jdXJyZW50TWF0ZXJpYWwgPT0gImZ1bmN0aW9uIiA/IHRoaXMub2JqZWN0LmN1cnJlbnRNYXRlcmlhbCgpIDogdW5kZWZpbmVkOwogICAgaWYgKHRoaXMub2JqZWN0ICYmIHR5cGVvZiB0aGlzLm9iamVjdC5fZmluYWxpemUgPT0gImZ1bmN0aW9uIiAmJiB0aGlzLm9iamVjdC5fZmluYWxpemUodHJ1ZSksIHRoaXMub2JqZWN0ID0geyBuYW1lOiBlMiB8fCAiIiwgZnJvbURlY2xhcmF0aW9uOiB0MiAhPT0gZmFsc2UsIGdlb21ldHJ5OiB7IHZlcnRpY2VzOiBbXSwgbm9ybWFsczogW10sIGNvbG9yczogW10sIHV2czogW10sIGhhc1VWSW5kaWNlczogZmFsc2UgfSwgbWF0ZXJpYWxzOiBbXSwgc21vb3RoOiB0cnVlLCBzdGFydE1hdGVyaWFsOiBmdW5jdGlvbihlMywgdDMpIHsKICAgICAgY29uc3QgbjMgPSB0aGlzLl9maW5hbGl6ZShmYWxzZSk7CiAgICAgIG4zICYmIChuMy5pbmhlcml0ZWQgfHwgbjMuZ3JvdXBDb3VudCA8PSAwKSAmJiB0aGlzLm1hdGVyaWFscy5zcGxpY2UobjMuaW5kZXgsIDEpOwogICAgICBjb25zdCBpMiA9IHsgaW5kZXg6IHRoaXMubWF0ZXJpYWxzLmxlbmd0aCwgbmFtZTogZTMgfHwgIiIsIG10bGxpYjogQXJyYXkuaXNBcnJheSh0MykgJiYgdDMubGVuZ3RoID4gMCA/IHQzW3QzLmxlbmd0aCAtIDFdIDogIiIsIHNtb290aDogbjMgIT09IHVuZGVmaW5lZCA/IG4zLnNtb290aCA6IHRoaXMuc21vb3RoLCBncm91cFN0YXJ0OiBuMyAhPT0gdW5kZWZpbmVkID8gbjMuZ3JvdXBFbmQgOiAwLCBncm91cEVuZDogLTEsIGdyb3VwQ291bnQ6IC0xLCBpbmhlcml0ZWQ6IGZhbHNlLCBjbG9uZTogZnVuY3Rpb24oZTQpIHsKICAgICAgICBjb25zdCB0NCA9IHsgaW5kZXg6IHR5cGVvZiBlNCA9PSAibnVtYmVyIiA/IGU0IDogdGhpcy5pbmRleCwgbmFtZTogdGhpcy5uYW1lLCBtdGxsaWI6IHRoaXMubXRsbGliLCBzbW9vdGg6IHRoaXMuc21vb3RoLCBncm91cFN0YXJ0OiAwLCBncm91cEVuZDogLTEsIGdyb3VwQ291bnQ6IC0xLCBpbmhlcml0ZWQ6IGZhbHNlIH07CiAgICAgICAgcmV0dXJuIHQ0LmNsb25lID0gdGhpcy5jbG9uZS5iaW5kKHQ0KSwgdDQ7CiAgICAgIH0gfTsKICAgICAgcmV0dXJuIHRoaXMubWF0ZXJpYWxzLnB1c2goaTIpLCBpMjsKICAgIH0sIGN1cnJlbnRNYXRlcmlhbDogZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLm1hdGVyaWFscy5sZW5ndGggPiAwKQogICAgICAgIHJldHVybiB0aGlzLm1hdGVyaWFsc1t0aGlzLm1hdGVyaWFscy5sZW5ndGggLSAxXTsKICAgIH0sIF9maW5hbGl6ZTogZnVuY3Rpb24oZTMpIHsKICAgICAgY29uc3QgdDMgPSB0aGlzLmN1cnJlbnRNYXRlcmlhbCgpOwogICAgICBpZiAodDMgJiYgdDMuZ3JvdXBFbmQgPT09IC0xICYmICh0My5ncm91cEVuZCA9IHRoaXMuZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoIC8gMywgdDMuZ3JvdXBDb3VudCA9IHQzLmdyb3VwRW5kIC0gdDMuZ3JvdXBTdGFydCwgdDMuaW5oZXJpdGVkID0gZmFsc2UpLCBlMyAmJiB0aGlzLm1hdGVyaWFscy5sZW5ndGggPiAxKQogICAgICAgIGZvciAobGV0IGU0ID0gdGhpcy5tYXRlcmlhbHMubGVuZ3RoIC0gMTtlNCA+PSAwOyBlNC0tKQogICAgICAgICAgdGhpcy5tYXRlcmlhbHNbZTRdLmdyb3VwQ291bnQgPD0gMCAmJiB0aGlzLm1hdGVyaWFscy5zcGxpY2UoZTQsIDEpOwogICAgICByZXR1cm4gZTMgJiYgdGhpcy5tYXRlcmlhbHMubGVuZ3RoID09PSAwICYmIHRoaXMubWF0ZXJpYWxzLnB1c2goeyBuYW1lOiAiIiwgc21vb3RoOiB0aGlzLnNtb290aCB9KSwgdDM7CiAgICB9IH0sIG4yICYmIG4yLm5hbWUgJiYgdHlwZW9mIG4yLmNsb25lID09ICJmdW5jdGlvbiIpIHsKICAgICAgY29uc3QgZTMgPSBuMi5jbG9uZSgwKTsKICAgICAgZTMuaW5oZXJpdGVkID0gdHJ1ZSwgdGhpcy5vYmplY3QubWF0ZXJpYWxzLnB1c2goZTMpOwogICAgfQogICAgdGhpcy5vYmplY3RzLnB1c2godGhpcy5vYmplY3QpOwogIH0sIGZpbmFsaXplOiBmdW5jdGlvbigpIHsKICAgIHRoaXMub2JqZWN0ICYmIHR5cGVvZiB0aGlzLm9iamVjdC5fZmluYWxpemUgPT0gImZ1bmN0aW9uIiAmJiB0aGlzLm9iamVjdC5fZmluYWxpemUodHJ1ZSk7CiAgfSwgcGFyc2VWZXJ0ZXhJbmRleDogZnVuY3Rpb24oZTIsIHQyKSB7CiAgICBjb25zdCBuMiA9IHBhcnNlSW50KGUyLCAxMCk7CiAgICByZXR1cm4gMyAqIChuMiA+PSAwID8gbjIgLSAxIDogbjIgKyB0MiAvIDMpOwogIH0sIHBhcnNlTm9ybWFsSW5kZXg6IGZ1bmN0aW9uKGUyLCB0MikgewogICAgY29uc3QgbjIgPSBwYXJzZUludChlMiwgMTApOwogICAgcmV0dXJuIDMgKiAobjIgPj0gMCA/IG4yIC0gMSA6IG4yICsgdDIgLyAzKTsKICB9LCBwYXJzZVVWSW5kZXg6IGZ1bmN0aW9uKGUyLCB0MikgewogICAgY29uc3QgbjIgPSBwYXJzZUludChlMiwgMTApOwogICAgcmV0dXJuIDIgKiAobjIgPj0gMCA/IG4yIC0gMSA6IG4yICsgdDIgLyAyKTsKICB9LCBhZGRWZXJ0ZXg6IGZ1bmN0aW9uKGUyLCB0MiwgbjIpIHsKICAgIGNvbnN0IGkyID0gdGhpcy52ZXJ0aWNlcywgcjIgPSB0aGlzLm9iamVjdC5nZW9tZXRyeS52ZXJ0aWNlczsKICAgIHIyLnB1c2goaTJbZTIgKyAwXSwgaTJbZTIgKyAxXSwgaTJbZTIgKyAyXSksIHIyLnB1c2goaTJbdDIgKyAwXSwgaTJbdDIgKyAxXSwgaTJbdDIgKyAyXSksIHIyLnB1c2goaTJbbjIgKyAwXSwgaTJbbjIgKyAxXSwgaTJbbjIgKyAyXSk7CiAgfSwgYWRkVmVydGV4UG9pbnQ6IGZ1bmN0aW9uKGUyKSB7CiAgICBjb25zdCB0MiA9IHRoaXMudmVydGljZXM7CiAgICB0aGlzLm9iamVjdC5nZW9tZXRyeS52ZXJ0aWNlcy5wdXNoKHQyW2UyICsgMF0sIHQyW2UyICsgMV0sIHQyW2UyICsgMl0pOwogIH0sIGFkZFZlcnRleExpbmU6IGZ1bmN0aW9uKGUyKSB7CiAgICBjb25zdCB0MiA9IHRoaXMudmVydGljZXM7CiAgICB0aGlzLm9iamVjdC5nZW9tZXRyeS52ZXJ0aWNlcy5wdXNoKHQyW2UyICsgMF0sIHQyW2UyICsgMV0sIHQyW2UyICsgMl0pOwogIH0sIGFkZE5vcm1hbDogZnVuY3Rpb24oZTIsIHQyLCBuMikgewogICAgY29uc3QgaTIgPSB0aGlzLm5vcm1hbHMsIHIyID0gdGhpcy5vYmplY3QuZ2VvbWV0cnkubm9ybWFsczsKICAgIHIyLnB1c2goaTJbZTIgKyAwXSwgaTJbZTIgKyAxXSwgaTJbZTIgKyAyXSksIHIyLnB1c2goaTJbdDIgKyAwXSwgaTJbdDIgKyAxXSwgaTJbdDIgKyAyXSksIHIyLnB1c2goaTJbbjIgKyAwXSwgaTJbbjIgKyAxXSwgaTJbbjIgKyAyXSk7CiAgfSwgYWRkRmFjZU5vcm1hbDogZnVuY3Rpb24oZTIsIHQyLCBuMikgewogICAgY29uc3QgaTIgPSB0aGlzLnZlcnRpY2VzLCByMiA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5Lm5vcm1hbHM7CiAgICBXbi5mcm9tQXJyYXkoaTIsIGUyKSwgSm4uZnJvbUFycmF5KGkyLCB0MiksIFhuLmZyb21BcnJheShpMiwgbjIpLCAkbi5zdWJWZWN0b3JzKFhuLCBKbiksIFpuLnN1YlZlY3RvcnMoV24sIEpuKSwgJG4uY3Jvc3MoWm4pLCAkbi5ub3JtYWxpemUoKSwgcjIucHVzaCgkbi54LCAkbi55LCAkbi56KSwgcjIucHVzaCgkbi54LCAkbi55LCAkbi56KSwgcjIucHVzaCgkbi54LCAkbi55LCAkbi56KTsKICB9LCBhZGRDb2xvcjogZnVuY3Rpb24oZTIsIHQyLCBuMikgewogICAgY29uc3QgaTIgPSB0aGlzLmNvbG9ycywgcjIgPSB0aGlzLm9iamVjdC5nZW9tZXRyeS5jb2xvcnM7CiAgICBpMltlMl0gIT09IHVuZGVmaW5lZCAmJiByMi5wdXNoKGkyW2UyICsgMF0sIGkyW2UyICsgMV0sIGkyW2UyICsgMl0pLCBpMlt0Ml0gIT09IHVuZGVmaW5lZCAmJiByMi5wdXNoKGkyW3QyICsgMF0sIGkyW3QyICsgMV0sIGkyW3QyICsgMl0pLCBpMltuMl0gIT09IHVuZGVmaW5lZCAmJiByMi5wdXNoKGkyW24yICsgMF0sIGkyW24yICsgMV0sIGkyW24yICsgMl0pOwogIH0sIGFkZFVWOiBmdW5jdGlvbihlMiwgdDIsIG4yKSB7CiAgICBjb25zdCBpMiA9IHRoaXMudXZzLCByMiA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5LnV2czsKICAgIHIyLnB1c2goaTJbZTIgKyAwXSwgaTJbZTIgKyAxXSksIHIyLnB1c2goaTJbdDIgKyAwXSwgaTJbdDIgKyAxXSksIHIyLnB1c2goaTJbbjIgKyAwXSwgaTJbbjIgKyAxXSk7CiAgfSwgYWRkRGVmYXVsdFVWOiBmdW5jdGlvbigpIHsKICAgIGNvbnN0IGUyID0gdGhpcy5vYmplY3QuZ2VvbWV0cnkudXZzOwogICAgZTIucHVzaCgwLCAwKSwgZTIucHVzaCgwLCAwKSwgZTIucHVzaCgwLCAwKTsKICB9LCBhZGRVVkxpbmU6IGZ1bmN0aW9uKGUyKSB7CiAgICBjb25zdCB0MiA9IHRoaXMudXZzOwogICAgdGhpcy5vYmplY3QuZ2VvbWV0cnkudXZzLnB1c2godDJbZTIgKyAwXSwgdDJbZTIgKyAxXSk7CiAgfSwgYWRkRmFjZTogZnVuY3Rpb24oZTIsIHQyLCBuMiwgaTIsIHIyLCBvMiwgczIsIGEyLCBBMikgewogICAgY29uc3QgbDIgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsKICAgIGxldCBjMiA9IHRoaXMucGFyc2VWZXJ0ZXhJbmRleChlMiwgbDIpLCBoMiA9IHRoaXMucGFyc2VWZXJ0ZXhJbmRleCh0MiwgbDIpLCBkMiA9IHRoaXMucGFyc2VWZXJ0ZXhJbmRleChuMiwgbDIpOwogICAgaWYgKHRoaXMuYWRkVmVydGV4KGMyLCBoMiwgZDIpLCB0aGlzLmFkZENvbG9yKGMyLCBoMiwgZDIpLCBzMiAhPT0gdW5kZWZpbmVkICYmIHMyICE9PSAiIikgewogICAgICBjb25zdCBlMyA9IHRoaXMubm9ybWFscy5sZW5ndGg7CiAgICAgIGMyID0gdGhpcy5wYXJzZU5vcm1hbEluZGV4KHMyLCBlMyksIGgyID0gdGhpcy5wYXJzZU5vcm1hbEluZGV4KGEyLCBlMyksIGQyID0gdGhpcy5wYXJzZU5vcm1hbEluZGV4KEEyLCBlMyksIHRoaXMuYWRkTm9ybWFsKGMyLCBoMiwgZDIpOwogICAgfSBlbHNlCiAgICAgIHRoaXMuYWRkRmFjZU5vcm1hbChjMiwgaDIsIGQyKTsKICAgIGlmIChpMiAhPT0gdW5kZWZpbmVkICYmIGkyICE9PSAiIikgewogICAgICBjb25zdCBlMyA9IHRoaXMudXZzLmxlbmd0aDsKICAgICAgYzIgPSB0aGlzLnBhcnNlVVZJbmRleChpMiwgZTMpLCBoMiA9IHRoaXMucGFyc2VVVkluZGV4KHIyLCBlMyksIGQyID0gdGhpcy5wYXJzZVVWSW5kZXgobzIsIGUzKSwgdGhpcy5hZGRVVihjMiwgaDIsIGQyKSwgdGhpcy5vYmplY3QuZ2VvbWV0cnkuaGFzVVZJbmRpY2VzID0gdHJ1ZTsKICAgIH0gZWxzZQogICAgICB0aGlzLmFkZERlZmF1bHRVVigpOwogIH0sIGFkZFBvaW50R2VvbWV0cnk6IGZ1bmN0aW9uKGUyKSB7CiAgICB0aGlzLm9iamVjdC5nZW9tZXRyeS50eXBlID0gIlBvaW50cyI7CiAgICBjb25zdCB0MiA9IHRoaXMudmVydGljZXMubGVuZ3RoOwogICAgZm9yIChsZXQgbjIgPSAwLCBpMiA9IGUyLmxlbmd0aDtuMiA8IGkyOyBuMisrKSB7CiAgICAgIGNvbnN0IGkzID0gdGhpcy5wYXJzZVZlcnRleEluZGV4KGUyW24yXSwgdDIpOwogICAgICB0aGlzLmFkZFZlcnRleFBvaW50KGkzKSwgdGhpcy5hZGRDb2xvcihpMyk7CiAgICB9CiAgfSwgYWRkTGluZUdlb21ldHJ5OiBmdW5jdGlvbihlMiwgdDIpIHsKICAgIHRoaXMub2JqZWN0Lmdlb21ldHJ5LnR5cGUgPSAiTGluZSI7CiAgICBjb25zdCBuMiA9IHRoaXMudmVydGljZXMubGVuZ3RoLCBpMiA9IHRoaXMudXZzLmxlbmd0aDsKICAgIGZvciAobGV0IHQzID0gMCwgaTMgPSBlMi5sZW5ndGg7dDMgPCBpMzsgdDMrKykKICAgICAgdGhpcy5hZGRWZXJ0ZXhMaW5lKHRoaXMucGFyc2VWZXJ0ZXhJbmRleChlMlt0M10sIG4yKSk7CiAgICBmb3IgKGxldCBlMyA9IDAsIG4zID0gdDIubGVuZ3RoO2UzIDwgbjM7IGUzKyspCiAgICAgIHRoaXMuYWRkVVZMaW5lKHRoaXMucGFyc2VVVkluZGV4KHQyW2UzXSwgaTIpKTsKICB9IH07CiAgcmV0dXJuIGUuc3RhcnRPYmplY3QoIiIsIGZhbHNlKSwgZTsKfQoKY2xhc3MgcmkgewogIGNvbnN0cnVjdG9yKGUgPSAiIiwgdDIgPSB7fSkgewogICAgdGhpcy5iYXNlVXJsID0gZSwgdGhpcy5vcHRpb25zID0gdDIsIHRoaXMubWF0ZXJpYWxzSW5mbyA9IHt9LCB0aGlzLm1hdGVyaWFscyA9IHt9LCB0aGlzLm1hdGVyaWFsc0FycmF5ID0gW10sIHRoaXMubmFtZUxvb2t1cCA9IHt9LCB0aGlzLmNyb3NzT3JpZ2luID0gImFub255bW91cyIsIHRoaXMuc2lkZSA9IHRoaXMub3B0aW9ucy5zaWRlICE9PSB1bmRlZmluZWQgPyB0aGlzLm9wdGlvbnMuc2lkZSA6IFJlLkZyb250U2lkZSwgdGhpcy53cmFwID0gdGhpcy5vcHRpb25zLndyYXAgIT09IHVuZGVmaW5lZCA/IHRoaXMub3B0aW9ucy53cmFwIDogUmUuUmVwZWF0V3JhcHBpbmc7CiAgfQogIHNldENyb3NzT3JpZ2luKGUpIHsKICAgIHJldHVybiB0aGlzLmNyb3NzT3JpZ2luID0gZSwgdGhpczsKICB9CiAgc2V0TWFuYWdlcihlKSB7CiAgICB0aGlzLm1hbmFnZXIgPSBlOwogIH0KICBzZXRNYXRlcmlhbHMoZSkgewogICAgdGhpcy5tYXRlcmlhbHNJbmZvID0gdGhpcy5jb252ZXJ0KGUpLCB0aGlzLm1hdGVyaWFscyA9IHt9LCB0aGlzLm1hdGVyaWFsc0FycmF5ID0gW10sIHRoaXMubmFtZUxvb2t1cCA9IHt9OwogIH0KICBjb252ZXJ0KGUpIHsKICAgIGlmICghdGhpcy5vcHRpb25zKQogICAgICByZXR1cm4gZTsKICAgIGNvbnN0IHQyID0ge307CiAgICBmb3IgKGNvbnN0IG4yIGluIGUpIHsKICAgICAgY29uc3QgaTIgPSBlW24yXSwgcjIgPSB7fTsKICAgICAgdDJbbjJdID0gcjI7CiAgICAgIGZvciAoY29uc3QgZTIgaW4gaTIpIHsKICAgICAgICBsZXQgdDMgPSB0cnVlLCBuMyA9IGkyW2UyXTsKICAgICAgICBjb25zdCBvMiA9IGUyLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgc3dpdGNoIChvMikgewogICAgICAgICAgY2FzZSAia2QiOgogICAgICAgICAgY2FzZSAia2EiOgogICAgICAgICAgY2FzZSAia3MiOgogICAgICAgICAgICB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLm5vcm1hbGl6ZVJHQiAmJiAobjMgPSBbbjNbMF0gLyAyNTUsIG4zWzFdIC8gMjU1LCBuM1syXSAvIDI1NV0pLCB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmlnbm9yZVplcm9SR0JzICYmIG4zWzBdID09PSAwICYmIG4zWzFdID09PSAwICYmIG4zWzJdID09PSAwICYmICh0MyA9IGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgdDMgJiYgKHIyW28yXSA9IG4zKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHQyOwogIH0KICBwcmVsb2FkKCkgewogICAgZm9yIChjb25zdCBlIGluIHRoaXMubWF0ZXJpYWxzSW5mbykKICAgICAgdGhpcy5jcmVhdGUoZSk7CiAgfQogIGdldEluZGV4KGUpIHsKICAgIHJldHVybiB0aGlzLm5hbWVMb29rdXBbZV07CiAgfQogIGdldEFzQXJyYXkoKSB7CiAgICBsZXQgZSA9IDA7CiAgICBmb3IgKGNvbnN0IHQyIGluIHRoaXMubWF0ZXJpYWxzSW5mbykKICAgICAgdGhpcy5tYXRlcmlhbHNBcnJheVtlXSA9IHRoaXMuY3JlYXRlKHQyKSwgdGhpcy5uYW1lTG9va3VwW3QyXSA9IGUsIGUrKzsKICAgIHJldHVybiB0aGlzLm1hdGVyaWFsc0FycmF5OwogIH0KICBjcmVhdGUoZSkgewogICAgcmV0dXJuIHRoaXMubWF0ZXJpYWxzW2VdID09PSB1bmRlZmluZWQgJiYgdGhpcy5jcmVhdGVNYXRlcmlhbF8oZSksIHRoaXMubWF0ZXJpYWxzW2VdOwogIH0KICBjcmVhdGVNYXRlcmlhbF8oZSkgewogICAgY29uc3QgdDIgPSB0aGlzLCBuMiA9IHRoaXMubWF0ZXJpYWxzSW5mb1tlXSwgaTIgPSB7IG5hbWU6IGUsIHNpZGU6IHRoaXMuc2lkZSB9OwogICAgZnVuY3Rpb24gcjIoZTIsIG4zKSB7CiAgICAgIGlmIChpMltlMl0pCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCByMyA9IHQyLmdldFRleHR1cmVQYXJhbXMobjMsIGkyKSwgbzIgPSB0Mi5sb2FkVGV4dHVyZSgoczIgPSB0Mi5iYXNlVXJsLCB0eXBlb2YgKGEyID0gcjMudXJsKSAhPSAic3RyaW5nIiB8fCBhMiA9PT0gIiIgPyAiIiA6IC9eaHR0cHM/OlwvXC8vaS50ZXN0KGEyKSA/IGEyIDogczIgKyBhMikpOwogICAgICB2YXIgczIsIGEyOwogICAgICBvMi5yZXBlYXQuY29weShyMy5zY2FsZSksIG8yLm9mZnNldC5jb3B5KHIzLm9mZnNldCksIG8yLndyYXBTID0gdDIud3JhcCwgbzIud3JhcFQgPSB0Mi53cmFwLCBlMiAhPT0gIm1hcCIgJiYgZTIgIT09ICJlbWlzc2l2ZU1hcCIgfHwgKG8yLmNvbG9yU3BhY2UgPSBSZS5TUkdCQ29sb3JTcGFjZSksIGkyW2UyXSA9IG8yOwogICAgfQogICAgZm9yIChjb25zdCBlMiBpbiBuMikgewogICAgICBjb25zdCB0MyA9IG4yW2UyXTsKICAgICAgbGV0IG8yOwogICAgICBpZiAodDMgIT09ICIiKQogICAgICAgIHN3aXRjaCAoZTIudG9Mb3dlckNhc2UoKSkgewogICAgICAgICAgY2FzZSAia2QiOgogICAgICAgICAgICBpMi5jb2xvciA9IFJlLkNvbG9yTWFuYWdlbWVudC50b1dvcmtpbmdDb2xvclNwYWNlKG5ldyBSZS5Db2xvcigpLmZyb21BcnJheSh0MyksIFJlLlNSR0JDb2xvclNwYWNlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJrcyI6CiAgICAgICAgICAgIGkyLnNwZWN1bGFyID0gUmUuQ29sb3JNYW5hZ2VtZW50LnRvV29ya2luZ0NvbG9yU3BhY2UobmV3IFJlLkNvbG9yKCkuZnJvbUFycmF5KHQzKSwgUmUuU1JHQkNvbG9yU3BhY2UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImtlIjoKICAgICAgICAgICAgaTIuZW1pc3NpdmUgPSBSZS5Db2xvck1hbmFnZW1lbnQudG9Xb3JraW5nQ29sb3JTcGFjZShuZXcgUmUuQ29sb3IoKS5mcm9tQXJyYXkodDMpLCBSZS5TUkdCQ29sb3JTcGFjZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAibWFwX2tkIjoKICAgICAgICAgICAgcjIoIm1hcCIsIHQzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJtYXBfa3MiOgogICAgICAgICAgICByMigic3BlY3VsYXJNYXAiLCB0Myk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAibWFwX2tlIjoKICAgICAgICAgICAgcjIoImVtaXNzaXZlTWFwIiwgdDMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgIm5vcm0iOgogICAgICAgICAgICByMigibm9ybWFsTWFwIiwgdDMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgIm1hcF9idW1wIjoKICAgICAgICAgIGNhc2UgImJ1bXAiOgogICAgICAgICAgICByMigiYnVtcE1hcCIsIHQzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJtYXBfZCI6CiAgICAgICAgICAgIHIyKCJhbHBoYU1hcCIsIHQzKSwgaTIudHJhbnNwYXJlbnQgPSB0cnVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgIm5zIjoKICAgICAgICAgICAgaTIuc2hpbmluZXNzID0gcGFyc2VGbG9hdCh0Myk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiZCI6CiAgICAgICAgICAgIG8yID0gcGFyc2VGbG9hdCh0MyksIG8yIDwgMSAmJiAoaTIub3BhY2l0eSA9IG8yLCBpMi50cmFuc3BhcmVudCA9IHRydWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgInRyIjoKICAgICAgICAgICAgbzIgPSBwYXJzZUZsb2F0KHQzKSwgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5pbnZlcnRUclByb3BlcnR5ICYmIChvMiA9IDEgLSBvMiksIG8yID4gMCAmJiAoaTIub3BhY2l0eSA9IDEgLSBvMiwgaTIudHJhbnNwYXJlbnQgPSB0cnVlKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy5tYXRlcmlhbHNbZV0gPSBuZXcgUmUuTWVzaFBob25nTWF0ZXJpYWwoaTIpLCB0aGlzLm1hdGVyaWFsc1tlXTsKICB9CiAgZ2V0VGV4dHVyZVBhcmFtcyhlLCB0MikgewogICAgY29uc3QgbjIgPSB7IHNjYWxlOiBuZXcgUmUuVmVjdG9yMigxLCAxKSwgb2Zmc2V0OiBuZXcgUmUuVmVjdG9yMigwLCAwKSB9LCBpMiA9IGUuc3BsaXQoL1xzKy8pOwogICAgbGV0IHIyOwogICAgcmV0dXJuIHIyID0gaTIuaW5kZXhPZigiLWJtIiksIHIyID49IDAgJiYgKHQyLmJ1bXBTY2FsZSA9IHBhcnNlRmxvYXQoaTJbcjIgKyAxXSksIGkyLnNwbGljZShyMiwgMikpLCByMiA9IGkyLmluZGV4T2YoIi1zIiksIHIyID49IDAgJiYgKG4yLnNjYWxlLnNldChwYXJzZUZsb2F0KGkyW3IyICsgMV0pLCBwYXJzZUZsb2F0KGkyW3IyICsgMl0pKSwgaTIuc3BsaWNlKHIyLCA0KSksIHIyID0gaTIuaW5kZXhPZigiLW8iKSwgcjIgPj0gMCAmJiAobjIub2Zmc2V0LnNldChwYXJzZUZsb2F0KGkyW3IyICsgMV0pLCBwYXJzZUZsb2F0KGkyW3IyICsgMl0pKSwgaTIuc3BsaWNlKHIyLCA0KSksIG4yLnVybCA9IGkyLmpvaW4oIiAiKS50cmltKCksIG4yOwogIH0KICBsb2FkVGV4dHVyZShlLCB0MiwgbjIsIGkyLCByMikgewogICAgY29uc3QgbzIgPSB0aGlzLm1hbmFnZXIgIT09IHVuZGVmaW5lZCA/IHRoaXMubWFuYWdlciA6IFJlLkRlZmF1bHRMb2FkaW5nTWFuYWdlcjsKICAgIGxldCBzMiA9IG8yLmdldEhhbmRsZXIoZSk7CiAgICBzMiA9PT0gbnVsbCAmJiAoczIgPSBuZXcgUmUuVGV4dHVyZUxvYWRlcihvMikpLCBzMi5zZXRDcm9zc09yaWdpbiAmJiBzMi5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTsKICAgIGNvbnN0IGEyID0gczIubG9hZChlLCBuMiwgaTIsIHIyKTsKICAgIHJldHVybiB0MiAhPT0gdW5kZWZpbmVkICYmIChhMi5tYXBwaW5nID0gdDIpLCBhMjsKICB9Cn0KCmNsYXNzIG9pIHsKICBzdGF0aWMgZnJvbUN1YmVUZXh0dXJlKGUpIHsKICAgIGxldCB0MiA9IDA7CiAgICBjb25zdCBuMiA9IG5ldyBSZS5WZWN0b3IzLCBpMiA9IG5ldyBSZS5WZWN0b3IzLCByMiA9IG5ldyBSZS5Db2xvciwgbzIgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0sIHMyID0gbmV3IFJlLlNwaGVyaWNhbEhhcm1vbmljczMsIGEyID0gczIuY29lZmZpY2llbnRzOwogICAgZm9yIChsZXQgczMgPSAwO3MzIDwgNjsgczMrKykgewogICAgICBjb25zdCBBMyA9IGUuaW1hZ2VbczNdLCBsMiA9IEEzLndpZHRoLCBjMiA9IEEzLmhlaWdodCwgaDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgICAgaDIud2lkdGggPSBsMiwgaDIuaGVpZ2h0ID0gYzI7CiAgICAgIGNvbnN0IGQyID0gaDIuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgZDIuZHJhd0ltYWdlKEEzLCAwLCAwLCBsMiwgYzIpOwogICAgICBjb25zdCB1MiA9IGQyLmdldEltYWdlRGF0YSgwLCAwLCBsMiwgYzIpLCBnMiA9IHUyLmRhdGEsIHAyID0gdTIud2lkdGgsIGYyID0gMiAvIHAyOwogICAgICBmb3IgKGxldCBBNCA9IDAsIGwzID0gZzIubGVuZ3RoO0E0IDwgbDM7IEE0ICs9IDQpIHsKICAgICAgICByMi5zZXRSR0IoZzJbQTRdIC8gMjU1LCBnMltBNCArIDFdIC8gMjU1LCBnMltBNCArIDJdIC8gMjU1KSwgc2kocjIsIGUuY29sb3JTcGFjZSk7CiAgICAgICAgY29uc3QgbDQgPSBBNCAvIDQsIGMzID0gKGw0ICUgcDIgKyAwLjUpICogZjIgLSAxLCBoMyA9IDEgLSAoTWF0aC5mbG9vcihsNCAvIHAyKSArIDAuNSkgKiBmMjsKICAgICAgICBzd2l0Y2ggKHMzKSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIG4yLnNldCgtMSwgaDMsIC1jMyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBuMi5zZXQoMSwgaDMsIGMzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIG4yLnNldCgtYzMsIDEsIC1oMyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICBuMi5zZXQoLWMzLCAtMSwgaDMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgbjIuc2V0KC1jMywgaDMsIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgbjIuc2V0KGMzLCBoMywgLTEpOwogICAgICAgIH0KICAgICAgICBjb25zdCBkMyA9IG4yLmxlbmd0aFNxKCksIHUzID0gNCAvIChNYXRoLnNxcnQoZDMpICogZDMpOwogICAgICAgIHQyICs9IHUzLCBpMi5jb3B5KG4yKS5ub3JtYWxpemUoKSwgUmUuU3BoZXJpY2FsSGFybW9uaWNzMy5nZXRCYXNpc0F0KGkyLCBvMik7CiAgICAgICAgZm9yIChsZXQgZTIgPSAwO2UyIDwgOTsgZTIrKykKICAgICAgICAgIGEyW2UyXS54ICs9IG8yW2UyXSAqIHIyLnIgKiB1MywgYTJbZTJdLnkgKz0gbzJbZTJdICogcjIuZyAqIHUzLCBhMltlMl0ueiArPSBvMltlMl0gKiByMi5iICogdTM7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IEEyID0gNCAqIE1hdGguUEkgLyB0MjsKICAgIGZvciAobGV0IGUyID0gMDtlMiA8IDk7IGUyKyspCiAgICAgIGEyW2UyXS54ICo9IEEyLCBhMltlMl0ueSAqPSBBMiwgYTJbZTJdLnogKj0gQTI7CiAgICByZXR1cm4gbmV3IFJlLkxpZ2h0UHJvYmUoczIpOwogIH0KICBzdGF0aWMgYXN5bmMgZnJvbUN1YmVSZW5kZXJUYXJnZXQoZSwgdDIpIHsKICAgIGNvbnN0IG4yID0gZS5jb29yZGluYXRlU3lzdGVtID09PSBSZS5XZWJHTENvb3JkaW5hdGVTeXN0ZW0gPyAtMSA6IDE7CiAgICBsZXQgaTIgPSAwOwogICAgY29uc3QgcjIgPSBuZXcgUmUuVmVjdG9yMywgbzIgPSBuZXcgUmUuVmVjdG9yMywgczIgPSBuZXcgUmUuQ29sb3IsIGEyID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdLCBBMiA9IG5ldyBSZS5TcGhlcmljYWxIYXJtb25pY3MzLCBsMiA9IEEyLmNvZWZmaWNpZW50cywgYzIgPSB0Mi50ZXh0dXJlLnR5cGUsIGgyID0gdDIud2lkdGg7CiAgICBsZXQgZDI7CiAgICBlLmlzV2ViR0xSZW5kZXJlciAmJiAoZDIgPSBjMiA9PT0gUmUuSGFsZkZsb2F0VHlwZSA/IG5ldyBVaW50MTZBcnJheShoMiAqIGgyICogNCkgOiBuZXcgVWludDhBcnJheShoMiAqIGgyICogNCkpOwogICAgZm9yIChsZXQgQTMgPSAwO0EzIDwgNjsgQTMrKykgewogICAgICBlLmlzV2ViR0xSZW5kZXJlciA/IGF3YWl0IGUucmVhZFJlbmRlclRhcmdldFBpeGVsc0FzeW5jKHQyLCAwLCAwLCBoMiwgaDIsIGQyLCBBMykgOiBkMiA9IGF3YWl0IGUucmVhZFJlbmRlclRhcmdldFBpeGVsc0FzeW5jKHQyLCAwLCAwLCBoMiwgaDIsIDAsIEEzKTsKICAgICAgY29uc3QgdTMgPSAyIC8gaDI7CiAgICAgIGZvciAobGV0IGUyID0gMCwgZzIgPSBkMi5sZW5ndGg7ZTIgPCBnMjsgZTIgKz0gNCkgewogICAgICAgIGxldCBnMywgcDIsIGYyOwogICAgICAgIGMyID09PSBSZS5IYWxmRmxvYXRUeXBlID8gKGczID0gUmUuRGF0YVV0aWxzLmZyb21IYWxmRmxvYXQoZDJbZTJdKSwgcDIgPSBSZS5EYXRhVXRpbHMuZnJvbUhhbGZGbG9hdChkMltlMiArIDFdKSwgZjIgPSBSZS5EYXRhVXRpbHMuZnJvbUhhbGZGbG9hdChkMltlMiArIDJdKSkgOiAoZzMgPSBkMltlMl0gLyAyNTUsIHAyID0gZDJbZTIgKyAxXSAvIDI1NSwgZjIgPSBkMltlMiArIDJdIC8gMjU1KSwgczIuc2V0UkdCKGczLCBwMiwgZjIpLCBzaShzMiwgdDIudGV4dHVyZS5jb2xvclNwYWNlKTsKICAgICAgICBjb25zdCBtMiA9IGUyIC8gNCwgRTIgPSAoMSAtIChtMiAlIGgyICsgMC41KSAqIHUzKSAqIG4yLCBDMiA9IDEgLSAoTWF0aC5mbG9vcihtMiAvIGgyKSArIDAuNSkgKiB1MzsKICAgICAgICBzd2l0Y2ggKEEzKSB7CiAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHIyLnNldCgtMSAqIG4yLCBDMiwgRTIgKiBuMik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICByMi5zZXQoMSAqIG4yLCBDMiwgLUUyICogbjIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgcjIuc2V0KEUyLCAxLCAtQzIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgcjIuc2V0KEUyLCAtMSwgQzIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgcjIuc2V0KEUyLCBDMiwgMSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICByMi5zZXQoLUUyLCBDMiwgLTEpOwogICAgICAgIH0KICAgICAgICBjb25zdCB2MiA9IHIyLmxlbmd0aFNxKCksIEIyID0gNCAvIChNYXRoLnNxcnQodjIpICogdjIpOwogICAgICAgIGkyICs9IEIyLCBvMi5jb3B5KHIyKS5ub3JtYWxpemUoKSwgUmUuU3BoZXJpY2FsSGFybW9uaWNzMy5nZXRCYXNpc0F0KG8yLCBhMik7CiAgICAgICAgZm9yIChsZXQgZTMgPSAwO2UzIDwgOTsgZTMrKykKICAgICAgICAgIGwyW2UzXS54ICs9IGEyW2UzXSAqIHMyLnIgKiBCMiwgbDJbZTNdLnkgKz0gYTJbZTNdICogczIuZyAqIEIyLCBsMltlM10ueiArPSBhMltlM10gKiBzMi5iICogQjI7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHUyID0gNCAqIE1hdGguUEkgLyBpMjsKICAgIGZvciAobGV0IGUyID0gMDtlMiA8IDk7IGUyKyspCiAgICAgIGwyW2UyXS54ICo9IHUyLCBsMltlMl0ueSAqPSB1MiwgbDJbZTJdLnogKj0gdTI7CiAgICByZXR1cm4gbmV3IFJlLkxpZ2h0UHJvYmUoQTIpOwogIH0KfQpmdW5jdGlvbiBzaShlLCB0MikgewogIHN3aXRjaCAodDIpIHsKICAgIGNhc2UgUmUuU1JHQkNvbG9yU3BhY2U6CiAgICAgIGUuY29udmVydFNSR0JUb0xpbmVhcigpOwogICAgICBicmVhazsKICAgIGNhc2UgUmUuTGluZWFyU1JHQkNvbG9yU3BhY2U6CiAgICBjYXNlIFJlLk5vQ29sb3JTcGFjZToKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBjb25zb2xlLndhcm4oIldBUk5JTkc6IExpZ2h0UHJvYmVHZW5lcmF0b3IgY29udmVydENvbG9yVG9MaW5lYXIoKSBlbmNvdW50ZXJlZCBhbiB1bnN1cHBvcnRlZCBjb2xvciBzcGFjZS4iKTsKICB9CiAgcmV0dXJuIGU7Cn0KZnVuY3Rpb24gd2koKSB7CiAgcmV0dXJuIHZpIHx8IEJpOwp9CmZ1bmN0aW9uIHhpKCkgewogIHJldHVybiBCaTsKfQpmdW5jdGlvbiBRaSgpIHsKICByZXR1cm4gdmk7Cn0KZnVuY3Rpb24gRGkoZSkgewogIHZhciB0MiA9IGUgfHwgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7CiAgcmV0dXJuIC9OZXh1cyAoN3w5KXx4b29tfHNjaC1pODAwfHBsYXlib29rfHRhYmxldHxraW5kbGUvaS50ZXN0KHQyKSB8fCBraSgpOwp9CmZ1bmN0aW9uIGtpKGUsIHQyLCBuMikgewogIHZhciBpMiA9IGUgfHwgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsIHIyID0gdDIgfHwgd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSwgbzIgPSBuMiB8fCB3aW5kb3cubmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8IDA7CiAgcmV0dXJuIChyMiA9PT0gImlQYWQiIHx8IHIyID09PSAiTWFjSW50ZWwiKSAmJiBvMiA+IDAgJiYgL01hY2ludG9zaHxJbnRlbHxpUGFkfGlwYWQvaS50ZXN0KGkyKSAmJiAhd2luZG93Lk1TU3RyZWFtOwp9CmZ1bmN0aW9uIFRpKCkgewogIHZhciBlID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmNsdWRlcygiTWFjaW50b3NoIiksIHQyID0gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID09PSA1OwogIHJldHVybiBlICYmIHQyICYmIGJpOwp9CmZ1bmN0aW9uIFJpKCkgewogIHJldHVybiAvaVBhZHxpUGhvbmV8aVBvZC8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtKTsKfQpmdW5jdGlvbiBGaSgpIHsKICByZXR1cm4gIVNpKCkgJiYgIVBpKCkgJiYgd2luZG93Lm9yaWVudGF0aW9uICE9PSB1bmRlZmluZWQ7Cn0KZnVuY3Rpb24gVWkoKSB7CiAgcmV0dXJuIC8oT2N1bHVzQnJvd3NlcikvaS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KTsKfQpmdW5jdGlvbiBPaSgpIHsKICByZXR1cm4gLyhNb2JpbGUgVlIpL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCk7Cn0KZnVuY3Rpb24gUGkoKSB7CiAgcmV0dXJuIFVpKCkgfHwgT2koKSB8fCBUaSgpOwp9CmZ1bmN0aW9uIEdpKCkgewogIHJldHVybiAvUjcgQnVpbGQvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpOwp9CmZ1bmN0aW9uIE5pKCkgewogIHZhciBlID0gd2luZG93Lm9yaWVudGF0aW9uOwogIHJldHVybiBHaSgpICYmIChlICs9IDkwKSwgZSA9PT0gOTAgfHwgZSA9PT0gLTkwOwp9CmZ1bmN0aW9uIHFpKCkgewogIHJldHVybiB7fTsKfQpmdW5jdGlvbiBWaShlKSB7CiAgdmFyIHQyID0gW10sIG4yID0gbnVsbDsKICBmdW5jdGlvbiBpMihpMykgewogICAgdmFyIHIyLCBvMjsKICAgIGlmICgoaTMgPSBpMyA9PT0gdW5kZWZpbmVkID8gdDIubGVuZ3RoIDogaTMpID4gMCAmJiBuMiA9PSBudWxsICYmIChuMiA9IDApLCBpMyA+IDApCiAgICAgIGZvciAocjIgPSB0Mi5sZW5ndGgsIHQyLmxlbmd0aCArPSBOdW1iZXIoaTMpLCBvMiA9IHIyO28yIDwgdDIubGVuZ3RoOyBvMisrKQogICAgICAgIHQyW28yXSA9IGUoKTsKICAgIHJldHVybiB0Mi5sZW5ndGg7CiAgfQogIHJldHVybiBlID0gZSB8fCBxaSwgeyBncm93OiBpMiwgcG9vbDogdDIsIHJlY3ljbGU6IGZ1bmN0aW9uKGUyKSB7CiAgICBlMiBpbnN0YW5jZW9mIE9iamVjdCAmJiAobjIgIT09IG51bGwgJiYgbjIgIT09IC0xID8gdDJbLS1uMl0gPSBlMiA6IHQyW3QyLmxlbmd0aF0gPSBlMik7CiAgfSwgc2l6ZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdDIubGVuZ3RoOwogIH0sIHVzZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZTI7CiAgICByZXR1cm4gbjIgIT09IG51bGwgJiYgbjIgIT09IHQyLmxlbmd0aCB8fCBpMih0Mi5sZW5ndGggfHwgNSksIGUyID0gdDJbbjJdLCB0MltuMisrXSA9IEhpLCB6aShlMiksIGUyOwogIH0gfTsKfQpmdW5jdGlvbiB6aShlKSB7CiAgdmFyIHQyOwogIGlmIChlICYmIGUuY29uc3RydWN0b3IgPT09IE9iamVjdCkKICAgIGZvciAodDIgaW4gZSkKICAgICAgZVt0Ml0gPSB1bmRlZmluZWQ7Cn0KZnVuY3Rpb24gWWkoZSwgdDIpIHsKICB2YXIgbjI7CiAgaWYgKGUgJiYgZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KQogICAgZm9yIChuMiBpbiBlKQogICAgICBuMiBpbiB0MiB8fCBkZWxldGUgZVtuMl07Cn0KZnVuY3Rpb24gWmkoZSwgdDIsIG4yKSB7CiAgdmFyIGkyLCByMiwgbzIsIHMyLCBhMiwgQTIsIGwyLCBjMiwgaDIgPSBuMiAmJiB0eXBlb2YgbjIgPT0gIm9iamVjdCIgPyBuMiA6IHt9OwogIGlmIChlICYmIGUgaW5zdGFuY2VvZiBPYmplY3QpCiAgICByZXR1cm4gYTIgPSBlLnggPT09IHVuZGVmaW5lZCA/IHQyICYmIHQyLnggOiBlLngsIEEyID0gZS55ID09PSB1bmRlZmluZWQgPyB0MiAmJiB0Mi55IDogZS55LCBsMiA9IGUueiA9PT0gdW5kZWZpbmVkID8gdDIgJiYgdDIueiA6IGUueiwgYzIgPSBlLncgPT09IHVuZGVmaW5lZCA/IHQyICYmIHQyLncgOiBlLncsIGEyICE9IG51bGwgJiYgKGgyLnggPSBpcihhMikpLCBBMiAhPSBudWxsICYmIChoMi55ID0gaXIoQTIpKSwgbDIgIT0gbnVsbCAmJiAoaDIueiA9IGlyKGwyKSksIGMyICE9IG51bGwgJiYgKGgyLncgPSBpcihjMikpLCBoMjsKICBpZiAoZSA9PSBudWxsKQogICAgcmV0dXJuIHR5cGVvZiB0MiA9PSAib2JqZWN0IiA/IE9iamVjdC5hc3NpZ24oaDIsIHQyKSA6IHQyOwogIGZvciAoaTIgPSBlLnRyaW0oKS5zcGxpdChYaSksIHMyID0gMDtzMiA8IFdpLmxlbmd0aDsgczIrKykKICAgIGlmIChvMiA9IFdpW3MyXSwgaTJbczJdKQogICAgICBoMltvMl0gPSBwYXJzZUZsb2F0KGkyW3MyXSwgMTApOwogICAgZWxzZSB7CiAgICAgIGlmICgocjIgPSB0MiAmJiB0MltvMl0pID09PSB1bmRlZmluZWQpCiAgICAgICAgY29udGludWU7CiAgICAgIGgyW28yXSA9IGlyKHIyKTsKICAgIH0KICByZXR1cm4gaDI7Cn0KZnVuY3Rpb24gJGkoZSkgewogIHZhciB0MjsKICByZXR1cm4gdHlwZW9mIGUgIT0gIm9iamVjdCIgPyBlIDogKHQyID0gZS54ICsgIiAiICsgZS55LCBlLnogIT0gbnVsbCAmJiAodDIgKz0gIiAiICsgZS56KSwgZS53ICE9IG51bGwgJiYgKHQyICs9ICIgIiArIGUudyksIHQyKTsKfQpmdW5jdGlvbiBlcihlLCB0MikgewogIHJldHVybiB0eXBlb2YgZSAhPSAib2JqZWN0IiB8fCB0eXBlb2YgdDIgIT0gIm9iamVjdCIgPyBlID09PSB0MiA6IGUueCA9PT0gdDIueCAmJiBlLnkgPT09IHQyLnkgJiYgZS56ID09PSB0Mi56ICYmIGUudyA9PT0gdDIudzsKfQpmdW5jdGlvbiB0cihlKSB7CiAgcmV0dXJuIEppLnRlc3QoZSk7Cn0KZnVuY3Rpb24gbnIoZSkgewogIHJldHVybiBLaSgiYEFGUkFNRS51dGlscy5pc0Nvb3JkaW5hdGVgIGhhcyBiZWVuIHJlbmFtZWQgdG8gYEFGUkFNRS51dGlscy5pc0Nvb3JkaW5hdGVzYCIpLCB0cihlKTsKfQpmdW5jdGlvbiBpcihlKSB7CiAgcmV0dXJuIGUgIT0gbnVsbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTdHJpbmcgPyBwYXJzZUZsb2F0KGUsIDEwKSA6IGU7Cn0KZnVuY3Rpb24gcnIoZSkgewogIHJldHVybiBuZXcgUmUuVmVjdG9yMyhlLngsIGUueSwgZS56KTsKfQpmdW5jdGlvbiBzcihlLCB0MikgewogIHZhciBuMiA9IG9yKGUsIHQyID0gdDIgfHwgIi4iKTsKICByZXR1cm4gbjIubGVuZ3RoID09PSAxID8gbjJbMF0gOiBuMjsKfQpmdW5jdGlvbiBhcihlLCB0MiwgbjIpIHsKICB2YXIgaTI7CiAgcmV0dXJuIG4yID0gbjIgfHwgIi4iLCB0Mi5pbmRleE9mKG4yKSAhPT0gLTEgPyAoaTIgPSBzcih0MiwgbjIpKS5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nID8gZS5nZXRBdHRyaWJ1dGUoaTIpIDogZS5nZXRBdHRyaWJ1dGUoaTJbMF0pW2kyWzFdXSA6IGUuZ2V0QXR0cmlidXRlKHQyKTsKfQpmdW5jdGlvbiBBcihlLCB0MiwgbjIsIGkyKSB7CiAgdmFyIHIyOwogIGkyID0gaTIgfHwgIi4iLCB0Mi5pbmRleE9mKGkyKSA9PT0gLTEgPyBlLnNldEF0dHJpYnV0ZSh0MiwgbjIpIDogKHIyID0gc3IodDIsIGkyKSkuY29uc3RydWN0b3IgPT09IFN0cmluZyA/IGUuc2V0QXR0cmlidXRlKHIyLCBuMikgOiBlLnNldEF0dHJpYnV0ZShyMlswXSwgcjJbMV0sIG4yKTsKfQpmdW5jdGlvbiBscihlKSB7CiAgdmFyIHQyID0gZS5zdHlsZS53aWR0aCwgbjIgPSBlLnN0eWxlLmhlaWdodDsKICBlLnN0eWxlLndpZHRoID0gcGFyc2VJbnQodDIsIDEwKSArIDEgKyAicHgiLCBlLnN0eWxlLmhlaWdodCA9IHBhcnNlSW50KG4yLCAxMCkgKyAxICsgInB4Iiwgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgIGUuc3R5bGUud2lkdGggPSB0MiwgZS5zdHlsZS5oZWlnaHQgPSBuMjsKICB9LCAyMDApOwp9CmZ1bmN0aW9uIGhyKGUsIHQyLCBuMikgewogIChmdW5jdGlvbihlMiwgdDMpIHsKICAgIHZhciBuMzsKICAgIGUyLnRhZ05hbWUgPyB0MyhlMi50YWdOYW1lID09PSAiSU1HIikgOiAoKG4zID0gbmV3IFhNTEh0dHBSZXF1ZXN0KS5vcGVuKCJIRUFEIiwgZTIpLCBuMy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZnVuY3Rpb24oaTIpIHsKICAgICAgdmFyIHIyOwogICAgICBuMy5zdGF0dXMgPj0gMjAwICYmIG4zLnN0YXR1cyA8IDMwMCA/IChyMiA9IG4zLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSkgPT0gbnVsbCA/IHByKGUyLCB0MykgOiByMi5zdGFydHNXaXRoKCJpbWFnZSIpID8gdDModHJ1ZSkgOiB0MyhmYWxzZSkgOiBwcihlMiwgdDMpLCBuMy5hYm9ydCgpOwogICAgfSksIG4zLnNlbmQoKSk7CiAgfSkoZSwgZnVuY3Rpb24oaTIpIHsKICAgIGkyID8gdDIoZSkgOiBuMihlKTsKICB9KTsKfQpmdW5jdGlvbiBkcihlLCB0MiwgbjIpIHsKICB2YXIgaTIsIHIyLCBvMiwgczIgPSAiIiwgYTIgPSBbXTsKICBpZiAodHlwZW9mIGUgPT0gInN0cmluZyIpIHsKICAgIGxldCBBMiA9IGZ1bmN0aW9uKGUyKSB7CiAgICAgIGEyLnB1c2goZTIpLCBhMi5sZW5ndGggPT09IDYgJiYgdDIoYTIpOwogICAgfTsKICAgIGZvciAocjIgPSAwO3IyIDwgNTsgcjIrKykKICAgICAgczIgKz0gIih1cmxcXCgoPzpbXlxcKV0rKVxcKSxcXHMqKSI7CiAgICBpZiAoczIgKz0gIih1cmxcXCgoPzpbXlxcKV0rKVxcKVxccyopIiwgbzIgPSBlLm1hdGNoKG5ldyBSZWdFeHAoczIpKSkgewogICAgICBmb3IgKHIyID0gMTtyMiA8IDc7IHIyKyspCiAgICAgICAgaHIoZ3IobzJbcjJdKSwgQTIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIWUuc3RhcnRzV2l0aCgiIyIpKQogICAgICByZXR1cm4gdm9pZCBocihncihlKSB8fCBlLCBuMik7CiAgfQogIGlmIChpMiA9IGUudGFnTmFtZSA/IGUgOiBmdW5jdGlvbihlMikgewogICAgdHJ5IHsKICAgICAgdmFyIHQzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlMik7CiAgICAgIHJldHVybiB0MyB8fCBjcignTm8gZWxlbWVudCB3YXMgZm91bmQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yOiAiJXMiJywgZTIpLCB0MzsKICAgIH0gY2F0Y2ggKHQ0KSB7CiAgICAgIHJldHVybiB2b2lkIGNyKCciJXMiIGlzIG5vdCBhIHZhbGlkIHNlbGVjdG9yJywgZTIpOwogICAgfQogIH0oZSkpCiAgICByZXR1cm4gaTIudGFnTmFtZSA9PT0gIkEtQ1VCRU1BUCIgJiYgaTIuc3JjcyA/IHQyKGkyLnNyY3MpIDogaTIudGFnTmFtZSA9PT0gIklNRyIgPyBuMihpMikgOiB2b2lkIGNyKCdTZWxlY3RvciAiJXMiIGRvZXMgbm90IHBvaW50IHRvIDxhLWN1YmVtYXA+IG9yIDxpbWc+JywgZSk7Cn0KZnVuY3Rpb24gdXIoZSwgdDIpIHsKICByZXR1cm4gZHIoZSwgdDIsIGZ1bmN0aW9uKCkgewogICAgY3IoIkV4cGVjdGVkIGN1YmVtYXAgYnV0IGdvdCBpbWFnZSIpOwogIH0pOwp9CmZ1bmN0aW9uIGdyKGUpIHsKICB2YXIgdDIgPSBlLm1hdGNoKC91cmxcKCguKylcKS8pOwogIGlmICh0MikKICAgIHJldHVybiB0MlsxXTsKfQpmdW5jdGlvbiBwcihlLCB0MikgewogIHZhciBuMiA9IG5ldyBJbWFnZTsKICBuMi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZnVuY3Rpb24oKSB7CiAgICB0Mih0cnVlKTsKICB9KSwgbjIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBmdW5jdGlvbigpIHsKICAgIHQyKGZhbHNlKTsKICB9KSwgbjIuc3JjID0gZTsKfQpmdW5jdGlvbiBFcihlLCB0MikgewogIHZhciBuMiA9IHQyLm9mZnNldCB8fCB7IHg6IDAsIHk6IDAgfSwgaTIgPSB0Mi5yZXBlYXQgfHwgeyB4OiAxLCB5OiAxIH0sIHIyID0gdDIubnBvdCB8fCBmYWxzZSwgbzIgPSB0Mi5hbmlzb3Ryb3B5IHx8IFJlLlRleHR1cmUuREVGQVVMVF9BTklTT1RST1BZLCBzMiA9IGUud3JhcFMsIGEyID0gZS53cmFwVCwgQTIgPSBlLm1hZ0ZpbHRlciwgbDIgPSBlLm1pbkZpbHRlcjsKICByMiAmJiAoczIgPSBSZS5DbGFtcFRvRWRnZVdyYXBwaW5nLCBhMiA9IFJlLkNsYW1wVG9FZGdlV3JhcHBpbmcsIEEyID0gUmUuTGluZWFyRmlsdGVyLCBsMiA9IFJlLkxpbmVhckZpbHRlciksIGkyLnggPT09IDEgJiYgaTIueSA9PT0gMSB8fCAoczIgPSBSZS5SZXBlYXRXcmFwcGluZywgYTIgPSBSZS5SZXBlYXRXcmFwcGluZyksIGUub2Zmc2V0LnNldChuMi54LCBuMi55KSwgZS5yZXBlYXQuc2V0KGkyLngsIGkyLnkpLCBlLndyYXBTID09PSBzMiAmJiBlLndyYXBUID09PSBhMiAmJiBlLm1hZ0ZpbHRlciA9PT0gQTIgJiYgZS5taW5GaWx0ZXIgPT09IGwyICYmIGUuYW5pc290cm9weSA9PT0gbzIgfHwgKGUud3JhcFMgPSBzMiwgZS53cmFwVCA9IGEyLCBlLm1hZ0ZpbHRlciA9IEEyLCBlLm1pbkZpbHRlciA9IGwyLCBlLmFuaXNvdHJvcHkgPSBvMiwgZS5uZWVkc1VwZGF0ZSA9IHRydWUpOwp9CmZ1bmN0aW9uIENyKGUsIHQyLCBuMiwgaTIpIHsKICB2YXIgeyBlbDogcjIsIG1hdGVyaWFsOiBvMiB9ID0gbjIsIHMyID0gcjIuc2NlbmVFbC5zeXN0ZW1zLnJlbmRlcmVyLCBhMiA9IGkyW3QyXTsKICBpZiAobjIubWF0ZXJpYWxTcmNzIHx8IChuMi5tYXRlcmlhbFNyY3MgPSB7fSksICFhMikKICAgIHJldHVybiBkZWxldGUgbjIubWF0ZXJpYWxTcmNzW2VdLCB2b2lkIEEyKG51bGwpOwogIGZ1bmN0aW9uIEEyKHQzKSB7CiAgICBvMltlXSAhPT0gdDMgJiYgKG8yW2VdICYmIG8yW2VdLmRpc3Bvc2UoKSwgbzJbZV0gPSB0MywgbzIubmVlZHNVcGRhdGUgPSB0cnVlLCBJcihyMiwgdDMpKTsKICB9CiAgYTIgPT09IG4yLm1hdGVyaWFsU3Jjc1tlXSAmJiBvMltlXSA/IEVyKG8yW2VdLCBpMikgOiAobjIubWF0ZXJpYWxTcmNzW2VdID0gYTIsIGEyIGluc3RhbmNlb2YgUmUuVGV4dHVyZSA/IEEyKGEyKSA6IHIyLnNjZW5lRWwuc3lzdGVtcy5tYXRlcmlhbC5sb2FkVGV4dHVyZVNvdXJjZShhMiwgZnVuY3Rpb24odDMpIHsKICAgIGlmIChuMi5tYXRlcmlhbFNyY3NbZV0gPT09IGEyKSB7CiAgICAgIHZhciByMyA9IG8yW2VdOwogICAgICAhcjMgfHwgdDMgIT09IG51bGwgJiYgd3IocjMsIHQzKSB8fCAocjMgPSBudWxsKSwgIXIzICYmIHQzICYmIChyMyA9IHhyKHQzKSksIHIzICYmIChyMy5zb3VyY2UgIT09IHQzICYmIChyMy5zb3VyY2UgPSB0MywgcjMubmVlZHNVcGRhdGUgPSB0cnVlKSwgbXIuaGFzKGUpICYmIHMyLmFwcGx5Q29sb3JDb3JyZWN0aW9uKHIzKSwgRXIocjMsIGkyKSksIEEyKHIzKTsKICAgIH0KICB9KSk7Cn0KZnVuY3Rpb24gdnIoZSwgdDIpIHsKICByZXR1cm4gQ3IoIm1hcCIsICJzcmMiLCBlLCB0Mik7Cn0KZnVuY3Rpb24gQnIoZSwgdDIsIG4yKSB7CiAgdmFyIGkyID0gZTsKICBlID09PSAiYW1iaWVudE9jY2x1c2lvbiIgJiYgKGkyID0gImFvIik7CiAgdmFyIHIyID0ge307CiAgcmV0dXJuIHIyLnNyYyA9IG4yW2UgKyAiTWFwIl0sIHIyLm9mZnNldCA9IG4yW2UgKyAiVGV4dHVyZU9mZnNldCJdLCByMi5yZXBlYXQgPSBuMltlICsgIlRleHR1cmVSZXBlYXQiXSwgcjIud3JhcCA9IG4yW2UgKyAiVGV4dHVyZVdyYXAiXSwgQ3IoaTIgKyAiTWFwIiwgInNyYyIsIHQyLCByMik7Cn0KZnVuY3Rpb24geXIoZSwgdDIpIHsKICB2YXIgeyBtYXRlcmlhbDogbjIsIGVsOiBpMiB9ID0gZSwgcjIgPSAiZW52TWFwIiwgbzIgPSB0Mi5lbnZNYXAsIHMyID0gdDIuc3BoZXJpY2FsRW52TWFwLCBhMiA9IHQyLnJlZnJhY3Q7CiAgaWYgKHMyICYmIChvMiA9IHMyLCBmcigiYHNwaGVyaWNhbEVudk1hcGAgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCwgdXNpbmcgc3BoZXJpY2FsIG1hcCBhcyBlcXVpcmVjdGFuZ3VsYXIgbWFwIGluc3RlYWQuIFVzZSBgZW52TWFwYCBwcm9wZXJ0eSB3aXRoIGEgQ3ViZU1hcCBvciBFcXVpcmVjdGFuZ3VsYXIgaW1hZ2UgaW5zdGVhZC4iKSksIGUubWF0ZXJpYWxTcmNzIHx8IChlLm1hdGVyaWFsU3JjcyA9IHt9KSwgIW8yKQogICAgcmV0dXJuIGRlbGV0ZSBlLm1hdGVyaWFsU3Jjc1tyMl0sIG4yLmVudk1hcCA9IG51bGwsIHZvaWQgKG4yLm5lZWRzVXBkYXRlID0gdHJ1ZSk7CiAgZnVuY3Rpb24gQTIodDMpIHsKICAgIGUubWF0ZXJpYWxTcmNzW3IyXSA9PT0gbzIgJiYgKG4yLmVudk1hcCA9IHQzLCBuMi5uZWVkc1VwZGF0ZSA9IHRydWUsIElyKGkyLCB0MykpOwogIH0KICBlLm1hdGVyaWFsU3Jjc1tyMl0gPSBvMiwgYnJbbzJdID8gYnJbbzJdLnRoZW4oQTIpIDogYnJbbzJdID0gbmV3IFByb21pc2UoZnVuY3Rpb24oZTIpIHsKICAgIGRyKG8yLCBmdW5jdGlvbih0MykgewogICAgICBpMi5zY2VuZUVsLnN5c3RlbXMubWF0ZXJpYWwubG9hZEN1YmVNYXBUZXh0dXJlKHQzLCBmdW5jdGlvbih0NCkgewogICAgICAgIHQ0Lm1hcHBpbmcgPSBhMiA/IFJlLkN1YmVSZWZyYWN0aW9uTWFwcGluZyA6IFJlLkN1YmVSZWZsZWN0aW9uTWFwcGluZywgQTIodDQpLCBlMih0NCk7CiAgICAgIH0pOwogICAgfSwgZnVuY3Rpb24odDMpIHsKICAgICAgaTIuc2NlbmVFbC5zeXN0ZW1zLm1hdGVyaWFsLmxvYWRUZXh0dXJlKHQzLCB7IHNyYzogdDMgfSwgZnVuY3Rpb24odDQpIHsKICAgICAgICB0NC5tYXBwaW5nID0gYTIgPyBSZS5FcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyA6IFJlLkVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLCBBMih0NCksIGUyKHQ0KTsKICAgICAgfSk7CiAgICB9KTsKICB9KTsKfQpmdW5jdGlvbiBJcihlLCB0MikgewogIGZ1bmN0aW9uIG4yKCkgewogICAgZS5lbWl0KCJtYXRlcmlhbHZpZGVvbG9hZGVkZGF0YSIsIHsgc3JjOiB0Mi5pbWFnZSwgdGV4dHVyZTogdDIgfSk7CiAgfQogIGZ1bmN0aW9uIGkyKCkgewogICAgZS5lbWl0KCJtYXRlcmlhbHZpZGVvZW5kZWQiLCB7IHNyYzogdDIuaW1hZ2UsIHRleHR1cmU6IHQyIH0pOwogIH0KICB0MiAmJiAoZS5lbWl0KCJtYXRlcmlhbHRleHR1cmVsb2FkZWQiLCB7IHNyYzogdDIuaW1hZ2UsIHRleHR1cmU6IHQyIH0pLCB0Mi5pbWFnZSAmJiB0Mi5pbWFnZS50YWdOYW1lID09PSAiVklERU8iICYmICh0Mi5pbWFnZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIiwgbjIpLCB0Mi5pbWFnZS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsIGkyKSwgdDIuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsIGZ1bmN0aW9uKCkgewogICAgdDIuaW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkZGF0YSIsIG4yKSwgdDIuaW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLCBpMik7CiAgfSkpKTsKfQpmdW5jdGlvbiB3cihlLCB0MikgewogIHJldHVybiBlLnNvdXJjZSA9PT0gdDIgJiYgKHQyLmRhdGEgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCA/IGUuaXNDYW52YXNUZXh0dXJlIDogdDIuZGF0YSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQgPyBlLmlzVmlkZW9UZXh0dXJlIDogZS5pc1RleHR1cmUgJiYgIWUuaXNDYW52YXNUZXh0dXJlICYmICFlLmlzVmlkZW9UZXh0dXJlKTsKfQpmdW5jdGlvbiB4cihlKSB7CiAgdmFyIHQyOwogIHJldHVybiAodDIgPSBlLmRhdGEgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCA/IG5ldyBSZS5DYW52YXNUZXh0dXJlIDogZS5kYXRhIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCA/IG5ldyBSZS5WaWRlb1RleHR1cmUoZS5kYXRhKSA6IG5ldyBSZS5UZXh0dXJlKS5zb3VyY2UgPSBlLCB0Mi5uZWVkc1VwZGF0ZSA9IHRydWUsIHQyOwp9CmZ1bmN0aW9uIExyKGUsIHQyKSB7CiAgdmFyIG4yOwogIHJldHVybiB0eXBlb2YgZSAhPSAic3RyaW5nIiA/IGUgOiAobjIgPSBmdW5jdGlvbihlMiwgdDMpIHsKICAgIHZhciBuMywgaTIsIHIyLCBvMiwgczIsIGEyOwogICAgZm9yICh0MyA9IHQzIHx8IHt9LCBuMyA9IFRyKGUyKSwgaTIgPSAwO2kyIDwgbjMubGVuZ3RoOyBpMisrKQogICAgICAocjIgPSBuM1tpMl0pICYmIChvMiA9IHIyLmluZGV4T2YoIjoiKSwgczIgPSByMi5zdWJzdHIoMCwgbzIpLnRyaW0oKSwgYTIgPSByMi5zdWJzdHIobzIgKyAxKS50cmltKCksIHQzW1NyKHMyKV0gPSBhMik7CiAgICByZXR1cm4gdDM7CiAgfShlLCB0MiksIG4yWyIiXSA/IGUgOiBuMik7Cn0KZnVuY3Rpb24gTXIoZSkgewogIHJldHVybiB0eXBlb2YgZSA9PSAic3RyaW5nIiA/IGUgOiBmdW5jdGlvbihlMikgewogICAgdmFyIHQyLCBuMiA9IDAsIGkyID0gMCwgcjIgPSAiIjsKICAgIGZvciAodDIgaW4gZTIpCiAgICAgIG4yKys7CiAgICBmb3IgKHQyIGluIGUyKQogICAgICByMiArPSB0MiArICI6ICIgKyBlMlt0Ml0sIGkyIDwgbjIgLSAxICYmIChyMiArPSAiOyAiKSwgaTIrKzsKICAgIHJldHVybiByMjsKICB9KGUpOwp9CmZ1bmN0aW9uIFNyKGUpIHsKICByZXR1cm4gZS5yZXBsYWNlKFFyLCBScik7Cn0KZnVuY3Rpb24gUnIoZSkgewogIHJldHVybiBlWzFdLnRvVXBwZXJDYXNlKCk7Cn0KZnVuY3Rpb24gVXIoZSwgdDIsIG4yKSB7CiAgdmFyIGkyLCByMiwgbzIgPSBlLmVsOwogIGlmICgocjIgPSAhIShpMiA9IE9yKGUsIHQyLCBuMikpKSA9PT0gZS5jb250cm9sbGVyUHJlc2VudCkKICAgIHJldHVybiByMjsKICBlLmNvbnRyb2xsZXJQcmVzZW50ID0gcjIsIHIyID8gKGUuYWRkRXZlbnRMaXN0ZW5lcnMoKSwgZS5pbmplY3RUcmFja2VkQ29udHJvbHMoaTIpLCBvMi5lbWl0KCJjb250cm9sbGVyY29ubmVjdGVkIiwgeyBuYW1lOiBlLm5hbWUsIGNvbXBvbmVudDogZSB9KSkgOiAoZS5yZW1vdmVFdmVudExpc3RlbmVycygpLCBvMi5lbWl0KCJjb250cm9sbGVyZGlzY29ubmVjdGVkIiwgeyBuYW1lOiBlLm5hbWUsIGNvbXBvbmVudDogZSB9KSk7Cn0KZnVuY3Rpb24gT3IoZSwgdDIsIG4yKSB7CiAgdmFyIGkyLCByMiA9IGUuZWwuc2NlbmVFbCwgbzIgPSByMiAmJiByMi5zeXN0ZW1zWyJ0cmFja2VkLWNvbnRyb2xzIl07CiAgcmV0dXJuICEhbzIgJiYgISghKGkyID0gbzIuY29udHJvbGxlcnMpIHx8ICFpMi5sZW5ndGgpICYmIFByKGkyLCB0MiwgbjIuaGFuZCwgbjIuaW5kZXgsIG4yLml0ZXJhdGVDb250cm9sbGVyUHJvZmlsZXMsIG4yLmhhbmRUcmFja2luZyk7Cn0KZnVuY3Rpb24gUHIoZSwgdDIsIG4yLCBpMiwgcjIsIG8yKSB7CiAgdmFyIHMyLCBhMiwgQTIsIGwyLCBjMiA9IGZhbHNlOwogIGZvciAoczIgPSAwO3MyIDwgZS5sZW5ndGg7IHMyKyspIHsKICAgIGlmIChsMiA9IChBMiA9IGVbczJdKS5wcm9maWxlcywgbzIpCiAgICAgIGMyID0gQTIuaGFuZDsKICAgIGVsc2UgaWYgKHIyKQogICAgICBmb3IgKGEyID0gMDthMiA8IGwyLmxlbmd0aCAmJiAhKGMyID0gbDJbYTJdLnN0YXJ0c1dpdGgodDIpKTsgYTIrKykKICAgICAgICA7CiAgICBlbHNlCiAgICAgIGMyID0gbDIubGVuZ3RoID4gMCAmJiBsMlswXS5zdGFydHNXaXRoKHQyKTsKICAgIGlmIChjMikgewogICAgICBpZiAoQTIuaGFuZGVkbmVzcyA9PT0gInJpZ2h0IiB8fCBBMi5oYW5kZWRuZXNzID09PSAibGVmdCIpIHsKICAgICAgICBpZiAoQTIuaGFuZGVkbmVzcyA9PT0gbjIpCiAgICAgICAgICByZXR1cm4gZVtzMl07CiAgICAgIH0gZWxzZSBpZiAoczIgPT09IGkyKQogICAgICAgIHJldHVybiBlW3MyXTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gR3IoZSwgdDIsIG4yKSB7CiAgdmFyIGkyLCByMiwgbzIsIHMyLCBhMjsKICBmb3IgKHIyIGluIHQyKSB7CiAgICBmb3IgKGkyID0gdDJbcjJdLCBvMiA9IGZhbHNlLCBhMiA9IDA7YTIgPCBpMi5sZW5ndGg7IGEyKyspCiAgICAgIG4yLmRldGFpbC5jaGFuZ2VkW2kyW2EyXV0gJiYgKG8yID0gdHJ1ZSk7CiAgICBpZiAobzIpIHsKICAgICAgZm9yIChzMiA9IHt9LCBhMiA9IDA7YTIgPCBpMi5sZW5ndGg7IGEyKyspCiAgICAgICAgczJbRnJbYTJdXSA9IG4yLmRldGFpbC5heGlzW2kyW2EyXV07CiAgICAgIGUuZWwuZW1pdChyMiArICJtb3ZlZCIsIHMyKTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gTnIoZSwgdDIsIG4yLCBpMikgewogIHZhciByMiA9IChpMiA/IG4yLm1hcHBpbmdbaTJdIDogbjIubWFwcGluZykuYnV0dG9uc1tlXTsKICBuMi5lbC5lbWl0KHIyICsgdDIpLCBuMi51cGRhdGVNb2RlbCAmJiBuMi51cGRhdGVNb2RlbChyMiwgdDIpOwp9CmZ1bmN0aW9uIF9yKGUpIHsKICByZXR1cm4gZS5iaW5kLmFwcGx5KGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOwp9CmZ1bmN0aW9uIEhyKCkgewogIHJldHVybiBqcigiYHV0aWxzLmNoZWNrSGVhZHNldENvbm5lY3RlZGAgaGFzIG1vdmVkIHRvIGB1dGlscy5kZXZpY2UuY2hlY2tIZWFkc2V0Q29ubmVjdGVkYCIpLCB3aSgpOwp9CmZ1bmN0aW9uIHFyKCkgewogIHJldHVybiBqcigiYHV0aWxzLmlzSU9TYCBoYXMgbW92ZWQgdG8gYHV0aWxzLmRldmljZS5pc0lPU2AiKSwgUmkoKTsKfQpmdW5jdGlvbiBWcigpIHsKICByZXR1cm4ganIoImB1dGlscy5pc01vYmlsZSBoYXMgbW92ZWQgdG8gYHV0aWxzLmRldmljZS5pc01vYmlsZWAiKSwgU2koYXJndW1lbnRzKTsKfQpmdW5jdGlvbiB6cihlLCB0MiwgbjIpIHsKICB2YXIgaTI7CiAgcmV0dXJuIG4yICYmIChlID0gZS5iaW5kKG4yKSksIGZ1bmN0aW9uKCkgewogICAgdmFyIG4zID0gRGF0ZS5ub3coKTsKICAgIChpMiA9PT0gdW5kZWZpbmVkIHx8IChpMiA9PT0gdW5kZWZpbmVkID8gdDIgOiBuMyAtIGkyKSA+PSB0MikgJiYgKGkyID0gbjMsIGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7CiAgfTsKfQpmdW5jdGlvbiBZcihlLCB0MiwgbjIpIHsKICB2YXIgaTIsIHIyLCBvMjsKICBuMiAmJiAoZSA9IGUuYmluZChuMikpOwogIHZhciBzMiA9IGZ1bmN0aW9uKCkgewogICAgaTIgPSBEYXRlLm5vdygpLCBlLmFwcGx5KHRoaXMsIG8yKSwgcjIgPSB1bmRlZmluZWQ7CiAgfTsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgbjMgPSBEYXRlLm5vdygpLCBhMiA9IGkyID09PSB1bmRlZmluZWQgPyB0MiA6IG4zIC0gaTI7CiAgICBhMiA+PSB0MiA/IChjbGVhclRpbWVvdXQocjIpLCByMiA9IHVuZGVmaW5lZCwgaTIgPSBuMywgZS5hcHBseShudWxsLCBhcmd1bWVudHMpKSA6IChyMiA9IHIyIHx8IHNldFRpbWVvdXQoczIsIHQyIC0gYTIpLCBvMiA9IGFyZ3VtZW50cyk7CiAgfTsKfQpmdW5jdGlvbiBLcihlLCB0MiwgbjIpIHsKICB2YXIgaTI7CiAgcmV0dXJuIG4yICYmIChlID0gZS5iaW5kKG4yKSksIGZ1bmN0aW9uKG4zLCByMikgewogICAgdmFyIG8yID0gaTIgPT09IHVuZGVmaW5lZCA/IHIyIDogbjMgLSBpMjsKICAgIChpMiA9PT0gdW5kZWZpbmVkIHx8IG8yID49IHQyKSAmJiAoaTIgPSBuMywgZShuMywgbzIpKTsKICB9Owp9CmZ1bmN0aW9uIFdyKGUsIHQyLCBuMikgewogIHZhciBpMjsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgcjIgPSB0aGlzLCBvMiA9IGFyZ3VtZW50cywgczIgPSBuMiAmJiAhaTI7CiAgICBjbGVhclRpbWVvdXQoaTIpLCBpMiA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgIGkyID0gbnVsbCwgbjIgfHwgZS5hcHBseShyMiwgbzIpOwogICAgfSwgdDIpLCBzMiAmJiBlLmFwcGx5KHIyLCBvMik7CiAgfTsKfQpmdW5jdGlvbiBacihlKSB7CiAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZSkpOwp9CmZ1bmN0aW9uIGlvKGUpIHsKICByZXR1cm4gIWUubWV0YUtleSAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBkb2N1bWVudC5ib2R5Owp9CmZ1bmN0aW9uIHJvKGUsIHQyKSB7CiAgdDIgPT09IHVuZGVmaW5lZCAmJiAodDIgPSAiICIpOwogIHZhciBuMiA9IG5ldyBSZWdFeHAodDIsICJnIik7CiAgcmV0dXJuIChlID0gKGUgfHwgIiIpLnJlcGxhY2UobjIsIHQyKSkuc3BsaXQodDIpOwp9CmZ1bmN0aW9uIG9vKGUsIHQyKSB7CiAgdDIgPSB0MiB8fCB7fTsKICB2YXIgbjIgPSB7fTsKICByZXR1cm4gT2JqZWN0LmtleXModDIpLmZvckVhY2goZnVuY3Rpb24odDMpIHsKICAgIGUuaGFzQXR0cmlidXRlKHQzKSAmJiAobjJbdDNdID0gZS5nZXRBdHRyaWJ1dGUodDMpKTsKICB9KSwgbjI7Cn0KZnVuY3Rpb24gc28oZSkgewogIGUgPSBlLnJlcGxhY2UoL1tcW10vLCAiXFxbIikucmVwbGFjZSgvW1xdXS8sICJcXF0iKTsKICB2YXIgdDIgPSBuZXcgUmVnRXhwKCJbXFw/Jl0iICsgZSArICI9KFteJiNdKikiKS5leGVjKGxvY2F0aW9uLnNlYXJjaCk7CiAgcmV0dXJuIHQyID09PSBudWxsID8gIiIgOiBkZWNvZGVVUklDb21wb25lbnQodDJbMV0ucmVwbGFjZSgvXCsvZywgIiAiKSk7Cn0KZnVuY3Rpb24gYW8oKSB7CiAgcmV0dXJuIHdpbmRvdy50b3AgIT09IHdpbmRvdy5zZWxmOwp9CmZ1bmN0aW9uIEFvKGUpIHsKICBmb3IgKHZhciB0MiA9IFtdLCBuMiA9IGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSwgaTIgPSAwLCByMiA9IG4yLmxlbmd0aDtpMiA8IHIyOyBpMisrKQogICAgbjJbaTJdLmlzU2NlbmUgJiYgdDIucHVzaChuMltpMl0pOwogIHJldHVybiB0MjsKfQpmdW5jdGlvbiB1byhlKSB7CiAgcmV0dXJuIHsgdGFnTmFtZTogIm1ldGEiLCBhdHRyaWJ1dGVzOiBlLCBleGlzdHM6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT0iJyArIGUubmFtZSArICciXScpOwogIH0gfTsKfQpmdW5jdGlvbiBCbyhlKSB7CiAgdmFyIHQyID0gZ28uaGFzQXR0cmlidXRlKCJlbWJlZGRlZCIpLCBuMiA9IGZvKGdvLmNhbnZhcywgdDIsIGdvLm1heENhbnZhc1NpemUsIGdvLmlzKCJ2ci1tb2RlIikpOwogIGUuYXNwZWN0ID0gbjIud2lkdGggLyBuMi5oZWlnaHQsIGUudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpLCBnby5yZW5kZXJlci5zZXRTaXplKG4yLndpZHRoLCBuMi5oZWlnaHQsIGZhbHNlKTsKfQpmdW5jdGlvbiBRbyhlLCB0MiwgbjIsIGkyLCByMiwgbzIpIHsKICBpZiAoZSBpbiBJbykKICAgIHRocm93IG5ldyBFcnJvcigiUHJvcGVydHkgdHlwZSAiICsgZSArICIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiIpOwogIElvW2VdID0geyBkZWZhdWx0OiB0MiwgcGFyc2U6IG4yIHx8IERvLCBzdHJpbmdpZnk6IGkyIHx8IGtvLCBlcXVhbHM6IHIyIHx8IFRvLCBpc0NhY2hlYWJsZTogbzIgIT09IGZhbHNlIH07Cn0KZnVuY3Rpb24gTG8oZSwgdDIpIHsKICBpZiAoIUFycmF5LmlzQXJyYXkoZSkgfHwgIUFycmF5LmlzQXJyYXkodDIpKQogICAgcmV0dXJuIGUgPT09IHQyOwogIGlmIChlLmxlbmd0aCAhPT0gdDIubGVuZ3RoKQogICAgcmV0dXJuIGZhbHNlOwogIGZvciAodmFyIG4yID0gMDtuMiA8IGUubGVuZ3RoOyBuMisrKQogICAgaWYgKGVbbjJdICE9PSB0MltuMl0pCiAgICAgIHJldHVybiBmYWxzZTsKICByZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiBNbyhlKSB7CiAgdmFyIHQyLCBuMjsKICByZXR1cm4gdHlwZW9mIGUgIT0gInN0cmluZyIgPyBlIDogKG4yID0gZS5tYXRjaCh4bykpID8gbjJbMV0gOiBlLmNoYXJBdCgwKSA9PT0gIiMiID8gKHQyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZS5zdWJzdHJpbmcoMSkpKSA/IHQyLnRhZ05hbWUgPT09ICJDQU5WQVMiIHx8IHQyLnRhZ05hbWUgPT09ICJWSURFTyIgfHwgdDIudGFnTmFtZSA9PT0gIklNRyIgPyB0MiA6IHQyLmdldEF0dHJpYnV0ZSgic3JjIikgOiB2b2lkIHlvKCciJyArIGUgKyAnIiBhc3NldCBub3QgZm91bmQuJykgOiBlOwp9CmZ1bmN0aW9uIFNvKGUpIHsKICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUgPyBlLmdldEF0dHJpYnV0ZSgiaWQiKSA/ICIjIiArIGUuZ2V0QXR0cmlidXRlKCJpZCIpIDogZS5nZXRBdHRyaWJ1dGUoInNyYyIpIDoga28oZSk7Cn0KZnVuY3Rpb24gRG8oZSkgewogIHJldHVybiBlOwp9CmZ1bmN0aW9uIGtvKGUpIHsKICByZXR1cm4gZSA9PT0gbnVsbCA/ICJudWxsIiA6IGUudG9TdHJpbmcoKTsKfQpmdW5jdGlvbiBUbyhlLCB0MikgewogIHJldHVybiBlID09PSB0MjsKfQpmdW5jdGlvbiBSbyhlKSB7CiAgcmV0dXJuIHBhcnNlSW50KGUsIDEwKTsKfQpmdW5jdGlvbiBGbyhlLCB0MiwgbjIpIHsKICByZXR1cm4gWmkoZSwgdDIsIG4yKTsKfQpmdW5jdGlvbiBVbyhlLCB0MikgewogIGlmIChlID09PSBudWxsKQogICAgcmV0dXJuIHRydWU7CiAgaWYgKHR5cGVvZiBlICE9ICJvYmplY3QiKQogICAgcmV0dXJuIGZhbHNlOwogIGlmIChPYmplY3Qua2V5cyhlKS5sZW5ndGggIT09IHQyKQogICAgcmV0dXJuIGZhbHNlOwogIHZhciB7IHg6IG4yLCB5OiBpMiwgejogcjIsIHc6IG8yIH0gPSBlOwogIHJldHVybiAhKHR5cGVvZiBuMiAhPSAibnVtYmVyIiB8fCB0eXBlb2YgaTIgIT0gIm51bWJlciIgfHwgdDIgPiAyICYmIHR5cGVvZiByMiAhPSAibnVtYmVyIiB8fCB0MiA+IDMgJiYgdHlwZW9mIG8yICE9ICJudW1iZXIiKTsKfQpmdW5jdGlvbiBObyhlKSB7CiAgcmV0dXJuICJ0eXBlIiBpbiBlID8gdHlwZW9mIGUudHlwZSA9PSAic3RyaW5nIiA6ICgiZGVmYXVsdCIgaW4gZSk7Cn0KZnVuY3Rpb24gam8oZSwgdDIpIHsKICB2YXIgbjI7CiAgaWYgKE5vKGUpKQogICAgcmV0dXJuIF9vKGUsIHQyKTsKICBmb3IgKG4yIGluIGUpCiAgICBlW24yXSA9IF9vKGVbbjJdLCB0Mik7CiAgcmV0dXJuIGU7Cn0KZnVuY3Rpb24gX28oZSwgdDIpIHsKICB2YXIgbjIsIGkyLCByMiA9IGUuZGVmYXVsdCwgbzIgPSBlLnR5cGU7CiAgcmV0dXJuIGUudHlwZSA/IGUudHlwZSA9PT0gImJvb2wiID8gbzIgPSAiYm9vbGVhbiIgOiBlLnR5cGUgPT09ICJmbG9hdCIgJiYgKG8yID0gIm51bWJlciIpIDogbzIgPSByMiA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiByMiAhPSAiYm9vbGVhbiIgJiYgdHlwZW9mIHIyICE9ICJudW1iZXIiID8gQXJyYXkuaXNBcnJheShyMikgPyAiYXJyYXkiIDogInN0cmluZyIgOiB0eXBlb2YgcjIsIChpMiA9IFBvW28yXSkgfHwgR28oIlVua25vd24gcHJvcGVydHkgdHlwZSBmb3IgY29tcG9uZW50IGAiICsgdDIgKyAiYDogIiArIG8yKSwgbjIgPSAhIWUucGFyc2UsIGUucGFyc2UgPSBlLnBhcnNlIHx8IGkyLnBhcnNlLCBlLnN0cmluZ2lmeSA9IGUuc3RyaW5naWZ5IHx8IGkyLnN0cmluZ2lmeSwgZS5lcXVhbHMgPSBlLmVxdWFscyB8fCBpMi5lcXVhbHMsIGUuaXNDYWNoZWFibGUgPSBlLmlzQ2FjaGVhYmxlID09PSB0cnVlIHx8IGkyLmlzQ2FjaGVhYmxlLCBlLnR5cGUgPSBvMiwgImRlZmF1bHQiIGluIGUgPyBuMiB8fCBPbyhvMiwgcjIpIHx8IEdvKCJEZWZhdWx0IHZhbHVlIGAiICsgcjIgKyAiYCBkb2VzIG5vdCBtYXRjaCB0eXBlIGAiICsgbzIgKyAiYCBpbiBjb21wb25lbnQgYCIgKyB0MiArICJgIikgOiBlLmRlZmF1bHQgPSBpMi5kZWZhdWx0LCBlOwp9CmZ1bmN0aW9uIFZvKGUsIHQyLCBuMikgewogIHJldHVybiBlICE9IG51bGwgJiYgZSAhPT0gIiIgfHwgKGUgPSB0Mi5kZWZhdWx0LCBBcnJheS5pc0FycmF5KGUpICYmIChlID0gZS5zbGljZSgpKSksIHQyLnBhcnNlKGUsIHQyLmRlZmF1bHQsIG4yKTsKfQpmdW5jdGlvbiB6byhlLCB0MikgewogIHZhciBuMiwgaTIsIHIyLCBvMiwgczIgPSB7fTsKICBmb3IgKG4yIGluIGUpCiAgICBpMiA9IHQyW24yXSwgdHlwZW9mIChvMiA9IHIyID0gZVtuMl0pID09ICJvYmplY3QiICYmIChvMiA9IFlvKHIyLCBpMiksIGkyIHx8IEdvKCJVbmtub3duIGNvbXBvbmVudCBwcm9wZXJ0eTogIiArIG4yKSksIG8yICE9PSB1bmRlZmluZWQgJiYgKHMyW24yXSA9IG8yKTsKICByZXR1cm4gczI7Cn0KZnVuY3Rpb24gWW8oZSwgdDIpIHsKICByZXR1cm4gdHlwZW9mIGUgIT0gIm9iamVjdCIgPyBlIDogdDIgJiYgZSAhPT0gbnVsbCA/IHQyLnN0cmluZ2lmeShlKSA6IEpTT04uc3RyaW5naWZ5KGUpOwp9CmZ1bmN0aW9uIGNzKGUsIHQyKSB7CiAgdmFyIG4yLCBpMiwgcjIsIG8yLCBzMiwgYTIgPSB7fTsKICBpZiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdCAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ICE9PSBucyAmJiBiby5mb3JFYWNoKGZ1bmN0aW9uKHQzKSB7CiAgICB0My5oYXNMb2FkZWQgfHwgZG9jdW1lbnQuY3VycmVudFNjcmlwdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0MykgIT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HICYmICh0cygiVGhlIGNvbXBvbmVudCBgIiArIGUgKyAiYCB3YXMgcmVnaXN0ZXJlZCBpbiBhIDxzY3JpcHQ+IHRhZyBhZnRlciB0aGUgc2NlbmUuIENvbXBvbmVudCA8c2NyaXB0PiB0YWdzIGluIGFuIEhUTUwgZmlsZSBzaG91bGQgYmUgZGVjbGFyZWQgKmJlZm9yZSogdGhlIHNjZW5lIHN1Y2ggdGhhdCB0aGUgY29tcG9uZW50IGlzIGF2YWlsYWJsZSB0byBlbnRpdGllcyBkdXJpbmcgc2NlbmUgaW5pdGlhbGl6YXRpb24uIiksIHdpbmRvdy5kZWJ1ZyAmJiAobHNbZV0gPSB0cnVlKSk7CiAgfSksIGlzLnRlc3QoZSkgPT09IHRydWUgJiYgdHMoIlRoZSBjb21wb25lbnQgbmFtZSBgIiArIGUgKyAiYCBjb250YWlucyB1cHBlcmNhc2UgY2hhcmFjdGVycywgYnV0IEhUTUwgd2lsbCBpZ25vcmUgdGhlIGNhcGl0YWxpemF0aW9uIG9mIGF0dHJpYnV0ZSBuYW1lcy4gQ2hhbmdlIHRoZSBuYW1lIHRvIGJlIGxvd2VyY2FzZTogYCIgKyBlLnRvTG93ZXJDYXNlKCkgKyAiYCIpLCBlLmluZGV4T2YoIl9fIikgIT09IC0xKQogICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgY29tcG9uZW50IG5hbWUgYCIgKyBlICsgImAgaXMgbm90IGFsbG93ZWQuIFRoZSBzZXF1ZW5jZSBfXyAoZG91YmxlIHVuZGVyc2NvcmUpIGlzIHJlc2VydmVkIHRvIHNwZWNpZnkgYW4gaWQgZm9yIG11bHRpcGxlIGNvbXBvbmVudHMgb2YgdGhlIHNhbWUgdHlwZSIpOwogIGlmIChPYmplY3Qua2V5cyh0MikuZm9yRWFjaChmdW5jdGlvbihlMikgewogICAgYTJbZTJdID0geyB2YWx1ZTogdDJbZTJdLCB3cml0YWJsZTogdHJ1ZSB9OwogIH0pLCBLb1tlXSkKICAgIHRocm93IG5ldyBFcnJvcigiVGhlIGNvbXBvbmVudCBgIiArIGUgKyAiYCBoYXMgYmVlbiBhbHJlYWR5IHJlZ2lzdGVyZWQuIENoZWNrIHRoYXQgeW91IGFyZSBub3QgbG9hZGluZyB0d28gdmVyc2lvbnMgb2YgdGhlIHNhbWUgY29tcG9uZW50IG9yIHR3byBkaWZmZXJlbnQgY29tcG9uZW50cyBvZiB0aGUgc2FtZSBuYW1lLiIpOwogICgobjIgPSBmdW5jdGlvbihlMiwgdDMsIG4zKSB7CiAgICBBcy5jYWxsKHRoaXMsIGUyLCB0MywgbjMpOwogIH0pLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXMucHJvdG90eXBlLCBhMikpLm5hbWUgPSBlLCBuMi5wcm90b3R5cGUuaXNQb3NpdGlvblJvdGF0aW9uU2NhbGUgPSBlID09PSAicG9zaXRpb24iIHx8IGUgPT09ICJyb3RhdGlvbiIgfHwgZSA9PT0gInNjYWxlIiwgbjIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbjIsIG4yLnByb3RvdHlwZS5zeXN0ZW0gPSBtICYmIGZzW2VdLCBuMi5wcm90b3R5cGUucGxheSA9IChvMiA9IG4yLnByb3RvdHlwZS5wbGF5LCBmdW5jdGlvbigpIHsKICAgIHZhciBlMiA9IHRoaXMuZWwuc2NlbmVFbCwgdDMgPSB0aGlzLmVsLmlzUGxheWluZyAmJiAhdGhpcy5pc1BsYXlpbmc7CiAgICB0aGlzLmluaXRpYWxpemVkICYmIHQzICYmIChvMi5jYWxsKHRoaXMpLCB0aGlzLmlzUGxheWluZyA9IHRydWUsIHRoaXMuZXZlbnRzQXR0YWNoKCksIGhzKHRoaXMpICYmIGUyLmFkZEJlaGF2aW9yKHRoaXMpKTsKICB9KSwgbjIucHJvdG90eXBlLnBhdXNlID0gKHMyID0gbjIucHJvdG90eXBlLnBhdXNlLCBmdW5jdGlvbigpIHsKICAgIHZhciBlMiA9IHRoaXMuZWwuc2NlbmVFbDsKICAgIHRoaXMuaXNQbGF5aW5nICYmIChzMi5jYWxsKHRoaXMpLCB0aGlzLmlzUGxheWluZyA9IGZhbHNlLCB0aGlzLmV2ZW50c0RldGFjaCgpLCBocyh0aGlzKSAmJiBlMi5yZW1vdmVCZWhhdmlvcih0aGlzKSk7CiAgfSksIGkyID0gSnIoSm8objIucHJvdG90eXBlLnNjaGVtYSwgbjIucHJvdG90eXBlLm5hbWUpKSwgbjIucHJvdG90eXBlLmlzU2luZ2xlUHJvcGVydHkgPSByMiA9IFhvKG4yLnByb3RvdHlwZS5zY2hlbWEpLCBuMi5wcm90b3R5cGUuaXNPYmplY3RCYXNlZCA9ICFyMiB8fCByMiAmJiAoZHMoaTIuZGVmYXVsdCkgfHwgZHMoV28odW5kZWZpbmVkLCBpMikpKSwgcnNbZV0gPSBWaSgpLCBLb1tlXSA9IHsgQ29tcG9uZW50OiBuMiwgZGVwZW5kZW5jaWVzOiBuMi5wcm90b3R5cGUuZGVwZW5kZW5jaWVzLCBiZWZvcmU6IG4yLnByb3RvdHlwZS5iZWZvcmUsIGFmdGVyOiBuMi5wcm90b3R5cGUuYWZ0ZXIsIGlzU2luZ2xlUHJvcGVydHk6IG4yLnByb3RvdHlwZS5pc1NpbmdsZVByb3BlcnR5LCBpc09iamVjdEJhc2VkOiBuMi5wcm90b3R5cGUuaXNPYmplY3RCYXNlZCwgbXVsdGlwbGU6IG4yLnByb3RvdHlwZS5tdWx0aXBsZSwgc2NlbmVPbmx5OiBuMi5wcm90b3R5cGUuc2NlbmVPbmx5LCBuYW1lOiBlLCBzY2hlbWE6IGkyLCBzdHJpbmdpZnk6IG4yLnByb3RvdHlwZS5zdHJpbmdpZnkgfTsKICBmb3IgKHZhciBBMiA9IDA7QTIgPCBiby5sZW5ndGg7IEEyKyspCiAgICBib1tBMl0uZW1pdCgiY29tcG9uZW50cmVnaXN0ZXJlZCIsIHsgbmFtZTogZSB9LCBmYWxzZSk7CiAgcmV0dXJuIG4yOwp9CmZ1bmN0aW9uIGhzKGUpIHsKICByZXR1cm4gZS50aWNrIHx8IGUudG9jazsKfQpmdW5jdGlvbiBkcyhlKSB7CiAgcmV0dXJuIGUgJiYgZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0ICYmICEoZSBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MRWxlbWVudCk7Cn0KZnVuY3Rpb24gZ3MoKSB7CiAgdXMgfHwgKHVzID0gdHJ1ZSwgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJhZnJhbWVyZWFkeSIpKTsKICB9KSk7Cn0KZnVuY3Rpb24gRXMoZSwgdDIpIHsKICB2YXIgbjIsIGkyLCByMiA9IHt9LCBvMiA9IEFvKGRvY3VtZW50KTsKICBpZiAoT2JqZWN0LmtleXModDIpLmZvckVhY2goZnVuY3Rpb24oZTIpIHsKICAgIHIyW2UyXSA9IHsgdmFsdWU6IHQyW2UyXSwgd3JpdGFibGU6IHRydWUgfTsKICB9KSwgZnNbZV0pCiAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBzeXN0ZW0gYCIgKyBlICsgImAgaGFzIGJlZW4gYWxyZWFkeSByZWdpc3RlcmVkLiBDaGVjayB0aGF0IHlvdSBhcmUgbm90IGxvYWRpbmcgdHdvIHZlcnNpb25zIG9mIHRoZSBzYW1lIHN5c3RlbSBvciB0d28gZGlmZmVyZW50IHN5c3RlbXMgb2YgdGhlIHNhbWUgbmFtZS4iKTsKICBpZiAoaTIgPSBmdW5jdGlvbihlMikgewogICAgbXMuY2FsbCh0aGlzLCBlMik7CiAgfSwgKGkyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobXMucHJvdG90eXBlLCByMikpLm5hbWUgPSBlLCBpMi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBpMiwgaTIucHJvdG90eXBlLnNjaGVtYSA9IEpyKGpvKGkyLnByb3RvdHlwZS5zY2hlbWEpKSwgZnNbZV0gPSBpMiwgdXMpCiAgICBmb3IgKG4yID0gMDtuMiA8IG8yLmxlbmd0aDsgbjIrKykKICAgICAgbzJbbjJdLmluaXRTeXN0ZW0oZSk7Cn0KZnVuY3Rpb24gQnMoZSkgewogIHJldHVybiBlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSBpbiB2cyB8fCBlLmlzQU5vZGU7Cn0KZnVuY3Rpb24gTXMoZSwgdDIpIHsKICByZXR1cm4gISghZS5jb21wb25lbnRzW3QyXSB8fCAhZS5jb21wb25lbnRzW3QyXS5hdHRyVmFsdWUpIHx8IGZ1bmN0aW9uKGUyLCB0MykgewogICAgdmFyIG4yLCBpMiA9IGZhbHNlOwogICAgZm9yIChuMiA9IDA7bjIgPCB0My5sZW5ndGggJiYgIShpMiA9IHQzW24yXS5oYXNBdHRyaWJ1dGUoZTIpKTsgKytuMikKICAgICAgOwogICAgcmV0dXJuIGkyOwogIH0odDIsIGUubWl4aW5FbHMpOwp9CmZ1bmN0aW9uIFNzKGUpIHsKICByZXR1cm4gZS5pbmRleE9mKHdzKSAhPT0gLTEgJiYgKGUgPSBvcihlLCB3cylbMF0pLCAhIUtvW2VdOwp9CmZ1bmN0aW9uIERzKGUpIHsKICBpZiAoZS5kYXRhICYmIGUuZGF0YS50eXBlID09PSAidnIiKQogICAgc3dpdGNoIChlLmRhdGEuZGF0YSkgewogICAgICBjYXNlICJlbnRlciI6CiAgICAgICAgdGhpcy5lbnRlclZSKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImV4aXQiOgogICAgICAgIHRoaXMuZXhpdFZSKCk7CiAgICB9Cn0KZnVuY3Rpb24gT3MoZSwgdDIpIHsKICB2YXIgbjIsIGkyLCByMiA9IHt9LCBvMiA9IHQyIHx8IFtdOwogIGZvciAoaTIgaW4gbzIubGVuZ3RoID0gMCwgZSkgewogICAgdmFyIHMyID0gZVtpMl07CiAgICBpZiAoczIgIT09IHVuZGVmaW5lZCkgewogICAgICB2YXIgYTIgPSBzMi5iZWZvcmUgPyBzMi5iZWZvcmUuc2xpY2UoMCkgOiBbXSwgQTIgPSBzMi5hZnRlciA/IHMyLmFmdGVyLnNsaWNlKDApIDogW107CiAgICAgIHIyW2kyXSA9IHsgYmVmb3JlOiBhMiwgYWZ0ZXI6IEEyLCB2aXNpdGVkOiBmYWxzZSwgZG9uZTogZmFsc2UgfTsKICAgIH0KICB9CiAgZm9yIChpMiBpbiByMikKICAgIGZvciAobjIgPSAwO24yIDwgcjJbaTJdLmJlZm9yZS5sZW5ndGg7IG4yKyspIHsKICAgICAgdmFyIGwyID0gcjJbaTJdLmJlZm9yZVtuMl07CiAgICAgIGwyIGluIHIyID8gcjJbbDJdLmFmdGVyLnB1c2goaTIpIDoga3MoIkludmFsaWQgb3JkZXJpbmcgY29uc3RyYWludCwgbm8gY29tcG9uZW50IG5hbWVkIGAiICsgbDIgKyAiYCByZWZlcmVuY2VkIGJ5IGAiICsgaTIgKyAiYCIpOwogICAgfQogIGZ1bmN0aW9uIGMyKGUyKSB7CiAgICBpZiAoZTIgaW4gcjIgJiYgIXIyW2UyXS5kb25lKQogICAgICBpZiAocjJbZTJdLnZpc2l0ZWQpCiAgICAgICAga3MoIkN5Y2xlIGRldGVjdGVkLCBpZ25vcmluZyBvbmUgb3IgbW9yZSBiZWZvcmUvYWZ0ZXIgY29uc3RyYWludHMuIFRoZSByZXN1bHRpbmcgb3JkZXIgbWlnaHQgYmUgaW5jb3JyZWN0Iik7CiAgICAgIGVsc2UgewogICAgICAgIHIyW2UyXS52aXNpdGVkID0gdHJ1ZTsKICAgICAgICBmb3IgKHZhciB0MyA9IDA7dDMgPCByMltlMl0uYWZ0ZXIubGVuZ3RoOyB0MysrKSB7CiAgICAgICAgICB2YXIgbjMgPSByMltlMl0uYWZ0ZXJbdDNdOwogICAgICAgICAgbjMgaW4gcjIgfHwga3MoIkludmFsaWQgYmVmb3JlL2FmdGVyIGNvbnN0cmFpbnQsIG5vIGNvbXBvbmVudCBuYW1lZCBgIiArIG4zICsgImAgcmVmZXJlbmNlZCBpbiBgIiArIGUyICsgImAiKSwgYzIobjMpOwogICAgICAgIH0KICAgICAgICByMltlMl0uZG9uZSA9IHRydWUsIG8yLnB1c2goZTIpOwogICAgICB9CiAgfQogIGZvciAoaTIgaW4gcjIpCiAgICByMltpMl0uZG9uZSB8fCBjMihpMik7CiAgcmV0dXJuIG8yOwp9CmZ1bmN0aW9uIFBzKGUsIHQyKSB7CiAgdmFyIG4yLCBpMiA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOwogIHJldHVybiAhdDIgfHwgdDIud2lkdGggPT09IC0xICYmIHQyLmhlaWdodCA9PT0gLTEgfHwgZS53aWR0aCAqIGkyIDwgdDIud2lkdGggJiYgZS5oZWlnaHQgKiBpMiA8IHQyLmhlaWdodCB8fCAobjIgPSBlLndpZHRoIC8gZS5oZWlnaHQsIGUud2lkdGggKiBpMiA+IHQyLndpZHRoICYmIHQyLndpZHRoICE9PSAtMSAmJiAoZS53aWR0aCA9IE1hdGgucm91bmQodDIud2lkdGggLyBpMiksIGUuaGVpZ2h0ID0gTWF0aC5yb3VuZCh0Mi53aWR0aCAvIG4yIC8gaTIpKSwgZS5oZWlnaHQgKiBpMiA+IHQyLmhlaWdodCAmJiB0Mi5oZWlnaHQgIT09IC0xICYmIChlLmhlaWdodCA9IE1hdGgucm91bmQodDIuaGVpZ2h0IC8gaTIpLCBlLndpZHRoID0gTWF0aC5yb3VuZCh0Mi5oZWlnaHQgKiBuMiAvIGkyKSkpLCBlOwp9CmZ1bmN0aW9uIEdzKGUsIHQyLCBuMiwgaTIpIHsKICByZXR1cm4gZS5wYXJlbnRFbGVtZW50ID8gdDIgPyBQcyh7IGhlaWdodDogZS5wYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodCwgd2lkdGg6IGUucGFyZW50RWxlbWVudC5vZmZzZXRXaWR0aCB9LCBuMikgOiBmdW5jdGlvbihlMiwgdDMpIHsKICAgIHZhciBuMzsKICAgIHJldHVybiBuMyA9IHsgaGVpZ2h0OiBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCwgd2lkdGg6IGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGggfSwgdDMgPyBuMyA6IFBzKG4zLCBlMik7CiAgfShuMiwgaTIpIDogeyBoZWlnaHQ6IDAsIHdpZHRoOiAwIH07Cn0KZnVuY3Rpb24gcXMoZSwgdDIpIHsKICB2YXIgbjIsIGkyID0ge307CiAgaWYgKE9iamVjdC5rZXlzKHQyKS5mb3JFYWNoKGZ1bmN0aW9uKGUyKSB7CiAgICBpMltlMl0gPSB7IHZhbHVlOiB0MltlMl0sIHdyaXRhYmxlOiB0cnVlIH07CiAgfSksIGpzW2VdKQogICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgZ2VvbWV0cnkgYCIgKyBlICsgImAgaGFzIGJlZW4gYWxyZWFkeSByZWdpc3RlcmVkIik7CiAgcmV0dXJuICgobjIgPSBmdW5jdGlvbigpIHsKICAgIEhzLmNhbGwodGhpcyk7CiAgfSkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShIcy5wcm90b3R5cGUsIGkyKSkubmFtZSA9IGUsIG4yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG4yLCBqc1tlXSA9IHsgR2VvbWV0cnk6IG4yLCBzY2hlbWE6IE5zKG4yLnByb3RvdHlwZS5zY2hlbWEpIH0sIF9zLnB1c2goZSksIG4yOwp9CmZ1bmN0aW9uIFhzKGUsIHQyKSB7CiAgaWYgKGUgPSBlLnRvTG93ZXJDYXNlKCksICF2c1tlXSkgewogICAgdnNbZV0gPSB0cnVlLCBZcygiUmVnaXN0ZXJpbmcgPCVzPiIsIGUpLCB0Mi5kZWZhdWx0QXR0cmlidXRlcyAmJiBLcygiVGhlICdkZWZhdWx0QXR0cmlidXRlcycgb2JqZWN0IGlzIGRlcHJlY2F0ZWQuIFVzZSAnZGVmYXVsdENvbXBvbmVudHMnIGluc3RlYWQuIik7CiAgICB2YXIgbjIgPSB0Mi5tYXBwaW5ncyB8fCB7fSwgaTIgPSBjbGFzcyBleHRlbmRzIExzIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKSwgdGhpcy5kZWZhdWx0Q29tcG9uZW50c0Zyb21QcmltaXRpdmUgPSB0Mi5kZWZhdWx0Q29tcG9uZW50cyB8fCB0Mi5kZWZhdWx0QXR0cmlidXRlcyB8fCB7fSwgdGhpcy5kZXByZWNhdGVkID0gdDIuZGVwcmVjYXRlZCB8fCBudWxsLCB0aGlzLmRlcHJlY2F0ZWRNYXBwaW5ncyA9IHQyLmRlcHJlY2F0ZWRNYXBwaW5ncyB8fCB7fSwgdGhpcy5tYXBwaW5ncyA9IG4yLCB0Mi5kZXByZWNhdGVkICYmIGNvbnNvbGUud2Fybih0Mi5kZXByZWNhdGVkKSwgdGhpcy5yZXNvbHZlTWFwcGluZ0NvbGxpc2lvbnMoKTsKICAgICAgfQogICAgICByZXNvbHZlTWFwcGluZ0NvbGxpc2lvbnMoKSB7CiAgICAgICAgdmFyIGUyID0gdGhpcy5tYXBwaW5ncywgdDMgPSB0aGlzOwogICAgICAgIE9iamVjdC5rZXlzKGUyKS5mb3JFYWNoKGZ1bmN0aW9uKG4zKSB7CiAgICAgICAgICB2YXIgaTM7CiAgICAgICAgICBuMyAhPT0gbjMudG9Mb3dlckNhc2UoKSAmJiBLcygiTWFwcGluZyBrZXlzIHNob3VsZCBiZSBzcGVjaWZpZWQgaW4gbG93ZXIgY2FzZS4gVGhlIG1hcHBpbmcga2V5ICIgKyBuMyArICIgbWF5IG5vdCBiZSByZWNvZ25pemVkIiksIEtvW24zXSAmJiAoaTMgPSBlMltuM10ucmVwbGFjZSgiLiIsICItIiksIGUyW2kzXSA9IGUyW24zXSwgZGVsZXRlIGUyW24zXSwgY29uc29sZS53YXJuKCJUaGUgcHJpbWl0aXZlICIgKyB0My50YWdOYW1lLnRvTG93ZXJDYXNlKCkgKyAiIGhhcyBhIG1hcHBpbmcgY29sbGlzaW9uLiBUaGUgYXR0cmlidXRlICIgKyBuMyArICIgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSByZWdpc3RlcmVkIGNvbXBvbmVudCBhbmQgaGFzIGJlZW4gcmVuYW1lZCB0byAiICsgaTMpKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBnZXRFeHRyYUNvbXBvbmVudHMoKSB7CiAgICAgICAgdmFyIGUyLCB0MywgbjMsIGkzLCByMiwgbzIgPSB0aGlzOwogICAgICAgIGZvciAodDMgPSBacih0aGlzLmRlZmF1bHRDb21wb25lbnRzRnJvbVByaW1pdGl2ZSksIChyMiA9IHRoaXMuZ2V0QXR0cmlidXRlKCJtaXhpbiIpKSAmJiAocjIgPSBvcihyMi50cmltKCksIC9ccysvKSkuZm9yRWFjaChmdW5jdGlvbihlMykgewogICAgICAgICAgdmFyIG40LCByMywgbDIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlMyk7CiAgICAgICAgICBpZiAobDIpIHsKICAgICAgICAgICAgdmFyIHsgcmF3QXR0cmlidXRlQ2FjaGU6IGMyLCBjb21wb25lbnRDYWNoZTogaDIgfSA9IGwyOwogICAgICAgICAgICBmb3IgKHZhciBkMiBpbiBjMikgewogICAgICAgICAgICAgIGlmIChpMyA9IG8yLm1hcHBpbmdzW2QyXSkKICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIFpzKGkzLCBjMltkMl0sIHQzKTsKICAgICAgICAgICAgICBkMiBpbiBoMiAmJiAodDNbZDJdID0gKG40ID0gdDNbZDJdLCByMyA9IGgyW2QyXSwgczIobjQpID8gYTIocjMpIDogczIocjMpID8gYTIobjQpIDogQTIobjQpICYmIEEyKHIzKSA/IFhyKG40LCByMykgOiBhMihyMykpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pLCBuMyA9IDA7bjMgPCB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoOyBuMysrKQogICAgICAgICAgZTIgPSB0aGlzLmF0dHJpYnV0ZXNbbjNdLCAoaTMgPSB0aGlzLm1hcHBpbmdzW2UyLm5hbWVdKSAmJiBacyhpMywgZTIudmFsdWUsIHQzKTsKICAgICAgICByZXR1cm4gdDM7CiAgICAgICAgZnVuY3Rpb24gczIoZTMpIHsKICAgICAgICAgIHJldHVybiBlMyA9PT0gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBhMihlMykgewogICAgICAgICAgcmV0dXJuIEEyKGUzKSA/IFhyKHt9LCBlMykgOiBlMzsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gQTIoZTMpIHsKICAgICAgICAgIHJldHVybiBlMyAhPT0gbnVsbCAmJiBlMy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0OwogICAgICAgIH0KICAgICAgfQogICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZTIsIHQzLCBuMykgewogICAgICAgIHZhciBpMyA9IHRoaXMubWFwcGluZ3NbZTJdOwogICAgICAgIGUyIGluIHRoaXMuZGVwcmVjYXRlZE1hcHBpbmdzICYmIGNvbnNvbGUud2Fybih0aGlzLmRlcHJlY2F0ZWRNYXBwaW5nc1tlMl0pLCBlMiAmJiBpMyA/IHpzKHRoaXMsIGkzLCBuMykgOiBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZTIsIHQzLCBuMyk7CiAgICAgIH0KICAgIH07CiAgICByZXR1cm4gY3VzdG9tRWxlbWVudHMuZGVmaW5lKGUsIGkyKSwgaTIubWFwcGluZ3MgPSBuMiwgSnNbZV0gPSBpMiwgaTI7CiAgfQogIFdzKCJUcnlpbmcgdG8gcmVnaXN0ZXIgcHJpbWl0aXZlICIgKyBlICsgIiB0aGF0IGhhcyBiZWVuIGFscmVhZHkgcHJldmlvdXNseSByZWdpc3RlcmVkIik7Cn0KZnVuY3Rpb24gWnMoZSwgdDIsIG4yKSB7CiAgdmFyIGkyID0gc3IoZSk7CiAgaTIuY29uc3RydWN0b3IgPT09IEFycmF5ID8gKG4yW2kyWzBdXSA9IG4yW2kyWzBdXSB8fCB7fSwgbjJbaTJbMF1dW2kyWzFdXSA9IHQyLnRyaW0oKSkgOiBuMltpMl0gPSB0Mi50cmltKCk7Cn0KZnVuY3Rpb24gaWEoZSwgdDIpIHsKICB2YXIgbjIsIGkyID0ge307CiAgaWYgKE9iamVjdC5rZXlzKHQyKS5mb3JFYWNoKGZ1bmN0aW9uKGUyKSB7CiAgICBpMltlMl0gPSB7IHZhbHVlOiB0MltlMl0sIHdyaXRhYmxlOiB0cnVlIH07CiAgfSksICRzW2VdKQogICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgc2hhZGVyICIgKyBlICsgIiBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQiKTsKICByZXR1cm4gKChuMiA9IGZ1bmN0aW9uKCkgewogICAgbmEuY2FsbCh0aGlzKTsKICB9KS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG5hLnByb3RvdHlwZSwgaTIpKS5uYW1lID0gZSwgbjIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbjIsICRzW2VdID0geyBTaGFkZXI6IG4yLCBzY2hlbWE6IGpvKG4yLnByb3RvdHlwZS5zY2hlbWEpIH0sIGVhLnB1c2goZSksIG4yOwp9CmZ1bmN0aW9uIHNhKGUpIHsKICBpZiAoZS5oYXNBdHRyaWJ1dGUoImF1dG9wbGF5IikgfHwgZS5nZXRBdHRyaWJ1dGUoInByZWxvYWQiKSA9PT0gImF1dG8iKQogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQyLCBuMikgewogICAgICBpZiAoZS5yZWFkeVN0YXRlID09PSA0KQogICAgICAgIHJldHVybiB0MigpOwogICAgICBpZiAoZS5lcnJvcikKICAgICAgICByZXR1cm4gbjIoKTsKICAgICAgZnVuY3Rpb24gaTIoKSB7CiAgICAgICAgZm9yICh2YXIgbjMgPSAwLCBpMyA9IDA7aTMgPCBlLmJ1ZmZlcmVkLmxlbmd0aDsgaTMrKykKICAgICAgICAgIG4zICs9IGUuYnVmZmVyZWQuZW5kKGkzKSAtIGUuYnVmZmVyZWQuc3RhcnQoaTMpOwogICAgICAgIG4zID49IGUuZHVyYXRpb24gJiYgKGUudGFnTmFtZSA9PT0gIlZJREVPIiAmJiBSZS5DYWNoZS5hZGQoZS5nZXRBdHRyaWJ1dGUoInNyYyIpLCBlKSwgdDIoKSk7CiAgICAgIH0KICAgICAgZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRkYXRhIiwgaTIsIGZhbHNlKSwgZS5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsIGkyLCBmYWxzZSksIGUuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBuMiwgZmFsc2UpOwogICAgfSk7Cn0KZnVuY3Rpb24gYWEoZSkgewogIHZhciB0MiA9IGZ1bmN0aW9uKGUyKSB7CiAgICB2YXIgdDMsIG4yLCBpMjsKICAgIGlmIChlMi5oYXNBdHRyaWJ1dGUoImNyb3Nzb3JpZ2luIikpCiAgICAgIHJldHVybiBlMjsKICAgIGlmICgodDMgPSBlMi5nZXRBdHRyaWJ1dGUoInNyYyIpKSAhPT0gbnVsbCkgewogICAgICBpZiAodDMuaW5kZXhPZigiOi8vIikgPT09IC0xKQogICAgICAgIHJldHVybiBlMjsKICAgICAgaWYgKChpMiA9IChuMiA9IHQzKS5pbmRleE9mKCI6Ly8iKSA+IC0xID8gbjIuc3BsaXQoIi8iKVsyXSA6IG4yLnNwbGl0KCIvIilbMF0pLnN1YnN0cmluZygwLCBpMi5pbmRleE9mKCI6IikpID09PSB3aW5kb3cubG9jYXRpb24uaG9zdCkKICAgICAgICByZXR1cm4gZTI7CiAgICB9CiAgICByZXR1cm4gb2EoJ0Nyb3NzLW9yaWdpbiBlbGVtZW50IChlLmcuLCA8aW1nPikgd2FzIHJlcXVlc3RlZCB3aXRob3V0IGBjcm9zc29yaWdpbmAgc2V0LiBBLUZyYW1lIHdpbGwgcmUtcmVxdWVzdCB0aGUgYXNzZXQgd2l0aCBgY3Jvc3NvcmlnaW5gIGF0dHJpYnV0ZSBzZXQuIFBsZWFzZSBzZXQgYGNyb3Nzb3JpZ2luYCBvbiB0aGUgZWxlbWVudCAoZS5nLiwgPGltZyBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj4pJywgdDMpLCBlMi5jcm9zc09yaWdpbiA9ICJhbm9ueW1vdXMiLCBlMi5jbG9uZU5vZGUodHJ1ZSk7CiAgfShlKTsKICByZXR1cm4gdDIudGFnTmFtZSAmJiB0Mi50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJ2aWRlbyIgJiYgKHQyLnNldEF0dHJpYnV0ZSgicGxheXNpbmxpbmUiLCAiIiksIHQyLnNldEF0dHJpYnV0ZSgid2Via2l0LXBsYXlzaW5saW5lIiwgIiIpKSwgdDIgIT09IGUgJiYgKGUucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0MiksIGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSksIHQyOwp9CmZ1bmN0aW9uIENhKGUpIHsKICBlLnggPSBSZS5NYXRoVXRpbHMuZGVnVG9SYWQoZS54KSwgZS55ID0gUmUuTWF0aFV0aWxzLmRlZ1RvUmFkKGUueSksIGUueiA9IFJlLk1hdGhVdGlscy5kZWdUb1JhZChlLnopOwp9CmZ1bmN0aW9uIHZhKGUsIHQyLCBuMikgewogIHZhciBpMjsKICBmb3IgKGkyID0gMDtpMiA8IHQyLmxlbmd0aDsgaTIrKykKICAgIGUuYWRkRXZlbnRMaXN0ZW5lcih0MltpMl0sIG4yKTsKfQpmdW5jdGlvbiBCYShlLCB0MiwgbjIpIHsKICB2YXIgaTI7CiAgZm9yIChpMiA9IDA7aTIgPCB0Mi5sZW5ndGg7IGkyKyspCiAgICBlLnJlbW92ZUV2ZW50TGlzdGVuZXIodDJbaTJdLCBuMik7Cn0KZnVuY3Rpb24gYmEoZSwgdDIpIHsKICB2YXIgbjIsIGkyLCByMjsKICBmb3IgKGkyID0gSWEodDIpLCByMiA9IGUsIG4yID0gMDtuMiA8IGkyLmxlbmd0aDsgbjIrKykKICAgIHIyID0gcjJbaTJbbjJdXTsKICBpZiAocjIgPT09IHVuZGVmaW5lZCkKICAgIHRocm93IGNvbnNvbGUubG9nKGUpLCBuZXcgRXJyb3IoIlthbmltYXRpb25dIHByb3BlcnR5ICgiICsgdDIgKyAiKSBjb3VsZCBub3QgYmUgZm91bmQiKTsKICByZXR1cm4gcjI7Cn0KZnVuY3Rpb24geWEoZSwgdDIsIG4yLCBpMikgewogIHZhciByMiwgbzIsIHMyLCBhMjsKICBmb3IgKHQyLnN0YXJ0c1dpdGgoIm9iamVjdDNELnJvdGF0aW9uIikgJiYgKG4yID0gUmUuTWF0aFV0aWxzLmRlZ1RvUmFkKG4yKSksIG8yID0gSWEodDIpLCBhMiA9IGUsIHIyID0gMDtyMiA8IG8yLmxlbmd0aCAtIDE7IHIyKyspCiAgICBhMiA9IGEyW28yW3IyXV07CiAgczIgPSBvMltvMi5sZW5ndGggLSAxXSwgaTIgIT09IGZhID8gYTJbczJdID0gbjIgOiAoInIiIGluIGEyW3MyXSkgPyAoYTJbczJdLnIgPSBuMi5yLCBhMltzMl0uZyA9IG4yLmcsIGEyW3MyXS5iID0gbjIuYikgOiAoYTJbczJdLnggPSBuMi5yLCBhMltzMl0ueSA9IG4yLmcsIGEyW3MyXS56ID0gbjIuYik7Cn0KZnVuY3Rpb24gSWEoZSkgewogIHJldHVybiBlIGluIHBhIHx8IChwYVtlXSA9IGUuc3BsaXQoIi4iKSksIHBhW2VdOwp9CmZ1bmN0aW9uIHdhKGUpIHsKICByZXR1cm4gZS5pc1Jhd1Byb3BlcnR5IHx8IGUucHJvcGVydHkuc3RhcnRzV2l0aChFYSkgfHwgZS5wcm9wZXJ0eS5zdGFydHNXaXRoKCJvYmplY3QzRCIpOwp9CmZ1bmN0aW9uIFhhKGUsIHQyKSB7CiAgdmFyIG4yOwogIGlmIChlKQogICAgcmV0dXJuIChuMiA9IEphW2VdKSA9PT0gImdyaXAiID8gbjIgKyAodDIgPyAiY2xvc2UiIDogIm9wZW4iKSA6IG4yID09PSAicG9pbnQiID8gbjIgKyAodDIgPyAidXAiIDogImRvd24iKSA6IG4yID09PSAicG9pbnRpbmciIHx8IG4yID09PSAicGlzdG9sIiA/IG4yICsgKHQyID8gInN0YXJ0IiA6ICJlbmQiKSA6IHVuZGVmaW5lZDsKfQpmdW5jdGlvbiBpQShlLCB0MiwgbjIpIHsKICByZXR1cm4gKHQyLmRvdChlKSAtIHQyLmRvdChuMikpIC8gdDIubGVuZ3RoKCk7Cn0KZnVuY3Rpb24gRUEoZSwgdDIpIHsKICByZXR1cm4gISghZSB8fCAhdDIpICYmIGUueCA9PT0gdDIueCAmJiBlLnkgPT09IHQyLnkgJiYgZS56ID09PSB0Mi56Owp9CmZ1bmN0aW9uIHdBKGUsIHQyKSB7CiAgZS5kaXNwb3NlKCksIHQyLnVucmVnaXN0ZXJNYXRlcmlhbChlKSwgT2JqZWN0LmtleXMoZSkuZmlsdGVyKGZ1bmN0aW9uKHQzKSB7CiAgICByZXR1cm4gZVt0M10gJiYgZVt0M10uaXNUZXh0dXJlOwogIH0pLmZvckVhY2goZnVuY3Rpb24odDMpIHsKICAgIGVbdDNdLmRpc3Bvc2UoKTsKICB9KTsKfQpmdW5jdGlvbiBQQShlKSB7CiAgZS50cmF2ZXJzZShmdW5jdGlvbih0MikgewogICAgdmFyIG4yOwogICAgdDIudHlwZSA9PT0gIk1lc2giICYmIChuMiA9IHQyLm1hdGVyaWFsLmNsb25lKCksIGUub3JpZ2luYWxDb2xvciA9IHQyLm1hdGVyaWFsLmNvbG9yLCB0Mi5tYXRlcmlhbC5kaXNwb3NlKCksIHQyLm1hdGVyaWFsID0gbjIpOwogIH0pOwp9CmZ1bmN0aW9uIFdBKGUsIHQyKSB7CiAgdmFyIG4yOwogIGZvciAoZS5sZW5ndGggPSB0Mi5sZW5ndGgsIG4yID0gMDtuMiA8IHQyLmxlbmd0aDsgbjIrKykKICAgIGVbbjJdID0gdDJbbjJdOwp9CmZ1bmN0aW9uIGZsKGUsIHQyLCBuMikgewogIHJldHVybiBlIHx8ICgwLjUgKyB0MikgKiBuMjsKfQpmdW5jdGlvbiBfbChlLCB0MikgewogIHRoaXMucmVuZGVyZXIgPSBlLCB0aGlzLnhySGl0VGVzdFNvdXJjZSA9IG51bGwsIGUueHIuYWRkRXZlbnRMaXN0ZW5lcigic2Vzc2lvbmVuZCIsIGZ1bmN0aW9uKCkgewogICAgdGhpcy54ckhpdFRlc3RTb3VyY2UgPSBudWxsOwogIH0uYmluZCh0aGlzKSksIGUueHIuYWRkRXZlbnRMaXN0ZW5lcigic2Vzc2lvbnN0YXJ0IiwgZnVuY3Rpb24oKSB7CiAgICB0aGlzLnNlc3Npb25TdGFydCh0Mik7CiAgfS5iaW5kKHRoaXMpKSwgdGhpcy5yZW5kZXJlci54ci5pc1ByZXNlbnRpbmcgJiYgdGhpcy5zZXNzaW9uU3RhcnQodDIpOwp9CmZ1bmN0aW9uIEhsKGUpIHsKICBjb25zb2xlLndhcm4oZS5tZXNzYWdlKSwgY29uc29sZS53YXJuKCdDYW5ub3QgcmVxdWVzdEhpdFRlc3RTb3VyY2UgQXJlIHlvdSBtaXNzaW5nOiB3ZWJ4cj0ib3B0aW9uYWxGZWF0dXJlczogaGl0LXRlc3Q7IiBmcm9tIDxhLXNjZW5lPj8nKTsKfQpmdW5jdGlvbiB6bChlLCB0MikgewogIHZhciBuMiwgaTIsIHIyLCBvMjsKICByZXR1cm4gKG4yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmNsYXNzTGlzdC5hZGQoImEtbW9kYWwiKSwgbjIuc2V0QXR0cmlidXRlKGhpLCAiIiksIChpMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5jbGFzc05hbWUgPSAiYS1kaWFsb2ciLCBpMi5zZXRBdHRyaWJ1dGUoaGksICIiKSwgbjIuYXBwZW5kQ2hpbGQoaTIpLCAocjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuY2xhc3NMaXN0LmFkZCgiYS1kaWFsb2ctdGV4dC1jb250YWluZXIiKSwgaTIuYXBwZW5kQ2hpbGQocjIpLCAobzIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuY2xhc3NMaXN0LmFkZCgiYS1kaWFsb2ctdGV4dCIpLCBvMi5pbm5lckhUTUwgPSBlLCByMi5hcHBlbmRDaGlsZChvMiksIGkyLmFwcGVuZENoaWxkKHQyKSwgbjI7Cn0KZnVuY3Rpb24gaWMoZSkgewogIGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIGZ1bmN0aW9uKCkgewogICAgZS5jbGFzc0xpc3QucmVtb3ZlKCJyZXNldGhvdmVyIik7CiAgfSwgeyBwYXNzaXZlOiB0cnVlIH0pLCBlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZnVuY3Rpb24oKSB7CiAgICBlLmNsYXNzTGlzdC5hZGQoInJlc2V0aG92ZXIiKTsKICB9LCB7IHBhc3NpdmU6IHRydWUgfSk7Cn0KZnVuY3Rpb24gcGMoZSwgdDIpIHsKICByZXR1cm4gdDIuY29sb3Iuc2V0KGUuY29sb3IpLCB0Mi5mb2cgPSBlLmZvZywgdDIud2lyZWZyYW1lID0gZS53aXJlZnJhbWUsIHQyLnRvbmVNYXBwZWQgPSBlLnRvbmVNYXBwZWQsIHQyLndpcmVmcmFtZUxpbmV3aWR0aCA9IGUud2lyZWZyYW1lTGluZXdpZHRoLCB0MjsKfQpmdW5jdGlvbiBmYyhlLCB0MikgewogIHJldHVybiB0Mi5jb2xvci5zZXQoZS5jb2xvciksIHQyLmVtaXNzaXZlLnNldChlLmVtaXNzaXZlKSwgdDIuZW1pc3NpdmVJbnRlbnNpdHkgPSBlLmVtaXNzaXZlSW50ZW5zaXR5LCB0Mi5mb2cgPSBlLmZvZywgdDIubWV0YWxuZXNzID0gZS5tZXRhbG5lc3MsIHQyLnJvdWdobmVzcyA9IGUucm91Z2huZXNzLCB0Mi53aXJlZnJhbWUgPSBlLndpcmVmcmFtZSwgdDIud2lyZWZyYW1lTGluZXdpZHRoID0gZS53aXJlZnJhbWVMaW5ld2lkdGgsIGUubm9ybWFsTWFwICYmICh0Mi5ub3JtYWxTY2FsZSA9IGUubm9ybWFsU2NhbGUpLCBlLmFtYmllbnRPY2NsdXNpb25NYXAgJiYgKHQyLmFvTWFwSW50ZW5zaXR5ID0gZS5hbWJpZW50T2NjbHVzaW9uTWFwSW50ZW5zaXR5KSwgZS5kaXNwbGFjZW1lbnRNYXAgJiYgKHQyLmRpc3BsYWNlbWVudFNjYWxlID0gZS5kaXNwbGFjZW1lbnRTY2FsZSwgdDIuZGlzcGxhY2VtZW50QmlhcyA9IGUuZGlzcGxhY2VtZW50QmlhcyksIHQyOwp9CmZ1bmN0aW9uIG1jKGUsIHQyKSB7CiAgc3dpdGNoICh0Mi5jb2xvci5zZXQoZS5jb2xvciksIHQyLnNwZWN1bGFyLnNldChlLnNwZWN1bGFyKSwgdDIuZW1pc3NpdmUuc2V0KGUuZW1pc3NpdmUpLCB0Mi5lbWlzc2l2ZUludGVuc2l0eSA9IGUuZW1pc3NpdmVJbnRlbnNpdHksIHQyLmZvZyA9IGUuZm9nLCB0Mi50cmFuc3BhcmVudCA9IGUudHJhbnNwYXJlbnQsIHQyLndpcmVmcmFtZSA9IGUud2lyZWZyYW1lLCB0Mi53aXJlZnJhbWVMaW5ld2lkdGggPSBlLndpcmVmcmFtZUxpbmV3aWR0aCwgdDIuc2hpbmluZXNzID0gZS5zaGluaW5lc3MsIHQyLmZsYXRTaGFkaW5nID0gZS5mbGF0U2hhZGluZywgdDIud2lyZWZyYW1lID0gZS53aXJlZnJhbWUsIHQyLndpcmVmcmFtZUxpbmV3aWR0aCA9IGUud2lyZWZyYW1lTGluZXdpZHRoLCB0Mi5yZWZsZWN0aXZpdHkgPSBlLnJlZmxlY3Rpdml0eSwgdDIucmVmcmFjdGlvblJhdGlvID0gZS5yZWZyYWN0aW9uUmF0aW8sIGUuY29tYmluZSkgewogICAgY2FzZSAibWl4IjoKICAgICAgdDIuY29tYmluZSA9IFJlLk1peE9wZXJhdGlvbjsKICAgICAgYnJlYWs7CiAgICBjYXNlICJtdWx0aXBseSI6CiAgICAgIHQyLmNvbWJpbmUgPSBSZS5NdWx0aXBseU9wZXJhdGlvbjsKICAgICAgYnJlYWs7CiAgICBjYXNlICJhZGQiOgogICAgICB0Mi5jb21iaW5lID0gUmUuQWRkT3BlcmF0aW9uOwogIH0KICByZXR1cm4gZS5ub3JtYWxNYXAgJiYgKHQyLm5vcm1hbFNjYWxlID0gZS5ub3JtYWxTY2FsZSksIGUuYW1iaWVudE9jY2x1c2lvbk1hcCAmJiAodDIuYW9NYXBJbnRlbnNpdHkgPSBlLmFtYmllbnRPY2NsdXNpb25NYXBJbnRlbnNpdHkpLCBlLmJ1bXBNYXAgJiYgKHQyLmJ1bXBTY2FsZSA9IGUuYnVtcE1hcFNjYWxlKSwgZS5kaXNwbGFjZW1lbnRNYXAgJiYgKHQyLmRpc3BsYWNlbWVudFNjYWxlID0gZS5kaXNwbGFjZW1lbnRTY2FsZSwgdDIuZGlzcGxhY2VtZW50QmlhcyA9IGUuZGlzcGxhY2VtZW50QmlhcyksIHQyOwp9CmZ1bmN0aW9uIENjKGUpIHsKICB2YXIgdDIgPSBlLnByaW1pdGl2ZSwgbjIgPSBqc1t0Ml0gJiYganNbdDJdLkdlb21ldHJ5LCBpMiA9IG5ldyBuMjsKICBpZiAoIW4yKQogICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGdlb21ldHJ5IGAiICsgdDIgKyAiYCIpOwogIHJldHVybiBpMi5pbml0KGUpLCBpMi5nZW9tZXRyeTsKfQpmdW5jdGlvbiB4YyhlLCB0MikgewogIHJldHVybiBlLmdyb3VwT3JkZXIgIT09IHQyLmdyb3VwT3JkZXIgPyBlLmdyb3VwT3JkZXIgLSB0Mi5ncm91cE9yZGVyIDogZS5yZW5kZXJPcmRlciAhPT0gdDIucmVuZGVyT3JkZXIgPyBlLnJlbmRlck9yZGVyIC0gdDIucmVuZGVyT3JkZXIgOiBlLnogLSB0Mi56Owp9CmZ1bmN0aW9uIFFjKGUsIHQyKSB7CiAgcmV0dXJuIGUuZ3JvdXBPcmRlciAhPT0gdDIuZ3JvdXBPcmRlciA/IGUuZ3JvdXBPcmRlciAtIHQyLmdyb3VwT3JkZXIgOiBlLnJlbmRlck9yZGVyIC0gdDIucmVuZGVyT3JkZXI7Cn0KZnVuY3Rpb24gTGMoZSwgdDIpIHsKICByZXR1cm4gZS5ncm91cE9yZGVyICE9PSB0Mi5ncm91cE9yZGVyID8gZS5ncm91cE9yZGVyIC0gdDIuZ3JvdXBPcmRlciA6IGUucmVuZGVyT3JkZXIgIT09IHQyLnJlbmRlck9yZGVyID8gZS5yZW5kZXJPcmRlciAtIHQyLnJlbmRlck9yZGVyIDogdDIueiAtIGUuejsKfQpmdW5jdGlvbiBrYyhlKSB7CiAgdmFyIHQyID0gZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAiJDEtJDIiKS50b0xvd2VyQ2FzZSgpOwogIGUgPT09ICJmb2ciICYmICh0MiA9ICJtYXRlcmlhbC1mb2ciKSwgZSA9PT0gInZpc2libGUiICYmICh0MiA9ICJtYXRlcmlhbC12aXNpYmxlIiksIERjW3QyXSA9ICJtYXRlcmlhbC4iICsgZTsKfQpmdW5jdGlvbiBUYygpIHsKICByZXR1cm4geyBkZWZhdWx0Q29tcG9uZW50czogeyBtYXRlcmlhbDoge30gfSwgbWFwcGluZ3M6IEpyKHt9LCBEYykgfTsKfQpmdW5jdGlvbiBQYyhlKSB7CiAgcmV0dXJuIGUucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgIiQxLSQyIikudG9Mb3dlckNhc2UoKTsKfQp2YXIgdCwgbiwgciwgbywgcywgYSwgQSwgbCwgYywgaCwgZCwgdSwgZywgcCwgZiwgbSwgRSwgQywgdiwgQiwgdywgeCwgUSwgTCwgTSwgUiwgRiwgUCwgeiwgWSwgSywgVywgSiwgWCwgcmUsIGFlLCBsZSwgZmUsIHZlLCBiZSwgeGUsIFFlID0gMCwgTGUsIE1lLCBTZSwgVGUsIFJlLCBGZSwgVWUsIFhlLCAkZSwgRXQgPSAiZ2xURiIsIHl0LCBJdCwgd3QsIHh0LCBRdCwgTHQsIE10LCBTdCwgRHQsIGt0LCBUdCwganQsIFZ0ID0gOSwgenQgPSAxNSwgWXQgPSAxNiwgS3QgPSAyMiwgV3QgPSAzNywgSnQgPSA0MywgWHQgPSA3NiwgWnQgPSA4MywgJHQgPSA5NywgZW4gPSAxMDAsIHRuID0gMTAzLCBubiA9IDEwOSwgcm4gPSAxNjUsIG9uID0gMTY2LCBzbiA9IDEwMDAwNjYwMDAsIGxuLCBobiwgZG4sIHVuLCBnbiwgcG4sIG1uID0gIkFHRnpiUUVBQUFBQnBRRVZZQUYvQVg5Z0FuOS9BR0FEZjM5L0FYOWdCWDkvZjM5L0FYOWdBWDhBWUFKL2Z3Ri9ZQVIvZjM5L0FYOWdBMzkvZndCZ0JuOS9mMzkvZndGL1lBZC9mMzkvZjM5L0FYOWdBbjkvQVg1Z0FuNStBWDVnQUFCZ0JYOS9mMzkvQUdBR2YzOS9mMzkvQUdBSWYzOS9mMzkvZjM4QVlBbC9mMzkvZjM5L2YzOEFZQUFCZjJBSWYzOS9mMzkvZjM4QmYyQU5mMzkvZjM5L2YzOS9mMzkvZndGL1lBRi9BWDRDSndFRFpXNTJIMlZ0YzJOeWFYQjBaVzVmYm05MGFXWjVYMjFsYlc5eWVWOW5jbTkzZEdnQUJBTnBhQUVGQUFBRkFnRUZDd0FDQVFBQkFnSUZCUWNBQXdBQkRnc0JBUWNBRWhNSEFBVUJEQVFFQUFBTkJ3UUNBZ1lDQkFnREF3TURCZ0VBQ1FrSEJnSUNBQVlHQWdRVUJ3WUdBd0lHQUFNQ0FRZ0JCd1VHQ2dvRUVRQUVCQUVJQXdnREJRZ0RFQThJQUFjQUJBVUJjQUVDQWdVRUFRQ0FBZ1lKQVg4QlFhQ2d3QUlMQjJBSEJtMWxiVzl5ZVFJQUJtMWhiR3h2WXdBb0JHWnlaV1VBSmd4YVUxUkVYMmx6UlhKeWIzSUFhQmxhVTFSRVgyWnBibVJFWldOdmJYQnlaWE56WldSVGFYcGxBRlFQV2xOVVJGOWtaV052YlhCeVpYTnpBRW9HWDNOMFlYSjBBQ1FKQndFQVFRRUxBU1FLdXNzQmFBOEFJQUFnQUNnQ0JDQUJhallDQkFzWkFDQUFLQUlBSUFBb0FnUkJIM0YwUVFBZ0FXdEJIM0YyQ3dnQUlBQkJpSDlMQzM0QkJIOUJBeUVCSUFBb0FnUWlBMEVnVFFSQUlBQW9BZ2dpQVNBQUtBSVFUd1JBSUFBUURROExJQUFvQWd3aUFpQUJSZ1JBUVFGQkFpQURRU0JKR3c4TElBQWdBU0FCSUFKcklBTkJBM1lpQkNBQklBUnJJQUpKSWdFYklnSnJJZ1EyQWdnZ0FDQURJQUpCQTNSck5nSUVJQUFnQkNnQUFEWUNBQXNnQVFzVUFRRi9JQUFnQVJBQ0lRSWdBQ0FCRUFFZ0FndjNBUUVDZnlBQ1JRUkFJQUJDQURjQ0FDQUFRUUEyQWhBZ0FFSUFOd0lJUWJoL0R3c2dBQ0FCTmdJTUlBQWdBVUVFYWpZQ0VDQUNRUVJQQkVBZ0FDQUJJQUpxSWdGQmZHb2lBellDQ0NBQUlBTW9BQUEyQWdBZ0FVRi9haTBBQUNJQkJFQWdBRUVJSUFFUUZHczJBZ1FnQWc4TElBQkJBRFlDQkVGL0R3c2dBQ0FCTmdJSUlBQWdBUzBBQUNJRE5nSUFJQUpCZm1vaUJFRUJUUVJBSUFSQkFXdEZCRUFnQUNBQkxRQUNRUkIwSUFOeUlnTTJBZ0FMSUFBZ0FTMEFBVUVJZENBRGFqWUNBQXNnQVNBQ2FrRi9haTBBQUNJQlJRUkFJQUJCQURZQ0JFRnNEd3NnQUVFb0lBRVFGQ0FDUVFOMGFtczJBZ1FnQWdzV0FDQUFJQUVwQUFBM0FBQWdBQ0FCS1FBSU53QUlDeThCQVg4Z0FVRUNkRUdnSFdvb0FnQWdBQ2dDQUVFZ0lBRWdBQ2dDQkdwclFSOXhkbkVoQWlBQUlBRVFBU0FDQ3lFQUlBRkN6OWJUdnRMSHE5bENmaUFBZkVJZmlVS0hsYSt2bUxiZW01NS9mZ3NkQVFGL0lBQW9BZ2dnQUNnQ0RFWUVmeUFBS0FJRVFTQkdCVUVBQ3d1Q0JBRURmeUFDUVlEQUFFOEVRQ0FBSUFFZ0FoQm5JQUFQQ3lBQUlBSnFJUU1DUUNBQUlBRnpRUU54UlFSQUFrQWdBa0VCU0FSQUlBQWhBZ3dCQ3lBQVFRTnhSUVJBSUFBaEFnd0JDeUFBSVFJRFFDQUNJQUV0QUFBNkFBQWdBVUVCYWlFQklBSkJBV29pQWlBRFR3MEJJQUpCQTNFTkFBc0xBa0FnQTBGOGNTSUVRY0FBU1EwQUlBSWdCRUZBYWlJRlN3MEFBMEFnQWlBQktBSUFOZ0lBSUFJZ0FTZ0NCRFlDQkNBQ0lBRW9BZ2cyQWdnZ0FpQUJLQUlNTmdJTUlBSWdBU2dDRURZQ0VDQUNJQUVvQWhRMkFoUWdBaUFCS0FJWU5nSVlJQUlnQVNnQ0hEWUNIQ0FDSUFFb0FpQTJBaUFnQWlBQktBSWtOZ0lrSUFJZ0FTZ0NLRFlDS0NBQ0lBRW9BaXcyQWl3Z0FpQUJLQUl3TmdJd0lBSWdBU2dDTkRZQ05DQUNJQUVvQWpnMkFqZ2dBaUFCS0FJOE5nSThJQUZCUUdzaEFTQUNRVUJySWdJZ0JVME5BQXNMSUFJZ0JFOE5BUU5BSUFJZ0FTZ0NBRFlDQUNBQlFRUnFJUUVnQWtFRWFpSUNJQVJKRFFBTERBRUxJQU5CQkVrRVFDQUFJUUlNQVFzZ0EwRjhhaUlFSUFCSkJFQWdBQ0VDREFFTElBQWhBZ05BSUFJZ0FTMEFBRG9BQUNBQ0lBRXRBQUU2QUFFZ0FpQUJMUUFDT2dBQ0lBSWdBUzBBQXpvQUF5QUJRUVJxSVFFZ0FrRUVhaUlDSUFSTkRRQUxDeUFDSUFOSkJFQURRQ0FDSUFFdEFBQTZBQUFnQVVFQmFpRUJJQUpCQVdvaUFpQURSdzBBQ3dzZ0FBc01BQ0FBSUFFcEFBQTNBQUFMUVFFQ2Z5QUFLQUlJSWdFZ0FDZ0NFRWtFUUVFRER3c2dBQ0FBS0FJRUlnSkJCM0UyQWdRZ0FDQUJJQUpCQTNacklnRTJBZ2dnQUNBQktBQUFOZ0lBUVFBTERBQWdBQ0FCS0FJQU5nQUFDL2NDQVFKL0FrQWdBQ0FCUmcwQUFrQWdBU0FDYWlBQVN3UkFJQUFnQW1vaUJDQUJTdzBCQ3lBQUlBRWdBaEFMRHdzZ0FDQUJjMEVEY1NFREFrQUNRQ0FBSUFGSkJFQWdBd1JBSUFBaEF3d0RDeUFBUVFOeFJRUkFJQUFoQXd3Q0N5QUFJUU1EUUNBQ1JRMEVJQU1nQVMwQUFEb0FBQ0FCUVFGcUlRRWdBa0YvYWlFQ0lBTkJBV29pQTBFRGNRMEFDd3dCQ3dKQUlBTU5BQ0FFUVFOeEJFQURRQ0FDUlEwRklBQWdBa0YvYWlJQ2FpSURJQUVnQW1vdEFBQTZBQUFnQTBFRGNRMEFDd3NnQWtFRFRRMEFBMEFnQUNBQ1FYeHFJZ0pxSUFFZ0Ftb29BZ0EyQWdBZ0FrRURTdzBBQ3dzZ0FrVU5BZ05BSUFBZ0FrRi9haUlDYWlBQklBSnFMUUFBT2dBQUlBSU5BQXNNQWdzZ0FrRURUUTBBSUFJaEJBTkFJQU1nQVNnQ0FEWUNBQ0FCUVFScUlRRWdBMEVFYWlFRElBUkJmR29pQkVFRFN3MEFDeUFDUVFOeElRSUxJQUpGRFFBRFFDQURJQUV0QUFBNkFBQWdBMEVCYWlFRElBRkJBV29oQVNBQ1FYOXFJZ0lOQUFzTElBQUw4d0lDQW44QmZnSkFJQUpGRFFBZ0FDQUNhaUlEUVg5cUlBRTZBQUFnQUNBQk9nQUFJQUpCQTBrTkFDQURRWDVxSUFFNkFBQWdBQ0FCT2dBQklBTkJmV29nQVRvQUFDQUFJQUU2QUFJZ0FrRUhTUTBBSUFOQmZHb2dBVG9BQUNBQUlBRTZBQU1nQWtFSlNRMEFJQUJCQUNBQWEwRURjU0lFYWlJRElBRkIvd0Z4UVlHQ2hBaHNJZ0UyQWdBZ0F5QUNJQVJyUVh4eElnUnFJZ0pCZkdvZ0FUWUNBQ0FFUVFsSkRRQWdBeUFCTmdJSUlBTWdBVFlDQkNBQ1FYaHFJQUUyQWdBZ0FrRjBhaUFCTmdJQUlBUkJHVWtOQUNBRElBRTJBaGdnQXlBQk5nSVVJQU1nQVRZQ0VDQURJQUUyQWd3Z0FrRndhaUFCTmdJQUlBSkJiR29nQVRZQ0FDQUNRV2hxSUFFMkFnQWdBa0ZrYWlBQk5nSUFJQVFnQTBFRWNVRVljaUlFYXlJQ1FTQkpEUUFnQWEwaUJVSWdoaUFGaENFRklBTWdCR29oQVFOQUlBRWdCVGNER0NBQklBVTNBeEFnQVNBRk53TUlJQUVnQlRjREFDQUJRU0JxSVFFZ0FrRmdhaUlDUVI5TERRQUxDeUFBQ3k4QkFuOGdBQ2dDQkNBQUtBSUFRUUowYWlJQ0xRQUNJUU1nQUNBQ0x3RUFJQUVnQWkwQUF4QUlhallDQUNBREN5OEJBbjhnQUNnQ0JDQUFLQUlBUVFKMGFpSUNMUUFDSVFNZ0FDQUNMd0VBSUFFZ0FpMEFBeEFGYWpZQ0FDQURDeDhBSUFBZ0FTQUNLQUlFRUFnMkFnQWdBUkFFR2lBQUlBSkJDR28yQWdRTENBQWdBR2RCSDNNTHVnVUJEWDhqQUVFUWF5SUtKQUFDZnlBRVFRTk5CRUFnQ2tFQU5nSU1JQXBCREdvZ0F5QUVFQXNhSUFBZ0FTQUNJQXBCREdwQkJCQVZJZ0JCYkNBQUVBTWJJQUFnQUNBRVN4c01BUXNnQUVFQUlBRW9BZ0JCQVhSQkFtb1FFQ0VOUVZRZ0F5Z0FBQ0lHUVE5eElnQkJDa3NOQUJvZ0FpQUFRUVZxTmdJQUlBTWdCR29pQWtGOGFpRU1JQUpCZVdvaERpQUNRWHRxSVJBZ0FFRUdhaUVMUVFRaEJTQUdRUVIySVFSQklDQUFkQ0lBUVFGeUlRa2dBU2dDQUNFUFFRQWhBaUFESVFZQ1FBTkFJQWxCQWtnZ0FpQVBTM0pGQkVBZ0FpRUhBa0FnQ0FSQUEwQWdCRUgvL3dOeFFmLy9BMFlFUUNBSFFSaHFJUWNnQmlBUVNRUi9JQVpCQW1vaUJpZ0FBQ0FGZGdVZ0JVRVFhaUVGSUFSQkVIWUxJUVFNQVFzTEEwQWdCRUVEY1NJSVFRTkdCRUFnQlVFQ2FpRUZJQVJCQW5ZaEJDQUhRUU5xSVFjTUFRc0xJQWNnQ0dvaUJ5QVBTdzBFSUFWQkFtb2hCUU5BSUFJZ0Iwa0VRQ0FOSUFKQkFYUnFRUUE3QVFBZ0FrRUJhaUVDREFFTEN5QUdJQTVMUVFBZ0JpQUZRUU4xYWlJSElBeExHMFVFUUNBSEtBQUFJQVZCQjNFaUJYWWhCQXdDQ3lBRVFRSjJJUVFMSUFZaEJ3c0NmeUFMUVg5cUlBUWdBRUYvYW5FaUJpQUFRUUYwUVg5cUlnZ2dDV3NpRVVrTkFCb2dCQ0FJY1NJRVFRQWdFU0FFSUFCSUcyc2hCaUFMQ3lFSUlBMGdBa0VCZEdvZ0JrRi9haUlFT3dFQUlBbEJBU0FHYXlBRUlBWkJBVWdiYXlFSkEwQWdDU0FBU0FSQUlBQkJBWFVoQUNBTFFYOXFJUXNNQVFzTEFuOGdCeUFPUzBFQUlBY2dCU0FJYWlJRlFRTjFhaUlHSUF4TEcwVUVRQ0FGUVFkeERBRUxJQVVnRENJR0lBZHJRUU4wYXdzaEJTQUNRUUZxSVFJZ0JFVWhDQ0FHS0FBQUlBVkJIM0YySVFRTUFRc0xRV3dnQ1VFQlJ5QUZRU0JLY2cwQkdpQUJJQUpCZjJvMkFnQWdCaUFGUVFkcVFRTjFhaUFEYXd3QkMwRlFDeUVBSUFwQkVHb2tBQ0FBQ3drQVFRRkJCU0FBR3dzTUFDQUFJQUVvQUFBMkFBQUxxZ01CQ244akFFSHdBR3NpQ2lRQUlBSkJBV29oRGlBQVFRaHFJUXRCZ0lBRUlBVkJmMnAwUVJCMUlReEJBQ0VDUVFFaEJrRUJJQVYwSWdsQmYyb2lEeUVJQTBBZ0FpQU9Sa1VFUUFKQUlBRWdBa0VCZENJTmFpOEJBQ0lIUWYvL0EwWUVRQ0FMSUFoQkEzUnFJQUkyQWdRZ0NFRi9haUVJUVFFaEJ3d0JDeUFHUVFBZ0RDQUhRUkIwUVJCMVNoc2hCZ3NnQ2lBTmFpQUhPd0VBSUFKQkFXb2hBZ3dCQ3dzZ0FDQUZOZ0lFSUFBZ0JqWUNBQ0FKUVFOMklBbEJBWFpxUVFOcUlReEJBQ0VBUVFBaEJrRUFJUUlEUUNBR0lBNUdCRUFEUUFKQUlBQWdDVVlOQUNBS0lBc2dBRUVEZEdvaUFTZ0NCQ0lHUVFGMGFpSUNJQUl2QVFBaUFrRUJhanNCQUNBQklBVWdBaEFVYXlJSU9nQURJQUVnQWlBSVFmOEJjWFFnQ1dzN0FRQWdBU0FFSUFaQkFuUWlBbW9vQWdBNkFBSWdBU0FDSUFOcUtBSUFOZ0lFSUFCQkFXb2hBQXdCQ3dzRklBRWdCa0VCZEdvdUFRQWhEVUVBSVFjRFFDQUhJQTFPUlFSQUlBc2dBa0VEZEdvZ0JqWUNCQU5BSUFJZ0RHb2dEM0VpQWlBSVN3MEFDeUFIUVFGcUlRY01BUXNMSUFaQkFXb2hCZ3dCQ3dzZ0NrSHdBR29rQUFzakFFSUFJQUVRQ1NBQWhVS0hsYSt2bUxiZW01NS9ma0xqM01xVi9NN3k5WVYvZkFzUUFDQUFRbjQzQXdnZ0FDQUJOZ0lBQ3lRQkFYOGdBQVJBSUFFb0FnUWlBZ1JBSUFFb0FnZ2dBQ0FDRVFFQUR3c2dBQkFtQ3dzZkFDQUFJQUVnQWk4QkFCQUlOZ0lBSUFFUUJCb2dBQ0FDUVFScU5nSUVDMG9CQVg5Qm9DQW9BZ0FpQVNBQWFpSUFRWDlNQkVCQmlDQkJNRFlDQUVGL0R3c0NRQ0FBUHdCQkVIUk5EUUFnQUJCbURRQkJpQ0JCTURZQ0FFRi9Ed3RCb0NBZ0FEWUNBQ0FCQzljQkFRaC9RYnAvSVFvQ1FDQUNLQUlFSWdnZ0FpZ0NBQ0lKYWlJT0lBRWdBR3RMRFFCQmJDRUtJQWtnQkNBREtBSUFJZ3RyU3cwQUlBQWdDV29pQkNBQ0tBSUlJZ3hySVEwZ0FDQUJRV0JxSWc4Z0N5QUpRUUFRS1NBRElBa2dDMm8yQWdBQ1FBSkFJQXdnQkNBRmEwMEVRQ0FOSVFVTUFRc2dEQ0FFSUFaclN3MENJQWNnRFNBRmF5SUFhaUlCSUFocUlBZE5CRUFnQkNBQklBZ1FEeG9NQWdzZ0JDQUJRUUFnQUdzUUR5RUJJQUlnQUNBSWFpSUlOZ0lFSUFFZ0FHc2hCQXNnQkNBUElBVWdDRUVCRUNrTElBNGhDZ3NnQ2d1YkFnRUJmeU1BUVlBQmF5SU5KQUFnRFNBRE5nSjhBa0FnQWtFRFN3UkFRWDhoQ1F3QkN3SkFBa0FDUUFKQUlBSkJBV3NPQXdBREFnRUxJQVpGQkVCQnVIOGhDUXdFQzBGc0lRa2dCUzBBQUNJQ0lBTkxEUU1nQUNBSElBSkJBblFpQW1vb0FnQWdBaUFJYWlnQ0FCQTdJQUVnQURZQ0FFRUJJUWtNQXdzZ0FTQUpOZ0lBUVFBaENRd0NDeUFLUlFSQVFXd2hDUXdDQzBFQUlRa2dDMFVnREVFWlNISU5BVUVJSUFSMFFRaHFJUUJCQUNFQ0EwQWdBaUFBVHcwQ0lBSkJRR3NoQWd3QUFBc0FDMEZzSVFrZ0RTQU5RZndBYWlBTlFmZ0FhaUFGSUFZUUZTSUNFQU1OQUNBTktBSjRJZ01nQkVzTkFDQUFJQTBnRFNnQ2ZDQUhJQWdnQXhBWUlBRWdBRFlDQUNBQ0lRa0xJQTFCZ0FGcUpBQWdDUXNMQUNBQUlBRWdBaEFMR2dzUUFDQUFMd0FBSUFBdEFBSkJFSFJ5Q3k4QUFuOUJ1SDhnQVVFSVNRMEFHa0Z5SUFBb0FBUWlBRUYzU3cwQUdrRzRmeUFBUVFocUlnQWdBQ0FCU3hzTEN3a0FJQUFnQVRzQUFBc0RBQUVMaWdZQkJYOGdBQ0FBS0FJQUlnVkJmbkUyQWdCQkFDQUFJQVZCQVhacVFZUWdLQUlBSWdRZ0FFWWJJUUVDUUFKQUlBQW9BZ1FpQWtVTkFDQUNLQUlBSWdOQkFYRU5BQ0FDUVFocUlnVWdBMEVCZGtGNGFpSURRUWdnQTBFSVN4dG5RUjl6UVFKMFFZQWZhaUlES0FJQVJnUkFJQU1nQWlnQ0REWUNBQXNnQWlnQ0NDSURCRUFnQXlBQ0tBSU1OZ0lFQ3lBQ0tBSU1JZ01FUUNBRElBSW9BZ2cyQWdBTElBSWdBaWdDQUNBQUtBSUFRWDV4YWpZQ0FFR0VJQ0VBQWtBQ1FDQUJSUTBBSUFFZ0FqWUNCQ0FCS0FJQUlnTkJBWEVOQVNBRFFRRjJRWGhxSWdOQkNDQURRUWhMRzJkQkgzTkJBblJCZ0I5cUlnTW9BZ0FnQVVFSWFrWUVRQ0FESUFFb0FndzJBZ0FMSUFFb0FnZ2lBd1JBSUFNZ0FTZ0NERFlDQkFzZ0FTZ0NEQ0lEQkVBZ0F5QUJLQUlJTmdJQVFZUWdLQUlBSVFRTElBSWdBaWdDQUNBQktBSUFRWDV4YWpZQ0FDQUJJQVJHRFFBZ0FTQUJLQUlBUVFGMmFrRUVhaUVBQ3lBQUlBSTJBZ0FMSUFJb0FnQkJBWFpCZUdvaUFFRUlJQUJCQ0VzYlowRWZjMEVDZEVHQUgyb2lBU2dDQUNFQUlBRWdCVFlDQUNBQ0lBQTJBZ3dnQWtFQU5nSUlJQUJGRFFFZ0FDQUZOZ0lBRHdzQ1FDQUJSUTBBSUFFb0FnQWlBa0VCY1EwQUlBSkJBWFpCZUdvaUFrRUlJQUpCQ0VzYlowRWZjMEVDZEVHQUgyb2lBaWdDQUNBQlFRaHFSZ1JBSUFJZ0FTZ0NERFlDQUFzZ0FTZ0NDQ0lDQkVBZ0FpQUJLQUlNTmdJRUN5QUJLQUlNSWdJRVFDQUNJQUVvQWdnMkFnQkJoQ0FvQWdBaEJBc2dBQ0FBS0FJQUlBRW9BZ0JCZm5GcUlnSTJBZ0FDUUNBQklBUkhCRUFnQVNBQktBSUFRUUYyYWlBQU5nSUVJQUFvQWdBaEFnd0JDMEdFSUNBQU5nSUFDeUFDUVFGMlFYaHFJZ0ZCQ0NBQlFRaExHMmRCSDNOQkFuUkJnQjlxSWdJb0FnQWhBU0FDSUFCQkNHb2lBallDQUNBQUlBRTJBZ3dnQUVFQU5nSUlJQUZGRFFFZ0FTQUNOZ0lBRHdzZ0JVRUJka0Y0YWlJQlFRZ2dBVUVJU3h0blFSOXpRUUowUVlBZmFpSUNLQUlBSVFFZ0FpQUFRUWhxSWdJMkFnQWdBQ0FCTmdJTUlBQkJBRFlDQ0NBQlJRMEFJQUVnQWpZQ0FBc0xEZ0FnQUFSQUlBQkJlR29RSlFzTGdBSUJBMzhDUUNBQVFROXFRWGh4UVlRZ0tBSUFLQUlBUVFGMmF5SUNFQjFCZjBZTkFBSkFRWVFnS0FJQUlnQW9BZ0FpQVVFQmNRMEFJQUZCQVhaQmVHb2lBVUVJSUFGQkNFc2JaMEVmYzBFQ2RFR0FIMm9pQVNnQ0FDQUFRUWhxUmdSQUlBRWdBQ2dDRERZQ0FBc2dBQ2dDQ0NJQkJFQWdBU0FBS0FJTU5nSUVDeUFBS0FJTUlnRkZEUUFnQVNBQUtBSUlOZ0lBQzBFQklRRWdBQ0FBS0FJQUlBSkJBWFJxSWdJMkFnQWdBa0VCY1EwQUlBSkJBWFpCZUdvaUFrRUlJQUpCQ0VzYlowRWZjMEVDZEVHQUgyb2lBeWdDQUNFQ0lBTWdBRUVJYWlJRE5nSUFJQUFnQWpZQ0RDQUFRUUEyQWdnZ0FrVU5BQ0FDSUFNMkFnQUxJQUVMdHdJQkEzOENRQUpBSUFCQkFTQUFHeUlDRURnaUFBMEFBa0FDUUVHRUlDZ0NBQ0lBUlEwQUlBQW9BZ0FpQTBFQmNRMEFJQUFnQTBFQmNqWUNBQ0FEUVFGMlFYaHFJZ0ZCQ0NBQlFRaExHMmRCSDNOQkFuUkJnQjlxSWdFb0FnQWdBRUVJYWtZRVFDQUJJQUFvQWd3MkFnQUxJQUFvQWdnaUFRUkFJQUVnQUNnQ0REWUNCQXNnQUNnQ0RDSUJCRUFnQVNBQUtBSUlOZ0lBQ3lBQ0VDY2hBa0VBSVFGQmhDQW9BZ0FoQUNBQ0RRRWdBQ0FBS0FJQVFYNXhOZ0lBUVFBUEN5QUNRUTlxUVhoeElnTVFIU0lDUVg5R0RRSWdBa0VIYWtGNGNTSUFJQUpIQkVBZ0FDQUNheEFkUVg5R0RRTUxBa0JCaENBb0FnQWlBVVVFUUVHQUlDQUFOZ0lBREFFTElBQWdBVFlDQkF0QmhDQWdBRFlDQUNBQUlBTkJBWFJCQVhJMkFnQU1BUXNnQUVVTkFRc2dBRUVJYWlFQkN5QUJDN2tEQVFKL0lBQWdBMm9oQlFKQUlBTkJCMHdFUUFOQUlBQWdCVThOQWlBQUlBSXRBQUE2QUFBZ0FFRUJhaUVBSUFKQkFXb2hBZ3dBQUFzQUN5QUVRUUZHQkVBQ1FDQUFJQUpySWdaQkIwMEVRQ0FBSUFJdEFBQTZBQUFnQUNBQ0xRQUJPZ0FCSUFBZ0FpMEFBam9BQWlBQUlBSXRBQU02QUFNZ0FFRUVhaUFDSUFaQkFuUWlCa0hBSG1vb0FnQnFJZ0lRRnlBQ0lBWkI0QjVxS0FJQWF5RUNEQUVMSUFBZ0FoQU1DeUFDUVFocUlRSWdBRUVJYWlFQUN3SkFBa0FDUUFKQUlBVWdBVTBFUUNBQUlBTnFJUUVnQkVFQlJ5QUFJQUpyUVE5S2NnMEJBMEFnQUNBQ0VBd2dBa0VJYWlFQ0lBQkJDR29pQUNBQlNRMEFDd3dGQ3lBQUlBRkxCRUFnQUNFQkRBUUxJQVJCQVVjZ0FDQUNhMEVQU25JTkFTQUFJUU1nQWlFRUEwQWdBeUFFRUF3Z0JFRUlhaUVFSUFOQkNHb2lBeUFCU1EwQUN3d0NDd05BSUFBZ0FoQUhJQUpCRUdvaEFpQUFRUkJxSWdBZ0FVa05BQXNNQXdzZ0FDRURJQUloQkFOQUlBTWdCQkFISUFSQkVHb2hCQ0FEUVJCcUlnTWdBVWtOQUFzTElBSWdBU0FBYTJvaEFnc0RRQ0FCSUFWUERRRWdBU0FDTFFBQU9nQUFJQUZCQVdvaEFTQUNRUUZxSVFJTUFBQUxBQXNMUVFFQ2Z5QUFJQUFvQXJqZ0FTSUROZ0xFNEFFZ0FDZ0N2T0FCSVFRZ0FDQUJOZ0s4NEFFZ0FDQUJJQUpxTmdLNDRBRWdBQ0FCSUFRZ0EydHFOZ0xBNEFFTHBnRUJBWDhnQUNBQUtBTHM0UUVRRmpZQ3lPQUJJQUJDQURjRCtPQUJJQUJDQURjRHVPQUJJQUJCd09BQmFrSUFOd01BSUFCQnFOQUFhaUlCUVl5QWdPQUFOZ0lBSUFCQkFEWUNtT0lCSUFCQ0FEY0RpT0VCSUFCQ0F6Y0RnT0VCSUFCQnJOQUJha0hnRWlrQ0FEY0NBQ0FBUWJUUUFXcEI2QklvQWdBMkFnQWdBQ0FCTmdJTUlBQWdBRUdZSUdvMkFnZ2dBQ0FBUWFBd2FqWUNCQ0FBSUFCQkVHbzJBZ0FMWVFFQmYwRzRmeUVEQWtBZ0FVRURTUTBBSUFJZ0FCQWhJZ0ZCQTNZaUFEWUNDQ0FDSUFGQkFYRTJBZ1FnQWlBQlFRRjJRUU54SWdNMkFnQUNRQ0FEUVg5cUlnRkJBa3NOQUFKQUlBRkJBV3NPQWdFQUFndEJiQThMSUFBaEF3c2dBd3NNQUNBQUlBRWdBa0VBRUM0TGlBUUNBMzhDZmlBREVCWWhCQ0FBUVFCQktCQVFJUUFnQkNBQ1N3UkFJQVFQQ3lBQlJRUkFRWDhQQ3dKQUFrQWdBMEVCUmcwQUlBRW9BQUFpQmtHbzZyNXBSZzBBUVhZaEF5QUdRWEJ4UWREVXRNSUJSdzBCUVFnaEF5QUNRUWhKRFFFZ0FFRUFRU2dRRUNFQUlBRW9BQVFoQVNBQVFRRTJBaFFnQUNBQnJUY0RBRUVBRHdzZ0FTQUNJQU1RTHlJRElBSkxEUUFnQUNBRE5nSVlRWEloQXlBQklBUnFJZ1ZCZjJvdEFBQWlBa0VJY1EwQUlBSkJJSEVpQmtVRVFFRndJUU1nQlMwQUFDSUZRYWNCU3cwQklBVkJCM0d0UWdFZ0JVRURka0VLYXEyR0lnZENBNGgrSUFkOElRZ2dCRUVCYWlFRUN5QUNRUVoySVFNZ0FrRUNkaUVGQWtBZ0FrRURjVUYvYWlJQ1FRSkxCRUJCQUNFQ0RBRUxBa0FDUUFKQUlBSkJBV3NPQWdFQ0FBc2dBU0FFYWkwQUFDRUNJQVJCQVdvaEJBd0NDeUFCSUFScUx3QUFJUUlnQkVFQ2FpRUVEQUVMSUFFZ0JHb29BQUFoQWlBRVFRUnFJUVFMSUFWQkFYRWhCUUorQWtBQ1FBSkFJQU5CZjJvaUEwRUNUUVJBSUFOQkFXc09BZ0lEQVF0Q2Z5QUdSUTBER2lBQklBUnFNUUFBREFNTElBRWdCR292QUFDdFFvQUNmQXdDQ3lBQklBUnFLQUFBclF3QkN5QUJJQVJxS1FBQUN5RUhJQUFnQlRZQ0lDQUFJQUkyQWh3Z0FDQUhOd01BUVFBaEF5QUFRUUEyQWhRZ0FDQUhJQWdnQmhzaUJ6Y0RDQ0FBSUFkQ2dJQUlJQWRDZ0lBSVZCcytBaEFMSUFNTFd3RUJmMEc0ZnlFRElBSVFGaUlDSUFGTkJIOGdBQ0FDYWtGL2FpMEFBQ0lBUVFOeFFRSjBRYUFlYWlnQ0FDQUNhaUFBUVFaMklnRkJBblJCc0I1cUtBSUFhaUFBUVNCeElnQkZhaUFCUlNBQVFRVjJjV29GUWJoL0N3c2RBQ0FBS0FLUTRnRVFXaUFBUVFBMkFxRGlBU0FBUWdBM0E1RGlBUXUxQXdFRmZ5TUFRWkFDYXlJS0pBQkJ1SDhoQmdKQUlBVkZEUUFnQkN3QUFDSUlRZjhCY1NFSEFrQWdDRUYvVEFSQUlBZEJnbjlxUVFGMklnZ2dCVThOQWtGc0lRWWdCMEdCZjJvaUJVR0FBazhOQWlBRVFRRnFJUWRCQUNFR0EwQWdCaUFGVHdSQUlBVWhCaUFJSVFjTUF3VWdBQ0FHYWlBSElBWkJBWFpxSWdRdEFBQkJCSFk2QUFBZ0FDQUdRUUZ5YWlBRUxRQUFRUTl4T2dBQUlBWkJBbW9oQmd3QkN3QUFDd0FMSUFjZ0JVOE5BU0FBSUFSQkFXb2dCeUFLRUZNaUJoQUREUUVMSUFZaEJFRUFJUVlnQVVFQVFUUVFFQ0VKUVFBaEJRTkFJQVFnQmtjRVFDQUFJQVpxSWdndEFBQWlBVUVMU3dSQVFXd2hCZ3dEQlNBSklBRkJBblJxSWdFZ0FTZ0NBRUVCYWpZQ0FDQUdRUUZxSVFaQkFTQUlMUUFBZEVFQmRTQUZhaUVGREFJTEFBc0xRV3doQmlBRlJRMEFJQVVRRkVFQmFpSUJRUXhMRFFBZ0F5QUJOZ0lBUVFGQkFTQUJkQ0FGYXlJREVCUWlBWFFnQTBjTkFDQUFJQVJxSUFGQkFXb2lBRG9BQUNBSklBQkJBblJxSWdBZ0FDZ0NBRUVCYWpZQ0FDQUpLQUlFSWdCQkFra2dBRUVCY1hJTkFDQUNJQVJCQVdvMkFnQWdCMEVCYWlFR0N5QUtRWkFDYWlRQUlBWUx4aEVCREg4akFFSHdBR3NpQlNRQVFXd2hDd0pBSUFOQkNra05BQ0FDTHdBQUlRb2dBaThBQWlFSklBSXZBQVFoQnlBRlFRaHFJQVFRRGdKQUlBTWdCeUFKSUFwcWFrRUdhaUlNU1EwQUlBVXRBQW9oQ0NBRlFkZ0FhaUFDUVFacUlnSWdDaEFHSWdzUUF3MEJJQVZCUUdzZ0FpQUthaUlDSUFrUUJpSUxFQU1OQVNBRlFTaHFJQUlnQ1dvaUFpQUhFQVlpQ3hBRERRRWdCVUVRYWlBQ0lBZHFJQU1nREdzUUJpSUxFQU1OQVNBQUlBRnFJZzlCZldvaEVDQUVRUVJxSVFaQkFTRUxJQUFnQVVFRGFrRUNkaUlEYWlJTUlBTnFJZ0lnQTJvaURpRURJQUloQkNBTUlRY0RRQ0FMSUFNZ0VFbHhCRUFnQUNBR0lBVkIyQUJxSUFnUUFrRUNkR29pQ1M4QkFEc0FBQ0FGUWRnQWFpQUpMUUFDRUFFZ0NTMEFBeUVMSUFjZ0JpQUZRVUJySUFnUUFrRUNkR29pQ1M4QkFEc0FBQ0FGUVVCcklBa3RBQUlRQVNBSkxRQURJUW9nQkNBR0lBVkJLR29nQ0JBQ1FRSjBhaUlKTHdFQU93QUFJQVZCS0dvZ0NTMEFBaEFCSUFrdEFBTWhDU0FESUFZZ0JVRVFhaUFJRUFKQkFuUnFJZzB2QVFBN0FBQWdCVUVRYWlBTkxRQUNFQUVnRFMwQUF5RU5JQUFnQzJvaUN5QUdJQVZCMkFCcUlBZ1FBa0VDZEdvaUFDOEJBRHNBQUNBRlFkZ0FhaUFBTFFBQ0VBRWdBQzBBQXlFQUlBY2dDbW9pQ2lBR0lBVkJRR3NnQ0JBQ1FRSjBhaUlITHdFQU93QUFJQVZCUUdzZ0J5MEFBaEFCSUFjdEFBTWhCeUFFSUFscUlna2dCaUFGUVNocUlBZ1FBa0VDZEdvaUJDOEJBRHNBQUNBRlFTaHFJQVF0QUFJUUFTQUVMUUFESVFRZ0F5QU5haUlESUFZZ0JVRVFhaUFJRUFKQkFuUnFJZzB2QVFBN0FBQWdCVUVRYWlBTkxRQUNFQUVnQUNBTGFpRUFJQWNnQ21vaEJ5QUVJQWxxSVFRZ0F5QU5MUUFEYWlFRElBVkIyQUJxRUEwZ0JVRkFheEFOY2lBRlFTaHFFQTF5SUFWQkVHb1FEWEpGSVFzTUFRc0xJQVFnRGtzZ0J5QUNTM0lOQUVGc0lRc2dBQ0FNU3cwQklBeEJmV29oQ1FOQVFRQWdBQ0FKU1NBRlFkZ0FhaEFFR3dSQUlBQWdCaUFGUWRnQWFpQUlFQUpCQW5ScUlnb3ZBUUE3QUFBZ0JVSFlBR29nQ2kwQUFoQUJJQUFnQ2kwQUEyb2lBQ0FHSUFWQjJBQnFJQWdRQWtFQ2RHb2lDaThCQURzQUFDQUZRZGdBYWlBS0xRQUNFQUVnQUNBS0xRQURhaUVBREFFRklBeEJmbW9oQ2dOQUlBVkIyQUJxRUFRZ0FDQUtTM0pGQkVBZ0FDQUdJQVZCMkFCcUlBZ1FBa0VDZEdvaUNTOEJBRHNBQUNBRlFkZ0FhaUFKTFFBQ0VBRWdBQ0FKTFFBRGFpRUFEQUVMQ3dOQUlBQWdDazBFUUNBQUlBWWdCVUhZQUdvZ0NCQUNRUUowYWlJSkx3RUFPd0FBSUFWQjJBQnFJQWt0QUFJUUFTQUFJQWt0QUFOcUlRQU1BUXNMQWtBZ0FDQU1UdzBBSUFBZ0JpQUZRZGdBYWlBSUVBSWlBRUVDZEdvaURDMEFBRG9BQUNBTUxRQURRUUZHQkVBZ0JVSFlBR29nREMwQUFoQUJEQUVMSUFVb0FseEJIMHNOQUNBRlFkZ0FhaUFHSUFCQkFuUnFMUUFDRUFFZ0JTZ0NYRUVoU1EwQUlBVkJJRFlDWEFzZ0FrRjlhaUVNQTBCQkFDQUhJQXhKSUFWQlFHc1FCQnNFUUNBSElBWWdCVUZBYXlBSUVBSkJBblJxSWdBdkFRQTdBQUFnQlVGQWF5QUFMUUFDRUFFZ0J5QUFMUUFEYWlJQUlBWWdCVUZBYXlBSUVBSkJBblJxSWdjdkFRQTdBQUFnQlVGQWF5QUhMUUFDRUFFZ0FDQUhMUUFEYWlFSERBRUZJQUpCZm1vaERBTkFJQVZCUUdzUUJDQUhJQXhMY2tVRVFDQUhJQVlnQlVGQWF5QUlFQUpCQW5ScUlnQXZBUUE3QUFBZ0JVRkFheUFBTFFBQ0VBRWdCeUFBTFFBRGFpRUhEQUVMQ3dOQUlBY2dERTBFUUNBSElBWWdCVUZBYXlBSUVBSkJBblJxSWdBdkFRQTdBQUFnQlVGQWF5QUFMUUFDRUFFZ0J5QUFMUUFEYWlFSERBRUxDd0pBSUFjZ0FrOE5BQ0FISUFZZ0JVRkFheUFJRUFJaUFFRUNkR29pQWkwQUFEb0FBQ0FDTFFBRFFRRkdCRUFnQlVGQWF5QUNMUUFDRUFFTUFRc2dCU2dDUkVFZlN3MEFJQVZCUUdzZ0JpQUFRUUowYWkwQUFoQUJJQVVvQWtSQklVa05BQ0FGUVNBMkFrUUxJQTVCZldvaEFnTkFRUUFnQkNBQ1NTQUZRU2hxRUFRYkJFQWdCQ0FHSUFWQktHb2dDQkFDUVFKMGFpSUFMd0VBT3dBQUlBVkJLR29nQUMwQUFoQUJJQVFnQUMwQUEyb2lBQ0FHSUFWQktHb2dDQkFDUVFKMGFpSUVMd0VBT3dBQUlBVkJLR29nQkMwQUFoQUJJQUFnQkMwQUEyb2hCQXdCQlNBT1FYNXFJUUlEUUNBRlFTaHFFQVFnQkNBQ1MzSkZCRUFnQkNBR0lBVkJLR29nQ0JBQ1FRSjBhaUlBTHdFQU93QUFJQVZCS0dvZ0FDMEFBaEFCSUFRZ0FDMEFBMm9oQkF3QkN3c0RRQ0FFSUFKTkJFQWdCQ0FHSUFWQktHb2dDQkFDUVFKMGFpSUFMd0VBT3dBQUlBVkJLR29nQUMwQUFoQUJJQVFnQUMwQUEyb2hCQXdCQ3dzQ1FDQUVJQTVQRFFBZ0JDQUdJQVZCS0dvZ0NCQUNJZ0JCQW5ScUlnSXRBQUE2QUFBZ0FpMEFBMEVCUmdSQUlBVkJLR29nQWkwQUFoQUJEQUVMSUFVb0FpeEJIMHNOQUNBRlFTaHFJQVlnQUVFQ2RHb3RBQUlRQVNBRktBSXNRU0ZKRFFBZ0JVRWdOZ0lzQ3dOQVFRQWdBeUFRU1NBRlFSQnFFQVFiQkVBZ0F5QUdJQVZCRUdvZ0NCQUNRUUowYWlJQUx3RUFPd0FBSUFWQkVHb2dBQzBBQWhBQklBTWdBQzBBQTJvaUFDQUdJQVZCRUdvZ0NCQUNRUUowYWlJQ0x3RUFPd0FBSUFWQkVHb2dBaTBBQWhBQklBQWdBaTBBQTJvaEF3d0JCU0FQUVg1cUlRSURRQ0FGUVJCcUVBUWdBeUFDUzNKRkJFQWdBeUFHSUFWQkVHb2dDQkFDUVFKMGFpSUFMd0VBT3dBQUlBVkJFR29nQUMwQUFoQUJJQU1nQUMwQUEyb2hBd3dCQ3dzRFFDQURJQUpOQkVBZ0F5QUdJQVZCRUdvZ0NCQUNRUUowYWlJQUx3RUFPd0FBSUFWQkVHb2dBQzBBQWhBQklBTWdBQzBBQTJvaEF3d0JDd3NDUUNBRElBOVBEUUFnQXlBR0lBVkJFR29nQ0JBQ0lnQkJBblJxSWdJdEFBQTZBQUFnQWkwQUEwRUJSZ1JBSUFWQkVHb2dBaTBBQWhBQkRBRUxJQVVvQWhSQkgwc05BQ0FGUVJCcUlBWWdBRUVDZEdvdEFBSVFBU0FGS0FJVVFTRkpEUUFnQlVFZ05nSVVDeUFCUVd3Z0JVSFlBR29RQ2lBRlFVQnJFQXB4SUFWQktHb1FDbkVnQlVFUWFoQUtjUnNoQ3d3SkN3QUFDd0FMQUFBTEFBc0FBQXNBQ3dBQUN3QUxRV3doQ3dzZ0JVSHdBR29rQUNBTEM3VUVBUTUvSXdCQkVHc2lCaVFBSUFaQkJHb2dBQkFPUVZRaEJRSkFJQVJCM0F0SkRRQWdCaTBBQkNFSElBTkI4QVJxUVFCQjdBQVFFQ0VJSUFkQkRFc05BQ0FEUWR3SmFpSUpJQWdnQmtFSWFpQUdRUXhxSUFFZ0FoQXhJaEFRQTBVRVFDQUdLQUlNSWdRZ0Iwc05BU0FEUWR3RmFpRVBJQU5CcEFWcUlSRWdBRUVFYWlFU0lBTkJxQVZxSVFFZ0JDRUZBMEFnQlNJQ1FYOXFJUVVnQ0NBQ1FRSjBhaWdDQUVVTkFBc2dBa0VCYWlFT1FRRWhCUU5BSUFVZ0RrOUZCRUFnQ0NBRlFRSjBJZ3RxS0FJQUlRd2dBU0FMYWlBS05nSUFJQVZCQVdvaEJTQUtJQXhxSVFvTUFRc0xJQUVnQ2pZQ0FFRUFJUVVnQmlnQ0NDRUxBMEFnQlNBTFJrVUVRQ0FCSUFVZ0NXb3RBQUFpREVFQ2RHb2lEU0FOS0FJQUlnMUJBV28yQWdBZ0R5QU5RUUYwYWlJTklBdzZBQUVnRFNBRk9nQUFJQVZCQVdvaEJRd0JDd3RCQUNFQklBTkJBRFlDcUFVZ0JFRi9jeUFIYWlFSlFRRWhCUU5BSUFVZ0RrOUZCRUFnQ0NBRlFRSjBJZ3RxS0FJQUlRd2dBeUFMYWlBQk5nSUFJQXdnQlNBSmFuUWdBV29oQVNBRlFRRnFJUVVNQVFzTElBY2dCRUVCYWlJQklBSnJJZ1JyUVFGcUlRZ0RRRUVCSVFVZ0JDQUlUMFVFUUFOQUlBVWdEazlGQkVBZ0JVRUNkQ0lKSUFNZ0JFRTBiR3BxSUFNZ0NXb29BZ0FnQkhZMkFnQWdCVUVCYWlFRkRBRUxDeUFFUVFGcUlRUU1BUXNMSUJJZ0J5QVBJQW9nRVNBRElBSWdBUkJrSUFaQkFUb0FCU0FHSUFjNkFBWWdBQ0FHS0FJRU5nSUFDeUFRSVFVTElBWkJFR29rQUNBRkM4RU5BUXQvSXdCQjhBQnJJZ1VrQUVGc0lRa0NRQ0FEUVFwSkRRQWdBaThBQUNFS0lBSXZBQUloRENBQ0x3QUVJUVlnQlVFSWFpQUVFQTRDUUNBRElBWWdDaUFNYW1wQkJtb2lEVWtOQUNBRkxRQUtJUWNnQlVIWUFHb2dBa0VHYWlJQ0lBb1FCaUlKRUFNTkFTQUZRVUJySUFJZ0Ntb2lBaUFNRUFZaUNSQUREUUVnQlVFb2FpQUNJQXhxSWdJZ0JoQUdJZ2tRQXcwQklBVkJFR29nQWlBR2FpQURJQTFyRUFZaUNSQUREUUVnQUNBQmFpSU9RWDFxSVE4Z0JFRUVhaUVHUVFFaENTQUFJQUZCQTJwQkFuWWlBbW9pQ2lBQ2FpSU1JQUpxSWcwaEF5QU1JUVFnQ2lFQ0EwQWdDU0FESUE5SmNRUkFJQVlnQlVIWUFHb2dCeEFDUVFGMGFpSUlMUUFBSVFzZ0JVSFlBR29nQ0MwQUFSQUJJQUFnQ3pvQUFDQUdJQVZCUUdzZ0J4QUNRUUYwYWlJSUxRQUFJUXNnQlVGQWF5QUlMUUFCRUFFZ0FpQUxPZ0FBSUFZZ0JVRW9haUFIRUFKQkFYUnFJZ2d0QUFBaEN5QUZRU2hxSUFndEFBRVFBU0FFSUFzNkFBQWdCaUFGUVJCcUlBY1FBa0VCZEdvaUNDMEFBQ0VMSUFWQkVHb2dDQzBBQVJBQklBTWdDem9BQUNBR0lBVkIyQUJxSUFjUUFrRUJkR29pQ0MwQUFDRUxJQVZCMkFCcUlBZ3RBQUVRQVNBQUlBczZBQUVnQmlBRlFVQnJJQWNRQWtFQmRHb2lDQzBBQUNFTElBVkJRR3NnQ0MwQUFSQUJJQUlnQ3pvQUFTQUdJQVZCS0dvZ0J4QUNRUUYwYWlJSUxRQUFJUXNnQlVFb2FpQUlMUUFCRUFFZ0JDQUxPZ0FCSUFZZ0JVRVFhaUFIRUFKQkFYUnFJZ2d0QUFBaEN5QUZRUkJxSUFndEFBRVFBU0FESUFzNkFBRWdBMEVDYWlFRElBUkJBbW9oQkNBQ1FRSnFJUUlnQUVFQ2FpRUFJQWtnQlVIWUFHb1FEVVZ4SUFWQlFHc1FEVVZ4SUFWQktHb1FEVVZ4SUFWQkVHb1FEVVZ4SVFrTUFRc0xJQVFnRFVzZ0FpQU1TM0lOQUVGc0lRa2dBQ0FLU3cwQklBcEJmV29oQ1FOQUlBVkIyQUJxRUFRZ0FDQUpUM0pGQkVBZ0JpQUZRZGdBYWlBSEVBSkJBWFJxSWdndEFBQWhDeUFGUWRnQWFpQUlMUUFCRUFFZ0FDQUxPZ0FBSUFZZ0JVSFlBR29nQnhBQ1FRRjBhaUlJTFFBQUlRc2dCVUhZQUdvZ0NDMEFBUkFCSUFBZ0N6b0FBU0FBUVFKcUlRQU1BUXNMQTBBZ0JVSFlBR29RQkNBQUlBcFBja1VFUUNBR0lBVkIyQUJxSUFjUUFrRUJkR29pQ1MwQUFDRUlJQVZCMkFCcUlBa3RBQUVRQVNBQUlBZzZBQUFnQUVFQmFpRUFEQUVMQ3dOQUlBQWdDa2tFUUNBR0lBVkIyQUJxSUFjUUFrRUJkR29pQ1MwQUFDRUlJQVZCMkFCcUlBa3RBQUVRQVNBQUlBZzZBQUFnQUVFQmFpRUFEQUVMQ3lBTVFYMXFJUUFEUUNBRlFVQnJFQVFnQWlBQVQzSkZCRUFnQmlBRlFVQnJJQWNRQWtFQmRHb2lDaTBBQUNFSklBVkJRR3NnQ2kwQUFSQUJJQUlnQ1RvQUFDQUdJQVZCUUdzZ0J4QUNRUUYwYWlJS0xRQUFJUWtnQlVGQWF5QUtMUUFCRUFFZ0FpQUpPZ0FCSUFKQkFtb2hBZ3dCQ3dzRFFDQUZRVUJyRUFRZ0FpQU1UM0pGQkVBZ0JpQUZRVUJySUFjUUFrRUJkR29pQUMwQUFDRUtJQVZCUUdzZ0FDMEFBUkFCSUFJZ0Nqb0FBQ0FDUVFGcUlRSU1BUXNMQTBBZ0FpQU1TUVJBSUFZZ0JVRkFheUFIRUFKQkFYUnFJZ0F0QUFBaENpQUZRVUJySUFBdEFBRVFBU0FDSUFvNkFBQWdBa0VCYWlFQ0RBRUxDeUFOUVgxcUlRQURRQ0FGUVNocUVBUWdCQ0FBVDNKRkJFQWdCaUFGUVNocUlBY1FBa0VCZEdvaUFpMEFBQ0VLSUFWQktHb2dBaTBBQVJBQklBUWdDam9BQUNBR0lBVkJLR29nQnhBQ1FRRjBhaUlDTFFBQUlRb2dCVUVvYWlBQ0xRQUJFQUVnQkNBS09nQUJJQVJCQW1vaEJBd0JDd3NEUUNBRlFTaHFFQVFnQkNBTlQzSkZCRUFnQmlBRlFTaHFJQWNRQWtFQmRHb2lBQzBBQUNFQ0lBVkJLR29nQUMwQUFSQUJJQVFnQWpvQUFDQUVRUUZxSVFRTUFRc0xBMEFnQkNBTlNRUkFJQVlnQlVFb2FpQUhFQUpCQVhScUlnQXRBQUFoQWlBRlFTaHFJQUF0QUFFUUFTQUVJQUk2QUFBZ0JFRUJhaUVFREFFTEN3TkFJQVZCRUdvUUJDQURJQTlQY2tVRVFDQUdJQVZCRUdvZ0J4QUNRUUYwYWlJQUxRQUFJUUlnQlVFUWFpQUFMUUFCRUFFZ0F5QUNPZ0FBSUFZZ0JVRVFhaUFIRUFKQkFYUnFJZ0F0QUFBaEFpQUZRUkJxSUFBdEFBRVFBU0FESUFJNkFBRWdBMEVDYWlFRERBRUxDd05BSUFWQkVHb1FCQ0FESUE1UGNrVUVRQ0FHSUFWQkVHb2dCeEFDUVFGMGFpSUFMUUFBSVFJZ0JVRVFhaUFBTFFBQkVBRWdBeUFDT2dBQUlBTkJBV29oQXd3QkN3c0RRQ0FESUE1SkJFQWdCaUFGUVJCcUlBY1FBa0VCZEdvaUFDMEFBQ0VDSUFWQkVHb2dBQzBBQVJBQklBTWdBam9BQUNBRFFRRnFJUU1NQVFzTElBRkJiQ0FGUWRnQWFoQUtJQVZCUUdzUUNuRWdCVUVvYWhBS2NTQUZRUkJxRUFweEd5RUpEQUVMUVd3aENRc2dCVUh3QUdva0FDQUpDOG9DQVFSL0l3QkJJR3NpQlNRQUlBVWdCQkFPSUFVdEFBSWhCeUFGUVFocUlBSWdBeEFHSWdJUUEwVUVRQ0FFUVFScUlRSWdBQ0FCYWlJRFFYMXFJUVFEUUNBRlFRaHFFQVFnQUNBRVQzSkZCRUFnQWlBRlFRaHFJQWNRQWtFQmRHb2lCaTBBQUNFSUlBVkJDR29nQmkwQUFSQUJJQUFnQ0RvQUFDQUNJQVZCQ0dvZ0J4QUNRUUYwYWlJR0xRQUFJUWdnQlVFSWFpQUdMUUFCRUFFZ0FDQUlPZ0FCSUFCQkFtb2hBQXdCQ3dzRFFDQUZRUWhxRUFRZ0FDQURUM0pGQkVBZ0FpQUZRUWhxSUFjUUFrRUJkR29pQkMwQUFDRUdJQVZCQ0dvZ0JDMEFBUkFCSUFBZ0Jqb0FBQ0FBUVFGcUlRQU1BUXNMQTBBZ0FDQURUMFVFUUNBQ0lBVkJDR29nQnhBQ1FRRjBhaUlFTFFBQUlRWWdCVUVJYWlBRUxRQUJFQUVnQUNBR09nQUFJQUJCQVdvaEFBd0JDd3NnQVVGc0lBVkJDR29RQ2hzaEFnc2dCVUVnYWlRQUlBSUx0Z01CQ1g4akFFRVFheUlHSkFBZ0JrRUFOZ0lNSUFaQkFEWUNDRUZVSVFRQ1FBSkFJQU5CUUdzaURDQURJQVpCQ0dvZ0JrRU1haUFCSUFJUU1TSUNFQU1OQUNBR1FRUnFJQUFRRGlBR0tBSU1JZ2NnQmkwQUJFRUJha3NOQVNBQVFRUnFJUW9nQmtFQU9nQUZJQVlnQnpvQUJpQUFJQVlvQWdRMkFnQWdCMEVCYWlFSlFRRWhCQU5BSUFRZ0NVa0VRQ0FESUFSQkFuUnFJZ0VvQWdBaEFDQUJJQVUyQWdBZ0FDQUVRWDlxZENBRmFpRUZJQVJCQVdvaEJBd0JDd3NnQjBFQmFpRUhRUUFoQlNBR0tBSUlJUWtEUUNBRklBbEdEUUVnQXlBRklBeHFMUUFBSWdSQkFuUnFJZ0JCQVNBRWRFRUJkU0lMSUFBb0FnQWlBV29pQURZQ0FDQUhJQVJySVFoQkFDRUVBa0FnQzBFRFRRUkFBMEFnQkNBTFJnMENJQW9nQVNBRWFrRUJkR29pQUNBSU9nQUJJQUFnQlRvQUFDQUVRUUZxSVFRTUFBQUxBQXNEUUNBQklBQlBEUUVnQ2lBQlFRRjBhaUlFSUFnNkFBRWdCQ0FGT2dBQUlBUWdDRG9BQXlBRUlBVTZBQUlnQkNBSU9nQUZJQVFnQlRvQUJDQUVJQWc2QUFjZ0JDQUZPZ0FHSUFGQkJHb2hBUXdBQUFzQUN5QUZRUUZxSVFVTUFBQUxBQXNnQWlFRUN5QUdRUkJxSkFBZ0JBdXRBUUVDZndKQVFZUWdLQUlBSUFCSElBQW9BZ0JCQVhZaUF5QUJhMEY0YWlJQ1FYaHhRUWhIY2dSL0lBSUZJQU1RSjBVTkFTQUNRUWhxQzBFUVNRMEFJQUFnQUNnQ0FDSUNRUUZ4SUFBZ0FXcEJEMnBCZUhFaUFTQUFhMEVCZEhJMkFnQWdBU0FBTmdJRUlBRWdBU2dDQUVFQmNTQUFJQUpCQVhacUlBRnJJZ0pCQVhSeU5nSUFRWVFnSUFFZ0FrSC8vLy8vQjNGcVFRUnFRWVFnS0FJQUlBQkdHeUFCTmdJQUlBRVFKUXNMeWdJQkJYOENRQUpBQWtBZ0FFRUlJQUJCQ0VzYlowRWZjeUFBYVVFQlIyb2lBVUVFU1NBQUlBRjJjZzBBSUFGQkFuUkIvQjVxS0FJQUlnSkZEUUFEUUNBQ1FYaHFJZ01vQWdCQkFYWkJlR29pQlNBQVR3UkFJQUlnQlVFSUlBVkJDRXNiWjBFZmMwRUNkRUdBSDJvaUFTZ0NBRVlFUUNBQklBSW9BZ1EyQWdBTERBTUxJQVJCSGtzTkFTQUVRUUZxSVFRZ0FpZ0NCQ0lDRFFBTEMwRUFJUU1nQVVFZ1R3MEJBMEFnQVVFQ2RFR0FIMm9vQWdBaUFrVUVRQ0FCUVI1TElRSWdBVUVCYWlFQklBSkZEUUVNQXdzTElBSWdBa0Y0YWlJREtBSUFRUUYyUVhocUlnRkJDQ0FCUVFoTEcyZEJIM05CQW5SQmdCOXFJZ0VvQWdCR0JFQWdBU0FDS0FJRU5nSUFDd3NnQWlnQ0FDSUJCRUFnQVNBQ0tBSUVOZ0lFQ3lBQ0tBSUVJZ0VFUUNBQklBSW9BZ0EyQWdBTElBTWdBeWdDQUVFQmNqWUNBQ0FESUFBUU53c2dBd3ZoQ3dJTmZ3VitJd0JCOEFCcklnY2tBQ0FISUFBb0F2RGhBU0lJTmdKY0lBRWdBbW9oRFNBSUlBQW9Bb0RpQVdvaER3SkFBa0FnQlVVRVFDQUJJUVFNQVFzZ0FDZ0N4T0FCSVJBZ0FDZ0N3T0FCSVJFZ0FDZ0N2T0FCSVE0Z0FFRUJOZ0tNNFFGQkFDRUlBMEFnQ0VFRFJ3UkFJQWNnQ0VFQ2RDSUNhaUFBSUFKcVFhelFBV29vQWdBMkFrUWdDRUVCYWlFSURBRUxDMEZzSVF3Z0IwRVlhaUFESUFRUUJoQUREUUVnQjBFc2FpQUhRUmhxSUFBb0FnQVFFeUFIUVRScUlBZEJHR29nQUNnQ0NCQVRJQWRCUEdvZ0IwRVlhaUFBS0FJRUVCTWdEVUZnYWlFU0lBRWhCRUVBSVF3RFFDQUhLQUl3SUFjb0FpeEJBM1JxS1FJQUloUkNFSWluUWY4QmNTRUlJQWNvQWtBZ0J5Z0NQRUVEZEdvcEFnQWlGVUlRaUtkQi93RnhJUXNnQnlnQ09DQUhLQUkwUVFOMGFpa0NBQ0lXUWlDSXB5RUpJQlZDSUlnaEZ5QVVRaUNJcHlFQ0FrQWdGa0lRaUtkQi93RnhJZ05CQWs4RVFBSkFJQVpGSUFOQkdVbHlSUVJBSUFrZ0IwRVlhaUFEUVNBZ0J5Z0NIR3NpQ2lBS0lBTkxHeUlLRUFVZ0F5QUtheUlEZEdvaENTQUhRUmhxRUFRYUlBTkZEUUVnQjBFWWFpQURFQVVnQ1dvaENRd0JDeUFIUVJocUlBTVFCU0FKYWlFSklBZEJHR29RQkJvTElBY3BBa1FoR0NBSElBazJBa1FnQnlBWU53TklEQUVMQWtBZ0EwVUVRQ0FDQkVBZ0J5Z0NSQ0VKREFNTElBY29Ba2doQ1F3QkN3SkFBa0FnQjBFWWFrRUJFQVVnQ1NBQ1JXcHFJZ05CQTBZRVFDQUhLQUpFUVg5cUlnTWdBMFZxSVFrTUFRc2dBMEVDZENBSGFpZ0NSQ0lKSUFsRmFpRUpJQU5CQVVZTkFRc2dCeUFIS0FKSU5nSk1Dd3NnQnlBSEtBSkVOZ0pJSUFjZ0NUWUNSQXNnRjZjaEF5QUxCRUFnQjBFWWFpQUxFQVVnQTJvaEF3c2dDQ0FMYWtFVVR3UkFJQWRCR0dvUUJCb0xJQWdFUUNBSFFSaHFJQWdRQlNBQ2FpRUNDeUFIUVJocUVBUWFJQWNnQjBFWWFpQVVRaGlJcDBIL0FYRVFDQ0FVcDBILy93TnhhallDTENBSElBZEJHR29nRlVJWWlLZEIvd0Z4RUFnZ0ZhZEIvLzhEY1dvMkFqd2dCMEVZYWhBRUdpQUhJQWRCR0dvZ0ZrSVlpS2RCL3dGeEVBZ2dGcWRCLy84RGNXbzJBalFnQnlBQ05nSmdJQWNvQWx3aENpQUhJQWsyQW1nZ0J5QUROZ0prQWtBQ1FBSkFJQVFnQWlBRGFpSUxhaUFTU3cwQUlBSWdDbW9pRXlBUFN3MEFJQTBnQkdzZ0MwRWdhazhOQVFzZ0J5QUhLUU5vTndNUUlBY2dCeWtEWURjRENDQUVJQTBnQjBFSWFpQUhRZHdBYWlBUElBNGdFU0FRRUI0aEN3d0JDeUFDSUFScUlRZ2dCQ0FLRUFjZ0FrRVJUd1JBSUFSQkVHb2hBZ05BSUFJZ0NrRVFhaUlLRUFjZ0FrRVFhaUlDSUFoSkRRQUxDeUFJSUFscklRSWdCeUFUTmdKY0lBa2dDQ0FPYTBzRVFDQUpJQWdnRVd0TEJFQkJiQ0VMREFJTElCQWdBaUFPYXlJQ2FpSUtJQU5xSUJCTkJFQWdDQ0FLSUFNUUR4b01BZ3NnQ0NBS1FRQWdBbXNRRHlFSUlBY2dBaUFEYWlJRE5nSmtJQWdnQW1zaENDQU9JUUlMSUFsQkVFOEVRQ0FESUFocUlRTURRQ0FJSUFJUUJ5QUNRUkJxSVFJZ0NFRVFhaUlJSUFOSkRRQUxEQUVMQWtBZ0NVRUhUUVJBSUFnZ0FpMEFBRG9BQUNBSUlBSXRBQUU2QUFFZ0NDQUNMUUFDT2dBQ0lBZ2dBaTBBQXpvQUF5QUlRUVJxSUFJZ0NVRUNkQ0lEUWNBZWFpZ0NBR29pQWhBWElBSWdBMEhnSG1vb0FnQnJJUUlnQnlnQ1pDRUREQUVMSUFnZ0FoQU1DeUFEUVFsSkRRQWdBeUFJYWlFRElBaEJDR29pQ0NBQ1FRaHFJZ0pyUVE5TUJFQURRQ0FJSUFJUURDQUNRUWhxSVFJZ0NFRUlhaUlJSUFOSkRRQU1BZ0FMQUFzRFFDQUlJQUlRQnlBQ1FSQnFJUUlnQ0VFUWFpSUlJQU5KRFFBTEN5QUhRUmhxRUFRYUlBc2dEQ0FMRUFNaUFoc2hEQ0FFSUFRZ0Myb2dBaHNoQkNBRlFYOXFJZ1VOQUFzZ0RCQUREUUZCYkNFTUlBZEJHR29RQkVFQ1NRMEJRUUFoQ0FOQUlBaEJBMGNFUUNBQUlBaEJBblFpQW1wQnJOQUJhaUFDSUFkcUtBSkVOZ0lBSUFoQkFXb2hDQXdCQ3dzZ0J5Z0NYQ0VJQzBHNmZ5RU1JQThnQ0dzaUFDQU5JQVJyU3cwQUlBUUVmeUFFSUFnZ0FCQUxJQUJxQlVFQUN5QUJheUVNQ3lBSFFmQUFhaVFBSUF3TGtSY0NGbjhGZmlNQVFkQUJheUlISkFBZ0J5QUFLQUx3NFFFaUNEWUN2QUVnQVNBQ2FpRVNJQWdnQUNnQ2dPSUJhaUVUQWtBQ1FDQUZSUVJBSUFFaEF3d0JDeUFBS0FMRTRBRWhFU0FBS0FMQTRBRWhGU0FBS0FLODRBRWhEeUFBUVFFMkFvemhBVUVBSVFnRFFDQUlRUU5IQkVBZ0J5QUlRUUowSWdKcUlBQWdBbXBCck5BQmFpZ0NBRFlDVkNBSVFRRnFJUWdNQVFzTElBY2dFVFlDWkNBSElBODJBbUFnQnlBQklBOXJOZ0pvUVd3aEVDQUhRU2hxSUFNZ0JCQUdFQU1OQVNBRlFRUWdCVUVFU0JzaEZ5QUhRVHhxSUFkQktHb2dBQ2dDQUJBVElBZEJ4QUJxSUFkQktHb2dBQ2dDQ0JBVElBZEJ6QUJxSUFkQktHb2dBQ2dDQkJBVFFRQWhCQ0FIUWVBQWFpRU1JQWRCNUFCcUlRb0RRQ0FIUVNocUVBUkJBa3NnQkNBWFRuSkZCRUFnQnlnQ1FDQUhLQUk4UVFOMGFpa0NBQ0lkUWhDSXAwSC9BWEVoQ3lBSEtBSlFJQWNvQWt4QkEzUnFLUUlBSWg1Q0VJaW5RZjhCY1NFSklBY29Ba2dnQnlnQ1JFRURkR29wQWdBaUgwSWdpS2NoQ0NBZVFpQ0lJU0FnSFVJZ2lLY2hBZ0pBSUI5Q0VJaW5RZjhCY1NJRFFRSlBCRUFDUUNBR1JTQURRUmxKY2tVRVFDQUlJQWRCS0dvZ0EwRWdJQWNvQWl4cklnMGdEU0FEU3hzaURSQUZJQU1nRFdzaUEzUnFJUWdnQjBFb2FoQUVHaUFEUlEwQklBZEJLR29nQXhBRklBaHFJUWdNQVFzZ0IwRW9haUFERUFVZ0NHb2hDQ0FIUVNocUVBUWFDeUFIS1FKVUlTRWdCeUFJTmdKVUlBY2dJVGNEV0F3QkN3SkFJQU5GQkVBZ0FnUkFJQWNvQWxRaENBd0RDeUFIS0FKWUlRZ01BUXNDUUFKQUlBZEJLR3BCQVJBRklBZ2dBa1ZxYWlJRFFRTkdCRUFnQnlnQ1ZFRi9haUlESUFORmFpRUlEQUVMSUFOQkFuUWdCMm9vQWxRaUNDQUlSV29oQ0NBRFFRRkdEUUVMSUFjZ0J5Z0NXRFlDWEFzTElBY2dCeWdDVkRZQ1dDQUhJQWcyQWxRTElDQ25JUU1nQ1FSQUlBZEJLR29nQ1JBRklBTnFJUU1MSUFrZ0MycEJGRThFUUNBSFFTaHFFQVFhQ3lBTEJFQWdCMEVvYWlBTEVBVWdBbW9oQWdzZ0IwRW9haEFFR2lBSElBY29BbWdnQW1vaUNTQURhallDYUNBS0lBd2dDQ0FKU3hzb0FnQWhEU0FISUFkQktHb2dIVUlZaUtkQi93RnhFQWdnSGFkQi8vOERjV28yQWp3Z0J5QUhRU2hxSUI1Q0dJaW5RZjhCY1JBSUlCNm5RZi8vQTNGcU5nSk1JQWRCS0dvUUJCb2dCMEVvYWlBZlFoaUlwMEgvQVhFUUNDRU9JQWRCOEFCcUlBUkJCSFJxSWdzZ0NTQU5haUFJYXpZQ0RDQUxJQWcyQWdnZ0N5QUROZ0lFSUFzZ0FqWUNBQ0FISUE0Z0g2ZEIvLzhEY1dvMkFrUWdCRUVCYWlFRURBRUxDeUFFSUJkSURRRWdFa0ZnYWlFWUlBZEI0QUJxSVJvZ0IwSGtBR29oR3lBQklRTURRQ0FIUVNocUVBUkJBa3NnQkNBRlRuSkZCRUFnQnlnQ1FDQUhLQUk4UVFOMGFpa0NBQ0lkUWhDSXAwSC9BWEVoQ3lBSEtBSlFJQWNvQWt4QkEzUnFLUUlBSWg1Q0VJaW5RZjhCY1NFSUlBY29Ba2dnQnlnQ1JFRURkR29wQWdBaUgwSWdpS2NoQ1NBZVFpQ0lJU0FnSFVJZ2lLY2hEQUpBSUI5Q0VJaW5RZjhCY1NJQ1FRSlBCRUFDUUNBR1JTQUNRUmxKY2tVRVFDQUpJQWRCS0dvZ0FrRWdJQWNvQWl4cklnb2dDaUFDU3hzaUNoQUZJQUlnQ21zaUFuUnFJUWtnQjBFb2FoQUVHaUFDUlEwQklBZEJLR29nQWhBRklBbHFJUWtNQVFzZ0IwRW9haUFDRUFVZ0NXb2hDU0FIUVNocUVBUWFDeUFIS1FKVUlTRWdCeUFKTmdKVUlBY2dJVGNEV0F3QkN3SkFJQUpGQkVBZ0RBUkFJQWNvQWxRaENRd0RDeUFIS0FKWUlRa01BUXNDUUFKQUlBZEJLR3BCQVJBRklBa2dERVZxYWlJQ1FRTkdCRUFnQnlnQ1ZFRi9haUlDSUFKRmFpRUpEQUVMSUFKQkFuUWdCMm9vQWxRaUNTQUpSV29oQ1NBQ1FRRkdEUUVMSUFjZ0J5Z0NXRFlDWEFzTElBY2dCeWdDVkRZQ1dDQUhJQWsyQWxRTElDQ25JUlFnQ0FSQUlBZEJLR29nQ0JBRklCUnFJUlFMSUFnZ0MycEJGRThFUUNBSFFTaHFFQVFhQ3lBTEJFQWdCMEVvYWlBTEVBVWdER29oREFzZ0IwRW9haEFFR2lBSElBY29BbWdnREdvaUdTQVVhallDYUNBYklCb2dDU0FaU3hzb0FnQWhIQ0FISUFkQktHb2dIVUlZaUtkQi93RnhFQWdnSGFkQi8vOERjV28yQWp3Z0J5QUhRU2hxSUI1Q0dJaW5RZjhCY1JBSUlCNm5RZi8vQTNGcU5nSk1JQWRCS0dvUUJCb2dCeUFIUVNocUlCOUNHSWluUWY4QmNSQUlJQituUWYvL0EzRnFOZ0pFSUFjZ0IwSHdBR29nQkVFRGNVRUVkR29pRFNrRENDSWROd1BJQVNBSElBMHBBd0FpSGpjRHdBRUNRQUpBQWtBZ0J5Z0N2QUVpRGlBZXB5SUNhaUlXSUJOTERRQWdBeUFIS0FMRUFTSUtJQUpxSWd0cUlCaExEUUFnRWlBRGF5QUxRU0JxVHcwQkN5QUhJQWNwQThnQk53TVFJQWNnQnlrRHdBRTNBd2dnQXlBU0lBZEJDR29nQjBHOEFXb2dFeUFQSUJVZ0VSQWVJUXNNQVFzZ0FpQURhaUVJSUFNZ0RoQUhJQUpCRVU4RVFDQURRUkJxSVFJRFFDQUNJQTVCRUdvaURoQUhJQUpCRUdvaUFpQUlTUTBBQ3dzZ0NDQWRweUlPYXlFQ0lBY2dGallDdkFFZ0RpQUlJQTlyU3dSQUlBNGdDQ0FWYTBzRVFFRnNJUXNNQWdzZ0VTQUNJQTlySWdKcUloWWdDbW9nRVUwRVFDQUlJQllnQ2hBUEdnd0NDeUFJSUJaQkFDQUNheEFQSVFnZ0J5QUNJQXBxSWdvMkFzUUJJQWdnQW1zaENDQVBJUUlMSUE1QkVFOEVRQ0FJSUFwcUlRb0RRQ0FJSUFJUUJ5QUNRUkJxSVFJZ0NFRVFhaUlJSUFwSkRRQUxEQUVMQWtBZ0RrRUhUUVJBSUFnZ0FpMEFBRG9BQUNBSUlBSXRBQUU2QUFFZ0NDQUNMUUFDT2dBQ0lBZ2dBaTBBQXpvQUF5QUlRUVJxSUFJZ0RrRUNkQ0lLUWNBZWFpZ0NBR29pQWhBWElBSWdDa0hnSG1vb0FnQnJJUUlnQnlnQ3hBRWhDZ3dCQ3lBSUlBSVFEQXNnQ2tFSlNRMEFJQWdnQ21vaENpQUlRUWhxSWdnZ0FrRUlhaUlDYTBFUFRBUkFBMEFnQ0NBQ0VBd2dBa0VJYWlFQ0lBaEJDR29pQ0NBS1NRMEFEQUlBQ3dBTEEwQWdDQ0FDRUFjZ0FrRVFhaUVDSUFoQkVHb2lDQ0FLU1EwQUN3c2dDeEFEQkVBZ0N5RVFEQVFGSUEwZ0REWUNBQ0FOSUJrZ0hHb2dDV3MyQWd3Z0RTQUpOZ0lJSUEwZ0ZEWUNCQ0FFUVFGcUlRUWdBeUFMYWlFRERBSUxBQXNMSUFRZ0JVZ05BU0FFSUJkcklRdEJBQ0VFQTBBZ0N5QUZTQVJBSUFjZ0IwSHdBR29nQzBFRGNVRUVkR29pQWlrRENDSWROd1BJQVNBSElBSXBBd0FpSGpjRHdBRUNRQUpBQWtBZ0J5Z0N2QUVpRENBZXB5SUNhaUlLSUJOTERRQWdBeUFIS0FMRUFTSUpJQUpxSWhCcUlCaExEUUFnRWlBRGF5QVFRU0JxVHcwQkN5QUhJQWNwQThnQk53TWdJQWNnQnlrRHdBRTNBeGdnQXlBU0lBZEJHR29nQjBHOEFXb2dFeUFQSUJVZ0VSQWVJUkFNQVFzZ0FpQURhaUVJSUFNZ0RCQUhJQUpCRVU4RVFDQURRUkJxSVFJRFFDQUNJQXhCRUdvaURCQUhJQUpCRUdvaUFpQUlTUTBBQ3dzZ0NDQWRweUlHYXlFQ0lBY2dDallDdkFFZ0JpQUlJQTlyU3dSQUlBWWdDQ0FWYTBzRVFFRnNJUkFNQWdzZ0VTQUNJQTlySWdKcUlnd2dDV29nRVUwRVFDQUlJQXdnQ1JBUEdnd0NDeUFJSUF4QkFDQUNheEFQSVFnZ0J5QUNJQWxxSWdrMkFzUUJJQWdnQW1zaENDQVBJUUlMSUFaQkVFOEVRQ0FJSUFscUlRWURRQ0FJSUFJUUJ5QUNRUkJxSVFJZ0NFRVFhaUlJSUFaSkRRQUxEQUVMQWtBZ0JrRUhUUVJBSUFnZ0FpMEFBRG9BQUNBSUlBSXRBQUU2QUFFZ0NDQUNMUUFDT2dBQ0lBZ2dBaTBBQXpvQUF5QUlRUVJxSUFJZ0JrRUNkQ0lHUWNBZWFpZ0NBR29pQWhBWElBSWdCa0hnSG1vb0FnQnJJUUlnQnlnQ3hBRWhDUXdCQ3lBSUlBSVFEQXNnQ1VFSlNRMEFJQWdnQ1dvaEJpQUlRUWhxSWdnZ0FrRUlhaUlDYTBFUFRBUkFBMEFnQ0NBQ0VBd2dBa0VJYWlFQ0lBaEJDR29pQ0NBR1NRMEFEQUlBQ3dBTEEwQWdDQ0FDRUFjZ0FrRVFhaUVDSUFoQkVHb2lDQ0FHU1EwQUN3c2dFQkFERFFNZ0MwRUJhaUVMSUFNZ0VHb2hBd3dCQ3dzRFFDQUVRUU5IQkVBZ0FDQUVRUUowSWdKcVFhelFBV29nQWlBSGFpZ0NWRFlDQUNBRVFRRnFJUVFNQVFzTElBY29BcndCSVFnTFFicC9JUkFnRXlBSWF5SUFJQklnQTJ0TERRQWdBd1IvSUFNZ0NDQUFFQXNnQUdvRlFRQUxJQUZySVJBTElBZEIwQUZxSkFBZ0VBc2xBQ0FBUWdBM0FnQWdBRUVBT3dFSUlBQkJBRG9BQ3lBQUlBRTJBZ3dnQUNBQ09nQUtDN1FGQVFOL0l3QkJNR3NpQkNRQUlBQkIvd0ZxSWdWQmZXb2hCZ0pBSUFNdkFRSUVRQ0FFUVJocUlBRWdBaEFHSWdJUUF3MEJJQVJCRUdvZ0JFRVlhaUFERUJ3Z0JFRUlhaUFFUVJocUlBTVFIQ0FBSVFNRFFBSkFJQVJCR0dvUUJDQURJQVpQY2tVRVFDQURJQVJCRUdvZ0JFRVlhaEFTT2dBQUlBTWdCRUVJYWlBRVFSaHFFQkk2QUFFZ0JFRVlhaEFFUlEwQklBTkJBbW9oQXdzZ0JVRithaUVGQW44RFFFRzZmeUVDSUFNaUFTQUZTdzBGSUFFZ0JFRVFhaUFFUVJocUVCSTZBQUFnQVVFQmFpRURJQVJCR0dvUUJFRURSZ1JBUVFJaEFpQUVRUWhxREFJTElBTWdCVXNOQlNBQklBUkJDR29nQkVFWWFoQVNPZ0FCSUFGQkFtb2hBMEVESVFJZ0JFRVlhaEFFUVFOSERRQUxJQVJCRUdvTElRVWdBeUFGSUFSQkdHb1FFam9BQUNBQklBSnFJQUJySVFJTUF3c2dBeUFFUVJCcUlBUkJHR29RRWpvQUFpQURJQVJCQ0dvZ0JFRVlhaEFTT2dBRElBTkJCR29oQXd3QUFBc0FDeUFFUVJocUlBRWdBaEFHSWdJUUF3MEFJQVJCRUdvZ0JFRVlhaUFERUJ3Z0JFRUlhaUFFUVJocUlBTVFIQ0FBSVFNRFFBSkFJQVJCR0dvUUJDQURJQVpQY2tVRVFDQURJQVJCRUdvZ0JFRVlhaEFST2dBQUlBTWdCRUVJYWlBRVFSaHFFQkU2QUFFZ0JFRVlhaEFFUlEwQklBTkJBbW9oQXdzZ0JVRithaUVGQW44RFFFRzZmeUVDSUFNaUFTQUZTdzBFSUFFZ0JFRVFhaUFFUVJocUVCRTZBQUFnQVVFQmFpRURJQVJCR0dvUUJFRURSZ1JBUVFJaEFpQUVRUWhxREFJTElBTWdCVXNOQkNBQklBUkJDR29nQkVFWWFoQVJPZ0FCSUFGQkFtb2hBMEVESVFJZ0JFRVlhaEFFUVFOSERRQUxJQVJCRUdvTElRVWdBeUFGSUFSQkdHb1FFVG9BQUNBQklBSnFJQUJySVFJTUFnc2dBeUFFUVJCcUlBUkJHR29RRVRvQUFpQURJQVJCQ0dvZ0JFRVlhaEFST2dBRElBTkJCR29oQXd3QUFBc0FDeUFFUVRCcUpBQWdBZ3RwQVFGL0FuOENRQUpBSUFKQkIwME5BQ0FCS0FBQVFiZkl3dUYrUncwQUlBQWdBU2dBQkRZQ21PSUJRV0lnQUVFUWFpQUJJQUlRUGlJREVBTU5BaG9nQUVLQmdJQ0FFRGNEaU9FQklBQWdBU0FEYWlBQ0lBTnJFQ29NQVFzZ0FDQUJJQUlRS2d0QkFBc0xyUU1CQm44akFFR0FBV3NpQXlRQVFXSWhDQUpBSUFKQkNVa05BQ0FBUVpqUUFHb2dBVUVJYWlJRUlBSkJlR29nQUVHWTBBQVFNeUlGRUFNaUJnMEFJQU5CSHpZQ2ZDQURJQU5CL0FCcUlBTkIrQUJxSUFRZ0JDQUZhaUFHR3lJRUlBRWdBbW9pQWlBRWF4QVZJZ1VRQXcwQUlBTW9BbndpQmtFZlN3MEFJQU1vQW5naUIwRUpUdzBBSUFCQmlDQnFJQU1nQmtHQUMwR0FEQ0FIRUJnZ0EwRTBOZ0o4SUFNZ0EwSDhBR29nQTBINEFHb2dCQ0FGYWlJRUlBSWdCR3NRRlNJRkVBTU5BQ0FES0FKOElnWkJORXNOQUNBREtBSjRJZ2RCQ2s4TkFDQUFRWkF3YWlBRElBWkJnQTFCNEE0Z0J4QVlJQU5CSXpZQ2ZDQURJQU5CL0FCcUlBTkIrQUJxSUFRZ0JXb2lCQ0FDSUFSckVCVWlCUkFERFFBZ0F5Z0NmQ0lHUVNOTERRQWdBeWdDZUNJSFFRcFBEUUFnQUNBRElBWkJ3QkJCMEJFZ0J4QVlJQVFnQldvaUJFRU1haUlGSUFKTERRQWdBaUFGYXlFRlFRQWhBZ05BSUFKQkEwY0VRQ0FFS0FBQUlnWkJmMm9nQlU4TkFpQUFJQUpCQW5ScVFaelFBV29nQmpZQ0FDQUNRUUZxSVFJZ0JFRUVhaUVFREFFTEN5QUVJQUZySVFnTElBTkJnQUZxSkFBZ0NBdEdBUU4vSUFCQkNHb2hBeUFBS0FJRUlRSkJBQ0VBQTBBZ0FDQUNka1VFUUNBQklBTWdBRUVEZEdvdEFBSkJGa3RxSVFFZ0FFRUJhaUVBREFFTEN5QUJRUWdnQW10MEM0WURBUVYvUWJoL0lRY0NRQ0FEUlEwQUlBSXRBQUFpQkVVRVFDQUJRUUEyQWdCQkFVRzRmeUFEUVFGR0d3OExBbjhnQWtFQmFpSUZJQVJCR0hSQkdIVWlCa0YvU2cwQUdpQUdRWDlHQkVBZ0EwRURTQTBDSUFVdkFBQkJnUDRCYWlFRUlBSkJBMm9NQVFzZ0EwRUNTQTBCSUFJdEFBRWdCRUVJZEhKQmdJQithaUVFSUFKQkFtb0xJUVVnQVNBRU5nSUFJQVZCQVdvaUFTQUNJQU5xSWdOTERRQkJiQ0VISUFCQkVHb2dBQ0FGTFFBQUlnVkJCblpCSTBFSklBRWdBeUFCYTBIQUVFSFFFVUh3RWlBQUtBS000UUVnQUNnQ25PSUJJQVFRSHlJR0VBTWlDQTBBSUFCQm1DQnFJQUJCQ0dvZ0JVRUVka0VEY1VFZlFRZ2dBU0FCSUFacUlBZ2JJZ0VnQXlBQmEwR0FDMEdBREVHQUZ5QUFLQUtNNFFFZ0FDZ0NuT0lCSUFRUUh5SUdFQU1pQ0EwQUlBQkJvREJxSUFCQkJHb2dCVUVDZGtFRGNVRTBRUWtnQVNBQklBWnFJQWdiSWdFZ0F5QUJhMEdBRFVIZ0RrR1FHU0FBS0FLTTRRRWdBQ2dDbk9JQklBUVFIeUlBRUFNTkFDQUFJQUZxSUFKcklRY0xJQWNMclFNQkNuOGpBRUdBQkdzaUNDUUFBbjlCVWlBQ1FmOEJTdzBBR2tGVUlBTkJERXNOQUJvZ0FrRUJhaUVMSUFCQkJHb2hDVUdBZ0FRZ0EwRi9hblJCRUhVaENrRUFJUUpCQVNFRVFRRWdBM1FpQjBGL2FpSU1JUVVEUUNBQ0lBdEdSUVJBQWtBZ0FTQUNRUUYwSWcxcUx3RUFJZ1pCLy84RFJnUkFJQWtnQlVFQ2RHb2dBam9BQWlBRlFYOXFJUVZCQVNFR0RBRUxJQVJCQUNBS0lBWkJFSFJCRUhWS0d5RUVDeUFJSUExcUlBWTdBUUFnQWtFQmFpRUNEQUVMQ3lBQUlBUTdBUUlnQUNBRE93RUFJQWRCQTNZZ0IwRUJkbXBCQTJvaEJrRUFJUVJCQUNFQ0EwQWdCQ0FMUmtVRVFDQUJJQVJCQVhScUxnRUFJUXBCQUNFQUEwQWdBQ0FLVGtVRVFDQUpJQUpCQW5ScUlBUTZBQUlEUUNBQ0lBWnFJQXh4SWdJZ0JVc05BQXNnQUVFQmFpRUFEQUVMQ3lBRVFRRnFJUVFNQVFzTFFYOGdBZzBBR2tFQUlRSURmeUFDSUFkR0JIOUJBQVVnQ0NBSklBSkJBblJxSWdBdEFBSkJBWFJxSWdFZ0FTOEJBQ0lCUVFGcU93RUFJQUFnQXlBQkVCUnJJZ1U2QUFNZ0FDQUJJQVZCL3dGeGRDQUhhenNCQUNBQ1FRRnFJUUlNQVFzTEN5RUZJQWhCZ0FScUpBQWdCUXZqQmdFSWYwRnNJUWNDUUNBQ1FRTkpEUUFDUUFKQUFrQUNRQ0FCTFFBQUlnTkJBM0VpQ1VFQmF3NERBd0VBQWdzZ0FDZ0NpT0VCRFFCQllnOExJQUpCQlVrTkFrRURJUVlnQVNnQUFDRUZBbjhDUUFKQUlBTkJBblpCQTNFaUNFRithaUlFUVFGTkJFQWdCRUVCYXcwQkRBSUxJQVZCRG5aQi93ZHhJUVFnQlVFRWRrSC9CM0VoQXlBSVJRd0NDeUFGUVJKMklRUkJCQ0VHSUFWQkJIWkIvLzhBY1NFRFFRQU1BUXNnQlVFRWRrSC8vdzl4SWdOQmdJQUlTdzBESUFFdEFBUkJDblFnQlVFV2RuSWhCRUVGSVFaQkFBc2hCU0FFSUFacUlnb2dBa3NOQWdKQUlBTkJnUVpKRFFBZ0FDZ0NuT0lCUlEwQVFRQWhBZ05BSUFKQmc0QUJTdzBCSUFKQlFHc2hBZ3dBQUFzQUN3Si9JQWxCQTBZRVFDQUJJQVpxSVFFZ0FFSHc0Z0ZxSVFJZ0FDZ0NEQ0VHSUFVRVFDQUNJQU1nQVNBRUlBWVFYd3dDQ3lBQ0lBTWdBU0FFSUFZUVhRd0JDeUFBUWJqUUFXb2hBaUFCSUFacUlRRWdBRUh3NGdGcUlRWWdBRUdvMEFCcUlRZ2dCUVJBSUFnZ0JpQURJQUVnQkNBQ0VGNE1BUXNnQ0NBR0lBTWdBU0FFSUFJUVhBc1FBdzBDSUFBZ0F6WUNnT0lCSUFCQkFUWUNpT0VCSUFBZ0FFSHc0Z0ZxTmdMdzRRRWdDVUVDUmdSQUlBQWdBRUdvMEFCcU5nSU1DeUFBSUFOcUlnQkJpT01CYWtJQU53QUFJQUJCZ09NQmFrSUFOd0FBSUFCQitPSUJha0lBTndBQUlBQkI4T0lCYWtJQU53QUFJQW9QQ3dKL0FrQUNRQUpBSUFOQkFuWkJBM0ZCZjJvaUJFRUNTdzBBSUFSQkFXc09BZ0FDQVF0QkFTRUVJQU5CQTNZTUFndEJBaUVFSUFFdkFBQkJCSFlNQVF0QkF5RUVJQUVRSVVFRWRnc2lBeUFFYWlJRlFTQnFJQUpMQkVBZ0JTQUNTdzBDSUFCQjhPSUJhaUFCSUFScUlBTVFDeUVCSUFBZ0F6WUNnT0lCSUFBZ0FUWUM4T0VCSUFFZ0Eyb2lBRUlBTndBWUlBQkNBRGNBRUNBQVFnQTNBQWdnQUVJQU53QUFJQVVQQ3lBQUlBTTJBb0RpQVNBQUlBRWdCR28yQXZEaEFTQUZEd3NDZndKQUFrQUNRQ0FEUVFKMlFRTnhRWDlxSWdSQkFrc05BQ0FFUVFGckRnSUFBZ0VMUVFFaEJ5QURRUU4yREFJTFFRSWhCeUFCTHdBQVFRUjJEQUVMSUFKQkJFa2dBUkFoSWdKQmo0Q0FBVXR5RFFGQkF5RUhJQUpCQkhZTElRSWdBRUh3NGdGcUlBRWdCMm90QUFBZ0FrRWdhaEFRSVFFZ0FDQUNOZ0tBNGdFZ0FDQUJOZ0x3NFFFZ0IwRUJhaUVIQ3lBSEMwc0FJQUJDK2VyUTBPZkpvZVRoQURjRElDQUFRZ0EzQXhnZ0FFTFAxdE8rMHNlcjJVSTNBeEFnQUVMVzY0THU2djJKOWVBQU53TUlJQUJDQURjREFDQUFRU2hxUVFCQktCQVFHZ3ZpQWdJQ2Z3VitJQUJCS0dvaUFTQUFLQUpJYWlFQ0FuNGdBQ2tEQUNJRFFpQmFCRUFnQUNrREVDSUVRZ2VKSUFBcEF3Z2lCVUlCaVh3Z0FDa0RHQ0lHUWd5SmZDQUFLUU1nSWdkQ0VvbDhJQVVRR1NBRUVCa2dCaEFaSUFjUUdRd0JDeUFBS1FNWVFzWFAyYkx4NWJycUozd0xJQU44SVFNRFFDQUJRUWhxSWdBZ0FrMEVRRUlBSUFFcEFBQVFDU0FEaFVJYmlVS0hsYSt2bUxiZW01NS9ma0xqM01xVi9NN3k5WVYvZkNFRElBQWhBUXdCQ3dzQ1FDQUJRUVJxSWdBZ0Frc0VRQ0FCSVFBTUFRc2dBU2dBQUsxQ2g1V3ZyNWkyM3B1ZWYzNGdBNFZDRjRsQ3o5YlR2dExIcTlsQ2ZrTDU4OTN4bWZhWnF4WjhJUU1MQTBBZ0FDQUNTUVJBSUFBeEFBQkN4Yy9ac3ZIbHV1b25maUFEaFVJTGlVS0hsYSt2bUxiZW01NS9maUVESUFCQkFXb2hBQXdCQ3dzZ0EwSWhpQ0FEaFVMUDF0Tyswc2VyMlVKK0lnTkNIWWdnQTRWQytmUGQ4Wm4ybWFzV2ZpSURRaUNJSUFPRkMrOENBZ0ovQkg0Z0FDQUFLUU1BSUFLdGZEY0RBQUpBQWtBZ0FDZ0NTQ0lESUFKcUlnUkJIMDBFUUNBQlJRMEJJQUFnQTJwQktHb2dBU0FDRUNBZ0FDZ0NTQ0FDYWlFRURBRUxJQUVnQW1vaEFnSi9JQU1FUUNBQVFTaHFJZ1FnQTJvZ0FVRWdJQU5yRUNBZ0FDQUFLUU1JSUFRcEFBQVFDVGNEQ0NBQUlBQXBBeEFnQUNrQU1CQUpOd01RSUFBZ0FDa0RHQ0FBS1FBNEVBazNBeGdnQUNBQUtRTWdJQUJCUUdzcEFBQVFDVGNESUNBQUtBSklJUU1nQUVFQU5nSklJQUVnQTJ0QklHb2hBUXNnQVVFZ2FpQUNUUXNFUUNBQ1FXQnFJUU1nQUNrRElDRUZJQUFwQXhnaEJpQUFLUU1RSVFjZ0FDa0RDQ0VJQTBBZ0NDQUJLUUFBRUFraENDQUhJQUVwQUFnUUNTRUhJQVlnQVNrQUVCQUpJUVlnQlNBQktRQVlFQWtoQlNBQlFTQnFJZ0VnQTAwTkFBc2dBQ0FGTndNZ0lBQWdCamNER0NBQUlBYzNBeEFnQUNBSU53TUlDeUFCSUFKUERRRWdBRUVvYWlBQklBSWdBV3NpQkJBZ0N5QUFJQVEyQWtnTEN5OEJBWDhnQUVVRVFFRzJmMEVBSUFNYkR3dEJ1bjhoQkNBRElBRk5CSDhnQUNBQ0lBTVFFQm9nQXdWQnVuOExDeThCQVg4Z0FFVUVRRUcyZjBFQUlBTWJEd3RCdW44aEJDQURJQUZOQkg4Z0FDQUNJQU1RQ3hvZ0F3VkJ1bjhMQzZnQ0FRWi9Jd0JCRUdzaUJ5UUFJQUJCMk9BQmFpa0RBRUtBZ0lBUVZpRUlRYmgvSVFVQ1FDQUVRZi8vQjBzTkFDQUFJQU1nQkJCQ0lnVVFBeUlHRFFBZ0FDZ0NuT0lCSVFrZ0FDQUhRUXhxSUFNZ0F5QUZhaUFHR3lJS0lBUkJBQ0FGSUFZYmF5SUdFRUFpQXhBREJFQWdBeUVGREFFTElBY29BZ3doQkNBQlJRUkFRYnAvSVFVZ0JFRUFTZzBCQ3lBR0lBTnJJUVVnQXlBS2FpRURBa0FnQ1FSQUlBQkJBRFlDbk9JQkRBRUxBa0FDUUFKQUlBUkJCVWdOQUNBQVFkamdBV29wQXdCQ2dJQ0FDRmdOQUF3QkN5QUFRUUEyQXB6aUFRd0JDeUFBS0FJSUVEOGhCaUFBUVFBMkFwemlBU0FHUVJSUERRRUxJQUFnQVNBQ0lBTWdCU0FFSUFnUU9TRUZEQUVMSUFBZ0FTQUNJQU1nQlNBRUlBZ1FPaUVGQ3lBSFFSQnFKQUFnQlF0bkFDQUFRZERnQVdvZ0FTQUNJQUFvQXV6aEFSQXVJZ0VRQXdSQUlBRVBDMEc0ZnlFQ0FrQWdBUTBBSUFCQjdPQUJhaWdDQUNJQkJFQkJZQ0VDSUFBb0FwamlBU0FCUncwQkMwRUFJUUlnQUVIdzRBRnFLQUlBUlEwQUlBQkJrT0VCYWhCREN5QUNDeWNCQVg4UVZ5SUVSUVJBUVVBUEN5QUVJQUFnQVNBQ0lBTWdCQkJMRUU4aEFDQUVFRllnQUFzL0FRRi9Ba0FDUUFKQUlBQW9BcURpQVVFQmFpSUJRUUpMRFFBZ0FVRUJhdzRDQUFFQ0N5QUFFREJCQUE4TElBQkJBRFlDb09JQkN5QUFLQUtVNGdFTHZBTUNCMzhCZmlNQVFSQnJJZ2trQUVHNGZ5RUdBa0FnQkNnQ0FDSUlRUVZCQ1NBQUtBTHM0UUVpQlJ0SkRRQWdBeWdDQUNJSFFRRkJCU0FGR3lBRkVDOGlCUkFEQkVBZ0JTRUdEQUVMSUFnZ0JVRURha2tOQUNBQUlBY2dCUkJKSWdZUUF3MEFJQUVnQW1vaENpQUFRWkRoQVdvaEN5QUlJQVZySVFJZ0JTQUhhaUVISUFFaEJRTkFJQWNnQWlBSkVDd2lCaEFERFFFZ0FrRjlhaUlDSUFaSkJFQkJ1SDhoQmd3Q0N5QUpLQUlBSWdoQkFrc0VRRUZzSVFZTUFnc2dCMEVEYWlFSEFuOENRQUpBQWtBZ0NFRUJhdzRDQWdBQkN5QUFJQVVnQ2lBRmF5QUhJQVlRU0F3Q0N5QUZJQW9nQldzZ0J5QUdFRWNNQVFzZ0JTQUtJQVZySUFjdEFBQWdDU2dDQ0JCR0N5SUlFQU1FUUNBSUlRWU1BZ3NnQUNnQzhPQUJCRUFnQ3lBRklBZ1FSUXNnQWlBR2F5RUNJQVlnQjJvaEJ5QUZJQWhxSVFVZ0NTZ0NCRVVOQUFzZ0FDa0QwT0FCSWd4Q2YxSUVRRUZzSVFZZ0RDQUZJQUZyckZJTkFRc2dBQ2dDOE9BQkJFQkJhaUVHSUFKQkJFa05BU0FMRUVRaERDQUhLQUFBSUF5blJ3MEJJQWRCQkdvaEJ5QUNRWHhxSVFJTElBTWdCellDQUNBRUlBSTJBZ0FnQlNBQmF5RUdDeUFKUVJCcUpBQWdCZ3N1QUNBQUVDc0NmMEVBUVFBUUF3MEFHaUFCUlNBQ1JYSkZCRUJCWWlBQUlBRWdBaEE5RUFNTkFSb0xRUUFMQ3pjQUlBRUVRQ0FBSUFBb0FzVGdBU0FCS0FJRUlBRW9BZ2hxUnpZQ25PSUJDeUFBRUN0QkFCQURJQUZGY2tVRVFDQUFJQUVRV3dzTDBRSUJCMzhqQUVFUWF5SUdKQUFnQmlBRU5nSUlJQVlnQXpZQ0RDQUZCRUFnQlNnQ0JDRUtJQVVvQWdnaENRc2dBU0VJQWtBQ1FBTkFJQUFvQXV6aEFSQVdJUXNDUUFOQUlBUWdDMGtOQVNBREtBQUFRWEJ4UWREVXRNSUJSZ1JBSUFNZ0JCQWlJZ2NRQXcwRUlBUWdCMnNoQkNBRElBZHFJUU1NQVFzTElBWWdBellDRENBR0lBUTJBZ2dDUUNBRkJFQWdBQ0FGRUU1QkFDRUhRUUFRQTBVTkFRd0ZDeUFBSUFvZ0NSQk5JZ2NRQXcwRUN5QUFJQWdRVUNBTVFRRkhRUUFnQUNBSUlBSWdCa0VNYWlBR1FRaHFFRXdpQnlJRGEwRUFJQU1RQXh0QkNrZHlSUVJBUWJoL0lRY01CQXNnQnhBRERRTWdBaUFIYXlFQ0lBY2dDR29oQ0VFQklRd2dCaWdDRENFRElBWW9BZ2doQkF3QkN3c2dCaUFETmdJTUlBWWdCRFlDQ0VHNGZ5RUhJQVFOQVNBSUlBRnJJUWNNQVFzZ0JpQUROZ0lNSUFZZ0JEWUNDQXNnQmtFUWFpUUFJQWNMUmdFQ2Z5QUJJQUFvQXJqZ0FTSUNSd1JBSUFBZ0FqWUN4T0FCSUFBZ0FUWUN1T0FCSUFBb0FyemdBU0VESUFBZ0FUWUN2T0FCSUFBZ0FTQURJQUpyYWpZQ3dPQUJDd3V0QWdJRWZ3RitJd0JCUUdvaUJDUUFBa0FDUUNBQ1FRaEpEUUFnQVNnQUFFRndjVUhRMUxUQ0FVY05BQ0FCSUFJUUlpRUJJQUJDQURjRENDQUFRUUEyQWdRZ0FDQUJOZ0lBREFFTElBUkJHR29nQVNBQ0VDMGlBeEFEQkVBZ0FDQURFQm9NQVFzZ0F3UkFJQUJCdUg4UUdnd0JDeUFDSUFRb0FqQWlBMnNoQWlBQklBTnFJUU1EUUFKQUlBQWdBeUFDSUFSQkNHb1FMQ0lGRUFNRWZ5QUZCU0FDSUFWQkEyb2lCVThOQVVHNGZ3c1FHZ3dDQ3lBR1FRRnFJUVlnQWlBRmF5RUNJQU1nQldvaEF5QUVLQUlNUlEwQUN5QUVLQUk0QkVBZ0FrRURUUVJBSUFCQnVIOFFHZ3dDQ3lBRFFRUnFJUU1MSUFRb0FpZ2hBaUFFS1FNWUlRY2dBRUVBTmdJRUlBQWdBeUFCYXpZQ0FDQUFJQUlnQm15dElBY2dCMEovVVJzM0F3Z0xJQVJCUUdza0FBc2xBUUYvSXdCQkVHc2lBaVFBSUFJZ0FDQUJFRkVnQWlnQ0FDRUFJQUpCRUdva0FDQUFDMzBCQkg4akFFR1FCR3NpQkNRQUlBUkIvd0UyQWdnQ1FDQUVRUkJxSUFSQkNHb2dCRUVNYWlBQklBSVFGU0lHRUFNRVFDQUdJUVVNQVF0QlZDRUZJQVFvQWd3aUIwRUdTdzBBSUFNZ0JFRVFhaUFFS0FJSUlBY1FRU0lGRUFNTkFDQUFJQUVnQm1vZ0FpQUdheUFERUR3aEJRc2dCRUdRQkdva0FDQUZDNGNCQWdKL0FuNUJBQkFXSVFNQ1FBTkFJQUVnQTA4RVFBSkFJQUFvQUFCQmNIRkIwTlMwd2dGR0JFQWdBQ0FCRUNJaUFoQURSUTBCUW40UEN5QUFJQUVRVlNJRVFuMVdEUU1nQkNBRmZDSUZJQVJVSVFKQ2ZpRUVJQUlOQXlBQUlBRVFVaUlDRUFNTkF3c2dBU0FDYXlFQklBQWdBbW9oQUF3QkN3dENmaUFGSUFFYklRUUxJQVFMUHdJQmZ3RitJd0JCTUdzaUFpUUFBbjVDZmlBQ1FRaHFJQUFnQVJBdERRQWFRZ0FnQWlnQ0hFRUJSZzBBR2lBQ0tRTUlDeUVESUFKQk1Hb2tBQ0FEQzQwQkFRSi9Jd0JCTUdzaUFTUUFBa0FnQUVVTkFDQUFLQUtJNGdFTkFDQUJJQUJCL09FQmFpZ0NBRFlDS0NBQklBQXBBdlRoQVRjRElDQUFFREFnQUNnQ3FPSUJJUUlnQVNBQktBSW9OZ0lZSUFFZ0FTa0RJRGNERUNBQ0lBRkJFR29RR3lBQVFRQTJBcWppQVNBQklBRW9BaWcyQWdnZ0FTQUJLUU1nTndNQUlBQWdBUkFiQ3lBQlFUQnFKQUFMS2dFQ2Z5TUFRUkJySWdBa0FDQUFRUUEyQWdnZ0FFSUFOd01BSUFBUVdDRUJJQUJCRUdva0FDQUJDNGNCQVFOL0l3QkJFR3NpQWlRQUFrQWdBQ2dDQUVVZ0FDZ0NCRVZ6RFFBZ0FpQUFLQUlJTmdJSUlBSWdBQ2tDQURjREFBSi9JQUlvQWdBaUFRUkFJQUlvQWdoQnFPTUpJQUVSQlFBTUFRdEJxT01KRUNnTElnRkZEUUFnQVNBQUtRSUFOd0wwNFFFZ0FVSDg0UUZxSUFBb0FnZzJBZ0FnQVJCWklBRWhBd3NnQWtFUWFpUUFJQU1MeXdFQkFuOGpBRUVnYXlJQkpBQWdBRUdCZ0lEQUFEWUN0T0lCSUFCQkFEWUNpT0lCSUFCQkFEWUM3T0VCSUFCQ0FEY0RrT0lCSUFCQkFEWUNwT01KSUFCQkFEWUMzT0lCSUFCQ0FEY0N6T0lCSUFCQkFEWUN2T0lCSUFCQkFEWUN4T0FCSUFCQ0FEY0NuT0lCSUFCQnBPSUJha0lBTndJQUlBQkJyT0lCYWtFQU5nSUFJQUZDQURjQ0VDQUJRZ0EzQWhnZ0FTQUJLUU1ZTndNSUlBRWdBU2tERURjREFDQUJLQUlJUVFoMlFRRnhJUUlnQUVFQU5nTGc0Z0VnQUNBQ05nS000Z0VnQVVFZ2FpUUFDM1lCQTM4akFFRXdheUlCSkFBZ0FBUkFJQUVnQUVIRTBBRnFJZ0lvQWdBMkFpZ2dBU0FBS1FLODBBRTNBeUFnQUNnQ0FDRURJQUVnQWlnQ0FEWUNHQ0FCSUFBcEFyelFBVGNERUNBRElBRkJFR29RR3lBQklBRW9BaWcyQWdnZ0FTQUJLUU1nTndNQUlBQWdBUkFiQ3lBQlFUQnFKQUFMekFFQkFYOGdBQ0FCS0FLMDBBRTJBcGppQVNBQUlBRW9BZ1FpQWpZQ3dPQUJJQUFnQWpZQ3ZPQUJJQUFnQWlBQktBSUlhaUlDTmdLNDRBRWdBQ0FDTmdMRTRBRWdBU2dDdU5BQkJFQWdBRUtCZ0lDQUVEY0RpT0VCSUFBZ0FVR2swQUJxTmdJTUlBQWdBVUdVSUdvMkFnZ2dBQ0FCUVp3d2FqWUNCQ0FBSUFGQkRHbzJBZ0FnQUVHczBBRnFJQUZCcU5BQmFpZ0NBRFlDQUNBQVFiRFFBV29nQVVHczBBRnFLQUlBTmdJQUlBQkJ0TkFCYWlBQlFiRFFBV29vQWdBMkFnQVBDeUFBUWdBM0E0amhBUXM3QUNBQ1JRUkFRYnAvRHdzZ0JFVUVRRUZzRHdzZ0FpQUVFR0FFUUNBQUlBRWdBaUFESUFRZ0JSQmhEd3NnQUNBQklBSWdBeUFFSUFVUVpRdEdBUUYvSXdCQkVHc2lCU1FBSUFWQkNHb2dCQkFPQW44Z0JTMEFDUVJBSUFBZ0FTQUNJQU1nQkJBeURBRUxJQUFnQVNBQ0lBTWdCQkEwQ3lFQUlBVkJFR29rQUNBQUN6UUFJQUFnQXlBRUlBVVFOaUlGRUFNRVFDQUZEd3NnQlNBRVNRUi9JQUVnQWlBRElBVnFJQVFnQldzZ0FCQTFCVUc0ZndzTFJnRUJmeU1BUVJCcklnVWtBQ0FGUVFocUlBUVFEZ0ovSUFVdEFBa0VRQ0FBSUFFZ0FpQURJQVFRWWd3QkN5QUFJQUVnQWlBRElBUVFOUXNoQUNBRlFSQnFKQUFnQUF0WkFRRi9RUThoQWlBQklBQkpCRUFnQVVFRWRDQUFiaUVDQ3lBQVFRaDJJZ0VnQWtFWWJDSUFRWXdJYWlnQ0FHd2dBRUdJQ0dvb0FnQnFJZ0pCQTNZZ0Ftb2dBRUdBQ0dvb0FnQWdBRUdFQ0dvb0FnQWdBV3hxU1FzM0FDQUFJQU1nQkNBRlFZQVFFRE1pQlJBREJFQWdCUThMSUFVZ0JFa0VmeUFCSUFJZ0F5QUZhaUFFSUFWcklBQVFNZ1ZCdUg4TEM3OERBUU4vSXdCQklHc2lCU1FBSUFWQkNHb2dBaUFERUFZaUFoQURSUVJBSUFBZ0FXb2lCMEY5YWlFR0lBVWdCQkFPSUFSQkJHb2hBaUFGTFFBQ0lRTURRRUVBSUFBZ0Jra2dCVUVJYWhBRUd3UkFJQUFnQWlBRlFRaHFJQU1RQWtFQ2RHb2lCQzhCQURzQUFDQUZRUWhxSUFRdEFBSVFBU0FBSUFRdEFBTnFJZ1FnQWlBRlFRaHFJQU1RQWtFQ2RHb2lBQzhCQURzQUFDQUZRUWhxSUFBdEFBSVFBU0FFSUFBdEFBTnFJUUFNQVFVZ0IwRithaUVFQTBBZ0JVRUlhaEFFSUFBZ0JFdHlSUVJBSUFBZ0FpQUZRUWhxSUFNUUFrRUNkR29pQmk4QkFEc0FBQ0FGUVFocUlBWXRBQUlRQVNBQUlBWXRBQU5xSVFBTUFRc0xBMEFnQUNBRVMwVUVRQ0FBSUFJZ0JVRUlhaUFERUFKQkFuUnFJZ1l2QVFBN0FBQWdCVUVJYWlBR0xRQUNFQUVnQUNBR0xRQURhaUVBREFFTEN3SkFJQUFnQjA4TkFDQUFJQUlnQlVFSWFpQURFQUlpQTBFQ2RHb2lBQzBBQURvQUFDQUFMUUFEUVFGR0JFQWdCVUVJYWlBQUxRQUNFQUVNQVFzZ0JTZ0NERUVmU3cwQUlBVkJDR29nQWlBRFFRSjBhaTBBQWhBQklBVW9BZ3hCSVVrTkFDQUZRU0EyQWd3TElBRkJiQ0FGUVFocUVBb2JJUUlMQ3dzZ0JVRWdhaVFBSUFJTGtnSUJCSDhqQUVGQWFpSUpKQUFnQ1NBRFFUUVFDeUVEQWtBZ0JFRUNTQTBBSUFNZ0JFRUNkR29vQWdBaENTQURRVHhxSUFnUUl5QURRUUU2QUQ4Z0F5QUNPZ0ErUVFBaEJDQURLQUk4SVFvRFFDQUVJQWxHRFFFZ0FDQUVRUUowYWlBS05nRUFJQVJCQVdvaEJBd0FBQXNBQzBFQUlRa0RRQ0FHSUFsR1JRUkFJQU1nQlNBSlFRRjBhaUlLTFFBQklndEJBblJxSWd3b0FnQWhCQ0FEUVR4cUlBb3RBQUJCQ0hRZ0NHcEIvLzhEY1JBaklBTkJBam9BUHlBRElBY2dDMnNpQ2lBQ2Fqb0FQaUFFUVFFZ0FTQUthM1JxSVFvZ0F5Z0NQQ0VMQTBBZ0FDQUVRUUowYWlBTE5nRUFJQVJCQVdvaUJDQUtTUTBBQ3lBTUlBbzJBZ0FnQ1VFQmFpRUpEQUVMQ3lBRFFVQnJKQUFMb3dJQkNYOGpBRUhRQUdzaUNTUUFJQWxCRUdvZ0JVRTBFQXNhSUFjZ0Jtc2hEeUFISUFGcklSQURRQUpBSUFNZ0NrY0VRRUVCSUFFZ0J5QUNJQXBCQVhScUlnWXRBQUVpREdzaUNHc2lDM1FoRFNBR0xRQUFJUTRnQ1VFUWFpQU1RUUowYWlJTUtBSUFJUVlnQ3lBUFR3UkFJQUFnQmtFQ2RHb2dDeUFJSUFVZ0NFRTBiR29nQ0NBUWFpSUlRUUVnQ0VFQlNoc2lDQ0FDSUFRZ0NFRUNkR29vQWdBaUNFRUJkR29nQXlBSWF5QUhJQTRRWXlBR0lBMXFJUWdNQWdzZ0NVRU1haUFPRUNNZ0NVRUJPZ0FQSUFrZ0NEb0FEaUFHSUExcUlRZ2dDU2dDRENFTEEwQWdCaUFJVHcwQ0lBQWdCa0VDZEdvZ0N6WUJBQ0FHUVFGcUlRWU1BQUFMQUFzZ0NVSFFBR29rQUE4TElBd2dDRFlDQUNBS1FRRnFJUW9NQUFBTEFBczBBQ0FBSUFNZ0JDQUZFRFlpQlJBREJFQWdCUThMSUFVZ0JFa0VmeUFCSUFJZ0F5QUZhaUFFSUFWcklBQVFOQVZCdUg4TEN5TUFJQUEvQUVFUWRHdEIvLzhEYWtFUWRrQUFRWDlHQkVCQkFBOExRUUFRQUVFQkN6c0JBWDhnQWdSQUEwQWdBQ0FCSUFKQmdDQWdBa0dBSUVrYklnTVFDeUVBSUFGQmdDQnFJUUVnQUVHQUlHb2hBQ0FDSUFOcklnSU5BQXNMQ3dZQUlBQVFBd3NMcUJVSkFFR0lDQXNOQVFBQUFBRUFBQUFDQUFBQUFnQkJvQWdMc3dZQkFBQUFBUUFBQUFJQUFBQUNBQUFBSmdBQUFJSUFBQUFoQlFBQVNnQUFBR2NJQUFBbUFBQUF3QUVBQUlBQUFBQkpCUUFBU2dBQUFMNElBQUFwQUFBQUxBSUFBSUFBQUFCSkJRQUFTZ0FBQUw0SUFBQXZBQUFBeWdJQUFJQUFBQUNLQlFBQVNnQUFBSVFKQUFBMUFBQUFjd01BQUlBQUFBQ2RCUUFBU2dBQUFLQUpBQUE5QUFBQWdRTUFBSUFBQUFEckJRQUFTd0FBQUQ0S0FBQkVBQUFBbmdNQUFJQUFBQUJOQmdBQVN3QUFBS29LQUFCTEFBQUFzd01BQUlBQUFBREJCZ0FBVFFBQUFCOE5BQUJOQUFBQVV3UUFBSUFBQUFBakNBQUFVUUFBQUtZUEFBQlVBQUFBbVFRQUFJQUFBQUJMQ1FBQVZ3QUFBTEVTQUFCWUFBQUEyZ1FBQUlBQUFBQnZDUUFBWFFBQUFDTVVBQUJVQUFBQVJRVUFBSUFBQUFCVUNnQUFhZ0FBQUl3VUFBQnFBQUFBcndVQUFJQUFBQUIyQ1FBQWZBQUFBRTRRQUFCOEFBQUEwZ0lBQUlBQUFBQmpCd0FBa1FBQUFKQUhBQUNTQUFBQUFBQUFBQUVBQUFBQkFBQUFCUUFBQUEwQUFBQWRBQUFBUFFBQUFIMEFBQUQ5QUFBQS9RRUFBUDBEQUFEOUJ3QUEvUThBQVAwZkFBRDlQd0FBL1g4QUFQMy9BQUQ5L3dFQS9mOERBUDMvQndEOS93OEEvZjhmQVAzL1B3RDkvMzhBL2YvL0FQMy8vd0g5Ly84RC9mLy9CLzMvL3cvOS8vOGYvZi8vUC8zLy8zOEFBQUFBQVFBQUFBSUFBQUFEQUFBQUJBQUFBQVVBQUFBR0FBQUFCd0FBQUFnQUFBQUpBQUFBQ2dBQUFBc0FBQUFNQUFBQURRQUFBQTRBQUFBUEFBQUFFQUFBQUJFQUFBQVNBQUFBRXdBQUFCUUFBQUFWQUFBQUZnQUFBQmNBQUFBWUFBQUFHUUFBQUJvQUFBQWJBQUFBSEFBQUFCMEFBQUFlQUFBQUh3QUFBQU1BQUFBRUFBQUFCUUFBQUFZQUFBQUhBQUFBQ0FBQUFBa0FBQUFLQUFBQUN3QUFBQXdBQUFBTkFBQUFEZ0FBQUE4QUFBQVFBQUFBRVFBQUFCSUFBQUFUQUFBQUZBQUFBQlVBQUFBV0FBQUFGd0FBQUJnQUFBQVpBQUFBR2dBQUFCc0FBQUFjQUFBQUhRQUFBQjRBQUFBZkFBQUFJQUFBQUNFQUFBQWlBQUFBSXdBQUFDVUFBQUFuQUFBQUtRQUFBQ3NBQUFBdkFBQUFNd0FBQURzQUFBQkRBQUFBVXdBQUFHTUFBQUNEQUFBQUF3RUFBQU1DQUFBREJBQUFBd2dBQUFNUUFBQURJQUFBQTBBQUFBT0FBQUFEQUFFQVFlQVBDMUVCQUFBQUFRQUFBQUVBQUFBQkFBQUFBZ0FBQUFJQUFBQURBQUFBQXdBQUFBUUFBQUFFQUFBQUJRQUFBQWNBQUFBSUFBQUFDUUFBQUFvQUFBQUxBQUFBREFBQUFBMEFBQUFPQUFBQUR3QUFBQkFBUWNRUUM0c0JBUUFBQUFJQUFBQURBQUFBQkFBQUFBVUFBQUFHQUFBQUJ3QUFBQWdBQUFBSkFBQUFDZ0FBQUFzQUFBQU1BQUFBRFFBQUFBNEFBQUFQQUFBQUVBQUFBQklBQUFBVUFBQUFGZ0FBQUJnQUFBQWNBQUFBSUFBQUFDZ0FBQUF3QUFBQVFBQUFBSUFBQUFBQUFRQUFBQUlBQUFBRUFBQUFDQUFBQUJBQUFBQWdBQUFBUUFBQUFJQUFBQUFBQVFCQmtCSUw1Z1FCQUFBQUFRQUFBQUVBQUFBQkFBQUFBZ0FBQUFJQUFBQURBQUFBQXdBQUFBUUFBQUFHQUFBQUJ3QUFBQWdBQUFBSkFBQUFDZ0FBQUFzQUFBQU1BQUFBRFFBQUFBNEFBQUFQQUFBQUVBQUFBQUVBQUFBRUFBQUFDQUFBQUFBQUFBQUJBQUVCQmdBQUFBQUFBQVFBQUFBQUVBQUFCQUFBQUFBZ0FBQUZBUUFBQUFBQUFBVURBQUFBQUFBQUJRUUFBQUFBQUFBRkJnQUFBQUFBQUFVSEFBQUFBQUFBQlFrQUFBQUFBQUFGQ2dBQUFBQUFBQVVNQUFBQUFBQUFCZzRBQUFBQUFBRUZFQUFBQUFBQUFRVVVBQUFBQUFBQkJSWUFBQUFBQUFJRkhBQUFBQUFBQXdVZ0FBQUFBQUFFQlRBQUFBQWdBQVlGUUFBQUFBQUFCd1dBQUFBQUFBQUlCZ0FCQUFBQUFBb0dBQVFBQUFBQURBWUFFQUFBSUFBQUJBQUFBQUFBQUFBRUFRQUFBQUFBQUFVQ0FBQUFJQUFBQlFRQUFBQUFBQUFGQlFBQUFDQUFBQVVIQUFBQUFBQUFCUWdBQUFBZ0FBQUZDZ0FBQUFBQUFBVUxBQUFBQUFBQUJnMEFBQUFnQUFFRkVBQUFBQUFBQVFVU0FBQUFJQUFCQlJZQUFBQUFBQUlGR0FBQUFDQUFBd1VnQUFBQUFBQURCU2dBQUFBQUFBWUVRQUFBQUJBQUJnUkFBQUFBSUFBSEJZQUFBQUFBQUFrR0FBSUFBQUFBQ3dZQUNBQUFNQUFBQkFBQUFBQVFBQUFFQVFBQUFDQUFBQVVDQUFBQUlBQUFCUU1BQUFBZ0FBQUZCUUFBQUNBQUFBVUdBQUFBSUFBQUJRZ0FBQUFnQUFBRkNRQUFBQ0FBQUFVTEFBQUFJQUFBQlF3QUFBQUFBQUFHRHdBQUFDQUFBUVVTQUFBQUlBQUJCUlFBQUFBZ0FBSUZHQUFBQUNBQUFnVWNBQUFBSUFBREJTZ0FBQUFnQUFRRk1BQUFBQUFBRUFZQUFBRUFBQUFQQmdDQUFBQUFBQTRHQUVBQUFBQUFEUVlBSUFCQmdCY0xod0lCQUFFQkJRQUFBQUFBQUFVQUFBQUFBQUFHQkQwQUFBQUFBQWtGL1FFQUFBQUFEd1g5ZndBQUFBQVZCZjMvSHdBQUFBTUZCUUFBQUFBQUJ3UjlBQUFBQUFBTUJmMFBBQUFBQUJJRi9mOERBQUFBRndYOS8zOEFBQUFGQlIwQUFBQUFBQWdFL1FBQUFBQUFEZ1g5UHdBQUFBQVVCZjMvRHdBQUFBSUZBUUFBQUJBQUJ3UjlBQUFBQUFBTEJmMEhBQUFBQUJFRi9mOEJBQUFBRmdYOS96OEFBQUFFQlEwQUFBQVFBQWdFL1FBQUFBQUFEUVg5SHdBQUFBQVRCZjMvQndBQUFBRUZBUUFBQUJBQUJnUTlBQUFBQUFBS0JmMERBQUFBQUJBRi9mOEFBQUFBSEFYOS8vOFBBQUFiQmYzLy93Y0FBQm9GL2YvL0F3QUFHUVg5Ly84QkFBQVlCZjMvL3dCQmtCa0xoZ1FCQUFFQkJnQUFBQUFBQUFZREFBQUFBQUFBQkFRQUFBQWdBQUFGQlFBQUFBQUFBQVVHQUFBQUFBQUFCUWdBQUFBQUFBQUZDUUFBQUFBQUFBVUxBQUFBQUFBQUJnMEFBQUFBQUFBR0VBQUFBQUFBQUFZVEFBQUFBQUFBQmhZQUFBQUFBQUFHR1FBQUFBQUFBQVljQUFBQUFBQUFCaDhBQUFBQUFBQUdJZ0FBQUFBQUFRWWxBQUFBQUFBQkJpa0FBQUFBQUFJR0x3QUFBQUFBQXdZN0FBQUFBQUFFQmxNQUFBQUFBQWNHZ3dBQUFBQUFDUVlEQWdBQUVBQUFCQVFBQUFBQUFBQUVCUUFBQUNBQUFBVUdBQUFBQUFBQUJRY0FBQUFnQUFBRkNRQUFBQUFBQUFVS0FBQUFBQUFBQmd3QUFBQUFBQUFHRHdBQUFBQUFBQVlTQUFBQUFBQUFCaFVBQUFBQUFBQUdHQUFBQUFBQUFBWWJBQUFBQUFBQUJoNEFBQUFBQUFBR0lRQUFBQUFBQVFZakFBQUFBQUFCQmljQUFBQUFBQUlHS3dBQUFBQUFBd1l6QUFBQUFBQUVCa01BQUFBQUFBVUdZd0FBQUFBQUNBWURBUUFBSUFBQUJBUUFBQUF3QUFBRUJBQUFBQkFBQUFRRkFBQUFJQUFBQlFjQUFBQWdBQUFGQ0FBQUFDQUFBQVVLQUFBQUlBQUFCUXNBQUFBQUFBQUdEZ0FBQUFBQUFBWVJBQUFBQUFBQUJoUUFBQUFBQUFBR0Z3QUFBQUFBQUFZYUFBQUFBQUFBQmgwQUFBQUFBQUFHSUFBQUFBQUFFQVlEQUFFQUFBQVBCZ09BQUFBQUFBNEdBMEFBQUFBQURRWURJQUFBQUFBTUJnTVFBQUFBQUFzR0F3Z0FBQUFBQ2dZREJBQkJwQjBMMlFFQkFBQUFBd0FBQUFjQUFBQVBBQUFBSHdBQUFEOEFBQUIvQUFBQS93QUFBUDhCQUFEL0F3QUEvd2NBQVA4UEFBRC9Id0FBL3o4QUFQOS9BQUQvL3dBQS8vOEJBUC8vQXdELy93Y0EvLzhQQVAvL0h3RC8vejhBLy85L0FQLy8vd0QvLy84Qi8vLy9BLy8vL3dmLy8vOFAvLy8vSC8vLy96Ly8vLzkvQUFBQUFBRUFBQUFDQUFBQUJBQUFBQUFBQUFBQ0FBQUFCQUFBQUFnQUFBQUFBQUFBQVFBQUFBSUFBQUFCQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFnQUFBQUlBQUFBQ0FBQUFBY0FBQUFJQUFBQUNRQUFBQW9BQUFBTEFFR2dJQXNEd0JCUSIsIEVuLCBDbiwgdm4gPSAwLCBCbiwgYm4sIHluLCBJbiwgeG4sIFFuLCBMbiwgTW4sIFNuLCBEbiwga24sIFRuLCBSbiwgRm4sIFVuLCBPbiwgUG4sIEduLCBObiwgam4sIEhuLCBxbiwgVm4sIHpuLCBZbiwgS24sIFduLCBKbiwgWG4sIFpuLCAkbiwgZWksIG5pLCBpaSwgYWkgPSBmdW5jdGlvbihlKSB7CiAgdmFyIHQyID0gdGhpczsKICB0aGlzLm9iamVjdCA9IGUsIHRoaXMub2JqZWN0LnJvdGF0aW9uLnJlb3JkZXIoIllYWiIpLCB0aGlzLmVuYWJsZWQgPSB0cnVlLCB0aGlzLmRldmljZU9yaWVudGF0aW9uID0ge30sIHRoaXMuc2NyZWVuT3JpZW50YXRpb24gPSAwLCB0aGlzLmFscGhhT2Zmc2V0ID0gMDsKICB2YXIgbjIsIGkyLCByMiwgbzIsIHMyID0gZnVuY3Rpb24oZTIpIHsKICAgIHQyLmRldmljZU9yaWVudGF0aW9uID0gZTI7CiAgfSwgYTIgPSBmdW5jdGlvbigpIHsKICAgIHQyLnNjcmVlbk9yaWVudGF0aW9uID0gd2luZG93Lm9yaWVudGF0aW9uIHx8IDA7CiAgfSwgQTIgPSAobjIgPSBuZXcgVEhSRUUuVmVjdG9yMygwLCAwLCAxKSwgaTIgPSBuZXcgVEhSRUUuRXVsZXIsIHIyID0gbmV3IFRIUkVFLlF1YXRlcm5pb24sIG8yID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oLU1hdGguc3FydCgwLjUpLCAwLCAwLCBNYXRoLnNxcnQoMC41KSksIGZ1bmN0aW9uKGUyLCB0MywgczMsIGEzLCBBMykgewogICAgaTIuc2V0KHMzLCB0MywgLWEzLCAiWVhaIiksIGUyLnNldEZyb21FdWxlcihpMiksIGUyLm11bHRpcGx5KG8yKSwgZTIubXVsdGlwbHkocjIuc2V0RnJvbUF4aXNBbmdsZShuMiwgLUEzKSk7CiAgfSk7CiAgdGhpcy5jb25uZWN0ID0gZnVuY3Rpb24oKSB7CiAgICBhMigpLCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLCBhMiwgZmFsc2UpLCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlb3JpZW50YXRpb24iLCBzMiwgZmFsc2UpLCB0Mi5lbmFibGVkID0gdHJ1ZTsKICB9LCB0aGlzLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbigpIHsKICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsIGEyLCBmYWxzZSksIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJkZXZpY2VvcmllbnRhdGlvbiIsIHMyLCBmYWxzZSksIHQyLmVuYWJsZWQgPSBmYWxzZTsKICB9LCB0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHQyLmVuYWJsZWQgIT09IGZhbHNlKSB7CiAgICAgIHZhciBlMiA9IHQyLmRldmljZU9yaWVudGF0aW9uOwogICAgICBpZiAoZTIpIHsKICAgICAgICB2YXIgbjMgPSBlMi5hbHBoYSA/IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZChlMi5hbHBoYSkgKyB0Mi5hbHBoYU9mZnNldCA6IDAsIGkzID0gZTIuYmV0YSA/IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZChlMi5iZXRhKSA6IDAsIHIzID0gZTIuZ2FtbWEgPyBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQoZTIuZ2FtbWEpIDogMCwgbzMgPSB0Mi5zY3JlZW5PcmllbnRhdGlvbiA/IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZCh0Mi5zY3JlZW5PcmllbnRhdGlvbikgOiAwOwogICAgICAgIEEyKHQyLm9iamVjdC5xdWF0ZXJuaW9uLCBuMywgaTMsIHIzLCBvMyk7CiAgICAgIH0KICAgIH0KICB9LCB0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbigpIHsKICAgIHQyLmRpc2Nvbm5lY3QoKTsKICB9LCB0aGlzLmNvbm5lY3QoKTsKfSwgQWksIGxpLCBjaSwgaGkgPSAiYWZyYW1lLWluamVjdGVkIiwgZGksIHVpLCBnaSwgcGksIGZpLCBtaSwgRWksIENpLCB2aSA9IGZhbHNlLCBCaSA9IGZhbHNlLCBiaSwgeWksIElpLCBMaSwgTWksIFNpLCBqaSwgX2ksIEhpLCBLaSwgV2ksIEppLCBYaSwgb3IsIGNyLCBmciwgbXIsIGJyLCBRciwgRHIsIGtyLCBUciwgRnIsIGpyLCBKciwgWHIsICRyLCBlbywgdG8sIG5vLCBsbywgY28sIGhvLCBnbywgcG8sIGZvLCBtbywgRW8sIENvLCB2byA9ICJsb2FkaW5nLXNjcmVlbiIsIGJvLCB5bywgSW8sIHdvLCB4bywgT28gPSBmdW5jdGlvbihlLCB0MikgewogIHJldHVybiAoZSAhPT0gImF1ZGlvIiB8fCB0eXBlb2YgdDIgPT0gInN0cmluZyIpICYmICEoZSA9PT0gImFycmF5IiAmJiAhQXJyYXkuaXNBcnJheSh0MikpICYmIChlICE9PSAiYXNzZXQiIHx8IHR5cGVvZiB0MiA9PSAic3RyaW5nIikgJiYgKGUgIT09ICJib29sZWFuIiB8fCB0eXBlb2YgdDIgPT0gImJvb2xlYW4iKSAmJiAoZSAhPT0gImNvbG9yIiB8fCB0eXBlb2YgdDIgPT0gInN0cmluZyIpICYmIChlICE9PSAiaW50IiB8fCB0eXBlb2YgdDIgPT0gIm51bWJlciIpICYmIChlICE9PSAibnVtYmVyIiB8fCB0eXBlb2YgdDIgPT0gIm51bWJlciIpICYmIChlICE9PSAibWFwIiB8fCB0eXBlb2YgdDIgPT0gInN0cmluZyIpICYmIChlICE9PSAibW9kZWwiIHx8IHR5cGVvZiB0MiA9PSAic3RyaW5nIikgJiYgKGUgIT09ICJzZWxlY3RvciIgfHwgdHlwZW9mIHQyID09ICJzdHJpbmciIHx8IHQyID09PSBudWxsKSAmJiAoZSAhPT0gInNlbGVjdG9yQWxsIiB8fCB0eXBlb2YgdDIgPT0gInN0cmluZyIgfHwgdDIgPT09IG51bGwpICYmIChlICE9PSAic3JjIiB8fCB0eXBlb2YgdDIgPT0gInN0cmluZyIpICYmIChlICE9PSAic3RyaW5nIiB8fCB0eXBlb2YgdDIgPT0gInN0cmluZyIpICYmIChlICE9PSAidGltZSIgfHwgdHlwZW9mIHQyID09ICJudW1iZXIiKSAmJiAoZSA9PT0gInZlYzIiID8gVW8odDIsIDIpIDogZSA9PT0gInZlYzMiID8gVW8odDIsIDMpIDogZSAhPT0gInZlYzQiIHx8IFVvKHQyLCA0KSk7Cn0sIFBvLCBHbywgSG8sIHFvLCBLbywgV28sIEpvLCBYbywgWm8sICRvLCBlcywgdHMsIG5zLCBpcywgcnMsIG9zLCBzcywgYXMsIEFzID0gZnVuY3Rpb24oZSwgdDIsIG4yKSB7CiAgdmFyIGkyID0gdGhpczsKICBpZiAodGhpcy5zY2VuZU9ubHkgJiYgIWUuaXNTY2VuZSkKICAgIHRocm93IG5ldyBFcnJvcigiQ29tcG9uZW50IGAiICsgdGhpcy5uYW1lICsgImAgY2FuIG9ubHkgYmUgYXBwbGllZCB0byA8YS1zY2VuZT4iKTsKICBpZiAobjIgJiYgIXRoaXMubXVsdGlwbGUpCiAgICB0aHJvdyBuZXcgRXJyb3IoIlRyeWluZyB0byBpbml0aWFsaXplIG11bHRpcGxlIGNvbXBvbmVudHMgb2YgdHlwZSBgIiArIHRoaXMubmFtZSArICJgLiBUaGVyZSBjYW4gb25seSBiZSBvbmUgY29tcG9uZW50IG9mIHRoaXMgdHlwZSBwZXIgZW50aXR5LiIpOwogIHRoaXMuZWwgPSBlLCB0aGlzLmlkID0gbjIsIHRoaXMuYXR0ck5hbWUgPSB0aGlzLm5hbWUgKyAobjIgPyAiX18iICsgbjIgOiAiIiksIHRoaXMuZXZ0RGV0YWlsID0geyBpZDogdGhpcy5pZCwgbmFtZTogdGhpcy5uYW1lIH0sIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZSwgdGhpcy5lbC5jb21wb25lbnRzW3RoaXMuYXR0ck5hbWVdID0gdGhpcywgdGhpcy5vYmplY3RQb29sID0gcnNbdGhpcy5uYW1lXTsKICB2YXIgcjIgPSB0aGlzLmV2ZW50czsKICB0aGlzLmV2ZW50cyA9IHt9LCBmdW5jdGlvbihlMiwgdDMpIHsKICAgIHZhciBuMzsKICAgIGZvciAobjMgaW4gdDMpCiAgICAgIGUyLmV2ZW50c1tuM10gPSB0M1tuM10uYmluZChlMik7CiAgfSh0aGlzLCByMiksIHRoaXMuYXR0clZhbHVlID0gdW5kZWZpbmVkLCB0aGlzLmlzT2JqZWN0QmFzZWQgPyAodGhpcy5kYXRhID0gdGhpcy5vYmplY3RQb29sLnVzZSgpLCBZaSh0aGlzLmRhdGEsIHRoaXMuc2NoZW1hKSwgdGhpcy5vbGREYXRhID0gdGhpcy5vYmplY3RQb29sLnVzZSgpLCBZaSh0aGlzLm9sZERhdGEsIHRoaXMuc2NoZW1hKSwgdGhpcy5hdHRyVmFsdWVQcm94eSA9IG5ldyBQcm94eSh0aGlzLCBhcykpIDogKHRoaXMuZGF0YSA9IHVuZGVmaW5lZCwgdGhpcy5vbGREYXRhID0gdW5kZWZpbmVkLCB0aGlzLmF0dHJWYWx1ZVByb3h5ID0gdW5kZWZpbmVkKSwgdGhpcy5kZWZlclVua25vd25Qcm9wZXJ0eVdhcm5pbmdzID0gISF0aGlzLnVwZGF0ZVNjaGVtYSwgdGhpcy50aHJvdHRsZWRFbWl0Q29tcG9uZW50Q2hhbmdlZCA9IFlyKGZ1bmN0aW9uKCkgewogICAgZS5lbWl0KCJjb21wb25lbnRjaGFuZ2VkIiwgaTIuZXZ0RGV0YWlsLCBmYWxzZSk7CiAgfSwgMjAwKSwgdGhpcy51cGRhdGVQcm9wZXJ0aWVzKHQyLCB0cnVlKTsKfSwgbHMsIHVzID0gZmFsc2UsIHBzLCBmcywgbXMgPSBmdW5jdGlvbihlKSB7CiAgdmFyIHQyID0gZiAmJiBLb1t0aGlzLm5hbWVdOwogIHRoaXMuZWwgPSBlLCB0aGlzLnNjZW5lRWwgPSBlLCB0MiAmJiAodDIuQ29tcG9uZW50LnByb3RvdHlwZS5zeXN0ZW0gPSB0aGlzKSwgdGhpcy5idWlsZERhdGEoKSwgdGhpcy5pbml0KCksIHRoaXMudXBkYXRlKHt9KTsKfSwgQ3MsIHZzLCBicywgeXMsIElzLCB3cyA9ICJfXyIsIHhzLCBRcywgTHMsIGtzLCBUcywgUnMsIEZzLCBVcywgTnMsIGpzLCBfcywgSHMgPSBmdW5jdGlvbigpIHt9LCBWcywgenMsIFlzLCBLcywgV3MsIEpzLCAkcywgZWEsIHRhLCBuYSA9IGZ1bmN0aW9uKCkge30sIHJhLCBvYSwgQWEsIGxhLCBjYSA9ICIxLjcuMCIsIGhhLCBkYSwgdWEsIGdhLCBwYSwgZmEgPSAiY29sb3IiLCBtYSA9ICJyb3RhdGlvbiIsIEVhID0gImNvbXBvbmVudHMiLCB4YSwgUWEsIExhLCBNYSwgU2EsIERhID0gImNsaWNrIiwga2EgPSAibW91c2V1cCIsIFRhID0gImN1cnNvci1mdXNpbmciLCBSYSA9ICJjdXJzb3ItaG92ZXJpbmciLCBGYSA9ICJjdXJzb3ItaG92ZXJlZCIsIFVhLCBPYSwgUGEgPSAiYS1tb3VzZS1jdXJzb3ItaG92ZXIiLCBHYSwgTmEsIGphLCBfYSwgSGEsIHFhLCBWYSwgemEsIFlhID0gIlBvaW50IiwgS2EgPSAiRmlzdCIsIFdhID0gIlRodW1iIFVwIiwgSmEsIFphID0gImhwLW1peGVkLXJlYWxpdHkiLCAkYSwgZUEsIHRBLCBuQSwgckEsIG9BLCBzQSwgYUEsIEFBLCBsQSwgY0EsIGhBLCBkQSwgdUEsIGdBLCBwQSwgZkEsIG1BLCBDQSA9ICJsb2dpdGVjaC1teC1pbmsiLCB2QSwgQkEsIGJBLCB5QSwgSUEsIHhBLCBRQSwgTEEsIE1BLCBTQSwgREEgPSAib2N1bHVzLXRvdWNoIiwga0EsIFRBLCBSQSwgRkEgPSAib2N1bHVzLXRvdWNoIiwgVUEsIE9BLCBHQSwgTkEsIGpBID0gIm9jdWx1cy1nbyIsIF9BLCBIQSwgcUEsIFZBLCB6QSwgWUEgPSAicmF5Y2FzdGVyLWludGVyc2VjdGVkLWNsZWFyZWQiLCBLQSA9ICJyYXljYXN0ZXItaW50ZXJzZWN0aW9uLWNsZWFyZWQiLCBKQSwgWEEsIFpBLCAkQSwgZWwsIHRsLCBubCwgaWwsIHJsLCBvbCwgc2wsIGFsLCBBbCwgbGwsIGNsLCBobCA9ICJyb2JvdG8iLCBkbCwgdWwsIGdsLCBwbCwgbWwsIEVsLCBDbCwgdmwsIEJsID0gInZhbHZlIiwgYmwsIHlsLCBJbCwgd2wsIHhsID0gImh0Yy12aXZlIiwgUWwsIExsID0gImh0Yy12aXZlLWZvY3VzIiwgTWwsIFNsLCBEbCA9IDAuMDAwMDEsIGtsLCBUbCwgUmwsIEZsLCBVbCwgT2wsIFBsLCBHbCwgTmwgPSAid2luZG93cy1taXhlZC1yZWFsaXR5IiwgamwsIHFsID0gImEtZGlhbG9nLWJ1dHRvbnMtY29udGFpbmVyIiwgVmwgPSAiYS1kaWFsb2ctYnV0dG9uIiwgWWwsIEtsLCBXbCwgSmwsIFhsLCBabCwgJGwsIGVjID0gImEtaGlkZGVuIiwgdGMsIG5jID0gImEtaGlkZGVuIiwgcmMsIG9jLCBzYywgYWMsIEFjLCBsYywgY2MsIGhjLCBkYywgdWMsIGdjLCBFYyA9ICJkYXRhLWFmcmFtZS1kZWZhdWx0LWNhbWVyYSIsIHZjID0gImRhdGEtYWZyYW1lLWRlZmF1bHQtbGlnaHQiLCBCYywgYmMsIHljLCBJYywgd2MsIE1jLCBTYywgRGMsIFJjLCBGYywgVWMsIE9jLCBHYywgTmMsIGpjLCBfYywgSGMsIHFjLCBWYzsKdmFyIGluaXRfYWZyYW1lX21hc3Rlcl9tb2R1bGVfbWluID0gX19lc20oKCkgPT4gewogIGluaXRfdGhyZWVfbW9kdWxlKCk7CiAgdCA9IHsgODE2NzogKGUpID0+IHsKICAgIHZhciB0MiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CiAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbihlMikgewogICAgICByZXR1cm4gZTIuQllURVNfUEVSX0VMRU1FTlQgJiYgdDIuY2FsbChlMi5idWZmZXIpID09PSAiW29iamVjdCBBcnJheUJ1ZmZlcl0iIHx8IEFycmF5LmlzQXJyYXkoZTIpOwogICAgfTsKICB9LCA1NzM0OiAoZSkgPT4gewogICAgZS5leHBvcnRzID0gZnVuY3Rpb24oZTIsIHQyKSB7CiAgICAgIHJldHVybiB0eXBlb2YgZTIgPT0gIm51bWJlciIgPyBlMiA6IHR5cGVvZiB0MiA9PSAibnVtYmVyIiA/IHQyIDogMDsKICAgIH07CiAgfSwgNzk2MTogKGUsIHQyKSA9PiB7CiAgICB0Mi5ieXRlTGVuZ3RoID0gZnVuY3Rpb24oZTIpIHsKICAgICAgdmFyIHQzID0gYShlMiksIG4yID0gdDNbMF0sIGkyID0gdDNbMV07CiAgICAgIHJldHVybiAzICogKG4yICsgaTIpIC8gNCAtIGkyOwogICAgfSwgdDIudG9CeXRlQXJyYXkgPSBmdW5jdGlvbihlMikgewogICAgICB2YXIgdDMsIG4yLCBvMiA9IGEoZTIpLCBzMiA9IG8yWzBdLCBBMiA9IG8yWzFdLCBsID0gbmV3IHIoZnVuY3Rpb24oZTMsIHQ0LCBuMykgewogICAgICAgIHJldHVybiAzICogKHQ0ICsgbjMpIC8gNCAtIG4zOwogICAgICB9KDAsIHMyLCBBMikpLCBjID0gMCwgaCA9IEEyID4gMCA/IHMyIC0gNCA6IHMyOwogICAgICBmb3IgKG4yID0gMDtuMiA8IGg7IG4yICs9IDQpCiAgICAgICAgdDMgPSBpW2UyLmNoYXJDb2RlQXQobjIpXSA8PCAxOCB8IGlbZTIuY2hhckNvZGVBdChuMiArIDEpXSA8PCAxMiB8IGlbZTIuY2hhckNvZGVBdChuMiArIDIpXSA8PCA2IHwgaVtlMi5jaGFyQ29kZUF0KG4yICsgMyldLCBsW2MrK10gPSB0MyA+PiAxNiAmIDI1NSwgbFtjKytdID0gdDMgPj4gOCAmIDI1NSwgbFtjKytdID0gMjU1ICYgdDM7CiAgICAgIHJldHVybiBBMiA9PT0gMiAmJiAodDMgPSBpW2UyLmNoYXJDb2RlQXQobjIpXSA8PCAyIHwgaVtlMi5jaGFyQ29kZUF0KG4yICsgMSldID4+IDQsIGxbYysrXSA9IDI1NSAmIHQzKSwgQTIgPT09IDEgJiYgKHQzID0gaVtlMi5jaGFyQ29kZUF0KG4yKV0gPDwgMTAgfCBpW2UyLmNoYXJDb2RlQXQobjIgKyAxKV0gPDwgNCB8IGlbZTIuY2hhckNvZGVBdChuMiArIDIpXSA+PiAyLCBsW2MrK10gPSB0MyA+PiA4ICYgMjU1LCBsW2MrK10gPSAyNTUgJiB0MyksIGw7CiAgICB9LCB0Mi5mcm9tQnl0ZUFycmF5ID0gZnVuY3Rpb24oZTIpIHsKICAgICAgZm9yICh2YXIgdDMsIGkyID0gZTIubGVuZ3RoLCByMiA9IGkyICUgMywgbzIgPSBbXSwgczIgPSAxNjM4MywgYTIgPSAwLCBsID0gaTIgLSByMjthMiA8IGw7IGEyICs9IHMyKQogICAgICAgIG8yLnB1c2goQShlMiwgYTIsIGEyICsgczIgPiBsID8gbCA6IGEyICsgczIpKTsKICAgICAgcmV0dXJuIHIyID09PSAxID8gKHQzID0gZTJbaTIgLSAxXSwgbzIucHVzaChuW3QzID4+IDJdICsgblt0MyA8PCA0ICYgNjNdICsgIj09IikpIDogcjIgPT09IDIgJiYgKHQzID0gKGUyW2kyIC0gMl0gPDwgOCkgKyBlMltpMiAtIDFdLCBvMi5wdXNoKG5bdDMgPj4gMTBdICsgblt0MyA+PiA0ICYgNjNdICsgblt0MyA8PCAyICYgNjNdICsgIj0iKSksIG8yLmpvaW4oIiIpOwogICAgfTsKICAgIGZvciAodmFyIG4gPSBbXSwgaSA9IFtdLCByID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT0gInVuZGVmaW5lZCIgPyBVaW50OEFycmF5IDogQXJyYXksIG8gPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsIHMgPSAwO3MgPCA2NDsgKytzKQogICAgICBuW3NdID0gb1tzXSwgaVtvLmNoYXJDb2RlQXQocyldID0gczsKICAgIGZ1bmN0aW9uIGEoZTIpIHsKICAgICAgdmFyIHQzID0gZTIubGVuZ3RoOwogICAgICBpZiAodDMgJSA0ID4gMCkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTsKICAgICAgdmFyIG4yID0gZTIuaW5kZXhPZigiPSIpOwogICAgICByZXR1cm4gbjIgPT09IC0xICYmIChuMiA9IHQzKSwgW24yLCBuMiA9PT0gdDMgPyAwIDogNCAtIG4yICUgNF07CiAgICB9CiAgICBmdW5jdGlvbiBBKGUyLCB0MywgaTIpIHsKICAgICAgZm9yICh2YXIgcjIsIG8yLCBzMiA9IFtdLCBhMiA9IHQzO2EyIDwgaTI7IGEyICs9IDMpCiAgICAgICAgcjIgPSAoZTJbYTJdIDw8IDE2ICYgMTY3MTE2ODApICsgKGUyW2EyICsgMV0gPDwgOCAmIDY1MjgwKSArICgyNTUgJiBlMlthMiArIDJdKSwgczIucHVzaChuWyhvMiA9IHIyKSA+PiAxOCAmIDYzXSArIG5bbzIgPj4gMTIgJiA2M10gKyBuW28yID4+IDYgJiA2M10gKyBuWzYzICYgbzJdKTsKICAgICAgcmV0dXJuIHMyLmpvaW4oIiIpOwogICAgfQogICAgaVs0NV0gPSA2MiwgaVs5NV0gPSA2MzsKICB9LCA5MTE6IChlLCB0MiwgbikgPT4gewogICAgdmFyIGkgPSBuKDk5MjIpLmhwOwogICAgZS5leHBvcnRzID0gZnVuY3Rpb24oZTIsIHQzKSB7CiAgICAgIGlmIChpLmlzQnVmZmVyKGUyKSAmJiBpLmlzQnVmZmVyKHQzKSkgewogICAgICAgIGlmICh0eXBlb2YgZTIuZXF1YWxzID09ICJmdW5jdGlvbiIpCiAgICAgICAgICByZXR1cm4gZTIuZXF1YWxzKHQzKTsKICAgICAgICBpZiAoZTIubGVuZ3RoICE9PSB0My5sZW5ndGgpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgZm9yICh2YXIgbjIgPSAwO24yIDwgZTIubGVuZ3RoOyBuMisrKQogICAgICAgICAgaWYgKGUyW24yXSAhPT0gdDNbbjJdKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH07CiAgfSwgOTkyMjogKGUsIHQyLCBuKSA9PiB7CiAgICBjb25zdCBpID0gbig3OTYxKSwgciA9IG4oMTAyNCksIG8gPSB0eXBlb2YgU3ltYm9sID09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFN5bWJvbC5mb3IgPT0gImZ1bmN0aW9uIiA/IFN5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIikgOiBudWxsOwogICAgdDIuaHAgPSBBLCB0Mi5JUyA9IDUwOwogICAgY29uc3QgcyA9IDIxNDc0ODM2NDc7CiAgICBmdW5jdGlvbiBhKGUyKSB7CiAgICAgIGlmIChlMiA+IHMpCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSAiJyArIGUyICsgJyIgaXMgaW52YWxpZCBmb3Igb3B0aW9uICJzaXplIicpOwogICAgICBjb25zdCB0MyA9IG5ldyBVaW50OEFycmF5KGUyKTsKICAgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZih0MywgQS5wcm90b3R5cGUpLCB0MzsKICAgIH0KICAgIGZ1bmN0aW9uIEEoZTIsIHQzLCBuMikgewogICAgICBpZiAodHlwZW9mIGUyID09ICJudW1iZXIiKSB7CiAgICAgICAgaWYgKHR5cGVvZiB0MyA9PSAic3RyaW5nIikKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAic3RyaW5nIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLiBSZWNlaXZlZCB0eXBlIG51bWJlcicpOwogICAgICAgIHJldHVybiBoKGUyKTsKICAgICAgfQogICAgICByZXR1cm4gbChlMiwgdDMsIG4yKTsKICAgIH0KICAgIGZ1bmN0aW9uIGwoZTIsIHQzLCBuMikgewogICAgICBpZiAodHlwZW9mIGUyID09ICJzdHJpbmciKQogICAgICAgIHJldHVybiBmdW5jdGlvbihlMywgdDQpIHsKICAgICAgICAgIGlmICh0eXBlb2YgdDQgPT0gInN0cmluZyIgJiYgdDQgIT09ICIiIHx8ICh0NCA9ICJ1dGY4IiksICFBLmlzRW5jb2RpbmcodDQpKQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiICsgdDQpOwogICAgICAgICAgY29uc3QgbjMgPSAwIHwgcChlMywgdDQpOwogICAgICAgICAgbGV0IGkzID0gYShuMyk7CiAgICAgICAgICBjb25zdCByMyA9IGkzLndyaXRlKGUzLCB0NCk7CiAgICAgICAgICByZXR1cm4gcjMgIT09IG4zICYmIChpMyA9IGkzLnNsaWNlKDAsIHIzKSksIGkzOwogICAgICAgIH0oZTIsIHQzKTsKICAgICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhlMikpCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgICBpZiAoVyhlMywgVWludDhBcnJheSkpIHsKICAgICAgICAgICAgY29uc3QgdDQgPSBuZXcgVWludDhBcnJheShlMyk7CiAgICAgICAgICAgIHJldHVybiB1KHQ0LmJ1ZmZlciwgdDQuYnl0ZU9mZnNldCwgdDQuYnl0ZUxlbmd0aCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZChlMyk7CiAgICAgICAgfShlMik7CiAgICAgIGlmIChlMiA9PSBudWxsKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICIgKyB0eXBlb2YgZTIpOwogICAgICBpZiAoVyhlMiwgQXJyYXlCdWZmZXIpIHx8IGUyICYmIFcoZTIuYnVmZmVyLCBBcnJheUJ1ZmZlcikpCiAgICAgICAgcmV0dXJuIHUoZTIsIHQzLCBuMik7CiAgICAgIGlmICh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgIT0gInVuZGVmaW5lZCIgJiYgKFcoZTIsIFNoYXJlZEFycmF5QnVmZmVyKSB8fCBlMiAmJiBXKGUyLmJ1ZmZlciwgU2hhcmVkQXJyYXlCdWZmZXIpKSkKICAgICAgICByZXR1cm4gdShlMiwgdDMsIG4yKTsKICAgICAgaWYgKHR5cGVvZiBlMiA9PSAibnVtYmVyIikKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSBudW1iZXInKTsKICAgICAgY29uc3QgaTIgPSBlMi52YWx1ZU9mICYmIGUyLnZhbHVlT2YoKTsKICAgICAgaWYgKGkyICE9IG51bGwgJiYgaTIgIT09IGUyKQogICAgICAgIHJldHVybiBBLmZyb20oaTIsIHQzLCBuMik7CiAgICAgIGNvbnN0IHIyID0gZnVuY3Rpb24oZTMpIHsKICAgICAgICBpZiAoQS5pc0J1ZmZlcihlMykpIHsKICAgICAgICAgIGNvbnN0IHQ0ID0gMCB8IGcoZTMubGVuZ3RoKSwgbjMgPSBhKHQ0KTsKICAgICAgICAgIHJldHVybiBuMy5sZW5ndGggPT09IDAgfHwgZTMuY29weShuMywgMCwgMCwgdDQpLCBuMzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGUzLmxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdHlwZW9mIGUzLmxlbmd0aCAhPSAibnVtYmVyIiB8fCBKKGUzLmxlbmd0aCkgPyBhKDApIDogZChlMykgOiBlMy50eXBlID09PSAiQnVmZmVyIiAmJiBBcnJheS5pc0FycmF5KGUzLmRhdGEpID8gZChlMy5kYXRhKSA6IHVuZGVmaW5lZDsKICAgICAgfShlMik7CiAgICAgIGlmIChyMikKICAgICAgICByZXR1cm4gcjI7CiAgICAgIGlmICh0eXBlb2YgU3ltYm9sICE9ICJ1bmRlZmluZWQiICYmIFN5bWJvbC50b1ByaW1pdGl2ZSAhPSBudWxsICYmIHR5cGVvZiBlMltTeW1ib2wudG9QcmltaXRpdmVdID09ICJmdW5jdGlvbiIpCiAgICAgICAgcmV0dXJuIEEuZnJvbShlMltTeW1ib2wudG9QcmltaXRpdmVdKCJzdHJpbmciKSwgdDMsIG4yKTsKICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgIiArIHR5cGVvZiBlMik7CiAgICB9CiAgICBmdW5jdGlvbiBjKGUyKSB7CiAgICAgIGlmICh0eXBlb2YgZTIgIT0gIm51bWJlciIpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXInKTsKICAgICAgaWYgKGUyIDwgMCkKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlICInICsgZTIgKyAnIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gInNpemUiJyk7CiAgICB9CiAgICBmdW5jdGlvbiBoKGUyKSB7CiAgICAgIHJldHVybiBjKGUyKSwgYShlMiA8IDAgPyAwIDogMCB8IGcoZTIpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGQoZTIpIHsKICAgICAgY29uc3QgdDMgPSBlMi5sZW5ndGggPCAwID8gMCA6IDAgfCBnKGUyLmxlbmd0aCksIG4yID0gYSh0Myk7CiAgICAgIGZvciAobGV0IGkyID0gMDtpMiA8IHQzOyBpMiArPSAxKQogICAgICAgIG4yW2kyXSA9IDI1NSAmIGUyW2kyXTsKICAgICAgcmV0dXJuIG4yOwogICAgfQogICAgZnVuY3Rpb24gdShlMiwgdDMsIG4yKSB7CiAgICAgIGlmICh0MyA8IDAgfHwgZTIuYnl0ZUxlbmd0aCA8IHQzKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCcib2Zmc2V0IiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTsKICAgICAgaWYgKGUyLmJ5dGVMZW5ndGggPCB0MyArIChuMiB8fCAwKSkKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignImxlbmd0aCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJyk7CiAgICAgIGxldCBpMjsKICAgICAgcmV0dXJuIGkyID0gdDMgPT09IHVuZGVmaW5lZCAmJiBuMiA9PT0gdW5kZWZpbmVkID8gbmV3IFVpbnQ4QXJyYXkoZTIpIDogbjIgPT09IHVuZGVmaW5lZCA/IG5ldyBVaW50OEFycmF5KGUyLCB0MykgOiBuZXcgVWludDhBcnJheShlMiwgdDMsIG4yKSwgT2JqZWN0LnNldFByb3RvdHlwZU9mKGkyLCBBLnByb3RvdHlwZSksIGkyOwogICAgfQogICAgZnVuY3Rpb24gZyhlMikgewogICAgICBpZiAoZTIgPj0gcykKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIgKyBzLnRvU3RyaW5nKDE2KSArICIgYnl0ZXMiKTsKICAgICAgcmV0dXJuIDAgfCBlMjsKICAgIH0KICAgIGZ1bmN0aW9uIHAoZTIsIHQzKSB7CiAgICAgIGlmIChBLmlzQnVmZmVyKGUyKSkKICAgICAgICByZXR1cm4gZTIubGVuZ3RoOwogICAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGUyKSB8fCBXKGUyLCBBcnJheUJ1ZmZlcikpCiAgICAgICAgcmV0dXJuIGUyLmJ5dGVMZW5ndGg7CiAgICAgIGlmICh0eXBlb2YgZTIgIT0gInN0cmluZyIpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJzdHJpbmciIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIG9yIEFycmF5QnVmZmVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgZTIpOwogICAgICBjb25zdCBuMiA9IGUyLmxlbmd0aCwgaTIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gPT09IHRydWU7CiAgICAgIGlmICghaTIgJiYgbjIgPT09IDApCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGxldCByMiA9IGZhbHNlOwogICAgICBmb3IgKDs7ICkKICAgICAgICBzd2l0Y2ggKHQzKSB7CiAgICAgICAgICBjYXNlICJhc2NpaSI6CiAgICAgICAgICBjYXNlICJsYXRpbjEiOgogICAgICAgICAgY2FzZSAiYmluYXJ5IjoKICAgICAgICAgICAgcmV0dXJuIG4yOwogICAgICAgICAgY2FzZSAidXRmOCI6CiAgICAgICAgICBjYXNlICJ1dGYtOCI6CiAgICAgICAgICAgIHJldHVybiB6KGUyKS5sZW5ndGg7CiAgICAgICAgICBjYXNlICJ1Y3MyIjoKICAgICAgICAgIGNhc2UgInVjcy0yIjoKICAgICAgICAgIGNhc2UgInV0ZjE2bGUiOgogICAgICAgICAgY2FzZSAidXRmLTE2bGUiOgogICAgICAgICAgICByZXR1cm4gMiAqIG4yOwogICAgICAgICAgY2FzZSAiaGV4IjoKICAgICAgICAgICAgcmV0dXJuIG4yID4+PiAxOwogICAgICAgICAgY2FzZSAiYmFzZTY0IjoKICAgICAgICAgICAgcmV0dXJuIFkoZTIpLmxlbmd0aDsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGlmIChyMikKICAgICAgICAgICAgICByZXR1cm4gaTIgPyAtMSA6IHooZTIpLmxlbmd0aDsKICAgICAgICAgICAgdDMgPSAoIiIgKyB0MykudG9Mb3dlckNhc2UoKSwgcjIgPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGYoZTIsIHQzLCBuMikgewogICAgICBsZXQgaTIgPSBmYWxzZTsKICAgICAgaWYgKCh0MyA9PT0gdW5kZWZpbmVkIHx8IHQzIDwgMCkgJiYgKHQzID0gMCksIHQzID4gdGhpcy5sZW5ndGgpCiAgICAgICAgcmV0dXJuICIiOwogICAgICBpZiAoKG4yID09PSB1bmRlZmluZWQgfHwgbjIgPiB0aGlzLmxlbmd0aCkgJiYgKG4yID0gdGhpcy5sZW5ndGgpLCBuMiA8PSAwKQogICAgICAgIHJldHVybiAiIjsKICAgICAgaWYgKChuMiA+Pj49IDApIDw9ICh0MyA+Pj49IDApKQogICAgICAgIHJldHVybiAiIjsKICAgICAgZm9yIChlMiB8fCAoZTIgPSAidXRmOCIpOzsgKQogICAgICAgIHN3aXRjaCAoZTIpIHsKICAgICAgICAgIGNhc2UgImhleCI6CiAgICAgICAgICAgIHJldHVybiBTKHRoaXMsIHQzLCBuMik7CiAgICAgICAgICBjYXNlICJ1dGY4IjoKICAgICAgICAgIGNhc2UgInV0Zi04IjoKICAgICAgICAgICAgcmV0dXJuIHgodGhpcywgdDMsIG4yKTsKICAgICAgICAgIGNhc2UgImFzY2lpIjoKICAgICAgICAgICAgcmV0dXJuIEwodGhpcywgdDMsIG4yKTsKICAgICAgICAgIGNhc2UgImxhdGluMSI6CiAgICAgICAgICBjYXNlICJiaW5hcnkiOgogICAgICAgICAgICByZXR1cm4gTSh0aGlzLCB0MywgbjIpOwogICAgICAgICAgY2FzZSAiYmFzZTY0IjoKICAgICAgICAgICAgcmV0dXJuIHcodGhpcywgdDMsIG4yKTsKICAgICAgICAgIGNhc2UgInVjczIiOgogICAgICAgICAgY2FzZSAidWNzLTIiOgogICAgICAgICAgY2FzZSAidXRmMTZsZSI6CiAgICAgICAgICBjYXNlICJ1dGYtMTZsZSI6CiAgICAgICAgICAgIHJldHVybiBEKHRoaXMsIHQzLCBuMik7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpZiAoaTIpCiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIiArIGUyKTsKICAgICAgICAgICAgZTIgPSAoZTIgKyAiIikudG9Mb3dlckNhc2UoKSwgaTIgPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG0oZTIsIHQzLCBuMikgewogICAgICBjb25zdCBpMiA9IGUyW3QzXTsKICAgICAgZTJbdDNdID0gZTJbbjJdLCBlMltuMl0gPSBpMjsKICAgIH0KICAgIGZ1bmN0aW9uIEUoZTIsIHQzLCBuMiwgaTIsIHIyKSB7CiAgICAgIGlmIChlMi5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIC0xOwogICAgICBpZiAodHlwZW9mIG4yID09ICJzdHJpbmciID8gKGkyID0gbjIsIG4yID0gMCkgOiBuMiA+IDIxNDc0ODM2NDcgPyBuMiA9IDIxNDc0ODM2NDcgOiBuMiA8IC0yMTQ3NDgzNjQ4ICYmIChuMiA9IC0yMTQ3NDgzNjQ4KSwgSihuMiA9ICtuMikgJiYgKG4yID0gcjIgPyAwIDogZTIubGVuZ3RoIC0gMSksIG4yIDwgMCAmJiAobjIgPSBlMi5sZW5ndGggKyBuMiksIG4yID49IGUyLmxlbmd0aCkgewogICAgICAgIGlmIChyMikKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICBuMiA9IGUyLmxlbmd0aCAtIDE7CiAgICAgIH0gZWxzZSBpZiAobjIgPCAwKSB7CiAgICAgICAgaWYgKCFyMikKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICBuMiA9IDA7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiB0MyA9PSAic3RyaW5nIiAmJiAodDMgPSBBLmZyb20odDMsIGkyKSksIEEuaXNCdWZmZXIodDMpKQogICAgICAgIHJldHVybiB0My5sZW5ndGggPT09IDAgPyAtMSA6IEMoZTIsIHQzLCBuMiwgaTIsIHIyKTsKICAgICAgaWYgKHR5cGVvZiB0MyA9PSAibnVtYmVyIikKICAgICAgICByZXR1cm4gdDMgJj0gMjU1LCB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PSAiZnVuY3Rpb24iID8gcjIgPyBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZTIsIHQzLCBuMikgOiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGUyLCB0MywgbjIpIDogQyhlMiwgW3QzXSwgbjIsIGkyLCByMik7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpOwogICAgfQogICAgZnVuY3Rpb24gQyhlMiwgdDMsIG4yLCBpMiwgcjIpIHsKICAgICAgbGV0IG8yLCBzMiA9IDEsIGEyID0gZTIubGVuZ3RoLCBBMiA9IHQzLmxlbmd0aDsKICAgICAgaWYgKGkyICE9PSB1bmRlZmluZWQgJiYgKChpMiA9IFN0cmluZyhpMikudG9Mb3dlckNhc2UoKSkgPT09ICJ1Y3MyIiB8fCBpMiA9PT0gInVjcy0yIiB8fCBpMiA9PT0gInV0ZjE2bGUiIHx8IGkyID09PSAidXRmLTE2bGUiKSkgewogICAgICAgIGlmIChlMi5sZW5ndGggPCAyIHx8IHQzLmxlbmd0aCA8IDIpCiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgczIgPSAyLCBhMiAvPSAyLCBBMiAvPSAyLCBuMiAvPSAyOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGwyKGUzLCB0NCkgewogICAgICAgIHJldHVybiBzMiA9PT0gMSA/IGUzW3Q0XSA6IGUzLnJlYWRVSW50MTZCRSh0NCAqIHMyKTsKICAgICAgfQogICAgICBpZiAocjIpIHsKICAgICAgICBsZXQgaTMgPSAtMTsKICAgICAgICBmb3IgKG8yID0gbjI7bzIgPCBhMjsgbzIrKykKICAgICAgICAgIGlmIChsMihlMiwgbzIpID09PSBsMih0MywgaTMgPT09IC0xID8gMCA6IG8yIC0gaTMpKSB7CiAgICAgICAgICAgIGlmIChpMyA9PT0gLTEgJiYgKGkzID0gbzIpLCBvMiAtIGkzICsgMSA9PT0gQTIpCiAgICAgICAgICAgICAgcmV0dXJuIGkzICogczI7CiAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgaTMgIT09IC0xICYmIChvMiAtPSBvMiAtIGkzKSwgaTMgPSAtMTsKICAgICAgfSBlbHNlCiAgICAgICAgZm9yIChuMiArIEEyID4gYTIgJiYgKG4yID0gYTIgLSBBMiksIG8yID0gbjI7bzIgPj0gMDsgbzItLSkgewogICAgICAgICAgbGV0IG4zID0gdHJ1ZTsKICAgICAgICAgIGZvciAobGV0IGkzID0gMDtpMyA8IEEyOyBpMysrKQogICAgICAgICAgICBpZiAobDIoZTIsIG8yICsgaTMpICE9PSBsMih0MywgaTMpKSB7CiAgICAgICAgICAgICAgbjMgPSBmYWxzZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgaWYgKG4zKQogICAgICAgICAgICByZXR1cm4gbzI7CiAgICAgICAgfQogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBmdW5jdGlvbiB2KGUyLCB0MywgbjIsIGkyKSB7CiAgICAgIG4yID0gTnVtYmVyKG4yKSB8fCAwOwogICAgICBjb25zdCByMiA9IGUyLmxlbmd0aCAtIG4yOwogICAgICBpMiA/IChpMiA9IE51bWJlcihpMikpID4gcjIgJiYgKGkyID0gcjIpIDogaTIgPSByMjsKICAgICAgY29uc3QgbzIgPSB0My5sZW5ndGg7CiAgICAgIGxldCBzMjsKICAgICAgZm9yIChpMiA+IG8yIC8gMiAmJiAoaTIgPSBvMiAvIDIpLCBzMiA9IDA7czIgPCBpMjsgKytzMikgewogICAgICAgIGNvbnN0IGkzID0gcGFyc2VJbnQodDMuc3Vic3RyKDIgKiBzMiwgMiksIDE2KTsKICAgICAgICBpZiAoSihpMykpCiAgICAgICAgICByZXR1cm4gczI7CiAgICAgICAgZTJbbjIgKyBzMl0gPSBpMzsKICAgICAgfQogICAgICByZXR1cm4gczI7CiAgICB9CiAgICBmdW5jdGlvbiBCKGUyLCB0MywgbjIsIGkyKSB7CiAgICAgIHJldHVybiBLKHoodDMsIGUyLmxlbmd0aCAtIG4yKSwgZTIsIG4yLCBpMik7CiAgICB9CiAgICBmdW5jdGlvbiBiKGUyLCB0MywgbjIsIGkyKSB7CiAgICAgIHJldHVybiBLKGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgY29uc3QgdDQgPSBbXTsKICAgICAgICBmb3IgKGxldCBuMyA9IDA7bjMgPCBlMy5sZW5ndGg7ICsrbjMpCiAgICAgICAgICB0NC5wdXNoKDI1NSAmIGUzLmNoYXJDb2RlQXQobjMpKTsKICAgICAgICByZXR1cm4gdDQ7CiAgICAgIH0odDMpLCBlMiwgbjIsIGkyKTsKICAgIH0KICAgIGZ1bmN0aW9uIHkoZTIsIHQzLCBuMiwgaTIpIHsKICAgICAgcmV0dXJuIEsoWSh0MyksIGUyLCBuMiwgaTIpOwogICAgfQogICAgZnVuY3Rpb24gSShlMiwgdDMsIG4yLCBpMikgewogICAgICByZXR1cm4gSyhmdW5jdGlvbihlMywgdDQpIHsKICAgICAgICBsZXQgbjMsIGkzLCByMjsKICAgICAgICBjb25zdCBvMiA9IFtdOwogICAgICAgIGZvciAobGV0IHMyID0gMDtzMiA8IGUzLmxlbmd0aCAmJiAhKCh0NCAtPSAyKSA8IDApOyArK3MyKQogICAgICAgICAgbjMgPSBlMy5jaGFyQ29kZUF0KHMyKSwgaTMgPSBuMyA+PiA4LCByMiA9IG4zICUgMjU2LCBvMi5wdXNoKHIyKSwgbzIucHVzaChpMyk7CiAgICAgICAgcmV0dXJuIG8yOwogICAgICB9KHQzLCBlMi5sZW5ndGggLSBuMiksIGUyLCBuMiwgaTIpOwogICAgfQogICAgZnVuY3Rpb24gdyhlMiwgdDMsIG4yKSB7CiAgICAgIHJldHVybiB0MyA9PT0gMCAmJiBuMiA9PT0gZTIubGVuZ3RoID8gaS5mcm9tQnl0ZUFycmF5KGUyKSA6IGkuZnJvbUJ5dGVBcnJheShlMi5zbGljZSh0MywgbjIpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHgoZTIsIHQzLCBuMikgewogICAgICBuMiA9IE1hdGgubWluKGUyLmxlbmd0aCwgbjIpOwogICAgICBjb25zdCBpMiA9IFtdOwogICAgICBsZXQgcjIgPSB0MzsKICAgICAgZm9yICg7cjIgPCBuMjsgKSB7CiAgICAgICAgY29uc3QgdDQgPSBlMltyMl07CiAgICAgICAgbGV0IG8yID0gbnVsbCwgczIgPSB0NCA+IDIzOSA/IDQgOiB0NCA+IDIyMyA/IDMgOiB0NCA+IDE5MSA/IDIgOiAxOwogICAgICAgIGlmIChyMiArIHMyIDw9IG4yKSB7CiAgICAgICAgICBsZXQgbjMsIGkzLCBhMiwgQTI7CiAgICAgICAgICBzd2l0Y2ggKHMyKSB7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICB0NCA8IDEyOCAmJiAobzIgPSB0NCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICBuMyA9IGUyW3IyICsgMV0sICgxOTIgJiBuMykgPT0gMTI4ICYmIChBMiA9ICgzMSAmIHQ0KSA8PCA2IHwgNjMgJiBuMywgQTIgPiAxMjcgJiYgKG8yID0gQTIpKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgIG4zID0gZTJbcjIgKyAxXSwgaTMgPSBlMltyMiArIDJdLCAoMTkyICYgbjMpID09IDEyOCAmJiAoMTkyICYgaTMpID09IDEyOCAmJiAoQTIgPSAoMTUgJiB0NCkgPDwgMTIgfCAoNjMgJiBuMykgPDwgNiB8IDYzICYgaTMsIEEyID4gMjA0NyAmJiAoQTIgPCA1NTI5NiB8fCBBMiA+IDU3MzQzKSAmJiAobzIgPSBBMikpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgbjMgPSBlMltyMiArIDFdLCBpMyA9IGUyW3IyICsgMl0sIGEyID0gZTJbcjIgKyAzXSwgKDE5MiAmIG4zKSA9PSAxMjggJiYgKDE5MiAmIGkzKSA9PSAxMjggJiYgKDE5MiAmIGEyKSA9PSAxMjggJiYgKEEyID0gKDE1ICYgdDQpIDw8IDE4IHwgKDYzICYgbjMpIDw8IDEyIHwgKDYzICYgaTMpIDw8IDYgfCA2MyAmIGEyLCBBMiA+IDY1NTM1ICYmIEEyIDwgMTExNDExMiAmJiAobzIgPSBBMikpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvMiA9PT0gbnVsbCA/IChvMiA9IDY1NTMzLCBzMiA9IDEpIDogbzIgPiA2NTUzNSAmJiAobzIgLT0gNjU1MzYsIGkyLnB1c2gobzIgPj4+IDEwICYgMTAyMyB8IDU1Mjk2KSwgbzIgPSA1NjMyMCB8IDEwMjMgJiBvMiksIGkyLnB1c2gobzIpLCByMiArPSBzMjsKICAgICAgfQogICAgICByZXR1cm4gZnVuY3Rpb24oZTMpIHsKICAgICAgICBjb25zdCB0NCA9IGUzLmxlbmd0aDsKICAgICAgICBpZiAodDQgPD0gUSkKICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgZTMpOwogICAgICAgIGxldCBuMyA9ICIiLCBpMyA9IDA7CiAgICAgICAgZm9yICg7aTMgPCB0NDsgKQogICAgICAgICAgbjMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGUzLnNsaWNlKGkzLCBpMyArPSBRKSk7CiAgICAgICAgcmV0dXJuIG4zOwogICAgICB9KGkyKTsKICAgIH0KICAgIEEuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGZ1bmN0aW9uKCkgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IGUyID0gbmV3IFVpbnQ4QXJyYXkoMSksIHQzID0geyBmb286IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIDQyOwogICAgICAgIH0gfTsKICAgICAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKHQzLCBVaW50OEFycmF5LnByb3RvdHlwZSksIE9iamVjdC5zZXRQcm90b3R5cGVPZihlMiwgdDMpLCBlMi5mb28oKSA9PT0gNDI7CiAgICAgIH0gY2F0Y2ggKGUyKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9KCksIEEuVFlQRURfQVJSQVlfU1VQUE9SVCB8fCB0eXBlb2YgY29uc29sZSA9PSAidW5kZWZpbmVkIiB8fCB0eXBlb2YgY29uc29sZS5lcnJvciAhPSAiZnVuY3Rpb24iIHx8IGNvbnNvbGUuZXJyb3IoIlRoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSBgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LiIpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoQS5wcm90b3R5cGUsICJwYXJlbnQiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIGlmIChBLmlzQnVmZmVyKHRoaXMpKQogICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlcjsKICAgIH0gfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLnByb3RvdHlwZSwgIm9mZnNldCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKEEuaXNCdWZmZXIodGhpcykpCiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldDsKICAgIH0gfSksIEEucG9vbFNpemUgPSA4MTkyLCBBLmZyb20gPSBmdW5jdGlvbihlMiwgdDMsIG4yKSB7CiAgICAgIHJldHVybiBsKGUyLCB0MywgbjIpOwogICAgfSwgT2JqZWN0LnNldFByb3RvdHlwZU9mKEEucHJvdG90eXBlLCBVaW50OEFycmF5LnByb3RvdHlwZSksIE9iamVjdC5zZXRQcm90b3R5cGVPZihBLCBVaW50OEFycmF5KSwgQS5hbGxvYyA9IGZ1bmN0aW9uKGUyLCB0MywgbjIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUzLCB0NCwgbjMpIHsKICAgICAgICByZXR1cm4gYyhlMyksIGUzIDw9IDAgPyBhKGUzKSA6IHQ0ICE9PSB1bmRlZmluZWQgPyB0eXBlb2YgbjMgPT0gInN0cmluZyIgPyBhKGUzKS5maWxsKHQ0LCBuMykgOiBhKGUzKS5maWxsKHQ0KSA6IGEoZTMpOwogICAgICB9KGUyLCB0MywgbjIpOwogICAgfSwgQS5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uKGUyKSB7CiAgICAgIHJldHVybiBoKGUyKTsKICAgIH0sIEEuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24oZTIpIHsKICAgICAgcmV0dXJuIGgoZTIpOwogICAgfSwgQS5pc0J1ZmZlciA9IGZ1bmN0aW9uKGUyKSB7CiAgICAgIHJldHVybiBlMiAhPSBudWxsICYmIGUyLl9pc0J1ZmZlciA9PT0gdHJ1ZSAmJiBlMiAhPT0gQS5wcm90b3R5cGU7CiAgICB9LCBBLmNvbXBhcmUgPSBmdW5jdGlvbihlMiwgdDMpIHsKICAgICAgaWYgKFcoZTIsIFVpbnQ4QXJyYXkpICYmIChlMiA9IEEuZnJvbShlMiwgZTIub2Zmc2V0LCBlMi5ieXRlTGVuZ3RoKSksIFcodDMsIFVpbnQ4QXJyYXkpICYmICh0MyA9IEEuZnJvbSh0MywgdDMub2Zmc2V0LCB0My5ieXRlTGVuZ3RoKSksICFBLmlzQnVmZmVyKGUyKSB8fCAhQS5pc0J1ZmZlcih0MykpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJidWYxIiwgImJ1ZjIiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5Jyk7CiAgICAgIGlmIChlMiA9PT0gdDMpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGxldCBuMiA9IGUyLmxlbmd0aCwgaTIgPSB0My5sZW5ndGg7CiAgICAgIGZvciAobGV0IHIyID0gMCwgbzIgPSBNYXRoLm1pbihuMiwgaTIpO3IyIDwgbzI7ICsrcjIpCiAgICAgICAgaWYgKGUyW3IyXSAhPT0gdDNbcjJdKSB7CiAgICAgICAgICBuMiA9IGUyW3IyXSwgaTIgPSB0M1tyMl07CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIHJldHVybiBuMiA8IGkyID8gLTEgOiBpMiA8IG4yID8gMSA6IDA7CiAgICB9LCBBLmlzRW5jb2RpbmcgPSBmdW5jdGlvbihlMikgewogICAgICBzd2l0Y2ggKFN0cmluZyhlMikudG9Mb3dlckNhc2UoKSkgewogICAgICAgIGNhc2UgImhleCI6CiAgICAgICAgY2FzZSAidXRmOCI6CiAgICAgICAgY2FzZSAidXRmLTgiOgogICAgICAgIGNhc2UgImFzY2lpIjoKICAgICAgICBjYXNlICJsYXRpbjEiOgogICAgICAgIGNhc2UgImJpbmFyeSI6CiAgICAgICAgY2FzZSAiYmFzZTY0IjoKICAgICAgICBjYXNlICJ1Y3MyIjoKICAgICAgICBjYXNlICJ1Y3MtMiI6CiAgICAgICAgY2FzZSAidXRmMTZsZSI6CiAgICAgICAgY2FzZSAidXRmLTE2bGUiOgogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSwgQS5jb25jYXQgPSBmdW5jdGlvbihlMiwgdDMpIHsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGUyKSkKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7CiAgICAgIGlmIChlMi5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIEEuYWxsb2MoMCk7CiAgICAgIGxldCBuMjsKICAgICAgaWYgKHQzID09PSB1bmRlZmluZWQpCiAgICAgICAgZm9yICh0MyA9IDAsIG4yID0gMDtuMiA8IGUyLmxlbmd0aDsgKytuMikKICAgICAgICAgIHQzICs9IGUyW24yXS5sZW5ndGg7CiAgICAgIGNvbnN0IGkyID0gQS5hbGxvY1Vuc2FmZSh0Myk7CiAgICAgIGxldCByMiA9IDA7CiAgICAgIGZvciAobjIgPSAwO24yIDwgZTIubGVuZ3RoOyArK24yKSB7CiAgICAgICAgbGV0IHQ0ID0gZTJbbjJdOwogICAgICAgIGlmIChXKHQ0LCBVaW50OEFycmF5KSkKICAgICAgICAgIHIyICsgdDQubGVuZ3RoID4gaTIubGVuZ3RoID8gKEEuaXNCdWZmZXIodDQpIHx8ICh0NCA9IEEuZnJvbSh0NCkpLCB0NC5jb3B5KGkyLCByMikpIDogVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoaTIsIHQ0LCByMik7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBpZiAoIUEuaXNCdWZmZXIodDQpKQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7CiAgICAgICAgICB0NC5jb3B5KGkyLCByMik7CiAgICAgICAgfQogICAgICAgIHIyICs9IHQ0Lmxlbmd0aDsKICAgICAgfQogICAgICByZXR1cm4gaTI7CiAgICB9LCBBLmJ5dGVMZW5ndGggPSBwLCBBLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlLCBBLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbigpIHsKICAgICAgY29uc3QgZTIgPSB0aGlzLmxlbmd0aDsKICAgICAgaWYgKGUyICUgMiAhPSAwKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpOwogICAgICBmb3IgKGxldCB0MyA9IDA7dDMgPCBlMjsgdDMgKz0gMikKICAgICAgICBtKHRoaXMsIHQzLCB0MyArIDEpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0sIEEucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uKCkgewogICAgICBjb25zdCBlMiA9IHRoaXMubGVuZ3RoOwogICAgICBpZiAoZTIgJSA0ICE9IDApCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7CiAgICAgIGZvciAobGV0IHQzID0gMDt0MyA8IGUyOyB0MyArPSA0KQogICAgICAgIG0odGhpcywgdDMsIHQzICsgMyksIG0odGhpcywgdDMgKyAxLCB0MyArIDIpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0sIEEucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uKCkgewogICAgICBjb25zdCBlMiA9IHRoaXMubGVuZ3RoOwogICAgICBpZiAoZTIgJSA4ICE9IDApCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7CiAgICAgIGZvciAobGV0IHQzID0gMDt0MyA8IGUyOyB0MyArPSA4KQogICAgICAgIG0odGhpcywgdDMsIHQzICsgNyksIG0odGhpcywgdDMgKyAxLCB0MyArIDYpLCBtKHRoaXMsIHQzICsgMiwgdDMgKyA1KSwgbSh0aGlzLCB0MyArIDMsIHQzICsgNCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSwgQS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgY29uc3QgZTIgPSB0aGlzLmxlbmd0aDsKICAgICAgcmV0dXJuIGUyID09PSAwID8gIiIgOiBhcmd1bWVudHMubGVuZ3RoID09PSAwID8geCh0aGlzLCAwLCBlMikgOiBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9LCBBLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZyA9IEEucHJvdG90eXBlLnRvU3RyaW5nLCBBLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihlMikgewogICAgICBpZiAoIUEuaXNCdWZmZXIoZTIpKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTsKICAgICAgcmV0dXJuIHRoaXMgPT09IGUyIHx8IEEuY29tcGFyZSh0aGlzLCBlMikgPT09IDA7CiAgICB9LCBBLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24oKSB7CiAgICAgIGxldCBlMiA9ICIiOwogICAgICBjb25zdCBuMiA9IHQyLklTOwogICAgICByZXR1cm4gZTIgPSB0aGlzLnRvU3RyaW5nKCJoZXgiLCAwLCBuMikucmVwbGFjZSgvKC57Mn0pL2csICIkMSAiKS50cmltKCksIHRoaXMubGVuZ3RoID4gbjIgJiYgKGUyICs9ICIgLi4uICIpLCAiPEJ1ZmZlciAiICsgZTIgKyAiPiI7CiAgICB9LCBvICYmIChBLnByb3RvdHlwZVtvXSA9IEEucHJvdG90eXBlLmluc3BlY3QpLCBBLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24oZTIsIHQzLCBuMiwgaTIsIHIyKSB7CiAgICAgIGlmIChXKGUyLCBVaW50OEFycmF5KSAmJiAoZTIgPSBBLmZyb20oZTIsIGUyLm9mZnNldCwgZTIuYnl0ZUxlbmd0aCkpLCAhQS5pc0J1ZmZlcihlMikpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJ0YXJnZXQiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXkuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBlMik7CiAgICAgIGlmICh0MyA9PT0gdW5kZWZpbmVkICYmICh0MyA9IDApLCBuMiA9PT0gdW5kZWZpbmVkICYmIChuMiA9IGUyID8gZTIubGVuZ3RoIDogMCksIGkyID09PSB1bmRlZmluZWQgJiYgKGkyID0gMCksIHIyID09PSB1bmRlZmluZWQgJiYgKHIyID0gdGhpcy5sZW5ndGgpLCB0MyA8IDAgfHwgbjIgPiBlMi5sZW5ndGggfHwgaTIgPCAwIHx8IHIyID4gdGhpcy5sZW5ndGgpCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpOwogICAgICBpZiAoaTIgPj0gcjIgJiYgdDMgPj0gbjIpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGlmIChpMiA+PSByMikKICAgICAgICByZXR1cm4gLTE7CiAgICAgIGlmICh0MyA+PSBuMikKICAgICAgICByZXR1cm4gMTsKICAgICAgaWYgKHRoaXMgPT09IGUyKQogICAgICAgIHJldHVybiAwOwogICAgICBsZXQgbzIgPSAocjIgPj4+PSAwKSAtIChpMiA+Pj49IDApLCBzMiA9IChuMiA+Pj49IDApIC0gKHQzID4+Pj0gMCk7CiAgICAgIGNvbnN0IGEyID0gTWF0aC5taW4obzIsIHMyKSwgbDIgPSB0aGlzLnNsaWNlKGkyLCByMiksIGMyID0gZTIuc2xpY2UodDMsIG4yKTsKICAgICAgZm9yIChsZXQgZTMgPSAwO2UzIDwgYTI7ICsrZTMpCiAgICAgICAgaWYgKGwyW2UzXSAhPT0gYzJbZTNdKSB7CiAgICAgICAgICBvMiA9IGwyW2UzXSwgczIgPSBjMltlM107CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIHJldHVybiBvMiA8IHMyID8gLTEgOiBzMiA8IG8yID8gMSA6IDA7CiAgICB9LCBBLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uKGUyLCB0MywgbjIpIHsKICAgICAgcmV0dXJuIHRoaXMuaW5kZXhPZihlMiwgdDMsIG4yKSAhPT0gLTE7CiAgICB9LCBBLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24oZTIsIHQzLCBuMikgewogICAgICByZXR1cm4gRSh0aGlzLCBlMiwgdDMsIG4yLCB0cnVlKTsKICAgIH0sIEEucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24oZTIsIHQzLCBuMikgewogICAgICByZXR1cm4gRSh0aGlzLCBlMiwgdDMsIG4yLCBmYWxzZSk7CiAgICB9LCBBLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGUyLCB0MywgbjIsIGkyKSB7CiAgICAgIGlmICh0MyA9PT0gdW5kZWZpbmVkKQogICAgICAgIGkyID0gInV0ZjgiLCBuMiA9IHRoaXMubGVuZ3RoLCB0MyA9IDA7CiAgICAgIGVsc2UgaWYgKG4yID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHQzID09ICJzdHJpbmciKQogICAgICAgIGkyID0gdDMsIG4yID0gdGhpcy5sZW5ndGgsIHQzID0gMDsKICAgICAgZWxzZSB7CiAgICAgICAgaWYgKCFpc0Zpbml0ZSh0MykpCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7CiAgICAgICAgdDMgPj4+PSAwLCBpc0Zpbml0ZShuMikgPyAobjIgPj4+PSAwLCBpMiA9PT0gdW5kZWZpbmVkICYmIChpMiA9ICJ1dGY4IikpIDogKGkyID0gbjIsIG4yID0gdW5kZWZpbmVkKTsKICAgICAgfQogICAgICBjb25zdCByMiA9IHRoaXMubGVuZ3RoIC0gdDM7CiAgICAgIGlmICgobjIgPT09IHVuZGVmaW5lZCB8fCBuMiA+IHIyKSAmJiAobjIgPSByMiksIGUyLmxlbmd0aCA+IDAgJiYgKG4yIDwgMCB8fCB0MyA8IDApIHx8IHQzID4gdGhpcy5sZW5ndGgpCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7CiAgICAgIGkyIHx8IChpMiA9ICJ1dGY4Iik7CiAgICAgIGxldCBvMiA9IGZhbHNlOwogICAgICBmb3IgKDs7ICkKICAgICAgICBzd2l0Y2ggKGkyKSB7CiAgICAgICAgICBjYXNlICJoZXgiOgogICAgICAgICAgICByZXR1cm4gdih0aGlzLCBlMiwgdDMsIG4yKTsKICAgICAgICAgIGNhc2UgInV0ZjgiOgogICAgICAgICAgY2FzZSAidXRmLTgiOgogICAgICAgICAgICByZXR1cm4gQih0aGlzLCBlMiwgdDMsIG4yKTsKICAgICAgICAgIGNhc2UgImFzY2lpIjoKICAgICAgICAgIGNhc2UgImxhdGluMSI6CiAgICAgICAgICBjYXNlICJiaW5hcnkiOgogICAgICAgICAgICByZXR1cm4gYih0aGlzLCBlMiwgdDMsIG4yKTsKICAgICAgICAgIGNhc2UgImJhc2U2NCI6CiAgICAgICAgICAgIHJldHVybiB5KHRoaXMsIGUyLCB0MywgbjIpOwogICAgICAgICAgY2FzZSAidWNzMiI6CiAgICAgICAgICBjYXNlICJ1Y3MtMiI6CiAgICAgICAgICBjYXNlICJ1dGYxNmxlIjoKICAgICAgICAgIGNhc2UgInV0Zi0xNmxlIjoKICAgICAgICAgICAgcmV0dXJuIEkodGhpcywgZTIsIHQzLCBuMik7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpZiAobzIpCiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIiArIGkyKTsKICAgICAgICAgICAgaTIgPSAoIiIgKyBpMikudG9Mb3dlckNhc2UoKSwgbzIgPSB0cnVlOwogICAgICAgIH0KICAgIH0sIEEucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4geyB0eXBlOiAiQnVmZmVyIiwgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApIH07CiAgICB9OwogICAgY29uc3QgUSA9IDQwOTY7CiAgICBmdW5jdGlvbiBMKGUyLCB0MywgbjIpIHsKICAgICAgbGV0IGkyID0gIiI7CiAgICAgIG4yID0gTWF0aC5taW4oZTIubGVuZ3RoLCBuMik7CiAgICAgIGZvciAobGV0IHIyID0gdDM7cjIgPCBuMjsgKytyMikKICAgICAgICBpMiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyAmIGUyW3IyXSk7CiAgICAgIHJldHVybiBpMjsKICAgIH0KICAgIGZ1bmN0aW9uIE0oZTIsIHQzLCBuMikgewogICAgICBsZXQgaTIgPSAiIjsKICAgICAgbjIgPSBNYXRoLm1pbihlMi5sZW5ndGgsIG4yKTsKICAgICAgZm9yIChsZXQgcjIgPSB0MztyMiA8IG4yOyArK3IyKQogICAgICAgIGkyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZTJbcjJdKTsKICAgICAgcmV0dXJuIGkyOwogICAgfQogICAgZnVuY3Rpb24gUyhlMiwgdDMsIG4yKSB7CiAgICAgIGNvbnN0IGkyID0gZTIubGVuZ3RoOwogICAgICAoIXQzIHx8IHQzIDwgMCkgJiYgKHQzID0gMCksICghbjIgfHwgbjIgPCAwIHx8IG4yID4gaTIpICYmIChuMiA9IGkyKTsKICAgICAgbGV0IHIyID0gIiI7CiAgICAgIGZvciAobGV0IGkzID0gdDM7aTMgPCBuMjsgKytpMykKICAgICAgICByMiArPSBYW2UyW2kzXV07CiAgICAgIHJldHVybiByMjsKICAgIH0KICAgIGZ1bmN0aW9uIEQoZTIsIHQzLCBuMikgewogICAgICBjb25zdCBpMiA9IGUyLnNsaWNlKHQzLCBuMik7CiAgICAgIGxldCByMiA9ICIiOwogICAgICBmb3IgKGxldCBlMyA9IDA7ZTMgPCBpMi5sZW5ndGggLSAxOyBlMyArPSAyKQogICAgICAgIHIyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoaTJbZTNdICsgMjU2ICogaTJbZTMgKyAxXSk7CiAgICAgIHJldHVybiByMjsKICAgIH0KICAgIGZ1bmN0aW9uIGsoZTIsIHQzLCBuMikgewogICAgICBpZiAoZTIgJSAxICE9IDAgfHwgZTIgPCAwKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTsKICAgICAgaWYgKGUyICsgdDMgPiBuMikKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpOwogICAgfQogICAgZnVuY3Rpb24gVChlMiwgdDMsIG4yLCBpMiwgcjIsIG8yKSB7CiAgICAgIGlmICghQS5pc0J1ZmZlcihlMikpCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpOwogICAgICBpZiAodDMgPiByMiB8fCB0MyA8IG8yKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTsKICAgICAgaWYgKG4yICsgaTIgPiBlMi5sZW5ndGgpCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpOwogICAgfQogICAgZnVuY3Rpb24gUihlMiwgdDMsIG4yLCBpMiwgcjIpIHsKICAgICAgXyh0MywgaTIsIHIyLCBlMiwgbjIsIDcpOwogICAgICBsZXQgbzIgPSBOdW1iZXIodDMgJiBCaWdJbnQoNDI5NDk2NzI5NSkpOwogICAgICBlMltuMisrXSA9IG8yLCBvMiA+Pj0gOCwgZTJbbjIrK10gPSBvMiwgbzIgPj49IDgsIGUyW24yKytdID0gbzIsIG8yID4+PSA4LCBlMltuMisrXSA9IG8yOwogICAgICBsZXQgczIgPSBOdW1iZXIodDMgPj4gQmlnSW50KDMyKSAmIEJpZ0ludCg0Mjk0OTY3Mjk1KSk7CiAgICAgIHJldHVybiBlMltuMisrXSA9IHMyLCBzMiA+Pj0gOCwgZTJbbjIrK10gPSBzMiwgczIgPj49IDgsIGUyW24yKytdID0gczIsIHMyID4+PSA4LCBlMltuMisrXSA9IHMyLCBuMjsKICAgIH0KICAgIGZ1bmN0aW9uIEYoZTIsIHQzLCBuMiwgaTIsIHIyKSB7CiAgICAgIF8odDMsIGkyLCByMiwgZTIsIG4yLCA3KTsKICAgICAgbGV0IG8yID0gTnVtYmVyKHQzICYgQmlnSW50KDQyOTQ5NjcyOTUpKTsKICAgICAgZTJbbjIgKyA3XSA9IG8yLCBvMiA+Pj0gOCwgZTJbbjIgKyA2XSA9IG8yLCBvMiA+Pj0gOCwgZTJbbjIgKyA1XSA9IG8yLCBvMiA+Pj0gOCwgZTJbbjIgKyA0XSA9IG8yOwogICAgICBsZXQgczIgPSBOdW1iZXIodDMgPj4gQmlnSW50KDMyKSAmIEJpZ0ludCg0Mjk0OTY3Mjk1KSk7CiAgICAgIHJldHVybiBlMltuMiArIDNdID0gczIsIHMyID4+PSA4LCBlMltuMiArIDJdID0gczIsIHMyID4+PSA4LCBlMltuMiArIDFdID0gczIsIHMyID4+PSA4LCBlMltuMl0gPSBzMiwgbjIgKyA4OwogICAgfQogICAgZnVuY3Rpb24gVShlMiwgdDMsIG4yLCBpMiwgcjIsIG8yKSB7CiAgICAgIGlmIChuMiArIGkyID4gZTIubGVuZ3RoKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTsKICAgICAgaWYgKG4yIDwgMCkKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7CiAgICB9CiAgICBmdW5jdGlvbiBPKGUyLCB0MywgbjIsIGkyLCBvMikgewogICAgICByZXR1cm4gdDMgPSArdDMsIG4yID4+Pj0gMCwgbzIgfHwgVShlMiwgMCwgbjIsIDQpLCByLndyaXRlKGUyLCB0MywgbjIsIGkyLCAyMywgNCksIG4yICsgNDsKICAgIH0KICAgIGZ1bmN0aW9uIFAoZTIsIHQzLCBuMiwgaTIsIG8yKSB7CiAgICAgIHJldHVybiB0MyA9ICt0MywgbjIgPj4+PSAwLCBvMiB8fCBVKGUyLCAwLCBuMiwgOCksIHIud3JpdGUoZTIsIHQzLCBuMiwgaTIsIDUyLCA4KSwgbjIgKyA4OwogICAgfQogICAgQS5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbihlMiwgdDMpIHsKICAgICAgY29uc3QgbjIgPSB0aGlzLmxlbmd0aDsKICAgICAgKGUyID0gfn5lMikgPCAwID8gKGUyICs9IG4yKSA8IDAgJiYgKGUyID0gMCkgOiBlMiA+IG4yICYmIChlMiA9IG4yKSwgKHQzID0gdDMgPT09IHVuZGVmaW5lZCA/IG4yIDogfn50MykgPCAwID8gKHQzICs9IG4yKSA8IDAgJiYgKHQzID0gMCkgOiB0MyA+IG4yICYmICh0MyA9IG4yKSwgdDMgPCBlMiAmJiAodDMgPSBlMik7CiAgICAgIGNvbnN0IGkyID0gdGhpcy5zdWJhcnJheShlMiwgdDMpOwogICAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKGkyLCBBLnByb3RvdHlwZSksIGkyOwogICAgfSwgQS5wcm90b3R5cGUucmVhZFVpbnRMRSA9IEEucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbihlMiwgdDMsIG4yKSB7CiAgICAgIGUyID4+Pj0gMCwgdDMgPj4+PSAwLCBuMiB8fCBrKGUyLCB0MywgdGhpcy5sZW5ndGgpOwogICAgICBsZXQgaTIgPSB0aGlzW2UyXSwgcjIgPSAxLCBvMiA9IDA7CiAgICAgIGZvciAoOysrbzIgPCB0MyAmJiAocjIgKj0gMjU2KTsgKQogICAgICAgIGkyICs9IHRoaXNbZTIgKyBvMl0gKiByMjsKICAgICAgcmV0dXJuIGkyOwogICAgfSwgQS5wcm90b3R5cGUucmVhZFVpbnRCRSA9IEEucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbihlMiwgdDMsIG4yKSB7CiAgICAgIGUyID4+Pj0gMCwgdDMgPj4+PSAwLCBuMiB8fCBrKGUyLCB0MywgdGhpcy5sZW5ndGgpOwogICAgICBsZXQgaTIgPSB0aGlzW2UyICsgLS10M10sIHIyID0gMTsKICAgICAgZm9yICg7dDMgPiAwICYmIChyMiAqPSAyNTYpOyApCiAgICAgICAgaTIgKz0gdGhpc1tlMiArIC0tdDNdICogcjI7CiAgICAgIHJldHVybiBpMjsKICAgIH0sIEEucHJvdG90eXBlLnJlYWRVaW50OCA9IEEucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uKGUyLCB0MykgewogICAgICByZXR1cm4gZTIgPj4+PSAwLCB0MyB8fCBrKGUyLCAxLCB0aGlzLmxlbmd0aCksIHRoaXNbZTJdOwogICAgfSwgQS5wcm90b3R5cGUucmVhZFVpbnQxNkxFID0gQS5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24oZTIsIHQzKSB7CiAgICAgIHJldHVybiBlMiA+Pj49IDAsIHQzIHx8IGsoZTIsIDIsIHRoaXMubGVuZ3RoKSwgdGhpc1tlMl0gfCB0aGlzW2UyICsgMV0gPDwgODsKICAgIH0sIEEucHJvdG90eXBlLnJlYWRVaW50MTZCRSA9IEEucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uKGUyLCB0MykgewogICAgICByZXR1cm4gZTIgPj4+PSAwLCB0MyB8fCBrKGUyLCAyLCB0aGlzLmxlbmd0aCksIHRoaXNbZTJdIDw8IDggfCB0aGlzW2UyICsgMV07CiAgICB9LCBBLnByb3RvdHlwZS5yZWFkVWludDMyTEUgPSBBLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbihlMiwgdDMpIHsKICAgICAgcmV0dXJuIGUyID4+Pj0gMCwgdDMgfHwgayhlMiwgNCwgdGhpcy5sZW5ndGgpLCAodGhpc1tlMl0gfCB0aGlzW2UyICsgMV0gPDwgOCB8IHRoaXNbZTIgKyAyXSA8PCAxNikgKyAxNjc3NzIxNiAqIHRoaXNbZTIgKyAzXTsKICAgIH0sIEEucHJvdG90eXBlLnJlYWRVaW50MzJCRSA9IEEucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uKGUyLCB0MykgewogICAgICByZXR1cm4gZTIgPj4+PSAwLCB0MyB8fCBrKGUyLCA0LCB0aGlzLmxlbmd0aCksIDE2Nzc3MjE2ICogdGhpc1tlMl0gKyAodGhpc1tlMiArIDFdIDw8IDE2IHwgdGhpc1tlMiArIDJdIDw8IDggfCB0aGlzW2UyICsgM10pOwogICAgfSwgQS5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NExFID0gWihmdW5jdGlvbihlMikgewogICAgICBIKGUyID4+Pj0gMCwgIm9mZnNldCIpOwogICAgICBjb25zdCB0MyA9IHRoaXNbZTJdLCBuMiA9IHRoaXNbZTIgKyA3XTsKICAgICAgdDMgIT09IHVuZGVmaW5lZCAmJiBuMiAhPT0gdW5kZWZpbmVkIHx8IHEoZTIsIHRoaXMubGVuZ3RoIC0gOCk7CiAgICAgIGNvbnN0IGkyID0gdDMgKyAyNTYgKiB0aGlzWysrZTJdICsgNjU1MzYgKiB0aGlzWysrZTJdICsgdGhpc1srK2UyXSAqIDIgKiogMjQsIHIyID0gdGhpc1srK2UyXSArIDI1NiAqIHRoaXNbKytlMl0gKyA2NTUzNiAqIHRoaXNbKytlMl0gKyBuMiAqIDIgKiogMjQ7CiAgICAgIHJldHVybiBCaWdJbnQoaTIpICsgKEJpZ0ludChyMikgPDwgQmlnSW50KDMyKSk7CiAgICB9KSwgQS5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NEJFID0gWihmdW5jdGlvbihlMikgewogICAgICBIKGUyID4+Pj0gMCwgIm9mZnNldCIpOwogICAgICBjb25zdCB0MyA9IHRoaXNbZTJdLCBuMiA9IHRoaXNbZTIgKyA3XTsKICAgICAgdDMgIT09IHVuZGVmaW5lZCAmJiBuMiAhPT0gdW5kZWZpbmVkIHx8IHEoZTIsIHRoaXMubGVuZ3RoIC0gOCk7CiAgICAgIGNvbnN0IGkyID0gdDMgKiAyICoqIDI0ICsgNjU1MzYgKiB0aGlzWysrZTJdICsgMjU2ICogdGhpc1srK2UyXSArIHRoaXNbKytlMl0sIHIyID0gdGhpc1srK2UyXSAqIDIgKiogMjQgKyA2NTUzNiAqIHRoaXNbKytlMl0gKyAyNTYgKiB0aGlzWysrZTJdICsgbjI7CiAgICAgIHJldHVybiAoQmlnSW50KGkyKSA8PCBCaWdJbnQoMzIpKSArIEJpZ0ludChyMik7CiAgICB9KSwgQS5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24oZTIsIHQzLCBuMikgewogICAgICBlMiA+Pj49IDAsIHQzID4+Pj0gMCwgbjIgfHwgayhlMiwgdDMsIHRoaXMubGVuZ3RoKTsKICAgICAgbGV0IGkyID0gdGhpc1tlMl0sIHIyID0gMSwgbzIgPSAwOwogICAgICBmb3IgKDsrK28yIDwgdDMgJiYgKHIyICo9IDI1Nik7ICkKICAgICAgICBpMiArPSB0aGlzW2UyICsgbzJdICogcjI7CiAgICAgIHJldHVybiByMiAqPSAxMjgsIGkyID49IHIyICYmIChpMiAtPSBNYXRoLnBvdygyLCA4ICogdDMpKSwgaTI7CiAgICB9LCBBLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbihlMiwgdDMsIG4yKSB7CiAgICAgIGUyID4+Pj0gMCwgdDMgPj4+PSAwLCBuMiB8fCBrKGUyLCB0MywgdGhpcy5sZW5ndGgpOwogICAgICBsZXQgaTIgPSB0MywgcjIgPSAxLCBvMiA9IHRoaXNbZTIgKyAtLWkyXTsKICAgICAgZm9yICg7aTIgPiAwICYmIChyMiAqPSAyNTYpOyApCiAgICAgICAgbzIgKz0gdGhpc1tlMiArIC0taTJdICogcjI7CiAgICAgIHJldHVybiByMiAqPSAxMjgsIG8yID49IHIyICYmIChvMiAtPSBNYXRoLnBvdygyLCA4ICogdDMpKSwgbzI7CiAgICB9LCBBLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uKGUyLCB0MykgewogICAgICByZXR1cm4gZTIgPj4+PSAwLCB0MyB8fCBrKGUyLCAxLCB0aGlzLmxlbmd0aCksIDEyOCAmIHRoaXNbZTJdID8gLTEgKiAoMjU1IC0gdGhpc1tlMl0gKyAxKSA6IHRoaXNbZTJdOwogICAgfSwgQS5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbihlMiwgdDMpIHsKICAgICAgZTIgPj4+PSAwLCB0MyB8fCBrKGUyLCAyLCB0aGlzLmxlbmd0aCk7CiAgICAgIGNvbnN0IG4yID0gdGhpc1tlMl0gfCB0aGlzW2UyICsgMV0gPDwgODsKICAgICAgcmV0dXJuIDMyNzY4ICYgbjIgPyA0Mjk0OTAxNzYwIHwgbjIgOiBuMjsKICAgIH0sIEEucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24oZTIsIHQzKSB7CiAgICAgIGUyID4+Pj0gMCwgdDMgfHwgayhlMiwgMiwgdGhpcy5sZW5ndGgpOwogICAgICBjb25zdCBuMiA9IHRoaXNbZTIgKyAxXSB8IHRoaXNbZTJdIDw8IDg7CiAgICAgIHJldHVybiAzMjc2OCAmIG4yID8gNDI5NDkwMTc2MCB8IG4yIDogbjI7CiAgICB9LCBBLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uKGUyLCB0MykgewogICAgICByZXR1cm4gZTIgPj4+PSAwLCB0MyB8fCBrKGUyLCA0LCB0aGlzLmxlbmd0aCksIHRoaXNbZTJdIHwgdGhpc1tlMiArIDFdIDw8IDggfCB0aGlzW2UyICsgMl0gPDwgMTYgfCB0aGlzW2UyICsgM10gPDwgMjQ7CiAgICB9LCBBLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uKGUyLCB0MykgewogICAgICByZXR1cm4gZTIgPj4+PSAwLCB0MyB8fCBrKGUyLCA0LCB0aGlzLmxlbmd0aCksIHRoaXNbZTJdIDw8IDI0IHwgdGhpc1tlMiArIDFdIDw8IDE2IHwgdGhpc1tlMiArIDJdIDw8IDggfCB0aGlzW2UyICsgM107CiAgICB9LCBBLnByb3RvdHlwZS5yZWFkQmlnSW50NjRMRSA9IFooZnVuY3Rpb24oZTIpIHsKICAgICAgSChlMiA+Pj49IDAsICJvZmZzZXQiKTsKICAgICAgY29uc3QgdDMgPSB0aGlzW2UyXSwgbjIgPSB0aGlzW2UyICsgN107CiAgICAgIHQzICE9PSB1bmRlZmluZWQgJiYgbjIgIT09IHVuZGVmaW5lZCB8fCBxKGUyLCB0aGlzLmxlbmd0aCAtIDgpOwogICAgICBjb25zdCBpMiA9IHRoaXNbZTIgKyA0XSArIDI1NiAqIHRoaXNbZTIgKyA1XSArIDY1NTM2ICogdGhpc1tlMiArIDZdICsgKG4yIDw8IDI0KTsKICAgICAgcmV0dXJuIChCaWdJbnQoaTIpIDw8IEJpZ0ludCgzMikpICsgQmlnSW50KHQzICsgMjU2ICogdGhpc1srK2UyXSArIDY1NTM2ICogdGhpc1srK2UyXSArIHRoaXNbKytlMl0gKiAyICoqIDI0KTsKICAgIH0pLCBBLnByb3RvdHlwZS5yZWFkQmlnSW50NjRCRSA9IFooZnVuY3Rpb24oZTIpIHsKICAgICAgSChlMiA+Pj49IDAsICJvZmZzZXQiKTsKICAgICAgY29uc3QgdDMgPSB0aGlzW2UyXSwgbjIgPSB0aGlzW2UyICsgN107CiAgICAgIHQzICE9PSB1bmRlZmluZWQgJiYgbjIgIT09IHVuZGVmaW5lZCB8fCBxKGUyLCB0aGlzLmxlbmd0aCAtIDgpOwogICAgICBjb25zdCBpMiA9ICh0MyA8PCAyNCkgKyA2NTUzNiAqIHRoaXNbKytlMl0gKyAyNTYgKiB0aGlzWysrZTJdICsgdGhpc1srK2UyXTsKICAgICAgcmV0dXJuIChCaWdJbnQoaTIpIDw8IEJpZ0ludCgzMikpICsgQmlnSW50KHRoaXNbKytlMl0gKiAyICoqIDI0ICsgNjU1MzYgKiB0aGlzWysrZTJdICsgMjU2ICogdGhpc1srK2UyXSArIG4yKTsKICAgIH0pLCBBLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uKGUyLCB0MykgewogICAgICByZXR1cm4gZTIgPj4+PSAwLCB0MyB8fCBrKGUyLCA0LCB0aGlzLmxlbmd0aCksIHIucmVhZCh0aGlzLCBlMiwgdHJ1ZSwgMjMsIDQpOwogICAgfSwgQS5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbihlMiwgdDMpIHsKICAgICAgcmV0dXJuIGUyID4+Pj0gMCwgdDMgfHwgayhlMiwgNCwgdGhpcy5sZW5ndGgpLCByLnJlYWQodGhpcywgZTIsIGZhbHNlLCAyMywgNCk7CiAgICB9LCBBLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbihlMiwgdDMpIHsKICAgICAgcmV0dXJuIGUyID4+Pj0gMCwgdDMgfHwgayhlMiwgOCwgdGhpcy5sZW5ndGgpLCByLnJlYWQodGhpcywgZTIsIHRydWUsIDUyLCA4KTsKICAgIH0sIEEucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uKGUyLCB0MykgewogICAgICByZXR1cm4gZTIgPj4+PSAwLCB0MyB8fCBrKGUyLCA4LCB0aGlzLmxlbmd0aCksIHIucmVhZCh0aGlzLCBlMiwgZmFsc2UsIDUyLCA4KTsKICAgIH0sIEEucHJvdG90eXBlLndyaXRlVWludExFID0gQS5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbihlMiwgdDMsIG4yLCBpMikgewogICAgICBlMiA9ICtlMiwgdDMgPj4+PSAwLCBuMiA+Pj49IDAsIGkyIHx8IFQodGhpcywgZTIsIHQzLCBuMiwgTWF0aC5wb3coMiwgOCAqIG4yKSAtIDEsIDApOwogICAgICBsZXQgcjIgPSAxLCBvMiA9IDA7CiAgICAgIGZvciAodGhpc1t0M10gPSAyNTUgJiBlMjsrK28yIDwgbjIgJiYgKHIyICo9IDI1Nik7ICkKICAgICAgICB0aGlzW3QzICsgbzJdID0gZTIgLyByMiAmIDI1NTsKICAgICAgcmV0dXJuIHQzICsgbjI7CiAgICB9LCBBLnByb3RvdHlwZS53cml0ZVVpbnRCRSA9IEEucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24oZTIsIHQzLCBuMiwgaTIpIHsKICAgICAgZTIgPSArZTIsIHQzID4+Pj0gMCwgbjIgPj4+PSAwLCBpMiB8fCBUKHRoaXMsIGUyLCB0MywgbjIsIE1hdGgucG93KDIsIDggKiBuMikgLSAxLCAwKTsKICAgICAgbGV0IHIyID0gbjIgLSAxLCBvMiA9IDE7CiAgICAgIGZvciAodGhpc1t0MyArIHIyXSA9IDI1NSAmIGUyOy0tcjIgPj0gMCAmJiAobzIgKj0gMjU2KTsgKQogICAgICAgIHRoaXNbdDMgKyByMl0gPSBlMiAvIG8yICYgMjU1OwogICAgICByZXR1cm4gdDMgKyBuMjsKICAgIH0sIEEucHJvdG90eXBlLndyaXRlVWludDggPSBBLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24oZTIsIHQzLCBuMikgewogICAgICByZXR1cm4gZTIgPSArZTIsIHQzID4+Pj0gMCwgbjIgfHwgVCh0aGlzLCBlMiwgdDMsIDEsIDI1NSwgMCksIHRoaXNbdDNdID0gMjU1ICYgZTIsIHQzICsgMTsKICAgIH0sIEEucHJvdG90eXBlLndyaXRlVWludDE2TEUgPSBBLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24oZTIsIHQzLCBuMikgewogICAgICByZXR1cm4gZTIgPSArZTIsIHQzID4+Pj0gMCwgbjIgfHwgVCh0aGlzLCBlMiwgdDMsIDIsIDY1NTM1LCAwKSwgdGhpc1t0M10gPSAyNTUgJiBlMiwgdGhpc1t0MyArIDFdID0gZTIgPj4+IDgsIHQzICsgMjsKICAgIH0sIEEucHJvdG90eXBlLndyaXRlVWludDE2QkUgPSBBLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24oZTIsIHQzLCBuMikgewogICAgICByZXR1cm4gZTIgPSArZTIsIHQzID4+Pj0gMCwgbjIgfHwgVCh0aGlzLCBlMiwgdDMsIDIsIDY1NTM1LCAwKSwgdGhpc1t0M10gPSBlMiA+Pj4gOCwgdGhpc1t0MyArIDFdID0gMjU1ICYgZTIsIHQzICsgMjsKICAgIH0sIEEucHJvdG90eXBlLndyaXRlVWludDMyTEUgPSBBLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24oZTIsIHQzLCBuMikgewogICAgICByZXR1cm4gZTIgPSArZTIsIHQzID4+Pj0gMCwgbjIgfHwgVCh0aGlzLCBlMiwgdDMsIDQsIDQyOTQ5NjcyOTUsIDApLCB0aGlzW3QzICsgM10gPSBlMiA+Pj4gMjQsIHRoaXNbdDMgKyAyXSA9IGUyID4+PiAxNiwgdGhpc1t0MyArIDFdID0gZTIgPj4+IDgsIHRoaXNbdDNdID0gMjU1ICYgZTIsIHQzICsgNDsKICAgIH0sIEEucHJvdG90eXBlLndyaXRlVWludDMyQkUgPSBBLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24oZTIsIHQzLCBuMikgewogICAgICByZXR1cm4gZTIgPSArZTIsIHQzID4+Pj0gMCwgbjIgfHwgVCh0aGlzLCBlMiwgdDMsIDQsIDQyOTQ5NjcyOTUsIDApLCB0aGlzW3QzXSA9IGUyID4+PiAyNCwgdGhpc1t0MyArIDFdID0gZTIgPj4+IDE2LCB0aGlzW3QzICsgMl0gPSBlMiA+Pj4gOCwgdGhpc1t0MyArIDNdID0gMjU1ICYgZTIsIHQzICsgNDsKICAgIH0sIEEucHJvdG90eXBlLndyaXRlQmlnVUludDY0TEUgPSBaKGZ1bmN0aW9uKGUyLCB0MyA9IDApIHsKICAgICAgcmV0dXJuIFIodGhpcywgZTIsIHQzLCBCaWdJbnQoMCksIEJpZ0ludCgiMHhmZmZmZmZmZmZmZmZmZmZmIikpOwogICAgfSksIEEucHJvdG90eXBlLndyaXRlQmlnVUludDY0QkUgPSBaKGZ1bmN0aW9uKGUyLCB0MyA9IDApIHsKICAgICAgcmV0dXJuIEYodGhpcywgZTIsIHQzLCBCaWdJbnQoMCksIEJpZ0ludCgiMHhmZmZmZmZmZmZmZmZmZmZmIikpOwogICAgfSksIEEucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbihlMiwgdDMsIG4yLCBpMikgewogICAgICBpZiAoZTIgPSArZTIsIHQzID4+Pj0gMCwgIWkyKSB7CiAgICAgICAgY29uc3QgaTMgPSBNYXRoLnBvdygyLCA4ICogbjIgLSAxKTsKICAgICAgICBUKHRoaXMsIGUyLCB0MywgbjIsIGkzIC0gMSwgLWkzKTsKICAgICAgfQogICAgICBsZXQgcjIgPSAwLCBvMiA9IDEsIHMyID0gMDsKICAgICAgZm9yICh0aGlzW3QzXSA9IDI1NSAmIGUyOysrcjIgPCBuMiAmJiAobzIgKj0gMjU2KTsgKQogICAgICAgIGUyIDwgMCAmJiBzMiA9PT0gMCAmJiB0aGlzW3QzICsgcjIgLSAxXSAhPT0gMCAmJiAoczIgPSAxKSwgdGhpc1t0MyArIHIyXSA9IChlMiAvIG8yIHwgMCkgLSBzMiAmIDI1NTsKICAgICAgcmV0dXJuIHQzICsgbjI7CiAgICB9LCBBLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24oZTIsIHQzLCBuMiwgaTIpIHsKICAgICAgaWYgKGUyID0gK2UyLCB0MyA+Pj49IDAsICFpMikgewogICAgICAgIGNvbnN0IGkzID0gTWF0aC5wb3coMiwgOCAqIG4yIC0gMSk7CiAgICAgICAgVCh0aGlzLCBlMiwgdDMsIG4yLCBpMyAtIDEsIC1pMyk7CiAgICAgIH0KICAgICAgbGV0IHIyID0gbjIgLSAxLCBvMiA9IDEsIHMyID0gMDsKICAgICAgZm9yICh0aGlzW3QzICsgcjJdID0gMjU1ICYgZTI7LS1yMiA+PSAwICYmIChvMiAqPSAyNTYpOyApCiAgICAgICAgZTIgPCAwICYmIHMyID09PSAwICYmIHRoaXNbdDMgKyByMiArIDFdICE9PSAwICYmIChzMiA9IDEpLCB0aGlzW3QzICsgcjJdID0gKGUyIC8gbzIgfCAwKSAtIHMyICYgMjU1OwogICAgICByZXR1cm4gdDMgKyBuMjsKICAgIH0sIEEucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uKGUyLCB0MywgbjIpIHsKICAgICAgcmV0dXJuIGUyID0gK2UyLCB0MyA+Pj49IDAsIG4yIHx8IFQodGhpcywgZTIsIHQzLCAxLCAxMjcsIC0xMjgpLCBlMiA8IDAgJiYgKGUyID0gMjU1ICsgZTIgKyAxKSwgdGhpc1t0M10gPSAyNTUgJiBlMiwgdDMgKyAxOwogICAgfSwgQS5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24oZTIsIHQzLCBuMikgewogICAgICByZXR1cm4gZTIgPSArZTIsIHQzID4+Pj0gMCwgbjIgfHwgVCh0aGlzLCBlMiwgdDMsIDIsIDMyNzY3LCAtMzI3NjgpLCB0aGlzW3QzXSA9IDI1NSAmIGUyLCB0aGlzW3QzICsgMV0gPSBlMiA+Pj4gOCwgdDMgKyAyOwogICAgfSwgQS5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24oZTIsIHQzLCBuMikgewogICAgICByZXR1cm4gZTIgPSArZTIsIHQzID4+Pj0gMCwgbjIgfHwgVCh0aGlzLCBlMiwgdDMsIDIsIDMyNzY3LCAtMzI3NjgpLCB0aGlzW3QzXSA9IGUyID4+PiA4LCB0aGlzW3QzICsgMV0gPSAyNTUgJiBlMiwgdDMgKyAyOwogICAgfSwgQS5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24oZTIsIHQzLCBuMikgewogICAgICByZXR1cm4gZTIgPSArZTIsIHQzID4+Pj0gMCwgbjIgfHwgVCh0aGlzLCBlMiwgdDMsIDQsIDIxNDc0ODM2NDcsIC0yMTQ3NDgzNjQ4KSwgdGhpc1t0M10gPSAyNTUgJiBlMiwgdGhpc1t0MyArIDFdID0gZTIgPj4+IDgsIHRoaXNbdDMgKyAyXSA9IGUyID4+PiAxNiwgdGhpc1t0MyArIDNdID0gZTIgPj4+IDI0LCB0MyArIDQ7CiAgICB9LCBBLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbihlMiwgdDMsIG4yKSB7CiAgICAgIHJldHVybiBlMiA9ICtlMiwgdDMgPj4+PSAwLCBuMiB8fCBUKHRoaXMsIGUyLCB0MywgNCwgMjE0NzQ4MzY0NywgLTIxNDc0ODM2NDgpLCBlMiA8IDAgJiYgKGUyID0gNDI5NDk2NzI5NSArIGUyICsgMSksIHRoaXNbdDNdID0gZTIgPj4+IDI0LCB0aGlzW3QzICsgMV0gPSBlMiA+Pj4gMTYsIHRoaXNbdDMgKyAyXSA9IGUyID4+PiA4LCB0aGlzW3QzICsgM10gPSAyNTUgJiBlMiwgdDMgKyA0OwogICAgfSwgQS5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NExFID0gWihmdW5jdGlvbihlMiwgdDMgPSAwKSB7CiAgICAgIHJldHVybiBSKHRoaXMsIGUyLCB0MywgLUJpZ0ludCgiMHg4MDAwMDAwMDAwMDAwMDAwIiksIEJpZ0ludCgiMHg3ZmZmZmZmZmZmZmZmZmZmIikpOwogICAgfSksIEEucHJvdG90eXBlLndyaXRlQmlnSW50NjRCRSA9IFooZnVuY3Rpb24oZTIsIHQzID0gMCkgewogICAgICByZXR1cm4gRih0aGlzLCBlMiwgdDMsIC1CaWdJbnQoIjB4ODAwMDAwMDAwMDAwMDAwMCIpLCBCaWdJbnQoIjB4N2ZmZmZmZmZmZmZmZmZmZiIpKTsKICAgIH0pLCBBLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbihlMiwgdDMsIG4yKSB7CiAgICAgIHJldHVybiBPKHRoaXMsIGUyLCB0MywgdHJ1ZSwgbjIpOwogICAgfSwgQS5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24oZTIsIHQzLCBuMikgewogICAgICByZXR1cm4gTyh0aGlzLCBlMiwgdDMsIGZhbHNlLCBuMik7CiAgICB9LCBBLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24oZTIsIHQzLCBuMikgewogICAgICByZXR1cm4gUCh0aGlzLCBlMiwgdDMsIHRydWUsIG4yKTsKICAgIH0sIEEucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbihlMiwgdDMsIG4yKSB7CiAgICAgIHJldHVybiBQKHRoaXMsIGUyLCB0MywgZmFsc2UsIG4yKTsKICAgIH0sIEEucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbihlMiwgdDMsIG4yLCBpMikgewogICAgICBpZiAoIUEuaXNCdWZmZXIoZTIpKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImFyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlciIpOwogICAgICBpZiAobjIgfHwgKG4yID0gMCksIGkyIHx8IGkyID09PSAwIHx8IChpMiA9IHRoaXMubGVuZ3RoKSwgdDMgPj0gZTIubGVuZ3RoICYmICh0MyA9IGUyLmxlbmd0aCksIHQzIHx8ICh0MyA9IDApLCBpMiA+IDAgJiYgaTIgPCBuMiAmJiAoaTIgPSBuMiksIGkyID09PSBuMikKICAgICAgICByZXR1cm4gMDsKICAgICAgaWYgKGUyLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gMDsKICAgICAgaWYgKHQzIDwgMCkKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpOwogICAgICBpZiAobjIgPCAwIHx8IG4yID49IHRoaXMubGVuZ3RoKQogICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTsKICAgICAgaWYgKGkyIDwgMCkKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTsKICAgICAgaTIgPiB0aGlzLmxlbmd0aCAmJiAoaTIgPSB0aGlzLmxlbmd0aCksIGUyLmxlbmd0aCAtIHQzIDwgaTIgLSBuMiAmJiAoaTIgPSBlMi5sZW5ndGggLSB0MyArIG4yKTsKICAgICAgY29uc3QgcjIgPSBpMiAtIG4yOwogICAgICByZXR1cm4gdGhpcyA9PT0gZTIgJiYgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4gPT0gImZ1bmN0aW9uIiA/IHRoaXMuY29weVdpdGhpbih0MywgbjIsIGkyKSA6IFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUyLCB0aGlzLnN1YmFycmF5KG4yLCBpMiksIHQzKSwgcjI7CiAgICB9LCBBLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24oZTIsIHQzLCBuMiwgaTIpIHsKICAgICAgaWYgKHR5cGVvZiBlMiA9PSAic3RyaW5nIikgewogICAgICAgIGlmICh0eXBlb2YgdDMgPT0gInN0cmluZyIgPyAoaTIgPSB0MywgdDMgPSAwLCBuMiA9IHRoaXMubGVuZ3RoKSA6IHR5cGVvZiBuMiA9PSAic3RyaW5nIiAmJiAoaTIgPSBuMiwgbjIgPSB0aGlzLmxlbmd0aCksIGkyICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGkyICE9ICJzdHJpbmciKQogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpOwogICAgICAgIGlmICh0eXBlb2YgaTIgPT0gInN0cmluZyIgJiYgIUEuaXNFbmNvZGluZyhpMikpCiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiICsgaTIpOwogICAgICAgIGlmIChlMi5sZW5ndGggPT09IDEpIHsKICAgICAgICAgIGNvbnN0IHQ0ID0gZTIuY2hhckNvZGVBdCgwKTsKICAgICAgICAgIChpMiA9PT0gInV0ZjgiICYmIHQ0IDwgMTI4IHx8IGkyID09PSAibGF0aW4xIikgJiYgKGUyID0gdDQpOwogICAgICAgIH0KICAgICAgfSBlbHNlCiAgICAgICAgdHlwZW9mIGUyID09ICJudW1iZXIiID8gZTIgJj0gMjU1IDogdHlwZW9mIGUyID09ICJib29sZWFuIiAmJiAoZTIgPSBOdW1iZXIoZTIpKTsKICAgICAgaWYgKHQzIDwgMCB8fCB0aGlzLmxlbmd0aCA8IHQzIHx8IHRoaXMubGVuZ3RoIDwgbjIpCiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpOwogICAgICBpZiAobjIgPD0gdDMpCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIGxldCByMjsKICAgICAgaWYgKHQzID4+Pj0gMCwgbjIgPSBuMiA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBuMiA+Pj4gMCwgZTIgfHwgKGUyID0gMCksIHR5cGVvZiBlMiA9PSAibnVtYmVyIikKICAgICAgICBmb3IgKHIyID0gdDM7cjIgPCBuMjsgKytyMikKICAgICAgICAgIHRoaXNbcjJdID0gZTI7CiAgICAgIGVsc2UgewogICAgICAgIGNvbnN0IG8yID0gQS5pc0J1ZmZlcihlMikgPyBlMiA6IEEuZnJvbShlMiwgaTIpLCBzMiA9IG8yLmxlbmd0aDsKICAgICAgICBpZiAoczIgPT09IDApCiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgIicgKyBlMiArICciIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50ICJ2YWx1ZSInKTsKICAgICAgICBmb3IgKHIyID0gMDtyMiA8IG4yIC0gdDM7ICsrcjIpCiAgICAgICAgICB0aGlzW3IyICsgdDNdID0gbzJbcjIgJSBzMl07CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgY29uc3QgRyA9IHt9OwogICAgZnVuY3Rpb24gTihlMiwgdDMsIG4yKSB7CiAgICAgIEdbZTJdID0gY2xhc3MgZXh0ZW5kcyBuMiB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICBzdXBlcigpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgIm1lc3NhZ2UiLCB7IHZhbHVlOiB0My5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pLCB0aGlzLm5hbWUgPSBgJHt0aGlzLm5hbWV9IFske2UyfV1gLCB0aGlzLnN0YWNrLCBkZWxldGUgdGhpcy5uYW1lOwogICAgICAgIH0KICAgICAgICBnZXQgY29kZSgpIHsKICAgICAgICAgIHJldHVybiBlMjsKICAgICAgICB9CiAgICAgICAgc2V0IGNvZGUoZTMpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiY29kZSIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogZTMsIHdyaXRhYmxlOiB0cnVlIH0pOwogICAgICAgIH0KICAgICAgICB0b1N0cmluZygpIHsKICAgICAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IFske2UyfV06ICR7dGhpcy5tZXNzYWdlfWA7CiAgICAgICAgfQogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gaihlMikgewogICAgICBsZXQgdDMgPSAiIiwgbjIgPSBlMi5sZW5ndGg7CiAgICAgIGNvbnN0IGkyID0gZTJbMF0gPT09ICItIiA/IDEgOiAwOwogICAgICBmb3IgKDtuMiA+PSBpMiArIDQ7IG4yIC09IDMpCiAgICAgICAgdDMgPSBgXyR7ZTIuc2xpY2UobjIgLSAzLCBuMil9JHt0M31gOwogICAgICByZXR1cm4gYCR7ZTIuc2xpY2UoMCwgbjIpfSR7dDN9YDsKICAgIH0KICAgIGZ1bmN0aW9uIF8oZTIsIHQzLCBuMiwgaTIsIHIyLCBvMikgewogICAgICBpZiAoZTIgPiBuMiB8fCBlMiA8IHQzKSB7CiAgICAgICAgY29uc3QgaTMgPSB0eXBlb2YgdDMgPT0gImJpZ2ludCIgPyAibiIgOiAiIjsKICAgICAgICBsZXQgcjM7CiAgICAgICAgdGhyb3cgcjMgPSBvMiA+IDMgPyB0MyA9PT0gMCB8fCB0MyA9PT0gQmlnSW50KDApID8gYD49IDAke2kzfSBhbmQgPCAyJHtpM30gKiogJHs4ICogKG8yICsgMSl9JHtpM31gIDogYD49IC0oMiR7aTN9ICoqICR7OCAqIChvMiArIDEpIC0gMX0ke2kzfSkgYW5kIDwgMiAqKiAkezggKiAobzIgKyAxKSAtIDF9JHtpM31gIDogYD49ICR7dDN9JHtpM30gYW5kIDw9ICR7bjJ9JHtpM31gLCBuZXcgRy5FUlJfT1VUX09GX1JBTkdFKCJ2YWx1ZSIsIHIzLCBlMik7CiAgICAgIH0KICAgICAgKGZ1bmN0aW9uKGUzLCB0NCwgbjMpIHsKICAgICAgICBIKHQ0LCAib2Zmc2V0IiksIGUzW3Q0XSAhPT0gdW5kZWZpbmVkICYmIGUzW3Q0ICsgbjNdICE9PSB1bmRlZmluZWQgfHwgcSh0NCwgZTMubGVuZ3RoIC0gKG4zICsgMSkpOwogICAgICB9KShpMiwgcjIsIG8yKTsKICAgIH0KICAgIGZ1bmN0aW9uIEgoZTIsIHQzKSB7CiAgICAgIGlmICh0eXBlb2YgZTIgIT0gIm51bWJlciIpCiAgICAgICAgdGhyb3cgbmV3IEcuRVJSX0lOVkFMSURfQVJHX1RZUEUodDMsICJudW1iZXIiLCBlMik7CiAgICB9CiAgICBmdW5jdGlvbiBxKGUyLCB0MywgbjIpIHsKICAgICAgaWYgKE1hdGguZmxvb3IoZTIpICE9PSBlMikKICAgICAgICB0aHJvdyBIKGUyLCBuMiksIG5ldyBHLkVSUl9PVVRfT0ZfUkFOR0UobjIgfHwgIm9mZnNldCIsICJhbiBpbnRlZ2VyIiwgZTIpOwogICAgICBpZiAodDMgPCAwKQogICAgICAgIHRocm93IG5ldyBHLkVSUl9CVUZGRVJfT1VUX09GX0JPVU5EUzsKICAgICAgdGhyb3cgbmV3IEcuRVJSX09VVF9PRl9SQU5HRShuMiB8fCAib2Zmc2V0IiwgYD49ICR7bjIgPyAxIDogMH0gYW5kIDw9ICR7dDN9YCwgZTIpOwogICAgfQogICAgTigiRVJSX0JVRkZFUl9PVVRfT0ZfQk9VTkRTIiwgZnVuY3Rpb24oZTIpIHsKICAgICAgcmV0dXJuIGUyID8gYCR7ZTJ9IGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kc2AgOiAiQXR0ZW1wdCB0byBhY2Nlc3MgbWVtb3J5IG91dHNpZGUgYnVmZmVyIGJvdW5kcyI7CiAgICB9LCBSYW5nZUVycm9yKSwgTigiRVJSX0lOVkFMSURfQVJHX1RZUEUiLCBmdW5jdGlvbihlMiwgdDMpIHsKICAgICAgcmV0dXJuIGBUaGUgIiR7ZTJ9IiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlICR7dHlwZW9mIHQzfWA7CiAgICB9LCBUeXBlRXJyb3IpLCBOKCJFUlJfT1VUX09GX1JBTkdFIiwgZnVuY3Rpb24oZTIsIHQzLCBuMikgewogICAgICBsZXQgaTIgPSBgVGhlIHZhbHVlIG9mICIke2UyfSIgaXMgb3V0IG9mIHJhbmdlLmAsIHIyID0gbjI7CiAgICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG4yKSAmJiBNYXRoLmFicyhuMikgPiAyICoqIDMyID8gcjIgPSBqKFN0cmluZyhuMikpIDogdHlwZW9mIG4yID09ICJiaWdpbnQiICYmIChyMiA9IFN0cmluZyhuMiksIChuMiA+IEJpZ0ludCgyKSAqKiBCaWdJbnQoMzIpIHx8IG4yIDwgLShCaWdJbnQoMikgKiogQmlnSW50KDMyKSkpICYmIChyMiA9IGoocjIpKSwgcjIgKz0gIm4iKSwgaTIgKz0gYCBJdCBtdXN0IGJlICR7dDN9LiBSZWNlaXZlZCAke3IyfWAsIGkyOwogICAgfSwgUmFuZ2VFcnJvcik7CiAgICBjb25zdCBWID0gL1teKy8wLTlBLVphLXotX10vZzsKICAgIGZ1bmN0aW9uIHooZTIsIHQzKSB7CiAgICAgIGxldCBuMjsKICAgICAgdDMgPSB0MyB8fCAxIC8gMDsKICAgICAgY29uc3QgaTIgPSBlMi5sZW5ndGg7CiAgICAgIGxldCByMiA9IG51bGw7CiAgICAgIGNvbnN0IG8yID0gW107CiAgICAgIGZvciAobGV0IHMyID0gMDtzMiA8IGkyOyArK3MyKSB7CiAgICAgICAgaWYgKG4yID0gZTIuY2hhckNvZGVBdChzMiksIG4yID4gNTUyOTUgJiYgbjIgPCA1NzM0NCkgewogICAgICAgICAgaWYgKCFyMikgewogICAgICAgICAgICBpZiAobjIgPiA1NjMxOSkgewogICAgICAgICAgICAgICh0MyAtPSAzKSA+IC0xICYmIG8yLnB1c2goMjM5LCAxOTEsIDE4OSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHMyICsgMSA9PT0gaTIpIHsKICAgICAgICAgICAgICAodDMgLT0gMykgPiAtMSAmJiBvMi5wdXNoKDIzOSwgMTkxLCAxODkpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHIyID0gbjI7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG4yIDwgNTYzMjApIHsKICAgICAgICAgICAgKHQzIC09IDMpID4gLTEgJiYgbzIucHVzaCgyMzksIDE5MSwgMTg5KSwgcjIgPSBuMjsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBuMiA9IDY1NTM2ICsgKHIyIC0gNTUyOTYgPDwgMTAgfCBuMiAtIDU2MzIwKTsKICAgICAgICB9IGVsc2UKICAgICAgICAgIHIyICYmICh0MyAtPSAzKSA+IC0xICYmIG8yLnB1c2goMjM5LCAxOTEsIDE4OSk7CiAgICAgICAgaWYgKHIyID0gbnVsbCwgbjIgPCAxMjgpIHsKICAgICAgICAgIGlmICgodDMgLT0gMSkgPCAwKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIG8yLnB1c2gobjIpOwogICAgICAgIH0gZWxzZSBpZiAobjIgPCAyMDQ4KSB7CiAgICAgICAgICBpZiAoKHQzIC09IDIpIDwgMCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBvMi5wdXNoKG4yID4+IDYgfCAxOTIsIDYzICYgbjIgfCAxMjgpOwogICAgICAgIH0gZWxzZSBpZiAobjIgPCA2NTUzNikgewogICAgICAgICAgaWYgKCh0MyAtPSAzKSA8IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgbzIucHVzaChuMiA+PiAxMiB8IDIyNCwgbjIgPj4gNiAmIDYzIHwgMTI4LCA2MyAmIG4yIHwgMTI4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKCEobjIgPCAxMTE0MTEyKSkKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTsKICAgICAgICAgIGlmICgodDMgLT0gNCkgPCAwKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIG8yLnB1c2gobjIgPj4gMTggfCAyNDAsIG4yID4+IDEyICYgNjMgfCAxMjgsIG4yID4+IDYgJiA2MyB8IDEyOCwgNjMgJiBuMiB8IDEyOCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBvMjsKICAgIH0KICAgIGZ1bmN0aW9uIFkoZTIpIHsKICAgICAgcmV0dXJuIGkudG9CeXRlQXJyYXkoZnVuY3Rpb24oZTMpIHsKICAgICAgICBpZiAoKGUzID0gKGUzID0gZTMuc3BsaXQoIj0iKVswXSkudHJpbSgpLnJlcGxhY2UoViwgIiIpKS5sZW5ndGggPCAyKQogICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIGZvciAoO2UzLmxlbmd0aCAlIDQgIT0gMDsgKQogICAgICAgICAgZTMgKz0gIj0iOwogICAgICAgIHJldHVybiBlMzsKICAgICAgfShlMikpOwogICAgfQogICAgZnVuY3Rpb24gSyhlMiwgdDMsIG4yLCBpMikgewogICAgICBsZXQgcjI7CiAgICAgIGZvciAocjIgPSAwO3IyIDwgaTIgJiYgIShyMiArIG4yID49IHQzLmxlbmd0aCB8fCByMiA+PSBlMi5sZW5ndGgpOyArK3IyKQogICAgICAgIHQzW3IyICsgbjJdID0gZTJbcjJdOwogICAgICByZXR1cm4gcjI7CiAgICB9CiAgICBmdW5jdGlvbiBXKGUyLCB0MykgewogICAgICByZXR1cm4gZTIgaW5zdGFuY2VvZiB0MyB8fCBlMiAhPSBudWxsICYmIGUyLmNvbnN0cnVjdG9yICE9IG51bGwgJiYgZTIuY29uc3RydWN0b3IubmFtZSAhPSBudWxsICYmIGUyLmNvbnN0cnVjdG9yLm5hbWUgPT09IHQzLm5hbWU7CiAgICB9CiAgICBmdW5jdGlvbiBKKGUyKSB7CiAgICAgIHJldHVybiBlMiAhPSBlMjsKICAgIH0KICAgIGNvbnN0IFggPSBmdW5jdGlvbigpIHsKICAgICAgY29uc3QgZTIgPSAiMDEyMzQ1Njc4OWFiY2RlZiIsIHQzID0gbmV3IEFycmF5KDI1Nik7CiAgICAgIGZvciAobGV0IG4yID0gMDtuMiA8IDE2OyArK24yKSB7CiAgICAgICAgY29uc3QgaTIgPSAxNiAqIG4yOwogICAgICAgIGZvciAobGV0IHIyID0gMDtyMiA8IDE2OyArK3IyKQogICAgICAgICAgdDNbaTIgKyByMl0gPSBlMltuMl0gKyBlMltyMl07CiAgICAgIH0KICAgICAgcmV0dXJuIHQzOwogICAgfSgpOwogICAgZnVuY3Rpb24gWihlMikgewogICAgICByZXR1cm4gdHlwZW9mIEJpZ0ludCA9PSAidW5kZWZpbmVkIiA/ICQgOiBlMjsKICAgIH0KICAgIGZ1bmN0aW9uICQoKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQmlnSW50IG5vdCBzdXBwb3J0ZWQiKTsKICAgIH0KICB9LCA5MDg5OiAoZSkgPT4gewogICAgZS5leHBvcnRzID0gZnVuY3Rpb24oZTIpIHsKICAgICAgdmFyIHQyID0gW107CiAgICAgIHJldHVybiB0Mi50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbih0MykgewogICAgICAgICAgdmFyIG4gPSAiIiwgaSA9IHQzWzVdICE9PSB1bmRlZmluZWQ7CiAgICAgICAgICByZXR1cm4gdDNbNF0gJiYgKG4gKz0gIkBzdXBwb3J0cyAoIi5jb25jYXQodDNbNF0sICIpIHsiKSksIHQzWzJdICYmIChuICs9ICJAbWVkaWEgIi5jb25jYXQodDNbMl0sICIgeyIpKSwgaSAmJiAobiArPSAiQGxheWVyIi5jb25jYXQodDNbNV0ubGVuZ3RoID4gMCA/ICIgIi5jb25jYXQodDNbNV0pIDogIiIsICIgeyIpKSwgbiArPSBlMih0MyksIGkgJiYgKG4gKz0gIn0iKSwgdDNbMl0gJiYgKG4gKz0gIn0iKSwgdDNbNF0gJiYgKG4gKz0gIn0iKSwgbjsKICAgICAgICB9KS5qb2luKCIiKTsKICAgICAgfSwgdDIuaSA9IGZ1bmN0aW9uKGUzLCBuLCBpLCByLCBvKSB7CiAgICAgICAgdHlwZW9mIGUzID09ICJzdHJpbmciICYmIChlMyA9IFtbbnVsbCwgZTMsIHVuZGVmaW5lZF1dKTsKICAgICAgICB2YXIgcyA9IHt9OwogICAgICAgIGlmIChpKQogICAgICAgICAgZm9yICh2YXIgYSA9IDA7YSA8IHRoaXMubGVuZ3RoOyBhKyspIHsKICAgICAgICAgICAgdmFyIEEgPSB0aGlzW2FdWzBdOwogICAgICAgICAgICBBICE9IG51bGwgJiYgKHNbQV0gPSB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICBmb3IgKHZhciBsID0gMDtsIDwgZTMubGVuZ3RoOyBsKyspIHsKICAgICAgICAgIHZhciBjID0gW10uY29uY2F0KGUzW2xdKTsKICAgICAgICAgIGkgJiYgc1tjWzBdXSB8fCAobyAhPT0gdW5kZWZpbmVkICYmIChjWzVdID09PSB1bmRlZmluZWQgfHwgKGNbMV0gPSAiQGxheWVyIi5jb25jYXQoY1s1XS5sZW5ndGggPiAwID8gIiAiLmNvbmNhdChjWzVdKSA6ICIiLCAiIHsiKS5jb25jYXQoY1sxXSwgIn0iKSksIGNbNV0gPSBvKSwgbiAmJiAoY1syXSA/IChjWzFdID0gIkBtZWRpYSAiLmNvbmNhdChjWzJdLCAiIHsiKS5jb25jYXQoY1sxXSwgIn0iKSwgY1syXSA9IG4pIDogY1syXSA9IG4pLCByICYmIChjWzRdID8gKGNbMV0gPSAiQHN1cHBvcnRzICgiLmNvbmNhdChjWzRdLCAiKSB7IikuY29uY2F0KGNbMV0sICJ9IiksIGNbNF0gPSByKSA6IGNbNF0gPSAiIi5jb25jYXQocikpLCB0Mi5wdXNoKGMpKTsKICAgICAgICB9CiAgICAgIH0sIHQyOwogICAgfTsKICB9LCA2NDkyOiAoZSkgPT4gewogICAgZS5leHBvcnRzID0gZnVuY3Rpb24oZTIsIHQyKSB7CiAgICAgIHJldHVybiB0MiB8fCAodDIgPSB7fSksIGUyID8gKGUyID0gU3RyaW5nKGUyLl9fZXNNb2R1bGUgPyBlMi5kZWZhdWx0IDogZTIpLCAvXlsnIl0uKlsnIl0kLy50ZXN0KGUyKSAmJiAoZTIgPSBlMi5zbGljZSgxLCAtMSkpLCB0Mi5oYXNoICYmIChlMiArPSB0Mi5oYXNoKSwgL1siJygpIFx0XG5dfCglMjApLy50ZXN0KGUyKSB8fCB0Mi5uZWVkUXVvdGVzID8gJyInLmNvbmNhdChlMi5yZXBsYWNlKC8iL2csICJcXFwiIikucmVwbGFjZSgvXG4vZywgIlxcbiIpLCAnIicpIDogZTIpIDogZTI7CiAgICB9OwogIH0sIDk2MzogKGUpID0+IHsKICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGUyKSB7CiAgICAgIHZhciB0MiA9IGUyWzFdLCBuID0gZTJbM107CiAgICAgIGlmICghbikKICAgICAgICByZXR1cm4gdDI7CiAgICAgIGlmICh0eXBlb2YgYnRvYSA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgdmFyIGkgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShuKSkpKSwgciA9ICJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwiLmNvbmNhdChpKSwgbyA9ICIvKiMgIi5jb25jYXQociwgIiAqLyIpOwogICAgICAgIHJldHVybiBbdDJdLmNvbmNhdChbb10pLmpvaW4oYApgKTsKICAgICAgfQogICAgICByZXR1cm4gW3QyXS5qb2luKGAKYCk7CiAgICB9OwogIH0sIDg4Nzg6IChlLCB0MiwgbikgPT4gewogICAgdDIuZm9ybWF0QXJncyA9IGZ1bmN0aW9uKHQzKSB7CiAgICAgIGlmICh0M1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICIlYyIgOiAiIikgKyB0aGlzLm5hbWVzcGFjZSArICh0aGlzLnVzZUNvbG9ycyA/ICIgJWMiIDogIiAiKSArIHQzWzBdICsgKHRoaXMudXNlQ29sb3JzID8gIiVjICIgOiAiICIpICsgIisiICsgZS5leHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZiksICF0aGlzLnVzZUNvbG9ycykKICAgICAgICByZXR1cm47CiAgICAgIGNvbnN0IG4yID0gImNvbG9yOiAiICsgdGhpcy5jb2xvcjsKICAgICAgdDMuc3BsaWNlKDEsIDAsIG4yLCAiY29sb3I6IGluaGVyaXQiKTsKICAgICAgbGV0IGkyID0gMCwgciA9IDA7CiAgICAgIHQzWzBdLnJlcGxhY2UoLyVbYS16QS1aJV0vZywgKGUyKSA9PiB7CiAgICAgICAgZTIgIT09ICIlJSIgJiYgKGkyKyssIGUyID09PSAiJWMiICYmIChyID0gaTIpKTsKICAgICAgfSksIHQzLnNwbGljZShyLCAwLCBuMik7CiAgICB9LCB0Mi5zYXZlID0gZnVuY3Rpb24oZTIpIHsKICAgICAgdHJ5IHsKICAgICAgICBlMiA/IHQyLnN0b3JhZ2Uuc2V0SXRlbSgiZGVidWciLCBlMikgOiB0Mi5zdG9yYWdlLnJlbW92ZUl0ZW0oImRlYnVnIik7CiAgICAgIH0gY2F0Y2ggKGUzKSB7fQogICAgfSwgdDIubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICBsZXQgZTI7CiAgICAgIHRyeSB7CiAgICAgICAgZTIgPSB0Mi5zdG9yYWdlLmdldEl0ZW0oImRlYnVnIik7CiAgICAgIH0gY2F0Y2ggKGUzKSB7fQogICAgICByZXR1cm4gIWUyICYmIHR5cGVvZiBwcm9jZXNzICE9ICJ1bmRlZmluZWQiICYmICJlbnYiIGluIHByb2Nlc3MgJiYgKGUyID0gcHJvY2Vzcy5lbnYuREVCVUcpLCBlMjsKICAgIH0sIHQyLnVzZUNvbG9ycyA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPSAidW5kZWZpbmVkIiAmJiB3aW5kb3cucHJvY2VzcyAmJiAod2luZG93LnByb2Nlc3MudHlwZSA9PT0gInJlbmRlcmVyIiB8fCB3aW5kb3cucHJvY2Vzcy5fX253anMpKQogICAgICAgIHJldHVybiB0cnVlOwogICAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPSAidW5kZWZpbmVkIiAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvKGVkZ2V8dHJpZGVudClcLyhcZCspLykpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICBsZXQgZTI7CiAgICAgIHJldHVybiB0eXBlb2YgZG9jdW1lbnQgIT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSB8fCB0eXBlb2Ygd2luZG93ICE9ICJ1bmRlZmluZWQiICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8IHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkgfHwgdHlwZW9mIG5hdmlnYXRvciAhPSAidW5kZWZpbmVkIiAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIChlMiA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFwvKFxkKykvKSkgJiYgcGFyc2VJbnQoZTJbMV0sIDEwKSA+PSAzMSB8fCB0eXBlb2YgbmF2aWdhdG9yICE9ICJ1bmRlZmluZWQiICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFwvKFxkKykvKTsKICAgIH0sIHQyLnN0b3JhZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlOwogICAgICB9IGNhdGNoIChlMikge30KICAgIH0oKSwgdDIuZGVzdHJveSA9ICgoKSA9PiB7CiAgICAgIGxldCBlMiA9IGZhbHNlOwogICAgICByZXR1cm4gKCkgPT4gewogICAgICAgIGUyIHx8IChlMiA9IHRydWUsIGNvbnNvbGUud2FybigiSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLiIpKTsKICAgICAgfTsKICAgIH0pKCksIHQyLmNvbG9ycyA9IFsiIzAwMDBDQyIsICIjMDAwMEZGIiwgIiMwMDMzQ0MiLCAiIzAwMzNGRiIsICIjMDA2NkNDIiwgIiMwMDY2RkYiLCAiIzAwOTlDQyIsICIjMDA5OUZGIiwgIiMwMENDMDAiLCAiIzAwQ0MzMyIsICIjMDBDQzY2IiwgIiMwMENDOTkiLCAiIzAwQ0NDQyIsICIjMDBDQ0ZGIiwgIiMzMzAwQ0MiLCAiIzMzMDBGRiIsICIjMzMzM0NDIiwgIiMzMzMzRkYiLCAiIzMzNjZDQyIsICIjMzM2NkZGIiwgIiMzMzk5Q0MiLCAiIzMzOTlGRiIsICIjMzNDQzAwIiwgIiMzM0NDMzMiLCAiIzMzQ0M2NiIsICIjMzNDQzk5IiwgIiMzM0NDQ0MiLCAiIzMzQ0NGRiIsICIjNjYwMENDIiwgIiM2NjAwRkYiLCAiIzY2MzNDQyIsICIjNjYzM0ZGIiwgIiM2NkNDMDAiLCAiIzY2Q0MzMyIsICIjOTkwMENDIiwgIiM5OTAwRkYiLCAiIzk5MzNDQyIsICIjOTkzM0ZGIiwgIiM5OUNDMDAiLCAiIzk5Q0MzMyIsICIjQ0MwMDAwIiwgIiNDQzAwMzMiLCAiI0NDMDA2NiIsICIjQ0MwMDk5IiwgIiNDQzAwQ0MiLCAiI0NDMDBGRiIsICIjQ0MzMzAwIiwgIiNDQzMzMzMiLCAiI0NDMzM2NiIsICIjQ0MzMzk5IiwgIiNDQzMzQ0MiLCAiI0NDMzNGRiIsICIjQ0M2NjAwIiwgIiNDQzY2MzMiLCAiI0NDOTkwMCIsICIjQ0M5OTMzIiwgIiNDQ0NDMDAiLCAiI0NDQ0MzMyIsICIjRkYwMDAwIiwgIiNGRjAwMzMiLCAiI0ZGMDA2NiIsICIjRkYwMDk5IiwgIiNGRjAwQ0MiLCAiI0ZGMDBGRiIsICIjRkYzMzAwIiwgIiNGRjMzMzMiLCAiI0ZGMzM2NiIsICIjRkYzMzk5IiwgIiNGRjMzQ0MiLCAiI0ZGMzNGRiIsICIjRkY2NjAwIiwgIiNGRjY2MzMiLCAiI0ZGOTkwMCIsICIjRkY5OTMzIiwgIiNGRkNDMDAiLCAiI0ZGQ0MzMyJdLCB0Mi5sb2cgPSBjb25zb2xlLmRlYnVnIHx8IGNvbnNvbGUubG9nIHx8ICgoKSA9PiB7fSksIGUuZXhwb3J0cyA9IG4oODk0NSkodDIpOwogICAgY29uc3QgeyBmb3JtYXR0ZXJzOiBpIH0gPSBlLmV4cG9ydHM7CiAgICBpLmogPSBmdW5jdGlvbihlMikgewogICAgICB0cnkgewogICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlMik7CiAgICAgIH0gY2F0Y2ggKGUzKSB7CiAgICAgICAgcmV0dXJuICJbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogIiArIGUzLm1lc3NhZ2U7CiAgICAgIH0KICAgIH07CiAgfSwgODk0NTogKGUsIHQyLCBuKSA9PiB7CiAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbihlMikgewogICAgICBmdW5jdGlvbiB0MyhlMykgewogICAgICAgIGxldCBuMiwgcjIsIG8sIHMgPSBudWxsOwogICAgICAgIGZ1bmN0aW9uIGEoLi4uZTQpIHsKICAgICAgICAgIGlmICghYS5lbmFibGVkKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjb25zdCBpMiA9IGEsIHIzID0gTnVtYmVyKG5ldyBEYXRlKSwgbzIgPSByMyAtIChuMiB8fCByMyk7CiAgICAgICAgICBpMi5kaWZmID0gbzIsIGkyLnByZXYgPSBuMiwgaTIuY3VyciA9IHIzLCBuMiA9IHIzLCBlNFswXSA9IHQzLmNvZXJjZShlNFswXSksIHR5cGVvZiBlNFswXSAhPSAic3RyaW5nIiAmJiBlNC51bnNoaWZ0KCIlTyIpOwogICAgICAgICAgbGV0IHMyID0gMDsKICAgICAgICAgIGU0WzBdID0gZTRbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIChuMywgcjQpID0+IHsKICAgICAgICAgICAgaWYgKG4zID09PSAiJSUiKQogICAgICAgICAgICAgIHJldHVybiAiJSI7CiAgICAgICAgICAgIHMyKys7CiAgICAgICAgICAgIGNvbnN0IG8zID0gdDMuZm9ybWF0dGVyc1tyNF07CiAgICAgICAgICAgIGlmICh0eXBlb2YgbzMgPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgIGNvbnN0IHQ0ID0gZTRbczJdOwogICAgICAgICAgICAgIG4zID0gbzMuY2FsbChpMiwgdDQpLCBlNC5zcGxpY2UoczIsIDEpLCBzMi0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuMzsKICAgICAgICAgIH0pLCB0My5mb3JtYXRBcmdzLmNhbGwoaTIsIGU0KSwgKGkyLmxvZyB8fCB0My5sb2cpLmFwcGx5KGkyLCBlNCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhLm5hbWVzcGFjZSA9IGUzLCBhLnVzZUNvbG9ycyA9IHQzLnVzZUNvbG9ycygpLCBhLmNvbG9yID0gdDMuc2VsZWN0Q29sb3IoZTMpLCBhLmV4dGVuZCA9IGksIGEuZGVzdHJveSA9IHQzLmRlc3Ryb3ksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCAiZW5hYmxlZCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiBmYWxzZSwgZ2V0OiAoKSA9PiBzICE9PSBudWxsID8gcyA6IChyMiAhPT0gdDMubmFtZXNwYWNlcyAmJiAocjIgPSB0My5uYW1lc3BhY2VzLCBvID0gdDMuZW5hYmxlZChlMykpLCBvKSwgc2V0OiAoZTQpID0+IHsKICAgICAgICAgIHMgPSBlNDsKICAgICAgICB9IH0pLCB0eXBlb2YgdDMuaW5pdCA9PSAiZnVuY3Rpb24iICYmIHQzLmluaXQoYSksIGE7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gaShlMywgbjIpIHsKICAgICAgICBjb25zdCBpMiA9IHQzKHRoaXMubmFtZXNwYWNlICsgKG4yID09PSB1bmRlZmluZWQgPyAiOiIgOiBuMikgKyBlMyk7CiAgICAgICAgcmV0dXJuIGkyLmxvZyA9IHRoaXMubG9nLCBpMjsKICAgICAgfQogICAgICBmdW5jdGlvbiByKGUzLCB0NCkgewogICAgICAgIGxldCBuMiA9IDAsIGkyID0gMCwgcjIgPSAtMSwgbyA9IDA7CiAgICAgICAgZm9yICg7bjIgPCBlMy5sZW5ndGg7ICkKICAgICAgICAgIGlmIChpMiA8IHQ0Lmxlbmd0aCAmJiAodDRbaTJdID09PSBlM1tuMl0gfHwgdDRbaTJdID09PSAiKiIpKQogICAgICAgICAgICB0NFtpMl0gPT09ICIqIiA/IChyMiA9IGkyLCBvID0gbjIsIGkyKyspIDogKG4yKyssIGkyKyspOwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChyMiA9PT0gLTEpCiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICBpMiA9IHIyICsgMSwgbysrLCBuMiA9IG87CiAgICAgICAgICB9CiAgICAgICAgZm9yICg7aTIgPCB0NC5sZW5ndGggJiYgdDRbaTJdID09PSAiKiI7ICkKICAgICAgICAgIGkyKys7CiAgICAgICAgcmV0dXJuIGkyID09PSB0NC5sZW5ndGg7CiAgICAgIH0KICAgICAgcmV0dXJuIHQzLmRlYnVnID0gdDMsIHQzLmRlZmF1bHQgPSB0MywgdDMuY29lcmNlID0gZnVuY3Rpb24oZTMpIHsKICAgICAgICByZXR1cm4gZTMgaW5zdGFuY2VvZiBFcnJvciA/IGUzLnN0YWNrIHx8IGUzLm1lc3NhZ2UgOiBlMzsKICAgICAgfSwgdDMuZGlzYWJsZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGNvbnN0IGUzID0gWy4uLnQzLm5hbWVzLCAuLi50My5za2lwcy5tYXAoKGU0KSA9PiAiLSIgKyBlNCldLmpvaW4oIiwiKTsKICAgICAgICByZXR1cm4gdDMuZW5hYmxlKCIiKSwgZTM7CiAgICAgIH0sIHQzLmVuYWJsZSA9IGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgdDMuc2F2ZShlMyksIHQzLm5hbWVzcGFjZXMgPSBlMywgdDMubmFtZXMgPSBbXSwgdDMuc2tpcHMgPSBbXTsKICAgICAgICBjb25zdCBuMiA9ICh0eXBlb2YgZTMgPT0gInN0cmluZyIgPyBlMyA6ICIiKS50cmltKCkucmVwbGFjZSgiICIsICIsIikuc3BsaXQoIiwiKS5maWx0ZXIoQm9vbGVhbik7CiAgICAgICAgZm9yIChjb25zdCBlNCBvZiBuMikKICAgICAgICAgIGU0WzBdID09PSAiLSIgPyB0My5za2lwcy5wdXNoKGU0LnNsaWNlKDEpKSA6IHQzLm5hbWVzLnB1c2goZTQpOwogICAgICB9LCB0My5lbmFibGVkID0gZnVuY3Rpb24oZTMpIHsKICAgICAgICBmb3IgKGNvbnN0IG4yIG9mIHQzLnNraXBzKQogICAgICAgICAgaWYgKHIoZTMsIG4yKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGZvciAoY29uc3QgbjIgb2YgdDMubmFtZXMpCiAgICAgICAgICBpZiAocihlMywgbjIpKQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0sIHQzLmh1bWFuaXplID0gbig5MTkyKSwgdDMuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGNvbnNvbGUud2FybigiSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLiIpOwogICAgICB9LCBPYmplY3Qua2V5cyhlMikuZm9yRWFjaCgobjIpID0+IHsKICAgICAgICB0M1tuMl0gPSBlMltuMl07CiAgICAgIH0pLCB0My5uYW1lcyA9IFtdLCB0My5za2lwcyA9IFtdLCB0My5mb3JtYXR0ZXJzID0ge30sIHQzLnNlbGVjdENvbG9yID0gZnVuY3Rpb24oZTMpIHsKICAgICAgICBsZXQgbjIgPSAwOwogICAgICAgIGZvciAobGV0IHQ0ID0gMDt0NCA8IGUzLmxlbmd0aDsgdDQrKykKICAgICAgICAgIG4yID0gKG4yIDw8IDUpIC0gbjIgKyBlMy5jaGFyQ29kZUF0KHQ0KSwgbjIgfD0gMDsKICAgICAgICByZXR1cm4gdDMuY29sb3JzW01hdGguYWJzKG4yKSAlIHQzLmNvbG9ycy5sZW5ndGhdOwogICAgICB9LCB0My5lbmFibGUodDMubG9hZCgpKSwgdDM7CiAgICB9OwogIH0sIDExMjQ6IChlLCB0MiwgbikgPT4gewogICAgdmFyIGkgPSBuKDYyNDApLCByID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwgbyA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7CiAgICBmdW5jdGlvbiBzKGUyLCB0MywgbjIpIHsKICAgICAgdmFyIG8yID0gdDNbbjJdOwogICAgICBpZiAobzIgIT0gbnVsbCkgewogICAgICAgIGlmIChyLmNhbGwoZTIsIG4yKSAmJiAoZTJbbjJdID09PSB1bmRlZmluZWQgfHwgZTJbbjJdID09PSBudWxsKSkKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCAoIiArIG4yICsgIikiKTsKICAgICAgICByLmNhbGwoZTIsIG4yKSAmJiBpKG8yKSA/IGUyW24yXSA9IGEoT2JqZWN0KGUyW24yXSksIHQzW24yXSkgOiBlMltuMl0gPSBvMjsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYShlMiwgdDMpIHsKICAgICAgaWYgKGUyID09PSB0MykKICAgICAgICByZXR1cm4gZTI7CiAgICAgIGZvciAodmFyIG4yIGluIHQzID0gT2JqZWN0KHQzKSkKICAgICAgICByLmNhbGwodDMsIG4yKSAmJiBzKGUyLCB0MywgbjIpOwogICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykKICAgICAgICBmb3IgKHZhciBpMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModDMpLCBhMiA9IDA7YTIgPCBpMi5sZW5ndGg7IGEyKyspCiAgICAgICAgICBvLmNhbGwodDMsIGkyW2EyXSkgJiYgcyhlMiwgdDMsIGkyW2EyXSk7CiAgICAgIHJldHVybiBlMjsKICAgIH0KICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGUyKSB7CiAgICAgIGUyID0gZnVuY3Rpb24oZTMpIHsKICAgICAgICBpZiAoZTMgPT0gbnVsbCkKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlNvdXJjZXMgY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkIik7CiAgICAgICAgcmV0dXJuIE9iamVjdChlMyk7CiAgICAgIH0oZTIpOwogICAgICBmb3IgKHZhciB0MyA9IDE7dDMgPCBhcmd1bWVudHMubGVuZ3RoOyB0MysrKQogICAgICAgIGEoZTIsIGFyZ3VtZW50c1t0M10pOwogICAgICByZXR1cm4gZTI7CiAgICB9OwogIH0sIDg0ODA6IChlKSA9PiB7CiAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbihlMikgewogICAgICBzd2l0Y2ggKGUyKSB7CiAgICAgICAgY2FzZSAiaW50OCI6CiAgICAgICAgICByZXR1cm4gSW50OEFycmF5OwogICAgICAgIGNhc2UgImludDE2IjoKICAgICAgICAgIHJldHVybiBJbnQxNkFycmF5OwogICAgICAgIGNhc2UgImludDMyIjoKICAgICAgICAgIHJldHVybiBJbnQzMkFycmF5OwogICAgICAgIGNhc2UgInVpbnQ4IjoKICAgICAgICAgIHJldHVybiBVaW50OEFycmF5OwogICAgICAgIGNhc2UgInVpbnQxNiI6CiAgICAgICAgICByZXR1cm4gVWludDE2QXJyYXk7CiAgICAgICAgY2FzZSAidWludDMyIjoKICAgICAgICAgIHJldHVybiBVaW50MzJBcnJheTsKICAgICAgICBjYXNlICJmbG9hdDMyIjoKICAgICAgICAgIHJldHVybiBGbG9hdDMyQXJyYXk7CiAgICAgICAgY2FzZSAiZmxvYXQ2NCI6CiAgICAgICAgICByZXR1cm4gRmxvYXQ2NEFycmF5OwogICAgICAgIGNhc2UgImFycmF5IjoKICAgICAgICAgIHJldHVybiBBcnJheTsKICAgICAgICBjYXNlICJ1aW50OF9jbGFtcGVkIjoKICAgICAgICAgIHJldHVybiBVaW50OENsYW1wZWRBcnJheTsKICAgICAgfQogICAgfTsKICB9LCA5MTk6IChlLCB0MiwgbikgPT4gewogICAgdmFyIGk7CiAgICBpID0gdHlwZW9mIHdpbmRvdyAhPSAidW5kZWZpbmVkIiA/IHdpbmRvdyA6IG4uZyAhPT0gdW5kZWZpbmVkID8gbi5nIDogdHlwZW9mIHNlbGYgIT0gInVuZGVmaW5lZCIgPyBzZWxmIDoge30sIGUuZXhwb3J0cyA9IGk7CiAgfSwgMTAyNDogKGUsIHQyKSA9PiB7CiAgICB0Mi5yZWFkID0gZnVuY3Rpb24oZTIsIHQzLCBuLCBpLCByKSB7CiAgICAgIHZhciBvLCBzLCBhID0gOCAqIHIgLSBpIC0gMSwgQSA9ICgxIDw8IGEpIC0gMSwgbCA9IEEgPj4gMSwgYyA9IC03LCBoID0gbiA/IHIgLSAxIDogMCwgZCA9IG4gPyAtMSA6IDEsIHUgPSBlMlt0MyArIGhdOwogICAgICBmb3IgKGggKz0gZCwgbyA9IHUgJiAoMSA8PCAtYykgLSAxLCB1ID4+PSAtYywgYyArPSBhO2MgPiAwOyBvID0gMjU2ICogbyArIGUyW3QzICsgaF0sIGggKz0gZCwgYyAtPSA4KQogICAgICAgIDsKICAgICAgZm9yIChzID0gbyAmICgxIDw8IC1jKSAtIDEsIG8gPj49IC1jLCBjICs9IGk7YyA+IDA7IHMgPSAyNTYgKiBzICsgZTJbdDMgKyBoXSwgaCArPSBkLCBjIC09IDgpCiAgICAgICAgOwogICAgICBpZiAobyA9PT0gMCkKICAgICAgICBvID0gMSAtIGw7CiAgICAgIGVsc2UgewogICAgICAgIGlmIChvID09PSBBKQogICAgICAgICAgcmV0dXJuIHMgPyBOYU4gOiAxIC8gMCAqICh1ID8gLTEgOiAxKTsKICAgICAgICBzICs9IE1hdGgucG93KDIsIGkpLCBvIC09IGw7CiAgICAgIH0KICAgICAgcmV0dXJuICh1ID8gLTEgOiAxKSAqIHMgKiBNYXRoLnBvdygyLCBvIC0gaSk7CiAgICB9LCB0Mi53cml0ZSA9IGZ1bmN0aW9uKGUyLCB0MywgbiwgaSwgciwgbykgewogICAgICB2YXIgcywgYSwgQSwgbCA9IDggKiBvIC0gciAtIDEsIGMgPSAoMSA8PCBsKSAtIDEsIGggPSBjID4+IDEsIGQgPSByID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMCwgdSA9IGkgPyAwIDogbyAtIDEsIGcgPSBpID8gMSA6IC0xLCBwID0gdDMgPCAwIHx8IHQzID09PSAwICYmIDEgLyB0MyA8IDAgPyAxIDogMDsKICAgICAgZm9yICh0MyA9IE1hdGguYWJzKHQzKSwgaXNOYU4odDMpIHx8IHQzID09PSAxIC8gMCA/IChhID0gaXNOYU4odDMpID8gMSA6IDAsIHMgPSBjKSA6IChzID0gTWF0aC5mbG9vcihNYXRoLmxvZyh0MykgLyBNYXRoLkxOMiksIHQzICogKEEgPSBNYXRoLnBvdygyLCAtcykpIDwgMSAmJiAocy0tLCBBICo9IDIpLCAodDMgKz0gcyArIGggPj0gMSA/IGQgLyBBIDogZCAqIE1hdGgucG93KDIsIDEgLSBoKSkgKiBBID49IDIgJiYgKHMrKywgQSAvPSAyKSwgcyArIGggPj0gYyA/IChhID0gMCwgcyA9IGMpIDogcyArIGggPj0gMSA/IChhID0gKHQzICogQSAtIDEpICogTWF0aC5wb3coMiwgciksIHMgKz0gaCkgOiAoYSA9IHQzICogTWF0aC5wb3coMiwgaCAtIDEpICogTWF0aC5wb3coMiwgciksIHMgPSAwKSk7ciA+PSA4OyBlMltuICsgdV0gPSAyNTUgJiBhLCB1ICs9IGcsIGEgLz0gMjU2LCByIC09IDgpCiAgICAgICAgOwogICAgICBmb3IgKHMgPSBzIDw8IHIgfCBhLCBsICs9IHI7bCA+IDA7IGUyW24gKyB1XSA9IDI1NSAmIHMsIHUgKz0gZywgcyAvPSAyNTYsIGwgLT0gOCkKICAgICAgICA7CiAgICAgIGUyW24gKyB1IC0gZ10gfD0gMTI4ICogcDsKICAgIH07CiAgfSwgMjIyNTogKGUpID0+IHsKICAgIGZ1bmN0aW9uIHQyKGUyKSB7CiAgICAgIHJldHVybiAhIWUyLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBlMi5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PSAiZnVuY3Rpb24iICYmIGUyLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUyKTsKICAgIH0KICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGUyKSB7CiAgICAgIHJldHVybiBlMiAhPSBudWxsICYmICh0MihlMikgfHwgZnVuY3Rpb24oZTMpIHsKICAgICAgICByZXR1cm4gdHlwZW9mIGUzLnJlYWRGbG9hdExFID09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIGUzLnNsaWNlID09ICJmdW5jdGlvbiIgJiYgdDIoZTMuc2xpY2UoMCwgMCkpOwogICAgICB9KGUyKSB8fCAhIWUyLl9pc0J1ZmZlcik7CiAgICB9OwogIH0sIDg4NDc6IChlKSA9PiB7CiAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbihlMikgewogICAgICBpZiAoIWUyKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgdmFyIG4gPSB0Mi5jYWxsKGUyKTsKICAgICAgcmV0dXJuIG4gPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSIgfHwgdHlwZW9mIGUyID09ICJmdW5jdGlvbiIgJiYgbiAhPT0gIltvYmplY3QgUmVnRXhwXSIgfHwgdHlwZW9mIHdpbmRvdyAhPSAidW5kZWZpbmVkIiAmJiAoZTIgPT09IHdpbmRvdy5zZXRUaW1lb3V0IHx8IGUyID09PSB3aW5kb3cuYWxlcnQgfHwgZTIgPT09IHdpbmRvdy5jb25maXJtIHx8IGUyID09PSB3aW5kb3cucHJvbXB0KTsKICAgIH07CiAgICB2YXIgdDIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogIH0sIDYyNDA6IChlKSA9PiB7CiAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbihlMikgewogICAgICB2YXIgdDIgPSB0eXBlb2YgZTI7CiAgICAgIHJldHVybiBlMiAhPT0gbnVsbCAmJiAodDIgPT09ICJvYmplY3QiIHx8IHQyID09PSAiZnVuY3Rpb24iKTsKICAgIH07CiAgfSwgNTY1MTogKGUsIHQyLCBuKSA9PiB7CiAgICB2YXIgaSA9IG4oNTQwNiksIHIgPSBuKDQ1OTcpLCBvID0gbig1NzM0KSwgcyA9IFsieCIsICJlIiwgImEiLCAibyIsICJuIiwgInMiLCAiciIsICJjIiwgInUiLCAibSIsICJ2IiwgInciLCAieiJdLCBhID0gWyJtIiwgInciXSwgQSA9IFsiSCIsICJJIiwgIk4iLCAiRSIsICJGIiwgIksiLCAiTCIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIl0sIGwgPSA5LCBjID0gMzI7CiAgICBmdW5jdGlvbiBoKGUyKSB7CiAgICAgIHRoaXMuZ2x5cGhzID0gW10sIHRoaXMuX21lYXN1cmUgPSB0aGlzLmNvbXB1dGVNZXRyaWNzLmJpbmQodGhpcyksIHRoaXMudXBkYXRlKGUyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGQoZTIpIHsKICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbihbInJldHVybiBmdW5jdGlvbiAiICsgZTIgKyAiKCkgeyIsICIgIHJldHVybiB0aGlzLl8iICsgZTIsICJ9Il0uam9pbihgCmApKSgpOwogICAgfQogICAgZnVuY3Rpb24gdShlMiwgdDMpIHsKICAgICAgaWYgKCFlMi5jaGFycyB8fCBlMi5jaGFycy5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIHZhciBuMiA9IHAoZTIuY2hhcnMsIHQzKTsKICAgICAgcmV0dXJuIG4yID49IDAgPyBlMi5jaGFyc1tuMl0gOiBudWxsOwogICAgfQogICAgZnVuY3Rpb24gZyhlMiwgdDMsIG4yKSB7CiAgICAgIGlmICghZTIua2VybmluZ3MgfHwgZTIua2VybmluZ3MubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybiAwOwogICAgICBmb3IgKHZhciBpMiA9IGUyLmtlcm5pbmdzLCByMiA9IDA7cjIgPCBpMi5sZW5ndGg7IHIyKyspIHsKICAgICAgICB2YXIgbzIgPSBpMltyMl07CiAgICAgICAgaWYgKG8yLmZpcnN0ID09PSB0MyAmJiBvMi5zZWNvbmQgPT09IG4yKQogICAgICAgICAgcmV0dXJuIG8yLmFtb3VudDsKICAgICAgfQogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGZ1bmN0aW9uIHAoZTIsIHQzLCBuMikgewogICAgICBmb3IgKHZhciBpMiA9IG4yID0gbjIgfHwgMDtpMiA8IGUyLmxlbmd0aDsgaTIrKykKICAgICAgICBpZiAoZTJbaTJdLmlkID09PSB0MykKICAgICAgICAgIHJldHVybiBpMjsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZS5leHBvcnRzID0gZnVuY3Rpb24oZTIpIHsKICAgICAgcmV0dXJuIG5ldyBoKGUyKTsKICAgIH0sIGgucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKGUyKSB7CiAgICAgIGlmIChlMiA9IHIoeyBtZWFzdXJlOiB0aGlzLl9tZWFzdXJlIH0sIGUyKSwgdGhpcy5fb3B0ID0gZTIsIHRoaXMuX29wdC50YWJTaXplID0gbyh0aGlzLl9vcHQudGFiU2l6ZSwgNCksICFlMi5mb250KQogICAgICAgIHRocm93IG5ldyBFcnJvcigibXVzdCBwcm92aWRlIGEgdmFsaWQgYml0bWFwIGZvbnQiKTsKICAgICAgdmFyIHQzID0gdGhpcy5nbHlwaHMsIG4yID0gZTIudGV4dCB8fCAiIiwgYTIgPSBlMi5mb250OwogICAgICB0aGlzLl9zZXR1cFNwYWNlR2x5cGhzKGEyKTsKICAgICAgdmFyIGwyID0gaS5saW5lcyhuMiwgZTIpLCBjMiA9IGUyLndpZHRoIHx8IDA7CiAgICAgIHQzLmxlbmd0aCA9IDA7CiAgICAgIHZhciBoMiA9IGwyLnJlZHVjZShmdW5jdGlvbihlMywgdDQpIHsKICAgICAgICByZXR1cm4gTWF0aC5tYXgoZTMsIHQ0LndpZHRoLCBjMik7CiAgICAgIH0sIDApLCBkMiA9IDAsIHUyID0gMCwgZiA9IG8oZTIubGluZUhlaWdodCwgYTIuY29tbW9uLmxpbmVIZWlnaHQpLCBtID0gYTIuY29tbW9uLmJhc2UsIEUgPSBmIC0gbSwgQyA9IGUyLmxldHRlclNwYWNpbmcgfHwgMCwgdiA9IGYgKiBsMi5sZW5ndGggLSBFLCBCID0gZnVuY3Rpb24oZTMpIHsKICAgICAgICByZXR1cm4gZTMgPT09ICJjZW50ZXIiID8gMSA6IGUzID09PSAicmlnaHQiID8gMiA6IDA7CiAgICAgIH0odGhpcy5fb3B0LmFsaWduKTsKICAgICAgdTIgLT0gdiwgdGhpcy5fd2lkdGggPSBoMiwgdGhpcy5faGVpZ2h0ID0gdiwgdGhpcy5fZGVzY2VuZGVyID0gZiAtIG0sIHRoaXMuX2Jhc2VsaW5lID0gbSwgdGhpcy5feEhlaWdodCA9IGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgZm9yICh2YXIgdDQgPSAwO3Q0IDwgcy5sZW5ndGg7IHQ0KyspIHsKICAgICAgICAgIHZhciBuMyA9IHNbdDRdLmNoYXJDb2RlQXQoMCksIGkyID0gcChlMy5jaGFycywgbjMpOwogICAgICAgICAgaWYgKGkyID49IDApCiAgICAgICAgICAgIHJldHVybiBlMy5jaGFyc1tpMl0uaGVpZ2h0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgICAgfShhMiksIHRoaXMuX2NhcEhlaWdodCA9IGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgZm9yICh2YXIgdDQgPSAwO3Q0IDwgQS5sZW5ndGg7IHQ0KyspIHsKICAgICAgICAgIHZhciBuMyA9IEFbdDRdLmNoYXJDb2RlQXQoMCksIGkyID0gcChlMy5jaGFycywgbjMpOwogICAgICAgICAgaWYgKGkyID49IDApCiAgICAgICAgICAgIHJldHVybiBlMy5jaGFyc1tpMl0uaGVpZ2h0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgICAgfShhMiksIHRoaXMuX2xpbmVIZWlnaHQgPSBmLCB0aGlzLl9hc2NlbmRlciA9IGYgLSBFIC0gdGhpcy5feEhlaWdodDsKICAgICAgdmFyIGIgPSB0aGlzOwogICAgICBsMi5mb3JFYWNoKGZ1bmN0aW9uKGUzLCBpMikgewogICAgICAgIGZvciAodmFyIHIyLCBvMiA9IGUzLnN0YXJ0LCBzMiA9IGUzLmVuZCwgQTIgPSBlMy53aWR0aCwgbDMgPSBvMjtsMyA8IHMyOyBsMysrKSB7CiAgICAgICAgICB2YXIgYzMgPSBuMi5jaGFyQ29kZUF0KGwzKSwgcDIgPSBiLmdldEdseXBoKGEyLCBjMyk7CiAgICAgICAgICBpZiAocDIpIHsKICAgICAgICAgICAgcjIgJiYgKGQyICs9IGcoYTIsIHIyLmlkLCBwMi5pZCkpOwogICAgICAgICAgICB2YXIgbTIgPSBkMjsKICAgICAgICAgICAgQiA9PT0gMSA/IG0yICs9IChoMiAtIEEyKSAvIDIgOiBCID09PSAyICYmIChtMiArPSBoMiAtIEEyKSwgdDMucHVzaCh7IHBvc2l0aW9uOiBbbTIsIHUyXSwgZGF0YTogcDIsIGluZGV4OiBsMywgbGluZTogaTIgfSksIGQyICs9IHAyLnhhZHZhbmNlICsgQywgcjIgPSBwMjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdTIgKz0gZiwgZDIgPSAwOwogICAgICB9KSwgdGhpcy5fbGluZXNUb3RhbCA9IGwyLmxlbmd0aDsKICAgIH0sIGgucHJvdG90eXBlLl9zZXR1cFNwYWNlR2x5cGhzID0gZnVuY3Rpb24oZTIpIHsKICAgICAgaWYgKHRoaXMuX2ZhbGxiYWNrU3BhY2VHbHlwaCA9IG51bGwsIHRoaXMuX2ZhbGxiYWNrVGFiR2x5cGggPSBudWxsLCBlMi5jaGFycyAmJiBlMi5jaGFycy5sZW5ndGggIT09IDApIHsKICAgICAgICB2YXIgdDMgPSB1KGUyLCBjKSB8fCBmdW5jdGlvbihlMykgewogICAgICAgICAgZm9yICh2YXIgdDQgPSAwO3Q0IDwgYS5sZW5ndGg7IHQ0KyspIHsKICAgICAgICAgICAgdmFyIG4zID0gYVt0NF0uY2hhckNvZGVBdCgwKSwgaTIgPSBwKGUzLmNoYXJzLCBuMyk7CiAgICAgICAgICAgIGlmIChpMiA+PSAwKQogICAgICAgICAgICAgIHJldHVybiBlMy5jaGFyc1tpMl07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9KGUyKSB8fCBlMi5jaGFyc1swXSwgbjIgPSB0aGlzLl9vcHQudGFiU2l6ZSAqIHQzLnhhZHZhbmNlOwogICAgICAgIHRoaXMuX2ZhbGxiYWNrU3BhY2VHbHlwaCA9IHQzLCB0aGlzLl9mYWxsYmFja1RhYkdseXBoID0gcih0MywgeyB4OiAwLCB5OiAwLCB4YWR2YW5jZTogbjIsIGlkOiBsLCB4b2Zmc2V0OiAwLCB5b2Zmc2V0OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pOwogICAgICB9CiAgICB9LCBoLnByb3RvdHlwZS5nZXRHbHlwaCA9IGZ1bmN0aW9uKGUyLCB0MykgewogICAgICByZXR1cm4gdShlMiwgdDMpIHx8ICh0MyA9PT0gbCA/IHRoaXMuX2ZhbGxiYWNrVGFiR2x5cGggOiB0MyA9PT0gYyA/IHRoaXMuX2ZhbGxiYWNrU3BhY2VHbHlwaCA6IG51bGwpOwogICAgfSwgaC5wcm90b3R5cGUuY29tcHV0ZU1ldHJpY3MgPSBmdW5jdGlvbihlMiwgdDMsIG4yLCBpMikgewogICAgICB2YXIgcjIsIG8yID0gdGhpcy5fb3B0LmxldHRlclNwYWNpbmcgfHwgMCwgczIgPSB0aGlzLl9vcHQuZm9udCwgYTIgPSAwLCBBMiA9IDAsIGwyID0gMDsKICAgICAgaWYgKCFzMi5jaGFycyB8fCBzMi5jaGFycy5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHQzLCBlbmQ6IHQzLCB3aWR0aDogMCB9OwogICAgICBuMiA9IE1hdGgubWluKGUyLmxlbmd0aCwgbjIpOwogICAgICBmb3IgKHZhciBjMiA9IHQzO2MyIDwgbjI7IGMyKyspIHsKICAgICAgICB2YXIgaDIsIGQyID0gZTIuY2hhckNvZGVBdChjMik7CiAgICAgICAgaWYgKGgyID0gdGhpcy5nZXRHbHlwaChzMiwgZDIpKSB7CiAgICAgICAgICBoMi54b2Zmc2V0OwogICAgICAgICAgdmFyIHUyID0gKGEyICs9IHIyID8gZyhzMiwgcjIuaWQsIGgyLmlkKSA6IDApICsgaDIueGFkdmFuY2UgKyBvMiwgcDIgPSBhMiArIGgyLndpZHRoOwogICAgICAgICAgaWYgKHAyID49IGkyIHx8IHUyID49IGkyKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGEyID0gdTIsIEEyID0gcDIsIHIyID0gaDI7CiAgICAgICAgfQogICAgICAgIGwyKys7CiAgICAgIH0KICAgICAgcmV0dXJuIHIyICYmIChBMiArPSByMi54b2Zmc2V0KSwgeyBzdGFydDogdDMsIGVuZDogdDMgKyBsMiwgd2lkdGg6IEEyIH07CiAgICB9LCBbIndpZHRoIiwgImhlaWdodCIsICJkZXNjZW5kZXIiLCAiYXNjZW5kZXIiLCAieEhlaWdodCIsICJiYXNlbGluZSIsICJjYXBIZWlnaHQiLCAibGluZUhlaWdodCJdLmZvckVhY2goZnVuY3Rpb24oZTIpIHsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGgucHJvdG90eXBlLCBlMiwgeyBnZXQ6IGQoZTIpLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICB9KTsKICB9LCA1NzUxOiAoZSwgdDIsIG4pID0+IHsKICAgIHZhciBpID0gbig5OTIyKS5ocCwgciA9IG4oMzU1OCksIG8gPSBmdW5jdGlvbigpIHt9LCBzID0gbigxNDc2KSwgYSA9IG4oNzAzNCksIEEgPSBuKDc0ODApLCBsID0gbig1NzMpLCBjID0gbig0NTk3KSwgaCA9IHNlbGYuWE1MSHR0cFJlcXVlc3QgJiYgIndpdGhDcmVkZW50aWFscyIgaW4gbmV3IFhNTEh0dHBSZXF1ZXN0OwogICAgZS5leHBvcnRzID0gZnVuY3Rpb24oZTIsIHQzKSB7CiAgICAgIHQzID0gdHlwZW9mIHQzID09ICJmdW5jdGlvbiIgPyB0MyA6IG8sIHR5cGVvZiBlMiA9PSAic3RyaW5nIiA/IGUyID0geyB1cmk6IGUyIH0gOiBlMiB8fCAoZTIgPSB7fSksIGUyLmJpbmFyeSAmJiAoZTIgPSBmdW5jdGlvbihlMykgewogICAgICAgIGlmIChoKQogICAgICAgICAgcmV0dXJuIGMoZTMsIHsgcmVzcG9uc2VUeXBlOiAiYXJyYXlidWZmZXIiIH0pOwogICAgICAgIGlmIChzZWxmLlhNTEh0dHBSZXF1ZXN0ID09PSB1bmRlZmluZWQpCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInlvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFhIUiBsb2FkaW5nIik7CiAgICAgICAgdmFyIHQ0ID0gbmV3IHNlbGYuWE1MSHR0cFJlcXVlc3Q7CiAgICAgICAgcmV0dXJuIHQ0Lm92ZXJyaWRlTWltZVR5cGUoInRleHQvcGxhaW47IGNoYXJzZXQ9eC11c2VyLWRlZmluZWQiKSwgYyh7IHhocjogdDQgfSwgZTMpOwogICAgICB9KGUyKSksIHIoZTIsIGZ1bmN0aW9uKG4yLCByMiwgYzIpIHsKICAgICAgICBpZiAobjIpCiAgICAgICAgICByZXR1cm4gdDMobjIpOwogICAgICAgIGlmICghL14yLy50ZXN0KHIyLnN0YXR1c0NvZGUpKQogICAgICAgICAgcmV0dXJuIHQzKG5ldyBFcnJvcigiaHR0cCBzdGF0dXMgY29kZTogIiArIHIyLnN0YXR1c0NvZGUpKTsKICAgICAgICBpZiAoIWMyKQogICAgICAgICAgcmV0dXJuIHQzKG5ldyBFcnJvcigibm8gYm9keSByZXN1bHQiKSk7CiAgICAgICAgdmFyIGgyLCBkLCB1ID0gZmFsc2U7CiAgICAgICAgaWYgKGgyID0gYzIsIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChoMikgPT09ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIpIHsKICAgICAgICAgIHZhciBnID0gbmV3IFVpbnQ4QXJyYXkoYzIpOwogICAgICAgICAgYzIgPSBpLmZyb20oZywgImJpbmFyeSIpOwogICAgICAgIH0KICAgICAgICBsKGMyKSAmJiAodSA9IHRydWUsIHR5cGVvZiBjMiA9PSAic3RyaW5nIiAmJiAoYzIgPSBpLmZyb20oYzIsICJiaW5hcnkiKSkpLCB1IHx8IChpLmlzQnVmZmVyKGMyKSAmJiAoYzIgPSBjMi50b1N0cmluZyhlMi5lbmNvZGluZykpLCBjMiA9IGMyLnRyaW0oKSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciBwID0gcjIuaGVhZGVyc1siY29udGVudC10eXBlIl07CiAgICAgICAgICBkID0gdSA/IEEoYzIpIDogL2pzb24vLnRlc3QocCkgfHwgYzIuY2hhckF0KDApID09PSAieyIgPyBKU09OLnBhcnNlKGMyKSA6IC94bWwvLnRlc3QocCkgfHwgYzIuY2hhckF0KDApID09PSAiPCIgPyBhKGMyKSA6IHMoYzIpOwogICAgICAgIH0gY2F0Y2ggKGUzKSB7CiAgICAgICAgICB0MyhuZXcgRXJyb3IoImVycm9yIHBhcnNpbmcgZm9udCAiICsgZTMubWVzc2FnZSkpLCB0MyA9IG87CiAgICAgICAgfQogICAgICAgIHQzKG51bGwsIGQpOwogICAgICB9KTsKICAgIH07CiAgfSwgNTczOiAoZSwgdDIsIG4pID0+IHsKICAgIHZhciBpID0gbig5OTIyKS5ocCwgciA9IG4oOTExKSwgbyA9IGkuZnJvbShbNjYsIDc3LCA3MCwgM10pOwogICAgZS5leHBvcnRzID0gZnVuY3Rpb24oZTIpIHsKICAgICAgcmV0dXJuIHR5cGVvZiBlMiA9PSAic3RyaW5nIiA/IGUyLnN1YnN0cmluZygwLCAzKSA9PT0gIkJNRiIgOiBlMi5sZW5ndGggPiA0ICYmIHIoZTIuc2xpY2UoMCwgNCksIG8pOwogICAgfTsKICB9LCA5MTkyOiAoZSkgPT4gewogICAgdmFyIHQyID0gMTAwMCwgbiA9IDYwICogdDIsIGkgPSA2MCAqIG4sIHIgPSAyNCAqIGksIG8gPSA3ICogcjsKICAgIGZ1bmN0aW9uIHMoZTIsIHQzLCBuMiwgaTIpIHsKICAgICAgdmFyIHIyID0gdDMgPj0gMS41ICogbjI7CiAgICAgIHJldHVybiBNYXRoLnJvdW5kKGUyIC8gbjIpICsgIiAiICsgaTIgKyAocjIgPyAicyIgOiAiIik7CiAgICB9CiAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbihlMiwgYSkgewogICAgICBhID0gYSB8fCB7fTsKICAgICAgdmFyIEEsIGwsIGMgPSB0eXBlb2YgZTI7CiAgICAgIGlmIChjID09PSAic3RyaW5nIiAmJiBlMi5sZW5ndGggPiAwKQogICAgICAgIHJldHVybiBmdW5jdGlvbihlMykgewogICAgICAgICAgaWYgKCEoKGUzID0gU3RyaW5nKGUzKSkubGVuZ3RoID4gMTAwKSkgewogICAgICAgICAgICB2YXIgczIgPSAvXigtPyg/OlxkKyk/XC4/XGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoZTMpOwogICAgICAgICAgICBpZiAoczIpIHsKICAgICAgICAgICAgICB2YXIgYTIgPSBwYXJzZUZsb2F0KHMyWzFdKTsKICAgICAgICAgICAgICBzd2l0Y2ggKChzMlsyXSB8fCAibXMiKS50b0xvd2VyQ2FzZSgpKSB7CiAgICAgICAgICAgICAgICBjYXNlICJ5ZWFycyI6CiAgICAgICAgICAgICAgICBjYXNlICJ5ZWFyIjoKICAgICAgICAgICAgICAgIGNhc2UgInlycyI6CiAgICAgICAgICAgICAgICBjYXNlICJ5ciI6CiAgICAgICAgICAgICAgICBjYXNlICJ5IjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIDMxNTU3NjAwMDAwICogYTI7CiAgICAgICAgICAgICAgICBjYXNlICJ3ZWVrcyI6CiAgICAgICAgICAgICAgICBjYXNlICJ3ZWVrIjoKICAgICAgICAgICAgICAgIGNhc2UgInciOgogICAgICAgICAgICAgICAgICByZXR1cm4gYTIgKiBvOwogICAgICAgICAgICAgICAgY2FzZSAiZGF5cyI6CiAgICAgICAgICAgICAgICBjYXNlICJkYXkiOgogICAgICAgICAgICAgICAgY2FzZSAiZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBhMiAqIHI7CiAgICAgICAgICAgICAgICBjYXNlICJob3VycyI6CiAgICAgICAgICAgICAgICBjYXNlICJob3VyIjoKICAgICAgICAgICAgICAgIGNhc2UgImhycyI6CiAgICAgICAgICAgICAgICBjYXNlICJociI6CiAgICAgICAgICAgICAgICBjYXNlICJoIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIGEyICogaTsKICAgICAgICAgICAgICAgIGNhc2UgIm1pbnV0ZXMiOgogICAgICAgICAgICAgICAgY2FzZSAibWludXRlIjoKICAgICAgICAgICAgICAgIGNhc2UgIm1pbnMiOgogICAgICAgICAgICAgICAgY2FzZSAibWluIjoKICAgICAgICAgICAgICAgIGNhc2UgIm0iOgogICAgICAgICAgICAgICAgICByZXR1cm4gYTIgKiBuOwogICAgICAgICAgICAgICAgY2FzZSAic2Vjb25kcyI6CiAgICAgICAgICAgICAgICBjYXNlICJzZWNvbmQiOgogICAgICAgICAgICAgICAgY2FzZSAic2VjcyI6CiAgICAgICAgICAgICAgICBjYXNlICJzZWMiOgogICAgICAgICAgICAgICAgY2FzZSAicyI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBhMiAqIHQyOwogICAgICAgICAgICAgICAgY2FzZSAibWlsbGlzZWNvbmRzIjoKICAgICAgICAgICAgICAgIGNhc2UgIm1pbGxpc2Vjb25kIjoKICAgICAgICAgICAgICAgIGNhc2UgIm1zZWNzIjoKICAgICAgICAgICAgICAgIGNhc2UgIm1zZWMiOgogICAgICAgICAgICAgICAgY2FzZSAibXMiOgogICAgICAgICAgICAgICAgICByZXR1cm4gYTI7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfShlMik7CiAgICAgIGlmIChjID09PSAibnVtYmVyIiAmJiBpc0Zpbml0ZShlMikpCiAgICAgICAgcmV0dXJuIGEubG9uZyA/IChBID0gZTIsIChsID0gTWF0aC5hYnMoQSkpID49IHIgPyBzKEEsIGwsIHIsICJkYXkiKSA6IGwgPj0gaSA/IHMoQSwgbCwgaSwgImhvdXIiKSA6IGwgPj0gbiA/IHMoQSwgbCwgbiwgIm1pbnV0ZSIpIDogbCA+PSB0MiA/IHMoQSwgbCwgdDIsICJzZWNvbmQiKSA6IEEgKyAiIG1zIikgOiBmdW5jdGlvbihlMykgewogICAgICAgICAgdmFyIG8yID0gTWF0aC5hYnMoZTMpOwogICAgICAgICAgcmV0dXJuIG8yID49IHIgPyBNYXRoLnJvdW5kKGUzIC8gcikgKyAiZCIgOiBvMiA+PSBpID8gTWF0aC5yb3VuZChlMyAvIGkpICsgImgiIDogbzIgPj0gbiA/IE1hdGgucm91bmQoZTMgLyBuKSArICJtIiA6IG8yID49IHQyID8gTWF0aC5yb3VuZChlMyAvIHQyKSArICJzIiA6IGUzICsgIm1zIjsKICAgICAgICB9KGUyKTsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJ2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPSIgKyBKU09OLnN0cmluZ2lmeShlMikpOwogICAgfTsKICB9LCAxNDc2OiAoZSkgPT4gewogICAgZnVuY3Rpb24gdDIoZTIsIHQzKSB7CiAgICAgIGlmICghKGUyID0gZTIucmVwbGFjZSgvXHQrL2csICIgIikudHJpbSgpKSkKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgdmFyIGkgPSBlMi5pbmRleE9mKCIgIik7CiAgICAgIGlmIChpID09PSAtMSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIm5vIG5hbWVkIHJvdyBhdCBsaW5lICIgKyB0Myk7CiAgICAgIHZhciByID0gZTIuc3Vic3RyaW5nKDAsIGkpOwogICAgICBlMiA9IChlMiA9IChlMiA9IChlMiA9IGUyLnN1YnN0cmluZyhpICsgMSkpLnJlcGxhY2UoL2xldHRlcj1bXCdcIl1cUytbXCdcIl0vZ2ksICIiKSkuc3BsaXQoIj0iKSkubWFwKGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgcmV0dXJuIGUzLnRyaW0oKS5tYXRjaCgvKCIuKj8ifFteIlxzXSspKyg/PVxzKnxccyokKS9nKTsKICAgICAgfSk7CiAgICAgIGZvciAodmFyIG8gPSBbXSwgcyA9IDA7cyA8IGUyLmxlbmd0aDsgcysrKSB7CiAgICAgICAgdmFyIGEgPSBlMltzXTsKICAgICAgICBzID09PSAwID8gby5wdXNoKHsga2V5OiBhWzBdLCBkYXRhOiAiIiB9KSA6IHMgPT09IGUyLmxlbmd0aCAtIDEgPyBvW28ubGVuZ3RoIC0gMV0uZGF0YSA9IG4oYVswXSkgOiAob1tvLmxlbmd0aCAtIDFdLmRhdGEgPSBuKGFbMF0pLCBvLnB1c2goeyBrZXk6IGFbMV0sIGRhdGE6ICIiIH0pKTsKICAgICAgfQogICAgICB2YXIgQSA9IHsga2V5OiByLCBkYXRhOiB7fSB9OwogICAgICByZXR1cm4gby5mb3JFYWNoKGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgQS5kYXRhW2UzLmtleV0gPSBlMy5kYXRhOwogICAgICB9KSwgQTsKICAgIH0KICAgIGZ1bmN0aW9uIG4oZTIpIHsKICAgICAgcmV0dXJuIGUyICYmIGUyLmxlbmd0aCAhPT0gMCA/IGUyLmluZGV4T2YoJyInKSA9PT0gMCB8fCBlMi5pbmRleE9mKCInIikgPT09IDAgPyBlMi5zdWJzdHJpbmcoMSwgZTIubGVuZ3RoIC0gMSkgOiBlMi5pbmRleE9mKCIsIikgIT09IC0xID8gZnVuY3Rpb24oZTMpIHsKICAgICAgICByZXR1cm4gZTMuc3BsaXQoIiwiKS5tYXAoZnVuY3Rpb24oZTQpIHsKICAgICAgICAgIHJldHVybiBwYXJzZUludChlNCwgMTApOwogICAgICAgIH0pOwogICAgICB9KGUyKSA6IHBhcnNlSW50KGUyLCAxMCkgOiAiIjsKICAgIH0KICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGUyKSB7CiAgICAgIGlmICghZTIpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJubyBkYXRhIHByb3ZpZGVkIik7CiAgICAgIHZhciBuMiA9IHsgcGFnZXM6IFtdLCBjaGFyczogW10sIGtlcm5pbmdzOiBbXSB9LCBpID0gKGUyID0gZTIudG9TdHJpbmcoKS50cmltKCkpLnNwbGl0KC9cclxuP3xcbi9nKTsKICAgICAgaWYgKGkubGVuZ3RoID09PSAwKQogICAgICAgIHRocm93IG5ldyBFcnJvcigibm8gZGF0YSBpbiBCTUZvbnQgZmlsZSIpOwogICAgICBmb3IgKHZhciByID0gMDtyIDwgaS5sZW5ndGg7IHIrKykgewogICAgICAgIHZhciBvID0gdDIoaVtyXSwgcik7CiAgICAgICAgaWYgKG8pCiAgICAgICAgICBpZiAoby5rZXkgPT09ICJwYWdlIikgewogICAgICAgICAgICBpZiAodHlwZW9mIG8uZGF0YS5pZCAhPSAibnVtYmVyIikKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIm1hbGZvcm1lZCBmaWxlIGF0IGxpbmUgIiArIHIgKyAiIC0tIG5lZWRzIHBhZ2UgaWQ9TiIpOwogICAgICAgICAgICBpZiAodHlwZW9mIG8uZGF0YS5maWxlICE9ICJzdHJpbmciKQogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigibWFsZm9ybWVkIGZpbGUgYXQgbGluZSAiICsgciArICcgLS0gbmVlZHMgcGFnZSBmaWxlPSJwYXRoIicpOwogICAgICAgICAgICBuMi5wYWdlc1tvLmRhdGEuaWRdID0gby5kYXRhLmZpbGU7CiAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgby5rZXkgPT09ICJjaGFycyIgfHwgby5rZXkgPT09ICJrZXJuaW5ncyIgfHwgKG8ua2V5ID09PSAiY2hhciIgPyBuMi5jaGFycy5wdXNoKG8uZGF0YSkgOiBvLmtleSA9PT0gImtlcm5pbmciID8gbjIua2VybmluZ3MucHVzaChvLmRhdGEpIDogbjJbby5rZXldID0gby5kYXRhKTsKICAgICAgfQogICAgICByZXR1cm4gbjI7CiAgICB9OwogIH0sIDc0ODA6IChlKSA9PiB7CiAgICB2YXIgdDIgPSBbNjYsIDc3LCA3MF07CiAgICBmdW5jdGlvbiBuKGUyLCB0MywgbjIpIHsKICAgICAgaWYgKG4yID4gdDMubGVuZ3RoIC0gMSkKICAgICAgICByZXR1cm4gMDsKICAgICAgdmFyIHIgPSB0My5yZWFkVUludDgobjIrKyksIG8gPSB0My5yZWFkSW50MzJMRShuMik7CiAgICAgIHN3aXRjaCAobjIgKz0gNCwgcikgewogICAgICAgIGNhc2UgMToKICAgICAgICAgIGUyLmluZm8gPSBmdW5jdGlvbihlMywgdDQpIHsKICAgICAgICAgICAgdmFyIG4zID0ge307CiAgICAgICAgICAgIG4zLnNpemUgPSBlMy5yZWFkSW50MTZMRSh0NCk7CiAgICAgICAgICAgIHZhciByMiA9IGUzLnJlYWRVSW50OCh0NCArIDIpOwogICAgICAgICAgICByZXR1cm4gbjMuc21vb3RoID0gcjIgPj4gNyAmIDEsIG4zLnVuaWNvZGUgPSByMiA+PiA2ICYgMSwgbjMuaXRhbGljID0gcjIgPj4gNSAmIDEsIG4zLmJvbGQgPSByMiA+PiA0ICYgMSwgcjIgPj4gMyAmIDEgJiYgKG4zLmZpeGVkSGVpZ2h0ID0gMSksIG4zLmNoYXJzZXQgPSBlMy5yZWFkVUludDgodDQgKyAzKSB8fCAiIiwgbjMuc3RyZXRjaEggPSBlMy5yZWFkVUludDE2TEUodDQgKyA0KSwgbjMuYWEgPSBlMy5yZWFkVUludDgodDQgKyA2KSwgbjMucGFkZGluZyA9IFtlMy5yZWFkSW50OCh0NCArIDcpLCBlMy5yZWFkSW50OCh0NCArIDgpLCBlMy5yZWFkSW50OCh0NCArIDkpLCBlMy5yZWFkSW50OCh0NCArIDEwKV0sIG4zLnNwYWNpbmcgPSBbZTMucmVhZEludDgodDQgKyAxMSksIGUzLnJlYWRJbnQ4KHQ0ICsgMTIpXSwgbjMub3V0bGluZSA9IGUzLnJlYWRVSW50OCh0NCArIDEzKSwgbjMuZmFjZSA9IGZ1bmN0aW9uKGU0LCB0NSkgewogICAgICAgICAgICAgIHJldHVybiBpKGU0LCB0NSkudG9TdHJpbmcoInV0ZjgiKTsKICAgICAgICAgICAgfShlMywgdDQgKyAxNCksIG4zOwogICAgICAgICAgfSh0MywgbjIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgZTIuY29tbW9uID0gZnVuY3Rpb24oZTMsIHQ0KSB7CiAgICAgICAgICAgIHZhciBuMyA9IHt9OwogICAgICAgICAgICByZXR1cm4gbjMubGluZUhlaWdodCA9IGUzLnJlYWRVSW50MTZMRSh0NCksIG4zLmJhc2UgPSBlMy5yZWFkVUludDE2TEUodDQgKyAyKSwgbjMuc2NhbGVXID0gZTMucmVhZFVJbnQxNkxFKHQ0ICsgNCksIG4zLnNjYWxlSCA9IGUzLnJlYWRVSW50MTZMRSh0NCArIDYpLCBuMy5wYWdlcyA9IGUzLnJlYWRVSW50MTZMRSh0NCArIDgpLCBlMy5yZWFkVUludDgodDQgKyAxMCksIG4zLnBhY2tlZCA9IDAsIG4zLmFscGhhQ2hubCA9IGUzLnJlYWRVSW50OCh0NCArIDExKSwgbjMucmVkQ2hubCA9IGUzLnJlYWRVSW50OCh0NCArIDEyKSwgbjMuZ3JlZW5DaG5sID0gZTMucmVhZFVJbnQ4KHQ0ICsgMTMpLCBuMy5ibHVlQ2hubCA9IGUzLnJlYWRVSW50OCh0NCArIDE0KSwgbjM7CiAgICAgICAgICB9KHQzLCBuMik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICBlMi5wYWdlcyA9IGZ1bmN0aW9uKGUzLCB0NCwgbjMpIHsKICAgICAgICAgICAgZm9yICh2YXIgcjIgPSBbXSwgbzIgPSBpKGUzLCB0NCksIHMgPSBvMi5sZW5ndGggKyAxLCBhID0gbjMgLyBzLCBBID0gMDtBIDwgYTsgQSsrKQogICAgICAgICAgICAgIHIyW0FdID0gZTMuc2xpY2UodDQsIHQ0ICsgbzIubGVuZ3RoKS50b1N0cmluZygidXRmOCIpLCB0NCArPSBzOwogICAgICAgICAgICByZXR1cm4gcjI7CiAgICAgICAgICB9KHQzLCBuMiwgbyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICBlMi5jaGFycyA9IGZ1bmN0aW9uKGUzLCB0NCwgbjMpIHsKICAgICAgICAgICAgZm9yICh2YXIgaTIgPSBbXSwgcjIgPSBuMyAvIDIwLCBvMiA9IDA7bzIgPCByMjsgbzIrKykgewogICAgICAgICAgICAgIHZhciBzID0ge30sIGEgPSAyMCAqIG8yOwogICAgICAgICAgICAgIHMuaWQgPSBlMy5yZWFkVUludDMyTEUodDQgKyAwICsgYSksIHMueCA9IGUzLnJlYWRVSW50MTZMRSh0NCArIDQgKyBhKSwgcy55ID0gZTMucmVhZFVJbnQxNkxFKHQ0ICsgNiArIGEpLCBzLndpZHRoID0gZTMucmVhZFVJbnQxNkxFKHQ0ICsgOCArIGEpLCBzLmhlaWdodCA9IGUzLnJlYWRVSW50MTZMRSh0NCArIDEwICsgYSksIHMueG9mZnNldCA9IGUzLnJlYWRJbnQxNkxFKHQ0ICsgMTIgKyBhKSwgcy55b2Zmc2V0ID0gZTMucmVhZEludDE2TEUodDQgKyAxNCArIGEpLCBzLnhhZHZhbmNlID0gZTMucmVhZEludDE2TEUodDQgKyAxNiArIGEpLCBzLnBhZ2UgPSBlMy5yZWFkVUludDgodDQgKyAxOCArIGEpLCBzLmNobmwgPSBlMy5yZWFkVUludDgodDQgKyAxOSArIGEpLCBpMltvMl0gPSBzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpMjsKICAgICAgICAgIH0odDMsIG4yLCBvKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNToKICAgICAgICAgIGUyLmtlcm5pbmdzID0gZnVuY3Rpb24oZTMsIHQ0LCBuMykgewogICAgICAgICAgICBmb3IgKHZhciBpMiA9IFtdLCByMiA9IG4zIC8gMTAsIG8yID0gMDtvMiA8IHIyOyBvMisrKSB7CiAgICAgICAgICAgICAgdmFyIHMgPSB7fSwgYSA9IDEwICogbzI7CiAgICAgICAgICAgICAgcy5maXJzdCA9IGUzLnJlYWRVSW50MzJMRSh0NCArIDAgKyBhKSwgcy5zZWNvbmQgPSBlMy5yZWFkVUludDMyTEUodDQgKyA0ICsgYSksIHMuYW1vdW50ID0gZTMucmVhZEludDE2TEUodDQgKyA4ICsgYSksIGkyW28yXSA9IHM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGkyOwogICAgICAgICAgfSh0MywgbjIsIG8pOwogICAgICB9CiAgICAgIHJldHVybiA1ICsgbzsKICAgIH0KICAgIGZ1bmN0aW9uIGkoZTIsIHQzKSB7CiAgICAgIGZvciAodmFyIG4yID0gdDM7bjIgPCBlMi5sZW5ndGggJiYgZTJbbjJdICE9PSAwOyBuMisrKQogICAgICAgIDsKICAgICAgcmV0dXJuIGUyLnNsaWNlKHQzLCBuMik7CiAgICB9CiAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbihlMikgewogICAgICBpZiAoZTIubGVuZ3RoIDwgNikKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYnVmZmVyIGxlbmd0aCBmb3IgQk1Gb250Iik7CiAgICAgIHZhciBpMiA9IHQyLmV2ZXJ5KGZ1bmN0aW9uKHQzLCBuMikgewogICAgICAgIHJldHVybiBlMi5yZWFkVUludDgobjIpID09PSB0MzsKICAgICAgfSk7CiAgICAgIGlmICghaTIpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCTUZvbnQgbWlzc2luZyBCTUYgYnl0ZSBoZWFkZXIiKTsKICAgICAgdmFyIHIgPSAzOwogICAgICBpZiAoZTIucmVhZFVJbnQ4KHIrKykgPiAzKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiT25seSBzdXBwb3J0cyBCTUZvbnQgQmluYXJ5IHYzIChCTUZvbnQgQXBwIHYxLjEwKSIpOwogICAgICBmb3IgKHZhciBvID0geyBrZXJuaW5nczogW10sIGNoYXJzOiBbXSB9LCBzID0gMDtzIDwgNTsgcysrKQogICAgICAgIHIgKz0gbihvLCBlMiwgcik7CiAgICAgIHJldHVybiBvOwogICAgfTsKICB9LCA3MDM0OiAoZSwgdDIsIG4pID0+IHsKICAgIHZhciBpID0gbig3ODI5KSwgciA9IG4oMTg5NiksIG8gPSB7IHNjYWxlaDogInNjYWxlSCIsIHNjYWxldzogInNjYWxlVyIsIHN0cmV0Y2hoOiAic3RyZXRjaEgiLCBsaW5laGVpZ2h0OiAibGluZUhlaWdodCIsIGFscGhhY2hubDogImFscGhhQ2hubCIsIHJlZGNobmw6ICJyZWRDaG5sIiwgZ3JlZW5jaG5sOiAiZ3JlZW5DaG5sIiwgYmx1ZWNobmw6ICJibHVlQ2hubCIgfTsKICAgIGZ1bmN0aW9uIHMoZTIpIHsKICAgICAgdmFyIHQzID0gZnVuY3Rpb24oZTMpIHsKICAgICAgICBmb3IgKHZhciB0NCA9IFtdLCBuMiA9IDA7bjIgPCBlMy5hdHRyaWJ1dGVzLmxlbmd0aDsgbjIrKykKICAgICAgICAgIHQ0LnB1c2goZTMuYXR0cmlidXRlc1tuMl0pOwogICAgICAgIHJldHVybiB0NDsKICAgICAgfShlMik7CiAgICAgIHJldHVybiB0My5yZWR1Y2UoZnVuY3Rpb24oZTMsIHQ0KSB7CiAgICAgICAgdmFyIG4yOwogICAgICAgIHJldHVybiBlM1tuMiA9IHQ0Lm5vZGVOYW1lLCBvW24yLnRvTG93ZXJDYXNlKCldIHx8IG4yXSA9IHQ0Lm5vZGVWYWx1ZSwgZTM7CiAgICAgIH0sIHt9KTsKICAgIH0KICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGUyKSB7CiAgICAgIGUyID0gZTIudG9TdHJpbmcoKTsKICAgICAgdmFyIHQzID0gcihlMiksIG4yID0geyBwYWdlczogW10sIGNoYXJzOiBbXSwga2VybmluZ3M6IFtdIH07CiAgICAgIFsiaW5mbyIsICJjb21tb24iXS5mb3JFYWNoKGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgdmFyIHIyID0gdDMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZTMpWzBdOwogICAgICAgIHIyICYmIChuMltlM10gPSBpKHMocjIpKSk7CiAgICAgIH0pOwogICAgICB2YXIgbzIgPSB0My5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFnZXMiKVswXTsKICAgICAgaWYgKCFvMikKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIm1hbGZvcm1lZCBmaWxlIC0tIG5vIDxwYWdlcz4gZWxlbWVudCIpOwogICAgICBmb3IgKHZhciBhID0gbzIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhZ2UiKSwgQSA9IDA7QSA8IGEubGVuZ3RoOyBBKyspIHsKICAgICAgICB2YXIgbCA9IGFbQV0sIGMgPSBwYXJzZUludChsLmdldEF0dHJpYnV0ZSgiaWQiKSwgMTApLCBoID0gbC5nZXRBdHRyaWJ1dGUoImZpbGUiKTsKICAgICAgICBpZiAoaXNOYU4oYykpCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hbGZvcm1lZCBmaWxlIC0tIHBhZ2UgImlkIiBhdHRyaWJ1dGUgaXMgTmFOJyk7CiAgICAgICAgaWYgKCFoKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYWxmb3JtZWQgZmlsZSAtLSBuZWVkcyBwYWdlICJmaWxlIiBhdHRyaWJ1dGUnKTsKICAgICAgICBuMi5wYWdlc1twYXJzZUludChjLCAxMCldID0gaDsKICAgICAgfQogICAgICByZXR1cm4gWyJjaGFycyIsICJrZXJuaW5ncyJdLmZvckVhY2goZnVuY3Rpb24oZTMpIHsKICAgICAgICB2YXIgcjIgPSB0My5nZXRFbGVtZW50c0J5VGFnTmFtZShlMylbMF07CiAgICAgICAgaWYgKHIyKQogICAgICAgICAgZm9yICh2YXIgbzMgPSBlMy5zdWJzdHJpbmcoMCwgZTMubGVuZ3RoIC0gMSksIGEyID0gcjIuZ2V0RWxlbWVudHNCeVRhZ05hbWUobzMpLCBBMiA9IDA7QTIgPCBhMi5sZW5ndGg7IEEyKyspIHsKICAgICAgICAgICAgdmFyIGwyID0gYTJbQTJdOwogICAgICAgICAgICBuMltlM10ucHVzaChpKHMobDIpKSk7CiAgICAgICAgICB9CiAgICAgIH0pLCBuMjsKICAgIH07CiAgfSwgNzgyOTogKGUpID0+IHsKICAgIHZhciB0MiA9ICJjaGFzcnNldCI7CiAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbihlMikgewogICAgICBmb3IgKHZhciBuIGluIGUyID0gT2JqZWN0LmFzc2lnbih7fSwgZTIpLCB0MiBpbiBlMiAmJiAoZTIuY2hhcnNldCA9IGUyW3QyXSwgZGVsZXRlIGUyW3QyXSksIGUyKQogICAgICAgIG4gIT09ICJmYWNlIiAmJiBuICE9PSAiY2hhcnNldCIgJiYgKGUyW25dID0gbiA9PT0gInBhZGRpbmciIHx8IG4gPT09ICJzcGFjaW5nIiA/IGUyW25dLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoZTMsIDEwKTsKICAgICAgICB9KSA6IHBhcnNlSW50KGUyW25dLCAxMCkpOwogICAgICByZXR1cm4gZTI7CiAgICB9OwogIH0sIDMyMTY6IChlKSA9PiB7CiAgICB2YXIgdDIgPSBmdW5jdGlvbihlMikgewogICAgICByZXR1cm4gZTIucmVwbGFjZSgvXlxzK3xccyskL2csICIiKTsKICAgIH07CiAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbihlMikgewogICAgICBpZiAoIWUyKQogICAgICAgIHJldHVybiB7fTsKICAgICAgZm9yICh2YXIgbiwgaSA9IHt9LCByID0gdDIoZTIpLnNwbGl0KGAKYCksIG8gPSAwO28gPCByLmxlbmd0aDsgbysrKSB7CiAgICAgICAgdmFyIHMgPSByW29dLCBhID0gcy5pbmRleE9mKCI6IiksIEEgPSB0MihzLnNsaWNlKDAsIGEpKS50b0xvd2VyQ2FzZSgpLCBsID0gdDIocy5zbGljZShhICsgMSkpOwogICAgICAgIGlbQV0gPT09IHVuZGVmaW5lZCA/IGlbQV0gPSBsIDogKG4gPSBpW0FdLCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobikgPT09ICJbb2JqZWN0IEFycmF5XSIgPyBpW0FdLnB1c2gobCkgOiBpW0FdID0gW2lbQV0sIGxdKTsKICAgICAgfQogICAgICByZXR1cm4gaTsKICAgIH07CiAgfSwgOTAzNTogKGUsIHQyLCBuKSA9PiB7CiAgICB2YXIgaSA9IG4oODQ4MCksIHIgPSBuKDgxNjcpLCBvID0gbigyMjI1KSwgcyA9IFswLCAyLCAzXSwgYSA9IFsyLCAxLCAzXTsKICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGUyLCB0MykgewogICAgICBlMiAmJiAocihlMikgfHwgbyhlMikpIHx8ICh0MyA9IGUyIHx8IHt9LCBlMiA9IG51bGwpOwogICAgICBmb3IgKHZhciBuMiA9IHR5cGVvZiAodDMgPSB0eXBlb2YgdDMgPT0gIm51bWJlciIgPyB7IGNvdW50OiB0MyB9IDogdDMgfHwge30pLnR5cGUgPT0gInN0cmluZyIgPyB0My50eXBlIDogInVpbnQxNiIsIEEgPSB0eXBlb2YgdDMuY291bnQgPT0gIm51bWJlciIgPyB0My5jb3VudCA6IDEsIGwgPSB0My5zdGFydCB8fCAwLCBjID0gdDMuY2xvY2t3aXNlICE9PSBmYWxzZSA/IHMgOiBhLCBoID0gY1swXSwgZCA9IGNbMV0sIHUgPSBjWzJdLCBnID0gNiAqIEEsIHAgPSBlMiB8fCBuZXcgKGkobjIpKShnKSwgZiA9IDAsIG0gPSAwO2YgPCBnOyBmICs9IDYsIG0gKz0gNCkgewogICAgICAgIHZhciBFID0gZiArIGw7CiAgICAgICAgcFtFICsgMF0gPSBtICsgMCwgcFtFICsgMV0gPSBtICsgMSwgcFtFICsgMl0gPSBtICsgMiwgcFtFICsgM10gPSBtICsgaCwgcFtFICsgNF0gPSBtICsgZCwgcFtFICsgNV0gPSBtICsgdTsKICAgICAgfQogICAgICByZXR1cm4gcDsKICAgIH07CiAgfSwgNDQzMzogKGUsIHQyLCBuKSA9PiB7CiAgICB2YXIgaSA9IG4oNTY1MSksIHIgPSBuKDkwMzUpLCBvID0gbig3MTA2KSwgcyA9IG4oMTY4NCk7CiAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbihlMikgewogICAgICByZXR1cm4gbmV3IGEoZTIpOwogICAgfTsKCiAgICBjbGFzcyBhIGV4dGVuZHMgVEhSRUUuQnVmZmVyR2VvbWV0cnkgewogICAgICBjb25zdHJ1Y3RvcihlMikgewogICAgICAgIHN1cGVyKCksIHR5cGVvZiBlMiA9PSAic3RyaW5nIiAmJiAoZTIgPSB7IHRleHQ6IGUyIH0pLCB0aGlzLl9vcHQgPSBPYmplY3QuYXNzaWduKHt9LCBlMiksIGUyICYmIHRoaXMudXBkYXRlKGUyKTsKICAgICAgfQogICAgICB1cGRhdGUoZTIpIHsKICAgICAgICBpZiAodHlwZW9mIGUyID09ICJzdHJpbmciICYmIChlMiA9IHsgdGV4dDogZTIgfSksICEoZTIgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9vcHQsIGUyKSkuZm9udCkKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIm11c3Qgc3BlY2lmeSBhIHsgZm9udCB9IGluIG9wdGlvbnMiKTsKICAgICAgICB0aGlzLmxheW91dCA9IGkoZTIpOwogICAgICAgIHZhciB0MyA9IGUyLmZsaXBZICE9PSBmYWxzZSwgbjIgPSBlMi5mb250LCBzMiA9IG4yLmNvbW1vbi5zY2FsZVcsIGEyID0gbjIuY29tbW9uLnNjYWxlSCwgQSA9IHRoaXMubGF5b3V0LmdseXBocy5maWx0ZXIoZnVuY3Rpb24oZTMpIHsKICAgICAgICAgIHZhciB0NCA9IGUzLmRhdGE7CiAgICAgICAgICByZXR1cm4gdDQud2lkdGggKiB0NC5oZWlnaHQgPiAwOwogICAgICAgIH0pOwogICAgICAgIHRoaXMudmlzaWJsZUdseXBocyA9IEE7CiAgICAgICAgdmFyIGwgPSBvLnBvc2l0aW9ucyhBKSwgYyA9IG8udXZzKEEsIHMyLCBhMiwgdDMpLCBoID0gcihbXSwgeyBjbG9ja3dpc2U6IHRydWUsIHR5cGU6ICJ1aW50MTYiLCBjb3VudDogQS5sZW5ndGggfSk7CiAgICAgICAgaWYgKHRoaXMuc2V0SW5kZXgoaCksIHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUobCwgMikpLCB0aGlzLnNldEF0dHJpYnV0ZSgidXYiLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGMsIDIpKSwgIWUyLm11bHRpcGFnZSAmJiAicGFnZSIgaW4gdGhpcy5hdHRyaWJ1dGVzKQogICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoInBhZ2UiKTsKICAgICAgICBlbHNlIGlmIChlMi5tdWx0aXBhZ2UpIHsKICAgICAgICAgIHZhciBkID0gby5wYWdlcyhBKTsKICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCJwYWdlIiwgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShkLCAxKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgJiYgdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSwgdGhpcy5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCAmJiB0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwogICAgICB9CiAgICAgIGNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpIHsKICAgICAgICB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICYmICh0aGlzLmJvdW5kaW5nU3BoZXJlID0gbmV3IFRIUkVFLlNwaGVyZSk7CiAgICAgICAgdmFyIGUyID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5LCB0MyA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbi5pdGVtU2l6ZTsKICAgICAgICBpZiAoIWUyIHx8ICF0MyB8fCBlMi5sZW5ndGggPCAyKQogICAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzID0gMCwgdm9pZCB0aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlci5zZXQoMCwgMCwgMCk7CiAgICAgICAgcy5jb21wdXRlU3BoZXJlKGUyLCB0aGlzLmJvdW5kaW5nU3BoZXJlKSwgaXNOYU4odGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMpICYmIGNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nKTsKICAgICAgfQogICAgICBjb21wdXRlQm91bmRpbmdCb3goKSB7CiAgICAgICAgdGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCAmJiAodGhpcy5ib3VuZGluZ0JveCA9IG5ldyBUSFJFRS5Cb3gzKTsKICAgICAgICB2YXIgZTIgPSB0aGlzLmJvdW5kaW5nQm94LCB0MyA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheSwgbjIgPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24uaXRlbVNpemU7CiAgICAgICAgIXQzIHx8ICFuMiB8fCB0My5sZW5ndGggPCAyID8gZTIubWFrZUVtcHR5KCkgOiBzLmNvbXB1dGVCb3godDMsIGUyKTsKICAgICAgfQogICAgfQogIH0sIDE2ODQ6IChlKSA9PiB7CiAgICB2YXIgdDIgPSB7IG1pbjogWzAsIDBdLCBtYXg6IFswLCAwXSB9OwogICAgZnVuY3Rpb24gbihlMikgewogICAgICB2YXIgbjIgPSBlMi5sZW5ndGggLyAyOwogICAgICB0Mi5taW5bMF0gPSBlMlswXSwgdDIubWluWzFdID0gZTJbMV0sIHQyLm1heFswXSA9IGUyWzBdLCB0Mi5tYXhbMV0gPSBlMlsxXTsKICAgICAgZm9yICh2YXIgaSA9IDA7aSA8IG4yOyBpKyspIHsKICAgICAgICB2YXIgciA9IGUyWzIgKiBpICsgMF0sIG8gPSBlMlsyICogaSArIDFdOwogICAgICAgIHQyLm1pblswXSA9IE1hdGgubWluKHIsIHQyLm1pblswXSksIHQyLm1pblsxXSA9IE1hdGgubWluKG8sIHQyLm1pblsxXSksIHQyLm1heFswXSA9IE1hdGgubWF4KHIsIHQyLm1heFswXSksIHQyLm1heFsxXSA9IE1hdGgubWF4KG8sIHQyLm1heFsxXSk7CiAgICAgIH0KICAgIH0KICAgIGUuZXhwb3J0cy5jb21wdXRlQm94ID0gZnVuY3Rpb24oZTIsIGkpIHsKICAgICAgbihlMiksIGkubWluLnNldCh0Mi5taW5bMF0sIHQyLm1pblsxXSwgMCksIGkubWF4LnNldCh0Mi5tYXhbMF0sIHQyLm1heFsxXSwgMCk7CiAgICB9LCBlLmV4cG9ydHMuY29tcHV0ZVNwaGVyZSA9IGZ1bmN0aW9uKGUyLCBpKSB7CiAgICAgIG4oZTIpOwogICAgICB2YXIgciA9IHQyLm1pblswXSwgbyA9IHQyLm1pblsxXSwgcyA9IHQyLm1heFswXSAtIHIsIGEgPSB0Mi5tYXhbMV0gLSBvLCBBID0gTWF0aC5zcXJ0KHMgKiBzICsgYSAqIGEpOwogICAgICBpLmNlbnRlci5zZXQociArIHMgLyAyLCBvICsgYSAvIDIsIDApLCBpLnJhZGl1cyA9IEEgLyAyOwogICAgfTsKICB9LCA3MTA2OiAoZSkgPT4gewogICAgZS5leHBvcnRzLnBhZ2VzID0gZnVuY3Rpb24oZTIpIHsKICAgICAgdmFyIHQyID0gbmV3IEZsb2F0MzJBcnJheSg0ICogZTIubGVuZ3RoICogMSksIG4gPSAwOwogICAgICByZXR1cm4gZTIuZm9yRWFjaChmdW5jdGlvbihlMykgewogICAgICAgIHZhciBpID0gZTMuZGF0YS5wYWdlIHx8IDA7CiAgICAgICAgdDJbbisrXSA9IGksIHQyW24rK10gPSBpLCB0MltuKytdID0gaSwgdDJbbisrXSA9IGk7CiAgICAgIH0pLCB0MjsKICAgIH0sIGUuZXhwb3J0cy51dnMgPSBmdW5jdGlvbihlMiwgdDIsIG4sIGkpIHsKICAgICAgdmFyIHIgPSBuZXcgRmxvYXQzMkFycmF5KDQgKiBlMi5sZW5ndGggKiAyKSwgbyA9IDA7CiAgICAgIHJldHVybiBlMi5mb3JFYWNoKGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgdmFyIHMgPSBlMy5kYXRhLCBhID0gcy54ICsgcy53aWR0aCwgQSA9IHMueSArIHMuaGVpZ2h0LCBsID0gcy54IC8gdDIsIGMgPSBzLnkgLyBuLCBoID0gYSAvIHQyLCBkID0gQSAvIG47CiAgICAgICAgaSAmJiAoYyA9IChuIC0gcy55KSAvIG4sIGQgPSAobiAtIEEpIC8gbiksIHJbbysrXSA9IGwsIHJbbysrXSA9IGMsIHJbbysrXSA9IGwsIHJbbysrXSA9IGQsIHJbbysrXSA9IGgsIHJbbysrXSA9IGQsIHJbbysrXSA9IGgsIHJbbysrXSA9IGM7CiAgICAgIH0pLCByOwogICAgfSwgZS5leHBvcnRzLnBvc2l0aW9ucyA9IGZ1bmN0aW9uKGUyKSB7CiAgICAgIHZhciB0MiA9IG5ldyBGbG9hdDMyQXJyYXkoNCAqIGUyLmxlbmd0aCAqIDIpLCBuID0gMDsKICAgICAgcmV0dXJuIGUyLmZvckVhY2goZnVuY3Rpb24oZTMpIHsKICAgICAgICB2YXIgaSA9IGUzLmRhdGEsIHIgPSBlMy5wb3NpdGlvblswXSArIGkueG9mZnNldCwgbyA9IGUzLnBvc2l0aW9uWzFdICsgaS55b2Zmc2V0LCBzID0gaS53aWR0aCwgYSA9IGkuaGVpZ2h0OwogICAgICAgIHQyW24rK10gPSByLCB0MltuKytdID0gbywgdDJbbisrXSA9IHIsIHQyW24rK10gPSBvICsgYSwgdDJbbisrXSA9IHIgKyBzLCB0MltuKytdID0gbyArIGEsIHQyW24rK10gPSByICsgcywgdDJbbisrXSA9IG87CiAgICAgIH0pLCB0MjsKICAgIH07CiAgfSwgNTQwNjogKGUpID0+IHsKICAgIHZhciB0MiA9IC9cbi8sIG4gPSAvXHMvOwogICAgZnVuY3Rpb24gaShlMiwgdDMsIG4yLCBpMikgewogICAgICB2YXIgcjIgPSBlMi5pbmRleE9mKHQzLCBuMik7CiAgICAgIHJldHVybiByMiA9PT0gLTEgfHwgcjIgPiBpMiA/IGkyIDogcjI7CiAgICB9CiAgICBmdW5jdGlvbiByKGUyKSB7CiAgICAgIHJldHVybiBuLnRlc3QoZTIpOwogICAgfQogICAgZnVuY3Rpb24gbyhlMiwgdDMsIG4yLCBpMikgewogICAgICByZXR1cm4geyBzdGFydDogdDMsIGVuZDogdDMgKyBNYXRoLm1pbihpMiwgbjIgLSB0MykgfTsKICAgIH0KICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHQzLCBuMikgewogICAgICByZXR1cm4gZS5leHBvcnRzLmxpbmVzKHQzLCBuMikubWFwKGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgcmV0dXJuIHQzLnN1YnN0cmluZyhlMi5zdGFydCwgZTIuZW5kKTsKICAgICAgfSkuam9pbihgCmApOwogICAgfSwgZS5leHBvcnRzLmxpbmVzID0gZnVuY3Rpb24oZTIsIG4yKSB7CiAgICAgIGlmICgobjIgPSBuMiB8fCB7fSkud2lkdGggPT09IDAgJiYgbjIubW9kZSAhPT0gIm5vd3JhcCIpCiAgICAgICAgcmV0dXJuIFtdOwogICAgICBlMiA9IGUyIHx8ICIiOwogICAgICB2YXIgcyA9IHR5cGVvZiBuMi53aWR0aCA9PSAibnVtYmVyIiA/IG4yLndpZHRoIDogTnVtYmVyLk1BWF9WQUxVRSwgYSA9IE1hdGgubWF4KDAsIG4yLnN0YXJ0IHx8IDApLCBBID0gdHlwZW9mIG4yLmVuZCA9PSAibnVtYmVyIiA/IG4yLmVuZCA6IGUyLmxlbmd0aCwgbCA9IG4yLm1vZGUsIGMgPSBuMi5tZWFzdXJlIHx8IG87CiAgICAgIHJldHVybiBsID09PSAicHJlIiA/IGZ1bmN0aW9uKGUzLCBuMywgaTIsIHIyLCBvMikgewogICAgICAgIGZvciAodmFyIHMyID0gW10sIGEyID0gaTIsIEEyID0gaTI7QTIgPCByMiAmJiBBMiA8IG4zLmxlbmd0aDsgQTIrKykgewogICAgICAgICAgdmFyIGwyID0gbjMuY2hhckF0KEEyKSwgYzIgPSB0Mi50ZXN0KGwyKTsKICAgICAgICAgIGlmIChjMiB8fCBBMiA9PT0gcjIgLSAxKSB7CiAgICAgICAgICAgIHZhciBoID0gZTMobjMsIGEyLCBjMiA/IEEyIDogQTIgKyAxLCBvMik7CiAgICAgICAgICAgIHMyLnB1c2goaCksIGEyID0gQTIgKyAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gczI7CiAgICAgIH0oYywgZTIsIGEsIEEsIHMpIDogZnVuY3Rpb24oZTMsIHQzLCBuMywgbzIsIHMyLCBhMikgewogICAgICAgIHZhciBBMiA9IFtdLCBsMiA9IHMyOwogICAgICAgIGZvciAoYTIgPT09ICJub3dyYXAiICYmIChsMiA9IE51bWJlci5NQVhfVkFMVUUpO24zIDwgbzIgJiYgbjMgPCB0My5sZW5ndGg7ICkgewogICAgICAgICAgZm9yICh2YXIgYzIgPSBpKHQzLCBgCmAsIG4zLCBvMik7bjMgPCBjMiAmJiByKHQzLmNoYXJBdChuMykpOyApCiAgICAgICAgICAgIG4zKys7CiAgICAgICAgICB2YXIgaCA9IGUzKHQzLCBuMywgYzIsIGwyKSwgZCA9IG4zICsgKGguZW5kIC0gaC5zdGFydCksIHUgPSBkICsgMTsKICAgICAgICAgIGlmIChkIDwgYzIpIHsKICAgICAgICAgICAgZm9yICg7ZCA+IG4zICYmICFyKHQzLmNoYXJBdChkKSk7ICkKICAgICAgICAgICAgICBkLS07CiAgICAgICAgICAgIGlmIChkID09PSBuMykKICAgICAgICAgICAgICB1ID4gbjMgKyAxICYmIHUtLSwgZCA9IHU7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBmb3IgKHUgPSBkO2QgPiBuMyAmJiByKHQzLmNoYXJBdChkIC0gMSkpOyApCiAgICAgICAgICAgICAgICBkLS07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZCA+PSBuMykgewogICAgICAgICAgICB2YXIgZyA9IGUzKHQzLCBuMywgZCwgbDIpOwogICAgICAgICAgICBBMi5wdXNoKGcpOwogICAgICAgICAgfQogICAgICAgICAgbjMgPSB1OwogICAgICAgIH0KICAgICAgICByZXR1cm4gQTI7CiAgICAgIH0oYywgZTIsIGEsIEEsIHMsIGwpOwogICAgfTsKICB9LCAzNTU4OiAoZSwgdDIsIG4pID0+IHsKICAgIHZhciBpID0gbig5MTkpLCByID0gbig4ODQ3KSwgbyA9IG4oMzIxNiksIHMgPSBuKDQ1OTcpOwogICAgZnVuY3Rpb24gYShlMiwgdDMsIG4yKSB7CiAgICAgIHZhciBpMiA9IGUyOwogICAgICByZXR1cm4gcih0MykgPyAobjIgPSB0MywgdHlwZW9mIGUyID09ICJzdHJpbmciICYmIChpMiA9IHsgdXJpOiBlMiB9KSkgOiBpMiA9IHModDMsIHsgdXJpOiBlMiB9KSwgaTIuY2FsbGJhY2sgPSBuMiwgaTI7CiAgICB9CiAgICBmdW5jdGlvbiBBKGUyLCB0MywgbjIpIHsKICAgICAgcmV0dXJuIGwodDMgPSBhKGUyLCB0MywgbjIpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGwoZTIpIHsKICAgICAgaWYgKGUyLmNhbGxiYWNrID09PSB1bmRlZmluZWQpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJjYWxsYmFjayBhcmd1bWVudCBtaXNzaW5nIik7CiAgICAgIHZhciB0MyA9IGZhbHNlLCBuMiA9IGZ1bmN0aW9uKG4zLCBpMywgcjMpIHsKICAgICAgICB0MyB8fCAodDMgPSB0cnVlLCBlMi5jYWxsYmFjayhuMywgaTMsIHIzKSk7CiAgICAgIH07CiAgICAgIGZ1bmN0aW9uIGkyKCkgewogICAgICAgIHZhciBlMyA9IHVuZGVmaW5lZDsKICAgICAgICBpZiAoZTMgPSBjLnJlc3BvbnNlID8gYy5yZXNwb25zZSA6IGMucmVzcG9uc2VUZXh0IHx8IGZ1bmN0aW9uKGU0KSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoZTQucmVzcG9uc2VUeXBlID09PSAiZG9jdW1lbnQiKQogICAgICAgICAgICAgIHJldHVybiBlNC5yZXNwb25zZVhNTDsKICAgICAgICAgICAgdmFyIHQ0ID0gZTQucmVzcG9uc2VYTUwgJiYgZTQucmVzcG9uc2VYTUwuZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lID09PSAicGFyc2VyZXJyb3IiOwogICAgICAgICAgICBpZiAoZTQucmVzcG9uc2VUeXBlID09PSAiIiAmJiAhdDQpCiAgICAgICAgICAgICAgcmV0dXJuIGU0LnJlc3BvbnNlWE1MOwogICAgICAgICAgfSBjYXRjaCAoZTUpIHt9CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9KGMpLCBtKQogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZTMgPSBKU09OLnBhcnNlKGUzKTsKICAgICAgICAgIH0gY2F0Y2ggKGU0KSB7fQogICAgICAgIHJldHVybiBlMzsKICAgICAgfQogICAgICBmdW5jdGlvbiByMihlMykgewogICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQoaCksIGUzIGluc3RhbmNlb2YgRXJyb3IgfHwgKGUzID0gbmV3IEVycm9yKCIiICsgKGUzIHx8ICJVbmtub3duIFhNTEh0dHBSZXF1ZXN0IEVycm9yIikpKSwgZTMuc3RhdHVzQ29kZSA9IDAsIG4yKGUzLCBFKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBzMigpIHsKICAgICAgICBpZiAoIWwyKSB7CiAgICAgICAgICB2YXIgdDQ7CiAgICAgICAgICBjbGVhclRpbWVvdXQoaCksIHQ0ID0gZTIudXNlWERSICYmIGMuc3RhdHVzID09PSB1bmRlZmluZWQgPyAyMDAgOiBjLnN0YXR1cyA9PT0gMTIyMyA/IDIwNCA6IGMuc3RhdHVzOwogICAgICAgICAgdmFyIHIzID0gRSwgczMgPSBudWxsOwogICAgICAgICAgcmV0dXJuIHQ0ICE9PSAwID8gKHIzID0geyBib2R5OiBpMigpLCBzdGF0dXNDb2RlOiB0NCwgbWV0aG9kOiB1LCBoZWFkZXJzOiB7fSwgdXJsOiBkLCByYXdSZXF1ZXN0OiBjIH0sIGMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzICYmIChyMy5oZWFkZXJzID0gbyhjLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSkpIDogczMgPSBuZXcgRXJyb3IoIkludGVybmFsIFhNTEh0dHBSZXF1ZXN0IEVycm9yIiksIG4yKHMzLCByMywgcjMuYm9keSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBhMiwgbDIsIGMgPSBlMi54aHIgfHwgbnVsbDsKICAgICAgYyB8fCAoYyA9IGUyLmNvcnMgfHwgZTIudXNlWERSID8gbmV3IEEuWERvbWFpblJlcXVlc3QgOiBuZXcgQS5YTUxIdHRwUmVxdWVzdCk7CiAgICAgIHZhciBoLCBkID0gYy51cmwgPSBlMi51cmkgfHwgZTIudXJsLCB1ID0gYy5tZXRob2QgPSBlMi5tZXRob2QgfHwgIkdFVCIsIGcgPSBlMi5ib2R5IHx8IGUyLmRhdGEsIHAgPSBjLmhlYWRlcnMgPSBlMi5oZWFkZXJzIHx8IHt9LCBmID0gISFlMi5zeW5jLCBtID0gZmFsc2UsIEUgPSB7IGJvZHk6IHVuZGVmaW5lZCwgaGVhZGVyczoge30sIHN0YXR1c0NvZGU6IDAsIG1ldGhvZDogdSwgdXJsOiBkLCByYXdSZXF1ZXN0OiBjIH07CiAgICAgIGlmICgianNvbiIgaW4gZTIgJiYgZTIuanNvbiAhPT0gZmFsc2UgJiYgKG0gPSB0cnVlLCBwLmFjY2VwdCB8fCBwLkFjY2VwdCB8fCAocC5BY2NlcHQgPSAiYXBwbGljYXRpb24vanNvbiIpLCB1ICE9PSAiR0VUIiAmJiB1ICE9PSAiSEVBRCIgJiYgKHBbImNvbnRlbnQtdHlwZSJdIHx8IHBbIkNvbnRlbnQtVHlwZSJdIHx8IChwWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi9qc29uIiksIGcgPSBKU09OLnN0cmluZ2lmeShlMi5qc29uID09PSB0cnVlID8gZyA6IGUyLmpzb24pKSksIGMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgYy5yZWFkeVN0YXRlID09PSA0ICYmIHNldFRpbWVvdXQoczIsIDApOwogICAgICB9LCBjLm9ubG9hZCA9IHMyLCBjLm9uZXJyb3IgPSByMiwgYy5vbnByb2dyZXNzID0gZnVuY3Rpb24oKSB7fSwgYy5vbmFib3J0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgbDIgPSB0cnVlOwogICAgICB9LCBjLm9udGltZW91dCA9IHIyLCBjLm9wZW4odSwgZCwgIWYsIGUyLnVzZXJuYW1lLCBlMi5wYXNzd29yZCksIGYgfHwgKGMud2l0aENyZWRlbnRpYWxzID0gISFlMi53aXRoQ3JlZGVudGlhbHMpLCAhZiAmJiBlMi50aW1lb3V0ID4gMCAmJiAoaCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCFsMikgewogICAgICAgICAgbDIgPSB0cnVlLCBjLmFib3J0KCJ0aW1lb3V0Iik7CiAgICAgICAgICB2YXIgZTMgPSBuZXcgRXJyb3IoIlhNTEh0dHBSZXF1ZXN0IHRpbWVvdXQiKTsKICAgICAgICAgIGUzLmNvZGUgPSAiRVRJTUVET1VUIiwgcjIoZTMpOwogICAgICAgIH0KICAgICAgfSwgZTIudGltZW91dCkpLCBjLnNldFJlcXVlc3RIZWFkZXIpCiAgICAgICAgZm9yIChhMiBpbiBwKQogICAgICAgICAgcC5oYXNPd25Qcm9wZXJ0eShhMikgJiYgYy5zZXRSZXF1ZXN0SGVhZGVyKGEyLCBwW2EyXSk7CiAgICAgIGVsc2UgaWYgKGUyLmhlYWRlcnMgJiYgIWZ1bmN0aW9uKGUzKSB7CiAgICAgICAgZm9yICh2YXIgdDQgaW4gZTMpCiAgICAgICAgICBpZiAoZTMuaGFzT3duUHJvcGVydHkodDQpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0oZTIuaGVhZGVycykpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJIZWFkZXJzIGNhbm5vdCBiZSBzZXQgb24gYW4gWERvbWFpblJlcXVlc3Qgb2JqZWN0Iik7CiAgICAgIHJldHVybiAicmVzcG9uc2VUeXBlIiBpbiBlMiAmJiAoYy5yZXNwb25zZVR5cGUgPSBlMi5yZXNwb25zZVR5cGUpLCAiYmVmb3JlU2VuZCIgaW4gZTIgJiYgdHlwZW9mIGUyLmJlZm9yZVNlbmQgPT0gImZ1bmN0aW9uIiAmJiBlMi5iZWZvcmVTZW5kKGMpLCBjLnNlbmQoZyB8fCBudWxsKSwgYzsKICAgIH0KICAgIGUuZXhwb3J0cyA9IEEsIGUuZXhwb3J0cy5kZWZhdWx0ID0gQSwgQS5YTUxIdHRwUmVxdWVzdCA9IGkuWE1MSHR0cFJlcXVlc3QgfHwgZnVuY3Rpb24oKSB7fSwgQS5YRG9tYWluUmVxdWVzdCA9ICJ3aXRoQ3JlZGVudGlhbHMiIGluIG5ldyBBLlhNTEh0dHBSZXF1ZXN0ID8gQS5YTUxIdHRwUmVxdWVzdCA6IGkuWERvbWFpblJlcXVlc3QsIGZ1bmN0aW9uKGUyLCB0MykgewogICAgICBmb3IgKHZhciBuMiA9IDA7bjIgPCBlMi5sZW5ndGg7IG4yKyspCiAgICAgICAgdDMoZTJbbjJdKTsKICAgIH0oWyJnZXQiLCAicHV0IiwgInBvc3QiLCAicGF0Y2giLCAiaGVhZCIsICJkZWxldGUiXSwgZnVuY3Rpb24oZTIpIHsKICAgICAgQVtlMiA9PT0gImRlbGV0ZSIgPyAiZGVsIiA6IGUyXSA9IGZ1bmN0aW9uKHQzLCBuMiwgaTIpIHsKICAgICAgICByZXR1cm4gKG4yID0gYSh0MywgbjIsIGkyKSkubWV0aG9kID0gZTIudG9VcHBlckNhc2UoKSwgbChuMik7CiAgICAgIH07CiAgICB9KTsKICB9LCAxODk2OiAoZSkgPT4gewogICAgZS5leHBvcnRzID0gc2VsZi5ET01QYXJzZXIgIT09IHVuZGVmaW5lZCA/IGZ1bmN0aW9uKGUyKSB7CiAgICAgIHJldHVybiBuZXcgc2VsZi5ET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoZTIsICJhcHBsaWNhdGlvbi94bWwiKTsKICAgIH0gOiBzZWxmLkFjdGl2ZVhPYmplY3QgIT09IHVuZGVmaW5lZCAmJiBuZXcgc2VsZi5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIikgPyBmdW5jdGlvbihlMikgewogICAgICB2YXIgdDIgPSBuZXcgc2VsZi5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIik7CiAgICAgIHJldHVybiB0Mi5hc3luYyA9ICJmYWxzZSIsIHQyLmxvYWRYTUwoZTIpLCB0MjsKICAgIH0gOiBmdW5jdGlvbihlMikgewogICAgICB2YXIgdDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgcmV0dXJuIHQyLmlubmVySFRNTCA9IGUyLCB0MjsKICAgIH07CiAgfSwgNDU5NzogKGUpID0+IHsKICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkgewogICAgICBmb3IgKHZhciBlMiA9IHt9LCBuID0gMDtuIDwgYXJndW1lbnRzLmxlbmd0aDsgbisrKSB7CiAgICAgICAgdmFyIGkgPSBhcmd1bWVudHNbbl07CiAgICAgICAgZm9yICh2YXIgciBpbiBpKQogICAgICAgICAgdDIuY2FsbChpLCByKSAmJiAoZTJbcl0gPSBpW3JdKTsKICAgICAgfQogICAgICByZXR1cm4gZTI7CiAgICB9OwogICAgdmFyIHQyID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICB9LCA4MTMyOiAoKSA9PiB7CiAgICB3aW5kb3cuYWZyYW1lU3RhdHMgPSBmdW5jdGlvbihlKSB7CiAgICAgIHZhciB0MiA9IG51bGwsIG4gPSBlOwogICAgICByZXR1cm4geyB1cGRhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBlMjsKICAgICAgICB0MigidGUiKS5zZXQoKGUyID0gbi5xdWVyeVNlbGVjdG9yQWxsKCIqIiksIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUyKS5maWx0ZXIoZnVuY3Rpb24oZTMpIHsKICAgICAgICAgIHJldHVybiBlMy5pc0VudGl0eTsKICAgICAgICB9KSwgZTIubGVuZ3RoKSksIHdpbmRvdy5wZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlOYW1lICYmIHQyKCJsdCIpLnNldCh3aW5kb3cucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5TmFtZSgicmVuZGVyLXN0YXJ0ZWQiKVswXS5zdGFydFRpbWUudG9GaXhlZCgwKSk7CiAgICAgIH0sIHN0YXJ0OiBmdW5jdGlvbigpIHt9LCBlbmQ6IGZ1bmN0aW9uKCkge30sIGF0dGFjaDogZnVuY3Rpb24oZTIpIHsKICAgICAgICB0MiA9IGUyOwogICAgICB9LCB2YWx1ZXM6IHsgdGU6IHsgY2FwdGlvbjogIkVudGl0aWVzIiB9LCBsdDogeyBjYXB0aW9uOiAiTG9hZCBUaW1lIiB9IH0sIGdyb3VwczogW3sgY2FwdGlvbjogIkEtRnJhbWUiLCB2YWx1ZXM6IFsidGUiLCAibHQiXSB9XSwgZnJhY3Rpb25zOiBbXSB9OwogICAgfTsKICB9LCAzNzI5OiAoZSkgPT4gewogICAgd2luZG93LmdsU3RhdHMgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGUyID0gbnVsbCwgdDIgPSAwLCBuID0gMCwgaSA9IDAsIHIgPSAwLCBvID0gMCwgcyA9IDAsIGEgPSAwOwogICAgICBmdW5jdGlvbiBBKGUzLCB0MykgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHQzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIGUzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gV2ViR0xSZW5kZXJpbmdDb250ZXh0LnByb3RvdHlwZS5kcmF3QXJyYXlzID0gQShXZWJHTFJlbmRlcmluZ0NvbnRleHQucHJvdG90eXBlLmRyYXdBcnJheXMsIGZ1bmN0aW9uKCkgewogICAgICAgIHQyKyssIGFyZ3VtZW50c1swXSA9PSB0aGlzLlBPSU5UUyA/IHMgKz0gYXJndW1lbnRzWzJdIDogbyArPSBhcmd1bWVudHNbMl07CiAgICAgIH0pLCBXZWJHTFJlbmRlcmluZ0NvbnRleHQucHJvdG90eXBlLmRyYXdFbGVtZW50cyA9IEEoV2ViR0xSZW5kZXJpbmdDb250ZXh0LnByb3RvdHlwZS5kcmF3RWxlbWVudHMsIGZ1bmN0aW9uKCkgewogICAgICAgIG4rKywgciArPSBhcmd1bWVudHNbMV0gLyAzLCBvICs9IGFyZ3VtZW50c1sxXTsKICAgICAgfSksIFdlYkdMUmVuZGVyaW5nQ29udGV4dC5wcm90b3R5cGUudXNlUHJvZ3JhbSA9IEEoV2ViR0xSZW5kZXJpbmdDb250ZXh0LnByb3RvdHlwZS51c2VQcm9ncmFtLCBmdW5jdGlvbigpIHsKICAgICAgICBpKys7CiAgICAgIH0pLCBXZWJHTFJlbmRlcmluZ0NvbnRleHQucHJvdG90eXBlLmJpbmRUZXh0dXJlID0gQShXZWJHTFJlbmRlcmluZ0NvbnRleHQucHJvdG90eXBlLmJpbmRUZXh0dXJlLCBmdW5jdGlvbigpIHsKICAgICAgICBhKys7CiAgICAgIH0pLCB7IHVwZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgZTIoImFsbGNhbGxzIikuc2V0KHQyICsgbiksIGUyKCJkcmF3RWxlbWVudHMiKS5zZXQobiksIGUyKCJkcmF3QXJyYXlzIikuc2V0KHQyKSwgZTIoImJpbmRUZXh0dXJlIikuc2V0KGEpLCBlMigidXNlUHJvZ3JhbSIpLnNldChpKSwgZTIoImdsZmFjZXMiKS5zZXQociksIGUyKCJnbHZlcnRpY2VzIikuc2V0KG8pLCBlMigiZ2xwb2ludHMiKS5zZXQocyk7CiAgICAgIH0sIHN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0MiA9IDAsIG4gPSAwLCBpID0gMCwgciA9IDAsIG8gPSAwLCBzID0gMCwgYSA9IDA7CiAgICAgIH0sIGVuZDogZnVuY3Rpb24oKSB7fSwgYXR0YWNoOiBmdW5jdGlvbih0MykgewogICAgICAgIGUyID0gdDM7CiAgICAgIH0sIHZhbHVlczogeyBhbGxjYWxsczogeyBvdmVyOiAzMDAwLCBjYXB0aW9uOiAiQ2FsbHMgKGhvb2spIiB9LCBkcmF3ZWxlbWVudHM6IHsgY2FwdGlvbjogImRyYXdFbGVtZW50cyAoaG9vaykiIH0sIGRyYXdhcnJheXM6IHsgY2FwdGlvbjogImRyYXdBcnJheXMgKGhvb2spIiB9IH0sIGdyb3VwczogW3sgY2FwdGlvbjogIldlYkdMIiwgdmFsdWVzOiBbImFsbGNhbGxzIiwgImRyYXdlbGVtZW50cyIsICJkcmF3YXJyYXlzIiwgInVzZXByb2dyYW0iLCAiYmluZHRleHR1cmUiLCAiZ2xmYWNlcyIsICJnbHZlcnRpY2VzIiwgImdscG9pbnRzIl0gfV0sIGZyYWN0aW9uczogW3sgYmFzZTogImFsbGNhbGxzIiwgc3RlcHM6IFsiZHJhd2VsZW1lbnRzIiwgImRyYXdhcnJheXMiXSB9XSB9OwogICAgfSwgd2luZG93LnRocmVlU3RhdHMgPSBmdW5jdGlvbihlMikgewogICAgICB2YXIgdDIgPSBudWxsOwogICAgICByZXR1cm4geyB1cGRhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHQyKCJyZW5kZXJlci5pbmZvLm1lbW9yeS5nZW9tZXRyaWVzIikuc2V0KGUyLmluZm8ubWVtb3J5Lmdlb21ldHJpZXMpLCB0MigicmVuZGVyZXIuaW5mby5wcm9ncmFtcyIpLnNldChlMi5pbmZvLnByb2dyYW1zPy5sZW5ndGggPz8gTmFOKSwgdDIoInJlbmRlcmVyLmluZm8ubWVtb3J5LnRleHR1cmVzIikuc2V0KGUyLmluZm8ubWVtb3J5LnRleHR1cmVzKSwgdDIoInJlbmRlcmVyLmluZm8ucmVuZGVyLmNhbGxzIikuc2V0KGUyLmluZm8ucmVuZGVyLmNhbGxzKSwgdDIoInJlbmRlcmVyLmluZm8ucmVuZGVyLnRyaWFuZ2xlcyIpLnNldChlMi5pbmZvLnJlbmRlci50cmlhbmdsZXMpLCB0MigicmVuZGVyZXIuaW5mby5yZW5kZXIucG9pbnRzIikuc2V0KGUyLmluZm8ucmVuZGVyLnBvaW50cyk7CiAgICAgIH0sIHN0YXJ0OiBmdW5jdGlvbigpIHt9LCBlbmQ6IGZ1bmN0aW9uKCkge30sIGF0dGFjaDogZnVuY3Rpb24oZTMpIHsKICAgICAgICB0MiA9IGUzOwogICAgICB9LCB2YWx1ZXM6IHsgInJlbmRlcmVyLmluZm8ubWVtb3J5Lmdlb21ldHJpZXMiOiB7IGNhcHRpb246ICJHZW9tZXRyaWVzIiB9LCAicmVuZGVyZXIuaW5mby5tZW1vcnkudGV4dHVyZXMiOiB7IGNhcHRpb246ICJUZXh0dXJlcyIgfSwgInJlbmRlcmVyLmluZm8ucHJvZ3JhbXMiOiB7IGNhcHRpb246ICJQcm9ncmFtcyIgfSwgInJlbmRlcmVyLmluZm8ucmVuZGVyLmNhbGxzIjogeyBjYXB0aW9uOiAiQ2FsbHMiIH0sICJyZW5kZXJlci5pbmZvLnJlbmRlci50cmlhbmdsZXMiOiB7IGNhcHRpb246ICJUcmlhbmdsZXMiLCBvdmVyOiAxMDAwIH0sICJyZW5kZXJlci5pbmZvLnJlbmRlci5wb2ludHMiOiB7IGNhcHRpb246ICJQb2ludHMiIH0gfSwgZ3JvdXBzOiBbeyBjYXB0aW9uOiAiVGhyZWUuanMgLSBNZW1vcnkiLCB2YWx1ZXM6IFsicmVuZGVyZXIuaW5mby5tZW1vcnkuZ2VvbWV0cmllcyIsICJyZW5kZXJlci5pbmZvLnByb2dyYW1zIiwgInJlbmRlcmVyLmluZm8ubWVtb3J5LnRleHR1cmVzIl0gfSwgeyBjYXB0aW9uOiAiVGhyZWUuanMgLSBSZW5kZXIiLCB2YWx1ZXM6IFsicmVuZGVyZXIuaW5mby5yZW5kZXIuY2FsbHMiLCAicmVuZGVyZXIuaW5mby5yZW5kZXIudHJpYW5nbGVzIiwgInJlbmRlcmVyLmluZm8ucmVuZGVyLnBvaW50cyJdIH1dLCBmcmFjdGlvbnM6IFtdIH07CiAgICB9LCB3aW5kb3cuQnJvd3NlclN0YXRzID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBlMiA9IG51bGwsIHQyID0gMCwgbiA9IDA7CiAgICAgIHdpbmRvdy5wZXJmb3JtYW5jZSAmJiAhcGVyZm9ybWFuY2UubWVtb3J5ICYmIChwZXJmb3JtYW5jZS5tZW1vcnkgPSB7IHVzZWRKU0hlYXBTaXplOiAwLCB0b3RhbEpTSGVhcFNpemU6IDAgfSksIHBlcmZvcm1hbmNlLm1lbW9yeS50b3RhbEpTSGVhcFNpemUgPT09IDAgJiYgY29uc29sZS53YXJuKCJ0b3RhbEpTSGVhcFNpemUgPT09IDAuLi4gcGVyZm9ybWFuY2UubWVtb3J5IGlzIG9ubHkgYXZhaWxhYmxlIGluIENocm9tZSAuIik7CiAgICAgIHZhciBpID0gTWF0aC5sb2coMTAyNCk7CiAgICAgIGZ1bmN0aW9uIHIoZTMpIHsKICAgICAgICB2YXIgdDMgPSBNYXRoLmZsb29yKE1hdGgubG9nKGUzKSAvIGkpOwogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKDEwMCAqIGUzIC8gTWF0aC5wb3coMTAyNCwgdDMpKSAvIDEwMDsKICAgICAgfQogICAgICByZXR1cm4geyB1cGRhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHQyID0gcihwZXJmb3JtYW5jZS5tZW1vcnkudXNlZEpTSGVhcFNpemUpLCBuID0gcihwZXJmb3JtYW5jZS5tZW1vcnkudG90YWxKU0hlYXBTaXplKSwgZTIoIm1lbW9yeSIpLnNldCh0MiksIGUyKCJ0b3RhbCIpLnNldChuKTsKICAgICAgfSwgc3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHQyID0gMDsKICAgICAgfSwgZW5kOiBmdW5jdGlvbigpIHt9LCBhdHRhY2g6IGZ1bmN0aW9uKHQzKSB7CiAgICAgICAgZTIgPSB0MzsKICAgICAgfSwgdmFsdWVzOiB7IG1lbW9yeTogeyBjYXB0aW9uOiAiVXNlZCBNZW1vcnkiLCBhdmVyYWdlOiB0cnVlLCBhdmdNczogMTAwMCwgb3ZlcjogMjIgfSwgdG90YWw6IHsgY2FwdGlvbjogIlRvdGFsIE1lbW9yeSIgfSB9LCBncm91cHM6IFt7IGNhcHRpb246ICJCcm93c2VyIiwgdmFsdWVzOiBbIm1lbW9yeSIsICJ0b3RhbCJdIH1dLCBmcmFjdGlvbnM6IFt7IGJhc2U6ICJ0b3RhbCIsIHN0ZXBzOiBbIm1lbW9yeSJdIH1dIH07CiAgICB9LCBlLmV4cG9ydHMgPSB7IGdsU3RhdHM6IHdpbmRvdy5nbFN0YXRzLCB0aHJlZVN0YXRzOiB3aW5kb3cudGhyZWVTdGF0cywgQnJvd3NlclN0YXRzOiB3aW5kb3cuQnJvd3NlclN0YXRzIH07CiAgfSwgMjgyOiAoZSkgPT4gewogICAgKGZ1bmN0aW9uKCkgewogICAgICAicGVyZm9ybWFuY2UiIGluIHdpbmRvdyA9PSAwICYmICh3aW5kb3cucGVyZm9ybWFuY2UgPSB7fSk7CiAgICAgIHZhciBlMiA9IHdpbmRvdy5wZXJmb3JtYW5jZTsKICAgICAgaWYgKCJub3ciIGluIGUyID09IDApIHsKICAgICAgICB2YXIgdDIgPSBEYXRlLm5vdygpOwogICAgICAgIGUyLnRpbWluZyAmJiBlMi50aW1pbmcubmF2aWdhdGlvblN0YXJ0ICYmICh0MiA9IGUyLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQpLCBlMi5ub3cgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBEYXRlLm5vdygpIC0gdDI7CiAgICAgICAgfTsKICAgICAgfQogICAgICBlMi5tYXJrIHx8IChlMi5tYXJrID0gZnVuY3Rpb24oKSB7fSksIGUyLm1lYXN1cmUgfHwgKGUyLm1lYXN1cmUgPSBmdW5jdGlvbigpIHt9KTsKICAgIH0pKCksIHdpbmRvdy5yU3RhdHMgPSBmdW5jdGlvbihlMikgewogICAgICBmdW5jdGlvbiB0MihlMywgdDMpIHsKICAgICAgICBmb3IgKHZhciBuMiA9IE9iamVjdC5rZXlzKGUzKSwgaTIgPSAwLCByMiA9IG4yLmxlbmd0aDtpMiA8IHIyOyBpMisrKQogICAgICAgICAgdDMobjJbaTJdKTsKICAgICAgfQogICAgICB2YXIgbiA9IGUyIHx8IHt9LCBpID0gbi5jb2xvdXJzIHx8IFsiIzg1MDcwMCIsICIjYzc0OTAwIiwgIiNmY2IzMDAiLCAiIzI4NDI4MCIsICIjNGM3YzBjIl0sIHIgPSAobi5DU1NQYXRoID8gbi5DU1NQYXRoIDogIiIpICsgInJTdGF0cy5jc3MiOwogICAgICAobi5jc3MgfHwgWyJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvK0NvbmRlbnNlZDo0MDAsNzAwLDMwMCIsIHJdKS5mb3JFYWNoKGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgdmFyIHQzLCBuMjsKICAgICAgICB0MyA9IGUzLCAobjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIikpLmhyZWYgPSB0MywgbjIucmVsID0gInN0eWxlc2hlZXQiLCBuMi50eXBlID0gInRleHQvY3NzIiwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChuMik7CiAgICAgIH0pLCBuLnZhbHVlcyB8fCAobi52YWx1ZXMgPSB7fSk7CiAgICAgIHZhciBvLCBzLCBhID0gMTAsIEEgPSB7fTsKICAgICAgZnVuY3Rpb24gbChlMywgdDMsIG4yKSB7CiAgICAgICAgdmFyIGkyID0gbjIgfHwge30sIHIyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksIG8yID0gcjIuZ2V0Q29udGV4dCgiMmQiKSwgczIgPSAwLCBBMiA9IDAsIGwyID0gaTIuY29sb3IgPyBpMi5jb2xvciA6ICIjNjY2NjY2IiwgYzIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSwgaDIgPSBjMi5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgIGMyLndpZHRoID0gMSwgYzIuaGVpZ2h0ID0gMjAsIGgyLmZpbGxTdHlsZSA9ICIjNDQ0NDQ0IiwgaDIuZmlsbFJlY3QoMCwgMCwgMSwgMjApLCBoMi5maWxsU3R5bGUgPSBsMiwgaDIuZmlsbFJlY3QoMCwgYSwgMSwgYSksIGgyLmZpbGxTdHlsZSA9ICIjZmZmZmZmIiwgaDIuZ2xvYmFsQWxwaGEgPSAwLjUsIGgyLmZpbGxSZWN0KDAsIGEsIDEsIDEpLCBoMi5nbG9iYWxBbHBoYSA9IDE7CiAgICAgICAgdmFyIGQyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksIHUyID0gZDIuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgICByZXR1cm4gZDIud2lkdGggPSAxLCBkMi5oZWlnaHQgPSAyMCwgdTIuZmlsbFN0eWxlID0gIiM0NDQ0NDQiLCB1Mi5maWxsUmVjdCgwLCAwLCAxLCAyMCksIHUyLmZpbGxTdHlsZSA9ICIjYjcwMDAwIiwgdTIuZmlsbFJlY3QoMCwgYSwgMSwgYSksIHUyLmdsb2JhbEFscGhhID0gMC41LCB1Mi5maWxsU3R5bGUgPSAiI2ZmZmZmZiIsIHUyLmZpbGxSZWN0KDAsIGEsIDEsIDEpLCB1Mi5nbG9iYWxBbHBoYSA9IDEsIHIyLndpZHRoID0gMjAwLCByMi5oZWlnaHQgPSBhLCByMi5zdHlsZS53aWR0aCA9IHIyLndpZHRoICsgInB4IiwgcjIuc3R5bGUuaGVpZ2h0ID0gcjIuaGVpZ2h0ICsgInB4IiwgcjIuY2xhc3NOYW1lID0gInJzLWNhbnZhcyIsIGUzLmFwcGVuZENoaWxkKHIyKSwgbzIuZmlsbFN0eWxlID0gIiM0NDQ0NDQiLCBvMi5maWxsUmVjdCgwLCAwLCByMi53aWR0aCwgcjIuaGVpZ2h0KSwgeyBkcmF3OiBmdW5jdGlvbihlNCwgdDQpIHsKICAgICAgICAgIChBMiArPSAwLjEgKiAoZTQgLSBBMikpID4gKHMyICo9IDAuOTkpICYmIChzMiA9IEEyKSwgbzIuZHJhd0ltYWdlKHIyLCAxLCAwLCByMi53aWR0aCAtIDEsIHIyLmhlaWdodCwgMCwgMCwgcjIud2lkdGggLSAxLCByMi5oZWlnaHQpLCB0NCA/IG8yLmRyYXdJbWFnZShkMiwgcjIud2lkdGggLSAxLCByMi5oZWlnaHQgLSBBMiAqIHIyLmhlaWdodCAvIHMyIC0gYSkgOiBvMi5kcmF3SW1hZ2UoYzIsIHIyLndpZHRoIC0gMSwgcjIuaGVpZ2h0IC0gQTIgKiByMi5oZWlnaHQgLyBzMiAtIGEpOwogICAgICAgIH0gfTsKICAgICAgfQogICAgICBmdW5jdGlvbiBjKGUzLCBuMikgewogICAgICAgIHZhciByMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLCBvMiA9IHIyLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgcmV0dXJuIHIyLndpZHRoID0gMjAwLCByMi5oZWlnaHQgPSBhICogbjIsIHIyLnN0eWxlLndpZHRoID0gcjIud2lkdGggKyAicHgiLCByMi5zdHlsZS5oZWlnaHQgPSByMi5oZWlnaHQgKyAicHgiLCByMi5jbGFzc05hbWUgPSAicnMtY2FudmFzIiwgZTMuYXBwZW5kQ2hpbGQocjIpLCBvMi5maWxsU3R5bGUgPSAiIzQ0NDQ0NCIsIG8yLmZpbGxSZWN0KDAsIDAsIHIyLndpZHRoLCByMi5oZWlnaHQpLCB7IGRyYXc6IGZ1bmN0aW9uKGU0KSB7CiAgICAgICAgICBvMi5kcmF3SW1hZ2UocjIsIDEsIDAsIHIyLndpZHRoIC0gMSwgcjIuaGVpZ2h0LCAwLCAwLCByMi53aWR0aCAtIDEsIHIyLmhlaWdodCk7CiAgICAgICAgICB2YXIgbjMgPSAwOwogICAgICAgICAgdDIoZTQsIGZ1bmN0aW9uKHQzKSB7CiAgICAgICAgICAgIHZhciBzMiA9IGU0W3QzXSAqIHIyLmhlaWdodDsKICAgICAgICAgICAgbzIuZmlsbFN0eWxlID0gaVt0M10sIG8yLmZpbGxSZWN0KHIyLndpZHRoIC0gMSwgbjMsIDEsIHMyKSwgbjMgKz0gczI7CiAgICAgICAgICB9KTsKICAgICAgICB9IH07CiAgICAgIH0KICAgICAgZnVuY3Rpb24gaChlMywgdDMpIHsKICAgICAgICB2YXIgaTIsIHIyID0gZTMsIG8yID0gMCwgYTIgPSAwLCBBMiA9IDAsIGMyID0gMCwgaDIgPSBwZXJmb3JtYW5jZS5ub3coKSwgZDIgPSAwLCB1MiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLCBnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpLCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksIGYgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIiksIG0gPSBuID8gbi52YWx1ZXNbcjIudG9Mb3dlckNhc2UoKV0gOiBudWxsLCBFID0gbmV3IGwodTIsIHIyLCBtKSwgQyA9IGZhbHNlOwogICAgICAgIGZ1bmN0aW9uIHYoZTQpIHsKICAgICAgICAgIGlmIChtICYmIG0uYXZlcmFnZSkgewogICAgICAgICAgICBjMiArPSBlNCwgZDIrKzsKICAgICAgICAgICAgdmFyIHQ0ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgICAgIHQ0IC0gaDIgPj0gKG0uYXZnTXMgfHwgMTAwMCkgJiYgKEEyID0gYzIgLyBkMiwgYzIgPSAwLCBoMiA9IHQ0LCBkMiA9IDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBCKCkgewogICAgICAgICAgaTIgPSBwZXJmb3JtYW5jZS5ub3coKSwgbi51c2VyVGltaW5nQVBJICYmIHBlcmZvcm1hbmNlLm1hcmsocjIgKyAiLXN0YXJ0IiksIEMgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBiKCkgewogICAgICAgICAgbzIgPSBwZXJmb3JtYW5jZS5ub3coKSAtIGkyLCBuLnVzZXJUaW1pbmdBUEkgJiYgKHBlcmZvcm1hbmNlLm1hcmsocjIgKyAiLWVuZCIpLCBDICYmIHBlcmZvcm1hbmNlLm1lYXN1cmUocjIsIHIyICsgIi1zdGFydCIsIHIyICsgIi1lbmQiKSksIHYobzIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZy5jbGFzc05hbWUgPSAicnMtY291bnRlci1pZCIsIGcudGV4dENvbnRlbnQgPSBtICYmIG0uY2FwdGlvbiA/IG0uY2FwdGlvbiA6IHIyLCBwLmNsYXNzTmFtZSA9ICJycy1jb3VudGVyLXZhbHVlIiwgcC5hcHBlbmRDaGlsZChmKSwgdTIuYXBwZW5kQ2hpbGQoZyksIHUyLmFwcGVuZENoaWxkKHApLCB0MyA/IHQzLmRpdi5hcHBlbmRDaGlsZCh1MikgOiBzLmFwcGVuZENoaWxkKHUyKSwgaTIgPSBwZXJmb3JtYW5jZS5ub3coKSwgeyBzZXQ6IGZ1bmN0aW9uKGU0KSB7CiAgICAgICAgICB2KG8yID0gZTQpOwogICAgICAgIH0sIHN0YXJ0OiBCLCB0aWNrOiBmdW5jdGlvbigpIHsKICAgICAgICAgIGIoKSwgQigpOwogICAgICAgIH0sIGVuZDogYiwgZnJhbWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGU0ID0gcGVyZm9ybWFuY2Uubm93KCksIHQ0ID0gZTQgLSBpMjsKICAgICAgICAgIGEyKyssIHQ0ID4gMTAwMCAmJiAobzIgPSBtICYmIG0uaW50ZXJwb2xhdGUgPT09IGZhbHNlID8gYTIgOiAxMDAwICogYTIgLyB0NCwgYTIgPSAwLCBpMiA9IGU0LCB2KG8yKSk7CiAgICAgICAgfSwgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIG8yOwogICAgICAgIH0sIGRyYXc6IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGU0ID0gbSAmJiBtLmF2ZXJhZ2UgPyBBMiA6IG8yOwogICAgICAgICAgZi5ub2RlVmFsdWUgPSBNYXRoLnJvdW5kKDEwMCAqIGU0KSAvIDEwMDsKICAgICAgICAgIHZhciB0NCA9IG0gJiYgKG0uYmVsb3cgJiYgbzIgPCBtLmJlbG93IHx8IG0ub3ZlciAmJiBvMiA+IG0ub3Zlcik7CiAgICAgICAgICBFLmRyYXcobzIsIHQ0KSwgdTIuY2xhc3NOYW1lID0gdDQgPyAicnMtY291bnRlci1iYXNlIGFsYXJtIiA6ICJycy1jb3VudGVyLWJhc2UiOwogICAgICAgIH0gfTsKICAgICAgfQogICAgICBmdW5jdGlvbiBkKGUzKSB7CiAgICAgICAgdmFyIGkyID0gZTMudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAoaTIgPT09IHVuZGVmaW5lZCAmJiAoaTIgPSAiZGVmYXVsdCIpLCBBW2kyXSkKICAgICAgICAgIHJldHVybiBBW2kyXTsKICAgICAgICB2YXIgcjIgPSBudWxsOwogICAgICAgIG4gJiYgbi5ncm91cHMgJiYgdDIobi5ncm91cHMsIGZ1bmN0aW9uKGU0KSB7CiAgICAgICAgICB2YXIgdDMgPSBuLmdyb3Vwc1twYXJzZUludChlNCwgMTApXTsKICAgICAgICAgIHIyIHx8IHQzLnZhbHVlcy5pbmRleE9mKGkyLnRvTG93ZXJDYXNlKCkpID09PSAtMSB8fCAocjIgPSB0Myk7CiAgICAgICAgfSk7CiAgICAgICAgdmFyIG8yID0gbmV3IGgoaTIsIHIyKTsKICAgICAgICByZXR1cm4gQVtpMl0gPSBvMiwgbzI7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gdSgpIHsKICAgICAgICB0MihuLnBsdWdpbnMsIGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgICBuLnBsdWdpbnNbZTNdLnVwZGF0ZSgpOwogICAgICAgIH0pLCB0MihBLCBmdW5jdGlvbihlMykgewogICAgICAgICAgQVtlM10uZHJhdygpOwogICAgICAgIH0pLCBuICYmIG4uZnJhY3Rpb25zICYmIHQyKG4uZnJhY3Rpb25zLCBmdW5jdGlvbihlMykgewogICAgICAgICAgdmFyIGkyID0gbi5mcmFjdGlvbnNbcGFyc2VJbnQoZTMsIDEwKV0sIHIyID0gW10sIG8yID0gQVtpMi5iYXNlLnRvTG93ZXJDYXNlKCldOwogICAgICAgICAgbzIgJiYgKG8yID0gbzIudmFsdWUoKSwgdDIobi5mcmFjdGlvbnNbZTNdLnN0ZXBzLCBmdW5jdGlvbih0MykgewogICAgICAgICAgICB2YXIgaTMgPSBuLmZyYWN0aW9uc1tlM10uc3RlcHNbcGFyc2VJbnQodDMsIDEwKV0udG9Mb3dlckNhc2UoKSwgczIgPSBBW2kzXTsKICAgICAgICAgICAgczIgJiYgcjIucHVzaChzMi52YWx1ZSgpIC8gbzIpOwogICAgICAgICAgfSkpLCBpMi5ncmFwaC5kcmF3KHIyKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKG4ucGx1Z2lucykgewogICAgICAgICAgbi52YWx1ZXMgfHwgKG4udmFsdWVzID0ge30pLCBuLmdyb3VwcyB8fCAobi5ncm91cHMgPSBbXSksIG4uZnJhY3Rpb25zIHx8IChuLmZyYWN0aW9ucyA9IFtdKTsKICAgICAgICAgIGZvciAodmFyIGUzID0gMDtlMyA8IG4ucGx1Z2lucy5sZW5ndGg7IGUzKyspCiAgICAgICAgICAgIG4ucGx1Z2luc1tlM10uYXR0YWNoKGQpLCB0MihuLnBsdWdpbnNbZTNdLnZhbHVlcywgZnVuY3Rpb24odDMpIHsKICAgICAgICAgICAgICBuLnZhbHVlc1t0M10gPSBuLnBsdWdpbnNbZTNdLnZhbHVlc1t0M107CiAgICAgICAgICAgIH0pLCBuLmdyb3VwcyA9IG4uZ3JvdXBzLmNvbmNhdChuLnBsdWdpbnNbZTNdLmdyb3VwcyksIG4uZnJhY3Rpb25zID0gbi5mcmFjdGlvbnMuY29uY2F0KG4ucGx1Z2luc1tlM10uZnJhY3Rpb25zKTsKICAgICAgICB9IGVsc2UKICAgICAgICAgIG4ucGx1Z2lucyA9IHt9OwogICAgICAgIChvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmNsYXNzTmFtZSA9ICJycy1iYXNlIiwgKHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuY2xhc3NOYW1lID0gInJzLWNvbnRhaW5lciIsIHMuc3R5bGUuaGVpZ2h0ID0gImF1dG8iLCBvLmFwcGVuZENoaWxkKHMpLCBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG8pLCBuICYmIChuLmdyb3VwcyAmJiB0MihuLmdyb3VwcywgZnVuY3Rpb24oZTQpIHsKICAgICAgICAgIHZhciB0MyA9IG4uZ3JvdXBzW3BhcnNlSW50KGU0LCAxMCldLCBpMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgaTIuY2xhc3NOYW1lID0gInJzLWdyb3VwIiwgdDMuZGl2ID0gaTI7CiAgICAgICAgICB2YXIgcjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJoMSIpOwogICAgICAgICAgcjIudGV4dENvbnRlbnQgPSB0My5jYXB0aW9uLCByMi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKGU1KSB7CiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZGVuIiksIGU1LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICB9LmJpbmQoaTIpKSwgcy5hcHBlbmRDaGlsZChyMiksIHMuYXBwZW5kQ2hpbGQoaTIpOwogICAgICAgIH0pLCBuLmZyYWN0aW9ucyAmJiB0MihuLmZyYWN0aW9ucywgZnVuY3Rpb24oZTQpIHsKICAgICAgICAgIHZhciByMiA9IG4uZnJhY3Rpb25zW3BhcnNlSW50KGU0LCAxMCldLCBvMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgbzIuY2xhc3NOYW1lID0gInJzLWZyYWN0aW9uIjsKICAgICAgICAgIHZhciBBMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgQTIuY2xhc3NOYW1lID0gInJzLWxlZ2VuZCI7CiAgICAgICAgICB2YXIgbDIgPSAwOwogICAgICAgICAgdDIobi5mcmFjdGlvbnNbZTRdLnN0ZXBzLCBmdW5jdGlvbih0MykgewogICAgICAgICAgICB2YXIgcjMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7CiAgICAgICAgICAgIHIzLnRleHRDb250ZW50ID0gbi5mcmFjdGlvbnNbZTRdLnN0ZXBzW3QzXSwgcjMuc3R5bGUuY29sb3IgPSBpW2wyXSwgQTIuYXBwZW5kQ2hpbGQocjMpLCBsMisrOwogICAgICAgICAgfSksIG8yLmFwcGVuZENoaWxkKEEyKSwgbzIuc3R5bGUuaGVpZ2h0ID0gbDIgKiBhICsgInB4IiwgcjIuZGl2ID0gbzI7CiAgICAgICAgICB2YXIgaDIgPSBuZXcgYyhvMiwgbDIpOwogICAgICAgICAgcjIuZ3JhcGggPSBoMiwgcy5hcHBlbmRDaGlsZChvMik7CiAgICAgICAgfSkpOwogICAgICB9KCksIGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgcmV0dXJuIGUzID8gZChlMykgOiB7IGVsZW1lbnQ6IG8sIHVwZGF0ZTogdSB9OwogICAgICB9OwogICAgfSwgZS5leHBvcnRzID0gd2luZG93LnJTdGF0czsKICB9LCAyNTM1OiAoZSkgPT4gewogICAgdmFyIHQyID0geyBiYXNlNjQ6IGZ1bmN0aW9uKGUyLCB0MykgewogICAgICByZXR1cm4gImRhdGE6IiArIGUyICsgIjtiYXNlNjQsIiArIHQzOwogICAgfSwgaXNNb2JpbGU6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgZTIsIHQzID0gZmFsc2U7CiAgICAgIHJldHVybiBlMiA9IG5hdmlnYXRvci51c2VyQWdlbnQgfHwgbmF2aWdhdG9yLnZlbmRvciB8fCB3aW5kb3cub3BlcmEsICgvKGFuZHJvaWR8YmJcZCt8bWVlZ28pLittb2JpbGV8YXZhbnRnb3xiYWRhXC98YmxhY2tiZXJyeXxibGF6ZXJ8Y29tcGFsfGVsYWluZXxmZW5uZWN8aGlwdG9wfGllbW9iaWxlfGlwKGhvbmV8b2QpfGlyaXN8a2luZGxlfGxnZSB8bWFlbW98bWlkcHxtbXB8bW9iaWxlLitmaXJlZm94fG5ldGZyb250fG9wZXJhIG0ob2J8aW4paXxwYWxtKCBvcyk/fHBob25lfHAoaXhpfHJlKVwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoNHw2KTB8c3ltYmlhbnx0cmVvfHVwXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyBjZXx4ZGF8eGlpbm8vaS50ZXN0KGUyKSB8fCAvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1wtKXxhaShrb3xybil8YWwoYXZ8Y2F8Y28pfGFtb2l8YW4oZXh8bnl8eXcpfGFwdHV8YXIoY2h8Z28pfGFzKHRlfHVzKXxhdHR3fGF1KGRpfFwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3XC0obnx1KXxjNTVcL3xjYXBpfGNjd2F8Y2RtXC18Y2VsbHxjaHRtfGNsZGN8Y21kXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8XC1kKXxlbCg0OXxhaSl8ZW0obDJ8dWwpfGVyKGljfGswKXxlc2w4fGV6KFs0LTddMHxvc3x3YXx6ZSl8ZmV0Y3xmbHkoXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcLTV8Z1wtbW98Z28oXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXC0obXxwfHQpfGhlaVwtfGhpKHB0fHRhKXxocCggaXxpcCl8aHNcLWN8aHQoYyhcLXwgfF98YXxnfHB8c3x0KXx0cCl8aHUoYXd8dGMpfGlcLSgyMHxnb3xtYSl8aTIzMHxpYWMoIHxcLXxcLyl8aWJyb3xpZGVhfGlnMDF8aWtvbXxpbTFrfGlubm98aXBhcXxpcmlzfGphKHR8dilhfGpicm98amVtdXxqaWdzfGtkZGl8a2VqaXxrZ3QoIHxcLyl8a2xvbnxrcHQgfGt3Y1wtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcLyhrfGx8dSl8NTB8NTR8XC1bYS13XSl8bGlid3xseW54fG0xXC13fG0zZ2F8bTUwXC98bWEodGV8dWl8eG8pfG1jKDAxfDIxfGNhKXxtXC1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dChcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXC18b258dGZ8d2Z8d2d8d3QpfG5vayg2fGkpfG56cGh8bzJpbXxvcCh0aXx3dil8b3Jhbnxvd2cxfHA4MDB8cGFuKGF8ZHx0KXxwZHhnfHBnKDEzfFwtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcLWd8cWFcLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8XC1bMi03XXxpXC0pfHF0ZWt8cjM4MHxyNjAwfHJha3N8cmltOXxybyh2ZXx6byl8czU1XC98c2EoZ2V8bWF8bW18bXN8bnl8dmEpfHNjKDAxfGhcLXxvb3xwXC0pfHNka1wvfHNlKGMoXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXC18c2hhcnxzaWUoXC18bSl8c2tcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFwtfHZcLXx2ICl8c3koMDF8bWIpfHQyKDE4fDUwKXx0NigwMHwxMHwxOCl8dGEoZ3R8bGspfHRjbFwtfHRkZ1wtfHRlbChpfG0pfHRpbVwtfHRcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXC18bTN8bTUpfHR4XC05fHVwKFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFwtdil8dm00MHx2b2RhfHZ1bGN8dngoNTJ8NTN8NjB8NjF8NzB8ODB8ODF8ODN8ODV8OTgpfHczYyhcLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhc1wtfHlvdXJ8emV0b3x6dGVcLS9pLnRlc3QoZTIuc3Vic3RyKDAsIDQpKSkgJiYgKHQzID0gdHJ1ZSksIHQzOwogICAgfSwgaXNJT1M6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gLyhpUGFkfGlQaG9uZXxpUG9kKS9nLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICB9LCBpc0lGcmFtZTogZnVuY3Rpb24oKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5zZWxmICE9PSB3aW5kb3cudG9wOwogICAgICB9IGNhdGNoIChlMikgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9LCBhcHBlbmRRdWVyeVBhcmFtZXRlcjogZnVuY3Rpb24oZTIsIHQzLCBuKSB7CiAgICAgIHZhciBpID0gZTIuaW5kZXhPZigiPyIpIDwgMCA/ICI/IiA6ICImIjsKICAgICAgcmV0dXJuIGUyICsgKGkgKyB0MyArICI9IikgKyBuOwogICAgfSwgZ2V0UXVlcnlQYXJhbWV0ZXI6IGZ1bmN0aW9uKGUyKSB7CiAgICAgIGUyID0gZTIucmVwbGFjZSgvW1xbXS8sICJcXFsiKS5yZXBsYWNlKC9bXF1dLywgIlxcXSIpOwogICAgICB2YXIgdDMgPSBuZXcgUmVnRXhwKCJbXFw/Jl0iICsgZTIgKyAiPShbXiYjXSopIikuZXhlYyhsb2NhdGlvbi5zZWFyY2gpOwogICAgICByZXR1cm4gdDMgPT09IG51bGwgPyAiIiA6IGRlY29kZVVSSUNvbXBvbmVudCh0M1sxXS5yZXBsYWNlKC9cKy9nLCAiICIpKTsKICAgIH0sIGlzTGFuZHNjYXBlTW9kZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB3aW5kb3cub3JpZW50YXRpb24gPT0gOTAgfHwgd2luZG93Lm9yaWVudGF0aW9uID09IC05MDsKICAgIH0gfTsKICAgIGUuZXhwb3J0cyA9IHQyOwogIH0sIDU5Mjg6IChlLCB0MiwgbikgPT4gewogICAgdmFyIGksIHIgPSBuKDI1MzUpOwogICAgZS5leHBvcnRzID0gKGkgPSBuYXZpZ2F0b3IudXNlckFnZW50IHx8IG5hdmlnYXRvci52ZW5kb3IgfHwgd2luZG93Lm9wZXJhKS5tYXRjaCgvaVBob25lL2kpIHx8IGkubWF0Y2goL2lQb2QvaSkgPyBmdW5jdGlvbigpIHsKICAgICAgdmFyIGUyID0gbnVsbDsKICAgICAgdGhpcy5yZXF1ZXN0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZTIgfHwgKGUyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICIvIiwgc2V0VGltZW91dCh3aW5kb3cuc3RvcCwgMCk7CiAgICAgICAgfSwgMTUwMDApKTsKICAgICAgfSwgdGhpcy5yZWxlYXNlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZTIgJiYgKGNsZWFySW50ZXJ2YWwoZTIpLCBlMiA9IG51bGwpOwogICAgICB9OwogICAgfSA6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgZTIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpOwogICAgICBlMi5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsIGZ1bmN0aW9uKCkgewogICAgICAgIGUyLnBsYXkoKTsKICAgICAgfSksIHRoaXMucmVxdWVzdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGUyLnBhdXNlZCAmJiAoZTIuc3JjID0gci5iYXNlNjQoInZpZGVvL3dlYm0iLCAiR2tYZm93RUFBQUFBQUFBZlFvYUJBVUwzZ1FGQzhvRUVRdk9CQ0VLQ2hIZGxZbTFDaDRFQ1FvV0JBaGhUZ0djQkFBQUFBQUFINHhGTm0zUkFMRTI3aTFPcmhCVkpxV1pUcklIZlRidU1VNnVFRmxTdWExT3NnZ0V3VGJ1TVU2dUVIRk83YTFPc2dnZkc3QUVBQUFBQUFBQ2tBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFWU2FsbUFRQUFBQUFBQUVVcTE3R0REMEpBVFlDTlRHRjJaalUyTGpRd0xqRXdNVmRCalV4aGRtWTFOaTQwTUM0eE1ERnpwSkFHU0pUTWJzTHBEdC95U2tpcGdYMWZSSW1JUU8xTUFBQUFBQUFXVks1ckFRQUFBQUFBQUR1dUFRQUFBQUFBQURMWGdRRnp4WUVCbklFQUlyV2NnM1Z1WklhRlZsOVdVRG1EZ1FFajQ0T0VPNXJLQU9BQkFBQUFBQUFBQnJDQnNMcUJrQjlEdG5VQkFBQUFBQUFBbytlQkFLT21nUUFBZ0tKSmcwSUFBVjRCSHNBSEJJT0RDb0FBQ21IMk1BQUFaeGd6NGRQU1RGaTVKQUNqbG9FRDZBQ21BRUNTbkFCTVFBQURZQUFBV2kwcXVvQ2psb0VIMEFDbUFFQ1NuQUJOd0FBRFlBQUFXaTBxdW9DamxvRUx1QUNtQUVDU25BQk5nQUFEWUFBQVdpMHF1b0NqbG9FUG9BQ21BRUNTbkFCTllBQURZQUFBV2kwcXVvQ2psb0VUaUFDbUFFQ1NuQUJOSUFBRFlBQUFXaTBxdW9BZlE3WjFBUUFBQUFBQUFKVG5naGR3bzVhQkFBQUFwZ0JBa3B3QVRPQUFBMkFBQUZvdEtycUFvNWFCQStnQXBnQkFrcHdBVE1BQUEyQUFBRm90S3JxQW81YUJCOUFBcGdCQWtwd0FUSUFBQTJBQUFGb3RLcnFBbzVhQkM3Z0FwZ0JBa3B3QVRFQUFBMkFBQUZvdEtycUFvNWFCRDZBQXBnREFrcHdBUTJBQUEyQUFBRm90S3JxQW81YUJFNGdBcGdCQWtwd0FUQ0FBQTJBQUFGb3RLcnFBSDBPMmRRRUFBQUFBQUFDVTU0SXU0S09XZ1FBQUFLWUFRSktjQUV2QUFBTmdBQUJhTFNxNmdLT1dnUVBvQUtZQVFKS2NBRXRnQUFOZ0FBQmFMU3E2Z0tPV2dRZlFBS1lBUUpLY0FFc0FBQU5nQUFCYUxTcTZnS09XZ1F1NEFLWUFRSktjQUVxQUFBTmdBQUJhTFNxNmdLT1dnUStnQUtZQVFKS2NBRW9nQUFOZ0FBQmFMU3E2Z0tPV2dST0lBS1lBUUpLY0FFbkFBQU5nQUFCYUxTcTZnQjlEdG5VQkFBQUFBQUFBbE9lQ1JsQ2psb0VBQUFDbUFFQ1NuQUJKZ0FBRFlBQUFXaTBxdW9DamxvRUQ2QUNtQUVDU25BQkpJQUFEWUFBQVdpMHF1b0NqbG9FSDBBQ21BTUNTbkFCRFlBQURZQUFBV2kwcXVvQ2psb0VMdUFDbUFFQ1NuQUJJNEFBRFlBQUFXaTBxdW9DamxvRVBvQUNtQUVDU25BQklvQUFEWUFBQVdpMHF1b0NqbG9FVGlBQ21BRUNTbkFCSVlBQURZQUFBV2kwcXVvQWZRN1oxQVFBQUFBQUFBSlRuZ2wzQW81YUJBQUFBcGdCQWtwd0FTQ0FBQTJBQUFGb3RLcnFBbzVhQkErZ0FwZ0JBa3B3QVNBQUFBMkFBQUZvdEtycUFvNWFCQjlBQXBnQkFrcHdBUjhBQUEyQUFBRm90S3JxQW81YUJDN2dBcGdCQWtwd0FSNEFBQTJBQUFGb3RLcnFBbzVhQkQ2QUFwZ0JBa3B3QVIyQUFBMkFBQUZvdEtycUFvNWFCRTRnQXBnQkFrcHdBUnlBQUEyQUFBRm90S3JxQUgwTzJkUUVBQUFBQUFBQ1U1NEoxTUtPV2dRQUFBS1lBd0pLY0FFTmdBQU5nQUFCYUxTcTZnS09XZ1FQb0FLWUFRSktjQUViZ0FBTmdBQUJhTFNxNmdLT1dnUWZRQUtZQVFKS2NBRWFnQUFOZ0FBQmFMU3E2Z0tPV2dRdTRBS1lBUUpLY0FFYUFBQU5nQUFCYUxTcTZnS09XZ1ErZ0FLWUFRSktjQUVaQUFBTmdBQUJhTFNxNmdLT1dnUk9JQUtZQVFKS2NBRVlBQUFOZ0FBQmFMU3E2Z0I5RHRuVUJBQUFBQUFBQWxPZUNqS0NqbG9FQUFBQ21BRUNTbkFCRjRBQURZQUFBV2kwcXVvQ2psb0VENkFDbUFFQ1NuQUJGd0FBRFlBQUFXaTBxdW9DamxvRUgwQUNtQUVDU25BQkZvQUFEWUFBQVdpMHF1b0NqbG9FTHVBQ21BRUNTbkFCRmdBQURZQUFBV2kwcXVvQ2psb0VQb0FDbUFNQ1NuQUJEWUFBRFlBQUFXaTBxdW9DamxvRVRpQUNtQUVDU25BQkZZQUFEWUFBQVdpMHF1b0FmUTdaMUFRQUFBQUFBQUpUbmdxUVFvNWFCQUFBQXBnQkFrcHdBUlVBQUEyQUFBRm90S3JxQW81YUJBK2dBcGdCQWtwd0FSU0FBQTJBQUFGb3RLcnFBbzVhQkI5QUFwZ0JBa3B3QVJRQUFBMkFBQUZvdEtycUFvNWFCQzdnQXBnQkFrcHdBUlFBQUEyQUFBRm90S3JxQW81YUJENkFBcGdCQWtwd0FST0FBQTJBQUFGb3RLcnFBbzVhQkU0Z0FwZ0JBa3B3QVJNQUFBMkFBQUZvdEtycUFIME8yZFFFQUFBQUFBQUNVNTRLN2dLT1dnUUFBQUtZQVFKS2NBRVNnQUFOZ0FBQmFMU3E2Z0tPV2dRUG9BS1lBUUpLY0FFU0FBQU5nQUFCYUxTcTZnS09XZ1FmUUFLWUF3SktjQUVOZ0FBTmdBQUJhTFNxNmdLT1dnUXU0QUtZQVFKS2NBRVJnQUFOZ0FBQmFMU3E2Z0tPV2dRK2dBS1lBUUpLY0FFUkFBQU5nQUFCYUxTcTZnS09XZ1JPSUFLWUFRSktjQUVRZ0FBTmdBQUJhTFNxNmdCOUR0blVCQUFBQUFBQUFsT2VDMHZDamxvRUFBQUNtQUVDU25BQkVJQUFEWUFBQVdpMHF1b0NqbG9FRDZBQ21BRUNTbkFCRUFBQURZQUFBV2kwcXVvQ2psb0VIMEFDbUFFQ1NuQUJENEFBRFlBQUFXaTBxdW9DamxvRUx1QUNtQUVDU25BQkR3QUFEWUFBQVdpMHF1b0NqbG9FUG9BQ21BRUNTbkFCRG9BQURZQUFBV2kwcXVvQ2psb0VUaUFDbUFFQ1NuQUJEZ0FBRFlBQUFXaTBxdW9BY1U3dHJBUUFBQUFBQUFCRzdqN09CQUxlSzk0RUI4WUlCZC9DQkF3PT0iKSwgZTIucGxheSgpKTsKICAgICAgfSwgdGhpcy5yZWxlYXNlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZTIucGF1c2UoKSwgZTIuc3JjID0gIiI7CiAgICAgIH07CiAgICB9OwogIH0sIDgyMTc6IChlLCB0MiwgbikgPT4gewogICAgbi5kKHQyLCB7IEE6ICgpID0+IHYgfSk7CiAgICB2YXIgaSA9IG4oOTYzKSwgciA9IG4ubihpKSwgbyA9IG4oOTA4OSksIHMgPSBuLm4obyksIGEgPSBuKDY0OTIpLCBBID0gbi5uKGEpLCBsID0gbmV3IFVSTChuKDkxNjkpLCBuLmIpLCBjID0gbmV3IFVSTChuKDYwODUpLCBuLmIpLCBoID0gbmV3IFVSTChuKDM5MzEpLCBuLmIpLCBkID0gbmV3IFVSTChuKDc4ODkpLCBuLmIpLCB1ID0gbmV3IFVSTChuKDY1MTcpLCBuLmIpLCBnID0gcygpKHIoKSksIHAgPSBBKCkobCksIGYgPSBBKCkoYyksIG0gPSBBKCkoaCksIEUgPSBBKCkoZCksIEMgPSBBKCkodSk7CiAgICBnLnB1c2goW2UuaWQsIGAvKiAuYS1mdWxsc2NyZWVuIG1lYW5zIG5vdCBlbWJlZGRlZC4gKi8KaHRtbC5hLWZ1bGxzY3JlZW4gewogIGJvdHRvbTogMDsKICBsZWZ0OiAwOwogIHBvc2l0aW9uOiBmaXhlZDsKICByaWdodDogMDsKICB0b3A6IDA7Cn0KCmh0bWwuYS1mdWxsc2NyZWVuIGJvZHkgewogIGhlaWdodDogMTAwJTsKICBtYXJnaW46IDA7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBwYWRkaW5nOiAwOwogIHdpZHRoOiAxMDAlOwp9CgovKiBDbGFzcyBpcyByZW1vdmVkIHdoZW4gZG9pbmcgPGEtc2NlbmUgZW1iZWRkZWQ+LiAqLwpodG1sLmEtZnVsbHNjcmVlbiAuYS1jYW52YXMgewogIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgdG9wOiAwICFpbXBvcnRhbnQ7CiAgbGVmdDogMCAhaW1wb3J0YW50OwogIHJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgYm90dG9tOiAwICFpbXBvcnRhbnQ7CiAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7Cn0KCmh0bWw6bm90KC5hLWZ1bGxzY3JlZW4pIC5hLWVudGVyLXZyLApodG1sOm5vdCguYS1mdWxsc2NyZWVuKSAuYS1lbnRlci1hciB7CiAgcmlnaHQ6IDVweDsKICBib3R0b206IDVweDsKfQoKaHRtbDpub3QoLmEtZnVsbHNjcmVlbikgLmEtZW50ZXItYXIgewogIHJpZ2h0OiA2MHB4Owp9CgovKiBJbiBjaHJvbWUgbW9iaWxlIHRoZSB1c2VyIGFnZW50IHN0eWxlc2hlZXQgc2V0IGl0IHRvIHdoaXRlICAqLwo6LXdlYmtpdC1mdWxsLXNjcmVlbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KCi5hLWhpZGRlbiB7CiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9CgouYS1jYW52YXMgewogIGhlaWdodDogMTAwJTsKICBsZWZ0OiAwOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgd2lkdGg6IDEwMCU7Cn0KCi5hLWNhbnZhcy5hLWdyYWItY3Vyc29yOmhvdmVyIHsKICBjdXJzb3I6IGdyYWI7CiAgY3Vyc29yOiAtbW96LWdyYWI7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWI7Cn0KCmNhbnZhcy5hLWNhbnZhcy5hLW1vdXNlLWN1cnNvci1ob3Zlcjpob3ZlciB7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgouYS1pbnNwZWN0b3ItbG9hZGVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWQzMTYwOwogIHBvc2l0aW9uOiBmaXhlZDsKICBsZWZ0OiAzcHg7CiAgdG9wOiAzcHg7CiAgcGFkZGluZzogNnB4IDEwcHg7CiAgY29sb3I6ICNmZmY7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogIGZvbnQtc2l6ZTogMTJweDsKICBmb250LWZhbWlseTogUm9ib3RvLHNhbnMtc2VyaWY7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHotaW5kZXg6IDk5OTk5OwogIHdpZHRoOiAyMDRweDsKfQoKLyogSW5zcGVjdG9yIGxvYWRlciBhbmltYXRpb24gKi8KQGtleWZyYW1lcyBkb3RzLTEgeyBmcm9tIHsgb3BhY2l0eTogMDsgfSAyNSUgeyBvcGFjaXR5OiAxOyB9IH0KQGtleWZyYW1lcyBkb3RzLTIgeyBmcm9tIHsgb3BhY2l0eTogMDsgfSA1MCUgeyBvcGFjaXR5OiAxOyB9IH0KQGtleWZyYW1lcyBkb3RzLTMgeyBmcm9tIHsgb3BhY2l0eTogMDsgfSA3NSUgeyBvcGFjaXR5OiAxOyB9IH0KQC13ZWJraXQta2V5ZnJhbWVzIGRvdHMtMSB7IGZyb20geyBvcGFjaXR5OiAwOyB9IDI1JSB7IG9wYWNpdHk6IDE7IH0gfQpALXdlYmtpdC1rZXlmcmFtZXMgZG90cy0yIHsgZnJvbSB7IG9wYWNpdHk6IDA7IH0gNTAlIHsgb3BhY2l0eTogMTsgfSB9CkAtd2Via2l0LWtleWZyYW1lcyBkb3RzLTMgeyBmcm9tIHsgb3BhY2l0eTogMDsgfSA3NSUgeyBvcGFjaXR5OiAxOyB9IH0KCi5hLWluc3BlY3Rvci1sb2FkZXIgLmRvdHMgc3BhbiB7CiAgYW5pbWF0aW9uOiBkb3RzLTEgMnMgaW5maW5pdGUgc3RlcHMoMSk7CiAgLXdlYmtpdC1hbmltYXRpb246IGRvdHMtMSAycyBpbmZpbml0ZSBzdGVwcygxKTsKfQoKLmEtaW5zcGVjdG9yLWxvYWRlciAuZG90cyBzcGFuOmZpcnN0LWNoaWxkICsgc3BhbiB7CiAgYW5pbWF0aW9uLW5hbWU6IGRvdHMtMjsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBkb3RzLTI7Cn0KCi5hLWluc3BlY3Rvci1sb2FkZXIgLmRvdHMgc3BhbjpmaXJzdC1jaGlsZCArIHNwYW4gKyBzcGFuIHsKICBhbmltYXRpb24tbmFtZTogZG90cy0zOwogIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGRvdHMtMzsKfQoKYS1zY2VuZSB7CiAgZGlzcGxheTogYmxvY2s7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGhlaWdodDogMTAwJTsKICB3aWR0aDogMTAwJTsKfQoKYS1hc3NldHMsCmEtc2NlbmUgdmlkZW8sCmEtc2NlbmUgaW1nLAphLXNjZW5lIGF1ZGlvIHsKICBkaXNwbGF5OiBub25lOwp9CgouYS1lbnRlci12ci1tb2RhbCwKLmEtb3JpZW50YXRpb24tbW9kYWwgewogIGZvbnQtZmFtaWx5OiBDb25zb2xhcywgQW5kYWxlIE1vbm8sIENvdXJpZXIgTmV3LCBtb25vc3BhY2U7Cn0KCi5hLWVudGVyLXZyLW1vZGFsIGEgewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZmZmOwogIHBhZGRpbmc6IDJweCAwOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICB0cmFuc2l0aW9uOiAuMXMgY29sb3IgZWFzZS1pbjsKfQoKLmEtZW50ZXItdnItbW9kYWwgYTpob3ZlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICBjb2xvcjogIzExMTsKICBwYWRkaW5nOiAycHggNHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBsZWZ0OiAtNHB4Owp9CgouYS1lbnRlci12ciwKLmEtZW50ZXItYXIgewogIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmLCBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxM3B4OwogIHdpZHRoOiAxMDAlOwogIGZvbnQtd2VpZ2h0OiAyMDA7CiAgbGluZS1oZWlnaHQ6IDE2cHg7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHJpZ2h0OiAyMHB4OwogIGJvdHRvbTogMjBweDsKfQoKLmEtZW50ZXItYXIueHIgewogIHJpZ2h0OiA5MHB4Owp9CgouYS1lbnRlci12ci1idXR0b24sCi5hLWVudGVyLXZyLW1vZGFsLAouYS1lbnRlci12ci1tb2RhbCBhIHsKICBjb2xvcjogI2ZmZjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICBvdXRsaW5lOiBub25lOwp9CgouYS1lbnRlci12ci1idXR0b24gewogIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zNSkgdXJsKCR7cH0pIDUwJSA1MCUgbm8tcmVwZWF0Owp9CgouYS1lbnRlci1hci1idXR0b24gewogIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yMCkgdXJsKCR7Zn0pIDUwJSA1MCUgbm8tcmVwZWF0Owp9CgouYS1lbnRlci12ci5mdWxsc2NyZWVuIC5hLWVudGVyLXZyLWJ1dHRvbiB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7bX0pOwp9CgouYS1lbnRlci12ci1idXR0b24sCi5hLWVudGVyLWFyLWJ1dHRvbiB7CiAgYmFja2dyb3VuZC1zaXplOiA5MCUgOTAlOwogIGJvcmRlcjogMDsKICBib3R0b206IDA7CiAgY3Vyc29yOiBwb2ludGVyOwogIG1pbi13aWR0aDogNThweDsKICBtaW4taGVpZ2h0OiAzNHB4OwogIC8qIDEuNzQ0MTg2MDQ2NTEgKi8KICAvKgogICAgSW4gb3JkZXIgdG8ga2VlcCB0aGUgYXNwZWN0IHJhdGlvIHdoZW4gcmVzaXppbmcKICAgIHBhZGRpbmctdG9wIHBlcmNlbnRhZ2VzIGFyZSByZWxhdGl2ZSB0byB0aGUgY29udGFpbmluZyBibG9jaydzIHdpZHRoLgogICAgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMjEyMTA5MC9yZXNwb25zaXZlbHktY2hhbmdlLWRpdi1zaXplLWtlZXBpbmctYXNwZWN0LXJhdGlvCiAgKi8KICBwYWRkaW5nLXJpZ2h0OiAwOwogIHBhZGRpbmctdG9wOiAwOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICByaWdodDogMDsKICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIC4wNXMgZWFzZTsKICAtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgLjA1cyBlYXNlOwogIHotaW5kZXg6IDk5OTk7CiAgYm9yZGVyLXJhZGl1czogOHB4OwogIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uOyAvKiBQcmV2ZW50IGlPUyBkb3VibGUgdGFwIHpvb20gb24gdGhlIGJ1dHRvbiAqLwp9CgouYS1lbnRlci1hci1idXR0b24gewogIGJhY2tncm91bmQtc2l6ZTogMTAwJSA5MCU7CiAgYm9yZGVyLXJhZGl1czogN3B4Owp9CgouYS1lbnRlci1hci1idXR0b246YWN0aXZlLAouYS1lbnRlci1hci1idXR0b246aG92ZXIsCi5hLWVudGVyLXZyLWJ1dHRvbjphY3RpdmUsCi5hLWVudGVyLXZyLWJ1dHRvbjpob3ZlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2VmMmQ1ZTsKfQoKLmEtZW50ZXItdnItYnV0dG9uLnJlc2V0aG92ZXIgewogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5hLWVudGVyLXZyLW1vZGFsIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjY2OwogIGJvcmRlci1yYWRpdXM6IDA7CiAgZGlzcGxheTogbm9uZTsKICBtaW4taGVpZ2h0OiAzMnB4OwogIG1hcmdpbi1yaWdodDogNzBweDsKICBwYWRkaW5nOiA5cHg7CiAgd2lkdGg6IDI4MHB4OwogIHJpZ2h0OiAyJTsKICBwb3NpdGlvbjogYWJzb2x1dGU7Cn0KCi5hLWVudGVyLXZyLW1vZGFsOmFmdGVyIHsKICBib3JkZXItYm90dG9tOiAxMHB4IHNvbGlkIHRyYW5zcGFyZW50OwogIGJvcmRlci1sZWZ0OiAxMHB4IHNvbGlkICM2NjY7CiAgYm9yZGVyLXRvcDogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgY29udGVudDogJyc7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHJpZ2h0OiAtNXB4OwogIHRvcDogNXB4OwogIHdpZHRoOiAwOwogIGhlaWdodDogMDsKfQoKLmEtZW50ZXItdnItbW9kYWwgcCwKLmEtZW50ZXItdnItbW9kYWwgYSB7CiAgZGlzcGxheTogaW5saW5lOwp9CgouYS1lbnRlci12ci1tb2RhbCBwIHsKICBtYXJnaW46IDA7Cn0KCi5hLWVudGVyLXZyLW1vZGFsIHA6YWZ0ZXIgewogIGNvbnRlbnQ6ICcgJzsKfQoKLmEtb3JpZW50YXRpb24tbW9kYWwgewogIGJhY2tncm91bmQ6IHJnYmEoMjQ0LCAyNDQsIDI0NCwgMSkgdXJsKCR7RX0pIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiA1MCUgNTAlOwogIGJvdHRvbTogMDsKICBmb250LXNpemU6IDE0cHg7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBsZWZ0OiAwOwogIGxpbmUtaGVpZ2h0OiAyMHB4OwogIHJpZ2h0OiAwOwogIHBvc2l0aW9uOiBmaXhlZDsKICB0b3A6IDA7CiAgei1pbmRleDogOTk5OTk5OTsKfQoKLmEtb3JpZW50YXRpb24tbW9kYWw6YWZ0ZXIgewogIGNvbG9yOiAjNjY2OwogIGNvbnRlbnQ6ICJJbnNlcnQgcGhvbmUgaW50byBDYXJkYm9hcmQgaG9sZGVyLiI7CiAgZGlzcGxheTogYmxvY2s7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB0b3A6IDcwJTsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTcwJSk7CiAgd2lkdGg6IDEwMCU7Cn0KCi5hLW9yaWVudGF0aW9uLW1vZGFsIGJ1dHRvbiB7CiAgYmFja2dyb3VuZDogdXJsKCR7Q30pIG5vLXJlcGVhdDsKICBib3JkZXI6IG5vbmU7CiAgaGVpZ2h0OiA1MHB4OwogIHRleHQtaW5kZW50OiAtOTk5OXB4OwogIHdpZHRoOiA1MHB4Owp9CgouYS1sb2FkZXItdGl0bGUgewogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC42KTsKICBmb250LWZhbWlseTogc2Fucy1zZXJpZiwgbW9ub3NwYWNlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBmb250LXNpemU6IDIwcHg7CiAgaGVpZ2h0OiA1MHB4OwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgbGluZS1oZWlnaHQ6IDUwcHg7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHJpZ2h0OiAwcHg7CiAgbGVmdDogMHB4OwogIHRvcDogMHB4OwogIGNvbG9yOiB3aGl0ZTsKfQoKLmEtbW9kYWwgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjApOwogIGJhY2tncm91bmQtc2l6ZTogNTAlIDUwJTsKICBib3R0b206IDA7CiAgZm9udC1zaXplOiAxNHB4OwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgbGVmdDogMDsKICBsaW5lLWhlaWdodDogMjBweDsKICByaWdodDogMDsKICBwb3NpdGlvbjogZml4ZWQ7CiAgdG9wOiAwOwogIHotaW5kZXg6IDk5OTk5OTk7Cn0KCi5hLWRpYWxvZyB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGxlZnQ6IDUwJTsKICB0b3A6IDUwJTsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICB6LWluZGV4OiAxOTk5OTU7CiAgd2lkdGg6IDMwMHB4OwogIGhlaWdodDogMjAwcHg7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwogIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmLCBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAyMHB4OwogIGJvcmRlci1yYWRpdXM6IDNweDsKICBwYWRkaW5nOiA2cHg7Cn0KCi5hLWRpYWxvZy10ZXh0LWNvbnRhaW5lciB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiA3MCU7CiAgYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICBkaXNwbGF5OiBmbGV4OwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9CgouYS1kaWFsb2ctdGV4dCB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgZm9udC1zaXplOiAxNHB0OwogIG1hcmdpbjogOHB4Owp9CgouYS1kaWFsb2ctYnV0dG9ucy1jb250YWluZXIgewogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMzAlOwp9CgouYS1kaWFsb2ctYnV0dG9uIHsKICBjdXJzb3I6IHBvaW50ZXI7CiAgYWxpZ24tc2VsZjogY2VudGVyOwogIG9wYWNpdHk6IDAuOTsKICBoZWlnaHQ6IDgwJTsKICB3aWR0aDogNTAlOwogIGZvbnQtc2l6ZTogMTJwdDsKICBtYXJnaW46IDRweDsKICBib3JkZXItcmFkaXVzOiAycHg7CiAgdGV4dC1hbGlnbjpjZW50ZXI7CiAgYm9yZGVyOiBub25lOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLWluLW91dDsKICB0cmFuc2l0aW9uOiBhbGwgMC4yNXMgZWFzZS1pbi1vdXQ7CiAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMCksIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMjApOwogIHVzZXItc2VsZWN0OiBub25lOwp9CgouYS1kaWFsb2ctcGVybWlzc2lvbi1idXR0b246aG92ZXIgewogIGJveC1zaGFkb3c6IDAgN3B4IDE0cHggcmdiYSgwLDAsMCwwLjIwKSwgMCAycHggMnB4IHJnYmEoMCwwLDAsMC4yMCk7Cn0KCi5hLWRpYWxvZy1hbGxvdy1idXR0b24gewogIGJhY2tncm91bmQtY29sb3I6ICMwMGNlZmY7Cn0KCi5hLWRpYWxvZy1kZW55LWJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmMDA1YjsKfQoKLmEtZGlhbG9nLW9rLWJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzAwY2VmZjsKICB3aWR0aDogMTAwJTsKfQoKLmEtZG9tLW92ZXJsYXk6bm90KC5hLW5vLXN0eWxlKSB7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBib3R0b206IDA7CiAgbGVmdDogMDsKICByaWdodDogMDsKICB0b3A6IDA7CiAgcGFkZGluZzogMWVtOwp9CgouYS1kb20tb3ZlcmxheTpub3QoLmEtbm8tc3R5bGUpPiogewogIHBvaW50ZXItZXZlbnRzOiBhdXRvOwp9CmAsICIiLCB7IHZlcnNpb246IDMsIHNvdXJjZXM6IFsid2VicGFjazovLy4vc3JjL3N0eWxlL2FmcmFtZS5jc3MiXSwgbmFtZXM6IFtdLCBtYXBwaW5nczogIkFBQUEsc0NBQXNDO0FBQ3RDO0VBQ0UsU0FBUztFQUNULE9BQU87RUFDUCxlQUFlO0VBQ2YsUUFBUTtFQUNSLE1BQU07QUFDUjs7QUFFQTtFQUNFLFlBQVk7RUFDWixTQUFTO0VBQ1QsZ0JBQWdCO0VBQ2hCLFVBQVU7RUFDVixXQUFXO0FBQ2I7O0FBRUEsb0RBQW9EO0FBQ3BEO0VBQ0Usc0JBQXNCO0VBQ3RCLHVCQUF1QjtFQUN2QixpQkFBaUI7RUFDakIsa0JBQWtCO0VBQ2xCLG1CQUFtQjtFQUNuQixvQkFBb0I7RUFDcEIsMEJBQTBCO0FBQzVCOztBQUVBOztFQUVFLFVBQVU7RUFDVixXQUFXO0FBQ2I7O0FBRUE7RUFDRSxXQUFXO0FBQ2I7O0FBRUEsZ0VBQWdFO0FBQ2hFO0VBQ0UsNkJBQTZCO0FBQy9COztBQUVBO0VBQ0Usd0JBQXdCO0FBQzFCOztBQUVBO0VBQ0UsWUFBWTtFQUNaLE9BQU87RUFDUCxrQkFBa0I7RUFDbEIsTUFBTTtFQUNOLFdBQVc7QUFDYjs7QUFFQTtFQUNFLFlBQVk7RUFDWixpQkFBaUI7RUFDakIsb0JBQW9CO0FBQ3RCOztBQUVBO0VBQ0UsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6QixlQUFlO0VBQ2YsU0FBUztFQUNULFFBQVE7RUFDUixpQkFBaUI7RUFDakIsV0FBVztFQUNYLHFCQUFxQjtFQUNyQixlQUFlO0VBQ2YsOEJBQThCO0VBQzlCLGtCQUFrQjtFQUNsQixjQUFjO0VBQ2QsWUFBWTtBQUNkOztBQUVBLCtCQUErQjtBQUMvQixvQkFBb0IsT0FBTyxVQUFVLEVBQUUsRUFBRSxNQUFNLFVBQVUsRUFBRSxFQUFFO0FBQzdELG9CQUFvQixPQUFPLFVBQVUsRUFBRSxFQUFFLE1BQU0sVUFBVSxFQUFFLEVBQUU7QUFDN0Qsb0JBQW9CLE9BQU8sVUFBVSxFQUFFLEVBQUUsTUFBTSxVQUFVLEVBQUUsRUFBRTtBQUM3RCw0QkFBNEIsT0FBTyxVQUFVLEVBQUUsRUFBRSxNQUFNLFVBQVUsRUFBRSxFQUFFO0FBQ3JFLDRCQUE0QixPQUFPLFVBQVUsRUFBRSxFQUFFLE1BQU0sVUFBVSxFQUFFLEVBQUU7QUFDckUsNEJBQTRCLE9BQU8sVUFBVSxFQUFFLEVBQUUsTUFBTSxVQUFVLEVBQUUsRUFBRTs7QUFFckU7RUFDRSxzQ0FBc0M7RUFDdEMsOENBQThDO0FBQ2hEOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLDhCQUE4QjtBQUNoQzs7QUFFQTtFQUNFLHNCQUFzQjtFQUN0Qiw4QkFBOEI7QUFDaEM7O0FBRUE7RUFDRSxjQUFjO0VBQ2Qsa0JBQWtCO0VBQ2xCLFlBQVk7RUFDWixXQUFXO0FBQ2I7O0FBRUE7Ozs7RUFJRSxhQUFhO0FBQ2Y7O0FBRUE7O0VBRUUsMERBQTBEO0FBQzVEOztBQUVBO0VBQ0UsNkJBQTZCO0VBQzdCLGNBQWM7RUFDZCxxQkFBcUI7RUFDckIsNkJBQTZCO0FBQy9COztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLFdBQVc7RUFDWCxnQkFBZ0I7RUFDaEIsa0JBQWtCO0VBQ2xCLFVBQVU7QUFDWjs7QUFFQTs7RUFFRSxrQ0FBa0M7RUFDbEMsZUFBZTtFQUNmLFdBQVc7RUFDWCxnQkFBZ0I7RUFDaEIsaUJBQWlCO0VBQ2pCLGtCQUFrQjtFQUNsQixXQUFXO0VBQ1gsWUFBWTtBQUNkOztBQUVBO0VBQ0UsV0FBVztBQUNiOztBQUVBOzs7RUFHRSxXQUFXO0VBQ1gsaUJBQWlCO0VBQ2pCLGFBQWE7QUFDZjs7QUFFQTtFQUNFLHlGQUE0cUI7QUFDOXFCOztBQUVBO0VBQ0UseUZBQWt6QjtBQUNwekI7O0FBRUE7RUFDRSx5REFBMnFLO0FBQzdxSzs7QUFFQTs7RUFFRSx3QkFBd0I7RUFDeEIsU0FBUztFQUNULFNBQVM7RUFDVCxlQUFlO0VBQ2YsZUFBZTtFQUNmLGdCQUFnQjtFQUNoQixrQkFBa0I7RUFDbEI7Ozs7R0FJQztFQUNELGdCQUFnQjtFQUNoQixjQUFjO0VBQ2Qsa0JBQWtCO0VBQ2xCLFFBQVE7RUFDUixzQ0FBc0M7RUFDdEMsOENBQThDO0VBQzlDLGFBQWE7RUFDYixrQkFBa0I7RUFDbEIsMEJBQTBCLEVBQUUsOENBQThDO0FBQzVFOztBQUVBO0VBQ0UseUJBQXlCO0VBQ3pCLGtCQUFrQjtBQUNwQjs7QUFFQTs7OztFQUlFLHlCQUF5QjtBQUMzQjs7QUFFQTtFQUNFLHFDQUFxQztBQUN2Qzs7QUFFQTtFQUNFLHNCQUFzQjtFQUN0QixnQkFBZ0I7RUFDaEIsYUFBYTtFQUNiLGdCQUFnQjtFQUNoQixrQkFBa0I7RUFDbEIsWUFBWTtFQUNaLFlBQVk7RUFDWixTQUFTO0VBQ1Qsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UscUNBQXFDO0VBQ3JDLDRCQUE0QjtFQUM1QixrQ0FBa0M7RUFDbEMscUJBQXFCO0VBQ3JCLFdBQVc7RUFDWCxrQkFBa0I7RUFDbEIsV0FBVztFQUNYLFFBQVE7RUFDUixRQUFRO0VBQ1IsU0FBUztBQUNYOztBQUVBOztFQUVFLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxTQUFTO0FBQ1g7O0FBRUE7RUFDRSxZQUFZO0FBQ2Q7O0FBRUE7RUFDRSwyRkFBaXZGO0VBQ2p2Rix3QkFBd0I7RUFDeEIsU0FBUztFQUNULGVBQWU7RUFDZixnQkFBZ0I7RUFDaEIsT0FBTztFQUNQLGlCQUFpQjtFQUNqQixRQUFRO0VBQ1IsZUFBZTtFQUNmLE1BQU07RUFDTixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsOENBQThDO0VBQzlDLGNBQWM7RUFDZCxrQkFBa0I7RUFDbEIsa0JBQWtCO0VBQ2xCLFFBQVE7RUFDUiwyQkFBMkI7RUFDM0IsV0FBVztBQUNiOztBQUVBO0VBQ0UsNkRBQTI1QjtFQUMzNUIsWUFBWTtFQUNaLFlBQVk7RUFDWixvQkFBb0I7RUFDcEIsV0FBVztBQUNiOztBQUVBO0VBQ0Usb0NBQW9DO0VBQ3BDLGtDQUFrQztFQUNsQyxrQkFBa0I7RUFDbEIsZUFBZTtFQUNmLFlBQVk7RUFDWixnQkFBZ0I7RUFDaEIsaUJBQWlCO0VBQ2pCLGtCQUFrQjtFQUNsQixVQUFVO0VBQ1YsU0FBUztFQUNULFFBQVE7RUFDUixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsK0JBQStCO0VBQy9CLHdCQUF3QjtFQUN4QixTQUFTO0VBQ1QsZUFBZTtFQUNmLGdCQUFnQjtFQUNoQixPQUFPO0VBQ1AsaUJBQWlCO0VBQ2pCLFFBQVE7RUFDUixlQUFlO0VBQ2YsTUFBTTtFQUNOLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLGtCQUFrQjtFQUNsQixTQUFTO0VBQ1QsUUFBUTtFQUNSLGdDQUFnQztFQUNoQyxlQUFlO0VBQ2YsWUFBWTtFQUNaLGFBQWE7RUFDYix3QkFBd0I7RUFDeEIsdUJBQXVCO0VBQ3ZCLGtDQUFrQztFQUNsQyxlQUFlO0VBQ2Ysa0JBQWtCO0VBQ2xCLFlBQVk7QUFDZDs7QUFFQTtFQUNFLFdBQVc7RUFDWCxXQUFXO0VBQ1gsc0JBQXNCO0VBQ3RCLGFBQWE7RUFDYix1QkFBdUI7RUFDdkIscUJBQXFCO0VBQ3JCLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLHFCQUFxQjtFQUNyQixtQkFBbUI7RUFDbkIsZUFBZTtFQUNmLFdBQVc7QUFDYjs7QUFFQTtFQUNFLG9CQUFvQjtFQUNwQixvQkFBb0I7RUFDcEIsV0FBVztFQUNYLFdBQVc7QUFDYjs7QUFFQTtFQUNFLGVBQWU7RUFDZixrQkFBa0I7RUFDbEIsWUFBWTtFQUNaLFdBQVc7RUFDWCxVQUFVO0VBQ1YsZUFBZTtFQUNmLFdBQVc7RUFDWCxrQkFBa0I7RUFDbEIsaUJBQWlCO0VBQ2pCLFlBQVk7RUFDWixxQkFBcUI7RUFDckIseUNBQXlDO0VBQ3pDLGlDQUFpQztFQUNqQyx3RUFBd0U7RUFDeEUsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsbUVBQW1FO0FBQ3JFOztBQUVBO0VBQ0UseUJBQXlCO0FBQzNCOztBQUVBO0VBQ0UseUJBQXlCO0FBQzNCOztBQUVBO0VBQ0UseUJBQXlCO0VBQ3pCLFdBQVc7QUFDYjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixrQkFBa0I7RUFDbEIsb0JBQW9CO0VBQ3BCLHNCQUFzQjtFQUN0QixTQUFTO0VBQ1QsT0FBTztFQUNQLFFBQVE7RUFDUixNQUFNO0VBQ04sWUFBWTtBQUNkOztBQUVBO0VBQ0Usb0JBQW9CO0FBQ3RCIiwgc291cmNlc0NvbnRlbnQ6IFtgLyogLmEtZnVsbHNjcmVlbiBtZWFucyBub3QgZW1iZWRkZWQuICovCmh0bWwuYS1mdWxsc2NyZWVuIHsKICBib3R0b206IDA7CiAgbGVmdDogMDsKICBwb3NpdGlvbjogZml4ZWQ7CiAgcmlnaHQ6IDA7CiAgdG9wOiAwOwp9CgpodG1sLmEtZnVsbHNjcmVlbiBib2R5IHsKICBoZWlnaHQ6IDEwMCU7CiAgbWFyZ2luOiAwOwogIG92ZXJmbG93OiBoaWRkZW47CiAgcGFkZGluZzogMDsKICB3aWR0aDogMTAwJTsKfQoKLyogQ2xhc3MgaXMgcmVtb3ZlZCB3aGVuIGRvaW5nIDxhLXNjZW5lIGVtYmVkZGVkPi4gKi8KaHRtbC5hLWZ1bGxzY3JlZW4gLmEtY2FudmFzIHsKICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogIGhlaWdodDogMTAwJSAhaW1wb3J0YW50OwogIHRvcDogMCAhaW1wb3J0YW50OwogIGxlZnQ6IDAgIWltcG9ydGFudDsKICByaWdodDogMCAhaW1wb3J0YW50OwogIGJvdHRvbTogMCAhaW1wb3J0YW50OwogIHBvc2l0aW9uOiBmaXhlZCAhaW1wb3J0YW50Owp9CgpodG1sOm5vdCguYS1mdWxsc2NyZWVuKSAuYS1lbnRlci12ciwKaHRtbDpub3QoLmEtZnVsbHNjcmVlbikgLmEtZW50ZXItYXIgewogIHJpZ2h0OiA1cHg7CiAgYm90dG9tOiA1cHg7Cn0KCmh0bWw6bm90KC5hLWZ1bGxzY3JlZW4pIC5hLWVudGVyLWFyIHsKICByaWdodDogNjBweDsKfQoKLyogSW4gY2hyb21lIG1vYmlsZSB0aGUgdXNlciBhZ2VudCBzdHlsZXNoZWV0IHNldCBpdCB0byB3aGl0ZSAgKi8KOi13ZWJraXQtZnVsbC1zY3JlZW4gewogIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50Owp9CgouYS1oaWRkZW4gewogIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLmEtY2FudmFzIHsKICBoZWlnaHQ6IDEwMCU7CiAgbGVmdDogMDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiAwOwogIHdpZHRoOiAxMDAlOwp9CgouYS1jYW52YXMuYS1ncmFiLWN1cnNvcjpob3ZlciB7CiAgY3Vyc29yOiBncmFiOwogIGN1cnNvcjogLW1vei1ncmFiOwogIGN1cnNvcjogLXdlYmtpdC1ncmFiOwp9CgpjYW52YXMuYS1jYW52YXMuYS1tb3VzZS1jdXJzb3ItaG92ZXI6aG92ZXIgewogIGN1cnNvcjogcG9pbnRlcjsKfQoKLmEtaW5zcGVjdG9yLWxvYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2VkMzE2MDsKICBwb3NpdGlvbjogZml4ZWQ7CiAgbGVmdDogM3B4OwogIHRvcDogM3B4OwogIHBhZGRpbmc6IDZweCAxMHB4OwogIGNvbG9yOiAjZmZmOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC1mYW1pbHk6IFJvYm90byxzYW5zLXNlcmlmOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB6LWluZGV4OiA5OTk5OTsKICB3aWR0aDogMjA0cHg7Cn0KCi8qIEluc3BlY3RvciBsb2FkZXIgYW5pbWF0aW9uICovCkBrZXlmcmFtZXMgZG90cy0xIHsgZnJvbSB7IG9wYWNpdHk6IDA7IH0gMjUlIHsgb3BhY2l0eTogMTsgfSB9CkBrZXlmcmFtZXMgZG90cy0yIHsgZnJvbSB7IG9wYWNpdHk6IDA7IH0gNTAlIHsgb3BhY2l0eTogMTsgfSB9CkBrZXlmcmFtZXMgZG90cy0zIHsgZnJvbSB7IG9wYWNpdHk6IDA7IH0gNzUlIHsgb3BhY2l0eTogMTsgfSB9CkAtd2Via2l0LWtleWZyYW1lcyBkb3RzLTEgeyBmcm9tIHsgb3BhY2l0eTogMDsgfSAyNSUgeyBvcGFjaXR5OiAxOyB9IH0KQC13ZWJraXQta2V5ZnJhbWVzIGRvdHMtMiB7IGZyb20geyBvcGFjaXR5OiAwOyB9IDUwJSB7IG9wYWNpdHk6IDE7IH0gfQpALXdlYmtpdC1rZXlmcmFtZXMgZG90cy0zIHsgZnJvbSB7IG9wYWNpdHk6IDA7IH0gNzUlIHsgb3BhY2l0eTogMTsgfSB9CgouYS1pbnNwZWN0b3ItbG9hZGVyIC5kb3RzIHNwYW4gewogIGFuaW1hdGlvbjogZG90cy0xIDJzIGluZmluaXRlIHN0ZXBzKDEpOwogIC13ZWJraXQtYW5pbWF0aW9uOiBkb3RzLTEgMnMgaW5maW5pdGUgc3RlcHMoMSk7Cn0KCi5hLWluc3BlY3Rvci1sb2FkZXIgLmRvdHMgc3BhbjpmaXJzdC1jaGlsZCArIHNwYW4gewogIGFuaW1hdGlvbi1uYW1lOiBkb3RzLTI7CiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZG90cy0yOwp9CgouYS1pbnNwZWN0b3ItbG9hZGVyIC5kb3RzIHNwYW46Zmlyc3QtY2hpbGQgKyBzcGFuICsgc3BhbiB7CiAgYW5pbWF0aW9uLW5hbWU6IGRvdHMtMzsKICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBkb3RzLTM7Cn0KCmEtc2NlbmUgewogIGRpc3BsYXk6IGJsb2NrOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBoZWlnaHQ6IDEwMCU7CiAgd2lkdGg6IDEwMCU7Cn0KCmEtYXNzZXRzLAphLXNjZW5lIHZpZGVvLAphLXNjZW5lIGltZywKYS1zY2VuZSBhdWRpbyB7CiAgZGlzcGxheTogbm9uZTsKfQoKLmEtZW50ZXItdnItbW9kYWwsCi5hLW9yaWVudGF0aW9uLW1vZGFsIHsKICBmb250LWZhbWlseTogQ29uc29sYXMsIEFuZGFsZSBNb25vLCBDb3VyaWVyIE5ldywgbW9ub3NwYWNlOwp9CgouYS1lbnRlci12ci1tb2RhbCBhIHsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ZmZjsKICBwYWRkaW5nOiAycHggMDsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgdHJhbnNpdGlvbjogLjFzIGNvbG9yIGVhc2UtaW47Cn0KCi5hLWVudGVyLXZyLW1vZGFsIGE6aG92ZXIgewogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgY29sb3I6ICMxMTE7CiAgcGFkZGluZzogMnB4IDRweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgbGVmdDogLTRweDsKfQoKLmEtZW50ZXItdnIsCi5hLWVudGVyLWFyIHsKICBmb250LWZhbWlseTogc2Fucy1zZXJpZiwgbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMTNweDsKICB3aWR0aDogMTAwJTsKICBmb250LXdlaWdodDogMjAwOwogIGxpbmUtaGVpZ2h0OiAxNnB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICByaWdodDogMjBweDsKICBib3R0b206IDIwcHg7Cn0KCi5hLWVudGVyLWFyLnhyIHsKICByaWdodDogOTBweDsKfQoKLmEtZW50ZXItdnItYnV0dG9uLAouYS1lbnRlci12ci1tb2RhbCwKLmEtZW50ZXItdnItbW9kYWwgYSB7CiAgY29sb3I6ICNmZmY7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgb3V0bGluZTogbm9uZTsKfQoKLmEtZW50ZXItdnItYnV0dG9uIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzUpIHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxMDgnIGhlaWdodD0nNjInIHZpZXdCb3g9JzAgMCAxMDggNjInJTNFJTNDdGl0bGUlM0VhZnJhbWUtdnJtb2RlLW5vYm9yZGVyLXJlZHVjZWQtdHJhY2tpbmclM0MvdGl0bGUlM0UlM0NwYXRoIGQ9J002OC44MSwyMS41Nkg2NC4yM3Y4LjI3aDQuNThhNC4xMyw0LjEzLDAsMCwwLDMuMS0xLjA5LDQuMiw0LjIsMCwwLDAsMS0zLDQuMjQsNC4yNCwwLDAsMC0xLTNBNC4wNSw0LjA1LDAsMCwwLDY4LjgxLDIxLjU2WicgZmlsbD0nJTIzZmZmJy8lM0UlM0NwYXRoIGQ9J005NiwwSDEyQTEyLDEyLDAsMCwwLDAsMTJWNTBBMTIsMTIsMCwwLDAsMTIsNjJIOTZhMTIsMTIsMCwwLDAsMTItMTJWMTJBMTIsMTIsMCwwLDAsOTYsMFpNNDEuOSw0NkgzNEwyNCwxNmg4bDYsMjEuODQsNi0yMS44NEg1MlptMzkuMjksMEg3My40NEw2OC4xNSwzNS4zOUg2NC4yM1Y0Nkg1N1YxNkg2OC44MXE1LjMyLDAsOC4zNCwyLjM3YTgsOCwwLDAsMSwzLDYuNjksOS42OCw5LjY4LDAsMCwxLTEuMjcsNS4xOCw4LjksOC45LDAsMCwxLTQsMy4zNGw2LjI2LDEyLjExWicgZmlsbD0nJTIzZmZmJy8lM0UlM0Mvc3ZnJTNFIikgNTAlIDUwJSBuby1yZXBlYXQ7Cn0KCi5hLWVudGVyLWFyLWJ1dHRvbiB7CiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIwKSB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTA4JyBoZWlnaHQ9JzYyJyB2aWV3Qm94PScwIDAgMTA4IDYyJyUzRSUzQ3RpdGxlJTNFYWZyYW1lLWFybW9kZS1ub2JvcmRlci1yZWR1Y2VkLXRyYWNraW5nJTNDL3RpdGxlJTNFJTNDcGF0aCBkPSdNOTYsMEgxMkExMiwxMiwwLDAsMCwwLDEyVjUwQTEyLDEyLDAsMCwwLDEyLDYySDk2YTEyLDEyLDAsMCwwLDEyLTEyVjEyQTEyLDEyLDAsMCwwLDk2LDBabTgsNTBhOCw4LDAsMCwxLTgsOEgxMmE4LDgsMCwwLDEtOC04VjEyYTgsOCwwLDAsMSw4LThIOTZhOCw4LDAsMCwxLDgsOFonIGZpbGw9JyUyM2ZmZicvJTNFJTNDcGF0aCBkPSdNNDMuMzUsMzkuODJIMzIuNTFMMzAuNDUsNDZIMjMuODhMMzUsMTZoNS43M0w1Miw0Nkg0NS40M1ptLTkuMTctNWg3LjVMMzcuOTEsMjMuNThaJyBmaWxsPSclMjNmZmYnLyUzRSUzQ3BhdGggZD0nTTY4LjExLDM1SDYzLjE4VjQ2SDU3VjE2SDY4LjE1cTUuMzEsMCw4LjIsMi4zN2E4LjE4LDguMTgsMCwwLDEsMi44OCw2LjcsOS4yMiw5LjIyLDAsMCwxLTEuMzMsNS4xMiw5LjA5LDkuMDksMCwwLDEtNCwzLjI2bDYuNDksMTIuMjZWNDZINzMuNzNabS00LjkzLTVoNWE1LjA5LDUuMDksMCwwLDAsMy42LTEuMTgsNC4yMSw0LjIxLDAsMCwwLDEuMjgtMy4yNyw0LjU2LDQuNTYsMCwwLDAtMS4yLTMuMzRBNSw1LDAsMCwwLDY4LjE1LDIxaC01WicgZmlsbD0nJTIzZmZmJy8lM0UlM0Mvc3ZnJTNFIikgNTAlIDUwJSBuby1yZXBlYXQ7Cn0KCi5hLWVudGVyLXZyLmZ1bGxzY3JlZW4gLmEtZW50ZXItdnItYnV0dG9uIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0MlM0Z4bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnIHN0YW5kYWxvbmU9J25vJyUzRiUzRSUzQ3N2ZyB3aWR0aD0nMTA4JyBoZWlnaHQ9JzYyJyB2aWV3Qm94PScwIDAgMTA4IDYyJyB2ZXJzaW9uPScxLjEnIGlkPSdzdmczMjAnIHNvZGlwb2RpOmRvY25hbWU9J2Z1bGxzY3JlZW4tYWZyYW1lLnN2ZycgeG1sOnNwYWNlPSdwcmVzZXJ2ZScgaW5rc2NhcGU6dmVyc2lvbj0nMS4yLjEgKDljNmQ0MWUgIDIwMjItMDctMTQpJyB4bWxuczppbmtzY2FwZT0naHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZScgeG1sbnM6c29kaXBvZGk9J2h0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHhtbG5zOnN2Zz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHhtbG5zOnJkZj0naHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zJTIzJyB4bWxuczpjYz0naHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMlMjMnIHhtbG5zOmRjPSdodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyclM0UlM0NkZWZzIGlkPSdkZWZzMzI0JyAvJTNFJTNDc29kaXBvZGk6bmFtZWR2aWV3IGlkPSduYW1lZHZpZXczMjInIHBhZ2Vjb2xvcj0nJTIzZmZmZmZmJyBib3JkZXJjb2xvcj0nJTIzMDAwMDAwJyBib3JkZXJvcGFjaXR5PScwLjI1JyBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0nMicgaW5rc2NhcGU6cGFnZW9wYWNpdHk9JzAuMCcgaW5rc2NhcGU6cGFnZWNoZWNrZXJib2FyZD0nMCcgaW5rc2NhcGU6ZGVza2NvbG9yPSclMjNkMWQxZDEnIHNob3dncmlkPSdmYWxzZScgaW5rc2NhcGU6em9vbT0nMy44MDY0NTE2JyBpbmtzY2FwZTpjeD0nOTEuNDIzNzI5JyBpbmtzY2FwZTpjeT0nLTEuNDQ0OTE1MycgaW5rc2NhcGU6d2luZG93LXdpZHRoPScxNDQwJyBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSc4NDcnIGlua3NjYXBlOndpbmRvdy14PSczMicgaW5rc2NhcGU6d2luZG93LXk9JzI1JyBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPScwJyBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSdzdmczMjAnIC8lM0UlM0N0aXRsZSBpZD0ndGl0bGUzMTInJTNFYWZyYW1lLWFybW9kZS1ub2JvcmRlci1yZWR1Y2VkLXRyYWNraW5nJTNDL3RpdGxlJTNFJTNDcGF0aCBkPSdNOTYgMEgxMkExMiAxMiAwIDAgMCAwIDEyVjUwQTEyIDEyIDAgMCAwIDEyIDYySDk2YTEyIDEyIDAgMCAwIDEyLTEyVjEyQTEyIDEyIDAgMCAwIDk2IDBabTggNTBhOCA4IDAgMCAxLTggOEgxMmE4IDggMCAwIDEtOC04VjEyYTggOCAwIDAgMSA4LThIOTZhOCA4IDAgMCAxIDggOFonIGZpbGw9JyUyM2ZmZicgaWQ9J3BhdGgzMTQnIHN0eWxlPSdmaWxsOiUyM2ZmZmZmZicgLyUzRSUzQ2cgaWQ9J2czNTYnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKC0yMDYuNjEwMTcgLTIzMi42MTg2NCknJTNFJTNDL2clM0UlM0NnIGlkPSdnMzU4JyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgtMjA2LjYxMDE3IC0yMzIuNjE4NjQpJyUzRSUzQy9nJTNFJTNDZyBpZD0nZzM2MCcgdHJhbnNmb3JtPSd0cmFuc2xhdGUoLTIwNi42MTAxNyAtMjMyLjYxODY0KSclM0UlM0MvZyUzRSUzQ2cgaWQ9J2czNjInIHRyYW5zZm9ybT0ndHJhbnNsYXRlKC0yMDYuNjEwMTcgLTIzMi42MTg2NCknJTNFJTNDL2clM0UlM0NnIGlkPSdnMzY0JyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgtMjA2LjYxMDE3IC0yMzIuNjE4NjQpJyUzRSUzQy9nJTNFJTNDZyBpZD0nZzM2NicgdHJhbnNmb3JtPSd0cmFuc2xhdGUoLTIwNi42MTAxNyAtMjMyLjYxODY0KSclM0UlM0MvZyUzRSUzQ2cgaWQ9J2czNjgnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKC0yMDYuNjEwMTcgLTIzMi42MTg2NCknJTNFJTNDL2clM0UlM0NnIGlkPSdnMzcwJyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgtMjA2LjYxMDE3IC0yMzIuNjE4NjQpJyUzRSUzQy9nJTNFJTNDZyBpZD0nZzM3MicgdHJhbnNmb3JtPSd0cmFuc2xhdGUoLTIwNi42MTAxNyAtMjMyLjYxODY0KSclM0UlM0MvZyUzRSUzQ2cgaWQ9J2czNzQnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKC0yMDYuNjEwMTcgLTIzMi42MTg2NCknJTNFJTNDL2clM0UlM0NnIGlkPSdnMzc2JyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgtMjA2LjYxMDE3IC0yMzIuNjE4NjQpJyUzRSUzQy9nJTNFJTNDZyBpZD0nZzM3OCcgdHJhbnNmb3JtPSd0cmFuc2xhdGUoLTIwNi42MTAxNyAtMjMyLjYxODY0KSclM0UlM0MvZyUzRSUzQ2cgaWQ9J2czODAnIHRyYW5zZm9ybT0ndHJhbnNsYXRlKC0yMDYuNjEwMTcgLTIzMi42MTg2NCknJTNFJTNDL2clM0UlM0NnIGlkPSdnMzgyJyB0cmFuc2Zvcm09J3RyYW5zbGF0ZSgtMjA2LjYxMDE3IC0yMzIuNjE4NjQpJyUzRSUzQy9nJTNFJTNDZyBpZD0nZzM4NCcgdHJhbnNmb3JtPSd0cmFuc2xhdGUoLTIwNi42MTAxNyAtMjMyLjYxODY0KSclM0UlM0MvZyUzRSUzQ21ldGFkYXRhIGlkPSdtZXRhZGF0YTU2MSclM0UlM0NyZGY6UkRGJTNFJTNDY2M6V29yayByZGY6YWJvdXQ9JyclM0UlM0NkYzp0aXRsZSUzRWFmcmFtZS1hcm1vZGUtbm9ib3JkZXItcmVkdWNlZC10cmFja2luZyUzQy9kYzp0aXRsZSUzRSUzQy9jYzpXb3JrJTNFJTNDL3JkZjpSREYlM0UlM0MvbWV0YWRhdGElM0UlM0NwYXRoIGQ9J20gOTguMTY4NTExIDQwLjA4MzY0OSBjIDAgLTEuMzAzNjgxIC0wLjk5ODc4OCAtMi4zNTgwNDEgLTIuMjM5Mzg5IC0yLjM1ODA0MSAtMS4yMzAwODggMC4wMDMxIC0yLjI0MDg5MiAxLjA1NDM2IC0yLjI0MDg5MiAyLjM1ODA0MSB2IDQuODgxMjk2IGwgLTkuMDQxNjYxIC05LjA0MTY2MiBjIC0wLjg3NDEyOSAtMC44NzU2MzEgLTIuMjg4OTU0IC0wLjg3NTYzMSAtMy4xNjMwOCAwIC0wLjg3NDEyOSAwLjg3NDEyNiAtMC44NzQxMjkgMi4yOTM0NTkgMCAzLjE2NzU4NSBsIDguOTk1MTAxIDguOTkyMTAxIGggLTQuODU4NzY3IGMgLTEuMzIzMjA2IDAuMDAzMSAtMi4zODk1ODMgMS4wMDQ3OTYgLTIuMzg5NTgzIDIuMjM5Mzg2IDAgMS4yMzc1OTggMS4wNjYzNzcgMi4yMzc4ODggMi4zODk1ODMgMi4yMzc4ODggaCAxMC4xNTQ1OTkgYyAxLjMyMzIwNiAwIDIuMzg4MDgyIC0wLjk5ODc4OSAyLjM5MjU4NyAtMi4yMzc4ODggLTAuMDA0NCAtMC4wMzMwNSAtMC4wMDkgLTAuMDU4NTggLTAuMDEzNCAtMC4wOTE2MSAwLjAwNDYgLTAuMDQyMDcgMC4wMTM0IC0wLjA4NzEyIDAuMDEzNCAtMC4xMzA2NiBWIDQwLjA4NTE3MiBoIC0xLjUyZS00JyBpZD0ncGF0aDU5Nicgc3R5bGU9J2ZpbGw6JTIzZmZmZmZmJTNCc3Ryb2tlLXdpZHRoOjEuNTAxOTQnIC8lM0UlM0NwYXRoIGQ9J20gMjMuMDkxMDAyIDM1LjkyMTc4MSAtOS4wMjY2NDMgOS4wNDE2NjIgdiAtNC44ODEyOTYgYyAwIC0xLjMwMzY4MSAtMS4wMDkzMDIgLTIuMzU1MDM3IC0yLjI0MjM5MyAtMi4zNTgwNDEgLTEuMjM3NTk4IDAgLTIuMjM3ODg4IDEuMDU0MzYgLTIuMjM3ODg4IDIuMzU4MDQxIGwgLTAuMDAzMSAxMC4wMTY0MjEgYyAwIDAuMDQzNTYgMC4wMTIxMSAwLjA4ODYyIDAuMDAxNSAwLjEzMDY1OSAtMC4wMDMxIDAuMDMxNTMgLTAuMDA5IDAuMDU3MDkgLTAuMDEyMTEgMC4wOTE2MSAwLjAwMzEgMS4yMzkwOTkgMS4wNjkzNzkgMi4yMzc4ODggMi4zOTEwODUgMi4yMzc4ODggaCAxMC4xNTYxMDEgYyAxLjMyMDIwMiAwIDIuMzg4MDc5IC0xLjAwMDI5MSAyLjM4ODA3OSAtMi4yMzc4ODggMCAtMS4yMzQ1OTEgLTEuMDY3ODc3IC0yLjIzNjM4MyAtMi4zODgwNzkgLTIuMjM5Mzg3IGggLTQuODU4NzY3IGwgOC45OTUxMDEgLTguOTkyMSBjIDAuODcxMTI2IC0wLjg3NDEyNyAwLjg3MTEyNiAtMi4yOTM0NTkgMCAtMy4xNjc1ODYgLTAuODc1NjI4IC0wLjg3NzEzMiAtMi4yOTE5NTcgLTAuODc3MTMyIC0zLjE2OTA4NyAtMS41MmUtNCcgaWQ9J3BhdGg1OTgnIHN0eWxlPSdmaWxsOiUyM2ZmZmZmZiUzQnN0cm9rZS13aWR0aDoxLjUwMTk0JyAvJTNFJTNDcGF0aCBkPSdtIDg0LjY0OTU3MiAyNS45NzgwMzMgOS4wNDE2NjIgLTkuMDQxNjY0IHYgNC44ODEyOTggYyAwIDEuMjk5MTc2IDEuMDEwODA2IDIuMzUwNTMyIDIuMjQwODkxIDIuMzU1MDM3IDEuMjQwNjAxIDAgMi4yMzkzOSAtMS4wNTU4NjEgMi4yMzkzOSAtMi4zNTUwMzcgViAxMS43OTgyNDIgYyAwIC0wLjA0MzU2IC0wLjAwOSAtMC4wODg2MiAtMC4wMTM0IC0wLjEyNzY3MSAwLjAwNDQgLTAuMDMxNTMgMC4wMDkgLTAuMDYxNTcgMC4wMTM0IC0wLjA5MzEzIC0wLjAwNDQgLTEuMjQwNTk4IC0xLjA2OTM3OSAtMi4yMzkzODczIC0yLjM5MTA4NSAtMi4yMzkzODczIGggLTEwLjE1NDYgYyAtMS4zMjMyMDUgMCAtMi4zODk1OCAwLjk5ODc4OTMgLTIuMzg5NTggMi4yMzkzODczIDAgMS4yMzMwOTEgMS4wNjYzNzUgMi4yMzc4ODcgMi4zODk1OCAyLjI0MDg5MSBoIDQuODU4NzY4IGwgLTguOTk1MTAyIDguOTkyMSBjIC0wLjg3NDEyOSAwLjg3MjYyNSAtMC44NzQxMjkgMi4yODg5NTQgMCAzLjE2MTU3OCAwLjg3NDEyNyAwLjg4MDEzNyAyLjI4ODk1MSAwLjg4MDEzNyAzLjE2MzA4IDEuNWUtNCcgaWQ9J3BhdGg2MDAnIHN0eWxlPSdmaWxsOiUyM2ZmZmZmZiUzQnN0cm9rZS13aWR0aDoxLjUwMTk0JyAvJTNFJTNDcGF0aCBkPSdtIDE3LjI2NDk4OCAxMy44MjI4NTMgaCA0Ljg1NzI2NSBjIDEuMzIwMjAyIC0wLjAwMzEgMi4zODgwNzkgLTEuMDA3OCAyLjM4ODA3OSAtMi4yNDA4ODkgMCAtMS4yNDA2MDEgLTEuMDY3ODc3IC0yLjIzOTM4OTMgLTIuMzg4MDc5IC0yLjIzOTM4OTMgSCAxMS45Njc2NTQgYyAtMS4zMjE3MDcgMCAtMi4zODgwODIgMC45OTg3ODgzIC0yLjM5MTA4NSAyLjIzOTM4OTMgMC4wMDMxIDAuMDMxNTMgMC4wMDkgMC4wNjE1NyAwLjAxMjExIDAuMDkzMTMgLTAuMDAzMSAwLjAzOTA1IC0wLjAwMTUgMC4wODI2MiAtMC4wMDE1IDAuMTI3NjcxIGwgMC4wMDMxIDEwLjAyMDkyNiBjIDAgMS4yOTkxNzYgMS4wMDAyOSAyLjM1NTAzOCAyLjIzNzg4NyAyLjM1NTAzOCAxLjIzMzA5MiAtMC4wMDQ0IDIuMjQyMzkzIC0xLjA1NTg2MiAyLjI0MjM5MyAtMi4zNTUwMzggdiAtNC44ODEyOTUgbCA5LjAyNjY0NCA5LjA0MTY2MSBjIDAuODc3MTMyIDAuODc4NjM1IDIuMjkzNDU5IDAuODc4NjM1IDMuMTY5MDg3IDAgMC44NzExMjUgLTAuODcyNjI0IDAuODcxMTI1IC0yLjI4ODk1MyAwIC0zLjE2MTU3NyBsIC04Ljk5NTI4MiAtOC45OTM2MTYnIGlkPSdwYXRoNjAyJyBzdHlsZT0nZmlsbDolMjNmZmZmZmYlM0JzdHJva2Utd2lkdGg6MS41MDE5NCcgLyUzRSUzQy9zdmclM0UiKTsKfQoKLmEtZW50ZXItdnItYnV0dG9uLAouYS1lbnRlci1hci1idXR0b24gewogIGJhY2tncm91bmQtc2l6ZTogOTAlIDkwJTsKICBib3JkZXI6IDA7CiAgYm90dG9tOiAwOwogIGN1cnNvcjogcG9pbnRlcjsKICBtaW4td2lkdGg6IDU4cHg7CiAgbWluLWhlaWdodDogMzRweDsKICAvKiAxLjc0NDE4NjA0NjUxICovCiAgLyoKICAgIEluIG9yZGVyIHRvIGtlZXAgdGhlIGFzcGVjdCByYXRpbyB3aGVuIHJlc2l6aW5nCiAgICBwYWRkaW5nLXRvcCBwZXJjZW50YWdlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5pbmcgYmxvY2sncyB3aWR0aC4KICAgIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTIxMjEwOTAvcmVzcG9uc2l2ZWx5LWNoYW5nZS1kaXYtc2l6ZS1rZWVwaW5nLWFzcGVjdC1yYXRpbwogICovCiAgcGFkZGluZy1yaWdodDogMDsKICBwYWRkaW5nLXRvcDogMDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDA7CiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAuMDVzIGVhc2U7CiAgLXdlYmtpdC10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIC4wNXMgZWFzZTsKICB6LWluZGV4OiA5OTk5OwogIGJvcmRlci1yYWRpdXM6IDhweDsKICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsgLyogUHJldmVudCBpT1MgZG91YmxlIHRhcCB6b29tIG9uIHRoZSBidXR0b24gKi8KfQoKLmEtZW50ZXItYXItYnV0dG9uIHsKICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgOTAlOwogIGJvcmRlci1yYWRpdXM6IDdweDsKfQoKLmEtZW50ZXItYXItYnV0dG9uOmFjdGl2ZSwKLmEtZW50ZXItYXItYnV0dG9uOmhvdmVyLAouYS1lbnRlci12ci1idXR0b246YWN0aXZlLAouYS1lbnRlci12ci1idXR0b246aG92ZXIgewogIGJhY2tncm91bmQtY29sb3I6ICNlZjJkNWU7Cn0KCi5hLWVudGVyLXZyLWJ1dHRvbi5yZXNldGhvdmVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgouYS1lbnRlci12ci1tb2RhbCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzY2NjsKICBib3JkZXItcmFkaXVzOiAwOwogIGRpc3BsYXk6IG5vbmU7CiAgbWluLWhlaWdodDogMzJweDsKICBtYXJnaW4tcmlnaHQ6IDcwcHg7CiAgcGFkZGluZzogOXB4OwogIHdpZHRoOiAyODBweDsKICByaWdodDogMiU7CiAgcG9zaXRpb246IGFic29sdXRlOwp9CgouYS1lbnRlci12ci1tb2RhbDphZnRlciB7CiAgYm9yZGVyLWJvdHRvbTogMTBweCBzb2xpZCB0cmFuc3BhcmVudDsKICBib3JkZXItbGVmdDogMTBweCBzb2xpZCAjNjY2OwogIGJvcmRlci10b3A6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGNvbnRlbnQ6ICcnOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICByaWdodDogLTVweDsKICB0b3A6IDVweDsKICB3aWR0aDogMDsKICBoZWlnaHQ6IDA7Cn0KCi5hLWVudGVyLXZyLW1vZGFsIHAsCi5hLWVudGVyLXZyLW1vZGFsIGEgewogIGRpc3BsYXk6IGlubGluZTsKfQoKLmEtZW50ZXItdnItbW9kYWwgcCB7CiAgbWFyZ2luOiAwOwp9CgouYS1lbnRlci12ci1tb2RhbCBwOmFmdGVyIHsKICBjb250ZW50OiAnICc7Cn0KCi5hLW9yaWVudGF0aW9uLW1vZGFsIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDI0NCwgMjQ0LCAyNDQsIDEpIHVybChkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnJTIweG1sbnMlM0QlMjJodHRwJTNBLy93d3cudzMub3JnLzIwMDAvc3ZnJTIyJTIweG1sbnMlM0F4bGluayUzRCUyMmh0dHAlM0EvL3d3dy53My5vcmcvMTk5OS94bGluayUyMiUyMHZlcnNpb24lM0QlMjIxLjElMjIlMjB4JTNEJTIyMHB4JTIyJTIweSUzRCUyMjBweCUyMiUyMHZpZXdCb3glM0QlMjIwJTIwMCUyMDkwJTIwOTAlMjIlMjBlbmFibGUtYmFja2dyb3VuZCUzRCUyMm5ldyUyMDAlMjAwJTIwOTAlMjA5MCUyMiUyMHhtbCUzQXNwYWNlJTNEJTIycHJlc2VydmUlMjIlM0UlM0Nwb2x5Z29uJTIwcG9pbnRzJTNEJTIyMCUyQzAlMjAwJTJDMCUyMDAlMkMwJTIwJTIyJTNFJTNDL3BvbHlnb24lM0UlM0NnJTNFJTNDcGF0aCUyMGQlM0QlMjJNNzEuNTQ1JTJDNDguMTQ1aC0zMS45OFYyMC43NDNjMC0yLjYyNy0yLjEzOC00Ljc2NS00Ljc2NS00Ljc2NUgxOC40NTZjLTIuNjI4JTJDMC00Ljc2NyUyQzIuMTM4LTQuNzY3JTJDNC43NjV2NDIuNzg5JTIwJTIwJTIwYzAlMkMyLjYyOCUyQzIuMTM4JTJDNC43NjYlMkM0Ljc2NyUyQzQuNzY2aDUuNTM1djAuOTU5YzAlMkMyLjYyOCUyQzIuMTM4JTJDNC43NjUlMkM0Ljc2NiUyQzQuNzY1aDQyLjc4OGMyLjYyOCUyQzAlMkM0Ljc2Ni0yLjEzNyUyQzQuNzY2LTQuNzY1VjUyLjkxNCUyMCUyMCUyMEM3Ni4zMTElMkM1MC4yODQlMkM3NC4xNzMlMkM0OC4xNDUlMkM3MS41NDUlMkM0OC4xNDV6JTIwTTE4LjQ1NSUyQzE2LjkzNWgxNi4zNDRjMi4xJTJDMCUyQzMuODA4JTJDMS43MDglMkMzLjgwOCUyQzMuODA4djI3LjQwMUgzNy4yNVYyMi42MzYlMjAlMjAlMjBjMC0wLjI2NC0wLjIxNS0wLjQ3OC0wLjQ3OS0wLjQ3OEgxNi40ODJjLTAuMjY0JTJDMC0wLjQ3OSUyQzAuMjE0LTAuNDc5JTJDMC40Nzh2MzYuNTg1YzAlMkMwLjI2NCUyQzAuMjE1JTJDMC40NzglMkMwLjQ3OSUyQzAuNDc4aDcuNTA3djcuNjQ0JTIwJTIwJTIwaC01LjUzNGMtMi4xMDElMkMwLTMuODEtMS43MDktMy44MS0zLjgxVjIwLjc0M0MxNC42NDUlMkMxOC42NDMlMkMxNi4zNTQlMkMxNi45MzUlMkMxOC40NTUlMkMxNi45MzV6JTIwTTE2Ljk2JTJDMjMuMTE2aDE5LjMzMXYyNS4wMzFoLTcuNTM1JTIwJTIwJTIwYy0yLjYyOCUyQzAtNC43NjYlMkMyLjEzOS00Ljc2NiUyQzQuNzY4djUuODI4aC03LjAzVjIzLjExNnolMjBNNzEuNTQ1JTJDNzMuMDY0SDI4Ljc1N2MtMi4xMDElMkMwLTMuODEtMS43MDgtMy44MS0zLjgwOFY1Mi45MTQlMjAlMjAlMjBjMC0yLjEwMiUyQzEuNzA5LTMuODEyJTJDMy44MS0zLjgxMmg0Mi43ODhjMi4xJTJDMCUyQzMuODA5JTJDMS43MSUyQzMuODA5JTJDMy44MTJ2MTYuMzQzQzc1LjM1NCUyQzcxLjM1NiUyQzczLjY0NSUyQzczLjA2NCUyQzcxLjU0NSUyQzczLjA2NHolMjIlM0UlM0MvcGF0aCUzRSUzQ3BhdGglMjBkJTNEJTIyTTI4LjkxOSUyQzU4LjQyNGMtMS40NjYlMkMwLTIuNjU5JTJDMS4xOTMtMi42NTklMkMyLjY2YzAlMkMxLjQ2NiUyQzEuMTkzJTJDMi42NTglMkMyLjY1OSUyQzIuNjU4YzEuNDY4JTJDMCUyQzIuNjYyLTEuMTkyJTJDMi42NjItMi42NTglMjAlMjAlMjBDMzEuNTgxJTJDNTkuNjE3JTJDMzAuMzg3JTJDNTguNDI0JTJDMjguOTE5JTJDNTguNDI0eiUyME0yOC45MTklMkM2Mi43ODZjLTAuOTM5JTJDMC0xLjcwMy0wLjc2NC0xLjcwMy0xLjcwMmMwLTAuOTM5JTJDMC43NjQtMS43MDQlMkMxLjcwMy0xLjcwNCUyMCUyMCUyMGMwLjk0JTJDMCUyQzEuNzA1JTJDMC43NjUlMkMxLjcwNSUyQzEuNzA0QzMwLjYyMyUyQzYyLjAyMiUyQzI5Ljg1OCUyQzYyLjc4NiUyQzI4LjkxOSUyQzYyLjc4NnolMjIlM0UlM0MvcGF0aCUzRSUzQ3BhdGglMjBkJTNEJTIyTTY5LjY1NCUyQzUwLjQ2MUgzMy4wNjljLTAuMjY0JTJDMC0wLjQ3OSUyQzAuMjE1LTAuNDc5JTJDMC40Nzl2MjAuMjg4YzAlMkMwLjI2NCUyQzAuMjE1JTJDMC40NzglMkMwLjQ3OSUyQzAuNDc4aDM2LjU4NSUyMCUyMCUyMGMwLjI2MyUyQzAlMkMwLjQ3Ny0wLjIxNCUyQzAuNDc3LTAuNDc4VjUwLjkzOUM3MC4xMzElMkM1MC42NzYlMkM2OS45MTclMkM1MC40NjElMkM2OS42NTQlMkM1MC40NjF6JTIwTTY5LjE3NCUyQzUxLjQxN1Y3MC43NUgzMy41NDhWNTEuNDE3SDY5LjE3NHolMjIlM0UlM0MvcGF0aCUzRSUzQ3BhdGglMjBkJTNEJTIyTTQ1LjIwMSUyQzMwLjI5NmM2LjY1MSUyQzAlMkMxMi4yMzMlMkM1LjM1MSUyQzEyLjU1MSUyQzExLjk3N2wtMy4wMzMtMi42MzhjLTAuMTkzLTAuMTY1LTAuNTA3LTAuMTQyLTAuNjc1JTJDMC4wNDglMjAlMjAlMjBjLTAuMTc0JTJDMC4xOTgtMC4xNTMlMkMwLjUwMSUyQzAuMDQ1JTJDMC42NzZsMy44ODMlMkMzLjM3NWMwLjA5JTJDMC4wNzUlMkMwLjE5OCUyQzAuMTE1JTJDMC4zMTIlMkMwLjExNWMwLjE0MSUyQzAlMkMwLjI3My0wLjA2MSUyQzAuMzYyLTAuMTY2JTIwJTIwJTIwbDMuMzcxLTMuODc3YzAuMTczLTAuMiUyQzAuMTUxLTAuNTAyLTAuMDQ3LTAuNjc1Yy0wLjE5NC0wLjE2Ni0wLjUwOC0wLjE0NC0wLjY3NiUyQzAuMDQ4bC0yLjU5MiUyQzIuOTc5JTIwJTIwJTIwYy0wLjE4LTMuNDE3LTEuNjI5LTYuNjA1LTQuMDk5LTkuMDAxYy0yLjUzOC0yLjQ2MS01Ljg3Ny0zLjgxNy05LjQwNC0zLjgxN2MtMC4yNjQlMkMwLTAuNDc5JTJDMC4yMTUtMC40NzklMkMwLjQ3OSUyMCUyMCUyMEM0NC43MiUyQzMwLjA4MyUyQzQ0LjkzNiUyQzMwLjI5NiUyQzQ1LjIwMSUyQzMwLjI5NnolMjIlM0UlM0MvcGF0aCUzRSUzQy9nJTNFJTNDL3N2ZyUzRSkgY2VudGVyIG5vLXJlcGVhdDsKICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7CiAgYm90dG9tOiAwOwogIGZvbnQtc2l6ZTogMTRweDsKICBmb250LXdlaWdodDogNjAwOwogIGxlZnQ6IDA7CiAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgcmlnaHQ6IDA7CiAgcG9zaXRpb246IGZpeGVkOwogIHRvcDogMDsKICB6LWluZGV4OiA5OTk5OTk5Owp9CgouYS1vcmllbnRhdGlvbi1tb2RhbDphZnRlciB7CiAgY29sb3I6ICM2NjY7CiAgY29udGVudDogIkluc2VydCBwaG9uZSBpbnRvIENhcmRib2FyZCBob2xkZXIuIjsKICBkaXNwbGF5OiBibG9jazsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHRvcDogNzAlOwogIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNzAlKTsKICB3aWR0aDogMTAwJTsKfQoKLmEtb3JpZW50YXRpb24tbW9kYWwgYnV0dG9uIHsKICBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyUyMHhtbG5zJTNEJTIyaHR0cCUzQS8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyMiUyMHhtbG5zJTNBeGxpbmslM0QlMjJodHRwJTNBLy93d3cudzMub3JnLzE5OTkveGxpbmslMjIlMjB2ZXJzaW9uJTNEJTIyMS4xJTIyJTIweCUzRCUyMjBweCUyMiUyMHklM0QlMjIwcHglMjIlMjB2aWV3Qm94JTNEJTIyMCUyMDAlMjAxMDAlMjAxMDAlMjIlMjBlbmFibGUtYmFja2dyb3VuZCUzRCUyMm5ldyUyMDAlMjAwJTIwMTAwJTIwMTAwJTIyJTIweG1sJTNBc3BhY2UlM0QlMjJwcmVzZXJ2ZSUyMiUzRSUzQ3BhdGglMjBmaWxsJTNEJTIyJTIzMDAwMDAwJTIyJTIwZCUzRCUyMk01NS4yMDklMkM1MGwxNy44MDMtMTcuODAzYzEuNDE2LTEuNDE2JTJDMS40MTYtMy43MTMlMkMwLTUuMTI5Yy0xLjQxNi0xLjQxNy0zLjcxMy0xLjQxNy01LjEyOSUyQzBMNTAuMDglMkM0NC44NzIlMjAlMjBMMzIuMjc4JTJDMjcuMDY5Yy0xLjQxNi0xLjQxNy0zLjcxNC0xLjQxNy01LjEyOSUyQzBjLTEuNDE3JTJDMS40MTYtMS40MTclMkMzLjcxMyUyQzAlMkM1LjEyOUw0NC45NTElMkM1MEwyNy4xNDklMkM2Ny44MDMlMjAlMjBjLTEuNDE3JTJDMS40MTYtMS40MTclMkMzLjcxMyUyQzAlMkM1LjEyOWMwLjcwOCUyQzAuNzA4JTJDMS42MzYlMkMxLjA2MiUyQzIuNTY0JTJDMS4wNjJjMC45MjglMkMwJTJDMS44NTYtMC4zNTQlMkMyLjU2NC0xLjA2Mkw1MC4wOCUyQzU1LjEzbDE3LjgwMyUyQzE3LjgwMiUyMCUyMGMwLjcwOCUyQzAuNzA4JTJDMS42MzclMkMxLjA2MiUyQzIuNTY0JTJDMS4wNjJzMS44NTYtMC4zNTQlMkMyLjU2NC0xLjA2MmMxLjQxNi0xLjQxNiUyQzEuNDE2LTMuNzEzJTJDMC01LjEyOUw1NS4yMDklMkM1MHolMjIlM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UpIG5vLXJlcGVhdDsKICBib3JkZXI6IG5vbmU7CiAgaGVpZ2h0OiA1MHB4OwogIHRleHQtaW5kZW50OiAtOTk5OXB4OwogIHdpZHRoOiA1MHB4Owp9CgouYS1sb2FkZXItdGl0bGUgewogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC42KTsKICBmb250LWZhbWlseTogc2Fucy1zZXJpZiwgbW9ub3NwYWNlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBmb250LXNpemU6IDIwcHg7CiAgaGVpZ2h0OiA1MHB4OwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgbGluZS1oZWlnaHQ6IDUwcHg7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHJpZ2h0OiAwcHg7CiAgbGVmdDogMHB4OwogIHRvcDogMHB4OwogIGNvbG9yOiB3aGl0ZTsKfQoKLmEtbW9kYWwgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjApOwogIGJhY2tncm91bmQtc2l6ZTogNTAlIDUwJTsKICBib3R0b206IDA7CiAgZm9udC1zaXplOiAxNHB4OwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgbGVmdDogMDsKICBsaW5lLWhlaWdodDogMjBweDsKICByaWdodDogMDsKICBwb3NpdGlvbjogZml4ZWQ7CiAgdG9wOiAwOwogIHotaW5kZXg6IDk5OTk5OTk7Cn0KCi5hLWRpYWxvZyB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGxlZnQ6IDUwJTsKICB0b3A6IDUwJTsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICB6LWluZGV4OiAxOTk5OTU7CiAgd2lkdGg6IDMwMHB4OwogIGhlaWdodDogMjAwcHg7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwogIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmLCBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAyMHB4OwogIGJvcmRlci1yYWRpdXM6IDNweDsKICBwYWRkaW5nOiA2cHg7Cn0KCi5hLWRpYWxvZy10ZXh0LWNvbnRhaW5lciB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiA3MCU7CiAgYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICBkaXNwbGF5OiBmbGV4OwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9CgouYS1kaWFsb2ctdGV4dCB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgZm9udC1zaXplOiAxNHB0OwogIG1hcmdpbjogOHB4Owp9CgouYS1kaWFsb2ctYnV0dG9ucy1jb250YWluZXIgewogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMzAlOwp9CgouYS1kaWFsb2ctYnV0dG9uIHsKICBjdXJzb3I6IHBvaW50ZXI7CiAgYWxpZ24tc2VsZjogY2VudGVyOwogIG9wYWNpdHk6IDAuOTsKICBoZWlnaHQ6IDgwJTsKICB3aWR0aDogNTAlOwogIGZvbnQtc2l6ZTogMTJwdDsKICBtYXJnaW46IDRweDsKICBib3JkZXItcmFkaXVzOiAycHg7CiAgdGV4dC1hbGlnbjpjZW50ZXI7CiAgYm9yZGVyOiBub25lOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLWluLW91dDsKICB0cmFuc2l0aW9uOiBhbGwgMC4yNXMgZWFzZS1pbi1vdXQ7CiAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMCksIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMjApOwogIHVzZXItc2VsZWN0OiBub25lOwp9CgouYS1kaWFsb2ctcGVybWlzc2lvbi1idXR0b246aG92ZXIgewogIGJveC1zaGFkb3c6IDAgN3B4IDE0cHggcmdiYSgwLDAsMCwwLjIwKSwgMCAycHggMnB4IHJnYmEoMCwwLDAsMC4yMCk7Cn0KCi5hLWRpYWxvZy1hbGxvdy1idXR0b24gewogIGJhY2tncm91bmQtY29sb3I6ICMwMGNlZmY7Cn0KCi5hLWRpYWxvZy1kZW55LWJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmMDA1YjsKfQoKLmEtZGlhbG9nLW9rLWJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzAwY2VmZjsKICB3aWR0aDogMTAwJTsKfQoKLmEtZG9tLW92ZXJsYXk6bm90KC5hLW5vLXN0eWxlKSB7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBib3R0b206IDA7CiAgbGVmdDogMDsKICByaWdodDogMDsKICB0b3A6IDA7CiAgcGFkZGluZzogMWVtOwp9CgouYS1kb20tb3ZlcmxheTpub3QoLmEtbm8tc3R5bGUpPiogewogIHBvaW50ZXItZXZlbnRzOiBhdXRvOwp9CmBdLCBzb3VyY2VSb290OiAiIiB9XSk7CiAgICBjb25zdCB2ID0gZzsKICB9LCAyNDcwOiAoZSwgdDIsIG4pID0+IHsKICAgIG4uZCh0MiwgeyBBOiAoKSA9PiBhIH0pOwogICAgdmFyIGkgPSBuKDk2MyksIHIgPSBuLm4oaSksIG8gPSBuKDkwODkpLCBzID0gbi5uKG8pKCkocigpKTsKICAgIHMucHVzaChbZS5pZCwgYC5ycy1iYXNlIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOwogIGNvbG9yOiAjZmFmYWZhOwogIGJvcmRlci1yYWRpdXM6IDA7CiAgZm9udDogMTBweCBtb25vc3BhY2U7CiAgbGVmdDogNXB4OwogIGxpbmUtaGVpZ2h0OiAxZW07CiAgb3BhY2l0eTogMC44NTsKICBvdmVyZmxvdzogaGlkZGVuOwogIHBhZGRpbmc6IDEwcHg7CiAgcG9zaXRpb246IGZpeGVkOwogIHRvcDogNXB4OwogIHdpZHRoOiAzMDBweDsKICB6LWluZGV4OiAxMDAwMDsKfQoKLnJzLWJhc2UgZGl2LmhpZGRlbiB7CiAgZGlzcGxheTogbm9uZTsKfQoKLnJzLWJhc2UgaDEgewogIGNvbG9yOiAjZmZmOwogIGN1cnNvcjogcG9pbnRlcjsKICBmb250LXNpemU6IDEuNGVtOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgbWFyZ2luOiAwIDAgNXB4OwogIHBhZGRpbmc6IDA7Cn0KCi5ycy1ncm91cCB7CiAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogIGRpc3BsYXk6IGZsZXg7CiAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogIG1hcmdpbi1ib3R0b206IDVweDsKfQoKLnJzLWdyb3VwOmxhc3QtY2hpbGQgewogIG1hcmdpbi1ib3R0b206IDA7Cn0KCi5ycy1jb3VudGVyLWJhc2UgewogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogIGRpc3BsYXk6IGZsZXg7CiAgaGVpZ2h0OiAxMHB4OwogIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBtYXJnaW46IDJweCAwOwp9CgoucnMtY291bnRlci1iYXNlLmFsYXJtIHsKICBjb2xvcjogI2I3MDAwMDsKICB0ZXh0LXNoYWRvdzogMCAwIDAgI2I3MDAwMCwKICAgICAgICAgICAgICAgMCAwIDFweCAjZmZmLAogICAgICAgICAgICAgICAwIDAgMXB4ICNmZmYsCiAgICAgICAgICAgICAgIDAgMCAycHggI2ZmZiwKICAgICAgICAgICAgICAgMCAwIDJweCAjZmZmLAogICAgICAgICAgICAgICAwIDAgM3B4ICNmZmYsCiAgICAgICAgICAgICAgIDAgMCAzcHggI2ZmZiwKICAgICAgICAgICAgICAgMCAwIDRweCAjZmZmLAogICAgICAgICAgICAgICAwIDAgNHB4ICNmZmY7Cn0KCi5ycy1jb3VudGVyLWlkIHsKICBmb250LXdlaWdodDogMzAwOwogIC13ZWJraXQtYm94LW9yZGluYWwtZ3JvdXA6IDA7CiAgLXdlYmtpdC1vcmRlcjogMDsKICBvcmRlcjogMDsKICB3aWR0aDogNTRweDsKfQoKLnJzLWNvdW50ZXItdmFsdWUgewogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgLXdlYmtpdC1ib3gtb3JkaW5hbC1ncm91cDogMTsKICAtd2Via2l0LW9yZGVyOiAxOwogIG9yZGVyOiAxOwogIHRleHQtYWxpZ246IHJpZ2h0OwogIHdpZHRoOiAzNXB4Owp9CgoucnMtY2FudmFzIHsKICAtd2Via2l0LWJveC1vcmRpbmFsLWdyb3VwOiAyOwogIC13ZWJraXQtb3JkZXI6IDI7CiAgb3JkZXI6IDI7Cn0KCkBtZWRpYSAobWluLXdpZHRoOiA0ODBweCkgewogIC5ycy1iYXNlIHsKICAgIGxlZnQ6IDIwcHg7CiAgICB0b3A6IDIwcHg7CiAgfQp9CmAsICIiLCB7IHZlcnNpb246IDMsIHNvdXJjZXM6IFsid2VicGFjazovLy4vc3JjL3N0eWxlL3JTdGF0cy5jc3MiXSwgbmFtZXM6IFtdLCBtYXBwaW5nczogIkFBQUE7RUFDRSxzQkFBc0I7RUFDdEIsY0FBYztFQUNkLGdCQUFnQjtFQUNoQixvQkFBb0I7RUFDcEIsU0FBUztFQUNULGdCQUFnQjtFQUNoQixhQUFhO0VBQ2IsZ0JBQWdCO0VBQ2hCLGFBQWE7RUFDYixlQUFlO0VBQ2YsUUFBUTtFQUNSLFlBQVk7RUFDWixjQUFjO0FBQ2hCOztBQUVBO0VBQ0UsYUFBYTtBQUNmOztBQUVBO0VBQ0UsV0FBVztFQUNYLGVBQWU7RUFDZixnQkFBZ0I7RUFDaEIsZ0JBQWdCO0VBQ2hCLGVBQWU7RUFDZixVQUFVO0FBQ1o7O0FBRUE7RUFDRSxvQkFBb0I7RUFDcEIscUJBQXFCO0VBQ3JCLGFBQWE7RUFDYixzQ0FBc0M7RUFDdEMsOEJBQThCO0VBQzlCLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLG1CQUFtQjtFQUNuQixvQkFBb0I7RUFDcEIscUJBQXFCO0VBQ3JCLGFBQWE7RUFDYixZQUFZO0VBQ1osc0NBQXNDO0VBQ3RDLDhCQUE4QjtFQUM5QixhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxjQUFjO0VBQ2Q7Ozs7Ozs7OzJCQVF5QjtBQUMzQjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQiw0QkFBNEI7RUFDNUIsZ0JBQWdCO0VBQ2hCLFFBQVE7RUFDUixXQUFXO0FBQ2I7O0FBRUE7RUFDRSxnQkFBZ0I7RUFDaEIsNEJBQTRCO0VBQzVCLGdCQUFnQjtFQUNoQixRQUFRO0VBQ1IsaUJBQWlCO0VBQ2pCLFdBQVc7QUFDYjs7QUFFQTtFQUNFLDRCQUE0QjtFQUM1QixnQkFBZ0I7RUFDaEIsUUFBUTtBQUNWOztBQUVBO0VBQ0U7SUFDRSxVQUFVO0lBQ1YsU0FBUztFQUNYO0FBQ0YiLCBzb3VyY2VzQ29udGVudDogW2AucnMtYmFzZSB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMzsKICBjb2xvcjogI2ZhZmFmYTsKICBib3JkZXItcmFkaXVzOiAwOwogIGZvbnQ6IDEwcHggbW9ub3NwYWNlOwogIGxlZnQ6IDVweDsKICBsaW5lLWhlaWdodDogMWVtOwogIG9wYWNpdHk6IDAuODU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBwYWRkaW5nOiAxMHB4OwogIHBvc2l0aW9uOiBmaXhlZDsKICB0b3A6IDVweDsKICB3aWR0aDogMzAwcHg7CiAgei1pbmRleDogMTAwMDA7Cn0KCi5ycy1iYXNlIGRpdi5oaWRkZW4gewogIGRpc3BsYXk6IG5vbmU7Cn0KCi5ycy1iYXNlIGgxIHsKICBjb2xvcjogI2ZmZjsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZm9udC1zaXplOiAxLjRlbTsKICBmb250LXdlaWdodDogMzAwOwogIG1hcmdpbjogMCAwIDVweDsKICBwYWRkaW5nOiAwOwp9CgoucnMtZ3JvdXAgewogIGRpc3BsYXk6IC13ZWJraXQtYm94OwogIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICBkaXNwbGF5OiBmbGV4OwogIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICBtYXJnaW4tYm90dG9tOiA1cHg7Cn0KCi5ycy1ncm91cDpsYXN0LWNoaWxkIHsKICBtYXJnaW4tYm90dG9tOiAwOwp9CgoucnMtY291bnRlci1iYXNlIHsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGRpc3BsYXk6IC13ZWJraXQtYm94OwogIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICBkaXNwbGF5OiBmbGV4OwogIGhlaWdodDogMTBweDsKICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgbWFyZ2luOiAycHggMDsKfQoKLnJzLWNvdW50ZXItYmFzZS5hbGFybSB7CiAgY29sb3I6ICNiNzAwMDA7CiAgdGV4dC1zaGFkb3c6IDAgMCAwICNiNzAwMDAsCiAgICAgICAgICAgICAgIDAgMCAxcHggI2ZmZiwKICAgICAgICAgICAgICAgMCAwIDFweCAjZmZmLAogICAgICAgICAgICAgICAwIDAgMnB4ICNmZmYsCiAgICAgICAgICAgICAgIDAgMCAycHggI2ZmZiwKICAgICAgICAgICAgICAgMCAwIDNweCAjZmZmLAogICAgICAgICAgICAgICAwIDAgM3B4ICNmZmYsCiAgICAgICAgICAgICAgIDAgMCA0cHggI2ZmZiwKICAgICAgICAgICAgICAgMCAwIDRweCAjZmZmOwp9CgoucnMtY291bnRlci1pZCB7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICAtd2Via2l0LWJveC1vcmRpbmFsLWdyb3VwOiAwOwogIC13ZWJraXQtb3JkZXI6IDA7CiAgb3JkZXI6IDA7CiAgd2lkdGg6IDU0cHg7Cn0KCi5ycy1jb3VudGVyLXZhbHVlIHsKICBmb250LXdlaWdodDogMzAwOwogIC13ZWJraXQtYm94LW9yZGluYWwtZ3JvdXA6IDE7CiAgLXdlYmtpdC1vcmRlcjogMTsKICBvcmRlcjogMTsKICB0ZXh0LWFsaWduOiByaWdodDsKICB3aWR0aDogMzVweDsKfQoKLnJzLWNhbnZhcyB7CiAgLXdlYmtpdC1ib3gtb3JkaW5hbC1ncm91cDogMjsKICAtd2Via2l0LW9yZGVyOiAyOwogIG9yZGVyOiAyOwp9CgpAbWVkaWEgKG1pbi13aWR0aDogNDgwcHgpIHsKICAucnMtYmFzZSB7CiAgICBsZWZ0OiAyMHB4OwogICAgdG9wOiAyMHB4OwogIH0KfQpgXSwgc291cmNlUm9vdDogIiIgfV0pOwogICAgY29uc3QgYSA9IHM7CiAgfSwgNzE4MDogKGUsIHQyLCBuKSA9PiB7CiAgICBuLnIodDIpLCBuLmQodDIsIHsgZGVmYXVsdDogKCkgPT4gbSB9KTsKICAgIHZhciBpID0gbig1MDcyKSwgciA9IG4ubihpKSwgbyA9IG4oNzgyNSksIHMgPSBuLm4obyksIGEgPSBuKDc2NTkpLCBBID0gbi5uKGEpLCBsID0gbig1MDU2KSwgYyA9IG4ubihsKSwgaCA9IG4oNTQwKSwgZCA9IG4ubihoKSwgdSA9IG4oMTExMyksIGcgPSBuLm4odSksIHAgPSBuKDgyMTcpLCBmID0ge307CiAgICBmLnN0eWxlVGFnVHJhbnNmb3JtID0gZygpLCBmLnNldEF0dHJpYnV0ZXMgPSBjKCksIGYuaW5zZXJ0ID0gQSgpLmJpbmQobnVsbCwgImhlYWQiKSwgZi5kb21BUEkgPSBzKCksIGYuaW5zZXJ0U3R5bGVFbGVtZW50ID0gZCgpLCByKCkocC5BLCBmKTsKICAgIGNvbnN0IG0gPSBwLkEgJiYgcC5BLmxvY2FscyA/IHAuQS5sb2NhbHMgOiB1bmRlZmluZWQ7CiAgfSwgOTM3OTogKGUsIHQyLCBuKSA9PiB7CiAgICBuLnIodDIpLCBuLmQodDIsIHsgZGVmYXVsdDogKCkgPT4gbSB9KTsKICAgIHZhciBpID0gbig1MDcyKSwgciA9IG4ubihpKSwgbyA9IG4oNzgyNSksIHMgPSBuLm4obyksIGEgPSBuKDc2NTkpLCBBID0gbi5uKGEpLCBsID0gbig1MDU2KSwgYyA9IG4ubihsKSwgaCA9IG4oNTQwKSwgZCA9IG4ubihoKSwgdSA9IG4oMTExMyksIGcgPSBuLm4odSksIHAgPSBuKDI0NzApLCBmID0ge307CiAgICBmLnN0eWxlVGFnVHJhbnNmb3JtID0gZygpLCBmLnNldEF0dHJpYnV0ZXMgPSBjKCksIGYuaW5zZXJ0ID0gQSgpLmJpbmQobnVsbCwgImhlYWQiKSwgZi5kb21BUEkgPSBzKCksIGYuaW5zZXJ0U3R5bGVFbGVtZW50ID0gZCgpLCByKCkocC5BLCBmKTsKICAgIGNvbnN0IG0gPSBwLkEgJiYgcC5BLmxvY2FscyA/IHAuQS5sb2NhbHMgOiB1bmRlZmluZWQ7CiAgfSwgNTA3MjogKGUpID0+IHsKICAgIHZhciB0MiA9IFtdOwogICAgZnVuY3Rpb24gbihlMikgewogICAgICBmb3IgKHZhciBuMiA9IC0xLCBpMiA9IDA7aTIgPCB0Mi5sZW5ndGg7IGkyKyspCiAgICAgICAgaWYgKHQyW2kyXS5pZGVudGlmaWVyID09PSBlMikgewogICAgICAgICAgbjIgPSBpMjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgcmV0dXJuIG4yOwogICAgfQogICAgZnVuY3Rpb24gaShlMiwgaTIpIHsKICAgICAgZm9yICh2YXIgbyA9IHt9LCBzID0gW10sIGEgPSAwO2EgPCBlMi5sZW5ndGg7IGErKykgewogICAgICAgIHZhciBBID0gZTJbYV0sIGwgPSBpMi5iYXNlID8gQVswXSArIGkyLmJhc2UgOiBBWzBdLCBjID0gb1tsXSB8fCAwLCBoID0gIiIuY29uY2F0KGwsICIgIikuY29uY2F0KGMpOwogICAgICAgIG9bbF0gPSBjICsgMTsKICAgICAgICB2YXIgZCA9IG4oaCksIHUgPSB7IGNzczogQVsxXSwgbWVkaWE6IEFbMl0sIHNvdXJjZU1hcDogQVszXSwgc3VwcG9ydHM6IEFbNF0sIGxheWVyOiBBWzVdIH07CiAgICAgICAgaWYgKGQgIT09IC0xKQogICAgICAgICAgdDJbZF0ucmVmZXJlbmNlcysrLCB0MltkXS51cGRhdGVyKHUpOwogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIGcgPSByKHUsIGkyKTsKICAgICAgICAgIGkyLmJ5SW5kZXggPSBhLCB0Mi5zcGxpY2UoYSwgMCwgeyBpZGVudGlmaWVyOiBoLCB1cGRhdGVyOiBnLCByZWZlcmVuY2VzOiAxIH0pOwogICAgICAgIH0KICAgICAgICBzLnB1c2goaCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHM7CiAgICB9CiAgICBmdW5jdGlvbiByKGUyLCB0MykgewogICAgICB2YXIgbjIgPSB0My5kb21BUEkodDMpOwogICAgICByZXR1cm4gbjIudXBkYXRlKGUyKSwgZnVuY3Rpb24odDQpIHsKICAgICAgICBpZiAodDQpIHsKICAgICAgICAgIGlmICh0NC5jc3MgPT09IGUyLmNzcyAmJiB0NC5tZWRpYSA9PT0gZTIubWVkaWEgJiYgdDQuc291cmNlTWFwID09PSBlMi5zb3VyY2VNYXAgJiYgdDQuc3VwcG9ydHMgPT09IGUyLnN1cHBvcnRzICYmIHQ0LmxheWVyID09PSBlMi5sYXllcikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgbjIudXBkYXRlKGUyID0gdDQpOwogICAgICAgIH0gZWxzZQogICAgICAgICAgbjIucmVtb3ZlKCk7CiAgICAgIH07CiAgICB9CiAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbihlMiwgcjIpIHsKICAgICAgdmFyIG8gPSBpKGUyID0gZTIgfHwgW10sIHIyID0gcjIgfHwge30pOwogICAgICByZXR1cm4gZnVuY3Rpb24oZTMpIHsKICAgICAgICBlMyA9IGUzIHx8IFtdOwogICAgICAgIGZvciAodmFyIHMgPSAwO3MgPCBvLmxlbmd0aDsgcysrKSB7CiAgICAgICAgICB2YXIgYSA9IG4ob1tzXSk7CiAgICAgICAgICB0MlthXS5yZWZlcmVuY2VzLS07CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIEEgPSBpKGUzLCByMiksIGwgPSAwO2wgPCBvLmxlbmd0aDsgbCsrKSB7CiAgICAgICAgICB2YXIgYyA9IG4ob1tsXSk7CiAgICAgICAgICB0MltjXS5yZWZlcmVuY2VzID09PSAwICYmICh0MltjXS51cGRhdGVyKCksIHQyLnNwbGljZShjLCAxKSk7CiAgICAgICAgfQogICAgICAgIG8gPSBBOwogICAgICB9OwogICAgfTsKICB9LCA3NjU5OiAoZSkgPT4gewogICAgdmFyIHQyID0ge307CiAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbihlMiwgbikgewogICAgICB2YXIgaSA9IGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgaWYgKHQyW2UzXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB2YXIgbjIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUzKTsKICAgICAgICAgIGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgbjIgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgbjIgPSBuMi5jb250ZW50RG9jdW1lbnQuaGVhZDsKICAgICAgICAgICAgfSBjYXRjaCAoZTQpIHsKICAgICAgICAgICAgICBuMiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgIHQyW2UzXSA9IG4yOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdDJbZTNdOwogICAgICB9KGUyKTsKICAgICAgaWYgKCFpKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLiIpOwogICAgICBpLmFwcGVuZENoaWxkKG4pOwogICAgfTsKICB9LCA1NDA6IChlKSA9PiB7CiAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbihlMikgewogICAgICB2YXIgdDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICByZXR1cm4gZTIuc2V0QXR0cmlidXRlcyh0MiwgZTIuYXR0cmlidXRlcyksIGUyLmluc2VydCh0MiwgZTIub3B0aW9ucyksIHQyOwogICAgfTsKICB9LCA1MDU2OiAoZSwgdDIsIG4pID0+IHsKICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGUyKSB7CiAgICAgIHZhciB0MyA9IG4ubmM7CiAgICAgIHQzICYmIGUyLnNldEF0dHJpYnV0ZSgibm9uY2UiLCB0Myk7CiAgICB9OwogIH0sIDc4MjU6IChlKSA9PiB7CiAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbihlMikgewogICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09ICJ1bmRlZmluZWQiKQogICAgICAgIHJldHVybiB7IHVwZGF0ZTogZnVuY3Rpb24oKSB7fSwgcmVtb3ZlOiBmdW5jdGlvbigpIHt9IH07CiAgICAgIHZhciB0MiA9IGUyLmluc2VydFN0eWxlRWxlbWVudChlMik7CiAgICAgIHJldHVybiB7IHVwZGF0ZTogZnVuY3Rpb24obikgewogICAgICAgIChmdW5jdGlvbihlMywgdDMsIG4yKSB7CiAgICAgICAgICB2YXIgaSA9ICIiOwogICAgICAgICAgbjIuc3VwcG9ydHMgJiYgKGkgKz0gIkBzdXBwb3J0cyAoIi5jb25jYXQobjIuc3VwcG9ydHMsICIpIHsiKSksIG4yLm1lZGlhICYmIChpICs9ICJAbWVkaWEgIi5jb25jYXQobjIubWVkaWEsICIgeyIpKTsKICAgICAgICAgIHZhciByID0gbjIubGF5ZXIgIT09IHVuZGVmaW5lZDsKICAgICAgICAgIHIgJiYgKGkgKz0gIkBsYXllciIuY29uY2F0KG4yLmxheWVyLmxlbmd0aCA+IDAgPyAiICIuY29uY2F0KG4yLmxheWVyKSA6ICIiLCAiIHsiKSksIGkgKz0gbjIuY3NzLCByICYmIChpICs9ICJ9IiksIG4yLm1lZGlhICYmIChpICs9ICJ9IiksIG4yLnN1cHBvcnRzICYmIChpICs9ICJ9Iik7CiAgICAgICAgICB2YXIgbyA9IG4yLnNvdXJjZU1hcDsKICAgICAgICAgIG8gJiYgdHlwZW9mIGJ0b2EgIT0gInVuZGVmaW5lZCIgJiYgKGkgKz0gYAovKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGAuY29uY2F0KGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KG8pKSkpLCAiICovIikpLCB0My5zdHlsZVRhZ1RyYW5zZm9ybShpLCBlMywgdDMub3B0aW9ucyk7CiAgICAgICAgfSkodDIsIGUyLCBuKTsKICAgICAgfSwgcmVtb3ZlOiBmdW5jdGlvbigpIHsKICAgICAgICAoZnVuY3Rpb24oZTMpIHsKICAgICAgICAgIGlmIChlMy5wYXJlbnROb2RlID09PSBudWxsKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICBlMy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUzKTsKICAgICAgICB9KSh0Mik7CiAgICAgIH0gfTsKICAgIH07CiAgfSwgMTExMzogKGUpID0+IHsKICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGUyLCB0MikgewogICAgICBpZiAodDIuc3R5bGVTaGVldCkKICAgICAgICB0Mi5zdHlsZVNoZWV0LmNzc1RleHQgPSBlMjsKICAgICAgZWxzZSB7CiAgICAgICAgZm9yICg7dDIuZmlyc3RDaGlsZDsgKQogICAgICAgICAgdDIucmVtb3ZlQ2hpbGQodDIuZmlyc3RDaGlsZCk7CiAgICAgICAgdDIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZTIpKTsKICAgICAgfQogICAgfTsKICB9LCAzOTMxOiAoZSkgPT4gewogICAgZS5leHBvcnRzID0gImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0MlM0Z4bWwgdmVyc2lvbj0lMjcxLjAlMjcgZW5jb2Rpbmc9JTI3VVRGLTglMjcgc3RhbmRhbG9uZT0lMjdubyUyNyUzRiUzRSUzQ3N2ZyB3aWR0aD0lMjcxMDglMjcgaGVpZ2h0PSUyNzYyJTI3IHZpZXdCb3g9JTI3MCAwIDEwOCA2MiUyNyB2ZXJzaW9uPSUyNzEuMSUyNyBpZD0lMjdzdmczMjAlMjcgc29kaXBvZGk6ZG9jbmFtZT0lMjdmdWxsc2NyZWVuLWFmcmFtZS5zdmclMjcgeG1sOnNwYWNlPSUyN3ByZXNlcnZlJTI3IGlua3NjYXBlOnZlcnNpb249JTI3MS4yLjEgJTI4OWM2ZDQxZSAgMjAyMi0wNy0xNCUyOSUyNyB4bWxuczppbmtzY2FwZT0lMjdodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlJTI3IHhtbG5zOnNvZGlwb2RpPSUyN2h0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkJTI3IHhtbG5zPSUyN2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJTI3IHhtbG5zOnN2Zz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyB4bWxuczpyZGY9JTI3aHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zJTIzJTI3IHhtbG5zOmNjPSUyN2h0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zJTIzJTI3IHhtbG5zOmRjPSUyN2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJTI3JTNFJTNDZGVmcyBpZD0lMjdkZWZzMzI0JTI3IC8lM0UlM0Nzb2RpcG9kaTpuYW1lZHZpZXcgaWQ9JTI3bmFtZWR2aWV3MzIyJTI3IHBhZ2Vjb2xvcj0lMjclMjNmZmZmZmYlMjcgYm9yZGVyY29sb3I9JTI3JTIzMDAwMDAwJTI3IGJvcmRlcm9wYWNpdHk9JTI3MC4yNSUyNyBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0lMjcyJTI3IGlua3NjYXBlOnBhZ2VvcGFjaXR5PSUyNzAuMCUyNyBpbmtzY2FwZTpwYWdlY2hlY2tlcmJvYXJkPSUyNzAlMjcgaW5rc2NhcGU6ZGVza2NvbG9yPSUyNyUyM2QxZDFkMSUyNyBzaG93Z3JpZD0lMjdmYWxzZSUyNyBpbmtzY2FwZTp6b29tPSUyNzMuODA2NDUxNiUyNyBpbmtzY2FwZTpjeD0lMjc5MS40MjM3MjklMjcgaW5rc2NhcGU6Y3k9JTI3LTEuNDQ0OTE1MyUyNyBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9JTI3MTQ0MCUyNyBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSUyNzg0NyUyNyBpbmtzY2FwZTp3aW5kb3cteD0lMjczMiUyNyBpbmtzY2FwZTp3aW5kb3cteT0lMjcyNSUyNyBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSUyNzAlMjcgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0lMjdzdmczMjAlMjcgLyUzRSUzQ3RpdGxlIGlkPSUyN3RpdGxlMzEyJTI3JTNFYWZyYW1lLWFybW9kZS1ub2JvcmRlci1yZWR1Y2VkLXRyYWNraW5nJTNDL3RpdGxlJTNFJTNDcGF0aCBkPSUyN005NiAwSDEyQTEyIDEyIDAgMCAwIDAgMTJWNTBBMTIgMTIgMCAwIDAgMTIgNjJIOTZhMTIgMTIgMCAwIDAgMTItMTJWMTJBMTIgMTIgMCAwIDAgOTYgMFptOCA1MGE4IDggMCAwIDEtOCA4SDEyYTggOCAwIDAgMS04LThWMTJhOCA4IDAgMCAxIDgtOEg5NmE4IDggMCAwIDEgOCA4WiUyNyBmaWxsPSUyNyUyM2ZmZiUyNyBpZD0lMjdwYXRoMzE0JTI3IHN0eWxlPSUyN2ZpbGw6JTIzZmZmZmZmJTI3IC8lM0UlM0NnIGlkPSUyN2czNTYlMjcgdHJhbnNmb3JtPSUyN3RyYW5zbGF0ZSUyOC0yMDYuNjEwMTcgLTIzMi42MTg2NCUyOSUyNyUzRSUzQy9nJTNFJTNDZyBpZD0lMjdnMzU4JTI3IHRyYW5zZm9ybT0lMjd0cmFuc2xhdGUlMjgtMjA2LjYxMDE3IC0yMzIuNjE4NjQlMjklMjclM0UlM0MvZyUzRSUzQ2cgaWQ9JTI3ZzM2MCUyNyB0cmFuc2Zvcm09JTI3dHJhbnNsYXRlJTI4LTIwNi42MTAxNyAtMjMyLjYxODY0JTI5JTI3JTNFJTNDL2clM0UlM0NnIGlkPSUyN2czNjIlMjcgdHJhbnNmb3JtPSUyN3RyYW5zbGF0ZSUyOC0yMDYuNjEwMTcgLTIzMi42MTg2NCUyOSUyNyUzRSUzQy9nJTNFJTNDZyBpZD0lMjdnMzY0JTI3IHRyYW5zZm9ybT0lMjd0cmFuc2xhdGUlMjgtMjA2LjYxMDE3IC0yMzIuNjE4NjQlMjklMjclM0UlM0MvZyUzRSUzQ2cgaWQ9JTI3ZzM2NiUyNyB0cmFuc2Zvcm09JTI3dHJhbnNsYXRlJTI4LTIwNi42MTAxNyAtMjMyLjYxODY0JTI5JTI3JTNFJTNDL2clM0UlM0NnIGlkPSUyN2czNjglMjcgdHJhbnNmb3JtPSUyN3RyYW5zbGF0ZSUyOC0yMDYuNjEwMTcgLTIzMi42MTg2NCUyOSUyNyUzRSUzQy9nJTNFJTNDZyBpZD0lMjdnMzcwJTI3IHRyYW5zZm9ybT0lMjd0cmFuc2xhdGUlMjgtMjA2LjYxMDE3IC0yMzIuNjE4NjQlMjklMjclM0UlM0MvZyUzRSUzQ2cgaWQ9JTI3ZzM3MiUyNyB0cmFuc2Zvcm09JTI3dHJhbnNsYXRlJTI4LTIwNi42MTAxNyAtMjMyLjYxODY0JTI5JTI3JTNFJTNDL2clM0UlM0NnIGlkPSUyN2czNzQlMjcgdHJhbnNmb3JtPSUyN3RyYW5zbGF0ZSUyOC0yMDYuNjEwMTcgLTIzMi42MTg2NCUyOSUyNyUzRSUzQy9nJTNFJTNDZyBpZD0lMjdnMzc2JTI3IHRyYW5zZm9ybT0lMjd0cmFuc2xhdGUlMjgtMjA2LjYxMDE3IC0yMzIuNjE4NjQlMjklMjclM0UlM0MvZyUzRSUzQ2cgaWQ9JTI3ZzM3OCUyNyB0cmFuc2Zvcm09JTI3dHJhbnNsYXRlJTI4LTIwNi42MTAxNyAtMjMyLjYxODY0JTI5JTI3JTNFJTNDL2clM0UlM0NnIGlkPSUyN2czODAlMjcgdHJhbnNmb3JtPSUyN3RyYW5zbGF0ZSUyOC0yMDYuNjEwMTcgLTIzMi42MTg2NCUyOSUyNyUzRSUzQy9nJTNFJTNDZyBpZD0lMjdnMzgyJTI3IHRyYW5zZm9ybT0lMjd0cmFuc2xhdGUlMjgtMjA2LjYxMDE3IC0yMzIuNjE4NjQlMjklMjclM0UlM0MvZyUzRSUzQ2cgaWQ9JTI3ZzM4NCUyNyB0cmFuc2Zvcm09JTI3dHJhbnNsYXRlJTI4LTIwNi42MTAxNyAtMjMyLjYxODY0JTI5JTI3JTNFJTNDL2clM0UlM0NtZXRhZGF0YSBpZD0lMjdtZXRhZGF0YTU2MSUyNyUzRSUzQ3JkZjpSREYlM0UlM0NjYzpXb3JrIHJkZjphYm91dD0lMjclMjclM0UlM0NkYzp0aXRsZSUzRWFmcmFtZS1hcm1vZGUtbm9ib3JkZXItcmVkdWNlZC10cmFja2luZyUzQy9kYzp0aXRsZSUzRSUzQy9jYzpXb3JrJTNFJTNDL3JkZjpSREYlM0UlM0MvbWV0YWRhdGElM0UlM0NwYXRoIGQ9JTI3bSA5OC4xNjg1MTEgNDAuMDgzNjQ5IGMgMCAtMS4zMDM2ODEgLTAuOTk4Nzg4IC0yLjM1ODA0MSAtMi4yMzkzODkgLTIuMzU4MDQxIC0xLjIzMDA4OCAwLjAwMzEgLTIuMjQwODkyIDEuMDU0MzYgLTIuMjQwODkyIDIuMzU4MDQxIHYgNC44ODEyOTYgbCAtOS4wNDE2NjEgLTkuMDQxNjYyIGMgLTAuODc0MTI5IC0wLjg3NTYzMSAtMi4yODg5NTQgLTAuODc1NjMxIC0zLjE2MzA4IDAgLTAuODc0MTI5IDAuODc0MTI2IC0wLjg3NDEyOSAyLjI5MzQ1OSAwIDMuMTY3NTg1IGwgOC45OTUxMDEgOC45OTIxMDEgaCAtNC44NTg3NjcgYyAtMS4zMjMyMDYgMC4wMDMxIC0yLjM4OTU4MyAxLjAwNDc5NiAtMi4zODk1ODMgMi4yMzkzODYgMCAxLjIzNzU5OCAxLjA2NjM3NyAyLjIzNzg4OCAyLjM4OTU4MyAyLjIzNzg4OCBoIDEwLjE1NDU5OSBjIDEuMzIzMjA2IDAgMi4zODgwODIgLTAuOTk4Nzg5IDIuMzkyNTg3IC0yLjIzNzg4OCAtMC4wMDQ0IC0wLjAzMzA1IC0wLjAwOSAtMC4wNTg1OCAtMC4wMTM0IC0wLjA5MTYxIDAuMDA0NiAtMC4wNDIwNyAwLjAxMzQgLTAuMDg3MTIgMC4wMTM0IC0wLjEzMDY2IFYgNDAuMDg1MTcyIGggLTEuNTJlLTQlMjcgaWQ9JTI3cGF0aDU5NiUyNyBzdHlsZT0lMjdmaWxsOiUyM2ZmZmZmZiUzQnN0cm9rZS13aWR0aDoxLjUwMTk0JTI3IC8lM0UlM0NwYXRoIGQ9JTI3bSAyMy4wOTEwMDIgMzUuOTIxNzgxIC05LjAyNjY0MyA5LjA0MTY2MiB2IC00Ljg4MTI5NiBjIDAgLTEuMzAzNjgxIC0xLjAwOTMwMiAtMi4zNTUwMzcgLTIuMjQyMzkzIC0yLjM1ODA0MSAtMS4yMzc1OTggMCAtMi4yMzc4ODggMS4wNTQzNiAtMi4yMzc4ODggMi4zNTgwNDEgbCAtMC4wMDMxIDEwLjAxNjQyMSBjIDAgMC4wNDM1NiAwLjAxMjExIDAuMDg4NjIgMC4wMDE1IDAuMTMwNjU5IC0wLjAwMzEgMC4wMzE1MyAtMC4wMDkgMC4wNTcwOSAtMC4wMTIxMSAwLjA5MTYxIDAuMDAzMSAxLjIzOTA5OSAxLjA2OTM3OSAyLjIzNzg4OCAyLjM5MTA4NSAyLjIzNzg4OCBoIDEwLjE1NjEwMSBjIDEuMzIwMjAyIDAgMi4zODgwNzkgLTEuMDAwMjkxIDIuMzg4MDc5IC0yLjIzNzg4OCAwIC0xLjIzNDU5MSAtMS4wNjc4NzcgLTIuMjM2MzgzIC0yLjM4ODA3OSAtMi4yMzkzODcgaCAtNC44NTg3NjcgbCA4Ljk5NTEwMSAtOC45OTIxIGMgMC44NzExMjYgLTAuODc0MTI3IDAuODcxMTI2IC0yLjI5MzQ1OSAwIC0zLjE2NzU4NiAtMC44NzU2MjggLTAuODc3MTMyIC0yLjI5MTk1NyAtMC44NzcxMzIgLTMuMTY5MDg3IC0xLjUyZS00JTI3IGlkPSUyN3BhdGg1OTglMjcgc3R5bGU9JTI3ZmlsbDolMjNmZmZmZmYlM0JzdHJva2Utd2lkdGg6MS41MDE5NCUyNyAvJTNFJTNDcGF0aCBkPSUyN20gODQuNjQ5NTcyIDI1Ljk3ODAzMyA5LjA0MTY2MiAtOS4wNDE2NjQgdiA0Ljg4MTI5OCBjIDAgMS4yOTkxNzYgMS4wMTA4MDYgMi4zNTA1MzIgMi4yNDA4OTEgMi4zNTUwMzcgMS4yNDA2MDEgMCAyLjIzOTM5IC0xLjA1NTg2MSAyLjIzOTM5IC0yLjM1NTAzNyBWIDExLjc5ODI0MiBjIDAgLTAuMDQzNTYgLTAuMDA5IC0wLjA4ODYyIC0wLjAxMzQgLTAuMTI3NjcxIDAuMDA0NCAtMC4wMzE1MyAwLjAwOSAtMC4wNjE1NyAwLjAxMzQgLTAuMDkzMTMgLTAuMDA0NCAtMS4yNDA1OTggLTEuMDY5Mzc5IC0yLjIzOTM4NzMgLTIuMzkxMDg1IC0yLjIzOTM4NzMgaCAtMTAuMTU0NiBjIC0xLjMyMzIwNSAwIC0yLjM4OTU4IDAuOTk4Nzg5MyAtMi4zODk1OCAyLjIzOTM4NzMgMCAxLjIzMzA5MSAxLjA2NjM3NSAyLjIzNzg4NyAyLjM4OTU4IDIuMjQwODkxIGggNC44NTg3NjggbCAtOC45OTUxMDIgOC45OTIxIGMgLTAuODc0MTI5IDAuODcyNjI1IC0wLjg3NDEyOSAyLjI4ODk1NCAwIDMuMTYxNTc4IDAuODc0MTI3IDAuODgwMTM3IDIuMjg4OTUxIDAuODgwMTM3IDMuMTYzMDggMS41ZS00JTI3IGlkPSUyN3BhdGg2MDAlMjcgc3R5bGU9JTI3ZmlsbDolMjNmZmZmZmYlM0JzdHJva2Utd2lkdGg6MS41MDE5NCUyNyAvJTNFJTNDcGF0aCBkPSUyN20gMTcuMjY0OTg4IDEzLjgyMjg1MyBoIDQuODU3MjY1IGMgMS4zMjAyMDIgLTAuMDAzMSAyLjM4ODA3OSAtMS4wMDc4IDIuMzg4MDc5IC0yLjI0MDg4OSAwIC0xLjI0MDYwMSAtMS4wNjc4NzcgLTIuMjM5Mzg5MyAtMi4zODgwNzkgLTIuMjM5Mzg5MyBIIDExLjk2NzY1NCBjIC0xLjMyMTcwNyAwIC0yLjM4ODA4MiAwLjk5ODc4ODMgLTIuMzkxMDg1IDIuMjM5Mzg5MyAwLjAwMzEgMC4wMzE1MyAwLjAwOSAwLjA2MTU3IDAuMDEyMTEgMC4wOTMxMyAtMC4wMDMxIDAuMDM5MDUgLTAuMDAxNSAwLjA4MjYyIC0wLjAwMTUgMC4xMjc2NzEgbCAwLjAwMzEgMTAuMDIwOTI2IGMgMCAxLjI5OTE3NiAxLjAwMDI5IDIuMzU1MDM4IDIuMjM3ODg3IDIuMzU1MDM4IDEuMjMzMDkyIC0wLjAwNDQgMi4yNDIzOTMgLTEuMDU1ODYyIDIuMjQyMzkzIC0yLjM1NTAzOCB2IC00Ljg4MTI5NSBsIDkuMDI2NjQ0IDkuMDQxNjYxIGMgMC44NzcxMzIgMC44Nzg2MzUgMi4yOTM0NTkgMC44Nzg2MzUgMy4xNjkwODcgMCAwLjg3MTEyNSAtMC44NzI2MjQgMC44NzExMjUgLTIuMjg4OTUzIDAgLTMuMTYxNTc3IGwgLTguOTk1MjgyIC04Ljk5MzYxNiUyNyBpZD0lMjdwYXRoNjAyJTI3IHN0eWxlPSUyN2ZpbGw6JTIzZmZmZmZmJTNCc3Ryb2tlLXdpZHRoOjEuNTAxOTQlMjcgLyUzRSUzQy9zdmclM0UiOwogIH0sIDYwODU6IChlKSA9PiB7CiAgICBlLmV4cG9ydHMgPSAiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0lMjdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyUyNyB3aWR0aD0lMjcxMDglMjcgaGVpZ2h0PSUyNzYyJTI3IHZpZXdCb3g9JTI3MCAwIDEwOCA2MiUyNyUzRSUzQ3RpdGxlJTNFYWZyYW1lLWFybW9kZS1ub2JvcmRlci1yZWR1Y2VkLXRyYWNraW5nJTNDL3RpdGxlJTNFJTNDcGF0aCBkPSUyN005NiwwSDEyQTEyLDEyLDAsMCwwLDAsMTJWNTBBMTIsMTIsMCwwLDAsMTIsNjJIOTZhMTIsMTIsMCwwLDAsMTItMTJWMTJBMTIsMTIsMCwwLDAsOTYsMFptOCw1MGE4LDgsMCwwLDEtOCw4SDEyYTgsOCwwLDAsMS04LThWMTJhOCw4LDAsMCwxLDgtOEg5NmE4LDgsMCwwLDEsOCw4WiUyNyBmaWxsPSUyNyUyM2ZmZiUyNy8lM0UlM0NwYXRoIGQ9JTI3TTQzLjM1LDM5LjgySDMyLjUxTDMwLjQ1LDQ2SDIzLjg4TDM1LDE2aDUuNzNMNTIsNDZINDUuNDNabS05LjE3LTVoNy41TDM3LjkxLDIzLjU4WiUyNyBmaWxsPSUyNyUyM2ZmZiUyNy8lM0UlM0NwYXRoIGQ9JTI3TTY4LjExLDM1SDYzLjE4VjQ2SDU3VjE2SDY4LjE1cTUuMzEsMCw4LjIsMi4zN2E4LjE4LDguMTgsMCwwLDEsMi44OCw2LjcsOS4yMiw5LjIyLDAsMCwxLTEuMzMsNS4xMiw5LjA5LDkuMDksMCwwLDEtNCwzLjI2bDYuNDksMTIuMjZWNDZINzMuNzNabS00LjkzLTVoNWE1LjA5LDUuMDksMCwwLDAsMy42LTEuMTgsNC4yMSw0LjIxLDAsMCwwLDEuMjgtMy4yNyw0LjU2LDQuNTYsMCwwLDAtMS4yLTMuMzRBNSw1LDAsMCwwLDY4LjE1LDIxaC01WiUyNyBmaWxsPSUyNyUyM2ZmZiUyNy8lM0UlM0Mvc3ZnJTNFIjsKICB9LCA5MTY5OiAoZSkgPT4gewogICAgZS5leHBvcnRzID0gImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9JTI3aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjcgd2lkdGg9JTI3MTA4JTI3IGhlaWdodD0lMjc2MiUyNyB2aWV3Qm94PSUyNzAgMCAxMDggNjIlMjclM0UlM0N0aXRsZSUzRWFmcmFtZS12cm1vZGUtbm9ib3JkZXItcmVkdWNlZC10cmFja2luZyUzQy90aXRsZSUzRSUzQ3BhdGggZD0lMjdNNjguODEsMjEuNTZINjQuMjN2OC4yN2g0LjU4YTQuMTMsNC4xMywwLDAsMCwzLjEtMS4wOSw0LjIsNC4yLDAsMCwwLDEtMyw0LjI0LDQuMjQsMCwwLDAtMS0zQTQuMDUsNC4wNSwwLDAsMCw2OC44MSwyMS41NlolMjcgZmlsbD0lMjclMjNmZmYlMjcvJTNFJTNDcGF0aCBkPSUyN005NiwwSDEyQTEyLDEyLDAsMCwwLDAsMTJWNTBBMTIsMTIsMCwwLDAsMTIsNjJIOTZhMTIsMTIsMCwwLDAsMTItMTJWMTJBMTIsMTIsMCwwLDAsOTYsMFpNNDEuOSw0NkgzNEwyNCwxNmg4bDYsMjEuODQsNi0yMS44NEg1MlptMzkuMjksMEg3My40NEw2OC4xNSwzNS4zOUg2NC4yM1Y0Nkg1N1YxNkg2OC44MXE1LjMyLDAsOC4zNCwyLjM3YTgsOCwwLDAsMSwzLDYuNjksOS42OCw5LjY4LDAsMCwxLTEuMjcsNS4xOCw4LjksOC45LDAsMCwxLTQsMy4zNGw2LjI2LDEyLjExWiUyNyBmaWxsPSUyNyUyM2ZmZiUyNy8lM0UlM0Mvc3ZnJTNFIjsKICB9LCA2NTE3OiAoZSkgPT4gewogICAgZS5leHBvcnRzID0gImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmclMjB4bWxucyUzRCUyMmh0dHAlM0EvL3d3dy53My5vcmcvMjAwMC9zdmclMjIlMjB4bWxucyUzQXhsaW5rJTNEJTIyaHR0cCUzQS8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJTIyJTIwdmVyc2lvbiUzRCUyMjEuMSUyMiUyMHglM0QlMjIwcHglMjIlMjB5JTNEJTIyMHB4JTIyJTIwdmlld0JveCUzRCUyMjAlMjAwJTIwMTAwJTIwMTAwJTIyJTIwZW5hYmxlLWJhY2tncm91bmQlM0QlMjJuZXclMjAwJTIwMCUyMDEwMCUyMDEwMCUyMiUyMHhtbCUzQXNwYWNlJTNEJTIycHJlc2VydmUlMjIlM0UlM0NwYXRoJTIwZmlsbCUzRCUyMiUyMzAwMDAwMCUyMiUyMGQlM0QlMjJNNTUuMjA5JTJDNTBsMTcuODAzLTE3LjgwM2MxLjQxNi0xLjQxNiUyQzEuNDE2LTMuNzEzJTJDMC01LjEyOWMtMS40MTYtMS40MTctMy43MTMtMS40MTctNS4xMjklMkMwTDUwLjA4JTJDNDQuODcyJTIwJTIwTDMyLjI3OCUyQzI3LjA2OWMtMS40MTYtMS40MTctMy43MTQtMS40MTctNS4xMjklMkMwYy0xLjQxNyUyQzEuNDE2LTEuNDE3JTJDMy43MTMlMkMwJTJDNS4xMjlMNDQuOTUxJTJDNTBMMjcuMTQ5JTJDNjcuODAzJTIwJTIwYy0xLjQxNyUyQzEuNDE2LTEuNDE3JTJDMy43MTMlMkMwJTJDNS4xMjljMC43MDglMkMwLjcwOCUyQzEuNjM2JTJDMS4wNjIlMkMyLjU2NCUyQzEuMDYyYzAuOTI4JTJDMCUyQzEuODU2LTAuMzU0JTJDMi41NjQtMS4wNjJMNTAuMDglMkM1NS4xM2wxNy44MDMlMkMxNy44MDIlMjAlMjBjMC43MDglMkMwLjcwOCUyQzEuNjM3JTJDMS4wNjIlMkMyLjU2NCUyQzEuMDYyczEuODU2LTAuMzU0JTJDMi41NjQtMS4wNjJjMS40MTYtMS40MTYlMkMxLjQxNi0zLjcxMyUyQzAtNS4xMjlMNTUuMjA5JTJDNTB6JTIyJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIjsKICB9LCA3ODg5OiAoZSkgPT4gewogICAgZS5leHBvcnRzID0gImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmclMjB4bWxucyUzRCUyMmh0dHAlM0EvL3d3dy53My5vcmcvMjAwMC9zdmclMjIlMjB4bWxucyUzQXhsaW5rJTNEJTIyaHR0cCUzQS8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJTIyJTIwdmVyc2lvbiUzRCUyMjEuMSUyMiUyMHglM0QlMjIwcHglMjIlMjB5JTNEJTIyMHB4JTIyJTIwdmlld0JveCUzRCUyMjAlMjAwJTIwOTAlMjA5MCUyMiUyMGVuYWJsZS1iYWNrZ3JvdW5kJTNEJTIybmV3JTIwMCUyMDAlMjA5MCUyMDkwJTIyJTIweG1sJTNBc3BhY2UlM0QlMjJwcmVzZXJ2ZSUyMiUzRSUzQ3BvbHlnb24lMjBwb2ludHMlM0QlMjIwJTJDMCUyMDAlMkMwJTIwMCUyQzAlMjAlMjIlM0UlM0MvcG9seWdvbiUzRSUzQ2clM0UlM0NwYXRoJTIwZCUzRCUyMk03MS41NDUlMkM0OC4xNDVoLTMxLjk4VjIwLjc0M2MwLTIuNjI3LTIuMTM4LTQuNzY1LTQuNzY1LTQuNzY1SDE4LjQ1NmMtMi42MjglMkMwLTQuNzY3JTJDMi4xMzgtNC43NjclMkM0Ljc2NXY0Mi43ODklMjAlMjAlMjBjMCUyQzIuNjI4JTJDMi4xMzglMkM0Ljc2NiUyQzQuNzY3JTJDNC43NjZoNS41MzV2MC45NTljMCUyQzIuNjI4JTJDMi4xMzglMkM0Ljc2NSUyQzQuNzY2JTJDNC43NjVoNDIuNzg4YzIuNjI4JTJDMCUyQzQuNzY2LTIuMTM3JTJDNC43NjYtNC43NjVWNTIuOTE0JTIwJTIwJTIwQzc2LjMxMSUyQzUwLjI4NCUyQzc0LjE3MyUyQzQ4LjE0NSUyQzcxLjU0NSUyQzQ4LjE0NXolMjBNMTguNDU1JTJDMTYuOTM1aDE2LjM0NGMyLjElMkMwJTJDMy44MDglMkMxLjcwOCUyQzMuODA4JTJDMy44MDh2MjcuNDAxSDM3LjI1VjIyLjYzNiUyMCUyMCUyMGMwLTAuMjY0LTAuMjE1LTAuNDc4LTAuNDc5LTAuNDc4SDE2LjQ4MmMtMC4yNjQlMkMwLTAuNDc5JTJDMC4yMTQtMC40NzklMkMwLjQ3OHYzNi41ODVjMCUyQzAuMjY0JTJDMC4yMTUlMkMwLjQ3OCUyQzAuNDc5JTJDMC40NzhoNy41MDd2Ny42NDQlMjAlMjAlMjBoLTUuNTM0Yy0yLjEwMSUyQzAtMy44MS0xLjcwOS0zLjgxLTMuODFWMjAuNzQzQzE0LjY0NSUyQzE4LjY0MyUyQzE2LjM1NCUyQzE2LjkzNSUyQzE4LjQ1NSUyQzE2LjkzNXolMjBNMTYuOTYlMkMyMy4xMTZoMTkuMzMxdjI1LjAzMWgtNy41MzUlMjAlMjAlMjBjLTIuNjI4JTJDMC00Ljc2NiUyQzIuMTM5LTQuNzY2JTJDNC43Njh2NS44MjhoLTcuMDNWMjMuMTE2eiUyME03MS41NDUlMkM3My4wNjRIMjguNzU3Yy0yLjEwMSUyQzAtMy44MS0xLjcwOC0zLjgxLTMuODA4VjUyLjkxNCUyMCUyMCUyMGMwLTIuMTAyJTJDMS43MDktMy44MTIlMkMzLjgxLTMuODEyaDQyLjc4OGMyLjElMkMwJTJDMy44MDklMkMxLjcxJTJDMy44MDklMkMzLjgxMnYxNi4zNDNDNzUuMzU0JTJDNzEuMzU2JTJDNzMuNjQ1JTJDNzMuMDY0JTJDNzEuNTQ1JTJDNzMuMDY0eiUyMiUzRSUzQy9wYXRoJTNFJTNDcGF0aCUyMGQlM0QlMjJNMjguOTE5JTJDNTguNDI0Yy0xLjQ2NiUyQzAtMi42NTklMkMxLjE5My0yLjY1OSUyQzIuNjZjMCUyQzEuNDY2JTJDMS4xOTMlMkMyLjY1OCUyQzIuNjU5JTJDMi42NThjMS40NjglMkMwJTJDMi42NjItMS4xOTIlMkMyLjY2Mi0yLjY1OCUyMCUyMCUyMEMzMS41ODElMkM1OS42MTclMkMzMC4zODclMkM1OC40MjQlMkMyOC45MTklMkM1OC40MjR6JTIwTTI4LjkxOSUyQzYyLjc4NmMtMC45MzklMkMwLTEuNzAzLTAuNzY0LTEuNzAzLTEuNzAyYzAtMC45MzklMkMwLjc2NC0xLjcwNCUyQzEuNzAzLTEuNzA0JTIwJTIwJTIwYzAuOTQlMkMwJTJDMS43MDUlMkMwLjc2NSUyQzEuNzA1JTJDMS43MDRDMzAuNjIzJTJDNjIuMDIyJTJDMjkuODU4JTJDNjIuNzg2JTJDMjguOTE5JTJDNjIuNzg2eiUyMiUzRSUzQy9wYXRoJTNFJTNDcGF0aCUyMGQlM0QlMjJNNjkuNjU0JTJDNTAuNDYxSDMzLjA2OWMtMC4yNjQlMkMwLTAuNDc5JTJDMC4yMTUtMC40NzklMkMwLjQ3OXYyMC4yODhjMCUyQzAuMjY0JTJDMC4yMTUlMkMwLjQ3OCUyQzAuNDc5JTJDMC40NzhoMzYuNTg1JTIwJTIwJTIwYzAuMjYzJTJDMCUyQzAuNDc3LTAuMjE0JTJDMC40NzctMC40NzhWNTAuOTM5QzcwLjEzMSUyQzUwLjY3NiUyQzY5LjkxNyUyQzUwLjQ2MSUyQzY5LjY1NCUyQzUwLjQ2MXolMjBNNjkuMTc0JTJDNTEuNDE3VjcwLjc1SDMzLjU0OFY1MS40MTdINjkuMTc0eiUyMiUzRSUzQy9wYXRoJTNFJTNDcGF0aCUyMGQlM0QlMjJNNDUuMjAxJTJDMzAuMjk2YzYuNjUxJTJDMCUyQzEyLjIzMyUyQzUuMzUxJTJDMTIuNTUxJTJDMTEuOTc3bC0zLjAzMy0yLjYzOGMtMC4xOTMtMC4xNjUtMC41MDctMC4xNDItMC42NzUlMkMwLjA0OCUyMCUyMCUyMGMtMC4xNzQlMkMwLjE5OC0wLjE1MyUyQzAuNTAxJTJDMC4wNDUlMkMwLjY3NmwzLjg4MyUyQzMuMzc1YzAuMDklMkMwLjA3NSUyQzAuMTk4JTJDMC4xMTUlMkMwLjMxMiUyQzAuMTE1YzAuMTQxJTJDMCUyQzAuMjczLTAuMDYxJTJDMC4zNjItMC4xNjYlMjAlMjAlMjBsMy4zNzEtMy44NzdjMC4xNzMtMC4yJTJDMC4xNTEtMC41MDItMC4wNDctMC42NzVjLTAuMTk0LTAuMTY2LTAuNTA4LTAuMTQ0LTAuNjc2JTJDMC4wNDhsLTIuNTkyJTJDMi45NzklMjAlMjAlMjBjLTAuMTgtMy40MTctMS42MjktNi42MDUtNC4wOTktOS4wMDFjLTIuNTM4LTIuNDYxLTUuODc3LTMuODE3LTkuNDA0LTMuODE3Yy0wLjI2NCUyQzAtMC40NzklMkMwLjIxNS0wLjQ3OSUyQzAuNDc5JTIwJTIwJTIwQzQ0LjcyJTJDMzAuMDgzJTJDNDQuOTM2JTJDMzAuMjk2JTJDNDUuMjAxJTJDMzAuMjk2eiUyMiUzRSUzQy9wYXRoJTNFJTNDL2clM0UlM0Mvc3ZnJTNFIjsKICB9IH07CiAgbiA9IHt9OwogIGkubSA9IHQsIGkubiA9IChlKSA9PiB7CiAgICB2YXIgdDIgPSBlICYmIGUuX19lc01vZHVsZSA/ICgpID0+IGUuZGVmYXVsdCA6ICgpID0+IGU7CiAgICByZXR1cm4gaS5kKHQyLCB7IGE6IHQyIH0pLCB0MjsKICB9LCBpLmQgPSAoZSwgdDIpID0+IHsKICAgIGZvciAodmFyIG4yIGluIHQyKQogICAgICBpLm8odDIsIG4yKSAmJiAhaS5vKGUsIG4yKSAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgbjIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiB0MltuMl0gfSk7CiAgfSwgaS5nID0gZnVuY3Rpb24oKSB7CiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT0gIm9iamVjdCIpCiAgICAgIHJldHVybiBnbG9iYWxUaGlzOwogICAgdHJ5IHsKICAgICAgcmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09ICJvYmplY3QiKQogICAgICAgIHJldHVybiB3aW5kb3c7CiAgICB9CiAgfSgpLCBpLm8gPSAoZSwgdDIpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCB0MiksIGkuciA9IChlKSA9PiB7CiAgICB0eXBlb2YgU3ltYm9sICE9ICJ1bmRlZmluZWQiICYmIFN5bWJvbC50b1N0cmluZ1RhZyAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAiTW9kdWxlIiB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICB9LCBpLmIgPSBkb2N1bWVudC5iYXNlVVJJIHx8IHNlbGYubG9jYXRpb24uaHJlZiwgaS5uYyA9IHVuZGVmaW5lZDsKICByID0ge307CiAgaS5kKHIsIHsgQTogKCkgPT4gcWMgfSk7CiAgbyA9IHt9OwogIGkucihvKSwgaS5kKG8sIHsgY29tcHV0ZU1pa2tUU3BhY2VUYW5nZW50czogKCkgPT4gUGUsIGNvbXB1dGVNb3JwaGVkQXR0cmlidXRlczogKCkgPT4gS2UsIGRlZXBDbG9uZUF0dHJpYnV0ZTogKCkgPT4gamUsIGRlaW50ZXJsZWF2ZUF0dHJpYnV0ZTogKCkgPT4gSGUsIGRlaW50ZXJsZWF2ZUdlb21ldHJ5OiAoKSA9PiBxZSwgZXN0aW1hdGVCeXRlc1VzZWQ6ICgpID0+IFZlLCBpbnRlcmxlYXZlQXR0cmlidXRlczogKCkgPT4gX2UsIG1lcmdlQXR0cmlidXRlczogKCkgPT4gTmUsIG1lcmdlR2VvbWV0cmllczogKCkgPT4gR2UsIG1lcmdlR3JvdXBzOiAoKSA9PiBXZSwgbWVyZ2VWZXJ0aWNlczogKCkgPT4gemUsIHRvQ3JlYXNlZE5vcm1hbHM6ICgpID0+IEplLCB0b1RyaWFuZ2xlc0RyYXdNb2RlOiAoKSA9PiBZZSB9KTsKICBzID0ge307CiAgaS5yKHMpLCBpLmQocywgeyBjaGVja0FSU3VwcG9ydDogKCkgPT4geGksIGNoZWNrSGVhZHNldENvbm5lY3RlZDogKCkgPT4gd2ksIGNoZWNrVlJTdXBwb3J0OiAoKSA9PiBRaSwgaXNBcHBsZVZpc2lvblBybzogKCkgPT4gVGksIGlzQnJvd3NlckVudmlyb25tZW50OiAoKSA9PiBqaSwgaXNGaXJlZm94UmVhbGl0eTogKCkgPT4gT2ksIGlzSU9TOiAoKSA9PiBSaSwgaXNJcGFkOiAoKSA9PiBraSwgaXNMYW5kc2NhcGU6ICgpID0+IE5pLCBpc01vYmlsZTogKCkgPT4gU2ksIGlzTW9iaWxlRGV2aWNlUmVxdWVzdGluZ0Rlc2t0b3BTaXRlOiAoKSA9PiBGaSwgaXNNb2JpbGVWUjogKCkgPT4gUGksIGlzTm9kZUVudmlyb25tZW50OiAoKSA9PiBfaSwgaXNPY3VsdXNCcm93c2VyOiAoKSA9PiBVaSwgaXNSNzogKCkgPT4gR2ksIGlzVGFibGV0OiAoKSA9PiBEaSwgaXNXZWJYUkF2YWlsYWJsZTogKCkgPT4gYmkgfSk7CiAgYSA9IHt9OwogIGkucihhKSwgaS5kKGEsIHsgY2xlYXJPYmplY3Q6ICgpID0+IHppLCBjcmVhdGVQb29sOiAoKSA9PiBWaSwgcmVtb3ZlVW51c2VkS2V5czogKCkgPT4gWWkgfSk7CiAgQSA9IHt9OwogIGkucihBKSwgaS5kKEEsIHsgZXF1YWxzOiAoKSA9PiBlciwgaXNDb29yZGluYXRlOiAoKSA9PiBuciwgaXNDb29yZGluYXRlczogKCkgPT4gdHIsIHBhcnNlOiAoKSA9PiBaaSwgcmVnZXg6ICgpID0+IEppLCBzdHJpbmdpZnk6ICgpID0+ICRpLCB0b1ZlY3RvcjM6ICgpID0+IHJyIH0pOwogIGwgPSB7fTsKICBpLnIobCksIGkuZChsLCB7IGdldENvbXBvbmVudFByb3BlcnR5OiAoKSA9PiBhciwgZ2V0Q29tcG9uZW50UHJvcGVydHlQYXRoOiAoKSA9PiBzciwgc2V0Q29tcG9uZW50UHJvcGVydHk6ICgpID0+IEFyIH0pOwogIGMgPSB7fTsKICBpLnIoYyksIGkuZChjLCB7IHBhcnNlVXJsOiAoKSA9PiBnciwgdmFsaWRhdGVDdWJlbWFwU3JjOiAoKSA9PiB1ciwgdmFsaWRhdGVFbnZNYXBTcmM6ICgpID0+IGRyLCB2YWxpZGF0ZVNyYzogKCkgPT4gaHIgfSk7CiAgaCA9IHt9OwogIGkucihoKSwgaS5kKGgsIHsgY3JlYXRlQ29tcGF0aWJsZVRleHR1cmU6ICgpID0+IHhyLCBoYW5kbGVUZXh0dXJlRXZlbnRzOiAoKSA9PiBJciwgaXNDb21wYXRpYmxlVGV4dHVyZTogKCkgPT4gd3IsIHNldFRleHR1cmVQcm9wZXJ0aWVzOiAoKSA9PiBFciwgdXBkYXRlRGlzdG9ydGlvbk1hcDogKCkgPT4gQnIsIHVwZGF0ZUVudk1hcDogKCkgPT4geXIsIHVwZGF0ZU1hcDogKCkgPT4gdnIsIHVwZGF0ZU1hcE1hdGVyaWFsRnJvbURhdGE6ICgpID0+IENyIH0pOwogIGQgPSB7fTsKICBpLnIoZCksIGkuZChkLCB7IHBhcnNlOiAoKSA9PiBMciwgc3RyaW5naWZ5OiAoKSA9PiBNciwgdG9DYW1lbENhc2U6ICgpID0+IFNyIH0pOwogIHUgPSB7fTsKICBpLnIodSksIGkuZCh1LCB7IGNoZWNrQ29udHJvbGxlclByZXNlbnRBbmRTZXR1cDogKCkgPT4gVXIsIGVtaXRJZkF4ZXNDaGFuZ2VkOiAoKSA9PiBHciwgZmluZE1hdGNoaW5nQ29udHJvbGxlcldlYlhSOiAoKSA9PiBQciwgaXNDb250cm9sbGVyUHJlc2VudFdlYlhSOiAoKSA9PiBPciwgb25CdXR0b25FdmVudDogKCkgPT4gTnIgfSk7CiAgZyA9IHt9OwogIGkucihnKSwgaS5kKGcsIHsgYmluZDogKCkgPT4gX3IsIGNoZWNrSGVhZHNldENvbm5lY3RlZDogKCkgPT4gSHIsIGNsb25lOiAoKSA9PiBaciwgY29vcmRpbmF0ZXM6ICgpID0+IEEsIGRlYm91bmNlOiAoKSA9PiBXciwgZGVidWc6ICgpID0+IGZpLCBkZWVwRXF1YWw6ICgpID0+IHRvLCBkZXZpY2U6ICgpID0+IHMsIGRpZmY6ICgpID0+IG5vLCBlbnRpdHk6ICgpID0+IGwsIGV4dGVuZDogKCkgPT4gSnIsIGV4dGVuZERlZXA6ICgpID0+IFhyLCBmaW5kQWxsU2NlbmVzOiAoKSA9PiBBbywgZm9yY2VDYW52YXNSZXNpemVTYWZhcmlNb2JpbGU6ICgpID0+IGxyLCBnZXRFbERhdGE6ICgpID0+IG9vLCBnZXRVcmxQYXJhbWV0ZXI6ICgpID0+IHNvLCBpc0lPUzogKCkgPT4gcXIsIGlzSWZyYW1lZDogKCkgPT4gYW8sIGlzTW9iaWxlOiAoKSA9PiBWciwgbWF0ZXJpYWw6ICgpID0+IGgsIG9iamVjdFBvb2w6ICgpID0+IGEsIHNob3VsZENhcHR1cmVLZXlFdmVudDogKCkgPT4gaW8sIHNwbGl0OiAoKSA9PiBvciwgc3BsaXRTdHJpbmc6ICgpID0+IHJvLCBzcmNMb2FkZXI6ICgpID0+IGMsIHN0eWxlUGFyc2VyOiAoKSA9PiBkLCB0aHJvdHRsZTogKCkgPT4genIsIHRocm90dGxlTGVhZGluZ0FuZFRyYWlsaW5nOiAoKSA9PiBZciwgdGhyb3R0bGVUaWNrOiAoKSA9PiBLciwgdHJhY2tlZENvbnRyb2xzOiAoKSA9PiB1IH0pOwogIHAgPSB7fTsKICBpLnIocCksIGkuZChwLCB7IGlzU2luZ2xlUHJvcGVydHk6ICgpID0+IE5vLCBwYXJzZVByb3BlcnRpZXM6ICgpID0+IHFvLCBwYXJzZVByb3BlcnR5OiAoKSA9PiBWbywgcHJvY2VzczogKCkgPT4gam8sIHByb2Nlc3NQcm9wZXJ0eURlZmluaXRpb246ICgpID0+IF9vLCBzdHJpbmdpZnlQcm9wZXJ0aWVzOiAoKSA9PiB6bywgc3RyaW5naWZ5UHJvcGVydHk6ICgpID0+IFlvIH0pOwogIGYgPSB7fTsKICBpLnIoZiksIGkuZChmLCB7IENvbXBvbmVudDogKCkgPT4gQXMsIGNvbXBvbmVudHM6ICgpID0+IEtvLCByZWdpc3RlckNvbXBvbmVudDogKCkgPT4gY3MsIHJlZ2lzdHJhdGlvbk9yZGVyV2FybmluZ3M6ICgpID0+IGxzIH0pOwogIG0gPSB7fTsKICBpLnIobSksIGkuZChtLCB7IFN5c3RlbTogKCkgPT4gbXMsIHJlZ2lzdGVyU3lzdGVtOiAoKSA9PiBFcywgc3lzdGVtczogKCkgPT4gZnMgfSk7CiAgRSA9IHsgdXBkYXRlOiBudWxsLCBiZWdpbjogbnVsbCwgbG9vcEJlZ2luOiBudWxsLCBjaGFuZ2VCZWdpbjogbnVsbCwgY2hhbmdlOiBudWxsLCBjaGFuZ2VDb21wbGV0ZTogbnVsbCwgbG9vcENvbXBsZXRlOiBudWxsLCBjb21wbGV0ZTogbnVsbCwgbG9vcDogMSwgZGlyZWN0aW9uOiAibm9ybWFsIiwgYXV0b3BsYXk6IHRydWUsIHRpbWVsaW5lT2Zmc2V0OiAwIH07CiAgQyA9IHsgZHVyYXRpb246IDEwMDAsIGRlbGF5OiAwLCBlbmREZWxheTogMCwgZWFzaW5nOiAiZWFzZU91dEVsYXN0aWMoMSwgLjUpIiwgcm91bmQ6IDAgfTsKICB2ID0gWyJ0cmFuc2xhdGVYIiwgInRyYW5zbGF0ZVkiLCAidHJhbnNsYXRlWiIsICJyb3RhdGUiLCAicm90YXRlWCIsICJyb3RhdGVZIiwgInJvdGF0ZVoiLCAic2NhbGUiLCAic2NhbGVYIiwgInNjYWxlWSIsICJzY2FsZVoiLCAic2tldyIsICJza2V3WCIsICJza2V3WSIsICJwZXJzcGVjdGl2ZSJdOwogIEIgPSB7IENTUzoge30sIHNwcmluZ3M6IHt9IH07CiAgdyA9IC8oXiNbMC05QS1GXXs2fSQpfCheI1swLTlBLUZdezN9JCkvaTsKICB4ID0gL15yZ2IvOwogIFEgPSAvXmhzbC87CiAgTCA9IHsgYXJyOiBmdW5jdGlvbihlKSB7CiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShlKTsKICB9LCBvYmo6IGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiB5KE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwgIk9iamVjdCIpOwogIH0sIHB0aDogZnVuY3Rpb24oZSkgewogICAgcmV0dXJuIEwub2JqKGUpICYmIGUuaGFzT3duUHJvcGVydHkoInRvdGFsTGVuZ3RoIik7CiAgfSwgc3ZnOiBmdW5jdGlvbihlKSB7CiAgICByZXR1cm4gZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ7CiAgfSwgaW5wOiBmdW5jdGlvbihlKSB7CiAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQ7CiAgfSwgZG9tOiBmdW5jdGlvbihlKSB7CiAgICByZXR1cm4gZS5ub2RlVHlwZSB8fCBMLnN2ZyhlKTsKICB9LCBzdHI6IGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiB0eXBlb2YgZSA9PSAic3RyaW5nIjsKICB9LCBmbmM6IGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiB0eXBlb2YgZSA9PSAiZnVuY3Rpb24iOwogIH0sIHVuZDogZnVuY3Rpb24oZSkgewogICAgcmV0dXJuIGUgPT09IHVuZGVmaW5lZDsKICB9LCBoZXg6IGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiB3LnRlc3QoZSk7CiAgfSwgcmdiOiBmdW5jdGlvbihlKSB7CiAgICByZXR1cm4geC50ZXN0KGUpOwogIH0sIGhzbDogZnVuY3Rpb24oZSkgewogICAgcmV0dXJuIFEudGVzdChlKTsKICB9LCBjb2w6IGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiBMLmhleChlKSB8fCBMLnJnYihlKSB8fCBMLmhzbChlKTsKICB9LCBrZXk6IGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiAhRS5oYXNPd25Qcm9wZXJ0eShlKSAmJiAhQy5oYXNPd25Qcm9wZXJ0eShlKSAmJiBlICE9PSAidGFyZ2V0cyIgJiYgZSAhPT0gImtleWZyYW1lcyI7CiAgfSB9OwogIE0gPSAvXCgoW14pXSspXCkvOwogIFIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gMC4xOwogICAgZnVuY3Rpb24gdDIoZTIsIHQzKSB7CiAgICAgIHJldHVybiAxIC0gMyAqIHQzICsgMyAqIGUyOwogICAgfQogICAgZnVuY3Rpb24gbjIoZTIsIHQzKSB7CiAgICAgIHJldHVybiAzICogdDMgLSA2ICogZTI7CiAgICB9CiAgICBmdW5jdGlvbiBpMihlMikgewogICAgICByZXR1cm4gMyAqIGUyOwogICAgfQogICAgZnVuY3Rpb24gcjIoZTIsIHIzLCBvMykgewogICAgICByZXR1cm4gKCh0MihyMywgbzMpICogZTIgKyBuMihyMywgbzMpKSAqIGUyICsgaTIocjMpKSAqIGUyOwogICAgfQogICAgZnVuY3Rpb24gbzIoZTIsIHIzLCBvMykgewogICAgICByZXR1cm4gMyAqIHQyKHIzLCBvMykgKiBlMiAqIGUyICsgMiAqIG4yKHIzLCBvMykgKiBlMiArIGkyKHIzKTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbih0MywgbjMsIGkzLCBzMikgewogICAgICBpZiAoMCA8PSB0MyAmJiB0MyA8PSAxICYmIDAgPD0gaTMgJiYgaTMgPD0gMSkgewogICAgICAgIHZhciBhMiA9IG5ldyBGbG9hdDMyQXJyYXkoMTEpOwogICAgICAgIGlmICh0MyAhPT0gbjMgfHwgaTMgIT09IHMyKQogICAgICAgICAgZm9yICh2YXIgQTIgPSAwO0EyIDwgMTE7ICsrQTIpCiAgICAgICAgICAgIGEyW0EyXSA9IHIyKEEyICogZSwgdDMsIGkzKTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oQTMpIHsKICAgICAgICAgIHJldHVybiB0MyA9PT0gbjMgJiYgaTMgPT09IHMyIHx8IEEzID09PSAwIHx8IEEzID09PSAxID8gQTMgOiByMihmdW5jdGlvbihuNCkgewogICAgICAgICAgICBmb3IgKHZhciBzMyA9IDAsIEE0ID0gMTtBNCAhPT0gMTAgJiYgYTJbQTRdIDw9IG40OyArK0E0KQogICAgICAgICAgICAgIHMzICs9IGU7CiAgICAgICAgICAgIC0tQTQ7CiAgICAgICAgICAgIHZhciBsMiA9IHMzICsgKG40IC0gYTJbQTRdKSAvIChhMltBNCArIDFdIC0gYTJbQTRdKSAqIGUsIGMyID0gbzIobDIsIHQzLCBpMyk7CiAgICAgICAgICAgIHJldHVybiBjMiA+PSAwLjAwMSA/IGZ1bmN0aW9uKGUyLCB0NCwgbjUsIGk0KSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgczQgPSAwO3M0IDwgNDsgKytzNCkgewogICAgICAgICAgICAgICAgdmFyIGEzID0gbzIodDQsIG41LCBpNCk7CiAgICAgICAgICAgICAgICBpZiAoYTMgPT09IDApCiAgICAgICAgICAgICAgICAgIHJldHVybiB0NDsKICAgICAgICAgICAgICAgIHQ0IC09IChyMih0NCwgbjUsIGk0KSAtIGUyKSAvIGEzOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gdDQ7CiAgICAgICAgICAgIH0objQsIGwyLCB0MywgaTMpIDogYzIgPT09IDAgPyBsMiA6IGZ1bmN0aW9uKGUyLCB0NCwgbjUsIGk0LCBvMykgewogICAgICAgICAgICAgIHZhciBzNCwgYTMsIEE1ID0gMDsKICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAoczQgPSByMihhMyA9IHQ0ICsgKG41IC0gdDQpIC8gMiwgaTQsIG8zKSAtIGUyKSA+IDAgPyBuNSA9IGEzIDogdDQgPSBhMzsKICAgICAgICAgICAgICB9IHdoaWxlIChNYXRoLmFicyhzNCkgPiAwLjAwMDAwMDEgJiYgKytBNSA8IDEwKTsKICAgICAgICAgICAgICByZXR1cm4gYTM7CiAgICAgICAgICAgIH0objQsIHMzLCBzMyArIGUsIHQzLCBpMyk7CiAgICAgICAgICB9KEEzKSwgbjMsIHMyKTsKICAgICAgICB9OwogICAgICB9CiAgICB9OwogIH0oKTsKICBGID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IFsiUXVhZCIsICJDdWJpYyIsICJRdWFydCIsICJRdWludCIsICJTaW5lIiwgIkV4cG8iLCAiQ2lyYyIsICJCYWNrIiwgIkVsYXN0aWMiXSwgdDIgPSB7IEluOiBbWzAuNTUsIDAuMDg1LCAwLjY4LCAwLjUzXSwgWzAuNTUsIDAuMDU1LCAwLjY3NSwgMC4xOV0sIFswLjg5NSwgMC4wMywgMC42ODUsIDAuMjJdLCBbMC43NTUsIDAuMDUsIDAuODU1LCAwLjA2XSwgWzAuNDcsIDAsIDAuNzQ1LCAwLjcxNV0sIFswLjk1LCAwLjA1LCAwLjc5NSwgMC4wMzVdLCBbMC42LCAwLjA0LCAwLjk4LCAwLjMzNV0sIFswLjYsIC0wLjI4LCAwLjczNSwgMC4wNDVdLCBrXSwgT3V0OiBbWzAuMjUsIDAuNDYsIDAuNDUsIDAuOTRdLCBbMC4yMTUsIDAuNjEsIDAuMzU1LCAxXSwgWzAuMTY1LCAwLjg0LCAwLjQ0LCAxXSwgWzAuMjMsIDEsIDAuMzIsIDFdLCBbMC4zOSwgMC41NzUsIDAuNTY1LCAxXSwgWzAuMTksIDEsIDAuMjIsIDFdLCBbMC4wNzUsIDAuODIsIDAuMTY1LCAxXSwgWzAuMTc1LCAwLjg4NSwgMC4zMiwgMS4yNzVdLCBmdW5jdGlvbihlMiwgdDMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKG4zKSB7CiAgICAgICAgcmV0dXJuIDEgLSBrKGUyLCB0MykoMSAtIG4zKTsKICAgICAgfTsKICAgIH1dLCBJbk91dDogW1swLjQ1NSwgMC4wMywgMC41MTUsIDAuOTU1XSwgWzAuNjQ1LCAwLjA0NSwgMC4zNTUsIDFdLCBbMC43NywgMCwgMC4xNzUsIDFdLCBbMC44NiwgMCwgMC4wNywgMV0sIFswLjQ0NSwgMC4wNSwgMC41NSwgMC45NV0sIFsxLCAwLCAwLCAxXSwgWzAuNzg1LCAwLjEzNSwgMC4xNSwgMC44Nl0sIFswLjY4LCAtMC41NSwgMC4yNjUsIDEuNTVdLCBmdW5jdGlvbihlMiwgdDMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKG4zKSB7CiAgICAgICAgcmV0dXJuIG4zIDwgMC41ID8gayhlMiwgdDMpKDIgKiBuMykgLyAyIDogMSAtIGsoZTIsIHQzKSgtMiAqIG4zICsgMikgLyAyOwogICAgICB9OwogICAgfV0gfSwgbjIgPSB7IGxpbmVhcjogWzAuMjUsIDAuMjUsIDAuNzUsIDAuNzVdIH07CiAgICBmb3IgKHZhciBpMiBpbiB0MikKICAgICAgZm9yICh2YXIgcjIgPSAwLCBvMiA9IHQyW2kyXS5sZW5ndGg7cjIgPCBvMjsgcjIrKykKICAgICAgICBuMlsiZWFzZSIgKyBpMiArIGVbcjJdXSA9IHQyW2kyXVtyMl07CiAgICByZXR1cm4gbjI7CiAgfSgpOwogIFAgPSBbXTsKICB6ID0gL3JnYlwoKFxkKyxccypbXGRdKyxccypbXGRdKylcKS9nOwogIFkgPSAvXiM/KFthLWZcZF0pKFthLWZcZF0pKFthLWZcZF0pJC9pOwogIEsgPSAvXiM/KFthLWZcZF17Mn0pKFthLWZcZF17Mn0pKFthLWZcZF17Mn0pJC9pOwogIFcgPSAvaHNsXCgoXGQrKSxccyooW1xkLl0rKSUsXHMqKFtcZC5dKyklXCkvZzsKICBKID0gL2hzbGFcKChcZCspLFxzKihbXGQuXSspJSxccyooW1xkLl0rKSUsXHMqKFtcZC5dKylcKS9nOwogIFggPSAvKFtcK1wtXT9bMC05I1wuXSspKCV8cHh8cHR8ZW18cmVtfGlufGNtfG1tfGV4fGNofHBjfHZ3fHZofHZtaW58dm1heHxkZWd8cmFkfHR1cm4pPyQvOwogIHJlID0gLyhcdyspXCgoW14pXSopXCkvZzsKICBhZSA9IC9eKFwqPXxcKz18LT0pLzsKICBsZSA9IC9ccy9nOwogIGZlID0gLy0/XGQqXC4/XGQrL2c7CiAgdmUgPSAvXnNwcmluZy87CiAgYmUgPSB7IGNzczogZnVuY3Rpb24oZSwgdDIsIG4yKSB7CiAgICByZXR1cm4gZS5zdHlsZVt0Ml0gPSBuMjsKICB9LCBhdHRyaWJ1dGU6IGZ1bmN0aW9uKGUsIHQyLCBuMikgewogICAgcmV0dXJuIGUuc2V0QXR0cmlidXRlKHQyLCBuMik7CiAgfSwgb2JqZWN0OiBmdW5jdGlvbihlLCB0MiwgbjIpIHsKICAgIHJldHVybiBlW3QyXSA9IG4yOwogIH0sIHRyYW5zZm9ybTogZnVuY3Rpb24oZSwgdDIsIG4yLCBpMiwgcjIpIHsKICAgIGlmIChpMi5saXN0LnNldCh0MiwgbjIpLCB0MiA9PT0gaTIubGFzdCB8fCByMikgewogICAgICB2YXIgbzIgPSAiIjsKICAgICAgaTIubGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUyLCB0MykgewogICAgICAgIG8yICs9IHQzICsgIigiICsgZTIgKyAiKSAiOwogICAgICB9KSwgZS5zdHlsZS50cmFuc2Zvcm0gPSBvMjsKICAgIH0KICB9IH07CiAgTGUgPSBbXTsKICBNZSA9IFtdOwogIFNlID0gZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBlKCkgewogICAgICB4ZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0Mik7CiAgICB9CiAgICBmdW5jdGlvbiB0Mih0MykgewogICAgICB2YXIgbjIgPSBMZS5sZW5ndGg7CiAgICAgIGlmIChuMikgewogICAgICAgIGZvciAodmFyIGkyID0gMDtpMiA8IG4yOyApIHsKICAgICAgICAgIHZhciByMiA9IExlW2kyXTsKICAgICAgICAgIGlmIChyMi5wYXVzZWQpIHsKICAgICAgICAgICAgdmFyIG8yID0gTGUuaW5kZXhPZihyMik7CiAgICAgICAgICAgIG8yID4gLTEgJiYgKExlLnNwbGljZShvMiwgMSksIG4yID0gTGUubGVuZ3RoKTsKICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICByMi50aWNrKHQzKTsKICAgICAgICAgIGkyKys7CiAgICAgICAgfQogICAgICAgIGUoKTsKICAgICAgfSBlbHNlCiAgICAgICAgeGUgPSBjYW5jZWxBbmltYXRpb25GcmFtZSh4ZSk7CiAgICB9CiAgICByZXR1cm4gZTsKICB9KCk7CiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsIGZ1bmN0aW9uKCkgewogICAgaWYgKGRvY3VtZW50LmhpZGRlbikgewogICAgICBmb3IgKHZhciBlID0gMCwgdDIgPSBMZS5sZW5ndGg7ZSA8IHQyOyBlKyspCiAgICAgICAgYWN0aXZlSW5zdGFuY2VbZV0ucGF1c2UoKTsKICAgICAgTWUgPSBMZS5zbGljZSgwKSwgTGUgPSBbXTsKICAgIH0gZWxzZQogICAgICBmb3IgKHZhciBuMiA9IDAsIGkyID0gTWUubGVuZ3RoO24yIDwgaTI7IG4yKyspCiAgICAgICAgTWVbbjJdLnBsYXkoKTsKICB9KSwgRGUudmVyc2lvbiA9ICIzLjAuMCIsIERlLnNwZWVkID0gMSwgRGUucnVubmluZyA9IExlLCBEZS5yZW1vdmUgPSBmdW5jdGlvbihlKSB7CiAgICBmb3IgKHZhciB0MiA9IEVlKGUpLCBuMiA9IExlLmxlbmd0aDtuMi0tOyApIHsKICAgICAgdmFyIGkyID0gTGVbbjJdLCByMiA9IGkyLmFuaW1hdGlvbnMsIG8yID0gaTIuY2hpbGRyZW47CiAgICAgIGtlKHQyLCByMik7CiAgICAgIGZvciAodmFyIHMyID0gbzIubGVuZ3RoO3MyLS07ICkgewogICAgICAgIHZhciBhMiA9IG8yW3MyXSwgQTIgPSBhMi5hbmltYXRpb25zOwogICAgICAgIGtlKHQyLCBBMiksIEEyLmxlbmd0aCB8fCBhMi5jaGlsZHJlbi5sZW5ndGggfHwgbzIuc3BsaWNlKHMyLCAxKTsKICAgICAgfQogICAgICByMi5sZW5ndGggfHwgbzIubGVuZ3RoIHx8IGkyLnBhdXNlKCk7CiAgICB9CiAgfSwgRGUuZ2V0ID0gc2UsIERlLnNldCA9IHllLCBEZS5jb252ZXJ0UHggPSB0ZSwgRGUucGF0aCA9IGZ1bmN0aW9uKGUsIHQyKSB7CiAgICB2YXIgbjIgPSBMLnN0cihlKSA/IE8oZSlbMF0gOiBlLCBpMiA9IHQyIHx8IDEwMDsKICAgIHJldHVybiBmdW5jdGlvbihlMikgewogICAgICByZXR1cm4geyBwcm9wZXJ0eTogZTIsIGVsOiBuMiwgc3ZnOiBnZShuMiksIHRvdGFsTGVuZ3RoOiB1ZShuMikgKiAoaTIgLyAxMDApIH07CiAgICB9OwogIH0sIERlLnNldERhc2hvZmZzZXQgPSBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSB1ZShlKTsKICAgIHJldHVybiBlLnNldEF0dHJpYnV0ZSgic3Ryb2tlLWRhc2hhcnJheSIsIHQyKSwgdDI7CiAgfSwgRGUuc3RhZ2dlciA9IGZ1bmN0aW9uKGUsIHQyKSB7CiAgICB0MiA9PT0gdW5kZWZpbmVkICYmICh0MiA9IHt9KTsKICAgIHZhciBuMiA9IHQyLmRpcmVjdGlvbiB8fCAibm9ybWFsIiwgaTIgPSB0Mi5lYXNpbmcgPyBVKHQyLmVhc2luZykgOiBudWxsLCByMiA9IHQyLmdyaWQsIG8yID0gdDIuYXhpcywgczIgPSB0Mi5mcm9tIHx8IDAsIGEyID0gczIgPT09ICJmaXJzdCIsIEEyID0gczIgPT09ICJjZW50ZXIiLCBsMiA9IHMyID09PSAibGFzdCIsIGMyID0gTC5hcnIoZSksIGgyID0gYzIgPyBwYXJzZUZsb2F0KGVbMF0pIDogcGFyc2VGbG9hdChlKSwgZDIgPSBjMiA/IHBhcnNlRmxvYXQoZVsxXSkgOiAwLCB1MiA9IFooYzIgPyBlWzFdIDogZSkgfHwgMCwgZzIgPSB0Mi5zdGFydCB8fCAwICsgKGMyID8gaDIgOiAwKSwgcDIgPSBbXSwgZjIgPSAwOwogICAgcmV0dXJuIGZ1bmN0aW9uKGUyLCB0MywgbTIpIHsKICAgICAgaWYgKGEyICYmIChzMiA9IDApLCBBMiAmJiAoczIgPSAobTIgLSAxKSAvIDIpLCBsMiAmJiAoczIgPSBtMiAtIDEpLCAhcDIubGVuZ3RoKSB7CiAgICAgICAgZm9yICh2YXIgRTIgPSAwO0UyIDwgbTI7IEUyKyspIHsKICAgICAgICAgIGlmIChyMikgewogICAgICAgICAgICB2YXIgQzIgPSBBMiA/IChyMlswXSAtIDEpIC8gMiA6IHMyICUgcjJbMF0sIHYyID0gQTIgPyAocjJbMV0gLSAxKSAvIDIgOiBNYXRoLmZsb29yKHMyIC8gcjJbMF0pLCBCMiA9IEMyIC0gRTIgJSByMlswXSwgYjIgPSB2MiAtIE1hdGguZmxvb3IoRTIgLyByMlswXSksIHkyID0gTWF0aC5zcXJ0KEIyICogQjIgKyBiMiAqIGIyKTsKICAgICAgICAgICAgbzIgPT09ICJ4IiAmJiAoeTIgPSAtQjIpLCBvMiA9PT0gInkiICYmICh5MiA9IC1iMiksIHAyLnB1c2goeTIpOwogICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHAyLnB1c2goTWF0aC5hYnMoczIgLSBFMikpOwogICAgICAgICAgZjIgPSBNYXRoLm1heC5hcHBseShNYXRoLCBwMik7CiAgICAgICAgfQogICAgICAgIGkyICYmIChwMiA9IHAyLm1hcChmdW5jdGlvbihlMykgewogICAgICAgICAgcmV0dXJuIGkyKGUzIC8gZjIpICogZjI7CiAgICAgICAgfSkpLCBuMiA9PT0gInJldmVyc2UiICYmIChwMiA9IHAyLm1hcChmdW5jdGlvbihlMykgewogICAgICAgICAgcmV0dXJuIG8yID8gZTMgPCAwID8gLTEgKiBlMyA6IC1lMyA6IE1hdGguYWJzKGYyIC0gZTMpOwogICAgICAgIH0pKTsKICAgICAgfQogICAgICByZXR1cm4gZzIgKyAoYzIgPyAoZDIgLSBoMikgLyBmMiA6IGgyKSAqIChNYXRoLnJvdW5kKDEwMCAqIHAyW3QzXSkgLyAxMDApICsgdTI7CiAgICB9OwogIH0sIERlLnRpbWVsaW5lID0gZnVuY3Rpb24oZSkgewogICAgZSA9PT0gdW5kZWZpbmVkICYmIChlID0ge30pOwogICAgdmFyIHQyID0gRGUoZSk7CiAgICByZXR1cm4gdDIuZHVyYXRpb24gPSAwLCB0Mi5hZGQgPSBmdW5jdGlvbihuMiwgaTIpIHsKICAgICAgdmFyIHIyID0gTGUuaW5kZXhPZih0MiksIG8yID0gdDIuY2hpbGRyZW47CiAgICAgIGZ1bmN0aW9uIHMyKGUyKSB7CiAgICAgICAgZTIucGFzc1Rocm91Z2ggPSB0cnVlOwogICAgICB9CiAgICAgIHIyID4gLTEgJiYgTGUuc3BsaWNlKHIyLCAxKTsKICAgICAgZm9yICh2YXIgYTIgPSAwO2EyIDwgbzIubGVuZ3RoOyBhMisrKQogICAgICAgIHMyKG8yW2EyXSk7CiAgICAgIHZhciBBMiA9IFYobjIsIHEoQywgZSkpOwogICAgICBBMi50YXJnZXRzID0gQTIudGFyZ2V0cyB8fCBlLnRhcmdldHM7CiAgICAgIHZhciBsMiA9IHQyLmR1cmF0aW9uOwogICAgICBBMi5hdXRvcGxheSA9IGZhbHNlLCBBMi5kaXJlY3Rpb24gPSB0Mi5kaXJlY3Rpb24sIEEyLnRpbWVsaW5lT2Zmc2V0ID0gTC51bmQoaTIpID8gbDIgOiBBZShpMiwgbDIpLCBzMih0MiksIHQyLnNlZWsoQTIudGltZWxpbmVPZmZzZXQpOwogICAgICB2YXIgYzIgPSBEZShBMik7CiAgICAgIHMyKGMyKSwgbzIucHVzaChjMik7CiAgICAgIHZhciBoMiA9IHdlKG8yLCBlKTsKICAgICAgcmV0dXJuIHQyLmRlbGF5ID0gaDIuZGVsYXksIHQyLmVuZERlbGF5ID0gaDIuZW5kRGVsYXksIHQyLmR1cmF0aW9uID0gaDIuZHVyYXRpb24sIHQyLnNlZWsoMCksIHQyLnJlc2V0KCksIHQyLmF1dG9wbGF5ICYmIHQyLnBsYXkoKSwgdDI7CiAgICB9LCB0MjsKICB9LCBEZS5lYXNpbmcgPSBVLCBEZS5wZW5uZXIgPSBGLCBEZS5yYW5kb20gPSBmdW5jdGlvbihlLCB0MikgewogICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqICh0MiAtIGUgKyAxKSkgKyBlOwogIH07CiAgVGUgPSBEZTsKICBSZSA9IGV4cG9ydHNfdGhyZWVfbW9kdWxlOwogIEZlID0gbmV3IFdlYWtNYXA7CiAgVWUgPSBjbGFzcyBVZSBleHRlbmRzIFJlLkxvYWRlciB7CiAgICBjb25zdHJ1Y3RvcihlKSB7CiAgICAgIHN1cGVyKGUpLCB0aGlzLmRlY29kZXJQYXRoID0gIiIsIHRoaXMuZGVjb2RlckNvbmZpZyA9IHt9LCB0aGlzLmRlY29kZXJCaW5hcnkgPSBudWxsLCB0aGlzLmRlY29kZXJQZW5kaW5nID0gbnVsbCwgdGhpcy53b3JrZXJMaW1pdCA9IDQsIHRoaXMud29ya2VyUG9vbCA9IFtdLCB0aGlzLndvcmtlck5leHRUYXNrSUQgPSAxLCB0aGlzLndvcmtlclNvdXJjZVVSTCA9ICIiLCB0aGlzLmRlZmF1bHRBdHRyaWJ1dGVJRHMgPSB7IHBvc2l0aW9uOiAiUE9TSVRJT04iLCBub3JtYWw6ICJOT1JNQUwiLCBjb2xvcjogIkNPTE9SIiwgdXY6ICJURVhfQ09PUkQiIH0sIHRoaXMuZGVmYXVsdEF0dHJpYnV0ZVR5cGVzID0geyBwb3NpdGlvbjogIkZsb2F0MzJBcnJheSIsIG5vcm1hbDogIkZsb2F0MzJBcnJheSIsIGNvbG9yOiAiRmxvYXQzMkFycmF5IiwgdXY6ICJGbG9hdDMyQXJyYXkiIH07CiAgICB9CiAgICBzZXREZWNvZGVyUGF0aChlKSB7CiAgICAgIHJldHVybiB0aGlzLmRlY29kZXJQYXRoID0gZSwgdGhpczsKICAgIH0KICAgIHNldERlY29kZXJDb25maWcoZSkgewogICAgICByZXR1cm4gdGhpcy5kZWNvZGVyQ29uZmlnID0gZSwgdGhpczsKICAgIH0KICAgIHNldFdvcmtlckxpbWl0KGUpIHsKICAgICAgcmV0dXJuIHRoaXMud29ya2VyTGltaXQgPSBlLCB0aGlzOwogICAgfQogICAgbG9hZChlLCB0MiwgbjIsIGkyKSB7CiAgICAgIGNvbnN0IHIyID0gbmV3IFJlLkZpbGVMb2FkZXIodGhpcy5tYW5hZ2VyKTsKICAgICAgcjIuc2V0UGF0aCh0aGlzLnBhdGgpLCByMi5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIiksIHIyLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSwgcjIuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKSwgcjIubG9hZChlLCAoZTIpID0+IHsKICAgICAgICB0aGlzLnBhcnNlKGUyLCB0MiwgaTIpOwogICAgICB9LCBuMiwgaTIpOwogICAgfQogICAgcGFyc2UoZSwgdDIsIG4yID0gKCkgPT4ge30pIHsKICAgICAgdGhpcy5kZWNvZGVEcmFjb0ZpbGUoZSwgdDIsIG51bGwsIG51bGwsIFJlLlNSR0JDb2xvclNwYWNlLCBuMikuY2F0Y2gobjIpOwogICAgfQogICAgZGVjb2RlRHJhY29GaWxlKGUsIHQyLCBuMiwgaTIsIHIyID0gUmUuTGluZWFyU1JHQkNvbG9yU3BhY2UsIG8yID0gKCkgPT4ge30pIHsKICAgICAgY29uc3QgczIgPSB7IGF0dHJpYnV0ZUlEczogbjIgfHwgdGhpcy5kZWZhdWx0QXR0cmlidXRlSURzLCBhdHRyaWJ1dGVUeXBlczogaTIgfHwgdGhpcy5kZWZhdWx0QXR0cmlidXRlVHlwZXMsIHVzZVVuaXF1ZUlEczogISFuMiwgdmVydGV4Q29sb3JTcGFjZTogcjIgfTsKICAgICAgcmV0dXJuIHRoaXMuZGVjb2RlR2VvbWV0cnkoZSwgczIpLnRoZW4odDIpLmNhdGNoKG8yKTsKICAgIH0KICAgIGRlY29kZUdlb21ldHJ5KGUsIHQyKSB7CiAgICAgIGNvbnN0IG4yID0gSlNPTi5zdHJpbmdpZnkodDIpOwogICAgICBpZiAoRmUuaGFzKGUpKSB7CiAgICAgICAgY29uc3QgdDMgPSBGZS5nZXQoZSk7CiAgICAgICAgaWYgKHQzLmtleSA9PT0gbjIpCiAgICAgICAgICByZXR1cm4gdDMucHJvbWlzZTsKICAgICAgICBpZiAoZS5ieXRlTGVuZ3RoID09PSAwKQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5EUkFDT0xvYWRlcjogVW5hYmxlIHRvIHJlLWRlY29kZSBhIGJ1ZmZlciB3aXRoIGRpZmZlcmVudCBzZXR0aW5ncy4gQnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gdHJhbnNmZXJyZWQuIik7CiAgICAgIH0KICAgICAgbGV0IGkyOwogICAgICBjb25zdCByMiA9IHRoaXMud29ya2VyTmV4dFRhc2tJRCsrLCBvMiA9IGUuYnl0ZUxlbmd0aCwgczIgPSB0aGlzLl9nZXRXb3JrZXIocjIsIG8yKS50aGVuKChuMykgPT4gKGkyID0gbjMsIG5ldyBQcm9taXNlKChuNCwgbzMpID0+IHsKICAgICAgICBpMi5fY2FsbGJhY2tzW3IyXSA9IHsgcmVzb2x2ZTogbjQsIHJlamVjdDogbzMgfSwgaTIucG9zdE1lc3NhZ2UoeyB0eXBlOiAiZGVjb2RlIiwgaWQ6IHIyLCB0YXNrQ29uZmlnOiB0MiwgYnVmZmVyOiBlIH0sIFtlXSk7CiAgICAgIH0pKSkudGhlbigoZTIpID0+IHRoaXMuX2NyZWF0ZUdlb21ldHJ5KGUyLmdlb21ldHJ5KSk7CiAgICAgIHJldHVybiBzMi5jYXRjaCgoKSA9PiB0cnVlKS50aGVuKCgpID0+IHsKICAgICAgICBpMiAmJiByMiAmJiB0aGlzLl9yZWxlYXNlVGFzayhpMiwgcjIpOwogICAgICB9KSwgRmUuc2V0KGUsIHsga2V5OiBuMiwgcHJvbWlzZTogczIgfSksIHMyOwogICAgfQogICAgX2NyZWF0ZUdlb21ldHJ5KGUpIHsKICAgICAgY29uc3QgdDIgPSBuZXcgUmUuQnVmZmVyR2VvbWV0cnk7CiAgICAgIGUuaW5kZXggJiYgdDIuc2V0SW5kZXgobmV3IFJlLkJ1ZmZlckF0dHJpYnV0ZShlLmluZGV4LmFycmF5LCAxKSk7CiAgICAgIGZvciAobGV0IG4yID0gMDtuMiA8IGUuYXR0cmlidXRlcy5sZW5ndGg7IG4yKyspIHsKICAgICAgICBjb25zdCBpMiA9IGUuYXR0cmlidXRlc1tuMl0sIHIyID0gaTIubmFtZSwgbzIgPSBpMi5hcnJheSwgczIgPSBpMi5pdGVtU2l6ZSwgYTIgPSBuZXcgUmUuQnVmZmVyQXR0cmlidXRlKG8yLCBzMik7CiAgICAgICAgcjIgPT09ICJjb2xvciIgJiYgKHRoaXMuX2Fzc2lnblZlcnRleENvbG9yU3BhY2UoYTIsIGkyLnZlcnRleENvbG9yU3BhY2UpLCBhMi5ub3JtYWxpemVkID0gbzIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgPT0gMCksIHQyLnNldEF0dHJpYnV0ZShyMiwgYTIpOwogICAgICB9CiAgICAgIHJldHVybiB0MjsKICAgIH0KICAgIF9hc3NpZ25WZXJ0ZXhDb2xvclNwYWNlKGUsIHQyKSB7CiAgICAgIGlmICh0MiAhPT0gUmUuU1JHQkNvbG9yU3BhY2UpCiAgICAgICAgcmV0dXJuOwogICAgICBjb25zdCBuMiA9IG5ldyBSZS5Db2xvcjsKICAgICAgZm9yIChsZXQgdDMgPSAwLCBpMiA9IGUuY291bnQ7dDMgPCBpMjsgdDMrKykKICAgICAgICBuMi5mcm9tQnVmZmVyQXR0cmlidXRlKGUsIHQzKSwgUmUuQ29sb3JNYW5hZ2VtZW50LnRvV29ya2luZ0NvbG9yU3BhY2UobjIsIFJlLlNSR0JDb2xvclNwYWNlKSwgZS5zZXRYWVoodDMsIG4yLnIsIG4yLmcsIG4yLmIpOwogICAgfQogICAgX2xvYWRMaWJyYXJ5KGUsIHQyKSB7CiAgICAgIGNvbnN0IG4yID0gbmV3IFJlLkZpbGVMb2FkZXIodGhpcy5tYW5hZ2VyKTsKICAgICAgcmV0dXJuIG4yLnNldFBhdGgodGhpcy5kZWNvZGVyUGF0aCksIG4yLnNldFJlc3BvbnNlVHlwZSh0MiksIG4yLnNldFdpdGhDcmVkZW50aWFscyh0aGlzLndpdGhDcmVkZW50aWFscyksIG5ldyBQcm9taXNlKCh0MywgaTIpID0+IHsKICAgICAgICBuMi5sb2FkKGUsIHQzLCB1bmRlZmluZWQsIGkyKTsKICAgICAgfSk7CiAgICB9CiAgICBwcmVsb2FkKCkgewogICAgICByZXR1cm4gdGhpcy5faW5pdERlY29kZXIoKSwgdGhpczsKICAgIH0KICAgIF9pbml0RGVjb2RlcigpIHsKICAgICAgaWYgKHRoaXMuZGVjb2RlclBlbmRpbmcpCiAgICAgICAgcmV0dXJuIHRoaXMuZGVjb2RlclBlbmRpbmc7CiAgICAgIGNvbnN0IGUgPSB0eXBlb2YgV2ViQXNzZW1ibHkgIT0gIm9iamVjdCIgfHwgdGhpcy5kZWNvZGVyQ29uZmlnLnR5cGUgPT09ICJqcyIsIHQyID0gW107CiAgICAgIHJldHVybiBlID8gdDIucHVzaCh0aGlzLl9sb2FkTGlicmFyeSgiZHJhY29fZGVjb2Rlci5qcyIsICJ0ZXh0IikpIDogKHQyLnB1c2godGhpcy5fbG9hZExpYnJhcnkoImRyYWNvX3dhc21fd3JhcHBlci5qcyIsICJ0ZXh0IikpLCB0Mi5wdXNoKHRoaXMuX2xvYWRMaWJyYXJ5KCJkcmFjb19kZWNvZGVyLndhc20iLCAiYXJyYXlidWZmZXIiKSkpLCB0aGlzLmRlY29kZXJQZW5kaW5nID0gUHJvbWlzZS5hbGwodDIpLnRoZW4oKHQzKSA9PiB7CiAgICAgICAgY29uc3QgbjIgPSB0M1swXTsKICAgICAgICBlIHx8ICh0aGlzLmRlY29kZXJDb25maWcud2FzbUJpbmFyeSA9IHQzWzFdKTsKICAgICAgICBjb25zdCBpMiA9IE9lLnRvU3RyaW5nKCksIHIyID0gWyIvKiBkcmFjbyBkZWNvZGVyICovIiwgbjIsICIiLCAiLyogd29ya2VyICovIiwgaTIuc3Vic3RyaW5nKGkyLmluZGV4T2YoInsiKSArIDEsIGkyLmxhc3RJbmRleE9mKCJ9IikpXS5qb2luKGAKYCk7CiAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VVUkwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtyMl0pKTsKICAgICAgfSksIHRoaXMuZGVjb2RlclBlbmRpbmc7CiAgICB9CiAgICBfZ2V0V29ya2VyKGUsIHQyKSB7CiAgICAgIHJldHVybiB0aGlzLl9pbml0RGVjb2RlcigpLnRoZW4oKCkgPT4gewogICAgICAgIGlmICh0aGlzLndvcmtlclBvb2wubGVuZ3RoIDwgdGhpcy53b3JrZXJMaW1pdCkgewogICAgICAgICAgY29uc3QgZTIgPSBuZXcgV29ya2VyKHRoaXMud29ya2VyU291cmNlVVJMKTsKICAgICAgICAgIGUyLl9jYWxsYmFja3MgPSB7fSwgZTIuX3Rhc2tDb3N0cyA9IHt9LCBlMi5fdGFza0xvYWQgPSAwLCBlMi5wb3N0TWVzc2FnZSh7IHR5cGU6ICJpbml0IiwgZGVjb2RlckNvbmZpZzogdGhpcy5kZWNvZGVyQ29uZmlnIH0pLCBlMi5vbm1lc3NhZ2UgPSBmdW5jdGlvbih0MykgewogICAgICAgICAgICBjb25zdCBuMyA9IHQzLmRhdGE7CiAgICAgICAgICAgIHN3aXRjaCAobjMudHlwZSkgewogICAgICAgICAgICAgIGNhc2UgImRlY29kZSI6CiAgICAgICAgICAgICAgICBlMi5fY2FsbGJhY2tzW24zLmlkXS5yZXNvbHZlKG4zKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgImVycm9yIjoKICAgICAgICAgICAgICAgIGUyLl9jYWxsYmFja3NbbjMuaWRdLnJlamVjdChuMyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVEhSRUUuRFJBQ09Mb2FkZXI6IFVuZXhwZWN0ZWQgbWVzc2FnZSwgIicgKyBuMy50eXBlICsgJyInKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgdGhpcy53b3JrZXJQb29sLnB1c2goZTIpOwogICAgICAgIH0gZWxzZQogICAgICAgICAgdGhpcy53b3JrZXJQb29sLnNvcnQoZnVuY3Rpb24oZTIsIHQzKSB7CiAgICAgICAgICAgIHJldHVybiBlMi5fdGFza0xvYWQgPiB0My5fdGFza0xvYWQgPyAtMSA6IDE7CiAgICAgICAgICB9KTsKICAgICAgICBjb25zdCBuMiA9IHRoaXMud29ya2VyUG9vbFt0aGlzLndvcmtlclBvb2wubGVuZ3RoIC0gMV07CiAgICAgICAgcmV0dXJuIG4yLl90YXNrQ29zdHNbZV0gPSB0MiwgbjIuX3Rhc2tMb2FkICs9IHQyLCBuMjsKICAgICAgfSk7CiAgICB9CiAgICBfcmVsZWFzZVRhc2soZSwgdDIpIHsKICAgICAgZS5fdGFza0xvYWQgLT0gZS5fdGFza0Nvc3RzW3QyXSwgZGVsZXRlIGUuX2NhbGxiYWNrc1t0Ml0sIGRlbGV0ZSBlLl90YXNrQ29zdHNbdDJdOwogICAgfQogICAgZGVidWcoKSB7CiAgICAgIGNvbnNvbGUubG9nKCJUYXNrIGxvYWQ6ICIsIHRoaXMud29ya2VyUG9vbC5tYXAoKGUpID0+IGUuX3Rhc2tMb2FkKSk7CiAgICB9CiAgICBkaXNwb3NlKCkgewogICAgICBmb3IgKGxldCBlID0gMDtlIDwgdGhpcy53b3JrZXJQb29sLmxlbmd0aDsgKytlKQogICAgICAgIHRoaXMud29ya2VyUG9vbFtlXS50ZXJtaW5hdGUoKTsKICAgICAgcmV0dXJuIHRoaXMud29ya2VyUG9vbC5sZW5ndGggPSAwLCB0aGlzLndvcmtlclNvdXJjZVVSTCAhPT0gIiIgJiYgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLndvcmtlclNvdXJjZVVSTCksIHRoaXM7CiAgICB9CiAgfTsKICBYZSA9IGNsYXNzIFhlIGV4dGVuZHMgUmUuTG9hZGVyIHsKICAgIGNvbnN0cnVjdG9yKGUpIHsKICAgICAgc3VwZXIoZSksIHRoaXMuZHJhY29Mb2FkZXIgPSBudWxsLCB0aGlzLmt0eDJMb2FkZXIgPSBudWxsLCB0aGlzLm1lc2hvcHREZWNvZGVyID0gbnVsbCwgdGhpcy5wbHVnaW5DYWxsYmFja3MgPSBbXSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgaXQoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgcnQoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgdXQoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgZ3QoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgcHQoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgc3QoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgYXQoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgQXQoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgbHQoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgbnQoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgY3QoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgb3QoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgZHQoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgaHQoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgZXQoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgZnQoZTIpOwogICAgICB9KSwgdGhpcy5yZWdpc3RlcihmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgbXQoZTIpOwogICAgICB9KTsKICAgIH0KICAgIGxvYWQoZSwgdDIsIG4yLCBpMikgewogICAgICBjb25zdCByMiA9IHRoaXM7CiAgICAgIGxldCBvMjsKICAgICAgaWYgKHRoaXMucmVzb3VyY2VQYXRoICE9PSAiIikKICAgICAgICBvMiA9IHRoaXMucmVzb3VyY2VQYXRoOwogICAgICBlbHNlIGlmICh0aGlzLnBhdGggIT09ICIiKSB7CiAgICAgICAgY29uc3QgdDMgPSBSZS5Mb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZShlKTsKICAgICAgICBvMiA9IFJlLkxvYWRlclV0aWxzLnJlc29sdmVVUkwodDMsIHRoaXMucGF0aCk7CiAgICAgIH0gZWxzZQogICAgICAgIG8yID0gUmUuTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoZSk7CiAgICAgIHRoaXMubWFuYWdlci5pdGVtU3RhcnQoZSk7CiAgICAgIGNvbnN0IHMyID0gZnVuY3Rpb24odDMpIHsKICAgICAgICBpMiA/IGkyKHQzKSA6IGNvbnNvbGUuZXJyb3IodDMpLCByMi5tYW5hZ2VyLml0ZW1FcnJvcihlKSwgcjIubWFuYWdlci5pdGVtRW5kKGUpOwogICAgICB9LCBhMiA9IG5ldyBSZS5GaWxlTG9hZGVyKHRoaXMubWFuYWdlcik7CiAgICAgIGEyLnNldFBhdGgodGhpcy5wYXRoKSwgYTIuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLCBhMi5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksIGEyLnNldFdpdGhDcmVkZW50aWFscyh0aGlzLndpdGhDcmVkZW50aWFscyksIGEyLmxvYWQoZSwgZnVuY3Rpb24objMpIHsKICAgICAgICB0cnkgewogICAgICAgICAgcjIucGFyc2UobjMsIG8yLCBmdW5jdGlvbihuNCkgewogICAgICAgICAgICB0MihuNCksIHIyLm1hbmFnZXIuaXRlbUVuZChlKTsKICAgICAgICAgIH0sIHMyKTsKICAgICAgICB9IGNhdGNoIChlMikgewogICAgICAgICAgczIoZTIpOwogICAgICAgIH0KICAgICAgfSwgbjIsIHMyKTsKICAgIH0KICAgIHNldERSQUNPTG9hZGVyKGUpIHsKICAgICAgcmV0dXJuIHRoaXMuZHJhY29Mb2FkZXIgPSBlLCB0aGlzOwogICAgfQogICAgc2V0S1RYMkxvYWRlcihlKSB7CiAgICAgIHJldHVybiB0aGlzLmt0eDJMb2FkZXIgPSBlLCB0aGlzOwogICAgfQogICAgc2V0TWVzaG9wdERlY29kZXIoZSkgewogICAgICByZXR1cm4gdGhpcy5tZXNob3B0RGVjb2RlciA9IGUsIHRoaXM7CiAgICB9CiAgICByZWdpc3RlcihlKSB7CiAgICAgIHJldHVybiB0aGlzLnBsdWdpbkNhbGxiYWNrcy5pbmRleE9mKGUpID09PSAtMSAmJiB0aGlzLnBsdWdpbkNhbGxiYWNrcy5wdXNoKGUpLCB0aGlzOwogICAgfQogICAgdW5yZWdpc3RlcihlKSB7CiAgICAgIHJldHVybiB0aGlzLnBsdWdpbkNhbGxiYWNrcy5pbmRleE9mKGUpICE9PSAtMSAmJiB0aGlzLnBsdWdpbkNhbGxiYWNrcy5zcGxpY2UodGhpcy5wbHVnaW5DYWxsYmFja3MuaW5kZXhPZihlKSwgMSksIHRoaXM7CiAgICB9CiAgICBwYXJzZShlLCB0MiwgbjIsIGkyKSB7CiAgICAgIGxldCByMjsKICAgICAgY29uc3QgbzIgPSB7fSwgczIgPSB7fSwgYTIgPSBuZXcgVGV4dERlY29kZXI7CiAgICAgIGlmICh0eXBlb2YgZSA9PSAic3RyaW5nIikKICAgICAgICByMiA9IEpTT04ucGFyc2UoZSk7CiAgICAgIGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikKICAgICAgICBpZiAoYTIuZGVjb2RlKG5ldyBVaW50OEFycmF5KGUsIDAsIDQpKSA9PT0gRXQpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIG8yWyRlLktIUl9CSU5BUllfR0xURl0gPSBuZXcgQ3QoZSk7CiAgICAgICAgICB9IGNhdGNoIChlMikgewogICAgICAgICAgICByZXR1cm4gdm9pZCAoaTIgJiYgaTIoZTIpKTsKICAgICAgICAgIH0KICAgICAgICAgIHIyID0gSlNPTi5wYXJzZShvMlskZS5LSFJfQklOQVJZX0dMVEZdLmNvbnRlbnQpOwogICAgICAgIH0gZWxzZQogICAgICAgICAgcjIgPSBKU09OLnBhcnNlKGEyLmRlY29kZShlKSk7CiAgICAgIGVsc2UKICAgICAgICByMiA9IGU7CiAgICAgIGlmIChyMi5hc3NldCA9PT0gdW5kZWZpbmVkIHx8IHIyLmFzc2V0LnZlcnNpb25bMF0gPCAyKQogICAgICAgIHJldHVybiB2b2lkIChpMiAmJiBpMihuZXcgRXJyb3IoIlRIUkVFLkdMVEZMb2FkZXI6IFVuc3VwcG9ydGVkIGFzc2V0LiBnbFRGIHZlcnNpb25zID49Mi4wIGFyZSBzdXBwb3J0ZWQuIikpKTsKICAgICAgY29uc3QgQTIgPSBuZXcgX3QocjIsIHsgcGF0aDogdDIgfHwgdGhpcy5yZXNvdXJjZVBhdGggfHwgIiIsIGNyb3NzT3JpZ2luOiB0aGlzLmNyb3NzT3JpZ2luLCByZXF1ZXN0SGVhZGVyOiB0aGlzLnJlcXVlc3RIZWFkZXIsIG1hbmFnZXI6IHRoaXMubWFuYWdlciwga3R4MkxvYWRlcjogdGhpcy5rdHgyTG9hZGVyLCBtZXNob3B0RGVjb2RlcjogdGhpcy5tZXNob3B0RGVjb2RlciB9KTsKICAgICAgQTIuZmlsZUxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlcik7CiAgICAgIGZvciAobGV0IGUyID0gMDtlMiA8IHRoaXMucGx1Z2luQ2FsbGJhY2tzLmxlbmd0aDsgZTIrKykgewogICAgICAgIGNvbnN0IHQzID0gdGhpcy5wbHVnaW5DYWxsYmFja3NbZTJdKEEyKTsKICAgICAgICB0My5uYW1lIHx8IGNvbnNvbGUuZXJyb3IoIlRIUkVFLkdMVEZMb2FkZXI6IEludmFsaWQgcGx1Z2luIGZvdW5kOiBtaXNzaW5nIG5hbWUiKSwgczJbdDMubmFtZV0gPSB0MywgbzJbdDMubmFtZV0gPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChyMi5leHRlbnNpb25zVXNlZCkKICAgICAgICBmb3IgKGxldCBlMiA9IDA7ZTIgPCByMi5leHRlbnNpb25zVXNlZC5sZW5ndGg7ICsrZTIpIHsKICAgICAgICAgIGNvbnN0IHQzID0gcjIuZXh0ZW5zaW9uc1VzZWRbZTJdLCBuMyA9IHIyLmV4dGVuc2lvbnNSZXF1aXJlZCB8fCBbXTsKICAgICAgICAgIHN3aXRjaCAodDMpIHsKICAgICAgICAgICAgY2FzZSAkZS5LSFJfTUFURVJJQUxTX1VOTElUOgogICAgICAgICAgICAgIG8yW3QzXSA9IG5ldyB0dDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAkZS5LSFJfRFJBQ09fTUVTSF9DT01QUkVTU0lPTjoKICAgICAgICAgICAgICBvMlt0M10gPSBuZXcgdnQocjIsIHRoaXMuZHJhY29Mb2FkZXIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICRlLktIUl9URVhUVVJFX1RSQU5TRk9STToKICAgICAgICAgICAgICBvMlt0M10gPSBuZXcgQnQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJGUuS0hSX01FU0hfUVVBTlRJWkFUSU9OOgogICAgICAgICAgICAgIG8yW3QzXSA9IG5ldyBidDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBuMy5pbmRleE9mKHQzKSA+PSAwICYmIHMyW3QzXSA9PT0gdW5kZWZpbmVkICYmIGNvbnNvbGUud2FybignVEhSRUUuR0xURkxvYWRlcjogVW5rbm93biBleHRlbnNpb24gIicgKyB0MyArICciLicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgQTIuc2V0RXh0ZW5zaW9ucyhvMiksIEEyLnNldFBsdWdpbnMoczIpLCBBMi5wYXJzZShuMiwgaTIpOwogICAgfQogICAgcGFyc2VBc3luYyhlLCB0MikgewogICAgICBjb25zdCBuMiA9IHRoaXM7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihpMiwgcjIpIHsKICAgICAgICBuMi5wYXJzZShlLCB0MiwgaTIsIHIyKTsKICAgICAgfSk7CiAgICB9CiAgfTsKICAkZSA9IHsgS0hSX0JJTkFSWV9HTFRGOiAiS0hSX2JpbmFyeV9nbFRGIiwgS0hSX0RSQUNPX01FU0hfQ09NUFJFU1NJT046ICJLSFJfZHJhY29fbWVzaF9jb21wcmVzc2lvbiIsIEtIUl9MSUdIVFNfUFVOQ1RVQUw6ICJLSFJfbGlnaHRzX3B1bmN0dWFsIiwgS0hSX01BVEVSSUFMU19DTEVBUkNPQVQ6ICJLSFJfbWF0ZXJpYWxzX2NsZWFyY29hdCIsIEtIUl9NQVRFUklBTFNfRElTUEVSU0lPTjogIktIUl9tYXRlcmlhbHNfZGlzcGVyc2lvbiIsIEtIUl9NQVRFUklBTFNfSU9SOiAiS0hSX21hdGVyaWFsc19pb3IiLCBLSFJfTUFURVJJQUxTX1NIRUVOOiAiS0hSX21hdGVyaWFsc19zaGVlbiIsIEtIUl9NQVRFUklBTFNfU1BFQ1VMQVI6ICJLSFJfbWF0ZXJpYWxzX3NwZWN1bGFyIiwgS0hSX01BVEVSSUFMU19UUkFOU01JU1NJT046ICJLSFJfbWF0ZXJpYWxzX3RyYW5zbWlzc2lvbiIsIEtIUl9NQVRFUklBTFNfSVJJREVTQ0VOQ0U6ICJLSFJfbWF0ZXJpYWxzX2lyaWRlc2NlbmNlIiwgS0hSX01BVEVSSUFMU19BTklTT1RST1BZOiAiS0hSX21hdGVyaWFsc19hbmlzb3Ryb3B5IiwgS0hSX01BVEVSSUFMU19VTkxJVDogIktIUl9tYXRlcmlhbHNfdW5saXQiLCBLSFJfTUFURVJJQUxTX1ZPTFVNRTogIktIUl9tYXRlcmlhbHNfdm9sdW1lIiwgS0hSX1RFWFRVUkVfQkFTSVNVOiAiS0hSX3RleHR1cmVfYmFzaXN1IiwgS0hSX1RFWFRVUkVfVFJBTlNGT1JNOiAiS0hSX3RleHR1cmVfdHJhbnNmb3JtIiwgS0hSX01FU0hfUVVBTlRJWkFUSU9OOiAiS0hSX21lc2hfcXVhbnRpemF0aW9uIiwgS0hSX01BVEVSSUFMU19FTUlTU0lWRV9TVFJFTkdUSDogIktIUl9tYXRlcmlhbHNfZW1pc3NpdmVfc3RyZW5ndGgiLCBFWFRfTUFURVJJQUxTX0JVTVA6ICJFWFRfbWF0ZXJpYWxzX2J1bXAiLCBFWFRfVEVYVFVSRV9XRUJQOiAiRVhUX3RleHR1cmVfd2VicCIsIEVYVF9URVhUVVJFX0FWSUY6ICJFWFRfdGV4dHVyZV9hdmlmIiwgRVhUX01FU0hPUFRfQ09NUFJFU1NJT046ICJFWFRfbWVzaG9wdF9jb21wcmVzc2lvbiIsIEVYVF9NRVNIX0dQVV9JTlNUQU5DSU5HOiAiRVhUX21lc2hfZ3B1X2luc3RhbmNpbmciIH07CiAgeXQgPSBjbGFzcyB5dCBleHRlbmRzIFJlLkludGVycG9sYW50IHsKICAgIGNvbnN0cnVjdG9yKGUsIHQyLCBuMiwgaTIpIHsKICAgICAgc3VwZXIoZSwgdDIsIG4yLCBpMik7CiAgICB9CiAgICBjb3B5U2FtcGxlVmFsdWVfKGUpIHsKICAgICAgY29uc3QgdDIgPSB0aGlzLnJlc3VsdEJ1ZmZlciwgbjIgPSB0aGlzLnNhbXBsZVZhbHVlcywgaTIgPSB0aGlzLnZhbHVlU2l6ZSwgcjIgPSBlICogaTIgKiAzICsgaTI7CiAgICAgIGZvciAobGV0IGUyID0gMDtlMiAhPT0gaTI7IGUyKyspCiAgICAgICAgdDJbZTJdID0gbjJbcjIgKyBlMl07CiAgICAgIHJldHVybiB0MjsKICAgIH0KICAgIGludGVycG9sYXRlXyhlLCB0MiwgbjIsIGkyKSB7CiAgICAgIGNvbnN0IHIyID0gdGhpcy5yZXN1bHRCdWZmZXIsIG8yID0gdGhpcy5zYW1wbGVWYWx1ZXMsIHMyID0gdGhpcy52YWx1ZVNpemUsIGEyID0gMiAqIHMyLCBBMiA9IDMgKiBzMiwgbDIgPSBpMiAtIHQyLCBjMiA9IChuMiAtIHQyKSAvIGwyLCBoMiA9IGMyICogYzIsIGQyID0gaDIgKiBjMiwgdTIgPSBlICogQTIsIGcyID0gdTIgLSBBMiwgcDIgPSAtMiAqIGQyICsgMyAqIGgyLCBmMiA9IGQyIC0gaDIsIG0yID0gMSAtIHAyLCBFMiA9IGYyIC0gaDIgKyBjMjsKICAgICAgZm9yIChsZXQgZTIgPSAwO2UyICE9PSBzMjsgZTIrKykgewogICAgICAgIGNvbnN0IHQzID0gbzJbZzIgKyBlMiArIHMyXSwgbjMgPSBvMltnMiArIGUyICsgYTJdICogbDIsIGkzID0gbzJbdTIgKyBlMiArIHMyXSwgQTMgPSBvMlt1MiArIGUyXSAqIGwyOwogICAgICAgIHIyW2UyXSA9IG0yICogdDMgKyBFMiAqIG4zICsgcDIgKiBpMyArIGYyICogQTM7CiAgICAgIH0KICAgICAgcmV0dXJuIHIyOwogICAgfQogIH07CiAgSXQgPSBuZXcgUmUuUXVhdGVybmlvbjsKICB3dCA9IGNsYXNzIHd0IGV4dGVuZHMgeXQgewogICAgaW50ZXJwb2xhdGVfKGUsIHQyLCBuMiwgaTIpIHsKICAgICAgY29uc3QgcjIgPSBzdXBlci5pbnRlcnBvbGF0ZV8oZSwgdDIsIG4yLCBpMik7CiAgICAgIHJldHVybiBJdC5mcm9tQXJyYXkocjIpLm5vcm1hbGl6ZSgpLnRvQXJyYXkocjIpLCByMjsKICAgIH0KICB9OwogIHh0ID0geyBGTE9BVDogNTEyNiwgRkxPQVRfTUFUMzogMzU2NzUsIEZMT0FUX01BVDQ6IDM1Njc2LCBGTE9BVF9WRUMyOiAzNTY2NCwgRkxPQVRfVkVDMzogMzU2NjUsIEZMT0FUX1ZFQzQ6IDM1NjY2LCBMSU5FQVI6IDk3MjksIFJFUEVBVDogMTA0OTcsIFNBTVBMRVJfMkQ6IDM1Njc4LCBQT0lOVFM6IDAsIExJTkVTOiAxLCBMSU5FX0xPT1A6IDIsIExJTkVfU1RSSVA6IDMsIFRSSUFOR0xFUzogNCwgVFJJQU5HTEVfU1RSSVA6IDUsIFRSSUFOR0xFX0ZBTjogNiwgVU5TSUdORURfQllURTogNTEyMSwgVU5TSUdORURfU0hPUlQ6IDUxMjMgfTsKICBRdCA9IHsgNTEyMDogSW50OEFycmF5LCA1MTIxOiBVaW50OEFycmF5LCA1MTIyOiBJbnQxNkFycmF5LCA1MTIzOiBVaW50MTZBcnJheSwgNTEyNTogVWludDMyQXJyYXksIDUxMjY6IEZsb2F0MzJBcnJheSB9OwogIEx0ID0geyA5NzI4OiBSZS5OZWFyZXN0RmlsdGVyLCA5NzI5OiBSZS5MaW5lYXJGaWx0ZXIsIDk5ODQ6IFJlLk5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyLCA5OTg1OiBSZS5MaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyLCA5OTg2OiBSZS5OZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyLCA5OTg3OiBSZS5MaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIgfTsKICBNdCA9IHsgMzMwNzE6IFJlLkNsYW1wVG9FZGdlV3JhcHBpbmcsIDMzNjQ4OiBSZS5NaXJyb3JlZFJlcGVhdFdyYXBwaW5nLCAxMDQ5NzogUmUuUmVwZWF0V3JhcHBpbmcgfTsKICBTdCA9IHsgU0NBTEFSOiAxLCBWRUMyOiAyLCBWRUMzOiAzLCBWRUM0OiA0LCBNQVQyOiA0LCBNQVQzOiA5LCBNQVQ0OiAxNiB9OwogIER0ID0geyBQT1NJVElPTjogInBvc2l0aW9uIiwgTk9STUFMOiAibm9ybWFsIiwgVEFOR0VOVDogInRhbmdlbnQiLCBURVhDT09SRF8wOiAidXYiLCBURVhDT09SRF8xOiAidXYxIiwgVEVYQ09PUkRfMjogInV2MiIsIFRFWENPT1JEXzM6ICJ1djMiLCBDT0xPUl8wOiAiY29sb3IiLCBXRUlHSFRTXzA6ICJza2luV2VpZ2h0IiwgSk9JTlRTXzA6ICJza2luSW5kZXgiIH07CiAga3QgPSB7IHNjYWxlOiAic2NhbGUiLCB0cmFuc2xhdGlvbjogInBvc2l0aW9uIiwgcm90YXRpb246ICJxdWF0ZXJuaW9uIiwgd2VpZ2h0czogIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIgfTsKICBUdCA9IHsgQ1VCSUNTUExJTkU6IHVuZGVmaW5lZCwgTElORUFSOiBSZS5JbnRlcnBvbGF0ZUxpbmVhciwgU1RFUDogUmUuSW50ZXJwb2xhdGVEaXNjcmV0ZSB9OwogIGp0ID0gbmV3IFJlLk1hdHJpeDQ7CiAgbmV3IFVpbnQ4QXJyYXkoWzBdKTsKICBsbiA9IFsxNzEsIDc1LCA4NCwgODgsIDMyLCA1MCwgNDgsIDE4NywgMTMsIDEwLCAyNiwgMTBdOwogIGhuID0gaSg5OTIyKS5ocDsKICBwbiA9IHsgZW52OiB7IGVtc2NyaXB0ZW5fbm90aWZ5X21lbW9yeV9ncm93dGg6IGZ1bmN0aW9uKGUpIHsKICAgIGduID0gbmV3IFVpbnQ4QXJyYXkodW4uZXhwb3J0cy5tZW1vcnkuYnVmZmVyKTsKICB9IH0gfTsKICBFbiA9IChSZS5TUkdCVHJhbnNmZXIsIFJlLkxpbmVhclRyYW5zZmVyLCBSZS5MaW5lYXJUcmFuc2ZlciwgbmV3IFdlYWtNYXApOwogIEJuID0gY2xhc3MgQm4gZXh0ZW5kcyBSZS5Mb2FkZXIgewogICAgY29uc3RydWN0b3IoZSkgewogICAgICBzdXBlcihlKSwgdGhpcy50cmFuc2NvZGVyUGF0aCA9ICIiLCB0aGlzLnRyYW5zY29kZXJCaW5hcnkgPSBudWxsLCB0aGlzLnRyYW5zY29kZXJQZW5kaW5nID0gbnVsbCwgdGhpcy53b3JrZXJQb29sID0gbmV3IHF0LCB0aGlzLndvcmtlclNvdXJjZVVSTCA9ICIiLCB0aGlzLndvcmtlckNvbmZpZyA9IG51bGwsIHR5cGVvZiBNU0NfVFJBTlNDT0RFUiAhPSAidW5kZWZpbmVkIiAmJiBjb25zb2xlLndhcm4oJ1RIUkVFLktUWDJMb2FkZXI6IFBsZWFzZSB1cGRhdGUgdG8gbGF0ZXN0ICJiYXNpc190cmFuc2NvZGVyIi4gIm1zY19iYXNpc190cmFuc2NvZGVyIiBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIHRocmVlLmpzIHIxMjUrLicpOwogICAgfQogICAgc2V0VHJhbnNjb2RlclBhdGgoZSkgewogICAgICByZXR1cm4gdGhpcy50cmFuc2NvZGVyUGF0aCA9IGUsIHRoaXM7CiAgICB9CiAgICBzZXRXb3JrZXJMaW1pdChlKSB7CiAgICAgIHJldHVybiB0aGlzLndvcmtlclBvb2wuc2V0V29ya2VyTGltaXQoZSksIHRoaXM7CiAgICB9CiAgICBhc3luYyBkZXRlY3RTdXBwb3J0QXN5bmMoZSkgewogICAgICByZXR1cm4gdGhpcy53b3JrZXJDb25maWcgPSB7IGFzdGNTdXBwb3J0ZWQ6IGF3YWl0IGUuaGFzRmVhdHVyZUFzeW5jKCJ0ZXh0dXJlLWNvbXByZXNzaW9uLWFzdGMiKSwgYXN0Y0hEUlN1cHBvcnRlZDogZmFsc2UsIGV0YzFTdXBwb3J0ZWQ6IGF3YWl0IGUuaGFzRmVhdHVyZUFzeW5jKCJ0ZXh0dXJlLWNvbXByZXNzaW9uLWV0YzEiKSwgZXRjMlN1cHBvcnRlZDogYXdhaXQgZS5oYXNGZWF0dXJlQXN5bmMoInRleHR1cmUtY29tcHJlc3Npb24tZXRjMiIpLCBkeHRTdXBwb3J0ZWQ6IGF3YWl0IGUuaGFzRmVhdHVyZUFzeW5jKCJ0ZXh0dXJlLWNvbXByZXNzaW9uLWJjIiksIGJwdGNTdXBwb3J0ZWQ6IGF3YWl0IGUuaGFzRmVhdHVyZUFzeW5jKCJ0ZXh0dXJlLWNvbXByZXNzaW9uLWJwdGMiKSwgcHZydGNTdXBwb3J0ZWQ6IGF3YWl0IGUuaGFzRmVhdHVyZUFzeW5jKCJ0ZXh0dXJlLWNvbXByZXNzaW9uLXB2cnRjIikgfSwgdGhpczsKICAgIH0KICAgIGRldGVjdFN1cHBvcnQoZSkgewogICAgICByZXR1cm4gZS5pc1dlYkdQVVJlbmRlcmVyID09PSB0cnVlID8gdGhpcy53b3JrZXJDb25maWcgPSB7IGFzdGNTdXBwb3J0ZWQ6IGUuaGFzRmVhdHVyZSgidGV4dHVyZS1jb21wcmVzc2lvbi1hc3RjIiksIGFzdGNIRFJTdXBwb3J0ZWQ6IGZhbHNlLCBldGMxU3VwcG9ydGVkOiBlLmhhc0ZlYXR1cmUoInRleHR1cmUtY29tcHJlc3Npb24tZXRjMSIpLCBldGMyU3VwcG9ydGVkOiBlLmhhc0ZlYXR1cmUoInRleHR1cmUtY29tcHJlc3Npb24tZXRjMiIpLCBkeHRTdXBwb3J0ZWQ6IGUuaGFzRmVhdHVyZSgidGV4dHVyZS1jb21wcmVzc2lvbi1iYyIpLCBicHRjU3VwcG9ydGVkOiBlLmhhc0ZlYXR1cmUoInRleHR1cmUtY29tcHJlc3Npb24tYnB0YyIpLCBwdnJ0Y1N1cHBvcnRlZDogZS5oYXNGZWF0dXJlKCJ0ZXh0dXJlLWNvbXByZXNzaW9uLXB2cnRjIikgfSA6IHRoaXMud29ya2VyQ29uZmlnID0geyBhc3RjU3VwcG9ydGVkOiBlLmV4dGVuc2lvbnMuaGFzKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXN0YyIpLCBhc3RjSERSU3VwcG9ydGVkOiBlLmV4dGVuc2lvbnMuaGFzKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXN0YyIpICYmIGUuZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjIikuZ2V0U3VwcG9ydGVkUHJvZmlsZXMoKS5pbmNsdWRlcygiaGRyIiksIGV0YzFTdXBwb3J0ZWQ6IGUuZXh0ZW5zaW9ucy5oYXMoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxIiksIGV0YzJTdXBwb3J0ZWQ6IGUuZXh0ZW5zaW9ucy5oYXMoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMiKSwgZHh0U3VwcG9ydGVkOiBlLmV4dGVuc2lvbnMuaGFzKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpLCBicHRjU3VwcG9ydGVkOiBlLmV4dGVuc2lvbnMuaGFzKCJFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9icHRjIiksIHB2cnRjU3VwcG9ydGVkOiBlLmV4dGVuc2lvbnMuaGFzKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKSB8fCBlLmV4dGVuc2lvbnMuaGFzKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIikgfSwgdGhpczsKICAgIH0KICAgIGluaXQoKSB7CiAgICAgIGlmICghdGhpcy50cmFuc2NvZGVyUGVuZGluZykgewogICAgICAgIGNvbnN0IGUgPSBuZXcgUmUuRmlsZUxvYWRlcih0aGlzLm1hbmFnZXIpOwogICAgICAgIGUuc2V0UGF0aCh0aGlzLnRyYW5zY29kZXJQYXRoKSwgZS5zZXRXaXRoQ3JlZGVudGlhbHModGhpcy53aXRoQ3JlZGVudGlhbHMpOwogICAgICAgIGNvbnN0IHQyID0gZS5sb2FkQXN5bmMoImJhc2lzX3RyYW5zY29kZXIuanMiKSwgbjIgPSBuZXcgUmUuRmlsZUxvYWRlcih0aGlzLm1hbmFnZXIpOwogICAgICAgIG4yLnNldFBhdGgodGhpcy50cmFuc2NvZGVyUGF0aCksIG4yLnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKSwgbjIuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKTsKICAgICAgICBjb25zdCBpMiA9IG4yLmxvYWRBc3luYygiYmFzaXNfdHJhbnNjb2Rlci53YXNtIik7CiAgICAgICAgdGhpcy50cmFuc2NvZGVyUGVuZGluZyA9IFByb21pc2UuYWxsKFt0MiwgaTJdKS50aGVuKChbZTIsIHQzXSkgPT4gewogICAgICAgICAgY29uc3QgbjMgPSBCbi5CYXNpc1dvcmtlci50b1N0cmluZygpLCBpMyA9IFsiLyogY29uc3RhbnRzICovIiwgImxldCBfRW5naW5lRm9ybWF0ID0gIiArIEpTT04uc3RyaW5naWZ5KEJuLkVuZ2luZUZvcm1hdCksICJsZXQgX0VuZ2luZVR5cGUgPSAiICsgSlNPTi5zdHJpbmdpZnkoQm4uRW5naW5lVHlwZSksICJsZXQgX1RyYW5zY29kZXJGb3JtYXQgPSAiICsgSlNPTi5zdHJpbmdpZnkoQm4uVHJhbnNjb2RlckZvcm1hdCksICJsZXQgX0Jhc2lzRm9ybWF0ID0gIiArIEpTT04uc3RyaW5naWZ5KEJuLkJhc2lzRm9ybWF0KSwgIi8qIGJhc2lzX3RyYW5zY29kZXIuanMgKi8iLCBlMiwgIi8qIHdvcmtlciAqLyIsIG4zLnN1YnN0cmluZyhuMy5pbmRleE9mKCJ7IikgKyAxLCBuMy5sYXN0SW5kZXhPZigifSIpKV0uam9pbihgCmApOwogICAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VVUkwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtpM10pKSwgdGhpcy50cmFuc2NvZGVyQmluYXJ5ID0gdDMsIHRoaXMud29ya2VyUG9vbC5zZXRXb3JrZXJDcmVhdG9yKCgpID0+IHsKICAgICAgICAgICAgY29uc3QgZTMgPSBuZXcgV29ya2VyKHRoaXMud29ya2VyU291cmNlVVJMKSwgdDQgPSB0aGlzLnRyYW5zY29kZXJCaW5hcnkuc2xpY2UoMCk7CiAgICAgICAgICAgIHJldHVybiBlMy5wb3N0TWVzc2FnZSh7IHR5cGU6ICJpbml0IiwgY29uZmlnOiB0aGlzLndvcmtlckNvbmZpZywgdHJhbnNjb2RlckJpbmFyeTogdDQgfSwgW3Q0XSksIGUzOwogICAgICAgICAgfSk7CiAgICAgICAgfSksIHZuID4gMCAmJiBjb25zb2xlLndhcm4oIlRIUkVFLktUWDJMb2FkZXI6IE11bHRpcGxlIGFjdGl2ZSBLVFgyIGxvYWRlcnMgbWF5IGNhdXNlIHBlcmZvcm1hbmNlIGlzc3Vlcy4gVXNlIGEgc2luZ2xlIEtUWDJMb2FkZXIgaW5zdGFuY2UsIG9yIGNhbGwgLmRpc3Bvc2UoKSBvbiBvbGQgaW5zdGFuY2VzLiIpLCB2bisrOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnRyYW5zY29kZXJQZW5kaW5nOwogICAgfQogICAgbG9hZChlLCB0MiwgbjIsIGkyKSB7CiAgICAgIGlmICh0aGlzLndvcmtlckNvbmZpZyA9PT0gbnVsbCkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktUWDJMb2FkZXI6IE1pc3NpbmcgaW5pdGlhbGl6YXRpb24gd2l0aCBgLmRldGVjdFN1cHBvcnQoIHJlbmRlcmVyIClgLiIpOwogICAgICBjb25zdCByMiA9IG5ldyBSZS5GaWxlTG9hZGVyKHRoaXMubWFuYWdlcik7CiAgICAgIHIyLnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKSwgcjIuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKSwgcjIubG9hZChlLCAoZTIpID0+IHsKICAgICAgICB0aGlzLnBhcnNlKGUyLCB0MiwgaTIpOwogICAgICB9LCBuMiwgaTIpOwogICAgfQogICAgcGFyc2UoZSwgdDIsIG4yKSB7CiAgICAgIGlmICh0aGlzLndvcmtlckNvbmZpZyA9PT0gbnVsbCkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktUWDJMb2FkZXI6IE1pc3NpbmcgaW5pdGlhbGl6YXRpb24gd2l0aCBgLmRldGVjdFN1cHBvcnQoIHJlbmRlcmVyIClgLiIpOwogICAgICBpZiAoRW4uaGFzKGUpKQogICAgICAgIHJldHVybiBFbi5nZXQoZSkucHJvbWlzZS50aGVuKHQyKS5jYXRjaChuMik7CiAgICAgIHRoaXMuX2NyZWF0ZVRleHR1cmUoZSkudGhlbigoZTIpID0+IHQyID8gdDIoZTIpIDogbnVsbCkuY2F0Y2gobjIpOwogICAgfQogICAgX2NyZWF0ZVRleHR1cmVGcm9tKGUsIHQyKSB7CiAgICAgIGNvbnN0IHsgdHlwZTogbjIsIGVycm9yOiBpMiwgZGF0YTogeyBmYWNlczogcjIsIHdpZHRoOiBvMiwgaGVpZ2h0OiBzMiwgZm9ybWF0OiBhMiwgdHlwZTogQTIsIGRmZEZsYWdzOiBsMiB9IH0gPSBlOwogICAgICBpZiAobjIgPT09ICJlcnJvciIpCiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGkyKTsKICAgICAgbGV0IGMyOwogICAgICBpZiAodDIuZmFjZUNvdW50ID09PSA2KQogICAgICAgIGMyID0gbmV3IFJlLkNvbXByZXNzZWRDdWJlVGV4dHVyZShyMiwgYTIsIEEyKTsKICAgICAgZWxzZSB7CiAgICAgICAgY29uc3QgZTIgPSByMlswXS5taXBtYXBzOwogICAgICAgIGMyID0gdDIubGF5ZXJDb3VudCA+IDEgPyBuZXcgUmUuQ29tcHJlc3NlZEFycmF5VGV4dHVyZShlMiwgbzIsIHMyLCB0Mi5sYXllckNvdW50LCBhMiwgQTIpIDogbmV3IFJlLkNvbXByZXNzZWRUZXh0dXJlKGUyLCBvMiwgczIsIGEyLCBBMik7CiAgICAgIH0KICAgICAgcmV0dXJuIGMyLm1pbkZpbHRlciA9IHIyWzBdLm1pcG1hcHMubGVuZ3RoID09PSAxID8gUmUuTGluZWFyRmlsdGVyIDogUmUuTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyLCBjMi5tYWdGaWx0ZXIgPSBSZS5MaW5lYXJGaWx0ZXIsIGMyLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlLCBjMi5uZWVkc1VwZGF0ZSA9IHRydWUsIGMyLmNvbG9yU3BhY2UgPSB3bih0MiksIGMyLnByZW11bHRpcGx5QWxwaGEgPSAhISgxICYgbDIpLCBjMjsKICAgIH0KICAgIGFzeW5jIF9jcmVhdGVUZXh0dXJlKGUsIHQyID0ge30pIHsKICAgICAgY29uc3QgbjIgPSBmdW5jdGlvbihlMikgewogICAgICAgIGNvbnN0IHQzID0gbmV3IFVpbnQ4QXJyYXkoZTIuYnVmZmVyLCBlMi5ieXRlT2Zmc2V0LCBsbi5sZW5ndGgpOwogICAgICAgIGlmICh0M1swXSAhPT0gbG5bMF0gfHwgdDNbMV0gIT09IGxuWzFdIHx8IHQzWzJdICE9PSBsblsyXSB8fCB0M1szXSAhPT0gbG5bM10gfHwgdDNbNF0gIT09IGxuWzRdIHx8IHQzWzVdICE9PSBsbls1XSB8fCB0M1s2XSAhPT0gbG5bNl0gfHwgdDNbN10gIT09IGxuWzddIHx8IHQzWzhdICE9PSBsbls4XSB8fCB0M1s5XSAhPT0gbG5bOV0gfHwgdDNbMTBdICE9PSBsblsxMF0gfHwgdDNbMTFdICE9PSBsblsxMV0pCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgS1RYIDIuMCBpZGVudGlmaWVyLiIpOwogICAgICAgIGNvbnN0IG4zID0gbmV3IGFuLCBpMyA9IDE3ICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQsIHIzID0gbmV3IEFuKGUyLCBsbi5sZW5ndGgsIGkzLCB0cnVlKTsKICAgICAgICBuMy52a0Zvcm1hdCA9IHIzLl9uZXh0VWludDMyKCksIG4zLnR5cGVTaXplID0gcjMuX25leHRVaW50MzIoKSwgbjMucGl4ZWxXaWR0aCA9IHIzLl9uZXh0VWludDMyKCksIG4zLnBpeGVsSGVpZ2h0ID0gcjMuX25leHRVaW50MzIoKSwgbjMucGl4ZWxEZXB0aCA9IHIzLl9uZXh0VWludDMyKCksIG4zLmxheWVyQ291bnQgPSByMy5fbmV4dFVpbnQzMigpLCBuMy5mYWNlQ291bnQgPSByMy5fbmV4dFVpbnQzMigpOwogICAgICAgIGNvbnN0IG8zID0gcjMuX25leHRVaW50MzIoKTsKICAgICAgICBuMy5zdXBlcmNvbXByZXNzaW9uU2NoZW1lID0gcjMuX25leHRVaW50MzIoKTsKICAgICAgICBjb25zdCBzMiA9IHIzLl9uZXh0VWludDMyKCksIGEyID0gcjMuX25leHRVaW50MzIoKSwgQTIgPSByMy5fbmV4dFVpbnQzMigpLCBsMiA9IHIzLl9uZXh0VWludDMyKCksIGMyID0gcjMuX25leHRVaW50NjQoKSwgaDIgPSByMy5fbmV4dFVpbnQ2NCgpLCBkMiA9IG5ldyBBbihlMiwgbG4ubGVuZ3RoICsgaTMsIDMgKiBvMyAqIDgsIHRydWUpOwogICAgICAgIGZvciAobGV0IHQ0ID0gMDt0NCA8IG8zOyB0NCsrKQogICAgICAgICAgbjMubGV2ZWxzLnB1c2goeyBsZXZlbERhdGE6IG5ldyBVaW50OEFycmF5KGUyLmJ1ZmZlciwgZTIuYnl0ZU9mZnNldCArIGQyLl9uZXh0VWludDY0KCksIGQyLl9uZXh0VWludDY0KCkpLCB1bmNvbXByZXNzZWRCeXRlTGVuZ3RoOiBkMi5fbmV4dFVpbnQ2NCgpIH0pOwogICAgICAgIGNvbnN0IHUyID0gbmV3IEFuKGUyLCBzMiwgYTIsIHRydWUpLCBnMiA9IHsgdmVuZG9ySWQ6IHUyLl9za2lwKDQpLl9uZXh0VWludDE2KCksIGRlc2NyaXB0b3JUeXBlOiB1Mi5fbmV4dFVpbnQxNigpLCB2ZXJzaW9uTnVtYmVyOiB1Mi5fbmV4dFVpbnQxNigpLCBkZXNjcmlwdG9yQmxvY2tTaXplOiB1Mi5fbmV4dFVpbnQxNigpLCBjb2xvck1vZGVsOiB1Mi5fbmV4dFVpbnQ4KCksIGNvbG9yUHJpbWFyaWVzOiB1Mi5fbmV4dFVpbnQ4KCksIHRyYW5zZmVyRnVuY3Rpb246IHUyLl9uZXh0VWludDgoKSwgZmxhZ3M6IHUyLl9uZXh0VWludDgoKSwgdGV4ZWxCbG9ja0RpbWVuc2lvbjogW3UyLl9uZXh0VWludDgoKSwgdTIuX25leHRVaW50OCgpLCB1Mi5fbmV4dFVpbnQ4KCksIHUyLl9uZXh0VWludDgoKV0sIGJ5dGVzUGxhbmU6IFt1Mi5fbmV4dFVpbnQ4KCksIHUyLl9uZXh0VWludDgoKSwgdTIuX25leHRVaW50OCgpLCB1Mi5fbmV4dFVpbnQ4KCksIHUyLl9uZXh0VWludDgoKSwgdTIuX25leHRVaW50OCgpLCB1Mi5fbmV4dFVpbnQ4KCksIHUyLl9uZXh0VWludDgoKV0sIHNhbXBsZXM6IFtdIH0sIHAyID0gKGcyLmRlc2NyaXB0b3JCbG9ja1NpemUgLyA0IC0gNikgLyA0OwogICAgICAgIGZvciAobGV0IGUzID0gMDtlMyA8IHAyOyBlMysrKSB7CiAgICAgICAgICBjb25zdCB0NCA9IHsgYml0T2Zmc2V0OiB1Mi5fbmV4dFVpbnQxNigpLCBiaXRMZW5ndGg6IHUyLl9uZXh0VWludDgoKSwgY2hhbm5lbFR5cGU6IHUyLl9uZXh0VWludDgoKSwgc2FtcGxlUG9zaXRpb246IFt1Mi5fbmV4dFVpbnQ4KCksIHUyLl9uZXh0VWludDgoKSwgdTIuX25leHRVaW50OCgpLCB1Mi5fbmV4dFVpbnQ4KCldLCBzYW1wbGVMb3dlcjogLTEgLyAwLCBzYW1wbGVVcHBlcjogMSAvIDAgfTsKICAgICAgICAgIDY0ICYgdDQuY2hhbm5lbFR5cGUgPyAodDQuc2FtcGxlTG93ZXIgPSB1Mi5fbmV4dEludDMyKCksIHQ0LnNhbXBsZVVwcGVyID0gdTIuX25leHRJbnQzMigpKSA6ICh0NC5zYW1wbGVMb3dlciA9IHUyLl9uZXh0VWludDMyKCksIHQ0LnNhbXBsZVVwcGVyID0gdTIuX25leHRVaW50MzIoKSksIGcyLnNhbXBsZXNbZTNdID0gdDQ7CiAgICAgICAgfQogICAgICAgIG4zLmRhdGFGb3JtYXREZXNjcmlwdG9yLmxlbmd0aCA9IDAsIG4zLmRhdGFGb3JtYXREZXNjcmlwdG9yLnB1c2goZzIpOwogICAgICAgIGNvbnN0IGYyID0gbmV3IEFuKGUyLCBBMiwgbDIsIHRydWUpOwogICAgICAgIGZvciAoO2YyLl9vZmZzZXQgPCBsMjsgKSB7CiAgICAgICAgICBjb25zdCBlMyA9IGYyLl9uZXh0VWludDMyKCksIHQ0ID0gZjIuX3NjYW4oZTMpLCBpNCA9IGNuKHQ0KTsKICAgICAgICAgIGlmIChuMy5rZXlWYWx1ZVtpNF0gPSBmMi5fbmV4dFVpbnQ4QXJyYXkoZTMgLSB0NC5ieXRlTGVuZ3RoIC0gMSksIGk0Lm1hdGNoKC9ea3R4L2kpKSB7CiAgICAgICAgICAgIGNvbnN0IGU0ID0gY24objMua2V5VmFsdWVbaTRdKTsKICAgICAgICAgICAgbjMua2V5VmFsdWVbaTRdID0gZTQuc3Vic3RyaW5nKDAsIGU0Lmxhc3RJbmRleE9mKCJceDAwIikpOwogICAgICAgICAgfQogICAgICAgICAgZjIuX3NraXAoZTMgJSA0ID8gNCAtIGUzICUgNCA6IDApOwogICAgICAgIH0KICAgICAgICBpZiAoaDIgPD0gMCkKICAgICAgICAgIHJldHVybiBuMzsKICAgICAgICBjb25zdCBtMiA9IG5ldyBBbihlMiwgYzIsIGgyLCB0cnVlKSwgRTIgPSBtMi5fbmV4dFVpbnQxNigpLCBDMiA9IG0yLl9uZXh0VWludDE2KCksIHYyID0gbTIuX25leHRVaW50MzIoKSwgQjIgPSBtMi5fbmV4dFVpbnQzMigpLCBiMiA9IG0yLl9uZXh0VWludDMyKCksIHkyID0gbTIuX25leHRVaW50MzIoKSwgSTIgPSBbXTsKICAgICAgICBmb3IgKGxldCBlMyA9IDA7ZTMgPCBvMzsgZTMrKykKICAgICAgICAgIEkyLnB1c2goeyBpbWFnZUZsYWdzOiBtMi5fbmV4dFVpbnQzMigpLCByZ2JTbGljZUJ5dGVPZmZzZXQ6IG0yLl9uZXh0VWludDMyKCksIHJnYlNsaWNlQnl0ZUxlbmd0aDogbTIuX25leHRVaW50MzIoKSwgYWxwaGFTbGljZUJ5dGVPZmZzZXQ6IG0yLl9uZXh0VWludDMyKCksIGFscGhhU2xpY2VCeXRlTGVuZ3RoOiBtMi5fbmV4dFVpbnQzMigpIH0pOwogICAgICAgIGNvbnN0IHcyID0gYzIgKyBtMi5fb2Zmc2V0LCB4MiA9IHcyICsgdjIsIFEyID0geDIgKyBCMiwgTDIgPSBRMiArIGIyLCBNMiA9IG5ldyBVaW50OEFycmF5KGUyLmJ1ZmZlciwgZTIuYnl0ZU9mZnNldCArIHcyLCB2MiksIFMyID0gbmV3IFVpbnQ4QXJyYXkoZTIuYnVmZmVyLCBlMi5ieXRlT2Zmc2V0ICsgeDIsIEIyKSwgRDIgPSBuZXcgVWludDhBcnJheShlMi5idWZmZXIsIGUyLmJ5dGVPZmZzZXQgKyBRMiwgYjIpLCBrMiA9IG5ldyBVaW50OEFycmF5KGUyLmJ1ZmZlciwgZTIuYnl0ZU9mZnNldCArIEwyLCB5Mik7CiAgICAgICAgcmV0dXJuIG4zLmdsb2JhbERhdGEgPSB7IGVuZHBvaW50Q291bnQ6IEUyLCBzZWxlY3RvckNvdW50OiBDMiwgaW1hZ2VEZXNjczogSTIsIGVuZHBvaW50c0RhdGE6IE0yLCBzZWxlY3RvcnNEYXRhOiBTMiwgdGFibGVzRGF0YTogRDIsIGV4dGVuZGVkRGF0YTogazIgfSwgbjM7CiAgICAgIH0obmV3IFVpbnQ4QXJyYXkoZSkpLCBpMiA9IG4yLnZrRm9ybWF0ID09PSBzbiAmJiBuMi5kYXRhRm9ybWF0RGVzY3JpcHRvclswXS5jb2xvck1vZGVsID09PSAxNjc7CiAgICAgIGlmIChuMi52a0Zvcm1hdCAhPT0gMCAmJiAoIWkyIHx8IHRoaXMud29ya2VyQ29uZmlnLmFzdGNIRFJTdXBwb3J0ZWQpKQogICAgICAgIHJldHVybiBhc3luYyBmdW5jdGlvbihlMikgewogICAgICAgICAgY29uc3QgeyB2a0Zvcm1hdDogdDMgfSA9IGUyOwogICAgICAgICAgaWYgKHluW3QzXSA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktUWDJMb2FkZXI6IFVuc3VwcG9ydGVkIHZrRm9ybWF0LiIpOwogICAgICAgICAgbGV0IG4zOwogICAgICAgICAgZTIuc3VwZXJjb21wcmVzc2lvblNjaGVtZSA9PT0gMiAmJiAoQ24gfHwgKENuID0gbmV3IFByb21pc2UoYXN5bmMgKGUzKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHQ0ID0gbmV3IGZuOwogICAgICAgICAgICBhd2FpdCB0NC5pbml0KCksIGUzKHQ0KTsKICAgICAgICAgIH0pKSwgbjMgPSBhd2FpdCBDbik7CiAgICAgICAgICBjb25zdCBpMyA9IFtdOwogICAgICAgICAgZm9yIChsZXQgcjQgPSAwO3I0IDwgZTIubGV2ZWxzLmxlbmd0aDsgcjQrKykgewogICAgICAgICAgICBjb25zdCBvMyA9IE1hdGgubWF4KDEsIGUyLnBpeGVsV2lkdGggPj4gcjQpLCBzMiA9IE1hdGgubWF4KDEsIGUyLnBpeGVsSGVpZ2h0ID4+IHI0KSwgYTIgPSBlMi5waXhlbERlcHRoID8gTWF0aC5tYXgoMSwgZTIucGl4ZWxEZXB0aCA+PiByNCkgOiAwLCBBMiA9IGUyLmxldmVsc1tyNF07CiAgICAgICAgICAgIGxldCBsMiwgYzI7CiAgICAgICAgICAgIGlmIChlMi5zdXBlcmNvbXByZXNzaW9uU2NoZW1lID09PSAwKQogICAgICAgICAgICAgIGwyID0gQTIubGV2ZWxEYXRhOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICBpZiAoZTIuc3VwZXJjb21wcmVzc2lvblNjaGVtZSAhPT0gMikKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVEhSRUUuS1RYMkxvYWRlcjogVW5zdXBwb3J0ZWQgc3VwZXJjb21wcmVzc2lvblNjaGVtZS4iKTsKICAgICAgICAgICAgICBsMiA9IG4zLmRlY29kZShBMi5sZXZlbERhdGEsIEEyLnVuY29tcHJlc3NlZEJ5dGVMZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGMyID0gSW5bdDNdID09PSBSZS5GbG9hdFR5cGUgPyBuZXcgRmxvYXQzMkFycmF5KGwyLmJ1ZmZlciwgbDIuYnl0ZU9mZnNldCwgbDIuYnl0ZUxlbmd0aCAvIEZsb2F0MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVCkgOiBJblt0M10gPT09IFJlLkhhbGZGbG9hdFR5cGUgPyBuZXcgVWludDE2QXJyYXkobDIuYnVmZmVyLCBsMi5ieXRlT2Zmc2V0LCBsMi5ieXRlTGVuZ3RoIC8gVWludDE2QXJyYXkuQllURVNfUEVSX0VMRU1FTlQpIDogbDIsIGkzLnB1c2goeyBkYXRhOiBjMiwgd2lkdGg6IG8zLCBoZWlnaHQ6IHMyLCBkZXB0aDogYTIgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgcjM7CiAgICAgICAgICBpZiAoYm4uaGFzKHluW3QzXSkpCiAgICAgICAgICAgIHIzID0gZTIucGl4ZWxEZXB0aCA9PT0gMCA/IG5ldyBSZS5EYXRhVGV4dHVyZShpM1swXS5kYXRhLCBlMi5waXhlbFdpZHRoLCBlMi5waXhlbEhlaWdodCkgOiBuZXcgUmUuRGF0YTNEVGV4dHVyZShpM1swXS5kYXRhLCBlMi5waXhlbFdpZHRoLCBlMi5waXhlbEhlaWdodCwgZTIucGl4ZWxEZXB0aCk7CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKGUyLnBpeGVsRGVwdGggPiAwKQogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVEhSRUUuS1RYMkxvYWRlcjogVW5zdXBwb3J0ZWQgcGl4ZWxEZXB0aC4iKTsKICAgICAgICAgICAgcjMgPSBuZXcgUmUuQ29tcHJlc3NlZFRleHR1cmUoaTMsIGUyLnBpeGVsV2lkdGgsIGUyLnBpeGVsSGVpZ2h0KSwgcjMubWluRmlsdGVyID0gaTMubGVuZ3RoID09PSAxID8gUmUuTGluZWFyRmlsdGVyIDogUmUuTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyLCByMy5tYWdGaWx0ZXIgPSBSZS5MaW5lYXJGaWx0ZXI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcjMubWlwbWFwcyA9IGkzLCByMy50eXBlID0gSW5bdDNdLCByMy5mb3JtYXQgPSB5blt0M10sIHIzLmNvbG9yU3BhY2UgPSB3bihlMiksIHIzLm5lZWRzVXBkYXRlID0gdHJ1ZSwgUHJvbWlzZS5yZXNvbHZlKHIzKTsKICAgICAgICB9KG4yKTsKICAgICAgY29uc3QgcjIgPSB0MiwgbzIgPSB0aGlzLmluaXQoKS50aGVuKCgpID0+IHRoaXMud29ya2VyUG9vbC5wb3N0TWVzc2FnZSh7IHR5cGU6ICJ0cmFuc2NvZGUiLCBidWZmZXI6IGUsIHRhc2tDb25maWc6IHIyIH0sIFtlXSkpLnRoZW4oKGUyKSA9PiB0aGlzLl9jcmVhdGVUZXh0dXJlRnJvbShlMi5kYXRhLCBuMikpOwogICAgICByZXR1cm4gRW4uc2V0KGUsIHsgcHJvbWlzZTogbzIgfSksIG8yOwogICAgfQogICAgZGlzcG9zZSgpIHsKICAgICAgcmV0dXJuIHRoaXMud29ya2VyUG9vbC5kaXNwb3NlKCksIHRoaXMud29ya2VyU291cmNlVVJMICYmIFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy53b3JrZXJTb3VyY2VVUkwpLCB2bi0tLCB0aGlzOwogICAgfQogIH07CiAgQm4uQmFzaXNGb3JtYXQgPSB7IEVUQzFTOiAwLCBVQVNUQzogMSwgVUFTVENfSERSOiAyIH0sIEJuLlRyYW5zY29kZXJGb3JtYXQgPSB7IEVUQzE6IDAsIEVUQzI6IDEsIEJDMTogMiwgQkMzOiAzLCBCQzQ6IDQsIEJDNTogNSwgQkM3X002X09QQVFVRV9PTkxZOiA2LCBCQzdfTTU6IDcsIFBWUlRDMV80X1JHQjogOCwgUFZSVEMxXzRfUkdCQTogOSwgQVNUQ180eDQ6IDEwLCBBVENfUkdCOiAxMSwgQVRDX1JHQkFfSU5URVJQT0xBVEVEX0FMUEhBOiAxMiwgUkdCQTMyOiAxMywgUkdCNTY1OiAxNCwgQkdSNTY1OiAxNSwgUkdCQTQ0NDQ6IDE2LCBCQzZIOiAyMiwgUkdCX0hBTEY6IDI0LCBSR0JBX0hBTEY6IDI1IH0sIEJuLkVuZ2luZUZvcm1hdCA9IHsgUkdCQUZvcm1hdDogUmUuUkdCQUZvcm1hdCwgUkdCQV9BU1RDXzR4NF9Gb3JtYXQ6IFJlLlJHQkFfQVNUQ180eDRfRm9ybWF0LCBSR0JfQlBUQ19VTlNJR05FRF9Gb3JtYXQ6IFJlLlJHQl9CUFRDX1VOU0lHTkVEX0Zvcm1hdCwgUkdCQV9CUFRDX0Zvcm1hdDogUmUuUkdCQV9CUFRDX0Zvcm1hdCwgUkdCQV9FVEMyX0VBQ19Gb3JtYXQ6IFJlLlJHQkFfRVRDMl9FQUNfRm9ybWF0LCBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQ6IFJlLlJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDVfRm9ybWF0OiBSZS5SR0JBX1MzVENfRFhUNV9Gb3JtYXQsIFJHQl9FVEMxX0Zvcm1hdDogUmUuUkdCX0VUQzFfRm9ybWF0LCBSR0JfRVRDMl9Gb3JtYXQ6IFJlLlJHQl9FVEMyX0Zvcm1hdCwgUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQ6IFJlLlJHQl9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JBX1MzVENfRFhUMV9Gb3JtYXQ6IFJlLlJHQkFfUzNUQ19EWFQxX0Zvcm1hdCB9LCBCbi5FbmdpbmVUeXBlID0geyBVbnNpZ25lZEJ5dGVUeXBlOiBSZS5VbnNpZ25lZEJ5dGVUeXBlLCBIYWxmRmxvYXRUeXBlOiBSZS5IYWxmRmxvYXRUeXBlLCBGbG9hdFR5cGU6IFJlLkZsb2F0VHlwZSB9LCBCbi5CYXNpc1dvcmtlciA9IGZ1bmN0aW9uKCkgewogICAgbGV0IGUsIHQyLCBuMjsKICAgIGNvbnN0IGkyID0gX0VuZ2luZUZvcm1hdCwgcjIgPSBfRW5naW5lVHlwZSwgbzIgPSBfVHJhbnNjb2RlckZvcm1hdCwgczIgPSBfQmFzaXNGb3JtYXQ7CiAgICBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCBmdW5jdGlvbihpMykgewogICAgICBjb25zdCBvMyA9IGkzLmRhdGE7CiAgICAgIHN3aXRjaCAobzMudHlwZSkgewogICAgICAgIGNhc2UgImluaXQiOgogICAgICAgICAgZSA9IG8zLmNvbmZpZywgYTMgPSBvMy50cmFuc2NvZGVyQmluYXJ5LCB0MiA9IG5ldyBQcm9taXNlKChlMikgPT4gewogICAgICAgICAgICBuMiA9IHsgd2FzbUJpbmFyeTogYTMsIG9uUnVudGltZUluaXRpYWxpemVkOiBlMiB9LCBCQVNJUyhuMik7CiAgICAgICAgICB9KS50aGVuKCgpID0+IHsKICAgICAgICAgICAgbjIuaW5pdGlhbGl6ZUJhc2lzKCksIG4yLktUWDJGaWxlID09PSB1bmRlZmluZWQgJiYgY29uc29sZS53YXJuKCJUSFJFRS5LVFgyTG9hZGVyOiBQbGVhc2UgdXBkYXRlIEJhc2lzIFVuaXZlcnNhbCB0cmFuc2NvZGVyLiIpOwogICAgICAgICAgfSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJ0cmFuc2NvZGUiOgogICAgICAgICAgdDIudGhlbigoKSA9PiB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgY29uc3QgeyBmYWNlczogdDMsIGJ1ZmZlcnM6IGk0LCB3aWR0aDogYTQsIGhlaWdodDogaDIsIGhhc0FscGhhOiBkMiwgZm9ybWF0OiB1MiwgdHlwZTogZzIsIGRmZEZsYWdzOiBwMiB9ID0gZnVuY3Rpb24odDQpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGk1ID0gbmV3IG4yLktUWDJGaWxlKG5ldyBVaW50OEFycmF5KHQ0KSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvNCgpIHsKICAgICAgICAgICAgICAgICAgaTUuY2xvc2UoKSwgaTUuZGVsZXRlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWk1LmlzVmFsaWQoKSkKICAgICAgICAgICAgICAgICAgdGhyb3cgbzQoKSwgbmV3IEVycm9yKCJUSFJFRS5LVFgyTG9hZGVyOlx0SW52YWxpZCBvciB1bnN1cHBvcnRlZCAua3R4MiBmaWxlIik7CiAgICAgICAgICAgICAgICBsZXQgYTU7CiAgICAgICAgICAgICAgICBpZiAoaTUuaXNVQVNUQygpKQogICAgICAgICAgICAgICAgICBhNSA9IHMyLlVBU1RDOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoaTUuaXNFVEMxUygpKQogICAgICAgICAgICAgICAgICBhNSA9IHMyLkVUQzFTOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmICghaTUuaXNIRFIoKSkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktUWDJMb2FkZXI6IFVua25vd24gQmFzaXMgZW5jb2RpbmciKTsKICAgICAgICAgICAgICAgICAgYTUgPSBzMi5VQVNUQ19IRFI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBoMyA9IGk1LmdldFdpZHRoKCksIGQzID0gaTUuZ2V0SGVpZ2h0KCksIHUzID0gaTUuZ2V0TGF5ZXJzKCkgfHwgMSwgZzMgPSBpNS5nZXRMZXZlbHMoKSwgcDMgPSBpNS5nZXRGYWNlcygpLCBmMiA9IGk1LmdldEhhc0FscGhhKCksIG0yID0gaTUuZ2V0REZERmxhZ3MoKSwgeyB0cmFuc2NvZGVyRm9ybWF0OiBFMiwgZW5naW5lRm9ybWF0OiBDMiwgZW5naW5lVHlwZTogdjIgfSA9IGZ1bmN0aW9uKHQ1LCBuMywgaTYsIHIzKSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG81ID0gQTJbdDVdOwogICAgICAgICAgICAgICAgICBmb3IgKGxldCBzMyA9IDA7czMgPCBvNS5sZW5ndGg7IHMzKyspIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBhNiA9IG81W3MzXTsKICAgICAgICAgICAgICAgICAgICBpZiAoKCFhNi5pZiB8fCBlW2E2LmlmXSkgJiYgKGE2LmJhc2lzRm9ybWF0LmluY2x1ZGVzKHQ1KSAmJiAhKHIzICYmIGE2LnRyYW5zY29kZXJGb3JtYXQubGVuZ3RoIDwgMikgJiYgKCFhNi5uZWVkc1Bvd2VyT2ZUd28gfHwgbDIobjMpICYmIGwyKGk2KSkpKQogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdHJhbnNjb2RlckZvcm1hdDogYTYudHJhbnNjb2RlckZvcm1hdFtyMyA/IDEgOiAwXSwgZW5naW5lRm9ybWF0OiBhNi5lbmdpbmVGb3JtYXRbcjMgPyAxIDogMF0sIGVuZ2luZVR5cGU6IGE2LmVuZ2luZVR5cGVbMF0gfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktUWDJMb2FkZXI6IEZhaWxlZCB0byBpZGVudGlmeSB0cmFuc2NvZGluZyB0YXJnZXQuIik7CiAgICAgICAgICAgICAgICB9KGE1LCBoMywgZDMsIGYyKTsKICAgICAgICAgICAgICAgIGlmICghaDMgfHwgIWQzIHx8ICFnMykKICAgICAgICAgICAgICAgICAgdGhyb3cgbzQoKSwgbmV3IEVycm9yKCJUSFJFRS5LVFgyTG9hZGVyOlx0SW52YWxpZCB0ZXh0dXJlIik7CiAgICAgICAgICAgICAgICBpZiAoIWk1LnN0YXJ0VHJhbnNjb2RpbmcoKSkKICAgICAgICAgICAgICAgICAgdGhyb3cgbzQoKSwgbmV3IEVycm9yKCJUSFJFRS5LVFgyTG9hZGVyOiAuc3RhcnRUcmFuc2NvZGluZyBmYWlsZWQiKTsKICAgICAgICAgICAgICAgIGNvbnN0IEIyID0gW10sIGIyID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGxldCBlMiA9IDA7ZTIgPCBwMzsgZTIrKykgewogICAgICAgICAgICAgICAgICBjb25zdCB0NSA9IFtdOwogICAgICAgICAgICAgICAgICBmb3IgKGxldCBuMyA9IDA7bjMgPCBnMzsgbjMrKykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHMzID0gW107CiAgICAgICAgICAgICAgICAgICAgbGV0IGE2LCBBMzsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0NiA9IDA7dDYgPCB1MzsgdDYrKykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgbDQgPSBpNS5nZXRJbWFnZUxldmVsSW5mbyhuMywgdDYsIGUyKTsKICAgICAgICAgICAgICAgICAgICAgIGUyICE9PSAwIHx8IG4zICE9PSAwIHx8IHQ2ICE9PSAwIHx8IGw0Lm9yaWdXaWR0aCAlIDQgPT0gMCAmJiBsNC5vcmlnSGVpZ2h0ICUgNCA9PSAwIHx8IGNvbnNvbGUud2FybigiVEhSRUUuS1RYMkxvYWRlcjogRVRDMVMgYW5kIFVBU1RDIHRleHR1cmVzIHNob3VsZCB1c2UgbXVsdGlwbGUtb2YtZm91ciBkaW1lbnNpb25zLiIpLCBnMyA+IDEgPyAoYTYgPSBsNC5vcmlnV2lkdGgsIEEzID0gbDQub3JpZ0hlaWdodCkgOiAoYTYgPSBsNC53aWR0aCwgQTMgPSBsNC5oZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgbGV0IGMzID0gbmV3IFVpbnQ4QXJyYXkoaTUuZ2V0SW1hZ2VUcmFuc2NvZGVkU2l6ZUluQnl0ZXMobjMsIHQ2LCAwLCBFMikpOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgaDQgPSBpNS50cmFuc2NvZGVJbWFnZShjMywgbjMsIHQ2LCBlMiwgRTIsIDAsIC0xLCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICBpZiAodjIgPT09IHIyLkhhbGZGbG9hdFR5cGUgJiYgKGMzID0gbmV3IFVpbnQxNkFycmF5KGMzLmJ1ZmZlciwgYzMuYnl0ZU9mZnNldCwgYzMuYnl0ZUxlbmd0aCAvIFVpbnQxNkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKSksICFoNCkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbzQoKSwgbmV3IEVycm9yKCJUSFJFRS5LVFgyTG9hZGVyOiAudHJhbnNjb2RlSW1hZ2UgZmFpbGVkLiIpOwogICAgICAgICAgICAgICAgICAgICAgczMucHVzaChjMyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IGwzID0gYzIoczMpOwogICAgICAgICAgICAgICAgICAgIHQ1LnB1c2goeyBkYXRhOiBsMywgd2lkdGg6IGE2LCBoZWlnaHQ6IEEzIH0pLCBiMi5wdXNoKGwzLmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgQjIucHVzaCh7IG1pcG1hcHM6IHQ1LCB3aWR0aDogaDMsIGhlaWdodDogZDMsIGZvcm1hdDogQzIsIHR5cGU6IHYyIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG80KCksIHsgZmFjZXM6IEIyLCBidWZmZXJzOiBiMiwgd2lkdGg6IGgzLCBoZWlnaHQ6IGQzLCBoYXNBbHBoYTogZjIsIGRmZEZsYWdzOiBtMiwgZm9ybWF0OiBDMiwgdHlwZTogdjIgfTsKICAgICAgICAgICAgICB9KG8zLmJ1ZmZlcik7CiAgICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7IHR5cGU6ICJ0cmFuc2NvZGUiLCBpZDogbzMuaWQsIGRhdGE6IHsgZmFjZXM6IHQzLCB3aWR0aDogYTQsIGhlaWdodDogaDIsIGhhc0FscGhhOiBkMiwgZm9ybWF0OiB1MiwgdHlwZTogZzIsIGRmZEZsYWdzOiBwMiB9IH0sIGk0KTsKICAgICAgICAgICAgfSBjYXRjaCAoZTIpIHsKICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUyKSwgc2VsZi5wb3N0TWVzc2FnZSh7IHR5cGU6ICJlcnJvciIsIGlkOiBvMy5pZCwgZXJyb3I6IGUyLm1lc3NhZ2UgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICB9CiAgICAgIHZhciBhMzsKICAgIH0pOwogICAgY29uc3QgYTIgPSBbeyBpZjogImFzdGNTdXBwb3J0ZWQiLCBiYXNpc0Zvcm1hdDogW3MyLlVBU1RDXSwgdHJhbnNjb2RlckZvcm1hdDogW28yLkFTVENfNHg0LCBvMi5BU1RDXzR4NF0sIGVuZ2luZUZvcm1hdDogW2kyLlJHQkFfQVNUQ180eDRfRm9ybWF0LCBpMi5SR0JBX0FTVENfNHg0X0Zvcm1hdF0sIGVuZ2luZVR5cGU6IFtyMi5VbnNpZ25lZEJ5dGVUeXBlXSwgcHJpb3JpdHlFVEMxUzogMSAvIDAsIHByaW9yaXR5VUFTVEM6IDEsIG5lZWRzUG93ZXJPZlR3bzogZmFsc2UgfSwgeyBpZjogImJwdGNTdXBwb3J0ZWQiLCBiYXNpc0Zvcm1hdDogW3MyLkVUQzFTLCBzMi5VQVNUQ10sIHRyYW5zY29kZXJGb3JtYXQ6IFtvMi5CQzdfTTUsIG8yLkJDN19NNV0sIGVuZ2luZUZvcm1hdDogW2kyLlJHQkFfQlBUQ19Gb3JtYXQsIGkyLlJHQkFfQlBUQ19Gb3JtYXRdLCBlbmdpbmVUeXBlOiBbcjIuVW5zaWduZWRCeXRlVHlwZV0sIHByaW9yaXR5RVRDMVM6IDMsIHByaW9yaXR5VUFTVEM6IDIsIG5lZWRzUG93ZXJPZlR3bzogZmFsc2UgfSwgeyBpZjogImR4dFN1cHBvcnRlZCIsIGJhc2lzRm9ybWF0OiBbczIuRVRDMVMsIHMyLlVBU1RDXSwgdHJhbnNjb2RlckZvcm1hdDogW28yLkJDMSwgbzIuQkMzXSwgZW5naW5lRm9ybWF0OiBbaTIuUkdCQV9TM1RDX0RYVDFfRm9ybWF0LCBpMi5SR0JBX1MzVENfRFhUNV9Gb3JtYXRdLCBlbmdpbmVUeXBlOiBbcjIuVW5zaWduZWRCeXRlVHlwZV0sIHByaW9yaXR5RVRDMVM6IDQsIHByaW9yaXR5VUFTVEM6IDUsIG5lZWRzUG93ZXJPZlR3bzogZmFsc2UgfSwgeyBpZjogImV0YzJTdXBwb3J0ZWQiLCBiYXNpc0Zvcm1hdDogW3MyLkVUQzFTLCBzMi5VQVNUQ10sIHRyYW5zY29kZXJGb3JtYXQ6IFtvMi5FVEMxLCBvMi5FVEMyXSwgZW5naW5lRm9ybWF0OiBbaTIuUkdCX0VUQzJfRm9ybWF0LCBpMi5SR0JBX0VUQzJfRUFDX0Zvcm1hdF0sIGVuZ2luZVR5cGU6IFtyMi5VbnNpZ25lZEJ5dGVUeXBlXSwgcHJpb3JpdHlFVEMxUzogMSwgcHJpb3JpdHlVQVNUQzogMywgbmVlZHNQb3dlck9mVHdvOiBmYWxzZSB9LCB7IGlmOiAiZXRjMVN1cHBvcnRlZCIsIGJhc2lzRm9ybWF0OiBbczIuRVRDMVMsIHMyLlVBU1RDXSwgdHJhbnNjb2RlckZvcm1hdDogW28yLkVUQzFdLCBlbmdpbmVGb3JtYXQ6IFtpMi5SR0JfRVRDMV9Gb3JtYXRdLCBlbmdpbmVUeXBlOiBbcjIuVW5zaWduZWRCeXRlVHlwZV0sIHByaW9yaXR5RVRDMVM6IDIsIHByaW9yaXR5VUFTVEM6IDQsIG5lZWRzUG93ZXJPZlR3bzogZmFsc2UgfSwgeyBpZjogInB2cnRjU3VwcG9ydGVkIiwgYmFzaXNGb3JtYXQ6IFtzMi5FVEMxUywgczIuVUFTVENdLCB0cmFuc2NvZGVyRm9ybWF0OiBbbzIuUFZSVEMxXzRfUkdCLCBvMi5QVlJUQzFfNF9SR0JBXSwgZW5naW5lRm9ybWF0OiBbaTIuUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQsIGkyLlJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdF0sIGVuZ2luZVR5cGU6IFtyMi5VbnNpZ25lZEJ5dGVUeXBlXSwgcHJpb3JpdHlFVEMxUzogNSwgcHJpb3JpdHlVQVNUQzogNiwgbmVlZHNQb3dlck9mVHdvOiB0cnVlIH0sIHsgaWY6ICJicHRjU3VwcG9ydGVkIiwgYmFzaXNGb3JtYXQ6IFtzMi5VQVNUQ19IRFJdLCB0cmFuc2NvZGVyRm9ybWF0OiBbbzIuQkM2SF0sIGVuZ2luZUZvcm1hdDogW2kyLlJHQl9CUFRDX1VOU0lHTkVEX0Zvcm1hdF0sIGVuZ2luZVR5cGU6IFtyMi5IYWxmRmxvYXRUeXBlXSwgcHJpb3JpdHlIRFI6IDEsIG5lZWRzUG93ZXJPZlR3bzogZmFsc2UgfSwgeyBiYXNpc0Zvcm1hdDogW3MyLkVUQzFTLCBzMi5VQVNUQ10sIHRyYW5zY29kZXJGb3JtYXQ6IFtvMi5SR0JBMzIsIG8yLlJHQkEzMl0sIGVuZ2luZUZvcm1hdDogW2kyLlJHQkFGb3JtYXQsIGkyLlJHQkFGb3JtYXRdLCBlbmdpbmVUeXBlOiBbcjIuVW5zaWduZWRCeXRlVHlwZSwgcjIuVW5zaWduZWRCeXRlVHlwZV0sIHByaW9yaXR5RVRDMVM6IDEwMCwgcHJpb3JpdHlVQVNUQzogMTAwLCBuZWVkc1Bvd2VyT2ZUd286IGZhbHNlIH0sIHsgYmFzaXNGb3JtYXQ6IFtzMi5VQVNUQ19IRFJdLCB0cmFuc2NvZGVyRm9ybWF0OiBbbzIuUkdCQV9IQUxGXSwgZW5naW5lRm9ybWF0OiBbaTIuUkdCQUZvcm1hdF0sIGVuZ2luZVR5cGU6IFtyMi5IYWxmRmxvYXRUeXBlXSwgcHJpb3JpdHlIRFI6IDEwMCwgbmVlZHNQb3dlck9mVHdvOiBmYWxzZSB9XSwgQTIgPSB7IFtzMi5FVEMxU106IGEyLmZpbHRlcigoZTIpID0+IGUyLmJhc2lzRm9ybWF0LmluY2x1ZGVzKHMyLkVUQzFTKSkuc29ydCgoZTIsIHQzKSA9PiBlMi5wcmlvcml0eVVBU1RDIC0gdDMucHJpb3JpdHlVQVNUQyksIFtzMi5VQVNUQ106IGEyLmZpbHRlcigoZTIpID0+IGUyLmJhc2lzRm9ybWF0LmluY2x1ZGVzKHMyLlVBU1RDKSkuc29ydCgoZTIsIHQzKSA9PiBlMi5wcmlvcml0eVVBU1RDIC0gdDMucHJpb3JpdHlVQVNUQyksIFtzMi5VQVNUQ19IRFJdOiBhMi5maWx0ZXIoKGUyKSA9PiBlMi5iYXNpc0Zvcm1hdC5pbmNsdWRlcyhzMi5VQVNUQ19IRFIpKS5zb3J0KChlMiwgdDMpID0+IGUyLnByaW9yaXR5SERSIC0gdDMucHJpb3JpdHlIRFIpIH07CiAgICBmdW5jdGlvbiBsMihlMikgewogICAgICByZXR1cm4gZTIgPD0gMiB8fCAhKGUyICYgZTIgLSAxKSAmJiBlMiAhPT0gMDsKICAgIH0KICAgIGZ1bmN0aW9uIGMyKGUyKSB7CiAgICAgIGlmIChlMi5sZW5ndGggPT09IDEpCiAgICAgICAgcmV0dXJuIGUyWzBdOwogICAgICBsZXQgdDMgPSAwOwogICAgICBmb3IgKGxldCBuNCA9IDA7bjQgPCBlMi5sZW5ndGg7IG40KyspCiAgICAgICAgdDMgKz0gZTJbbjRdLmJ5dGVMZW5ndGg7CiAgICAgIGNvbnN0IG4zID0gbmV3IFVpbnQ4QXJyYXkodDMpOwogICAgICBsZXQgaTMgPSAwOwogICAgICBmb3IgKGxldCB0NCA9IDA7dDQgPCBlMi5sZW5ndGg7IHQ0KyspIHsKICAgICAgICBjb25zdCByMyA9IGUyW3Q0XTsKICAgICAgICBuMy5zZXQocjMsIGkzKSwgaTMgKz0gcjMuYnl0ZUxlbmd0aDsKICAgICAgfQogICAgICByZXR1cm4gbjM7CiAgICB9CiAgfTsKICBibiA9IG5ldyBTZXQoW1JlLlJHQkFGb3JtYXQsIFJlLlJHRm9ybWF0LCBSZS5SZWRGb3JtYXRdKTsKICB5biA9IHsgW25uXTogUmUuUkdCQUZvcm1hdCwgWyR0XTogUmUuUkdCQUZvcm1hdCwgW1d0XTogUmUuUkdCQUZvcm1hdCwgW0p0XTogUmUuUkdCQUZvcm1hdCwgW3RuXTogUmUuUkdGb3JtYXQsIFtadF06IFJlLlJHRm9ybWF0LCBbWXRdOiBSZS5SR0Zvcm1hdCwgW0t0XTogUmUuUkdGb3JtYXQsIFtlbl06IFJlLlJlZEZvcm1hdCwgW1h0XTogUmUuUmVkRm9ybWF0LCBbenRdOiBSZS5SZWRGb3JtYXQsIFtWdF06IFJlLlJlZEZvcm1hdCwgW3NuXTogUmUuUkdCQV9BU1RDXzR4NF9Gb3JtYXQsIFtvbl06IFJlLlJHQkFfQVNUQ182eDZfRm9ybWF0LCBbcm5dOiBSZS5SR0JBX0FTVENfNng2X0Zvcm1hdCB9OwogIEluID0geyBbbm5dOiBSZS5GbG9hdFR5cGUsIFskdF06IFJlLkhhbGZGbG9hdFR5cGUsIFtXdF06IFJlLlVuc2lnbmVkQnl0ZVR5cGUsIFtKdF06IFJlLlVuc2lnbmVkQnl0ZVR5cGUsIFt0bl06IFJlLkZsb2F0VHlwZSwgW1p0XTogUmUuSGFsZkZsb2F0VHlwZSwgW1l0XTogUmUuVW5zaWduZWRCeXRlVHlwZSwgW0t0XTogUmUuVW5zaWduZWRCeXRlVHlwZSwgW2VuXTogUmUuRmxvYXRUeXBlLCBbWHRdOiBSZS5IYWxmRmxvYXRUeXBlLCBbenRdOiBSZS5VbnNpZ25lZEJ5dGVUeXBlLCBbVnRdOiBSZS5VbnNpZ25lZEJ5dGVUeXBlLCBbc25dOiBSZS5IYWxmRmxvYXRUeXBlLCBbb25dOiBSZS5VbnNpZ25lZEJ5dGVUeXBlLCBbcm5dOiBSZS5VbnNpZ25lZEJ5dGVUeXBlIH07CiAgeG4gPSB7IGM6IG51bGwsIHU6IFtuZXcgUmUuVmVjdG9yMywgbmV3IFJlLlZlY3RvcjMsIG5ldyBSZS5WZWN0b3IzXSwgZTogW10gfTsKICBRbiA9IHsgYzogbnVsbCwgdTogW25ldyBSZS5WZWN0b3IzLCBuZXcgUmUuVmVjdG9yMywgbmV3IFJlLlZlY3RvcjNdLCBlOiBbXSB9OwogIExuID0gW1tdLCBbXSwgW11dOwogIE1uID0gW1tdLCBbXSwgW11dOwogIFNuID0gW107CiAgRG4gPSBuZXcgUmUuVmVjdG9yMzsKICBrbiA9IG5ldyBSZS5WZWN0b3IzOwogIFRuID0gbmV3IFJlLlZlY3RvcjM7CiAgUm4gPSBuZXcgUmUuVmVjdG9yMzsKICBGbiA9IG5ldyBSZS5WZWN0b3IzOwogIFVuID0gbmV3IFJlLlZlY3RvcjM7CiAgT24gPSBuZXcgUmUuTWF0cml4MzsKICBQbiA9IG5ldyBSZS5Cb3gzOwogIEduID0gbmV3IFJlLk1hdHJpeDQ7CiAgTm4gPSBuZXcgUmUuTWF0cml4NDsKICBqbiA9IG5ldyBSZS5SYXk7CiAgSG4gPSBuZXcgX247CiAgcW4gPSAvXltvZ11ccyooLispPy87CiAgVm4gPSAvXm10bGxpYiAvOwogIHpuID0gL151c2VtdGwgLzsKICBZbiA9IC9edXNlbWFwIC87CiAgS24gPSAvXHMrLzsKICBXbiA9IG5ldyBSZS5WZWN0b3IzOwogIEpuID0gbmV3IFJlLlZlY3RvcjM7CiAgWG4gPSBuZXcgUmUuVmVjdG9yMzsKICBabiA9IG5ldyBSZS5WZWN0b3IzOwogICRuID0gbmV3IFJlLlZlY3RvcjM7CiAgZWkgPSBuZXcgUmUuQ29sb3I7CiAgbmkgPSBjbGFzcyBuaSBleHRlbmRzIFJlLkxvYWRlciB7CiAgICBjb25zdHJ1Y3RvcihlKSB7CiAgICAgIHN1cGVyKGUpLCB0aGlzLm1hdGVyaWFscyA9IG51bGw7CiAgICB9CiAgICBsb2FkKGUsIHQyLCBuMiwgaTIpIHsKICAgICAgY29uc3QgcjIgPSB0aGlzLCBvMiA9IG5ldyBSZS5GaWxlTG9hZGVyKHRoaXMubWFuYWdlcik7CiAgICAgIG8yLnNldFBhdGgodGhpcy5wYXRoKSwgbzIuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLCBvMi5zZXRXaXRoQ3JlZGVudGlhbHModGhpcy53aXRoQ3JlZGVudGlhbHMpLCBvMi5sb2FkKGUsIGZ1bmN0aW9uKG4zKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHQyKHIyLnBhcnNlKG4zKSk7CiAgICAgICAgfSBjYXRjaCAodDMpIHsKICAgICAgICAgIGkyID8gaTIodDMpIDogY29uc29sZS5lcnJvcih0MyksIHIyLm1hbmFnZXIuaXRlbUVycm9yKGUpOwogICAgICAgIH0KICAgICAgfSwgbjIsIGkyKTsKICAgIH0KICAgIHNldE1hdGVyaWFscyhlKSB7CiAgICAgIHJldHVybiB0aGlzLm1hdGVyaWFscyA9IGUsIHRoaXM7CiAgICB9CiAgICBwYXJzZShlKSB7CiAgICAgIGNvbnN0IHQyID0gbmV3IHRpOwogICAgICBlLmluZGV4T2YoYFxyCmApICE9PSAtMSAmJiAoZSA9IGUucmVwbGFjZSgvXHJcbi9nLCBgCmApKSwgZS5pbmRleE9mKCJcXFxuIikgIT09IC0xICYmIChlID0gZS5yZXBsYWNlKC9cXFxuL2csICIiKSk7CiAgICAgIGNvbnN0IG4yID0gZS5zcGxpdChgCmApOwogICAgICBsZXQgaTIgPSBbXTsKICAgICAgZm9yIChsZXQgZTIgPSAwLCByMyA9IG4yLmxlbmd0aDtlMiA8IHIzOyBlMisrKSB7CiAgICAgICAgY29uc3QgcjQgPSBuMltlMl0udHJpbVN0YXJ0KCk7CiAgICAgICAgaWYgKHI0Lmxlbmd0aCA9PT0gMCkKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNvbnN0IG8yID0gcjQuY2hhckF0KDApOwogICAgICAgIGlmIChvMiAhPT0gIiMiKQogICAgICAgICAgaWYgKG8yID09PSAidiIpIHsKICAgICAgICAgICAgY29uc3QgZTMgPSByNC5zcGxpdChLbik7CiAgICAgICAgICAgIHN3aXRjaCAoZTNbMF0pIHsKICAgICAgICAgICAgICBjYXNlICJ2IjoKICAgICAgICAgICAgICAgIHQyLnZlcnRpY2VzLnB1c2gocGFyc2VGbG9hdChlM1sxXSksIHBhcnNlRmxvYXQoZTNbMl0pLCBwYXJzZUZsb2F0KGUzWzNdKSksIGUzLmxlbmd0aCA+PSA3ID8gKGVpLnNldFJHQihwYXJzZUZsb2F0KGUzWzRdKSwgcGFyc2VGbG9hdChlM1s1XSksIHBhcnNlRmxvYXQoZTNbNl0pLCBSZS5TUkdCQ29sb3JTcGFjZSksIHQyLmNvbG9ycy5wdXNoKGVpLnIsIGVpLmcsIGVpLmIpKSA6IHQyLmNvbG9ycy5wdXNoKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAidm4iOgogICAgICAgICAgICAgICAgdDIubm9ybWFscy5wdXNoKHBhcnNlRmxvYXQoZTNbMV0pLCBwYXJzZUZsb2F0KGUzWzJdKSwgcGFyc2VGbG9hdChlM1szXSkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAidnQiOgogICAgICAgICAgICAgICAgdDIudXZzLnB1c2gocGFyc2VGbG9hdChlM1sxXSksIHBhcnNlRmxvYXQoZTNbMl0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChvMiA9PT0gImYiKSB7CiAgICAgICAgICAgIGNvbnN0IGUzID0gcjQuc2xpY2UoMSkudHJpbSgpLnNwbGl0KEtuKSwgbjMgPSBbXTsKICAgICAgICAgICAgZm9yIChsZXQgdDMgPSAwLCBpNCA9IGUzLmxlbmd0aDt0MyA8IGk0OyB0MysrKSB7CiAgICAgICAgICAgICAgY29uc3QgaTUgPSBlM1t0M107CiAgICAgICAgICAgICAgaWYgKGk1Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IGU0ID0gaTUuc3BsaXQoIi8iKTsKICAgICAgICAgICAgICAgIG4zLnB1c2goZTQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBpMyA9IG4zWzBdOwogICAgICAgICAgICBmb3IgKGxldCBlNCA9IDEsIHI1ID0gbjMubGVuZ3RoIC0gMTtlNCA8IHI1OyBlNCsrKSB7CiAgICAgICAgICAgICAgY29uc3QgcjYgPSBuM1tlNF0sIG8zID0gbjNbZTQgKyAxXTsKICAgICAgICAgICAgICB0Mi5hZGRGYWNlKGkzWzBdLCByNlswXSwgbzNbMF0sIGkzWzFdLCByNlsxXSwgbzNbMV0sIGkzWzJdLCByNlsyXSwgbzNbMl0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKG8yID09PSAibCIpIHsKICAgICAgICAgICAgY29uc3QgZTMgPSByNC5zdWJzdHJpbmcoMSkudHJpbSgpLnNwbGl0KCIgIik7CiAgICAgICAgICAgIGxldCBuMyA9IFtdOwogICAgICAgICAgICBjb25zdCBpMyA9IFtdOwogICAgICAgICAgICBpZiAocjQuaW5kZXhPZigiLyIpID09PSAtMSkKICAgICAgICAgICAgICBuMyA9IGUzOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgZm9yIChsZXQgdDMgPSAwLCByNSA9IGUzLmxlbmd0aDt0MyA8IHI1OyB0MysrKSB7CiAgICAgICAgICAgICAgICBjb25zdCByNiA9IGUzW3QzXS5zcGxpdCgiLyIpOwogICAgICAgICAgICAgICAgcjZbMF0gIT09ICIiICYmIG4zLnB1c2gocjZbMF0pLCByNlsxXSAhPT0gIiIgJiYgaTMucHVzaChyNlsxXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB0Mi5hZGRMaW5lR2VvbWV0cnkobjMsIGkzKTsKICAgICAgICAgIH0gZWxzZSBpZiAobzIgPT09ICJwIikgewogICAgICAgICAgICBjb25zdCBlMyA9IHI0LnNsaWNlKDEpLnRyaW0oKS5zcGxpdCgiICIpOwogICAgICAgICAgICB0Mi5hZGRQb2ludEdlb21ldHJ5KGUzKTsKICAgICAgICAgIH0gZWxzZSBpZiAoKGkyID0gcW4uZXhlYyhyNCkpICE9PSBudWxsKSB7CiAgICAgICAgICAgIGNvbnN0IGUzID0gKCIgIiArIGkyWzBdLnNsaWNlKDEpLnRyaW0oKSkuc2xpY2UoMSk7CiAgICAgICAgICAgIHQyLnN0YXJ0T2JqZWN0KGUzKTsKICAgICAgICAgIH0gZWxzZSBpZiAoem4udGVzdChyNCkpCiAgICAgICAgICAgIHQyLm9iamVjdC5zdGFydE1hdGVyaWFsKHI0LnN1YnN0cmluZyg3KS50cmltKCksIHQyLm1hdGVyaWFsTGlicmFyaWVzKTsKICAgICAgICAgIGVsc2UgaWYgKFZuLnRlc3QocjQpKQogICAgICAgICAgICB0Mi5tYXRlcmlhbExpYnJhcmllcy5wdXNoKHI0LnN1YnN0cmluZyg3KS50cmltKCkpOwogICAgICAgICAgZWxzZSBpZiAoWW4udGVzdChyNCkpCiAgICAgICAgICAgIGNvbnNvbGUud2FybignVEhSRUUuT0JKTG9hZGVyOiBSZW5kZXJpbmcgaWRlbnRpZmllciAidXNlbWFwIiBub3Qgc3VwcG9ydGVkLiBUZXh0dXJlcyBtdXN0IGJlIGRlZmluZWQgaW4gTVRMIGZpbGVzLicpOwogICAgICAgICAgZWxzZSBpZiAobzIgPT09ICJzIikgewogICAgICAgICAgICBpZiAoaTIgPSByNC5zcGxpdCgiICIpLCBpMi5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgY29uc3QgZTQgPSBpMlsxXS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICB0Mi5vYmplY3Quc21vb3RoID0gZTQgIT09ICIwIiAmJiBlNCAhPT0gIm9mZiI7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgIHQyLm9iamVjdC5zbW9vdGggPSB0cnVlOwogICAgICAgICAgICBjb25zdCBlMyA9IHQyLm9iamVjdC5jdXJyZW50TWF0ZXJpYWwoKTsKICAgICAgICAgICAgZTMgJiYgKGUzLnNtb290aCA9IHQyLm9iamVjdC5zbW9vdGgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHI0ID09PSAiXHgwMCIpCiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGNvbnNvbGUud2FybignVEhSRUUuT0JKTG9hZGVyOiBVbmV4cGVjdGVkIGxpbmU6ICInICsgcjQgKyAnIicpOwogICAgICAgICAgfQogICAgICB9CiAgICAgIHQyLmZpbmFsaXplKCk7CiAgICAgIGNvbnN0IHIyID0gbmV3IFJlLkdyb3VwOwogICAgICBpZiAocjIubWF0ZXJpYWxMaWJyYXJpZXMgPSBbXS5jb25jYXQodDIubWF0ZXJpYWxMaWJyYXJpZXMpLCAhKHQyLm9iamVjdHMubGVuZ3RoID09PSAxICYmIHQyLm9iamVjdHNbMF0uZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoID09PSAwKSA9PSB0cnVlKQogICAgICAgIGZvciAobGV0IGUyID0gMCwgbjMgPSB0Mi5vYmplY3RzLmxlbmd0aDtlMiA8IG4zOyBlMisrKSB7CiAgICAgICAgICBjb25zdCBuNCA9IHQyLm9iamVjdHNbZTJdLCBpMyA9IG40Lmdlb21ldHJ5LCBvMiA9IG40Lm1hdGVyaWFscywgczIgPSBpMy50eXBlID09PSAiTGluZSIsIGEyID0gaTMudHlwZSA9PT0gIlBvaW50cyI7CiAgICAgICAgICBsZXQgQTIgPSBmYWxzZTsKICAgICAgICAgIGlmIChpMy52ZXJ0aWNlcy5sZW5ndGggPT09IDApCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgY29uc3QgbDIgPSBuZXcgUmUuQnVmZmVyR2VvbWV0cnk7CiAgICAgICAgICBsMi5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IFJlLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoaTMudmVydGljZXMsIDMpKSwgaTMubm9ybWFscy5sZW5ndGggPiAwICYmIGwyLnNldEF0dHJpYnV0ZSgibm9ybWFsIiwgbmV3IFJlLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoaTMubm9ybWFscywgMykpLCBpMy5jb2xvcnMubGVuZ3RoID4gMCAmJiAoQTIgPSB0cnVlLCBsMi5zZXRBdHRyaWJ1dGUoImNvbG9yIiwgbmV3IFJlLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoaTMuY29sb3JzLCAzKSkpLCBpMy5oYXNVVkluZGljZXMgPT09IHRydWUgJiYgbDIuc2V0QXR0cmlidXRlKCJ1diIsIG5ldyBSZS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKGkzLnV2cywgMikpOwogICAgICAgICAgY29uc3QgYzIgPSBbXTsKICAgICAgICAgIGZvciAobGV0IGUzID0gMCwgbjUgPSBvMi5sZW5ndGg7ZTMgPCBuNTsgZTMrKykgewogICAgICAgICAgICBjb25zdCBuNiA9IG8yW2UzXSwgaTQgPSBuNi5uYW1lICsgIl8iICsgbjYuc21vb3RoICsgIl8iICsgQTI7CiAgICAgICAgICAgIGxldCByMyA9IHQyLm1hdGVyaWFsc1tpNF07CiAgICAgICAgICAgIGlmICh0aGlzLm1hdGVyaWFscyAhPT0gbnVsbCkKICAgICAgICAgICAgICBpZiAocjMgPSB0aGlzLm1hdGVyaWFscy5jcmVhdGUobjYubmFtZSksICFzMiB8fCAhcjMgfHwgcjMgaW5zdGFuY2VvZiBSZS5MaW5lQmFzaWNNYXRlcmlhbCkgewogICAgICAgICAgICAgICAgaWYgKGEyICYmIHIzICYmICEocjMgaW5zdGFuY2VvZiBSZS5Qb2ludHNNYXRlcmlhbCkpIHsKICAgICAgICAgICAgICAgICAgY29uc3QgZTQgPSBuZXcgUmUuUG9pbnRzTWF0ZXJpYWwoeyBzaXplOiAxMCwgc2l6ZUF0dGVudWF0aW9uOiBmYWxzZSB9KTsKICAgICAgICAgICAgICAgICAgUmUuTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbChlNCwgcjMpLCBlNC5jb2xvci5jb3B5KHIzLmNvbG9yKSwgZTQubWFwID0gcjMubWFwLCByMyA9IGU0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCBlNCA9IG5ldyBSZS5MaW5lQmFzaWNNYXRlcmlhbDsKICAgICAgICAgICAgICAgIFJlLk1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoZTQsIHIzKSwgZTQuY29sb3IuY29weShyMy5jb2xvciksIHIzID0gZTQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICByMyA9PT0gdW5kZWZpbmVkICYmIChyMyA9IHMyID8gbmV3IFJlLkxpbmVCYXNpY01hdGVyaWFsIDogYTIgPyBuZXcgUmUuUG9pbnRzTWF0ZXJpYWwoeyBzaXplOiAxLCBzaXplQXR0ZW51YXRpb246IGZhbHNlIH0pIDogbmV3IFJlLk1lc2hQaG9uZ01hdGVyaWFsLCByMy5uYW1lID0gbjYubmFtZSwgcjMuZmxhdFNoYWRpbmcgPSAhbjYuc21vb3RoLCByMy52ZXJ0ZXhDb2xvcnMgPSBBMiwgdDIubWF0ZXJpYWxzW2k0XSA9IHIzKSwgYzIucHVzaChyMyk7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgaDI7CiAgICAgICAgICBpZiAoYzIubGVuZ3RoID4gMSkgewogICAgICAgICAgICBmb3IgKGxldCBlMyA9IDAsIHQzID0gbzIubGVuZ3RoO2UzIDwgdDM7IGUzKyspIHsKICAgICAgICAgICAgICBjb25zdCB0NCA9IG8yW2UzXTsKICAgICAgICAgICAgICBsMi5hZGRHcm91cCh0NC5ncm91cFN0YXJ0LCB0NC5ncm91cENvdW50LCBlMyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaDIgPSBzMiA/IG5ldyBSZS5MaW5lU2VnbWVudHMobDIsIGMyKSA6IGEyID8gbmV3IFJlLlBvaW50cyhsMiwgYzIpIDogbmV3IFJlLk1lc2gobDIsIGMyKTsKICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICBoMiA9IHMyID8gbmV3IFJlLkxpbmVTZWdtZW50cyhsMiwgYzJbMF0pIDogYTIgPyBuZXcgUmUuUG9pbnRzKGwyLCBjMlswXSkgOiBuZXcgUmUuTWVzaChsMiwgYzJbMF0pOwogICAgICAgICAgaDIubmFtZSA9IG40Lm5hbWUsIHIyLmFkZChoMik7CiAgICAgICAgfQogICAgICBlbHNlIGlmICh0Mi52ZXJ0aWNlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgY29uc3QgZTIgPSBuZXcgUmUuUG9pbnRzTWF0ZXJpYWwoeyBzaXplOiAxLCBzaXplQXR0ZW51YXRpb246IGZhbHNlIH0pLCBuMyA9IG5ldyBSZS5CdWZmZXJHZW9tZXRyeTsKICAgICAgICBuMy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IFJlLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUodDIudmVydGljZXMsIDMpKSwgdDIuY29sb3JzLmxlbmd0aCA+IDAgJiYgdDIuY29sb3JzWzBdICE9PSB1bmRlZmluZWQgJiYgKG4zLnNldEF0dHJpYnV0ZSgiY29sb3IiLCBuZXcgUmUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSh0Mi5jb2xvcnMsIDMpKSwgZTIudmVydGV4Q29sb3JzID0gdHJ1ZSk7CiAgICAgICAgY29uc3QgaTMgPSBuZXcgUmUuUG9pbnRzKG4zLCBlMik7CiAgICAgICAgcjIuYWRkKGkzKTsKICAgICAgfQogICAgICByZXR1cm4gcjI7CiAgICB9CiAgfTsKICBpaSA9IGNsYXNzIGlpIGV4dGVuZHMgUmUuTG9hZGVyIHsKICAgIGNvbnN0cnVjdG9yKGUpIHsKICAgICAgc3VwZXIoZSk7CiAgICB9CiAgICBsb2FkKGUsIHQyLCBuMiwgaTIpIHsKICAgICAgY29uc3QgcjIgPSB0aGlzLCBvMiA9IHRoaXMucGF0aCA9PT0gIiIgPyBSZS5Mb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZShlKSA6IHRoaXMucGF0aCwgczIgPSBuZXcgUmUuRmlsZUxvYWRlcih0aGlzLm1hbmFnZXIpOwogICAgICBzMi5zZXRQYXRoKHRoaXMucGF0aCksIHMyLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSwgczIuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKSwgczIubG9hZChlLCBmdW5jdGlvbihuMykgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0MihyMi5wYXJzZShuMywgbzIpKTsKICAgICAgICB9IGNhdGNoICh0MykgewogICAgICAgICAgaTIgPyBpMih0MykgOiBjb25zb2xlLmVycm9yKHQzKSwgcjIubWFuYWdlci5pdGVtRXJyb3IoZSk7CiAgICAgICAgfQogICAgICB9LCBuMiwgaTIpOwogICAgfQogICAgc2V0TWF0ZXJpYWxPcHRpb25zKGUpIHsKICAgICAgcmV0dXJuIHRoaXMubWF0ZXJpYWxPcHRpb25zID0gZSwgdGhpczsKICAgIH0KICAgIHBhcnNlKGUsIHQyKSB7CiAgICAgIGNvbnN0IG4yID0gZS5zcGxpdChgCmApOwogICAgICBsZXQgaTIgPSB7fTsKICAgICAgY29uc3QgcjIgPSAvXHMrLywgbzIgPSB7fTsKICAgICAgZm9yIChsZXQgZTIgPSAwO2UyIDwgbjIubGVuZ3RoOyBlMisrKSB7CiAgICAgICAgbGV0IHQzID0gbjJbZTJdOwogICAgICAgIGlmICh0MyA9IHQzLnRyaW0oKSwgdDMubGVuZ3RoID09PSAwIHx8IHQzLmNoYXJBdCgwKSA9PT0gIiMiKQogICAgICAgICAgY29udGludWU7CiAgICAgICAgY29uc3QgczMgPSB0My5pbmRleE9mKCIgIik7CiAgICAgICAgbGV0IGEyID0gczMgPj0gMCA/IHQzLnN1YnN0cmluZygwLCBzMykgOiB0MzsKICAgICAgICBhMiA9IGEyLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgbGV0IEEyID0gczMgPj0gMCA/IHQzLnN1YnN0cmluZyhzMyArIDEpIDogIiI7CiAgICAgICAgaWYgKEEyID0gQTIudHJpbSgpLCBhMiA9PT0gIm5ld210bCIpCiAgICAgICAgICBpMiA9IHsgbmFtZTogQTIgfSwgbzJbQTJdID0gaTI7CiAgICAgICAgZWxzZSBpZiAoYTIgPT09ICJrYSIgfHwgYTIgPT09ICJrZCIgfHwgYTIgPT09ICJrcyIgfHwgYTIgPT09ICJrZSIpIHsKICAgICAgICAgIGNvbnN0IGUzID0gQTIuc3BsaXQocjIsIDMpOwogICAgICAgICAgaTJbYTJdID0gW3BhcnNlRmxvYXQoZTNbMF0pLCBwYXJzZUZsb2F0KGUzWzFdKSwgcGFyc2VGbG9hdChlM1syXSldOwogICAgICAgIH0gZWxzZQogICAgICAgICAgaTJbYTJdID0gQTI7CiAgICAgIH0KICAgICAgY29uc3QgczIgPSBuZXcgcmkodGhpcy5yZXNvdXJjZVBhdGggfHwgdDIsIHRoaXMubWF0ZXJpYWxPcHRpb25zKTsKICAgICAgcmV0dXJuIHMyLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pLCBzMi5zZXRNYW5hZ2VyKHRoaXMubWFuYWdlciksIHMyLnNldE1hdGVyaWFscyhvMiksIHMyOwogICAgfQogIH07CiAgQWkgPSBnbG9iYWxUaGlzLlRIUkVFID0geyAuLi5SZSB9OwogIEFpLkRSQUNPTG9hZGVyID0gVWUsIEFpLkdMVEZMb2FkZXIgPSBYZSwgQWkuS1RYMkxvYWRlciA9IEJuLCBBaS5PQkpMb2FkZXIgPSBuaSwgQWkuTVRMTG9hZGVyID0gaWksIEFpLk9CQiA9IF9uLCBBaS5CdWZmZXJHZW9tZXRyeVV0aWxzID0gbywgQWkuTGlnaHRQcm9iZUdlbmVyYXRvciA9IG9pLCBBaS5EZXZpY2VPcmllbnRhdGlvbkNvbnRyb2xzID0gYWksIEFpLkNhY2hlLmVuYWJsZWQgPSB0cnVlOwogIGxpID0gQWk7CiAgY2kgPSB3aW5kb3cuQUZSQU1FX0NETl9ST09UIHx8ICJodHRwczovL2Nkbi5hZnJhbWUuaW8vIjsKICBkaSA9IGkoODg3OCk7CiAgdWkgPSBpLm4oZGkpOwogIGdpID0geyBjb2xvcnM6IHsgZGVidWc6ICJncmF5IiwgZXJyb3I6ICJyZWQiLCBpbmZvOiAiZ3JheSIsIHdhcm46ICJvcmFuZ2UiIH0gfTsKICB1aSgpLmZvcm1hdEFyZ3MgPSBmdW5jdGlvbihlKSB7CiAgICBpZiAoZVswXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICIlYyIgOiAiIikgKyB0aGlzLm5hbWVzcGFjZSArICh0aGlzLnVzZUNvbG9ycyA/ICIgJWMiIDogIiAiKSArIGVbMF0gKyAodGhpcy51c2VDb2xvcnMgPyAiJWMgIiA6ICIgIiksIHRoaXMudXNlQ29sb3JzKSB7CiAgICAgIHZhciB0MjsKICAgICAgdGhpcy5jb2xvciA9ICh0MiA9IGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgdmFyIHQzID0gZTIuc3BsaXQoIjoiKTsKICAgICAgICByZXR1cm4gdDNbdDMubGVuZ3RoIC0gMV07CiAgICAgIH0odGhpcy5uYW1lc3BhY2UpLCBnaS5jb2xvcnMgJiYgZ2kuY29sb3JzW3QyXSB8fCBudWxsKTsKICAgICAgdmFyIG4yID0gImNvbG9yOiAiICsgdGhpcy5jb2xvcjsKICAgICAgZS5zcGxpY2UoMSwgMCwgbjIsICJjb2xvcjogaW5oZXJpdCIpOwogICAgICB2YXIgaTIgPSAwLCByMiA9IDA7CiAgICAgIGVbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBmdW5jdGlvbihlMikgewogICAgICAgIGUyICE9PSAiJSUiICYmIChpMisrLCBlMiA9PT0gIiVjIiAmJiAocjIgPSBpMikpOwogICAgICB9KSwgZS5zcGxpY2UocjIsIDAsIG4yKTsKICAgIH0KICB9OwogIHBpID0gZnVuY3Rpb24oKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZTsKICAgIH0gY2F0Y2ggKGUpIHt9CiAgfSgpOwogIHBpICYmIChwYXJzZUludChwaS5sb2dzLCAxMCkgfHwgcGkubG9ncyA9PT0gInRydWUiKSA/IHVpKCkuZW5hYmxlKCIqIikgOiB1aSgpLmVuYWJsZSgiKjplcnJvciwqOmluZm8sKjp3YXJuIik7CiAgZmkgPSB1aSgpOwogIG1pID0gaSgxMTI0KTsKICBFaSA9IGkubihtaSk7CiAgQ2kgPSBmaSgiZGV2aWNlOmVycm9yIik7CiAgYmkgPSBuYXZpZ2F0b3IueHIgIT09IHVuZGVmaW5lZDsKICBpZiAoYmkpIHsKICAgIHlpID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYS1zY2VuZSIpOwogICAgICBlID8gZS5oYXNMb2FkZWQgPyBlLmNvbXBvbmVudHNbInhyLW1vZGUtdWkiXS51cGRhdGVFbnRlckludGVyZmFjZXMoKSA6IGUuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkIiwgeWkpIDogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCB5aSk7CiAgICB9LCBJaSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgQ2koIldlYlhSIHNlc3Npb24gc3VwcG9ydCBlcnJvcjogIiArIGUubWVzc2FnZSk7CiAgICB9OwogICAgbmF2aWdhdG9yLnhyLmlzU2Vzc2lvblN1cHBvcnRlZCA/IChuYXZpZ2F0b3IueHIuaXNTZXNzaW9uU3VwcG9ydGVkKCJpbW1lcnNpdmUtdnIiKS50aGVuKGZ1bmN0aW9uKGUpIHsKICAgICAgdmkgPSBlLCB5aSgpOwogICAgfSkuY2F0Y2goSWkpLCBuYXZpZ2F0b3IueHIuaXNTZXNzaW9uU3VwcG9ydGVkKCJpbW1lcnNpdmUtYXIiKS50aGVuKGZ1bmN0aW9uKGUpIHsKICAgICAgQmkgPSBlLCB5aSgpOwogICAgfSkuY2F0Y2goZnVuY3Rpb24oKSB7fSkpIDogbmF2aWdhdG9yLnhyLnN1cHBvcnRzU2Vzc2lvbiA/IChuYXZpZ2F0b3IueHIuc3VwcG9ydHNTZXNzaW9uKCJpbW1lcnNpdmUtdnIiKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICB2aSA9IHRydWUsIHlpKCk7CiAgICB9KS5jYXRjaChJaSksIG5hdmlnYXRvci54ci5zdXBwb3J0c1Nlc3Npb24oImltbWVyc2l2ZS1hciIpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIEJpID0gdHJ1ZSwgeWkoKTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkge30pKSA6IENpKCJXZWJYUiBoYXMgbmVpdGhlciBpc1Nlc3Npb25TdXBwb3J0ZWQgb3Igc3VwcG9ydHNTZXNzaW9uPyEiKTsKICB9CiAgU2kgPSAoTGkgPSBmYWxzZSwgTWkgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCB8fCB3aW5kb3cubmF2aWdhdG9yLnZlbmRvciB8fCB3aW5kb3cub3BlcmEsICgvKGFuZHJvaWR8YmJcZCt8bWVlZ28pLittb2JpbGV8YXZhbnRnb3xiYWRhXC98YmxhY2tiZXJyeXxibGF6ZXJ8Y29tcGFsfGVsYWluZXxmZW5uZWN8aGlwdG9wfGllbW9iaWxlfGlwKGhvbmV8b2QpfGlyaXN8a2luZGxlfGxnZSB8bWFlbW98bWlkcHxtbXB8bW9iaWxlLitmaXJlZm94fG5ldGZyb250fG9wZXJhIG0ob2J8aW4paXxwYWxtKCBvcyk/fHBob25lfHAoaXhpfHJlKVwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoNHw2KTB8c3ltYmlhbnx0cmVvfHVwXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyBjZXx4ZGF8eGlpbm8vaS50ZXN0KE1pKSB8fCAvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1wtKXxhaShrb3xybil8YWwoYXZ8Y2F8Y28pfGFtb2l8YW4oZXh8bnl8eXcpfGFwdHV8YXIoY2h8Z28pfGFzKHRlfHVzKXxhdHR3fGF1KGRpfFwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihlfHYpd3xidW1ifGJ3XC0obnx1KXxjNTVcL3xjYXBpfGNjd2F8Y2RtXC18Y2VsbHxjaHRtfGNsZGN8Y21kXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8XC1kKXxlbCg0OXxhaSl8ZW0obDJ8dWwpfGVyKGljfGswKXxlc2w4fGV6KFs0LTddMHxvc3x3YXx6ZSl8ZmV0Y3xmbHkoXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcLTV8Z1wtbW98Z28oXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXC0obXxwfHQpfGhlaVwtfGhpKHB0fHRhKXxocCggaXxpcCl8aHNcLWN8aHQoYyhcLXwgfF98YXxnfHB8c3x0KXx0cCl8aHUoYXd8dGMpfGlcLSgyMHxnb3xtYSl8aTIzMHxpYWMoIHxcLXxcLyl8aWJyb3xpZGVhfGlnMDF8aWtvbXxpbTFrfGlubm98aXBhcXxpcmlzfGphKHR8dilhfGpicm98amVtdXxqaWdzfGtkZGl8a2VqaXxrZ3QoIHxcLyl8a2xvbnxrcHQgfGt3Y1wtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcLyhrfGx8dSl8NTB8NTR8XC1bYS13XSl8bGlid3xseW54fG0xXC13fG0zZ2F8bTUwXC98bWEodGV8dWl8eG8pfG1jKDAxfDIxfGNhKXxtXC1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dChcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXC18b258dGZ8d2Z8d2d8d3QpfG5vayg2fGkpfG56cGh8bzJpbXxvcCh0aXx3dil8b3Jhbnxvd2cxfHA4MDB8cGFuKGF8ZHx0KXxwZHhnfHBnKDEzfFwtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcLWd8cWFcLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8XC1bMi03XXxpXC0pfHF0ZWt8cjM4MHxyNjAwfHJha3N8cmltOXxybyh2ZXx6byl8czU1XC98c2EoZ2V8bWF8bW18bXN8bnl8dmEpfHNjKDAxfGhcLXxvb3xwXC0pfHNka1wvfHNlKGMoXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXC18c2hhcnxzaWUoXC18bSl8c2tcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFwtfHZcLXx2ICl8c3koMDF8bWIpfHQyKDE4fDUwKXx0NigwMHwxMHwxOCl8dGEoZ3R8bGspfHRjbFwtfHRkZ1wtfHRlbChpfG0pfHRpbVwtfHRcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXC18bTN8bTUpfHR4XC05fHVwKFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFwtdil8dm00MHx2b2RhfHZ1bGN8dngoNTJ8NTN8NjB8NjF8NzB8ODB8ODF8ODN8ODV8OTgpfHczYyhcLXwgKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhc1wtfHlvdXJ8emV0b3x6dGVcLS9pLnRlc3QoTWkuc3Vic3RyKDAsIDQpKSkgJiYgKExpID0gdHJ1ZSksIChSaSgpIHx8IERpKCkgfHwgR2koKSkgJiYgKExpID0gdHJ1ZSksIFBpKCkgJiYgKExpID0gZmFsc2UpLCBmdW5jdGlvbigpIHsKICAgIHJldHVybiBMaTsKICB9KTsKICBqaSA9IHR5cGVvZiBwcm9jZXNzID09ICJ1bmRlZmluZWQiIHx8IHRydWU7CiAgX2kgPSAhamk7CiAgSGkgPSBPYmplY3QuZnJlZXplKE9iamVjdC5jcmVhdGUobnVsbCkpOwogIEtpID0gZmkoInV0aWxzOmNvb3JkaW5hdGVzOndhcm4iKTsKICBXaSA9IFsieCIsICJ5IiwgInoiLCAidyJdOwogIEppID0gL15ccyooKC0/XGQqXC57MCwxfVxkKyhlLT9cZCspPylccyspezIsM30oLT9cZCpcLnswLDF9XGQrKGUtP1xkKyk/KVxzKiQvOwogIFhpID0gL1xzKy9nOwogIG9yID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHt9OwogICAgcmV0dXJuIGZ1bmN0aW9uKHQyLCBuMikgewogICAgICByZXR1cm4gbjIgaW4gZSB8fCAoZVtuMl0gPSB7fSksIHQyIGluIGVbbjJdIHx8IChlW24yXVt0Ml0gPSB0Mi5zcGxpdChuMikpLCBlW24yXVt0Ml07CiAgICB9OwogIH0oKTsKICBjciA9IGZpKCJ1dGlsczpzcmMtbG9hZGVyOndhcm4iKTsKICBmciA9IGZpKCJ1dGlsczptYXRlcmlhbDp3YXJuIik7CiAgbXIgPSBuZXcgU2V0KFsiZW1pc3NpdmVNYXAiLCAiZW52TWFwIiwgIm1hcCIsICJzcGVjdWxhck1hcCJdKTsKICBiciA9IHt9OwogIFFyID0gLy0oW2Etel0pL2c7CiAgVHIgPSAoRHIgPSBbXSwga3IgPSAvdXJsXChbXildKyQvLCBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIsIG4yID0gIiIsIGkyID0gMDsKICAgIGZvciAoRHIubGVuZ3RoID0gMDtpMiA8IGUubGVuZ3RoOyApCiAgICAgICh0MiA9IGUuaW5kZXhPZigiOyIsIGkyKSkgPT09IC0xICYmICh0MiA9IGUubGVuZ3RoKSwgbjIgKz0gZS5zdWJzdHJpbmcoaTIsIHQyKSwga3IudGVzdChuMikgPyAobjIgKz0gIjsiLCBpMiA9IHQyICsgMSkgOiAoRHIucHVzaChuMi50cmltKCkpLCBuMiA9ICIiLCBpMiA9IHQyICsgMSk7CiAgICByZXR1cm4gRHI7CiAgfSk7CiAgRnIgPSBbIngiLCAieSIsICJ6IiwgInciXTsKICBqciA9IGZpKCJ1dGlsczp3YXJuIik7CiAgSnIgPSBPYmplY3QuYXNzaWduOwogIFhyID0gRWkoKTsKICB0byA9ICgkciA9IFZpKGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIFtdOwogIH0pLCBmdW5jdGlvbihlLCB0MikgewogICAgdmFyIG4yLCBpMiwgcjIsIG8yLCBzMiwgYTI7CiAgICBpZiAoZSA9PT0gdW5kZWZpbmVkIHx8IHQyID09PSB1bmRlZmluZWQgfHwgZSA9PT0gbnVsbCB8fCB0MiA9PT0gbnVsbCB8fCAhKGUgJiYgdDIgJiYgZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0ICYmIHQyLmNvbnN0cnVjdG9yID09PSBPYmplY3QgfHwgZS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkgJiYgdDIuY29uc3RydWN0b3IgPT09IEFycmF5KSkKICAgICAgcmV0dXJuIGUgPT09IHQyOwogICAgZm9yIChuMiBpbiBpMiA9ICRyLnVzZSgpLCByMiA9ICRyLnVzZSgpLCBpMi5sZW5ndGggPSAwLCByMi5sZW5ndGggPSAwLCBlKQogICAgICBpMi5wdXNoKG4yKTsKICAgIGZvciAobjIgaW4gdDIpCiAgICAgIHIyLnB1c2gobjIpOwogICAgaWYgKGkyLmxlbmd0aCAhPT0gcjIubGVuZ3RoKQogICAgICByZXR1cm4gJHIucmVjeWNsZShpMiksICRyLnJlY3ljbGUocjIpLCBmYWxzZTsKICAgIGZvciAobzIgPSAwO28yIDwgaTIubGVuZ3RoOyArK28yKQogICAgICBpZiAoczIgPSBlW2kyW28yXV0sIGEyID0gdDJbaTJbbzJdXSwgdHlwZW9mIHMyID09ICJvYmplY3QiIHx8IHR5cGVvZiBhMiA9PSAib2JqZWN0IiB8fCBBcnJheS5pc0FycmF5KHMyKSAmJiBBcnJheS5pc0FycmF5KGEyKSkgewogICAgICAgIGlmIChzMiA9PT0gYTIpCiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpZiAoIXRvKHMyLCBhMikpCiAgICAgICAgICByZXR1cm4gJHIucmVjeWNsZShpMiksICRyLnJlY3ljbGUocjIpLCBmYWxzZTsKICAgICAgfSBlbHNlIGlmIChzMiAhPT0gYTIpCiAgICAgICAgcmV0dXJuICRyLnJlY3ljbGUoaTIpLCAkci5yZWN5Y2xlKHIyKSwgZmFsc2U7CiAgICByZXR1cm4gJHIucmVjeWNsZShpMiksICRyLnJlY3ljbGUocjIpLCB0cnVlOwogIH0pOwogIG5vID0gKGVvID0gW10sIGZ1bmN0aW9uKGUsIHQyLCBuMikgewogICAgdmFyIGkyLCByMiwgbzIsIHMyLCBhMiwgQTIsIGwyOwogICAgZm9yIChhMiBpbiBzMiA9IG4yIHx8IHt9LCBlby5sZW5ndGggPSAwLCBlKQogICAgICBlby5wdXNoKGEyKTsKICAgIGlmICghdDIpCiAgICAgIHJldHVybiBzMjsKICAgIGZvciAobzIgaW4gdDIpCiAgICAgIGVvLmluZGV4T2YobzIpID09PSAtMSAmJiBlby5wdXNoKG8yKTsKICAgIGZvciAoQTIgPSAwO0EyIDwgZW8ubGVuZ3RoOyBBMisrKQogICAgICBpMiA9IGVbYTIgPSBlb1tBMl1dLCByMiA9IHQyW2EyXSwgKChsMiA9IGkyICYmIHIyICYmIGkyLmNvbnN0cnVjdG9yID09PSBPYmplY3QgJiYgcjIuY29uc3RydWN0b3IgPT09IE9iamVjdCkgJiYgIXRvKGkyLCByMikgfHwgIWwyICYmIGkyICE9PSByMikgJiYgKHMyW2EyXSA9IHIyKTsKICAgIHJldHVybiBzMjsKICB9KTsKICBjbyA9IFt1byh7IG5hbWU6ICJ2aWV3cG9ydCIsIGNvbnRlbnQ6ICJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xLG1heGltdW0tc2NhbGU9MSxzaHJpbmstdG8tZml0PW5vLHVzZXItc2NhbGFibGU9bm8sbWluaW1hbC11aSx2aWV3cG9ydC1maXQ9Y292ZXIiIH0pLCB1byh7IG5hbWU6ICJtb2JpbGUtd2ViLWFwcC1jYXBhYmxlIiwgY29udGVudDogInllcyIgfSksIHVvKHsgbmFtZTogInRoZW1lLWNvbG9yIiwgY29udGVudDogImJsYWNrIiB9KV07CiAgaG8gPSBbdW8oeyBuYW1lOiAiYXBwbGUtbW9iaWxlLXdlYi1hcHAtY2FwYWJsZSIsIGNvbnRlbnQ6ICJ5ZXMiIH0pLCB1byh7IG5hbWU6ICJhcHBsZS1tb2JpbGUtd2ViLWFwcC1zdGF0dXMtYmFyLXN0eWxlIiwgY29udGVudDogImJsYWNrIiB9KSwgKGxvID0geyByZWw6ICJhcHBsZS10b3VjaC1pY29uIiwgaHJlZjogImh0dHBzOi8vYWZyYW1lLmlvL2ltYWdlcy9hZnJhbWUtbG9nby0xNTIucG5nIiB9LCB7IHRhZ05hbWU6ICJsaW5rIiwgYXR0cmlidXRlczogbG8sIGV4aXN0czogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tyZWw9IicgKyBsby5yZWwgKyAnIl0nKTsKICB9IH0pXTsKICBtbyA9IGkoNTkyOCk7CiAgRW8gPSBpLm4obW8pOwogIENvID0gZDsKICBibyA9IFtdOwogIHlvID0gdWkoKSgiY29yZTpwcm9wZXJ0eVR5cGVzOndhcm4iKTsKICBJbyA9IHt9OwogIHdvID0gL1ssPiAuW1xdOl0vOwogIHhvID0gL3VybFwoKC4rKVwpLzsKICBRbygiYXVkaW8iLCAiIiwgTW8sIFNvKSwgUW8oImFycmF5IiwgW10sIGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiBBcnJheS5pc0FycmF5KGUpID8gZSA6IGUgJiYgdHlwZW9mIGUgPT0gInN0cmluZyIgPyBlLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKGUyKSB7CiAgICAgIHJldHVybiBlMi50cmltKCk7CiAgICB9KSA6IFtdOwogIH0sIGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiBlLmpvaW4oIiwgIik7CiAgfSwgTG8pLCBRbygiYXNzZXQiLCAiIiwgTW8sIFNvKSwgUW8oImJvb2xlYW4iLCBmYWxzZSwgZnVuY3Rpb24oZSkgewogICAgcmV0dXJuIGUgIT09ICJmYWxzZSIgJiYgZSAhPT0gZmFsc2U7CiAgfSksIFFvKCJjb2xvciIsICIjRkZGIiksIFFvKCJpbnQiLCAwLCBSbyksIFFvKCJudW1iZXIiLCAwLCBmdW5jdGlvbihlKSB7CiAgICByZXR1cm4gcGFyc2VGbG9hdChlLCAxMCk7CiAgfSksIFFvKCJtYXAiLCAiIiwgTW8sIFNvKSwgUW8oIm1vZGVsIiwgIiIsIE1vLCBTbyksIFFvKCJzZWxlY3RvciIsIG51bGwsIGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiBlID8gdHlwZW9mIGUgIT0gInN0cmluZyIgPyBlIDogZVswXSAhPT0gIiMiIHx8IHdvLnRlc3QoZSkgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZS5zdWJzdHJpbmcoMSkpIDogbnVsbDsKICB9LCBmdW5jdGlvbihlKSB7CiAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUgPyAiIyIgKyBlLmdldEF0dHJpYnV0ZSgiaWQiKSA6IGtvKGUpOwogIH0sIFRvLCBmYWxzZSksIFFvKCJzZWxlY3RvckFsbCIsIG51bGwsIGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiBlID8gdHlwZW9mIGUgIT0gInN0cmluZyIgPyBlIDogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlKSwgMCkgOiBudWxsOwogIH0sIGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiBlIGluc3RhbmNlb2YgQXJyYXkgPyBlLm1hcChmdW5jdGlvbihlMikgewogICAgICByZXR1cm4gIiMiICsgZTIuZ2V0QXR0cmlidXRlKCJpZCIpOwogICAgfSkuam9pbigiLCAiKSA6IGtvKGUpOwogIH0sIExvLCBmYWxzZSksIFFvKCJzcmMiLCAiIiwgZnVuY3Rpb24oZSkgewogICAgcmV0dXJuIHlvKCJgc3JjYCBwcm9wZXJ0eSB0eXBlIGlzIGRlcHJlY2F0ZWQuIFVzZSBgYXNzZXRgIGluc3RlYWQuIiksIE1vKGUpOwogIH0sIFNvKSwgUW8oInN0cmluZyIsICIiKSwgUW8oInRpbWUiLCAwLCBSbyksIFFvKCJ2ZWMyIiwgeyB4OiAwLCB5OiAwIH0sIEZvLCAkaSwgZXIpLCBRbygidmVjMyIsIHsgeDogMCwgeTogMCwgejogMCB9LCBGbywgJGksIGVyKSwgUW8oInZlYzQiLCB7IHg6IDAsIHk6IDAsIHo6IDAsIHc6IDEgfSwgRm8sICRpLCBlcik7CiAgUG8gPSBJbzsKICBHbyA9IGZpKCJjb3JlOnNjaGVtYTp3YXJuIik7CiAgcW8gPSAoSG8gPSBbXSwgZnVuY3Rpb24oZSwgdDIsIG4yLCBpMiwgcjIpIHsKICAgIHZhciBvMiwgczIsIGEyLCBBMjsKICAgIGZvciAoczIgaW4gSG8ubGVuZ3RoID0gMCwgbjIgPyBlIDogdDIpCiAgICAgIG4yICYmIGVbczJdID09PSB1bmRlZmluZWQgfHwgSG8ucHVzaChzMik7CiAgICBpZiAoZSA9PT0gbnVsbCB8fCB0eXBlb2YgZSAhPSAib2JqZWN0IikKICAgICAgcmV0dXJuIGU7CiAgICBmb3IgKHMyIGluIGUpCiAgICAgIGVbczJdID09PSB1bmRlZmluZWQgfHwgdDJbczJdIHx8IHIyIHx8IEdvKCJVbmtub3duIHByb3BlcnR5IGAiICsgczIgKyAiYCBmb3IgY29tcG9uZW50L3N5c3RlbSBgIiArIGkyICsgImAuIik7CiAgICBmb3IgKG8yID0gMDtvMiA8IEhvLmxlbmd0aDsgbzIrKykgewogICAgICBpZiAoYTIgPSB0MltzMiA9IEhvW28yXV0sIEEyID0gZVtzMl0sICF0MltzMl0pCiAgICAgICAgcmV0dXJuOwogICAgICBlW3MyXSA9IFZvKEEyLCBhMik7CiAgICB9CiAgICByZXR1cm4gZTsKICB9KTsKICBLbyA9IHt9OwogIFdvID0gVm87CiAgSm8gPSBqbzsKICBYbyA9IE5vOwogIFpvID0gem87CiAgJG8gPSBZbzsKICBlcyA9IGQ7CiAgdHMgPSBmaSgiY29yZTpjb21wb25lbnQ6d2FybiIpOwogIG5zID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdDsKICBpcyA9IG5ldyBSZWdFeHAoIltBLVpdKyIpOwogIHJzID0ge307CiAgb3MgPSBPYmplY3QuZnJlZXplKHt9KTsKICBzcyA9IFtdOwogIGFzID0geyBnZXQ6IGZ1bmN0aW9uKGUsIHQyKSB7CiAgICByZXR1cm4gZS5nZXRDb21wdXRlZFByb3BlcnR5VmFsdWUodDIpOwogIH0sIHNldDogZnVuY3Rpb24oZSwgdDIsIG4yKSB7CiAgICByZXR1cm4gdDIgaW4gZS5zY2hlbWEgPyBlLnJlY29tcHV0ZVByb3BlcnR5KHQyLCBuMikgOiBuMiAhPT0gdW5kZWZpbmVkICYmIGUuaGFuZGxlVW5rbm93blByb3BlcnR5KHQyLCBuMiksIHRydWU7CiAgfSB9OwogIEFzLnByb3RvdHlwZSA9IHsgc2NoZW1hOiB7fSwgaW5pdDogZnVuY3Rpb24oKSB7fSwgZXZlbnRzOiB7fSwgdXBkYXRlOiBmdW5jdGlvbihlKSB7fSwgdXBkYXRlU2NoZW1hOiB1bmRlZmluZWQsIHRpY2s6IHVuZGVmaW5lZCwgdG9jazogdW5kZWZpbmVkLCBwbGF5OiBmdW5jdGlvbigpIHt9LCBwYXVzZTogZnVuY3Rpb24oKSB7fSwgcmVtb3ZlOiBmdW5jdGlvbigpIHt9LCBzdHJpbmdpZnk6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IHRoaXMuc2NoZW1hOwogICAgcmV0dXJuIHR5cGVvZiBlID09ICJzdHJpbmciID8gZSA6IHRoaXMuaXNTaW5nbGVQcm9wZXJ0eSA/ICRvKGUsIHQyKSA6IChlID0gWm8oZSwgdDIpLCBlcy5zdHJpbmdpZnkoZSkpOwogIH0sIGZsdXNoVG9ET006IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IGUgPyB0aGlzLmRhdGEgOiB0aGlzLmF0dHJWYWx1ZTsKICAgIHQyICE9IG51bGwgJiYgd2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUuY2FsbCh0aGlzLmVsLCB0aGlzLmF0dHJOYW1lLCB0aGlzLnN0cmluZ2lmeSh0MikpOwogIH0sIHVwZGF0ZVByb3BlcnRpZXM6IGZ1bmN0aW9uKGUsIHQyKSB7CiAgICB2YXIgbjIgPSB0aGlzLmVsOwogICAgdGhpcy51cGRhdGVEYXRhKGUsIHQyKSwgKG4yLmhhc0xvYWRlZCB8fCBuMi5pc0xvYWRpbmcpICYmICh0aGlzLmluaXRpYWxpemVkID8gdGhpcy5jYWxsVXBkYXRlSGFuZGxlcigpIDogdGhpcy5pbml0Q29tcG9uZW50KCkpOwogIH0sIGluaXRDb21wb25lbnQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyID0gdGhpcy5lbDsKICAgIHQyLmluaXRpYWxpemluZ0NvbXBvbmVudHNbdGhpcy5uYW1lXSB8fCAodDIuaW5pdGlhbGl6aW5nQ29tcG9uZW50c1t0aGlzLm5hbWVdID0gdHJ1ZSwgdGhpcy5pbml0KCksIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlLCBkZWxldGUgdDIuaW5pdGlhbGl6aW5nQ29tcG9uZW50c1t0aGlzLm5hbWVdLCBlID0gdGhpcy5pc09iamVjdEJhc2VkID8gb3MgOiB1bmRlZmluZWQsIHRoaXMuZGF0YUNoYW5nZWQgPSBmYWxzZSwgdGhpcy5zdG9yZU9sZERhdGEoKSwgdGhpcy51cGRhdGUoZSksIHQyLmlzUGxheWluZyAmJiB0aGlzLnBsYXkoKSwgdDIuZW1pdCgiY29tcG9uZW50aW5pdGlhbGl6ZWQiLCB0aGlzLmV2dERldGFpbCwgZmFsc2UpKTsKICB9LCB1cGRhdGVEYXRhOiBmdW5jdGlvbihlLCB0MikgewogICAgdGhpcy5pc1NpbmdsZVByb3BlcnR5ID8gdGhpcy5yZWNvbXB1dGVQcm9wZXJ0eSh1bmRlZmluZWQsIGUpIDogKHQyID8gKHppKHRoaXMuYXR0clZhbHVlKSwgdGhpcy5yZWNvbXB1dGVEYXRhKGUpLCB0aGlzLnNjaGVtYUNoYW5nZVJlcXVpcmVkID0gISF0aGlzLnVwZGF0ZVNjaGVtYSkgOiB0eXBlb2YgZSA9PSAic3RyaW5nIiA/IGVzLnBhcnNlKGUsIHRoaXMuYXR0clZhbHVlUHJveHkpIDogSnIodGhpcy5hdHRyVmFsdWVQcm94eSwgZSksIHRoaXMudXBkYXRlU2NoZW1hSWZOZWVkZWQoZSkpOwogIH0sIHVwZGF0ZVNjaGVtYUlmTmVlZGVkOiBmdW5jdGlvbihlKSB7CiAgICBpZiAodGhpcy5zY2hlbWFDaGFuZ2VSZXF1aXJlZCAmJiB0aGlzLnVwZGF0ZVNjaGVtYSkKICAgICAgZm9yICh2YXIgdDIgaW4gc3MubGVuZ3RoID0gMCwgdGhpcy51cGRhdGVTY2hlbWEodGhpcy5kYXRhKSwgWWkodGhpcy5kYXRhLCB0aGlzLnNjaGVtYSksIHRoaXMucmVjb21wdXRlRGF0YShlKSwgdGhpcy5zY2hlbWFDaGFuZ2VSZXF1aXJlZCA9IGZhbHNlLCB0aGlzLmF0dHJWYWx1ZSkKICAgICAgICB0aGlzLmF0dHJWYWx1ZVt0Ml0gIT09IHVuZGVmaW5lZCAmJiBzcy5pbmRleE9mKHQyKSA9PT0gLTEgJiYgKCh0MiBpbiB0aGlzLnNjaGVtYSkgfHwgdHMoIlVua25vd24gcHJvcGVydHkgYCIgKyB0MiArICJgIGZvciBjb21wb25lbnQgYCIgKyB0aGlzLm5hbWUgKyAiYC4iKSk7CiAgICBmb3IgKHZhciBuMiA9IDA7bjIgPCBzcy5sZW5ndGg7IG4yKyspCiAgICAgIHRzKCJVbmtub3duIHByb3BlcnR5IGAiICsgc3NbbjJdICsgImAgZm9yIGNvbXBvbmVudCBgIiArIHRoaXMubmFtZSArICJgLiIpOwogICAgc3MubGVuZ3RoID0gMDsKICB9LCBjYWxsVXBkYXRlSGFuZGxlcjogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5pc1Bvc2l0aW9uUm90YXRpb25TY2FsZSB8fCB0aGlzLmRhdGFDaGFuZ2VkKSB7CiAgICAgIHRoaXMuZGF0YUNoYW5nZWQgPSBmYWxzZTsKICAgICAgdmFyIGUgPSB0aGlzLm9sZERhdGE7CiAgICAgIHRoaXMub2xkRGF0YUluVXNlID0gdHJ1ZSwgdGhpcy51cGRhdGUoZSksIGUgIT09IHRoaXMub2xkRGF0YSAmJiB0aGlzLm9iamVjdFBvb2wucmVjeWNsZShlKSwgdGhpcy5vbGREYXRhSW5Vc2UgPSBmYWxzZSwgdGhpcy5zdG9yZU9sZERhdGEoKSwgdGhpcy50aHJvdHRsZWRFbWl0Q29tcG9uZW50Q2hhbmdlZCgpOwogICAgfQogIH0sIGhhbmRsZU1peGluVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVjb21wdXRlRGF0YSgpLCB0aGlzLnVwZGF0ZVNjaGVtYUlmTmVlZGVkKCksIHRoaXMuY2FsbFVwZGF0ZUhhbmRsZXIoKTsKICB9LCByZXNldFByb3BlcnR5OiBmdW5jdGlvbihlKSB7CiAgICAodGhpcy5pc1NpbmdsZVByb3BlcnR5IHx8IChlIGluIHRoaXMuc2NoZW1hKSkgJiYgKGUgPyB0aGlzLmF0dHJWYWx1ZVtlXSA9IHVuZGVmaW5lZCA6ICh0aGlzLmlzT2JqZWN0QmFzZWQgJiYgdGhpcy5vYmplY3RQb29sLnJlY3ljbGUodGhpcy5hdHRyVmFsdWUpLCB0aGlzLmF0dHJWYWx1ZSA9IHVuZGVmaW5lZCksIHRoaXMucmVjb21wdXRlUHJvcGVydHkoZSwgdW5kZWZpbmVkKSwgdGhpcy51cGRhdGVTY2hlbWFJZk5lZWRlZCgpLCB0aGlzLmNhbGxVcGRhdGVIYW5kbGVyKCkpOwogIH0sIGV4dGVuZFNjaGVtYTogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyOwogICAgdDIgPSBKcih7fSwgS29bdGhpcy5uYW1lXS5zY2hlbWEpLCBKcih0MiwgZSksIHRoaXMuc2NoZW1hID0gSm8odDIpLCB0aGlzLmVsLmVtaXQoInNjaGVtYWNoYW5nZWQiLCB0aGlzLmV2dERldGFpbCk7CiAgfSwgZ2V0Q29tcHV0ZWRQcm9wZXJ0eVZhbHVlOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSB0aGlzLmVsLm1peGluRWxzLCBuMiA9IHRoaXMuYXR0clZhbHVlICYmIGUgPyB0aGlzLmF0dHJWYWx1ZVtlXSA6IHRoaXMuYXR0clZhbHVlOwogICAgaWYgKG4yICE9PSB1bmRlZmluZWQpCiAgICAgIHJldHVybiBuMjsKICAgIGZvciAodmFyIGkyID0gdDIubGVuZ3RoIC0gMTtpMiA+PSAwOyBpMi0tKSB7CiAgICAgIHZhciByMiA9IHQyW2kyXS5nZXRBdHRyaWJ1dGUodGhpcy5hdHRyTmFtZSk7CiAgICAgIGlmIChyMiAhPT0gbnVsbCAmJiAoIWUgfHwgKGUgaW4gcjIpKSkKICAgICAgICByZXR1cm4gZSA/IHIyW2VdIDogcjI7CiAgICB9CiAgICByZXR1cm4gZSA/IHRoaXMuc2NoZW1hW2VdLmRlZmF1bHQgOiB0aGlzLnNjaGVtYS5kZWZhdWx0OwogIH0sIHJlY29tcHV0ZVByb3BlcnR5OiBmdW5jdGlvbihlLCB0MikgewogICAgdmFyIG4yID0gZSA/IHRoaXMuc2NoZW1hW2VdIDogdGhpcy5zY2hlbWE7CiAgICBpZiAodDIgIT0gbnVsbCkgewogICAgICB0aGlzLmF0dHJWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuaXNPYmplY3RCYXNlZCAmJiAodGhpcy5hdHRyVmFsdWUgPSB0aGlzLm9iamVjdFBvb2wudXNlKCkpOwogICAgICB2YXIgaTIgPSBlID8gdGhpcy5hdHRyVmFsdWVbZV0gOiB0aGlzLmF0dHJWYWx1ZTsKICAgICAgdHlwZW9mIChpMiA9IG4yLmlzQ2FjaGVhYmxlID8gV28odDIsIG4yLCBpMikgOiB0MikgPT0gInN0cmluZyIgJiYgKGkyID0gdDIgPT09ICIiID8gdW5kZWZpbmVkIDogdDIpLCBlID8gdGhpcy5hdHRyVmFsdWVbZV0gPSBpMiA6IHRoaXMuYXR0clZhbHVlID0gaTI7CiAgICB9CiAgICB0aGlzLm9sZERhdGFJblVzZSAmJiAodGhpcy5vbGREYXRhID0gdGhpcy5vYmplY3RQb29sLnVzZSgpLCBZaSh0aGlzLm9sZERhdGEsIHRoaXMuc2NoZW1hKSwgdGhpcy5zdG9yZU9sZERhdGEoKSwgdGhpcy5vbGREYXRhSW5Vc2UgPSBmYWxzZSk7CiAgICB2YXIgcjIgPSBlID8gdGhpcy5vbGREYXRhW2VdIDogdGhpcy5vbGREYXRhLCBvMiA9IGUgPyB0aGlzLmRhdGFbZV0gOiB0aGlzLmRhdGEsIHMyID0gV28odGhpcy5nZXRDb21wdXRlZFByb3BlcnR5VmFsdWUoZSksIG4yLCBvMik7CiAgICByZXR1cm4gbjIudHlwZSAhPT0gImFycmF5IiB8fCBlIHx8IChzMiA9IFpyKHMyKSksIG4yLmVxdWFscyhzMiwgcjIpIHx8ICh0aGlzLmRhdGFDaGFuZ2VkID0gdHJ1ZSwgbjIuc2NoZW1hQ2hhbmdlICYmICh0aGlzLnNjaGVtYUNoYW5nZVJlcXVpcmVkID0gdHJ1ZSkpLCBlID8gdGhpcy5kYXRhW2VdID0gczIgOiB0aGlzLmRhdGEgPSBzMiwgczI7CiAgfSwgaGFuZGxlVW5rbm93blByb3BlcnR5OiBmdW5jdGlvbihlLCB0MikgewogICAgdGhpcy5hdHRyVmFsdWUgPT09IHVuZGVmaW5lZCAmJiAodGhpcy5hdHRyVmFsdWUgPSB0aGlzLm9iamVjdFBvb2wudXNlKCkpLCB0aGlzLmF0dHJWYWx1ZVtlXSA9IHQyLCB0aGlzLmRlZmVyVW5rbm93blByb3BlcnR5V2FybmluZ3MgPyBzcy5wdXNoKGUpIDogdGhpcy5zaWxlbmNlVW5rbm93blByb3BlcnR5V2FybmluZ3MgfHwgdHMoIlVua25vd24gcHJvcGVydHkgYCIgKyBlICsgImAgZm9yIGNvbXBvbmVudCBgIiArIHRoaXMubmFtZSArICJgLiIpOwogIH0sIHN0b3JlT2xkRGF0YTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZTsKICAgIGlmICh0aGlzLmlzT2JqZWN0QmFzZWQpCiAgICAgIGlmICh0aGlzLmlzU2luZ2xlUHJvcGVydHkpCiAgICAgICAgdGhpcy5vbGREYXRhID0gV28odGhpcy5kYXRhLCB0aGlzLnNjaGVtYSwgdGhpcy5vbGREYXRhKTsKICAgICAgZWxzZQogICAgICAgIGZvciAoZSBpbiB0aGlzLnNjaGVtYSkKICAgICAgICAgIHRoaXMuZGF0YVtlXSAhPT0gdW5kZWZpbmVkICYmICh0aGlzLmRhdGFbZV0gJiYgdHlwZW9mIHRoaXMuZGF0YVtlXSA9PSAib2JqZWN0IiA/IHRoaXMub2xkRGF0YVtlXSA9IFdvKHRoaXMuZGF0YVtlXSwgdGhpcy5zY2hlbWFbZV0sIHRoaXMub2xkRGF0YVtlXSkgOiB0aGlzLm9sZERhdGFbZV0gPSB0aGlzLmRhdGFbZV0pOwogICAgZWxzZQogICAgICB0aGlzLm9sZERhdGEgPSB0aGlzLmRhdGE7CiAgfSwgcmVjb21wdXRlRGF0YTogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyOwogICAgaWYgKHRoaXMuaXNTaW5nbGVQcm9wZXJ0eSkKICAgICAgdGhpcy5yZWNvbXB1dGVQcm9wZXJ0eSh1bmRlZmluZWQsIGUpOwogICAgZWxzZSB7CiAgICAgIGZvciAodDIgaW4gdGhpcy5zY2hlbWEpCiAgICAgICAgdGhpcy5hdHRyVmFsdWVQcm94eVt0Ml0gPSB1bmRlZmluZWQ7CiAgICAgIGUgJiYgdHlwZW9mIGUgPT0gIm9iamVjdCIgPyBKcih0aGlzLmF0dHJWYWx1ZVByb3h5LCBlKSA6IHR5cGVvZiBlID09ICJzdHJpbmciICYmIGVzLnBhcnNlKGUsIHRoaXMuYXR0clZhbHVlUHJveHkpOwogICAgfQogIH0sIGV2ZW50c0F0dGFjaDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZTsKICAgIGZvciAoZSBpbiB0aGlzLmV2ZW50c0RldGFjaCgpLCB0aGlzLmV2ZW50cykKICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKGUsIHRoaXMuZXZlbnRzW2VdKTsKICB9LCBldmVudHNEZXRhY2g6IGZ1bmN0aW9uKCkgewogICAgdmFyIGU7CiAgICBmb3IgKGUgaW4gdGhpcy5ldmVudHMpCiAgICAgIHRoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLCB0aGlzLmV2ZW50c1tlXSk7CiAgfSwgZGVzdHJveTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLm9iamVjdFBvb2wucmVjeWNsZSh0aGlzLmF0dHJWYWx1ZSksIHRoaXMub2JqZWN0UG9vbC5yZWN5Y2xlKHRoaXMuZGF0YSksIHRoaXMub2JqZWN0UG9vbC5yZWN5Y2xlKHRoaXMub2xkRGF0YSksIHRoaXMuYXR0clZhbHVlID0gdGhpcy5kYXRhID0gdGhpcy5vbGREYXRhID0gdGhpcy5hdHRyVmFsdWVQcm94eSA9IHVuZGVmaW5lZDsKICB9IH07CiAgbHMgPSB7fTsKICBwcyA9IGQ7CiAgZnMgPSB7fTsKICBtcy5wcm90b3R5cGUgPSB7IHNjaGVtYToge30sIGluaXQ6IGZ1bmN0aW9uKCkge30sIHVwZGF0ZTogZnVuY3Rpb24oZSkge30sIHVwZGF0ZVByb3BlcnRpZXM6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IHRoaXMuZGF0YTsKICAgIE9iamVjdC5rZXlzKHRoaXMuc2NoZW1hKS5sZW5ndGggIT09IDAgJiYgKHRoaXMuYnVpbGREYXRhKGUpLCB0aGlzLnVwZGF0ZSh0MikpOwogIH0sIGJ1aWxkRGF0YTogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyID0gdGhpcy5zY2hlbWE7CiAgICBPYmplY3Qua2V5cyh0MikubGVuZ3RoICE9PSAwICYmIChlID0gZSB8fCB3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZS5jYWxsKHRoaXMuc2NlbmVFbCwgdGhpcy5uYW1lKSwgTm8odDIpID8gdGhpcy5kYXRhID0gVm8oZSwgdDIpIDogdGhpcy5kYXRhID0gcW8ocHMucGFyc2UoZSkgfHwge30sIHQyLCBmYWxzZSwgdGhpcy5uYW1lKSk7CiAgfSwgdGljazogdW5kZWZpbmVkLCB0b2NrOiB1bmRlZmluZWQsIHBsYXk6IGZ1bmN0aW9uKCkge30sIHBhdXNlOiBmdW5jdGlvbigpIHt9IH07CiAgQ3MgPSBmaSgiY29yZTphLW5vZGU6d2FybiIpOwogIHZzID0geyAiYS1zY2VuZSI6IHRydWUsICJhLWFzc2V0cyI6IHRydWUsICJhLWFzc2V0cy1pdGVtcyI6IHRydWUsICJhLWN1YmVtYXAiOiB0cnVlLCAiYS1taXhpbiI6IHRydWUsICJhLW5vZGUiOiB0cnVlLCAiYS1lbnRpdHkiOiB0cnVlIH07CiAgYnMgPSBjbGFzcyBicyBleHRlbmRzIEhUTUxFbGVtZW50IHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpLCB0aGlzLmNvbXB1dGVkTWl4aW5TdHIgPSAiIiwgdGhpcy5oYXNMb2FkZWQgPSBmYWxzZSwgdGhpcy5pc0FOb2RlID0gdHJ1ZSwgdGhpcy5taXhpbkVscyA9IFtdOwogICAgfQogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHVzID8gdGhpcy5kb0Nvbm5lY3RlZENhbGxiYWNrKCkgOiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJhZnJhbWVyZWFkeSIsIHRoaXMuY29ubmVjdGVkQ2FsbGJhY2suYmluZCh0aGlzKSk7CiAgICB9CiAgICBkb0Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICB2YXIgZTsKICAgICAgdGhpcy5zY2VuZUVsID0gdGhpcy5jbG9zZXN0U2NlbmUoKSwgdGhpcy5zY2VuZUVsIHx8IENzKCJZb3UgYXJlIGF0dGVtcHRpbmcgdG8gYXR0YWNoIDwiICsgdGhpcy50YWdOYW1lICsgIj4gb3V0c2lkZSBvZiBhbiBBLUZyYW1lIHNjZW5lLiBBcHBlbmQgdGhpcyBlbGVtZW50IHRvIGA8YS1zY2VuZT5gIGluc3RlYWQuIiksIHRoaXMuaGFzTG9hZGVkID0gZmFsc2UsIHRoaXMuZW1pdCgibm9kZXJlYWR5IiwgdW5kZWZpbmVkLCBmYWxzZSksIHRoaXMuaXNNaXhpbiB8fCAoZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCJtaXhpbiIpKSAmJiB0aGlzLnVwZGF0ZU1peGlucyhlKTsKICAgIH0KICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLCB0MiwgbjIpIHsKICAgICAgbjIgIT09IHRoaXMuY29tcHV0ZWRNaXhpblN0ciAmJiAoZSAhPT0gIm1peGluIiB8fCB0aGlzLmlzTWl4aW4gfHwgdGhpcy51cGRhdGVNaXhpbnMobjIsIHQyKSk7CiAgICB9CiAgICBjbG9zZXN0U2NlbmUoKSB7CiAgICAgIGZvciAodmFyIGUgPSB0aGlzO2UgJiYgIWUuaXNTY2VuZTsgKQogICAgICAgIGUgPSBlLnBhcmVudEVsZW1lbnQ7CiAgICAgIHJldHVybiBlOwogICAgfQogICAgY2xvc2VzdChlKSB7CiAgICAgIGZvciAodmFyIHQyID0gdGhpcy5tYXRjaGVzIHx8IHRoaXMubW96TWF0Y2hlc1NlbGVjdG9yIHx8IHRoaXMubXNNYXRjaGVzU2VsZWN0b3IgfHwgdGhpcy5vTWF0Y2hlc1NlbGVjdG9yIHx8IHRoaXMud2Via2l0TWF0Y2hlc1NlbGVjdG9yLCBuMiA9IHRoaXM7bjIgJiYgIXQyLmNhbGwobjIsIGUpOyApCiAgICAgICAgbjIgPSBuMi5wYXJlbnRFbGVtZW50OwogICAgICByZXR1cm4gbjI7CiAgICB9CiAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgdGhpcy5oYXNMb2FkZWQgPSBmYWxzZTsKICAgIH0KICAgIGxvYWQoZSwgdDIpIHsKICAgICAgdmFyIG4yLCBpMiA9IHRoaXM7CiAgICAgIHRoaXMuaGFzTG9hZGVkIHx8ICh0MiA9IHQyIHx8IEJzLCBuMiA9IHRoaXMuZ2V0Q2hpbGRyZW4oKS5maWx0ZXIodDIpLm1hcChmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0MywgbjMpIHsKICAgICAgICAgIGlmIChlMi5oYXNMb2FkZWQpCiAgICAgICAgICAgIHJldHVybiB0MygpOwogICAgICAgICAgZTIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkIiwgdDMpLCBlMi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsIG4zKTsKICAgICAgICB9KTsKICAgICAgfSksIFByb21pc2UuYWxsU2V0dGxlZChuMikudGhlbihmdW5jdGlvbih0MykgewogICAgICAgIHQzLmZvckVhY2goZnVuY3Rpb24oZTIpIHsKICAgICAgICAgIGUyLnN0YXR1cyA9PT0gInJlamVjdGVkIiAmJiBDcygiUmVuZGVyaW5nIHNjZW5lIHdpdGggZXJyb3JzIG9uIG5vZGU6ICIsIGUyLnJlYXNvbi50YXJnZXQpOwogICAgICAgIH0pLCBpMi5pc0xvYWRpbmcgPSB0cnVlLCBpMi5zZXR1cE11dGF0aW9uT2JzZXJ2ZXIoKSwgZSAmJiBlKCksIGkyLmlzTG9hZGluZyA9IGZhbHNlLCBpMi5oYXNMb2FkZWQgPSB0cnVlLCBpMi5lbWl0KCJsb2FkZWQtcHJpdmF0ZSIsIHVuZGVmaW5lZCwgZmFsc2UpLCBpMi5lbWl0KCJsb2FkZWQiLCB1bmRlZmluZWQsIGZhbHNlKTsKICAgICAgfSkpOwogICAgfQogICAgc2V0dXBNdXRhdGlvbk9ic2VydmVyKCkgewogICAgICB2YXIgZSA9IHRoaXM7CiAgICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKHQyKSB7CiAgICAgICAgdmFyIG4yOwogICAgICAgIGZvciAobjIgPSAwO24yIDwgdDIubGVuZ3RoOyBuMisrKQogICAgICAgICAgaWYgKHQyW24yXS50eXBlID09PSAiYXR0cmlidXRlcyIpIHsKICAgICAgICAgICAgdmFyIGkyID0gdDJbbjJdLmF0dHJpYnV0ZU5hbWUsIHIyID0gd2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUuY2FsbChlLCBpMiksIG8yID0gdDJbbjJdLm9sZFZhbHVlOwogICAgICAgICAgICBlLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhpMiwgbzIsIHIyKTsKICAgICAgICAgIH0KICAgICAgfSkub2JzZXJ2ZSh0aGlzLCB7IGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZU9sZFZhbHVlOiB0cnVlIH0pOwogICAgfQogICAgZ2V0Q2hpbGRyZW4oKSB7CiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmNoaWxkcmVuLCAwKTsKICAgIH0KICAgIHVwZGF0ZU1peGlucyhlLCB0MikgewogICAgICB2YXIgbjIsIGkyLCByMiwgbzIgPSBicy5uZXdNaXhpbklkQXJyYXksIHMyID0gYnMub2xkTWl4aW5JZEFycmF5LCBhMiA9IGJzLm1peGluSWRzOwogICAgICBmb3IgKG8yLmxlbmd0aCA9IDAsIHMyLmxlbmd0aCA9IDAsIGkyID0gZSA/IG9yKGUudHJpbSgpLCAvXHMrLykgOiBvMiwgcjIgPSB0MiA/IG9yKHQyLnRyaW0oKSwgL1xzKy8pIDogczIsIGEyLm5ld01peGluSWRzID0gaTIsIGEyLm9sZE1peGluSWRzID0gcjIsIG4yID0gMDtuMiA8IHIyLmxlbmd0aDsgbjIrKykKICAgICAgICBpMi5pbmRleE9mKHIyW24yXSkgPT09IC0xICYmIHRoaXMudW5yZWdpc3Rlck1peGluKHIyW24yXSk7CiAgICAgIGZvciAodGhpcy5jb21wdXRlZE1peGluU3RyID0gIiIsIHRoaXMubWl4aW5FbHMubGVuZ3RoID0gMCwgbjIgPSAwO24yIDwgaTIubGVuZ3RoOyBuMisrKQogICAgICAgIHRoaXMucmVnaXN0ZXJNaXhpbihpMltuMl0pOwogICAgICByZXR1cm4gdGhpcy5jb21wdXRlZE1peGluU3RyICYmICh0aGlzLmNvbXB1dGVkTWl4aW5TdHIgPSB0aGlzLmNvbXB1dGVkTWl4aW5TdHIudHJpbSgpLCB3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZS5jYWxsKHRoaXMsICJtaXhpbiIsIHRoaXMuY29tcHV0ZWRNaXhpblN0cikpLCBpMi5sZW5ndGggPT09IDAgJiYgd2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGUuY2FsbCh0aGlzLCAibWl4aW4iKSwgYTI7CiAgICB9CiAgICByZWdpc3Rlck1peGluKGUpIHsKICAgICAgdmFyIHQyLCBuMiwgaTIsIHIyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk7CiAgICAgIGlmIChyMikgewogICAgICAgIGlmIChpMiA9IHIyLmdldEF0dHJpYnV0ZSgibWl4aW4iKSkKICAgICAgICAgIGZvciAodDIgPSBvcihpMi50cmltKCksIC9ccysvKSwgbjIgPSAwO24yIDwgdDIubGVuZ3RoOyBuMisrKQogICAgICAgICAgICB0aGlzLnJlZ2lzdGVyTWl4aW4odDJbbjJdKTsKICAgICAgICB0aGlzLmNvbXB1dGVkTWl4aW5TdHIgPSB0aGlzLmNvbXB1dGVkTWl4aW5TdHIgKyAiICIgKyByMi5pZCwgdGhpcy5taXhpbkVscy5wdXNoKHIyKTsKICAgICAgfSBlbHNlCiAgICAgICAgQ3MoIk5vIG1peGluIHdhcyBmb3VuZCB3aXRoIGlkIGAlc2AiLCBlKTsKICAgIH0KICAgIHNldEF0dHJpYnV0ZShlLCB0MikgewogICAgICBlID09PSAibWl4aW4iICYmIHRoaXMudXBkYXRlTWl4aW5zKHQyKSwgd2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUuY2FsbCh0aGlzLCBlLCB0Mik7CiAgICB9CiAgICB1bnJlZ2lzdGVyTWl4aW4oZSkgewogICAgICB2YXIgdDIsIG4yID0gdGhpcy5taXhpbkVsczsKICAgICAgZm9yICh0MiA9IDA7dDIgPCBuMi5sZW5ndGg7ICsrdDIpCiAgICAgICAgaWYgKGUgPT09IG4yW3QyXS5pZCkgewogICAgICAgICAgbjIuc3BsaWNlKHQyLCAxKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGVtaXQoZSwgdDIsIG4yLCBpMikgewogICAgICB2YXIgcjIgPSBicy5ldnREYXRhOwogICAgICBuMiA9PT0gdW5kZWZpbmVkICYmIChuMiA9IHRydWUpLCByMi5idWJibGVzID0gISFuMiwgcjIuZGV0YWlsID0gdDIsIGkyICYmIChyMiA9IEpyKHt9LCBpMiwgcjIpKSwgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChlLCByMikpOwogICAgfQogIH07CiAgYnMuZXZ0RGF0YSA9IHt9LCBicy5uZXdNaXhpbklkQXJyYXkgPSBbXSwgYnMub2xkTWl4aW5JZEFycmF5ID0gW10sIGJzLm1peGluSWRzID0ge30sIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgiYS1ub2RlIiwgYnMpOwogIHlzID0gZmkoImNvcmU6YS1lbnRpdHk6ZGVidWciKTsKICBJcyA9IGZpKCJjb3JlOmEtZW50aXR5Ondhcm4iKTsKICB4cyA9IFsicG9zaXRpb24iLCAicm90YXRpb24iLCAic2NhbGUiLCAidmlzaWJsZSJdOwogIFFzID0geyBvbmNlOiB0cnVlIH07CiAgTHMgPSBjbGFzcyBMcyBleHRlbmRzIGJzIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpLCB0aGlzLmNvbXBvbmVudHMgPSB7fSwgdGhpcy5pbml0aWFsaXppbmdDb21wb25lbnRzID0ge30sIHRoaXMuY29tcG9uZW50c1RvVXBkYXRlID0ge30sIHRoaXMuaXNFbnRpdHkgPSB0cnVlLCB0aGlzLmlzUGxheWluZyA9IGZhbHNlLCB0aGlzLm9iamVjdDNEID0gbmV3IFJlLkdyb3VwLCB0aGlzLm9iamVjdDNELnJvdGF0aW9uLm9yZGVyID0gIllYWiIsIHRoaXMub2JqZWN0M0QuZWwgPSB0aGlzLCB0aGlzLm9iamVjdDNETWFwID0ge30sIHRoaXMucGFyZW50RWwgPSBudWxsLCB0aGlzLnJvdGF0aW9uT2JqID0ge30sIHRoaXMuc3RhdGVzID0gW107CiAgICB9CiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSwgdDIsIG4yKSB7CiAgICAgIHZhciBpMiA9IHRoaXMuY29tcG9uZW50c1tlXTsKICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCksIGkyICYmIGkyLmp1c3RJbml0aWFsaXplZCAmJiBuMiA9PT0gIiIgPyBkZWxldGUgaTIuanVzdEluaXRpYWxpemVkIDogKGkyIHx8IG4yICE9PSBudWxsKSAmJiB0aGlzLnNldEVudGl0eUF0dHJpYnV0ZShlLCB0MiwgbjIpOwogICAgfQogICAgZG9Db25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgdmFyIGUsIHQyLCBuMiA9IHRoaXM7CiAgICAgIHN1cGVyLmRvQ29ubmVjdGVkQ2FsbGJhY2soKSwgdDIgPSB0aGlzLnNjZW5lRWwsIHRoaXMuYWRkVG9QYXJlbnQoKSwgdGhpcy5pc1NjZW5lIHx8ICh0MiA/ICEoZSA9IHQyLnF1ZXJ5U2VsZWN0b3IoImEtYXNzZXRzIikpIHx8IGUuaGFzTG9hZGVkID8gdGhpcy5sb2FkKCkgOiBlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZCIsIGZ1bmN0aW9uKCkgewogICAgICAgIG4yLmxvYWQoKTsKICAgICAgfSkgOiB0aGlzLmxvYWQoKSk7CiAgICB9CiAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgdmFyIGU7CiAgICAgIGlmICh0aGlzLnBhcmVudEVsKSB7CiAgICAgICAgZm9yIChlIGluIHRoaXMuY29tcG9uZW50cykKICAgICAgICAgIHRoaXMucmVtb3ZlQ29tcG9uZW50KGUsIGZhbHNlKTsKICAgICAgICB0aGlzLmlzU2NlbmUgfHwgKHRoaXMucmVtb3ZlRnJvbVBhcmVudCgpLCBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpLCB0aGlzLm9iamVjdDNELmVsID0gbnVsbCk7CiAgICAgIH0KICAgIH0KICAgIGdldE9iamVjdDNEKGUpIHsKICAgICAgcmV0dXJuIHRoaXMub2JqZWN0M0RNYXBbZV07CiAgICB9CiAgICBzZXRPYmplY3QzRChlLCB0MikgewogICAgICB2YXIgbjIsIGkyID0gdGhpczsKICAgICAgaWYgKCEodDIgaW5zdGFuY2VvZiBSZS5PYmplY3QzRCkpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJgRW50aXR5LnNldE9iamVjdDNEYCB3YXMgY2FsbGVkIHdpdGggYW4gb2JqZWN0IHRoYXQgd2FzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4iKTsKICAgICAgKG4yID0gdGhpcy5nZXRPYmplY3QzRChlKSkgJiYgdGhpcy5vYmplY3QzRC5yZW1vdmUobjIpLCB0Mi5lbCA9IHRoaXMsIHQyLmNoaWxkcmVuLmxlbmd0aCAmJiB0Mi50cmF2ZXJzZShmdW5jdGlvbihlMikgewogICAgICAgIGUyLmVsID0gaTI7CiAgICAgIH0pLCB0aGlzLm9iamVjdDNELmFkZCh0MiksIHRoaXMub2JqZWN0M0RNYXBbZV0gPSB0MiwgdGhpcy5lbWl0KCJvYmplY3QzZHNldCIsIHsgb2JqZWN0OiB0MiwgdHlwZTogZSB9KTsKICAgIH0KICAgIHJlbW92ZU9iamVjdDNEKGUpIHsKICAgICAgdmFyIHQyID0gdGhpcy5nZXRPYmplY3QzRChlKTsKICAgICAgdDIgPyAodGhpcy5vYmplY3QzRC5yZW1vdmUodDIpLCBkZWxldGUgdGhpcy5vYmplY3QzRE1hcFtlXSwgdGhpcy5lbWl0KCJvYmplY3QzZHJlbW92ZSIsIHsgdHlwZTogZSB9KSkgOiBJcygiVHJpZWQgdG8gcmVtb3ZlIGBPYmplY3QzRGAgb2YgdHlwZToiLCBlLCAid2hpY2ggd2FzIG5vdCBkZWZpbmVkLiIpOwogICAgfQogICAgZ2V0T3JDcmVhdGVPYmplY3QzRChlLCB0MikgewogICAgICB2YXIgbjIgPSB0aGlzLmdldE9iamVjdDNEKGUpOwogICAgICByZXR1cm4gIW4yICYmIHQyICYmIChuMiA9IG5ldyB0MiwgdGhpcy5zZXRPYmplY3QzRChlLCBuMikpLCBJcygiYGdldE9yQ3JlYXRlT2JqZWN0M0RgIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBgc2V0T2JqZWN0M0QoKWAgYW5kIGBvYmplY3QzZHNldGAgZXZlbnQgaW5zdGVhZC4iKSwgbjI7CiAgICB9CiAgICBhZGQoZSkgewogICAgICBpZiAoIWUub2JqZWN0M0QpCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUcnlpbmcgdG8gYWRkIGFuIGVsZW1lbnQgdGhhdCBkb2Vzbid0IGhhdmUgYW4gYG9iamVjdDNEYCIpOwogICAgICB0aGlzLm9iamVjdDNELmFkZChlLm9iamVjdDNEKSwgdGhpcy5lbWl0KCJjaGlsZC1hdHRhY2hlZCIsIHsgZWw6IGUgfSk7CiAgICB9CiAgICBhZGRUb1BhcmVudCgpIHsKICAgICAgdmFyIGUgPSB0aGlzLnBhcmVudEVsID0gdGhpcy5wYXJlbnROb2RlOwogICAgICBlICYmIGUuYWRkICYmICF0aGlzLmF0dGFjaGVkVG9QYXJlbnQgJiYgKGUuYWRkKHRoaXMpLCB0aGlzLmF0dGFjaGVkVG9QYXJlbnQgPSB0cnVlKTsKICAgIH0KICAgIHJlbW92ZUZyb21QYXJlbnQoKSB7CiAgICAgIHZhciBlID0gdGhpcy5wYXJlbnRFbDsKICAgICAgdGhpcy5wYXJlbnRFbC5yZW1vdmUodGhpcyksIHRoaXMuYXR0YWNoZWRUb1BhcmVudCA9IGZhbHNlLCB0aGlzLnBhcmVudEVsID0gbnVsbCwgZS5lbWl0KCJjaGlsZC1kZXRhY2hlZCIsIHsgZWw6IHRoaXMgfSk7CiAgICB9CiAgICBsb2FkKCkgewogICAgICB2YXIgZSA9IHRoaXM7CiAgICAgICF0aGlzLmhhc0xvYWRlZCAmJiB0aGlzLnBhcmVudEVsICYmIHN1cGVyLmxvYWQuY2FsbCh0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICBlLnBhcmVudEVsICYmIChlLnVwZGF0ZUNvbXBvbmVudHMoKSwgKGUuaXNTY2VuZSB8fCBlLnBhcmVudEVsLmlzUGxheWluZykgJiYgZS5wbGF5KCkpOwogICAgICB9KTsKICAgIH0KICAgIHJlbW92ZShlKSB7CiAgICAgIGUgPyB0aGlzLm9iamVjdDNELnJlbW92ZShlLm9iamVjdDNEKSA6IHRoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKTsKICAgIH0KICAgIGdldENoaWxkRW50aXRpZXMoKSB7CiAgICAgIGZvciAodmFyIGUgPSB0aGlzLmNoaWxkcmVuLCB0MiA9IFtdLCBuMiA9IDA7bjIgPCBlLmxlbmd0aDsgbjIrKykgewogICAgICAgIHZhciBpMiA9IGVbbjJdOwogICAgICAgIGkyIGluc3RhbmNlb2YgTHMgJiYgdDIucHVzaChpMik7CiAgICAgIH0KICAgICAgcmV0dXJuIHQyOwogICAgfQogICAgaW5pdENvbXBvbmVudChlLCB0MiwgbjIpIHsKICAgICAgdmFyIGkyLCByMiwgbzIsIHMyOwogICAgICBzMiA9IChvMiA9IG9yKGUsIHdzKSlbMF0sIHIyID0gbzIubGVuZ3RoID4gMiA/IG8yLnNsaWNlKDEpLmpvaW4oIl9fIikgOiBvMlsxXSwgS29bczJdICYmIChNcyh0aGlzLCBlKSB8fCB0MiAhPT0gdW5kZWZpbmVkIHx8IG4yKSAmJiAoKGUgaW4gdGhpcy5jb21wb25lbnRzKSB8fCAodGhpcy5pbml0Q29tcG9uZW50RGVwZW5kZW5jaWVzKHMyKSwgaTIgPSBuZXcgS29bczJdLkNvbXBvbmVudCh0aGlzLCB0MiwgcjIpLCB0aGlzLmlzUGxheWluZyAmJiBpMi5wbGF5KCksIHRoaXMuaGFzQXR0cmlidXRlKGUpIHx8IChpMi5qdXN0SW5pdGlhbGl6ZWQgPSB0cnVlLCB3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZS5jYWxsKHRoaXMsIGUsICIiKSksIHlzKCJDb21wb25lbnQgaW5pdGlhbGl6ZWQ6ICVzIiwgZSkpKTsKICAgIH0KICAgIGluaXRDb21wb25lbnREZXBlbmRlbmNpZXMoZSkgewogICAgICB2YXIgdDIsIG4yOwogICAgICBpZiAoS29bZV0gJiYgKHQyID0gS29bZV0uZGVwZW5kZW5jaWVzKSkKICAgICAgICBmb3IgKG4yID0gMDtuMiA8IHQyLmxlbmd0aDsgbjIrKykKICAgICAgICAgIHRoaXMuaW5pdENvbXBvbmVudCh0MltuMl0sIHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlLmNhbGwodGhpcywgdDJbbjJdKSB8fCB1bmRlZmluZWQsIHRydWUpOwogICAgfQogICAgcmVtb3ZlQ29tcG9uZW50KGUsIHQyKSB7CiAgICAgIHZhciBuMjsKICAgICAgKG4yID0gdGhpcy5jb21wb25lbnRzW2VdKSAmJiAobjIuaW5pdGlhbGl6ZWQgPyAobjIucGF1c2UoKSwgbjIucmVtb3ZlKCksIHQyICYmIChuMi5kZXN0cm95KCksIGRlbGV0ZSB0aGlzLmNvbXBvbmVudHNbZV0sIHRoaXMuaGFzQXR0cmlidXRlKGUpICYmIHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlLmNhbGwodGhpcywgZSkpLCB0aGlzLmVtaXQoImNvbXBvbmVudHJlbW92ZWQiLCBuMi5ldnREZXRhaWwsIGZhbHNlKSkgOiB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBvbmVudGluaXRpYWxpemVkIiwgZnVuY3Rpb24gbihpMikgewogICAgICAgIGkyLmRldGFpbC5uYW1lID09PSBlICYmICh0aGlzLnJlbW92ZUNvbXBvbmVudChlLCB0MiksIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29tcG9uZW50aW5pdGlhbGl6ZWQiLCBuKSk7CiAgICAgIH0pKTsKICAgIH0KICAgIHVwZGF0ZUNvbXBvbmVudHMoKSB7CiAgICAgIHZhciBlLCB0MiwgbjIsIGkyLCByMiwgbzIsIHMyID0gdGhpcy5jb21wb25lbnRzVG9VcGRhdGU7CiAgICAgIGlmICh0aGlzLmhhc0xvYWRlZCB8fCB0aGlzLmlzTG9hZGluZykgewogICAgICAgIGZvciAobjIgPSAwO24yIDwgdGhpcy5taXhpbkVscy5sZW5ndGg7IG4yKyspCiAgICAgICAgICBmb3IgKGkyIGluIHRoaXMubWl4aW5FbHNbbjJdLmNvbXBvbmVudENhY2hlKQogICAgICAgICAgICBTcyhpMikgJiYgKHMyW2kyXSA9IHRydWUpOwogICAgICAgIGlmICh0aGlzLmdldEV4dHJhQ29tcG9uZW50cykKICAgICAgICAgIGZvciAoaTIgaW4gdDIgPSB0aGlzLmdldEV4dHJhQ29tcG9uZW50cygpKQogICAgICAgICAgICBTcyhpMikgJiYgKHMyW2kyXSA9IHRydWUpOwogICAgICAgIGZvciAobjIgPSAwO24yIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgKytuMikKICAgICAgICAgIGkyID0gdGhpcy5hdHRyaWJ1dGVzW24yXS5uYW1lLCB4cy5pbmRleE9mKGkyKSA9PT0gLTEgJiYgU3MoaTIpICYmIChzMltpMl0gPSB0cnVlKTsKICAgICAgICBmb3IgKG4yID0gMDtuMiA8IHhzLmxlbmd0aDsgbjIrKykKICAgICAgICAgIGkyID0geHNbbjJdLCB0aGlzLmhhc0F0dHJpYnV0ZShpMikgJiYgdGhpcy51cGRhdGVDb21wb25lbnQoaTIsIHRoaXMuZ2V0RE9NQXR0cmlidXRlKGkyKSk7CiAgICAgICAgZm9yIChpMiBpbiBzMikKICAgICAgICAgIHIyID0gdGhpcy5nZXRET01BdHRyaWJ1dGUoaTIpLCBlID0gKG8yID0gdDIgJiYgdDJbaTJdKSA/IG8yLmNvbnN0cnVjdG9yID09PSBPYmplY3QgPyBKcihvMiwgTHIocjIgfHwge30pKSA6IHIyIHx8IG8yIDogcjIsIHRoaXMudXBkYXRlQ29tcG9uZW50KGkyLCBlKSwgZGVsZXRlIHMyW2kyXTsKICAgICAgfQogICAgfQogICAgdXBkYXRlQ29tcG9uZW50KGUsIHQyLCBuMikgewogICAgICB2YXIgaTIgPSB0aGlzLmNvbXBvbmVudHNbZV07CiAgICAgIGlmIChpMikKICAgICAgICByZXR1cm4gdDIgIT09IG51bGwgfHwgTXModGhpcywgZSkgPyB2b2lkIGkyLnVwZGF0ZVByb3BlcnRpZXModDIsIG4yKSA6IHZvaWQgdGhpcy5yZW1vdmVDb21wb25lbnQoZSwgdHJ1ZSk7CiAgICAgIHRoaXMuaW5pdENvbXBvbmVudChlLCB0MiwgZmFsc2UpOwogICAgfQogICAgcmVtb3ZlQXR0cmlidXRlKGUsIHQyKSB7CiAgICAgIHZhciBuMiA9IHRoaXMuY29tcG9uZW50c1tlXTsKICAgICAgbjIgJiYgdDIgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJlbW92ZUNvbXBvbmVudChlLCB0cnVlKSwgbjIgJiYgdDIgIT09IHVuZGVmaW5lZCA/IG4yLnJlc2V0UHJvcGVydHkodDIpIDogKGUgPT09ICJtaXhpbiIgJiYgdGhpcy5taXhpblVwZGF0ZSgiIiksIHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlLmNhbGwodGhpcywgZSkpOwogICAgfQogICAgcGxheSgpIHsKICAgICAgdmFyIGUsIHQyLCBuMjsKICAgICAgaWYgKCF0aGlzLmlzUGxheWluZyAmJiAodGhpcy5oYXNMb2FkZWQgfHwgdGhpcy5pc0xvYWRpbmcpKSB7CiAgICAgICAgZm9yIChuMiBpbiB0aGlzLmlzUGxheWluZyA9IHRydWUsIHRoaXMuY29tcG9uZW50cykKICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuMl0ucGxheSgpOwogICAgICAgIGZvciAoZSA9IHRoaXMuZ2V0Q2hpbGRFbnRpdGllcygpLCB0MiA9IDA7dDIgPCBlLmxlbmd0aDsgdDIrKykKICAgICAgICAgIGVbdDJdLnBsYXkoKTsKICAgICAgICB0aGlzLmVtaXQoInBsYXkiKTsKICAgICAgfQogICAgfQogICAgcGF1c2UoKSB7CiAgICAgIHZhciBlLCB0MiwgbjI7CiAgICAgIGlmICh0aGlzLmlzUGxheWluZykgewogICAgICAgIGZvciAobjIgaW4gdGhpcy5pc1BsYXlpbmcgPSBmYWxzZSwgdGhpcy5jb21wb25lbnRzKQogICAgICAgICAgdGhpcy5jb21wb25lbnRzW24yXS5wYXVzZSgpOwogICAgICAgIGZvciAoZSA9IHRoaXMuZ2V0Q2hpbGRFbnRpdGllcygpLCB0MiA9IDA7dDIgPCBlLmxlbmd0aDsgdDIrKykKICAgICAgICAgIGVbdDJdLnBhdXNlKCk7CiAgICAgICAgdGhpcy5lbWl0KCJwYXVzZSIpOwogICAgICB9CiAgICB9CiAgICBzZXRFbnRpdHlBdHRyaWJ1dGUoZSwgdDIsIG4yKSB7CiAgICAgIGlmIChLb1tlXSB8fCB0aGlzLmNvbXBvbmVudHNbZV0pCiAgICAgICAgdGhpcy51cGRhdGVDb21wb25lbnQoZSwgbjIpOwogICAgICBlbHNlIGlmIChlID09PSAibWl4aW4iKSB7CiAgICAgICAgaWYgKG4yID09PSB0aGlzLmNvbXB1dGVkTWl4aW5TdHIpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5taXhpblVwZGF0ZShuMiwgdDIpOwogICAgICB9CiAgICB9CiAgICBtaXhpblVwZGF0ZShlLCB0MiwgbjIpIHsKICAgICAgdmFyIGkyLCByMiwgbzIsIHMyLCBhMiA9IExzLmNvbXBvbmVudHNVcGRhdGVkLCBBMiA9IHRoaXM7CiAgICAgIGlmIChuMiB8fCAodDIgPSB0MiB8fCB0aGlzLmdldEF0dHJpYnV0ZSgibWl4aW4iKSksIHRoaXMuaGFzTG9hZGVkKSB7CiAgICAgICAgZm9yIChvMiA9IHRoaXMudXBkYXRlTWl4aW5zKGUsIHQyKSwgYTIubGVuZ3RoID0gMCwgczIgPSAwO3MyIDwgdGhpcy5taXhpbkVscy5sZW5ndGg7IHMyKyspCiAgICAgICAgICBmb3IgKGkyIGluIHRoaXMubWl4aW5FbHNbczJdLmNvbXBvbmVudENhY2hlKQogICAgICAgICAgICBhMi5pbmRleE9mKGkyKSA9PT0gLTEgJiYgKHRoaXMuY29tcG9uZW50c1tpMl0gPyB0aGlzLmNvbXBvbmVudHNbaTJdLmhhbmRsZU1peGluVXBkYXRlKCkgOiB0aGlzLmluaXRDb21wb25lbnQoaTIsIG51bGwpLCBhMi5wdXNoKGkyKSk7CiAgICAgICAgZm9yIChzMiA9IDA7czIgPCBvMi5vbGRNaXhpbklkcy5sZW5ndGg7IHMyKyspCiAgICAgICAgICBpZiAocjIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvMi5vbGRNaXhpbklkc1tzMl0pKQogICAgICAgICAgICBmb3IgKGkyIGluIHIyLmNvbXBvbmVudENhY2hlKQogICAgICAgICAgICAgIGEyLmluZGV4T2YoaTIpID09PSAtMSAmJiB0aGlzLmNvbXBvbmVudHNbaTJdICYmICh0aGlzLmdldERPTUF0dHJpYnV0ZShpMikgPyB0aGlzLmNvbXBvbmVudHNbaTJdLmhhbmRsZU1peGluVXBkYXRlKCkgOiB0aGlzLnJlbW92ZUNvbXBvbmVudChpMiwgdHJ1ZSkpOwogICAgICB9IGVsc2UKICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZC1wcml2YXRlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBBMi5taXhpblVwZGF0ZShlLCB0MiwgdHJ1ZSk7CiAgICAgICAgfSwgUXMpOwogICAgfQogICAgc2V0QXR0cmlidXRlKGUsIHQyLCBuMikgewogICAgICB2YXIgaTIsIHIyLCBvMiwgczIsIGEyLCBBMiA9IExzLnNpbmdsZVByb3BVcGRhdGU7CiAgICAgIGlmIChvMiA9IChzMiA9IGUuaW5kZXhPZih3cykpID4gMCA/IGUuc3Vic3RyaW5nKDAsIHMyKSA6IGUsICFLb1tvMl0pCiAgICAgICAgcmV0dXJuIGUgPT09ICJtaXhpbiIgJiYgdGhpcy5taXhpblVwZGF0ZSh0MiksIHZvaWQgc3VwZXIuc2V0QXR0cmlidXRlLmNhbGwodGhpcywgZSwgdDIpOwogICAgICBpZiAoIXRoaXMuY29tcG9uZW50c1tlXSAmJiB0aGlzLmhhc0F0dHJpYnV0ZShlKSAmJiB0aGlzLnVwZGF0ZUNvbXBvbmVudChlLCB3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZS5jYWxsKHRoaXMsIGUpKSwgbjIgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdDIgPT0gInN0cmluZyIgJiYgdDIubGVuZ3RoID4gMCAmJiB0eXBlb2YgTHIodDIpID09ICJzdHJpbmciKSB7CiAgICAgICAgZm9yIChhMiBpbiBBMikKICAgICAgICAgIGRlbGV0ZSBBMlthMl07CiAgICAgICAgKGkyID0gQTIpW3QyXSA9IG4yLCByMiA9IGZhbHNlOwogICAgICB9IGVsc2UKICAgICAgICBpMiA9IHQyLCByMiA9IG4yID09PSB0cnVlOwogICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudChlLCBpMiwgcjIpLCB0aGlzLnNjZW5lRWwgJiYgdGhpcy5zY2VuZUVsLmdldEF0dHJpYnV0ZSgiZGVidWciKSAmJiB0aGlzLmNvbXBvbmVudHNbZV0uZmx1c2hUb0RPTSgpOwogICAgfQogICAgZmx1c2hUb0RPTShlKSB7CiAgICAgIHZhciB0MiwgbjIsIGkyLCByMiA9IHRoaXMuY29tcG9uZW50cywgbzIgPSB0aGlzLmNoaWxkcmVuOwogICAgICBmb3IgKGkyIGluIHIyKQogICAgICAgIHIyW2kyXS5mbHVzaFRvRE9NKCk7CiAgICAgIGlmIChlKQogICAgICAgIGZvciAobjIgPSAwO24yIDwgbzIubGVuZ3RoOyArK24yKQogICAgICAgICAgKHQyID0gbzJbbjJdKS5mbHVzaFRvRE9NICYmIHQyLmZsdXNoVG9ET00oZSk7CiAgICB9CiAgICBnZXRBdHRyaWJ1dGUoZSkgewogICAgICB2YXIgdDIsIG4yLCBpMiwgcjI7CiAgICAgIHJldHVybiBlID09PSAicG9zaXRpb24iID8gdGhpcy5vYmplY3QzRC5wb3NpdGlvbiA6IGUgPT09ICJyb3RhdGlvbiIgPyAobjIgPSBSZS5NYXRoVXRpbHMucmFkVG9EZWcsIGkyID0gdGhpcy5vYmplY3QzRC5yb3RhdGlvbiwgKHIyID0gdGhpcy5yb3RhdGlvbk9iaikueCA9IG4yKGkyLngpLCByMi55ID0gbjIoaTIueSksIHIyLnogPSBuMihpMi56KSwgcjIpIDogZSA9PT0gInNjYWxlIiA/IHRoaXMub2JqZWN0M0Quc2NhbGUgOiBlID09PSAidmlzaWJsZSIgPyB0aGlzLm9iamVjdDNELnZpc2libGUgOiAodDIgPSB0aGlzLmNvbXBvbmVudHNbZV0pID8gdDIuZGF0YSA6IHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlLmNhbGwodGhpcywgZSk7CiAgICB9CiAgICBnZXRET01BdHRyaWJ1dGUoZSkgewogICAgICB2YXIgdDIgPSB0aGlzLmNvbXBvbmVudHNbZV07CiAgICAgIHJldHVybiB0MiA/IHQyLmF0dHJWYWx1ZSA6IHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlLmNhbGwodGhpcywgZSk7CiAgICB9CiAgICBhZGRTdGF0ZShlKSB7CiAgICAgIHRoaXMuaXMoZSkgfHwgKHRoaXMuc3RhdGVzLnB1c2goZSksIHRoaXMuZW1pdCgic3RhdGVhZGRlZCIsIGUpKTsKICAgIH0KICAgIHJlbW92ZVN0YXRlKGUpIHsKICAgICAgdmFyIHQyID0gdGhpcy5zdGF0ZXMuaW5kZXhPZihlKTsKICAgICAgdDIgIT09IC0xICYmICh0aGlzLnN0YXRlcy5zcGxpY2UodDIsIDEpLCB0aGlzLmVtaXQoInN0YXRlcmVtb3ZlZCIsIGUpKTsKICAgIH0KICAgIGlzKGUpIHsKICAgICAgcmV0dXJuIHRoaXMuc3RhdGVzLmluZGV4T2YoZSkgIT09IC0xOwogICAgfQogICAgaW5zcGVjdCgpIHsKICAgICAgdGhpcy5zY2VuZUVsLmNvbXBvbmVudHMuaW5zcGVjdG9yLm9wZW5JbnNwZWN0b3IodGhpcyk7CiAgICB9CiAgICBkZXN0cm95KCkgewogICAgICB2YXIgZTsKICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkKICAgICAgICBJcygiRW50aXR5IGNhbiBvbmx5IGJlIGRlc3Ryb3llZCBpZiBkZXRhY2hlZCBmcm9tIHNjZW5lZ3JhcGguIik7CiAgICAgIGVsc2UKICAgICAgICBmb3IgKGUgaW4gdGhpcy5jb21wb25lbnRzKQogICAgICAgICAgdGhpcy5jb21wb25lbnRzW2VdLmRlc3Ryb3koKTsKICAgIH0KICB9OwogIExzLmNvbXBvbmVudHNVcGRhdGVkID0gW10sIExzLnNpbmdsZVByb3BVcGRhdGUgPSB7fSwgY3VzdG9tRWxlbWVudHMuZGVmaW5lKCJhLWVudGl0eSIsIExzKSwgUmkoKSAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiaW5pdGlhbCIsIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSIsIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIDEpOwogICAgICB9LCA1MDApOwogICAgfSwgNTAwKTsKICB9KTsKICBrcyA9IGZpKCJjb3JlOmEtc2NlbmU6d2FybiIpOwogIFRzID0gUmkoKTsKICBScyA9IFNpKCk7CiAgRnMgPSBiaTsKICBVcyA9IGNsYXNzIFVzIGV4dGVuZHMgTHMgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHZhciBlOwogICAgICBzdXBlcigpLCAoZSA9IHRoaXMpLmNsb2NrID0gbmV3IFJlLkNsb2NrLCBlLmlzSU9TID0gVHMsIGUuaXNNb2JpbGUgPSBScywgZS5oYXNXZWJYUiA9IEZzLCBlLmlzQVIgPSBmYWxzZSwgZS5pc1NjZW5lID0gdHJ1ZSwgZS5vYmplY3QzRCA9IG5ldyBSZS5TY2VuZSwgZS5yZXNpemUgPSBlLnJlc2l6ZS5iaW5kKGUpLCBlLnJlbmRlciA9IGUucmVuZGVyLmJpbmQoZSksIGUuc3lzdGVtcyA9IHt9LCBlLnN5c3RlbU5hbWVzID0gW10sIGUudGltZSA9IGUuZGVsdGEgPSAwLCBlLnVzZWRPZmZlclNlc3Npb24gPSBmYWxzZSwgZS5jb21wb25lbnRPcmRlciA9IFtdLCBlLmJlaGF2aW9ycyA9IHt9LCBlLmhhc0xvYWRlZCA9IGZhbHNlLCBlLmlzUGxheWluZyA9IGZhbHNlLCBlLm9yaWdpbmFsSFRNTCA9IGUuaW5uZXJIVE1MOwogICAgfQogICAgYWRkRnVsbFNjcmVlblN0eWxlcygpIHsKICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoImEtZnVsbHNjcmVlbiIpOwogICAgfQogICAgcmVtb3ZlRnVsbFNjcmVlblN0eWxlcygpIHsKICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoImEtZnVsbHNjcmVlbiIpOwogICAgfQogICAgZG9Db25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgdmFyIGUgPSB0aGlzLCB0MiA9IHRoaXMuaGFzQXR0cmlidXRlKCJlbWJlZGRlZCIpOwogICAgICB0aGlzLnNldEF0dHJpYnV0ZSgiaW5zcGVjdG9yIiwgIiIpLCB0aGlzLnNldEF0dHJpYnV0ZSgia2V5Ym9hcmQtc2hvcnRjdXRzIiwgIiIpLCB0aGlzLnNldEF0dHJpYnV0ZSgic2NyZWVuc2hvdCIsICIiKSwgdGhpcy5zZXRBdHRyaWJ1dGUoInhyLW1vZGUtdWkiLCAiIiksIHRoaXMuc2V0QXR0cmlidXRlKCJkZXZpY2Utb3JpZW50YXRpb24tcGVybWlzc2lvbi11aSIsICIiKSwgc3VwZXIuZG9Db25uZWN0ZWRDYWxsYmFjaygpLCBmdW5jdGlvbihlMikgewogICAgICAgIHZhciB0MzsKICAgICAgICBmdW5jdGlvbiBuMigpIHsKICAgICAgICAgIGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8IGUyLmV4aXRWUigpLCBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKSwgZG9jdW1lbnQuYm9keS5mb2N1cygpOwogICAgICAgIH0KICAgICAgICAodDMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSkuY2xhc3NMaXN0LmFkZCgiYS1jYW52YXMiKSwgdDMuZGF0YXNldC5hZnJhbWVDYW52YXMgPSB0cnVlLCBlMi5hcHBlbmRDaGlsZCh0MyksIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZ1bGxzY3JlZW5jaGFuZ2UiLCBuMiksIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vemZ1bGxzY3JlZW5jaGFuZ2UiLCBuMiksIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCBuMiksIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIk1TRnVsbHNjcmVlbkNoYW5nZSIsIG4yKSwgdDMuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIiwgZnVuY3Rpb24oZTMpIHsKICAgICAgICAgIGUzLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfSwgeyBwYXNzaXZlOiBmYWxzZSB9KSwgZTIuY2FudmFzID0gdDMsIGUyLmVtaXQoInJlbmRlci10YXJnZXQtbG9hZGVkIiwgeyB0YXJnZXQ6IHQzIH0pLCBzZXRUaW1lb3V0KGUyLnJlc2l6ZS5iaW5kKGUyKSwgMCk7CiAgICAgIH0odGhpcyksIHRoaXMuc2V0dXBSZW5kZXJlcigpLCBmdW5jdGlvbihlMiwgdDMpIHsKICAgICAgICBmbyA9IHQzOwogICAgICAgIHZhciBuMiwgaTIsIHIyLCBvMiwgczIsIGEyLCBBMiwgbDIsIGMyLCBoMiwgZDIgPSAoZ28gPSBlMikuaGFzQXR0cmlidXRlKHZvKSA/IENvLnBhcnNlKGdvLmdldEF0dHJpYnV0ZSh2bykpIDogdW5kZWZpbmVkLCB1MiA9IGQyICYmIGQyLmRvdHNDb2xvciB8fCAid2hpdGUiLCBnMiA9IGQyICYmIGQyLmJhY2tncm91bmRDb2xvciB8fCAiIzI0Q0FGRiI7CiAgICAgICAgKGQyID09PSB1bmRlZmluZWQgfHwgZDIuZW5hYmxlZCA9PT0gInRydWUiIHx8IGQyLmVuYWJsZWQgPT09IHVuZGVmaW5lZCkgJiYgKG4yID0gbmV3IFJlLlNjZW5lLCBpMiA9IG5ldyBSZS5TcGhlcmVHZW9tZXRyeSgwLjIsIDM2LCAxOCwgMCwgMiAqIE1hdGguUEksIDAsIE1hdGguUEkpLCByMiA9IG5ldyBSZS5NZXNoQmFzaWNNYXRlcmlhbCh7IGNvbG9yOiB1MiB9KSwgbzIgPSBuZXcgUmUuTWVzaChpMiwgcjIpLCBzMiA9IG8yLmNsb25lKCksIGEyID0gbzIuY2xvbmUoKSwgQTIgPSBuZXcgUmUuUGVyc3BlY3RpdmVDYW1lcmEoODAsIHdpbmRvdy5pbm5lcldpZHRoIC8gd2luZG93LmlubmVySGVpZ2h0LCAwLjAwMDUsIDFlNCksIGwyID0gbmV3IFJlLkNsb2NrLCBjMiA9IDAsIGgyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICBnby5yZW5kZXJlci5yZW5kZXIobjIsIEEyKSwgYzIgPSBsMi5nZXRFbGFwc2VkVGltZSgpICUgNCwgbzIudmlzaWJsZSA9IGMyID49IDEsIHMyLnZpc2libGUgPSBjMiA+PSAyLCBhMi52aXNpYmxlID0gYzIgPj0gMzsKICAgICAgICB9LCBuMi5iYWNrZ3JvdW5kID0gbmV3IFJlLkNvbG9yKGcyKSwgbjIuYWRkKEEyKSwgbzIucG9zaXRpb24uc2V0KC0xLCAwLCAtMTUpLCBzMi5wb3NpdGlvbi5zZXQoMCwgMCwgLTE1KSwgYTIucG9zaXRpb24uc2V0KDEsIDAsIC0xNSksIEEyLmFkZChvMiksIEEyLmFkZChzMiksIEEyLmFkZChhMiksIChwbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5jbGFzc05hbWUgPSAiYS1sb2FkZXItdGl0bGUiLCBwby5pbm5lckhUTUwgPSBkb2N1bWVudC50aXRsZSwgcG8uc3R5bGUuZGlzcGxheSA9ICJub25lIiwgcG8uc2V0QXR0cmlidXRlKGhpLCAiIiksIGdvLmFwcGVuZENoaWxkKHBvKSwgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgIGdvLmhhc0xvYWRlZCB8fCAoQm8oQTIpLCBwby5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIiwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBCbyhBMik7CiAgICAgICAgICB9KSwgZ28ucmVuZGVyZXIuc2V0QW5pbWF0aW9uTG9vcChoMikpOwogICAgICAgIH0sIDIwMCkpOwogICAgICB9KHRoaXMsIEdzKSwgdGhpcy5yZXNpemUoKSwgdDIgfHwgdGhpcy5hZGRGdWxsU2NyZWVuU3R5bGVzKCksIGFvKCkgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCBEcy5iaW5kKHRoaXMpKSwgZnVuY3Rpb24oZTIpIHsKICAgICAgICB2YXIgdDMsIG4yID0gZG9jdW1lbnQuaGVhZCwgaTIgPSBuMi5xdWVyeVNlbGVjdG9yKCJzY3JpcHQiKSwgcjIgPSBbXTsKICAgICAgICByZXR1cm4gY28uZm9yRWFjaChvMiksIGUyLmlzSU9TICYmIGhvLmZvckVhY2gobzIpLCByMjsKICAgICAgICBmdW5jdGlvbiBvMihlMykgewogICAgICAgICAgZTMgJiYgIWUzLmV4aXN0cygpICYmICh0MyA9IGZ1bmN0aW9uKGU0KSB7CiAgICAgICAgICAgIGlmIChlNCAmJiBlNC50YWdOYW1lKSB7CiAgICAgICAgICAgICAgdmFyIHQ0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlNC50YWdOYW1lKTsKICAgICAgICAgICAgICByZXR1cm4gdDQuc2V0QXR0cmlidXRlKGhpLCAiIiksIEpyKHQ0LCBlNC5hdHRyaWJ1dGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfShlMyksIHQzICYmIChpMiA/IGkyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQzLCBpMikgOiBuMi5hcHBlbmRDaGlsZCh0MyksIHIyLnB1c2godDMpKSk7CiAgICAgICAgfQogICAgICB9KHRoaXMpLCBmdW5jdGlvbihlMikgewogICAgICAgIGlmIChlMi5pc01vYmlsZSkgewogICAgICAgICAgdmFyIHQzID0gZTIud2FrZWxvY2sgPSBuZXcgKEVvKCkpOwogICAgICAgICAgZTIuYWRkRXZlbnRMaXN0ZW5lcigiZW50ZXItdnIiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdDMucmVxdWVzdCgpOwogICAgICAgICAgfSksIGUyLmFkZEV2ZW50TGlzdGVuZXIoImV4aXQtdnIiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdDMucmVsZWFzZSgpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KHRoaXMpLCB0aGlzLmVudGVyVlJCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGUuZW50ZXJWUigpOwogICAgICB9LCB0aGlzLmV4aXRWUkJvdW5kID0gZnVuY3Rpb24oKSB7CiAgICAgICAgZS5leGl0VlIoKTsKICAgICAgfSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNlc3Npb25lbmQiLCB0aGlzLnJlc2l6ZSksIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiY2FtZXJhcmVhZHkiLCBmdW5jdGlvbigpIHsKICAgICAgICBlLmF0dGFjaGVkQ2FsbGJhY2tQb3N0Q2FtZXJhKCk7CiAgICAgIH0pLCB0aGlzLmluaXRTeXN0ZW1zKCksIHRoaXMuY29tcG9uZW50T3JkZXIgPSBPcyhLbywgdGhpcy5jb21wb25lbnRPcmRlciksIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiY29tcG9uZW50cmVnaXN0ZXJlZCIsIGZ1bmN0aW9uKCkgewogICAgICAgIGUuY29tcG9uZW50T3JkZXIgPSBPcyhLbywgZS5jb21wb25lbnRPcmRlcik7CiAgICAgIH0pLCB0aGlzLmhhc1dlYlhSICYmIG5hdmlnYXRvci54ciAmJiBuYXZpZ2F0b3IueHIuYWRkRXZlbnRMaXN0ZW5lciAmJiBuYXZpZ2F0b3IueHIuYWRkRXZlbnRMaXN0ZW5lcigic2Vzc2lvbmdyYW50ZWQiLCBmdW5jdGlvbigpIHsKICAgICAgICBlLmVudGVyVlIoKTsKICAgICAgfSk7CiAgICB9CiAgICBhdHRhY2hlZENhbGxiYWNrUG9zdENhbWVyYSgpIHsKICAgICAgdmFyIGUgPSB0aGlzOwogICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIHVuZGVmaW5lZCksIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCBmdW5jdGlvbigpIHsKICAgICAgICBlLmlzSU9TID8gc2V0VGltZW91dChlLnJlc2l6ZSwgMTAwKSA6IGUucmVzaXplKCk7CiAgICAgIH0pLCB0aGlzLnBsYXkoKSwgYm8ucHVzaCh0aGlzKTsKICAgIH0KICAgIGluaXRTeXN0ZW1zKCkgewogICAgICB2YXIgZTsKICAgICAgZm9yIChlIGluIHRoaXMuaW5pdFN5c3RlbSgiY2FtZXJhIiksIGZzKQogICAgICAgIGUgIT09ICJjYW1lcmEiICYmIHRoaXMuaW5pdFN5c3RlbShlKTsKICAgIH0KICAgIGluaXRTeXN0ZW0oZSkgewogICAgICB0aGlzLnN5c3RlbXNbZV0gfHwgKHRoaXMuc3lzdGVtc1tlXSA9IG5ldyBmc1tlXSh0aGlzKSwgdGhpcy5zeXN0ZW1OYW1lcy5wdXNoKGUpKTsKICAgIH0KICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICB2YXIgZSA9IGJvLmluZGV4T2YodGhpcyk7CiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCksIGJvLnNwbGljZShlLCAxKSwgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlc3Npb25lbmQiLCB0aGlzLnJlc2l6ZSksIHRoaXMucmVtb3ZlRnVsbFNjcmVlblN0eWxlcygpLCB0aGlzLnJlbmRlcmVyLmRpc3Bvc2UoKTsKICAgIH0KICAgIGFkZEJlaGF2aW9yKGUpIHsKICAgICAgdmFyIHQyLCBuMiwgaTIgPSB0aGlzLmJlaGF2aW9yc1tlLm5hbWVdOwogICAgICBmb3IgKG4yIGluIGkyIHx8IChpMiA9IHRoaXMuYmVoYXZpb3JzW2UubmFtZV0gPSB7IHRpY2s6IHsgaW5Vc2U6IGZhbHNlLCBhcnJheTogW10sIG1hcmtlZEZvclJlbW92YWw6IFtdIH0sIHRvY2s6IHsgaW5Vc2U6IGZhbHNlLCBhcnJheTogW10sIG1hcmtlZEZvclJlbW92YWw6IFtdIH0gfSksIGkyKQogICAgICAgIGlmIChlW24yXSkgewogICAgICAgICAgaWYgKCh0MiA9IGkyW24yXSkuaW5Vc2UpIHsKICAgICAgICAgICAgdmFyIHIyID0gdDIubWFya2VkRm9yUmVtb3ZhbC5pbmRleE9mKGUpOwogICAgICAgICAgICByMiAhPT0gLTEgJiYgdDIubWFya2VkRm9yUmVtb3ZhbC5zcGxpY2UocjIsIDEpOwogICAgICAgICAgfQogICAgICAgICAgdDIuYXJyYXkuaW5kZXhPZihlKSA9PT0gLTEgJiYgdDIuYXJyYXkucHVzaChlKTsKICAgICAgICB9CiAgICB9CiAgICBnZXRQb2ludGVyTG9ja0VsZW1lbnQoKSB7CiAgICAgIHJldHVybiBkb2N1bWVudC5wb2ludGVyTG9ja0VsZW1lbnQ7CiAgICB9CiAgICBjaGVja0hlYWRzZXRDb25uZWN0ZWQoKSB7CiAgICAgIHJldHVybiB3aSgpOwogICAgfQogICAgZW50ZXJBUigpIHsKICAgICAgdmFyIGU7CiAgICAgIGlmICghdGhpcy5oYXNXZWJYUikKICAgICAgICB0aHJvdyBlID0gIkZhaWxlZCB0byBlbnRlciBBUiBtb2RlLCBXZWJYUiBub3Qgc3VwcG9ydGVkLiIsIG5ldyBFcnJvcihlKTsKICAgICAgaWYgKCF4aSgpKQogICAgICAgIHRocm93IGUgPSAiRmFpbGVkIHRvIGVudGVyIEFSLCBXZWJYUiBpbW1lcnNpdmUtYXIgbW9kZSBub3Qgc3VwcG9ydGVkIGluIHlvdXIgYnJvd3NlciBvciBkZXZpY2UuIiwgbmV3IEVycm9yKGUpOwogICAgICByZXR1cm4gdGhpcy5lbnRlclZSKHRydWUpOwogICAgfQogICAgZW50ZXJWUihlLCB0MikgewogICAgICB2YXIgbjIsIGkyID0gdGhpcywgcjIgPSBpMi5yZW5kZXJlci54cjsKICAgICAgaWYgKHQyICYmICghbmF2aWdhdG9yLnhyIHx8ICFuYXZpZ2F0b3IueHIub2ZmZXJTZXNzaW9uKSkKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCJPZmZlclNlc3Npb24gaXMgbm90IHN1cHBvcnRlZC4iKTsKICAgICAgaWYgKGkyLnVzZWRPZmZlclNlc3Npb24gJiYgdDIpCiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgiT2ZmZXJTZXNzaW9uIHdhcyBhbHJlYWR5IGNhbGxlZC4iKTsKICAgICAgaWYgKHRoaXMuaXMoInZyLW1vZGUiKSkKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCJBbHJlYWR5IGluIFZSLiIpOwogICAgICBpZiAodGhpcy5jaGVja0hlYWRzZXRDb25uZWN0ZWQoKSB8fCB0aGlzLmlzTW9iaWxlKSB7CiAgICAgICAgdmFyIG8yID0gaTIuZ2V0QXR0cmlidXRlKCJyZW5kZXJlciIpOwogICAgICAgIGlmIChyMi5lbmFibGVkID0gdHJ1ZSwgdGhpcy5oYXNXZWJYUikgewogICAgICAgICAgdGhpcy54clNlc3Npb24gJiYgdGhpcy54clNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kIiwgdGhpcy5leGl0VlJCb3VuZCk7CiAgICAgICAgICB2YXIgczIgPSB0aGlzLnNjZW5lRWwuc3lzdGVtcy53ZWJ4ci5zZXNzaW9uUmVmZXJlbmNlU3BhY2VUeXBlOwogICAgICAgICAgcjIuc2V0UmVmZXJlbmNlU3BhY2VUeXBlKHMyKTsKICAgICAgICAgIHZhciBhMiA9IGUgPyAiaW1tZXJzaXZlLWFyIiA6ICJpbW1lcnNpdmUtdnIiOwogICAgICAgICAgcmV0dXJuIG4yID0gdGhpcy5zY2VuZUVsLnN5c3RlbXMud2VieHIuc2Vzc2lvbkNvbmZpZ3VyYXRpb24sIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUyLCBzMykgewogICAgICAgICAgICB2YXIgbDIgPSB0MiA/IG5hdmlnYXRvci54ci5vZmZlclNlc3Npb24uYmluZChuYXZpZ2F0b3IueHIpIDogbmF2aWdhdG9yLnhyLnJlcXVlc3RTZXNzaW9uLmJpbmQobmF2aWdhdG9yLnhyKTsKICAgICAgICAgICAgaTIudXNlZE9mZmVyU2Vzc2lvbiB8PSB0MiwgbDIoYTIsIG4yKS50aGVuKGZ1bmN0aW9uKHM0KSB7CiAgICAgICAgICAgICAgdDIgJiYgKGkyLnVzZWRPZmZlclNlc3Npb24gPSBmYWxzZSksIHIyLmxheWVyc0VuYWJsZWQgPSBuMi5yZXF1aXJlZEZlYXR1cmVzLmluZGV4T2YoImxheWVycyIpICE9PSAtMSwgcjIuc2V0U2Vzc2lvbihzNCkudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHIyLnNldEZvdmVhdGlvbihvMi5mb3ZlYXRpb25MZXZlbCksIGkyLnhyU2Vzc2lvbiA9IHM0LCBpMi5zeXN0ZW1zLnJlbmRlcmVyLnNldFdlYlhSRnJhbWVSYXRlKHM0KSwgczQuYWRkRXZlbnRMaXN0ZW5lcigiZW5kIiwgaTIuZXhpdFZSQm91bmQpLCBBMihlMik7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgICAgICAgczMobmV3IEVycm9yKCJGYWlsZWQgdG8gZW50ZXIgIiArIChhMiA9PT0gImltbWVyc2l2ZS1hciIgPyAiQVIiIDogIlZSIikgKyAiIG1vZGUgKGByZXF1ZXN0U2Vzc2lvbmApIiwgeyBjYXVzZTogZTMgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBlbnRlciAiICsgKGUgPyAiQVIiIDogIlZSIikgKyAiIG5vIFdlYlhSIik7CiAgICAgIH0KICAgICAgcmV0dXJuIEEyKCksIFByb21pc2UucmVzb2x2ZSgpOwogICAgICBmdW5jdGlvbiBBMih0MykgewogICAgICAgIHZhciBuMzsKICAgICAgICBlID8gaTIuYWRkU3RhdGUoImFyLW1vZGUiKSA6IGkyLmFkZFN0YXRlKCJ2ci1tb2RlIiksIGkyLmVtaXQoImVudGVyLXZyIiwgeyB0YXJnZXQ6IGkyIH0pLCAhaTIuaGFzV2ViWFIgJiYgaTIuaXNNb2JpbGUgJiYgc2NyZWVuLm9yaWVudGF0aW9uICYmIHNjcmVlbi5vcmllbnRhdGlvbi5sb2NrICYmIHNjcmVlbi5vcmllbnRhdGlvbi5sb2NrKCJsYW5kc2NhcGUiKSwgaTIuYWRkRnVsbFNjcmVlblN0eWxlcygpLCBpMi5pc01vYmlsZSB8fCBpMi5jaGVja0hlYWRzZXRDb25uZWN0ZWQoKSB8fCAoKG4zID0gaTIuY2FudmFzKS5yZXF1ZXN0RnVsbHNjcmVlbiB8fCBuMy53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbiB8fCBuMy5tb3pSZXF1ZXN0RnVsbFNjcmVlbiB8fCBuMy5tc1JlcXVlc3RGdWxsc2NyZWVuKS5hcHBseShuMywgW3sgbmF2aWdhdGlvblVJOiAiaGlkZSIgfV0pLCBpMi5yZXNpemUoKSwgdDMgJiYgdDMoKTsKICAgICAgfQogICAgfQogICAgZXhpdFZSKCkgewogICAgICB2YXIgZSA9IHRoaXMsIHQyID0gdGhpcy5yZW5kZXJlci54cjsKICAgICAgaWYgKCF0aGlzLmlzKCJ2ci1tb2RlIikgJiYgIXRoaXMuaXMoImFyLW1vZGUiKSkKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCJOb3QgaW4gaW1tZXJzaXZlIG1vZGUuIik7CiAgICAgIGlmICh0aGlzLmNoZWNrSGVhZHNldENvbm5lY3RlZCgpIHx8IHRoaXMuaXNNb2JpbGUpIHsKICAgICAgICBpZiAodDIuZW5hYmxlZCA9IGZhbHNlLCAhdGhpcy5oYXNXZWJYUikKICAgICAgICAgIHRocm93IEVycm9yKCJGYWlsZWQgdG8gZXhpdCBWUiAtIG5vIFdlYlhSIik7CiAgICAgICAgdGhpcy54clNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kIiwgdGhpcy5leGl0VlJCb3VuZCksIHRoaXMueHJTZXNzaW9uLmVuZCgpLnRoZW4oZnVuY3Rpb24oKSB7fSwgZnVuY3Rpb24oKSB7fSksIHRoaXMueHJTZXNzaW9uID0gdW5kZWZpbmVkOwogICAgICB9IGVsc2UKICAgICAgICAoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQpICYmIChkb2N1bWVudC5leGl0RnVsbHNjcmVlbiA/IGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCkgOiBkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuID8gZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpIDogZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4gJiYgZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKSk7CiAgICAgIHJldHVybiBlLnJlbW92ZVN0YXRlKCJ2ci1tb2RlIiksIGUucmVtb3ZlU3RhdGUoImFyLW1vZGUiKSwgZS5pc01vYmlsZSAmJiBzY3JlZW4ub3JpZW50YXRpb24gJiYgc2NyZWVuLm9yaWVudGF0aW9uLnVubG9jayAmJiBzY3JlZW4ub3JpZW50YXRpb24udW5sb2NrKCksIGUuaGFzQXR0cmlidXRlKCJlbWJlZGRlZCIpICYmIGUucmVtb3ZlRnVsbFNjcmVlblN0eWxlcygpLCBlLnJlc2l6ZSgpLCBlLmlzSU9TICYmIGxyKGUuY2FudmFzKSwgZS5yZW5kZXJlci5zZXRQaXhlbFJhdGlvKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSwgZS5lbWl0KCJleGl0LXZyIiwgeyB0YXJnZXQ6IGUgfSksIFByb21pc2UucmVzb2x2ZSgpOwogICAgfQogICAgZ2V0QXR0cmlidXRlKGUpIHsKICAgICAgdmFyIHQyID0gdGhpcy5zeXN0ZW1zW2VdOwogICAgICByZXR1cm4gdDIgPyB0Mi5kYXRhIDogTHMucHJvdG90eXBlLmdldEF0dHJpYnV0ZS5jYWxsKHRoaXMsIGUpOwogICAgfQogICAgZ2V0RE9NQXR0cmlidXRlKGUpIHsKICAgICAgdmFyIHQyID0gdGhpcy5zeXN0ZW1zW2VdOwogICAgICByZXR1cm4gdDIgPyB0Mi5kYXRhIDogTHMucHJvdG90eXBlLmdldERPTUF0dHJpYnV0ZS5jYWxsKHRoaXMsIGUpOwogICAgfQogICAgc2V0QXR0cmlidXRlKGUsIHQyLCBuMikgewogICAgICBpZiAoZnNbZV0pIHsKICAgICAgICBicy5wcm90b3R5cGUuc2V0QXR0cmlidXRlLmNhbGwodGhpcywgZSwgdDIpOwogICAgICAgIHZhciBpMiA9IHRoaXMuc3lzdGVtc1tlXTsKICAgICAgICBpMiAmJiBpMi51cGRhdGVQcm9wZXJ0aWVzKHQyKTsKICAgICAgfSBlbHNlCiAgICAgICAgTHMucHJvdG90eXBlLnNldEF0dHJpYnV0ZS5jYWxsKHRoaXMsIGUsIHQyLCBuMik7CiAgICB9CiAgICByZW1vdmVCZWhhdmlvcihlKSB7CiAgICAgIHZhciB0MiwgbjIsIGkyLCByMiA9IHRoaXMuYmVoYXZpb3JzW2UubmFtZV07CiAgICAgIGZvciAobjIgaW4gcjIpCiAgICAgICAgZVtuMl0gJiYgKGkyID0gKHQyID0gcjJbbjJdKS5hcnJheS5pbmRleE9mKGUpKSAhPT0gLTEgJiYgKHQyLmluVXNlID8gdDIubWFya2VkRm9yUmVtb3ZhbC5pbmRleE9mKGUpID09PSAtMSAmJiB0Mi5tYXJrZWRGb3JSZW1vdmFsLnB1c2goZSkgOiAodDIuYXJyYXlbaTJdID0gdDIuYXJyYXlbdDIuYXJyYXkubGVuZ3RoIC0gMV0sIHQyLmFycmF5LnBvcCgpKSk7CiAgICB9CiAgICByZXNpemUoKSB7CiAgICAgIHZhciBlLCB0MiwgbjIgPSB0aGlzLmNhbWVyYSwgaTIgPSB0aGlzLmNhbnZhcywgcjIgPSB0aGlzLnJlbmRlcmVyLnhyLmlzUHJlc2VudGluZzsKICAgICAgZSA9IHRoaXMucmVuZGVyZXIueHIuZW5hYmxlZCAmJiByMiwgIW4yIHx8ICFpMiB8fCB0aGlzLmlzKCJ2ci1tb2RlIikgJiYgKHRoaXMuaXNNb2JpbGUgfHwgZSkgfHwgKHQyID0gR3MoaTIsIHRoaXMuZ2V0QXR0cmlidXRlKCJlbWJlZGRlZCIpICYmICF0aGlzLmlzKCJ2ci1tb2RlIiksIHRoaXMubWF4Q2FudmFzU2l6ZSwgdGhpcy5pcygidnItbW9kZSIpKSwgbjIuYXNwZWN0ID0gdDIud2lkdGggLyB0Mi5oZWlnaHQsIG4yLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSwgdGhpcy5yZW5kZXJlci5zZXRTaXplKHQyLndpZHRoLCB0Mi5oZWlnaHQsIGZhbHNlKSwgdGhpcy5lbWl0KCJyZW5kZXJlcnJlc2l6ZSIsIG51bGwsIGZhbHNlKSk7CiAgICB9CiAgICBzZXR1cFJlbmRlcmVyKCkgewogICAgICB2YXIgZSwgdDIsIG4yLCBpMiA9IHRoaXM7CiAgICAgIG4yID0geyBhbHBoYTogdHJ1ZSwgYW50aWFsaWFzOiAhUnMsIGNhbnZhczogdGhpcy5jYW52YXMsIGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGZhbHNlLCBwb3dlclByZWZlcmVuY2U6ICJoaWdoLXBlcmZvcm1hbmNlIiB9LCB0aGlzLm1heENhbnZhc1NpemUgPSB7IGhlaWdodDogLTEsIHdpZHRoOiAtMSB9LCB0aGlzLmhhc0F0dHJpYnV0ZSgicmVuZGVyZXIiKSAmJiAoKHQyID0gTHIodGhpcy5nZXRBdHRyaWJ1dGUoInJlbmRlcmVyIikpKS5wcmVjaXNpb24gJiYgKG4yLnByZWNpc2lvbiA9IHQyLnByZWNpc2lvbiArICJwIiksIHQyLmFudGlhbGlhcyAmJiB0Mi5hbnRpYWxpYXMgIT09ICJhdXRvIiAmJiAobjIuYW50aWFsaWFzID0gdDIuYW50aWFsaWFzID09PSAidHJ1ZSIpLCB0Mi5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIHQyLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgIT09ICJhdXRvIiAmJiAobjIubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA9IHQyLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPT09ICJ0cnVlIiksIHQyLmFscGhhICYmIChuMi5hbHBoYSA9IHQyLmFscGhhID09PSAidHJ1ZSIpLCB0Mi5zdGVuY2lsICYmIChuMi5zdGVuY2lsID0gdDIuc3RlbmNpbCA9PT0gInRydWUiKSwgdDIubXVsdGl2aWV3U3RlcmVvICYmIChuMi5tdWx0aXZpZXdTdGVyZW8gPSB0Mi5tdWx0aXZpZXdTdGVyZW8gPT09ICJ0cnVlIiksIHRoaXMubWF4Q2FudmFzU2l6ZSA9IHsgd2lkdGg6IHQyLm1heENhbnZhc1dpZHRoID8gcGFyc2VJbnQodDIubWF4Q2FudmFzV2lkdGgpIDogdGhpcy5tYXhDYW52YXNTaXplLndpZHRoLCBoZWlnaHQ6IHQyLm1heENhbnZhc0hlaWdodCA/IHBhcnNlSW50KHQyLm1heENhbnZhc0hlaWdodCkgOiB0aGlzLm1heENhbnZhc1NpemUuaGVpZ2h0IH0pOwogICAgICB2YXIgcjIgPSBbIldlYkdMUmVuZGVyZXIiLCAiV2ViR1BVUmVuZGVyZXIiXS5maW5kKGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgcmV0dXJuIFJlW2UyXTsKICAgICAgfSk7CiAgICAgIChlID0gdGhpcy5yZW5kZXJlciA9IG5ldyBSZVtyMl0objIpKS54ci5zZXRQb3NlVGFyZ2V0IHx8IChlLnhyLnNldFBvc2VUYXJnZXQgPSBmdW5jdGlvbigpIHt9KSwgZS5zZXRQaXhlbFJhdGlvKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSwgdGhpcy5jYW1lcmEgJiYgZS54ci5zZXRQb3NlVGFyZ2V0KHRoaXMuY2FtZXJhLmVsLm9iamVjdDNEKSwgdGhpcy5hZGRFdmVudExpc3RlbmVyKCJjYW1lcmEtc2V0LWFjdGl2ZSIsIGZ1bmN0aW9uKCkgewogICAgICAgIGUueHIuc2V0UG9zZVRhcmdldChpMi5jYW1lcmEuZWwub2JqZWN0M0QpOwogICAgICB9KTsKICAgIH0KICAgIHBsYXkoKSB7CiAgICAgIHZhciBlID0gdGhpcywgdDIgPSB0aGlzOwogICAgICB0aGlzLnJlbmRlclN0YXJ0ZWQgPyBMcy5wcm90b3R5cGUucGxheS5jYWxsKHRoaXMpIDogKHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGUyID0gdGhpcy5yZW5kZXJlcjsKICAgICAgICBMcy5wcm90b3R5cGUucGxheS5jYWxsKHRoaXMpLCB0Mi5yZW5kZXJTdGFydGVkIHx8ICh0Mi5yZXNpemUoKSwgdDIucmVuZGVyZXIgJiYgKHdpbmRvdy5wZXJmb3JtYW5jZSAmJiB3aW5kb3cucGVyZm9ybWFuY2UubWFyaygicmVuZGVyLXN0YXJ0ZWQiKSwgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsIEJvKSwgcG8gJiYgKHBvLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIpLCBlMi5zZXRBbmltYXRpb25Mb29wKHRoaXMucmVuZGVyKSwgdDIucmVuZGVyU3RhcnRlZCA9IHRydWUsIHQyLmVtaXQoInJlbmRlcnN0YXJ0IikpKTsKICAgICAgfSksIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgTHMucHJvdG90eXBlLmxvYWQuY2FsbChlKTsKICAgICAgfSkpOwogICAgfQogICAgdXBkYXRlQ29tcG9uZW50KGUpIHsKICAgICAgZSBpbiBmcyB8fCBMcy5wcm90b3R5cGUudXBkYXRlQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgICB0aWNrKGUsIHQyKSB7CiAgICAgIHZhciBuMiwgaTIgPSB0aGlzLnN5c3RlbXM7CiAgICAgIGZvciAodGhpcy5jYWxsQ29tcG9uZW50QmVoYXZpb3JzKCJ0aWNrIiwgZSwgdDIpLCBuMiA9IDA7bjIgPCB0aGlzLnN5c3RlbU5hbWVzLmxlbmd0aDsgbjIrKykKICAgICAgICBpMlt0aGlzLnN5c3RlbU5hbWVzW24yXV0udGljayAmJiBpMlt0aGlzLnN5c3RlbU5hbWVzW24yXV0udGljayhlLCB0Mik7CiAgICB9CiAgICB0b2NrKGUsIHQyLCBuMikgewogICAgICB2YXIgaTIsIHIyID0gdGhpcy5zeXN0ZW1zOwogICAgICBmb3IgKHRoaXMuY2FsbENvbXBvbmVudEJlaGF2aW9ycygidG9jayIsIGUsIHQyKSwgaTIgPSAwO2kyIDwgdGhpcy5zeXN0ZW1OYW1lcy5sZW5ndGg7IGkyKyspCiAgICAgICAgcjJbdGhpcy5zeXN0ZW1OYW1lc1tpMl1dLnRvY2sgJiYgcjJbdGhpcy5zeXN0ZW1OYW1lc1tpMl1dLnRvY2soZSwgdDIsIG4yKTsKICAgIH0KICAgIHJlbmRlcihlLCB0MikgewogICAgICB2YXIgbjIgPSB0aGlzLnJlbmRlcmVyOwogICAgICB0aGlzLmZyYW1lID0gdDIsIHRoaXMuZGVsdGEgPSAxMDAwICogdGhpcy5jbG9jay5nZXREZWx0YSgpLCB0aGlzLnRpbWUgPSAxMDAwICogdGhpcy5jbG9jay5lbGFwc2VkVGltZSwgdGhpcy5pc1BsYXlpbmcgJiYgdGhpcy50aWNrKHRoaXMudGltZSwgdGhpcy5kZWx0YSk7CiAgICAgIHZhciBpMiA9IG51bGw7CiAgICAgIGlmICh0aGlzLmlzKCJhci1tb2RlIikgJiYgKGkyID0gdGhpcy5vYmplY3QzRC5iYWNrZ3JvdW5kLCB0aGlzLm9iamVjdDNELmJhY2tncm91bmQgPSBudWxsKSwgbjIucmVuZGVyKHRoaXMub2JqZWN0M0QsIHRoaXMuY2FtZXJhKSwgaTIgJiYgKHRoaXMub2JqZWN0M0QuYmFja2dyb3VuZCA9IGkyKSwgdGhpcy5pc1BsYXlpbmcpIHsKICAgICAgICB2YXIgcjIgPSBuMi54ci5pc1ByZXNlbnRpbmcgPyBuMi54ci5nZXRDYW1lcmEoKSA6IHRoaXMuY2FtZXJhOwogICAgICAgIHRoaXMudG9jayh0aGlzLnRpbWUsIHRoaXMuZGVsdGEsIHIyKTsKICAgICAgfQogICAgfQogICAgY2FsbENvbXBvbmVudEJlaGF2aW9ycyhlLCB0MiwgbjIpIHsKICAgICAgZm9yICh2YXIgaTIsIHIyID0gMDtyMiA8IHRoaXMuY29tcG9uZW50T3JkZXIubGVuZ3RoOyByMisrKSB7CiAgICAgICAgdmFyIG8yID0gdGhpcy5iZWhhdmlvcnNbdGhpcy5jb21wb25lbnRPcmRlcltyMl1dOwogICAgICAgIGlmIChvMikgewogICAgICAgICAgdmFyIHMyID0gbzJbZV07CiAgICAgICAgICBmb3IgKHMyLmluVXNlID0gdHJ1ZSwgaTIgPSAwO2kyIDwgczIuYXJyYXkubGVuZ3RoOyBpMisrKQogICAgICAgICAgICBzMi5hcnJheVtpMl0uaXNQbGF5aW5nICYmIHMyLmFycmF5W2kyXVtlXSh0MiwgbjIpOwogICAgICAgICAgZm9yIChzMi5pblVzZSA9IGZhbHNlLCBpMiA9IDA7aTIgPCBzMi5tYXJrZWRGb3JSZW1vdmFsLmxlbmd0aDsgaTIrKykKICAgICAgICAgICAgdGhpcy5yZW1vdmVCZWhhdmlvcihzMi5tYXJrZWRGb3JSZW1vdmFsW2kyXSk7CiAgICAgICAgICBzMi5tYXJrZWRGb3JSZW1vdmFsLmxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKICBjdXN0b21FbGVtZW50cy5kZWZpbmUoImEtc2NlbmUiLCBVcyk7CiAgTnMgPSBqbzsKICBqcyA9IHt9OwogIF9zID0gW107CiAgSHMucHJvdG90eXBlID0geyBzY2hlbWE6IHt9LCBpbml0OiBmdW5jdGlvbihlKSB7CiAgICByZXR1cm4gdGhpcy5nZW9tZXRyeSA9IG5ldyBSZS5CdWZmZXJHZW9tZXRyeSwgdGhpcy5nZW9tZXRyeTsKICB9LCB1cGRhdGU6IGZ1bmN0aW9uKGUpIHt9IH07CiAgVnMgPSBmaTsKICB6cyA9IEFyOwogIFlzID0gVnMoImV4dHJhczpwcmltaXRpdmVzOmRlYnVnIik7CiAgS3MgPSBWcygiZXh0cmFzOnByaW1pdGl2ZXM6d2FybiIpOwogIFdzID0gVnMoImV4dHJhczpwcmltaXRpdmVzOmVycm9yIik7CiAgSnMgPSB7fTsKICAkcyA9IHt9OwogIGVhID0gW107CiAgdGEgPSB7IGFycmF5OiAidjMiLCBjb2xvcjogInYzIiwgaW50OiAiaSIsIG51bWJlcjogImYiLCBtYXA6ICJ0IiwgdGltZTogImYiLCB2ZWMyOiAidjIiLCB2ZWMzOiAidjMiLCB2ZWM0OiAidjQiIH07CiAgbmEucHJvdG90eXBlID0geyBzY2hlbWE6IHt9LCB2ZXJ0ZXhTaGFkZXI6ICJ2b2lkIG1haW4oKSB7Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTt9IiwgZnJhZ21lbnRTaGFkZXI6ICJ2b2lkIG1haW4oKSB7Z2xfRnJhZ0NvbG9yID0gdmVjNCgxLjAsIDAuMCwgMS4wLCAxLjApO30iLCBpbml0OiBmdW5jdGlvbihlKSB7CiAgICByZXR1cm4gdGhpcy51bmlmb3JtcyA9IHRoaXMuaW5pdFVuaWZvcm1zKCksIHRoaXMubWF0ZXJpYWwgPSBuZXcgKHRoaXMucmF3ID8gUmUuUmF3U2hhZGVyTWF0ZXJpYWwgOiBSZS5TaGFkZXJNYXRlcmlhbCkoeyB1bmlmb3JtczogdGhpcy51bmlmb3JtcywgZ2xzbFZlcnNpb246IHRoaXMucmF3IHx8IHRoaXMuZ2xzbDMgPyBSZS5HTFNMMyA6IG51bGwsIHZlcnRleFNoYWRlcjogdGhpcy52ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyOiB0aGlzLmZyYWdtZW50U2hhZGVyIH0pLCB0aGlzLm1hdGVyaWFsOwogIH0sIGluaXRVbmlmb3JtczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSwgdDIsIG4yID0gdGhpcy5zY2hlbWEsIGkyID0ge307CiAgICBmb3IgKGUgaW4gbjIpCiAgICAgIG4yW2VdLmlzID09PSAidW5pZm9ybSIgJiYgKHQyID0gdGFbbjJbZV0udHlwZV0sIGkyW2VdID0geyB0eXBlOiB0MiwgdmFsdWU6IHVuZGVmaW5lZCB9KTsKICAgIHJldHVybiBpMjsKICB9LCB1cGRhdGU6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjIsIGkyID0gdGhpcy5zY2hlbWEsIHIyID0gdGhpcy51bmlmb3JtczsKICAgIGZvciAodDIgaW4gZSkKICAgICAgaWYgKGkyW3QyXSAmJiBpMlt0Ml0uaXMgPT09ICJ1bmlmb3JtIikKICAgICAgICBpZiAoaTJbdDJdLnR5cGUgIT09ICJtYXAiKQogICAgICAgICAgcjJbdDJdLnZhbHVlID0gdGhpcy5wYXJzZVZhbHVlKGkyW3QyXS50eXBlLCBlW3QyXSksIHIyW3QyXS5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBpZiAoIXIyW3QyXSB8fCByMlt0Ml0udmFsdWUgPT09IGVbdDJdKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIG4yID0gIl90ZXh0dXJlXyIgKyB0MiwgdGhpcy5zZXRNYXBPblRleHR1cmVMb2FkKHIyLCB0MiwgbjIpLCBDcihuMiwgdDIsIHRoaXMsIGUpOwogICAgICAgIH0KICB9LCBwYXJzZVZhbHVlOiBmdW5jdGlvbihlLCB0MikgewogICAgdmFyIG4yOwogICAgc3dpdGNoIChlKSB7CiAgICAgIGNhc2UgInZlYzIiOgogICAgICAgIHJldHVybiBuZXcgUmUuVmVjdG9yMih0Mi54LCB0Mi55KTsKICAgICAgY2FzZSAidmVjMyI6CiAgICAgICAgcmV0dXJuIG5ldyBSZS5WZWN0b3IzKHQyLngsIHQyLnksIHQyLnopOwogICAgICBjYXNlICJ2ZWM0IjoKICAgICAgICByZXR1cm4gbmV3IFJlLlZlY3RvcjQodDIueCwgdDIueSwgdDIueiwgdDIudyk7CiAgICAgIGNhc2UgImNvbG9yIjoKICAgICAgICByZXR1cm4gbjIgPSBuZXcgUmUuQ29sb3IodDIpLCBuZXcgUmUuVmVjdG9yMyhuMi5yLCBuMi5nLCBuMi5iKTsKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gdDI7CiAgICB9CiAgfSwgc2V0TWFwT25UZXh0dXJlTG9hZDogZnVuY3Rpb24oZSwgdDIsIG4yKSB7CiAgICB2YXIgaTIgPSB0aGlzOwogICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCJtYXRlcmlhbHRleHR1cmVsb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZVt0Ml0udmFsdWUgPSBpMi5tYXRlcmlhbFtuMl0sIGVbdDJdLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgIH0pOwogIH0gfTsKICByYSA9IG5ldyBSZS5GaWxlTG9hZGVyOwogIG9hID0gZmkoImNvcmU6YS1hc3NldHM6d2FybiIpOwogIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgiYS1hc3NldHMiLCBjbGFzcyBleHRlbmRzIGJzIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpLCB0aGlzLmlzQXNzZXRzID0gdHJ1ZSwgdGhpcy5maWxlTG9hZGVyID0gcmEsIHRoaXMudGltZW91dCA9IG51bGw7CiAgICB9CiAgICBkb0Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICB2YXIgZSwgdDIsIG4yLCBpMiwgcjIsIG8yLCBzMiA9IHRoaXMsIGEyID0gW107CiAgICAgIGlmIChzdXBlci5kb0Nvbm5lY3RlZENhbGxiYWNrKCksICF0aGlzLnBhcmVudE5vZGUuaXNTY2VuZSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIjxhLWFzc2V0cz4gbXVzdCBiZSBhIGNoaWxkIG9mIGEgPGEtc2NlbmU+LiIpOwogICAgICBmb3IgKHIyID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCJpbWciKSwgZSA9IDA7ZSA8IHIyLmxlbmd0aDsgZSsrKQogICAgICAgIGkyID0gYWEocjJbZV0pLCBhMi5wdXNoKG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQzLCBuMykgewogICAgICAgICAgUmUuQ2FjaGUuYWRkKHIyW2VdLmdldEF0dHJpYnV0ZSgic3JjIiksIGkyKSwgaTIuY29tcGxldGUgPyB0MygpIDogKGkyLm9ubG9hZCA9IHQzLCBpMi5vbmVycm9yID0gbjMpOwogICAgICAgIH0pKTsKICAgICAgZm9yIChuMiA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgiYXVkaW8sIHZpZGVvIiksIGUgPSAwO2UgPCBuMi5sZW5ndGg7IGUrKykKICAgICAgICAodDIgPSBhYShuMltlXSkpLnNyYyB8fCB0Mi5zcmNPYmplY3QgfHwgb2EoIkF1ZGlvL3ZpZGVvIGFzc2V0IGhhcyBuZWl0aGVyIGBzcmNgIG5vciBgc3JjT2JqZWN0YCBhdHRyaWJ1dGVzLiIpLCBhMi5wdXNoKHNhKHQyKSk7CiAgICAgIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgZTIuaXNBc3NldEl0ZW0gJiYgZTIuaGFzQXR0cmlidXRlKCJzcmMiKSAmJiBhMi5wdXNoKG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQzLCBuMykgewogICAgICAgICAgaWYgKGUyLmhhc0xvYWRlZCkKICAgICAgICAgICAgcmV0dXJuIHQzKCk7CiAgICAgICAgICBlMi5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWQiLCB0MyksIGUyLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwgbjMpOwogICAgICAgIH0pKTsKICAgICAgfSksIFByb21pc2UuYWxsU2V0dGxlZChhMikudGhlbihmdW5jdGlvbigpIHsKICAgICAgICBzMi50aW1lb3V0ICE9PSBudWxsICYmIHMyLmxvYWQoKTsKICAgICAgfSksIG8yID0gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoInRpbWVvdXQiKSwgMTApIHx8IDMwMDAsIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgczIuaGFzTG9hZGVkIHx8IChvYSgiQXNzZXQgbG9hZGluZyB0aW1lZCBvdXQgaW4iLCBvMiwgIm1zIiksIHMyLnRpbWVvdXQgPSBudWxsLCBzMi5lbWl0KCJ0aW1lb3V0IiksIHMyLmxvYWQoKSk7CiAgICAgIH0sIG8yKTsKICAgIH0KICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpLCB0aGlzLnRpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7CiAgICB9CiAgICBsb2FkKCkgewogICAgICBzdXBlci5sb2FkLmNhbGwodGhpcywgbnVsbCwgZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KTsKICAgIH0KICB9KSwgY3VzdG9tRWxlbWVudHMuZGVmaW5lKCJhLWFzc2V0LWl0ZW0iLCBjbGFzcyBleHRlbmRzIGJzIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigpLCB0aGlzLmRhdGEgPSBudWxsLCB0aGlzLmlzQXNzZXRJdGVtID0gdHJ1ZTsKICAgIH0KICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICB2YXIgZSA9IHRoaXMsIHQyID0gdGhpcy5nZXRBdHRyaWJ1dGUoInNyYyIpOwogICAgICByYS5zZXRSZXNwb25zZVR5cGUodGhpcy5nZXRBdHRyaWJ1dGUoInJlc3BvbnNlLXR5cGUiKSB8fCBmdW5jdGlvbihlMikgewogICAgICAgIHZhciB0MyA9IGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgICB2YXIgdDQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CiAgICAgICAgICB0NC5ocmVmID0gZTM7CiAgICAgICAgICB2YXIgbjMgPSB0NC5zZWFyY2gucmVwbGFjZSgvXlw/LywgIiIpLCBpMiA9IGUzLnJlcGxhY2UobjMsICIiKS5yZXBsYWNlKCI/IiwgIiIpOwogICAgICAgICAgcmV0dXJuIGkyLnN1YnN0cmluZyhpMi5sYXN0SW5kZXhPZigiLyIpICsgMSk7CiAgICAgICAgfShlMiksIG4yID0gdDMubGFzdEluZGV4T2YoIi4iKTsKICAgICAgICByZXR1cm4gbjIgPj0gMCAmJiB0My5zbGljZShuMiwgZTIuc2VhcmNoKC9cP3wjfCQvKSkgPT09ICIuZ2xiIiA/ICJhcnJheWJ1ZmZlciIgOiAidGV4dCI7CiAgICAgIH0odDIpKSwgcmEubG9hZCh0MiwgZnVuY3Rpb24odDMpIHsKICAgICAgICBlLmRhdGEgPSB0MywgYnMucHJvdG90eXBlLmxvYWQuY2FsbChlKTsKICAgICAgfSwgZnVuY3Rpb24odDMpIHsKICAgICAgICBlLmVtaXQoInByb2dyZXNzIiwgeyBsb2FkZWRCeXRlczogdDMubG9hZGVkLCB0b3RhbEJ5dGVzOiB0My50b3RhbCwgeGhyOiB0MyB9KTsKICAgICAgfSwgZnVuY3Rpb24odDMpIHsKICAgICAgICBlLmVtaXQoImVycm9yIiwgeyB4aHI6IHQzIH0sIGZhbHNlKTsKICAgICAgfSk7CiAgICB9CiAgfSk7CiAgQWEgPSBmaSgiY29yZTpjdWJlbWFwOndhcm4iKTsKICBsYSA9IGNsYXNzIGxhIGV4dGVuZHMgSFRNTEVsZW1lbnQgewogICAgY29uc3RydWN0b3IoZSkgewogICAgICByZXR1cm4gc3VwZXIoZSk7CiAgICB9CiAgICBvblJlYWR5U3RhdGVDaGFuZ2UoKSB7CiAgICAgIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgJiYgdGhpcy5kb0Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICB9CiAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiA/IGxhLnByb3RvdHlwZS5kb0Nvbm5lY3RlZENhbGxiYWNrLmNhbGwodGhpcykgOiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwgdGhpcy5vblJlYWR5U3RhdGVDaGFuZ2UuYmluZCh0aGlzKSk7CiAgICB9CiAgICBkb0Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICB0aGlzLnNyY3MgPSB0aGlzLnZhbGlkYXRlKCk7CiAgICB9CiAgICB2YWxpZGF0ZSgpIHsKICAgICAgdmFyIGUsIHQyID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCJbc3JjXSIpLCBuMiA9IFtdOwogICAgICBpZiAodDIubGVuZ3RoID09PSA2KSB7CiAgICAgICAgZm9yIChlID0gMDtlIDwgdDIubGVuZ3RoOyBlKyspCiAgICAgICAgICB0MltlXS50YWdOYW1lID09PSAiSU1HIiA/IG4yLnB1c2godDJbZV0pIDogbjIucHVzaCh0MltlXS5nZXRBdHRyaWJ1dGUoInNyYyIpKTsKICAgICAgICByZXR1cm4gbjI7CiAgICAgIH0KICAgICAgQWEoIjxhLWN1YmVtYXA+IGRpZCBub3QgY29udGFpbiBleGFjdGx5IHNpeCBlbGVtZW50cyBlYWNoIHdpdGggYSBgc3JjYCBhdHRyaWJ1dGUuIik7CiAgICB9CiAgfTsKICBjdXN0b21FbGVtZW50cy5kZWZpbmUoImEtY3ViZW1hcCIsIGxhKSwgY3VzdG9tRWxlbWVudHMuZGVmaW5lKCJhLW1peGluIiwgY2xhc3MgZXh0ZW5kcyBicyB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKSwgdGhpcy5jb21wb25lbnRDYWNoZSA9IHt9LCB0aGlzLnJhd0F0dHJpYnV0ZUNhY2hlID0ge30sIHRoaXMuaXNNaXhpbiA9IHRydWU7CiAgICB9CiAgICBkb0Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5kb0Nvbm5lY3RlZENhbGxiYWNrKCksIHRoaXMuc2NlbmVFbCA9IHRoaXMuY2xvc2VzdFNjZW5lKCksIHRoaXMuaWQgPSB0aGlzLmdldEF0dHJpYnV0ZSgiaWQiKSwgdGhpcy5jYWNoZUF0dHJpYnV0ZXMoKSwgdGhpcy51cGRhdGVFbnRpdGllcygpLCB0aGlzLmxvYWQoKTsKICAgIH0KICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLCB0MiwgbjIpIHsKICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCksIHRoaXMuY2FjaGVBdHRyaWJ1dGUoZSwgbjIpLCB0aGlzLnVwZGF0ZUVudGl0aWVzKCk7CiAgICB9CiAgICBzZXRBdHRyaWJ1dGUoZSwgdDIpIHsKICAgICAgd2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUuY2FsbCh0aGlzLCBlLCB0MiksIHRoaXMuY2FjaGVBdHRyaWJ1dGUoZSwgdDIpOwogICAgfQogICAgY2FjaGVBdHRyaWJ1dGUoZSwgdDIpIHsKICAgICAgdmFyIG4yLCBpMjsKICAgICAgaTIgPSBvcihlLCAiX18iKVswXSwgbjIgPSBLb1tpMl0sIHQyID09PSB1bmRlZmluZWQgJiYgKHQyID0gd2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUuY2FsbCh0aGlzLCBlKSksIHRoaXMucmF3QXR0cmlidXRlQ2FjaGVbZV0gPSB0MiwgbjIgJiYgKHRoaXMuY29tcG9uZW50Q2FjaGVbZV0gPSB0aGlzLnBhcnNlQ29tcG9uZW50QXR0clZhbHVlKG4yLCB0MikpOwogICAgfQogICAgcGFyc2VDb21wb25lbnRBdHRyVmFsdWUoZSwgdDIpIHsKICAgICAgdmFyIG4yOwogICAgICByZXR1cm4gdHlwZW9mIHQyICE9ICJzdHJpbmciID8gdDIgOiAoZS5pc1NpbmdsZVByb3BlcnR5ID8gdHlwZW9mIChuMiA9IGUuc2NoZW1hLnBhcnNlKHQyKSkgPT0gInN0cmluZyIgJiYgKG4yID0gdDIpIDogbjIgPSBMcih0MiksIG4yKTsKICAgIH0KICAgIGdldEF0dHJpYnV0ZShlKSB7CiAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudENhY2hlW2VdIHx8IHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlLmNhbGwodGhpcywgZSk7CiAgICB9CiAgICBjYWNoZUF0dHJpYnV0ZXMoKSB7CiAgICAgIHZhciBlLCB0MiwgbjIgPSB0aGlzLmF0dHJpYnV0ZXM7CiAgICAgIGZvciAodDIgPSAwO3QyIDwgbjIubGVuZ3RoOyB0MisrKQogICAgICAgIGUgPSBuMlt0Ml0ubmFtZSwgdGhpcy5jYWNoZUF0dHJpYnV0ZShlKTsKICAgIH0KICAgIHVwZGF0ZUVudGl0aWVzKCkgewogICAgICB2YXIgZSwgdDIsIG4yOwogICAgICBpZiAodGhpcy5zY2VuZUVsKQogICAgICAgIGZvciAodDIgPSB0aGlzLnNjZW5lRWwucXVlcnlTZWxlY3RvckFsbCgiW21peGlufj0iICsgdGhpcy5pZCArICJdIiksIG4yID0gMDtuMiA8IHQyLmxlbmd0aDsgbjIrKykKICAgICAgICAgIChlID0gdDJbbjJdKS5oYXNMb2FkZWQgJiYgIWUuaXNNaXhpbiAmJiBlLm1peGluVXBkYXRlKHRoaXMuaWQpOwogICAgfQogIH0pOwogIGhhID0gbmV3IFJlLkNvbG9yOwogIGRhID0gbmV3IFJlLkNvbG9yOwogIHVhID0gYXI7CiAgZ2EgPSBBcjsKICBwYSA9IHt9OwogIGNzKCJhbmltYXRpb24iLCB7IHNjaGVtYTogeyBhdXRvcGxheTogeyBkZWZhdWx0OiB0cnVlIH0sIGRlbGF5OiB7IGRlZmF1bHQ6IDAgfSwgZGlyOiB7IGRlZmF1bHQ6ICIiIH0sIGR1cjogeyBkZWZhdWx0OiAxMDAwIH0sIGVhc2luZzogeyBkZWZhdWx0OiAiZWFzZUluUXVhZCIgfSwgZWxhc3RpY2l0eTogeyBkZWZhdWx0OiA0MDAgfSwgZW5hYmxlZDogeyBkZWZhdWx0OiB0cnVlIH0sIGZyb206IHsgZGVmYXVsdDogIiIgfSwgbG9vcDogeyBkZWZhdWx0OiAwLCBwYXJzZTogZnVuY3Rpb24oZSkgewogICAgcmV0dXJuIGUgPT09IHRydWUgfHwgZSA9PT0gInRydWUiIHx8IGUgIT09IGZhbHNlICYmIGUgIT09ICJmYWxzZSIgJiYgcGFyc2VJbnQoZSwgMTApOwogIH0gfSwgcHJvcGVydHk6IHsgZGVmYXVsdDogIiIgfSwgc3RhcnRFdmVudHM6IHsgdHlwZTogImFycmF5IiB9LCBwYXVzZUV2ZW50czogeyB0eXBlOiAiYXJyYXkiIH0sIHJlc3VtZUV2ZW50czogeyB0eXBlOiAiYXJyYXkiIH0sIHJvdW5kOiB7IGRlZmF1bHQ6IGZhbHNlIH0sIHRvOiB7IGRlZmF1bHQ6ICIiIH0sIHR5cGU6IHsgZGVmYXVsdDogIiIgfSwgaXNSYXdQcm9wZXJ0eTogeyBkZWZhdWx0OiBmYWxzZSB9IH0sIG11bHRpcGxlOiB0cnVlLCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpczsKICAgIHRoaXMuZXZlbnREZXRhaWwgPSB7IG5hbWU6IHRoaXMuYXR0ck5hbWUgfSwgdGhpcy50aW1lID0gMCwgdGhpcy5hbmltYXRpb24gPSBudWxsLCB0aGlzLmFuaW1hdGlvbklzUGxheWluZyA9IGZhbHNlLCB0aGlzLm9uU3RhcnRFdmVudCA9IHRoaXMub25TdGFydEV2ZW50LmJpbmQodGhpcyksIHRoaXMuYmVnaW5BbmltYXRpb24gPSB0aGlzLmJlZ2luQW5pbWF0aW9uLmJpbmQodGhpcyksIHRoaXMucGF1c2VBbmltYXRpb24gPSB0aGlzLnBhdXNlQW5pbWF0aW9uLmJpbmQodGhpcyksIHRoaXMucmVzdW1lQW5pbWF0aW9uID0gdGhpcy5yZXN1bWVBbmltYXRpb24uYmluZCh0aGlzKSwgdGhpcy5mcm9tQ29sb3IgPSB7fSwgdGhpcy50b0NvbG9yID0ge30sIHRoaXMudGFyZ2V0cyA9IHt9LCB0aGlzLnRhcmdldHNBcnJheSA9IFtdLCB0aGlzLnVwZGF0ZUNvbmZpZ0ZvckRlZmF1bHQgPSB0aGlzLnVwZGF0ZUNvbmZpZ0ZvckRlZmF1bHQuYmluZCh0aGlzKSwgdGhpcy51cGRhdGVDb25maWdGb3JSYXdDb2xvciA9IHRoaXMudXBkYXRlQ29uZmlnRm9yUmF3Q29sb3IuYmluZCh0aGlzKSwgdGhpcy5jb25maWcgPSB7IGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKICAgICAgZS5hbmltYXRpb25Jc1BsYXlpbmcgPSBmYWxzZSwgZS5lbC5lbWl0KCJhbmltYXRpb25jb21wbGV0ZSIsIGUuZXZlbnREZXRhaWwsIGZhbHNlKSwgZS5pZCAmJiBlLmVsLmVtaXQoImFuaW1hdGlvbmNvbXBsZXRlX18iICsgZS5pZCwgZS5ldmVudERldGFpbCwgZmFsc2UpOwogICAgfSB9OwogIH0sIHVwZGF0ZTogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyID0gdGhpcy5jb25maWcsIG4yID0gdGhpcy5kYXRhOwogICAgdGhpcy5hbmltYXRpb25Jc1BsYXlpbmcgPSBmYWxzZSwgdGhpcy5kYXRhLmVuYWJsZWQgJiYgbjIucHJvcGVydHkgJiYgKHQyLmF1dG9wbGF5ID0gZmFsc2UsIHQyLmRpcmVjdGlvbiA9IG4yLmRpciwgdDIuZHVyYXRpb24gPSBuMi5kdXIsIHQyLmVhc2luZyA9IG4yLmVhc2luZywgdDIuZWxhc3RpY2l0eSA9IG4yLmVsYXN0aWNpdHksIHQyLmxvb3AgPSBuMi5sb29wLCB0Mi5yb3VuZCA9IG4yLnJvdW5kLCB0aGlzLmNyZWF0ZUFuZFN0YXJ0QW5pbWF0aW9uKCkpOwogIH0sIHRpY2s6IGZ1bmN0aW9uKGUsIHQyKSB7CiAgICB0aGlzLmFuaW1hdGlvbklzUGxheWluZyAmJiAodGhpcy50aW1lICs9IHQyLCB0aGlzLmFuaW1hdGlvbi50aWNrKHRoaXMudGltZSkpOwogIH0sIHJlbW92ZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnBhdXNlQW5pbWF0aW9uKCksIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTsKICB9LCBwYXVzZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnBhdXNlZCA9IHRydWUsIHRoaXMucGF1c2VkV2FzUGxheWluZyA9IHRoaXMuYW5pbWF0aW9uSXNQbGF5aW5nLCB0aGlzLnBhdXNlQW5pbWF0aW9uKCksIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTsKICB9LCBwbGF5OiBmdW5jdGlvbigpIHsKICAgIHRoaXMucGF1c2VkICYmICh0aGlzLnBhdXNlZCA9IGZhbHNlLCB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCksIHRoaXMucGF1c2VkV2FzUGxheWluZyAmJiAodGhpcy5yZXN1bWVBbmltYXRpb24oKSwgdGhpcy5wYXVzZWRXYXNQbGF5aW5nID0gZmFsc2UpKTsKICB9LCBjcmVhdGVBbmRTdGFydEFuaW1hdGlvbjogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZGF0YTsKICAgIHRoaXMudXBkYXRlQ29uZmlnKCksIHRoaXMuYW5pbWF0aW9uSXNQbGF5aW5nID0gZmFsc2UsIHRoaXMuYW5pbWF0aW9uID0gVGUodGhpcy5jb25maWcpLCB0aGlzLmFuaW1hdGlvbi5iZWdhbiA9IHRydWUsIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSwgdGhpcy5hZGRFdmVudExpc3RlbmVycygpLCAhZS5hdXRvcGxheSB8fCBlLnN0YXJ0RXZlbnRzICYmIGUuc3RhcnRFdmVudHMubGVuZ3RoIHx8IChlLmRlbGF5ID8gc2V0VGltZW91dCh0aGlzLmJlZ2luQW5pbWF0aW9uLCBlLmRlbGF5KSA6IHRoaXMuYmVnaW5BbmltYXRpb24oKSk7CiAgfSwgYmVnaW5BbmltYXRpb246IGZ1bmN0aW9uKCkgewogICAgdGhpcy51cGRhdGVDb25maWcoKSwgdGhpcy5hbmltYXRpb24uYmVnYW4gPSB0cnVlLCB0aGlzLnRpbWUgPSAwLCB0aGlzLmFuaW1hdGlvbklzUGxheWluZyA9IHRydWUsIHRoaXMuc3RvcFJlbGF0ZWRBbmltYXRpb25zKCksIHRoaXMuZWwuZW1pdCgiYW5pbWF0aW9uYmVnaW4iLCB0aGlzLmV2ZW50RGV0YWlsLCBmYWxzZSk7CiAgfSwgcGF1c2VBbmltYXRpb246IGZ1bmN0aW9uKCkgewogICAgdGhpcy5hbmltYXRpb25Jc1BsYXlpbmcgPSBmYWxzZTsKICB9LCByZXN1bWVBbmltYXRpb246IGZ1bmN0aW9uKCkgewogICAgdGhpcy5hbmltYXRpb25Jc1BsYXlpbmcgPSB0cnVlOwogIH0sIG9uU3RhcnRFdmVudDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmRhdGEuZW5hYmxlZCAmJiAodGhpcy51cGRhdGVDb25maWcoKSwgdGhpcy5hbmltYXRpb24gJiYgdGhpcy5hbmltYXRpb24ucGF1c2UoKSwgdGhpcy5hbmltYXRpb24gPSBUZSh0aGlzLmNvbmZpZyksIHRoaXMuZGF0YS5kZWxheSA/IHNldFRpbWVvdXQodGhpcy5iZWdpbkFuaW1hdGlvbiwgdGhpcy5kYXRhLmRlbGF5KSA6IHRoaXMuYmVnaW5BbmltYXRpb24oKSk7CiAgfSwgdXBkYXRlQ29uZmlnRm9yUmF3Q29sb3I6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyLCBuMiwgaTIgPSB0aGlzLmNvbmZpZywgcjIgPSB0aGlzLmRhdGEsIG8yID0gdGhpcy5lbDsKICAgIGlmICghdGhpcy53YWl0Q29tcG9uZW50SW5pdFJhd1Byb3BlcnR5KHRoaXMudXBkYXRlQ29uZmlnRm9yUmF3Q29sb3IpKSB7CiAgICAgIGZvciAodDIgaW4gZSA9IHIyLmZyb20gPT09ICIiID8gYmEobzIsIHIyLnByb3BlcnR5KSA6IHIyLmZyb20sIG4yID0gcjIudG8sIHRoaXMuc2V0Q29sb3JDb25maWcoZSwgbjIpLCBlID0gdGhpcy5mcm9tQ29sb3IsIG4yID0gdGhpcy50b0NvbG9yLCB0aGlzLnRhcmdldHNBcnJheS5sZW5ndGggPSAwLCB0aGlzLnRhcmdldHNBcnJheS5wdXNoKGUpLCBpMi50YXJnZXRzID0gdGhpcy50YXJnZXRzQXJyYXksIG4yKQogICAgICAgIGkyW3QyXSA9IG4yW3QyXTsKICAgICAgdmFyIHMyOwogICAgICBpMi51cGRhdGUgPSAoczIgPSB7fSwgZnVuY3Rpb24oZTIpIHsKICAgICAgICB2YXIgdDM7CiAgICAgICAgKHQzID0gZTIuYW5pbWF0YWJsZXNbMF0udGFyZ2V0KS5yID09PSBzMi5yICYmIHQzLmcgPT09IHMyLmcgJiYgdDMuYiA9PT0gczIuYiB8fCB5YShvMiwgcjIucHJvcGVydHksIHQzLCByMi50eXBlKTsKICAgICAgfSk7CiAgICB9CiAgfSwgdXBkYXRlQ29uZmlnRm9yRGVmYXVsdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSwgdDIsIG4yLCBpMiwgcjIgPSB0aGlzLmNvbmZpZywgbzIgPSB0aGlzLmRhdGEsIHMyID0gdGhpcy5lbDsKICAgIHRoaXMud2FpdENvbXBvbmVudEluaXRSYXdQcm9wZXJ0eSh0aGlzLnVwZGF0ZUNvbmZpZ0ZvckRlZmF1bHQpIHx8IChlID0gbzIuZnJvbSA9PT0gIiIgPyB3YShvMikgPyBiYShzMiwgbzIucHJvcGVydHkpIDogdWEoczIsIG8yLnByb3BlcnR5KSA6IG8yLmZyb20sIG4yID0gbzIudG8sIGlzTmFOKGUgfHwgbjIpID8gKGUgPSBlID8gZS50b1N0cmluZygpIDogZSwgbjIgPSBuMiA/IG4yLnRvU3RyaW5nKCkgOiBuMikgOiAoZSA9IHBhcnNlRmxvYXQoZSksIG4yID0gcGFyc2VGbG9hdChuMikpLCAodDIgPSBvMi50byA9PT0gInRydWUiIHx8IG8yLnRvID09PSAiZmFsc2UiIHx8IG8yLnRvID09PSB0cnVlIHx8IG8yLnRvID09PSBmYWxzZSkgJiYgKGUgPSBvMi5mcm9tID09PSAidHJ1ZSIgfHwgbzIuZnJvbSA9PT0gdHJ1ZSA/IDEgOiAwLCBuMiA9IG8yLnRvID09PSAidHJ1ZSIgfHwgbzIudG8gPT09IHRydWUgPyAxIDogMCksIHRoaXMudGFyZ2V0cy5hZnJhbWVQcm9wZXJ0eSA9IGUsIHIyLnRhcmdldHMgPSB0aGlzLnRhcmdldHMsIHIyLmFmcmFtZVByb3BlcnR5ID0gbjIsIHIyLnVwZGF0ZSA9IGZ1bmN0aW9uKGUyKSB7CiAgICAgIHZhciBuMzsKICAgICAgKG4zID0gZTIuYW5pbWF0YWJsZXNbMF0udGFyZ2V0LmFmcmFtZVByb3BlcnR5KSAhPT0gaTIgJiYgKGkyID0gbjMsIHQyICYmIChuMyA9IG4zID49IDEpLCB3YShvMikgPyB5YShzMiwgbzIucHJvcGVydHksIG4zLCBvMi50eXBlKSA6IGdhKHMyLCBvMi5wcm9wZXJ0eSwgbjMpKTsKICAgIH0pOwogIH0sIHVwZGF0ZUNvbmZpZ0ZvclZlY3RvcjogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSwgdDIsIG4yLCBpMiwgcjIgPSB0aGlzLmNvbmZpZywgbzIgPSB0aGlzLmRhdGEsIHMyID0gdGhpcy5lbCwgYTIgPSBJYShvMi5wcm9wZXJ0eSksIEEyID0gYTJbMF0gPT09ICJvYmplY3QzRCIgPyBhMlsxXSA6IGEyWzBdOwogICAgZm9yIChlIGluIHQyID0gbzIuZnJvbSAhPT0gIiIgPyBaaShvMi5mcm9tKSA6IHVhKHMyLCBBMiksIG4yID0gWmkobzIudG8pLCBBMiA9PT0gbWEgJiYgKENhKHQyKSwgQ2EobjIpKSwgdGhpcy50YXJnZXRzQXJyYXkubGVuZ3RoID0gMCwgdGhpcy50YXJnZXRzQXJyYXkucHVzaCh0MiksIHIyLnRhcmdldHMgPSB0aGlzLnRhcmdldHNBcnJheSwgbjIpCiAgICAgIHIyW2VdID0gbjJbZV07CiAgICByMi51cGRhdGUgPSBBMiAhPT0gInBvc2l0aW9uIiAmJiBBMiAhPT0gbWEgJiYgQTIgIT09ICJzY2FsZSIgPyBmdW5jdGlvbigpIHsKICAgICAgdmFyIGUyID0ge307CiAgICAgIHJldHVybiBmdW5jdGlvbih0MykgewogICAgICAgIHZhciBuMyA9IHQzLmFuaW1hdGFibGVzWzBdLnRhcmdldDsKICAgICAgICBuMy54ID09PSBlMi54ICYmIG4zLnkgPT09IGUyLnkgJiYgbjMueiA9PT0gZTIueiB8fCAoZTIueCA9IG4zLngsIGUyLnkgPSBuMy55LCBlMi56ID0gbjMueiwgZ2EoczIsIG8yLnByb3BlcnR5LCBuMykpOwogICAgICB9OwogICAgfSgpIDogKGkyID0ge30sIGZ1bmN0aW9uKGUyKSB7CiAgICAgIHZhciB0MyA9IGUyLmFuaW1hdGFibGVzWzBdLnRhcmdldDsKICAgICAgdDMueCA9PT0gaTIueCAmJiB0My55ID09PSBpMi55ICYmIHQzLnogPT09IGkyLnogfHwgKGkyLnggPSB0My54LCBpMi55ID0gdDMueSwgaTIueiA9IHQzLnosIHMyLm9iamVjdDNEW0EyXS5zZXQodDMueCwgdDMueSwgdDMueikpOwogICAgfSk7CiAgfSwgdXBkYXRlQ29uZmlnOiBmdW5jdGlvbigpIHsKICAgIHZhciBlOwogICAgZSA9IGZ1bmN0aW9uKGUyLCB0MikgewogICAgICB2YXIgbjIsIGkyLCByMiwgbzI7CiAgICAgIHJldHVybiAocjIgPSB0Mi5zcGxpdCgiLiIpKVswXSAhPT0gIm9iamVjdDNEIiB8fCByMlsyXSB8fCByMlsxXSAhPT0gInBvc2l0aW9uIiAmJiByMlsxXSAhPT0gInJvdGF0aW9uIiAmJiByMlsxXSAhPT0gInNjYWxlIiA/IChpMiA9IHIyWzBdLCBvMiA9IHIyWzFdLCAobjIgPSBlMi5jb21wb25lbnRzW2kyXSB8fCBLb1tpMl0pID8gbzIgJiYgIW4yLnNjaGVtYVtvMl0gPyBudWxsIDogbzIgPyBuMi5zY2hlbWFbbzJdLnR5cGUgOiBuMi5zY2hlbWEudHlwZSA6IG51bGwpIDogInZlYzMiOwogICAgfSh0aGlzLmVsLCB0aGlzLmRhdGEucHJvcGVydHkpLCB3YSh0aGlzLmRhdGEpICYmIHRoaXMuZGF0YS50eXBlID09PSBmYSA/IHRoaXMudXBkYXRlQ29uZmlnRm9yUmF3Q29sb3IoKSA6IGUgPT09ICJ2ZWMyIiB8fCBlID09PSAidmVjMyIgfHwgZSA9PT0gInZlYzQiID8gdGhpcy51cGRhdGVDb25maWdGb3JWZWN0b3IoKSA6IHRoaXMudXBkYXRlQ29uZmlnRm9yRGVmYXVsdCgpOwogIH0sIHdhaXRDb21wb25lbnRJbml0UmF3UHJvcGVydHk6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjIgPSB0aGlzLmRhdGEsIGkyID0gdGhpcy5lbCwgcjIgPSB0aGlzOwogICAgcmV0dXJuIG4yLmZyb20gPT09ICIiICYmICEhbjIucHJvcGVydHkuc3RhcnRzV2l0aChFYSkgJiYgKHQyID0gSWEobjIucHJvcGVydHkpWzFdLCAhaTIuY29tcG9uZW50c1t0Ml0gJiYgKGkyLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBvbmVudGluaXRpYWxpemVkIiwgZnVuY3Rpb24gbihvMikgewogICAgICBvMi5kZXRhaWwubmFtZSA9PT0gdDIgJiYgKGUoKSwgcjIuYW5pbWF0aW9uID0gVGUocjIuY29uZmlnKSwgaTIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29tcG9uZW50aW5pdGlhbGl6ZWQiLCBuKSk7CiAgICB9KSwgdHJ1ZSkpOwogIH0sIHN0b3BSZWxhdGVkQW5pbWF0aW9uczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSwgdDI7CiAgICBmb3IgKHQyIGluIHRoaXMuZWwuY29tcG9uZW50cykKICAgICAgZSA9IHRoaXMuZWwuY29tcG9uZW50c1t0Ml0sIHQyICE9PSB0aGlzLmF0dHJOYW1lICYmIGUubmFtZSA9PT0gImFuaW1hdGlvbiIgJiYgZS5hbmltYXRpb25Jc1BsYXlpbmcgJiYgZS5kYXRhLnByb3BlcnR5ID09PSB0aGlzLmRhdGEucHJvcGVydHkgJiYgKGUuYW5pbWF0aW9uSXNQbGF5aW5nID0gZmFsc2UpOwogIH0sIGFkZEV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5kYXRhLCB0MiA9IHRoaXMuZWw7CiAgICB2YSh0MiwgZS5zdGFydEV2ZW50cywgdGhpcy5vblN0YXJ0RXZlbnQpLCB2YSh0MiwgZS5wYXVzZUV2ZW50cywgdGhpcy5wYXVzZUFuaW1hdGlvbiksIHZhKHQyLCBlLnJlc3VtZUV2ZW50cywgdGhpcy5yZXN1bWVBbmltYXRpb24pOwogIH0sIHJlbW92ZUV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5kYXRhLCB0MiA9IHRoaXMuZWw7CiAgICBCYSh0MiwgZS5zdGFydEV2ZW50cywgdGhpcy5vblN0YXJ0RXZlbnQpLCBCYSh0MiwgZS5wYXVzZUV2ZW50cywgdGhpcy5wYXVzZUFuaW1hdGlvbiksIEJhKHQyLCBlLnJlc3VtZUV2ZW50cywgdGhpcy5yZXN1bWVBbmltYXRpb24pOwogIH0sIHNldENvbG9yQ29uZmlnOiBmdW5jdGlvbihlLCB0MikgewogICAgaGEuc2V0KGUpLCBkYS5zZXQodDIpLCBlID0gdGhpcy5mcm9tQ29sb3IsIHQyID0gdGhpcy50b0NvbG9yLCBlLnIgPSBoYS5yLCBlLmcgPSBoYS5nLCBlLmIgPSBoYS5iLCB0Mi5yID0gZGEuciwgdDIuZyA9IGRhLmcsIHQyLmIgPSBkYS5iOwogIH0gfSk7CiAgeGEgPSBmaSgiY29tcG9uZW50czphbmNob3JlZDp3YXJuIik7CiAgY3MoImFuY2hvcmVkIiwgeyBzY2hlbWE6IHsgcGVyc2lzdGVudDogeyBkZWZhdWx0OiBmYWxzZSB9IH0sIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsLnNjZW5lRWwuZ2V0QXR0cmlidXRlKCJ3ZWJ4ciIpLCB0MiA9IGUub3B0aW9uYWxGZWF0dXJlczsKICAgIHQyLmluZGV4T2YoImFuY2hvcnMiKSA9PT0gLTEgJiYgKHQyLnB1c2goImFuY2hvcnMiKSwgdGhpcy5lbC5zY2VuZUVsLnNldEF0dHJpYnV0ZSgid2VieHIiLCBlKSksIHRoaXMuYXV4UXVhdGVybmlvbiA9IG5ldyBSZS5RdWF0ZXJuaW9uLCB0aGlzLm9uRW50ZXJWUiA9IHRoaXMub25FbnRlclZSLmJpbmQodGhpcyksIHRoaXMuZWwuc2NlbmVFbC5hZGRFdmVudExpc3RlbmVyKCJlbnRlci12ciIsIHRoaXMub25FbnRlclZSKTsKICB9LCBvbkVudGVyVlI6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5hbmNob3IgPSB1bmRlZmluZWQsIHRoaXMucmVxdWVzdFBlcnNpc3RlbnRBbmNob3JQZW5kaW5nID0gdGhpcy5kYXRhLnBlcnNpc3RlbnQsIHRoaXMucmVxdWVzdEFuY2hvclBlbmRpbmcgPSAhdGhpcy5kYXRhLnBlcnNpc3RlbnQ7CiAgfSwgdGljazogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSwgdDIsIG4yLCBpMiA9IHRoaXMuZWwuc2NlbmVFbCwgcjIgPSBpMi5yZW5kZXJlci54ciwgbzIgPSB0aGlzLmVsLm9iamVjdDNEOwogICAgKGkyLmlzKCJhci1tb2RlIikgfHwgaTIuaXMoInZyLW1vZGUiKSkgJiYgKCF0aGlzLmFuY2hvciAmJiB0aGlzLnJlcXVlc3RQZXJzaXN0ZW50QW5jaG9yUGVuZGluZyAmJiB0aGlzLnJlc3RvcmVQZXJzaXN0ZW50QW5jaG9yKCksICF0aGlzLmFuY2hvciAmJiB0aGlzLnJlcXVlc3RBbmNob3JQZW5kaW5nICYmIHRoaXMuY3JlYXRlQW5jaG9yKCksIHRoaXMuYW5jaG9yICYmIChlID0gaTIuZnJhbWUsIHQyID0gcjIuZ2V0UmVmZXJlbmNlU3BhY2UoKSwgbjIgPSBlLmdldFBvc2UodGhpcy5hbmNob3IuYW5jaG9yU3BhY2UsIHQyKSwgbzIucG9zaXRpb24uY29weShuMi50cmFuc2Zvcm0ucG9zaXRpb24pLCBvMi5xdWF0ZXJuaW9uLmNvcHkobjIudHJhbnNmb3JtLm9yaWVudGF0aW9uKSkpOwogIH0sIGNyZWF0ZUFuY2hvcjogYXN5bmMgZnVuY3Rpb24oZSwgdDIpIHsKICAgIHZhciBuMiwgaTIsIHIyLCBvMiwgczIgPSB0aGlzLmVsLnNjZW5lRWwsIGEyID0gczIucmVuZGVyZXIueHIsIEEyID0gdGhpcy5lbC5vYmplY3QzRDsKICAgIGUgPSBlIHx8IEEyLnBvc2l0aW9uLCB0MiA9IHQyIHx8IHRoaXMuYXV4UXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoQTIucm90YXRpb24pLCBmdW5jdGlvbihlMikgewogICAgICB2YXIgdDMgPSBlMi5yZW5kZXJlci54ci5nZXRTZXNzaW9uKCk7CiAgICAgIHJldHVybiB0MyAmJiB0My5yZXN0b3JlUGVyc2lzdGVudEFuY2hvcjsKICAgIH0oczIpID8gKHRoaXMuYW5jaG9yICYmIHRoaXMuZGVsZXRlQW5jaG9yKCksIG4yID0gczIuZnJhbWUsIGkyID0gYTIuZ2V0UmVmZXJlbmNlU3BhY2UoKSwgcjIgPSBuZXcgWFJSaWdpZFRyYW5zZm9ybSh7IHg6IGUueCwgeTogZS55LCB6OiBlLnogfSwgeyB4OiB0Mi54LCB5OiB0Mi55LCB6OiB0Mi56LCB3OiB0Mi53IH0pLCB0aGlzLnJlcXVlc3RBbmNob3JQZW5kaW5nID0gZmFsc2UsIG8yID0gYXdhaXQgbjIuY3JlYXRlQW5jaG9yKHIyLCBpMiksIHRoaXMuZGF0YS5wZXJzaXN0ZW50ICYmICh0aGlzLmVsLmlkID8gKHRoaXMucGVyc2lzdGVudEhhbmRsZSA9IGF3YWl0IG8yLnJlcXVlc3RQZXJzaXN0ZW50SGFuZGxlKCksIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuZWwuaWQsIHRoaXMucGVyc2lzdGVudEhhbmRsZSkpIDogeGEoIlRoZSBhbmNob3Igd29uJ3QgYmUgcGVyc2lzdGVkIGJlY2F1c2UgdGhlIGVudGl0eSBoYXMgbm8gYXNzaWduZWQgaWQuIikpLCBzMi5vYmplY3QzRC5hdHRhY2godGhpcy5lbC5vYmplY3QzRCksIHRoaXMuYW5jaG9yID0gbzIpIDogeGEoIlRoaXMgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgdGhlIFdlYlhSIGFuY2hvcnMgbW9kdWxlIik7CiAgfSwgcmVzdG9yZVBlcnNpc3RlbnRBbmNob3I6IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyID0gdGhpcy5lbC5zY2VuZUVsLnJlbmRlcmVyLnhyLmdldFNlc3Npb24oKSwgbjIgPSB0Mi5wZXJzaXN0ZW50QW5jaG9yczsKICAgIGlmICh0aGlzLnJlcXVlc3RQZXJzaXN0ZW50QW5jaG9yUGVuZGluZyA9IGZhbHNlLCAhdGhpcy5lbC5pZCkKICAgICAgcmV0dXJuIHhhKCJUaGUgZW50aXR5IGFzc29jaWF0ZWQgdG8gdGhlIHBlcnNpc3RlbnQgYW5jaG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgYW4gYXNzaWduZWQgaWQuIiksIHZvaWQgKHRoaXMucmVxdWVzdEFuY2hvclBlbmRpbmcgPSB0cnVlKTsKICAgIGlmIChuMikgewogICAgICBlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5lbC5pZCk7CiAgICAgIGZvciAodmFyIGkyID0gMDtpMiA8IG4yLmxlbmd0aDsgKytpMikKICAgICAgICBpZiAoZSA9PT0gbjJbaTJdKSB7CiAgICAgICAgICB0aGlzLmFuY2hvciA9IGF3YWl0IHQyLnJlc3RvcmVQZXJzaXN0ZW50QW5jaG9yKG4yW2kyXSksIHRoaXMuYW5jaG9yICYmICh0aGlzLnBlcnNpc3RlbnRIYW5kbGUgPSBuMltpMl0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB0aGlzLmFuY2hvciB8fCAodGhpcy5yZXF1ZXN0QW5jaG9yUGVuZGluZyA9IHRydWUpOwogICAgfSBlbHNlCiAgICAgIHRoaXMucmVxdWVzdFBlcnNpc3RlbnRBbmNob3JQZW5kaW5nID0gdHJ1ZTsKICB9LCBkZWxldGVBbmNob3I6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyID0gdGhpcy5hbmNob3I7CiAgICB0MiAmJiAoZSA9IHRoaXMuZWwuc2NlbmVFbC5yZW5kZXJlci54ci5nZXRTZXNzaW9uKCksIHQyLmRlbGV0ZSgpLCB0aGlzLmVsLnNjZW5lRWwub2JqZWN0M0QuYWRkKHRoaXMuZWwub2JqZWN0M0QpLCB0aGlzLnBlcnNpc3RlbnRIYW5kbGUgJiYgZS5kZWxldGVQZXJzaXN0ZW50QW5jaG9yKHRoaXMucGVyc2lzdGVudEhhbmRsZSksIHRoaXMuYW5jaG9yID0gdW5kZWZpbmVkKTsKICB9IH0pLCBjcygiY2FtZXJhIiwgeyBzY2hlbWE6IHsgYWN0aXZlOiB7IGRlZmF1bHQ6IHRydWUgfSwgZmFyOiB7IGRlZmF1bHQ6IDFlNCB9LCBmb3Y6IHsgZGVmYXVsdDogODAsIG1pbjogMCB9LCBuZWFyOiB7IGRlZmF1bHQ6IDAuMDA1LCBtaW46IDAgfSwgc3BlY3RhdG9yOiB7IGRlZmF1bHQ6IGZhbHNlIH0sIHpvb206IHsgZGVmYXVsdDogMSwgbWluOiAwIH0gfSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSwgdDIgPSB0aGlzLmVsOwogICAgZSA9IHRoaXMuY2FtZXJhID0gbmV3IFJlLlBlcnNwZWN0aXZlQ2FtZXJhLCB0Mi5zZXRPYmplY3QzRCgiY2FtZXJhIiwgZSk7CiAgfSwgdXBkYXRlOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSB0aGlzLmRhdGEsIG4yID0gdGhpcy5jYW1lcmE7CiAgICBuMi5hc3BlY3QgPSB0Mi5hc3BlY3QgfHwgd2luZG93LmlubmVyV2lkdGggLyB3aW5kb3cuaW5uZXJIZWlnaHQsIG4yLmZhciA9IHQyLmZhciwgbjIuZm92ID0gdDIuZm92LCBuMi5uZWFyID0gdDIubmVhciwgbjIuem9vbSA9IHQyLnpvb20sIG4yLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSwgdGhpcy51cGRhdGVBY3RpdmVDYW1lcmEoZSksIHRoaXMudXBkYXRlU3BlY3RhdG9yQ2FtZXJhKGUpOwogIH0sIHVwZGF0ZUFjdGl2ZUNhbWVyYTogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyID0gdGhpcy5kYXRhLCBuMiA9IHRoaXMuZWwsIGkyID0gdGhpcy5zeXN0ZW07CiAgICBlICYmIGUuYWN0aXZlID09PSB0Mi5hY3RpdmUgfHwgdDIuc3BlY3RhdG9yIHx8ICh0Mi5hY3RpdmUgJiYgaTIuYWN0aXZlQ2FtZXJhRWwgIT09IG4yID8gaTIuc2V0QWN0aXZlQ2FtZXJhKG4yKSA6IHQyLmFjdGl2ZSB8fCBpMi5hY3RpdmVDYW1lcmFFbCAhPT0gbjIgfHwgaTIuZGlzYWJsZUFjdGl2ZUNhbWVyYSgpKTsKICB9LCB1cGRhdGVTcGVjdGF0b3JDYW1lcmE6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IHRoaXMuZGF0YSwgbjIgPSB0aGlzLmVsLCBpMiA9IHRoaXMuc3lzdGVtOwogICAgZSAmJiBlLnNwZWN0YXRvciA9PT0gdDIuc3BlY3RhdG9yIHx8ICh0Mi5zcGVjdGF0b3IgJiYgaTIuc3BlY3RhdG9yQ2FtZXJhRWwgIT09IG4yID8gaTIuc2V0U3BlY3RhdG9yQ2FtZXJhKG4yKSA6IHQyLnNwZWN0YXRvciB8fCBpMi5zcGVjdGF0b3JDYW1lcmFFbCAhPT0gbjIgfHwgaTIuZGlzYWJsZVNwZWN0YXRvckNhbWVyYSgpKTsKICB9LCByZW1vdmU6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5yZW1vdmVPYmplY3QzRCgiY2FtZXJhIik7CiAgfSB9KTsKICBVYSA9IHsgRE9XTjogWyJtb3VzZWRvd24iLCAidG91Y2hzdGFydCJdLCBVUDogWyJtb3VzZXVwIiwgInRvdWNoZW5kIl0gfTsKICBPYSA9IHsgRE9XTjogWyJzZWxlY3RzdGFydCJdLCBVUDogWyJzZWxlY3RlbmQiXSB9OwogIEdhID0gKGNzKCJjdXJzb3IiLCB7IGRlcGVuZGVuY2llczogWyJyYXljYXN0ZXIiXSwgc2NoZW1hOiB7IGRvd25FdmVudHM6IHsgZGVmYXVsdDogW10gfSwgZnVzZTogeyBkZWZhdWx0OiBTaSgpIH0sIGZ1c2VUaW1lb3V0OiB7IGRlZmF1bHQ6IDE1MDAsIG1pbjogMCB9LCBtb3VzZUN1cnNvclN0eWxlc0VuYWJsZWQ6IHsgZGVmYXVsdDogdHJ1ZSB9LCB1cEV2ZW50czogeyBkZWZhdWx0OiBbXSB9LCByYXlPcmlnaW46IHsgZGVmYXVsdDogImVudGl0eSIsIG9uZU9mOiBbIm1vdXNlIiwgImVudGl0eSIsICJ4cnNlbGVjdCJdIH0gfSwgYWZ0ZXI6IFsidHJhY2tlZC1jb250cm9scyJdLCBtdWx0aXBsZTogdHJ1ZSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXM7CiAgICB0aGlzLmZ1c2VUaW1lb3V0ID0gdW5kZWZpbmVkLCB0aGlzLmN1cnNvckRvd25FbCA9IG51bGwsIHRoaXMuaW50ZXJzZWN0ZWRFbCA9IG51bGwsIHRoaXMuY2FudmFzQm91bmRzID0gZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgdGhpcy5pc0N1cnNvckRvd24gPSBmYWxzZSwgdGhpcy5hY3RpdmVYUklucHV0ID0gbnVsbCwgdGhpcy51cGRhdGVDYW52YXNCb3VuZHMgPSBXcihmdW5jdGlvbigpIHsKICAgICAgZS5jYW52YXNCb3VuZHMgPSBlLmVsLnNjZW5lRWwuY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgfSwgNTAwKSwgdGhpcy5ldmVudERldGFpbCA9IHt9LCB0aGlzLmludGVyc2VjdGVkRXZlbnREZXRhaWwgPSB7IGN1cnNvckVsOiB0aGlzLmVsIH0sIHRoaXMub25DdXJzb3JEb3duID0gdGhpcy5vbkN1cnNvckRvd24uYmluZCh0aGlzKSwgdGhpcy5vbkN1cnNvclVwID0gdGhpcy5vbkN1cnNvclVwLmJpbmQodGhpcyksIHRoaXMub25JbnRlcnNlY3Rpb24gPSB0aGlzLm9uSW50ZXJzZWN0aW9uLmJpbmQodGhpcyksIHRoaXMub25JbnRlcnNlY3Rpb25DbGVhcmVkID0gdGhpcy5vbkludGVyc2VjdGlvbkNsZWFyZWQuYmluZCh0aGlzKSwgdGhpcy5vbk1vdXNlTW92ZSA9IHRoaXMub25Nb3VzZU1vdmUuYmluZCh0aGlzKSwgdGhpcy5vbkVudGVyVlIgPSB0aGlzLm9uRW50ZXJWUi5iaW5kKHRoaXMpOwogIH0sIHVwZGF0ZTogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyID0gdGhpcy5kYXRhLnJheU9yaWdpbjsKICAgIHQyICE9PSBlLnJheU9yaWdpbiAmJiAodDIgPT09ICJlbnRpdHkiICYmIHRoaXMucmVzZXRSYXljYXN0ZXIoKSwgdGhpcy51cGRhdGVNb3VzZUV2ZW50TGlzdGVuZXJzKCksIHQyICE9PSAieHJzZWxlY3QiICYmIHQyICE9PSAiZW50aXR5IiB8fCB0aGlzLmFkZFdlYlhSRXZlbnRMaXN0ZW5lcnMoKSwgZS5yYXlPcmlnaW4gIT09ICJ4cnNlbGVjdCIgJiYgZS5yYXlPcmlnaW4gIT09ICJlbnRpdHkiIHx8IHRoaXMucmVtb3ZlV2ViWFJFdmVudExpc3RlbmVycygpKTsKICB9LCB0aWNrOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbC5zY2VuZUVsLmZyYW1lLCB0MiA9IHRoaXMuYWN0aXZlWFJJbnB1dDsKICAgIHRoaXMuZGF0YS5yYXlPcmlnaW4gPT09ICJ4cnNlbGVjdCIgJiYgZSAmJiB0MiAmJiB0aGlzLm9uTW91c2VNb3ZlKHsgZnJhbWU6IGUsIGlucHV0U291cmNlOiB0MiwgdHlwZTogImZha2VzZWxlY3RldmVudCIgfSk7CiAgfSwgcGxheTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7CiAgfSwgcGF1c2U6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpOwogIH0sIHJlbW92ZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWw7CiAgICBlLnJlbW92ZVN0YXRlKFJhKSwgZS5yZW1vdmVTdGF0ZShUYSksIGNsZWFyVGltZW91dCh0aGlzLmZ1c2VUaW1lb3V0KSwgdGhpcy5pbnRlcnNlY3RlZEVsICYmIHRoaXMuaW50ZXJzZWN0ZWRFbC5yZW1vdmVTdGF0ZShGYSksIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTsKICB9LCBhZGRFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSwgdDIgPSB0aGlzLmRhdGEsIG4yID0gdGhpcy5lbCwgaTIgPSB0aGlzOwogICAgZnVuY3Rpb24gcjIoKSB7CiAgICAgIGUgPSBuMi5zY2VuZUVsLmNhbnZhcywgdDIuZG93bkV2ZW50cy5sZW5ndGggfHwgdDIudXBFdmVudHMubGVuZ3RoIHx8IChVYS5ET1dOLmZvckVhY2goZnVuY3Rpb24odDMpIHsKICAgICAgICBlLmFkZEV2ZW50TGlzdGVuZXIodDMsIGkyLm9uQ3Vyc29yRG93biwgeyBwYXNzaXZlOiBmYWxzZSB9KTsKICAgICAgfSksIFVhLlVQLmZvckVhY2goZnVuY3Rpb24odDMpIHsKICAgICAgICBlLmFkZEV2ZW50TGlzdGVuZXIodDMsIGkyLm9uQ3Vyc29yVXAsIHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgICAgIH0pKTsKICAgIH0KICAgIChlID0gbjIuc2NlbmVFbC5jYW52YXMpID8gcjIoKSA6IG4yLnNjZW5lRWwuYWRkRXZlbnRMaXN0ZW5lcigicmVuZGVyLXRhcmdldC1sb2FkZWQiLCByMiksIHQyLmRvd25FdmVudHMuZm9yRWFjaChmdW5jdGlvbihlMikgewogICAgICBuMi5hZGRFdmVudExpc3RlbmVyKGUyLCBpMi5vbkN1cnNvckRvd24pOwogICAgfSksIHQyLnVwRXZlbnRzLmZvckVhY2goZnVuY3Rpb24oZTIpIHsKICAgICAgbjIuYWRkRXZlbnRMaXN0ZW5lcihlMiwgaTIub25DdXJzb3JVcCk7CiAgICB9KSwgbjIuYWRkRXZlbnRMaXN0ZW5lcigicmF5Y2FzdGVyLWludGVyc2VjdGlvbiIsIHRoaXMub25JbnRlcnNlY3Rpb24pLCBuMi5hZGRFdmVudExpc3RlbmVyKCJyYXljYXN0ZXItY2xvc2VzdC1lbnRpdHktY2hhbmdlZCIsIHRoaXMub25JbnRlcnNlY3Rpb24pLCBuMi5hZGRFdmVudExpc3RlbmVyKCJyYXljYXN0ZXItaW50ZXJzZWN0aW9uLWNsZWFyZWQiLCB0aGlzLm9uSW50ZXJzZWN0aW9uQ2xlYXJlZCksIG4yLnNjZW5lRWwuYWRkRXZlbnRMaXN0ZW5lcigicmVuZGVyZXJyZXNpemUiLCB0aGlzLnVwZGF0ZUNhbnZhc0JvdW5kcyksIG4yLnNjZW5lRWwuYWRkRXZlbnRMaXN0ZW5lcigiZW50ZXItdnIiLCB0aGlzLm9uRW50ZXJWUiksIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLnVwZGF0ZUNhbnZhc0JvdW5kcyksIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCB0aGlzLnVwZGF0ZUNhbnZhc0JvdW5kcyksIHRoaXMudXBkYXRlTW91c2VFdmVudExpc3RlbmVycygpOwogIH0sIHJlbW92ZUV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgIHZhciBlLCB0MiA9IHRoaXMuZGF0YSwgbjIgPSB0aGlzLmVsLCBpMiA9IHRoaXM7CiAgICAhKGUgPSBuMi5zY2VuZUVsLmNhbnZhcykgfHwgdDIuZG93bkV2ZW50cy5sZW5ndGggfHwgdDIudXBFdmVudHMubGVuZ3RoIHx8IChVYS5ET1dOLmZvckVhY2goZnVuY3Rpb24odDMpIHsKICAgICAgZS5yZW1vdmVFdmVudExpc3RlbmVyKHQzLCBpMi5vbkN1cnNvckRvd24pOwogICAgfSksIFVhLlVQLmZvckVhY2goZnVuY3Rpb24odDMpIHsKICAgICAgZS5yZW1vdmVFdmVudExpc3RlbmVyKHQzLCBpMi5vbkN1cnNvclVwKTsKICAgIH0pKSwgdDIuZG93bkV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGUyKSB7CiAgICAgIG4yLnJlbW92ZUV2ZW50TGlzdGVuZXIoZTIsIGkyLm9uQ3Vyc29yRG93bik7CiAgICB9KSwgdDIudXBFdmVudHMuZm9yRWFjaChmdW5jdGlvbihlMikgewogICAgICBuMi5yZW1vdmVFdmVudExpc3RlbmVyKGUyLCBpMi5vbkN1cnNvclVwKTsKICAgIH0pLCBuMi5yZW1vdmVFdmVudExpc3RlbmVyKCJyYXljYXN0ZXItaW50ZXJzZWN0aW9uIiwgdGhpcy5vbkludGVyc2VjdGlvbiksIG4yLnJlbW92ZUV2ZW50TGlzdGVuZXIoInJheWNhc3Rlci1jbG9zZXN0LWVudGl0eS1jaGFuZ2VkIiwgdGhpcy5vbkludGVyc2VjdGlvbiksIG4yLnJlbW92ZUV2ZW50TGlzdGVuZXIoInJheWNhc3Rlci1pbnRlcnNlY3Rpb24tY2xlYXJlZCIsIHRoaXMub25JbnRlcnNlY3Rpb25DbGVhcmVkKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCB0aGlzLm9uTW91c2VNb3ZlKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgdGhpcy5vbk1vdXNlTW92ZSksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIiwgdGhpcy5vbk1vdXNlTW92ZSksIG4yLnNjZW5lRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVuZGVyZXJyZXNpemUiLCB0aGlzLnVwZGF0ZUNhbnZhc0JvdW5kcyksIG4yLnNjZW5lRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW50ZXItdnIiLCB0aGlzLm9uRW50ZXJWUiksIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLCB0aGlzLnVwZGF0ZUNhbnZhc0JvdW5kcyksIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLCB0aGlzLnVwZGF0ZUNhbnZhc0JvdW5kcyksIHRoaXMucmVtb3ZlV2ViWFJFdmVudExpc3RlbmVycygpOwogIH0sIHVwZGF0ZU1vdXNlRXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyID0gdGhpcy5lbDsKICAgIChlID0gdDIuc2NlbmVFbC5jYW52YXMpLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMub25Nb3VzZU1vdmUpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsIHRoaXMub25Nb3VzZU1vdmUpLCB0Mi5zZXRBdHRyaWJ1dGUoInJheWNhc3RlciIsICJ1c2VXb3JsZENvb3JkaW5hdGVzIiwgZmFsc2UpLCB0aGlzLmRhdGEucmF5T3JpZ2luID09PSAibW91c2UiICYmIChlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMub25Nb3VzZU1vdmUpLCBlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsIHRoaXMub25Nb3VzZU1vdmUsIHsgcGFzc2l2ZTogZmFsc2UgfSksIHQyLnNldEF0dHJpYnV0ZSgicmF5Y2FzdGVyIiwgInVzZVdvcmxkQ29vcmRpbmF0ZXMiLCB0cnVlKSwgdGhpcy51cGRhdGVDYW52YXNCb3VuZHMoKSk7CiAgfSwgcmVzZXRSYXljYXN0ZXI6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoInJheWNhc3RlciIsIHsgZGlyZWN0aW9uOiBuZXcgUmUuVmVjdG9yMygpLnNldCgwLCAwLCAtMSksIG9yaWdpbjogbmV3IFJlLlZlY3RvcjMgfSk7CiAgfSwgYWRkV2ViWFJFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMsIHQyID0gdGhpcy5lbC5zY2VuZUVsLnhyU2Vzc2lvbjsKICAgIHQyICYmIChPYS5ET1dOLmZvckVhY2goZnVuY3Rpb24objIpIHsKICAgICAgdDIuYWRkRXZlbnRMaXN0ZW5lcihuMiwgZS5vbkN1cnNvckRvd24pOwogICAgfSksIE9hLlVQLmZvckVhY2goZnVuY3Rpb24objIpIHsKICAgICAgdDIuYWRkRXZlbnRMaXN0ZW5lcihuMiwgZS5vbkN1cnNvclVwKTsKICAgIH0pKTsKICB9LCByZW1vdmVXZWJYUkV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcywgdDIgPSB0aGlzLmVsLnNjZW5lRWwueHJTZXNzaW9uOwogICAgdDIgJiYgKE9hLkRPV04uZm9yRWFjaChmdW5jdGlvbihuMikgewogICAgICB0Mi5yZW1vdmVFdmVudExpc3RlbmVyKG4yLCBlLm9uQ3Vyc29yRG93bik7CiAgICB9KSwgT2EuVVAuZm9yRWFjaChmdW5jdGlvbihuMikgewogICAgICB0Mi5yZW1vdmVFdmVudExpc3RlbmVyKG4yLCBlLm9uQ3Vyc29yVXApOwogICAgfSkpOwogIH0sIG9uTW91c2VNb3ZlOiAoUWEgPSBuZXcgUmUuVmVjdG9yMywgTGEgPSBuZXcgUmUuVmVjdG9yMiwgTWEgPSBuZXcgUmUuVmVjdG9yMywgU2EgPSB7IG9yaWdpbjogTWEsIGRpcmVjdGlvbjogUWEgfSwgZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiwgaTIsIHIyLCBvMiwgczIsIGEyLCBBMiwgbDIsIGMyID0gdGhpcy5jYW52YXNCb3VuZHMsIGgyID0gdGhpcy5lbC5zY2VuZUVsLmNhbWVyYTsKICAgIGgyLnBhcmVudC51cGRhdGVNYXRyaXhXb3JsZCgpLCBuMiA9IChpMiA9IGUudHlwZSA9PT0gInRvdWNobW92ZSIgfHwgZS50eXBlID09PSAidG91Y2hzdGFydCIgPyBlLnRvdWNoZXMuaXRlbSgwKSA6IGUpLmNsaWVudFggLSBjMi5sZWZ0LCByMiA9IGkyLmNsaWVudFkgLSBjMi50b3AsIExhLnggPSBuMiAvIGMyLndpZHRoICogMiAtIDEsIExhLnkgPSAtcjIgLyBjMi5oZWlnaHQgKiAyICsgMSwgdGhpcy5kYXRhLnJheU9yaWdpbiAhPT0gInhyc2VsZWN0IiB8fCBlLnR5cGUgIT09ICJzZWxlY3RzdGFydCIgJiYgZS50eXBlICE9PSAiZmFrZXNlbGVjdGV2ZW50IiA/IGUudHlwZSA9PT0gImZha2VzZWxlY3RvdXQiID8gKFFhLnNldCgwLCAxLCAwKSwgTWEuc2V0KDAsIDk5OTksIDApKSA6IGgyICYmIGgyLmlzUGVyc3BlY3RpdmVDYW1lcmEgPyAoTWEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGgyLm1hdHJpeFdvcmxkKSwgUWEuc2V0KExhLngsIExhLnksIDAuNSkudW5wcm9qZWN0KGgyKS5zdWIoTWEpLm5vcm1hbGl6ZSgpKSA6IGgyICYmIGgyLmlzT3J0aG9ncmFwaGljQ2FtZXJhID8gKE1hLnNldChMYS54LCBMYS55LCAoaDIubmVhciArIGgyLmZhcikgLyAoaDIubmVhciAtIGgyLmZhcikpLnVucHJvamVjdChoMiksIFFhLnNldCgwLCAwLCAtMSkudHJhbnNmb3JtRGlyZWN0aW9uKGgyLm1hdHJpeFdvcmxkKSkgOiBjb25zb2xlLmVycm9yKCJBRlJBTUUuUmF5Y2FzdGVyOiBVbnN1cHBvcnRlZCBjYW1lcmEgdHlwZTogIiArIGgyLnR5cGUpIDogKG8yID0gZS5mcmFtZSwgczIgPSBlLmlucHV0U291cmNlLCBhMiA9IHRoaXMuZWwuc2NlbmVFbC5yZW5kZXJlci54ci5nZXRSZWZlcmVuY2VTcGFjZSgpLCAoQTIgPSBvMi5nZXRQb3NlKHMyLnRhcmdldFJheVNwYWNlLCBhMikpICYmIChsMiA9IEEyLnRyYW5zZm9ybSwgUWEuc2V0KDAsIDAsIC0xKSwgUWEuYXBwbHlRdWF0ZXJuaW9uKGwyLm9yaWVudGF0aW9uKSwgTWEuY29weShsMi5wb3NpdGlvbiksICh0MiA9IGgyLmVsLm9iamVjdDNELnBhcmVudCkubG9jYWxUb1dvcmxkKE1hKSwgUWEudHJhbnNmb3JtRGlyZWN0aW9uKHQyLm1hdHJpeFdvcmxkKSkpLCB0aGlzLmVsLnNldEF0dHJpYnV0ZSgicmF5Y2FzdGVyIiwgU2EpLCBlLnR5cGUgPT09ICJ0b3VjaG1vdmUiICYmIGUucHJldmVudERlZmF1bHQoKTsKICB9KSwgb25DdXJzb3JEb3duOiBmdW5jdGlvbihlKSB7CiAgICB0aGlzLmlzQ3Vyc29yRG93biA9IHRydWUsIHRoaXMuZGF0YS5yYXlPcmlnaW4gPT09ICJtb3VzZSIgJiYgZS50eXBlID09PSAidG91Y2hzdGFydCIgJiYgKHRoaXMub25Nb3VzZU1vdmUoZSksIHRoaXMuZWwuY29tcG9uZW50cy5yYXljYXN0ZXIuY2hlY2tJbnRlcnNlY3Rpb25zKCksIGUucHJldmVudERlZmF1bHQoKSksIHRoaXMuZGF0YS5yYXlPcmlnaW4gPT09ICJ4cnNlbGVjdCIgJiYgZS50eXBlID09PSAic2VsZWN0c3RhcnQiICYmICh0aGlzLmFjdGl2ZVhSSW5wdXQgPSBlLmlucHV0U291cmNlLCB0aGlzLm9uTW91c2VNb3ZlKGUpLCB0aGlzLmVsLmNvbXBvbmVudHMucmF5Y2FzdGVyLmNoZWNrSW50ZXJzZWN0aW9ucygpLCB0aGlzLmVsLmNvbXBvbmVudHMucmF5Y2FzdGVyLmludGVyc2VjdGVkRWxzLmxlbmd0aCAmJiB0aGlzLmVsLnNjZW5lRWwuY29tcG9uZW50c1siYXItaGl0LXRlc3QiXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZWwuc2NlbmVFbC5nZXRBdHRyaWJ1dGUoImFyLWhpdC10ZXN0IikuZW5hYmxlZCAmJiAodGhpcy5lbC5zY2VuZUVsLnNldEF0dHJpYnV0ZSgiYXItaGl0LXRlc3QiLCAiZW5hYmxlZCIsIGZhbHNlKSwgdGhpcy5yZWVuYWJsZUFSSGl0VGVzdCA9IHRydWUpKSwgdGhpcy50d29XYXlFbWl0KCJtb3VzZWRvd24iLCBlKSwgdGhpcy5jdXJzb3JEb3duRWwgPSB0aGlzLmludGVyc2VjdGVkRWw7CiAgfSwgb25DdXJzb3JVcDogZnVuY3Rpb24oZSkgewogICAgaWYgKHRoaXMuaXNDdXJzb3JEb3duICYmICh0aGlzLmRhdGEucmF5T3JpZ2luICE9PSAieHJzZWxlY3QiIHx8IHRoaXMuYWN0aXZlWFJJbnB1dCA9PT0gZS5pbnB1dFNvdXJjZSkpIHsKICAgICAgdGhpcy5pc0N1cnNvckRvd24gPSBmYWxzZTsKICAgICAgdmFyIHQyID0gdGhpcy5kYXRhOwogICAgICB0aGlzLnR3b1dheUVtaXQoa2EsIGUpLCB0aGlzLnJlZW5hYmxlQVJIaXRUZXN0ID09PSB0cnVlICYmICh0aGlzLmVsLnNjZW5lRWwuc2V0QXR0cmlidXRlKCJhci1oaXQtdGVzdCIsICJlbmFibGVkIiwgdHJ1ZSksIHRoaXMucmVlbmFibGVBUkhpdFRlc3QgPSB1bmRlZmluZWQpLCB0aGlzLmN1cnNvckRvd25FbCAmJiB0aGlzLmN1cnNvckRvd25FbCAhPT0gdGhpcy5pbnRlcnNlY3RlZEVsICYmICh0aGlzLmludGVyc2VjdGVkRXZlbnREZXRhaWwuaW50ZXJzZWN0aW9uID0gbnVsbCwgdGhpcy5jdXJzb3JEb3duRWwuZW1pdChrYSwgdGhpcy5pbnRlcnNlY3RlZEV2ZW50RGV0YWlsKSksIHQyLmZ1c2UgJiYgdDIucmF5T3JpZ2luICE9PSAibW91c2UiICYmIHQyLnJheU9yaWdpbiAhPT0gInhyc2VsZWN0IiB8fCAhdGhpcy5pbnRlcnNlY3RlZEVsIHx8IHRoaXMuY3Vyc29yRG93bkVsICE9PSB0aGlzLmludGVyc2VjdGVkRWwgfHwgdGhpcy50d29XYXlFbWl0KERhLCBlKSwgdDIucmF5T3JpZ2luID09PSAieHJzZWxlY3QiICYmIHRoaXMub25Nb3VzZU1vdmUoeyB0eXBlOiAiZmFrZXNlbGVjdG91dCIgfSksIHRoaXMuYWN0aXZlWFJJbnB1dCA9IG51bGwsIHRoaXMuY3Vyc29yRG93bkVsID0gbnVsbCwgZS50eXBlID09PSAidG91Y2hlbmQiICYmIGUucHJldmVudERlZmF1bHQoKTsKICAgIH0KICB9LCBvbkludGVyc2VjdGlvbjogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiwgaTIsIHIyLCBvMiA9IHRoaXMuZWw7CiAgICBuMiA9IGUuZGV0YWlsLmVsc1swXSA9PT0gbzIgPyAxIDogMCwgcjIgPSBlLmRldGFpbC5pbnRlcnNlY3Rpb25zW24yXSwgKGkyID0gZS5kZXRhaWwuZWxzW24yXSkgJiYgdGhpcy5pbnRlcnNlY3RlZEVsICE9PSBpMiAmJiAodGhpcy5pbnRlcnNlY3RlZEVsICYmICh0MiA9IHRoaXMuZWwuY29tcG9uZW50cy5yYXljYXN0ZXIuZ2V0SW50ZXJzZWN0aW9uKHRoaXMuaW50ZXJzZWN0ZWRFbCkpICYmIHQyLmRpc3RhbmNlIDw9IHIyLmRpc3RhbmNlIHx8ICh0aGlzLmNsZWFyQ3VycmVudEludGVyc2VjdGlvbih0cnVlKSwgdGhpcy5zZXRJbnRlcnNlY3Rpb24oaTIsIHIyKSkpOwogIH0sIG9uSW50ZXJzZWN0aW9uQ2xlYXJlZDogZnVuY3Rpb24oZSkgewogICAgZS5kZXRhaWwuY2xlYXJlZEVscy5pbmRleE9mKHRoaXMuaW50ZXJzZWN0ZWRFbCkgIT09IC0xICYmIHRoaXMuY2xlYXJDdXJyZW50SW50ZXJzZWN0aW9uKCk7CiAgfSwgb25FbnRlclZSOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5kYXRhLnJheU9yaWdpbjsKICAgIHRoaXMuY2xlYXJDdXJyZW50SW50ZXJzZWN0aW9uKHRydWUpLCBlICE9PSAieHJzZWxlY3QiICYmIGUgIT09ICJlbnRpdHkiIHx8IHRoaXMuYWRkV2ViWFJFdmVudExpc3RlbmVycygpOwogIH0sIHNldEludGVyc2VjdGlvbjogZnVuY3Rpb24oZSwgdDIpIHsKICAgIHZhciBuMiA9IHRoaXMuZWwsIGkyID0gdGhpcy5kYXRhLCByMiA9IHRoaXM7CiAgICB0aGlzLmludGVyc2VjdGVkRWwgIT09IGUgJiYgKHRoaXMuaW50ZXJzZWN0ZWRFbCA9IGUsIG4yLmFkZFN0YXRlKFJhKSwgZS5hZGRTdGF0ZShGYSksIHRoaXMudHdvV2F5RW1pdCgibW91c2VlbnRlciIpLCB0aGlzLmRhdGEubW91c2VDdXJzb3JTdHlsZXNFbmFibGVkICYmIHRoaXMuZGF0YS5yYXlPcmlnaW4gPT09ICJtb3VzZSIgJiYgdGhpcy5lbC5zY2VuZUVsLmNhbnZhcy5jbGFzc0xpc3QuYWRkKFBhKSwgaTIuZnVzZVRpbWVvdXQgIT09IDAgJiYgaTIuZnVzZSAmJiBpMi5yYXlPcmlnaW4gIT09ICJ4cnNlbGVjdCIgJiYgaTIucmF5T3JpZ2luICE9PSAibW91c2UiICYmIChuMi5hZGRTdGF0ZShUYSksIHRoaXMudHdvV2F5RW1pdCgiZnVzaW5nIiksIHRoaXMuZnVzZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICBuMi5yZW1vdmVTdGF0ZShUYSksIHIyLnR3b1dheUVtaXQoRGEpOwogICAgfSwgaTIuZnVzZVRpbWVvdXQpKSk7CiAgfSwgY2xlYXJDdXJyZW50SW50ZXJzZWN0aW9uOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIsIG4yLCBpMiA9IHRoaXMuZWw7CiAgICB0aGlzLmludGVyc2VjdGVkRWwgJiYgKHRoaXMuaW50ZXJzZWN0ZWRFbC5yZW1vdmVTdGF0ZShGYSksIGkyLnJlbW92ZVN0YXRlKFJhKSwgaTIucmVtb3ZlU3RhdGUoVGEpLCB0aGlzLnR3b1dheUVtaXQoIm1vdXNlbGVhdmUiKSwgdGhpcy5kYXRhLm1vdXNlQ3Vyc29yU3R5bGVzRW5hYmxlZCAmJiB0aGlzLmRhdGEucmF5T3JpZ2luID09PSAibW91c2UiICYmIHRoaXMuZWwuc2NlbmVFbC5jYW52YXMuY2xhc3NMaXN0LnJlbW92ZShQYSksIHRoaXMuaW50ZXJzZWN0ZWRFbCA9IG51bGwsIGNsZWFyVGltZW91dCh0aGlzLmZ1c2VUaW1lb3V0KSwgZSAhPT0gdHJ1ZSAmJiAobjIgPSB0aGlzLmVsLmNvbXBvbmVudHMucmF5Y2FzdGVyLmludGVyc2VjdGlvbnMpLmxlbmd0aCAhPT0gMCAmJiAodDIgPSBuMltuMlswXS5vYmplY3QuZWwgPT09IGkyID8gMSA6IDBdKSAmJiB0aGlzLnNldEludGVyc2VjdGlvbih0Mi5vYmplY3QuZWwsIHQyKSk7CiAgfSwgdHdvV2F5RW1pdDogZnVuY3Rpb24oZSwgdDIpIHsKICAgIHZhciBuMiwgaTIgPSB0aGlzLmVsLCByMiA9IHRoaXMuaW50ZXJzZWN0ZWRFbDsKICAgIGZ1bmN0aW9uIG8yKGUyLCBuMykgewogICAgICB0MiBpbnN0YW5jZW9mIE1vdXNlRXZlbnQgPyBlMi5tb3VzZUV2ZW50ID0gdDIgOiB0eXBlb2YgVG91Y2hFdmVudCAhPSAidW5kZWZpbmVkIiAmJiB0MiBpbnN0YW5jZW9mIFRvdWNoRXZlbnQgJiYgKGUyLnRvdWNoRXZlbnQgPSB0Mik7CiAgICB9CiAgICBuMiA9IHRoaXMuZWwuY29tcG9uZW50cy5yYXljYXN0ZXIuZ2V0SW50ZXJzZWN0aW9uKHIyKSwgdGhpcy5ldmVudERldGFpbC5pbnRlcnNlY3RlZEVsID0gcjIsIHRoaXMuZXZlbnREZXRhaWwuaW50ZXJzZWN0aW9uID0gbjIsIG8yKHRoaXMuZXZlbnREZXRhaWwpLCBpMi5lbWl0KGUsIHRoaXMuZXZlbnREZXRhaWwpLCByMiAmJiAodGhpcy5pbnRlcnNlY3RlZEV2ZW50RGV0YWlsLmludGVyc2VjdGlvbiA9IG4yLCBvMih0aGlzLmludGVyc2VjdGVkRXZlbnREZXRhaWwpLCByMi5lbWl0KGUsIHRoaXMuaW50ZXJzZWN0ZWRFdmVudERldGFpbCkpOwogIH0gfSksIG5ldyBSZS5CdWZmZXJHZW9tZXRyeSk7CiAgTmEgPSAoY3MoImdlb21ldHJ5IiwgeyBzY2hlbWE6IHsgYnVmZmVyOiB7IGRlZmF1bHQ6IHRydWUgfSwgcHJpbWl0aXZlOiB7IGRlZmF1bHQ6ICJib3giLCBvbmVPZjogX3MsIHNjaGVtYUNoYW5nZTogdHJ1ZSB9LCBza2lwQ2FjaGU6IHsgZGVmYXVsdDogZmFsc2UgfSB9LCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZ2VvbWV0cnkgPSBudWxsOwogIH0sIHVwZGF0ZTogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiA9IHRoaXMuZGF0YSwgaTIgPSB0aGlzLmVsLCByMiA9IHRoaXMuc3lzdGVtOwogICAgdGhpcy5nZW9tZXRyeSAmJiAocjIudW51c2VHZW9tZXRyeShlKSwgdGhpcy5nZW9tZXRyeSA9IG51bGwpLCB0aGlzLmdlb21ldHJ5ID0gcjIuZ2V0T3JDcmVhdGVHZW9tZXRyeShuMiksICh0MiA9IGkyLmdldE9iamVjdDNEKCJtZXNoIikpID8gdDIuZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5IDogKCh0MiA9IG5ldyBSZS5NZXNoKS5nZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnksIHRoaXMuZWwuZ2V0QXR0cmlidXRlKCJtYXRlcmlhbCIpIHx8ICh0Mi5tYXRlcmlhbCA9IG5ldyBSZS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IGNvbG9yOiAxNjc3NzIxNSAqIE1hdGgucmFuZG9tKCksIG1ldGFsbmVzczogMCwgcm91Z2huZXNzOiAwLjUgfSkpLCBpMi5zZXRPYmplY3QzRCgibWVzaCIsIHQyKSk7CiAgfSwgcmVtb3ZlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuc3lzdGVtLnVudXNlR2VvbWV0cnkodGhpcy5kYXRhKSwgdGhpcy5lbC5nZXRPYmplY3QzRCgibWVzaCIpLmdlb21ldHJ5ID0gR2EsIHRoaXMuZ2VvbWV0cnkgPSBudWxsOwogIH0sIHVwZGF0ZVNjaGVtYTogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyID0gdGhpcy5vbGREYXRhICYmIHRoaXMub2xkRGF0YS5wcmltaXRpdmUsIG4yID0gZS5wcmltaXRpdmUsIGkyID0ganNbbjJdICYmIGpzW24yXS5zY2hlbWE7CiAgICBpZiAoIWkyKQogICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZ2VvbWV0cnkgc2NoZW1hIGAiICsgbjIgKyAiYCIpOwogICAgdDIgJiYgdDIgPT09IG4yIHx8IHRoaXMuZXh0ZW5kU2NoZW1hKGkyKTsKICB9IH0pLCAiZ2VuZXJpYyIpOwogIGphID0gKGNzKCJnZW5lcmljLXRyYWNrZWQtY29udHJvbGxlci1jb250cm9scyIsIHsgc2NoZW1hOiB7IGhhbmQ6IHsgZGVmYXVsdDogIiIgfSwgZGVmYXVsdE1vZGVsOiB7IGRlZmF1bHQ6IHRydWUgfSwgZGVmYXVsdE1vZGVsQ29sb3I6IHsgZGVmYXVsdDogImdyYXkiIH0sIGRpc2FibGVkOiB7IGRlZmF1bHQ6IGZhbHNlIH0gfSwgYWZ0ZXI6IFsidHJhY2tlZC1jb250cm9scyJdLCBtYXBwaW5nOiB7IGF4ZXM6IHsgdG91Y2hwYWQ6IFswLCAxXSwgdGh1bWJzdGljazogWzIsIDNdIH0sIGJ1dHRvbnM6IFsidHJpZ2dlciIsICJzcXVlZXplIiwgInRvdWNocGFkIiwgInRodW1ic3RpY2siXSB9LCBiaW5kTWV0aG9kczogZnVuY3Rpb24oKSB7CiAgICB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUgPSB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUuYmluZCh0aGlzKSwgdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQgPSB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudC5iaW5kKHRoaXMpLCB0aGlzLnJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIgPSB0aGlzLnJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIuYmluZCh0aGlzKSwgdGhpcy5vbkF4aXNNb3ZlZCA9IHRoaXMub25BeGlzTW92ZWQuYmluZCh0aGlzKTsKICB9LCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpczsKICAgIHRoaXMub25CdXR0b25DaGFuZ2VkID0gdGhpcy5vbkJ1dHRvbkNoYW5nZWQuYmluZCh0aGlzKSwgdGhpcy5vbkJ1dHRvbkRvd24gPSBmdW5jdGlvbih0MikgewogICAgICBOcih0Mi5kZXRhaWwuaWQsICJkb3duIiwgZSk7CiAgICB9LCB0aGlzLm9uQnV0dG9uVXAgPSBmdW5jdGlvbih0MikgewogICAgICBOcih0Mi5kZXRhaWwuaWQsICJ1cCIsIGUpOwogICAgfSwgdGhpcy5vbkJ1dHRvblRvdWNoU3RhcnQgPSBmdW5jdGlvbih0MikgewogICAgICBOcih0Mi5kZXRhaWwuaWQsICJ0b3VjaHN0YXJ0IiwgZSk7CiAgICB9LCB0aGlzLm9uQnV0dG9uVG91Y2hFbmQgPSBmdW5jdGlvbih0MikgewogICAgICBOcih0Mi5kZXRhaWwuaWQsICJ0b3VjaGVuZCIsIGUpOwogICAgfSwgdGhpcy5jb250cm9sbGVyUHJlc2VudCA9IGZhbHNlLCB0aGlzLndhc0NvbnRyb2xsZXJDb25uZWN0ZWQgPSBmYWxzZSwgdGhpcy5iaW5kTWV0aG9kcygpLCB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJjb25uZWN0ZWQiLCBmdW5jdGlvbih0MikgewogICAgICB0Mi5kZXRhaWwubmFtZSAhPT0gZS5uYW1lICYmIChlLndhc0NvbnRyb2xsZXJDb25uZWN0ZWQgPSB0cnVlLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCksIGUucmVtb3ZlQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcigpKTsKICAgIH0pOwogIH0sIGFkZEV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbDsKICAgIGUuYWRkRXZlbnRMaXN0ZW5lcigiYnV0dG9uY2hhbmdlZCIsIHRoaXMub25CdXR0b25DaGFuZ2VkKSwgZS5hZGRFdmVudExpc3RlbmVyKCJidXR0b25kb3duIiwgdGhpcy5vbkJ1dHRvbkRvd24pLCBlLmFkZEV2ZW50TGlzdGVuZXIoImJ1dHRvbnVwIiwgdGhpcy5vbkJ1dHRvblVwKSwgZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgdGhpcy5vbkJ1dHRvblRvdWNoU3RhcnQpLCBlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgdGhpcy5vbkJ1dHRvblRvdWNoRW5kKSwgZS5hZGRFdmVudExpc3RlbmVyKCJheGlzbW92ZSIsIHRoaXMub25BeGlzTW92ZWQpLCB0aGlzLmNvbnRyb2xsZXJFdmVudHNBY3RpdmUgPSB0cnVlOwogIH0sIHJlbW92ZUV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbDsKICAgIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYnV0dG9uY2hhbmdlZCIsIHRoaXMub25CdXR0b25DaGFuZ2VkKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJidXR0b25kb3duIiwgdGhpcy5vbkJ1dHRvbkRvd24pLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJ1dHRvbnVwIiwgdGhpcy5vbkJ1dHRvblVwKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgdGhpcy5vbkJ1dHRvblRvdWNoU3RhcnQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgdGhpcy5vbkJ1dHRvblRvdWNoRW5kKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJheGlzbW92ZSIsIHRoaXMub25BeGlzTW92ZWQpLCB0aGlzLmNvbnRyb2xsZXJFdmVudHNBY3RpdmUgPSBmYWxzZTsKICB9LCBjaGVja0lmQ29udHJvbGxlclByZXNlbnQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmRhdGEsIHQyID0gZS5oYW5kID8gZS5oYW5kIDogdW5kZWZpbmVkOwogICAgVXIodGhpcywgTmEsIHsgaGFuZDogdDIsIGl0ZXJhdGVDb250cm9sbGVyUHJvZmlsZXM6IHRydWUgfSk7CiAgfSwgcGxheTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLndhc0NvbnRyb2xsZXJDb25uZWN0ZWQgfHwgKHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50KCksIHRoaXMuYWRkQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcigpKTsKICB9LCBwYXVzZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCksIHRoaXMucmVtb3ZlQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcigpOwogIH0sIGluamVjdFRyYWNrZWRDb250cm9sczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWwsIHQyID0gdGhpcy5kYXRhOwogICAgdGhpcy5lbC5jb21wb25lbnRzWyJ0cmFja2VkLWNvbnRyb2xzIl0gPyB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCkgOiAoZS5zZXRBdHRyaWJ1dGUoInRyYWNrZWQtY29udHJvbHMiLCB7IGhhbmQ6IHQyLmhhbmQsIGlkUHJlZml4OiBOYSwgaXRlcmF0ZUNvbnRyb2xsZXJQcm9maWxlczogdHJ1ZSB9KSwgdGhpcy5kYXRhLmRlZmF1bHRNb2RlbCAmJiB0aGlzLmluaXREZWZhdWx0TW9kZWwoKSk7CiAgfSwgYWRkQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsLnNjZW5lRWwuYWRkRXZlbnRMaXN0ZW5lcigiY29udHJvbGxlcnN1cGRhdGVkIiwgdGhpcy5vbkNvbnRyb2xsZXJzVXBkYXRlLCBmYWxzZSk7CiAgfSwgcmVtb3ZlQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsLnNjZW5lRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udHJvbGxlcnN1cGRhdGVkIiwgdGhpcy5vbkNvbnRyb2xsZXJzVXBkYXRlLCBmYWxzZSk7CiAgfSwgb25Db250cm9sbGVyc1VwZGF0ZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLndhc0NvbnRyb2xsZXJDb25uZWN0ZWQgJiYgdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQoKTsKICB9LCBvbkJ1dHRvbkNoYW5nZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IHRoaXMubWFwcGluZy5idXR0b25zW2UuZGV0YWlsLmlkXTsKICAgIHQyICYmIHRoaXMuZWwuZW1pdCh0MiArICJjaGFuZ2VkIiwgZS5kZXRhaWwuc3RhdGUpOwogIH0sIG9uQXhpc01vdmVkOiBmdW5jdGlvbihlKSB7CiAgICBHcih0aGlzLCB0aGlzLm1hcHBpbmcuYXhlcywgZSk7CiAgfSwgaW5pdERlZmF1bHRNb2RlbDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMubW9kZWxFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEtZW50aXR5Iik7CiAgICBlLnNldEF0dHJpYnV0ZSgiZ2VvbWV0cnkiLCB7IHByaW1pdGl2ZTogInNwaGVyZSIsIHJhZGl1czogMC4wMyB9KSwgZS5zZXRBdHRyaWJ1dGUoIm1hdGVyaWFsIiwgeyBjb2xvcjogdGhpcy5kYXRhLmNvbG9yIH0pLCB0aGlzLmVsLmFwcGVuZENoaWxkKGUpLCB0aGlzLmVsLmVtaXQoImNvbnRyb2xsZXJtb2RlbHJlYWR5IiwgeyBuYW1lOiAiZ2VuZXJpYy10cmFja2VkLWNvbnRyb2xsZXItY29udHJvbHMiLCBtb2RlbDogdGhpcy5tb2RlbEVsLCByYXlPcmlnaW46IHsgb3JpZ2luOiB7IHg6IDAsIHk6IDAsIHo6IC0wLjAxIH0sIGRpcmVjdGlvbjogeyB4OiAwLCB5OiAwLCB6OiAtMSB9IH0gfSk7CiAgfSB9KSwgZmkoImNvbXBvbmVudHM6Z2x0Zi1tb2RlbDp3YXJuIikpOwogIGNzKCJnbHRmLW1vZGVsIiwgeyBzY2hlbWE6IHsgdHlwZTogIm1vZGVsIiB9LCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcywgdDIgPSB0aGlzLnN5c3RlbS5nZXREUkFDT0xvYWRlcigpLCBuMiA9IHRoaXMuc3lzdGVtLmdldE1lc2hvcHREZWNvZGVyKCksIGkyID0gdGhpcy5zeXN0ZW0uZ2V0S1RYMkxvYWRlcigpOwogICAgdGhpcy5tb2RlbCA9IG51bGwsIHRoaXMubG9hZGVyID0gbmV3IFhlLCB0MiAmJiB0aGlzLmxvYWRlci5zZXREUkFDT0xvYWRlcih0MiksIHRoaXMucmVhZHkgPSBuMiA/IG4yLnRoZW4oZnVuY3Rpb24odDMpIHsKICAgICAgZS5sb2FkZXIuc2V0TWVzaG9wdERlY29kZXIodDMpOwogICAgfSkgOiBQcm9taXNlLnJlc29sdmUoKSwgaTIgJiYgdGhpcy5sb2FkZXIuc2V0S1RYMkxvYWRlcihpMik7CiAgfSwgdXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcywgdDIgPSB0aGlzLmVsLCBuMiA9IHRoaXMuZGF0YTsKICAgIG4yICYmICh0aGlzLnJlbW92ZSgpLCB0aGlzLnJlYWR5LnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIGUubG9hZGVyLmxvYWQobjIsIGZ1bmN0aW9uKG4zKSB7CiAgICAgICAgZS5tb2RlbCA9IG4zLnNjZW5lIHx8IG4zLnNjZW5lc1swXSwgZS5tb2RlbC5hbmltYXRpb25zID0gbjMuYW5pbWF0aW9ucywgdDIuc2V0T2JqZWN0M0QoIm1lc2giLCBlLm1vZGVsKSwgdDIuZW1pdCgibW9kZWwtbG9hZGVkIiwgeyBmb3JtYXQ6ICJnbHRmIiwgbW9kZWw6IGUubW9kZWwgfSk7CiAgICAgIH0sIHVuZGVmaW5lZCwgZnVuY3Rpb24oZTIpIHsKICAgICAgICB2YXIgaTIgPSBlMiAmJiBlMi5tZXNzYWdlID8gZTIubWVzc2FnZSA6ICJGYWlsZWQgdG8gbG9hZCBnbFRGIG1vZGVsIjsKICAgICAgICBqYShpMiksIHQyLmVtaXQoIm1vZGVsLWVycm9yIiwgeyBmb3JtYXQ6ICJnbHRmIiwgc3JjOiBuMiB9KTsKICAgICAgfSk7CiAgICB9KSk7CiAgfSwgcmVtb3ZlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMubW9kZWwgJiYgdGhpcy5lbC5yZW1vdmVPYmplY3QzRCgibWVzaCIpOwogIH0gfSksIGNzKCJncmFiYmFibGUiLCB7IGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoIm9iYi1jb2xsaWRlciIsICJjZW50ZXJNb2RlbDogdHJ1ZSIpOwogIH0gfSk7CiAgSGEgPSBjaSArICJjb250cm9sbGVycy9vY3VsdXMtaGFuZHMvdjQvbGVmdC5nbGIiOwogIHFhID0gY2kgKyAiY29udHJvbGxlcnMvb2N1bHVzLWhhbmRzL3Y0L3JpZ2h0LmdsYiI7CiAgVmEgPSBbIndyaXN0IiwgInRodW1iLW1ldGFjYXJwYWwiLCAidGh1bWItcGhhbGFueC1wcm94aW1hbCIsICJ0aHVtYi1waGFsYW54LWRpc3RhbCIsICJ0aHVtYi10aXAiLCAiaW5kZXgtZmluZ2VyLW1ldGFjYXJwYWwiLCAiaW5kZXgtZmluZ2VyLXBoYWxhbngtcHJveGltYWwiLCAiaW5kZXgtZmluZ2VyLXBoYWxhbngtaW50ZXJtZWRpYXRlIiwgImluZGV4LWZpbmdlci1waGFsYW54LWRpc3RhbCIsICJpbmRleC1maW5nZXItdGlwIiwgIm1pZGRsZS1maW5nZXItbWV0YWNhcnBhbCIsICJtaWRkbGUtZmluZ2VyLXBoYWxhbngtcHJveGltYWwiLCAibWlkZGxlLWZpbmdlci1waGFsYW54LWludGVybWVkaWF0ZSIsICJtaWRkbGUtZmluZ2VyLXBoYWxhbngtZGlzdGFsIiwgIm1pZGRsZS1maW5nZXItdGlwIiwgInJpbmctZmluZ2VyLW1ldGFjYXJwYWwiLCAicmluZy1maW5nZXItcGhhbGFueC1wcm94aW1hbCIsICJyaW5nLWZpbmdlci1waGFsYW54LWludGVybWVkaWF0ZSIsICJyaW5nLWZpbmdlci1waGFsYW54LWRpc3RhbCIsICJyaW5nLWZpbmdlci10aXAiLCAicGlua3ktZmluZ2VyLW1ldGFjYXJwYWwiLCAicGlua3ktZmluZ2VyLXBoYWxhbngtcHJveGltYWwiLCAicGlua3ktZmluZ2VyLXBoYWxhbngtaW50ZXJtZWRpYXRlIiwgInBpbmt5LWZpbmdlci1waGFsYW54LWRpc3RhbCIsICJwaW5reS1maW5nZXItdGlwIl07CiAgY3MoImhhbmQtdHJhY2tpbmctY29udHJvbHMiLCB7IHNjaGVtYTogeyBoYW5kOiB7IGRlZmF1bHQ6ICJyaWdodCIsIG9uZU9mOiBbImxlZnQiLCAicmlnaHQiXSB9LCBtb2RlbFN0eWxlOiB7IGRlZmF1bHQ6ICJtZXNoIiwgb25lT2Y6IFsiZG90cyIsICJtZXNoIl0gfSwgbW9kZWxDb2xvcjogeyBkZWZhdWx0OiAid2hpdGUiIH0sIG1vZGVsT3BhY2l0eTogeyBkZWZhdWx0OiAxIH0gfSwgYWZ0ZXI6IFsidHJhY2tlZC1jb250cm9scyJdLCBiaW5kTWV0aG9kczogZnVuY3Rpb24oKSB7CiAgICB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUgPSB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUuYmluZCh0aGlzKSwgdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQgPSB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudC5iaW5kKHRoaXMpLCB0aGlzLnJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIgPSB0aGlzLnJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIuYmluZCh0aGlzKTsKICB9LCBhZGRFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoIm1vZGVsLWxvYWRlZCIsIHRoaXMub25Nb2RlbExvYWRlZCk7CiAgICBmb3IgKHZhciBlID0gMDtlIDwgdGhpcy5qb2ludEVscy5sZW5ndGg7ICsrZSkKICAgICAgdGhpcy5qb2ludEVsc1tlXS5vYmplY3QzRC52aXNpYmxlID0gdHJ1ZTsKICB9LCByZW1vdmVFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vZGVsLWxvYWRlZCIsIHRoaXMub25Nb2RlbExvYWRlZCk7CiAgICBmb3IgKHZhciBlID0gMDtlIDwgdGhpcy5qb2ludEVscy5sZW5ndGg7ICsrZSkKICAgICAgdGhpcy5qb2ludEVsc1tlXS5vYmplY3QzRC52aXNpYmxlID0gZmFsc2U7CiAgfSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWwuc2NlbmVFbCwgdDIgPSBlLmdldEF0dHJpYnV0ZSgid2VieHIiKSwgbjIgPSB0Mi5vcHRpb25hbEZlYXR1cmVzOwogICAgbjIuaW5kZXhPZigiaGFuZC10cmFja2luZyIpID09PSAtMSAmJiAobjIucHVzaCgiaGFuZC10cmFja2luZyIpLCBlLnNldEF0dHJpYnV0ZSgid2VieHIiLCB0MikpLCB0aGlzLndyaXN0T2JqZWN0M0QgPSBuZXcgUmUuT2JqZWN0M0QsIHRoaXMuZWwuc2NlbmVFbC5vYmplY3QzRC5hZGQodGhpcy53cmlzdE9iamVjdDNEKSwgdGhpcy5vbk1vZGVsTG9hZGVkID0gdGhpcy5vbk1vZGVsTG9hZGVkLmJpbmQodGhpcyksIHRoaXMub25DaGlsZEF0dGFjaGVkID0gdGhpcy5vbkNoaWxkQXR0YWNoZWQuYmluZCh0aGlzKSwgdGhpcy5qb2ludEVscyA9IFtdLCB0aGlzLmNvbnRyb2xsZXJQcmVzZW50ID0gZmFsc2UsIHRoaXMuaXNQaW5jaGVkID0gZmFsc2UsIHRoaXMucGluY2hFdmVudERldGFpbCA9IHsgcG9zaXRpb246IG5ldyBSZS5WZWN0b3IzLCB3cmlzdFJvdGF0aW9uOiBuZXcgUmUuUXVhdGVybmlvbiB9LCB0aGlzLmluZGV4VGlwUG9zaXRpb24gPSBuZXcgUmUuVmVjdG9yMywgdGhpcy5oYXNQb3NlcyA9IGZhbHNlLCB0aGlzLmpvaW50UG9zZXMgPSBuZXcgRmxvYXQzMkFycmF5KDE2ICogVmEubGVuZ3RoKSwgdGhpcy5qb2ludFJhZGlpID0gbmV3IEZsb2F0MzJBcnJheShWYS5sZW5ndGgpLCB0aGlzLmJpbmRNZXRob2RzKCksIHRoaXMudXBkYXRlUmVmZXJlbmNlU3BhY2UgPSB0aGlzLnVwZGF0ZVJlZmVyZW5jZVNwYWNlLmJpbmQodGhpcyksIHRoaXMuZWwuc2NlbmVFbC5hZGRFdmVudExpc3RlbmVyKCJlbnRlci12ciIsIHRoaXMudXBkYXRlUmVmZXJlbmNlU3BhY2UpLCB0aGlzLmVsLnNjZW5lRWwuYWRkRXZlbnRMaXN0ZW5lcigiZXhpdC12ciIsIHRoaXMudXBkYXRlUmVmZXJlbmNlU3BhY2UpLCB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoImNoaWxkLWF0dGFjaGVkIiwgdGhpcy5vbkNoaWxkQXR0YWNoZWQpLCB0aGlzLndyaXN0T2JqZWN0M0QudmlzaWJsZSA9IGZhbHNlOwogIH0sIG9uQ2hpbGRBdHRhY2hlZDogZnVuY3Rpb24oZSkgewogICAgdGhpcy5hZGRDaGlsZEVudGl0eShlLmRldGFpbC5lbCk7CiAgfSwgdXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMudXBkYXRlTW9kZWxNYXRlcmlhbCgpOwogIH0sIHVwZGF0ZU1vZGVsTWF0ZXJpYWw6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmpvaW50RWxzLCB0MiA9IHRoaXMuc2tpbm5lZE1lc2gsIG4yID0gISh0aGlzLmRhdGEubW9kZWxPcGFjaXR5ID09PSAxKTsKICAgIHQyICYmICh0aGlzLnNraW5uZWRNZXNoLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmRhdGEubW9kZWxDb2xvciksIHRoaXMuc2tpbm5lZE1lc2gubWF0ZXJpYWwudHJhbnNwYXJlbnQgPSBuMiwgdGhpcy5za2lubmVkTWVzaC5tYXRlcmlhbC5vcGFjaXR5ID0gdGhpcy5kYXRhLm1vZGVsT3BhY2l0eSk7CiAgICBmb3IgKHZhciBpMiA9IDA7aTIgPCBlLmxlbmd0aDsgaTIrKykKICAgICAgZVtpMl0uc2V0QXR0cmlidXRlKCJtYXRlcmlhbCIsIHsgY29sb3I6IHRoaXMuZGF0YS5tb2RlbENvbG9yLCB0cmFuc3BhcmVudDogbjIsIG9wYWNpdHk6IHRoaXMuZGF0YS5tb2RlbE9wYWNpdHkgfSk7CiAgfSwgdXBkYXRlUmVmZXJlbmNlU3BhY2U6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLCB0MiA9IHRoaXMuZWwuc2NlbmVFbC54clNlc3Npb247CiAgICBpZiAodGhpcy5yZWZlcmVuY2VTcGFjZSA9IHVuZGVmaW5lZCwgdDIpIHsKICAgICAgdmFyIG4yID0gZS5lbC5zY2VuZUVsLnN5c3RlbXMud2VieHIuc2Vzc2lvblJlZmVyZW5jZVNwYWNlVHlwZTsKICAgICAgdDIucmVxdWVzdFJlZmVyZW5jZVNwYWNlKG4yKS50aGVuKGZ1bmN0aW9uKHQzKSB7CiAgICAgICAgZS5yZWZlcmVuY2VTcGFjZSA9IHQzOwogICAgICB9KS5jYXRjaChmdW5jdGlvbih0MykgewogICAgICAgIHRocm93IGUuZWwuc2NlbmVFbC5zeXN0ZW1zLndlYnhyLndhcm5JZkZlYXR1cmVOb3RSZXF1ZXN0ZWQobjIsICJ0cmFja2VkLWNvbnRyb2xzLXdlYnhyIHVzZXMgcmVmZXJlbmNlIHNwYWNlICIgKyBuMiksIHQzOwogICAgICB9KTsKICAgIH0KICB9LCBjaGVja0lmQ29udHJvbGxlclByZXNlbnQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmRhdGE7CiAgICBVcih0aGlzLCAiIiwgeyBoYW5kOiBlLmhhbmQgPyBlLmhhbmQgOiB1bmRlZmluZWQsIGl0ZXJhdGVDb250cm9sbGVyUHJvZmlsZXM6IHRydWUsIGhhbmRUcmFja2luZzogdHJ1ZSB9KTsKICB9LCBwbGF5OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50KCksIHRoaXMuYWRkQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcigpOwogIH0sIHRpY2s6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsLnNjZW5lRWwsIHQyID0gdGhpcy5lbC5jb21wb25lbnRzWyJ0cmFja2VkLWNvbnRyb2xzIl0gJiYgdGhpcy5lbC5jb21wb25lbnRzWyJ0cmFja2VkLWNvbnRyb2xzIl0uY29udHJvbGxlciwgbjIgPSBlLmZyYW1lLCBpMiA9IHRoaXMuZWwuY29tcG9uZW50c1sidHJhY2tlZC1jb250cm9scyJdLCByMiA9IHRoaXMucmVmZXJlbmNlU3BhY2U7CiAgICB0MiAmJiBuMiAmJiByMiAmJiBpMiAmJiAodGhpcy5oYXNQb3NlcyA9IGZhbHNlLCB0Mi5oYW5kICYmICh0aGlzLmVsLm9iamVjdDNELnBvc2l0aW9uLnNldCgwLCAwLCAwKSwgdGhpcy5lbC5vYmplY3QzRC5yb3RhdGlvbi5zZXQoMCwgMCwgMCksIHRoaXMuaGFzUG9zZXMgPSBuMi5maWxsUG9zZXModDIuaGFuZC52YWx1ZXMoKSwgcjIsIHRoaXMuam9pbnRQb3NlcykgJiYgbjIuZmlsbEpvaW50UmFkaWkodDIuaGFuZC52YWx1ZXMoKSwgdGhpcy5qb2ludFJhZGlpKSwgdGhpcy51cGRhdGVIYW5kTW9kZWwoKSwgdGhpcy5kZXRlY3RHZXN0dXJlKCksIHRoaXMudXBkYXRlV3Jpc3RPYmplY3QoKSkpOwogIH0sIHVwZGF0ZVdyaXN0T2JqZWN0OiAoX2EgPSBuZXcgUmUuTWF0cml4NCwgZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMud3Jpc3RPYmplY3QzRDsKICAgIGUgJiYgdGhpcy5oYXNQb3NlcyAmJiAoX2EuZnJvbUFycmF5KHRoaXMuam9pbnRQb3NlcywgMCksIGUucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKF9hKSwgZS5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChfYSkpOwogIH0pLCB1cGRhdGVIYW5kTW9kZWw6IGZ1bmN0aW9uKCkgewogICAgdGhpcy53cmlzdE9iamVjdDNELnZpc2libGUgPSB0cnVlLCB0aGlzLmVsLm9iamVjdDNELnZpc2libGUgPSB0cnVlLCB0aGlzLmRhdGEubW9kZWxTdHlsZSA9PT0gImRvdHMiICYmIHRoaXMudXBkYXRlSGFuZERvdHNNb2RlbCgpLCB0aGlzLmRhdGEubW9kZWxTdHlsZSA9PT0gIm1lc2giICYmIHRoaXMudXBkYXRlSGFuZE1lc2hNb2RlbCgpOwogIH0sIGdldEJvbmU6IGZ1bmN0aW9uKGUpIHsKICAgIGZvciAodmFyIHQyID0gdGhpcy5ib25lcywgbjIgPSAwO24yIDwgdDIubGVuZ3RoOyBuMisrKQogICAgICBpZiAodDJbbjJdLm5hbWUgPT09IGUpCiAgICAgICAgcmV0dXJuIHQyW24yXTsKICAgIHJldHVybiBudWxsOwogIH0sIHVwZGF0ZUhhbmRNZXNoTW9kZWw6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSBuZXcgUmUuTWF0cml4NDsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHQyID0gMCwgbjIgPSB0aGlzLmpvaW50UG9zZXMsIGkyID0gdGhpcy5lbC5jb21wb25lbnRzWyJ0cmFja2VkLWNvbnRyb2xzIl0gJiYgdGhpcy5lbC5jb21wb25lbnRzWyJ0cmFja2VkLWNvbnRyb2xzIl0uY29udHJvbGxlcjsKICAgICAgaWYgKGkyICYmIHRoaXMubWVzaCAmJiAodGhpcy5tZXNoLnZpc2libGUgPSBmYWxzZSwgdGhpcy5oYXNQb3NlcykpCiAgICAgICAgZm9yICh2YXIgcjIgb2YgaTIuaGFuZC52YWx1ZXMoKSkgewogICAgICAgICAgdmFyIG8yID0gdGhpcy5nZXRCb25lKHIyLmpvaW50TmFtZSk7CiAgICAgICAgICBvMiAhPSBudWxsICYmICh0aGlzLm1lc2gudmlzaWJsZSA9IHRydWUsIGUuZnJvbUFycmF5KG4yLCAxNiAqIHQyKSwgbzIucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUpLCBvMi5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChlKSksIHQyKys7CiAgICAgICAgfQogICAgfTsKICB9KCksIHVwZGF0ZUhhbmREb3RzTW9kZWw6IGZ1bmN0aW9uKCkgewogICAgZm9yICh2YXIgZSwgdDIsIG4yID0gdGhpcy5qb2ludFBvc2VzLCBpMiA9IHRoaXMuam9pbnRSYWRpaSwgcjIgPSB0aGlzLmVsLmNvbXBvbmVudHNbInRyYWNrZWQtY29udHJvbHMiXSAmJiB0aGlzLmVsLmNvbXBvbmVudHNbInRyYWNrZWQtY29udHJvbHMiXS5jb250cm9sbGVyLCBvMiA9IDA7bzIgPCByMi5oYW5kLnNpemU7IG8yKyspCiAgICAgIHQyID0gKGUgPSB0aGlzLmpvaW50RWxzW28yXSkub2JqZWN0M0QsIGUub2JqZWN0M0QudmlzaWJsZSA9IHRoaXMuaGFzUG9zZXMsIHRoaXMuaGFzUG9zZXMgJiYgKHQyLm1hdHJpeC5mcm9tQXJyYXkobjIsIDE2ICogbzIpLCB0Mi5tYXRyaXguZGVjb21wb3NlKHQyLnBvc2l0aW9uLCB0Mi5yb3RhdGlvbiwgdDIuc2NhbGUpLCBlLnNldEF0dHJpYnV0ZSgic2NhbGUiLCB7IHg6IGkyW28yXSwgeTogaTJbbzJdLCB6OiBpMltvMl0gfSkpOwogIH0sIGRldGVjdEdlc3R1cmU6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5kZXRlY3RQaW5jaCgpOwogIH0sIGRldGVjdFBpbmNoOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gbmV3IFJlLlZlY3RvcjMsIHQyID0gbmV3IFJlLk1hdHJpeDQ7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBuMiA9IHRoaXMuaW5kZXhUaXBQb3NpdGlvbiwgaTIgPSB0aGlzLnBpbmNoRXZlbnREZXRhaWw7CiAgICAgIGlmICh0aGlzLmhhc1Bvc2VzKSB7CiAgICAgICAgZS5zZXRGcm9tTWF0cml4UG9zaXRpb24odDIuZnJvbUFycmF5KHRoaXMuam9pbnRQb3NlcywgNjQpKSwgbjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQyLmZyb21BcnJheSh0aGlzLmpvaW50UG9zZXMsIDE0NCkpLCBpMi53cmlzdFJvdGF0aW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh0Mi5mcm9tQXJyYXkodGhpcy5qb2ludFBvc2VzLCAwKSk7CiAgICAgICAgdmFyIHIyID0gbjIuZGlzdGFuY2VUbyhlKTsKICAgICAgICByMiA8IDAuMDE1ICYmIHRoaXMuaXNQaW5jaGVkID09PSBmYWxzZSAmJiAodGhpcy5pc1BpbmNoZWQgPSB0cnVlLCBpMi5wb3NpdGlvbi5jb3B5KG4yKS5hZGQoZSkubXVsdGlwbHlTY2FsYXIoMC41KSwgdGhpcy5lbC5lbWl0KCJwaW5jaHN0YXJ0ZWQiLCBpMikpLCByMiA+IDAuMDIgJiYgdGhpcy5pc1BpbmNoZWQgPT09IHRydWUgJiYgKHRoaXMuaXNQaW5jaGVkID0gZmFsc2UsIGkyLnBvc2l0aW9uLmNvcHkobjIpLmFkZChlKS5tdWx0aXBseVNjYWxhcigwLjUpLCB0aGlzLmVsLmVtaXQoInBpbmNoZW5kZWQiLCBpMikpLCB0aGlzLmlzUGluY2hlZCAmJiAoaTIucG9zaXRpb24uY29weShuMikuYWRkKGUpLm11bHRpcGx5U2NhbGFyKDAuNSksIHRoaXMuZWwuZW1pdCgicGluY2htb3ZlZCIsIGkyKSk7CiAgICAgIH0KICAgIH07CiAgfSgpLCBwYXVzZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCksIHRoaXMucmVtb3ZlQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcigpOwogIH0sIGluamVjdFRyYWNrZWRDb250cm9sczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWwsIHQyID0gdGhpcy5kYXRhOwogICAgZS5zZXRBdHRyaWJ1dGUoInRyYWNrZWQtY29udHJvbHMiLCB7IGlkOiAiIiwgaGFuZDogdDIuaGFuZCwgaXRlcmF0ZUNvbnRyb2xsZXJQcm9maWxlczogdHJ1ZSwgaGFuZFRyYWNraW5nRW5hYmxlZDogdHJ1ZSB9KSwgdGhpcy5tZXNoID8gdGhpcy5tZXNoICE9PSBlLmdldE9iamVjdDNEKCJtZXNoIikgJiYgZS5zZXRPYmplY3QzRCgibWVzaCIsIHRoaXMubWVzaCkgOiB0aGlzLmluaXREZWZhdWx0TW9kZWwoKTsKICB9LCBhZGRDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuc2NlbmVFbC5hZGRFdmVudExpc3RlbmVyKCJjb250cm9sbGVyc3VwZGF0ZWQiLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUsIGZhbHNlKTsKICB9LCByZW1vdmVDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuc2NlbmVFbC5yZW1vdmVFdmVudExpc3RlbmVyKCJjb250cm9sbGVyc3VwZGF0ZWQiLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUsIGZhbHNlKTsKICB9LCBvbkNvbnRyb2xsZXJzVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIHZhciBlLCB0MiA9IHRoaXMuZWw7CiAgICB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudCgpLCBlID0gdDIuY29tcG9uZW50c1sidHJhY2tlZC1jb250cm9scyJdICYmIHQyLmNvbXBvbmVudHNbInRyYWNrZWQtY29udHJvbHMiXS5jb250cm9sbGVyLCB0aGlzLm1lc2ggJiYgZSAmJiBlLmhhbmQgJiYgZS5oYW5kIGluc3RhbmNlb2YgWFJIYW5kICYmIHQyLnNldE9iamVjdDNEKCJtZXNoIiwgdGhpcy5tZXNoKTsKICB9LCBpbml0RGVmYXVsdE1vZGVsOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5kYXRhOwogICAgZS5tb2RlbFN0eWxlID09PSAiZG90cyIgJiYgdGhpcy5pbml0RG90c01vZGVsKCksIGUubW9kZWxTdHlsZSA9PT0gIm1lc2giICYmIHRoaXMuaW5pdE1lc2hIYW5kTW9kZWwoKSwgdGhpcy5lbC5vYmplY3QzRC52aXNpYmxlID0gdHJ1ZSwgdGhpcy53cmlzdE9iamVjdDNELnZpc2libGUgPSB0cnVlOwogIH0sIGluaXREb3RzTW9kZWw6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuam9pbnRFbHMubGVuZ3RoID09PSAwKSB7CiAgICAgIGZvciAodmFyIGUgPSAwO2UgPCBWYS5sZW5ndGg7ICsrZSkgewogICAgICAgIHZhciB0MiA9IHRoaXMuam9pbnRFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEtZW50aXR5Iik7CiAgICAgICAgdDIuc2V0QXR0cmlidXRlKCJnZW9tZXRyeSIsIHsgcHJpbWl0aXZlOiAic3BoZXJlIiwgcmFkaXVzOiAxIH0pLCB0Mi5vYmplY3QzRC52aXNpYmxlID0gZmFsc2UsIHRoaXMuZWwuYXBwZW5kQ2hpbGQodDIpLCB0aGlzLmpvaW50RWxzLnB1c2godDIpOwogICAgICB9CiAgICAgIHRoaXMudXBkYXRlTW9kZWxNYXRlcmlhbCgpOwogICAgfQogIH0sIGluaXRNZXNoSGFuZE1vZGVsOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5kYXRhLmhhbmQgPT09ICJsZWZ0IiA/IEhhIDogcWE7CiAgICB0aGlzLmVsLnNldEF0dHJpYnV0ZSgiZ2x0Zi1tb2RlbCIsIGUpOwogIH0sIG9uTW9kZWxMb2FkZWQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLm1lc2ggPSB0aGlzLmVsLmdldE9iamVjdDNEKCJtZXNoIikuY2hpbGRyZW5bMF0sIHQyID0gdGhpcy5za2lubmVkTWVzaCA9IGUuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgidHlwZSIsICJTa2lubmVkTWVzaCIpOwogICAgdGhpcy5za2lubmVkTWVzaCAmJiAodGhpcy5ib25lcyA9IHQyLnNrZWxldG9uLmJvbmVzLCB0aGlzLmVsLnJlbW92ZU9iamVjdDNEKCJtZXNoIiksIGUucG9zaXRpb24uc2V0KDAsIDAsIDApLCBlLnJvdGF0aW9uLnNldCgwLCAwLCAwKSwgdDIuZnJ1c3R1bUN1bGxlZCA9IGZhbHNlLCB0Mi5tYXRlcmlhbCA9IG5ldyBSZS5NZXNoU3RhbmRhcmRNYXRlcmlhbCwgdGhpcy51cGRhdGVNb2RlbE1hdGVyaWFsKCksIHRoaXMuc2V0dXBDaGlsZHJlbkVudGl0aWVzKCksIHRoaXMuZWwuc2V0T2JqZWN0M0QoIm1lc2giLCBlKSwgdGhpcy5lbC5lbWl0KCJjb250cm9sbGVybW9kZWxyZWFkeSIsIHsgbmFtZTogImhhbmQtdHJhY2tpbmctY29udHJvbHMiLCBtb2RlbDogdGhpcy5kYXRhLm1vZGVsLCByYXlPcmlnaW46IG5ldyBSZS5WZWN0b3IzKDAsIDAsIDApIH0pKTsKICB9LCBzZXR1cENoaWxkcmVuRW50aXRpZXM6IGZ1bmN0aW9uKCkgewogICAgZm9yICh2YXIgZSA9IHRoaXMuZWwuY2hpbGRyZW4sIHQyID0gMDt0MiA8IGUubGVuZ3RoOyArK3QyKQogICAgICBlW3QyXSBpbnN0YW5jZW9mIExzICYmIHRoaXMuYWRkQ2hpbGRFbnRpdHkoZVt0Ml0pOwogIH0sIGFkZENoaWxkRW50aXR5OiBmdW5jdGlvbihlKSB7CiAgICBlIGluc3RhbmNlb2YgTHMgJiYgdGhpcy53cmlzdE9iamVjdDNELmFkZChlLm9iamVjdDNEKTsKICB9IH0pLCBjcygiaGFuZC10cmFja2luZy1ncmFiLWNvbnRyb2xzIiwgeyBzY2hlbWE6IHsgaGFuZDogeyBkZWZhdWx0OiAicmlnaHQiLCBvbmVPZjogWyJsZWZ0IiwgInJpZ2h0Il0gfSwgY29sb3I6IHsgdHlwZTogImNvbG9yIiwgZGVmYXVsdDogIndoaXRlIiB9LCBob3ZlckNvbG9yOiB7IHR5cGU6ICJjb2xvciIsIGRlZmF1bHQ6ICIjNTM4ZGYxIiB9LCBob3ZlckVuYWJsZWQ6IHsgZGVmYXVsdDogZmFsc2UgfSB9LCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHZhciBlLCB0MiA9IHRoaXMuZWwsIG4yID0gdGhpcy5kYXRhOwogICAgZSA9IG4yLmhhbmQgPT09ICJyaWdodCIgPyAiY29tcG9uZW50cy5oYW5kLXRyYWNraW5nLWNvbnRyb2xzLmJvbmVzLjMiIDogImNvbXBvbmVudHMuaGFuZC10cmFja2luZy1jb250cm9scy5ib25lcy4yMSIsIHQyLnNldEF0dHJpYnV0ZSgiaGFuZC10cmFja2luZy1jb250cm9scyIsIHsgaGFuZDogbjIuaGFuZCB9KSwgdDIuc2V0QXR0cmlidXRlKCJvYmItY29sbGlkZXIiLCB7IHRyYWNrZWRPYmplY3QzRDogZSwgc2l6ZTogMC4wNCB9KSwgdGhpcy5hdXhNYXRyaXggPSBuZXcgUmUuTWF0cml4NCwgdGhpcy5vbkNvbGxpc2lvblN0YXJ0ZWQgPSB0aGlzLm9uQ29sbGlzaW9uU3RhcnRlZC5iaW5kKHRoaXMpLCB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoIm9iYmNvbGxpc2lvbnN0YXJ0ZWQiLCB0aGlzLm9uQ29sbGlzaW9uU3RhcnRlZCksIHRoaXMub25Db2xsaXNpb25FbmRlZCA9IHRoaXMub25Db2xsaXNpb25FbmRlZC5iaW5kKHRoaXMpLCB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoIm9iYmNvbGxpc2lvbmVuZGVkIiwgdGhpcy5vbkNvbGxpc2lvbkVuZGVkKSwgdGhpcy5vblBpbmNoU3RhcnRlZCA9IHRoaXMub25QaW5jaFN0YXJ0ZWQuYmluZCh0aGlzKSwgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCJwaW5jaHN0YXJ0ZWQiLCB0aGlzLm9uUGluY2hTdGFydGVkKSwgdGhpcy5vblBpbmNoRW5kZWQgPSB0aGlzLm9uUGluY2hFbmRlZC5iaW5kKHRoaXMpLCB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoInBpbmNoZW5kZWQiLCB0aGlzLm9uUGluY2hFbmRlZCk7CiAgfSwgdHJhbnNmZXJFbnRpdHlPd25lcnNoaXA6IGZ1bmN0aW9uKCkgewogICAgZm9yICh2YXIgZSwgdDIgPSB0aGlzLmVsLnNjZW5lRWwucXVlcnlTZWxlY3RvckFsbCgiW2hhbmQtdHJhY2tpbmctZ3JhYi1jb250cm9sc10iKSwgbjIgPSAwO24yIDwgdDIubGVuZ3RoOyArK24yKQogICAgICAoZSA9IHQyW24yXS5jb21wb25lbnRzWyJoYW5kLXRyYWNraW5nLWdyYWItY29udHJvbHMiXSkgIT09IHRoaXMgJiYgdGhpcy5ncmFiYmVkRWwgJiYgdGhpcy5ncmFiYmVkRWwgPT09IGUuZ3JhYmJlZEVsICYmIGUucmVsZWFzZUdyYWJiZWRFbnRpdHkoKTsKICAgIHJldHVybiBmYWxzZTsKICB9LCBvbkNvbGxpc2lvblN0YXJ0ZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IGUuZGV0YWlsLndpdGhFbDsKICAgIHRoaXMuY29sbGlkZWRFbCB8fCB0Mi5nZXRBdHRyaWJ1dGUoImdyYWJiYWJsZSIpICYmICh0aGlzLmNvbGxpZGVkRWwgPSB0MiwgdGhpcy5ncmFiYmluZ09iamVjdDNEID0gZS5kZXRhaWwudHJhY2tlZE9iamVjdDNELCB0aGlzLmRhdGEuaG92ZXJFbmFibGVkICYmIHRoaXMuZWwuc2V0QXR0cmlidXRlKCJoYW5kLXRyYWNraW5nLWNvbnRyb2xzIiwgIm1vZGVsQ29sb3IiLCB0aGlzLmRhdGEuaG92ZXJDb2xvcikpOwogIH0sIG9uQ29sbGlzaW9uRW5kZWQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jb2xsaWRlZEVsID0gdW5kZWZpbmVkLCB0aGlzLmdyYWJiZWRFbCB8fCAodGhpcy5ncmFiYmluZ09iamVjdDNEID0gdW5kZWZpbmVkLCB0aGlzLmRhdGEuaG92ZXJFbmFibGVkICYmIHRoaXMuZWwuc2V0QXR0cmlidXRlKCJoYW5kLXRyYWNraW5nLWNvbnRyb2xzIiwgIm1vZGVsQ29sb3IiLCB0aGlzLmRhdGEuY29sb3IpKTsKICB9LCBvblBpbmNoU3RhcnRlZDogZnVuY3Rpb24oZSkgewogICAgdGhpcy5jb2xsaWRlZEVsICYmICh0aGlzLmdyYWJiZWRFbCA9IHRoaXMuY29sbGlkZWRFbCwgdGhpcy50cmFuc2ZlckVudGl0eU93bmVyc2hpcCgpLCB0aGlzLmdyYWIoKSk7CiAgfSwgb25QaW5jaEVuZGVkOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVsZWFzZUdyYWJiZWRFbnRpdHkoKTsKICB9LCByZWxlYXNlR3JhYmJlZEVudGl0eTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZ3JhYmJlZEVsOwogICAgaWYgKGUpIHsKICAgICAgdmFyIHQyID0gZS5vYmplY3QzRCwgbjIgPSB0Mi5wYXJlbnQsIGkyID0gdGhpcy5vcmlnaW5hbFBhcmVudDsKICAgICAgdDIuYXBwbHlNYXRyaXg0KG4yLm1hdHJpeFdvcmxkKSwgdDIuYXBwbHlNYXRyaXg0KHRoaXMuYXV4TWF0cml4LmNvcHkoaTIubWF0cml4V29ybGQpLmludmVydCgpKSwgbjIucmVtb3ZlKHQyKSwgaTIuYWRkKHQyKSwgdGhpcy5lbC5lbWl0KCJncmFiZW5kZWQiLCB7IGdyYWJiZWRFbDogZSB9KSwgdGhpcy5ncmFiYmVkRWwgPSB1bmRlZmluZWQsIHRoaXMub3JpZ2luYWxQYXJlbnQgPSB1bmRlZmluZWQ7CiAgICB9CiAgfSwgZ3JhYjogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZ3JhYmJlZEVsLCB0MiA9IGUub2JqZWN0M0QsIG4yID0gdDIucGFyZW50OwogICAgdGhpcy5vcmlnaW5hbFBhcmVudCA9IG4yOwogICAgdmFyIGkyID0gdGhpcy5lbC5jb21wb25lbnRzWyJoYW5kLXRyYWNraW5nLWNvbnRyb2xzIl0ud3Jpc3RPYmplY3QzRDsKICAgIHQyLmFwcGx5TWF0cml4NChuMi5tYXRyaXhXb3JsZCksIHQyLmFwcGx5TWF0cml4NCh0aGlzLmF1eE1hdHJpeC5jb3B5KGkyLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSksIG4yLnJlbW92ZSh0MiksIGkyLmFkZCh0MiksIHRoaXMuZWwuZW1pdCgiZ3JhYnN0YXJ0ZWQiLCB7IGdyYWJiZWRFbDogZSB9KTsKICB9IH0pOwogIHphID0geyB0b29uTGVmdDogY2kgKyAiY29udHJvbGxlcnMvaGFuZHMvbGVmdEhhbmQuZ2xiIiwgdG9vblJpZ2h0OiBjaSArICJjb250cm9sbGVycy9oYW5kcy9yaWdodEhhbmQuZ2xiIiwgbG93UG9seUxlZnQ6IGNpICsgImNvbnRyb2xsZXJzL2hhbmRzL2xlZnRIYW5kTG93LmdsYiIsIGxvd1BvbHlSaWdodDogY2kgKyAiY29udHJvbGxlcnMvaGFuZHMvcmlnaHRIYW5kTG93LmdsYiIsIGhpZ2hQb2x5TGVmdDogY2kgKyAiY29udHJvbGxlcnMvaGFuZHMvbGVmdEhhbmRIaWdoLmdsYiIsIGhpZ2hQb2x5UmlnaHQ6IGNpICsgImNvbnRyb2xsZXJzL2hhbmRzL3JpZ2h0SGFuZEhpZ2guZ2xiIiB9OwogIEphID0ge307CiAgSmFbS2FdID0gImdyaXAiLCBKYVtXYV0gPSAicGlzdG9sIiwgSmFbWWFdID0gInBvaW50aW5nIiwgY3MoImhhbmQtY29udHJvbHMiLCB7IHNjaGVtYTogeyBjb2xvcjogeyBkZWZhdWx0OiAid2hpdGUiLCB0eXBlOiAiY29sb3IiIH0sIGhhbmQ6IHsgZGVmYXVsdDogImxlZnQiIH0sIGhhbmRNb2RlbFN0eWxlOiB7IGRlZmF1bHQ6ICJsb3dQb2x5Iiwgb25lT2Y6IFsibG93UG9seSIsICJoaWdoUG9seSIsICJ0b29uIl0gfSB9LCBhZnRlcjogWyJ0cmFja2VkLWNvbnRyb2xzIl0sIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLCB0MiA9IHRoaXMuZWw7CiAgICB0aGlzLnByZXNzZWRCdXR0b25zID0ge30sIHRoaXMudG91Y2hlZEJ1dHRvbnMgPSB7fSwgdGhpcy5sb2FkZXIgPSBuZXcgWGUsIHRoaXMubG9hZGVyLnNldENyb3NzT3JpZ2luKCJhbm9ueW1vdXMiKSwgdGhpcy5vbkdyaXBEb3duID0gZnVuY3Rpb24oKSB7CiAgICAgIGUuaGFuZGxlQnV0dG9uKCJncmlwIiwgImRvd24iKTsKICAgIH0sIHRoaXMub25HcmlwVXAgPSBmdW5jdGlvbigpIHsKICAgICAgZS5oYW5kbGVCdXR0b24oImdyaXAiLCAidXAiKTsKICAgIH0sIHRoaXMub25UcmFja3BhZERvd24gPSBmdW5jdGlvbigpIHsKICAgICAgZS5oYW5kbGVCdXR0b24oInRyYWNrcGFkIiwgImRvd24iKTsKICAgIH0sIHRoaXMub25UcmFja3BhZFVwID0gZnVuY3Rpb24oKSB7CiAgICAgIGUuaGFuZGxlQnV0dG9uKCJ0cmFja3BhZCIsICJ1cCIpOwogICAgfSwgdGhpcy5vblRyYWNrcGFkVG91Y2hTdGFydCA9IGZ1bmN0aW9uKCkgewogICAgICBlLmhhbmRsZUJ1dHRvbigidHJhY2twYWQiLCAidG91Y2hzdGFydCIpOwogICAgfSwgdGhpcy5vblRyYWNrcGFkVG91Y2hFbmQgPSBmdW5jdGlvbigpIHsKICAgICAgZS5oYW5kbGVCdXR0b24oInRyYWNrcGFkIiwgInRvdWNoZW5kIik7CiAgICB9LCB0aGlzLm9uVHJpZ2dlckRvd24gPSBmdW5jdGlvbigpIHsKICAgICAgZS5oYW5kbGVCdXR0b24oInRyaWdnZXIiLCAiZG93biIpOwogICAgfSwgdGhpcy5vblRyaWdnZXJVcCA9IGZ1bmN0aW9uKCkgewogICAgICBlLmhhbmRsZUJ1dHRvbigidHJpZ2dlciIsICJ1cCIpOwogICAgfSwgdGhpcy5vblRyaWdnZXJUb3VjaFN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICAgIGUuaGFuZGxlQnV0dG9uKCJ0cmlnZ2VyIiwgInRvdWNoc3RhcnQiKTsKICAgIH0sIHRoaXMub25UcmlnZ2VyVG91Y2hFbmQgPSBmdW5jdGlvbigpIHsKICAgICAgZS5oYW5kbGVCdXR0b24oInRyaWdnZXIiLCAidG91Y2hlbmQiKTsKICAgIH0sIHRoaXMub25HcmlwVG91Y2hTdGFydCA9IGZ1bmN0aW9uKCkgewogICAgICBlLmhhbmRsZUJ1dHRvbigiZ3JpcCIsICJ0b3VjaHN0YXJ0Iik7CiAgICB9LCB0aGlzLm9uR3JpcFRvdWNoRW5kID0gZnVuY3Rpb24oKSB7CiAgICAgIGUuaGFuZGxlQnV0dG9uKCJncmlwIiwgInRvdWNoZW5kIik7CiAgICB9LCB0aGlzLm9uVGh1bWJzdGlja0Rvd24gPSBmdW5jdGlvbigpIHsKICAgICAgZS5oYW5kbGVCdXR0b24oInRodW1ic3RpY2siLCAiZG93biIpOwogICAgfSwgdGhpcy5vblRodW1ic3RpY2tVcCA9IGZ1bmN0aW9uKCkgewogICAgICBlLmhhbmRsZUJ1dHRvbigidGh1bWJzdGljayIsICJ1cCIpOwogICAgfSwgdGhpcy5vbkFvclhUb3VjaFN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICAgIGUuaGFuZGxlQnV0dG9uKCJBb3JYIiwgInRvdWNoc3RhcnQiKTsKICAgIH0sIHRoaXMub25Bb3JYVG91Y2hFbmQgPSBmdW5jdGlvbigpIHsKICAgICAgZS5oYW5kbGVCdXR0b24oIkFvclgiLCAidG91Y2hlbmQiKTsKICAgIH0sIHRoaXMub25Cb3JZVG91Y2hTdGFydCA9IGZ1bmN0aW9uKCkgewogICAgICBlLmhhbmRsZUJ1dHRvbigiQm9yWSIsICJ0b3VjaHN0YXJ0Iik7CiAgICB9LCB0aGlzLm9uQm9yWVRvdWNoRW5kID0gZnVuY3Rpb24oKSB7CiAgICAgIGUuaGFuZGxlQnV0dG9uKCJCb3JZIiwgInRvdWNoZW5kIik7CiAgICB9LCB0aGlzLm9uU3VyZmFjZVRvdWNoU3RhcnQgPSBmdW5jdGlvbigpIHsKICAgICAgZS5oYW5kbGVCdXR0b24oInN1cmZhY2UiLCAidG91Y2hzdGFydCIpOwogICAgfSwgdGhpcy5vblN1cmZhY2VUb3VjaEVuZCA9IGZ1bmN0aW9uKCkgewogICAgICBlLmhhbmRsZUJ1dHRvbigic3VyZmFjZSIsICJ0b3VjaGVuZCIpOwogICAgfSwgdGhpcy5vbkNvbnRyb2xsZXJDb25uZWN0ZWQgPSB0aGlzLm9uQ29udHJvbGxlckNvbm5lY3RlZC5iaW5kKHRoaXMpLCB0aGlzLm9uQ29udHJvbGxlckRpc2Nvbm5lY3RlZCA9IHRoaXMub25Db250cm9sbGVyRGlzY29ubmVjdGVkLmJpbmQodGhpcyksIHQyLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJjb25uZWN0ZWQiLCB0aGlzLm9uQ29udHJvbGxlckNvbm5lY3RlZCksIHQyLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJkaXNjb25uZWN0ZWQiLCB0aGlzLm9uQ29udHJvbGxlckRpc2Nvbm5lY3RlZCksIHQyLm9iamVjdDNELnZpc2libGUgPSBmYWxzZTsKICB9LCBwbGF5OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTsKICB9LCBwYXVzZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7CiAgfSwgdGljazogZnVuY3Rpb24oZSwgdDIpIHsKICAgIHZhciBuMiA9IHRoaXMuZWwuZ2V0T2JqZWN0M0QoIm1lc2giKTsKICAgIG4yICYmIG4yLm1peGVyICYmIG4yLm1peGVyLnVwZGF0ZSh0MiAvIDEwMDApOwogIH0sIG9uQ29udHJvbGxlckNvbm5lY3RlZDogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyID0gdGhpcy5lbCwgbjIgPSB0aGlzLmRhdGEuaGFuZCwgaTIgPSB0aGlzLmVsLmdldE9iamVjdDNEKCJtZXNoIik7CiAgICB0Mi5vYmplY3QzRC52aXNpYmxlID0gdHJ1ZTsKICAgIHZhciByMiA9IG4yID09PSAibGVmdCIgPyBNYXRoLlBJIC8gMiA6IC1NYXRoLlBJIC8gMiwgbzIgPSB0Mi5zY2VuZUVsLmhhc1dlYlhSID8gLU1hdGguUEkgLyAyIDogMDsKICAgIGUuZGV0YWlsLm5hbWUgPT09ICJwaWNvLWNvbnRyb2xzIiAmJiAobzIgKz0gTWF0aC5QSSAvIDQpLCBpMi5wb3NpdGlvbi5zZXQoMCwgMCwgMCksIGkyLnJvdGF0aW9uLnNldChvMiwgMCwgcjIpOwogIH0sIG9uQ29udHJvbGxlckRpc2Nvbm5lY3RlZDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsLm9iamVjdDNELnZpc2libGUgPSBmYWxzZTsKICB9LCBhZGRFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWw7CiAgICBlLmFkZEV2ZW50TGlzdGVuZXIoImdyaXBkb3duIiwgdGhpcy5vbkdyaXBEb3duKSwgZS5hZGRFdmVudExpc3RlbmVyKCJncmlwdXAiLCB0aGlzLm9uR3JpcFVwKSwgZS5hZGRFdmVudExpc3RlbmVyKCJ0cmFja3BhZGRvd24iLCB0aGlzLm9uVHJhY2twYWREb3duKSwgZS5hZGRFdmVudExpc3RlbmVyKCJ0cmFja3BhZHVwIiwgdGhpcy5vblRyYWNrcGFkVXApLCBlLmFkZEV2ZW50TGlzdGVuZXIoInRyYWNrcGFkdG91Y2hzdGFydCIsIHRoaXMub25UcmFja3BhZFRvdWNoU3RhcnQpLCBlLmFkZEV2ZW50TGlzdGVuZXIoInRyYWNrcGFkdG91Y2hlbmQiLCB0aGlzLm9uVHJhY2twYWRUb3VjaEVuZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigidHJpZ2dlcmRvd24iLCB0aGlzLm9uVHJpZ2dlckRvd24pLCBlLmFkZEV2ZW50TGlzdGVuZXIoInRyaWdnZXJ1cCIsIHRoaXMub25UcmlnZ2VyVXApLCBlLmFkZEV2ZW50TGlzdGVuZXIoInRyaWdnZXJ0b3VjaHN0YXJ0IiwgdGhpcy5vblRyaWdnZXJUb3VjaFN0YXJ0KSwgZS5hZGRFdmVudExpc3RlbmVyKCJ0cmlnZ2VydG91Y2hlbmQiLCB0aGlzLm9uVHJpZ2dlclRvdWNoRW5kKSwgZS5hZGRFdmVudExpc3RlbmVyKCJncmlwdG91Y2hzdGFydCIsIHRoaXMub25HcmlwVG91Y2hTdGFydCksIGUuYWRkRXZlbnRMaXN0ZW5lcigiZ3JpcHRvdWNoZW5kIiwgdGhpcy5vbkdyaXBUb3VjaEVuZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigidGh1bWJzdGlja2Rvd24iLCB0aGlzLm9uVGh1bWJzdGlja0Rvd24pLCBlLmFkZEV2ZW50TGlzdGVuZXIoInRodW1ic3RpY2t1cCIsIHRoaXMub25UaHVtYnN0aWNrVXApLCBlLmFkZEV2ZW50TGlzdGVuZXIoImFidXR0b250b3VjaHN0YXJ0IiwgdGhpcy5vbkFvclhUb3VjaFN0YXJ0KSwgZS5hZGRFdmVudExpc3RlbmVyKCJhYnV0dG9udG91Y2hlbmQiLCB0aGlzLm9uQW9yWFRvdWNoRW5kKSwgZS5hZGRFdmVudExpc3RlbmVyKCJiYnV0dG9udG91Y2hzdGFydCIsIHRoaXMub25Cb3JZVG91Y2hTdGFydCksIGUuYWRkRXZlbnRMaXN0ZW5lcigiYmJ1dHRvbnRvdWNoZW5kIiwgdGhpcy5vbkJvcllUb3VjaEVuZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigieGJ1dHRvbnRvdWNoc3RhcnQiLCB0aGlzLm9uQW9yWFRvdWNoU3RhcnQpLCBlLmFkZEV2ZW50TGlzdGVuZXIoInhidXR0b250b3VjaGVuZCIsIHRoaXMub25Bb3JYVG91Y2hFbmQpLCBlLmFkZEV2ZW50TGlzdGVuZXIoInlidXR0b250b3VjaHN0YXJ0IiwgdGhpcy5vbkJvcllUb3VjaFN0YXJ0KSwgZS5hZGRFdmVudExpc3RlbmVyKCJ5YnV0dG9udG91Y2hlbmQiLCB0aGlzLm9uQm9yWVRvdWNoRW5kKSwgZS5hZGRFdmVudExpc3RlbmVyKCJzdXJmYWNldG91Y2hzdGFydCIsIHRoaXMub25TdXJmYWNlVG91Y2hTdGFydCksIGUuYWRkRXZlbnRMaXN0ZW5lcigic3VyZmFjZXRvdWNoZW5kIiwgdGhpcy5vblN1cmZhY2VUb3VjaEVuZCk7CiAgfSwgcmVtb3ZlRXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsOwogICAgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJncmlwZG93biIsIHRoaXMub25HcmlwRG93biksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZ3JpcHVwIiwgdGhpcy5vbkdyaXBVcCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhY2twYWRkb3duIiwgdGhpcy5vblRyYWNrcGFkRG93biksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhY2twYWR1cCIsIHRoaXMub25UcmFja3BhZFVwKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0cmFja3BhZHRvdWNoc3RhcnQiLCB0aGlzLm9uVHJhY2twYWRUb3VjaFN0YXJ0KSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0cmFja3BhZHRvdWNoZW5kIiwgdGhpcy5vblRyYWNrcGFkVG91Y2hFbmQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRyaWdnZXJkb3duIiwgdGhpcy5vblRyaWdnZXJEb3duKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0cmlnZ2VydXAiLCB0aGlzLm9uVHJpZ2dlclVwKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0cmlnZ2VydG91Y2hzdGFydCIsIHRoaXMub25UcmlnZ2VyVG91Y2hTdGFydCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJpZ2dlcnRvdWNoZW5kIiwgdGhpcy5vblRyaWdnZXJUb3VjaEVuZCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZ3JpcHRvdWNoc3RhcnQiLCB0aGlzLm9uR3JpcFRvdWNoU3RhcnQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImdyaXB0b3VjaGVuZCIsIHRoaXMub25HcmlwVG91Y2hFbmQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRodW1ic3RpY2tkb3duIiwgdGhpcy5vblRodW1ic3RpY2tEb3duKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aHVtYnN0aWNrdXAiLCB0aGlzLm9uVGh1bWJzdGlja1VwKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJhYnV0dG9udG91Y2hzdGFydCIsIHRoaXMub25Bb3JYVG91Y2hTdGFydCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJ1dHRvbnRvdWNoZW5kIiwgdGhpcy5vbkFvclhUb3VjaEVuZCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYmJ1dHRvbnRvdWNoc3RhcnQiLCB0aGlzLm9uQm9yWVRvdWNoU3RhcnQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJidXR0b250b3VjaGVuZCIsIHRoaXMub25Cb3JZVG91Y2hFbmQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInhidXR0b250b3VjaHN0YXJ0IiwgdGhpcy5vbkFvclhUb3VjaFN0YXJ0KSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ4YnV0dG9udG91Y2hlbmQiLCB0aGlzLm9uQW9yWFRvdWNoRW5kKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ5YnV0dG9udG91Y2hzdGFydCIsIHRoaXMub25Cb3JZVG91Y2hTdGFydCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigieWJ1dHRvbnRvdWNoZW5kIiwgdGhpcy5vbkJvcllUb3VjaEVuZCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3VyZmFjZXRvdWNoc3RhcnQiLCB0aGlzLm9uU3VyZmFjZVRvdWNoU3RhcnQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInN1cmZhY2V0b3VjaGVuZCIsIHRoaXMub25TdXJmYWNlVG91Y2hFbmQpOwogIH0sIHVwZGF0ZTogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiA9IHRoaXMuZWwsIGkyID0gdGhpcy5kYXRhLmhhbmQsIHIyID0gdGhpcy5kYXRhLmhhbmRNb2RlbFN0eWxlLCBvMiA9IHRoaXMuZGF0YS5jb2xvciwgczIgPSB0aGlzOwogICAgaWYgKHQyID0geyBoYW5kOiBpMiwgbW9kZWw6IGZhbHNlIH0sIGkyICE9PSBlKSB7CiAgICAgIHZhciBhMiA9IHphW3IyICsgaTIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBpMi5zbGljZSgxKV07CiAgICAgIHRoaXMubG9hZGVyLmxvYWQoYTIsIGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgdmFyIGkzID0gZTIuc2NlbmUuY2hpbGRyZW5bMF07CiAgICAgICAgaTMubWl4ZXIgPSBuZXcgUmUuQW5pbWF0aW9uTWl4ZXIoaTMpLCBzMi5jbGlwcyA9IGUyLmFuaW1hdGlvbnMsIG4yLnNldE9iamVjdDNEKCJtZXNoIiwgaTMpLCBpMy50cmF2ZXJzZShmdW5jdGlvbihlMykgewogICAgICAgICAgZTMuaXNNZXNoICYmIChlMy5tYXRlcmlhbC5jb2xvciA9IG5ldyBSZS5Db2xvcihvMikpOwogICAgICAgIH0pLCBuMi5zZXRBdHRyaWJ1dGUoIm1hZ2ljbGVhcC1jb250cm9scyIsIHQyKSwgbjIuc2V0QXR0cmlidXRlKCJ2aXZlLWNvbnRyb2xzIiwgdDIpLCBuMi5zZXRBdHRyaWJ1dGUoIm1ldGEtdG91Y2gtY29udHJvbHMiLCB0MiksIG4yLnNldEF0dHJpYnV0ZSgicGljby1jb250cm9scyIsIHQyKSwgbjIuc2V0QXR0cmlidXRlKCJ3aW5kb3dzLW1vdGlvbi1jb250cm9scyIsIHQyKSwgbjIuc2V0QXR0cmlidXRlKCJocC1taXhlZC1yZWFsaXR5LWNvbnRyb2xzIiwgdDIpOwogICAgICB9KTsKICAgIH0KICB9LCByZW1vdmU6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5yZW1vdmVPYmplY3QzRCgibWVzaCIpOwogIH0sIGhhbmRsZUJ1dHRvbjogZnVuY3Rpb24oZSwgdDIpIHsKICAgIHZhciBuMiwgaTIgPSB0MiA9PT0gImRvd24iLCByMiA9IHQyID09PSAidG91Y2hzdGFydCI7CiAgICBpZiAodDIuaW5kZXhPZigidG91Y2giKSA9PT0gMCkgewogICAgICBpZiAocjIgPT09IHRoaXMudG91Y2hlZEJ1dHRvbnNbZV0pCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLnRvdWNoZWRCdXR0b25zW2VdID0gcjI7CiAgICB9IGVsc2UgewogICAgICBpZiAoaTIgPT09IHRoaXMucHJlc3NlZEJ1dHRvbnNbZV0pCiAgICAgICAgcmV0dXJuOwogICAgICB0aGlzLnByZXNzZWRCdXR0b25zW2VdID0gaTI7CiAgICB9CiAgICBuMiA9IHRoaXMuZ2VzdHVyZSwgdGhpcy5nZXN0dXJlID0gdGhpcy5kZXRlcm1pbmVHZXN0dXJlKCksIHRoaXMuZ2VzdHVyZSAhPT0gbjIgJiYgKHRoaXMuYW5pbWF0ZUdlc3R1cmUodGhpcy5nZXN0dXJlLCBuMiksIHRoaXMuZW1pdEdlc3R1cmVFdmVudHModGhpcy5nZXN0dXJlLCBuMikpOwogIH0sIGRldGVybWluZUdlc3R1cmU6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyLCBuMiwgaTIgPSB0aGlzLnByZXNzZWRCdXR0b25zLmdyaXAsIHIyID0gdGhpcy5wcmVzc2VkQnV0dG9ucy5zdXJmYWNlIHx8IHRoaXMudG91Y2hlZEJ1dHRvbnMuc3VyZmFjZSwgbzIgPSB0aGlzLnByZXNzZWRCdXR0b25zLnRyYWNrcGFkIHx8IHRoaXMudG91Y2hlZEJ1dHRvbnMudHJhY2twYWQsIHMyID0gdGhpcy5wcmVzc2VkQnV0dG9ucy50cmlnZ2VyIHx8IHRoaXMudG91Y2hlZEJ1dHRvbnMudHJpZ2dlciwgYTIgPSB0aGlzLnRvdWNoZWRCdXR0b25zLkFvclggfHwgdGhpcy50b3VjaGVkQnV0dG9ucy5Cb3JZOwogICAgcmV0dXJuIHQyID0gdGhpcy5lbC5jb21wb25lbnRzWyJ0cmFja2VkLWNvbnRyb2xzIl0sIChuMiA9IHQyICYmIHQyLmNvbnRyb2xsZXIpICYmIChuMi5pZCAmJiBuMi5pZC5pbmRleE9mKCJPcGVuVlIgIikgPT09IDAgfHwgbjIucHJvZmlsZXMgJiYgbjIucHJvZmlsZXNbMF0gJiYgbjIucHJvZmlsZXNbMF0gPT09ICJodGMtdml2ZSIpID8gaTIgfHwgczIgPyBlID0gS2EgOiBvMiAmJiAoZSA9IFlhKSA6IGkyID8gZSA9IHIyIHx8IGEyIHx8IG8yID8gczIgPyBLYSA6IFlhIDogczIgPyBXYSA6ICJQb2ludCArIFRodW1iIiA6IHMyICYmIChlID0gIkhvbGQiKSwgZTsKICB9LCBnZXRDbGlwOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIsIG4yOwogICAgZm9yIChuMiA9IDA7bjIgPCB0aGlzLmNsaXBzLmxlbmd0aDsgbjIrKykKICAgICAgaWYgKCh0MiA9IHRoaXMuY2xpcHNbbjJdKS5uYW1lID09PSBlKQogICAgICAgIHJldHVybiB0MjsKICB9LCBhbmltYXRlR2VzdHVyZTogZnVuY3Rpb24oZSwgdDIpIHsKICAgIGUgPyB0aGlzLnBsYXlBbmltYXRpb24oZSB8fCAiT3BlbiIsIHQyLCBmYWxzZSkgOiB0aGlzLnBsYXlBbmltYXRpb24odDIsIHQyLCB0cnVlKTsKICB9LCBlbWl0R2VzdHVyZUV2ZW50czogZnVuY3Rpb24oZSwgdDIpIHsKICAgIHZhciBuMiwgaTIgPSB0aGlzLmVsOwogICAgdDIgIT09IGUgJiYgKChuMiA9IFhhKHQyLCBmYWxzZSkpICYmIGkyLmVtaXQobjIpLCAobjIgPSBYYShlLCB0cnVlKSkgJiYgaTIuZW1pdChuMikpOwogIH0sIHBsYXlBbmltYXRpb246IGZ1bmN0aW9uKGUsIHQyLCBuMikgewogICAgdmFyIGkyLCByMiwgbzIgPSB0aGlzLmVsLmdldE9iamVjdDNEKCJtZXNoIik7CiAgICBpZiAobzIpIHsKICAgICAgaWYgKGkyID0gdGhpcy5nZXRDbGlwKGUpLCByMiA9IG8yLm1peGVyLmNsaXBBY3Rpb24oaTIpLCBuMikKICAgICAgICByZXR1cm4gcjIucGF1c2VkID0gZmFsc2UsIHZvaWQgKHIyLnRpbWVTY2FsZSA9IC0xKTsKICAgICAgaWYgKHIyLmNsYW1wV2hlbkZpbmlzaGVkID0gdHJ1ZSwgcjIubG9vcCA9IFJlLkxvb3BPbmNlLCByMi5yZXBldGl0aW9ucyA9IDAsIHIyLnRpbWVTY2FsZSA9IDEsIHIyLnRpbWUgPSAwLCByMi53ZWlnaHQgPSAxLCAhdDIpCiAgICAgICAgcmV0dXJuIG8yLm1peGVyLnN0b3BBbGxBY3Rpb24oKSwgdm9pZCByMi5wbGF5KCk7CiAgICAgIGkyID0gdGhpcy5nZXRDbGlwKHQyKSwgcjIucmVzZXQoKSwgcjIucGxheSgpLCBvMi5taXhlci5jbGlwQWN0aW9uKGkyKS5jcm9zc0ZhZGVUbyhyMiwgMC4xNSwgdHJ1ZSk7CiAgICB9CiAgfSB9KSwgY3MoImhpZGUtb24tZW50ZXItYXIiLCB7IGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzOwogICAgdGhpcy5lbC5zY2VuZUVsLmFkZEV2ZW50TGlzdGVuZXIoImVudGVyLXZyIiwgZnVuY3Rpb24oKSB7CiAgICAgIGUuZWwuc2NlbmVFbC5pcygiYXItbW9kZSIpICYmIChlLmVsLm9iamVjdDNELnZpc2libGUgPSBmYWxzZSk7CiAgICB9KSwgdGhpcy5lbC5zY2VuZUVsLmFkZEV2ZW50TGlzdGVuZXIoImV4aXQtdnIiLCBmdW5jdGlvbigpIHsKICAgICAgZS5lbC5vYmplY3QzRC52aXNpYmxlID0gdHJ1ZTsKICAgIH0pOwogIH0gfSksIGNzKCJoaWRlLW9uLWVudGVyLXZyIiwgeyBpbml0OiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpczsKICAgIHRoaXMuZWwuc2NlbmVFbC5hZGRFdmVudExpc3RlbmVyKCJlbnRlci12ciIsIGZ1bmN0aW9uKCkgewogICAgICBlLmVsLnNjZW5lRWwuaXMoInZyLW1vZGUiKSAmJiAoZS5lbC5vYmplY3QzRC52aXNpYmxlID0gZmFsc2UpOwogICAgfSksIHRoaXMuZWwuc2NlbmVFbC5hZGRFdmVudExpc3RlbmVyKCJleGl0LXZyIiwgZnVuY3Rpb24oKSB7CiAgICAgIGUuZWwub2JqZWN0M0QudmlzaWJsZSA9IHRydWU7CiAgICB9KTsKICB9IH0pOwogICRhID0gY2kgKyAiY29udHJvbGxlcnMvaHAvbWl4ZWQtcmVhbGl0eS8iOwogIGVBID0geyB4OiAwLCB5OiAwLCB6OiAwLjA2IH07CiAgdEEgPSB7IF94OiBNYXRoLlBJIC8gNCwgX3k6IDAsIF96OiAwLCBfb3JkZXI6ICJYWVoiIH07CiAgbkEgPSAoY3MoImhwLW1peGVkLXJlYWxpdHktY29udHJvbHMiLCB7IHNjaGVtYTogeyBoYW5kOiB7IGRlZmF1bHQ6ICJub25lIiB9LCBtb2RlbDogeyBkZWZhdWx0OiB0cnVlIH0gfSwgbWFwcGluZzogeyBsZWZ0OiB7IGF4ZXM6IHsgdG91Y2hwYWQ6IFsyLCAzXSB9LCBidXR0b25zOiBbInRyaWdnZXIiLCAiZ3JpcCIsICJub25lIiwgInRodW1ic3RpY2siLCAieGJ1dHRvbiIsICJ5YnV0dG9uIl0gfSwgcmlnaHQ6IHsgYXhlczogeyB0b3VjaHBhZDogWzIsIDNdIH0sIGJ1dHRvbnM6IFsidHJpZ2dlciIsICJncmlwIiwgIm5vbmUiLCAidGh1bWJzdGljayIsICJhYnV0dG9uIiwgImJidXR0b24iXSB9IH0sIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzOwogICAgdGhpcy5jb250cm9sbGVyUHJlc2VudCA9IGZhbHNlLCB0aGlzLm9uQnV0dG9uQ2hhbmdlZCA9IHRoaXMub25CdXR0b25DaGFuZ2VkLmJpbmQodGhpcyksIHRoaXMub25CdXR0b25Eb3duID0gZnVuY3Rpb24odDIpIHsKICAgICAgTnIodDIuZGV0YWlsLmlkLCAiZG93biIsIGUsIGUuZGF0YS5oYW5kKTsKICAgIH0sIHRoaXMub25CdXR0b25VcCA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgInVwIiwgZSwgZS5kYXRhLmhhbmQpOwogICAgfSwgdGhpcy5vbkJ1dHRvblRvdWNoRW5kID0gZnVuY3Rpb24odDIpIHsKICAgICAgTnIodDIuZGV0YWlsLmlkLCAidG91Y2hlbmQiLCBlLCBlLmRhdGEuaGFuZCk7CiAgICB9LCB0aGlzLm9uQnV0dG9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgInRvdWNoc3RhcnQiLCBlLCBlLmRhdGEuaGFuZCk7CiAgICB9LCB0aGlzLnByZXZpb3VzQnV0dG9uVmFsdWVzID0ge30sIHRoaXMuYmluZE1ldGhvZHMoKTsKICB9LCB1cGRhdGU6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmRhdGE7CiAgICB0aGlzLmNvbnRyb2xsZXJJbmRleCA9IGUuaGFuZCA9PT0gInJpZ2h0IiA/IDAgOiBlLmhhbmQgPT09ICJsZWZ0IiA/IDEgOiAyOwogIH0sIHBsYXk6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQoKSwgdGhpcy5hZGRDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyKCk7CiAgfSwgcGF1c2U6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpLCB0aGlzLnJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIoKTsKICB9LCBiaW5kTWV0aG9kczogZnVuY3Rpb24oKSB7CiAgICB0aGlzLm9uTW9kZWxMb2FkZWQgPSB0aGlzLm9uTW9kZWxMb2FkZWQuYmluZCh0aGlzKSwgdGhpcy5vbkNvbnRyb2xsZXJzVXBkYXRlID0gdGhpcy5vbkNvbnRyb2xsZXJzVXBkYXRlLmJpbmQodGhpcyksIHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50ID0gdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQuYmluZCh0aGlzKSwgdGhpcy5yZW1vdmVDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyID0gdGhpcy5yZW1vdmVDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyLmJpbmQodGhpcyksIHRoaXMub25BeGlzTW92ZWQgPSB0aGlzLm9uQXhpc01vdmVkLmJpbmQodGhpcyk7CiAgfSwgYWRkRXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsOwogICAgZS5hZGRFdmVudExpc3RlbmVyKCJidXR0b25jaGFuZ2VkIiwgdGhpcy5vbkJ1dHRvbkNoYW5nZWQpLCBlLmFkZEV2ZW50TGlzdGVuZXIoImJ1dHRvbmRvd24iLCB0aGlzLm9uQnV0dG9uRG93biksIGUuYWRkRXZlbnRMaXN0ZW5lcigiYnV0dG9udXAiLCB0aGlzLm9uQnV0dG9uVXApLCBlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCB0aGlzLm9uQnV0dG9uVG91Y2hTdGFydCksIGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCB0aGlzLm9uQnV0dG9uVG91Y2hFbmQpLCBlLmFkZEV2ZW50TGlzdGVuZXIoImF4aXNtb3ZlIiwgdGhpcy5vbkF4aXNNb3ZlZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigibW9kZWwtbG9hZGVkIiwgdGhpcy5vbk1vZGVsTG9hZGVkKSwgdGhpcy5jb250cm9sbGVyRXZlbnRzQWN0aXZlID0gdHJ1ZTsKICB9LCByZW1vdmVFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWw7CiAgICBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJ1dHRvbmNoYW5nZWQiLCB0aGlzLm9uQnV0dG9uQ2hhbmdlZCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYnV0dG9uZG93biIsIHRoaXMub25CdXR0b25Eb3duKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJidXR0b251cCIsIHRoaXMub25CdXR0b25VcCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIHRoaXMub25CdXR0b25Ub3VjaFN0YXJ0KSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIHRoaXMub25CdXR0b25Ub3VjaEVuZCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYXhpc21vdmUiLCB0aGlzLm9uQXhpc01vdmVkKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb2RlbC1sb2FkZWQiLCB0aGlzLm9uTW9kZWxMb2FkZWQpLCB0aGlzLmNvbnRyb2xsZXJFdmVudHNBY3RpdmUgPSBmYWxzZTsKICB9LCBjaGVja0lmQ29udHJvbGxlclByZXNlbnQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmRhdGE7CiAgICBVcih0aGlzLCBaYSwgeyBpbmRleDogdGhpcy5jb250cm9sbGVySW5kZXgsIGhhbmQ6IGUuaGFuZCB9KTsKICB9LCBpbmplY3RUcmFja2VkQ29udHJvbHM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsLCB0MiA9IHRoaXMuZGF0YTsKICAgIGUuc2V0QXR0cmlidXRlKCJ0cmFja2VkLWNvbnRyb2xzIiwgeyBpZFByZWZpeDogWmEsIGhhbmQ6IHQyLmhhbmQsIGNvbnRyb2xsZXI6IHRoaXMuY29udHJvbGxlckluZGV4IH0pLCB0aGlzLmRhdGEubW9kZWwgJiYgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoImdsdGYtbW9kZWwiLCAkYSArIHRoaXMuZGF0YS5oYW5kICsgIi5nbGIiKTsKICB9LCBhZGRDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuc2NlbmVFbC5hZGRFdmVudExpc3RlbmVyKCJjb250cm9sbGVyc3VwZGF0ZWQiLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUsIGZhbHNlKTsKICB9LCByZW1vdmVDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuc2NlbmVFbC5yZW1vdmVFdmVudExpc3RlbmVyKCJjb250cm9sbGVyc3VwZGF0ZWQiLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUsIGZhbHNlKTsKICB9LCBvbkNvbnRyb2xsZXJzVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50KCk7CiAgfSwgb25CdXR0b25DaGFuZ2VkOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIsIG4yID0gdGhpcy5tYXBwaW5nW3RoaXMuZGF0YS5oYW5kXS5idXR0b25zW2UuZGV0YWlsLmlkXTsKICAgIG4yICYmIChuMiA9PT0gInRyaWdnZXIiICYmICh0MiA9IGUuZGV0YWlsLnN0YXRlLnZhbHVlLCBjb25zb2xlLmxvZygiYW5hbG9nIHZhbHVlIG9mIHRyaWdnZXIgcHJlc3M6ICIgKyB0MikpLCB0aGlzLmVsLmVtaXQobjIgKyAiY2hhbmdlZCIsIGUuZGV0YWlsLnN0YXRlKSk7CiAgfSwgb25Nb2RlbExvYWRlZDogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyID0gZS5kZXRhaWwubW9kZWw7CiAgICB0aGlzLmRhdGEubW9kZWwgJiYgKHQyLnBvc2l0aW9uLmNvcHkoZUEpLCB0Mi5yb3RhdGlvbi5jb3B5KHRBKSwgdGhpcy5lbC5lbWl0KCJjb250cm9sbGVybW9kZWxyZWFkeSIsIHsgbmFtZTogImhwLW1peGVkLXJlYWxpdHktY29udHJvbHMiLCBtb2RlbDogdGhpcy5kYXRhLm1vZGVsLCByYXlPcmlnaW46IG5ldyBSZS5WZWN0b3IzKDAsIDAsIDApIH0pKTsKICB9LCBvbkF4aXNNb3ZlZDogZnVuY3Rpb24oZSkgewogICAgR3IodGhpcywgdGhpcy5tYXBwaW5nLmF4ZXMsIGUpOwogIH0gfSksIGZpKCJjb21wb25lbnRzOmxheWVyOndhcm4iKSk7CiAgY3MoImxheWVyIiwgeyBzY2hlbWE6IHsgdHlwZTogeyBkZWZhdWx0OiAicXVhZCIsIG9uZU9mOiBbInF1YWQiLCAibW9ub2N1YmVtYXAiLCAic3RlcmVvY3ViZW1hcCJdIH0sIHNyYzogeyB0eXBlOiAibWFwIiB9LCByb3RhdGVDdWJlbWFwOiB7IGRlZmF1bHQ6IGZhbHNlIH0sIHdpZHRoOiB7IGRlZmF1bHQ6IDAgfSwgaGVpZ2h0OiB7IGRlZmF1bHQ6IDAgfSB9LCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbC5zY2VuZUVsLnJlbmRlcmVyLmdldENvbnRleHQoKTsKICAgIHRoaXMucXVhdGVybmlvbiA9IG5ldyBSZS5RdWF0ZXJuaW9uLCB0aGlzLnBvc2l0aW9uID0gbmV3IFJlLlZlY3RvcjMsIHRoaXMuYmluZE1ldGhvZHMoKSwgdGhpcy5uZWVkc1JlZHJhdyA9IGZhbHNlLCB0aGlzLmZyYW1lQnVmZmVyID0gZS5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgdmFyIHQyID0gdGhpcy5lbC5zY2VuZUVsLmdldEF0dHJpYnV0ZSgid2VieHIiKSwgbjIgPSB0Mi5yZXF1aXJlZEZlYXR1cmVzOwogICAgbjIuaW5kZXhPZigibGF5ZXJzIikgPT09IC0xICYmIChuMi5wdXNoKCJsYXllcnMiKSwgdGhpcy5lbC5zY2VuZUVsLnNldEF0dHJpYnV0ZSgid2VieHIiLCB0MikpLCB0aGlzLmVsLnNjZW5lRWwuYWRkRXZlbnRMaXN0ZW5lcigiZW50ZXItdnIiLCB0aGlzLm9uRW50ZXJWUiksIHRoaXMuZWwuc2NlbmVFbC5hZGRFdmVudExpc3RlbmVyKCJleGl0LXZyIiwgdGhpcy5vbkV4aXRWUik7CiAgfSwgYmluZE1ldGhvZHM6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5vblJlcXVlc3RlZFJlZmVyZW5jZVNwYWNlID0gdGhpcy5vblJlcXVlc3RlZFJlZmVyZW5jZVNwYWNlLmJpbmQodGhpcyksIHRoaXMub25FbnRlclZSID0gdGhpcy5vbkVudGVyVlIuYmluZCh0aGlzKSwgdGhpcy5vbkV4aXRWUiA9IHRoaXMub25FeGl0VlIuYmluZCh0aGlzKTsKICB9LCB1cGRhdGU6IGZ1bmN0aW9uKGUpIHsKICAgIHRoaXMuZGF0YS5zcmMgIT09IGUuc3JjICYmIHRoaXMudXBkYXRlU3JjKCk7CiAgfSwgdXBkYXRlU3JjOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5kYXRhLnR5cGU7CiAgICB0aGlzLnRleHR1cmUgPSB1bmRlZmluZWQsIGUgIT09ICJxdWFkIiA/IGUgIT09ICJtb25vY3ViZW1hcCIgJiYgZSAhPT0gInN0ZXJlb2N1YmVtYXAiIHx8IHRoaXMubG9hZEN1YmVNYXBJbWFnZXMoKSA6IHRoaXMubG9hZFF1YWRJbWFnZSgpOwogIH0sIGxvYWRDdWJlTWFwSW1hZ2VzOiBmdW5jdGlvbigpIHsKICAgIHZhciBlLCB0MiA9IHRoaXMueHJHTEZhY3RvcnksIG4yID0gdGhpcy5lbC5zY2VuZUVsLmZyYW1lLCBpMiA9IHRoaXMuZGF0YS5zcmMsIHIyID0gdGhpcy5kYXRhLnR5cGU7CiAgICB0aGlzLnZpc2liaWxpdHlDaGFuZ2VkID0gZmFsc2UsIHRoaXMubGF5ZXIgJiYgKHIyICE9PSAibW9ub2N1YmVtYXAiICYmIHIyICE9PSAic3RlcmVvY3ViZW1hcCIgfHwgKGkyLmNvbXBsZXRlID8gdGhpcy5wZW5kaW5nQ3ViZU1hcFVwZGF0ZSA9IGZhbHNlIDogdGhpcy5wZW5kaW5nQ3ViZU1hcFVwZGF0ZSA9IHRydWUsIHRoaXMubG9hZGluZ1NjcmVlbiA/IHRoaXMubG9hZGluZ1NjcmVlbiA9IGZhbHNlIDogdGhpcy5sb2FkaW5nU2NyZWVuID0gdHJ1ZSwgcjIgPT09ICJtb25vY3ViZW1hcCIgPyAoZSA9IHQyLmdldFN1YkltYWdlKHRoaXMubGF5ZXIsIG4yKSwgdGhpcy5sb2FkQ3ViZU1hcEltYWdlKGUuY29sb3JUZXh0dXJlLCBpMiwgMCkpIDogKGUgPSB0Mi5nZXRTdWJJbWFnZSh0aGlzLmxheWVyLCBuMiwgImxlZnQiKSwgdGhpcy5sb2FkQ3ViZU1hcEltYWdlKGUuY29sb3JUZXh0dXJlLCBpMiwgMCksIGUgPSB0Mi5nZXRTdWJJbWFnZSh0aGlzLmxheWVyLCBuMiwgInJpZ2h0IiksIHRoaXMubG9hZEN1YmVNYXBJbWFnZShlLmNvbG9yVGV4dHVyZSwgaTIsIDYpKSkpOwogIH0sIGxvYWRRdWFkSW1hZ2U6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmRhdGEuc3JjLCB0MiA9IHRoaXM7CiAgICB0aGlzLmVsLnNjZW5lRWwuc3lzdGVtcy5tYXRlcmlhbC5sb2FkVGV4dHVyZShlLCB7IHNyYzogZSB9LCBmdW5jdGlvbihuMikgewogICAgICB0Mi5lbC5zY2VuZUVsLnJlbmRlcmVyLmluaXRUZXh0dXJlKG4yKSwgdDIudGV4dHVyZSA9IG4yLCBlLnRhZ05hbWUgPT09ICJWSURFTyIgJiYgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICB0Mi50ZXh0dXJlSXNWaWRlbyA9IHRydWU7CiAgICAgIH0sIDEwMDApLCB0Mi5sYXllciAmJiAodDIubGF5ZXIuaGVpZ2h0ID0gdDIuZGF0YS5oZWlnaHQgLyAyIHx8IHQyLnRleHR1cmUuaW1hZ2UuaGVpZ2h0IC8gMTAwMCwgdDIubGF5ZXIud2lkdGggPSB0Mi5kYXRhLndpZHRoIC8gMiB8fCB0Mi50ZXh0dXJlLmltYWdlLndpZHRoIC8gMTAwMCwgdDIubmVlZHNSZWRyYXcgPSB0cnVlKSwgdDIudXBkYXRlUXVhZFBhbmVsKCk7CiAgICB9KTsKICB9LCBwcmVHZW5lcmF0ZUN1YmVNYXBUZXh0dXJlczogZnVuY3Rpb24oZSwgdDIpIHsKICAgIHRoaXMuZGF0YS50eXBlID09PSAibW9ub2N1YmVtYXAiID8gdGhpcy5nZW5lcmF0ZUN1YmVNYXBUZXh0dXJlcyhlLCAwLCB0MikgOiAodGhpcy5nZW5lcmF0ZUN1YmVNYXBUZXh0dXJlcyhlLCAwLCB0MiksIHRoaXMuZ2VuZXJhdGVDdWJlTWFwVGV4dHVyZXMoZSwgNiwgdDIpKTsKICB9LCBnZW5lcmF0ZUN1YmVNYXBUZXh0dXJlczogZnVuY3Rpb24oZSwgdDIsIG4yKSB7CiAgICBmb3IgKHZhciBpMiwgcjIsIG8yID0gdGhpcy5kYXRhLCBzMiA9IHRoaXMuY3ViZUZhY2VTaXplLCBhMiA9IE1hdGgubWluKGUud2lkdGgsIGUuaGVpZ2h0KSwgQTIgPSBbXSwgbDIgPSAwO2wyIDwgNjsgbDIrKykgewogICAgICB2YXIgYzIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJDQU5WQVMiKTsKICAgICAgYzIud2lkdGggPSBjMi5oZWlnaHQgPSBzMjsKICAgICAgdmFyIGgyID0gYzIuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgbzIucm90YXRlQ3ViZW1hcCAmJiAobDIgIT09IDIgJiYgbDIgIT09IDMgfHwgKGgyLnNhdmUoKSwgaDIudHJhbnNsYXRlKHMyLCBzMiksIGgyLnJvdGF0ZShNYXRoLlBJKSkpLCBoMi5kcmF3SW1hZ2UoZSwgKGwyICsgdDIpICogYTIsIDAsIGEyLCBhMiwgMCwgMCwgczIsIHMyKSwgaDIucmVzdG9yZSgpLCBuMiAmJiBuMigpLCBBMi5wdXNoKGMyKTsKICAgIH0KICAgIHJldHVybiBvMi5yb3RhdGVDdWJlbWFwICYmIChpMiA9IEEyWzBdLCByMiA9IEEyWzFdLCBBMlswXSA9IHIyLCBBMlsxXSA9IGkyLCBpMiA9IEEyWzRdLCByMiA9IEEyWzVdLCBBMls0XSA9IHIyLCBBMls1XSA9IGkyKSwgbjIgJiYgbjIoKSwgQTI7CiAgfSwgbG9hZEN1YmVNYXBJbWFnZTogZnVuY3Rpb24oZSwgdDIsIG4yKSB7CiAgICB2YXIgaTIsIHIyID0gdGhpcy5lbC5zY2VuZUVsLnJlbmRlcmVyLmdldENvbnRleHQoKTsKICAgIHIyLnBpeGVsU3RvcmVpKHIyLlVOUEFDS19GTElQX1lfV0VCR0wsIGZhbHNlKSwgcjIuYmluZFRleHR1cmUocjIuVEVYVFVSRV9DVUJFX01BUCwgZSksIGkyID0gIXQyLmNvbXBsZXRlIHx8IHRoaXMubG9hZGluZ1NjcmVlbiA/IHRoaXMubG9hZGluZ1NjcmVlbkltYWdlcyA6IHRoaXMuZ2VuZXJhdGVDdWJlTWFwVGV4dHVyZXModDIsIG4yKTsKICAgIHZhciBvMiA9IDA7CiAgICBpMi5mb3JFYWNoKGZ1bmN0aW9uKGUyLCB0MykgewogICAgICByMi50ZXhTdWJJbWFnZTJEKHIyLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIHQzLCAwLCAwLCAwLCByMi5SR0JBLCByMi5VTlNJR05FRF9CWVRFLCBlMiksIG8yID0gcjIuZ2V0RXJyb3IoKTsKICAgIH0pLCBvMiAhPT0gMCAmJiBjb25zb2xlLmxvZygicmVuZGVyaW5nRXJyb3IsIFdlYkdMIEVycm9yIENvZGU6ICIgKyBvMiksIHIyLmJpbmRUZXh0dXJlKHIyLlRFWFRVUkVfQ1VCRV9NQVAsIG51bGwpOwogIH0sIHRpY2s6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5zY2VuZUVsLnhyU2Vzc2lvbiAmJiB0aGlzLnJlZmVyZW5jZVNwYWNlICYmICh0aGlzLmxheWVyIHx8ICF0aGlzLmVsLnNjZW5lRWwuaXMoInZyLW1vZGUiKSAmJiAhdGhpcy5lbC5zY2VuZUVsLmlzKCJhci1tb2RlIikgfHwgdGhpcy5pbml0TGF5ZXIoKSwgdGhpcy51cGRhdGVUcmFuc2Zvcm0oKSwgdGhpcy5kYXRhLnNyYy5jb21wbGV0ZSAmJiAodGhpcy5wZW5kaW5nQ3ViZU1hcFVwZGF0ZSB8fCB0aGlzLmxvYWRpbmdTY3JlZW4gfHwgdGhpcy52aXNpYmlsaXR5Q2hhbmdlZCkgJiYgdGhpcy5sb2FkQ3ViZU1hcEltYWdlcygpLCAodGhpcy5uZWVkc1JlZHJhdyB8fCB0aGlzLmxheWVyLm5lZWRzUmVkcmF3IHx8IHRoaXMudGV4dHVyZUlzVmlkZW8pICYmICh0aGlzLmRhdGEudHlwZSA9PT0gInF1YWQiICYmIHRoaXMuZHJhdygpLCB0aGlzLm5lZWRzUmVkcmF3ID0gZmFsc2UpKTsKICB9LCBpbml0TGF5ZXI6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLCB0MiA9IHRoaXMuZGF0YS50eXBlOwogICAgdGhpcy5lbC5zY2VuZUVsLnhyU2Vzc2lvbi5vbnZpc2liaWxpdHljaGFuZ2UgPSBmdW5jdGlvbih0MykgewogICAgICBlLnZpc2liaWxpdHlDaGFuZ2VkID0gdDMuc2Vzc2lvbi52aXNpYmlsaXR5U3RhdGUgIT09ICJoaWRkZW4iOwogICAgfSwgdDIgIT09ICJxdWFkIiA/IHQyICE9PSAibW9ub2N1YmVtYXAiICYmIHQyICE9PSAic3RlcmVvY3ViZW1hcCIgfHwgdGhpcy5pbml0Q3ViZU1hcExheWVyKCkgOiB0aGlzLmluaXRRdWFkTGF5ZXIoKTsKICB9LCBpbml0UXVhZExheWVyOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbC5zY2VuZUVsLCB0MiA9IGUucmVuZGVyZXIuZ2V0Q29udGV4dCgpLCBuMiA9IHRoaXMueHJHTEZhY3RvcnkgPSBuZXcgWFJXZWJHTEJpbmRpbmcoZS54clNlc3Npb24sIHQyKTsKICAgIHRoaXMudGV4dHVyZSAmJiAodGhpcy5sYXllciA9IG4yLmNyZWF0ZVF1YWRMYXllcih7IHNwYWNlOiB0aGlzLnJlZmVyZW5jZVNwYWNlLCB2aWV3UGl4ZWxIZWlnaHQ6IDIwNDgsIHZpZXdQaXhlbFdpZHRoOiAyMDQ4LCBoZWlnaHQ6IHRoaXMuZGF0YS5oZWlnaHQgLyAyIHx8IHRoaXMudGV4dHVyZS5pbWFnZS5oZWlnaHQgLyAxMDAwLCB3aWR0aDogdGhpcy5kYXRhLndpZHRoIC8gMiB8fCB0aGlzLnRleHR1cmUuaW1hZ2Uud2lkdGggLyAxMDAwIH0pLCB0aGlzLmluaXRMb2FkaW5nU2NyZWVuSW1hZ2VzKCksIGUucmVuZGVyZXIueHIuYWRkTGF5ZXIodGhpcy5sYXllcikpOwogIH0sIGluaXRDdWJlTWFwTGF5ZXI6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmRhdGEuc3JjLCB0MiA9IHRoaXMuZWwuc2NlbmVFbCwgbjIgPSB0Mi5yZW5kZXJlci5nZXRDb250ZXh0KCksIGkyID0gbjIuZ2V0UGFyYW1ldGVyKG4yLk1BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUpLCByMiA9IHRoaXMuY3ViZUZhY2VTaXplID0gTWF0aC5taW4oaTIsIE1hdGgubWluKGUud2lkdGgsIGUuaGVpZ2h0KSksIG8yID0gdGhpcy54ckdMRmFjdG9yeSA9IG5ldyBYUldlYkdMQmluZGluZyh0Mi54clNlc3Npb24sIG4yKTsKICAgIHRoaXMubGF5ZXIgPSBvMi5jcmVhdGVDdWJlTGF5ZXIoeyBzcGFjZTogdGhpcy5yZWZlcmVuY2VTcGFjZSwgdmlld1BpeGVsV2lkdGg6IHIyLCB2aWV3UGl4ZWxIZWlnaHQ6IHIyLCBsYXlvdXQ6IHRoaXMuZGF0YS50eXBlID09PSAibW9ub2N1YmVtYXAiID8gIm1vbm8iIDogInN0ZXJlbyIsIGlzU3RhdGljOiBmYWxzZSB9KSwgdGhpcy5pbml0TG9hZGluZ1NjcmVlbkltYWdlcygpLCB0aGlzLmxvYWRDdWJlTWFwSW1hZ2VzKCksIHQyLnJlbmRlcmVyLnhyLmFkZExheWVyKHRoaXMubGF5ZXIpOwogIH0sIGluaXRMb2FkaW5nU2NyZWVuSW1hZ2VzOiBmdW5jdGlvbigpIHsKICAgIGZvciAodmFyIGUgPSB0aGlzLmN1YmVGYWNlU2l6ZSwgdDIgPSB0aGlzLmxvYWRpbmdTY3JlZW5JbWFnZXMgPSBbXSwgbjIgPSAwO24yIDwgNjsgbjIrKykgewogICAgICB2YXIgaTIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJDQU5WQVMiKTsKICAgICAgaTIud2lkdGggPSBpMi5oZWlnaHQgPSBlOwogICAgICB2YXIgcjIgPSBpMi5nZXRDb250ZXh0KCIyZCIpOwogICAgICBpMi53aWR0aCA9IGkyLmhlaWdodCA9IGUsIHIyLmZpbGxTdHlsZSA9ICJibGFjayIsIHIyLmZpbGxSZWN0KDAsIDAsIGUsIGUpLCBuMiAhPT0gMiAmJiBuMiAhPT0gMyAmJiAocjIudHJhbnNsYXRlKGUsIDApLCByMi5zY2FsZSgtMSwgMSksIHIyLmZpbGxTdHlsZSA9ICJ3aGl0ZSIsIHIyLmZvbnQgPSAiMzBweCBBcmlhbCIsIHIyLmZpbGxUZXh0KCJMb2FkaW5nIiwgZSAvIDIsIGUgLyAyKSksIHQyLnB1c2goaTIpOwogICAgfQogIH0sIGRlc3Ryb3lMYXllcjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmxheWVyICYmICh0aGlzLmVsLnNjZW5lRWwucmVuZGVyZXIueHIucmVtb3ZlTGF5ZXIodGhpcy5sYXllciksIHRoaXMubGF5ZXIuZGVzdHJveSgpLCB0aGlzLmxheWVyID0gdW5kZWZpbmVkKTsKICB9LCB0b2dnbGVDb21wb3NpdG9yTGF5ZXI6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbmFibGVDb21wb3NpdG9yTGF5ZXIoIXRoaXMubGF5ZXJFbmFibGVkKTsKICB9LCBlbmFibGVDb21wb3NpdG9yTGF5ZXI6IGZ1bmN0aW9uKGUpIHsKICAgIHRoaXMubGF5ZXJFbmFibGVkID0gZSwgdGhpcy5xdWFkUGFuZWxFbC5vYmplY3QzRC52aXNpYmxlID0gIXRoaXMubGF5ZXJFbmFibGVkOwogIH0sIHVwZGF0ZVF1YWRQYW5lbDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMucXVhZFBhbmVsRWw7CiAgICB0aGlzLnF1YWRQYW5lbEVsIHx8IChlID0gdGhpcy5xdWFkUGFuZWxFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEtZW50aXR5IiksIHRoaXMuZWwuYXBwZW5kQ2hpbGQoZSkpLCBlLnNldEF0dHJpYnV0ZSgibWF0ZXJpYWwiLCB7IHNoYWRlcjogImZsYXQiLCBzcmM6IHRoaXMuZGF0YS5zcmMsIHRyYW5zcGFyZW50OiB0cnVlIH0pLCBlLnNldEF0dHJpYnV0ZSgiZ2VvbWV0cnkiLCB7IHByaW1pdGl2ZTogInBsYW5lIiwgaGVpZ2h0OiB0aGlzLmRhdGEuaGVpZ2h0IHx8IHRoaXMudGV4dHVyZS5pbWFnZS5oZWlnaHQgLyAxMDAwLCB3aWR0aDogdGhpcy5kYXRhLndpZHRoIHx8IHRoaXMudGV4dHVyZS5pbWFnZS5oZWlnaHQgLyAxMDAwIH0pOwogIH0sIGRyYXc6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsLnNjZW5lRWwsIHQyID0gdGhpcy5lbC5zY2VuZUVsLnJlbmRlcmVyLmdldENvbnRleHQoKSwgbjIgPSB0aGlzLnhyR0xGYWN0b3J5LmdldFN1YkltYWdlKHRoaXMubGF5ZXIsIGUuZnJhbWUpLCBpMiA9IGUucmVuZGVyZXIucHJvcGVydGllcy5nZXQodGhpcy50ZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSwgcjIgPSB0Mi5nZXRQYXJhbWV0ZXIodDIuRlJBTUVCVUZGRVJfQklORElORyk7CiAgICB0Mi52aWV3cG9ydChuMi52aWV3cG9ydC54LCBuMi52aWV3cG9ydC55LCBuMi52aWV3cG9ydC53aWR0aCwgbjIudmlld3BvcnQuaGVpZ2h0KSwgdDIuYmluZEZyYW1lYnVmZmVyKHQyLkZSQU1FQlVGRkVSLCB0aGlzLmZyYW1lQnVmZmVyKSwgdDIuZnJhbWVidWZmZXJUZXh0dXJlMkQodDIuRlJBTUVCVUZGRVIsIHQyLkNPTE9SX0FUVEFDSE1FTlQwLCB0Mi5URVhUVVJFXzJELCBuMi5jb2xvclRleHR1cmUsIDApLCBmdW5jdGlvbihlMiwgdDMsIG4zLCBpMykgewogICAgICB2YXIgcjMgPSBlMi5jcmVhdGVGcmFtZWJ1ZmZlcigpLCBvMiA9IG4zLnZpZXdwb3J0LngsIHMyID0gbjMudmlld3BvcnQueSwgYTIgPSBuMy52aWV3cG9ydC54ICsgbjMudmlld3BvcnQud2lkdGgsIEEyID0gbjMudmlld3BvcnQueSArIG4zLnZpZXdwb3J0LmhlaWdodDsKICAgICAgaTMudGFnTmFtZSA9PT0gIlZJREVPIiAmJiAoZTIuYmluZFRleHR1cmUoZTIuVEVYVFVSRV8yRCwgdDMpLCBlMi50ZXhTdWJJbWFnZTJEKGUyLlRFWFRVUkVfMkQsIDAsIDAsIDAsIGkzLndpZHRoLCBpMy5oZWlnaHQsIGUyLlJHQiwgZTIuVU5TSUdORURfQllURSwgaTMpKSwgZTIuYmluZEZyYW1lYnVmZmVyKGUyLlJFQURfRlJBTUVCVUZGRVIsIHIzKSwgZTIuZnJhbWVidWZmZXJUZXh0dXJlMkQoZTIuUkVBRF9GUkFNRUJVRkZFUiwgZTIuQ09MT1JfQVRUQUNITUVOVDAsIGUyLlRFWFRVUkVfMkQsIHQzLCAwKSwgZTIucmVhZEJ1ZmZlcihlMi5DT0xPUl9BVFRBQ0hNRU5UMCksIGUyLmJsaXRGcmFtZWJ1ZmZlcigwLCAwLCBpMy53aWR0aCwgaTMuaGVpZ2h0LCBvMiwgczIsIGEyLCBBMiwgZTIuQ09MT1JfQlVGRkVSX0JJVCwgZTIuTkVBUkVTVCksIGUyLmJpbmRGcmFtZWJ1ZmZlcihlMi5SRUFEX0ZSQU1FQlVGRkVSLCBudWxsKSwgZTIuZGVsZXRlRnJhbWVidWZmZXIocjMpOwogICAgfSh0MiwgaTIsIG4yLCB0aGlzLmRhdGEuc3JjKSwgdDIuYmluZEZyYW1lYnVmZmVyKHQyLkZSQU1FQlVGRkVSLCByMik7CiAgfSwgdXBkYXRlVHJhbnNmb3JtOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbCwgdDIgPSB0aGlzLnBvc2l0aW9uLCBuMiA9IHRoaXMucXVhdGVybmlvbjsKICAgIGUub2JqZWN0M0QudXBkYXRlTWF0cml4V29ybGQoKSwgdDIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUub2JqZWN0M0QubWF0cml4V29ybGQpLCBuMi5zZXRGcm9tUm90YXRpb25NYXRyaXgoZS5vYmplY3QzRC5tYXRyaXhXb3JsZCksIHRoaXMubGF5ZXJFbmFibGVkIHx8IHQyLnNldCgwLCAwLCAxZTgpLCB0aGlzLmxheWVyLnRyYW5zZm9ybSA9IG5ldyBYUlJpZ2lkVHJhbnNmb3JtKHQyLCBuMik7CiAgfSwgb25FbnRlclZSOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbC5zY2VuZUVsLCB0MiA9IGUueHJTZXNzaW9uOwogICAgZS5oYXNXZWJYUiAmJiBYUldlYkdMQmluZGluZyAmJiB0MiA/ICh0Mi5yZXF1ZXN0UmVmZXJlbmNlU3BhY2UoImxvY2FsLWZsb29yIikudGhlbih0aGlzLm9uUmVxdWVzdGVkUmVmZXJlbmNlU3BhY2UpLCB0aGlzLmxheWVyRW5hYmxlZCA9IHRydWUsIHRoaXMucXVhZFBhbmVsRWwgJiYgKHRoaXMucXVhZFBhbmVsRWwub2JqZWN0M0QudmlzaWJsZSA9IGZhbHNlKSwgdGhpcy5kYXRhLnNyYy5wbGF5ICYmIHRoaXMuZGF0YS5zcmMucGxheSgpKSA6IG5BKCJUaGUgbGF5ZXIgY29tcG9uZW50IHJlcXVpcmVzIFdlYlhSIGFuZCB0aGUgbGF5ZXJzIEFQSSBlbmFibGVkIik7CiAgfSwgb25FeGl0VlI6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5xdWFkUGFuZWxFbCAmJiAodGhpcy5xdWFkUGFuZWxFbC5vYmplY3QzRC52aXNpYmxlID0gdHJ1ZSksIHRoaXMuZGVzdHJveUxheWVyKCk7CiAgfSwgb25SZXF1ZXN0ZWRSZWZlcmVuY2VTcGFjZTogZnVuY3Rpb24oZSkgewogICAgdGhpcy5yZWZlcmVuY2VTcGFjZSA9IGU7CiAgfSB9KSwgY3MoImxhc2VyLWNvbnRyb2xzIiwgeyBzY2hlbWE6IHsgaGFuZDogeyBkZWZhdWx0OiAicmlnaHQiIH0sIG1vZGVsOiB7IGRlZmF1bHQ6IHRydWUgfSwgZGVmYXVsdE1vZGVsQ29sb3I6IHsgdHlwZTogImNvbG9yIiwgZGVmYXVsdDogImdyZXkiIH0gfSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuY29uZmlnLCB0MiA9IHRoaXMuZGF0YSwgbjIgPSB0aGlzLmVsLCBpMiA9IHRoaXMsIHIyID0geyBoYW5kOiB0Mi5oYW5kLCBtb2RlbDogdDIubW9kZWwgfTsKICAgIGZ1bmN0aW9uIG8yKHQzKSB7CiAgICAgIHZhciByMyA9IGVbdDMuZGV0YWlsLm5hbWVdOwogICAgICBpZiAocjMpIHsKICAgICAgICB2YXIgbzMgPSBKcih7IHNob3dMaW5lOiB0cnVlIH0sIHIzLnJheWNhc3RlciB8fCB7fSk7CiAgICAgICAgdDMuZGV0YWlsLnJheU9yaWdpbiAmJiAobzMub3JpZ2luID0gdDMuZGV0YWlsLnJheU9yaWdpbi5vcmlnaW4sIG8zLmRpcmVjdGlvbiA9IHQzLmRldGFpbC5yYXlPcmlnaW4uZGlyZWN0aW9uLCBvMy5zaG93TGluZSA9IHRydWUpLCB0My5kZXRhaWwucmF5T3JpZ2luIHx8ICFpMi5tb2RlbFJlYWR5ID8gbjIuc2V0QXR0cmlidXRlKCJyYXljYXN0ZXIiLCBvMykgOiBuMi5zZXRBdHRyaWJ1dGUoInJheWNhc3RlciIsICJzaG93TGluZSIsIHRydWUpLCBuMi5zZXRBdHRyaWJ1dGUoImN1cnNvciIsIEpyKHsgZnVzZTogZmFsc2UgfSwgcjMuY3Vyc29yKSk7CiAgICAgIH0KICAgIH0KICAgIG4yLnNldEF0dHJpYnV0ZSgiaHAtbWl4ZWQtcmVhbGl0eS1jb250cm9scyIsIHIyKSwgbjIuc2V0QXR0cmlidXRlKCJtYWdpY2xlYXAtY29udHJvbHMiLCByMiksIG4yLnNldEF0dHJpYnV0ZSgib2N1bHVzLWdvLWNvbnRyb2xzIiwgcjIpLCBuMi5zZXRBdHRyaWJ1dGUoIm1ldGEtdG91Y2gtY29udHJvbHMiLCByMiksIG4yLnNldEF0dHJpYnV0ZSgicGljby1jb250cm9scyIsIHIyKSwgbjIuc2V0QXR0cmlidXRlKCJ2YWx2ZS1pbmRleC1jb250cm9scyIsIHIyKSwgbjIuc2V0QXR0cmlidXRlKCJ2aXZlLWNvbnRyb2xzIiwgcjIpLCBuMi5zZXRBdHRyaWJ1dGUoInZpdmUtZm9jdXMtY29udHJvbHMiLCByMiksIG4yLnNldEF0dHJpYnV0ZSgid2luZG93cy1tb3Rpb24tY29udHJvbHMiLCByMiksIG4yLnNldEF0dHJpYnV0ZSgiZ2VuZXJpYy10cmFja2VkLWNvbnRyb2xsZXItY29udHJvbHMiLCB7IGhhbmQ6IHIyLmhhbmQgfSksIG4yLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJjb25uZWN0ZWQiLCBvMiksIG4yLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJkaXNjb25uZWN0ZWQiLCBmdW5jdGlvbih0MykgewogICAgICBlW3QzLmRldGFpbC5uYW1lXSAmJiBuMi5zZXRBdHRyaWJ1dGUoInJheWNhc3RlciIsICJzaG93TGluZSIsIGZhbHNlKTsKICAgIH0pLCBuMi5hZGRFdmVudExpc3RlbmVyKCJjb250cm9sbGVybW9kZWxyZWFkeSIsIGZ1bmN0aW9uKGUyKSB7CiAgICAgIG8yKGUyKSwgaTIubW9kZWxSZWFkeSA9IHRydWU7CiAgICB9KTsKICB9LCBjb25maWc6IHsgImdlbmVyaWMtdHJhY2tlZC1jb250cm9sbGVyLWNvbnRyb2xzIjogeyBjdXJzb3I6IHsgZG93bkV2ZW50czogWyJ0cmlnZ2VyZG93biJdLCB1cEV2ZW50czogWyJ0cmlnZ2VydXAiXSB9IH0sICJocC1taXhlZC1yZWFsaXR5LWNvbnRyb2xzIjogeyBjdXJzb3I6IHsgZG93bkV2ZW50czogWyJ0cmlnZ2VyZG93biJdLCB1cEV2ZW50czogWyJ0cmlnZ2VydXAiXSB9LCByYXljYXN0ZXI6IHsgb3JpZ2luOiB7IHg6IDAsIHk6IDAsIHo6IDAgfSB9IH0sICJtYWdpY2xlYXAtY29udHJvbHMiOiB7IGN1cnNvcjogeyBkb3duRXZlbnRzOiBbInRyYWNrcGFkZG93biIsICJ0cmlnZ2VyZG93biJdLCB1cEV2ZW50czogWyJ0cmFja3BhZHVwIiwgInRyaWdnZXJ1cCJdIH0gfSwgIm9jdWx1cy1nby1jb250cm9scyI6IHsgY3Vyc29yOiB7IGRvd25FdmVudHM6IFsidHJpZ2dlcmRvd24iXSwgdXBFdmVudHM6IFsidHJpZ2dlcnVwIl0gfSwgcmF5Y2FzdGVyOiB7IG9yaWdpbjogeyB4OiAwLCB5OiAwLjAwMDUsIHo6IDAgfSB9IH0sICJtZXRhLXRvdWNoLWNvbnRyb2xzIjogeyBjdXJzb3I6IHsgZG93bkV2ZW50czogWyJ0cmlnZ2VyZG93biJdLCB1cEV2ZW50czogWyJ0cmlnZ2VydXAiXSB9LCByYXljYXN0ZXI6IHsgb3JpZ2luOiB7IHg6IDAsIHk6IDAsIHo6IDAgfSB9IH0sICJwaWNvLWNvbnRyb2xzIjogeyBjdXJzb3I6IHsgZG93bkV2ZW50czogWyJ0cmlnZ2VyZG93biJdLCB1cEV2ZW50czogWyJ0cmlnZ2VydXAiXSB9IH0sICJ2YWx2ZS1pbmRleC1jb250cm9scyI6IHsgY3Vyc29yOiB7IGRvd25FdmVudHM6IFsidHJpZ2dlcmRvd24iXSwgdXBFdmVudHM6IFsidHJpZ2dlcnVwIl0gfSB9LCAidml2ZS1jb250cm9scyI6IHsgY3Vyc29yOiB7IGRvd25FdmVudHM6IFsidHJpZ2dlcmRvd24iXSwgdXBFdmVudHM6IFsidHJpZ2dlcnVwIl0gfSB9LCAidml2ZS1mb2N1cy1jb250cm9scyI6IHsgY3Vyc29yOiB7IGRvd25FdmVudHM6IFsidHJhY2twYWRkb3duIiwgInRyaWdnZXJkb3duIl0sIHVwRXZlbnRzOiBbInRyYWNrcGFkdXAiLCAidHJpZ2dlcnVwIl0gfSB9LCAid2luZG93cy1tb3Rpb24tY29udHJvbHMiOiB7IGN1cnNvcjogeyBkb3duRXZlbnRzOiBbInRyaWdnZXJkb3duIl0sIHVwRXZlbnRzOiBbInRyaWdnZXJ1cCJdIH0sIHJheWNhc3RlcjogeyBzaG93TGluZTogZmFsc2UgfSB9IH0gfSk7CiAgZ0EgPSBSZS5NYXRoVXRpbHMuZGVnVG9SYWQ7CiAgcEEgPSBmaSgiY29tcG9uZW50czpsaWdodDp3YXJuIik7CiAgZkEgPSBuZXcgUmUuQ3ViZVRleHR1cmVMb2FkZXI7CiAgbUEgPSB7fTsKICBjcygibGlnaHQiLCB7IHNjaGVtYTogeyBhbmdsZTogeyBkZWZhdWx0OiA2MCwgaWY6IHsgdHlwZTogWyJzcG90Il0gfSB9LCBjb2xvcjogeyB0eXBlOiAiY29sb3IiLCBpZjogeyB0eXBlOiBbImFtYmllbnQiLCAiZGlyZWN0aW9uYWwiLCAiaGVtaXNwaGVyZSIsICJwb2ludCIsICJzcG90Il0gfSB9LCBlbnZNYXA6IHsgZGVmYXVsdDogIiIsIGlmOiB7IHR5cGU6IFsicHJvYmUiXSB9IH0sIGdyb3VuZENvbG9yOiB7IHR5cGU6ICJjb2xvciIsIGlmOiB7IHR5cGU6IFsiaGVtaXNwaGVyZSJdIH0gfSwgZGVjYXk6IHsgZGVmYXVsdDogMSwgaWY6IHsgdHlwZTogWyJwb2ludCIsICJzcG90Il0gfSB9LCBkaXN0YW5jZTogeyBkZWZhdWx0OiAwLCBtaW46IDAsIGlmOiB7IHR5cGU6IFsicG9pbnQiLCAic3BvdCJdIH0gfSwgaW50ZW5zaXR5OiB7IGRlZmF1bHQ6IDMuMTQsIG1pbjogMCwgaWY6IHsgdHlwZTogWyJhbWJpZW50IiwgImRpcmVjdGlvbmFsIiwgImhlbWlzcGhlcmUiLCAicG9pbnQiLCAic3BvdCIsICJwcm9iZSJdIH0gfSwgcGVudW1icmE6IHsgZGVmYXVsdDogMCwgbWluOiAwLCBtYXg6IDEsIGlmOiB7IHR5cGU6IFsic3BvdCJdIH0gfSwgdHlwZTogeyBkZWZhdWx0OiAiZGlyZWN0aW9uYWwiLCBvbmVPZjogWyJhbWJpZW50IiwgImRpcmVjdGlvbmFsIiwgImhlbWlzcGhlcmUiLCAicG9pbnQiLCAic3BvdCIsICJwcm9iZSJdLCBzY2hlbWFDaGFuZ2U6IHRydWUgfSwgdGFyZ2V0OiB7IHR5cGU6ICJzZWxlY3RvciIsIGlmOiB7IHR5cGU6IFsic3BvdCIsICJkaXJlY3Rpb25hbCJdIH0gfSwgY2FzdFNoYWRvdzogeyBkZWZhdWx0OiBmYWxzZSwgaWY6IHsgdHlwZTogWyJwb2ludCIsICJzcG90IiwgImRpcmVjdGlvbmFsIl0gfSB9LCBzaGFkb3dCaWFzOiB7IGRlZmF1bHQ6IDAsIGlmOiB7IGNhc3RTaGFkb3c6IHRydWUgfSB9LCBzaGFkb3dDYW1lcmFGYXI6IHsgZGVmYXVsdDogNTAwLCBpZjogeyBjYXN0U2hhZG93OiB0cnVlIH0gfSwgc2hhZG93Q2FtZXJhRm92OiB7IGRlZmF1bHQ6IDkwLCBpZjogeyBjYXN0U2hhZG93OiB0cnVlIH0gfSwgc2hhZG93Q2FtZXJhTmVhcjogeyBkZWZhdWx0OiAwLjUsIGlmOiB7IGNhc3RTaGFkb3c6IHRydWUgfSB9LCBzaGFkb3dDYW1lcmFUb3A6IHsgZGVmYXVsdDogNSwgaWY6IHsgY2FzdFNoYWRvdzogdHJ1ZSB9IH0sIHNoYWRvd0NhbWVyYVJpZ2h0OiB7IGRlZmF1bHQ6IDUsIGlmOiB7IGNhc3RTaGFkb3c6IHRydWUgfSB9LCBzaGFkb3dDYW1lcmFCb3R0b206IHsgZGVmYXVsdDogLTUsIGlmOiB7IGNhc3RTaGFkb3c6IHRydWUgfSB9LCBzaGFkb3dDYW1lcmFMZWZ0OiB7IGRlZmF1bHQ6IC01LCBpZjogeyBjYXN0U2hhZG93OiB0cnVlIH0gfSwgc2hhZG93Q2FtZXJhVmlzaWJsZTogeyBkZWZhdWx0OiBmYWxzZSwgaWY6IHsgY2FzdFNoYWRvdzogdHJ1ZSB9IH0sIHNoYWRvd0NhbWVyYUF1dG9tYXRpYzogeyBkZWZhdWx0OiAiIiwgaWY6IHsgdHlwZTogWyJkaXJlY3Rpb25hbCJdIH0gfSwgc2hhZG93TWFwSGVpZ2h0OiB7IGRlZmF1bHQ6IDUxMiwgaWY6IHsgY2FzdFNoYWRvdzogdHJ1ZSB9IH0sIHNoYWRvd01hcFdpZHRoOiB7IGRlZmF1bHQ6IDUxMiwgaWY6IHsgY2FzdFNoYWRvdzogdHJ1ZSB9IH0sIHNoYWRvd1JhZGl1czogeyBkZWZhdWx0OiAxLCBpZjogeyBjYXN0U2hhZG93OiB0cnVlIH0gfSB9LCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbDsKICAgIHRoaXMubGlnaHQgPSBudWxsLCB0aGlzLmRlZmF1bHRUYXJnZXQgPSBudWxsLCB0aGlzLnN5c3RlbS5yZWdpc3RlckxpZ2h0KGUpOwogIH0sIHVwZGF0ZTogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyID0gdGhpcy5kYXRhLCBuMiA9IG5vKHQyLCBlKSwgaTIgPSB0aGlzLmxpZ2h0LCByMiA9IHRoaXM7CiAgICBpZiAoIWkyIHx8ICJ0eXBlIiBpbiBuMikKICAgICAgdGhpcy5zZXRMaWdodCh0aGlzLmRhdGEpLCB0aGlzLnVwZGF0ZVNoYWRvdygpOwogICAgZWxzZSB7CiAgICAgIHZhciBvMiA9IGZhbHNlOwogICAgICBPYmplY3Qua2V5cyhuMikuZm9yRWFjaChmdW5jdGlvbihlMikgewogICAgICAgIHZhciBuMyA9IHQyW2UyXTsKICAgICAgICBzd2l0Y2ggKGUyKSB7CiAgICAgICAgICBjYXNlICJjb2xvciI6CiAgICAgICAgICAgIGkyLmNvbG9yLnNldChuMyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiZ3JvdW5kQ29sb3IiOgogICAgICAgICAgICBpMi5ncm91bmRDb2xvci5zZXQobjMpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImFuZ2xlIjoKICAgICAgICAgICAgaTIuYW5nbGUgPSBnQShuMyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAidGFyZ2V0IjoKICAgICAgICAgICAgbjMgPT09IG51bGwgPyB0Mi50eXBlICE9PSAic3BvdCIgJiYgdDIudHlwZSAhPT0gImRpcmVjdGlvbmFsIiB8fCAoaTIudGFyZ2V0ID0gcjIuZGVmYXVsdFRhcmdldCkgOiBuMy5oYXNMb2FkZWQgPyByMi5vblNldFRhcmdldChuMywgaTIpIDogbjMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkIiwgcjIub25TZXRUYXJnZXQuYmluZChyMiwgbjMsIGkyKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiZW52TWFwIjoKICAgICAgICAgICAgcjIudXBkYXRlUHJvYmVNYXAodDIsIGkyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJjYXN0U2hhZG93IjoKICAgICAgICAgIGNhc2UgInNoYWRvd0JpYXMiOgogICAgICAgICAgY2FzZSAic2hhZG93Q2FtZXJhRmFyIjoKICAgICAgICAgIGNhc2UgInNoYWRvd0NhbWVyYUZvdiI6CiAgICAgICAgICBjYXNlICJzaGFkb3dDYW1lcmFOZWFyIjoKICAgICAgICAgIGNhc2UgInNoYWRvd0NhbWVyYVRvcCI6CiAgICAgICAgICBjYXNlICJzaGFkb3dDYW1lcmFSaWdodCI6CiAgICAgICAgICBjYXNlICJzaGFkb3dDYW1lcmFCb3R0b20iOgogICAgICAgICAgY2FzZSAic2hhZG93Q2FtZXJhTGVmdCI6CiAgICAgICAgICBjYXNlICJzaGFkb3dDYW1lcmFWaXNpYmxlIjoKICAgICAgICAgIGNhc2UgInNoYWRvd01hcEhlaWdodCI6CiAgICAgICAgICBjYXNlICJzaGFkb3dNYXBXaWR0aCI6CiAgICAgICAgICBjYXNlICJzaGFkb3dSYWRpdXMiOgogICAgICAgICAgICBvMiB8fCAocjIudXBkYXRlU2hhZG93KCksIG8yID0gdHJ1ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAic2hhZG93Q2FtZXJhQXV0b21hdGljIjoKICAgICAgICAgICAgdDIuc2hhZG93Q2FtZXJhQXV0b21hdGljID8gcjIuc2hhZG93Q2FtZXJhQXV0b21hdGljRWxzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQyLnNoYWRvd0NhbWVyYUF1dG9tYXRpYykpIDogcjIuc2hhZG93Q2FtZXJhQXV0b21hdGljRWxzID0gW107CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgaTJbZTJdID0gbjM7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9LCB0aWNrOiAockEgPSBuZXcgUmUuQm94Mywgb0EgPSBuZXcgUmUuVmVjdG9yMywgc0EgPSBuZXcgUmUuVmVjdG9yMywgYUEgPSBuZXcgUmUuTWF0cml4NCwgQUEgPSBuZXcgUmUuU3BoZXJlLCBsQSA9IG5ldyBSZS5WZWN0b3IzLCBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmRhdGEudHlwZSA9PT0gImRpcmVjdGlvbmFsIiAmJiB0aGlzLmxpZ2h0LnNoYWRvdyAmJiB0aGlzLmxpZ2h0LnNoYWRvdy5jYW1lcmEgaW5zdGFuY2VvZiBSZS5PcnRob2dyYXBoaWNDYW1lcmEgJiYgdGhpcy5zaGFkb3dDYW1lcmFBdXRvbWF0aWNFbHMubGVuZ3RoKSB7CiAgICAgIHZhciBlID0gdGhpcy5saWdodC5zaGFkb3cuY2FtZXJhOwogICAgICBlLmdldFdvcmxkRGlyZWN0aW9uKG9BKSwgZS5nZXRXb3JsZFBvc2l0aW9uKHNBKSwgYUEuY29weShlLm1hdHJpeFdvcmxkKSwgYUEuaW52ZXJ0KCksIGUubmVhciA9IDEsIGUubGVmdCA9IDFlNSwgZS5yaWdodCA9IC0xZTUsIGUudG9wID0gLTFlNSwgZS5ib3R0b20gPSAxZTUsIHRoaXMuc2hhZG93Q2FtZXJhQXV0b21hdGljRWxzLmZvckVhY2goZnVuY3Rpb24odDIpIHsKICAgICAgICByQS5zZXRGcm9tT2JqZWN0KHQyLm9iamVjdDNEKSwgckEuZ2V0Qm91bmRpbmdTcGhlcmUoQUEpOwogICAgICAgIHZhciBuMiwgaTIsIHIyLCBvMiwgczIsIGEyID0gaUEoc0EsIG9BLCBBQS5jZW50ZXIpLCBBMiA9IChuMiA9IHNBLCBpMiA9IG9BLCByMiA9IEFBLmNlbnRlciwgbzIgPSBsQSwgczIgPSBpQShuMiwgaTIsIHIyKSwgbzIuY29weShpMiksIG8yLm11bHRpcGx5U2NhbGFyKHMyKSwgbzIuYWRkKHIyKSwgbzIpLmFwcGx5TWF0cml4NChhQSk7CiAgICAgICAgZS5uZWFyID0gTWF0aC5taW4oLWEyIC0gQUEucmFkaXVzIC0gMSwgZS5uZWFyKSwgZS5sZWZ0ID0gTWF0aC5taW4oLUFBLnJhZGl1cyArIEEyLngsIGUubGVmdCksIGUucmlnaHQgPSBNYXRoLm1heChBQS5yYWRpdXMgKyBBMi54LCBlLnJpZ2h0KSwgZS50b3AgPSBNYXRoLm1heChBQS5yYWRpdXMgKyBBMi55LCBlLnRvcCksIGUuYm90dG9tID0gTWF0aC5taW4oLUFBLnJhZGl1cyArIEEyLnksIGUuYm90dG9tKTsKICAgICAgfSksIGUudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwogICAgfQogIH0pLCBzZXRMaWdodDogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyID0gdGhpcy5lbCwgbjIgPSB0aGlzLmdldExpZ2h0KGUpOwogICAgbjIgJiYgKHRoaXMubGlnaHQgJiYgdDIucmVtb3ZlT2JqZWN0M0QoImxpZ2h0IiksIHRoaXMubGlnaHQgPSBuMiwgdGhpcy5saWdodC5lbCA9IHQyLCB0Mi5zZXRPYmplY3QzRCgibGlnaHQiLCB0aGlzLmxpZ2h0KSwgZS50eXBlICE9PSAic3BvdCIgJiYgZS50eXBlICE9PSAiZGlyZWN0aW9uYWwiICYmIGUudHlwZSAhPT0gImhlbWlzcGhlcmUiIHx8IHQyLmdldE9iamVjdDNEKCJsaWdodCIpLnRyYW5zbGF0ZVkoLTEpLCBlLnR5cGUgPT09ICJzcG90IiAmJiAodDIuc2V0T2JqZWN0M0QoImxpZ2h0LXRhcmdldCIsIHRoaXMuZGVmYXVsdFRhcmdldCksIHQyLmdldE9iamVjdDNEKCJsaWdodC10YXJnZXQiKS5wb3NpdGlvbi5zZXQoMCwgMCwgLTEpKSwgZS5zaGFkb3dDYW1lcmFBdXRvbWF0aWMgPyB0aGlzLnNoYWRvd0NhbWVyYUF1dG9tYXRpY0VscyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlLnNoYWRvd0NhbWVyYUF1dG9tYXRpYykpIDogdGhpcy5zaGFkb3dDYW1lcmFBdXRvbWF0aWNFbHMgPSBbXSk7CiAgfSwgdXBkYXRlU2hhZG93OiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbCwgdDIgPSB0aGlzLmRhdGEsIG4yID0gdGhpcy5saWdodDsKICAgIG4yLmNhc3RTaGFkb3cgPSB0Mi5jYXN0U2hhZG93OwogICAgdmFyIGkyID0gZS5nZXRPYmplY3QzRCgiY2FtZXJhSGVscGVyIik7CiAgICBpZiAodDIuc2hhZG93Q2FtZXJhVmlzaWJsZSAmJiAhaTIgPyAoaTIgPSBuZXcgUmUuQ2FtZXJhSGVscGVyKG4yLnNoYWRvdy5jYW1lcmEpLCBlLnNldE9iamVjdDNEKCJjYW1lcmFIZWxwZXIiLCBpMikpIDogIXQyLnNoYWRvd0NhbWVyYVZpc2libGUgJiYgaTIgJiYgZS5yZW1vdmVPYmplY3QzRCgiY2FtZXJhSGVscGVyIiksICF0Mi5jYXN0U2hhZG93KQogICAgICByZXR1cm4gbjI7CiAgICBuMi5zaGFkb3cuYmlhcyA9IHQyLnNoYWRvd0JpYXMsIG4yLnNoYWRvdy5yYWRpdXMgPSB0Mi5zaGFkb3dSYWRpdXMsIG4yLnNoYWRvdy5tYXBTaXplLmhlaWdodCA9IHQyLnNoYWRvd01hcEhlaWdodCwgbjIuc2hhZG93Lm1hcFNpemUud2lkdGggPSB0Mi5zaGFkb3dNYXBXaWR0aCwgbjIuc2hhZG93LmNhbWVyYS5uZWFyID0gdDIuc2hhZG93Q2FtZXJhTmVhciwgbjIuc2hhZG93LmNhbWVyYS5mYXIgPSB0Mi5zaGFkb3dDYW1lcmFGYXIsIG4yLnNoYWRvdy5jYW1lcmEgaW5zdGFuY2VvZiBSZS5PcnRob2dyYXBoaWNDYW1lcmEgPyAobjIuc2hhZG93LmNhbWVyYS50b3AgPSB0Mi5zaGFkb3dDYW1lcmFUb3AsIG4yLnNoYWRvdy5jYW1lcmEucmlnaHQgPSB0Mi5zaGFkb3dDYW1lcmFSaWdodCwgbjIuc2hhZG93LmNhbWVyYS5ib3R0b20gPSB0Mi5zaGFkb3dDYW1lcmFCb3R0b20sIG4yLnNoYWRvdy5jYW1lcmEubGVmdCA9IHQyLnNoYWRvd0NhbWVyYUxlZnQpIDogbjIuc2hhZG93LmNhbWVyYS5mb3YgPSB0Mi5zaGFkb3dDYW1lcmFGb3YsIG4yLnNoYWRvdy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpLCBpMiAmJiBpMi51cGRhdGUoKTsKICB9LCBnZXRMaWdodDogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyID0gZS5hbmdsZSwgbjIgPSBuZXcgUmUuQ29sb3IoZS5jb2xvcik7CiAgICBuMiA9IG4yLmdldEhleCgpOwogICAgdmFyIHsgZGVjYXk6IGkyLCBkaXN0YW5jZTogcjIgfSA9IGUsIG8yID0gbmV3IFJlLkNvbG9yKGUuZ3JvdW5kQ29sb3IpOwogICAgbzIgPSBvMi5nZXRIZXgoKTsKICAgIHZhciB7IGludGVuc2l0eTogczIsIHR5cGU6IGEyLCB0YXJnZXQ6IEEyIH0gPSBlLCBsMiA9IG51bGw7CiAgICBzd2l0Y2ggKGEyLnRvTG93ZXJDYXNlKCkpIHsKICAgICAgY2FzZSAiYW1iaWVudCI6CiAgICAgICAgcmV0dXJuIG5ldyBSZS5BbWJpZW50TGlnaHQobjIsIHMyKTsKICAgICAgY2FzZSAiZGlyZWN0aW9uYWwiOgogICAgICAgIHJldHVybiBsMiA9IG5ldyBSZS5EaXJlY3Rpb25hbExpZ2h0KG4yLCBzMiksIHRoaXMuZGVmYXVsdFRhcmdldCA9IGwyLnRhcmdldCwgQTIgJiYgKEEyLmhhc0xvYWRlZCA/IHRoaXMub25TZXRUYXJnZXQoQTIsIGwyKSA6IEEyLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZCIsIHRoaXMub25TZXRUYXJnZXQuYmluZCh0aGlzLCBBMiwgbDIpKSksIGwyOwogICAgICBjYXNlICJoZW1pc3BoZXJlIjoKICAgICAgICByZXR1cm4gbmV3IFJlLkhlbWlzcGhlcmVMaWdodChuMiwgbzIsIHMyKTsKICAgICAgY2FzZSAicG9pbnQiOgogICAgICAgIHJldHVybiBuZXcgUmUuUG9pbnRMaWdodChuMiwgczIsIHIyLCBpMik7CiAgICAgIGNhc2UgInNwb3QiOgogICAgICAgIHJldHVybiBsMiA9IG5ldyBSZS5TcG90TGlnaHQobjIsIHMyLCByMiwgZ0EodDIpLCBlLnBlbnVtYnJhLCBpMiksIHRoaXMuZGVmYXVsdFRhcmdldCA9IGwyLnRhcmdldCwgQTIgJiYgKEEyLmhhc0xvYWRlZCA/IHRoaXMub25TZXRUYXJnZXQoQTIsIGwyKSA6IEEyLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZCIsIHRoaXMub25TZXRUYXJnZXQuYmluZCh0aGlzLCBBMiwgbDIpKSksIGwyOwogICAgICBjYXNlICJwcm9iZSI6CiAgICAgICAgcmV0dXJuIGwyID0gbmV3IFJlLkxpZ2h0UHJvYmUsIHRoaXMudXBkYXRlUHJvYmVNYXAoZSwgbDIpLCBsMjsKICAgICAgZGVmYXVsdDoKICAgICAgICBwQSgiJXMgaXMgbm90IGEgdmFsaWQgbGlnaHQgdHlwZS4gQ2hvb3NlIGZyb20gYW1iaWVudCwgZGlyZWN0aW9uYWwsIGhlbWlzcGhlcmUsIHBvaW50LCBzcG90LiIsIGEyKTsKICAgIH0KICB9LCB1cGRhdGVQcm9iZU1hcDogZnVuY3Rpb24oZSwgdDIpIHsKICAgIGUuZW52TWFwID8gKG1BW2UuZW52TWFwXSA9PT0gdW5kZWZpbmVkICYmIChtQVtlLmVudk1hcF0gPSBuZXcgd2luZG93LlByb21pc2UoZnVuY3Rpb24odDMpIHsKICAgICAgdXIoZS5lbnZNYXAsIGZ1bmN0aW9uKG4yKSB7CiAgICAgICAgZkEubG9hZChuMiwgZnVuY3Rpb24objMpIHsKICAgICAgICAgIHZhciBpMiA9IG9pLmZyb21DdWJlVGV4dHVyZShuMyk7CiAgICAgICAgICBtQVtlLmVudk1hcF0gPSBpMiwgdDMoaTIpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0pKSwgbUFbZS5lbnZNYXBdIGluc3RhbmNlb2Ygd2luZG93LlByb21pc2UgPyBtQVtlLmVudk1hcF0udGhlbihmdW5jdGlvbihlMikgewogICAgICB0Mi5jb3B5KGUyKTsKICAgIH0pIDogbUFbZS5lbnZNYXBdIGluc3RhbmNlb2YgUmUuTGlnaHRQcm9iZSAmJiB0Mi5jb3B5KG1BW2UuZW52TWFwXSkpIDogdDIuY29weShuZXcgUmUuTGlnaHRQcm9iZSk7CiAgfSwgb25TZXRUYXJnZXQ6IGZ1bmN0aW9uKGUsIHQyKSB7CiAgICB0Mi50YXJnZXQgPSBlLm9iamVjdDNEOwogIH0sIHJlbW92ZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWw7CiAgICBlLnJlbW92ZU9iamVjdDNEKCJsaWdodCIpLCBlLmdldE9iamVjdDNEKCJjYW1lcmFIZWxwZXIiKSAmJiBlLnJlbW92ZU9iamVjdDNEKCJjYW1lcmFIZWxwZXIiKTsKICB9IH0pLCBjcygibGluZSIsIHsgc2NoZW1hOiB7IHN0YXJ0OiB7IHR5cGU6ICJ2ZWMzIiwgZGVmYXVsdDogeyB4OiAwLCB5OiAwLCB6OiAwIH0gfSwgZW5kOiB7IHR5cGU6ICJ2ZWMzIiwgZGVmYXVsdDogeyB4OiAwLCB5OiAwLCB6OiAwIH0gfSwgY29sb3I6IHsgdHlwZTogImNvbG9yIiwgZGVmYXVsdDogIiM3NEJFQzEiIH0sIG9wYWNpdHk6IHsgdHlwZTogIm51bWJlciIsIGRlZmF1bHQ6IDEgfSwgdmlzaWJsZTogeyBkZWZhdWx0OiB0cnVlIH0gfSwgbXVsdGlwbGU6IHRydWUsIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyLCBuMiA9IHRoaXMuZGF0YTsKICAgIHQyID0gdGhpcy5tYXRlcmlhbCA9IG5ldyBSZS5MaW5lQmFzaWNNYXRlcmlhbCh7IGNvbG9yOiBuMi5jb2xvciwgb3BhY2l0eTogbjIub3BhY2l0eSwgdHJhbnNwYXJlbnQ6IG4yLm9wYWNpdHkgPCAxLCB2aXNpYmxlOiBuMi52aXNpYmxlIH0pLCAoZSA9IHRoaXMuZ2VvbWV0cnkgPSBuZXcgUmUuQnVmZmVyR2VvbWV0cnkpLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCBuZXcgUmUuQnVmZmVyQXR0cmlidXRlKG5ldyBGbG9hdDMyQXJyYXkoNiksIDMpKSwgdGhpcy5saW5lID0gbmV3IFJlLkxpbmUoZSwgdDIpLCB0aGlzLmVsLnNldE9iamVjdDNEKHRoaXMuYXR0ck5hbWUsIHRoaXMubGluZSk7CiAgfSwgdXBkYXRlOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSB0aGlzLmRhdGEsIG4yID0gdGhpcy5nZW9tZXRyeSwgaTIgPSBmYWxzZSwgcjIgPSB0aGlzLm1hdGVyaWFsLCBvMiA9IG4yLmF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7CiAgICBFQSh0Mi5zdGFydCwgZS5zdGFydCkgfHwgKG8yWzBdID0gdDIuc3RhcnQueCwgbzJbMV0gPSB0Mi5zdGFydC55LCBvMlsyXSA9IHQyLnN0YXJ0LnosIGkyID0gdHJ1ZSksIEVBKHQyLmVuZCwgZS5lbmQpIHx8IChvMlszXSA9IHQyLmVuZC54LCBvMls0XSA9IHQyLmVuZC55LCBvMls1XSA9IHQyLmVuZC56LCBpMiA9IHRydWUpLCBpMiAmJiAobjIuYXR0cmlidXRlcy5wb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWUsIG4yLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpKSwgcjIuY29sb3Iuc2V0U3R5bGUodDIuY29sb3IpLCByMi5vcGFjaXR5ID0gdDIub3BhY2l0eSwgcjIudHJhbnNwYXJlbnQgPSB0Mi5vcGFjaXR5IDwgMSwgcjIudmlzaWJsZSA9IHQyLnZpc2libGU7CiAgfSwgcmVtb3ZlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwucmVtb3ZlT2JqZWN0M0QodGhpcy5hdHRyTmFtZSwgdGhpcy5saW5lKTsKICB9IH0pLCBjcygibGluayIsIHsgc2NoZW1hOiB7IGJhY2tncm91bmRDb2xvcjogeyBkZWZhdWx0OiAicmVkIiwgdHlwZTogImNvbG9yIiB9LCBib3JkZXJDb2xvcjogeyBkZWZhdWx0OiAid2hpdGUiLCB0eXBlOiAiY29sb3IiIH0sIGhpZ2hsaWdodGVkOiB7IGRlZmF1bHQ6IGZhbHNlIH0sIGhpZ2hsaWdodGVkQ29sb3I6IHsgZGVmYXVsdDogIiMyNENBRkYiLCB0eXBlOiAiY29sb3IiIH0sIGhyZWY6IHsgZGVmYXVsdDogIiIgfSwgaW1hZ2U6IHsgdHlwZTogImFzc2V0IiB9LCBvbjogeyBkZWZhdWx0OiAiY2xpY2siIH0sIHBlZWtNb2RlOiB7IGRlZmF1bHQ6IGZhbHNlIH0sIHRpdGxlOiB7IGRlZmF1bHQ6ICIiIH0sIHRpdGxlQ29sb3I6IHsgZGVmYXVsdDogIndoaXRlIiwgdHlwZTogImNvbG9yIiB9LCB2aXN1YWxBc3BlY3RFbmFibGVkOiB7IGRlZmF1bHQ6IGZhbHNlIH0gfSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLm5hdmlnYXRlID0gdGhpcy5uYXZpZ2F0ZS5iaW5kKHRoaXMpLCB0aGlzLnByZXZpb3VzUXVhdGVybmlvbiA9IHVuZGVmaW5lZCwgdGhpcy5xdWF0ZXJuaW9uQ2xvbmUgPSBuZXcgUmUuUXVhdGVybmlvbiwgdGhpcy5oaWRkZW5FbHMgPSBbXTsKICB9LCB1cGRhdGU6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjIsIGkyID0gdGhpcy5kYXRhLCByMiA9IHRoaXMuZWw7CiAgICBpZiAoaTIudmlzdWFsQXNwZWN0RW5hYmxlZCkgewogICAgICB2YXIgbzIgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZSgic2NhbGUiKTsKICAgICAgdGhpcy5wcmV2aWV3RGlzdGFuY2UgPSAxNSAqIChvMi54ICsgbzIueSkgLyAyLCB0aGlzLmluaXRWaXN1YWxBc3BlY3QoKSwgdDIgPSBpMi5oaWdobGlnaHRlZCA/IGkyLmhpZ2hsaWdodGVkQ29sb3IgOiBpMi5iYWNrZ3JvdW5kQ29sb3IsIG4yID0gaTIuaGlnaGxpZ2h0ZWQgPyBpMi5oaWdobGlnaHRlZENvbG9yIDogaTIuYm9yZGVyQ29sb3IsIHIyLnNldEF0dHJpYnV0ZSgibWF0ZXJpYWwiLCAiYmFja2dyb3VuZENvbG9yIiwgdDIpLCByMi5zZXRBdHRyaWJ1dGUoIm1hdGVyaWFsIiwgInN0cm9rZUNvbG9yIiwgbjIpLCBpMi5vbiAhPT0gZS5vbiAmJiB0aGlzLnVwZGF0ZUV2ZW50TGlzdGVuZXIoKSwgZS5wZWVrTW9kZSAhPT0gdW5kZWZpbmVkICYmIGkyLnBlZWtNb2RlICE9PSBlLnBlZWtNb2RlICYmIHRoaXMudXBkYXRlUGVla01vZGUoKSwgaTIuaW1hZ2UgJiYgZS5pbWFnZSAhPT0gaTIuaW1hZ2UgJiYgcjIuc2V0QXR0cmlidXRlKCJtYXRlcmlhbCIsICJwYW5vIiwgdHlwZW9mIGkyLmltYWdlID09ICJzdHJpbmciID8gaTIuaW1hZ2UgOiBpMi5pbWFnZS5zcmMpOwogICAgfQogIH0sIHVwZGF0ZVBlZWtNb2RlOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbCwgdDIgPSB0aGlzLnNwaGVyZUVsOwogICAgdGhpcy5kYXRhLnBlZWtNb2RlID8gKHRoaXMuaGlkZUFsbCgpLCBlLmdldE9iamVjdDNEKCJtZXNoIikudmlzaWJsZSA9IGZhbHNlLCB0Mi5zZXRBdHRyaWJ1dGUoInZpc2libGUiLCB0cnVlKSkgOiAodGhpcy5zaG93QWxsKCksIGUuZ2V0T2JqZWN0M0QoIm1lc2giKS52aXNpYmxlID0gdHJ1ZSwgdDIuc2V0QXR0cmlidXRlKCJ2aXNpYmxlIiwgZmFsc2UpKTsKICB9LCBwbGF5OiBmdW5jdGlvbigpIHsKICAgIHRoaXMudXBkYXRlRXZlbnRMaXN0ZW5lcigpOwogIH0sIHBhdXNlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigpOwogIH0sIHVwZGF0ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsOwogICAgZS5pc1BsYXlpbmcgJiYgKHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigpLCBlLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5kYXRhLm9uLCB0aGlzLm5hdmlnYXRlKSk7CiAgfSwgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZGF0YS5vbjsKICAgIGUgJiYgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKGUsIHRoaXMubmF2aWdhdGUpOwogIH0sIGluaXRWaXN1YWxBc3BlY3Q6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyLCBuMiwgaTIgPSB0aGlzLmVsOwogICAgdGhpcy5kYXRhLnZpc3VhbEFzcGVjdEVuYWJsZWQgJiYgIXRoaXMudmlzdWFsQXNwZWN0SW5pdGlhbGl6ZWQgJiYgKG4yID0gdGhpcy50ZXh0RWwgPSB0aGlzLnRleHRFbCB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhLWVudGl0eSIpLCB0MiA9IHRoaXMuc3BoZXJlRWwgPSB0aGlzLnNwaGVyZUVsIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEtZW50aXR5IiksIGUgPSB0aGlzLnNlbWlTcGhlcmVFbCA9IHRoaXMuc2VtaVNwaGVyZUVsIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEtZW50aXR5IiksIGkyLnNldEF0dHJpYnV0ZSgiZ2VvbWV0cnkiLCB7IHByaW1pdGl2ZTogImNpcmNsZSIsIHJhZGl1czogMSwgc2VnbWVudHM6IDY0IH0pLCBpMi5zZXRBdHRyaWJ1dGUoIm1hdGVyaWFsIiwgeyBzaGFkZXI6ICJwb3J0YWwiLCBwYW5vOiB0aGlzLmRhdGEuaW1hZ2UsIHNpZGU6ICJkb3VibGUiLCBwcmV2aWV3RGlzdGFuY2U6IHRoaXMucHJldmlld0Rpc3RhbmNlIH0pLCBuMi5zZXRBdHRyaWJ1dGUoInRleHQiLCB7IGNvbG9yOiB0aGlzLmRhdGEudGl0bGVDb2xvciwgYWxpZ246ICJjZW50ZXIiLCBmb250OiAia2Vsc29uc2FucyIsIHZhbHVlOiB0aGlzLmRhdGEudGl0bGUgfHwgdGhpcy5kYXRhLmhyZWYsIHdpZHRoOiA0IH0pLCBuMi5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgIjAgMS41IDAiKSwgaTIuYXBwZW5kQ2hpbGQobjIpLCBlLnNldEF0dHJpYnV0ZSgiZ2VvbWV0cnkiLCB7IHByaW1pdGl2ZTogInNwaGVyZSIsIHJhZGl1czogMSwgcGhpU3RhcnQ6IDAsIHNlZ21lbnRzV2lkdGg6IDY0LCBzZWdtZW50c0hlaWdodDogNjQsIHBoaUxlbmd0aDogMTgwLCB0aGV0YVN0YXJ0OiAwLCB0aGV0YUxlbmd0aDogMzYwIH0pLCBlLnNldEF0dHJpYnV0ZSgibWF0ZXJpYWwiLCB7IHNoYWRlcjogInBvcnRhbCIsIGJvcmRlckVuYWJsZWQ6IDAsIHBhbm86IHRoaXMuZGF0YS5pbWFnZSwgc2lkZTogImJhY2siLCBwcmV2aWV3RGlzdGFuY2U6IHRoaXMucHJldmlld0Rpc3RhbmNlIH0pLCBlLnNldEF0dHJpYnV0ZSgicm90YXRpb24iLCAiMCAxODAgMCIpLCBlLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCAiMCAwIDAiKSwgZS5zZXRBdHRyaWJ1dGUoInZpc2libGUiLCBmYWxzZSksIGkyLmFwcGVuZENoaWxkKGUpLCB0Mi5zZXRBdHRyaWJ1dGUoImdlb21ldHJ5IiwgeyBwcmltaXRpdmU6ICJzcGhlcmUiLCByYWRpdXM6IDEwLCBzZWdtZW50c1dpZHRoOiA2NCwgc2VnbWVudHNIZWlnaHQ6IDY0IH0pLCB0Mi5zZXRBdHRyaWJ1dGUoIm1hdGVyaWFsIiwgeyBzaGFkZXI6ICJwb3J0YWwiLCBib3JkZXJFbmFibGVkOiAwLCBwYW5vOiB0aGlzLmRhdGEuaW1hZ2UsIHNpZGU6ICJiYWNrIiwgcHJldmlld0Rpc3RhbmNlOiB0aGlzLnByZXZpZXdEaXN0YW5jZSB9KSwgdDIuc2V0QXR0cmlidXRlKCJ2aXNpYmxlIiwgZmFsc2UpLCBpMi5hcHBlbmRDaGlsZCh0MiksIHRoaXMudmlzdWFsQXNwZWN0SW5pdGlhbGl6ZWQgPSB0cnVlKTsKICB9LCBuYXZpZ2F0ZTogZnVuY3Rpb24oKSB7CiAgICB3aW5kb3cubG9jYXRpb24gPSB0aGlzLmRhdGEuaHJlZjsKICB9LCB0aWNrOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gbmV3IFJlLlZlY3RvcjMsIHQyID0gbmV3IFJlLlZlY3RvcjMsIG4yID0gbmV3IFJlLlF1YXRlcm5pb24sIGkyID0gbmV3IFJlLlZlY3RvcjM7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHZhciByMiwgbzIsIHMyID0gdGhpcy5lbCwgYTIgPSBzMi5vYmplY3QzRCwgQTIgPSBzMi5zY2VuZUVsLmNhbWVyYSwgbDIgPSB0aGlzLnRleHRFbDsKICAgICAgaWYgKHRoaXMuZGF0YS52aXN1YWxBc3BlY3RFbmFibGVkKQogICAgICAgIGlmIChhMi51cGRhdGVNYXRyaXhXb3JsZCgpLCBBMi5wYXJlbnQudXBkYXRlTWF0cml4V29ybGQoKSwgQTIudXBkYXRlTWF0cml4V29ybGQoKSwgYTIubWF0cml4LmRlY29tcG9zZSh0MiwgbjIsIGkyKSwgdDIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEyLm1hdHJpeFdvcmxkKSwgZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oQTIubWF0cml4V29ybGQpLCAobzIgPSB0Mi5kaXN0YW5jZVRvKGUpKSA+IDEuMzMzMzMgKiB0aGlzLnByZXZpZXdEaXN0YW5jZSkKICAgICAgICAgIHRoaXMucHJldmlvdXNRdWF0ZXJuaW9uIHx8ICh0aGlzLnF1YXRlcm5pb25DbG9uZS5jb3B5KG4yKSwgdGhpcy5wcmV2aW91c1F1YXRlcm5pb24gPSB0aGlzLnF1YXRlcm5pb25DbG9uZSksIGEyLmxvb2tBdChlKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGlmIChyMiA9IHRoaXMuY2FsY3VsYXRlQ2FtZXJhUG9ydGFsT3JpZW50YXRpb24oKSwgbzIgPCAwLjUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2VtaVNwaGVyZUVsLmdldEF0dHJpYnV0ZSgidmlzaWJsZSIpID09PSB0cnVlKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgbDIuc2V0QXR0cmlidXRlKCJ0ZXh0IiwgIndpZHRoIiwgMS41KSwgcjIgPD0gMCA/IChsMi5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgIjAgMCAwLjc1IiksIGwyLnNldEF0dHJpYnV0ZSgicm90YXRpb24iLCAiMCAxODAgMCIpLCB0aGlzLnNlbWlTcGhlcmVFbC5zZXRBdHRyaWJ1dGUoInJvdGF0aW9uIiwgIjAgMCAwIikpIDogKGwyLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCAiMCAwIC0wLjc1IiksIGwyLnNldEF0dHJpYnV0ZSgicm90YXRpb24iLCAiMCAwIDAiKSwgdGhpcy5zZW1pU3BoZXJlRWwuc2V0QXR0cmlidXRlKCJyb3RhdGlvbiIsICIwIDE4MCAwIikpLCBzMi5nZXRPYmplY3QzRCgibWVzaCIpLnZpc2libGUgPSBmYWxzZSwgdGhpcy5zZW1pU3BoZXJlRWwuc2V0QXR0cmlidXRlKCJ2aXNpYmxlIiwgdHJ1ZSksIHRoaXMucGVla0NhbWVyYVBvcnRhbE9yaWVudGF0aW9uID0gcjI7CiAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgcjIgPD0gMCA/IGwyLnNldEF0dHJpYnV0ZSgicm90YXRpb24iLCAiMCAxODAgMCIpIDogbDIuc2V0QXR0cmlidXRlKCJyb3RhdGlvbiIsICIwIDAgMCIpLCBsMi5zZXRBdHRyaWJ1dGUoInRleHQiLCAid2lkdGgiLCA1KSwgbDIuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsICIwIDEuNSAwIiksIHMyLmdldE9iamVjdDNEKCJtZXNoIikudmlzaWJsZSA9IHRydWUsIHRoaXMuc2VtaVNwaGVyZUVsLnNldEF0dHJpYnV0ZSgidmlzaWJsZSIsIGZhbHNlKSwgdGhpcy5wZWVrQ2FtZXJhUG9ydGFsT3JpZW50YXRpb24gPSB1bmRlZmluZWQ7CiAgICAgICAgICB0aGlzLnByZXZpb3VzUXVhdGVybmlvbiAmJiAoYTIucXVhdGVybmlvbi5jb3B5KHRoaXMucHJldmlvdXNRdWF0ZXJuaW9uKSwgdGhpcy5wcmV2aW91c1F1YXRlcm5pb24gPSB1bmRlZmluZWQpOwogICAgICAgIH0KICAgIH07CiAgfSgpLCBoaWRlQWxsOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbCwgdDIgPSB0aGlzLmhpZGRlbkVscywgbjIgPSB0aGlzOwogICAgdDIubGVuZ3RoID4gMCB8fCBlLnNjZW5lRWwub2JqZWN0M0QudHJhdmVyc2UoZnVuY3Rpb24oaTIpIHsKICAgICAgaTIgJiYgaTIuZWwgJiYgaTIuZWwuaGFzQXR0cmlidXRlKCJsaW5rLWNvbnRyb2xzIikgfHwgaTIuZWwgJiYgaTIgIT09IGUuc2NlbmVFbC5vYmplY3QzRCAmJiBpMi5lbCAhPT0gZSAmJiBpMi5lbCAhPT0gbjIuc3BoZXJlRWwgJiYgaTIuZWwgIT09IGUuc2NlbmVFbC5jYW1lcmFFbCAmJiBpMi5lbC5nZXRBdHRyaWJ1dGUoInZpc2libGUiKSAhPT0gZmFsc2UgJiYgaTIuZWwgIT09IG4yLnRleHRFbCAmJiBpMi5lbCAhPT0gbjIuc2VtaVNwaGVyZUVsICYmIChpMi5lbC5zZXRBdHRyaWJ1dGUoInZpc2libGUiLCBmYWxzZSksIHQyLnB1c2goaTIuZWwpKTsKICAgIH0pOwogIH0sIHNob3dBbGw6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5oaWRkZW5FbHMuZm9yRWFjaChmdW5jdGlvbihlKSB7CiAgICAgIGUuc2V0QXR0cmlidXRlKCJ2aXNpYmxlIiwgdHJ1ZSk7CiAgICB9KSwgdGhpcy5oaWRkZW5FbHMgPSBbXTsKICB9LCBjYWxjdWxhdGVDYW1lcmFQb3J0YWxPcmllbnRhdGlvbjogKGNBID0gbmV3IFJlLk1hdHJpeDQsIGhBID0gbmV3IFJlLlZlY3RvcjMsIGRBID0gbmV3IFJlLlZlY3RvcjMoMCwgMCwgMSksIHVBID0gbmV3IFJlLlZlY3RvcjMoMCwgMCwgMCksIGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsLCB0MiA9IGUuc2NlbmVFbC5jYW1lcmE7CiAgICByZXR1cm4gaEEuc2V0KDAsIDAsIDApLCBkQS5zZXQoMCwgMCwgMSksIHVBLnNldCgwLCAwLCAwKSwgZS5vYmplY3QzRC5tYXRyaXhXb3JsZC5leHRyYWN0Um90YXRpb24oY0EpLCBkQS5hcHBseU1hdHJpeDQoY0EpLCBlLm9iamVjdDNELnVwZGF0ZU1hdHJpeFdvcmxkKCksIGUub2JqZWN0M0QubG9jYWxUb1dvcmxkKHVBKSwgdDIucGFyZW50LnBhcmVudC51cGRhdGVNYXRyaXhXb3JsZCgpLCB0Mi5wYXJlbnQudXBkYXRlTWF0cml4V29ybGQoKSwgdDIudXBkYXRlTWF0cml4V29ybGQoKSwgdDIubG9jYWxUb1dvcmxkKGhBKSwgaEEuc3ViKHVBKS5ub3JtYWxpemUoKSwgZEEubm9ybWFsaXplKCksIE1hdGguc2lnbihkQS5kb3QoaEEpKTsKICB9KSwgcmVtb3ZlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigpOwogIH0gfSksIGlhKCJwb3J0YWwiLCB7IHNjaGVtYTogeyBib3JkZXJFbmFibGVkOiB7IGRlZmF1bHQ6IDEsIHR5cGU6ICJpbnQiLCBpczogInVuaWZvcm0iIH0sIGJhY2tncm91bmRDb2xvcjogeyBkZWZhdWx0OiAicmVkIiwgdHlwZTogImNvbG9yIiwgaXM6ICJ1bmlmb3JtIiB9LCBwYW5vOiB7IHR5cGU6ICJtYXAiLCBpczogInVuaWZvcm0iIH0sIHN0cm9rZUNvbG9yOiB7IGRlZmF1bHQ6ICJ3aGl0ZSIsIHR5cGU6ICJjb2xvciIsIGlzOiAidW5pZm9ybSIgfSwgcHJldmlld0Rpc3RhbmNlOiB7IGRlZmF1bHQ6IDE1LCB0eXBlOiAiZmxvYXQiLCBpczogInVuaWZvcm0iIH0gfSwgdmVydGV4U2hhZGVyOiBbInZlYzMgcG9ydGFsUG9zaXRpb247IiwgInZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjsiLCAidmFyeWluZyBmbG9hdCB2RGlzdGFuY2VUb0NlbnRlcjsiLCAidmFyeWluZyBmbG9hdCB2RGlzdGFuY2U7IiwgInZvaWQgbWFpbigpIHsiLCAidkRpc3RhbmNlVG9DZW50ZXIgPSBjbGFtcChsZW5ndGgocG9zaXRpb24gLSB2ZWMzKDAuMCwgMC4wLCAwLjApKSwgMC4wLCAxLjApOyIsICJwb3J0YWxQb3NpdGlvbiA9IChtb2RlbE1hdHJpeCAqIHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKSkueHl6OyIsICJ2RGlzdGFuY2UgPSBsZW5ndGgocG9ydGFsUG9zaXRpb24gLSBjYW1lcmFQb3NpdGlvbik7IiwgInZXb3JsZFBvc2l0aW9uID0gKG1vZGVsTWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKSkueHl6OyIsICJnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApOyIsICJ9Il0uam9pbihgCmApLCBmcmFnbWVudFNoYWRlcjogWyIjZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTQiLCAidW5pZm9ybSBzYW1wbGVyMkQgcGFubzsiLCAidW5pZm9ybSB2ZWMzIHN0cm9rZUNvbG9yOyIsICJ1bmlmb3JtIHZlYzMgYmFja2dyb3VuZENvbG9yOyIsICJ1bmlmb3JtIGZsb2F0IGJvcmRlckVuYWJsZWQ7IiwgInVuaWZvcm0gZmxvYXQgcHJldmlld0Rpc3RhbmNlOyIsICJ2YXJ5aW5nIGZsb2F0IHZEaXN0YW5jZVRvQ2VudGVyOyIsICJ2YXJ5aW5nIGZsb2F0IHZEaXN0YW5jZTsiLCAidmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uOyIsICJ2b2lkIG1haW4oKSB7IiwgInZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24pOyIsICJ2ZWMyIHNhbXBsZVVWOyIsICJmbG9hdCBib3JkZXJUaGlja25lc3MgPSBjbGFtcChleHAoLXZEaXN0YW5jZSAvIDUwLjApLCAwLjYsIDAuOTUpOyIsICJzYW1wbGVVVi55ID0gY2xhbXAoZGlyZWN0aW9uLnkgKiAwLjUgICsgMC41LCAwLjAsIDEuMCk7IiwgInNhbXBsZVVWLnggPSBhdGFuKGRpcmVjdGlvbi56LCAtZGlyZWN0aW9uLngpICogLVJFQ0lQUk9DQUxfUEkyICsgMC41OyIsICJpZiAodkRpc3RhbmNlVG9DZW50ZXIgPiBib3JkZXJUaGlja25lc3MgJiYgYm9yZGVyRW5hYmxlZCA9PSAxLjApIHsiLCAiZ2xfRnJhZ0NvbG9yID0gdmVjNChzdHJva2VDb2xvciwgMS4wKTsiLCAifSBlbHNlIHsiLCAiZ2xfRnJhZ0NvbG9yID0gbWl4KHRleHR1cmUyRChwYW5vLCBzYW1wbGVVViksIHZlYzQoYmFja2dyb3VuZENvbG9yLCAxLjApLCBjbGFtcChwb3coKHZEaXN0YW5jZSAvIHByZXZpZXdEaXN0YW5jZSksIDIuMCksIDAuMCwgMS4wKSk7IiwgIn0iLCAifSJdLmpvaW4oYApgKSB9KTsKICB2QSA9IGNpICsgImNvbnRyb2xsZXJzL2xvZ2l0ZWNoLyI7CiAgQkEgPSAoY3MoImxvZ2l0ZWNoLW14LWluay1jb250cm9scyIsIHsgc2NoZW1hOiB7IGhhbmQ6IHsgZGVmYXVsdDogImxlZnQiIH0sIG1vZGVsOiB7IGRlZmF1bHQ6IHRydWUgfSwgb3JpZW50YXRpb25PZmZzZXQ6IHsgdHlwZTogInZlYzMiIH0gfSwgbWFwcGluZzogeyBsZWZ0OiB7IGJ1dHRvbnM6IFsiZnJvbnQiLCAiYmFjayIsICJub25lIiwgIm5vbmUiLCAibm9uZSIsICJ0aXAiXSB9LCByaWdodDogeyBidXR0b25zOiBbImZyb250IiwgImJhY2siLCAibm9uZSIsICJub25lIiwgIm5vbmUiLCAidGlwIl0gfSB9LCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpczsKICAgIHRoaXMub25CdXR0b25DaGFuZ2VkID0gdGhpcy5vbkJ1dHRvbkNoYW5nZWQuYmluZCh0aGlzKSwgdGhpcy5vbkJ1dHRvbkRvd24gPSBmdW5jdGlvbih0MikgewogICAgICBOcih0Mi5kZXRhaWwuaWQsICJkb3duIiwgZSwgZS5kYXRhLmhhbmQpOwogICAgfSwgdGhpcy5vbkJ1dHRvblVwID0gZnVuY3Rpb24odDIpIHsKICAgICAgTnIodDIuZGV0YWlsLmlkLCAidXAiLCBlLCBlLmRhdGEuaGFuZCk7CiAgICB9LCB0aGlzLm9uQnV0dG9uVG91Y2hFbmQgPSBmdW5jdGlvbih0MikgewogICAgICBOcih0Mi5kZXRhaWwuaWQsICJ0b3VjaGVuZCIsIGUsIGUuZGF0YS5oYW5kKTsKICAgIH0sIHRoaXMub25CdXR0b25Ub3VjaFN0YXJ0ID0gZnVuY3Rpb24odDIpIHsKICAgICAgTnIodDIuZGV0YWlsLmlkLCAidG91Y2hzdGFydCIsIGUsIGUuZGF0YS5oYW5kKTsKICAgIH0sIHRoaXMuYmluZE1ldGhvZHMoKTsKICB9LCBwbGF5OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50KCksIHRoaXMuYWRkQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcigpOwogIH0sIHBhdXNlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSwgdGhpcy5yZW1vdmVDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyKCk7CiAgfSwgYmluZE1ldGhvZHM6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5vbk1vZGVsTG9hZGVkID0gdGhpcy5vbk1vZGVsTG9hZGVkLmJpbmQodGhpcyksIHRoaXMub25Db250cm9sbGVyc1VwZGF0ZSA9IHRoaXMub25Db250cm9sbGVyc1VwZGF0ZS5iaW5kKHRoaXMpLCB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudCA9IHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50LmJpbmQodGhpcyksIHRoaXMucmVtb3ZlQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lciA9IHRoaXMucmVtb3ZlQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lci5iaW5kKHRoaXMpLCB0aGlzLm9uQXhpc01vdmVkID0gdGhpcy5vbkF4aXNNb3ZlZC5iaW5kKHRoaXMpOwogIH0sIGFkZEV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbDsKICAgIGUuYWRkRXZlbnRMaXN0ZW5lcigiYnV0dG9uY2hhbmdlZCIsIHRoaXMub25CdXR0b25DaGFuZ2VkKSwgZS5hZGRFdmVudExpc3RlbmVyKCJidXR0b25kb3duIiwgdGhpcy5vbkJ1dHRvbkRvd24pLCBlLmFkZEV2ZW50TGlzdGVuZXIoImJ1dHRvbnVwIiwgdGhpcy5vbkJ1dHRvblVwKSwgZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgdGhpcy5vbkJ1dHRvblRvdWNoU3RhcnQpLCBlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgdGhpcy5vbkJ1dHRvblRvdWNoRW5kKSwgZS5hZGRFdmVudExpc3RlbmVyKCJheGlzbW92ZSIsIHRoaXMub25BeGlzTW92ZWQpLCBlLmFkZEV2ZW50TGlzdGVuZXIoIm1vZGVsLWxvYWRlZCIsIHRoaXMub25Nb2RlbExvYWRlZCksIHRoaXMuY29udHJvbGxlckV2ZW50c0FjdGl2ZSA9IHRydWU7CiAgfSwgcmVtb3ZlRXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsOwogICAgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJidXR0b25jaGFuZ2VkIiwgdGhpcy5vbkJ1dHRvbkNoYW5nZWQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJ1dHRvbmRvd24iLCB0aGlzLm9uQnV0dG9uRG93biksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYnV0dG9udXAiLCB0aGlzLm9uQnV0dG9uVXApLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCB0aGlzLm9uQnV0dG9uVG91Y2hTdGFydCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCB0aGlzLm9uQnV0dG9uVG91Y2hFbmQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImF4aXNtb3ZlIiwgdGhpcy5vbkF4aXNNb3ZlZCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW9kZWwtbG9hZGVkIiwgdGhpcy5vbk1vZGVsTG9hZGVkKSwgZS5zY2VuZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVudGVyLXZyIiwgdGhpcy5vbkVudGVyVlIpLCBlLnNjZW5lRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXhpdC12ciIsIHRoaXMub25FeGl0VlIpLCB0aGlzLmNvbnRyb2xsZXJFdmVudHNBY3RpdmUgPSBmYWxzZTsKICB9LCBjaGVja0lmQ29udHJvbGxlclByZXNlbnQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmNvbnRyb2xsZXJPYmplY3QzRDsKICAgIGUgJiYgKGUudmlzaWJsZSA9IGZhbHNlKSwgVXIodGhpcywgQ0EsIHsgaGFuZDogdGhpcy5kYXRhLmhhbmQsIGl0ZXJhdGVDb250cm9sbGVyUHJvZmlsZXM6IHRydWUgfSk7CiAgfSwgaW5qZWN0VHJhY2tlZENvbnRyb2xzOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbCwgdDIgPSB0aGlzLmRhdGEsIG4yID0gQ0E7CiAgICBlLnNldEF0dHJpYnV0ZSgidHJhY2tlZC1jb250cm9scyIsIHsgaWQ6IG4yLCBoYW5kOiB0Mi5oYW5kLCBoYW5kVHJhY2tpbmdFbmFibGVkOiBmYWxzZSwgaXRlcmF0ZUNvbnRyb2xsZXJQcm9maWxlczogdHJ1ZSwgb3JpZW50YXRpb25PZmZzZXQ6IHQyLm9yaWVudGF0aW9uT2Zmc2V0IH0pLCB0aGlzLmxvYWRNb2RlbCgpOwogIH0sIGxvYWRNb2RlbDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuY29udHJvbGxlck9iamVjdDNEOwogICAgaWYgKHRoaXMuZGF0YS5tb2RlbCkKICAgICAgcmV0dXJuIGUgPyAoZS52aXNpYmxlID0gdGhpcy5lbC5zY2VuZUVsLmlzKCJ2ci1tb2RlIiksIHZvaWQgdGhpcy5lbC5zZXRPYmplY3QzRCgibWVzaCIsIGUpKSA6IHZvaWQgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoImdsdGYtbW9kZWwiLCB2QSArICJsb2dpdGVjaC1teC1pbmsuZ2xiIik7CiAgfSwgYWRkQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsLnNjZW5lRWwuYWRkRXZlbnRMaXN0ZW5lcigiY29udHJvbGxlcnN1cGRhdGVkIiwgdGhpcy5vbkNvbnRyb2xsZXJzVXBkYXRlLCBmYWxzZSk7CiAgfSwgcmVtb3ZlQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsLnNjZW5lRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udHJvbGxlcnN1cGRhdGVkIiwgdGhpcy5vbkNvbnRyb2xsZXJzVXBkYXRlLCBmYWxzZSk7CiAgfSwgb25Db250cm9sbGVyc1VwZGF0ZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudCgpOwogIH0sIG9uQnV0dG9uQ2hhbmdlZDogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiA9IHRoaXMubWFwcGluZ1t0aGlzLmRhdGEuaGFuZF0uYnV0dG9uc1tlLmRldGFpbC5pZF07CiAgICBuMiAmJiAobjIgPT09ICJ0cmlnZ2VyIiAmJiAodDIgPSBlLmRldGFpbC5zdGF0ZS52YWx1ZSwgY29uc29sZS5sb2coImFuYWxvZyB2YWx1ZSBvZiB0cmlnZ2VyIHByZXNzOiAiICsgdDIpKSwgdGhpcy5lbC5lbWl0KG4yICsgImNoYW5nZWQiLCBlLmRldGFpbC5zdGF0ZSkpOwogIH0sIG9uTW9kZWxMb2FkZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIGUudGFyZ2V0ID09PSB0aGlzLmVsICYmIHRoaXMuZGF0YS5tb2RlbCAmJiAodGhpcy5lbC5lbWl0KCJjb250cm9sbGVybW9kZWxyZWFkeSIsIHsgbmFtZTogImxvZ2l0ZWNoLW14LWluay1jb250cm9scyIsIG1vZGVsOiB0aGlzLmRhdGEubW9kZWwsIHJheU9yaWdpbjogbmV3IFJlLlZlY3RvcjMoMCwgMCwgMCkgfSksIHRoaXMuY29udHJvbGxlck9iamVjdDNEID0gdGhpcy5lbC5nZXRPYmplY3QzRCgibWVzaCIpLCB0aGlzLmNvbnRyb2xsZXJPYmplY3QzRC52aXNpYmxlID0gdGhpcy5lbC5zY2VuZUVsLmlzKCJ2ci1tb2RlIikpOwogIH0sIG9uQXhpc01vdmVkOiBmdW5jdGlvbihlKSB7CiAgICBHcih0aGlzLCB0aGlzLm1hcHBpbmcuYXhlcywgZSk7CiAgfSB9KSwgTWF0aC5QSSAvIDIpOwogIGJBID0gKGNzKCJsb29rLWNvbnRyb2xzIiwgeyBkZXBlbmRlbmNpZXM6IFsicG9zaXRpb24iLCAicm90YXRpb24iXSwgc2NoZW1hOiB7IGVuYWJsZWQ6IHsgZGVmYXVsdDogdHJ1ZSB9LCBtYWdpY1dpbmRvd1RyYWNraW5nRW5hYmxlZDogeyBkZWZhdWx0OiB0cnVlIH0sIHBvaW50ZXJMb2NrRW5hYmxlZDogeyBkZWZhdWx0OiBmYWxzZSB9LCByZXZlcnNlTW91c2VEcmFnOiB7IGRlZmF1bHQ6IGZhbHNlIH0sIHJldmVyc2VUb3VjaERyYWc6IHsgZGVmYXVsdDogZmFsc2UgfSwgdG91Y2hFbmFibGVkOiB7IGRlZmF1bHQ6IHRydWUgfSwgbW91c2VFbmFibGVkOiB7IGRlZmF1bHQ6IHRydWUgfSB9LCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZGVsdGFZYXcgPSAwLCB0aGlzLnByZXZpb3VzSE1EUG9zaXRpb24gPSBuZXcgUmUuVmVjdG9yMywgdGhpcy5obWRRdWF0ZXJuaW9uID0gbmV3IFJlLlF1YXRlcm5pb24sIHRoaXMubWFnaWNXaW5kb3dBYnNvbHV0ZUV1bGVyID0gbmV3IFJlLkV1bGVyLCB0aGlzLm1hZ2ljV2luZG93RGVsdGFFdWxlciA9IG5ldyBSZS5FdWxlciwgdGhpcy5wb3NpdGlvbiA9IG5ldyBSZS5WZWN0b3IzLCB0aGlzLm1hZ2ljV2luZG93T2JqZWN0ID0gbmV3IFJlLk9iamVjdDNELCB0aGlzLnJvdGF0aW9uID0ge30sIHRoaXMuZGVsdGFSb3RhdGlvbiA9IHt9LCB0aGlzLnNhdmVkUG9zZSA9IG51bGwsIHRoaXMucG9pbnRlckxvY2tlZCA9IGZhbHNlLCB0aGlzLnNldHVwTW91c2VDb250cm9scygpLCB0aGlzLmJpbmRNZXRob2RzKCksIHRoaXMucHJldmlvdXNNb3VzZUV2ZW50ID0ge30sIHRoaXMuc2V0dXBNYWdpY1dpbmRvd0NvbnRyb2xzKCksIHRoaXMuc2F2ZWRQb3NlID0geyBwb3NpdGlvbjogbmV3IFJlLlZlY3RvcjMsIHJvdGF0aW9uOiBuZXcgUmUuRXVsZXIgfSwgKHRoaXMuZWwuc2NlbmVFbC5pcygidnItbW9kZSIpIHx8IHRoaXMuZWwuc2NlbmVFbC5pcygiYXItbW9kZSIpKSAmJiB0aGlzLm9uRW50ZXJWUigpOwogIH0sIHNldHVwTWFnaWNXaW5kb3dDb250cm9sczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSwgdDIgPSB0aGlzLmRhdGE7CiAgICAoU2koKSB8fCBGaSgpKSAmJiAoZSA9IHRoaXMubWFnaWNXaW5kb3dDb250cm9scyA9IG5ldyBhaSh0aGlzLm1hZ2ljV2luZG93T2JqZWN0KSwgdHlwZW9mIERldmljZU9yaWVudGF0aW9uRXZlbnQgIT0gInVuZGVmaW5lZCIgJiYgRGV2aWNlT3JpZW50YXRpb25FdmVudC5yZXF1ZXN0UGVybWlzc2lvbiAmJiAoZS5lbmFibGVkID0gZmFsc2UsIHRoaXMuZWwuc2NlbmVFbC5jb21wb25lbnRzWyJkZXZpY2Utb3JpZW50YXRpb24tcGVybWlzc2lvbi11aSJdLnBlcm1pc3Npb25HcmFudGVkID8gZS5lbmFibGVkID0gdDIubWFnaWNXaW5kb3dUcmFja2luZ0VuYWJsZWQgOiB0aGlzLmVsLnNjZW5lRWwuYWRkRXZlbnRMaXN0ZW5lcigiZGV2aWNlb3JpZW50YXRpb25wZXJtaXNzaW9uZ3JhbnRlZCIsIGZ1bmN0aW9uKCkgewogICAgICBlLmVuYWJsZWQgPSB0Mi5tYWdpY1dpbmRvd1RyYWNraW5nRW5hYmxlZDsKICAgIH0pKSk7CiAgfSwgdXBkYXRlOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSB0aGlzLmRhdGE7CiAgICB0Mi5lbmFibGVkICE9PSBlLmVuYWJsZWQgJiYgdGhpcy51cGRhdGVHcmFiQ3Vyc29yKHQyLmVuYWJsZWQpLCBlICYmICF0Mi5tYWdpY1dpbmRvd1RyYWNraW5nRW5hYmxlZCAmJiBlLm1hZ2ljV2luZG93VHJhY2tpbmdFbmFibGVkICYmICh0aGlzLm1hZ2ljV2luZG93QWJzb2x1dGVFdWxlci5zZXQoMCwgMCwgMCksIHRoaXMubWFnaWNXaW5kb3dEZWx0YUV1bGVyLnNldCgwLCAwLCAwKSksIHRoaXMubWFnaWNXaW5kb3dDb250cm9scyAmJiAodGhpcy5tYWdpY1dpbmRvd0NvbnRyb2xzLmVuYWJsZWQgPSB0Mi5tYWdpY1dpbmRvd1RyYWNraW5nRW5hYmxlZCksIGUgJiYgIXQyLnBvaW50ZXJMb2NrRW5hYmxlZCAhPT0gZS5wb2ludGVyTG9ja0VuYWJsZWQgJiYgKHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSwgdGhpcy5hZGRFdmVudExpc3RlbmVycygpLCB0aGlzLnBvaW50ZXJMb2NrZWQgJiYgdGhpcy5leGl0UG9pbnRlckxvY2soKSk7CiAgfSwgdGljazogZnVuY3Rpb24oZSkgewogICAgdGhpcy5kYXRhLmVuYWJsZWQgJiYgdGhpcy51cGRhdGVPcmllbnRhdGlvbigpOwogIH0sIHBsYXk6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5hZGRFdmVudExpc3RlbmVycygpOwogIH0sIHBhdXNlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSwgdGhpcy5wb2ludGVyTG9ja2VkICYmIHRoaXMuZXhpdFBvaW50ZXJMb2NrKCk7CiAgfSwgcmVtb3ZlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSwgdGhpcy5wb2ludGVyTG9ja2VkICYmIHRoaXMuZXhpdFBvaW50ZXJMb2NrKCk7CiAgfSwgYmluZE1ldGhvZHM6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5vbk1vdXNlRG93biA9IHRoaXMub25Nb3VzZURvd24uYmluZCh0aGlzKSwgdGhpcy5vbk1vdXNlTW92ZSA9IHRoaXMub25Nb3VzZU1vdmUuYmluZCh0aGlzKSwgdGhpcy5vbk1vdXNlVXAgPSB0aGlzLm9uTW91c2VVcC5iaW5kKHRoaXMpLCB0aGlzLm9uVG91Y2hTdGFydCA9IHRoaXMub25Ub3VjaFN0YXJ0LmJpbmQodGhpcyksIHRoaXMub25Ub3VjaE1vdmUgPSB0aGlzLm9uVG91Y2hNb3ZlLmJpbmQodGhpcyksIHRoaXMub25Ub3VjaEVuZCA9IHRoaXMub25Ub3VjaEVuZC5iaW5kKHRoaXMpLCB0aGlzLm9uRW50ZXJWUiA9IHRoaXMub25FbnRlclZSLmJpbmQodGhpcyksIHRoaXMub25FeGl0VlIgPSB0aGlzLm9uRXhpdFZSLmJpbmQodGhpcyksIHRoaXMub25Qb2ludGVyTG9ja0NoYW5nZSA9IHRoaXMub25Qb2ludGVyTG9ja0NoYW5nZS5iaW5kKHRoaXMpLCB0aGlzLm9uUG9pbnRlckxvY2tFcnJvciA9IHRoaXMub25Qb2ludGVyTG9ja0Vycm9yLmJpbmQodGhpcyk7CiAgfSwgc2V0dXBNb3VzZUNvbnRyb2xzOiBmdW5jdGlvbigpIHsKICAgIHRoaXMubW91c2VEb3duID0gZmFsc2UsIHRoaXMucGl0Y2hPYmplY3QgPSBuZXcgUmUuT2JqZWN0M0QsIHRoaXMueWF3T2JqZWN0ID0gbmV3IFJlLk9iamVjdDNELCB0aGlzLnlhd09iamVjdC5wb3NpdGlvbi55ID0gMTAsIHRoaXMueWF3T2JqZWN0LmFkZCh0aGlzLnBpdGNoT2JqZWN0KTsKICB9LCBhZGRFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWwuc2NlbmVFbCwgdDIgPSBlLmNhbnZhczsKICAgIHQyID8gKHQyLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsIHRoaXMub25Nb3VzZURvd24sIGZhbHNlKSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMub25Nb3VzZU1vdmUsIGZhbHNlKSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCB0aGlzLm9uTW91c2VVcCwgZmFsc2UpLCB0Mi5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgdGhpcy5vblRvdWNoU3RhcnQsIHsgcGFzc2l2ZTogdHJ1ZSB9KSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsIHRoaXMub25Ub3VjaE1vdmUsIHsgcGFzc2l2ZTogdHJ1ZSB9KSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgdGhpcy5vblRvdWNoRW5kLCB7IHBhc3NpdmU6IHRydWUgfSksIGUuYWRkRXZlbnRMaXN0ZW5lcigiZW50ZXItdnIiLCB0aGlzLm9uRW50ZXJWUiksIGUuYWRkRXZlbnRMaXN0ZW5lcigiZXhpdC12ciIsIHRoaXMub25FeGl0VlIpLCB0aGlzLmRhdGEucG9pbnRlckxvY2tFbmFibGVkICYmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybG9ja2NoYW5nZSIsIHRoaXMub25Qb2ludGVyTG9ja0NoYW5nZSwgZmFsc2UpLCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3pwb2ludGVybG9ja2NoYW5nZSIsIHRoaXMub25Qb2ludGVyTG9ja0NoYW5nZSwgZmFsc2UpLCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybG9ja2Vycm9yIiwgdGhpcy5vblBvaW50ZXJMb2NrRXJyb3IsIGZhbHNlKSkpIDogZS5hZGRFdmVudExpc3RlbmVyKCJyZW5kZXItdGFyZ2V0LWxvYWRlZCIsIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMuYmluZCh0aGlzKSk7CiAgfSwgcmVtb3ZlRXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsLnNjZW5lRWwsIHQyID0gZSAmJiBlLmNhbnZhczsKICAgIHQyICYmICh0Mi5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLCB0aGlzLm9uTW91c2VEb3duKSwgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMub25Nb3VzZU1vdmUpLCB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIHRoaXMub25Nb3VzZVVwKSwgdDIucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIHRoaXMub25Ub3VjaFN0YXJ0KSwgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsIHRoaXMub25Ub3VjaE1vdmUpLCB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCB0aGlzLm9uVG91Y2hFbmQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVudGVyLXZyIiwgdGhpcy5vbkVudGVyVlIpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImV4aXQtdnIiLCB0aGlzLm9uRXhpdFZSKSwgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmxvY2tjaGFuZ2UiLCB0aGlzLm9uUG9pbnRlckxvY2tDaGFuZ2UsIGZhbHNlKSwgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW96cG9pbnRlcmxvY2tjaGFuZ2UiLCB0aGlzLm9uUG9pbnRlckxvY2tDaGFuZ2UsIGZhbHNlKSwgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmxvY2tlcnJvciIsIHRoaXMub25Qb2ludGVyTG9ja0Vycm9yLCBmYWxzZSkpOwogIH0sIHVwZGF0ZU9yaWVudGF0aW9uOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbC5vYmplY3QzRCwgdDIgPSB0aGlzLnBpdGNoT2JqZWN0LCBuMiA9IHRoaXMueWF3T2JqZWN0LCBpMiA9IHRoaXMuZWwuc2NlbmVFbDsKICAgIChpMi5pcygidnItbW9kZSIpIHx8IGkyLmlzKCJhci1tb2RlIikpICYmIGkyLmNoZWNrSGVhZHNldENvbm5lY3RlZCgpIHx8ICh0aGlzLnVwZGF0ZU1hZ2ljV2luZG93T3JpZW50YXRpb24oKSwgZS5yb3RhdGlvbi54ID0gdGhpcy5tYWdpY1dpbmRvd0RlbHRhRXVsZXIueCArIHQyLnJvdGF0aW9uLngsIGUucm90YXRpb24ueSA9IHRoaXMubWFnaWNXaW5kb3dEZWx0YUV1bGVyLnkgKyBuMi5yb3RhdGlvbi55LCBlLnJvdGF0aW9uLnogPSB0aGlzLm1hZ2ljV2luZG93RGVsdGFFdWxlci56KTsKICB9LCB1cGRhdGVNYWdpY1dpbmRvd09yaWVudGF0aW9uOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5tYWdpY1dpbmRvd0Fic29sdXRlRXVsZXIsIHQyID0gdGhpcy5tYWdpY1dpbmRvd0RlbHRhRXVsZXI7CiAgICB0aGlzLm1hZ2ljV2luZG93Q29udHJvbHMgJiYgdGhpcy5tYWdpY1dpbmRvd0NvbnRyb2xzLmVuYWJsZWQgJiYgKHRoaXMubWFnaWNXaW5kb3dDb250cm9scy51cGRhdGUoKSwgZS5zZXRGcm9tUXVhdGVybmlvbih0aGlzLm1hZ2ljV2luZG93T2JqZWN0LnF1YXRlcm5pb24sICJZWFoiKSwgdGhpcy5wcmV2aW91c01hZ2ljV2luZG93WWF3IHx8IGUueSA9PT0gMCB8fCAodGhpcy5wcmV2aW91c01hZ2ljV2luZG93WWF3ID0gZS55KSwgdGhpcy5wcmV2aW91c01hZ2ljV2luZG93WWF3ICYmICh0Mi54ID0gZS54LCB0Mi55ICs9IGUueSAtIHRoaXMucHJldmlvdXNNYWdpY1dpbmRvd1lhdywgdDIueiA9IGUueiwgdGhpcy5wcmV2aW91c01hZ2ljV2luZG93WWF3ID0gZS55KSk7CiAgfSwgb25Nb3VzZU1vdmU6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjIsIGkyLCByMiA9IHRoaXMucGl0Y2hPYmplY3QsIG8yID0gdGhpcy5wcmV2aW91c01vdXNlRXZlbnQsIHMyID0gdGhpcy55YXdPYmplY3Q7CiAgICB0aGlzLmRhdGEuZW5hYmxlZCAmJiAodGhpcy5tb3VzZURvd24gfHwgdGhpcy5wb2ludGVyTG9ja2VkKSAmJiAodGhpcy5wb2ludGVyTG9ja2VkID8gKG4yID0gZS5tb3ZlbWVudFggfHwgZS5tb3pNb3ZlbWVudFggfHwgMCwgaTIgPSBlLm1vdmVtZW50WSB8fCBlLm1vek1vdmVtZW50WSB8fCAwKSA6IChuMiA9IGUuc2NyZWVuWCAtIG8yLnNjcmVlblgsIGkyID0gZS5zY3JlZW5ZIC0gbzIuc2NyZWVuWSksIHRoaXMucHJldmlvdXNNb3VzZUV2ZW50LnNjcmVlblggPSBlLnNjcmVlblgsIHRoaXMucHJldmlvdXNNb3VzZUV2ZW50LnNjcmVlblkgPSBlLnNjcmVlblksIHQyID0gdGhpcy5kYXRhLnJldmVyc2VNb3VzZURyYWcgPyAxIDogLTEsIHMyLnJvdGF0aW9uLnkgKz0gMC4wMDIgKiBuMiAqIHQyLCByMi5yb3RhdGlvbi54ICs9IDAuMDAyICogaTIgKiB0MiwgcjIucm90YXRpb24ueCA9IE1hdGgubWF4KC1CQSwgTWF0aC5taW4oQkEsIHIyLnJvdGF0aW9uLngpKSk7CiAgfSwgb25Nb3VzZURvd246IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IHRoaXMuZWwuc2NlbmVFbDsKICAgIGlmICh0aGlzLmRhdGEuZW5hYmxlZCAmJiB0aGlzLmRhdGEubW91c2VFbmFibGVkICYmICghdDIuaXMoInZyLW1vZGUiKSAmJiAhdDIuaXMoImFyLW1vZGUiKSB8fCAhdDIuY2hlY2tIZWFkc2V0Q29ubmVjdGVkKCkpICYmIGUuYnV0dG9uID09PSAwKSB7CiAgICAgIHZhciBuMiA9IHQyICYmIHQyLmNhbnZhczsKICAgICAgdGhpcy5tb3VzZURvd24gPSB0cnVlLCB0aGlzLnByZXZpb3VzTW91c2VFdmVudC5zY3JlZW5YID0gZS5zY3JlZW5YLCB0aGlzLnByZXZpb3VzTW91c2VFdmVudC5zY3JlZW5ZID0gZS5zY3JlZW5ZLCB0aGlzLnNob3dHcmFiYmluZ0N1cnNvcigpLCB0aGlzLmRhdGEucG9pbnRlckxvY2tFbmFibGVkICYmICF0aGlzLnBvaW50ZXJMb2NrZWQgJiYgKG4yLnJlcXVlc3RQb2ludGVyTG9jayA/IG4yLnJlcXVlc3RQb2ludGVyTG9jaygpIDogbjIubW96UmVxdWVzdFBvaW50ZXJMb2NrICYmIG4yLm1velJlcXVlc3RQb2ludGVyTG9jaygpKTsKICAgIH0KICB9LCBzaG93R3JhYmJpbmdDdXJzb3I6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5zY2VuZUVsLmNhbnZhcy5zdHlsZS5jdXJzb3IgPSAiZ3JhYmJpbmciOwogIH0sIGhpZGVHcmFiYmluZ0N1cnNvcjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsLnNjZW5lRWwuY2FudmFzLnN0eWxlLmN1cnNvciA9ICIiOwogIH0sIG9uTW91c2VVcDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1vdXNlRG93biA9IGZhbHNlLCB0aGlzLmhpZGVHcmFiYmluZ0N1cnNvcigpOwogIH0sIG9uVG91Y2hTdGFydDogZnVuY3Rpb24oZSkgewogICAgZS50b3VjaGVzLmxlbmd0aCAhPT0gMSB8fCAhdGhpcy5kYXRhLnRvdWNoRW5hYmxlZCB8fCB0aGlzLmVsLnNjZW5lRWwuaXMoInZyLW1vZGUiKSB8fCB0aGlzLmVsLnNjZW5lRWwuaXMoImFyLW1vZGUiKSB8fCAodGhpcy50b3VjaFN0YXJ0ID0geyB4OiBlLnRvdWNoZXNbMF0ucGFnZVgsIHk6IGUudG91Y2hlc1swXS5wYWdlWSB9LCB0aGlzLnRvdWNoU3RhcnRlZCA9IHRydWUpOwogIH0sIG9uVG91Y2hNb3ZlOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIsIG4yLCBpMiA9IHRoaXMuZWwuc2NlbmVFbC5jYW52YXMsIHIyID0gdGhpcy55YXdPYmplY3Q7CiAgICB0aGlzLnRvdWNoU3RhcnRlZCAmJiB0aGlzLmRhdGEudG91Y2hFbmFibGVkICYmIChuMiA9IDIgKiBNYXRoLlBJICogKGUudG91Y2hlc1swXS5wYWdlWCAtIHRoaXMudG91Y2hTdGFydC54KSAvIGkyLmNsaWVudFdpZHRoLCB0MiA9IHRoaXMuZGF0YS5yZXZlcnNlVG91Y2hEcmFnID8gMSA6IC0xLCByMi5yb3RhdGlvbi55IC09IDAuNSAqIG4yICogdDIsIHRoaXMudG91Y2hTdGFydCA9IHsgeDogZS50b3VjaGVzWzBdLnBhZ2VYLCB5OiBlLnRvdWNoZXNbMF0ucGFnZVkgfSk7CiAgfSwgb25Ub3VjaEVuZDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnRvdWNoU3RhcnRlZCA9IGZhbHNlOwogIH0sIG9uRW50ZXJWUjogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWwuc2NlbmVFbDsKICAgIGUuY2hlY2tIZWFkc2V0Q29ubmVjdGVkKCkgJiYgKHRoaXMuc2F2ZUNhbWVyYVBvc2UoKSwgdGhpcy5lbC5vYmplY3QzRC5wb3NpdGlvbi5zZXQoMCwgMCwgMCksIHRoaXMuZWwub2JqZWN0M0Qucm90YXRpb24uc2V0KDAsIDAsIDApLCBlLmhhc1dlYlhSICYmICh0aGlzLmVsLm9iamVjdDNELm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZSwgdGhpcy5lbC5vYmplY3QzRC51cGRhdGVNYXRyaXgoKSkpOwogIH0sIG9uRXhpdFZSOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuc2NlbmVFbC5jaGVja0hlYWRzZXRDb25uZWN0ZWQoKSAmJiAodGhpcy5yZXN0b3JlQ2FtZXJhUG9zZSgpLCB0aGlzLnByZXZpb3VzSE1EUG9zaXRpb24uc2V0KDAsIDAsIDApLCB0aGlzLmVsLm9iamVjdDNELm1hdHJpeEF1dG9VcGRhdGUgPSB0cnVlKTsKICB9LCBvblBvaW50ZXJMb2NrQ2hhbmdlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucG9pbnRlckxvY2tlZCA9ICEoIWRvY3VtZW50LnBvaW50ZXJMb2NrRWxlbWVudCAmJiAhZG9jdW1lbnQubW96UG9pbnRlckxvY2tFbGVtZW50KTsKICB9LCBvblBvaW50ZXJMb2NrRXJyb3I6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wb2ludGVyTG9ja2VkID0gZmFsc2U7CiAgfSwgZXhpdFBvaW50ZXJMb2NrOiBmdW5jdGlvbigpIHsKICAgIGRvY3VtZW50LmV4aXRQb2ludGVyTG9jaygpLCB0aGlzLnBvaW50ZXJMb2NrZWQgPSBmYWxzZTsKICB9LCB1cGRhdGVHcmFiQ3Vyc29yOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSB0aGlzLmVsLnNjZW5lRWw7CiAgICBmdW5jdGlvbiBuMigpIHsKICAgICAgdDIuY2FudmFzLmNsYXNzTGlzdC5hZGQoImEtZ3JhYi1jdXJzb3IiKTsKICAgIH0KICAgIGZ1bmN0aW9uIGkyKCkgewogICAgICB0Mi5jYW52YXMuY2xhc3NMaXN0LnJlbW92ZSgiYS1ncmFiLWN1cnNvciIpOwogICAgfQogICAgdDIuY2FudmFzID8gZSA/IG4yKCkgOiBpMigpIDogZSA/IHQyLmFkZEV2ZW50TGlzdGVuZXIoInJlbmRlci10YXJnZXQtbG9hZGVkIiwgbjIpIDogdDIuYWRkRXZlbnRMaXN0ZW5lcigicmVuZGVyLXRhcmdldC1sb2FkZWQiLCBpMik7CiAgfSwgc2F2ZUNhbWVyYVBvc2U6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsOwogICAgdGhpcy5zYXZlZFBvc2UucG9zaXRpb24uY29weShlLm9iamVjdDNELnBvc2l0aW9uKSwgdGhpcy5zYXZlZFBvc2Uucm90YXRpb24uY29weShlLm9iamVjdDNELnJvdGF0aW9uKSwgdGhpcy5oYXNTYXZlZFBvc2UgPSB0cnVlOwogIH0sIHJlc3RvcmVDYW1lcmFQb3NlOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbCwgdDIgPSB0aGlzLnNhdmVkUG9zZTsKICAgIHRoaXMuaGFzU2F2ZWRQb3NlICYmIChlLm9iamVjdDNELnBvc2l0aW9uLmNvcHkodDIucG9zaXRpb24pLCBlLm9iamVjdDNELnJvdGF0aW9uLmNvcHkodDIucm90YXRpb24pLCB0aGlzLmhhc1NhdmVkUG9zZSA9IGZhbHNlKTsKICB9IH0pLCAibWFnaWNsZWFwLW9uZSIpOwogIHlBID0gY2kgKyAiY29udHJvbGxlcnMvbWFnaWNsZWFwL21hZ2ljbGVhcC1vbmUtY29udHJvbGxlci5nbGIiOwogIElBID0gKGNzKCJtYWdpY2xlYXAtY29udHJvbHMiLCB7IHNjaGVtYTogeyBoYW5kOiB7IGRlZmF1bHQ6ICJub25lIiB9LCBtb2RlbDogeyBkZWZhdWx0OiB0cnVlIH0gfSwgbWFwcGluZzogeyBheGVzOiB7IHRvdWNocGFkOiBbMCwgMV0gfSwgYnV0dG9uczogWyJ0cmlnZ2VyIiwgImdyaXAiLCAidG91Y2hwYWQiLCAibWVudSJdIH0sIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzOwogICAgdGhpcy5jb250cm9sbGVyUHJlc2VudCA9IGZhbHNlLCB0aGlzLm9uQnV0dG9uQ2hhbmdlZCA9IHRoaXMub25CdXR0b25DaGFuZ2VkLmJpbmQodGhpcyksIHRoaXMub25CdXR0b25Eb3duID0gZnVuY3Rpb24odDIpIHsKICAgICAgTnIodDIuZGV0YWlsLmlkLCAiZG93biIsIGUpOwogICAgfSwgdGhpcy5vbkJ1dHRvblVwID0gZnVuY3Rpb24odDIpIHsKICAgICAgTnIodDIuZGV0YWlsLmlkLCAidXAiLCBlKTsKICAgIH0sIHRoaXMub25CdXR0b25Ub3VjaEVuZCA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgInRvdWNoZW5kIiwgZSk7CiAgICB9LCB0aGlzLm9uQnV0dG9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgInRvdWNoc3RhcnQiLCBlKTsKICAgIH0sIHRoaXMucHJldmlvdXNCdXR0b25WYWx1ZXMgPSB7fSwgdGhpcy5iaW5kTWV0aG9kcygpOwogIH0sIHVwZGF0ZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZGF0YTsKICAgIHRoaXMuY29udHJvbGxlckluZGV4ID0gZS5oYW5kID09PSAicmlnaHQiID8gMCA6IGUuaGFuZCA9PT0gImxlZnQiID8gMSA6IDI7CiAgfSwgcGxheTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudCgpLCB0aGlzLmFkZENvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIoKTsKICB9LCBwYXVzZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCksIHRoaXMucmVtb3ZlQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcigpOwogIH0sIGJpbmRNZXRob2RzOiBmdW5jdGlvbigpIHsKICAgIHRoaXMub25Nb2RlbExvYWRlZCA9IHRoaXMub25Nb2RlbExvYWRlZC5iaW5kKHRoaXMpLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUgPSB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUuYmluZCh0aGlzKSwgdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQgPSB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudC5iaW5kKHRoaXMpLCB0aGlzLnJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIgPSB0aGlzLnJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIuYmluZCh0aGlzKSwgdGhpcy5vbkF4aXNNb3ZlZCA9IHRoaXMub25BeGlzTW92ZWQuYmluZCh0aGlzKTsKICB9LCBhZGRFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWw7CiAgICBlLmFkZEV2ZW50TGlzdGVuZXIoImJ1dHRvbmNoYW5nZWQiLCB0aGlzLm9uQnV0dG9uQ2hhbmdlZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigiYnV0dG9uZG93biIsIHRoaXMub25CdXR0b25Eb3duKSwgZS5hZGRFdmVudExpc3RlbmVyKCJidXR0b251cCIsIHRoaXMub25CdXR0b25VcCksIGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIHRoaXMub25CdXR0b25Ub3VjaFN0YXJ0KSwgZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIHRoaXMub25CdXR0b25Ub3VjaEVuZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigiYXhpc21vdmUiLCB0aGlzLm9uQXhpc01vdmVkKSwgZS5hZGRFdmVudExpc3RlbmVyKCJtb2RlbC1sb2FkZWQiLCB0aGlzLm9uTW9kZWxMb2FkZWQpLCB0aGlzLmNvbnRyb2xsZXJFdmVudHNBY3RpdmUgPSB0cnVlOwogIH0sIHJlbW92ZUV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbDsKICAgIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYnV0dG9uY2hhbmdlZCIsIHRoaXMub25CdXR0b25DaGFuZ2VkKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJidXR0b25kb3duIiwgdGhpcy5vbkJ1dHRvbkRvd24pLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJ1dHRvbnVwIiwgdGhpcy5vbkJ1dHRvblVwKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgdGhpcy5vbkJ1dHRvblRvdWNoU3RhcnQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgdGhpcy5vbkJ1dHRvblRvdWNoRW5kKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJheGlzbW92ZSIsIHRoaXMub25BeGlzTW92ZWQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vZGVsLWxvYWRlZCIsIHRoaXMub25Nb2RlbExvYWRlZCksIHRoaXMuY29udHJvbGxlckV2ZW50c0FjdGl2ZSA9IGZhbHNlOwogIH0sIGNoZWNrSWZDb250cm9sbGVyUHJlc2VudDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZGF0YTsKICAgIFVyKHRoaXMsIGJBLCB7IGluZGV4OiB0aGlzLmNvbnRyb2xsZXJJbmRleCwgaGFuZDogZS5oYW5kIH0pOwogIH0sIGluamVjdFRyYWNrZWRDb250cm9sczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWwsIHQyID0gdGhpcy5kYXRhOwogICAgZS5zZXRBdHRyaWJ1dGUoInRyYWNrZWQtY29udHJvbHMiLCB7IGlkUHJlZml4OiBiQSwgaGFuZDogdDIuaGFuZCwgY29udHJvbGxlcjogdGhpcy5jb250cm9sbGVySW5kZXggfSksIHRoaXMuZGF0YS5tb2RlbCAmJiB0aGlzLmVsLnNldEF0dHJpYnV0ZSgiZ2x0Zi1tb2RlbCIsIHlBKTsKICB9LCBhZGRDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuc2NlbmVFbC5hZGRFdmVudExpc3RlbmVyKCJjb250cm9sbGVyc3VwZGF0ZWQiLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUsIGZhbHNlKTsKICB9LCByZW1vdmVDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuc2NlbmVFbC5yZW1vdmVFdmVudExpc3RlbmVyKCJjb250cm9sbGVyc3VwZGF0ZWQiLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUsIGZhbHNlKTsKICB9LCBvbkNvbnRyb2xsZXJzVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50KCk7CiAgfSwgb25CdXR0b25DaGFuZ2VkOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIsIG4yID0gdGhpcy5tYXBwaW5nLmJ1dHRvbnNbZS5kZXRhaWwuaWRdOwogICAgbjIgJiYgKG4yID09PSAidHJpZ2dlciIgJiYgKHQyID0gZS5kZXRhaWwuc3RhdGUudmFsdWUsIGNvbnNvbGUubG9nKCJhbmFsb2cgdmFsdWUgb2YgdHJpZ2dlciBwcmVzczogIiArIHQyKSksIHRoaXMuZWwuZW1pdChuMiArICJjaGFuZ2VkIiwgZS5kZXRhaWwuc3RhdGUpKTsKICB9LCBvbk1vZGVsTG9hZGVkOiBmdW5jdGlvbihlKSB7CiAgICBlLmRldGFpbC5tb2RlbC5zY2FsZS5zZXQoMC4wMSwgMC4wMSwgMC4wMSk7CiAgfSwgb25BeGlzTW92ZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIEdyKHRoaXMsIHRoaXMubWFwcGluZy5heGVzLCBlKTsKICB9LCB1cGRhdGVNb2RlbDogZnVuY3Rpb24oZSwgdDIpIHt9LCBzZXRCdXR0b25Db2xvcjogZnVuY3Rpb24oZSwgdDIpIHt9IH0pLCBmaSgiY29tcG9uZW50czptYXRlcmlhbDplcnJvciIpKTsKICBjcygibWF0ZXJpYWwiLCB7IHNjaGVtYTogeyBhbHBoYVRlc3Q6IHsgZGVmYXVsdDogMCwgbWluOiAwLCBtYXg6IDEgfSwgZGVwdGhUZXN0OiB7IGRlZmF1bHQ6IHRydWUgfSwgZGVwdGhXcml0ZTogeyBkZWZhdWx0OiB0cnVlIH0sIGZsYXRTaGFkaW5nOiB7IGRlZmF1bHQ6IGZhbHNlIH0sIG5wb3Q6IHsgZGVmYXVsdDogZmFsc2UgfSwgb2Zmc2V0OiB7IHR5cGU6ICJ2ZWMyIiwgZGVmYXVsdDogeyB4OiAwLCB5OiAwIH0gfSwgb3BhY2l0eTogeyBkZWZhdWx0OiAxLCBtaW46IDAsIG1heDogMSB9LCByZXBlYXQ6IHsgdHlwZTogInZlYzIiLCBkZWZhdWx0OiB7IHg6IDEsIHk6IDEgfSB9LCBzaGFkZXI6IHsgZGVmYXVsdDogInN0YW5kYXJkIiwgb25lT2Y6IGVhLCBzY2hlbWFDaGFuZ2U6IHRydWUgfSwgc2lkZTogeyBkZWZhdWx0OiAiZnJvbnQiLCBvbmVPZjogWyJmcm9udCIsICJiYWNrIiwgImRvdWJsZSJdIH0sIHRyYW5zcGFyZW50OiB7IGRlZmF1bHQ6IGZhbHNlIH0sIHZlcnRleENvbG9yc0VuYWJsZWQ6IHsgZGVmYXVsdDogZmFsc2UgfSwgdmlzaWJsZTogeyBkZWZhdWx0OiB0cnVlIH0sIGJsZW5kaW5nOiB7IGRlZmF1bHQ6ICJub3JtYWwiLCBvbmVPZjogWyJub25lIiwgIm5vcm1hbCIsICJhZGRpdGl2ZSIsICJzdWJ0cmFjdGl2ZSIsICJtdWx0aXBseSJdIH0sIGRpdGhlcmluZzogeyBkZWZhdWx0OiB0cnVlIH0sIGFuaXNvdHJvcHk6IHsgZGVmYXVsdDogMCwgbWluOiAwIH0gfSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1hdGVyaWFsID0gbnVsbDsKICB9LCB1cGRhdGU6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IHRoaXMuZGF0YTsKICAgIHRoaXMuc2hhZGVyICYmIHQyLnNoYWRlciA9PT0gZS5zaGFkZXIgfHwgdGhpcy51cGRhdGVTaGFkZXIodDIuc2hhZGVyKSwgdGhpcy5zaGFkZXIudXBkYXRlKHRoaXMuZGF0YSksIHRoaXMudXBkYXRlTWF0ZXJpYWwoZSk7CiAgfSwgdXBkYXRlU2NoZW1hOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIsIG4yLCBpMiwgcjI7CiAgICBuMiA9IGUgJiYgZS5zaGFkZXIsIHQyID0gdGhpcy5vbGREYXRhICYmIHRoaXMub2xkRGF0YS5zaGFkZXIsIChpMiA9ICRzW3IyID0gbjIgfHwgdDJdICYmICRzW3IyXS5zY2hlbWEpIHx8IElBKCJVbmtub3duIHNoYWRlciBzY2hlbWEgIiArIHIyKSwgdDIgJiYgbjIgPT09IHQyIHx8ICh0aGlzLmV4dGVuZFNjaGVtYShpMiksIHRoaXMudXBkYXRlQmVoYXZpb3IoKSk7CiAgfSwgdXBkYXRlQmVoYXZpb3I6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyLCBuMiA9IHRoaXMuZWwuc2NlbmVFbCwgaTIgPSB0aGlzLnNjaGVtYSwgcjIgPSB0aGlzOwogICAgZnVuY3Rpb24gbzIoZTIsIG4zKSB7CiAgICAgIHZhciBpMzsKICAgICAgZm9yIChpMyBpbiB0MikKICAgICAgICB0MltpM10gPSBlMjsKICAgICAgcjIuc2hhZGVyLnVwZGF0ZSh0Mik7CiAgICB9CiAgICBmb3IgKGUgaW4gdGhpcy50aWNrID0gdW5kZWZpbmVkLCB0MiA9IHt9LCBpMikKICAgICAgaTJbZV0udHlwZSA9PT0gInRpbWUiICYmICh0aGlzLnRpY2sgPSBvMiwgdDJbZV0gPSB0cnVlKTsKICAgIG4yICYmICh0aGlzLnRpY2sgPyBuMi5hZGRCZWhhdmlvcih0aGlzKSA6IG4yLnJlbW92ZUJlaGF2aW9yKHRoaXMpKTsKICB9LCB1cGRhdGVTaGFkZXI6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjIgPSB0aGlzLmRhdGEsIGkyID0gJHNbZV0gJiYgJHNbZV0uU2hhZGVyOwogICAgaWYgKCFpMikKICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHNoYWRlciAiICsgZSk7CiAgICAodDIgPSB0aGlzLnNoYWRlciA9IG5ldyBpMikuZWwgPSB0aGlzLmVsLCB0Mi5pbml0KG4yKSwgdGhpcy5zZXRNYXRlcmlhbCh0Mi5tYXRlcmlhbCksIHRoaXMudXBkYXRlU2NoZW1hKG4yKTsKICB9LCB1cGRhdGVNYXRlcmlhbDogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiA9IHRoaXMuZGF0YSwgaTIgPSB0aGlzLm1hdGVyaWFsOwogICAgZm9yICh0MiBpbiBpMi5hbHBoYVRlc3QgPSBuMi5hbHBoYVRlc3QsIGkyLmRlcHRoVGVzdCA9IG4yLmRlcHRoVGVzdCAhPT0gZmFsc2UsIGkyLmRlcHRoV3JpdGUgPSBuMi5kZXB0aFdyaXRlICE9PSBmYWxzZSwgaTIub3BhY2l0eSA9IG4yLm9wYWNpdHksIGkyLmZsYXRTaGFkaW5nID0gbjIuZmxhdFNoYWRpbmcsIGkyLnNpZGUgPSBmdW5jdGlvbihlMikgewogICAgICBzd2l0Y2ggKGUyKSB7CiAgICAgICAgY2FzZSAiYmFjayI6CiAgICAgICAgICByZXR1cm4gUmUuQmFja1NpZGU7CiAgICAgICAgY2FzZSAiZG91YmxlIjoKICAgICAgICAgIHJldHVybiBSZS5Eb3VibGVTaWRlOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gUmUuRnJvbnRTaWRlOwogICAgICB9CiAgICB9KG4yLnNpZGUpLCBpMi50cmFuc3BhcmVudCA9IG4yLnRyYW5zcGFyZW50ICE9PSBmYWxzZSB8fCBuMi5vcGFjaXR5IDwgMSwgaTIudmVydGV4Q29sb3JzID0gbjIudmVydGV4Q29sb3JzRW5hYmxlZCwgaTIudmlzaWJsZSA9IG4yLnZpc2libGUsIGkyLmJsZW5kaW5nID0gZnVuY3Rpb24oZTIpIHsKICAgICAgc3dpdGNoIChlMikgewogICAgICAgIGNhc2UgIm5vbmUiOgogICAgICAgICAgcmV0dXJuIFJlLk5vQmxlbmRpbmc7CiAgICAgICAgY2FzZSAiYWRkaXRpdmUiOgogICAgICAgICAgcmV0dXJuIFJlLkFkZGl0aXZlQmxlbmRpbmc7CiAgICAgICAgY2FzZSAic3VidHJhY3RpdmUiOgogICAgICAgICAgcmV0dXJuIFJlLlN1YnRyYWN0aXZlQmxlbmRpbmc7CiAgICAgICAgY2FzZSAibXVsdGlwbHkiOgogICAgICAgICAgcmV0dXJuIFJlLk11bHRpcGx5QmxlbmRpbmc7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiBSZS5Ob3JtYWxCbGVuZGluZzsKICAgICAgfQogICAgfShuMi5ibGVuZGluZyksIGkyLmRpdGhlcmluZyA9IG4yLmRpdGhlcmluZywgZSkKICAgICAgYnJlYWs7CiAgICAhdDIgfHwgZS5hbHBoYVRlc3QgPT09IG4yLmFscGhhVGVzdCAmJiBlLnNpZGUgPT09IG4yLnNpZGUgJiYgZS52ZXJ0ZXhDb2xvcnNFbmFibGVkID09PSBuMi52ZXJ0ZXhDb2xvcnNFbmFibGVkIHx8IChpMi5uZWVkc1VwZGF0ZSA9IHRydWUpOwogIH0sIHJlbW92ZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IG5ldyBSZS5NZXNoQmFzaWNNYXRlcmlhbCwgdDIgPSB0aGlzLm1hdGVyaWFsLCBuMiA9IHRoaXMuZWwuZ2V0T2JqZWN0M0QoIm1lc2giKTsKICAgIG4yICYmIChuMi5tYXRlcmlhbCA9IGUpLCB3QSh0MiwgdGhpcy5zeXN0ZW0pOwogIH0sIHNldE1hdGVyaWFsOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIsIG4yID0gdGhpcy5lbCwgaTIgPSB0aGlzLnN5c3RlbTsKICAgIHRoaXMubWF0ZXJpYWwgJiYgd0EodGhpcy5tYXRlcmlhbCwgaTIpLCB0aGlzLm1hdGVyaWFsID0gZSwgaTIucmVnaXN0ZXJNYXRlcmlhbChlKSwgKHQyID0gbjIuZ2V0T2JqZWN0M0QoIm1lc2giKSkgPyB0Mi5tYXRlcmlhbCA9IGUgOiBuMi5hZGRFdmVudExpc3RlbmVyKCJvYmplY3QzZHNldCIsIGZ1bmN0aW9uIHQoaTMpIHsKICAgICAgaTMuZGV0YWlsLnR5cGUgPT09ICJtZXNoIiAmJiBpMy50YXJnZXQgPT09IG4yICYmIChuMi5nZXRPYmplY3QzRCgibWVzaCIpLm1hdGVyaWFsID0gZSwgbjIucmVtb3ZlRXZlbnRMaXN0ZW5lcigib2JqZWN0M2RzZXQiLCB0KSk7CiAgICB9KTsKICB9IH0pOwogIGtBID0gY2kgKyAiY29udHJvbGxlcnMvb2N1bHVzL29jdWx1cy10b3VjaC1jb250cm9sbGVyLSI7CiAgVEEgPSBjaSArICJjb250cm9sbGVycy9tZXRhLyI7CiAgUkEgPSB7IGxlZnQ6IHsgbW9kZWxVcmw6IGtBICsgImxlZnQuZ2x0ZiIsIHJheU9yaWdpbjogeyBvcmlnaW46IHsgeDogMC4wMDIsIHk6IC0wLjAwNSwgejogLTAuMDMgfSwgZGlyZWN0aW9uOiB7IHg6IDAsIHk6IC0wLjgsIHo6IC0xIH0gfSwgbW9kZWxQaXZvdE9mZnNldDogbmV3IFJlLlZlY3RvcjMoLTAuMDA1LCAwLjAzNiwgLTAuMDM3KSwgbW9kZWxQaXZvdFJvdGF0aW9uOiBuZXcgUmUuRXVsZXIoTWF0aC5QSSAvIDQuNSwgMCwgMCkgfSwgcmlnaHQ6IHsgbW9kZWxVcmw6IGtBICsgInJpZ2h0LmdsdGYiLCByYXlPcmlnaW46IHsgb3JpZ2luOiB7IHg6IC0wLjAwMiwgeTogLTAuMDA1LCB6OiAtMC4wMyB9LCBkaXJlY3Rpb246IHsgeDogMCwgeTogLTAuOCwgejogLTEgfSB9LCBtb2RlbFBpdm90T2Zmc2V0OiBuZXcgUmUuVmVjdG9yMygwLjAwNSwgMC4wMzYsIC0wLjAzNyksIG1vZGVsUGl2b3RSb3RhdGlvbjogbmV3IFJlLkV1bGVyKE1hdGguUEkgLyA0LjUsIDAsIDApIH0gfTsKICBVQSA9IHsgIm9jdWx1cy10b3VjaCI6IFJBLCAib2N1bHVzLXRvdWNoLXYyIjogeyBsZWZ0OiB7IG1vZGVsVXJsOiBrQSArICJnZW4yLWxlZnQuZ2x0ZiIsIHJheU9yaWdpbjogeyBvcmlnaW46IHsgeDogLTAuMDA2LCB5OiAtMC4wMywgejogLTAuMDQgfSwgZGlyZWN0aW9uOiB7IHg6IDAsIHk6IC0wLjksIHo6IC0xIH0gfSwgbW9kZWxQaXZvdE9mZnNldDogbmV3IFJlLlZlY3RvcjMoMCwgLTAuMDA3LCAtMC4wMjEpLCBtb2RlbFBpdm90Um90YXRpb246IG5ldyBSZS5FdWxlcigtTWF0aC5QSSAvIDQsIDAsIDApIH0sIHJpZ2h0OiB7IG1vZGVsVXJsOiBrQSArICJnZW4yLXJpZ2h0LmdsdGYiLCByYXlPcmlnaW46IHsgb3JpZ2luOiB7IHg6IDAuMDA2LCB5OiAtMC4wMywgejogLTAuMDQgfSwgZGlyZWN0aW9uOiB7IHg6IDAsIHk6IC0wLjksIHo6IC0xIH0gfSwgbW9kZWxQaXZvdE9mZnNldDogbmV3IFJlLlZlY3RvcjMoMCwgLTAuMDA3LCAtMC4wMjEpLCBtb2RlbFBpdm90Um90YXRpb246IG5ldyBSZS5FdWxlcigtTWF0aC5QSSAvIDQsIDAsIDApIH0gfSwgIm9jdWx1cy10b3VjaC12MyI6IHsgbGVmdDogeyBtb2RlbFVybDoga0EgKyAidjMtbGVmdC5nbGIiLCByYXlPcmlnaW46IHsgb3JpZ2luOiB7IHg6IDAuMDA2NSwgeTogLTAuMDE4NiwgejogLTAuMDUgfSwgZGlyZWN0aW9uOiB7IHg6IDAuMTIzOTQ3ODU4Mzk1MDAxNzUsIHk6IC0wLjU5NDQwNDM2NzIzNDAxNTcsIHo6IC0wLjc5NDU1NjcxNzA1MTk4MTQgfSB9LCBtb2RlbFBpdm90T2Zmc2V0OiBuZXcgUmUuVmVjdG9yMygwLCAwLCAwKSwgbW9kZWxQaXZvdFJvdGF0aW9uOiBuZXcgUmUuRXVsZXIoMCwgMCwgMCkgfSwgcmlnaHQ6IHsgbW9kZWxVcmw6IGtBICsgInYzLXJpZ2h0LmdsYiIsIHJheU9yaWdpbjogeyBvcmlnaW46IHsgeDogLTAuMDA2NSwgeTogLTAuMDE4NiwgejogLTAuMDUgfSwgZGlyZWN0aW9uOiB7IHg6IC0wLjEyMzk0Nzg1ODM5NTAwMTc1LCB5OiAtMC41OTQ0MDQzNjcyMzQwMTU3LCB6OiAtMC43OTQ1NTY3MTcwNTE5ODE0IH0gfSwgbW9kZWxQaXZvdE9mZnNldDogbmV3IFJlLlZlY3RvcjMoMCwgMCwgMCksIG1vZGVsUGl2b3RSb3RhdGlvbjogbmV3IFJlLkV1bGVyKDAsIDAsIDApIH0gfSwgIm1ldGEtcXVlc3QtdG91Y2gtcHJvIjogeyBsZWZ0OiB7IG1vZGVsVXJsOiBUQSArICJxdWVzdC10b3VjaC1wcm8tbGVmdC5nbGIiLCByYXlPcmlnaW46IHsgb3JpZ2luOiB7IHg6IDAuMDA2NSwgeTogLTAuMDE4NiwgejogLTAuMDUgfSwgZGlyZWN0aW9uOiB7IHg6IDAuMTIzOTQ3ODU4Mzk1MDAxNzUsIHk6IC0wLjU5NDQwNDM2NzIzNDAxNTcsIHo6IC0wLjc5NDU1NjcxNzA1MTk4MTQgfSB9LCBtb2RlbFBpdm90T2Zmc2V0OiBuZXcgUmUuVmVjdG9yMygwLCAwLCAwKSwgbW9kZWxQaXZvdFJvdGF0aW9uOiBuZXcgUmUuRXVsZXIoMCwgMCwgMCkgfSwgcmlnaHQ6IHsgbW9kZWxVcmw6IFRBICsgInF1ZXN0LXRvdWNoLXByby1yaWdodC5nbGIiLCByYXlPcmlnaW46IHsgb3JpZ2luOiB7IHg6IC0wLjAwNjUsIHk6IC0wLjAxODYsIHo6IC0wLjA1IH0sIGRpcmVjdGlvbjogeyB4OiAtMC4xMjM5NDc4NTgzOTUwMDE3NSwgeTogLTAuNTk0NDA0MzY3MjM0MDE1NywgejogLTAuNzk0NTU2NzE3MDUxOTgxNCB9IH0sIG1vZGVsUGl2b3RPZmZzZXQ6IG5ldyBSZS5WZWN0b3IzKDAsIDAsIDApLCBtb2RlbFBpdm90Um90YXRpb246IG5ldyBSZS5FdWxlcigwLCAwLCAwKSB9IH0sICJtZXRhLXF1ZXN0LXRvdWNoLXBsdXMiOiB7IGxlZnQ6IHsgbW9kZWxVcmw6IFRBICsgInF1ZXN0LXRvdWNoLXBsdXMtbGVmdC5nbGIiLCByYXlPcmlnaW46IHsgb3JpZ2luOiB7IHg6IDAuMDA2NSwgeTogLTAuMDE4NiwgejogLTAuMDUgfSwgZGlyZWN0aW9uOiB7IHg6IDAuMTIzOTQ3ODU4Mzk1MDAxNzUsIHk6IC0wLjU5NDQwNDM2NzIzNDAxNTcsIHo6IC0wLjc5NDU1NjcxNzA1MTk4MTQgfSB9LCBtb2RlbFBpdm90T2Zmc2V0OiBuZXcgUmUuVmVjdG9yMygwLCAwLCAwKSwgbW9kZWxQaXZvdFJvdGF0aW9uOiBuZXcgUmUuRXVsZXIoMCwgMCwgMCkgfSwgcmlnaHQ6IHsgbW9kZWxVcmw6IFRBICsgInF1ZXN0LXRvdWNoLXBsdXMtcmlnaHQuZ2xiIiwgcmF5T3JpZ2luOiB7IG9yaWdpbjogeyB4OiAtMC4wMDY1LCB5OiAtMC4wMTg2LCB6OiAtMC4wNSB9LCBkaXJlY3Rpb246IHsgeDogLTAuMTIzOTQ3ODU4Mzk1MDAxNzUsIHk6IC0wLjU5NDQwNDM2NzIzNDAxNTcsIHo6IC0wLjc5NDU1NjcxNzA1MTk4MTQgfSB9LCBtb2RlbFBpdm90T2Zmc2V0OiBuZXcgUmUuVmVjdG9yMygwLCAwLCAwKSwgbW9kZWxQaXZvdFJvdGF0aW9uOiBuZXcgUmUuRXVsZXIoMCwgMCwgMCkgfSB9IH07CiAgT0EgPSB7IHNjaGVtYTogeyBoYW5kOiB7IGRlZmF1bHQ6ICJsZWZ0IiB9LCBidXR0b25Db2xvcjogeyB0eXBlOiAiY29sb3IiLCBkZWZhdWx0OiAiIzk5OSIgfSwgYnV0dG9uVG91Y2hDb2xvcjogeyB0eXBlOiAiY29sb3IiLCBkZWZhdWx0OiAiIzhBQiIgfSwgYnV0dG9uSGlnaGxpZ2h0Q29sb3I6IHsgdHlwZTogImNvbG9yIiwgZGVmYXVsdDogIiMyREYiIH0sIG1vZGVsOiB7IGRlZmF1bHQ6IHRydWUgfSwgY29udHJvbGxlclR5cGU6IHsgZGVmYXVsdDogImF1dG8iLCBvbmVPZjogWyJhdXRvIiwgIm9jdWx1cy10b3VjaCIsICJvY3VsdXMtdG91Y2gtdjIiLCAib2N1bHVzLXRvdWNoLXYzIl0gfSB9LCBhZnRlcjogWyJ0cmFja2VkLWNvbnRyb2xzIl0sIG1hcHBpbmc6IHsgbGVmdDogeyBheGVzOiB7IHRodW1ic3RpY2s6IFsyLCAzXSB9LCBidXR0b25zOiBbInRyaWdnZXIiLCAiZ3JpcCIsICJub25lIiwgInRodW1ic3RpY2siLCAieGJ1dHRvbiIsICJ5YnV0dG9uIiwgInN1cmZhY2UiXSB9LCByaWdodDogeyBheGVzOiB7IHRodW1ic3RpY2s6IFsyLCAzXSB9LCBidXR0b25zOiBbInRyaWdnZXIiLCAiZ3JpcCIsICJub25lIiwgInRodW1ic3RpY2siLCAiYWJ1dHRvbiIsICJiYnV0dG9uIiwgInN1cmZhY2UiXSB9IH0sIGJpbmRNZXRob2RzOiBmdW5jdGlvbigpIHsKICAgIHRoaXMub25CdXR0b25DaGFuZ2VkID0gdGhpcy5vbkJ1dHRvbkNoYW5nZWQuYmluZCh0aGlzKSwgdGhpcy5vblRodW1ic3RpY2tNb3ZlZCA9IHRoaXMub25UaHVtYnN0aWNrTW92ZWQuYmluZCh0aGlzKSwgdGhpcy5vbk1vZGVsTG9hZGVkID0gdGhpcy5vbk1vZGVsTG9hZGVkLmJpbmQodGhpcyksIHRoaXMub25Db250cm9sbGVyc1VwZGF0ZSA9IHRoaXMub25Db250cm9sbGVyc1VwZGF0ZS5iaW5kKHRoaXMpLCB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudCA9IHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50LmJpbmQodGhpcyksIHRoaXMub25BeGlzTW92ZWQgPSB0aGlzLm9uQXhpc01vdmVkLmJpbmQodGhpcyk7CiAgfSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXM7CiAgICB0aGlzLm9uQnV0dG9uRG93biA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgImRvd24iLCBlLCBlLmRhdGEuaGFuZCk7CiAgICB9LCB0aGlzLm9uQnV0dG9uVXAgPSBmdW5jdGlvbih0MikgewogICAgICBOcih0Mi5kZXRhaWwuaWQsICJ1cCIsIGUsIGUuZGF0YS5oYW5kKTsKICAgIH0sIHRoaXMub25CdXR0b25Ub3VjaFN0YXJ0ID0gZnVuY3Rpb24odDIpIHsKICAgICAgTnIodDIuZGV0YWlsLmlkLCAidG91Y2hzdGFydCIsIGUsIGUuZGF0YS5oYW5kKTsKICAgIH0sIHRoaXMub25CdXR0b25Ub3VjaEVuZCA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgInRvdWNoZW5kIiwgZSwgZS5kYXRhLmhhbmQpOwogICAgfSwgdGhpcy5jb250cm9sbGVyUHJlc2VudCA9IGZhbHNlLCB0aGlzLnByZXZpb3VzQnV0dG9uVmFsdWVzID0ge30sIHRoaXMuYmluZE1ldGhvZHMoKSwgdGhpcy50cmlnZ2VyRXVsZXIgPSBuZXcgUmUuRXVsZXI7CiAgfSwgYWRkRXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsOwogICAgZS5hZGRFdmVudExpc3RlbmVyKCJidXR0b25jaGFuZ2VkIiwgdGhpcy5vbkJ1dHRvbkNoYW5nZWQpLCBlLmFkZEV2ZW50TGlzdGVuZXIoImJ1dHRvbmRvd24iLCB0aGlzLm9uQnV0dG9uRG93biksIGUuYWRkRXZlbnRMaXN0ZW5lcigiYnV0dG9udXAiLCB0aGlzLm9uQnV0dG9uVXApLCBlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCB0aGlzLm9uQnV0dG9uVG91Y2hTdGFydCksIGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCB0aGlzLm9uQnV0dG9uVG91Y2hFbmQpLCBlLmFkZEV2ZW50TGlzdGVuZXIoImF4aXNtb3ZlIiwgdGhpcy5vbkF4aXNNb3ZlZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigibW9kZWwtbG9hZGVkIiwgdGhpcy5vbk1vZGVsTG9hZGVkKSwgZS5hZGRFdmVudExpc3RlbmVyKCJ0aHVtYnN0aWNrbW92ZWQiLCB0aGlzLm9uVGh1bWJzdGlja01vdmVkKSwgdGhpcy5jb250cm9sbGVyRXZlbnRzQWN0aXZlID0gdHJ1ZTsKICB9LCByZW1vdmVFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWw7CiAgICBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJ1dHRvbmNoYW5nZWQiLCB0aGlzLm9uQnV0dG9uQ2hhbmdlZCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYnV0dG9uZG93biIsIHRoaXMub25CdXR0b25Eb3duKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJidXR0b251cCIsIHRoaXMub25CdXR0b25VcCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIHRoaXMub25CdXR0b25Ub3VjaFN0YXJ0KSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIHRoaXMub25CdXR0b25Ub3VjaEVuZCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYXhpc21vdmUiLCB0aGlzLm9uQXhpc01vdmVkKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb2RlbC1sb2FkZWQiLCB0aGlzLm9uTW9kZWxMb2FkZWQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRodW1ic3RpY2ttb3ZlZCIsIHRoaXMub25UaHVtYnN0aWNrTW92ZWQpLCB0aGlzLmNvbnRyb2xsZXJFdmVudHNBY3RpdmUgPSBmYWxzZTsKICB9LCBjaGVja0lmQ29udHJvbGxlclByZXNlbnQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmNvbnRyb2xsZXJPYmplY3QzRDsKICAgIGUgJiYgKGUudmlzaWJsZSA9IGZhbHNlKSwgVXIodGhpcywgREEsIHsgaGFuZDogdGhpcy5kYXRhLmhhbmQsIGl0ZXJhdGVDb250cm9sbGVyUHJvZmlsZXM6IHRydWUgfSk7CiAgfSwgcGxheTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudCgpLCB0aGlzLmFkZENvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIoKTsKICB9LCBwYXVzZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCksIHRoaXMucmVtb3ZlQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcigpOwogIH0sIGxvYWRNb2RlbDogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiA9IHRoaXMuZGF0YTsKICAgIGlmIChuMi5tb2RlbCkgewogICAgICBpZiAodGhpcy5jb250cm9sbGVyT2JqZWN0M0QpCiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlck9iamVjdDNELnZpc2libGUgPSB0cnVlLCB2b2lkIHRoaXMuZWwuc2V0T2JqZWN0M0QoIm1lc2giLCB0aGlzLmNvbnRyb2xsZXJPYmplY3QzRCk7CiAgICAgIGlmICh0aGlzLmRpc3BsYXlNb2RlbCA9IFVBW24yLmNvbnRyb2xsZXJUeXBlXSB8fCBVQVtGQV0sIG4yLmNvbnRyb2xsZXJUeXBlID09PSAiYXV0byIpIHsKICAgICAgICB0MiA9IEZBOwogICAgICAgIGZvciAodmFyIGkyID0gT2JqZWN0LmtleXMoVUEpLCByMiA9IDA7cjIgPCBlLnByb2ZpbGVzLmxlbmd0aDsgcjIrKykKICAgICAgICAgIGlmIChpMi5pbmRleE9mKGUucHJvZmlsZXNbcjJdKSAhPT0gLTEpIHsKICAgICAgICAgICAgdDIgPSBlLnByb2ZpbGVzW3IyXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgdGhpcy5kaXNwbGF5TW9kZWwgPSBVQVt0Ml07CiAgICAgIH0KICAgICAgdmFyIG8yID0gdGhpcy5kaXNwbGF5TW9kZWxbbjIuaGFuZF0ubW9kZWxVcmw7CiAgICAgIHRoaXMuaXNUb3VjaFYzb3JQUk9vclBsdXMgPSB0aGlzLmRpc3BsYXlNb2RlbCA9PT0gVUFbIm9jdWx1cy10b3VjaC12MyJdIHx8IHRoaXMuZGlzcGxheU1vZGVsID09PSBVQVsibWV0YS1xdWVzdC10b3VjaC1wcm8iXSB8fCB0aGlzLmRpc3BsYXlNb2RlbCA9PT0gVUFbIm1ldGEtcXVlc3QtdG91Y2gtcGx1cyJdLCB0aGlzLmVsLnNldEF0dHJpYnV0ZSgiZ2x0Zi1tb2RlbCIsIG8yKTsKICAgIH0KICB9LCBpbmplY3RUcmFja2VkQ29udHJvbHM6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IHRoaXMuZGF0YSwgbjIgPSBEQTsKICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKCJ0cmFja2VkLWNvbnRyb2xzIiwgeyBpZDogbjIsIGhhbmQ6IHQyLmhhbmQsIGhhbmRUcmFja2luZ0VuYWJsZWQ6IGZhbHNlLCBpdGVyYXRlQ29udHJvbGxlclByb2ZpbGVzOiB0cnVlIH0pLCB0aGlzLmxvYWRNb2RlbChlKTsKICB9LCBhZGRDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuc2NlbmVFbC5hZGRFdmVudExpc3RlbmVyKCJjb250cm9sbGVyc3VwZGF0ZWQiLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUsIGZhbHNlKTsKICB9LCByZW1vdmVDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuc2NlbmVFbC5yZW1vdmVFdmVudExpc3RlbmVyKCJjb250cm9sbGVyc3VwZGF0ZWQiLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUsIGZhbHNlKTsKICB9LCBvbkNvbnRyb2xsZXJzVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50KCk7CiAgfSwgb25CdXR0b25DaGFuZ2VkOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSB0aGlzLm1hcHBpbmdbdGhpcy5kYXRhLmhhbmRdLmJ1dHRvbnNbZS5kZXRhaWwuaWRdOwogICAgaWYgKHQyKSB7CiAgICAgIGlmICh0aGlzLmlzVG91Y2hWM29yUFJPb3JQbHVzKQogICAgICAgIHRoaXMub25CdXR0b25DaGFuZ2VkVjNvclBST29yUGx1cyhlKTsKICAgICAgZWxzZSB7CiAgICAgICAgdmFyIG4yLCBpMiA9IHRoaXMuYnV0dG9uTWVzaGVzOwogICAgICAgIHQyICE9PSAidHJpZ2dlciIgJiYgdDIgIT09ICJncmlwIiB8fCAobjIgPSBlLmRldGFpbC5zdGF0ZS52YWx1ZSksIGkyICYmICh0MiA9PT0gInRyaWdnZXIiICYmIGkyLnRyaWdnZXIgJiYgKGkyLnRyaWdnZXIucm90YXRpb24ueCA9IHRoaXMub3JpZ2luYWxYUm90YXRpb25UcmlnZ2VyIC0gbjIgKiAoTWF0aC5QSSAvIDI2KSksIHQyID09PSAiZ3JpcCIgJiYgaTIuZ3JpcCAmJiAobjIgKj0gdGhpcy5kYXRhLmhhbmQgPT09ICJsZWZ0IiA/IC0xIDogMSwgaTIuZ3JpcC5wb3NpdGlvbi54ID0gdGhpcy5vcmlnaW5hbFhQb3NpdGlvbkdyaXAgKyAwLjAwNCAqIG4yKSk7CiAgICAgIH0KICAgICAgdGhpcy5lbC5lbWl0KHQyICsgImNoYW5nZWQiLCBlLmRldGFpbC5zdGF0ZSk7CiAgICB9CiAgfSwgb25CdXR0b25DaGFuZ2VkVjNvclBST29yUGx1czogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiA9IHRoaXMubWFwcGluZ1t0aGlzLmRhdGEuaGFuZF0uYnV0dG9uc1tlLmRldGFpbC5pZF0sIGkyID0gdGhpcy5idXR0b25PYmplY3RzOwogICAgaTIgJiYgaTJbbjJdICYmICh0MiA9IGUuZGV0YWlsLnN0YXRlLnZhbHVlLCBpMltuMl0ucXVhdGVybmlvbi5zbGVycFF1YXRlcm5pb25zKHRoaXMuYnV0dG9uUmFuZ2VzW24yXS5taW4ucXVhdGVybmlvbiwgdGhpcy5idXR0b25SYW5nZXNbbjJdLm1heC5xdWF0ZXJuaW9uLCB0MiksIGkyW24yXS5wb3NpdGlvbi5sZXJwVmVjdG9ycyh0aGlzLmJ1dHRvblJhbmdlc1tuMl0ubWluLnBvc2l0aW9uLCB0aGlzLmJ1dHRvblJhbmdlc1tuMl0ubWF4LnBvc2l0aW9uLCB0MikpOwogIH0sIG9uTW9kZWxMb2FkZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIGlmIChlLnRhcmdldCA9PT0gdGhpcy5lbCAmJiB0aGlzLmRhdGEubW9kZWwpIHsKICAgICAgaWYgKHRoaXMuaXNUb3VjaFYzb3JQUk9vclBsdXMpCiAgICAgICAgdGhpcy5vblRvdWNoVjNvclBST29yUGx1c01vZGVsTG9hZGVkKGUpOwogICAgICBlbHNlIHsKICAgICAgICB2YXIgdDIsIG4yID0gdGhpcy5jb250cm9sbGVyT2JqZWN0M0QgPSBlLmRldGFpbC5tb2RlbDsKICAgICAgICAodDIgPSB0aGlzLmJ1dHRvbk1lc2hlcyA9IHt9KS5ncmlwID0gbjIuZ2V0T2JqZWN0QnlOYW1lKCJidXR0b25IYW5kIiksIHRoaXMub3JpZ2luYWxYUG9zaXRpb25HcmlwID0gdDIuZ3JpcCAmJiB0Mi5ncmlwLnBvc2l0aW9uLngsIHQyLnRyaWdnZXIgPSBuMi5nZXRPYmplY3RCeU5hbWUoImJ1dHRvblRyaWdnZXIiKSwgdGhpcy5vcmlnaW5hbFhSb3RhdGlvblRyaWdnZXIgPSB0Mi50cmlnZ2VyICYmIHQyLnRyaWdnZXIucm90YXRpb24ueCwgdDIudGh1bWJzdGljayA9IG4yLmdldE9iamVjdEJ5TmFtZSgic3RpY2siKSwgdDIueGJ1dHRvbiA9IG4yLmdldE9iamVjdEJ5TmFtZSgiYnV0dG9uWCIpLCB0Mi5hYnV0dG9uID0gbjIuZ2V0T2JqZWN0QnlOYW1lKCJidXR0b25BIiksIHQyLnlidXR0b24gPSBuMi5nZXRPYmplY3RCeU5hbWUoImJ1dHRvblkiKSwgdDIuYmJ1dHRvbiA9IG4yLmdldE9iamVjdEJ5TmFtZSgiYnV0dG9uQiIpOwogICAgICB9CiAgICAgIGZvciAodmFyIGkyIGluIHRoaXMuYnV0dG9uTWVzaGVzKQogICAgICAgIHRoaXMuYnV0dG9uTWVzaGVzW2kyXSAmJiBQQSh0aGlzLmJ1dHRvbk1lc2hlc1tpMl0pOwogICAgICB0aGlzLmFwcGx5T2Zmc2V0KGUuZGV0YWlsLm1vZGVsKSwgdGhpcy5lbC5lbWl0KCJjb250cm9sbGVybW9kZWxyZWFkeSIsIHsgbmFtZTogIm1ldGEtdG91Y2gtY29udHJvbHMiLCBtb2RlbDogdGhpcy5kYXRhLm1vZGVsLCByYXlPcmlnaW46IHRoaXMuZGlzcGxheU1vZGVsW3RoaXMuZGF0YS5oYW5kXS5yYXlPcmlnaW4gfSk7CiAgICB9CiAgfSwgYXBwbHlPZmZzZXQ6IGZ1bmN0aW9uKGUpIHsKICAgIGUucG9zaXRpb24uY29weSh0aGlzLmRpc3BsYXlNb2RlbFt0aGlzLmRhdGEuaGFuZF0ubW9kZWxQaXZvdE9mZnNldCksIGUucm90YXRpb24uY29weSh0aGlzLmRpc3BsYXlNb2RlbFt0aGlzLmRhdGEuaGFuZF0ubW9kZWxQaXZvdFJvdGF0aW9uKTsKICB9LCBvblRvdWNoVjNvclBST29yUGx1c01vZGVsTG9hZGVkOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSB0aGlzLmNvbnRyb2xsZXJPYmplY3QzRCA9IGUuZGV0YWlsLm1vZGVsLCBuMiA9IHRoaXMuYnV0dG9uT2JqZWN0cyA9IHt9LCBpMiA9IHRoaXMuYnV0dG9uTWVzaGVzID0ge30sIHIyID0gdGhpcy5idXR0b25SYW5nZXMgPSB7fTsKICAgIGkyLmdyaXAgPSB0Mi5nZXRPYmplY3RCeU5hbWUoInNxdWVlemUiKSwgbjIuZ3JpcCA9IHQyLmdldE9iamVjdEJ5TmFtZSgieHJfc3RhbmRhcmRfc3F1ZWV6ZV9wcmVzc2VkX3ZhbHVlIiksIHIyLmdyaXAgPSB7IG1pbjogdDIuZ2V0T2JqZWN0QnlOYW1lKCJ4cl9zdGFuZGFyZF9zcXVlZXplX3ByZXNzZWRfbWluIiksIG1heDogdDIuZ2V0T2JqZWN0QnlOYW1lKCJ4cl9zdGFuZGFyZF9zcXVlZXplX3ByZXNzZWRfbWF4IikgfSwgbjIuZ3JpcC5taW5YID0gbjIuZ3JpcC5wb3NpdGlvbi54LCBpMi50aHVtYnN0aWNrID0gdDIuZ2V0T2JqZWN0QnlOYW1lKCJ0aHVtYnN0aWNrIiksIG4yLnRodW1ic3RpY2sgPSB0Mi5nZXRPYmplY3RCeU5hbWUoInhyX3N0YW5kYXJkX3RodW1ic3RpY2tfcHJlc3NlZF92YWx1ZSIpLCByMi50aHVtYnN0aWNrID0geyBtaW46IHQyLmdldE9iamVjdEJ5TmFtZSgieHJfc3RhbmRhcmRfdGh1bWJzdGlja19wcmVzc2VkX21pbiIpLCBtYXg6IHQyLmdldE9iamVjdEJ5TmFtZSgieHJfc3RhbmRhcmRfdGh1bWJzdGlja19wcmVzc2VkX21heCIpIH0sIG4yLnRodW1ic3RpY2tYQXhpcyA9IHQyLmdldE9iamVjdEJ5TmFtZSgieHJfc3RhbmRhcmRfdGh1bWJzdGlja194YXhpc19wcmVzc2VkX3ZhbHVlIiksIHIyLnRodW1ic3RpY2tYQXhpcyA9IHsgbWluOiB0Mi5nZXRPYmplY3RCeU5hbWUoInhyX3N0YW5kYXJkX3RodW1ic3RpY2tfeGF4aXNfcHJlc3NlZF9taW4iKSwgbWF4OiB0Mi5nZXRPYmplY3RCeU5hbWUoInhyX3N0YW5kYXJkX3RodW1ic3RpY2tfeGF4aXNfcHJlc3NlZF9tYXgiKSB9LCBuMi50aHVtYnN0aWNrWUF4aXMgPSB0Mi5nZXRPYmplY3RCeU5hbWUoInhyX3N0YW5kYXJkX3RodW1ic3RpY2tfeWF4aXNfcHJlc3NlZF92YWx1ZSIpLCByMi50aHVtYnN0aWNrWUF4aXMgPSB7IG1pbjogdDIuZ2V0T2JqZWN0QnlOYW1lKCJ4cl9zdGFuZGFyZF90aHVtYnN0aWNrX3lheGlzX3ByZXNzZWRfbWluIiksIG1heDogdDIuZ2V0T2JqZWN0QnlOYW1lKCJ4cl9zdGFuZGFyZF90aHVtYnN0aWNrX3lheGlzX3ByZXNzZWRfbWF4IikgfSwgaTIudHJpZ2dlciA9IHQyLmdldE9iamVjdEJ5TmFtZSgidHJpZ2dlciIpLCBuMi50cmlnZ2VyID0gdDIuZ2V0T2JqZWN0QnlOYW1lKCJ4cl9zdGFuZGFyZF90cmlnZ2VyX3ByZXNzZWRfdmFsdWUiKSwgcjIudHJpZ2dlciA9IHsgbWluOiB0Mi5nZXRPYmplY3RCeU5hbWUoInhyX3N0YW5kYXJkX3RyaWdnZXJfcHJlc3NlZF9taW4iKSwgbWF4OiB0Mi5nZXRPYmplY3RCeU5hbWUoInhyX3N0YW5kYXJkX3RyaWdnZXJfcHJlc3NlZF9tYXgiKSB9LCByMi50cmlnZ2VyLmRpZmYgPSB7IHg6IE1hdGguYWJzKHIyLnRyaWdnZXIubWF4LnJvdGF0aW9uLngpIC0gTWF0aC5hYnMocjIudHJpZ2dlci5taW4ucm90YXRpb24ueCksIHk6IE1hdGguYWJzKHIyLnRyaWdnZXIubWF4LnJvdGF0aW9uLnkpIC0gTWF0aC5hYnMocjIudHJpZ2dlci5taW4ucm90YXRpb24ueSksIHo6IE1hdGguYWJzKHIyLnRyaWdnZXIubWF4LnJvdGF0aW9uLnopIC0gTWF0aC5hYnMocjIudHJpZ2dlci5taW4ucm90YXRpb24ueikgfTsKICAgIHZhciBvMiA9IHRoaXMuZGF0YS5oYW5kID09PSAibGVmdCIgPyAieCIgOiAiYSIsIHMyID0gdGhpcy5kYXRhLmhhbmQgPT09ICJsZWZ0IiA/ICJ5IiA6ICJiIiwgYTIgPSBvMiArICJidXR0b24iLCBBMiA9IHMyICsgImJ1dHRvbiI7CiAgICBpMlthMl0gPSB0Mi5nZXRPYmplY3RCeU5hbWUobzIgKyAiX2J1dHRvbiIpLCBuMlthMl0gPSB0Mi5nZXRPYmplY3RCeU5hbWUobzIgKyAiX2J1dHRvbl9wcmVzc2VkX3ZhbHVlIiksIHIyW2EyXSA9IHsgbWluOiB0Mi5nZXRPYmplY3RCeU5hbWUobzIgKyAiX2J1dHRvbl9wcmVzc2VkX21pbiIpLCBtYXg6IHQyLmdldE9iamVjdEJ5TmFtZShvMiArICJfYnV0dG9uX3ByZXNzZWRfbWF4IikgfSwgaTJbQTJdID0gdDIuZ2V0T2JqZWN0QnlOYW1lKHMyICsgIl9idXR0b24iKSwgbjJbQTJdID0gdDIuZ2V0T2JqZWN0QnlOYW1lKHMyICsgIl9idXR0b25fcHJlc3NlZF92YWx1ZSIpLCByMltBMl0gPSB7IG1pbjogdDIuZ2V0T2JqZWN0QnlOYW1lKHMyICsgIl9idXR0b25fcHJlc3NlZF9taW4iKSwgbWF4OiB0Mi5nZXRPYmplY3RCeU5hbWUoczIgKyAiX2J1dHRvbl9wcmVzc2VkX21heCIpIH07CiAgfSwgb25BeGlzTW92ZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIEdyKHRoaXMsIHRoaXMubWFwcGluZ1t0aGlzLmRhdGEuaGFuZF0uYXhlcywgZSk7CiAgfSwgb25UaHVtYnN0aWNrTW92ZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIGlmICh0aGlzLmJ1dHRvbk1lc2hlcyAmJiB0aGlzLmJ1dHRvbk1lc2hlcy50aHVtYnN0aWNrKQogICAgICBpZiAodGhpcy5pc1RvdWNoVjNvclBST29yUGx1cykKICAgICAgICB0aGlzLnVwZGF0ZVRodW1ic3RpY2tUb3VjaFYzb3JQUk9vclBsdXMoZSk7CiAgICAgIGVsc2UKICAgICAgICBmb3IgKHZhciB0MiBpbiBlLmRldGFpbCkKICAgICAgICAgIHRoaXMuYnV0dG9uT2JqZWN0cy50aHVtYnN0aWNrLnJvdGF0aW9uW3RoaXMuYXhpc01hcFt0Ml1dID0gdGhpcy5idXR0b25SYW5nZXMudGh1bWJzdGljay5vcmlnaW5hbFJvdGF0aW9uW3RoaXMuYXhpc01hcFt0Ml1dIC0gTWF0aC5QSSAvIDggKiBlLmRldGFpbFt0Ml0gKiAodDIgPT09ICJ5IiB8fCB0aGlzLmRhdGEuaGFuZCA9PT0gInJpZ2h0IiA/IC0xIDogMSk7CiAgfSwgYXhpc01hcDogeyB5OiAieCIsIHg6ICJ6IiB9LCB1cGRhdGVUaHVtYnN0aWNrVG91Y2hWM29yUFJPb3JQbHVzOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSAoZS5kZXRhaWwueCArIDEpIC8gMjsKICAgIHRoaXMuYnV0dG9uT2JqZWN0cy50aHVtYnN0aWNrWEF4aXMucXVhdGVybmlvbi5zbGVycFF1YXRlcm5pb25zKHRoaXMuYnV0dG9uUmFuZ2VzLnRodW1ic3RpY2tYQXhpcy5taW4ucXVhdGVybmlvbiwgdGhpcy5idXR0b25SYW5nZXMudGh1bWJzdGlja1hBeGlzLm1heC5xdWF0ZXJuaW9uLCB0Mik7CiAgICB2YXIgbjIgPSAoZS5kZXRhaWwueSArIDEpIC8gMjsKICAgIHRoaXMuYnV0dG9uT2JqZWN0cy50aHVtYnN0aWNrWUF4aXMucXVhdGVybmlvbi5zbGVycFF1YXRlcm5pb25zKHRoaXMuYnV0dG9uUmFuZ2VzLnRodW1ic3RpY2tZQXhpcy5taW4ucXVhdGVybmlvbiwgdGhpcy5idXR0b25SYW5nZXMudGh1bWJzdGlja1lBeGlzLm1heC5xdWF0ZXJuaW9uLCBuMik7CiAgfSwgdXBkYXRlTW9kZWw6IGZ1bmN0aW9uKGUsIHQyKSB7CiAgICB0aGlzLmRhdGEubW9kZWwgJiYgdGhpcy51cGRhdGVCdXR0b25Nb2RlbChlLCB0Mik7CiAgfSwgdXBkYXRlQnV0dG9uTW9kZWw6IGZ1bmN0aW9uKGUsIHQyKSB7CiAgICB2YXIgbjIsIGkyID0gdGhpcy5idXR0b25NZXNoZXM7CiAgICBpMiAmJiBpMltlXSAmJiAobjIgPSB0MiA9PT0gInVwIiB8fCB0MiA9PT0gInRvdWNoZW5kIiA/IGkyW2VdLm9yaWdpbmFsQ29sb3IgfHwgdGhpcy5kYXRhLmJ1dHRvbkNvbG9yIDogdDIgPT09ICJ0b3VjaHN0YXJ0IiA/IHRoaXMuZGF0YS5idXR0b25Ub3VjaENvbG9yIDogdGhpcy5kYXRhLmJ1dHRvbkhpZ2hsaWdodENvbG9yLCBpMltlXS5tYXRlcmlhbC5jb2xvci5zZXQobjIpKTsKICB9IH07CiAgY3MoIm9jdWx1cy10b3VjaC1jb250cm9scyIsIE9BKSwgY3MoIm1ldGEtdG91Y2gtY29udHJvbHMiLCBPQSksIGNzKCJvYmItY29sbGlkZXIiLCB7IHNjaGVtYTogeyBzaXplOiB7IGRlZmF1bHQ6IDAgfSwgdHJhY2tlZE9iamVjdDNEOiB7IGRlZmF1bHQ6ICIiIH0sIG1pbmltdW1Db2xsaWRlckRpbWVuc2lvbjogeyBkZWZhdWx0OiAwLjAyIH0sIGNlbnRlck1vZGVsOiB7IGRlZmF1bHQ6IGZhbHNlIH0gfSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnByZXZpb3VzU2NhbGUgPSBuZXcgUmUuVmVjdG9yMygpLmNvcHkodGhpcy5lbC5vYmplY3QzRC5zY2FsZSksIHRoaXMuYXV4RXVsZXIgPSBuZXcgUmUuRXVsZXIsIHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgUmUuQm94MywgdGhpcy5ib3VuZGluZ0JveFNpemUgPSBuZXcgUmUuVmVjdG9yMywgdGhpcy51cGRhdGVDb2xsaWRlciA9IHRoaXMudXBkYXRlQ29sbGlkZXIuYmluZCh0aGlzKSwgdGhpcy5vbk1vZGVsTG9hZGVkID0gdGhpcy5vbk1vZGVsTG9hZGVkLmJpbmQodGhpcyksIHRoaXMudXBkYXRlQm91bmRpbmdCb3ggPSB0aGlzLnVwZGF0ZUJvdW5kaW5nQm94LmJpbmQodGhpcyksIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigibW9kZWwtbG9hZGVkIiwgdGhpcy5vbk1vZGVsTG9hZGVkKSwgdGhpcy51cGRhdGVDb2xsaWRlcigpLCB0aGlzLnN5c3RlbS5hZGRDb2xsaWRlcih0aGlzLmVsKTsKICB9LCByZW1vdmU6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zeXN0ZW0ucmVtb3ZlQ29sbGlkZXIodGhpcy5lbCk7CiAgfSwgdXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZGF0YS50cmFja2VkT2JqZWN0M0QgJiYgKHRoaXMudHJhY2tlZE9iamVjdDNEUGF0aCA9IHRoaXMuZGF0YS50cmFja2VkT2JqZWN0M0Quc3BsaXQoIi4iKSk7CiAgfSwgb25Nb2RlbExvYWRlZDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmRhdGEuY2VudGVyTW9kZWwgJiYgdGhpcy5jZW50ZXJNb2RlbCgpLCB0aGlzLnVwZGF0ZUNvbGxpZGVyKCk7CiAgfSwgY2VudGVyTW9kZWw6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyID0gdGhpcy5lbCwgbjIgPSB0Mi5jb21wb25lbnRzWyJnbHRmLW1vZGVsIl0gJiYgdDIuY29tcG9uZW50c1siZ2x0Zi1tb2RlbCJdLm1vZGVsOwogICAgbjIgJiYgKHRoaXMuZWwucmVtb3ZlT2JqZWN0M0QoIm1lc2giKSwgZSA9IG5ldyBSZS5Cb3gzKCkuc2V0RnJvbU9iamVjdChuMikuZ2V0Q2VudGVyKG5ldyBSZS5WZWN0b3IzKSwgbjIucG9zaXRpb24ueCArPSBuMi5wb3NpdGlvbi54IC0gZS54LCBuMi5wb3NpdGlvbi55ICs9IG4yLnBvc2l0aW9uLnkgLSBlLnksIG4yLnBvc2l0aW9uLnogKz0gbjIucG9zaXRpb24ueiAtIGUueiwgdGhpcy5lbC5zZXRPYmplY3QzRCgibWVzaCIsIG4yKSk7CiAgfSwgdXBkYXRlQ29sbGlkZXI6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsLCB0MiA9IHRoaXMuYm91bmRpbmdCb3hTaXplLCBuMiA9IHRoaXMuYWFiYiA9IHRoaXMuYWFiYiB8fCBuZXcgX247CiAgICB0aGlzLm9iYiA9IHRoaXMub2JiIHx8IG5ldyBfbiwgZS5oYXNMb2FkZWQgPyAodGhpcy51cGRhdGVCb3VuZGluZ0JveCgpLCBuMi5oYWxmU2l6ZS5jb3B5KHQyKS5tdWx0aXBseVNjYWxhcigwLjUpLCB0aGlzLmVsLnNjZW5lRWwuc3lzdGVtc1sib2JiLWNvbGxpZGVyIl0uZGF0YS5zaG93Q29sbGlkZXJzICYmIHRoaXMuc2hvd0NvbGxpZGVyKCkpIDogZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWQiLCB0aGlzLnVwZGF0ZUNvbGxpZGVyKTsKICB9LCBzaG93Q29sbGlkZXI6IGZ1bmN0aW9uKCkgewogICAgdGhpcy51cGRhdGVDb2xsaWRlck1lc2goKSwgdGhpcy5yZW5kZXJDb2xsaWRlck1lc2gudmlzaWJsZSA9IHRydWU7CiAgfSwgdXBkYXRlQ29sbGlkZXJNZXNoOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5yZW5kZXJDb2xsaWRlck1lc2gsIHQyID0gdGhpcy5ib3VuZGluZ0JveFNpemU7CiAgICBlID8gKGUuZ2VvbWV0cnkuZGlzcG9zZSgpLCBlLmdlb21ldHJ5ID0gbmV3IFJlLkJveEdlb21ldHJ5KHQyLngsIHQyLnksIHQyLnopKSA6IHRoaXMuaW5pdENvbGxpZGVyTWVzaCgpOwogIH0sIGhpZGVDb2xsaWRlcjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlbmRlckNvbGxpZGVyTWVzaCAmJiAodGhpcy5yZW5kZXJDb2xsaWRlck1lc2gudmlzaWJsZSA9IGZhbHNlKTsKICB9LCBpbml0Q29sbGlkZXJNZXNoOiBmdW5jdGlvbigpIHsKICAgIHZhciBlLCB0MiwgbjI7CiAgICBlID0gdGhpcy5ib3VuZGluZ0JveFNpemUsIHQyID0gdGhpcy5yZW5kZXJDb2xsaWRlckdlb21ldHJ5ID0gbmV3IFJlLkJveEdlb21ldHJ5KGUueCwgZS55LCBlLnopLCAobjIgPSB0aGlzLnJlbmRlckNvbGxpZGVyTWVzaCA9IG5ldyBSZS5NZXNoKHQyLCBuZXcgUmUuTWVzaExhbWJlcnRNYXRlcmlhbCh7IGNvbG9yOiA2NTI4MCwgc2lkZTogUmUuRG91YmxlU2lkZSB9KSkpLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZSwgbjIubWF0cml4V29ybGRBdXRvVXBkYXRlID0gZmFsc2UsIG4yLnVwZGF0ZU1hdHJpeFdvcmxkID0gZnVuY3Rpb24oKSB7fSwgdGhpcy5lbC5zY2VuZUVsLm9iamVjdDNELmFkZChuMik7CiAgfSwgdXBkYXRlQm91bmRpbmdCb3g6ICh4QSA9IG5ldyBSZS5WZWN0b3IzLCBRQSA9IG5ldyBSZS5WZWN0b3IzLCBMQSA9IG5ldyBSZS5RdWF0ZXJuaW9uLCBNQSA9IG5ldyBSZS5RdWF0ZXJuaW9uLCBTQSA9IG5ldyBSZS5NYXRyaXg0LCBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5hdXhFdWxlciwgdDIgPSB0aGlzLmJvdW5kaW5nQm94LCBuMiA9IHRoaXMuZGF0YS5zaXplLCBpMiA9IHRoaXMudHJhY2tlZE9iamVjdDNEIHx8IHRoaXMuZWwub2JqZWN0M0QsIHIyID0gdGhpcy5ib3VuZGluZ0JveFNpemUsIG8yID0gdGhpcy5kYXRhLm1pbmltdW1Db2xsaWRlckRpbWVuc2lvbjsKICAgIGlmIChuMikKICAgICAgcmV0dXJuIHRoaXMuYm91bmRpbmdCb3hTaXplLnggPSBuMiwgdGhpcy5ib3VuZGluZ0JveFNpemUueSA9IG4yLCB2b2lkICh0aGlzLmJvdW5kaW5nQm94U2l6ZS56ID0gbjIpOwogICAgZS5jb3B5KGkyLnJvdGF0aW9uKSwgaTIucm90YXRpb24uc2V0KDAsIDAsIDApLCBpMi5wYXJlbnQubWF0cml4V29ybGQuZGVjb21wb3NlKHhBLCBMQSwgUUEpLCBTQS5jb21wb3NlKHhBLCBNQSwgUUEpLCBpMi5wYXJlbnQubWF0cml4V29ybGQuY29weShTQSksIHQyLnNldEZyb21PYmplY3QoaTIsIHRydWUpLCB0Mi5nZXRTaXplKHIyKSwgcjIueCA9IHIyLnggPCBvMiA/IG8yIDogcjIueCwgcjIueSA9IHIyLnkgPCBvMiA/IG8yIDogcjIueSwgcjIueiA9IHIyLnogPCBvMiA/IG8yIDogcjIueiwgaTIucGFyZW50Lm1hdHJpeFdvcmxkLmNvbXBvc2UoeEEsIExBLCBRQSksIHRoaXMuZWwub2JqZWN0M0Qucm90YXRpb24uY29weShlKTsKICB9KSwgY2hlY2tUcmFja2VkT2JqZWN0OiBmdW5jdGlvbigpIHsKICAgIHZhciBlLCB0MiA9IHRoaXMudHJhY2tlZE9iamVjdDNEUGF0aDsKICAgIGlmICh0MiAmJiB0Mi5sZW5ndGggJiYgIXRoaXMudHJhY2tlZE9iamVjdDNEKSB7CiAgICAgIGUgPSB0aGlzLmVsOwogICAgICBmb3IgKHZhciBuMiA9IDA7bjIgPCB0Mi5sZW5ndGggJiYgKGUgPSBlW3QyW24yXV0pOyBuMisrKQogICAgICAgIDsKICAgICAgZSAmJiAodGhpcy50cmFja2VkT2JqZWN0M0QgPSBlLCB0aGlzLnVwZGF0ZUNvbGxpZGVyKCkpOwogICAgfQogICAgcmV0dXJuIHRoaXMudHJhY2tlZE9iamVjdDNEOwogIH0sIHRpY2s6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSBuZXcgUmUuVmVjdG9yMywgdDIgPSBuZXcgUmUuVmVjdG9yMywgbjIgPSBuZXcgUmUuUXVhdGVybmlvbiwgaTIgPSBuZXcgUmUuTWF0cml4NDsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHIyID0gdGhpcy5vYmIsIG8yID0gdGhpcy5yZW5kZXJDb2xsaWRlck1lc2gsIHMyID0gdGhpcy5jaGVja1RyYWNrZWRPYmplY3QoKSB8fCB0aGlzLmVsLm9iamVjdDNEOwogICAgICBzMiAmJiAoczIudXBkYXRlTWF0cml4KCksIHMyLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpLCBzMi5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoZSwgbjIsIHQyKSwgKE1hdGguYWJzKHQyLnggLSB0aGlzLnByZXZpb3VzU2NhbGUueCkgPiAwLjAwMDEgfHwgTWF0aC5hYnModDIueSAtIHRoaXMucHJldmlvdXNTY2FsZS55KSA+IDAuMDAwMSB8fCBNYXRoLmFicyh0Mi56IC0gdGhpcy5wcmV2aW91c1NjYWxlLnopID4gMC4wMDAxKSAmJiB0aGlzLnVwZGF0ZUNvbGxpZGVyKCksIHRoaXMucHJldmlvdXNTY2FsZS5jb3B5KHQyKSwgdDIuc2V0KDEsIDEsIDEpLCBpMi5jb21wb3NlKGUsIG4yLCB0MiksIG8yICYmIG8yLm1hdHJpeFdvcmxkLmNvcHkoaTIpLCByMi5jb3B5KHRoaXMuYWFiYiksIHIyLmFwcGx5TWF0cml4NChpMikpOwogICAgfTsKICB9KCkgfSk7CiAgR0EgPSBmaSgiY29tcG9uZW50czpvYmotbW9kZWw6d2FybiIpOwogIE5BID0gKGNzKCJvYmotbW9kZWwiLCB7IHNjaGVtYTogeyBtdGw6IHsgdHlwZTogIm1vZGVsIiB9LCBvYmo6IHsgdHlwZTogIm1vZGVsIiB9IH0sIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzOwogICAgdGhpcy5tb2RlbCA9IG51bGwsIHRoaXMub2JqTG9hZGVyID0gbmV3IG5pLCB0aGlzLm10bExvYWRlciA9IG5ldyBpaSh0aGlzLm9iakxvYWRlci5tYW5hZ2VyKSwgdGhpcy5tdGxMb2FkZXIuY3Jvc3NPcmlnaW4gPSAiIiwgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCJjb21wb25lbnRpbml0aWFsaXplZCIsIGZ1bmN0aW9uKHQyKSB7CiAgICAgIGUubW9kZWwgJiYgdDIuZGV0YWlsLm5hbWUgPT09ICJtYXRlcmlhbCIgJiYgZS5hcHBseU1hdGVyaWFsKCk7CiAgICB9KTsKICB9LCB1cGRhdGU6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmRhdGE7CiAgICBlLm9iaiAmJiAodGhpcy5yZXNldE1lc2goKSwgdGhpcy5sb2FkT2JqKGUub2JqLCBlLm10bCkpOwogIH0sIHJlbW92ZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlc2V0TWVzaCgpOwogIH0sIHJlc2V0TWVzaDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1vZGVsICYmIHRoaXMuZWwucmVtb3ZlT2JqZWN0M0QoIm1lc2giKTsKICB9LCBsb2FkT2JqOiBmdW5jdGlvbihlLCB0MikgewogICAgdmFyIG4yID0gdGhpcywgaTIgPSB0aGlzLmVsLCByMiA9IHRoaXMubXRsTG9hZGVyLCBvMiA9IHRoaXMub2JqTG9hZGVyLCBzMiA9IHRoaXMuZWwuc2NlbmVFbC5zeXN0ZW1zLnJlbmRlcmVyLCBhMiA9IHQyLnN1YnN0cigwLCB0Mi5sYXN0SW5kZXhPZigiLyIpICsgMSk7CiAgICBpZiAodDIpCiAgICAgIHJldHVybiBpMi5oYXNBdHRyaWJ1dGUoIm1hdGVyaWFsIikgJiYgR0EoIk1hdGVyaWFsIGNvbXBvbmVudCBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkIHdoZW4gYSAuTVRMIGlzIHByb3ZpZGVkIiksIHIyLnNldFJlc291cmNlUGF0aChhMiksIHZvaWQgcjIubG9hZCh0MiwgZnVuY3Rpb24odDMpIHsKICAgICAgICB0My5wcmVsb2FkKCksIG8yLnNldE1hdGVyaWFscyh0MyksIG8yLmxvYWQoZSwgZnVuY3Rpb24oZTIpIHsKICAgICAgICAgIG4yLm1vZGVsID0gZTIsIG4yLm1vZGVsLnRyYXZlcnNlKGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgICAgIGlmIChlMy5pc01lc2gpIHsKICAgICAgICAgICAgICB2YXIgdDQgPSBlMy5tYXRlcmlhbDsKICAgICAgICAgICAgICB0NC5tYXAgJiYgczIuYXBwbHlDb2xvckNvcnJlY3Rpb24odDQubWFwKSwgdDQuZW1pc3NpdmVNYXAgJiYgczIuYXBwbHlDb2xvckNvcnJlY3Rpb24odDQuZW1pc3NpdmVNYXApOwogICAgICAgICAgICB9CiAgICAgICAgICB9KSwgaTIuc2V0T2JqZWN0M0QoIm1lc2giLCBlMiksIGkyLmVtaXQoIm1vZGVsLWxvYWRlZCIsIHsgZm9ybWF0OiAib2JqIiwgbW9kZWw6IGUyIH0pOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIG8yLmxvYWQoZSwgZnVuY3Rpb24oZTIpIHsKICAgICAgbjIubW9kZWwgPSBlMiwgbjIuYXBwbHlNYXRlcmlhbCgpLCBpMi5zZXRPYmplY3QzRCgibWVzaCIsIGUyKSwgaTIuZW1pdCgibW9kZWwtbG9hZGVkIiwgeyBmb3JtYXQ6ICJvYmoiLCBtb2RlbDogZTIgfSk7CiAgICB9KTsKICB9LCBhcHBseU1hdGVyaWFsOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbC5jb21wb25lbnRzLm1hdGVyaWFsOwogICAgZSAmJiB0aGlzLm1vZGVsLnRyYXZlcnNlKGZ1bmN0aW9uKHQyKSB7CiAgICAgIHQyIGluc3RhbmNlb2YgUmUuTWVzaCAmJiAodDIubWF0ZXJpYWwgPSBlLm1hdGVyaWFsKTsKICAgIH0pOwogIH0gfSksIGNpICsgImNvbnRyb2xsZXJzL29jdWx1cy9nby9vY3VsdXMtZ28tY29udHJvbGxlci5nbHRmIik7CiAgX0EgPSAoY3MoIm9jdWx1cy1nby1jb250cm9scyIsIHsgc2NoZW1hOiB7IGhhbmQ6IHsgZGVmYXVsdDogIiIgfSwgYnV0dG9uQ29sb3I6IHsgdHlwZTogImNvbG9yIiwgZGVmYXVsdDogIiNGRkZGRkYiIH0sIGJ1dHRvblRvdWNoZWRDb2xvcjogeyB0eXBlOiAiY29sb3IiLCBkZWZhdWx0OiAiI0JCQkJCQiIgfSwgYnV0dG9uSGlnaGxpZ2h0Q29sb3I6IHsgdHlwZTogImNvbG9yIiwgZGVmYXVsdDogIiM3QTdBN0EiIH0sIG1vZGVsOiB7IGRlZmF1bHQ6IHRydWUgfSB9LCBtYXBwaW5nOiB7IGF4ZXM6IHsgdG91Y2hwYWQ6IFswLCAxXSB9LCBidXR0b25zOiBbInRyaWdnZXIiLCAibm9uZSIsICJ0b3VjaHBhZCJdIH0sIGJpbmRNZXRob2RzOiBmdW5jdGlvbigpIHsKICAgIHRoaXMub25Nb2RlbExvYWRlZCA9IHRoaXMub25Nb2RlbExvYWRlZC5iaW5kKHRoaXMpLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUgPSB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUuYmluZCh0aGlzKSwgdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQgPSB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudC5iaW5kKHRoaXMpLCB0aGlzLnJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIgPSB0aGlzLnJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIuYmluZCh0aGlzKSwgdGhpcy5vbkF4aXNNb3ZlZCA9IHRoaXMub25BeGlzTW92ZWQuYmluZCh0aGlzKTsKICB9LCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpczsKICAgIHRoaXMub25CdXR0b25DaGFuZ2VkID0gdGhpcy5vbkJ1dHRvbkNoYW5nZWQuYmluZCh0aGlzKSwgdGhpcy5vbkJ1dHRvbkRvd24gPSBmdW5jdGlvbih0MikgewogICAgICBOcih0Mi5kZXRhaWwuaWQsICJkb3duIiwgZSk7CiAgICB9LCB0aGlzLm9uQnV0dG9uVXAgPSBmdW5jdGlvbih0MikgewogICAgICBOcih0Mi5kZXRhaWwuaWQsICJ1cCIsIGUpOwogICAgfSwgdGhpcy5vbkJ1dHRvblRvdWNoU3RhcnQgPSBmdW5jdGlvbih0MikgewogICAgICBOcih0Mi5kZXRhaWwuaWQsICJ0b3VjaHN0YXJ0IiwgZSk7CiAgICB9LCB0aGlzLm9uQnV0dG9uVG91Y2hFbmQgPSBmdW5jdGlvbih0MikgewogICAgICBOcih0Mi5kZXRhaWwuaWQsICJ0b3VjaGVuZCIsIGUpOwogICAgfSwgdGhpcy5jb250cm9sbGVyUHJlc2VudCA9IGZhbHNlLCB0aGlzLmJpbmRNZXRob2RzKCk7CiAgfSwgYWRkRXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsOwogICAgZS5hZGRFdmVudExpc3RlbmVyKCJidXR0b25jaGFuZ2VkIiwgdGhpcy5vbkJ1dHRvbkNoYW5nZWQpLCBlLmFkZEV2ZW50TGlzdGVuZXIoImJ1dHRvbmRvd24iLCB0aGlzLm9uQnV0dG9uRG93biksIGUuYWRkRXZlbnRMaXN0ZW5lcigiYnV0dG9udXAiLCB0aGlzLm9uQnV0dG9uVXApLCBlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCB0aGlzLm9uQnV0dG9uVG91Y2hTdGFydCksIGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCB0aGlzLm9uQnV0dG9uVG91Y2hFbmQpLCBlLmFkZEV2ZW50TGlzdGVuZXIoIm1vZGVsLWxvYWRlZCIsIHRoaXMub25Nb2RlbExvYWRlZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigiYXhpc21vdmUiLCB0aGlzLm9uQXhpc01vdmVkKSwgdGhpcy5jb250cm9sbGVyRXZlbnRzQWN0aXZlID0gdHJ1ZTsKICB9LCByZW1vdmVFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWw7CiAgICBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJ1dHRvbmNoYW5nZWQiLCB0aGlzLm9uQnV0dG9uQ2hhbmdlZCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYnV0dG9uZG93biIsIHRoaXMub25CdXR0b25Eb3duKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJidXR0b251cCIsIHRoaXMub25CdXR0b25VcCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIHRoaXMub25CdXR0b25Ub3VjaFN0YXJ0KSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIHRoaXMub25CdXR0b25Ub3VjaEVuZCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW9kZWwtbG9hZGVkIiwgdGhpcy5vbk1vZGVsTG9hZGVkKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJheGlzbW92ZSIsIHRoaXMub25BeGlzTW92ZWQpLCB0aGlzLmNvbnRyb2xsZXJFdmVudHNBY3RpdmUgPSBmYWxzZTsKICB9LCBjaGVja0lmQ29udHJvbGxlclByZXNlbnQ6IGZ1bmN0aW9uKCkgewogICAgVXIodGhpcywgakEsIHRoaXMuZGF0YS5oYW5kID8geyBoYW5kOiB0aGlzLmRhdGEuaGFuZCB9IDoge30pOwogIH0sIHBsYXk6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQoKSwgdGhpcy5hZGRDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyKCk7CiAgfSwgcGF1c2U6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpLCB0aGlzLnJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIoKTsKICB9LCBpbmplY3RUcmFja2VkQ29udHJvbHM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsLCB0MiA9IHRoaXMuZGF0YTsKICAgIGUuc2V0QXR0cmlidXRlKCJ0cmFja2VkLWNvbnRyb2xzIiwgeyBoYW5kOiB0Mi5oYW5kLCBpZFByZWZpeDogakEgfSksIHRoaXMuZGF0YS5tb2RlbCAmJiB0aGlzLmVsLnNldEF0dHJpYnV0ZSgiZ2x0Zi1tb2RlbCIsIE5BKTsKICB9LCBhZGRDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuc2NlbmVFbC5hZGRFdmVudExpc3RlbmVyKCJjb250cm9sbGVyc3VwZGF0ZWQiLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUsIGZhbHNlKTsKICB9LCByZW1vdmVDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuc2NlbmVFbC5yZW1vdmVFdmVudExpc3RlbmVyKCJjb250cm9sbGVyc3VwZGF0ZWQiLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUsIGZhbHNlKTsKICB9LCBvbkNvbnRyb2xsZXJzVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50KCk7CiAgfSwgb25Nb2RlbExvYWRlZDogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiA9IGUuZGV0YWlsLm1vZGVsOwogICAgZS50YXJnZXQgPT09IHRoaXMuZWwgJiYgdGhpcy5kYXRhLm1vZGVsICYmICgodDIgPSB0aGlzLmJ1dHRvbk1lc2hlcyA9IHt9KS50cmlnZ2VyID0gbjIuZ2V0T2JqZWN0QnlOYW1lKCJvY3VsdXNfZ29fYnV0dG9uX3RyaWdnZXIiKSwgdDIudHJhY2twYWQgPSBuMi5nZXRPYmplY3RCeU5hbWUoIm9jdWx1c19nb190b3VjaHBhZCIpLCB0Mi50b3VjaHBhZCA9IG4yLmdldE9iamVjdEJ5TmFtZSgib2N1bHVzX2dvX3RvdWNocGFkIikpOwogIH0sIG9uQnV0dG9uQ2hhbmdlZDogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyID0gdGhpcy5tYXBwaW5nLmJ1dHRvbnNbZS5kZXRhaWwuaWRdOwogICAgdDIgJiYgdGhpcy5lbC5lbWl0KHQyICsgImNoYW5nZWQiLCBlLmRldGFpbC5zdGF0ZSk7CiAgfSwgb25BeGlzTW92ZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIEdyKHRoaXMsIHRoaXMubWFwcGluZy5heGVzLCBlKTsKICB9LCB1cGRhdGVNb2RlbDogZnVuY3Rpb24oZSwgdDIpIHsKICAgIHRoaXMuZGF0YS5tb2RlbCAmJiB0aGlzLnVwZGF0ZUJ1dHRvbk1vZGVsKGUsIHQyKTsKICB9LCB1cGRhdGVCdXR0b25Nb2RlbDogZnVuY3Rpb24oZSwgdDIpIHsKICAgIHZhciBuMiA9IHRoaXMuYnV0dG9uTWVzaGVzOwogICAgaWYgKG4yICYmIG4yW2VdKSB7CiAgICAgIHZhciBpMjsKICAgICAgc3dpdGNoICh0MikgewogICAgICAgIGNhc2UgImRvd24iOgogICAgICAgICAgaTIgPSB0aGlzLmRhdGEuYnV0dG9uSGlnaGxpZ2h0Q29sb3I7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJ0b3VjaHN0YXJ0IjoKICAgICAgICAgIGkyID0gdGhpcy5kYXRhLmJ1dHRvblRvdWNoZWRDb2xvcjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpMiA9IHRoaXMuZGF0YS5idXR0b25Db2xvcjsKICAgICAgfQogICAgICBuMltlXS5tYXRlcmlhbC5jb2xvci5zZXQoaTIpOwogICAgfQogIH0gfSksICJwaWNvLTQiKTsKICBIQSA9IGNpICsgImNvbnRyb2xsZXJzL3BpY28vcGljbzQvIjsKICBxQSA9IChjcygicGljby1jb250cm9scyIsIHsgc2NoZW1hOiB7IGhhbmQ6IHsgZGVmYXVsdDogIm5vbmUiIH0sIG1vZGVsOiB7IGRlZmF1bHQ6IHRydWUgfSB9LCBtYXBwaW5nOiB7IGxlZnQ6IHsgYXhlczogeyB0aHVtYnN0aWNrOiBbMiwgM10gfSwgYnV0dG9uczogWyJ0cmlnZ2VyIiwgImdyaXAiLCAibm9uZSIsICJ0aHVtYnN0aWNrIiwgInhidXR0b24iLCAieWJ1dHRvbiJdIH0sIHJpZ2h0OiB7IGF4ZXM6IHsgdGh1bWJzdGljazogWzIsIDNdIH0sIGJ1dHRvbnM6IFsidHJpZ2dlciIsICJncmlwIiwgIm5vbmUiLCAidGh1bWJzdGljayIsICJhYnV0dG9uIiwgImJidXR0b24iXSB9IH0sIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzOwogICAgdGhpcy5vbkJ1dHRvbkNoYW5nZWQgPSB0aGlzLm9uQnV0dG9uQ2hhbmdlZC5iaW5kKHRoaXMpLCB0aGlzLm9uQnV0dG9uRG93biA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgImRvd24iLCBlLCBlLmRhdGEuaGFuZCk7CiAgICB9LCB0aGlzLm9uQnV0dG9uVXAgPSBmdW5jdGlvbih0MikgewogICAgICBOcih0Mi5kZXRhaWwuaWQsICJ1cCIsIGUsIGUuZGF0YS5oYW5kKTsKICAgIH0sIHRoaXMub25CdXR0b25Ub3VjaEVuZCA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgInRvdWNoZW5kIiwgZSwgZS5kYXRhLmhhbmQpOwogICAgfSwgdGhpcy5vbkJ1dHRvblRvdWNoU3RhcnQgPSBmdW5jdGlvbih0MikgewogICAgICBOcih0Mi5kZXRhaWwuaWQsICJ0b3VjaHN0YXJ0IiwgZSwgZS5kYXRhLmhhbmQpOwogICAgfSwgdGhpcy5iaW5kTWV0aG9kcygpOwogIH0sIHVwZGF0ZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZGF0YTsKICAgIHRoaXMuY29udHJvbGxlckluZGV4ID0gZS5oYW5kID09PSAicmlnaHQiID8gMCA6IGUuaGFuZCA9PT0gImxlZnQiID8gMSA6IDI7CiAgfSwgcGxheTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudCgpLCB0aGlzLmFkZENvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIoKTsKICB9LCBwYXVzZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCksIHRoaXMucmVtb3ZlQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcigpOwogIH0sIGJpbmRNZXRob2RzOiBmdW5jdGlvbigpIHsKICAgIHRoaXMub25Nb2RlbExvYWRlZCA9IHRoaXMub25Nb2RlbExvYWRlZC5iaW5kKHRoaXMpLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUgPSB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUuYmluZCh0aGlzKSwgdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQgPSB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudC5iaW5kKHRoaXMpLCB0aGlzLnJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIgPSB0aGlzLnJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIuYmluZCh0aGlzKSwgdGhpcy5vbkF4aXNNb3ZlZCA9IHRoaXMub25BeGlzTW92ZWQuYmluZCh0aGlzKTsKICB9LCBhZGRFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWw7CiAgICBlLmFkZEV2ZW50TGlzdGVuZXIoImJ1dHRvbmNoYW5nZWQiLCB0aGlzLm9uQnV0dG9uQ2hhbmdlZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigiYnV0dG9uZG93biIsIHRoaXMub25CdXR0b25Eb3duKSwgZS5hZGRFdmVudExpc3RlbmVyKCJidXR0b251cCIsIHRoaXMub25CdXR0b25VcCksIGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIHRoaXMub25CdXR0b25Ub3VjaFN0YXJ0KSwgZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIHRoaXMub25CdXR0b25Ub3VjaEVuZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigiYXhpc21vdmUiLCB0aGlzLm9uQXhpc01vdmVkKSwgZS5hZGRFdmVudExpc3RlbmVyKCJtb2RlbC1sb2FkZWQiLCB0aGlzLm9uTW9kZWxMb2FkZWQpLCB0aGlzLmNvbnRyb2xsZXJFdmVudHNBY3RpdmUgPSB0cnVlOwogIH0sIHJlbW92ZUV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbDsKICAgIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYnV0dG9uY2hhbmdlZCIsIHRoaXMub25CdXR0b25DaGFuZ2VkKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJidXR0b25kb3duIiwgdGhpcy5vbkJ1dHRvbkRvd24pLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJ1dHRvbnVwIiwgdGhpcy5vbkJ1dHRvblVwKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgdGhpcy5vbkJ1dHRvblRvdWNoU3RhcnQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgdGhpcy5vbkJ1dHRvblRvdWNoRW5kKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJheGlzbW92ZSIsIHRoaXMub25BeGlzTW92ZWQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vZGVsLWxvYWRlZCIsIHRoaXMub25Nb2RlbExvYWRlZCksIHRoaXMuY29udHJvbGxlckV2ZW50c0FjdGl2ZSA9IGZhbHNlOwogIH0sIGNoZWNrSWZDb250cm9sbGVyUHJlc2VudDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZGF0YTsKICAgIFVyKHRoaXMsIF9BLCB7IGluZGV4OiB0aGlzLmNvbnRyb2xsZXJJbmRleCwgaGFuZDogZS5oYW5kIH0pOwogIH0sIGluamVjdFRyYWNrZWRDb250cm9sczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWwsIHQyID0gdGhpcy5kYXRhOwogICAgZS5zZXRBdHRyaWJ1dGUoInRyYWNrZWQtY29udHJvbHMiLCB7IGlkUHJlZml4OiBfQSwgaGFuZDogdDIuaGFuZCwgY29udHJvbGxlcjogdGhpcy5jb250cm9sbGVySW5kZXggfSksIHRoaXMuZGF0YS5tb2RlbCAmJiB0aGlzLmVsLnNldEF0dHJpYnV0ZSgiZ2x0Zi1tb2RlbCIsIEhBICsgdGhpcy5kYXRhLmhhbmQgKyAiLmdsYiIpOwogIH0sIGFkZENvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXI6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5zY2VuZUVsLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJzdXBkYXRlZCIsIHRoaXMub25Db250cm9sbGVyc1VwZGF0ZSwgZmFsc2UpOwogIH0sIHJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXI6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5zY2VuZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJzdXBkYXRlZCIsIHRoaXMub25Db250cm9sbGVyc1VwZGF0ZSwgZmFsc2UpOwogIH0sIG9uQ29udHJvbGxlcnNVcGRhdGU6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQoKTsKICB9LCBvbkJ1dHRvbkNoYW5nZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjIgPSB0aGlzLm1hcHBpbmdbdGhpcy5kYXRhLmhhbmRdLmJ1dHRvbnNbZS5kZXRhaWwuaWRdOwogICAgbjIgJiYgKG4yID09PSAidHJpZ2dlciIgJiYgKHQyID0gZS5kZXRhaWwuc3RhdGUudmFsdWUsIGNvbnNvbGUubG9nKCJhbmFsb2cgdmFsdWUgb2YgdHJpZ2dlciBwcmVzczogIiArIHQyKSksIHRoaXMuZWwuZW1pdChuMiArICJjaGFuZ2VkIiwgZS5kZXRhaWwuc3RhdGUpKTsKICB9LCBvbk1vZGVsTG9hZGVkOiBmdW5jdGlvbihlKSB7CiAgICBlLnRhcmdldCA9PT0gdGhpcy5lbCAmJiB0aGlzLmRhdGEubW9kZWwgJiYgdGhpcy5lbC5lbWl0KCJjb250cm9sbGVybW9kZWxyZWFkeSIsIHsgbmFtZTogInBpY28tY29udHJvbHMiLCBtb2RlbDogdGhpcy5kYXRhLm1vZGVsLCByYXlPcmlnaW46IG5ldyBSZS5WZWN0b3IzKDAsIDAsIDApIH0pOwogIH0sIG9uQXhpc01vdmVkOiBmdW5jdGlvbihlKSB7CiAgICBHcih0aGlzLCB0aGlzLm1hcHBpbmdbdGhpcy5kYXRhLmhhbmRdLmF4ZXMsIGUpOwogIH0gfSksIGNzKCJwb3NpdGlvbiIsIHsgc2NoZW1hOiB7IHR5cGU6ICJ2ZWMzIiB9LCB1cGRhdGU6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsLm9iamVjdDNELCB0MiA9IHRoaXMuZGF0YTsKICAgIGUucG9zaXRpb24uc2V0KHQyLngsIHQyLnksIHQyLnopOwogIH0sIHJlbW92ZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsLm9iamVjdDNELnBvc2l0aW9uLnNldCgwLCAwLCAwKTsKICB9IH0pLCBmaSgiY29tcG9uZW50czpyYXljYXN0ZXI6d2FybiIpKTsKICBWQSA9IC9eW1x3XHMtLixbXF0jXSokLzsKICB6QSA9IHsgY2hpbGRMaXN0OiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH07CiAgY3MoInJheWNhc3RlciIsIHsgc2NoZW1hOiB7IGF1dG9SZWZyZXNoOiB7IGRlZmF1bHQ6IHRydWUgfSwgZGlyZWN0aW9uOiB7IHR5cGU6ICJ2ZWMzIiwgZGVmYXVsdDogeyB4OiAwLCB5OiAwLCB6OiAtMSB9IH0sIGVuYWJsZWQ6IHsgZGVmYXVsdDogdHJ1ZSB9LCBmYXI6IHsgZGVmYXVsdDogMTAwMCB9LCBpbnRlcnZhbDogeyBkZWZhdWx0OiAwIH0sIG5lYXI6IHsgZGVmYXVsdDogMCB9LCBvYmplY3RzOiB7IGRlZmF1bHQ6ICIiIH0sIG9yaWdpbjogeyB0eXBlOiAidmVjMyIgfSwgc2hvd0xpbmU6IHsgZGVmYXVsdDogZmFsc2UgfSwgbGluZUNvbG9yOiB7IGRlZmF1bHQ6ICJ3aGl0ZSIgfSwgbGluZU9wYWNpdHk6IHsgZGVmYXVsdDogMSB9LCB1c2VXb3JsZENvb3JkaW5hdGVzOiB7IGRlZmF1bHQ6IGZhbHNlIH0gfSwgbXVsdGlwbGU6IHRydWUsIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jbGVhcmVkSW50ZXJzZWN0ZWRFbHMgPSBbXSwgdGhpcy51bml0TGluZUVuZFZlYzMgPSBuZXcgUmUuVmVjdG9yMywgdGhpcy5pbnRlcnNlY3RlZEVscyA9IFtdLCB0aGlzLmludGVyc2VjdGlvbnMgPSBbXSwgdGhpcy5uZXdJbnRlcnNlY3RlZEVscyA9IFtdLCB0aGlzLm5ld0ludGVyc2VjdGlvbnMgPSBbXSwgdGhpcy5vYmplY3RzID0gW10sIHRoaXMucHJldkNoZWNrVGltZSA9IHVuZGVmaW5lZCwgdGhpcy5wcmV2SW50ZXJzZWN0ZWRFbHMgPSBbXSwgdGhpcy5yYXdJbnRlcnNlY3Rpb25zID0gW10sIHRoaXMucmF5Y2FzdGVyID0gbmV3IFJlLlJheWNhc3RlciwgdGhpcy51cGRhdGVPcmlnaW5EaXJlY3Rpb24oKSwgdGhpcy5zZXREaXJ0eSA9IHRoaXMuc2V0RGlydHkuYmluZCh0aGlzKSwgdGhpcy51cGRhdGVMaW5lID0gdGhpcy51cGRhdGVMaW5lLmJpbmQodGhpcyksIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLnNldERpcnR5KSwgdGhpcy5kaXJ0eSA9IHRydWUsIHRoaXMubGluZUVuZFZlYzMgPSBuZXcgUmUuVmVjdG9yMywgdGhpcy5vdGhlckxpbmVFbmRWZWMzID0gbmV3IFJlLlZlY3RvcjMsIHRoaXMubGluZURhdGEgPSB7IGVuZDogdGhpcy5saW5lRW5kVmVjMyB9LCB0aGlzLmdldEludGVyc2VjdGlvbiA9IHRoaXMuZ2V0SW50ZXJzZWN0aW9uLmJpbmQodGhpcyksIHRoaXMuaW50ZXJzZWN0ZWREZXRhaWwgPSB7IGVsOiB0aGlzLmVsLCBnZXRJbnRlcnNlY3Rpb246IHRoaXMuZ2V0SW50ZXJzZWN0aW9uIH0sIHRoaXMuaW50ZXJzZWN0ZWRDbGVhcmVkRGV0YWlsID0geyBlbDogdGhpcy5lbCB9LCB0aGlzLmludGVyc2VjdGlvbkNsZWFyZWREZXRhaWwgPSB7IGNsZWFyZWRFbHM6IHRoaXMuY2xlYXJlZEludGVyc2VjdGVkRWxzIH0sIHRoaXMuaW50ZXJzZWN0aW9uRGV0YWlsID0ge307CiAgfSwgdXBkYXRlOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSB0aGlzLmRhdGEsIG4yID0gdGhpcy5lbCwgaTIgPSB0aGlzLnJheWNhc3RlcjsKICAgIGkyLmZhciA9IHQyLmZhciwgaTIubmVhciA9IHQyLm5lYXIsICF0Mi5zaG93TGluZSB8fCB0Mi5mYXIgPT09IGUuZmFyICYmIHQyLm9yaWdpbiA9PT0gZS5vcmlnaW4gJiYgdDIuZGlyZWN0aW9uID09PSBlLmRpcmVjdGlvbiAmJiBlLnNob3dMaW5lIHx8ICh0aGlzLnVuaXRMaW5lRW5kVmVjMy5jb3B5KHQyLmRpcmVjdGlvbikubm9ybWFsaXplKCksIHRoaXMuZHJhd0xpbmUoKSksICF0Mi5zaG93TGluZSAmJiBlLnNob3dMaW5lICYmIG4yLnJlbW92ZUF0dHJpYnV0ZSgibGluZSIpLCB0Mi5vYmplY3RzID09PSBlLm9iamVjdHMgfHwgVkEudGVzdCh0Mi5vYmplY3RzKSB8fCBxQSgnW3JheWNhc3Rlcl0gU2VsZWN0b3IgIicgKyB0Mi5vYmplY3RzICsgJyIgbWF5IG5vdCB1cGRhdGUgYXV0b21hdGljYWxseSB3aXRoIERPTSBjaGFuZ2VzLicpLCB0Mi5vYmplY3RzIHx8IHFBKCdbcmF5Y2FzdGVyXSBGb3IgcGVyZm9ybWFuY2UsIHBsZWFzZSBkZWZpbmUgcmF5Y2FzdGVyLm9iamVjdHMgd2hlbiB1c2luZyByYXljYXN0ZXIgb3IgY3Vyc29yIGNvbXBvbmVudHMgdG8gd2hpdGVsaXN0IHdoaWNoIGVudGl0aWVzIHRvIGludGVyc2VjdCB3aXRoLiBlLmcuLCByYXljYXN0ZXI9Im9iamVjdHM6IFtkYXRhLXJheWNhc3RhYmxlXSIuJyksIHQyLmF1dG9SZWZyZXNoICE9PSBlLmF1dG9SZWZyZXNoICYmIG4yLmlzUGxheWluZyAmJiAodDIuYXV0b1JlZnJlc2ggPyB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCkgOiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCkpLCBlLmVuYWJsZWQgJiYgIXQyLmVuYWJsZWQgJiYgdGhpcy5jbGVhckFsbEludGVyc2VjdGlvbnMoKSwgdDIub2JqZWN0cyAhPT0gZS5vYmplY3RzICYmIHRoaXMuc2V0RGlydHkoKTsKICB9LCBwbGF5OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTsKICB9LCBwYXVzZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7CiAgfSwgcmVtb3ZlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZGF0YS5zaG93TGluZSAmJiB0aGlzLmVsLnJlbW92ZUF0dHJpYnV0ZSgibGluZSIpLCB0aGlzLmNsZWFyQWxsSW50ZXJzZWN0aW9ucygpOwogIH0sIGFkZEV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZGF0YS5hdXRvUmVmcmVzaCAmJiAodGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuZWwuc2NlbmVFbCwgekEpLCB0aGlzLmVsLnNjZW5lRWwuYWRkRXZlbnRMaXN0ZW5lcigib2JqZWN0M2RzZXQiLCB0aGlzLnNldERpcnR5KSwgdGhpcy5lbC5zY2VuZUVsLmFkZEV2ZW50TGlzdGVuZXIoIm9iamVjdDNkcmVtb3ZlIiwgdGhpcy5zZXREaXJ0eSkpOwogIH0sIHJlbW92ZUV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpLCB0aGlzLmVsLnNjZW5lRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigib2JqZWN0M2RzZXQiLCB0aGlzLnNldERpcnR5KSwgdGhpcy5lbC5zY2VuZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm9iamVjdDNkcmVtb3ZlIiwgdGhpcy5zZXREaXJ0eSk7CiAgfSwgc2V0RGlydHk6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5kaXJ0eSA9IHRydWU7CiAgfSwgcmVmcmVzaE9iamVjdHM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyID0gdGhpcy5kYXRhOwogICAgZSA9IHQyLm9iamVjdHMgPyB0aGlzLmVsLnNjZW5lRWwucXVlcnlTZWxlY3RvckFsbCh0Mi5vYmplY3RzKSA6IHRoaXMuZWwuc2NlbmVFbC5xdWVyeVNlbGVjdG9yQWxsKCIqIiksIHRoaXMub2JqZWN0cyA9IHRoaXMuZmxhdHRlbk9iamVjdDNETWFwcyhlKSwgdGhpcy5kaXJ0eSA9IGZhbHNlOwogIH0sIHRvY2s6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IHRoaXMuZGF0YSwgbjIgPSB0aGlzLnByZXZDaGVja1RpbWU7CiAgICB0Mi5lbmFibGVkICYmIChuMiAmJiBlIC0gbjIgPCB0Mi5pbnRlcnZhbCB8fCAodGhpcy5wcmV2Q2hlY2tUaW1lID0gZSwgdGhpcy5jaGVja0ludGVyc2VjdGlvbnMoKSkpOwogIH0sIGNoZWNrSW50ZXJzZWN0aW9uczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSwgdDIsIG4yID0gdGhpcy5jbGVhcmVkSW50ZXJzZWN0ZWRFbHMsIGkyID0gdGhpcy5lbCwgcjIgPSB0aGlzLmRhdGEsIG8yID0gdGhpcy5pbnRlcnNlY3RlZEVscywgczIgPSB0aGlzLmludGVyc2VjdGlvbnMsIGEyID0gdGhpcy5uZXdJbnRlcnNlY3RlZEVscywgQTIgPSB0aGlzLm5ld0ludGVyc2VjdGlvbnMsIGwyID0gdGhpcy5wcmV2SW50ZXJzZWN0ZWRFbHMsIGMyID0gdGhpcy5yYXdJbnRlcnNlY3Rpb25zOwogICAgZm9yICh0aGlzLmRpcnR5ICYmIHRoaXMucmVmcmVzaE9iamVjdHMoKSwgV0EodGhpcy5wcmV2SW50ZXJzZWN0ZWRFbHMsIHRoaXMuaW50ZXJzZWN0ZWRFbHMpLCB0aGlzLnVwZGF0ZU9yaWdpbkRpcmVjdGlvbigpLCBjMi5sZW5ndGggPSAwLCB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMub2JqZWN0cywgdHJ1ZSwgYzIpLCBzMi5sZW5ndGggPSAwLCBvMi5sZW5ndGggPSAwLCBlID0gMDtlIDwgYzIubGVuZ3RoOyBlKyspCiAgICAgIHQyID0gYzJbZV0sIHIyLnNob3dMaW5lICYmIHQyLm9iamVjdCA9PT0gaTIuZ2V0T2JqZWN0M0QoImxpbmUiKSB8fCB0Mi5vYmplY3QuZWwgJiYgKHMyLnB1c2godDIpLCBvMi5wdXNoKHQyLm9iamVjdC5lbCkpOwogICAgZm9yIChBMi5sZW5ndGggPSAwLCBhMi5sZW5ndGggPSAwLCBlID0gMDtlIDwgczIubGVuZ3RoOyBlKyspCiAgICAgIGwyLmluZGV4T2YoczJbZV0ub2JqZWN0LmVsKSA9PT0gLTEgJiYgKEEyLnB1c2goczJbZV0pLCBhMi5wdXNoKHMyW2VdLm9iamVjdC5lbCkpOwogICAgZm9yIChuMi5sZW5ndGggPSAwLCBlID0gMDtlIDwgbDIubGVuZ3RoOyBlKyspCiAgICAgIG8yLmluZGV4T2YobDJbZV0pID09PSAtMSAmJiAobDJbZV0uZW1pdChZQSwgdGhpcy5pbnRlcnNlY3RlZENsZWFyZWREZXRhaWwpLCBuMi5wdXNoKGwyW2VdKSk7CiAgICBmb3IgKG4yLmxlbmd0aCAmJiBpMi5lbWl0KEtBLCB0aGlzLmludGVyc2VjdGlvbkNsZWFyZWREZXRhaWwpLCBlID0gMDtlIDwgYTIubGVuZ3RoOyBlKyspCiAgICAgIGEyW2VdLmVtaXQoInJheWNhc3Rlci1pbnRlcnNlY3RlZCIsIHRoaXMuaW50ZXJzZWN0ZWREZXRhaWwpOwogICAgQTIubGVuZ3RoICYmICh0aGlzLmludGVyc2VjdGlvbkRldGFpbC5lbHMgPSBhMiwgdGhpcy5pbnRlcnNlY3Rpb25EZXRhaWwuaW50ZXJzZWN0aW9ucyA9IEEyLCBpMi5lbWl0KCJyYXljYXN0ZXItaW50ZXJzZWN0aW9uIiwgdGhpcy5pbnRlcnNlY3Rpb25EZXRhaWwpKSwgKGwyLmxlbmd0aCA9PT0gMCAmJiBzMi5sZW5ndGggPiAwIHx8IGwyLmxlbmd0aCA+IDAgJiYgczIubGVuZ3RoID09PSAwIHx8IGwyLmxlbmd0aCAmJiBzMi5sZW5ndGggJiYgbDJbMF0gIT09IHMyWzBdLm9iamVjdC5lbCkgJiYgKHRoaXMuaW50ZXJzZWN0aW9uRGV0YWlsLmVscyA9IHRoaXMuaW50ZXJzZWN0ZWRFbHMsIHRoaXMuaW50ZXJzZWN0aW9uRGV0YWlsLmludGVyc2VjdGlvbnMgPSBzMiwgaTIuZW1pdCgicmF5Y2FzdGVyLWNsb3Nlc3QtZW50aXR5LWNoYW5nZWQiLCB0aGlzLmludGVyc2VjdGlvbkRldGFpbCkpLCByMi5zaG93TGluZSAmJiBzZXRUaW1lb3V0KHRoaXMudXBkYXRlTGluZSk7CiAgfSwgdXBkYXRlTGluZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSwgdDIgPSB0aGlzLmVsLCBuMiA9IHRoaXMuaW50ZXJzZWN0aW9uczsKICAgIG4yLmxlbmd0aCAmJiAoZSA9IG4yWzBdLm9iamVjdC5lbCA9PT0gdDIgJiYgbjJbMV0gPyBuMlsxXS5kaXN0YW5jZSA6IG4yWzBdLmRpc3RhbmNlKSwgdGhpcy5kcmF3TGluZShlKTsKICB9LCBnZXRJbnRlcnNlY3Rpb246IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjI7CiAgICBmb3IgKHQyID0gMDt0MiA8IHRoaXMuaW50ZXJzZWN0aW9ucy5sZW5ndGg7IHQyKyspCiAgICAgIGlmICgobjIgPSB0aGlzLmludGVyc2VjdGlvbnNbdDJdKS5vYmplY3QuZWwgPT09IGUpCiAgICAgICAgcmV0dXJuIG4yOwogICAgcmV0dXJuIG51bGw7CiAgfSwgdXBkYXRlT3JpZ2luRGlyZWN0aW9uOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gbmV3IFJlLlZlY3RvcjMsIHQyID0gbmV3IFJlLlZlY3RvcjM7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBuMiA9IHRoaXMuZWwsIGkyID0gdGhpcy5kYXRhOwogICAgICBpMi51c2VXb3JsZENvb3JkaW5hdGVzID8gdGhpcy5yYXljYXN0ZXIuc2V0KGkyLm9yaWdpbiwgaTIuZGlyZWN0aW9uKSA6IChuMi5vYmplY3QzRC51cGRhdGVNYXRyaXhXb3JsZCgpLCB0Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24objIub2JqZWN0M0QubWF0cml4V29ybGQpLCBpMi5vcmlnaW4ueCA9PT0gMCAmJiBpMi5vcmlnaW4ueSA9PT0gMCAmJiBpMi5vcmlnaW4ueiA9PT0gMCB8fCAodDIgPSBuMi5vYmplY3QzRC5sb2NhbFRvV29ybGQodDIuY29weShpMi5vcmlnaW4pKSksIGUuY29weShpMi5kaXJlY3Rpb24pLnRyYW5zZm9ybURpcmVjdGlvbihuMi5vYmplY3QzRC5tYXRyaXhXb3JsZCkubm9ybWFsaXplKCksIHRoaXMucmF5Y2FzdGVyLnNldCh0MiwgZSkpOwogICAgfTsKICB9KCksIGRyYXdMaW5lOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIsIG4yID0gdGhpcy5kYXRhLCBpMiA9IHRoaXMuZWw7CiAgICB0MiA9IHRoaXMubGluZURhdGEuZW5kID09PSB0aGlzLmxpbmVFbmRWZWMzID8gdGhpcy5vdGhlckxpbmVFbmRWZWMzIDogdGhpcy5saW5lRW5kVmVjMywgZSA9PT0gdW5kZWZpbmVkICYmIChlID0gbjIuZmFyID09PSAxIC8gMCA/IDEwMDAgOiBuMi5mYXIpLCB0aGlzLmxpbmVEYXRhLnN0YXJ0ID0gbjIub3JpZ2luLCB0aGlzLmxpbmVEYXRhLmVuZCA9IHQyLmNvcHkodGhpcy51bml0TGluZUVuZFZlYzMpLm11bHRpcGx5U2NhbGFyKGUpLmFkZChuMi5vcmlnaW4pLCB0aGlzLmxpbmVEYXRhLmNvbG9yID0gbjIubGluZUNvbG9yLCB0aGlzLmxpbmVEYXRhLm9wYWNpdHkgPSBuMi5saW5lT3BhY2l0eSwgaTIuc2V0QXR0cmlidXRlKCJsaW5lIiwgdGhpcy5saW5lRGF0YSk7CiAgfSwgZmxhdHRlbk9iamVjdDNETWFwczogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiwgaTIgPSB0aGlzLm9iamVjdHMsIHIyID0gdGhpcy5lbC5zY2VuZUVsLm9iamVjdDNEOwogICAgZnVuY3Rpb24gbzIoZTIpIHsKICAgICAgcmV0dXJuIGUyLnBhcmVudCA/IG8yKGUyLnBhcmVudCkgOiBlMiA9PT0gcjI7CiAgICB9CiAgICBmb3IgKGkyLmxlbmd0aCA9IDAsIG4yID0gMDtuMiA8IGUubGVuZ3RoOyBuMisrKSB7CiAgICAgIHZhciBzMiA9IGVbbjJdOwogICAgICBpZiAoczIuaXNFbnRpdHkgJiYgczIub2JqZWN0M0QgJiYgbzIoczIub2JqZWN0M0QpKQogICAgICAgIGZvciAodDIgaW4gczIub2JqZWN0M0RNYXApCiAgICAgICAgICBpMi5wdXNoKHMyLmdldE9iamVjdDNEKHQyKSk7CiAgICB9CiAgICByZXR1cm4gaTI7CiAgfSwgY2xlYXJBbGxJbnRlcnNlY3Rpb25zOiBmdW5jdGlvbigpIHsKICAgIHZhciBlOwogICAgZm9yIChlID0gMDtlIDwgdGhpcy5pbnRlcnNlY3RlZEVscy5sZW5ndGg7IGUrKykKICAgICAgdGhpcy5pbnRlcnNlY3RlZEVsc1tlXS5lbWl0KFlBLCB0aGlzLmludGVyc2VjdGVkQ2xlYXJlZERldGFpbCk7CiAgICBXQSh0aGlzLmNsZWFyZWRJbnRlcnNlY3RlZEVscywgdGhpcy5pbnRlcnNlY3RlZEVscyksIHRoaXMuaW50ZXJzZWN0ZWRFbHMubGVuZ3RoID0gMCwgdGhpcy5pbnRlcnNlY3Rpb25zLmxlbmd0aCA9IDAsIHRoaXMuZWwuZW1pdChLQSwgdGhpcy5pbnRlcnNlY3Rpb25DbGVhcmVkRGV0YWlsKTsKICB9IH0pOwogIGVsID0gUmUuTWF0aFV0aWxzLmRlZ1RvUmFkOwogIHRsID0gKGNzKCJyb3RhdGlvbiIsIHsgc2NoZW1hOiB7IHR5cGU6ICJ2ZWMzIiB9LCB1cGRhdGU6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmRhdGE7CiAgICB0aGlzLmVsLm9iamVjdDNELnJvdGF0aW9uLnNldChlbChlLngpLCBlbChlLnkpLCBlbChlLnopLCAiWVhaIik7CiAgfSwgcmVtb3ZlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwub2JqZWN0M0Qucm90YXRpb24uc2V0KDAsIDAsIDApOwogIH0gfSksIGNzKCJzY2FsZSIsIHsgc2NoZW1hOiB7IHR5cGU6ICJ2ZWMzIiwgZGVmYXVsdDogeyB4OiAxLCB5OiAxLCB6OiAxIH0gfSwgdXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5kYXRhOwogICAgdGhpcy5lbC5vYmplY3QzRC5zY2FsZS5zZXQoZS54LCBlLnksIGUueik7CiAgfSwgcmVtb3ZlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwub2JqZWN0M0Quc2NhbGUuc2V0KDEsIDEsIDEpOwogIH0gfSksIGNzKCJzaGFkb3ciLCB7IHNjaGVtYTogeyBjYXN0OiB7IGRlZmF1bHQ6IHRydWUgfSwgcmVjZWl2ZTogeyBkZWZhdWx0OiB0cnVlIH0gfSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLm9uTWVzaENoYW5nZWQgPSB0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpLCB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoIm9iamVjdDNkc2V0IiwgdGhpcy5vbk1lc2hDaGFuZ2VkKSwgdGhpcy5zeXN0ZW0uc2V0U2hhZG93TWFwRW5hYmxlZCh0cnVlKTsKICB9LCB1cGRhdGU6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmRhdGE7CiAgICB0aGlzLnVwZGF0ZURlc2NlbmRhbnRzKGUuY2FzdCwgZS5yZWNlaXZlKTsKICB9LCByZW1vdmU6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCJvYmplY3QzZHNldCIsIHRoaXMub25NZXNoQ2hhbmdlZCksIHRoaXMudXBkYXRlRGVzY2VuZGFudHMoZmFsc2UsIGZhbHNlKTsKICB9LCB1cGRhdGVEZXNjZW5kYW50czogZnVuY3Rpb24oZSwgdDIpIHsKICAgIHZhciBuMiA9IHRoaXMuZWwuc2NlbmVFbDsKICAgIHRoaXMuZWwub2JqZWN0M0QudHJhdmVyc2UoZnVuY3Rpb24oaTIpIHsKICAgICAgaWYgKGkyIGluc3RhbmNlb2YgUmUuTWVzaCAmJiAoaTIuY2FzdFNoYWRvdyA9IGUsIGkyLnJlY2VpdmVTaGFkb3cgPSB0MiwgbjIuaGFzTG9hZGVkICYmIGkyLm1hdGVyaWFsKSkKICAgICAgICBmb3IgKHZhciByMiA9IEFycmF5LmlzQXJyYXkoaTIubWF0ZXJpYWwpID8gaTIubWF0ZXJpYWwgOiBbaTIubWF0ZXJpYWxdLCBvMiA9IDA7bzIgPCByMi5sZW5ndGg7IG8yKyspCiAgICAgICAgICByMltvMl0ubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgfSk7CiAgfSB9KSwgZmkoImNvbXBvbmVudHM6c291bmQ6d2FybiIpKTsKICBubCA9IChjcygic291bmQiLCB7IHNjaGVtYTogeyBhdXRvcGxheTogeyBkZWZhdWx0OiBmYWxzZSB9LCBkaXN0YW5jZU1vZGVsOiB7IGRlZmF1bHQ6ICJpbnZlcnNlIiwgb25lT2Y6IFsibGluZWFyIiwgImludmVyc2UiLCAiZXhwb25lbnRpYWwiXSB9LCBsb29wOiB7IGRlZmF1bHQ6IGZhbHNlIH0sIGxvb3BTdGFydDogeyBkZWZhdWx0OiAwIH0sIGxvb3BFbmQ6IHsgZGVmYXVsdDogMCB9LCBtYXhEaXN0YW5jZTogeyBkZWZhdWx0OiAxZTQgfSwgb246IHsgZGVmYXVsdDogIiIgfSwgcG9vbFNpemU6IHsgZGVmYXVsdDogMSB9LCBwb3NpdGlvbmFsOiB7IGRlZmF1bHQ6IHRydWUgfSwgcmVmRGlzdGFuY2U6IHsgZGVmYXVsdDogMSB9LCByb2xsb2ZmRmFjdG9yOiB7IGRlZmF1bHQ6IDEgfSwgc3JjOiB7IHR5cGU6ICJhdWRpbyIgfSwgdm9sdW1lOiB7IGRlZmF1bHQ6IDEgfSB9LCBtdWx0aXBsZTogdHJ1ZSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXM7CiAgICB0aGlzLmxpc3RlbmVyID0gbnVsbCwgdGhpcy5hdWRpb0xvYWRlciA9IG5ldyBSZS5BdWRpb0xvYWRlciwgdGhpcy5wb29sID0gbmV3IFJlLkdyb3VwLCB0aGlzLmxvYWRlZCA9IGZhbHNlLCB0aGlzLm11c3RQbGF5ID0gZmFsc2UsIHRoaXMucGxheVNvdW5kQm91bmQgPSBmdW5jdGlvbigpIHsKICAgICAgZS5wbGF5U291bmQoKTsKICAgIH07CiAgfSwgdXBkYXRlOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIsIG4yLCBpMiA9IHRoaXMuZGF0YSwgcjIgPSBpMi5zcmMgIT09IGUuc3JjOwogICAgaWYgKHIyKSB7CiAgICAgIGlmICghaTIuc3JjKQogICAgICAgIHJldHVybjsKICAgICAgdGhpcy5zZXR1cFNvdW5kKCk7CiAgICB9CiAgICBmb3IgKHQyID0gMDt0MiA8IHRoaXMucG9vbC5jaGlsZHJlbi5sZW5ndGg7IHQyKyspCiAgICAgIG4yID0gdGhpcy5wb29sLmNoaWxkcmVuW3QyXSwgaTIucG9zaXRpb25hbCAmJiAobjIuc2V0RGlzdGFuY2VNb2RlbChpMi5kaXN0YW5jZU1vZGVsKSwgbjIuc2V0TWF4RGlzdGFuY2UoaTIubWF4RGlzdGFuY2UpLCBuMi5zZXRSZWZEaXN0YW5jZShpMi5yZWZEaXN0YW5jZSksIG4yLnNldFJvbGxvZmZGYWN0b3IoaTIucm9sbG9mZkZhY3RvcikpLCBuMi5zZXRMb29wKGkyLmxvb3ApLCBuMi5zZXRMb29wU3RhcnQoaTIubG9vcFN0YXJ0KSwgaTIubG9vcFN0YXJ0ICE9PSAwICYmIGkyLmxvb3BFbmQgPT09IDAgPyBuMi5zZXRMb29wRW5kKG4yLmJ1ZmZlci5kdXJhdGlvbikgOiBuMi5zZXRMb29wRW5kKGkyLmxvb3BFbmQpLCBuMi5zZXRWb2x1bWUoaTIudm9sdW1lKSwgbjIuaXNQYXVzZWQgPSBmYWxzZTsKICAgIGlmIChpMi5vbiAhPT0gZS5vbiAmJiB0aGlzLnVwZGF0ZUV2ZW50TGlzdGVuZXIoZS5vbiksIHIyKSB7CiAgICAgIHZhciBvMiA9IHRoaXM7CiAgICAgIHRoaXMubG9hZGVkID0gZmFsc2UsIHRoaXMuYXVkaW9Mb2FkZXIubG9hZChpMi5zcmMsIGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgZm9yICh0MiA9IDA7dDIgPCBvMi5wb29sLmNoaWxkcmVuLmxlbmd0aDsgdDIrKykKICAgICAgICAgIChuMiA9IG8yLnBvb2wuY2hpbGRyZW5bdDJdKS5zZXRCdWZmZXIoZTIpOwogICAgICAgIG8yLmxvYWRlZCA9IHRydWUsIFJlLkNhY2hlLnJlbW92ZShpMi5zcmMpLCAobzIuZGF0YS5hdXRvcGxheSB8fCBvMi5tdXN0UGxheSkgJiYgbzIucGxheVNvdW5kKG8yLnByb2Nlc3NTb3VuZCksIG8yLmVsLmVtaXQoInNvdW5kLWxvYWRlZCIsIG8yLmV2dERldGFpbCwgZmFsc2UpOwogICAgICB9KTsKICAgIH0KICB9LCBwYXVzZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnN0b3BTb3VuZCgpLCB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoKTsKICB9LCBwbGF5OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZGF0YS5hdXRvcGxheSAmJiB0aGlzLnBsYXlTb3VuZCgpLCB0aGlzLnVwZGF0ZUV2ZW50TGlzdGVuZXIoKTsKICB9LCByZW1vdmU6IGZ1bmN0aW9uKCkgewogICAgdmFyIGU7CiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoKSwgdGhpcy5lbC5nZXRPYmplY3QzRCh0aGlzLmF0dHJOYW1lKSAmJiB0aGlzLmVsLnJlbW92ZU9iamVjdDNEKHRoaXMuYXR0ck5hbWUpOwogICAgdHJ5IHsKICAgICAgZm9yIChlID0gMDtlIDwgdGhpcy5wb29sLmNoaWxkcmVuLmxlbmd0aDsgZSsrKQogICAgICAgIHRoaXMucG9vbC5jaGlsZHJlbltlXS5kaXNjb25uZWN0KCk7CiAgICB9IGNhdGNoIChlMikgewogICAgICB0bCgiQXVkaW8gc291cmNlIG5vdCBwcm9wZXJseSBkaXNjb25uZWN0ZWQiKTsKICAgIH0KICB9LCB1cGRhdGVFdmVudExpc3RlbmVyOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSB0aGlzLmVsOwogICAgZSAmJiB0Mi5yZW1vdmVFdmVudExpc3RlbmVyKGUsIHRoaXMucGxheVNvdW5kQm91bmQpLCB0Mi5hZGRFdmVudExpc3RlbmVyKHRoaXMuZGF0YS5vbiwgdGhpcy5wbGF5U291bmRCb3VuZCk7CiAgfSwgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5kYXRhLm9uLCB0aGlzLnBsYXlTb3VuZEJvdW5kKTsKICB9LCBzZXR1cFNvdW5kOiBmdW5jdGlvbigpIHsKICAgIHZhciBlLCB0MiwgbjIgPSB0aGlzLmVsLCBpMiA9IG4yLnNjZW5lRWwsIHIyID0gdGhpczsKICAgIHRoaXMucG9vbC5jaGlsZHJlbi5sZW5ndGggPiAwICYmICh0aGlzLnN0b3BTb3VuZCgpLCBuMi5yZW1vdmVPYmplY3QzRCgic291bmQiKSk7CiAgICB2YXIgbzIgPSB0aGlzLmxpc3RlbmVyID0gaTIuYXVkaW9MaXN0ZW5lciB8fCBuZXcgUmUuQXVkaW9MaXN0ZW5lcjsKICAgIGZvciAoaTIuYXVkaW9MaXN0ZW5lciA9IG8yLCBpMi5jYW1lcmEgJiYgaTIuY2FtZXJhLmFkZChvMiksIGkyLmFkZEV2ZW50TGlzdGVuZXIoImNhbWVyYS1zZXQtYWN0aXZlIiwgZnVuY3Rpb24oZTIpIHsKICAgICAgZTIuZGV0YWlsLmNhbWVyYUVsLmdldE9iamVjdDNEKCJjYW1lcmEiKS5hZGQobzIpOwogICAgfSksIHRoaXMucG9vbCA9IG5ldyBSZS5Hcm91cCwgZSA9IDA7ZSA8IHRoaXMuZGF0YS5wb29sU2l6ZTsgZSsrKQogICAgICB0MiA9IHRoaXMuZGF0YS5wb3NpdGlvbmFsID8gbmV3IFJlLlBvc2l0aW9uYWxBdWRpbyhvMikgOiBuZXcgUmUuQXVkaW8obzIpLCB0aGlzLnBvb2wuYWRkKHQyKTsKICAgIGZvciAobjIuc2V0T2JqZWN0M0QodGhpcy5hdHRyTmFtZSwgdGhpcy5wb29sKSwgZSA9IDA7ZSA8IHRoaXMucG9vbC5jaGlsZHJlbi5sZW5ndGg7IGUrKykKICAgICAgKHQyID0gdGhpcy5wb29sLmNoaWxkcmVuW2VdKS5vbkVuZGVkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZSwgcjIuZWwuZW1pdCgic291bmQtZW5kZWQiLCByMi5ldnREZXRhaWwsIGZhbHNlKTsKICAgICAgfTsKICB9LCBwYXVzZVNvdW5kOiBmdW5jdGlvbigpIHsKICAgIHZhciBlLCB0MjsKICAgIGZvciAodGhpcy5pc1BsYXlpbmcgPSBmYWxzZSwgZSA9IDA7ZSA8IHRoaXMucG9vbC5jaGlsZHJlbi5sZW5ndGg7IGUrKykKICAgICAgKHQyID0gdGhpcy5wb29sLmNoaWxkcmVuW2VdKS5zb3VyY2UgJiYgdDIuc291cmNlLmJ1ZmZlciAmJiB0Mi5pc1BsYXlpbmcgJiYgIXQyLmlzUGF1c2VkICYmICh0Mi5pc1BhdXNlZCA9IHRydWUsIHQyLnBhdXNlKCkpOwogIH0sIHBsYXlTb3VuZDogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiwgaTI7CiAgICBpZiAoIXRoaXMubG9hZGVkKQogICAgICByZXR1cm4gdGwoIlNvdW5kIG5vdCBsb2FkZWQgeWV0LiBJdCB3aWxsIGJlIHBsYXllZCBvbmNlIGl0IGZpbmlzaGVkIGxvYWRpbmciKSwgdGhpcy5tdXN0UGxheSA9IHRydWUsIHZvaWQgKHRoaXMucHJvY2Vzc1NvdW5kID0gZSk7CiAgICBmb3IgKHQyID0gZmFsc2UsIHRoaXMuaXNQbGF5aW5nID0gdHJ1ZSwgbjIgPSAwO24yIDwgdGhpcy5wb29sLmNoaWxkcmVuLmxlbmd0aDsgbjIrKykKICAgICAgKGkyID0gdGhpcy5wb29sLmNoaWxkcmVuW24yXSkuaXNQbGF5aW5nIHx8ICFpMi5idWZmZXIgfHwgdDIgfHwgKGUgJiYgZShpMiksIGkyLnBsYXkoKSwgaTIuaXNQYXVzZWQgPSBmYWxzZSwgdDIgPSB0cnVlKTsKICAgIHQyID8gKHRoaXMubXVzdFBsYXkgPSBmYWxzZSwgdGhpcy5wcm9jZXNzU291bmQgPSB1bmRlZmluZWQpIDogdGwoIkFsbCB0aGUgc291bmRzIGFyZSBwbGF5aW5nLiBJZiB5b3UgbmVlZCB0byBwbGF5IG1vcmUgc291bmRzIHNpbXVsdGFuZW91c2x5IGNvbnNpZGVyIGluY3JlYXNpbmcgdGhlIHNpemUgb2YgcG9vbCB3aXRoIHRoZSBgcG9vbFNpemVgIGF0dHJpYnV0ZS4iLCB0aGlzLmVsKTsKICB9LCBzdG9wU291bmQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyOwogICAgZm9yICh0aGlzLmlzUGxheWluZyA9IGZhbHNlLCBlID0gMDtlIDwgdGhpcy5wb29sLmNoaWxkcmVuLmxlbmd0aDsgZSsrKSB7CiAgICAgIGlmICghKHQyID0gdGhpcy5wb29sLmNoaWxkcmVuW2VdKS5zb3VyY2UgfHwgIXQyLnNvdXJjZS5idWZmZXIpCiAgICAgICAgcmV0dXJuOwogICAgICB0Mi5zdG9wKCk7CiAgICB9CiAgfSB9KSwgaSg0NDMzKSk7CiAgaWwgPSBpLm4obmwpOwogIHJsID0gaSg1NzUxKTsKICBvbCA9IGkubihybCk7CiAgc2wgPSBmaSgiY29tcG9uZW50czp0ZXh0OmVycm9yIik7CiAgYWwgPSBmaSgiY29tcG9uZW50czp0ZXh0Ondhcm4iKTsKICBBbCA9IGNpICsgImZvbnRzLyI7CiAgbGwgPSB7IGFpbGVyb25zZW1pYm9sZDogQWwgKyAiQWlsZXJvbi1TZW1pYm9sZC5mbnQiLCBkZWphdnU6IEFsICsgIkRlamFWdS1zZGYuZm50IiwgZXhvMmJvbGQ6IEFsICsgIkV4bzJCb2xkLmZudCIsIGV4bzJzZW1pYm9sZDogQWwgKyAiRXhvMlNlbWlCb2xkLmZudCIsIGtlbHNvbnNhbnM6IEFsICsgIktlbHNvblNhbnMuZm50IiwgbW9ub2lkOiBBbCArICJNb25vaWQuZm50IiwgbW96aWxsYXZyOiBBbCArICJtb3ppbGxhdnIuZm50Iiwgcm9ib3RvOiBBbCArICJSb2JvdG8tbXNkZi5qc29uIiwgc291cmNlY29kZXBybzogQWwgKyAiU291cmNlQ29kZVByby5mbnQiIH07CiAgY2wgPSBbInJvYm90byJdOwogIGRsID0gbmV3IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmNhY2hlID0ge307CiAgICB0aGlzLmdldCA9IGZ1bmN0aW9uKHQyLCBuMikgewogICAgICByZXR1cm4gdDIgaW4gZSB8fCAoZVt0Ml0gPSBuMigpKSwgZVt0Ml07CiAgICB9OwogIH07CiAgdWwgPSB7fTsKICBnbCA9IHt9OwogIHBsID0gL15cdys6LzsKICBjcygidGV4dCIsIHsgbXVsdGlwbGU6IHRydWUsIHNjaGVtYTogeyBhbGlnbjogeyB0eXBlOiAic3RyaW5nIiwgZGVmYXVsdDogImxlZnQiLCBvbmVPZjogWyJsZWZ0IiwgInJpZ2h0IiwgImNlbnRlciJdIH0sIGFscGhhVGVzdDogeyBkZWZhdWx0OiAwLjUgfSwgYW5jaG9yOiB7IGRlZmF1bHQ6ICJjZW50ZXIiLCBvbmVPZjogWyJsZWZ0IiwgInJpZ2h0IiwgImNlbnRlciIsICJhbGlnbiJdIH0sIGJhc2VsaW5lOiB7IGRlZmF1bHQ6ICJjZW50ZXIiLCBvbmVPZjogWyJ0b3AiLCAiY2VudGVyIiwgImJvdHRvbSJdIH0sIGNvbG9yOiB7IHR5cGU6ICJjb2xvciIsIGRlZmF1bHQ6ICIjRkZGIiB9LCBmb250OiB7IHR5cGU6ICJzdHJpbmciLCBkZWZhdWx0OiBobCB9LCBmb250SW1hZ2U6IHsgdHlwZTogInN0cmluZyIgfSwgaGVpZ2h0OiB7IHR5cGU6ICJudW1iZXIiIH0sIGxldHRlclNwYWNpbmc6IHsgdHlwZTogIm51bWJlciIsIGRlZmF1bHQ6IDAgfSwgbGluZUhlaWdodDogeyB0eXBlOiAibnVtYmVyIiB9LCBuZWdhdGU6IHsgdHlwZTogImJvb2xlYW4iLCBkZWZhdWx0OiB0cnVlIH0sIG9wYWNpdHk6IHsgdHlwZTogIm51bWJlciIsIGRlZmF1bHQ6IDEgfSwgc2hhZGVyOiB7IGRlZmF1bHQ6ICJzZGYiLCBvbmVPZjogJHMgfSwgc2lkZTogeyBkZWZhdWx0OiAiZnJvbnQiLCBvbmVPZjogWyJmcm9udCIsICJiYWNrIiwgImRvdWJsZSJdIH0sIHRhYlNpemU6IHsgZGVmYXVsdDogNCB9LCB0cmFuc3BhcmVudDogeyBkZWZhdWx0OiB0cnVlIH0sIHZhbHVlOiB7IHR5cGU6ICJzdHJpbmciIH0sIHdoaXRlU3BhY2U6IHsgZGVmYXVsdDogIm5vcm1hbCIsIG9uZU9mOiBbIm5vcm1hbCIsICJwcmUiLCAibm93cmFwIl0gfSwgd2lkdGg6IHsgdHlwZTogIm51bWJlciIgfSwgd3JhcENvdW50OiB7IHR5cGU6ICJudW1iZXIiLCBkZWZhdWx0OiA0MCB9LCB3cmFwUGl4ZWxzOiB7IHR5cGU6ICJudW1iZXIiIH0sIHhPZmZzZXQ6IHsgdHlwZTogIm51bWJlciIsIGRlZmF1bHQ6IDAgfSwgeU9mZnNldDogeyB0eXBlOiAibnVtYmVyIiwgZGVmYXVsdDogMCB9LCB6T2Zmc2V0OiB7IHR5cGU6ICJudW1iZXIiLCBkZWZhdWx0OiAwLjAwMSB9IH0sIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zaGFkZXJEYXRhID0ge30sIHRoaXMuZ2VvbWV0cnkgPSBpbCgpKCksIHRoaXMuY3JlYXRlT3JVcGRhdGVNYXRlcmlhbCgpLCB0aGlzLmV4cGxpY2l0R2VvRGltZW5zaW9uc0NoZWNrZWQgPSBmYWxzZTsKICB9LCB1cGRhdGU6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IHRoaXMuZGF0YSwgbjIgPSB0aGlzLmN1cnJlbnRGb250OwogICAgZ2xbdDIuZm9udF0gPyB0aGlzLnRleHR1cmUgPSBnbFt0Mi5mb250XSA6ICh0aGlzLnRleHR1cmUgPSBnbFt0Mi5mb250XSA9IG5ldyBSZS5UZXh0dXJlLCB0aGlzLnRleHR1cmUuYW5pc290cm9weSA9IDE2KSwgdGhpcy5jcmVhdGVPclVwZGF0ZU1hdGVyaWFsKCksIGUuZm9udCA9PT0gdDIuZm9udCA/IG4yICYmICh0aGlzLnVwZGF0ZUdlb21ldHJ5KHRoaXMuZ2VvbWV0cnksIG4yKSwgdGhpcy51cGRhdGVMYXlvdXQoKSkgOiB0aGlzLnVwZGF0ZUZvbnQoKTsKICB9LCByZW1vdmU6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksIHRoaXMuZ2VvbWV0cnkgPSBudWxsLCB0aGlzLmVsLnJlbW92ZU9iamVjdDNEKHRoaXMuYXR0ck5hbWUpLCB0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKSwgdGhpcy5tYXRlcmlhbCA9IG51bGwsIHRoaXMudGV4dHVyZS5kaXNwb3NlKCksIHRoaXMudGV4dHVyZSA9IG51bGwsIHRoaXMuc2hhZGVyT2JqZWN0ICYmIGRlbGV0ZSB0aGlzLnNoYWRlck9iamVjdDsKICB9LCBjcmVhdGVPclVwZGF0ZU1hdGVyaWFsOiBmdW5jdGlvbigpIHsKICAgIHZhciBlLCB0MiwgbjIsIGkyID0gdGhpcy5kYXRhLCByMiA9IHRoaXMubWF0ZXJpYWwsIG8yID0gdGhpcy5zaGFkZXJEYXRhOwogICAgaWYgKG4yID0gaTIuc2hhZGVyLCBjbC5pbmRleE9mKGkyLmZvbnQpICE9PSAtMSB8fCBpMi5mb250LmluZGV4T2YoIi1tc2RmLiIpID49IDAgPyBuMiA9ICJtc2RmIiA6IChpMi5mb250IGluIGxsKSAmJiBjbC5pbmRleE9mKGkyLmZvbnQpID09PSAtMSAmJiAobjIgPSAic2RmIiksIGUgPSAodGhpcy5zaGFkZXJPYmplY3QgJiYgdGhpcy5zaGFkZXJPYmplY3QubmFtZSkgIT09IG4yLCBvMi5hbHBoYVRlc3QgPSBpMi5hbHBoYVRlc3QsIG8yLmNvbG9yID0gaTIuY29sb3IsIG8yLm1hcCA9IHRoaXMudGV4dHVyZSwgbzIub3BhY2l0eSA9IGkyLm9wYWNpdHksIG8yLnNpZGUgPSBmdW5jdGlvbihlMikgewogICAgICBzd2l0Y2ggKGUyKSB7CiAgICAgICAgY2FzZSAiYmFjayI6CiAgICAgICAgICByZXR1cm4gUmUuRnJvbnRTaWRlOwogICAgICAgIGNhc2UgImRvdWJsZSI6CiAgICAgICAgICByZXR1cm4gUmUuRG91YmxlU2lkZTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIFJlLkJhY2tTaWRlOwogICAgICB9CiAgICB9KGkyLnNpZGUpLCBvMi50cmFuc3BhcmVudCA9IGkyLnRyYW5zcGFyZW50LCBvMi5uZWdhdGUgPSBpMi5uZWdhdGUsICFlKQogICAgICByZXR1cm4gdGhpcy5zaGFkZXJPYmplY3QudXBkYXRlKG8yKSwgcjIudHJhbnNwYXJlbnQgPSBvMi50cmFuc3BhcmVudCwgdm9pZCAocjIuc2lkZSA9IG8yLnNpZGUpOwogICAgdDIgPSBmdW5jdGlvbihlMiwgdDMsIG4zKSB7CiAgICAgIHZhciBpMywgcjM7CiAgICAgIHJldHVybiAocjMgPSBuZXcgJHNbdDNdLlNoYWRlcikuZWwgPSBlMiwgcjMuaW5pdChuMyksIHIzLnVwZGF0ZShuMyksIChpMyA9IHIzLm1hdGVyaWFsKS50cmFuc3BhcmVudCA9IG4zLnRyYW5zcGFyZW50LCB7IG1hdGVyaWFsOiBpMywgc2hhZGVyOiByMyB9OwogICAgfSh0aGlzLmVsLCBuMiwgbzIpLCB0aGlzLm1hdGVyaWFsID0gdDIubWF0ZXJpYWwsIHRoaXMuc2hhZGVyT2JqZWN0ID0gdDIuc2hhZGVyLCB0aGlzLm1hdGVyaWFsLnNpZGUgPSBvMi5zaWRlLCB0aGlzLm1lc2ggJiYgKHRoaXMubWVzaC5tYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWwpOwogIH0sIHVwZGF0ZUZvbnQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyID0gdGhpcy5kYXRhLCBuMiA9IHRoaXMuZWwsIGkyID0gdGhpcy5nZW9tZXRyeSwgcjIgPSB0aGlzOwogICAgdDIuZm9udCB8fCBhbCgiTm8gZm9udCBzcGVjaWZpZWQuIFVzaW5nIHRoZSBkZWZhdWx0IGZvbnQuIiksIHRoaXMubWVzaCAmJiAodGhpcy5tZXNoLnZpc2libGUgPSBmYWxzZSksIGUgPSB0aGlzLmxvb2t1cEZvbnQodDIuZm9udCB8fCBobCkgfHwgdDIuZm9udCwgZGwuZ2V0KGUsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oZTIsIHQzKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4zLCBpMykgewogICAgICAgICAgb2woKShlMiwgZnVuY3Rpb24ocjMsIG8yKSB7CiAgICAgICAgICAgIGlmIChyMykKICAgICAgICAgICAgICByZXR1cm4gc2woIkVycm9yIGxvYWRpbmcgZm9udCIsIGUyKSwgdm9pZCBpMyhyMyk7CiAgICAgICAgICAgIGUyLmluZGV4T2YoIi9Sb2JvdG8tbXNkZi5qc29uIikgPj0gMCAmJiAodDMgPSAzMCksIHQzICYmIG8yLmNoYXJzLmZvckVhY2goZnVuY3Rpb24oZTMpIHsKICAgICAgICAgICAgICBlMy55b2Zmc2V0ICs9IHQzOwogICAgICAgICAgICB9KSwgbjMobzIpOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0oZSwgdDIueU9mZnNldCk7CiAgICB9KS50aGVuKGZ1bmN0aW9uKG8yKSB7CiAgICAgIHZhciBzMjsKICAgICAgaWYgKG8yLnBhZ2VzLmxlbmd0aCAhPT0gMSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkN1cnJlbnRseSBvbmx5IHNpbmdsZS1wYWdlIGJpdG1hcCBmb250cyBhcmUgc3VwcG9ydGVkLiIpOwogICAgICB1bFtlXSB8fCAobzIud2lkdGhGYWN0b3IgPSB1bFtvMl0gPSBmdW5jdGlvbihlMikgewogICAgICAgIHZhciB0MyA9IDAsIG4zID0gMCwgaTMgPSAwOwogICAgICAgIHJldHVybiBlMi5jaGFycy5mb3JFYWNoKGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgICB0MyArPSBlMy54YWR2YW5jZSwgZTMuaWQgPj0gNDggJiYgZTMuaWQgPD0gNTcgJiYgKGkzKyssIG4zICs9IGUzLnhhZHZhbmNlKTsKICAgICAgICB9KSwgaTMgPyBuMyAvIGkzIDogdDMgLyBlMi5jaGFycy5sZW5ndGg7CiAgICAgIH0obzIpKSwgcjIuY3VycmVudEZvbnQgPSBvMiwgczIgPSByMi5nZXRGb250SW1hZ2VTcmMoKSwgZGwuZ2V0KHMyLCBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oZTIpIHsKICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0MywgbjMpIHsKICAgICAgICAgICAgbmV3IFJlLkltYWdlTG9hZGVyKCkubG9hZChlMiwgZnVuY3Rpb24oZTMpIHsKICAgICAgICAgICAgICB0MyhlMyk7CiAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgc2woIkVycm9yIGxvYWRpbmcgZm9udCBpbWFnZSIsIGUyKSwgbjMobnVsbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgfShzMik7CiAgICAgIH0pLnRoZW4oZnVuY3Rpb24oZTIpIHsKICAgICAgICB2YXIgczMgPSByMi50ZXh0dXJlOwogICAgICAgIHMzICYmIChzMy5pbWFnZSA9IGUyLCBzMy5uZWVkc1VwZGF0ZSA9IHRydWUsIGdsW3QyLmZvbnRdID0gczMsIHIyLnRleHR1cmUgPSBzMywgcjIuaW5pdE1lc2goKSwgcjIuY3VycmVudEZvbnQgPSBvMiwgcjIudXBkYXRlR2VvbWV0cnkoaTIsIG8yKSwgcjIudXBkYXRlTGF5b3V0KCksIHIyLm1lc2gudmlzaWJsZSA9IHRydWUsIG4yLmVtaXQoInRleHRmb250c2V0IiwgeyBmb250OiB0Mi5mb250LCBmb250T2JqOiBvMiB9KSk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgc2woZTIubWVzc2FnZSksIHNsKGUyLnN0YWNrKTsKICAgICAgfSk7CiAgICB9KS5jYXRjaChmdW5jdGlvbihlMikgewogICAgICBzbChlMi5tZXNzYWdlKSwgc2woZTIuc3RhY2spOwogICAgfSk7CiAgfSwgaW5pdE1lc2g6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tZXNoIHx8ICh0aGlzLm1lc2ggPSBuZXcgUmUuTWVzaCh0aGlzLmdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsKSwgdGhpcy5lbC5zZXRPYmplY3QzRCh0aGlzLmF0dHJOYW1lLCB0aGlzLm1lc2gpKTsKICB9LCBnZXRGb250SW1hZ2VTcmM6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuZGF0YS5mb250SW1hZ2UpCiAgICAgIHJldHVybiB0aGlzLmRhdGEuZm9udEltYWdlOwogICAgdmFyIGUgPSB0aGlzLmxvb2t1cEZvbnQodGhpcy5kYXRhLmZvbnQgfHwgaGwpIHx8IHRoaXMuZGF0YS5mb250LCB0MiA9IHRoaXMuY3VycmVudEZvbnQucGFnZXNbMF07CiAgICByZXR1cm4gdDIubWF0Y2gocGwpICYmIHQyLmluZGV4T2YoImh0dHAiKSAhPT0gMCA/IGUucmVwbGFjZSgvKFwuZm50KXwoXC5qc29uKS8sICIucG5nIikgOiBSZS5Mb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZShlKSArIHQyOwogIH0sIHVwZGF0ZUxheW91dDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSwgdDIsIG4yLCBpMiwgcjIsIG8yLCBzMiwgYTIsIEEyLCBsMiA9IHRoaXMuZWwsIGMyID0gdGhpcy5kYXRhLCBoMiA9IHRoaXMuZ2VvbWV0cnksIGQyID0gdGhpcy5tZXNoOwogICAgaWYgKGQyICYmIGgyLmxheW91dCkgewogICAgICBpZiAobjIgPSBsMi5nZXRBdHRyaWJ1dGUoImdlb21ldHJ5IiksIGkyID0gKG8yID0gKHMyID0gYzIud2lkdGggfHwgbjIgJiYgbjIud2lkdGggfHwgMSkgLyBmbChjMi53cmFwUGl4ZWxzLCBjMi53cmFwQ291bnQsIHRoaXMuY3VycmVudEZvbnQud2lkdGhGYWN0b3IpKSAqICgocjIgPSBoMi5sYXlvdXQpLmhlaWdodCArIHIyLmRlc2NlbmRlciksIG4yICYmIG4yLnByaW1pdGl2ZSA9PT0gInBsYW5lIiAmJiAodGhpcy5leHBsaWNpdEdlb0RpbWVuc2lvbnNDaGVja2VkIHx8ICh0aGlzLmV4cGxpY2l0R2VvRGltZW5zaW9uc0NoZWNrZWQgPSB0cnVlLCB0aGlzLmhhc0V4cGxpY2l0R2VvV2lkdGggPSAhIW4yLndpZHRoLCB0aGlzLmhhc0V4cGxpY2l0R2VvSGVpZ2h0ID0gISFuMi5oZWlnaHQpLCB0aGlzLmhhc0V4cGxpY2l0R2VvV2lkdGggfHwgbDIuc2V0QXR0cmlidXRlKCJnZW9tZXRyeSIsICJ3aWR0aCIsIHMyKSwgdGhpcy5oYXNFeHBsaWNpdEdlb0hlaWdodCB8fCBsMi5zZXRBdHRyaWJ1dGUoImdlb21ldHJ5IiwgImhlaWdodCIsIGkyKSksIChlID0gYzIuYW5jaG9yID09PSAiYWxpZ24iID8gYzIuYWxpZ24gOiBjMi5hbmNob3IpID09PSAibGVmdCIpCiAgICAgICAgYTIgPSAwOwogICAgICBlbHNlIGlmIChlID09PSAicmlnaHQiKQogICAgICAgIGEyID0gLTEgKiByMi53aWR0aDsKICAgICAgZWxzZSB7CiAgICAgICAgaWYgKGUgIT09ICJjZW50ZXIiKQogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCB0ZXh0LmFuY2hvciBwcm9wZXJ0eSB2YWx1ZSIsIGUpOwogICAgICAgIGEyID0gLTEgKiByMi53aWR0aCAvIDI7CiAgICAgIH0KICAgICAgaWYgKCh0MiA9IGMyLmJhc2VsaW5lKSA9PT0gImJvdHRvbSIpCiAgICAgICAgQTIgPSAwOwogICAgICBlbHNlIGlmICh0MiA9PT0gInRvcCIpCiAgICAgICAgQTIgPSAtMSAqIHIyLmhlaWdodCArIHIyLmFzY2VuZGVyOwogICAgICBlbHNlIHsKICAgICAgICBpZiAodDIgIT09ICJjZW50ZXIiKQogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCB0ZXh0LmJhc2VsaW5lIHByb3BlcnR5IHZhbHVlIiwgdDIpOwogICAgICAgIEEyID0gLTEgKiByMi5oZWlnaHQgLyAyOwogICAgICB9CiAgICAgIGQyLnBvc2l0aW9uLnggPSBhMiAqIG8yICsgYzIueE9mZnNldCwgZDIucG9zaXRpb24ueSA9IEEyICogbzIsIGQyLnBvc2l0aW9uLnogPSBjMi56T2Zmc2V0LCBkMi5zY2FsZS5zZXQobzIsIC0xICogbzIsIG8yKTsKICAgIH0KICB9LCBsb29rdXBGb250OiBmdW5jdGlvbihlKSB7CiAgICByZXR1cm4gbGxbZV07CiAgfSwgdXBkYXRlR2VvbWV0cnk6IChKQSA9IHt9LCBYQSA9IHt9LCBaQSA9IC9cXG4vZywgJEEgPSAvXFx0L2csIGZ1bmN0aW9uKGUsIHQyKSB7CiAgICB2YXIgbjIgPSB0aGlzLmRhdGE7CiAgICBYQS5mb250ID0gdDIsIFhBLmxpbmVIZWlnaHQgPSBuMi5saW5lSGVpZ2h0ICYmIGlzRmluaXRlKG4yLmxpbmVIZWlnaHQpID8gbjIubGluZUhlaWdodCA6IHQyLmNvbW1vbi5saW5lSGVpZ2h0LCBYQS50ZXh0ID0gbjIudmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKFpBLCBgCmApLnJlcGxhY2UoJEEsICJcdCIpLCBYQS53aWR0aCA9IGZsKG4yLndyYXBQaXhlbHMsIG4yLndyYXBDb3VudCwgdDIud2lkdGhGYWN0b3IpLCBlLnVwZGF0ZShKcihKQSwgbjIsIFhBKSk7CiAgfSkgfSk7CiAgQ2wgPSAoY3MoInRyYWNrZWQtY29udHJvbHMiLCB7IHNjaGVtYTogeyBpZDogeyB0eXBlOiAic3RyaW5nIiwgZGVmYXVsdDogIiIgfSwgY29udHJvbGxlcjogeyBkZWZhdWx0OiAtMSB9LCBhdXRvSGlkZTogeyBkZWZhdWx0OiB0cnVlIH0sIGhhbmQ6IHsgdHlwZTogInN0cmluZyIsIGRlZmF1bHQ6ICIiIH0sIGhhbmRUcmFja2luZ0VuYWJsZWQ6IHsgZGVmYXVsdDogZmFsc2UgfSwgaXRlcmF0ZUNvbnRyb2xsZXJQcm9maWxlczogeyBkZWZhdWx0OiBmYWxzZSB9IH0sIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5idXR0b25FdmVudERldGFpbHMgPSB7fSwgdGhpcy5idXR0b25TdGF0ZXMgPSB0aGlzLmVsLmNvbXBvbmVudHNbInRyYWNrZWQtY29udHJvbHMiXS5idXR0b25TdGF0ZXMgPSB7fSwgdGhpcy5heGlzID0gdGhpcy5lbC5jb21wb25lbnRzWyJ0cmFja2VkLWNvbnRyb2xzIl0uYXhpcyA9IFswLCAwLCAwXSwgdGhpcy5jaGFuZ2VkQXhlcyA9IFtdLCB0aGlzLmF4aXNNb3ZlRXZlbnREZXRhaWwgPSB7IGF4aXM6IHRoaXMuYXhpcywgY2hhbmdlZDogdGhpcy5jaGFuZ2VkQXhlcyB9LCB0aGlzLnVwZGF0ZUNvbnRyb2xsZXIgPSB0aGlzLnVwZGF0ZUNvbnRyb2xsZXIuYmluZCh0aGlzKTsKICB9LCB1cGRhdGU6IGZ1bmN0aW9uKCkgewogICAgdGhpcy51cGRhdGVDb250cm9sbGVyKCk7CiAgfSwgcGxheTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWwuc2NlbmVFbDsKICAgIHRoaXMudXBkYXRlQ29udHJvbGxlcigpLCBlLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJzdXBkYXRlZCIsIHRoaXMudXBkYXRlQ29udHJvbGxlcik7CiAgfSwgcGF1c2U6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5zY2VuZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJzdXBkYXRlZCIsIHRoaXMudXBkYXRlQ29udHJvbGxlcik7CiAgfSwgaXNDb250cm9sbGVyUHJlc2VudDogZnVuY3Rpb24oZSkgewogICAgcmV0dXJuICEoIXRoaXMuY29udHJvbGxlciB8fCB0aGlzLmNvbnRyb2xsZXIuZ2FtZXBhZCB8fCBlLmlucHV0U291cmNlLmhhbmRlZG5lc3MgIT09ICJub25lIiAmJiBlLmlucHV0U291cmNlLmhhbmRlZG5lc3MgIT09IHRoaXMuZGF0YS5oYW5kKTsKICB9LCB1cGRhdGVDb250cm9sbGVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuY29udHJvbGxlciA9IFByKHRoaXMuc3lzdGVtLmNvbnRyb2xsZXJzLCB0aGlzLmRhdGEuaWQsIHRoaXMuZGF0YS5oYW5kLCB0aGlzLmRhdGEuY29udHJvbGxlciwgdGhpcy5kYXRhLml0ZXJhdGVDb250cm9sbGVyUHJvZmlsZXMsIHRoaXMuZGF0YS5oYW5kVHJhY2tpbmdFbmFibGVkKSwgdGhpcy5lbC5jb21wb25lbnRzWyJ0cmFja2VkLWNvbnRyb2xzIl0uY29udHJvbGxlciA9IHRoaXMuY29udHJvbGxlcjsKICB9LCB0aWNrOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbC5zY2VuZUVsLCB0MiA9IHRoaXMuY29udHJvbGxlciwgbjIgPSBlLmZyYW1lOwogICAgdGhpcy5kYXRhLmF1dG9IaWRlICYmICh0aGlzLmVsLm9iamVjdDNELnZpc2libGUgPSAhIXQyKSwgdDIgJiYgZS5mcmFtZSAmJiB0aGlzLnN5c3RlbS5yZWZlcmVuY2VTcGFjZSAmJiAodDIuaGFuZCB8fCAodGhpcy5wb3NlID0gbjIuZ2V0UG9zZSh0Mi5ncmlwU3BhY2UsIHRoaXMuc3lzdGVtLnJlZmVyZW5jZVNwYWNlKSwgdGhpcy51cGRhdGVQb3NlKCksIHRoaXMudXBkYXRlQnV0dG9ucygpKSk7CiAgfSwgdXBkYXRlUG9zZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWwub2JqZWN0M0QsIHQyID0gdGhpcy5wb3NlOwogICAgdDIgJiYgKGUubWF0cml4LmVsZW1lbnRzID0gdDIudHJhbnNmb3JtLm1hdHJpeCwgZS5tYXRyaXguZGVjb21wb3NlKGUucG9zaXRpb24sIGUucm90YXRpb24sIGUuc2NhbGUpKTsKICB9LCB1cGRhdGVCdXR0b25zOiBmdW5jdGlvbigpIHsKICAgIHZhciBlLCB0MiwgbjIsIGkyID0gdGhpcy5jb250cm9sbGVyOwogICAgaWYgKGkyICYmIGkyLmdhbWVwYWQpIHsKICAgICAgZm9yIChuMiA9IGkyLmdhbWVwYWQsIHQyID0gMDt0MiA8IG4yLmJ1dHRvbnMubGVuZ3RoOyArK3QyKQogICAgICAgIHRoaXMuYnV0dG9uU3RhdGVzW3QyXSB8fCAodGhpcy5idXR0b25TdGF0ZXNbdDJdID0geyBwcmVzc2VkOiBmYWxzZSwgdG91Y2hlZDogZmFsc2UsIHZhbHVlOiAwIH0pLCB0aGlzLmJ1dHRvbkV2ZW50RGV0YWlsc1t0Ml0gfHwgKHRoaXMuYnV0dG9uRXZlbnREZXRhaWxzW3QyXSA9IHsgaWQ6IHQyLCBzdGF0ZTogdGhpcy5idXR0b25TdGF0ZXNbdDJdIH0pLCBlID0gbjIuYnV0dG9uc1t0Ml0sIHRoaXMuaGFuZGxlQnV0dG9uKHQyLCBlKTsKICAgICAgdGhpcy5oYW5kbGVBeGVzKCk7CiAgICB9CiAgfSwgaGFuZGxlQnV0dG9uOiBmdW5jdGlvbihlLCB0MikgewogICAgcmV0dXJuICEhKHRoaXMuaGFuZGxlUHJlc3MoZSwgdDIpIHwgdGhpcy5oYW5kbGVUb3VjaChlLCB0MikgfCB0aGlzLmhhbmRsZVZhbHVlKGUsIHQyKSkgJiYgKHRoaXMuZWwuZW1pdCgiYnV0dG9uY2hhbmdlZCIsIHRoaXMuYnV0dG9uRXZlbnREZXRhaWxzW2VdLCBmYWxzZSksIHRydWUpOwogIH0sIGhhbmRsZUF4ZXM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyID0gZmFsc2UsIG4yID0gdGhpcy5jb250cm9sbGVyLmdhbWVwYWQuYXhlcywgaTIgPSB0aGlzLmF4aXMsIHIyID0gdGhpcy5jaGFuZ2VkQXhlczsKICAgIGZvciAodGhpcy5jaGFuZ2VkQXhlcy5zcGxpY2UoMCwgdGhpcy5jaGFuZ2VkQXhlcy5sZW5ndGgpLCBlID0gMDtlIDwgbjIubGVuZ3RoOyArK2UpCiAgICAgIHIyLnB1c2goaTJbZV0gIT09IG4yW2VdKSwgcjJbZV0gJiYgKHQyID0gdHJ1ZSk7CiAgICBpZiAoIXQyKQogICAgICByZXR1cm4gZmFsc2U7CiAgICBmb3IgKHRoaXMuYXhpcy5zcGxpY2UoMCwgdGhpcy5heGlzLmxlbmd0aCksIGUgPSAwO2UgPCBuMi5sZW5ndGg7IGUrKykKICAgICAgdGhpcy5heGlzLnB1c2gobjJbZV0pOwogICAgcmV0dXJuIHRoaXMuZWwuZW1pdCgiYXhpc21vdmUiLCB0aGlzLmF4aXNNb3ZlRXZlbnREZXRhaWwsIGZhbHNlKSwgdHJ1ZTsKICB9LCBoYW5kbGVQcmVzczogZnVuY3Rpb24oZSwgdDIpIHsKICAgIHZhciBuMiwgaTIgPSB0aGlzLmJ1dHRvblN0YXRlc1tlXTsKICAgIHJldHVybiB0Mi5wcmVzc2VkICE9PSBpMi5wcmVzc2VkICYmIChuMiA9IHQyLnByZXNzZWQgPyAiYnV0dG9uZG93biIgOiAiYnV0dG9udXAiLCB0aGlzLmVsLmVtaXQobjIsIHRoaXMuYnV0dG9uRXZlbnREZXRhaWxzW2VdLCBmYWxzZSksIGkyLnByZXNzZWQgPSB0Mi5wcmVzc2VkLCB0cnVlKTsKICB9LCBoYW5kbGVUb3VjaDogZnVuY3Rpb24oZSwgdDIpIHsKICAgIHZhciBuMiwgaTIgPSB0aGlzLmJ1dHRvblN0YXRlc1tlXTsKICAgIHJldHVybiB0Mi50b3VjaGVkICE9PSBpMi50b3VjaGVkICYmIChuMiA9IHQyLnRvdWNoZWQgPyAidG91Y2hzdGFydCIgOiAidG91Y2hlbmQiLCB0aGlzLmVsLmVtaXQobjIsIHRoaXMuYnV0dG9uRXZlbnREZXRhaWxzW2VdLCBmYWxzZSksIGkyLnRvdWNoZWQgPSB0Mi50b3VjaGVkLCB0cnVlKTsKICB9LCBoYW5kbGVWYWx1ZTogZnVuY3Rpb24oZSwgdDIpIHsKICAgIHZhciBuMiA9IHRoaXMuYnV0dG9uU3RhdGVzW2VdOwogICAgcmV0dXJuIHQyLnZhbHVlICE9PSBuMi52YWx1ZSAmJiAobjIudmFsdWUgPSB0Mi52YWx1ZSwgdHJ1ZSk7CiAgfSB9KSwgY3MoInZpc2libGUiLCB7IHNjaGVtYTogeyBkZWZhdWx0OiB0cnVlIH0sIHVwZGF0ZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsLm9iamVjdDNELnZpc2libGUgPSB0aGlzLmRhdGE7CiAgfSB9KSwgY2kgKyAiY29udHJvbGxlcnMvdmFsdmUvaW5kZXgvdmFsdmUtaW5kZXgtIik7CiAgdmwgPSB7IGxlZnQ6IENsICsgImxlZnQuZ2xiIiwgcmlnaHQ6IENsICsgInJpZ2h0LmdsYiIgfTsKICBibCA9IHsgbGVmdDogeyB4OiAwLCB5OiAtMC4wNSwgejogMC4wNiB9LCByaWdodDogeyB4OiAwLCB5OiAtMC4wNSwgejogMC4wNiB9IH07CiAgeWwgPSB7IGxlZnQ6IHsgX3g6IE1hdGguUEkgLyAzLCBfeTogMCwgX3o6IDAsIF9vcmRlcjogIlhZWiIgfSwgcmlnaHQ6IHsgX3g6IE1hdGguUEkgLyAzLCBfeTogMCwgX3o6IDAsIF9vcmRlcjogIlhZWiIgfSB9OwogIElsID0gKGNzKCJ2YWx2ZS1pbmRleC1jb250cm9scyIsIHsgc2NoZW1hOiB7IGhhbmQ6IHsgZGVmYXVsdDogImxlZnQiIH0sIGJ1dHRvbkNvbG9yOiB7IHR5cGU6ICJjb2xvciIsIGRlZmF1bHQ6ICIjRkFGQUZBIiB9LCBidXR0b25IaWdobGlnaHRDb2xvcjogeyB0eXBlOiAiY29sb3IiLCBkZWZhdWx0OiAiIzIyRDFFRSIgfSwgbW9kZWw6IHsgZGVmYXVsdDogdHJ1ZSB9IH0sIGFmdGVyOiBbInRyYWNrZWQtY29udHJvbHMiXSwgbWFwcGluZzogeyBheGVzOiB7IHRyYWNrcGFkOiBbMCwgMV0sIHRodW1ic3RpY2s6IFsyLCAzXSB9LCBidXR0b25zOiBbInRyaWdnZXIiLCAiZ3JpcCIsICJ0cmFja3BhZCIsICJ0aHVtYnN0aWNrIiwgImFidXR0b24iXSB9LCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpczsKICAgIHRoaXMuY29udHJvbGxlclByZXNlbnQgPSBmYWxzZSwgdGhpcy5vbkJ1dHRvbkNoYW5nZWQgPSB0aGlzLm9uQnV0dG9uQ2hhbmdlZC5iaW5kKHRoaXMpLCB0aGlzLm9uQnV0dG9uRG93biA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgImRvd24iLCBlKTsKICAgIH0sIHRoaXMub25CdXR0b25VcCA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgInVwIiwgZSk7CiAgICB9LCB0aGlzLm9uQnV0dG9uVG91Y2hFbmQgPSBmdW5jdGlvbih0MikgewogICAgICBOcih0Mi5kZXRhaWwuaWQsICJ0b3VjaGVuZCIsIGUpOwogICAgfSwgdGhpcy5vbkJ1dHRvblRvdWNoU3RhcnQgPSBmdW5jdGlvbih0MikgewogICAgICBOcih0Mi5kZXRhaWwuaWQsICJ0b3VjaHN0YXJ0IiwgZSk7CiAgICB9LCB0aGlzLnByZXZpb3VzQnV0dG9uVmFsdWVzID0ge30sIHRoaXMuYmluZE1ldGhvZHMoKTsKICB9LCBwbGF5OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50KCksIHRoaXMuYWRkQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcigpOwogIH0sIHBhdXNlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSwgdGhpcy5yZW1vdmVDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyKCk7CiAgfSwgYmluZE1ldGhvZHM6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5vbk1vZGVsTG9hZGVkID0gdGhpcy5vbk1vZGVsTG9hZGVkLmJpbmQodGhpcyksIHRoaXMub25Db250cm9sbGVyc1VwZGF0ZSA9IHRoaXMub25Db250cm9sbGVyc1VwZGF0ZS5iaW5kKHRoaXMpLCB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudCA9IHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50LmJpbmQodGhpcyksIHRoaXMucmVtb3ZlQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lciA9IHRoaXMucmVtb3ZlQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lci5iaW5kKHRoaXMpLCB0aGlzLm9uQXhpc01vdmVkID0gdGhpcy5vbkF4aXNNb3ZlZC5iaW5kKHRoaXMpOwogIH0sIGFkZEV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbDsKICAgIGUuYWRkRXZlbnRMaXN0ZW5lcigiYnV0dG9uY2hhbmdlZCIsIHRoaXMub25CdXR0b25DaGFuZ2VkKSwgZS5hZGRFdmVudExpc3RlbmVyKCJidXR0b25kb3duIiwgdGhpcy5vbkJ1dHRvbkRvd24pLCBlLmFkZEV2ZW50TGlzdGVuZXIoImJ1dHRvbnVwIiwgdGhpcy5vbkJ1dHRvblVwKSwgZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIHRoaXMub25CdXR0b25Ub3VjaEVuZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIHRoaXMub25CdXR0b25Ub3VjaFN0YXJ0KSwgZS5hZGRFdmVudExpc3RlbmVyKCJtb2RlbC1sb2FkZWQiLCB0aGlzLm9uTW9kZWxMb2FkZWQpLCBlLmFkZEV2ZW50TGlzdGVuZXIoImF4aXNtb3ZlIiwgdGhpcy5vbkF4aXNNb3ZlZCksIHRoaXMuY29udHJvbGxlckV2ZW50c0FjdGl2ZSA9IHRydWU7CiAgfSwgcmVtb3ZlRXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsOwogICAgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJidXR0b25jaGFuZ2VkIiwgdGhpcy5vbkJ1dHRvbkNoYW5nZWQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJ1dHRvbmRvd24iLCB0aGlzLm9uQnV0dG9uRG93biksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYnV0dG9udXAiLCB0aGlzLm9uQnV0dG9uVXApLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgdGhpcy5vbkJ1dHRvblRvdWNoRW5kKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgdGhpcy5vbkJ1dHRvblRvdWNoU3RhcnQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vZGVsLWxvYWRlZCIsIHRoaXMub25Nb2RlbExvYWRlZCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYXhpc21vdmUiLCB0aGlzLm9uQXhpc01vdmVkKSwgdGhpcy5jb250cm9sbGVyRXZlbnRzQWN0aXZlID0gZmFsc2U7CiAgfSwgY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50OiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5kYXRhLCB0MiA9IGUuaGFuZCA9PT0gInJpZ2h0IiA/IDAgOiBlLmhhbmQgPT09ICJsZWZ0IiA/IDEgOiAyOwogICAgVXIodGhpcywgQmwsIHsgaW5kZXg6IHQyLCBpdGVyYXRlQ29udHJvbGxlclByb2ZpbGVzOiB0cnVlLCBoYW5kOiBlLmhhbmQgfSk7CiAgfSwgaW5qZWN0VHJhY2tlZENvbnRyb2xzOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbCwgdDIgPSB0aGlzLmRhdGE7CiAgICBlLnNldEF0dHJpYnV0ZSgidHJhY2tlZC1jb250cm9scyIsIHsgaWRQcmVmaXg6IEJsLCBjb250cm9sbGVyOiB0Mi5oYW5kID09PSAicmlnaHQiID8gMSA6IHQyLmhhbmQgPT09ICJsZWZ0IiA/IDAgOiAyLCBoYW5kOiB0Mi5oYW5kIH0pLCB0aGlzLmxvYWRNb2RlbCgpOwogIH0sIGxvYWRNb2RlbDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZGF0YTsKICAgIGUubW9kZWwgJiYgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoImdsdGYtbW9kZWwiLCAiIiArIHZsW2UuaGFuZF0pOwogIH0sIGFkZENvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXI6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5zY2VuZUVsLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJzdXBkYXRlZCIsIHRoaXMub25Db250cm9sbGVyc1VwZGF0ZSwgZmFsc2UpOwogIH0sIHJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXI6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5zY2VuZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJzdXBkYXRlZCIsIHRoaXMub25Db250cm9sbGVyc1VwZGF0ZSwgZmFsc2UpOwogIH0sIG9uQ29udHJvbGxlcnNVcGRhdGU6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQoKTsKICB9LCBvbkJ1dHRvbkNoYW5nZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjIgPSB0aGlzLm1hcHBpbmcuYnV0dG9uc1tlLmRldGFpbC5pZF0sIGkyID0gdGhpcy5idXR0b25NZXNoZXM7CiAgICBuMiAmJiAobjIgPT09ICJ0cmlnZ2VyIiAmJiAodDIgPSBlLmRldGFpbC5zdGF0ZS52YWx1ZSwgaTIgJiYgaTIudHJpZ2dlciAmJiAoaTIudHJpZ2dlci5yb3RhdGlvbi54ID0gdGhpcy50cmlnZ2VyT3JpZ2luYWxSb3RhdGlvblggLSB0MiAqIChNYXRoLlBJIC8gNDApKSksIHRoaXMuZWwuZW1pdChuMiArICJjaGFuZ2VkIiwgZS5kZXRhaWwuc3RhdGUpKTsKICB9LCBvbk1vZGVsTG9hZGVkOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIsIG4yID0gZS5kZXRhaWwubW9kZWwsIGkyID0gdGhpczsKICAgIGUudGFyZ2V0ID09PSB0aGlzLmVsICYmIHRoaXMuZGF0YS5tb2RlbCAmJiAoKHQyID0gdGhpcy5idXR0b25NZXNoZXMgPSB7fSkuZ3JpcCA9IHsgbGVmdDogbjIuZ2V0T2JqZWN0QnlOYW1lKCJsZWZ0Z3JpcCIpLCByaWdodDogbjIuZ2V0T2JqZWN0QnlOYW1lKCJyaWdodGdyaXAiKSB9LCB0Mi5tZW51ID0gbjIuZ2V0T2JqZWN0QnlOYW1lKCJtZW51YnV0dG9uIiksIHQyLnN5c3RlbSA9IG4yLmdldE9iamVjdEJ5TmFtZSgic3lzdGVtYnV0dG9uIiksIHQyLnRyYWNrcGFkID0gbjIuZ2V0T2JqZWN0QnlOYW1lKCJ0b3VjaHBhZCIpLCB0Mi50cmlnZ2VyID0gbjIuZ2V0T2JqZWN0QnlOYW1lKCJ0cmlnZ2VyIiksIHRoaXMudHJpZ2dlck9yaWdpbmFsUm90YXRpb25YID0gdDIudHJpZ2dlci5yb3RhdGlvbi54LCBPYmplY3Qua2V5cyh0MikuZm9yRWFjaChmdW5jdGlvbihlMikgewogICAgICBpMi5zZXRCdXR0b25Db2xvcihlMiwgaTIuZGF0YS5idXR0b25Db2xvcik7CiAgICB9KSwgbjIucG9zaXRpb24uY29weSh5bFt0aGlzLmRhdGEuaGFuZF0pLCBuMi5yb3RhdGlvbi5jb3B5KGJsW3RoaXMuZGF0YS5oYW5kXSksIHRoaXMuZWwuZW1pdCgiY29udHJvbGxlcm1vZGVscmVhZHkiLCB7IG5hbWU6ICJ2YWx2ZS1pbmRleC1jb250cm9scyIsIG1vZGVsOiB0aGlzLmRhdGEubW9kZWwsIHJheU9yaWdpbjogbmV3IFJlLlZlY3RvcjMoMCwgMCwgMCkgfSkpOwogIH0sIG9uQXhpc01vdmVkOiBmdW5jdGlvbihlKSB7CiAgICBHcih0aGlzLCB0aGlzLm1hcHBpbmcuYXhlcywgZSk7CiAgfSwgdXBkYXRlTW9kZWw6IGZ1bmN0aW9uKGUsIHQyKSB7CiAgICB2YXIgbjI7CiAgICB0aGlzLmRhdGEubW9kZWwgJiYgKHQyLmluZGV4T2YoInRvdWNoIikgIT09IC0xIHx8IChuMiA9IHQyID09PSAidXAiID8gdGhpcy5kYXRhLmJ1dHRvbkNvbG9yIDogdGhpcy5kYXRhLmJ1dHRvbkhpZ2hsaWdodENvbG9yLCB0aGlzLnNldEJ1dHRvbkNvbG9yKGUsIG4yKSkpOwogIH0sIHNldEJ1dHRvbkNvbG9yOiBmdW5jdGlvbihlLCB0Mikge30gfSksIGNpICsgImNvbnRyb2xsZXJzL3ZpdmUvdnJfY29udHJvbGxlcl92aXZlLm9iaiIpOwogIHdsID0gY2kgKyAiY29udHJvbGxlcnMvdml2ZS92cl9jb250cm9sbGVyX3ZpdmUubXRsIjsKICBRbCA9IChjcygidml2ZS1jb250cm9scyIsIHsgc2NoZW1hOiB7IGhhbmQ6IHsgZGVmYXVsdDogImxlZnQiIH0sIGJ1dHRvbkNvbG9yOiB7IHR5cGU6ICJjb2xvciIsIGRlZmF1bHQ6ICIjRkFGQUZBIiB9LCBidXR0b25IaWdobGlnaHRDb2xvcjogeyB0eXBlOiAiY29sb3IiLCBkZWZhdWx0OiAiIzIyRDFFRSIgfSwgbW9kZWw6IHsgZGVmYXVsdDogdHJ1ZSB9IH0sIGFmdGVyOiBbInRyYWNrZWQtY29udHJvbHMiXSwgbWFwcGluZzogeyBheGVzOiB7IHRvdWNocGFkOiBbMCwgMV0gfSwgYnV0dG9uczogWyJ0cmlnZ2VyIiwgImdyaXAiLCAidG91Y2hwYWQiLCAibm9uZSJdIH0sIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzOwogICAgdGhpcy5jb250cm9sbGVyUHJlc2VudCA9IGZhbHNlLCB0aGlzLm9uQnV0dG9uQ2hhbmdlZCA9IHRoaXMub25CdXR0b25DaGFuZ2VkLmJpbmQodGhpcyksIHRoaXMub25CdXR0b25Eb3duID0gZnVuY3Rpb24odDIpIHsKICAgICAgTnIodDIuZGV0YWlsLmlkLCAiZG93biIsIGUpOwogICAgfSwgdGhpcy5vbkJ1dHRvblVwID0gZnVuY3Rpb24odDIpIHsKICAgICAgTnIodDIuZGV0YWlsLmlkLCAidXAiLCBlKTsKICAgIH0sIHRoaXMub25CdXR0b25Ub3VjaEVuZCA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgInRvdWNoZW5kIiwgZSk7CiAgICB9LCB0aGlzLm9uQnV0dG9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgInRvdWNoc3RhcnQiLCBlKTsKICAgIH0sIHRoaXMucHJldmlvdXNCdXR0b25WYWx1ZXMgPSB7fSwgdGhpcy5iaW5kTWV0aG9kcygpOwogIH0sIHVwZGF0ZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZGF0YTsKICAgIHRoaXMuY29udHJvbGxlckluZGV4ID0gZS5oYW5kID09PSAicmlnaHQiID8gMCA6IGUuaGFuZCA9PT0gImxlZnQiID8gMSA6IDI7CiAgfSwgcGxheTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudCgpLCB0aGlzLmFkZENvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIoKTsKICB9LCBwYXVzZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCksIHRoaXMucmVtb3ZlQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcigpOwogIH0sIGJpbmRNZXRob2RzOiBmdW5jdGlvbigpIHsKICAgIHRoaXMub25Nb2RlbExvYWRlZCA9IHRoaXMub25Nb2RlbExvYWRlZC5iaW5kKHRoaXMpLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUgPSB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUuYmluZCh0aGlzKSwgdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQgPSB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudC5iaW5kKHRoaXMpLCB0aGlzLnJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIgPSB0aGlzLnJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIuYmluZCh0aGlzKSwgdGhpcy5vbkF4aXNNb3ZlZCA9IHRoaXMub25BeGlzTW92ZWQuYmluZCh0aGlzKTsKICB9LCBhZGRFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWw7CiAgICBlLmFkZEV2ZW50TGlzdGVuZXIoImJ1dHRvbmNoYW5nZWQiLCB0aGlzLm9uQnV0dG9uQ2hhbmdlZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigiYnV0dG9uZG93biIsIHRoaXMub25CdXR0b25Eb3duKSwgZS5hZGRFdmVudExpc3RlbmVyKCJidXR0b251cCIsIHRoaXMub25CdXR0b25VcCksIGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLCB0aGlzLm9uQnV0dG9uVG91Y2hFbmQpLCBlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCB0aGlzLm9uQnV0dG9uVG91Y2hTdGFydCksIGUuYWRkRXZlbnRMaXN0ZW5lcigibW9kZWwtbG9hZGVkIiwgdGhpcy5vbk1vZGVsTG9hZGVkKSwgZS5hZGRFdmVudExpc3RlbmVyKCJheGlzbW92ZSIsIHRoaXMub25BeGlzTW92ZWQpLCB0aGlzLmNvbnRyb2xsZXJFdmVudHNBY3RpdmUgPSB0cnVlOwogIH0sIHJlbW92ZUV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbDsKICAgIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYnV0dG9uY2hhbmdlZCIsIHRoaXMub25CdXR0b25DaGFuZ2VkKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJidXR0b25kb3duIiwgdGhpcy5vbkJ1dHRvbkRvd24pLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJ1dHRvbnVwIiwgdGhpcy5vbkJ1dHRvblVwKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIHRoaXMub25CdXR0b25Ub3VjaEVuZCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIHRoaXMub25CdXR0b25Ub3VjaFN0YXJ0KSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb2RlbC1sb2FkZWQiLCB0aGlzLm9uTW9kZWxMb2FkZWQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImF4aXNtb3ZlIiwgdGhpcy5vbkF4aXNNb3ZlZCksIHRoaXMuY29udHJvbGxlckV2ZW50c0FjdGl2ZSA9IGZhbHNlOwogIH0sIGNoZWNrSWZDb250cm9sbGVyUHJlc2VudDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZGF0YTsKICAgIFVyKHRoaXMsIHhsLCB7IGluZGV4OiB0aGlzLmNvbnRyb2xsZXJJbmRleCwgaGFuZDogZS5oYW5kIH0pOwogIH0sIGluamVjdFRyYWNrZWRDb250cm9sczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWwsIHQyID0gdGhpcy5kYXRhOwogICAgZS5zZXRBdHRyaWJ1dGUoInRyYWNrZWQtY29udHJvbHMiLCB7IGlkUHJlZml4OiB4bCwgaGFuZDogdDIuaGFuZCwgY29udHJvbGxlcjogdGhpcy5jb250cm9sbGVySW5kZXggfSksIHRoaXMuZGF0YS5tb2RlbCAmJiB0aGlzLmVsLnNldEF0dHJpYnV0ZSgib2JqLW1vZGVsIiwgeyBvYmo6IElsLCBtdGw6IHdsIH0pOwogIH0sIGFkZENvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXI6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5zY2VuZUVsLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJzdXBkYXRlZCIsIHRoaXMub25Db250cm9sbGVyc1VwZGF0ZSwgZmFsc2UpOwogIH0sIHJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXI6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5zY2VuZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJzdXBkYXRlZCIsIHRoaXMub25Db250cm9sbGVyc1VwZGF0ZSwgZmFsc2UpOwogIH0sIG9uQ29udHJvbGxlcnNVcGRhdGU6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQoKTsKICB9LCBvbkJ1dHRvbkNoYW5nZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjIgPSB0aGlzLm1hcHBpbmcuYnV0dG9uc1tlLmRldGFpbC5pZF0sIGkyID0gdGhpcy5idXR0b25NZXNoZXM7CiAgICBuMiAmJiAobjIgPT09ICJ0cmlnZ2VyIiAmJiAodDIgPSBlLmRldGFpbC5zdGF0ZS52YWx1ZSwgaTIgJiYgaTIudHJpZ2dlciAmJiAoaTIudHJpZ2dlci5yb3RhdGlvbi54ID0gLXQyICogKE1hdGguUEkgLyAxMikpKSwgdGhpcy5lbC5lbWl0KG4yICsgImNoYW5nZWQiLCBlLmRldGFpbC5zdGF0ZSkpOwogIH0sIG9uTW9kZWxMb2FkZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjIgPSBlLmRldGFpbC5tb2RlbCwgaTIgPSB0aGlzOwogICAgZS50YXJnZXQgPT09IHRoaXMuZWwgJiYgdGhpcy5kYXRhLm1vZGVsICYmICgodDIgPSB0aGlzLmJ1dHRvbk1lc2hlcyA9IHt9KS5ncmlwID0geyBsZWZ0OiBuMi5nZXRPYmplY3RCeU5hbWUoImxlZnRncmlwIiksIHJpZ2h0OiBuMi5nZXRPYmplY3RCeU5hbWUoInJpZ2h0Z3JpcCIpIH0sIHQyLm1lbnUgPSBuMi5nZXRPYmplY3RCeU5hbWUoIm1lbnVidXR0b24iKSwgdDIuc3lzdGVtID0gbjIuZ2V0T2JqZWN0QnlOYW1lKCJzeXN0ZW1idXR0b24iKSwgdDIudHJhY2twYWQgPSBuMi5nZXRPYmplY3RCeU5hbWUoInRvdWNocGFkIiksIHQyLnRvdWNocGFkID0gbjIuZ2V0T2JqZWN0QnlOYW1lKCJ0b3VjaHBhZCIpLCB0Mi50cmlnZ2VyID0gbjIuZ2V0T2JqZWN0QnlOYW1lKCJ0cmlnZ2VyIiksIE9iamVjdC5rZXlzKHQyKS5mb3JFYWNoKGZ1bmN0aW9uKGUyKSB7CiAgICAgIGkyLnNldEJ1dHRvbkNvbG9yKGUyLCBpMi5kYXRhLmJ1dHRvbkNvbG9yKTsKICAgIH0pLCBuMi5wb3NpdGlvbi5zZXQoMCwgLTAuMDE1LCAwLjA0KSk7CiAgfSwgb25BeGlzTW92ZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIEdyKHRoaXMsIHRoaXMubWFwcGluZy5heGVzLCBlKTsKICB9LCB1cGRhdGVNb2RlbDogZnVuY3Rpb24oZSwgdDIpIHsKICAgIHZhciBuMjsKICAgIHRoaXMuZGF0YS5tb2RlbCAmJiAodDIuaW5kZXhPZigidG91Y2giKSAhPT0gLTEgfHwgKG4yID0gdDIgPT09ICJ1cCIgPyB0aGlzLmRhdGEuYnV0dG9uQ29sb3IgOiB0aGlzLmRhdGEuYnV0dG9uSGlnaGxpZ2h0Q29sb3IsIHRoaXMuc2V0QnV0dG9uQ29sb3IoZSwgbjIpKSk7CiAgfSwgc2V0QnV0dG9uQ29sb3I6IGZ1bmN0aW9uKGUsIHQyKSB7CiAgICB2YXIgbjIgPSB0aGlzLmJ1dHRvbk1lc2hlczsKICAgIGlmIChuMikKICAgICAgcmV0dXJuIGUgPT09ICJncmlwIiA/IChuMi5ncmlwLmxlZnQubWF0ZXJpYWwuY29sb3Iuc2V0KHQyKSwgdm9pZCBuMi5ncmlwLnJpZ2h0Lm1hdGVyaWFsLmNvbG9yLnNldCh0MikpIDogdm9pZCBuMltlXS5tYXRlcmlhbC5jb2xvci5zZXQodDIpOwogIH0gfSksIGNpICsgImNvbnRyb2xsZXJzL3ZpdmUvZm9jdXMtY29udHJvbGxlci9mb2N1cy1jb250cm9sbGVyLmdsdGYiKTsKICBNbCA9IChjcygidml2ZS1mb2N1cy1jb250cm9scyIsIHsgc2NoZW1hOiB7IGhhbmQ6IHsgZGVmYXVsdDogIiIgfSwgYnV0dG9uVG91Y2hlZENvbG9yOiB7IHR5cGU6ICJjb2xvciIsIGRlZmF1bHQ6ICIjQkJCQkJCIiB9LCBidXR0b25IaWdobGlnaHRDb2xvcjogeyB0eXBlOiAiY29sb3IiLCBkZWZhdWx0OiAiIzdBN0E3QSIgfSwgbW9kZWw6IHsgZGVmYXVsdDogdHJ1ZSB9IH0sIGFmdGVyOiBbInRyYWNrZWQtY29udHJvbHMiXSwgbWFwcGluZzogeyBheGVzOiB7IHRvdWNocGFkOiBbMCwgMV0gfSwgYnV0dG9uczogWyJ0cmlnZ2VyIiwgIm5vbmUiLCAidG91Y2hwYWQiLCAibm9uZSIsICJtZW51Il0gfSwgYmluZE1ldGhvZHM6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5vbk1vZGVsTG9hZGVkID0gdGhpcy5vbk1vZGVsTG9hZGVkLmJpbmQodGhpcyksIHRoaXMub25Db250cm9sbGVyc1VwZGF0ZSA9IHRoaXMub25Db250cm9sbGVyc1VwZGF0ZS5iaW5kKHRoaXMpLCB0aGlzLmNoZWNrSWZDb250cm9sbGVyUHJlc2VudCA9IHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50LmJpbmQodGhpcyksIHRoaXMucmVtb3ZlQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lciA9IHRoaXMucmVtb3ZlQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lci5iaW5kKHRoaXMpLCB0aGlzLm9uQXhpc01vdmVkID0gdGhpcy5vbkF4aXNNb3ZlZC5iaW5kKHRoaXMpOwogIH0sIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzOwogICAgdGhpcy5vbkJ1dHRvbkNoYW5nZWQgPSB0aGlzLm9uQnV0dG9uQ2hhbmdlZC5iaW5kKHRoaXMpLCB0aGlzLm9uQnV0dG9uRG93biA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgImRvd24iLCBlKTsKICAgIH0sIHRoaXMub25CdXR0b25VcCA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgInVwIiwgZSk7CiAgICB9LCB0aGlzLm9uQnV0dG9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgInRvdWNoc3RhcnQiLCBlKTsKICAgIH0sIHRoaXMub25CdXR0b25Ub3VjaEVuZCA9IGZ1bmN0aW9uKHQyKSB7CiAgICAgIE5yKHQyLmRldGFpbC5pZCwgInRvdWNoZW5kIiwgZSk7CiAgICB9LCB0aGlzLmNvbnRyb2xsZXJQcmVzZW50ID0gZmFsc2UsIHRoaXMuYmluZE1ldGhvZHMoKTsKICB9LCBhZGRFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWw7CiAgICBlLmFkZEV2ZW50TGlzdGVuZXIoImJ1dHRvbmNoYW5nZWQiLCB0aGlzLm9uQnV0dG9uQ2hhbmdlZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigiYnV0dG9uZG93biIsIHRoaXMub25CdXR0b25Eb3duKSwgZS5hZGRFdmVudExpc3RlbmVyKCJidXR0b251cCIsIHRoaXMub25CdXR0b25VcCksIGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIHRoaXMub25CdXR0b25Ub3VjaFN0YXJ0KSwgZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIHRoaXMub25CdXR0b25Ub3VjaEVuZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigibW9kZWwtbG9hZGVkIiwgdGhpcy5vbk1vZGVsTG9hZGVkKSwgZS5hZGRFdmVudExpc3RlbmVyKCJheGlzbW92ZSIsIHRoaXMub25BeGlzTW92ZWQpLCB0aGlzLmNvbnRyb2xsZXJFdmVudHNBY3RpdmUgPSB0cnVlLCB0aGlzLmFkZENvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIoKTsKICB9LCByZW1vdmVFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWw7CiAgICBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJ1dHRvbmNoYW5nZWQiLCB0aGlzLm9uQnV0dG9uQ2hhbmdlZCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYnV0dG9uZG93biIsIHRoaXMub25CdXR0b25Eb3duKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJidXR0b251cCIsIHRoaXMub25CdXR0b25VcCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIHRoaXMub25CdXR0b25Ub3VjaFN0YXJ0KSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIHRoaXMub25CdXR0b25Ub3VjaEVuZCksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW9kZWwtbG9hZGVkIiwgdGhpcy5vbk1vZGVsTG9hZGVkKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJheGlzbW92ZSIsIHRoaXMub25BeGlzTW92ZWQpLCB0aGlzLmNvbnRyb2xsZXJFdmVudHNBY3RpdmUgPSBmYWxzZSwgdGhpcy5yZW1vdmVDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyKCk7CiAgfSwgY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50OiBmdW5jdGlvbigpIHsKICAgIFVyKHRoaXMsIExsLCB0aGlzLmRhdGEuaGFuZCA/IHsgaGFuZDogdGhpcy5kYXRhLmhhbmQgfSA6IHt9KTsKICB9LCBwbGF5OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50KCksIHRoaXMuYWRkQ29udHJvbGxlcnNVcGRhdGVMaXN0ZW5lcigpOwogIH0sIHBhdXNlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSwgdGhpcy5yZW1vdmVDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyKCk7CiAgfSwgaW5qZWN0VHJhY2tlZENvbnRyb2xzOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKCJ0cmFja2VkLWNvbnRyb2xzIiwgeyBpZFByZWZpeDogTGwgfSksIHRoaXMuZGF0YS5tb2RlbCAmJiB0aGlzLmVsLnNldEF0dHJpYnV0ZSgiZ2x0Zi1tb2RlbCIsIFFsKTsKICB9LCBhZGRDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuc2NlbmVFbC5hZGRFdmVudExpc3RlbmVyKCJjb250cm9sbGVyc3VwZGF0ZWQiLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUsIGZhbHNlKTsKICB9LCByZW1vdmVDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuc2NlbmVFbC5yZW1vdmVFdmVudExpc3RlbmVyKCJjb250cm9sbGVyc3VwZGF0ZWQiLCB0aGlzLm9uQ29udHJvbGxlcnNVcGRhdGUsIGZhbHNlKTsKICB9LCBvbkNvbnRyb2xsZXJzVXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50KCk7CiAgfSwgb25Nb2RlbExvYWRlZDogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiA9IGUuZGV0YWlsLm1vZGVsOwogICAgZS50YXJnZXQgPT09IHRoaXMuZWwgJiYgdGhpcy5kYXRhLm1vZGVsICYmICgodDIgPSB0aGlzLmJ1dHRvbk1lc2hlcyA9IHt9KS50cmlnZ2VyID0gbjIuZ2V0T2JqZWN0QnlOYW1lKCJCdW1wZXJLZXkiKSwgdDIudHJpZ2dlclByZXNzZWQgPSBuMi5nZXRPYmplY3RCeU5hbWUoIkJ1bXBlcktleV9QcmVzcyIpLCB0Mi50cmlnZ2VyUHJlc3NlZCAmJiAodDIudHJpZ2dlclByZXNzZWQudmlzaWJsZSA9IGZhbHNlKSwgdDIudG91Y2hwYWQgPSBuMi5nZXRPYmplY3RCeU5hbWUoIlRvdWNoUGFkIiksIHQyLnRvdWNocGFkUHJlc3NlZCA9IG4yLmdldE9iamVjdEJ5TmFtZSgiVG91Y2hQYWRfUHJlc3MiKSwgdDIudHJhY2twYWQgPSBuMi5nZXRPYmplY3RCeU5hbWUoIlRvdWNoUGFkIiksIHQyLnRyYWNrcGFkUHJlc3NlZCA9IG4yLmdldE9iamVjdEJ5TmFtZSgiVG91Y2hQYWRfUHJlc3MiKSwgdDIudHJhY2twYWRQcmVzc2VkICYmICh0Mi50cmFja3BhZFByZXNzZWQudmlzaWJsZSA9IGZhbHNlKSk7CiAgfSwgb25CdXR0b25DaGFuZ2VkOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSB0aGlzLm1hcHBpbmcuYnV0dG9uc1tlLmRldGFpbC5pZF07CiAgICB0MiAmJiB0aGlzLmVsLmVtaXQodDIgKyAiY2hhbmdlZCIsIGUuZGV0YWlsLnN0YXRlKTsKICB9LCBvbkF4aXNNb3ZlZDogZnVuY3Rpb24oZSkgewogICAgR3IodGhpcywgdGhpcy5tYXBwaW5nLmF4ZXMsIGUpOwogIH0sIHVwZGF0ZU1vZGVsOiBmdW5jdGlvbihlLCB0MikgewogICAgdGhpcy5kYXRhLm1vZGVsICYmIHRoaXMudXBkYXRlQnV0dG9uTW9kZWwoZSwgdDIpOwogIH0sIHVwZGF0ZUJ1dHRvbk1vZGVsOiBmdW5jdGlvbihlLCB0MikgewogICAgdmFyIG4yID0gdGhpcy5idXR0b25NZXNoZXMsIGkyID0gZSArICJQcmVzc2VkIjsKICAgIGlmIChuMiAmJiBuMltlXSAmJiBuMltpMl0pIHsKICAgICAgdmFyIHIyOwogICAgICBzd2l0Y2ggKHQyKSB7CiAgICAgICAgY2FzZSAiZG93biI6CiAgICAgICAgICByMiA9IHRoaXMuZGF0YS5idXR0b25IaWdobGlnaHRDb2xvcjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInRvdWNoc3RhcnQiOgogICAgICAgICAgcjIgPSB0aGlzLmRhdGEuYnV0dG9uVG91Y2hlZENvbG9yOwogICAgICB9CiAgICAgIHIyICYmIG4yW2kyXS5tYXRlcmlhbC5jb2xvci5zZXQocjIpLCBuMltpMl0udmlzaWJsZSA9ICEhcjIsIG4yW2VdLnZpc2libGUgPSAhcjI7CiAgICB9CiAgfSB9KSwgeyAzODogIkFycm93VXAiLCAzNzogIkFycm93TGVmdCIsIDQwOiAiQXJyb3dEb3duIiwgMzk6ICJBcnJvd1JpZ2h0IiwgODc6ICJLZXlXIiwgNjU6ICJLZXlBIiwgODM6ICJLZXlTIiwgNjg6ICJLZXlEIiB9KTsKICBTbCA9IGlvOwogIGtsID0gWyJLZXlXIiwgIktleUEiLCAiS2V5UyIsICJLZXlEIiwgIkFycm93VXAiLCAiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiLCAiQXJyb3dEb3duIl07CiAgY3MoIndhc2QtY29udHJvbHMiLCB7IHNjaGVtYTogeyBhY2NlbGVyYXRpb246IHsgZGVmYXVsdDogNjUgfSwgYWRBeGlzOiB7IGRlZmF1bHQ6ICJ4Iiwgb25lT2Y6IFsieCIsICJ5IiwgInoiXSB9LCBhZEVuYWJsZWQ6IHsgZGVmYXVsdDogdHJ1ZSB9LCBhZEludmVydGVkOiB7IGRlZmF1bHQ6IGZhbHNlIH0sIGVuYWJsZWQ6IHsgZGVmYXVsdDogdHJ1ZSB9LCBmbHk6IHsgZGVmYXVsdDogZmFsc2UgfSwgd3NBeGlzOiB7IGRlZmF1bHQ6ICJ6Iiwgb25lT2Y6IFsieCIsICJ5IiwgInoiXSB9LCB3c0VuYWJsZWQ6IHsgZGVmYXVsdDogdHJ1ZSB9LCB3c0ludmVydGVkOiB7IGRlZmF1bHQ6IGZhbHNlIH0gfSwgYWZ0ZXI6IFsibG9vay1jb250cm9scyJdLCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMua2V5cyA9IHt9LCB0aGlzLmVhc2luZyA9IDEuMSwgdGhpcy52ZWxvY2l0eSA9IG5ldyBSZS5WZWN0b3IzLCB0aGlzLm9uQmx1ciA9IHRoaXMub25CbHVyLmJpbmQodGhpcyksIHRoaXMub25Db250ZXh0TWVudSA9IHRoaXMub25Db250ZXh0TWVudS5iaW5kKHRoaXMpLCB0aGlzLm9uRm9jdXMgPSB0aGlzLm9uRm9jdXMuYmluZCh0aGlzKSwgdGhpcy5vbktleURvd24gPSB0aGlzLm9uS2V5RG93bi5iaW5kKHRoaXMpLCB0aGlzLm9uS2V5VXAgPSB0aGlzLm9uS2V5VXAuYmluZCh0aGlzKSwgdGhpcy5vblZpc2liaWxpdHlDaGFuZ2UgPSB0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZS5iaW5kKHRoaXMpLCB0aGlzLmF0dGFjaFZpc2liaWxpdHlFdmVudExpc3RlbmVycygpOwogIH0sIHRpY2s6IGZ1bmN0aW9uKGUsIHQyKSB7CiAgICB2YXIgbjIgPSB0aGlzLmRhdGEsIGkyID0gdGhpcy5lbCwgcjIgPSB0aGlzLnZlbG9jaXR5OwogICAgKHIyW24yLmFkQXhpc10gfHwgcjJbbjIud3NBeGlzXSB8fCAhZnVuY3Rpb24oZTIpIHsKICAgICAgdmFyIHQzOwogICAgICBmb3IgKHQzIGluIGUyKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9KHRoaXMua2V5cykpICYmICh0MiAvPSAxMDAwLCB0aGlzLnVwZGF0ZVZlbG9jaXR5KHQyKSwgKHIyW24yLmFkQXhpc10gfHwgcjJbbjIud3NBeGlzXSkgJiYgaTIub2JqZWN0M0QucG9zaXRpb24uYWRkKHRoaXMuZ2V0TW92ZW1lbnRWZWN0b3IodDIpKSk7CiAgfSwgdXBkYXRlOiBmdW5jdGlvbihlKSB7CiAgICBlLmFkQXhpcyAhPT0gdGhpcy5kYXRhLmFkQXhpcyAmJiAodGhpcy52ZWxvY2l0eVtlLmFkQXhpc10gPSAwKSwgZS53c0F4aXMgIT09IHRoaXMuZGF0YS53c0F4aXMgJiYgKHRoaXMudmVsb2NpdHlbZS53c0F4aXNdID0gMCk7CiAgfSwgcmVtb3ZlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVtb3ZlS2V5RXZlbnRMaXN0ZW5lcnMoKSwgdGhpcy5yZW1vdmVWaXNpYmlsaXR5RXZlbnRMaXN0ZW5lcnMoKTsKICB9LCBwbGF5OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuYXR0YWNoS2V5RXZlbnRMaXN0ZW5lcnMoKTsKICB9LCBwYXVzZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmtleXMgPSB7fSwgdGhpcy5yZW1vdmVLZXlFdmVudExpc3RlbmVycygpOwogIH0sIHVwZGF0ZVZlbG9jaXR5OiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIsIG4yLCBpMiwgcjIsIG8yLCBzMiA9IHRoaXMuZGF0YSwgYTIgPSB0aGlzLmtleXMsIEEyID0gdGhpcy52ZWxvY2l0eTsKICAgIGlmIChuMiA9IHMyLmFkQXhpcywgcjIgPSBzMi53c0F4aXMsIGUgPiAwLjIpCiAgICAgIHJldHVybiBBMltuMl0gPSAwLCB2b2lkIChBMltyMl0gPSAwKTsKICAgIHZhciBsMiA9IE1hdGgucG93KDEgLyB0aGlzLmVhc2luZywgNjAgKiBlKTsKICAgIEEyW24yXSAhPT0gMCAmJiAoQTJbbjJdID0gQTJbbjJdICogbDIpLCBBMltyMl0gIT09IDAgJiYgKEEyW3IyXSA9IEEyW3IyXSAqIGwyKSwgTWF0aC5hYnMoQTJbbjJdKSA8IERsICYmIChBMltuMl0gPSAwKSwgTWF0aC5hYnMoQTJbcjJdKSA8IERsICYmIChBMltyMl0gPSAwKSwgczIuZW5hYmxlZCAmJiAodDIgPSBzMi5hY2NlbGVyYXRpb24sIHMyLmFkRW5hYmxlZCAmJiAoaTIgPSBzMi5hZEludmVydGVkID8gLTEgOiAxLCAoYTIuS2V5QSB8fCBhMi5BcnJvd0xlZnQpICYmIChBMltuMl0gLT0gaTIgKiB0MiAqIGUpLCAoYTIuS2V5RCB8fCBhMi5BcnJvd1JpZ2h0KSAmJiAoQTJbbjJdICs9IGkyICogdDIgKiBlKSksIHMyLndzRW5hYmxlZCAmJiAobzIgPSBzMi53c0ludmVydGVkID8gLTEgOiAxLCAoYTIuS2V5VyB8fCBhMi5BcnJvd1VwKSAmJiAoQTJbcjJdIC09IG8yICogdDIgKiBlKSwgKGEyLktleVMgfHwgYTIuQXJyb3dEb3duKSAmJiAoQTJbcjJdICs9IG8yICogdDIgKiBlKSkpOwogIH0sIGdldE1vdmVtZW50VmVjdG9yOiAobWwgPSBuZXcgUmUuVmVjdG9yMygwLCAwLCAwKSwgRWwgPSBuZXcgUmUuRXVsZXIoMCwgMCwgMCwgIllYWiIpLCBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIsIG4yID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoInJvdGF0aW9uIiksIGkyID0gdGhpcy52ZWxvY2l0eTsKICAgIHJldHVybiBtbC5jb3B5KGkyKSwgbWwubXVsdGlwbHlTY2FsYXIoZSksIG4yID8gKHQyID0gdGhpcy5kYXRhLmZseSA/IG4yLnggOiAwLCBFbC5zZXQoUmUuTWF0aFV0aWxzLmRlZ1RvUmFkKHQyKSwgUmUuTWF0aFV0aWxzLmRlZ1RvUmFkKG4yLnkpLCAwKSwgbWwuYXBwbHlFdWxlcihFbCksIG1sKSA6IG1sOwogIH0pLCBhdHRhY2hWaXNpYmlsaXR5RXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkgewogICAgd2luZG93Lm9uY29udGV4dG1lbnUgPSB0aGlzLm9uQ29udGV4dE1lbnUsIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwgdGhpcy5vbkJsdXIpLCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCB0aGlzLm9uRm9jdXMpLCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwgdGhpcy5vblZpc2liaWxpdHlDaGFuZ2UpOwogIH0sIHJlbW92ZVZpc2liaWxpdHlFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYmx1ciIsIHRoaXMub25CbHVyKSwgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzIiwgdGhpcy5vbkZvY3VzKSwgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsIHRoaXMub25WaXNpYmlsaXR5Q2hhbmdlKTsKICB9LCBhdHRhY2hLZXlFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIHRoaXMub25LZXlEb3duKSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIiwgdGhpcy5vbktleVVwKTsKICB9LCByZW1vdmVLZXlFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIHRoaXMub25LZXlEb3duKSwgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIiwgdGhpcy5vbktleVVwKTsKICB9LCBvbkNvbnRleHRNZW51OiBmdW5jdGlvbigpIHsKICAgIGZvciAodmFyIGUgPSBPYmplY3Qua2V5cyh0aGlzLmtleXMpLCB0MiA9IDA7dDIgPCBlLmxlbmd0aDsgdDIrKykKICAgICAgZGVsZXRlIHRoaXMua2V5c1tlW3QyXV07CiAgfSwgb25CbHVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucGF1c2UoKTsKICB9LCBvbkZvY3VzOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucGxheSgpOwogIH0sIG9uVmlzaWJpbGl0eUNoYW5nZTogZnVuY3Rpb24oKSB7CiAgICBkb2N1bWVudC5oaWRkZW4gPyB0aGlzLm9uQmx1cigpIDogdGhpcy5vbkZvY3VzKCk7CiAgfSwgb25LZXlEb3duOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDI7CiAgICBTbChlKSAmJiAodDIgPSBlLmNvZGUgfHwgTWxbZS5rZXlDb2RlXSwga2wuaW5kZXhPZih0MikgIT09IC0xICYmICh0aGlzLmtleXNbdDJdID0gdHJ1ZSkpOwogIH0sIG9uS2V5VXA6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MjsKICAgIHQyID0gZS5jb2RlIHx8IE1sW2Uua2V5Q29kZV0sIGRlbGV0ZSB0aGlzLmtleXNbdDJdOwogIH0gfSk7CiAgVWwgPSBmaSgiY29tcG9uZW50czp3aW5kb3dzLW1vdGlvbi1jb250cm9sczpkZWJ1ZyIpOwogIE9sID0gZmkoImNvbXBvbmVudHM6d2luZG93cy1tb3Rpb24tY29udHJvbHM6d2FybiIpOwogIFBsID0gY2kgKyAiY29udHJvbGxlcnMvbWljcm9zb2Z0LyI7CiAgR2wgPSB7IGxlZnQ6ICJsZWZ0LmdsYiIsIHJpZ2h0OiAicmlnaHQuZ2xiIiwgZGVmYXVsdDogInVuaXZlcnNhbC5nbGIiIH07CiAgamwgPSAoY3MoIndpbmRvd3MtbW90aW9uLWNvbnRyb2xzIiwgeyBzY2hlbWE6IHsgaGFuZDogeyBkZWZhdWx0OiAicmlnaHQiIH0sIHBhaXI6IHsgZGVmYXVsdDogMCB9LCBtb2RlbDogeyBkZWZhdWx0OiB0cnVlIH0gfSwgYWZ0ZXI6IFsidHJhY2tlZC1jb250cm9scyJdLCBtYXBwaW5nOiB7IGF4ZXM6IHsgdG91Y2hwYWQ6IFswLCAxXSwgdGh1bWJzdGljazogWzIsIDNdIH0sIGJ1dHRvbnM6IFsidHJpZ2dlciIsICJzcXVlZXplIiwgInRvdWNocGFkIiwgInRodW1ic3RpY2siLCAibWVudSJdLCBheGlzTWVzaE5hbWVzOiBbIlRPVUNIUEFEX1RPVUNIX1giLCAiVE9VQ0hQQURfVE9VQ0hfWCIsICJUSFVNQlNUSUNLX1giLCAiVEhVTUJTVElDS19ZIl0sIGJ1dHRvbk1lc2hOYW1lczogeyB0cmlnZ2VyOiAiU0VMRUNUIiwgbWVudTogIk1FTlUiLCBzcXVlZXplOiAiR1JBU1AiLCB0aHVtYnN0aWNrOiAiVEhVTUJTVElDS19QUkVTUyIsIHRvdWNocGFkOiAiVE9VQ0hQQURfUFJFU1MiIH0sIHBvaW50aW5nUG9zZU1lc2hOYW1lOiAiUE9JTlRJTkdfUE9TRSIgfSwgYmluZE1ldGhvZHM6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5vbk1vZGVsRXJyb3IgPSB0aGlzLm9uTW9kZWxFcnJvci5iaW5kKHRoaXMpLCB0aGlzLm9uTW9kZWxMb2FkZWQgPSB0aGlzLm9uTW9kZWxMb2FkZWQuYmluZCh0aGlzKSwgdGhpcy5vbkNvbnRyb2xsZXJzVXBkYXRlID0gdGhpcy5vbkNvbnRyb2xsZXJzVXBkYXRlLmJpbmQodGhpcyksIHRoaXMuY2hlY2tJZkNvbnRyb2xsZXJQcmVzZW50ID0gdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQuYmluZCh0aGlzKSwgdGhpcy5vbkF4aXNNb3ZlZCA9IHRoaXMub25BeGlzTW92ZWQuYmluZCh0aGlzKTsKICB9LCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcywgdDIgPSB0aGlzLmVsOwogICAgdGhpcy5vbkJ1dHRvbkNoYW5nZWQgPSB0aGlzLm9uQnV0dG9uQ2hhbmdlZC5iaW5kKHRoaXMpLCB0aGlzLm9uQnV0dG9uRG93biA9IGZ1bmN0aW9uKHQzKSB7CiAgICAgIE5yKHQzLmRldGFpbC5pZCwgImRvd24iLCBlKTsKICAgIH0sIHRoaXMub25CdXR0b25VcCA9IGZ1bmN0aW9uKHQzKSB7CiAgICAgIE5yKHQzLmRldGFpbC5pZCwgInVwIiwgZSk7CiAgICB9LCB0aGlzLm9uQnV0dG9uVG91Y2hTdGFydCA9IGZ1bmN0aW9uKHQzKSB7CiAgICAgIE5yKHQzLmRldGFpbC5pZCwgInRvdWNoc3RhcnQiLCBlKTsKICAgIH0sIHRoaXMub25CdXR0b25Ub3VjaEVuZCA9IGZ1bmN0aW9uKHQzKSB7CiAgICAgIE5yKHQzLmRldGFpbC5pZCwgInRvdWNoZW5kIiwgZSk7CiAgICB9LCB0aGlzLm9uQ29udHJvbGxlckNvbm5lY3RlZCA9IGZ1bmN0aW9uKCkgewogICAgICBlLnNldE1vZGVsVmlzaWJpbGl0eSh0cnVlKTsKICAgIH0sIHRoaXMub25Db250cm9sbGVyRGlzY29ubmVjdGVkID0gZnVuY3Rpb24oKSB7CiAgICAgIGUuc2V0TW9kZWxWaXNpYmlsaXR5KGZhbHNlKTsKICAgIH0sIHRoaXMuY29udHJvbGxlclByZXNlbnQgPSBmYWxzZSwgdGhpcy5wcmV2aW91c0J1dHRvblZhbHVlcyA9IHt9LCB0aGlzLmJpbmRNZXRob2RzKCksIHRoaXMubG9hZGVkTWVzaEluZm8gPSB7IGJ1dHRvbk1lc2hlczogbnVsbCwgYXhpc01lc2hlczogbnVsbCB9LCB0aGlzLnJheU9yaWdpbiA9IHsgb3JpZ2luOiBuZXcgUmUuVmVjdG9yMywgZGlyZWN0aW9uOiBuZXcgUmUuVmVjdG9yMygwLCAwLCAtMSksIGNyZWF0ZWRGcm9tTWVzaDogZmFsc2UgfSwgdDIuYWRkRXZlbnRMaXN0ZW5lcigiY29udHJvbGxlcmNvbm5lY3RlZCIsIHRoaXMub25Db250cm9sbGVyQ29ubmVjdGVkKSwgdDIuYWRkRXZlbnRMaXN0ZW5lcigiY29udHJvbGxlcmRpc2Nvbm5lY3RlZCIsIHRoaXMub25Db250cm9sbGVyRGlzY29ubmVjdGVkKTsKICB9LCBhZGRFdmVudExpc3RlbmVyczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWw7CiAgICBlLmFkZEV2ZW50TGlzdGVuZXIoImJ1dHRvbmNoYW5nZWQiLCB0aGlzLm9uQnV0dG9uQ2hhbmdlZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigiYnV0dG9uZG93biIsIHRoaXMub25CdXR0b25Eb3duKSwgZS5hZGRFdmVudExpc3RlbmVyKCJidXR0b251cCIsIHRoaXMub25CdXR0b25VcCksIGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsIHRoaXMub25CdXR0b25Ub3VjaFN0YXJ0KSwgZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsIHRoaXMub25CdXR0b25Ub3VjaEVuZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigiYXhpc21vdmUiLCB0aGlzLm9uQXhpc01vdmVkKSwgZS5hZGRFdmVudExpc3RlbmVyKCJtb2RlbC1lcnJvciIsIHRoaXMub25Nb2RlbEVycm9yKSwgZS5hZGRFdmVudExpc3RlbmVyKCJtb2RlbC1sb2FkZWQiLCB0aGlzLm9uTW9kZWxMb2FkZWQpLCB0aGlzLmNvbnRyb2xsZXJFdmVudHNBY3RpdmUgPSB0cnVlOwogIH0sIHJlbW92ZUV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbDsKICAgIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYnV0dG9uY2hhbmdlZCIsIHRoaXMub25CdXR0b25DaGFuZ2VkKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJidXR0b25kb3duIiwgdGhpcy5vbkJ1dHRvbkRvd24pLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJ1dHRvbnVwIiwgdGhpcy5vbkJ1dHRvblVwKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IiwgdGhpcy5vbkJ1dHRvblRvdWNoU3RhcnQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgdGhpcy5vbkJ1dHRvblRvdWNoRW5kKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKCJheGlzbW92ZSIsIHRoaXMub25BeGlzTW92ZWQpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vZGVsLWVycm9yIiwgdGhpcy5vbk1vZGVsRXJyb3IpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vZGVsLWxvYWRlZCIsIHRoaXMub25Nb2RlbExvYWRlZCksIHRoaXMuY29udHJvbGxlckV2ZW50c0FjdGl2ZSA9IGZhbHNlOwogIH0sIGNoZWNrSWZDb250cm9sbGVyUHJlc2VudDogZnVuY3Rpb24oKSB7CiAgICBVcih0aGlzLCBObCwgeyBoYW5kOiB0aGlzLmRhdGEuaGFuZCwgaW5kZXg6IHRoaXMuZGF0YS5wYWlyLCBpdGVyYXRlQ29udHJvbGxlclByb2ZpbGVzOiB0cnVlIH0pOwogIH0sIHBsYXk6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQoKSwgdGhpcy5hZGRDb250cm9sbGVyc1VwZGF0ZUxpc3RlbmVyKCk7CiAgfSwgcGF1c2U6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpLCB0aGlzLnJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXIoKTsKICB9LCB1cGRhdGVDb250cm9sbGVyTW9kZWw6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuZGF0YS5tb2RlbCAmJiAhdGhpcy5yYXlPcmlnaW4uY3JlYXRlZEZyb21NZXNoKSB7CiAgICAgIHZhciBlID0gdGhpcy5jcmVhdGVDb250cm9sbGVyTW9kZWxVcmwoKTsKICAgICAgdGhpcy5sb2FkTW9kZWwoZSk7CiAgICB9IGVsc2UKICAgICAgdGhpcy5tb2RlbFJlYWR5KCk7CiAgfSwgY3JlYXRlQ29udHJvbGxlck1vZGVsVXJsOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSB0aGlzLmRhdGEuaGFuZDsKICAgIHJldHVybiBQbCArICJkZWZhdWx0LyIgKyAoR2xbdDJdIHx8IEdsLmRlZmF1bHQpOwogIH0sIGluamVjdFRyYWNrZWRDb250cm9sczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZGF0YTsKICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKCJ0cmFja2VkLWNvbnRyb2xzIiwgeyBpZFByZWZpeDogTmwsIGNvbnRyb2xsZXI6IGUucGFpciwgaGFuZDogZS5oYW5kIH0pLCB0aGlzLnVwZGF0ZUNvbnRyb2xsZXJNb2RlbCgpOwogIH0sIGFkZENvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXI6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5zY2VuZUVsLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJzdXBkYXRlZCIsIHRoaXMub25Db250cm9sbGVyc1VwZGF0ZSwgZmFsc2UpOwogIH0sIHJlbW92ZUNvbnRyb2xsZXJzVXBkYXRlTGlzdGVuZXI6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5zY2VuZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJzdXBkYXRlZCIsIHRoaXMub25Db250cm9sbGVyc1VwZGF0ZSwgZmFsc2UpOwogIH0sIG9uQ29udHJvbGxlcnNVcGRhdGU6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jaGVja0lmQ29udHJvbGxlclByZXNlbnQoKTsKICB9LCBvbk1vZGVsRXJyb3I6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IHRoaXMuY3JlYXRlQ29udHJvbGxlck1vZGVsVXJsKHRydWUpOwogICAgZS5kZXRhaWwuc3JjICE9PSB0MiA/IChPbCgiRmFpbGVkIHRvIGxvYWQgY29udHJvbGxlciBtb2RlbCBmb3IgZGV2aWNlLCBhdHRlbXB0aW5nIHRvIGxvYWQgZGVmYXVsdC4iKSwgdGhpcy5sb2FkTW9kZWwodDIpKSA6IE9sKCJGYWlsZWQgdG8gbG9hZCBkZWZhdWx0IGNvbnRyb2xsZXIgbW9kZWwuIik7CiAgfSwgbG9hZE1vZGVsOiBmdW5jdGlvbihlKSB7CiAgICB0aGlzLmVsLnNldEF0dHJpYnV0ZSgiZ2x0Zi1tb2RlbCIsICJ1cmwoIiArIGUgKyAiKSIpOwogIH0sIG9uTW9kZWxMb2FkZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjIsIGkyLCByMiwgbzIgPSB0aGlzLmNvbnRyb2xsZXJNb2RlbCA9IGUuZGV0YWlsLm1vZGVsLCBzMiA9IHRoaXMubG9hZGVkTWVzaEluZm87CiAgICBpZiAoZS50YXJnZXQgPT09IHRoaXMuZWwpIHsKICAgICAgaWYgKFVsKCJQcm9jZXNzaW5nIG1vZGVsIiksIHMyLmJ1dHRvbk1lc2hlcyA9IHt9LCBzMi5heGlzTWVzaGVzID0ge30sIG8yKSB7CiAgICAgICAgZm9yICh0MiA9IDA7dDIgPCB0aGlzLm1hcHBpbmcuYnV0dG9ucy5sZW5ndGg7IHQyKyspCiAgICAgICAgICAobjIgPSB0aGlzLm1hcHBpbmcuYnV0dG9uTWVzaE5hbWVzW3RoaXMubWFwcGluZy5idXR0b25zW3QyXV0pID8gKGkyID0gbzIuZ2V0T2JqZWN0QnlOYW1lKG4yKSkgPyAocjIgPSB7IGluZGV4OiB0MiwgdmFsdWU6IGEyKGkyLCAiVkFMVUUiKSwgcHJlc3NlZDogYTIoaTIsICJQUkVTU0VEIiksIHVucHJlc3NlZDogYTIoaTIsICJVTlBSRVNTRUQiKSB9KS52YWx1ZSAmJiByMi5wcmVzc2VkICYmIHIyLnVucHJlc3NlZCA/IHMyLmJ1dHRvbk1lc2hlc1t0aGlzLm1hcHBpbmcuYnV0dG9uc1t0Ml1dID0gcjIgOiBPbCgiTWlzc2luZyBidXR0b24gc3VibWVzaCB1bmRlciBtZXNoIHdpdGggbmFtZTogIiArIG4yICsgIihWQUxVRTogIiArICEhcjIudmFsdWUgKyAiLCBQUkVTU0VEOiAiICsgISFyMi5wcmVzc2VkICsgIiwgVU5QUkVTU0VEOiIgKyAhIXIyLnVucHJlc3NlZCArICIpIikgOiBPbCgiTWlzc2luZyBidXR0b24gbWVzaCB3aXRoIG5hbWU6ICIgKyBuMikgOiBVbCgiU2tpcHBpbmcgdW5rbm93biBidXR0b24gYXQgaW5kZXg6ICIgKyB0MiArICIgd2l0aCBtYXBwZWQgbmFtZTogIiArIHRoaXMubWFwcGluZy5idXR0b25zW3QyXSk7CiAgICAgICAgZm9yICh0MiA9IDA7dDIgPCB0aGlzLm1hcHBpbmcuYXhpc01lc2hOYW1lcy5sZW5ndGg7IHQyKyspCiAgICAgICAgICAobjIgPSB0aGlzLm1hcHBpbmcuYXhpc01lc2hOYW1lc1t0Ml0pID8gKGkyID0gbzIuZ2V0T2JqZWN0QnlOYW1lKG4yKSkgPyAocjIgPSB7IGluZGV4OiB0MiwgdmFsdWU6IGEyKGkyLCAiVkFMVUUiKSwgbWluOiBhMihpMiwgIk1JTiIpLCBtYXg6IGEyKGkyLCAiTUFYIikgfSkudmFsdWUgJiYgcjIubWluICYmIHIyLm1heCA/IHMyLmF4aXNNZXNoZXNbdDJdID0gcjIgOiBPbCgiTWlzc2luZyBheGlzIHN1Ym1lc2ggdW5kZXIgbWVzaCB3aXRoIG5hbWU6ICIgKyBuMiArICIoVkFMVUU6ICIgKyAhIXIyLnZhbHVlICsgIiwgTUlOOiAiICsgISFyMi5taW4gKyAiLCBNQVg6IiArICEhcjIubWF4ICsgIikiKSA6IE9sKCJNaXNzaW5nIGF4aXMgbWVzaCB3aXRoIG5hbWU6ICIgKyBuMikgOiBVbCgiU2tpcHBpbmcgdW5rbm93biBheGlzIGF0IGluZGV4OiAiICsgdDIpOwogICAgICAgIHRoaXMuY2FsY3VsYXRlUmF5T3JpZ2luRnJvbU1lc2gobzIpLCB0aGlzLnNldE1vZGVsVmlzaWJpbGl0eSgpOwogICAgICB9CiAgICAgIFVsKCJNb2RlbCBsb2FkIGNvbXBsZXRlLiIpOwogICAgfQogICAgZnVuY3Rpb24gYTIoZTIsIHQzKSB7CiAgICAgIGZvciAodmFyIG4zID0gMCwgaTMgPSBlMi5jaGlsZHJlbi5sZW5ndGg7bjMgPCBpMzsgbjMrKykgewogICAgICAgIHZhciByMyA9IGUyLmNoaWxkcmVuW24zXTsKICAgICAgICBpZiAocjMgJiYgcjMubmFtZSA9PT0gdDMpCiAgICAgICAgICByZXR1cm4gcjM7CiAgICAgIH0KICAgIH0KICB9LCBjYWxjdWxhdGVSYXlPcmlnaW5Gcm9tTWVzaDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IG5ldyBSZS5RdWF0ZXJuaW9uOwogICAgcmV0dXJuIGZ1bmN0aW9uKHQyKSB7CiAgICAgIHZhciBuMjsKICAgICAgaWYgKHRoaXMucmF5T3JpZ2luLm9yaWdpbi5zZXQoMCwgMCwgMCksIHRoaXMucmF5T3JpZ2luLmRpcmVjdGlvbi5zZXQoMCwgMCwgLTEpLCB0aGlzLnJheU9yaWdpbi5jcmVhdGVkRnJvbU1lc2ggPSB0cnVlLCBuMiA9IHQyLmdldE9iamVjdEJ5TmFtZSh0aGlzLm1hcHBpbmcucG9pbnRpbmdQb3NlTWVzaE5hbWUpKSB7CiAgICAgICAgdmFyIGkyID0gdDIucGFyZW50OwogICAgICAgIGkyICYmICh0Mi5wYXJlbnQgPSBudWxsLCB0Mi51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKSwgdDIucGFyZW50ID0gaTIpLCBuMi5nZXRXb3JsZFBvc2l0aW9uKHRoaXMucmF5T3JpZ2luLm9yaWdpbiksIG4yLmdldFdvcmxkUXVhdGVybmlvbihlKSwgdGhpcy5yYXlPcmlnaW4uZGlyZWN0aW9uLmFwcGx5UXVhdGVybmlvbihlKSwgaTIgJiYgdDIudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7CiAgICAgIH0gZWxzZQogICAgICAgIFVsKCJNZXNoIGRvZXMgbm90IGNvbnRhaW4gcG9pbnRpbmcgb3JpZ2luIGRhdGEsIGRlZmF1bHRpbmcgdG8gbm9uZS4iKTsKICAgICAgdGhpcy5tb2RlbFJlYWR5KCk7CiAgICB9OwogIH0oKSwgbGVycEF4aXNUcmFuc2Zvcm06IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSBuZXcgUmUuUXVhdGVybmlvbjsKICAgIHJldHVybiBmdW5jdGlvbih0MiwgbjIpIHsKICAgICAgdmFyIGkyID0gdGhpcy5sb2FkZWRNZXNoSW5mby5heGlzTWVzaGVzW3QyXTsKICAgICAgaWYgKGkyKSB7CiAgICAgICAgdmFyIHsgbWluOiByMiwgbWF4OiBvMiwgdmFsdWU6IHMyIH0gPSBpMiwgYTIgPSAwLjUgKiBuMiArIDAuNTsKICAgICAgICBzMi5zZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKGUuY29weShyMi5xdWF0ZXJuaW9uKS5zbGVycChvMi5xdWF0ZXJuaW9uLCBhMikpLCBzMi5wb3NpdGlvbi5sZXJwVmVjdG9ycyhyMi5wb3NpdGlvbiwgbzIucG9zaXRpb24sIGEyKTsKICAgICAgfQogICAgfTsKICB9KCksIGxlcnBCdXR0b25UcmFuc2Zvcm06IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSBuZXcgUmUuUXVhdGVybmlvbjsKICAgIHJldHVybiBmdW5jdGlvbih0MiwgbjIpIHsKICAgICAgdmFyIGkyID0gdGhpcy5sb2FkZWRNZXNoSW5mby5idXR0b25NZXNoZXNbdDJdOwogICAgICBpZiAoaTIpIHsKICAgICAgICB2YXIgeyB1bnByZXNzZWQ6IHIyLCBwcmVzc2VkOiBvMiwgdmFsdWU6IHMyIH0gPSBpMjsKICAgICAgICBzMi5zZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKGUuY29weShyMi5xdWF0ZXJuaW9uKS5zbGVycChvMi5xdWF0ZXJuaW9uLCBuMikpLCBzMi5wb3NpdGlvbi5sZXJwVmVjdG9ycyhyMi5wb3NpdGlvbiwgbzIucG9zaXRpb24sIG4yKTsKICAgICAgfQogICAgfTsKICB9KCksIG1vZGVsUmVhZHk6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5lbWl0KCJjb250cm9sbGVybW9kZWxyZWFkeSIsIHsgbmFtZTogIndpbmRvd3MtbW90aW9uLWNvbnRyb2xzIiwgbW9kZWw6IHRoaXMuZGF0YS5tb2RlbCwgcmF5T3JpZ2luOiB0aGlzLnJheU9yaWdpbiB9KTsKICB9LCBvbkJ1dHRvbkNoYW5nZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IHRoaXMubWFwcGluZy5idXR0b25zW2UuZGV0YWlsLmlkXTsKICAgIHQyICYmICh0aGlzLmxvYWRlZE1lc2hJbmZvICYmIHRoaXMubG9hZGVkTWVzaEluZm8uYnV0dG9uTWVzaGVzICYmIHRoaXMubGVycEJ1dHRvblRyYW5zZm9ybSh0MiwgZS5kZXRhaWwuc3RhdGUudmFsdWUpLCB0aGlzLmVsLmVtaXQodDIgKyAiY2hhbmdlZCIsIGUuZGV0YWlsLnN0YXRlKSk7CiAgfSwgb25BeGlzTW92ZWQ6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IHRoaXMubWFwcGluZy5heGlzTWVzaE5hbWVzLmxlbmd0aDsKICAgIGlmICh0aGlzLmxvYWRlZE1lc2hJbmZvICYmIHRoaXMubG9hZGVkTWVzaEluZm8uYXhpc01lc2hlcykKICAgICAgZm9yICh2YXIgbjIgPSAwO24yIDwgdDI7IG4yKyspCiAgICAgICAgdGhpcy5sZXJwQXhpc1RyYW5zZm9ybShuMiwgZS5kZXRhaWwuYXhpc1tuMl0gfHwgMCk7CiAgICBHcih0aGlzLCB0aGlzLm1hcHBpbmcuYXhlcywgZSk7CiAgfSwgc2V0TW9kZWxWaXNpYmlsaXR5OiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSB0aGlzLmVsLmdldE9iamVjdDNEKCJtZXNoIik7CiAgICB0aGlzLmNvbnRyb2xsZXJQcmVzZW50ICYmIChlID0gZSAhPT0gdW5kZWZpbmVkID8gZSA6IHRoaXMubW9kZWxWaXNpYmxlLCB0aGlzLm1vZGVsVmlzaWJsZSA9IGUsIHQyICYmICh0Mi52aXNpYmxlID0gZSkpOwogIH0gfSksIFRsID0gbmV3IFJlLlF1YXRlcm5pb24sIFJsID0gbmV3IFJlLlZlY3RvcjMsIGZ1bmN0aW9uKGUsIHQyLCBuMikgewogICAgdDIucG9zaXRpb24uY29weShlLnRyYW5zZm9ybS5wb3NpdGlvbiksIHQyLnF1YXRlcm5pb24uY29weShlLnRyYW5zZm9ybS5vcmllbnRhdGlvbiksIFJsLmNvcHkobjIpLCBUbC5jb3B5KGUudHJhbnNmb3JtLm9yaWVudGF0aW9uKSwgUmwuYXBwbHlRdWF0ZXJuaW9uKFRsKSwgdDIucG9zaXRpb24uc3ViKFJsKTsKICB9KTsKICBqbC50ZW1wRmFrZVBvc2UgPSB7IHRyYW5zZm9ybTogeyBvcmllbnRhdGlvbjogbmV3IFJlLlF1YXRlcm5pb24sIHBvc2l0aW9uOiBuZXcgUmUuVmVjdG9yMyB9IH0sIF9sLnByb3RvdHlwZS5wcmV2aW91c0ZyYW1lQW5jaG9ycyA9IG5ldyBTZXQsIF9sLnByb3RvdHlwZS5hbmNob3JUb09iamVjdDNEID0gbmV3IE1hcCwgX2wucHJvdG90eXBlLnNlc3Npb25TdGFydCA9IGZ1bmN0aW9uKGUpIHsKICAgIHRoaXMuc2Vzc2lvbiA9IHRoaXMucmVuZGVyZXIueHIuZ2V0U2Vzc2lvbigpLCAicmVxdWVzdEhpdFRlc3RTb3VyY2UiIGluIHRoaXMuc2Vzc2lvbiA/IGUuc3BhY2UgPyB0aGlzLnNlc3Npb24ucmVxdWVzdEhpdFRlc3RTb3VyY2UoZSkudGhlbihmdW5jdGlvbihlMikgewogICAgICB0aGlzLnhySGl0VGVzdFNvdXJjZSA9IGUyOwogICAgfS5iaW5kKHRoaXMpKS5jYXRjaChIbCkgOiBlLnByb2ZpbGUgJiYgdGhpcy5zZXNzaW9uLnJlcXVlc3RIaXRUZXN0U291cmNlRm9yVHJhbnNpZW50SW5wdXQoZSkudGhlbihmdW5jdGlvbihlMikgewogICAgICB0aGlzLnhySGl0VGVzdFNvdXJjZSA9IGUyLCB0aGlzLnRyYW5zaWVudCA9IHRydWU7CiAgICB9LmJpbmQodGhpcykpLmNhdGNoKEhsKSA6IEhsKHsgbWVzc2FnZTogIk5vIHJlcXVlc3RIaXRUZXN0U291cmNlIG9uIHRoZSBzZXNzaW9uLiIgfSk7CiAgfSwgX2wucHJvdG90eXBlLmFuY2hvckZyb21MYXN0SGl0VGVzdFJlc3VsdCA9IGZ1bmN0aW9uKGUsIHQyKSB7CiAgICB2YXIgbjIgPSB0aGlzLmxhc3RIaXRUZXN0OwogICAgaWYgKG4yKSB7CiAgICAgIHZhciBpMiA9IHsgb2JqZWN0M0Q6IGUsIG9mZnNldDogdDIgfTsKICAgICAgQXJyYXkuZnJvbSh0aGlzLmFuY2hvclRvT2JqZWN0M0QuZW50cmllcygpKS5mb3JFYWNoKGZ1bmN0aW9uKHQzKSB7CiAgICAgICAgdmFyIG4zID0gdDNbMV0ub2JqZWN0M0QsIGkzID0gdDNbMF07CiAgICAgICAgbjMgPT09IGUgJiYgKHRoaXMuYW5jaG9yVG9PYmplY3QzRC5kZWxldGUoaTMpLCBpMy5kZWxldGUoKSk7CiAgICAgIH0uYmluZCh0aGlzKSksIG4yLmNyZWF0ZUFuY2hvciAmJiBuMi5jcmVhdGVBbmNob3IoKS50aGVuKGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgdGhpcy5hbmNob3JUb09iamVjdDNELnNldChlMiwgaTIpOwogICAgICB9LmJpbmQodGhpcykpLmNhdGNoKGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgY29uc29sZS53YXJuKGUyLm1lc3NhZ2UpLCBjb25zb2xlLndhcm4oJ0Nhbm5vdCBjcmVhdGUgYW5jaG9yLCBhcmUgeW91IG1pc3Npbmc6IHdlYnhyPSJvcHRpb25hbEZlYXR1cmVzOiBhbmNob3JzOyIgZnJvbSA8YS1zY2VuZT4/Jyk7CiAgICAgIH0pOwogICAgfQogIH0sIF9sLnByb3RvdHlwZS5kb0hpdCA9IGZ1bmN0aW9uKGUpIHsKICAgIGlmICh0aGlzLnJlbmRlcmVyLnhyLmlzUHJlc2VudGluZykgewogICAgICB2YXIgdDIsIG4yLCBpMiA9IHRoaXMucmVuZGVyZXIueHIuZ2V0UmVmZXJlbmNlU3BhY2UoKSwgcjIgPSBlLmdldFZpZXdlclBvc2UoaTIpOwogICAgICByZXR1cm4gdGhpcy54ckhpdFRlc3RTb3VyY2UgJiYgcjIgPyB0aGlzLnRyYW5zaWVudCA/ICh0MiA9IGUuZ2V0SGl0VGVzdFJlc3VsdHNGb3JUcmFuc2llbnRJbnB1dCh0aGlzLnhySGl0VGVzdFNvdXJjZSkpLmxlbmd0aCA+IDAgJiYgKG4yID0gdDJbMF0ucmVzdWx0cykubGVuZ3RoID4gMCAmJiAodGhpcy5sYXN0SGl0VGVzdCA9IG4yWzBdLCBuMlswXS5nZXRQb3NlKGkyKSkgOiAodDIgPSBlLmdldEhpdFRlc3RSZXN1bHRzKHRoaXMueHJIaXRUZXN0U291cmNlKSkubGVuZ3RoID4gMCAmJiAodGhpcy5sYXN0SGl0VGVzdCA9IHQyWzBdLCB0MlswXS5nZXRQb3NlKGkyKSkgOiB1bmRlZmluZWQ7CiAgICB9CiAgfSwgX2wudXBkYXRlQW5jaG9yUG9zZXMgPSBmdW5jdGlvbihlLCB0MikgewogICAgdmFyIG4yID0gZS50cmFja2VkQW5jaG9ycyB8fCBfbC5wcm90b3R5cGUucHJldmlvdXNGcmFtZUFuY2hvcnM7CiAgICBfbC5wcm90b3R5cGUucHJldmlvdXNGcmFtZUFuY2hvcnMuZm9yRWFjaChmdW5jdGlvbihlMikgewogICAgICBuMi5oYXMoZTIpIHx8IF9sLnByb3RvdHlwZS5hbmNob3JUb09iamVjdDNELmRlbGV0ZShlMik7CiAgICB9KSwgbjIuZm9yRWFjaChmdW5jdGlvbihuMykgewogICAgICB2YXIgaTIsIHIyLCBvMiwgczI7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKGkyID0gZS5nZXRQb3NlKG4zLmFuY2hvclNwYWNlLCB0MikpIHsKICAgICAgICAgIGlmICghKHIyID0gX2wucHJvdG90eXBlLmFuY2hvclRvT2JqZWN0M0QuZ2V0KG4zKSkpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIG8yID0gcjIub2Zmc2V0LCBzMiA9IHIyLm9iamVjdDNELCBqbChpMiwgczIsIG8yKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcigid2hpbGUgdXBkYXRpbmcgYW5jaG9yIHBvc2VzOiIsIGUyKTsKICAgICAgfQogICAgfSksIF9sLnByb3RvdHlwZS5wcmV2aW91c0ZyYW1lQW5jaG9ycyA9IG4yOwogIH0sIGNzKCJhci1oaXQtdGVzdCIsIHsgc2NoZW1hOiB7IHRhcmdldDogeyB0eXBlOiAic2VsZWN0b3IiIH0sIGVuYWJsZWQ6IHsgZGVmYXVsdDogdHJ1ZSB9LCBzcmM6IHsgZGVmYXVsdDogImRhdGE6aW1hZ2Uvd2VicDtiYXNlNjQsVWtsR1JrUUhBQUJYUlVKUVZsQTRXQW9BQUFBUUFBQUEvd0VBL3dFQVFVeFFTTDBEQUFBUkR6RC9FUkdDanJZOXNZWUZmZ282YWExa0o3SzB3OUxvM0FhZExTVmVGeGV2UXdqNWt1TThSZlIvQXR3L0MwK296Qi9vVUJybG9GWnM2RWxTVzg4ajFLQTR5RXhOV1FhcVJacXVJREYwSlltbHEwaEF1VURURnU2NnRuZzN0ZVc3cGEzY1FmMVYxZWR2dXI1NE0vU2xtNld2M0d4OXp3ME1YbFFMbnRjc0JONndrSGpUUXVZdEM0VzNMVHc4bUdSVkc1N1RiQVJPdHhIZlpOaEluR2tqYzVhTnd0azJIZzZNdmtpMTRrK05rWnpDd1FnQ3hhbGNBdjNrZGRSVFBJMURjVXJYSWQxRkxmMXVIcHphUXo0dHF1aFpWTGxLZXNiVnBxS2VUajBuMEY1UHBYRGxGTjlVcW1oYWxML0ltdVpGbzZLbVRvV0xvS2xkZE1wcnFsUzhjS292QnZIbzJrVGlGVjJMTjRtc2F4S1psM1FOaWFpcjh4WVJkRFdpdkl2WFZYbWJjTXFKNTFVZWJadUZYeFp0NnhkNGxheHRjaXFSdEEzQ3YwblUxdCtrRVVGYkk4SnZDYSt0dmttM0ZEbE8vVytPUjk5K2tXRXAvWVlvK3RZZlRWbmYvSzhjRS9GLy8vM3Z2Ly85OTNlZUwrYSt1dmphd0xjWDN4all2Sm90QkZZM2tWalRSR0Z0RStCVTJBaU1iaVF5aHBITVdFWWVCb3pBSDVxTkJZUkRCNUtCQ2FUREJLS0JBWlREQm9LQkRqd0hBTjVBQmVDSkJzQVpjQUFDMFlISHhBWVNNWUJpWWdHWldFQTJNWUZDYkNDWkdBQUlBTkZFQitBbllnTVFURFFBWVNKMkFONUVCWkFtNGdEZ1REZ0FlU0l1NERHeWdUSVJOMUNNTE9DWmlBQ3lrUWxnNGpzQXljZ0E4QU8rQnhDTmRKeURrY2J3UmlyREdYR254OHcrRkRQcmtNM01ROUpRWk1ZaGlpd1YvUkRNdElNM1UxL0RtWEhVbytJUjJrU1IyVG9Xa1ExTkluMnFmMko4TENxSktpRFVpU0FESFkzd2hpcmhkSGdaOTRIS2FSOTdQaEUrdHdFVUpVRm9BY2d5VGN0OGhmU3hTa1NoQVNES2RNSi9yaXRLSHdneVEwc0Q0RC9taUN4VTVTYmhPT1VEVG5acGNjQ2pZUC9pMGJaLzhiQWd0VkdFb0dhcFdJUVh5ektWS0x3Z05KRmsycnRNSWdvTlJKbE9aRjdTTlNTeVVFZVFtYnhCRktFbXRZakVlOFM4ek9aMUFrSlZDbVM4OEZKT3RGNDBLc2c0b1VhRml5Z2szQzhxbFRWTnlsOFVUZXZDVWRBRTJ0MTRQZlZxVTFGUHA1N1RvcEtlUVpXcm9tZGRUUXA2UU9mVE9FUXQvWkR1aXBaMTF3L3dPaXFPOGRST1JjYzZCUUVrRFFNQ2xhSGNuNXdWOXlMYnhzTlpOZ3BuMnNpY1lTTnh1bzM0SnMxRzRGUWJudU5zT1BhMjhQQ1doY0tiRmpKdldFaThaaUh3cWdYUGN4YmM1ZGIzM0N4OTVXYm9TemRkWDd5cCt2eU4wK2V1bDdaeU43WGx1NjR0M2pWdDRjNXBjNEpMVjVFWXVwSkUweFVrbkM0bk9qVmxtYVlweUxpdDUzSENRMCtTY25xY2VOY1M1ZHpVa2QwL0N3TUFWbEE0SUdBREFBQVFYd0NkQVNvQUFnQUNQOG5lNld5L3RqQ3BxSi9JQS9BNUNXbHU0WFlCRy9QejhBZndEOEFQei8vZjN2OEUxZnVIWm54S1lBQ3RmdUhabnhLWUFDcllUYjVtT3NsaHh1ODQzZWNidk9OM25HN3pqZDNhMFZDbjdHMU1BQlZ4d0gvWGQyNWdBSzErNGRtZkVwZTIrUEhoUWFqNzUrK3JpRzZGdVlBQ3RmdUhabnhLWUFDUnJLM3E5eE84U3MzdVdLbk1ocy9yREYxaGk2d3hkWVl1c01YV0dJNVFSY0NGRFpvZzVPZ3FObHNlMU5EdXovVW9GYS9jT3pQaVV3QUVzQU9LNC9udTVlWkhLMnRsWHhKZk5ZbE1BQld2M0RzejRidk5KNVlBL0x0eEozOFNtQUFyWDdoMlo4U2s1dmRaVVl2N21aUGlVd0FGYS9jT3pQaDIxczVPZ1p4ZjFtZkVwZW1SeUZyL3JNK0pTOW5vQS9MdHhKMzhTbUFBbFVKSW90ekFBU242VGpkaEsrRDNEc3o0ZHl2QjdoMlo4TzJ0bkowRE9MK3N6NGxMMm5LTFQ0bEwvK2lTTE9vY3hxNjM5dzdNMzRNTlpkbTU1dUo4djhyYTJjcFZabnhLVHEyRjNQTi9jTmtzQWZsMjRrNytKVEFBU3FyRDM3aDJaN2IxVytWdGJPVXFzejRsSjFiQzdubS91R3lXQVB5N2NTZC9FcGdBSlZWaDc5dzdNOXQ2cmZLMnRuS1ZXWjhTazZ0aGR6emYzRFpMQUg1ZHVKTy9pVXdBRXFxdzkrNGRtZTI5VnZsYld6bEtyTStKU2RXd3U1NXY3aHNsZ0Q4dTNFbmZ4S1lBQ1ZWWWUvY096UGJlcTN5dHJaeWxWbWUwa1lKODU1N0ZMZXJxRnJ6SWJQcnJmM0RaTEFINWR1Sk8vaVV2YVZNUzlCb2FGNHA3cFNERlRQMVhNeWZFbGVsck0wRE9MK3N6NGVCSjEzblYxT3BwQkdQdUtiNFl6WFFncTl1SDE5dVMvMCtKUzl0OWZyNlpVbFFCZWxERzZHTWdxOTdvdGI1UU1QSnd0S3lCVGJGcDhTbDdiNi9YMHlra2F3RU9zZ2RpRTZGaTB2Yi9FdmU2eGt3c211ZzBaNG5HTkhRTzg4MzlicFRzanB6N1NXSUp4S2FndmQxUVdNYTZGWVQxS0V3M2o0WERUNnZKOVhrK255ZlQ1UHE4bjFlRW1rNWRpbk1NLzlGY2Z6NFozRHN6M0tEMmR3N0x4QlJ4S3JxVVVHUVBILzd6eHIxS0lmTnBMRUowTVpCMklUTS8wWjJFRm9oMTJObFhuRWNwWWNidk9OM25HN3pqZDV4dTg0dmZjTklBQVA3K3k4Y2V5emJWeGtha1BZWTRsY3I3MmZxT25Ed2lwdit5eEM3MXdBQURCcmpLbkFBQUFBQUFBQUFBQUFBdzdvTkdIdHRxV09OY29GTi8yV0lEYzJwYTZXVkZ0RllST2xzYU1hVFhkY09qWEh6OTMrWXhBZ2xLYTRBQUFBQT0iLCB0eXBlOiAibWFwIiB9LCB0eXBlOiB7IGRlZmF1bHQ6ICJmb290cHJpbnQiLCBvbmVPZjogWyJmb290cHJpbnQiLCAibWFwIl0gfSwgZm9vdHByaW50RGVwdGg6IHsgZGVmYXVsdDogMC4xIH0sIG1hcFNpemU6IHsgdHlwZTogInZlYzIiLCBkZWZhdWx0OiB7IHg6IDAuNSwgeTogMC41IH0gfSB9LCBzY2VuZU9ubHk6IHRydWUsIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5oaXRUZXN0ID0gbnVsbCwgdGhpcy5pbWFnZURhdGFBcnJheSA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgxMDQ4NTc2KSwgdGhpcy5pbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKHRoaXMuaW1hZ2VEYXRhQXJyYXksIDUxMiwgNTEyKSwgdGhpcy50ZXh0dXJlQ2FjaGUgPSBuZXcgTWFwLCB0aGlzLm9ydGhvQ2FtID0gbmV3IFJlLk9ydGhvZ3JhcGhpY0NhbWVyYSwgdGhpcy5vcnRob0NhbS5sYXllcnMuc2V0KDIxKSwgdGhpcy50ZXh0dXJlVGFyZ2V0ID0gbmV3IFJlLldlYkdMUmVuZGVyVGFyZ2V0KDUxMiwgNTEyLCB7fSksIHRoaXMuYmFzaWNNYXRlcmlhbCA9IG5ldyBSZS5NZXNoQmFzaWNNYXRlcmlhbCh7IGNvbG9yOiAwLCBzaWRlOiBSZS5Eb3VibGVTaWRlIH0pLCB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLCB0aGlzLmNvbnRleHQgPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCIyZCIpLCB0aGlzLmNvbnRleHQuaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2UsIHRoaXMuY2FudmFzLndpZHRoID0gNTEyLCB0aGlzLmNhbnZhcy5oZWlnaHQgPSA1MTIsIHRoaXMuY2FudmFzVGV4dHVyZSA9IG5ldyBSZS5DYW52YXNUZXh0dXJlKHRoaXMuY2FudmFzLCB7IGFscGhhOiB0cnVlIH0pLCB0aGlzLmNhbnZhc1RleHR1cmUuZmxpcFkgPSBmYWxzZTsKICAgIHZhciBlID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoIndlYnhyIiksIHQyID0gZS5vcHRpb25hbEZlYXR1cmVzOwogICAgdDIuaW5jbHVkZXMoImhpdC10ZXN0IikgJiYgdDIuaW5jbHVkZXMoImFuY2hvcnMiKSB8fCAodDIucHVzaCgiaGl0LXRlc3QiKSwgdDIucHVzaCgiYW5jaG9ycyIpLCB0aGlzLmVsLnNldEF0dHJpYnV0ZSgid2VieHIiLCBlKSksIHRoaXMuZWwuc2NlbmVFbC5yZW5kZXJlci54ci5hZGRFdmVudExpc3RlbmVyKCJzZXNzaW9uZW5kIiwgZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuaGl0VGVzdCA9IG51bGw7CiAgICB9LmJpbmQodGhpcykpLCB0aGlzLmVsLnNjZW5lRWwuYWRkRXZlbnRMaXN0ZW5lcigiZW50ZXItdnIiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuZWwuaXMoImFyLW1vZGUiKSkgewogICAgICAgIHZhciBlMiA9IHRoaXMuZWwuc2NlbmVFbC5yZW5kZXJlciwgdDMgPSB0aGlzLnNlc3Npb24gPSBlMi54ci5nZXRTZXNzaW9uKCk7CiAgICAgICAgdGhpcy5oYXNQb3NlZE9uY2UgPSBmYWxzZSwgdGhpcy5iYm94TWVzaC52aXNpYmxlID0gZmFsc2UsIEZsIHx8IChGbCA9IG5ldyBNYXApLCB0My5yZXF1ZXN0UmVmZXJlbmNlU3BhY2UoInZpZXdlciIpLnRoZW4oZnVuY3Rpb24odDQpIHsKICAgICAgICAgIHRoaXMudmlld2VySGl0VGVzdCA9IHRoaXMuaGl0VGVzdCA9IG5ldyBfbChlMiwgeyBzcGFjZTogdDQgfSksIHRoaXMuZWwuZW1pdCgiYXItaGl0LXRlc3Qtc3RhcnQiKTsKICAgICAgICB9LmJpbmQodGhpcykpOwogICAgICAgIHZhciBuMiA9IHRoaXM7CiAgICAgICAgdGhpcy5lbC5zY2VuZUVsLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRyb2xsZXJzdXBkYXRlZCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIHQ0ID0gdGhpcy54clNlc3Npb24gJiYgdGhpcy54clNlc3Npb24uaW5wdXRTb3VyY2VzOwogICAgICAgICAgaWYgKHQ0KSB7CiAgICAgICAgICAgIGZvciAodmFyIGkzID0gMDtpMyA8IHQ0Lmxlbmd0aDsgKytpMykKICAgICAgICAgICAgICBpZiAodDRbaTNdLnRhcmdldFJheU1vZGUgPT09ICJ0cmFja2VkLXBvaW50ZXIiKSB7CiAgICAgICAgICAgICAgICBuMi5oaXRUZXN0ID0gbmV3IF9sKGUyLCB7IHNwYWNlOiB0NFtpM10udGFyZ2V0UmF5U3BhY2UgfSksIEZsLnNldCh0NFtpM10sIG4yLmhpdFRlc3QpLCBuMi52aWV3ZXJIaXRUZXN0ICYmIHR5cGVvZiBuMi52aWV3ZXJIaXRUZXN0LmNhbmNlbCA9PSAiZnVuY3Rpb24iICYmIChuMi52aWV3ZXJIaXRUZXN0LmNhbmNlbCgpLCBuMi52aWV3ZXJIaXRUZXN0ID0gbnVsbCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdmFyIGkyID0gImdlbmVyaWMtdG91Y2hzY3JlZW4iLCByMiA9IG5ldyBfbChlMiwgeyBwcm9maWxlOiBpMiB9KTsKICAgICAgICB0My5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3RzdGFydCIsIGZ1bmN0aW9uKHQ0KSB7CiAgICAgICAgICBpZiAodGhpcy5kYXRhLmVuYWJsZWQgPT09IHRydWUpIHsKICAgICAgICAgICAgdmFyIG4zID0gdDQuaW5wdXRTb3VyY2U7CiAgICAgICAgICAgIHRoaXMuYmJveE1lc2gudmlzaWJsZSA9IHRydWUsIHRoaXMuaGFzUG9zZWRPbmNlID09PSB0cnVlICYmICh0aGlzLmVsLmVtaXQoImFyLWhpdC10ZXN0LXNlbGVjdC1zdGFydCIsIHsgaW5wdXRTb3VyY2U6IG4zLCBwb3NpdGlvbjogdGhpcy5iYm94TWVzaC5wb3NpdGlvbiwgb3JpZW50YXRpb246IHRoaXMuYmJveE1lc2gucXVhdGVybmlvbiB9KSwgbjMucHJvZmlsZXNbMF0gPT09IGkyID8gdGhpcy5oaXRUZXN0ID0gcjIgOiAodGhpcy5oaXRUZXN0ID0gRmwuZ2V0KG4zKSB8fCBuZXcgX2woZTIsIHsgc3BhY2U6IG4zLnRhcmdldFJheVNwYWNlIH0pLCBGbC5zZXQobjMsIHRoaXMuaGl0VGVzdCkpKTsKICAgICAgICAgIH0KICAgICAgICB9LmJpbmQodGhpcykpLCB0My5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3RlbmQiLCBmdW5jdGlvbihlMykgewogICAgICAgICAgaWYgKHRoaXMuaGl0VGVzdCAmJiB0aGlzLmRhdGEuZW5hYmxlZCA9PT0gdHJ1ZSkgewogICAgICAgICAgICB2YXIgdDQsIG4zID0gZTMuaW5wdXRTb3VyY2U7CiAgICAgICAgICAgIHRoaXMuaGFzUG9zZWRPbmNlID09PSB0cnVlICYmICh0aGlzLmJib3hNZXNoLnZpc2libGUgPSBmYWxzZSwgdGhpcy5kYXRhLnRhcmdldCAmJiAodDQgPSB0aGlzLmRhdGEudGFyZ2V0Lm9iamVjdDNEKSAmJiAoamwudGVtcEZha2VQb3NlLnRyYW5zZm9ybS5wb3NpdGlvbi5jb3B5KHRoaXMuYmJveE1lc2gucG9zaXRpb24pLCBqbC50ZW1wRmFrZVBvc2UudHJhbnNmb3JtLm9yaWVudGF0aW9uLmNvcHkodGhpcy5iYm94TWVzaC5xdWF0ZXJuaW9uKSwgamwoamwudGVtcEZha2VQb3NlLCB0NCwgdGhpcy5iYm94T2Zmc2V0KSwgdDQudmlzaWJsZSA9IHRydWUsIHRoaXMuaGl0VGVzdC5hbmNob3JGcm9tTGFzdEhpdFRlc3RSZXN1bHQodDQsIHRoaXMuYmJveE9mZnNldCkpLCB0aGlzLmVsLmVtaXQoImFyLWhpdC10ZXN0LXNlbGVjdCIsIHsgaW5wdXRTb3VyY2U6IG4zLCBwb3NpdGlvbjogdGhpcy5iYm94TWVzaC5wb3NpdGlvbiwgb3JpZW50YXRpb246IHRoaXMuYmJveE1lc2gucXVhdGVybmlvbiB9KSwgdGhpcy5oaXRUZXN0ID0gbnVsbCk7CiAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgdGhpcy5oaXRUZXN0ID0gbnVsbDsKICAgICAgICB9LmJpbmQodGhpcykpOwogICAgICB9CiAgICB9LmJpbmQodGhpcykpLCB0aGlzLmJib3hPZmZzZXQgPSBuZXcgUmUuVmVjdG9yMywgdGhpcy51cGRhdGUgPSB0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpLCB0aGlzLm1ha2VCQm94KCk7CiAgfSwgdXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZGF0YS5lbmFibGVkID09PSBmYWxzZSAmJiAodGhpcy5oaXRUZXN0ID0gbnVsbCwgdGhpcy5iYm94TWVzaC52aXNpYmxlID0gZmFsc2UpLCB0aGlzLmRhdGEudGFyZ2V0ICYmICh0aGlzLmRhdGEudGFyZ2V0Lm9iamVjdDNEID8gKHRoaXMuZGF0YS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigibW9kZWwtbG9hZGVkIiwgdGhpcy51cGRhdGUpLCB0aGlzLmRhdGEudGFyZ2V0Lm9iamVjdDNELmxheWVycy5lbmFibGUoMjEpLCB0aGlzLmRhdGEudGFyZ2V0Lm9iamVjdDNELnRyYXZlcnNlKGZ1bmN0aW9uKGUpIHsKICAgICAgZS5sYXllcnMuZW5hYmxlKDIxKTsKICAgIH0pKSA6IHRoaXMuZGF0YS50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkIiwgdGhpcy51cGRhdGUsIHsgb25jZTogdHJ1ZSB9KSksIHRoaXMuYmJveE5lZWRzVXBkYXRlID0gdHJ1ZTsKICB9LCBtYWtlQkJveDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IG5ldyBSZS5QbGFuZUdlb21ldHJ5KDEsIDEpLCB0MiA9IG5ldyBSZS5NZXNoQmFzaWNNYXRlcmlhbCh7IHRyYW5zcGFyZW50OiB0cnVlLCBjb2xvcjogMTY3NzcyMTUgfSk7CiAgICBlLnJvdGF0ZVgoLU1hdGguUEkgLyAyKSwgZS5yb3RhdGVZKC1NYXRoLlBJIC8gMiksIHRoaXMuYmJveCA9IG5ldyBSZS5Cb3gzLCB0aGlzLmJib3hNZXNoID0gbmV3IFJlLk1lc2goZSwgdDIpLCB0aGlzLmVsLnNldE9iamVjdDNEKCJhci1oaXQtdGVzdCIsIHRoaXMuYmJveE1lc2gpLCB0aGlzLmJib3hNZXNoLnZpc2libGUgPSBmYWxzZTsKICB9LCB1cGRhdGVGb290cHJpbnQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyLCBuMiwgaTIgPSB0aGlzLmVsLnNjZW5lRWwucmVuZGVyZXIsIHIyID0gaTIueHIuZW5hYmxlZDsKICAgIHRoaXMuYmJveE1lc2gubWF0ZXJpYWwubWFwID0gdGhpcy5jYW52YXNUZXh0dXJlLCB0aGlzLmJib3hNZXNoLm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZSwgdGhpcy5vcnRob0NhbS5yb3RhdGlvbi5zZXQoLU1hdGguUEkgLyAyLCAwLCAtTWF0aC5QSSAvIDIpLCB0aGlzLm9ydGhvQ2FtLnBvc2l0aW9uLmNvcHkodGhpcy5iYm94TWVzaC5wb3NpdGlvbiksIHRoaXMub3J0aG9DYW0ucG9zaXRpb24ueSAtPSB0aGlzLmJib3hNZXNoLnNjYWxlLnkgLyAyLCB0aGlzLm9ydGhvQ2FtLm5lYXIgPSAwLjEsIHRoaXMub3J0aG9DYW0uZmFyID0gdGhpcy5vcnRob0NhbS5uZWFyICsgdGhpcy5kYXRhLmZvb3RwcmludERlcHRoICogdGhpcy5iYm94TWVzaC5zY2FsZS55LCB0aGlzLm9ydGhvQ2FtLnBvc2l0aW9uLnkgKz0gdGhpcy5vcnRob0NhbS5mYXIsIHRoaXMub3J0aG9DYW0ucmlnaHQgPSB0aGlzLmJib3hNZXNoLnNjYWxlLnogLyAyLCB0aGlzLm9ydGhvQ2FtLmxlZnQgPSAtdGhpcy5iYm94TWVzaC5zY2FsZS56IC8gMiwgdGhpcy5vcnRob0NhbS50b3AgPSB0aGlzLmJib3hNZXNoLnNjYWxlLnggLyAyLCB0aGlzLm9ydGhvQ2FtLmJvdHRvbSA9IC10aGlzLmJib3hNZXNoLnNjYWxlLnggLyAyLCB0aGlzLm9ydGhvQ2FtLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSwgdDIgPSBpMi5nZXRSZW5kZXJUYXJnZXQoKSwgaTIuc2V0UmVuZGVyVGFyZ2V0KHRoaXMudGV4dHVyZVRhcmdldCksIGkyLnhyLmVuYWJsZWQgPSBmYWxzZSwgbjIgPSB0aGlzLmVsLm9iamVjdDNELmJhY2tncm91bmQsIHRoaXMuZWwub2JqZWN0M0Qub3ZlcnJpZGVNYXRlcmlhbCA9IHRoaXMuYmFzaWNNYXRlcmlhbCwgdGhpcy5lbC5vYmplY3QzRC5iYWNrZ3JvdW5kID0gbnVsbCwgaTIucmVuZGVyKHRoaXMuZWwub2JqZWN0M0QsIHRoaXMub3J0aG9DYW0pLCB0aGlzLmVsLm9iamVjdDNELmJhY2tncm91bmQgPSBuMiwgdGhpcy5lbC5vYmplY3QzRC5vdmVycmlkZU1hdGVyaWFsID0gbnVsbCwgaTIueHIuZW5hYmxlZCA9IHIyLCBpMi5zZXRSZW5kZXJUYXJnZXQodDIpLCBpMi5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzKHRoaXMudGV4dHVyZVRhcmdldCwgMCwgMCwgNTEyLCA1MTIsIHRoaXMuaW1hZ2VEYXRhQXJyYXkpLCB0aGlzLmNvbnRleHQucHV0SW1hZ2VEYXRhKHRoaXMuaW1hZ2VEYXRhLCAwLCAwKSwgdGhpcy5jb250ZXh0LnNoYWRvd0NvbG9yID0gIndoaXRlIiwgdGhpcy5jb250ZXh0LnNoYWRvd0JsdXIgPSAxMCwgdGhpcy5jb250ZXh0LmRyYXdJbWFnZSh0aGlzLmNhbnZhcywgMCwgMCksIGUgPSB0aGlzLmNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIDUxMiwgNTEyKTsKICAgIGZvciAodmFyIG8yID0gMDtvMiA8IDI2MjE0NDsgbzIrKykKICAgICAgZS5kYXRhWzQgKiBvMiArIDNdICE9PSAwICYmIGUuZGF0YVs0ICogbzIgKyAzXSAhPT0gMjU1ICYmIChlLmRhdGFbNCAqIG8yICsgM10gPSAxMjgpOwogICAgdGhpcy5jb250ZXh0LnB1dEltYWdlRGF0YShlLCAwLCAwKSwgdGhpcy5jYW52YXNUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICB9LCB0aWNrOiBmdW5jdGlvbigpIHsKICAgIHZhciBlLCB0MiwgbjIgPSB0aGlzLmVsLnNjZW5lRWwuZnJhbWUsIGkyID0gdGhpcy5lbC5zY2VuZUVsLnJlbmRlcmVyOwogICAgKG4yICYmIF9sLnVwZGF0ZUFuY2hvclBvc2VzKG4yLCBpMi54ci5nZXRSZWZlcmVuY2VTcGFjZSgpKSwgdGhpcy5iYm94TmVlZHNVcGRhdGUpICYmICh0aGlzLmJib3hOZWVkc1VwZGF0ZSA9IGZhbHNlLCB0aGlzLmRhdGEudGFyZ2V0ICYmIHRoaXMuZGF0YS50eXBlICE9PSAibWFwIiB8fCAodGhpcy50ZXh0dXJlQ2FjaGUuaGFzKHRoaXMuZGF0YS5zcmMpID8gdDIgPSB0aGlzLnRleHR1cmVDYWNoZS5nZXQodGhpcy5kYXRhLnNyYykgOiAodDIgPSBuZXcgUmUuVGV4dHVyZUxvYWRlcigpLmxvYWQodGhpcy5kYXRhLnNyYyksIHRoaXMudGV4dHVyZUNhY2hlLnNldCh0aGlzLmRhdGEuc3JjLCB0MikpLCB0aGlzLmJib3hNZXNoLm1hdGVyaWFsLm1hcCA9IHQyLCB0aGlzLmJib3hNZXNoLm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZSksIHRoaXMuZGF0YS50YXJnZXQgJiYgdGhpcy5kYXRhLnRhcmdldC5vYmplY3QzRCA/ICh0aGlzLmJib3guc2V0RnJvbU9iamVjdCh0aGlzLmRhdGEudGFyZ2V0Lm9iamVjdDNEKSwgdGhpcy5iYm94LmdldENlbnRlcih0aGlzLmJib3hNZXNoLnBvc2l0aW9uKSwgdGhpcy5iYm94LmdldFNpemUodGhpcy5iYm94TWVzaC5zY2FsZSksIHRoaXMuZGF0YS50eXBlID09PSAiZm9vdHByaW50IiAmJiAodGhpcy5iYm94TWVzaC5zY2FsZS54ICo9IDEuMDQsIHRoaXMuYmJveE1lc2guc2NhbGUueiAqPSAxLjA0LCB0aGlzLnVwZGF0ZUZvb3RwcmludCgpKSwgdGhpcy5iYm94TWVzaC5wb3NpdGlvbi55IC09IHRoaXMuYmJveE1lc2guc2NhbGUueSAvIDIsIHRoaXMuYmJveE9mZnNldC5jb3B5KHRoaXMuYmJveE1lc2gucG9zaXRpb24pLCB0aGlzLmJib3hPZmZzZXQuc3ViKHRoaXMuZGF0YS50YXJnZXQub2JqZWN0M0QucG9zaXRpb24pKSA6IHRoaXMuYmJveE1lc2guc2NhbGUuc2V0KHRoaXMuZGF0YS5tYXBTaXplLngsIDEsIHRoaXMuZGF0YS5tYXBTaXplLnkpKTsKICAgIHRoaXMuaGl0VGVzdCAmJiAoZSA9IHRoaXMuaGl0VGVzdC5kb0hpdChuMikpICYmICh0aGlzLmhhc1Bvc2VkT25jZSAhPT0gdHJ1ZSAmJiAodGhpcy5oYXNQb3NlZE9uY2UgPSB0cnVlLCB0aGlzLmVsLmVtaXQoImFyLWhpdC10ZXN0LWFjaGlldmVkIikpLCB0aGlzLmJib3hNZXNoLnZpc2libGUgPSB0cnVlLCB0aGlzLmJib3hNZXNoLnBvc2l0aW9uLmNvcHkoZS50cmFuc2Zvcm0ucG9zaXRpb24pLCB0aGlzLmJib3hNZXNoLnF1YXRlcm5pb24uY29weShlLnRyYW5zZm9ybS5vcmllbnRhdGlvbikpOwogIH0gfSksIGNzKCJiYWNrZ3JvdW5kIiwgeyBzY2hlbWE6IHsgY29sb3I6IHsgdHlwZTogImNvbG9yIiwgZGVmYXVsdDogImJsYWNrIiB9LCB0cmFuc3BhcmVudDogeyBkZWZhdWx0OiBmYWxzZSB9IH0sIHNjZW5lT25seTogdHJ1ZSwgdXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5kYXRhLCB0MiA9IHRoaXMuZWwub2JqZWN0M0Q7CiAgICBlLnRyYW5zcGFyZW50ID8gdDIuYmFja2dyb3VuZCA9IG51bGwgOiB0Mi5iYWNrZ3JvdW5kID0gbmV3IFJlLkNvbG9yKGUuY29sb3IpOwogIH0sIHJlbW92ZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsLm9iamVjdDNELmJhY2tncm91bmQgPSBudWxsOwogIH0gfSksIGNzKCJkZWJ1ZyIsIHsgc2NoZW1hOiB7IGRlZmF1bHQ6IHRydWUgfSwgc2NlbmVPbmx5OiB0cnVlIH0pOwogIGNzKCJkZXZpY2Utb3JpZW50YXRpb24tcGVybWlzc2lvbi11aSIsIHsgc2NoZW1hOiB7IGVuYWJsZWQ6IHsgZGVmYXVsdDogdHJ1ZSB9LCBkZXZpY2VNb3Rpb25NZXNzYWdlOiB7IGRlZmF1bHQ6ICJUaGlzIGltbWVyc2l2ZSB3ZWJzaXRlIHJlcXVpcmVzIGFjY2VzcyB0byB5b3VyIGRldmljZSBtb3Rpb24gc2Vuc29ycy4iIH0sIGh0dHBzTWVzc2FnZTogeyBkZWZhdWx0OiAiQWNjZXNzIHRoaXMgc2l0ZSBvdmVyIEhUVFBTIHRvIGVudGVyIFZSIG1vZGUgYW5kIGdyYW50IGFjY2VzcyB0byB0aGUgZGV2aWNlIHNlbnNvcnMuIiB9LCBkZW55QnV0dG9uVGV4dDogeyBkZWZhdWx0OiAiRGVueSIgfSwgYWxsb3dCdXR0b25UZXh0OiB7IGRlZmF1bHQ6ICJBbGxvdyIgfSwgY2FuY2VsQnV0dG9uVGV4dDogeyBkZWZhdWx0OiAiQ2FuY2VsIiB9IH0sIHNjZW5lT25seTogdHJ1ZSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXM7CiAgICB0aGlzLmRhdGEuZW5hYmxlZCAmJiAod2luZG93LmlzU2VjdXJlQ29udGV4dCB8fCB0aGlzLnNob3dIVFRQQWxlcnQoKSwgdHlwZW9mIERldmljZU9yaWVudGF0aW9uRXZlbnQgIT0gInVuZGVmaW5lZCIgJiYgRGV2aWNlT3JpZW50YXRpb25FdmVudC5yZXF1ZXN0UGVybWlzc2lvbiA/ICh0aGlzLm9uRGV2aWNlTW90aW9uRGlhbG9nQWxsb3dDbGlja2VkID0gdGhpcy5vbkRldmljZU1vdGlvbkRpYWxvZ0FsbG93Q2xpY2tlZC5iaW5kKHRoaXMpLCB0aGlzLm9uRGV2aWNlTW90aW9uRGlhbG9nRGVueUNsaWNrZWQgPSB0aGlzLm9uRGV2aWNlTW90aW9uRGlhbG9nRGVueUNsaWNrZWQuYmluZCh0aGlzKSwgRGV2aWNlT3JpZW50YXRpb25FdmVudC5yZXF1ZXN0UGVybWlzc2lvbigpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIGUuZWwuZW1pdCgiZGV2aWNlb3JpZW50YXRpb25wZXJtaXNzaW9uZ3JhbnRlZCIpLCBlLnBlcm1pc3Npb25HcmFudGVkID0gdHJ1ZTsKICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkgewogICAgICB2YXIgdDIsIG4yLCBpMiwgcjIsIG8yLCBzMiwgYTIsIEEyOwogICAgICBlLmRldmljZVBlcm1pc3Npb25EaWFsb2dFbCA9ICh0MiA9IGUuZGF0YS5kZW55QnV0dG9uVGV4dCwgbjIgPSBlLmRhdGEuYWxsb3dCdXR0b25UZXh0LCBpMiA9IGUuZGF0YS5kZXZpY2VNb3Rpb25NZXNzYWdlLCByMiA9IGUub25EZXZpY2VNb3Rpb25EaWFsb2dBbGxvd0NsaWNrZWQsIG8yID0gZS5vbkRldmljZU1vdGlvbkRpYWxvZ0RlbnlDbGlja2VkLCAoczIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuY2xhc3NMaXN0LmFkZChxbCksIChhMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpKS5jbGFzc0xpc3QuYWRkKFZsLCAiYS1kaWFsb2ctZGVueS1idXR0b24iKSwgYTIuc2V0QXR0cmlidXRlKGhpLCAiIiksIGEyLmlubmVySFRNTCA9IHQyLCBzMi5hcHBlbmRDaGlsZChhMiksIChBMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpKS5jbGFzc0xpc3QuYWRkKFZsLCAiYS1kaWFsb2ctYWxsb3ctYnV0dG9uIiksIEEyLnNldEF0dHJpYnV0ZShoaSwgIiIpLCBBMi5pbm5lckhUTUwgPSBuMiwgczIuYXBwZW5kQ2hpbGQoQTIpLCBBMi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgZTIuc3RvcFByb3BhZ2F0aW9uKCksIHIyKCk7CiAgICAgIH0pLCBhMi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgZTIuc3RvcFByb3BhZ2F0aW9uKCksIG8yKCk7CiAgICAgIH0pLCB6bChpMiwgczIpKSwgZS5lbC5hcHBlbmRDaGlsZChlLmRldmljZVBlcm1pc3Npb25EaWFsb2dFbCk7CiAgICB9KSkgOiB0aGlzLnBlcm1pc3Npb25HcmFudGVkID0gdHJ1ZSk7CiAgfSwgcmVtb3ZlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZGV2aWNlUGVybWlzc2lvbkRpYWxvZ0VsICYmIHRoaXMuZWwucmVtb3ZlQ2hpbGQodGhpcy5kZXZpY2VQZXJtaXNzaW9uRGlhbG9nRWwpOwogIH0sIG9uRGV2aWNlTW90aW9uRGlhbG9nRGVueUNsaWNrZWQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yZW1vdmUoKTsKICB9LCBzaG93SFRUUEFsZXJ0OiBmdW5jdGlvbigpIHsKICAgIHZhciBlLCB0MiwgbjIsIGkyLCByMiwgbzIgPSB0aGlzLCBzMiA9IChlID0gbzIuZGF0YS5jYW5jZWxCdXR0b25UZXh0LCB0MiA9IG8yLmRhdGEuaHR0cHNNZXNzYWdlLCBuMiA9IGZ1bmN0aW9uKCkgewogICAgICBvMi5lbC5yZW1vdmVDaGlsZChzMik7CiAgICB9LCAoaTIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuY2xhc3NMaXN0LmFkZChxbCksIChyMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpKS5jbGFzc0xpc3QuYWRkKFZsLCAiYS1kaWFsb2ctb2stYnV0dG9uIiksIHIyLnNldEF0dHJpYnV0ZShoaSwgIiIpLCByMi5pbm5lckhUTUwgPSBlLCBpMi5hcHBlbmRDaGlsZChyMiksIHIyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oZTIpIHsKICAgICAgZTIuc3RvcFByb3BhZ2F0aW9uKCksIG4yKCk7CiAgICB9KSwgemwodDIsIGkyKSk7CiAgICB0aGlzLmVsLmFwcGVuZENoaWxkKHMyKTsKICB9LCBvbkRldmljZU1vdGlvbkRpYWxvZ0FsbG93Q2xpY2tlZDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXM7CiAgICB0aGlzLmVsLmVtaXQoImRldmljZW9yaWVudGF0aW9ucGVybWlzc2lvbnJlcXVlc3RlZCIpLCBEZXZpY2VPcmllbnRhdGlvbkV2ZW50LnJlcXVlc3RQZXJtaXNzaW9uKCkudGhlbihmdW5jdGlvbih0MikgewogICAgICB0MiA9PT0gImdyYW50ZWQiID8gKGUuZWwuZW1pdCgiZGV2aWNlb3JpZW50YXRpb25wZXJtaXNzaW9uZ3JhbnRlZCIpLCBlLnBlcm1pc3Npb25HcmFudGVkID0gdHJ1ZSkgOiBlLmVsLmVtaXQoImRldmljZW9yaWVudGF0aW9ucGVybWlzc2lvbnJlamVjdGVkIiksIGUucmVtb3ZlKCk7CiAgICB9KS5jYXRjaChjb25zb2xlLmVycm9yKTsKICB9IH0pLCBjcygiZW1iZWRkZWQiLCB7IGRlcGVuZGVuY2llczogWyJ4ci1tb2RlLXVpIl0sIHNjaGVtYTogeyBkZWZhdWx0OiB0cnVlIH0sIHNjZW5lT25seTogdHJ1ZSwgdXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbCwgdDIgPSBlLnF1ZXJ5U2VsZWN0b3IoIi5hLWVudGVyLXZyIik7CiAgICB0aGlzLmRhdGEgPT09IHRydWUgPyAodDIgJiYgdDIuY2xhc3NMaXN0LmFkZCgiZW1iZWRkZWQiKSwgZS5yZW1vdmVGdWxsU2NyZWVuU3R5bGVzKCkpIDogKHQyICYmIHQyLmNsYXNzTGlzdC5yZW1vdmUoImVtYmVkZGVkIiksIGUuYWRkRnVsbFNjcmVlblN0eWxlcygpKTsKICB9IH0pOwogIFlsID0gImh0dHBzOi8vdW5wa2cuY29tL2FmcmFtZS1pbnNwZWN0b3JAIiArIGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSBjYS5zcGxpdCgiLiIpOwogICAgcmV0dXJuIGVbMl0gPSAieCIsIGUuam9pbigiLiIpOwogIH0oKSArICIvZGlzdC9hZnJhbWUtaW5zcGVjdG9yLm1pbi5qcyI7CiAgY3MoImluc3BlY3RvciIsIHsgc2NoZW1hOiB7IHVybDogeyBkZWZhdWx0OiBZbCB9IH0sIHNjZW5lT25seTogdHJ1ZSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmZpcnN0UGxheSA9IHRydWUsIHRoaXMub25LZXlkb3duID0gdGhpcy5vbktleWRvd24uYmluZCh0aGlzKSwgdGhpcy5vbk1lc3NhZ2UgPSB0aGlzLm9uTWVzc2FnZS5iaW5kKHRoaXMpLCB0aGlzLmluaXRPdmVybGF5KCksIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgdGhpcy5vbktleWRvd24pLCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIHRoaXMub25NZXNzYWdlKTsKICB9LCBwbGF5OiBmdW5jdGlvbigpIHsKICAgIHZhciBlOwogICAgdGhpcy5maXJzdFBsYXkgJiYgKGUgPSBzbygiaW5zcGVjdG9yIikpICE9PSAiZmFsc2UiICYmIGUgJiYgKHRoaXMub3Blbkluc3BlY3RvcigpLCB0aGlzLmZpcnN0UGxheSA9IGZhbHNlKTsKICB9LCBpbml0T3ZlcmxheTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmxvYWRpbmdNZXNzYWdlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwgdGhpcy5sb2FkaW5nTWVzc2FnZUVsLmNsYXNzTGlzdC5hZGQoImEtaW5zcGVjdG9yLWxvYWRlciIpLCB0aGlzLmxvYWRpbmdNZXNzYWdlRWwuaW5uZXJIVE1MID0gJ0xvYWRpbmcgSW5zcGVjdG9yPHNwYW4gY2xhc3M9ImRvdHMiPjxzcGFuPi48L3NwYW4+PHNwYW4+Ljwvc3Bhbj48c3Bhbj4uPC9zcGFuPjwvc3Bhbj4nOwogIH0sIHJlbW92ZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7CiAgfSwgb25LZXlkb3duOiBmdW5jdGlvbihlKSB7CiAgICBlLmtleUNvZGUgPT09IDczICYmIChlLmN0cmxLZXkgJiYgZS5hbHRLZXkgfHwgZS5nZXRNb2RpZmllclN0YXRlKCJBbHRHcmFwaCIpKSAmJiB0aGlzLm9wZW5JbnNwZWN0b3IoKTsKICB9LCBzaG93TG9hZGVyOiBmdW5jdGlvbigpIHsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5sb2FkaW5nTWVzc2FnZUVsKTsKICB9LCBoaWRlTG9hZGVyOiBmdW5jdGlvbigpIHsKICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5sb2FkaW5nTWVzc2FnZUVsKTsKICB9LCBvbk1lc3NhZ2U6IGZ1bmN0aW9uKGUpIHsKICAgIGUuZGF0YSA9PT0gIklOSkVDVF9BRlJBTUVfSU5TUEVDVE9SIiAmJiB0aGlzLm9wZW5JbnNwZWN0b3IoKTsKICB9LCBvcGVuSW5zcGVjdG9yOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIsIG4yID0gdGhpczsKICAgIEFGUkFNRS5JTlNQRUNUT1IgfHwgQUZSQU1FLmluc3BlY3RvckluamVjdGVkID8gQUZSQU1FLklOU1BFQ1RPUi5vcGVuKGUpIDogKHRoaXMuc2hvd0xvYWRlcigpLCAodDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSkuc3JjID0gdGhpcy5kYXRhLnVybCwgdDIuc2V0QXR0cmlidXRlKCJkYXRhLW5hbWUiLCAiYWZyYW1lLWluc3BlY3RvciIpLCB0Mi5zZXRBdHRyaWJ1dGUoaGksICIiKSwgdDIub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgICAgIEFGUkFNRS5JTlNQRUNUT1Iub3BlbihlKSwgbjIuaGlkZUxvYWRlcigpLCBuMi5yZW1vdmVFdmVudExpc3RlbmVycygpOwogICAgfSwgdDIub25lcnJvciA9IGZ1bmN0aW9uKCkgewogICAgICBuMi5sb2FkaW5nTWVzc2FnZUVsLmlubmVySFRNTCA9ICJFcnJvciBsb2FkaW5nIEluc3BlY3RvciI7CiAgICB9LCBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHQyKSwgQUZSQU1FLmluc3BlY3RvckluamVjdGVkID0gdHJ1ZSk7CiAgfSwgcmVtb3ZlRXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkgewogICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLCB0aGlzLm9uS2V5ZG93biksIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwgdGhpcy5vbk1lc3NhZ2UpOwogIH0gfSksIGNzKCJmb2ciLCB7IHNjaGVtYTogeyBjb2xvcjogeyB0eXBlOiAiY29sb3IiLCBkZWZhdWx0OiAiIzAwMCIgfSwgZGVuc2l0eTogeyBkZWZhdWx0OiAwLjAwMDI1IH0sIGZhcjogeyBkZWZhdWx0OiAxMDAwLCBtaW46IDAgfSwgbmVhcjogeyBkZWZhdWx0OiAxLCBtaW46IDAgfSwgdHlwZTogeyBkZWZhdWx0OiAibGluZWFyIiwgb25lT2Y6IFsibGluZWFyIiwgImV4cG9uZW50aWFsIl0gfSB9LCBzY2VuZU9ubHk6IHRydWUsIHVwZGF0ZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZGF0YSwgdDIgPSB0aGlzLmVsLCBuMiA9IHRoaXMuZWwub2JqZWN0M0QuZm9nOwogICAgbjIgJiYgZS50eXBlID09PSBuMi5uYW1lID8gT2JqZWN0LmtleXModGhpcy5zY2hlbWEpLmZvckVhY2goZnVuY3Rpb24odDMpIHsKICAgICAgdmFyIGkyID0gZVt0M107CiAgICAgIHQzID09PSAiY29sb3IiICYmIChpMiA9IG5ldyBSZS5Db2xvcihpMikpLCBuMlt0M10gPSBpMjsKICAgIH0pIDogdDIub2JqZWN0M0QuZm9nID0gZnVuY3Rpb24oZTIpIHsKICAgICAgdmFyIHQzOwogICAgICByZXR1cm4gKHQzID0gZTIudHlwZSA9PT0gImV4cG9uZW50aWFsIiA/IG5ldyBSZS5Gb2dFeHAyKGUyLmNvbG9yLCBlMi5kZW5zaXR5KSA6IG5ldyBSZS5Gb2coZTIuY29sb3IsIGUyLm5lYXIsIGUyLmZhcikpLm5hbWUgPSBlMi50eXBlLCB0MzsKICAgIH0oZSk7CiAgfSwgcmVtb3ZlOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbDsKICAgIHRoaXMuZWwub2JqZWN0M0QuZm9nICYmIChlLm9iamVjdDNELmZvZyA9IG51bGwpOwogIH0gfSksIGNzKCJrZXlib2FyZC1zaG9ydGN1dHMiLCB7IHNjaGVtYTogeyBlbnRlclZSOiB7IGRlZmF1bHQ6IHRydWUgfSwgZXhpdFZSOiB7IGRlZmF1bHQ6IHRydWUgfSB9LCBzY2VuZU9ubHk6IHRydWUsIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5vbktleXVwID0gdGhpcy5vbktleXVwLmJpbmQodGhpcyk7CiAgfSwgcGxheTogZnVuY3Rpb24oKSB7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLCB0aGlzLm9uS2V5dXAsIGZhbHNlKTsKICB9LCBwYXVzZTogZnVuY3Rpb24oKSB7CiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLCB0aGlzLm9uS2V5dXApOwogIH0sIG9uS2V5dXA6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IHRoaXMuZWw7CiAgICBpbyhlKSAmJiAodGhpcy5kYXRhLmVudGVyVlIgJiYgZS5rZXlDb2RlID09PSA3MCAmJiB0Mi5lbnRlclZSKCksIHRoaXMuZGF0YS5leGl0VlIgJiYgZS5rZXlDb2RlID09PSAyNyAmJiB0Mi5leGl0VlIoKSk7CiAgfSB9KTsKICBLbCA9IGZpKCJjb21wb25lbnRzOnBvb2w6d2FybiIpOwogIGNzKCJwb29sIiwgeyBzY2hlbWE6IHsgY29udGFpbmVyOiB7IGRlZmF1bHQ6ICIiIH0sIG1peGluOiB7IGRlZmF1bHQ6ICIiIH0sIHNpemU6IHsgZGVmYXVsdDogMCB9LCBkeW5hbWljOiB7IGRlZmF1bHQ6IGZhbHNlIH0gfSwgc2NlbmVPbmx5OiB0cnVlLCBtdWx0aXBsZTogdHJ1ZSwgaW5pdFBvb2w6IGZ1bmN0aW9uKCkgewogICAgdmFyIGU7CiAgICBmb3IgKHRoaXMuYXZhaWxhYmxlRWxzID0gW10sIHRoaXMudXNlZEVscyA9IFtdLCB0aGlzLmRhdGEubWl4aW4gfHwgS2woIk5vIG1peGluIHByb3ZpZGVkIGZvciBwb29sIGNvbXBvbmVudC4iKSwgdGhpcy5kYXRhLmNvbnRhaW5lciAmJiAodGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZGF0YS5jb250YWluZXIpLCB0aGlzLmNvbnRhaW5lciB8fCBLbCgiQ29udGFpbmVyICIgKyB0aGlzLmRhdGEuY29udGFpbmVyICsgIiBub3QgZm91bmQuIikpLCB0aGlzLmNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyIHx8IHRoaXMuZWwsIGUgPSAwO2UgPCB0aGlzLmRhdGEuc2l6ZTsgKytlKQogICAgICB0aGlzLmNyZWF0ZUVudGl0eSgpOwogIH0sIHVwZGF0ZTogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyID0gdGhpcy5kYXRhOwogICAgZS5taXhpbiA9PT0gdDIubWl4aW4gJiYgZS5zaXplID09PSB0Mi5zaXplIHx8IHRoaXMuaW5pdFBvb2woKTsKICB9LCBjcmVhdGVFbnRpdHk6IGZ1bmN0aW9uKCkgewogICAgdmFyIGU7CiAgICAoZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEtZW50aXR5IikpLnBsYXkgPSB0aGlzLndyYXBQbGF5KGUucGxheSksIGUuc2V0QXR0cmlidXRlKCJtaXhpbiIsIHRoaXMuZGF0YS5taXhpbiksIGUub2JqZWN0M0QudmlzaWJsZSA9IGZhbHNlLCBlLnBhdXNlKCksIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGUpLCB0aGlzLmF2YWlsYWJsZUVscy5wdXNoKGUpOwogICAgdmFyIHQyID0gdGhpcy51c2VkRWxzOwogICAgZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgdDIuaW5kZXhPZihlKSA9PT0gLTEgJiYgKGUub2JqZWN0M0RQYXJlbnQgPSBlLm9iamVjdDNELnBhcmVudCwgZS5vYmplY3QzRC5wYXJlbnQucmVtb3ZlKGUub2JqZWN0M0QpKTsKICAgIH0pOwogIH0sIHdyYXBQbGF5OiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSB0aGlzLnVzZWRFbHM7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHQyLmluZGV4T2YodGhpcykgIT09IC0xICYmIGUuY2FsbCh0aGlzKTsKICAgIH07CiAgfSwgcmVxdWVzdEVudGl0eTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZTsKICAgIGlmICh0aGlzLmF2YWlsYWJsZUVscy5sZW5ndGggPT09IDApIHsKICAgICAgaWYgKHRoaXMuZGF0YS5keW5hbWljID09PSBmYWxzZSkKICAgICAgICByZXR1cm4gdm9pZCBLbCgiUmVxdWVzdGVkIGVudGl0eSBmcm9tIGVtcHR5IHBvb2w6ICIgKyB0aGlzLmF0dHJOYW1lKTsKICAgICAgS2woIlJlcXVlc3RlZCBlbnRpdHkgZnJvbSBlbXB0eSBwb29sLiBUaGlzIHBvb2wgaXMgZHluYW1pYyBhbmQgd2lsbCByZXNpemUgYXV0b21hdGljYWxseS4gWW91IG1pZ2h0IHdhbnQgdG8gaW5jcmVhc2UgaXRzIGluaXRpYWwgc2l6ZTogIiArIHRoaXMuYXR0ck5hbWUpLCB0aGlzLmNyZWF0ZUVudGl0eSgpOwogICAgfQogICAgcmV0dXJuIGUgPSB0aGlzLmF2YWlsYWJsZUVscy5zaGlmdCgpLCB0aGlzLnVzZWRFbHMucHVzaChlKSwgZS5vYmplY3QzRFBhcmVudCAmJiAoZS5vYmplY3QzRFBhcmVudC5hZGQoZS5vYmplY3QzRCksIHRoaXMudXBkYXRlUmF5Y2FzdGVycygpKSwgZS5vYmplY3QzRC52aXNpYmxlID0gdHJ1ZSwgZTsKICB9LCByZXR1cm5FbnRpdHk6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IHRoaXMudXNlZEVscy5pbmRleE9mKGUpOwogICAgaWYgKHQyICE9PSAtMSkKICAgICAgcmV0dXJuIHRoaXMudXNlZEVscy5zcGxpY2UodDIsIDEpLCB0aGlzLmF2YWlsYWJsZUVscy5wdXNoKGUpLCBlLm9iamVjdDNEUGFyZW50ID0gZS5vYmplY3QzRC5wYXJlbnQsIGUub2JqZWN0M0QucGFyZW50LnJlbW92ZShlLm9iamVjdDNEKSwgdGhpcy51cGRhdGVSYXljYXN0ZXJzKCksIGUub2JqZWN0M0QudmlzaWJsZSA9IGZhbHNlLCBlLnBhdXNlKCksIGU7CiAgICBLbCgiVGhlIHJldHVybmVkIGVudGl0eSB3YXMgbm90IHByZXZpb3VzbHkgcG9vbGVkIGZyb20gIiArIHRoaXMuYXR0ck5hbWUpOwogIH0sIHVwZGF0ZVJheWNhc3RlcnM6IGZ1bmN0aW9uKCkgewogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW3JheWNhc3Rlcl0iKS5mb3JFYWNoKGZ1bmN0aW9uKGUpIHsKICAgICAgZS5jb21wb25lbnRzLnJheWNhc3Rlci5zZXREaXJ0eSgpOwogICAgfSk7CiAgfSB9KSwgY3MoInJlYWwtd29ybGQtbWVzaGluZyIsIHsgc2NoZW1hOiB7IGZpbHRlckxhYmVsczogeyB0eXBlOiAiYXJyYXkiIH0sIG1lc2hlc0VuYWJsZWQ6IHsgZGVmYXVsdDogdHJ1ZSB9LCBtZXNoTWl4aW46IHsgZGVmYXVsdDogdHJ1ZSB9LCBwbGFuZXNFbmFibGVkOiB7IGRlZmF1bHQ6IHRydWUgfSwgcGxhbmVNaXhpbjogeyBkZWZhdWx0OiAiIiB9IH0sIHNjZW5lT25seTogdHJ1ZSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWwuZ2V0QXR0cmlidXRlKCJ3ZWJ4ciIpLCB0MiA9IGUucmVxdWlyZWRGZWF0dXJlczsKICAgIHQyLmluZGV4T2YoIm1lc2gtZGV0ZWN0aW9uIikgPT09IC0xICYmICh0Mi5wdXNoKCJtZXNoLWRldGVjdGlvbiIpLCB0aGlzLmVsLnNldEF0dHJpYnV0ZSgid2VieHIiLCBlKSksIHQyLmluZGV4T2YoInBsYW5lLWRldGVjdGlvbiIpID09PSAtMSAmJiAodDIucHVzaCgicGxhbmUtZGV0ZWN0aW9uIiksIHRoaXMuZWwuc2V0QXR0cmlidXRlKCJ3ZWJ4ciIsIGUpKSwgdGhpcy5tZXNoRW50aXRpZXMgPSBbXSwgdGhpcy5pbml0V29ybGRNZXNoRW50aXR5ID0gdGhpcy5pbml0V29ybGRNZXNoRW50aXR5LmJpbmQodGhpcyk7CiAgfSwgdGljazogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsLmlzKCJhci1tb2RlIikgJiYgKHRoaXMuZGV0ZWN0TWVzaGVzKCksIHRoaXMudXBkYXRlTWVzaGVzKCkpOwogIH0sIGRldGVjdE1lc2hlczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSwgdDIsIG4yLCBpMiA9IHRoaXMuZGF0YSwgcjIgPSB0aGlzLmVsLCBvMiA9IHRoaXMubWVzaEVudGl0aWVzLCBzMiA9IGZhbHNlLCBhMiA9IFtdLCBBMiA9IHRoaXMuZGF0YS5maWx0ZXJMYWJlbHM7CiAgICBlID0gKG4yID0gcjIuZnJhbWUpLmRldGVjdGVkTWVzaGVzLCB0MiA9IG4yLmRldGVjdGVkUGxhbmVzOwogICAgZm9yICh2YXIgbDIgPSAwO2wyIDwgbzIubGVuZ3RoOyBsMisrKQogICAgICBvMltsMl0ucHJlc2VudCA9IGZhbHNlOwogICAgaWYgKGkyLm1lc2hlc0VuYWJsZWQpIHsKICAgICAgZm9yICh2YXIgYzIgb2YgZS52YWx1ZXMoKSkKICAgICAgICBpZiAoIUEyLmxlbmd0aCB8fCBBMi5pbmRleE9mKGMyLnNlbWFudGljTGFiZWwpICE9PSAtMSkgewogICAgICAgICAgZm9yIChsMiA9IDA7bDIgPCBvMi5sZW5ndGg7IGwyKyspCiAgICAgICAgICAgIGlmIChjMiA9PT0gbzJbbDJdLm1lc2gpIHsKICAgICAgICAgICAgICBzMiA9IHRydWUsIG8yW2wyXS5wcmVzZW50ID0gdHJ1ZSwgbzJbbDJdLmxhc3RDaGFuZ2VkVGltZSA8IGMyLmxhc3RDaGFuZ2VkVGltZSAmJiB0aGlzLnVwZGF0ZU1lc2hHZW9tZXRyeShvMltsMl0uZWwsIGMyKSwgbzJbbDJdLmxhc3RDaGFuZ2VkVGltZSA9IGMyLmxhc3RDaGFuZ2VkVGltZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgczIgfHwgYTIucHVzaChjMiksIHMyID0gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgaWYgKGkyLnBsYW5lc0VuYWJsZWQpIHsKICAgICAgZm9yIChjMiBvZiB0Mi52YWx1ZXMoKSkKICAgICAgICBpZiAoIUEyLmxlbmd0aCB8fCBBMi5pbmRleE9mKGMyLnNlbWFudGljTGFiZWwpICE9PSAtMSkgewogICAgICAgICAgZm9yIChsMiA9IDA7bDIgPCBvMi5sZW5ndGg7IGwyKyspCiAgICAgICAgICAgIGlmIChjMiA9PT0gbzJbbDJdLm1lc2gpIHsKICAgICAgICAgICAgICBzMiA9IHRydWUsIG8yW2wyXS5wcmVzZW50ID0gdHJ1ZSwgbzJbbDJdLmxhc3RDaGFuZ2VkVGltZSA8IGMyLmxhc3RDaGFuZ2VkVGltZSAmJiB0aGlzLnVwZGF0ZU1lc2hHZW9tZXRyeShvMltsMl0uZWwsIGMyKSwgbzJbbDJdLmxhc3RDaGFuZ2VkVGltZSA9IGMyLmxhc3RDaGFuZ2VkVGltZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgczIgfHwgYTIucHVzaChjMiksIHMyID0gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgdGhpcy5kZWxldGVNZXNoZXMoKSwgdGhpcy5jcmVhdGVOZXdNZXNoZXMoYTIpOwogIH0sIHVwZGF0ZU1lc2hlczogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IG5ldyBSZS5NYXRyaXg0OwogICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICBmb3IgKHZhciB0MiwgbjIsIGkyLCByMiA9IHRoaXMuZWwsIG8yID0gcjIuZnJhbWUsIHMyID0gdGhpcy5tZXNoRW50aXRpZXMsIGEyID0gcjIucmVuZGVyZXIueHIuZ2V0UmVmZXJlbmNlU3BhY2UoKSwgQTIgPSAwO0EyIDwgczIubGVuZ3RoOyBBMisrKQogICAgICAgIGkyID0gczJbQTJdLm1lc2gubWVzaFNwYWNlIHx8IHMyW0EyXS5tZXNoLnBsYW5lU3BhY2UsIHQyID0gbzIuZ2V0UG9zZShpMiwgYTIpLCAobjIgPSBzMltBMl0uZWwpLmhhc0xvYWRlZCAmJiAoZS5mcm9tQXJyYXkodDIudHJhbnNmb3JtLm1hdHJpeCksIGUuZGVjb21wb3NlKG4yLm9iamVjdDNELnBvc2l0aW9uLCBuMi5vYmplY3QzRC5xdWF0ZXJuaW9uLCBuMi5vYmplY3QzRC5zY2FsZSkpOwogICAgfTsKICB9KCksIGRlbGV0ZU1lc2hlczogZnVuY3Rpb24oKSB7CiAgICBmb3IgKHZhciBlID0gdGhpcy5tZXNoRW50aXRpZXMsIHQyID0gW10sIG4yID0gMDtuMiA8IGUubGVuZ3RoOyBuMisrKQogICAgICBlW24yXS5wcmVzZW50ID8gdDIucHVzaChlW24yXSkgOiB0aGlzLmVsLnJlbW92ZUNoaWxkKGVbbjJdKTsKICAgIHRoaXMubWVzaEVudGl0aWVzID0gdDI7CiAgfSwgY3JlYXRlTmV3TWVzaGVzOiBmdW5jdGlvbihlKSB7CiAgICBmb3IgKHZhciB0MiwgbjIgPSAwO24yIDwgZS5sZW5ndGg7IG4yKyspCiAgICAgIHQyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYS1lbnRpdHkiKSwgdGhpcy5tZXNoRW50aXRpZXMucHVzaCh7IG1lc2g6IGVbbjJdLCBlbDogdDIgfSksIHQyLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZCIsIHRoaXMuaW5pdFdvcmxkTWVzaEVudGl0eSksIHRoaXMuZWwuYXBwZW5kQ2hpbGQodDIpOwogIH0sIGluaXRNZXNoR2VvbWV0cnk6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjIsIGkyOwogICAgaWYgKGUgaW5zdGFuY2VvZiBYUlBsYW5lKSB7CiAgICAgIG4yID0gbmV3IFJlLlNoYXBlLCBpMiA9IGUucG9seWdvbjsKICAgICAgZm9yICh2YXIgcjIgPSAwO3IyIDwgaTIubGVuZ3RoOyArK3IyKQogICAgICAgIHIyID09PSAwID8gbjIubW92ZVRvKGkyW3IyXS54LCBpMltyMl0ueikgOiBuMi5saW5lVG8oaTJbcjJdLngsIGkyW3IyXS56KTsKICAgICAgcmV0dXJuICh0MiA9IG5ldyBSZS5TaGFwZUdlb21ldHJ5KG4yKSkucm90YXRlWChNYXRoLlBJIC8gMiksIHQyOwogICAgfQogICAgcmV0dXJuICh0MiA9IG5ldyBSZS5CdWZmZXJHZW9tZXRyeSkuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIG5ldyBSZS5CdWZmZXJBdHRyaWJ1dGUoZS52ZXJ0aWNlcywgMykpLCB0Mi5zZXRJbmRleChuZXcgUmUuQnVmZmVyQXR0cmlidXRlKGUuaW5kaWNlcywgMSkpLCB0MjsKICB9LCBpbml0V29ybGRNZXNoRW50aXR5OiBmdW5jdGlvbihlKSB7CiAgICBmb3IgKHZhciB0MiwgbjIsIGkyLCByMiA9IGUudGFyZ2V0LCBvMiA9IHRoaXMubWVzaEVudGl0aWVzLCBzMiA9IDA7czIgPCBvMi5sZW5ndGg7IHMyKyspCiAgICAgIGlmIChvMltzMl0uZWwgPT09IHIyKSB7CiAgICAgICAgaTIgPSBvMltzMl07CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIHQyID0gdGhpcy5pbml0TWVzaEdlb21ldHJ5KGkyLm1lc2gpLCBuMiA9IG5ldyBSZS5NZXNoKHQyLCBuZXcgUmUuTWVzaEJhc2ljTWF0ZXJpYWwoeyBjb2xvcjogMTY3NzcyMTUgKiBNYXRoLnJhbmRvbSgpLCBzaWRlOiBSZS5Eb3VibGVTaWRlIH0pKSwgcjIuc2V0T2JqZWN0M0QoIm1lc2giLCBuMiksIGkyLm1lc2ggaW5zdGFuY2VvZiBYUlBsYW5lICYmIHRoaXMuZGF0YS5wbGFuZU1peGluID8gcjIuc2V0QXR0cmlidXRlKCJtaXhpbiIsIHRoaXMuZGF0YS5wbGFuZU1peGluKSA6IHRoaXMuZGF0YS5tZXNoTWl4aW4gJiYgcjIuc2V0QXR0cmlidXRlKCJtaXhpbiIsIHRoaXMuZGF0YS5tZXNoTWl4aW4pLCByMi5zZXRBdHRyaWJ1dGUoImRhdGEtd29ybGQtbWVzaCIsIGkyLm1lc2guc2VtYW50aWNMYWJlbCk7CiAgfSwgdXBkYXRlTWVzaEdlb21ldHJ5OiBmdW5jdGlvbihlLCB0MikgewogICAgdmFyIG4yID0gZS5nZXRPYmplY3QzRCgibWVzaCIpOwogICAgbjIuZ2VvbWV0cnkuZGlzcG9zZSgpLCBuMi5nZW9tZXRyeSA9IHRoaXMuaW5pdE1lc2hHZW9tZXRyeSh0Mik7CiAgfSB9KSwgY3MoInJlZmxlY3Rpb24iLCB7IHNjaGVtYTogeyBkaXJlY3Rpb25hbExpZ2h0OiB7IHR5cGU6ICJzZWxlY3RvciIgfSB9LCBzY2VuZU9ubHk6IHRydWUsIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzOwogICAgdGhpcy5jdWJlUmVuZGVyVGFyZ2V0ID0gbmV3IFJlLldlYkdMQ3ViZVJlbmRlclRhcmdldCgxNiksIHRoaXMuY3ViZUNhbWVyYSA9IG5ldyBSZS5DdWJlQ2FtZXJhKDAuMSwgMTAwMCwgdGhpcy5jdWJlUmVuZGVyVGFyZ2V0KSwgdGhpcy5saWdodGluZ0VzdGltYXRpb25UZXh0dXJlID0gbmV3IFJlLldlYkdMQ3ViZVJlbmRlclRhcmdldCgxNikudGV4dHVyZSwgdGhpcy5uZWVkc1ZSRW52aXJvbm1lbnRVcGRhdGUgPSB0cnVlOwogICAgdmFyIHQyID0gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoIndlYnhyIiksIG4yID0gdDIub3B0aW9uYWxGZWF0dXJlczsKICAgIG4yLmluY2x1ZGVzKCJsaWdodC1lc3RpbWF0aW9uIikgfHwgKG4yLnB1c2goImxpZ2h0LWVzdGltYXRpb24iKSwgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoIndlYnhyIiwgdDIpKSwgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCJlbnRlci12ciIsIGZ1bmN0aW9uKCkgewogICAgICBlLmVsLmlzKCJhci1tb2RlIikgJiYgZS5lbC5yZW5kZXJlci54ci5nZXRTZXNzaW9uKCkucmVxdWVzdExpZ2h0UHJvYmUgJiYgZS5zdGFydExpZ2h0UHJvYmUoKTsKICAgIH0pLCB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoImV4aXQtdnIiLCBmdW5jdGlvbigpIHsKICAgICAgZS54ckxpZ2h0UHJvYmUgJiYgZS5zdG9wTGlnaHRQcm9iZSgpOwogICAgfSksIHRoaXMuZWwub2JqZWN0M0QuZW52aXJvbm1lbnQgPSB0aGlzLmN1YmVSZW5kZXJUYXJnZXQudGV4dHVyZTsKICB9LCBzdG9wTGlnaHRQcm9iZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnhyTGlnaHRQcm9iZSA9IG51bGwsIHRoaXMucHJvYmVMaWdodCAmJiAodGhpcy5wcm9iZUxpZ2h0LmNvbXBvbmVudHMubGlnaHQubGlnaHQuaW50ZW5zaXR5ID0gMCksIHRoaXMubmVlZHNWUkVudmlyb25tZW50VXBkYXRlID0gdHJ1ZSwgdGhpcy5lbC5vYmplY3QzRC5lbnZpcm9ubWVudCA9IHRoaXMuY3ViZVJlbmRlclRhcmdldC50ZXh0dXJlOwogIH0sIHN0YXJ0TGlnaHRQcm9iZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLm5lZWRzTGlnaHRQcm9iZVVwZGF0ZSA9IHRydWU7CiAgfSwgc2V0dXBMaWdodFByb2JlOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbC5yZW5kZXJlciwgdDIgPSBlLnhyLmdldFNlc3Npb24oKSwgbjIgPSB0aGlzLCBpMiA9IGUuZ2V0Q29udGV4dCgpOwogICAgaWYgKCF0aGlzLnByb2JlTGlnaHQpIHsKICAgICAgdmFyIHIyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYS1saWdodCIpOwogICAgICByMi5zZXRBdHRyaWJ1dGUoInR5cGUiLCAicHJvYmUiKSwgcjIuc2V0QXR0cmlidXRlKCJpbnRlbnNpdHkiLCAwKSwgdGhpcy5lbC5hcHBlbmRDaGlsZChyMiksIHRoaXMucHJvYmVMaWdodCA9IHIyOwogICAgfQogICAgc3dpdGNoICh0Mi5wcmVmZXJyZWRSZWZsZWN0aW9uRm9ybWF0KSB7CiAgICAgIGNhc2UgInNyZ2JhOCI6CiAgICAgICAgaTIuZ2V0RXh0ZW5zaW9uKCJFWFRfc1JHQiIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJyZ2JhMTZmIjoKICAgICAgICBpMi5nZXRFeHRlbnNpb24oIk9FU190ZXh0dXJlX2hhbGZfZmxvYXQiKTsKICAgIH0KICAgIHRoaXMuZ2xCaW5kaW5nID0gbmV3IFhSV2ViR0xCaW5kaW5nKHQyLCBpMiksIGkyLmdldEV4dGVuc2lvbigiRVhUX3NSR0IiKSwgaTIuZ2V0RXh0ZW5zaW9uKCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksIHQyLnJlcXVlc3RMaWdodFByb2JlKCkudGhlbihmdW5jdGlvbihlMikgewogICAgICBuMi54ckxpZ2h0UHJvYmUgPSBlMiwgZTIuYWRkRXZlbnRMaXN0ZW5lcigicmVmbGVjdGlvbmNoYW5nZSIsIG4yLnVwZGF0ZVhSQ3ViZU1hcC5iaW5kKG4yKSk7CiAgICB9KS5jYXRjaChmdW5jdGlvbihlMikgewogICAgICBjb25zb2xlLndhcm4oIkxpZ2h0aW5nIGVzdGltYXRpb24gbm90IHN1cHBvcnRlZDogIiArIGUyLm1lc3NhZ2UpLCBjb25zb2xlLndhcm4oJ0FyZSB5b3UgbWlzc2luZzogd2VieHI9Im9wdGlvbmFsRmVhdHVyZXM6IGxpZ2h0LWVzdGltYXRpb247IiBmcm9tIDxhLXNjZW5lPj8nKTsKICAgIH0pOwogIH0sIHVwZGF0ZVhSQ3ViZU1hcDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWwucmVuZGVyZXIsIHQyID0gdGhpcy5nbEJpbmRpbmcuZ2V0UmVmbGVjdGlvbkN1YmVNYXAodGhpcy54ckxpZ2h0UHJvYmUpOwogICAgdDIgJiYgKGUucHJvcGVydGllcy5nZXQodGhpcy5saWdodGluZ0VzdGltYXRpb25UZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSA9IHQyLCB0aGlzLmxpZ2h0aW5nRXN0aW1hdGlvblRleHR1cmUubmVlZHNQTVJFTVVwZGF0ZSA9IHRydWUsIHRoaXMuZWwub2JqZWN0M0QuZW52aXJvbm1lbnQgPSB0aGlzLmxpZ2h0aW5nRXN0aW1hdGlvblRleHR1cmUpOwogIH0sIHRpY2s6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsLm9iamVjdDNELCB0MiA9IHRoaXMuZWwucmVuZGVyZXIsIG4yID0gdGhpcy5lbC5mcmFtZTsKICAgIGlmIChuMiAmJiB0aGlzLnhyTGlnaHRQcm9iZSkgewogICAgICB2YXIgaTIgPSBuMi5nZXRMaWdodEVzdGltYXRlKHRoaXMueHJMaWdodFByb2JlKTsKICAgICAgaTIgJiYgZnVuY3Rpb24oZTIsIHQzLCBuMywgaTMpIHsKICAgICAgICB2YXIgcjIgPSBNYXRoLm1heChlMi5wcmltYXJ5TGlnaHRJbnRlbnNpdHkueCwgTWF0aC5tYXgoZTIucHJpbWFyeUxpZ2h0SW50ZW5zaXR5LnksIGUyLnByaW1hcnlMaWdodEludGVuc2l0eS56KSk7CiAgICAgICAgdDMuc2guZnJvbUFycmF5KGUyLnNwaGVyaWNhbEhhcm1vbmljc0NvZWZmaWNpZW50cyksIHQzLmludGVuc2l0eSA9IDMuMTQsIG4zICYmIChuMy5jb2xvci5zZXRSR0IoZTIucHJpbWFyeUxpZ2h0SW50ZW5zaXR5LnggLyByMiwgZTIucHJpbWFyeUxpZ2h0SW50ZW5zaXR5LnkgLyByMiwgZTIucHJpbWFyeUxpZ2h0SW50ZW5zaXR5LnogLyByMiksIG4zLmludGVuc2l0eSA9IHIyLCBpMy5jb3B5KGUyLnByaW1hcnlMaWdodERpcmVjdGlvbikpOwogICAgICB9KGkyLCB0aGlzLnByb2JlTGlnaHQuY29tcG9uZW50cy5saWdodC5saWdodCwgdGhpcy5kYXRhLmRpcmVjdGlvbmFsTGlnaHQgJiYgdGhpcy5kYXRhLmRpcmVjdGlvbmFsTGlnaHQuY29tcG9uZW50cy5saWdodC5saWdodCwgdGhpcy5kYXRhLmRpcmVjdGlvbmFsTGlnaHQgJiYgdGhpcy5kYXRhLmRpcmVjdGlvbmFsTGlnaHQub2JqZWN0M0QucG9zaXRpb24pOwogICAgfQogICAgdGhpcy5uZWVkc1ZSRW52aXJvbm1lbnRVcGRhdGUgJiYgKGUuZW52aXJvbm1lbnQgPSBudWxsLCB0aGlzLm5lZWRzVlJFbnZpcm9ubWVudFVwZGF0ZSA9IGZhbHNlLCB0aGlzLmN1YmVDYW1lcmEucG9zaXRpb24uc2V0KDAsIDEuNiwgMCksIHRoaXMuY3ViZUNhbWVyYS51cGRhdGUodDIsIGUpLCBlLmVudmlyb25tZW50ID0gdGhpcy5jdWJlUmVuZGVyVGFyZ2V0LnRleHR1cmUpLCB0aGlzLm5lZWRzTGlnaHRQcm9iZVVwZGF0ZSAmJiBuMiAmJiAodGhpcy5zZXR1cExpZ2h0UHJvYmUoKSwgdGhpcy5uZWVkc0xpZ2h0UHJvYmVVcGRhdGUgPSBmYWxzZSk7CiAgfSwgcmVtb3ZlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwub2JqZWN0M0QuZW52aXJvbm1lbnQgPSBudWxsLCB0aGlzLnByb2JlTGlnaHQgJiYgdGhpcy5lbC5yZW1vdmVDaGlsZCh0aGlzLnByb2JlTGlnaHQpOwogIH0gfSk7CiAgV2wgPSBbImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOyIsICJhdHRyaWJ1dGUgdmVjMiB1djsiLCAidW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7IiwgInVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7IiwgInZhcnlpbmcgdmVjMiB2VXY7IiwgInZvaWQgbWFpbigpICB7IiwgIiAgdlV2ID0gdmVjMiggMS4tIHV2LngsIHV2LnkgKTsiLCAiICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7IiwgIn0iXS5qb2luKGAKYCk7CiAgSmwgPSBbInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OyIsICJ1bmlmb3JtIHNhbXBsZXJDdWJlIG1hcDsiLCAidmFyeWluZyB2ZWMyIHZVdjsiLCAiI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5IiwgInZvaWQgbWFpbigpIHsiLCAiICB2ZWMyIHV2ID0gdlV2OyIsICIgIGZsb2F0IGxvbmdpdHVkZSA9IHV2LnggKiAyLiAqIE1fUEkgLSBNX1BJICsgTV9QSSAvIDIuOyIsICIgIGZsb2F0IGxhdGl0dWRlID0gdXYueSAqIE1fUEk7IiwgIiAgdmVjMyBkaXIgPSB2ZWMzKCIsICIgICAgLSBzaW4oIGxvbmdpdHVkZSApICogc2luKCBsYXRpdHVkZSApLCIsICIgICAgY29zKCBsYXRpdHVkZSApLCIsICIgICAgLSBjb3MoIGxvbmdpdHVkZSApICogc2luKCBsYXRpdHVkZSApIiwgIiAgKTsiLCAiICBub3JtYWxpemUoIGRpciApOyIsICIgIGdsX0ZyYWdDb2xvciA9IHZlYzQoIHRleHR1cmVDdWJlKCBtYXAsIGRpciApLnJnYiwgMS4wICk7IiwgIn0iXS5qb2luKGAKYCk7CiAgWGwgPSAoY3MoInNjcmVlbnNob3QiLCB7IHNjaGVtYTogeyB3aWR0aDogeyBkZWZhdWx0OiA0MDk2IH0sIGhlaWdodDogeyBkZWZhdWx0OiAyMDQ4IH0sIGNhbWVyYTogeyB0eXBlOiAic2VsZWN0b3IiIH0gfSwgc2NlbmVPbmx5OiB0cnVlLCBzZXR1cDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZWw7CiAgICBpZiAoIXRoaXMuY2FudmFzKSB7CiAgICAgIHZhciB0MiA9IGUucmVuZGVyZXIuZ2V0Q29udGV4dCgpOwogICAgICB0MiAmJiAodGhpcy5jdWJlTWFwU2l6ZSA9IHQyLmdldFBhcmFtZXRlcih0Mi5NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFKSwgdGhpcy5tYXRlcmlhbCA9IG5ldyBSZS5SYXdTaGFkZXJNYXRlcmlhbCh7IHVuaWZvcm1zOiB7IG1hcDogeyB0eXBlOiAidCIsIHZhbHVlOiBudWxsIH0gfSwgdmVydGV4U2hhZGVyOiBXbCwgZnJhZ21lbnRTaGFkZXI6IEpsLCBzaWRlOiBSZS5Eb3VibGVTaWRlIH0pLCB0aGlzLnF1YWQgPSBuZXcgUmUuTWVzaChuZXcgUmUuUGxhbmVHZW9tZXRyeSgxLCAxKSwgdGhpcy5tYXRlcmlhbCksIHRoaXMucXVhZC52aXNpYmxlID0gZmFsc2UsIHRoaXMuY2FtZXJhID0gbmV3IFJlLk9ydGhvZ3JhcGhpY0NhbWVyYSgtMC41LCAwLjUsIDAuNSwgLTAuNSwgLTFlNCwgMWU0KSwgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSwgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCIyZCIpLCBlLm9iamVjdDNELmFkZCh0aGlzLnF1YWQpLCB0aGlzLm9uS2V5RG93biA9IHRoaXMub25LZXlEb3duLmJpbmQodGhpcykpOwogICAgfQogIH0sIGdldFJlbmRlclRhcmdldDogZnVuY3Rpb24oZSwgdDIpIHsKICAgIHJldHVybiBuZXcgUmUuV2ViR0xSZW5kZXJUYXJnZXQoZSwgdDIsIHsgY29sb3JTcGFjZTogdGhpcy5lbC5zY2VuZUVsLnJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2UsIG1pbkZpbHRlcjogUmUuTGluZWFyRmlsdGVyLCBtYWdGaWx0ZXI6IFJlLkxpbmVhckZpbHRlciwgd3JhcFM6IFJlLkNsYW1wVG9FZGdlV3JhcHBpbmcsIHdyYXBUOiBSZS5DbGFtcFRvRWRnZVdyYXBwaW5nLCBmb3JtYXQ6IFJlLlJHQkFGb3JtYXQsIHR5cGU6IFJlLlVuc2lnbmVkQnl0ZVR5cGUgfSk7CiAgfSwgcmVzaXplOiBmdW5jdGlvbihlLCB0MikgewogICAgdGhpcy5xdWFkLnNjYWxlLnNldChlLCB0MiwgMSksIHRoaXMuY2FtZXJhLmxlZnQgPSAtMSAqIGUgLyAyLCB0aGlzLmNhbWVyYS5yaWdodCA9IGUgLyAyLCB0aGlzLmNhbWVyYS50b3AgPSB0MiAvIDIsIHRoaXMuY2FtZXJhLmJvdHRvbSA9IC0xICogdDIgLyAyLCB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCksIHRoaXMuY2FudmFzLndpZHRoID0gZSwgdGhpcy5jYW52YXMuaGVpZ2h0ID0gdDI7CiAgfSwgcGxheTogZnVuY3Rpb24oKSB7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIHRoaXMub25LZXlEb3duKTsKICB9LCBvbktleURvd246IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IGUua2V5Q29kZSA9PT0gODMgJiYgZS5jdHJsS2V5ICYmIGUuYWx0S2V5OwogICAgaWYgKHRoaXMuZGF0YSAmJiB0MikgewogICAgICB2YXIgbjIgPSBlLnNoaWZ0S2V5ID8gImVxdWlyZWN0YW5ndWxhciIgOiAicGVyc3BlY3RpdmUiOwogICAgICB0aGlzLmNhcHR1cmUobjIpOwogICAgfQogIH0sIHNldENhcHR1cmU6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjIsIGkyLCByMiwgbzIgPSB0aGlzLmVsOwogICAgcmV0dXJuIGUgPT09ICJwZXJzcGVjdGl2ZSIgPyAodGhpcy5xdWFkLnZpc2libGUgPSBmYWxzZSwgbjIgPSB0aGlzLmRhdGEuY2FtZXJhICYmIHRoaXMuZGF0YS5jYW1lcmEuY29tcG9uZW50cy5jYW1lcmEuY2FtZXJhIHx8IG8yLmNhbWVyYSwgdDIgPSB7IHdpZHRoOiB0aGlzLmRhdGEud2lkdGgsIGhlaWdodDogdGhpcy5kYXRhLmhlaWdodCB9KSA6IChuMiA9IHRoaXMuY2FtZXJhLCByMiA9IG5ldyBSZS5XZWJHTEN1YmVSZW5kZXJUYXJnZXQoTWF0aC5taW4odGhpcy5jdWJlTWFwU2l6ZSwgMjA0OCksIHsgZm9ybWF0OiBSZS5SR0JGb3JtYXQsIGdlbmVyYXRlTWlwbWFwczogdHJ1ZSwgbWluRmlsdGVyOiBSZS5MaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIsIGNvbG9yU3BhY2U6IFJlLlNSR0JDb2xvclNwYWNlIH0pLCBpMiA9IG5ldyBSZS5DdWJlQ2FtZXJhKG8yLmNhbWVyYS5uZWFyLCBvMi5jYW1lcmEuZmFyLCByMiksIG8yLmNhbWVyYS5nZXRXb3JsZFBvc2l0aW9uKGkyLnBvc2l0aW9uKSwgbzIuY2FtZXJhLmdldFdvcmxkUXVhdGVybmlvbihpMi5xdWF0ZXJuaW9uKSwgaTIudXBkYXRlKG8yLnJlbmRlcmVyLCBvMi5vYmplY3QzRCksIHRoaXMucXVhZC5tYXRlcmlhbC51bmlmb3Jtcy5tYXAudmFsdWUgPSBpMi5yZW5kZXJUYXJnZXQudGV4dHVyZSwgdDIgPSB7IHdpZHRoOiB0aGlzLmRhdGEud2lkdGgsIGhlaWdodDogdGhpcy5kYXRhLmhlaWdodCB9LCB0aGlzLnF1YWQudmlzaWJsZSA9IHRydWUpLCB7IGNhbWVyYTogbjIsIHNpemU6IHQyLCBwcm9qZWN0aW9uOiBlIH07CiAgfSwgY2FwdHVyZTogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiA9IHRoaXMuZWwucmVuZGVyZXIueHIuZW5hYmxlZCwgaTIgPSB0aGlzLmVsLnJlbmRlcmVyOwogICAgdGhpcy5zZXR1cCgpLCBpMi54ci5lbmFibGVkID0gZmFsc2UsIHQyID0gdGhpcy5zZXRDYXB0dXJlKGUpLCB0aGlzLnJlbmRlckNhcHR1cmUodDIuY2FtZXJhLCB0Mi5zaXplLCB0Mi5wcm9qZWN0aW9uKSwgdGhpcy5zYXZlQ2FwdHVyZSgpLCBpMi54ci5lbmFibGVkID0gbjI7CiAgfSwgZ2V0Q2FudmFzOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIgPSB0aGlzLmVsLnJlbmRlcmVyLnhyLmVuYWJsZWQsIG4yID0gdGhpcy5lbC5yZW5kZXJlcjsKICAgIHRoaXMuc2V0dXAoKTsKICAgIHZhciBpMiA9IHRoaXMuc2V0Q2FwdHVyZShlKTsKICAgIHJldHVybiBuMi54ci5lbmFibGVkID0gZmFsc2UsIHRoaXMucmVuZGVyQ2FwdHVyZShpMi5jYW1lcmEsIGkyLnNpemUsIGkyLnByb2plY3Rpb24pLCBuMi54ci5lbmFibGVkID0gdDIsIHRoaXMuY2FudmFzOwogIH0sIHJlbmRlckNhcHR1cmU6IGZ1bmN0aW9uKGUsIHQyLCBuMikgewogICAgdmFyIGkyLCByMiwgbzIsIHMyID0gdGhpcy5lbC5yZW5kZXJlci5hdXRvQ2xlYXIsIGEyID0gdGhpcy5lbCwgQTIgPSBhMi5yZW5kZXJlcjsKICAgIHIyID0gdGhpcy5nZXRSZW5kZXJUYXJnZXQodDIud2lkdGgsIHQyLmhlaWdodCksIG8yID0gbmV3IFVpbnQ4QXJyYXkoNCAqIHQyLndpZHRoICogdDIuaGVpZ2h0KSwgdGhpcy5yZXNpemUodDIud2lkdGgsIHQyLmhlaWdodCksIEEyLmF1dG9DbGVhciA9IHRydWUsIEEyLmNsZWFyKCksIEEyLnNldFJlbmRlclRhcmdldChyMiksIEEyLnJlbmRlcihhMi5vYmplY3QzRCwgZSksIEEyLmF1dG9DbGVhciA9IHMyLCBBMi5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzKHIyLCAwLCAwLCB0Mi53aWR0aCwgdDIuaGVpZ2h0LCBvMiksIEEyLnNldFJlbmRlclRhcmdldChudWxsKSwgbjIgPT09ICJwZXJzcGVjdGl2ZSIgJiYgKG8yID0gdGhpcy5mbGlwUGl4ZWxzVmVydGljYWxseShvMiwgdDIud2lkdGgsIHQyLmhlaWdodCkpLCBpMiA9IG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG8yKSwgdDIud2lkdGgsIHQyLmhlaWdodCksIHRoaXMucXVhZC52aXNpYmxlID0gZmFsc2UsIHRoaXMuY3R4LnB1dEltYWdlRGF0YShpMiwgMCwgMCk7CiAgfSwgZmxpcFBpeGVsc1ZlcnRpY2FsbHk6IGZ1bmN0aW9uKGUsIHQyLCBuMikgewogICAgZm9yICh2YXIgaTIgPSBlLnNsaWNlKDApLCByMiA9IDA7cjIgPCB0MjsgKytyMikKICAgICAgZm9yICh2YXIgbzIgPSAwO28yIDwgbjI7ICsrbzIpCiAgICAgICAgaTJbNCAqIHIyICsgbzIgKiB0MiAqIDRdID0gZVs0ICogcjIgKyAobjIgLSBvMikgKiB0MiAqIDRdLCBpMls0ICogcjIgKyAxICsgbzIgKiB0MiAqIDRdID0gZVs0ICogcjIgKyAxICsgKG4yIC0gbzIpICogdDIgKiA0XSwgaTJbNCAqIHIyICsgMiArIG8yICogdDIgKiA0XSA9IGVbNCAqIHIyICsgMiArIChuMiAtIG8yKSAqIHQyICogNF0sIGkyWzQgKiByMiArIDMgKyBvMiAqIHQyICogNF0gPSBlWzQgKiByMiArIDMgKyAobjIgLSBvMikgKiB0MiAqIDRdOwogICAgcmV0dXJuIGkyOwogIH0sIHNhdmVDYXB0dXJlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2FudmFzLnRvQmxvYihmdW5jdGlvbihlKSB7CiAgICAgIHZhciB0MiA9ICJzY3JlZW5zaG90LSIgKyBkb2N1bWVudC50aXRsZS50b0xvd2VyQ2FzZSgpICsgIi0iICsgRGF0ZS5ub3coKSArICIucG5nIiwgbjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIiksIGkyID0gVVJMLmNyZWF0ZU9iamVjdFVSTChlKTsKICAgICAgbjIuaHJlZiA9IGkyLCBuMi5zZXRBdHRyaWJ1dGUoImRvd25sb2FkIiwgdDIpLCBuMi5pbm5lckhUTUwgPSAiZG93bmxvYWRpbmcuLi4iLCBuMi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiLCBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG4yKSwgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBuMi5jbGljaygpLCBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG4yKTsKICAgICAgfSwgMSk7CiAgICB9LCAiaW1hZ2UvcG5nIik7CiAgfSB9KSwgaSgyODIpKTsKICBabCA9IGkubihYbCk7CiAgJGwgPSAoaSgzNzI5KSwgaSg4MTMyKSwgd2luZG93LmFmcmFtZVN0YXRzKTsKICB0YyA9IHdpbmRvdy50aHJlZVN0YXRzOwogIGNzKCJzdGF0cyIsIHsgc2NoZW1hOiB7IGRlZmF1bHQ6IHRydWUgfSwgc2NlbmVPbmx5OiB0cnVlLCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbDsKICAgIHNvKCJzdGF0cyIpICE9PSAiZmFsc2UiICYmICh0aGlzLnN0YXRzID0gZnVuY3Rpb24oZTIpIHsKICAgICAgdmFyIHQyID0gbmV3IHRjKGUyLnJlbmRlcmVyKSwgbjIgPSBuZXcgJGwoZTIpLCBpMiA9IGUyLmlzTW9iaWxlID8gW10gOiBbdDIsIG4yXTsKICAgICAgcmV0dXJuIG5ldyAoWmwoKSkoeyBjc3M6IFtdLCB2YWx1ZXM6IHsgZnBzOiB7IGNhcHRpb246ICJmcHMiLCBiZWxvdzogMzAgfSB9LCBncm91cHM6IFt7IGNhcHRpb246ICJGcmFtZXJhdGUiLCB2YWx1ZXM6IFsiZnBzIiwgInJhZiJdIH1dLCBwbHVnaW5zOiBpMiB9KTsKICAgIH0oZSksIHRoaXMuc3RhdHNFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5ycy1iYXNlIiksIHRoaXMuaGlkZUJvdW5kID0gdGhpcy5oaWRlLmJpbmQodGhpcyksIHRoaXMuc2hvd0JvdW5kID0gdGhpcy5zaG93LmJpbmQodGhpcyksIGUuYWRkRXZlbnRMaXN0ZW5lcigiZW50ZXItdnIiLCB0aGlzLmhpZGVCb3VuZCksIGUuYWRkRXZlbnRMaXN0ZW5lcigiZXhpdC12ciIsIHRoaXMuc2hvd0JvdW5kKSk7CiAgfSwgdXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnN0YXRzKQogICAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTsKICB9LCByZW1vdmU6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCJlbnRlci12ciIsIHRoaXMuaGlkZUJvdW5kKSwgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCJleGl0LXZyIiwgdGhpcy5zaG93Qm91bmQpLCB0aGlzLnN0YXRzRWwgJiYgdGhpcy5zdGF0c0VsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zdGF0c0VsKTsKICB9LCB0aWNrOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5zdGF0czsKICAgIGUgJiYgKGUoInJBRiIpLnRpY2soKSwgZSgiRlBTIikuZnJhbWUoKSwgZSgpLnVwZGF0ZSgpKTsKICB9LCBoaWRlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuc3RhdHNFbC5jbGFzc0xpc3QuYWRkKGVjKTsKICB9LCBzaG93OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuc3RhdHNFbC5jbGFzc0xpc3QucmVtb3ZlKGVjKTsKICB9IH0pOwogIGNzKCJ4ci1tb2RlLXVpIiwgeyBkZXBlbmRlbmNpZXM6IFsiY2FudmFzIl0sIHNjaGVtYTogeyBlbmFibGVkOiB7IGRlZmF1bHQ6IHRydWUgfSwgZW50ZXJWUkJ1dHRvbjogeyBkZWZhdWx0OiAiIiB9LCBlbnRlclZSRW5hYmxlZDogeyBkZWZhdWx0OiB0cnVlIH0sIGVudGVyQVJCdXR0b246IHsgZGVmYXVsdDogIiIgfSwgZW50ZXJBUkVuYWJsZWQ6IHsgZGVmYXVsdDogdHJ1ZSB9LCBYUk1vZGU6IHsgZGVmYXVsdDogInZyIiwgb25lT2Y6IFsidnIiLCAiYXIiLCAieHIiXSB9IH0sIHNjZW5lT25seTogdHJ1ZSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMsIHQyID0gdGhpcy5lbDsKICAgIHNvKCJ1aSIpICE9PSAiZmFsc2UiICYmICh0aGlzLmluc2lkZUxvYWRlciA9IGZhbHNlLCB0aGlzLmVudGVyVlJFbCA9IG51bGwsIHRoaXMuZW50ZXJBUkVsID0gbnVsbCwgdGhpcy5vcmllbnRhdGlvbk1vZGFsRWwgPSBudWxsLCB0aGlzLmJpbmRNZXRob2RzKCksIHQyLmFkZEV2ZW50TGlzdGVuZXIoImVudGVyLXZyIiwgdGhpcy51cGRhdGVFbnRlckludGVyZmFjZXMpLCB0Mi5hZGRFdmVudExpc3RlbmVyKCJleGl0LXZyIiwgdGhpcy51cGRhdGVFbnRlckludGVyZmFjZXMpLCB0Mi5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGUtdnItZGV2aWNlcyIsIHRoaXMudXBkYXRlRW50ZXJJbnRlcmZhY2VzKSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCBmdW5jdGlvbih0MykgewogICAgICB0My5kYXRhLnR5cGUgPT09ICJsb2FkZXJSZWFkeSIgJiYgKGUuaW5zaWRlTG9hZGVyID0gdHJ1ZSwgZS5yZW1vdmUoKSk7CiAgICB9KSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIiwgdGhpcy50b2dnbGVPcmllbnRhdGlvbk1vZGFsSWZOZWVkZWQpKTsKICB9LCBiaW5kTWV0aG9kczogZnVuY3Rpb24oKSB7CiAgICB0aGlzLm9uRW50ZXJWUkJ1dHRvbkNsaWNrID0gdGhpcy5vbkVudGVyVlJCdXR0b25DbGljay5iaW5kKHRoaXMpLCB0aGlzLm9uRW50ZXJBUkJ1dHRvbkNsaWNrID0gdGhpcy5vbkVudGVyQVJCdXR0b25DbGljay5iaW5kKHRoaXMpLCB0aGlzLm9uTW9kYWxDbGljayA9IHRoaXMub25Nb2RhbENsaWNrLmJpbmQodGhpcyksIHRoaXMudG9nZ2xlT3JpZW50YXRpb25Nb2RhbElmTmVlZGVkID0gdGhpcy50b2dnbGVPcmllbnRhdGlvbk1vZGFsSWZOZWVkZWQuYmluZCh0aGlzKSwgdGhpcy51cGRhdGVFbnRlckludGVyZmFjZXMgPSB0aGlzLnVwZGF0ZUVudGVySW50ZXJmYWNlcy5iaW5kKHRoaXMpOwogIH0sIG9uTW9kYWxDbGljazogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsLmV4aXRWUigpOwogIH0sIG9uRW50ZXJWUkJ1dHRvbkNsaWNrOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuZW50ZXJWUigpOwogIH0sIG9uRW50ZXJBUkJ1dHRvbkNsaWNrOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZWwuZW50ZXJBUigpOwogIH0sIHVwZGF0ZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSwgdDIsIG4yLCBpMiA9IHRoaXMuZGF0YSwgcjIgPSB0aGlzLmVsOwogICAgaWYgKCFpMi5lbmFibGVkIHx8IHRoaXMuaW5zaWRlTG9hZGVyIHx8IHNvKCJ1aSIpID09PSAiZmFsc2UiKQogICAgICByZXR1cm4gdGhpcy5yZW1vdmUoKTsKICAgIHRoaXMuZW50ZXJWUkVsIHx8IHRoaXMuZW50ZXJBUkVsIHx8IHRoaXMub3JpZW50YXRpb25Nb2RhbEVsIHx8ICh0aGlzLmVudGVyVlJFbCB8fCAhaTIuZW50ZXJWUkVuYWJsZWQgfHwgaTIuWFJNb2RlICE9PSAieHIiICYmIGkyLlhSTW9kZSAhPT0gInZyIiB8fCAoaTIuZW50ZXJWUkJ1dHRvbiA/ICh0aGlzLmVudGVyVlJFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaTIuZW50ZXJWUkJ1dHRvbiksIHRoaXMuZW50ZXJWUkVsLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5vbkVudGVyVlJCdXR0b25DbGljaykpIDogKHRoaXMuZW50ZXJWUkVsID0gKGUgPSB0aGlzLm9uRW50ZXJWUkJ1dHRvbkNsaWNrLCAobjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuY2xhc3NMaXN0LmFkZCgiYS1lbnRlci12ciIpLCBuMi5zZXRBdHRyaWJ1dGUoaGksICIiKSwgKHQyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIikpLmNsYXNzTmFtZSA9ICJhLWVudGVyLXZyLWJ1dHRvbiIsIHQyLnNldEF0dHJpYnV0ZSgidGl0bGUiLCAiRW50ZXIgVlIgbW9kZSB3aXRoIGEgaGVhZHNldCBvciBmdWxsc2NyZWVuIHdpdGhvdXQiKSwgdDIuc2V0QXR0cmlidXRlKGhpLCAiIiksIFNpKCkgJiYgaWModDIpLCBuMi5hcHBlbmRDaGlsZCh0MiksIHQyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24odDMpIHsKICAgICAgZSgpLCB0My5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0pLCBuMiksIHIyLmFwcGVuZENoaWxkKHRoaXMuZW50ZXJWUkVsKSkpLCB0aGlzLmVudGVyQVJFbCB8fCAhaTIuZW50ZXJBUkVuYWJsZWQgfHwgaTIuWFJNb2RlICE9PSAieHIiICYmIGkyLlhSTW9kZSAhPT0gImFyIiB8fCAoaTIuZW50ZXJBUkJ1dHRvbiA/ICh0aGlzLmVudGVyQVJFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaTIuZW50ZXJBUkJ1dHRvbiksIHRoaXMuZW50ZXJBUkVsLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgdGhpcy5vbkVudGVyQVJCdXR0b25DbGljaykpIDogKHRoaXMuZW50ZXJBUkVsID0gZnVuY3Rpb24oZTIsIHQzKSB7CiAgICAgIHZhciBuMywgaTM7CiAgICAgIHJldHVybiAoaTMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuY2xhc3NMaXN0LmFkZCgiYS1lbnRlci1hciIpLCB0MyAmJiBpMy5jbGFzc0xpc3QuYWRkKCJ4ciIpLCBpMy5zZXRBdHRyaWJ1dGUoaGksICIiKSwgKG4zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIikpLmNsYXNzTmFtZSA9ICJhLWVudGVyLWFyLWJ1dHRvbiIsIG4zLnNldEF0dHJpYnV0ZSgidGl0bGUiLCAiRW50ZXIgQVIgbW9kZSB3aXRoIGEgaGVhZHNldCBvciBoYW5kaGVsZCBkZXZpY2UuIiksIG4zLnNldEF0dHJpYnV0ZShoaSwgIiIpLCBTaSgpICYmIGljKG4zKSwgaTMuYXBwZW5kQ2hpbGQobjMpLCBuMy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKHQ0KSB7CiAgICAgICAgZTIoKSwgdDQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIH0pLCBpMzsKICAgIH0odGhpcy5vbkVudGVyQVJCdXR0b25DbGljaywgaTIuWFJNb2RlID09PSAieHIiKSwgcjIuYXBwZW5kQ2hpbGQodGhpcy5lbnRlckFSRWwpKSksIHRoaXMub3JpZW50YXRpb25Nb2RhbEVsID0gZnVuY3Rpb24oZTIpIHsKICAgICAgdmFyIHQzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgIHQzLmNsYXNzTmFtZSA9ICJhLW9yaWVudGF0aW9uLW1vZGFsIiwgdDMuY2xhc3NMaXN0LmFkZChuYyksIHQzLnNldEF0dHJpYnV0ZShoaSwgIiIpOwogICAgICB2YXIgbjMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgICAgcmV0dXJuIG4zLnNldEF0dHJpYnV0ZShoaSwgIiIpLCBuMy5pbm5lckhUTUwgPSAiRXhpdCBWUiIsIG4zLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZTIpLCB0My5hcHBlbmRDaGlsZChuMyksIHQzOwogICAgfSh0aGlzLm9uTW9kYWxDbGljayksIHIyLmFwcGVuZENoaWxkKHRoaXMub3JpZW50YXRpb25Nb2RhbEVsKSwgdGhpcy51cGRhdGVFbnRlckludGVyZmFjZXMoKSk7CiAgfSwgcmVtb3ZlOiBmdW5jdGlvbigpIHsKICAgIFt0aGlzLmVudGVyVlJFbCwgdGhpcy5lbnRlckFSRWwsIHRoaXMub3JpZW50YXRpb25Nb2RhbEVsXS5mb3JFYWNoKGZ1bmN0aW9uKGUpIHsKICAgICAgZSAmJiBlLnBhcmVudE5vZGUgJiYgZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpOwogICAgfSksIHRoaXMuZW50ZXJWUkVsID0gdW5kZWZpbmVkLCB0aGlzLmVudGVyQVJFbCA9IHVuZGVmaW5lZCwgdGhpcy5vcmllbnRhdGlvbk1vZGFsRWwgPSB1bmRlZmluZWQ7CiAgfSwgdXBkYXRlRW50ZXJJbnRlcmZhY2VzOiBmdW5jdGlvbigpIHsKICAgIHRoaXMudG9nZ2xlRW50ZXJWUkJ1dHRvbklmTmVlZGVkKCksIHRoaXMudG9nZ2xlRW50ZXJBUkJ1dHRvbklmTmVlZGVkKCksIHRoaXMudG9nZ2xlT3JpZW50YXRpb25Nb2RhbElmTmVlZGVkKCk7CiAgfSwgdG9nZ2xlRW50ZXJWUkJ1dHRvbklmTmVlZGVkOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5lbDsKICAgIHRoaXMuZW50ZXJWUkVsICYmIChlLmlzKCJ2ci1tb2RlIikgfHwgKGUuaXNNb2JpbGUgfHwgRmkoKSkgJiYgIVFpKCkgPyB0aGlzLmVudGVyVlJFbC5jbGFzc0xpc3QuYWRkKG5jKSA6IChRaSgpIHx8IHRoaXMuZW50ZXJWUkVsLmNsYXNzTGlzdC5hZGQoImZ1bGxzY3JlZW4iKSwgdGhpcy5lbnRlclZSRWwuY2xhc3NMaXN0LnJlbW92ZShuYyksIGUuZW50ZXJWUihmYWxzZSwgdHJ1ZSkpKTsKICB9LCB0b2dnbGVFbnRlckFSQnV0dG9uSWZOZWVkZWQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsOwogICAgdGhpcy5lbnRlckFSRWwgJiYgKGUuaXMoInZyLW1vZGUiKSB8fCAheGkoKSA/IHRoaXMuZW50ZXJBUkVsLmNsYXNzTGlzdC5hZGQobmMpIDogKHRoaXMuZW50ZXJBUkVsLmNsYXNzTGlzdC5yZW1vdmUobmMpLCBlLmVudGVyVlIodHJ1ZSwgdHJ1ZSkpKTsKICB9LCB0b2dnbGVPcmllbnRhdGlvbk1vZGFsSWZOZWVkZWQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmVsLCB0MiA9IHRoaXMub3JpZW50YXRpb25Nb2RhbEVsOwogICAgdDIgJiYgZS5pc01vYmlsZSAmJiAoIU5pKCkgJiYgZS5pcygidnItbW9kZSIpID8gdDIuY2xhc3NMaXN0LnJlbW92ZShuYykgOiB0Mi5jbGFzc0xpc3QuYWRkKG5jKSk7CiAgfSB9KSwgcXMoImJveCIsIHsgc2NoZW1hOiB7IGRlcHRoOiB7IGRlZmF1bHQ6IDEsIG1pbjogMCB9LCBoZWlnaHQ6IHsgZGVmYXVsdDogMSwgbWluOiAwIH0sIHdpZHRoOiB7IGRlZmF1bHQ6IDEsIG1pbjogMCB9LCBzZWdtZW50c0hlaWdodDogeyBkZWZhdWx0OiAxLCBtaW46IDEsIG1heDogMjAsIHR5cGU6ICJpbnQiIH0sIHNlZ21lbnRzV2lkdGg6IHsgZGVmYXVsdDogMSwgbWluOiAxLCBtYXg6IDIwLCB0eXBlOiAiaW50IiB9LCBzZWdtZW50c0RlcHRoOiB7IGRlZmF1bHQ6IDEsIG1pbjogMSwgbWF4OiAyMCwgdHlwZTogImludCIgfSB9LCBpbml0OiBmdW5jdGlvbihlKSB7CiAgICB0aGlzLmdlb21ldHJ5ID0gbmV3IFJlLkJveEdlb21ldHJ5KGUud2lkdGgsIGUuaGVpZ2h0LCBlLmRlcHRoLCBlLnNlZ21lbnRzV2lkdGgsIGUuc2VnbWVudHNIZWlnaHQsIGUuc2VnbWVudHNEZXB0aCk7CiAgfSB9KTsKICByYyA9IFJlLk1hdGhVdGlscy5kZWdUb1JhZDsKICBxcygiY2lyY2xlIiwgeyBzY2hlbWE6IHsgcmFkaXVzOiB7IGRlZmF1bHQ6IDEsIG1pbjogMCB9LCBzZWdtZW50czogeyBkZWZhdWx0OiAzMiwgbWluOiAzLCB0eXBlOiAiaW50IiB9LCB0aGV0YUxlbmd0aDogeyBkZWZhdWx0OiAzNjAsIG1pbjogMCB9LCB0aGV0YVN0YXJ0OiB7IGRlZmF1bHQ6IDAgfSB9LCBpbml0OiBmdW5jdGlvbihlKSB7CiAgICB0aGlzLmdlb21ldHJ5ID0gbmV3IFJlLkNpcmNsZUdlb21ldHJ5KGUucmFkaXVzLCBlLnNlZ21lbnRzLCByYyhlLnRoZXRhU3RhcnQpLCByYyhlLnRoZXRhTGVuZ3RoKSk7CiAgfSB9KTsKICBvYyA9IFJlLk1hdGhVdGlscy5kZWdUb1JhZDsKICBxcygiY29uZSIsIHsgc2NoZW1hOiB7IGhlaWdodDogeyBkZWZhdWx0OiAxLCBtaW46IDAgfSwgb3BlbkVuZGVkOiB7IGRlZmF1bHQ6IGZhbHNlIH0sIHJhZGl1c0JvdHRvbTogeyBkZWZhdWx0OiAxLCBtaW46IDAgfSwgcmFkaXVzVG9wOiB7IGRlZmF1bHQ6IDAuMDEsIG1pbjogMCB9LCBzZWdtZW50c0hlaWdodDogeyBkZWZhdWx0OiAxOCwgbWluOiAxLCB0eXBlOiAiaW50IiB9LCBzZWdtZW50c1JhZGlhbDogeyBkZWZhdWx0OiAzNiwgbWluOiAzLCB0eXBlOiAiaW50IiB9LCB0aGV0YUxlbmd0aDogeyBkZWZhdWx0OiAzNjAsIG1pbjogMCB9LCB0aGV0YVN0YXJ0OiB7IGRlZmF1bHQ6IDAgfSB9LCBpbml0OiBmdW5jdGlvbihlKSB7CiAgICB0aGlzLmdlb21ldHJ5ID0gbmV3IFJlLkN5bGluZGVyR2VvbWV0cnkoZS5yYWRpdXNUb3AsIGUucmFkaXVzQm90dG9tLCBlLmhlaWdodCwgZS5zZWdtZW50c1JhZGlhbCwgZS5zZWdtZW50c0hlaWdodCwgZS5vcGVuRW5kZWQsIG9jKGUudGhldGFTdGFydCksIG9jKGUudGhldGFMZW5ndGgpKTsKICB9IH0pOwogIHNjID0gUmUuTWF0aFV0aWxzLmRlZ1RvUmFkOwogIHFzKCJjeWxpbmRlciIsIHsgc2NoZW1hOiB7IGhlaWdodDogeyBkZWZhdWx0OiAxLCBtaW46IDAgfSwgb3BlbkVuZGVkOiB7IGRlZmF1bHQ6IGZhbHNlIH0sIHJhZGl1czogeyBkZWZhdWx0OiAxLCBtaW46IDAgfSwgc2VnbWVudHNIZWlnaHQ6IHsgZGVmYXVsdDogMTgsIG1pbjogMSwgdHlwZTogImludCIgfSwgc2VnbWVudHNSYWRpYWw6IHsgZGVmYXVsdDogMzYsIG1pbjogMywgdHlwZTogImludCIgfSwgdGhldGFMZW5ndGg6IHsgZGVmYXVsdDogMzYwLCBtaW46IDAgfSwgdGhldGFTdGFydDogeyBkZWZhdWx0OiAwIH0gfSwgaW5pdDogZnVuY3Rpb24oZSkgewogICAgdGhpcy5nZW9tZXRyeSA9IG5ldyBSZS5DeWxpbmRlckdlb21ldHJ5KGUucmFkaXVzLCBlLnJhZGl1cywgZS5oZWlnaHQsIGUuc2VnbWVudHNSYWRpYWwsIGUuc2VnbWVudHNIZWlnaHQsIGUub3BlbkVuZGVkLCBzYyhlLnRoZXRhU3RhcnQpLCBzYyhlLnRoZXRhTGVuZ3RoKSk7CiAgfSB9KSwgcXMoImRvZGVjYWhlZHJvbiIsIHsgc2NoZW1hOiB7IGRldGFpbDogeyBkZWZhdWx0OiAwLCBtaW46IDAsIG1heDogNSwgdHlwZTogImludCIgfSwgcmFkaXVzOiB7IGRlZmF1bHQ6IDEsIG1pbjogMCB9IH0sIGluaXQ6IGZ1bmN0aW9uKGUpIHsKICAgIHRoaXMuZ2VvbWV0cnkgPSBuZXcgUmUuRG9kZWNhaGVkcm9uR2VvbWV0cnkoZS5yYWRpdXMsIGUuZGV0YWlsKTsKICB9IH0pLCBxcygiaWNvc2FoZWRyb24iLCB7IHNjaGVtYTogeyBkZXRhaWw6IHsgZGVmYXVsdDogMCwgbWluOiAwLCBtYXg6IDUsIHR5cGU6ICJpbnQiIH0sIHJhZGl1czogeyBkZWZhdWx0OiAxLCBtaW46IDAgfSB9LCBpbml0OiBmdW5jdGlvbihlKSB7CiAgICB0aGlzLmdlb21ldHJ5ID0gbmV3IFJlLkljb3NhaGVkcm9uR2VvbWV0cnkoZS5yYWRpdXMsIGUuZGV0YWlsKTsKICB9IH0pLCBxcygib2N0YWhlZHJvbiIsIHsgc2NoZW1hOiB7IGRldGFpbDogeyBkZWZhdWx0OiAwLCBtaW46IDAsIG1heDogNSwgdHlwZTogImludCIgfSwgcmFkaXVzOiB7IGRlZmF1bHQ6IDEsIG1pbjogMCB9IH0sIGluaXQ6IGZ1bmN0aW9uKGUpIHsKICAgIHRoaXMuZ2VvbWV0cnkgPSBuZXcgUmUuT2N0YWhlZHJvbkdlb21ldHJ5KGUucmFkaXVzLCBlLmRldGFpbCk7CiAgfSB9KSwgcXMoInBsYW5lIiwgeyBzY2hlbWE6IHsgaGVpZ2h0OiB7IGRlZmF1bHQ6IDEsIG1pbjogMCB9LCB3aWR0aDogeyBkZWZhdWx0OiAxLCBtaW46IDAgfSwgc2VnbWVudHNIZWlnaHQ6IHsgZGVmYXVsdDogMSwgbWluOiAxLCBtYXg6IDIwLCB0eXBlOiAiaW50IiB9LCBzZWdtZW50c1dpZHRoOiB7IGRlZmF1bHQ6IDEsIG1pbjogMSwgbWF4OiAyMCwgdHlwZTogImludCIgfSB9LCBpbml0OiBmdW5jdGlvbihlKSB7CiAgICB0aGlzLmdlb21ldHJ5ID0gbmV3IFJlLlBsYW5lR2VvbWV0cnkoZS53aWR0aCwgZS5oZWlnaHQsIGUuc2VnbWVudHNXaWR0aCwgZS5zZWdtZW50c0hlaWdodCk7CiAgfSB9KTsKICBhYyA9IFJlLk1hdGhVdGlscy5kZWdUb1JhZDsKICBxcygicmluZyIsIHsgc2NoZW1hOiB7IHJhZGl1c0lubmVyOiB7IGRlZmF1bHQ6IDAuOCwgbWluOiAwIH0sIHJhZGl1c091dGVyOiB7IGRlZmF1bHQ6IDEuMiwgbWluOiAwIH0sIHNlZ21lbnRzUGhpOiB7IGRlZmF1bHQ6IDEwLCBtaW46IDEsIHR5cGU6ICJpbnQiIH0sIHNlZ21lbnRzVGhldGE6IHsgZGVmYXVsdDogMzIsIG1pbjogMywgdHlwZTogImludCIgfSwgdGhldGFMZW5ndGg6IHsgZGVmYXVsdDogMzYwLCBtaW46IDAgfSwgdGhldGFTdGFydDogeyBkZWZhdWx0OiAwIH0gfSwgaW5pdDogZnVuY3Rpb24oZSkgewogICAgdGhpcy5nZW9tZXRyeSA9IG5ldyBSZS5SaW5nR2VvbWV0cnkoZS5yYWRpdXNJbm5lciwgZS5yYWRpdXNPdXRlciwgZS5zZWdtZW50c1RoZXRhLCBlLnNlZ21lbnRzUGhpLCBhYyhlLnRoZXRhU3RhcnQpLCBhYyhlLnRoZXRhTGVuZ3RoKSk7CiAgfSB9KTsKICBBYyA9IFJlLk1hdGhVdGlscy5kZWdUb1JhZDsKICBxcygic3BoZXJlIiwgeyBzY2hlbWE6IHsgcmFkaXVzOiB7IGRlZmF1bHQ6IDEsIG1pbjogMCB9LCBwaGlMZW5ndGg6IHsgZGVmYXVsdDogMzYwIH0sIHBoaVN0YXJ0OiB7IGRlZmF1bHQ6IDAsIG1pbjogMCB9LCB0aGV0YUxlbmd0aDogeyBkZWZhdWx0OiAxODAsIG1pbjogMCB9LCB0aGV0YVN0YXJ0OiB7IGRlZmF1bHQ6IDAgfSwgc2VnbWVudHNIZWlnaHQ6IHsgZGVmYXVsdDogMTgsIG1pbjogMiwgdHlwZTogImludCIgfSwgc2VnbWVudHNXaWR0aDogeyBkZWZhdWx0OiAzNiwgbWluOiAzLCB0eXBlOiAiaW50IiB9IH0sIGluaXQ6IGZ1bmN0aW9uKGUpIHsKICAgIHRoaXMuZ2VvbWV0cnkgPSBuZXcgUmUuU3BoZXJlR2VvbWV0cnkoZS5yYWRpdXMsIGUuc2VnbWVudHNXaWR0aCwgZS5zZWdtZW50c0hlaWdodCwgQWMoZS5waGlTdGFydCksIEFjKGUucGhpTGVuZ3RoKSwgQWMoZS50aGV0YVN0YXJ0KSwgQWMoZS50aGV0YUxlbmd0aCkpOwogIH0gfSksIHFzKCJ0ZXRyYWhlZHJvbiIsIHsgc2NoZW1hOiB7IGRldGFpbDogeyBkZWZhdWx0OiAwLCBtaW46IDAsIG1heDogNSwgdHlwZTogImludCIgfSwgcmFkaXVzOiB7IGRlZmF1bHQ6IDEsIG1pbjogMCB9IH0sIGluaXQ6IGZ1bmN0aW9uKGUpIHsKICAgIHRoaXMuZ2VvbWV0cnkgPSBuZXcgUmUuVGV0cmFoZWRyb25HZW9tZXRyeShlLnJhZGl1cywgZS5kZXRhaWwpOwogIH0gfSk7CiAgbGMgPSBSZS5NYXRoVXRpbHMuZGVnVG9SYWQ7CiAgcXMoInRvcnVzIiwgeyBzY2hlbWE6IHsgYXJjOiB7IGRlZmF1bHQ6IDM2MCB9LCByYWRpdXM6IHsgZGVmYXVsdDogMSwgbWluOiAwIH0sIHJhZGl1c1R1YnVsYXI6IHsgZGVmYXVsdDogMC4yLCBtaW46IDAgfSwgc2VnbWVudHNSYWRpYWw6IHsgZGVmYXVsdDogMzYsIG1pbjogMiwgdHlwZTogImludCIgfSwgc2VnbWVudHNUdWJ1bGFyOiB7IGRlZmF1bHQ6IDMyLCBtaW46IDMsIHR5cGU6ICJpbnQiIH0gfSwgaW5pdDogZnVuY3Rpb24oZSkgewogICAgdGhpcy5nZW9tZXRyeSA9IG5ldyBSZS5Ub3J1c0dlb21ldHJ5KGUucmFkaXVzLCAyICogZS5yYWRpdXNUdWJ1bGFyLCBlLnNlZ21lbnRzUmFkaWFsLCBlLnNlZ21lbnRzVHVidWxhciwgbGMoZS5hcmMpKTsKICB9IH0pLCBxcygidG9ydXNLbm90IiwgeyBzY2hlbWE6IHsgcDogeyBkZWZhdWx0OiAyLCBtaW46IDEgfSwgcTogeyBkZWZhdWx0OiAzLCBtaW46IDEgfSwgcmFkaXVzOiB7IGRlZmF1bHQ6IDEsIG1pbjogMCB9LCByYWRpdXNUdWJ1bGFyOiB7IGRlZmF1bHQ6IDAuMiwgbWluOiAwIH0sIHNlZ21lbnRzUmFkaWFsOiB7IGRlZmF1bHQ6IDgsIG1pbjogMywgdHlwZTogImludCIgfSwgc2VnbWVudHNUdWJ1bGFyOiB7IGRlZmF1bHQ6IDEwMCwgbWluOiAzLCB0eXBlOiAiaW50IiB9IH0sIGluaXQ6IGZ1bmN0aW9uKGUpIHsKICAgIHRoaXMuZ2VvbWV0cnkgPSBuZXcgUmUuVG9ydXNLbm90R2VvbWV0cnkoZS5yYWRpdXMsIDIgKiBlLnJhZGl1c1R1YnVsYXIsIGUuc2VnbWVudHNUdWJ1bGFyLCBlLnNlZ21lbnRzUmFkaWFsLCBlLnAsIGUucSk7CiAgfSB9KTsKICBjYyA9IG5ldyBSZS5RdWF0ZXJuaW9uOwogIGhjID0gbmV3IFJlLlZlY3RvcjMoMCwgMCwgMSk7CiAgZGMgPSBuZXcgUmUuVmVjdG9yMjsKICB1YyA9IG5ldyBSZS5WZWN0b3IyOwogIGdjID0gbmV3IFJlLlZlY3RvcjI7CiAgcXMoInRyaWFuZ2xlIiwgeyBzY2hlbWE6IHsgdmVydGV4QTogeyB0eXBlOiAidmVjMyIsIGRlZmF1bHQ6IHsgeDogMCwgeTogMC41LCB6OiAwIH0gfSwgdmVydGV4QjogeyB0eXBlOiAidmVjMyIsIGRlZmF1bHQ6IHsgeDogLTAuNSwgeTogLTAuNSwgejogMCB9IH0sIHZlcnRleEM6IHsgdHlwZTogInZlYzMiLCBkZWZhdWx0OiB7IHg6IDAuNSwgeTogLTAuNSwgejogMCB9IH0gfSwgaW5pdDogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiwgaTIsIHIyLCBvMiwgczIsIGEyLCBBMiwgbDI7CiAgICAoaTIgPSBuZXcgUmUuVHJpYW5nbGUpLmEuc2V0KGUudmVydGV4QS54LCBlLnZlcnRleEEueSwgZS52ZXJ0ZXhBLnopLCBpMi5iLnNldChlLnZlcnRleEIueCwgZS52ZXJ0ZXhCLnksIGUudmVydGV4Qi56KSwgaTIuYy5zZXQoZS52ZXJ0ZXhDLngsIGUudmVydGV4Qy55LCBlLnZlcnRleEMueiksIG4yID0gaTIuZ2V0Tm9ybWFsKG5ldyBSZS5WZWN0b3IzKSwgY2Muc2V0RnJvbVVuaXRWZWN0b3JzKG4yLCBoYyksIHIyID0gaTIuYS5jbG9uZSgpLmFwcGx5UXVhdGVybmlvbihjYyksIG8yID0gaTIuYi5jbG9uZSgpLmFwcGx5UXVhdGVybmlvbihjYyksIHMyID0gaTIuYy5jbG9uZSgpLmFwcGx5UXVhdGVybmlvbihjYyksIGRjLnNldChNYXRoLm1pbihyMi54LCBvMi54LCBzMi54KSwgTWF0aC5taW4ocjIueSwgbzIueSwgczIueSkpLCB1Yy5zZXQoTWF0aC5tYXgocjIueCwgbzIueCwgczIueCksIE1hdGgubWF4KHIyLnksIG8yLnksIHMyLnkpKSwgZ2Muc2V0KDAsIDApLnN1YlZlY3RvcnModWMsIGRjKSwgcjIgPSBuZXcgUmUuVmVjdG9yMigpLnN1YlZlY3RvcnMocjIsIGRjKS5kaXZpZGUoZ2MpLCBvMiA9IG5ldyBSZS5WZWN0b3IyKCkuc3ViVmVjdG9ycyhvMiwgZGMpLmRpdmlkZShnYyksIHMyID0gbmV3IFJlLlZlY3RvcjIoKS5zdWJWZWN0b3JzKHMyLCBkYykuZGl2aWRlKGdjKSwgdDIgPSB0aGlzLmdlb21ldHJ5ID0gbmV3IFJlLkJ1ZmZlckdlb21ldHJ5LCBhMiA9IFtpMi5hLngsIGkyLmEueSwgaTIuYS56LCBpMi5iLngsIGkyLmIueSwgaTIuYi56LCBpMi5jLngsIGkyLmMueSwgaTIuYy56XSwgQTIgPSBbbjIueCwgbjIueSwgbjIueiwgbjIueCwgbjIueSwgbjIueiwgbjIueCwgbjIueSwgbjIuel0sIGwyID0gW3IyLngsIHIyLnksIG8yLngsIG8yLnksIHMyLngsIHMyLnldLCB0Mi5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgbmV3IFJlLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoYTIsIDMpKSwgdDIuc2V0QXR0cmlidXRlKCJub3JtYWwiLCBuZXcgUmUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShBMiwgMykpLCB0Mi5zZXRBdHRyaWJ1dGUoInV2IiwgbmV3IFJlLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUobDIsIDIpKTsKICB9IH0pLCBpYSgiZmxhdCIsIHsgc2NoZW1hOiB7IGNvbG9yOiB7IHR5cGU6ICJjb2xvciIgfSwgZm9nOiB7IGRlZmF1bHQ6IHRydWUgfSwgb2Zmc2V0OiB7IHR5cGU6ICJ2ZWMyIiwgZGVmYXVsdDogeyB4OiAwLCB5OiAwIH0gfSwgcmVwZWF0OiB7IHR5cGU6ICJ2ZWMyIiwgZGVmYXVsdDogeyB4OiAxLCB5OiAxIH0gfSwgc3JjOiB7IHR5cGU6ICJtYXAiIH0sIHdpcmVmcmFtZTogeyBkZWZhdWx0OiBmYWxzZSB9LCB3aXJlZnJhbWVMaW5ld2lkdGg6IHsgZGVmYXVsdDogMiB9LCB0b25lTWFwcGVkOiB7IGRlZmF1bHQ6IHRydWUgfSB9LCBpbml0OiBmdW5jdGlvbihlKSB7CiAgICB0aGlzLm1hdGVyaWFsRGF0YSA9IHsgY29sb3I6IG5ldyBSZS5Db2xvciB9LCBwYyhlLCB0aGlzLm1hdGVyaWFsRGF0YSksIHRoaXMubWF0ZXJpYWwgPSBuZXcgUmUuTWVzaEJhc2ljTWF0ZXJpYWwodGhpcy5tYXRlcmlhbERhdGEpOwogIH0sIHVwZGF0ZTogZnVuY3Rpb24oZSkgewogICAgdGhpcy51cGRhdGVNYXRlcmlhbChlKSwgdnIodGhpcywgZSk7CiAgfSwgdXBkYXRlTWF0ZXJpYWw6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MjsKICAgIGZvciAodDIgaW4gcGMoZSwgdGhpcy5tYXRlcmlhbERhdGEpLCB0aGlzLm1hdGVyaWFsRGF0YSkKICAgICAgdGhpcy5tYXRlcmlhbFt0Ml0gPSB0aGlzLm1hdGVyaWFsRGF0YVt0Ml07CiAgfSB9KSwgaWEoInN0YW5kYXJkIiwgeyBzY2hlbWE6IHsgYW1iaWVudE9jY2x1c2lvbk1hcDogeyB0eXBlOiAibWFwIiB9LCBhbWJpZW50T2NjbHVzaW9uTWFwSW50ZW5zaXR5OiB7IGRlZmF1bHQ6IDEgfSwgYW1iaWVudE9jY2x1c2lvblRleHR1cmVPZmZzZXQ6IHsgdHlwZTogInZlYzIiIH0sIGFtYmllbnRPY2NsdXNpb25UZXh0dXJlUmVwZWF0OiB7IHR5cGU6ICJ2ZWMyIiwgZGVmYXVsdDogeyB4OiAxLCB5OiAxIH0gfSwgY29sb3I6IHsgdHlwZTogImNvbG9yIiB9LCBkaXNwbGFjZW1lbnRNYXA6IHsgdHlwZTogIm1hcCIgfSwgZGlzcGxhY2VtZW50U2NhbGU6IHsgZGVmYXVsdDogMSB9LCBkaXNwbGFjZW1lbnRCaWFzOiB7IGRlZmF1bHQ6IDAuNSB9LCBkaXNwbGFjZW1lbnRUZXh0dXJlT2Zmc2V0OiB7IHR5cGU6ICJ2ZWMyIiB9LCBkaXNwbGFjZW1lbnRUZXh0dXJlUmVwZWF0OiB7IHR5cGU6ICJ2ZWMyIiwgZGVmYXVsdDogeyB4OiAxLCB5OiAxIH0gfSwgZW1pc3NpdmU6IHsgdHlwZTogImNvbG9yIiwgZGVmYXVsdDogIiMwMDAiIH0sIGVtaXNzaXZlSW50ZW5zaXR5OiB7IGRlZmF1bHQ6IDEgfSwgZW52TWFwOiB7IGRlZmF1bHQ6ICIiIH0sIGZvZzogeyBkZWZhdWx0OiB0cnVlIH0sIG1ldGFsbmVzczogeyBkZWZhdWx0OiAwLCBtaW46IDAsIG1heDogMSB9LCBtZXRhbG5lc3NNYXA6IHsgdHlwZTogIm1hcCIgfSwgbWV0YWxuZXNzVGV4dHVyZU9mZnNldDogeyB0eXBlOiAidmVjMiIgfSwgbWV0YWxuZXNzVGV4dHVyZVJlcGVhdDogeyB0eXBlOiAidmVjMiIsIGRlZmF1bHQ6IHsgeDogMSwgeTogMSB9IH0sIG5vcm1hbE1hcDogeyB0eXBlOiAibWFwIiB9LCBub3JtYWxTY2FsZTogeyB0eXBlOiAidmVjMiIsIGRlZmF1bHQ6IHsgeDogMSwgeTogMSB9IH0sIG5vcm1hbFRleHR1cmVPZmZzZXQ6IHsgdHlwZTogInZlYzIiIH0sIG5vcm1hbFRleHR1cmVSZXBlYXQ6IHsgdHlwZTogInZlYzIiLCBkZWZhdWx0OiB7IHg6IDEsIHk6IDEgfSB9LCBvZmZzZXQ6IHsgdHlwZTogInZlYzIiLCBkZWZhdWx0OiB7IHg6IDAsIHk6IDAgfSB9LCByZXBlYXQ6IHsgdHlwZTogInZlYzIiLCBkZWZhdWx0OiB7IHg6IDEsIHk6IDEgfSB9LCByb3VnaG5lc3M6IHsgZGVmYXVsdDogMC41LCBtaW46IDAsIG1heDogMSB9LCByb3VnaG5lc3NNYXA6IHsgdHlwZTogIm1hcCIgfSwgcm91Z2huZXNzVGV4dHVyZU9mZnNldDogeyB0eXBlOiAidmVjMiIgfSwgcm91Z2huZXNzVGV4dHVyZVJlcGVhdDogeyB0eXBlOiAidmVjMiIsIGRlZmF1bHQ6IHsgeDogMSwgeTogMSB9IH0sIHNwaGVyaWNhbEVudk1hcDogeyB0eXBlOiAibWFwIiB9LCBzcmM6IHsgdHlwZTogIm1hcCIgfSwgd2lyZWZyYW1lOiB7IGRlZmF1bHQ6IGZhbHNlIH0sIHdpcmVmcmFtZUxpbmV3aWR0aDogeyBkZWZhdWx0OiAyIH0gfSwgaW5pdDogZnVuY3Rpb24oZSkgewogICAgdGhpcy5tYXRlcmlhbERhdGEgPSB7IGNvbG9yOiBuZXcgUmUuQ29sb3IsIGVtaXNzaXZlOiBuZXcgUmUuQ29sb3IgfSwgZmMoZSwgdGhpcy5tYXRlcmlhbERhdGEpLCB0aGlzLm1hdGVyaWFsID0gbmV3IFJlLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHRoaXMubWF0ZXJpYWxEYXRhKTsKICB9LCB1cGRhdGU6IGZ1bmN0aW9uKGUpIHsKICAgIHRoaXMudXBkYXRlTWF0ZXJpYWwoZSksIHZyKHRoaXMsIGUpLCBCcigibm9ybWFsIiwgdGhpcywgZSksIEJyKCJkaXNwbGFjZW1lbnQiLCB0aGlzLCBlKSwgQnIoImFtYmllbnRPY2NsdXNpb24iLCB0aGlzLCBlKSwgQnIoIm1ldGFsbmVzcyIsIHRoaXMsIGUpLCBCcigicm91Z2huZXNzIiwgdGhpcywgZSksIHlyKHRoaXMsIGUpOwogIH0sIHVwZGF0ZU1hdGVyaWFsOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDIsIG4yID0gdGhpcy5tYXRlcmlhbDsKICAgIGZvciAodDIgaW4gZmMoZSwgdGhpcy5tYXRlcmlhbERhdGEpLCB0aGlzLm1hdGVyaWFsRGF0YSkKICAgICAgbjJbdDJdID0gdGhpcy5tYXRlcmlhbERhdGFbdDJdOwogIH0gfSksIGlhKCJwaG9uZyIsIHsgc2NoZW1hOiB7IGNvbG9yOiB7IHR5cGU6ICJjb2xvciIgfSwgZW1pc3NpdmU6IHsgdHlwZTogImNvbG9yIiwgZGVmYXVsdDogImJsYWNrIiB9LCBlbWlzc2l2ZUludGVuc2l0eTogeyBkZWZhdWx0OiAxIH0sIHNwZWN1bGFyOiB7IHR5cGU6ICJjb2xvciIsIGRlZmF1bHQ6ICIjMTExMTExIiB9LCB0cmFuc3BhcmVudDogeyBkZWZhdWx0OiBmYWxzZSB9LCBmb2c6IHsgZGVmYXVsdDogdHJ1ZSB9LCBvZmZzZXQ6IHsgdHlwZTogInZlYzIiLCBkZWZhdWx0OiB7IHg6IDAsIHk6IDAgfSB9LCByZXBlYXQ6IHsgdHlwZTogInZlYzIiLCBkZWZhdWx0OiB7IHg6IDEsIHk6IDEgfSB9LCBzcmM6IHsgdHlwZTogIm1hcCIgfSwgZW52TWFwOiB7IGRlZmF1bHQ6ICIiIH0sIHNwaGVyaWNhbEVudk1hcDogeyB0eXBlOiAibWFwIiB9LCBzaGluaW5lc3M6IHsgZGVmYXVsdDogMzAgfSwgZmxhdFNoYWRpbmc6IHsgZGVmYXVsdDogZmFsc2UgfSwgd2lyZWZyYW1lOiB7IGRlZmF1bHQ6IGZhbHNlIH0sIHdpcmVmcmFtZUxpbmV3aWR0aDogeyBkZWZhdWx0OiAyIH0sIGNvbWJpbmU6IHsgb25lT0Y6IFsibXVsdGlwbHkiLCAibWl4IiwgImFkZCJdLCBkZWZhdWx0OiAibWl4IiB9LCByZWZsZWN0aXZpdHk6IHsgZGVmYXVsdDogMC45IH0sIHJlZnJhY3Rpb25SYXRpbzogeyBkZWZhdWx0OiAwLjk4IH0sIHJlZnJhY3Q6IHsgZGVmYXVsdDogZmFsc2UgfSwgbm9ybWFsTWFwOiB7IHR5cGU6ICJtYXAiIH0sIG5vcm1hbFNjYWxlOiB7IHR5cGU6ICJ2ZWMyIiwgZGVmYXVsdDogeyB4OiAxLCB5OiAxIH0gfSwgbm9ybWFsVGV4dHVyZU9mZnNldDogeyB0eXBlOiAidmVjMiIgfSwgbm9ybWFsVGV4dHVyZVJlcGVhdDogeyB0eXBlOiAidmVjMiIsIGRlZmF1bHQ6IHsgeDogMSwgeTogMSB9IH0sIGFtYmllbnRPY2NsdXNpb25NYXA6IHsgdHlwZTogIm1hcCIgfSwgYW1iaWVudE9jY2x1c2lvbk1hcEludGVuc2l0eTogeyBkZWZhdWx0OiAxIH0sIGRpc3BsYWNlbWVudE1hcDogeyB0eXBlOiAibWFwIiB9LCBkaXNwbGFjZW1lbnRTY2FsZTogeyBkZWZhdWx0OiAxIH0sIGRpc3BsYWNlbWVudEJpYXM6IHsgZGVmYXVsdDogMC41IH0sIGRpc3BsYWNlbWVudFRleHR1cmVPZmZzZXQ6IHsgdHlwZTogInZlYzIiIH0sIGRpc3BsYWNlbWVudFRleHR1cmVSZXBlYXQ6IHsgdHlwZTogInZlYzIiLCBkZWZhdWx0OiB7IHg6IDEsIHk6IDEgfSB9LCBidW1wTWFwOiB7IHR5cGU6ICJtYXAiIH0sIGJ1bXBNYXBTY2FsZTogeyBkZWZhdWx0OiAxIH0sIGJ1bXBUZXh0dXJlT2Zmc2V0OiB7IHR5cGU6ICJ2ZWMyIiB9LCBidW1wVGV4dHVyZVJlcGVhdDogeyB0eXBlOiAidmVjMiIsIGRlZmF1bHQ6IHsgeDogMSwgeTogMSB9IH0gfSwgaW5pdDogZnVuY3Rpb24oZSkgewogICAgdGhpcy5tYXRlcmlhbERhdGEgPSB7IGNvbG9yOiBuZXcgUmUuQ29sb3IsIHNwZWN1bGFyOiBuZXcgUmUuQ29sb3IsIGVtaXNzaXZlOiBuZXcgUmUuQ29sb3IgfSwgbWMoZSwgdGhpcy5tYXRlcmlhbERhdGEpLCB0aGlzLm1hdGVyaWFsID0gbmV3IFJlLk1lc2hQaG9uZ01hdGVyaWFsKHRoaXMubWF0ZXJpYWxEYXRhKTsKICAgIHZhciB0MiA9IHRoaXMuZWwuc2NlbmVFbDsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLm1hdGVyaWFsLCAiZW52TWFwIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fZW52TWFwIHx8IHQyLm9iamVjdDNELmVudmlyb25tZW50OwogICAgfSwgc2V0OiBmdW5jdGlvbihlMikgewogICAgICB0aGlzLl9lbnZNYXAgPSBlMjsKICAgIH0gfSk7CiAgfSwgdXBkYXRlOiBmdW5jdGlvbihlKSB7CiAgICB0aGlzLnVwZGF0ZU1hdGVyaWFsKGUpLCB2cih0aGlzLCBlKSwgQnIoIm5vcm1hbCIsIHRoaXMsIGUpLCBCcigiZGlzcGxhY2VtZW50IiwgdGhpcywgZSksIEJyKCJhbWJpZW50T2NjbHVzaW9uIiwgdGhpcywgZSksIEJyKCJidW1wIiwgdGhpcywgZSksIHlyKHRoaXMsIGUpOwogIH0sIHVwZGF0ZU1hdGVyaWFsOiBmdW5jdGlvbihlKSB7CiAgICB2YXIgdDI7CiAgICBmb3IgKHQyIGluIG1jKGUsIHRoaXMubWF0ZXJpYWxEYXRhKSwgdGhpcy5tYXRlcmlhbERhdGEpCiAgICAgIHRoaXMubWF0ZXJpYWxbdDJdID0gdGhpcy5tYXRlcmlhbERhdGFbdDJdOwogIH0gfSksIGlhKCJzZGYiLCB7IHNjaGVtYTogeyBhbHBoYVRlc3Q6IHsgdHlwZTogIm51bWJlciIsIGlzOiAidW5pZm9ybSIsIGRlZmF1bHQ6IDAuNSB9LCBjb2xvcjogeyB0eXBlOiAiY29sb3IiLCBpczogInVuaWZvcm0iLCBkZWZhdWx0OiAid2hpdGUiIH0sIG1hcDogeyB0eXBlOiAibWFwIiwgaXM6ICJ1bmlmb3JtIiB9LCBvcGFjaXR5OiB7IHR5cGU6ICJudW1iZXIiLCBpczogInVuaWZvcm0iLCBkZWZhdWx0OiAxIH0gfSwgdmVydGV4U2hhZGVyOiBbIiNpbmNsdWRlIDxjb21tb24+IiwgIiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+IiwgIiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4iLCAib3V0IHZlYzIgdlVWOyIsICJ2b2lkIG1haW4odm9pZCkgeyIsICIgIHZVViA9IHV2OyIsICIgICNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+IiwgIiAgI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PiIsICIgICNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+IiwgIiAgI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+IiwgIn0iXS5qb2luKGAKYCksIGZyYWdtZW50U2hhZGVyOiBbIiNpbmNsdWRlIDxjb21tb24+IiwgIiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4iLCAiI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+IiwgInVuaWZvcm0gZmxvYXQgYWxwaGFUZXN0OyIsICJ1bmlmb3JtIGZsb2F0IG9wYWNpdHk7IiwgInVuaWZvcm0gc2FtcGxlcjJEIG1hcDsiLCAidW5pZm9ybSB2ZWMzIGNvbG9yOyIsICJpbiB2ZWMyIHZVVjsiLCAiZmxvYXQgY29udG91cihmbG9hdCB3aWR0aCwgZmxvYXQgdmFsdWUpIHsiLCAiICByZXR1cm4gc21vb3Roc3RlcCgwLjUgLSB2YWx1ZSwgMC41ICsgdmFsdWUsIHdpZHRoKTsiLCAifSIsICIjZGVmaW5lIEJJR19FTk9VR0ggMC4wMDEiLCAiI2RlZmluZSBNT0RJRklFRF9BTFBIQVRFU1QgKDAuMDIgKiBpc0JpZ0Vub3VnaCAvIEJJR19FTk9VR0gpIiwgInZvaWQgbWFpbigpIHsiLCAiICB2ZWMyIHV2ID0gdlVWOyIsICIgIHZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlKG1hcCwgdXYpOyIsICIgIGZsb2F0IGRpc3QgPSB0ZXhDb2xvci5hOyIsICIgIGZsb2F0IHdpZHRoID0gZndpZHRoKGRpc3QpOyIsICIgIGZsb2F0IGFscGhhID0gY29udG91cihkaXN0LCB3aWR0aCk7IiwgIiAgZmxvYXQgZHNjYWxlID0gMC4zNTM1MDU7IiwgIiAgdmVjMiBkdXYgPSBkc2NhbGUgKiAoZEZkeCh1dikgKyBkRmR5KHV2KSk7IiwgIiAgZmxvYXQgaXNCaWdFbm91Z2ggPSBtYXgoYWJzKGR1di54KSwgYWJzKGR1di55KSk7IiwgIiAgaWYgKGlzQmlnRW5vdWdoID4gQklHX0VOT1VHSCkgeyIsICIgICAgZmxvYXQgcmF0aW8gPSBCSUdfRU5PVUdIIC8gaXNCaWdFbm91Z2g7IiwgIiAgICBhbHBoYSA9IHJhdGlvICogYWxwaGEgKyAoMS4wIC0gcmF0aW8pICogZGlzdDsiLCAiICB9IiwgIiAgaWYgKGlzQmlnRW5vdWdoIDw9IEJJR19FTk9VR0gpIHsiLCAiICAgIHZlYzQgYm94ID0gdmVjNCAodXYgLSBkdXYsIHV2ICsgZHV2KTsiLCAiICAgIGFscGhhID0gKGFscGhhICsgMC41ICogKCIsICIgICAgICBjb250b3VyKHRleHR1cmUobWFwLCBib3gueHkpLmEsIHdpZHRoKSIsICIgICAgICArIGNvbnRvdXIodGV4dHVyZShtYXAsIGJveC56dykuYSwgd2lkdGgpIiwgIiAgICAgICsgY29udG91cih0ZXh0dXJlKG1hcCwgYm94Lnh3KS5hLCB3aWR0aCkiLCAiICAgICAgKyBjb250b3VyKHRleHR1cmUobWFwLCBib3guenkpLmEsIHdpZHRoKSIsICIgICAgKSkgLyAzLjA7IiwgIiAgfSIsICIgIGlmIChhbHBoYSA8IGFscGhhVGVzdCAqIE1PRElGSUVEX0FMUEhBVEVTVCkgeyBkaXNjYXJkOyByZXR1cm47IH0iLCAiICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCBvcGFjaXR5ICogYWxwaGEpOyIsICIgICNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4iLCAiICAjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+IiwgIiAgI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+IiwgIiAgI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4iLCAifSJdLmpvaW4oYApgKSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy51bmlmb3JtcyA9IHRoaXMuaW5pdFVuaWZvcm1zKCksIFJlLlVuaWZvcm1zVXRpbHMgJiYgKHRoaXMudW5pZm9ybXMgPSBSZS5Vbmlmb3Jtc1V0aWxzLm1lcmdlKFtSZS5Vbmlmb3Jtc0xpYi5mb2csIHRoaXMudW5pZm9ybXNdKSksIHRoaXMubWF0ZXJpYWwgPSBuZXcgUmUuU2hhZGVyTWF0ZXJpYWwoeyB1bmlmb3JtczogdGhpcy51bmlmb3JtcywgdmVydGV4U2hhZGVyOiB0aGlzLnZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXI6IHRoaXMuZnJhZ21lbnRTaGFkZXIsIGZvZzogdHJ1ZSB9KSwgdGhpcy5tYXRlcmlhbDsKICB9IH0pLCBpYSgibXNkZiIsIHsgc2NoZW1hOiB7IGFscGhhVGVzdDogeyB0eXBlOiAibnVtYmVyIiwgaXM6ICJ1bmlmb3JtIiwgZGVmYXVsdDogMC41IH0sIGNvbG9yOiB7IHR5cGU6ICJjb2xvciIsIGlzOiAidW5pZm9ybSIsIGRlZmF1bHQ6ICJ3aGl0ZSIgfSwgbWFwOiB7IHR5cGU6ICJtYXAiLCBpczogInVuaWZvcm0iIH0sIG5lZ2F0ZTogeyB0eXBlOiAiYm9vbGVhbiIsIGlzOiAidW5pZm9ybSIsIGRlZmF1bHQ6IHRydWUgfSwgb3BhY2l0eTogeyB0eXBlOiAibnVtYmVyIiwgaXM6ICJ1bmlmb3JtIiwgZGVmYXVsdDogMSB9IH0sIHZlcnRleFNoYWRlcjogWyIjaW5jbHVkZSA8Y29tbW9uPiIsICIjaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PiIsICIjaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+IiwgIm91dCB2ZWMyIHZVVjsiLCAidm9pZCBtYWluKHZvaWQpIHsiLCAiICB2VVYgPSB1djsiLCAiICAjaW5jbHVkZSA8YmVnaW5fdmVydGV4PiIsICIgICNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4iLCAiICAjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PiIsICIgICNpbmNsdWRlIDxmb2dfdmVydGV4PiIsICJ9Il0uam9pbihgCmApLCBmcmFnbWVudFNoYWRlcjogWyIjaW5jbHVkZSA8Y29tbW9uPiIsICIjaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+IiwgIiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PiIsICJ1bmlmb3JtIGJvb2wgbmVnYXRlOyIsICJ1bmlmb3JtIGZsb2F0IGFscGhhVGVzdDsiLCAidW5pZm9ybSBmbG9hdCBvcGFjaXR5OyIsICJ1bmlmb3JtIHNhbXBsZXIyRCBtYXA7IiwgInVuaWZvcm0gdmVjMyBjb2xvcjsiLCAiaW4gdmVjMiB2VVY7IiwgImZsb2F0IG1lZGlhbihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKSB7IiwgIiAgcmV0dXJuIG1heChtaW4ociwgZyksIG1pbihtYXgociwgZyksIGIpKTsiLCAifSIsICIjZGVmaW5lIEJJR19FTk9VR0ggMC4wMDEiLCAiI2RlZmluZSBNT0RJRklFRF9BTFBIQVRFU1QgKDAuMDIgKiBpc0JpZ0Vub3VnaCAvIEJJR19FTk9VR0gpIiwgInZvaWQgbWFpbigpIHsiLCAiICB2ZWMzIHNhbXBsZUNvbG9yID0gdGV4dHVyZShtYXAsIHZVVikucmdiOyIsICIgIGlmIChuZWdhdGUpIHsgc2FtcGxlQ29sb3IgPSAxLjAgLSBzYW1wbGVDb2xvcjsgfSIsICIgIGZsb2F0IHNpZ0Rpc3QgPSBtZWRpYW4oc2FtcGxlQ29sb3Iuciwgc2FtcGxlQ29sb3IuZywgc2FtcGxlQ29sb3IuYikgLSAwLjU7IiwgIiAgZmxvYXQgYWxwaGEgPSBjbGFtcChzaWdEaXN0IC8gZndpZHRoKHNpZ0Rpc3QpICsgMC41LCAwLjAsIDEuMCk7IiwgIiAgZmxvYXQgZHNjYWxlID0gMC4zNTM1MDU7IiwgIiAgdmVjMiBkdXYgPSBkc2NhbGUgKiAoZEZkeCh2VVYpICsgZEZkeSh2VVYpKTsiLCAiICBmbG9hdCBpc0JpZ0Vub3VnaCA9IG1heChhYnMoZHV2LngpLCBhYnMoZHV2LnkpKTsiLCAiICAvLyBEbyBtb2RpZmllZCBhbHBoYSB0ZXN0LiIsICIgIGlmIChpc0JpZ0Vub3VnaCA+IEJJR19FTk9VR0gpIHsiLCAiICAgIGZsb2F0IHJhdGlvID0gQklHX0VOT1VHSCAvIGlzQmlnRW5vdWdoOyIsICIgICAgYWxwaGEgPSByYXRpbyAqIGFscGhhICsgKDEuMCAtIHJhdGlvKSAqIChzaWdEaXN0ICsgMC41KTsiLCAiICB9IiwgIiAgLy8gRG8gbW9kaWZpZWQgYWxwaGEgdGVzdC4iLCAiICBpZiAoYWxwaGEgPCBhbHBoYVRlc3QgKiBNT0RJRklFRF9BTFBIQVRFU1QpIHsgZGlzY2FyZDsgcmV0dXJuOyB9IiwgIiAgZ2xfRnJhZ0NvbG9yID0gdmVjNChjb2xvci54eXosIGFscGhhICogb3BhY2l0eSk7IiwgIiAgI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PiIsICIgICNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4iLCAiICAjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4iLCAiICAjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PiIsICJ9Il0uam9pbihgCmApLCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnVuaWZvcm1zID0gdGhpcy5pbml0VW5pZm9ybXMoKSwgUmUuVW5pZm9ybXNVdGlscyAmJiAodGhpcy51bmlmb3JtcyA9IFJlLlVuaWZvcm1zVXRpbHMubWVyZ2UoW1JlLlVuaWZvcm1zTGliLmZvZywgdGhpcy51bmlmb3Jtc10pKSwgdGhpcy5tYXRlcmlhbCA9IG5ldyBSZS5TaGFkZXJNYXRlcmlhbCh7IHVuaWZvcm1zOiB0aGlzLnVuaWZvcm1zLCB2ZXJ0ZXhTaGFkZXI6IHRoaXMudmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlcjogdGhpcy5mcmFnbWVudFNoYWRlciwgZm9nOiB0cnVlIH0pLCB0aGlzLm1hdGVyaWFsOwogIH0gfSksIGlhKCJzaGFkb3ciLCB7IHNjaGVtYTogeyBvcGFjaXR5OiB7IGRlZmF1bHQ6IDAuNSB9LCB0cmFuc3BhcmVudDogeyBkZWZhdWx0OiB0cnVlIH0sIGFscGhhVG9Db3ZlcmFnZTogeyBkZWZhdWx0OiB0cnVlIH0gfSwgaW5pdDogZnVuY3Rpb24oZSkgewogICAgdGhpcy5tYXRlcmlhbCA9IG5ldyBSZS5TaGFkb3dNYXRlcmlhbDsKICB9LCB1cGRhdGU6IGZ1bmN0aW9uKGUpIHsKICAgIHRoaXMubWF0ZXJpYWwub3BhY2l0eSA9IGUub3BhY2l0eSwgdGhpcy5tYXRlcmlhbC5hbHBoYVRvQ292ZXJhZ2UgPSBlLmFscGhhVG9Db3ZlcmFnZSwgdGhpcy5tYXRlcmlhbC50cmFuc3BhcmVudCA9IGUudHJhbnNwYXJlbnQ7CiAgfSB9KTsKICBFcygiY2FtZXJhIiwgeyBpbml0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuYWN0aXZlQ2FtZXJhRWwgPSBudWxsLCB0aGlzLnJlbmRlciA9IHRoaXMucmVuZGVyLmJpbmQodGhpcyksIHRoaXMudW53cmFwUmVuZGVyID0gdGhpcy51bndyYXBSZW5kZXIuYmluZCh0aGlzKSwgdGhpcy53cmFwUmVuZGVyID0gdGhpcy53cmFwUmVuZGVyLmJpbmQodGhpcyksIHRoaXMuaW5pdGlhbENhbWVyYUZvdW5kID0gZmFsc2UsIHRoaXMubnVtVXNlckNhbWVyYXMgPSAwLCB0aGlzLm51bVVzZXJDYW1lcmFzQ2hlY2tlZCA9IDAsIHRoaXMuc2V0dXBJbml0aWFsQ2FtZXJhKCk7CiAgfSwgc2V0dXBJbml0aWFsQ2FtZXJhOiBmdW5jdGlvbigpIHsKICAgIHZhciBlLCB0MiwgbjIgPSB0aGlzLnNjZW5lRWwsIGkyID0gdGhpczsKICAgIGlmICghbjIuY2FtZXJhIHx8IG4yLmNhbWVyYS5lbC5nZXRBdHRyaWJ1dGUoImNhbWVyYSIpLnNwZWN0YXRvcikKICAgICAgaWYgKChlID0gbjIucXVlcnlTZWxlY3RvckFsbCgiYS1jYW1lcmEsIDpub3QoYS1taXhpbilbY2FtZXJhXSIpKS5sZW5ndGgpCiAgICAgICAgZm9yICh0aGlzLm51bVVzZXJDYW1lcmFzID0gZS5sZW5ndGgsIHQyID0gMDt0MiA8IGUubGVuZ3RoOyB0MisrKQogICAgICAgICAgZVt0Ml0uYWRkRXZlbnRMaXN0ZW5lcigib2JqZWN0M2RzZXQiLCBmdW5jdGlvbihlMikgewogICAgICAgICAgICBlMi5kZXRhaWwudHlwZSA9PT0gImNhbWVyYSIgJiYgaTIuY2hlY2tVc2VyQ2FtZXJhKHRoaXMpOwogICAgICAgICAgfSksIGVbdDJdLmlzQU5vZGUgPyBlW3QyXS5sb2FkKCkgOiBlW3QyXS5hZGRFdmVudExpc3RlbmVyKCJub2RlcmVhZHkiLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5sb2FkKCk7CiAgICAgICAgICB9KTsKICAgICAgZWxzZQogICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdENhbWVyYSgpOwogICAgZWxzZQogICAgICBuMi5lbWl0KCJjYW1lcmFyZWFkeSIsIHsgY2FtZXJhRWw6IG4yLmNhbWVyYS5lbCB9KTsKICB9LCBjaGVja1VzZXJDYW1lcmE6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjIgPSB0aGlzLmVsLnNjZW5lRWw7CiAgICB0aGlzLm51bVVzZXJDYW1lcmFzQ2hlY2tlZCsrLCB0aGlzLmluaXRpYWxDYW1lcmFGb3VuZCB8fCAoKHQyID0gZS5nZXRBdHRyaWJ1dGUoImNhbWVyYSIpKS5hY3RpdmUgJiYgIXQyLnNwZWN0YXRvciA/ICh0aGlzLmluaXRpYWxDYW1lcmFGb3VuZCA9IHRydWUsIG4yLmNhbWVyYSA9IGUuZ2V0T2JqZWN0M0QoImNhbWVyYSIpLCBuMi5lbWl0KCJjYW1lcmFyZWFkeSIsIHsgY2FtZXJhRWw6IGUgfSkpIDogdGhpcy5udW1Vc2VyQ2FtZXJhc0NoZWNrZWQgPT09IHRoaXMubnVtVXNlckNhbWVyYXMgJiYgdGhpcy5jcmVhdGVEZWZhdWx0Q2FtZXJhKCkpOwogIH0sIGNyZWF0ZURlZmF1bHRDYW1lcmE6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyID0gdGhpcy5zY2VuZUVsOwogICAgKGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhLWVudGl0eSIpKS5zZXRBdHRyaWJ1dGUoImNhbWVyYSIsIHsgYWN0aXZlOiB0cnVlIH0pLCBlLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCB7IHg6IDAsIHk6IDEuNiwgejogMCB9KSwgZS5zZXRBdHRyaWJ1dGUoIndhc2QtY29udHJvbHMiLCAiIiksIGUuc2V0QXR0cmlidXRlKCJsb29rLWNvbnRyb2xzIiwgIiIpLCBlLnNldEF0dHJpYnV0ZShoaSwgIiIpLCBlLmFkZEV2ZW50TGlzdGVuZXIoIm9iamVjdDNkc2V0IiwgZnVuY3Rpb24objIpIHsKICAgICAgbjIuZGV0YWlsLnR5cGUgPT09ICJjYW1lcmEiICYmICh0Mi5jYW1lcmEgPSBuMi5kZXRhaWwub2JqZWN0LCB0Mi5lbWl0KCJjYW1lcmFyZWFkeSIsIHsgY2FtZXJhRWw6IGUgfSkpOwogICAgfSksIHQyLmFwcGVuZENoaWxkKGUpOwogIH0sIGRpc2FibGVBY3RpdmVDYW1lcmE6IGZ1bmN0aW9uKCkgewogICAgdmFyIGU7CiAgICAoZSA9IHRoaXMuc2NlbmVFbC5xdWVyeVNlbGVjdG9yQWxsKCI6bm90KGEtbWl4aW4pW2NhbWVyYV0iKSlbZS5sZW5ndGggLSAxXS5zZXRBdHRyaWJ1dGUoImNhbWVyYSIsICJhY3RpdmUiLCB0cnVlKTsKICB9LCBzZXRBY3RpdmVDYW1lcmE6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjIsIGkyLCByMiwgbzIgPSB0aGlzLmFjdGl2ZUNhbWVyYUVsLCBzMiA9IHRoaXMuc2NlbmVFbDsKICAgIGlmICgocjIgPSBlLmdldE9iamVjdDNEKCJjYW1lcmEiKSkgJiYgZSAhPT0gdGhpcy5hY3RpdmVDYW1lcmFFbCkgewogICAgICB2YXIgYTIgPSBzMi5xdWVyeVNlbGVjdG9yKCJbIiArIEVjICsgIl0iKTsKICAgICAgZm9yIChlICE9PSAoYTIgJiYgYTIucXVlcnlTZWxlY3RvcigiOm5vdChhLW1peGluKVtjYW1lcmFdIikpICYmIGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgdmFyIHQzOwogICAgICAgIGUyLmNhbWVyYSAmJiAodDMgPSBlMi5xdWVyeVNlbGVjdG9yKCJbIiArIEVjICsgIl0iKSkgJiYgZTIucmVtb3ZlQ2hpbGQodDMpOwogICAgICB9KHMyKSwgdGhpcy5hY3RpdmVDYW1lcmFFbCA9IGUsIHRoaXMuYWN0aXZlQ2FtZXJhRWwucGxheSgpLCBzMi5jYW1lcmEgPSByMiwgbzIgJiYgbzIuc2V0QXR0cmlidXRlKCJjYW1lcmEiLCAiYWN0aXZlIiwgZmFsc2UpLCBuMiA9IHMyLnF1ZXJ5U2VsZWN0b3JBbGwoIjpub3QoYS1taXhpbilbY2FtZXJhXSIpLCBpMiA9IDA7aTIgPCBuMi5sZW5ndGg7IGkyKyspCiAgICAgICAgKHQyID0gbjJbaTJdKS5pc0VudGl0eSAmJiBlICE9PSB0MiAmJiAodDIuc2V0QXR0cmlidXRlKCJjYW1lcmEiLCAiYWN0aXZlIiwgZmFsc2UpLCB0Mi5wYXVzZSgpKTsKICAgICAgczIuZW1pdCgiY2FtZXJhLXNldC1hY3RpdmUiLCB7IGNhbWVyYUVsOiBlIH0pOwogICAgfQogIH0sIHNldFNwZWN0YXRvckNhbWVyYTogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiA9IHRoaXMuc3BlY3RhdG9yQ2FtZXJhRWwsIGkyID0gdGhpcy5zY2VuZUVsOwogICAgZS5nZXRPYmplY3QzRCgiY2FtZXJhIikgJiYgZSAhPT0gdGhpcy5zcGVjdGF0b3JDYW1lcmFFbCAmJiAobjIgJiYgbjIuc2V0QXR0cmlidXRlKCJjYW1lcmEiLCAic3BlY3RhdG9yIiwgZmFsc2UpLCB0MiA9IHRoaXMuc3BlY3RhdG9yQ2FtZXJhRWwgPSBlLCBpMi5hZGRFdmVudExpc3RlbmVyKCJlbnRlci12ciIsIHRoaXMud3JhcFJlbmRlciksIGkyLmFkZEV2ZW50TGlzdGVuZXIoImV4aXQtdnIiLCB0aGlzLnVud3JhcFJlbmRlciksIHQyLnNldEF0dHJpYnV0ZSgiY2FtZXJhIiwgImFjdGl2ZSIsIGZhbHNlKSwgdDIucGxheSgpLCBpMi5lbWl0KCJjYW1lcmEtc2V0LXNwZWN0YXRvciIsIHsgY2FtZXJhRWw6IGUgfSkpOwogIH0sIGRpc2FibGVTcGVjdGF0b3JDYW1lcmE6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zcGVjdGF0b3JDYW1lcmFFbCA9IHVuZGVmaW5lZDsKICB9LCB3cmFwUmVuZGVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuc3BlY3RhdG9yQ2FtZXJhRWwgJiYgIXRoaXMub3JpZ2luYWxSZW5kZXIgJiYgKHRoaXMub3JpZ2luYWxSZW5kZXIgPSB0aGlzLnNjZW5lRWwucmVuZGVyZXIucmVuZGVyLCB0aGlzLnNjZW5lRWwucmVuZGVyZXIucmVuZGVyID0gdGhpcy5yZW5kZXIpOwogIH0sIHVud3JhcFJlbmRlcjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLm9yaWdpbmFsUmVuZGVyICYmICh0aGlzLnNjZW5lRWwucmVuZGVyZXIucmVuZGVyID0gdGhpcy5vcmlnaW5hbFJlbmRlciwgdGhpcy5vcmlnaW5hbFJlbmRlciA9IHVuZGVmaW5lZCk7CiAgfSwgcmVuZGVyOiBmdW5jdGlvbihlLCB0MikgewogICAgdmFyIG4yLCBpMiwgcjIgPSB0aGlzLnNjZW5lRWw7CiAgICBuMiA9IHIyLnJlbmRlcmVyLnhyLmVuYWJsZWQsIHRoaXMub3JpZ2luYWxSZW5kZXIuY2FsbChyMi5yZW5kZXJlciwgZSwgdDIpLCB0aGlzLnNwZWN0YXRvckNhbWVyYUVsICYmICFyMi5pc01vYmlsZSAmJiBuMiAmJiAoaTIgPSB0aGlzLnNwZWN0YXRvckNhbWVyYUVsLmNvbXBvbmVudHMuY2FtZXJhLmNhbWVyYSwgcjIucmVuZGVyZXIueHIuZW5hYmxlZCA9IGZhbHNlLCB0aGlzLm9yaWdpbmFsUmVuZGVyLmNhbGwocjIucmVuZGVyZXIsIGUsIGkyKSwgcjIucmVuZGVyZXIueHIuZW5hYmxlZCA9IG4yKTsKICB9IH0pLCBFcygiZ2VvbWV0cnkiLCB7IGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jYWNoZSA9IHt9LCB0aGlzLmNhY2hlQ291bnQgPSB7fTsKICB9LCBjbGVhckNhY2hlOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2FjaGUgPSB7fSwgdGhpcy5jYWNoZUNvdW50ID0ge307CiAgfSwgZ2V0T3JDcmVhdGVHZW9tZXRyeTogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiwgaTIgPSB0aGlzLmNhY2hlOwogICAgcmV0dXJuIGUuc2tpcENhY2hlID8gQ2MoZSkgOiAodDIgPSBpMltuMiA9IHRoaXMuaGFzaChlKV0sIGZ1bmN0aW9uKGUyLCB0MykgewogICAgICBlMlt0M10gPSBlMlt0M10gPT09IHVuZGVmaW5lZCA/IDEgOiBlMlt0M10gKyAxOwogICAgfSh0aGlzLmNhY2hlQ291bnQsIG4yKSwgdDIgfHwgKHQyID0gQ2MoZSksIGkyW24yXSA9IHQyLCB0MikpOwogIH0sIHVudXNlR2VvbWV0cnk6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiwgbjIgPSB0aGlzLmNhY2hlLCBpMiA9IHRoaXMuY2FjaGVDb3VudDsKICAgIGUuc2tpcENhY2hlIHx8IG4yW3QyID0gdGhpcy5oYXNoKGUpXSAmJiAoZnVuY3Rpb24oZTIsIHQzKSB7CiAgICAgIGUyW3QzXS0tOwogICAgfShpMiwgdDIpLCBpMlt0Ml0gPiAwIHx8IChuMlt0Ml0uZGlzcG9zZSgpLCBkZWxldGUgbjJbdDJdLCBkZWxldGUgaTJbdDJdKSk7CiAgfSwgaGFzaDogZnVuY3Rpb24oZSkgewogICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpOwogIH0gfSksIEVzKCJnbHRmLW1vZGVsIiwgeyBzY2hlbWE6IHsgZHJhY29EZWNvZGVyUGF0aDogeyBkZWZhdWx0OiAiaHR0cHM6Ly93d3cuZ3N0YXRpYy5jb20vZHJhY28vdmVyc2lvbmVkL2RlY29kZXJzLzEuNS43LyIgfSwgYmFzaXNUcmFuc2NvZGVyUGF0aDogeyBkZWZhdWx0OiAiIiB9LCBtZXNob3B0RGVjb2RlclBhdGg6IHsgZGVmYXVsdDogIiIgfSB9LCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMudXBkYXRlKCk7CiAgfSwgdXBkYXRlOiBmdW5jdGlvbigpIHsKICAgIHZhciBlID0gdGhpcy5kYXRhLmRyYWNvRGVjb2RlclBhdGgsIHQyID0gdGhpcy5kYXRhLmJhc2lzVHJhbnNjb2RlclBhdGgsIG4yID0gdGhpcy5kYXRhLm1lc2hvcHREZWNvZGVyUGF0aDsKICAgICF0aGlzLmRyYWNvTG9hZGVyICYmIGUgJiYgKHRoaXMuZHJhY29Mb2FkZXIgPSBuZXcgVWUsIHRoaXMuZHJhY29Mb2FkZXIuc2V0RGVjb2RlclBhdGgoZSkpLCAhdGhpcy5rdHgyTG9hZGVyICYmIHQyICYmICh0aGlzLmt0eDJMb2FkZXIgPSBuZXcgQm4sIHRoaXMua3R4MkxvYWRlci5zZXRUcmFuc2NvZGVyUGF0aCh0MikuZGV0ZWN0U3VwcG9ydCh0aGlzLmVsLnJlbmRlcmVyKSksICF0aGlzLm1lc2hvcHREZWNvZGVyICYmIG4yICYmICh0aGlzLm1lc2hvcHREZWNvZGVyID0gZnVuY3Rpb24oZTIpIHsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQzLCBuMykgewogICAgICAgIHZhciBpMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaTIpLCBpMi5vbmxvYWQgPSB0MywgaTIub25lcnJvciA9IG4zLCBpMi5hc3luYyA9IHRydWUsIGkyLnNyYyA9IGUyOwogICAgICB9KTsKICAgIH0objIpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB3aW5kb3cuTWVzaG9wdERlY29kZXIucmVhZHk7CiAgICB9KS50aGVuKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gd2luZG93Lk1lc2hvcHREZWNvZGVyOwogICAgfSkpOwogIH0sIGdldERSQUNPTG9hZGVyOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmRyYWNvTG9hZGVyOwogIH0sIGdldEtUWDJMb2FkZXI6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMua3R4MkxvYWRlcjsKICB9LCBnZXRNZXNob3B0RGVjb2RlcjogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5tZXNob3B0RGVjb2RlcjsKICB9IH0pOwogIEJjID0gKEVzKCJsaWdodCIsIHsgc2NoZW1hOiB7IGRlZmF1bHRMaWdodHNFbmFibGVkOiB7IGRlZmF1bHQ6IHRydWUgfSB9LCBpbml0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZGVmYXVsdExpZ2h0cyA9IGZhbHNlLCB0aGlzLnVzZXJEZWZpbmVkTGlnaHRzID0gZmFsc2UsIHRoaXMuc2NlbmVFbC5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWQiLCB0aGlzLnNldHVwRGVmYXVsdExpZ2h0cy5iaW5kKHRoaXMpKTsKICB9LCByZWdpc3RlckxpZ2h0OiBmdW5jdGlvbihlKSB7CiAgICBlLmhhc0F0dHJpYnV0ZSh2YykgfHwgKHRoaXMucmVtb3ZlRGVmYXVsdExpZ2h0cygpLCB0aGlzLnVzZXJEZWZpbmVkTGlnaHRzID0gdHJ1ZSk7CiAgfSwgcmVtb3ZlRGVmYXVsdExpZ2h0czogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSwgdDIgPSB0aGlzLnNjZW5lRWw7CiAgICBpZiAodGhpcy5kZWZhdWx0TGlnaHRzKSB7CiAgICAgIGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbIiArIHZjICsgIl0iKTsKICAgICAgZm9yICh2YXIgbjIgPSAwO24yIDwgZS5sZW5ndGg7IG4yKyspCiAgICAgICAgdDIucmVtb3ZlQ2hpbGQoZVtuMl0pOwogICAgICB0aGlzLmRlZmF1bHRMaWdodHMgPSBmYWxzZTsKICAgIH0KICB9LCBzZXR1cERlZmF1bHRMaWdodHM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUsIHQyLCBuMiA9IHRoaXMuc2NlbmVFbDsKICAgIHRoaXMudXNlckRlZmluZWRMaWdodHMgfHwgdGhpcy5kZWZhdWx0TGlnaHRzIHx8ICF0aGlzLmRhdGEuZGVmYXVsdExpZ2h0c0VuYWJsZWQgfHwgKChlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYS1lbnRpdHkiKSkuc2V0QXR0cmlidXRlKCJsaWdodCIsIHsgY29sb3I6ICIjQkJCIiwgdHlwZTogImFtYmllbnQiIH0pLCBlLnNldEF0dHJpYnV0ZSh2YywgIiIpLCBlLnNldEF0dHJpYnV0ZShoaSwgIiIpLCBuMi5hcHBlbmRDaGlsZChlKSwgKHQyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYS1lbnRpdHkiKSkuc2V0QXR0cmlidXRlKCJsaWdodCIsIHsgY29sb3I6ICIjRkZGIiwgaW50ZW5zaXR5OiAxLjg4NCwgY2FzdFNoYWRvdzogdHJ1ZSB9KSwgdDIuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsIHsgeDogLTAuNSwgeTogMSwgejogMSB9KSwgdDIuc2V0QXR0cmlidXRlKHZjLCAiIiksIHQyLnNldEF0dHJpYnV0ZShoaSwgIiIpLCBuMi5hcHBlbmRDaGlsZCh0MiksIHRoaXMuZGVmYXVsdExpZ2h0cyA9IHRydWUpOwogIH0gfSksIGZpKTsKICBiYyA9IEJjKCJjb21wb25lbnRzOnRleHR1cmU6ZXJyb3IiKTsKICB5YyA9IEJjKCJjb21wb25lbnRzOnRleHR1cmU6d2FybiIpOwogIEljID0gbmV3IFJlLkltYWdlTG9hZGVyOwogIEVzKCJtYXRlcmlhbCIsIHsgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1hdGVyaWFscyA9IHt9LCB0aGlzLnNvdXJjZUNhY2hlID0ge307CiAgfSwgY2xlYXJUZXh0dXJlU291cmNlQ2FjaGU6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zb3VyY2VDYWNoZSA9IHt9OwogIH0sIGxvYWRUZXh0dXJlOiBmdW5jdGlvbihlLCB0MiwgbjIpIHsKICAgIHRoaXMubG9hZFRleHR1cmVTb3VyY2UoZSwgZnVuY3Rpb24oZTIpIHsKICAgICAgdmFyIGkyID0geHIoZTIpOwogICAgICBFcihpMiwgdDIpLCBuMihpMik7CiAgICB9KTsKICB9LCBsb2FkVGV4dHVyZVNvdXJjZTogZnVuY3Rpb24oZSwgdDIpIHsKICAgIHZhciBuMiA9IHRoaXMsIGkyID0gdGhpcy5zb3VyY2VDYWNoZSwgcjIgPSB0aGlzLmhhc2goZSk7CiAgICBmdW5jdGlvbiBvMihlMikgewogICAgICBpMltyMl0gPSBQcm9taXNlLnJlc29sdmUoZTIpLCBpMltyMl0udGhlbih0Mik7CiAgICB9CiAgICBpMltyMl0gPyBpMltyMl0udGhlbih0MikgOiBlLnRhZ05hbWUgIT09ICJDQU5WQVMiID8gbzIobmV3IFByb21pc2UoZnVuY3Rpb24odDMsIGkzKSB7CiAgICAgIGhyKGUsIGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgbjIubG9hZEltYWdlKGUyLCB0Myk7CiAgICAgIH0sIGZ1bmN0aW9uKGUyKSB7CiAgICAgICAgbjIubG9hZFZpZGVvKGUyLCB0Myk7CiAgICAgIH0pOwogICAgfSkpIDogbzIobmV3IFJlLlNvdXJjZShlKSk7CiAgfSwgbG9hZEN1YmVNYXBUZXh0dXJlOiBmdW5jdGlvbihlLCB0MikgewogICAgdmFyIG4yID0gdGhpcywgaTIgPSAwLCByMiA9IG5ldyBSZS5DdWJlVGV4dHVyZTsKICAgIGZ1bmN0aW9uIG8yKG8zKSB7CiAgICAgIG4yLmxvYWRUZXh0dXJlU291cmNlKGVbbzNdLCBmdW5jdGlvbihlMikgewogICAgICAgIHIyLmltYWdlc1tvM10gPSBlMi5kYXRhLCArK2kyID09IDYgJiYgKHIyLm5lZWRzVXBkYXRlID0gdHJ1ZSwgdDIocjIpKTsKICAgICAgfSk7CiAgICB9CiAgICBpZiAocjIuY29sb3JTcGFjZSA9IFJlLlNSR0JDb2xvclNwYWNlLCBlLmxlbmd0aCA9PT0gNikKICAgICAgZm9yICh2YXIgczIgPSAwO3MyIDwgZS5sZW5ndGg7IHMyKyspCiAgICAgICAgbzIoczIpOwogICAgZWxzZQogICAgICB5YygiQ3ViZSBtYXAgdGV4dHVyZSByZXF1aXJlcyBleGFjdGx5IDYgc291cmNlcywgZ290IG9ubHkgJXMgc291cmNlcyIsIGUubGVuZ3RoKTsKICB9LCBsb2FkSW1hZ2U6IGZ1bmN0aW9uKGUsIHQyKSB7CiAgICB0Mih0eXBlb2YgZSA9PSAic3RyaW5nIiA/IGZ1bmN0aW9uKGUyKSB7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0MywgbjIpIHsKICAgICAgICBJYy5sb2FkKGUyLCBmdW5jdGlvbihlMykgewogICAgICAgICAgdDMobmV3IFJlLlNvdXJjZShlMykpOwogICAgICAgIH0sIGZ1bmN0aW9uKCkge30sIGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgICBiYygiYCRzYCBjb3VsZCBub3QgYmUgZmV0Y2hlZCAoRXJyb3IgY29kZTogJXM7IFJlc3BvbnNlOiAlcykiLCBlMy5zdGF0dXMsIGUzLnN0YXR1c1RleHQpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0oZSkgOiBuZXcgUmUuU291cmNlKGUpKTsKICB9LCBsb2FkVmlkZW86IGZ1bmN0aW9uKGUsIHQyKSB7CiAgICB2YXIgbjI7CiAgICB0eXBlb2YgZSAhPSAic3RyaW5nIiAmJiBmdW5jdGlvbihlMikgewogICAgICBlMi5hdXRvcGxheSA9IGUyLmhhc0F0dHJpYnV0ZSgiYXV0b3BsYXkiKSAmJiBlMi5nZXRBdHRyaWJ1dGUoImF1dG9wbGF5IikgIT09ICJmYWxzZSIsIGUyLmNvbnRyb2xzID0gZTIuaGFzQXR0cmlidXRlKCJjb250cm9scyIpICYmIGUyLmdldEF0dHJpYnV0ZSgiY29udHJvbHMiKSAhPT0gImZhbHNlIiwgZTIuZ2V0QXR0cmlidXRlKCJsb29wIikgPT09ICJmYWxzZSIgJiYgZTIucmVtb3ZlQXR0cmlidXRlKCJsb29wIiksIGUyLmdldEF0dHJpYnV0ZSgicHJlbG9hZCIpID09PSAiZmFsc2UiICYmIChlMi5wcmVsb2FkID0gIm5vbmUiKSwgZTIuY3Jvc3NPcmlnaW4gPSBlMi5jcm9zc09yaWdpbiB8fCAiYW5vbnltb3VzIiwgZTIuc2V0QXR0cmlidXRlKCJwbGF5c2lubGluZSIsICIiKSwgZTIuc2V0QXR0cmlidXRlKCJ3ZWJraXQtcGxheXNpbmxpbmUiLCAiIik7CiAgICB9KG4yID0gZSksIG4yID0gbjIgfHwgZnVuY3Rpb24oZTIpIHsKICAgICAgdmFyIHQzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTsKICAgICAgcmV0dXJuIHQzLnNldEF0dHJpYnV0ZSgicGxheXNpbmxpbmUiLCAiIiksIHQzLnNldEF0dHJpYnV0ZSgid2Via2l0LXBsYXlzaW5saW5lIiwgIiIpLCB0My5hdXRvcGxheSA9IHRydWUsIHQzLmxvb3AgPSB0cnVlLCB0My5jcm9zc09yaWdpbiA9ICJhbm9ueW1vdXMiLCB0My5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsIGZ1bmN0aW9uKCkgewogICAgICAgIHljKCJgJXNgIGlzIG5vdCBhIHZhbGlkIHZpZGVvIiwgZTIpOwogICAgICB9LCB0cnVlKSwgdDMuc3JjID0gZTIsIHQzOwogICAgfShlKSwgdDIobmV3IFJlLlNvdXJjZShuMikpOwogIH0sIGhhc2g6IGZ1bmN0aW9uKGUpIHsKICAgIHJldHVybiBlLnRhZ05hbWUgJiYgKGUuaWQgfHwgZS5zcmMpIHx8IGU7CiAgfSwgcmVnaXN0ZXJNYXRlcmlhbDogZnVuY3Rpb24oZSkgewogICAgdGhpcy5tYXRlcmlhbHNbZS51dWlkXSA9IGU7CiAgfSwgdW5yZWdpc3Rlck1hdGVyaWFsOiBmdW5jdGlvbihlKSB7CiAgICBkZWxldGUgdGhpcy5tYXRlcmlhbHNbZS51dWlkXTsKICB9IH0pLCBFcygib2JiLWNvbGxpZGVyIiwgeyBzY2hlbWE6IHsgc2hvd0NvbGxpZGVyczogeyBkZWZhdWx0OiBmYWxzZSB9IH0sIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jb2xsaXNpb25zID0gW10sIHRoaXMuY29sbGlkZXJFbHMgPSBbXTsKICB9LCBhZGRDb2xsaWRlcjogZnVuY3Rpb24oZSkgewogICAgdGhpcy5jb2xsaWRlckVscy5wdXNoKGUpLCB0aGlzLmRhdGEuc2hvd0NvbGxpZGVycyA/IGUuY29tcG9uZW50c1sib2JiLWNvbGxpZGVyIl0uc2hvd0NvbGxpZGVyKCkgOiBlLmNvbXBvbmVudHNbIm9iYi1jb2xsaWRlciJdLmhpZGVDb2xsaWRlcigpLCB0aGlzLnRpY2sgPSB0aGlzLmRldGVjdENvbGxpc2lvbnM7CiAgfSwgcmVtb3ZlQ29sbGlkZXI6IGZ1bmN0aW9uKGUpIHsKICAgIHZhciB0MiA9IHRoaXMuY29sbGlkZXJFbHMsIG4yID0gdDIuaW5kZXhPZihlKTsKICAgIGUuY29tcG9uZW50c1sib2JiLWNvbGxpZGVyIl0uaGlkZUNvbGxpZGVyKCksIG4yID4gLTEgJiYgdDIuc3BsaWNlKG4yLCAxKSwgdDIubGVuZ3RoID09PSAwICYmICh0aGlzLnRpY2sgPSB1bmRlZmluZWQpOwogIH0sIHJlZ2lzdGVyQ29sbGlzaW9uOiBmdW5jdGlvbihlLCB0MikgewogICAgdmFyIG4yID0gdGhpcy5jb2xsaXNpb25zLCBpMiA9IGZhbHNlLCByMiA9IGUub2JiLCBvMiA9IHQyLm9iYiwgczIgPSBlLnJlbmRlckNvbGxpZGVyTWVzaCwgYTIgPSB0Mi5yZW5kZXJDb2xsaWRlck1lc2g7CiAgICBzMiAmJiBzMi5tYXRlcmlhbC5jb2xvci5zZXQoMTY3MTE2ODApLCBhMiAmJiBhMi5tYXRlcmlhbC5jb2xvci5zZXQoMTY3MTE2ODApOwogICAgZm9yICh2YXIgQTIgPSAwO0EyIDwgbjIubGVuZ3RoOyBBMisrKQogICAgICBpZiAobjJbQTJdLmNvbXBvbmVudEEub2JiID09PSByMiAmJiBuMltBMl0uY29tcG9uZW50Qi5vYmIgPT09IG8yIHx8IG4yW0EyXS5jb21wb25lbnRBLm9iYiA9PT0gbzIgJiYgbjJbQTJdLmNvbXBvbmVudEIub2JiID09PSByMikgewogICAgICAgIGkyID0gdHJ1ZSwgbjJbQTJdLmRldGVjdGVkID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgaTIgfHwgKG4yLnB1c2goeyBjb21wb25lbnRBOiBlLCBjb21wb25lbnRCOiB0MiwgZGV0ZWN0ZWQ6IHRydWUgfSksIGUuZWwuZW1pdCgib2JiY29sbGlzaW9uc3RhcnRlZCIsIHsgdHJhY2tlZE9iamVjdDNEOiBlLnRyYWNrZWRPYmplY3QzRCwgd2l0aEVsOiB0Mi5lbCB9KSwgdDIuZWwuZW1pdCgib2JiY29sbGlzaW9uc3RhcnRlZCIsIHsgdHJhY2tlZE9iamVjdDNEOiB0Mi50cmFja2VkT2JqZWN0M0QsIHdpdGhFbDogZS5lbCB9KSk7CiAgfSwgcmVzZXRDb2xsaXNpb25zOiBmdW5jdGlvbigpIHsKICAgIGZvciAodmFyIGUgPSB0aGlzLmNvbGxpc2lvbnMsIHQyID0gMDt0MiA8IGUubGVuZ3RoOyB0MisrKQogICAgICBlW3QyXS5kZXRlY3RlZCA9IGZhbHNlOwogIH0sIGNsZWFyQ29sbGlzaW9uczogZnVuY3Rpb24oKSB7CiAgICBmb3IgKHZhciBlLCB0MiwgbjIsIGkyLCByMiA9IHRoaXMuY29sbGlzaW9ucywgbzIgPSBbXSwgczIgPSAwO3MyIDwgcjIubGVuZ3RoOyBzMisrKQogICAgICByMltzMl0uZGV0ZWN0ZWQgPyBvMi5wdXNoKHIyW3MyXSkgOiAoZSA9IHIyW3MyXS5jb21wb25lbnRBLCB0MiA9IHIyW3MyXS5jb21wb25lbnRCLCBuMiA9IGUucmVuZGVyQ29sbGlkZXJNZXNoLCBpMiA9IHQyLnJlbmRlckNvbGxpZGVyTWVzaCwgbjIgJiYgbjIubWF0ZXJpYWwuY29sb3Iuc2V0KDY1MjgwKSwgZS5lbC5lbWl0KCJvYmJjb2xsaXNpb25lbmRlZCIsIHsgdHJhY2tlZE9iamVjdDNEOiB0aGlzLnRyYWNrZWRPYmplY3QzRCwgd2l0aEVsOiB0Mi5lbCB9KSwgaTIgJiYgaTIubWF0ZXJpYWwuY29sb3Iuc2V0KDY1MjgwKSwgdDIuZWwuZW1pdCgib2JiY29sbGlzaW9uZW5kZWQiLCB7IHRyYWNrZWRPYmplY3QzRDogdGhpcy50cmFja2VkT2JqZWN0M0QsIHdpdGhFbDogZS5lbCB9KSk7CiAgICB0aGlzLmNvbGxpc2lvbnMgPSBvMjsKICB9LCBkZXRlY3RDb2xsaXNpb25zOiBmdW5jdGlvbigpIHsKICAgIHZhciBlLCB0MiwgbjIsIGkyLCByMiA9IHRoaXMuY29sbGlkZXJFbHM7CiAgICBpZiAoIShyMi5sZW5ndGggPCAyKSkgewogICAgICB0aGlzLnJlc2V0Q29sbGlzaW9ucygpOwogICAgICBmb3IgKHZhciBvMiA9IDA7bzIgPCByMi5sZW5ndGg7IG8yKyspCiAgICAgICAgaWYgKG4yID0gcjJbbzJdLmNvbXBvbmVudHNbIm9iYi1jb2xsaWRlciJdLCAoZSA9IHIyW28yXS5jb21wb25lbnRzWyJvYmItY29sbGlkZXIiXS5vYmIpLmhhbGZTaXplLnggIT09IDAgJiYgZS5oYWxmU2l6ZS55ICE9PSAwICYmIGUuaGFsZlNpemUueiAhPT0gMCkKICAgICAgICAgIGZvciAodmFyIHMyID0gbzIgKyAxO3MyIDwgcjIubGVuZ3RoOyBzMisrKQogICAgICAgICAgICAodDIgPSAoaTIgPSByMltzMl0uY29tcG9uZW50c1sib2JiLWNvbGxpZGVyIl0pLm9iYikuaGFsZlNpemUueCAhPT0gMCAmJiB0Mi5oYWxmU2l6ZS55ICE9PSAwICYmIHQyLmhhbGZTaXplLnogIT09IDAgJiYgZS5pbnRlcnNlY3RzT0JCKHQyKSAmJiB0aGlzLnJlZ2lzdGVyQ29sbGlzaW9uKG4yLCBpMik7CiAgICAgIHRoaXMuY2xlYXJDb2xsaXNpb25zKCk7CiAgICB9CiAgfSB9KTsKICB3YyA9IGZpKCJjb21wb25lbnRzOnJlbmRlcmVyOndhcm4iKTsKICBFcygicmVuZGVyZXIiLCB7IHNjaGVtYTogeyBhbnRpYWxpYXM6IHsgZGVmYXVsdDogImF1dG8iLCBvbmVPZjogWyJ0cnVlIiwgImZhbHNlIiwgImF1dG8iXSB9LCBoaWdoUmVmcmVzaFJhdGU6IHsgZGVmYXVsdDogVWkoKSB9LCBsb2dhcml0aG1pY0RlcHRoQnVmZmVyOiB7IGRlZmF1bHQ6ICJhdXRvIiwgb25lT2Y6IFsidHJ1ZSIsICJmYWxzZSIsICJhdXRvIl0gfSwgbWF4Q2FudmFzV2lkdGg6IHsgZGVmYXVsdDogLTEgfSwgbWF4Q2FudmFzSGVpZ2h0OiB7IGRlZmF1bHQ6IC0xIH0sIG11bHRpdmlld1N0ZXJlbzogeyBkZWZhdWx0OiBmYWxzZSB9LCBleHBvc3VyZTogeyBkZWZhdWx0OiAxLCBpZjogeyB0b25lTWFwcGluZzogWyJBQ0VTRmlsbWljIiwgImxpbmVhciIsICJyZWluaGFyZCIsICJjaW5lb24iLCAiQWdYIiwgIm5ldXRyYWwiXSB9IH0sIHRvbmVNYXBwaW5nOiB7IGRlZmF1bHQ6ICJubyIsIG9uZU9mOiBbIm5vIiwgIkFDRVNGaWxtaWMiLCAibGluZWFyIiwgInJlaW5oYXJkIiwgImNpbmVvbiIsICJBZ1giLCAibmV1dHJhbCJdIH0sIHByZWNpc2lvbjogeyBkZWZhdWx0OiAiaGlnaCIsIG9uZU9mOiBbImhpZ2giLCAibWVkaXVtIiwgImxvdyJdIH0sIGFuaXNvdHJvcHk6IHsgZGVmYXVsdDogMSB9LCBzb3J0VHJhbnNwYXJlbnRPYmplY3RzOiB7IGRlZmF1bHQ6IGZhbHNlIH0sIGNvbG9yTWFuYWdlbWVudDogeyBkZWZhdWx0OiB0cnVlIH0sIGFscGhhOiB7IGRlZmF1bHQ6IHRydWUgfSwgc3RlbmNpbDogeyBkZWZhdWx0OiBmYWxzZSB9LCBmb3ZlYXRpb25MZXZlbDogeyBkZWZhdWx0OiAxIH0gfSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZGF0YSwgdDIgPSB0aGlzLmVsLCBuMiA9IHRoaXMuZGF0YS50b25lTWFwcGluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRoaXMuZGF0YS50b25lTWFwcGluZy5zbGljZSgxKSwgaTIgPSB0Mi5yZW5kZXJlcjsKICAgIGkyLnRvbmVNYXBwaW5nID0gUmVbbjIgKyAiVG9uZU1hcHBpbmciXSwgUmUuVGV4dHVyZS5ERUZBVUxUX0FOSVNPVFJPUFkgPSBlLmFuaXNvdHJvcHksIFJlLkNvbG9yTWFuYWdlbWVudC5lbmFibGVkID0gZS5jb2xvck1hbmFnZW1lbnQsIGkyLm91dHB1dENvbG9yU3BhY2UgPSBlLmNvbG9yTWFuYWdlbWVudCA/IFJlLlNSR0JDb2xvclNwYWNlIDogUmUuTGluZWFyU1JHQkNvbG9yU3BhY2UsIHQyLmhhc0F0dHJpYnV0ZSgiYW50aWFsaWFzIikgJiYgd2MoJ0NvbXBvbmVudCBgYW50aWFsaWFzYCBpcyBkZXByZWNhdGVkLiBVc2UgYHJlbmRlcmVyPSJhbnRpYWxpYXM6IHRydWUiYCBpbnN0ZWFkLicpLCB0Mi5oYXNBdHRyaWJ1dGUoImxvZ2FyaXRobWljRGVwdGhCdWZmZXIiKSAmJiB3YygnQ29tcG9uZW50IGBsb2dhcml0aG1pY0RlcHRoQnVmZmVyYCBpcyBkZXByZWNhdGVkLiBVc2UgYHJlbmRlcmVyPSJsb2dhcml0aG1pY0RlcHRoQnVmZmVyOiB0cnVlImAgaW5zdGVhZC4nKSwgaTIuc29ydE9iamVjdHMgPSB0cnVlLCBpMi5zZXRPcGFxdWVTb3J0KHhjKTsKICB9LCB1cGRhdGU6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmRhdGEsIHQyID0gdGhpcy5lbC5yZW5kZXJlciwgbjIgPSB0aGlzLmRhdGEudG9uZU1hcHBpbmcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0aGlzLmRhdGEudG9uZU1hcHBpbmcuc2xpY2UoMSk7CiAgICB0Mi50b25lTWFwcGluZyA9IFJlW24yICsgIlRvbmVNYXBwaW5nIl0sIHQyLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSBlLmV4cG9zdXJlLCB0Mi54ci5zZXRGb3ZlYXRpb24oZS5mb3ZlYXRpb25MZXZlbCksIGUuc29ydE9iamVjdHMgJiYgd2MoJ2Bzb3J0T2JqZWN0c2AgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC4gVXNlIGByZW5kZXJlcj0ic29ydFRyYW5zcGFyZW50T2JqZWN0czogdHJ1ZSJgIGluc3RlYWQuJyksIGUuc29ydFRyYW5zcGFyZW50T2JqZWN0cyA/IHQyLnNldFRyYW5zcGFyZW50U29ydChMYykgOiB0Mi5zZXRUcmFuc3BhcmVudFNvcnQoUWMpOwogIH0sIGFwcGx5Q29sb3JDb3JyZWN0aW9uOiBmdW5jdGlvbihlKSB7CiAgICB0aGlzLmRhdGEuY29sb3JNYW5hZ2VtZW50ICYmIGUgJiYgZS5pc1RleHR1cmUgJiYgZS5jb2xvclNwYWNlICE9PSBSZS5TUkdCQ29sb3JTcGFjZSAmJiAoZS5jb2xvclNwYWNlID0gUmUuU1JHQkNvbG9yU3BhY2UsIGUubmVlZHNVcGRhdGUgPSB0cnVlKTsKICB9LCBzZXRXZWJYUkZyYW1lUmF0ZTogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyLCBuMiA9IHRoaXMuZGF0YSwgaTIgPSBlLnN1cHBvcnRlZEZyYW1lUmF0ZXM7CiAgICBpMiAmJiBlLnVwZGF0ZVRhcmdldEZyYW1lUmF0ZSAmJiAodDIgPSBpMi5pbmNsdWRlcyg5MCkgPyBuMi5oaWdoUmVmcmVzaFJhdGUgPyA5MCA6IDcyIDogbjIuaGlnaFJlZnJlc2hSYXRlID8gNzIgOiA2MCwgZS51cGRhdGVUYXJnZXRGcmFtZVJhdGUodDIpLmNhdGNoKGZ1bmN0aW9uKGUyKSB7CiAgICAgIGNvbnNvbGUud2FybigiZmFpbGVkIHRvIHNldCB0YXJnZXQgZnJhbWUgcmF0ZSBvZiAiICsgdDIgKyAiLiBFcnJvciBpbmZvOiAiICsgZTIpOwogICAgfSkpOwogIH0gfSk7CiAgTWMgPSB7IGJhc2ljOiBSZS5CYXNpY1NoYWRvd01hcCwgcGNmOiBSZS5QQ0ZTaGFkb3dNYXAsIHBjZnNvZnQ6IFJlLlBDRlNvZnRTaGFkb3dNYXAgfTsKICBFcygic2hhZG93IiwgeyBzY2hlbWE6IHsgZW5hYmxlZDogeyBkZWZhdWx0OiB0cnVlIH0sIGF1dG9VcGRhdGU6IHsgZGVmYXVsdDogdHJ1ZSB9LCB0eXBlOiB7IGRlZmF1bHQ6ICJwY2YiLCBvbmVPZjogWyJiYXNpYyIsICJwY2YiLCAicGNmc29mdCJdIH0gfSwgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuc2NlbmVFbCwgdDIgPSB0aGlzLmRhdGE7CiAgICB0aGlzLnNoYWRvd01hcEVuYWJsZWQgPSBmYWxzZSwgZS5yZW5kZXJlci5zaGFkb3dNYXAudHlwZSA9IE1jW3QyLnR5cGVdLCBlLnJlbmRlcmVyLnNoYWRvd01hcC5hdXRvVXBkYXRlID0gdDIuYXV0b1VwZGF0ZTsKICB9LCB1cGRhdGU6IGZ1bmN0aW9uKGUpIHsKICAgIGUuZW5hYmxlZCAhPT0gdGhpcy5kYXRhLmVuYWJsZWQgJiYgdGhpcy5zZXRTaGFkb3dNYXBFbmFibGVkKHRoaXMuc2hhZG93TWFwRW5hYmxlZCk7CiAgfSwgc2V0U2hhZG93TWFwRW5hYmxlZDogZnVuY3Rpb24oZSkgewogICAgdmFyIHQyID0gdGhpcy5zY2VuZUVsLCBuMiA9IHRoaXMuc2NlbmVFbC5yZW5kZXJlcjsKICAgIHRoaXMuc2hhZG93TWFwRW5hYmxlZCA9IGU7CiAgICB2YXIgaTIgPSB0aGlzLmRhdGEuZW5hYmxlZCAmJiB0aGlzLnNoYWRvd01hcEVuYWJsZWQ7CiAgICBuMiAmJiBpMiAhPT0gbjIuc2hhZG93TWFwLmVuYWJsZWQgJiYgKG4yLnNoYWRvd01hcC5lbmFibGVkID0gaTIsIGZ1bmN0aW9uKGUyKSB7CiAgICAgIGUyLmhhc0xvYWRlZCAmJiBlMi5vYmplY3QzRC50cmF2ZXJzZShmdW5jdGlvbihlMykgewogICAgICAgIGlmIChlMy5tYXRlcmlhbCkKICAgICAgICAgIGZvciAodmFyIHQzID0gQXJyYXkuaXNBcnJheShlMy5tYXRlcmlhbCkgPyBlMy5tYXRlcmlhbCA6IFtlMy5tYXRlcmlhbF0sIG4zID0gMDtuMyA8IHQzLmxlbmd0aDsgbjMrKykKICAgICAgICAgICAgdDNbbjNdLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICAgfSk7CiAgICB9KHQyKSk7CiAgfSB9KSwgRXMoInRyYWNrZWQtY29udHJvbHMiLCB7IGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jb250cm9sbGVycyA9IFtdLCB0aGlzLm9uSW5wdXRTb3VyY2VzQ2hhbmdlID0gdGhpcy5vbklucHV0U291cmNlc0NoYW5nZS5iaW5kKHRoaXMpLCB0aGlzLm9uRW50ZXJWUiA9IHRoaXMub25FbnRlclZSLmJpbmQodGhpcyksIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigiZW50ZXItdnIiLCB0aGlzLm9uRW50ZXJWUiksIHRoaXMub25FeGl0VlIgPSB0aGlzLm9uRXhpdFZSLmJpbmQodGhpcyksIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcigiZXhpdC12ciIsIHRoaXMub25FeGl0VlIpOwogIH0sIG9uRW50ZXJWUjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmVsLnhyU2Vzc2lvbiAmJiB0aGlzLmVsLnhyU2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCJpbnB1dHNvdXJjZXNjaGFuZ2UiLCB0aGlzLm9uSW5wdXRTb3VyY2VzQ2hhbmdlKTsKICB9LCBvbkV4aXRWUjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlZmVyZW5jZVNwYWNlID0gdW5kZWZpbmVkLCB0aGlzLmNvbnRyb2xsZXJzID0gW10sIHRoaXMuZWwuZW1pdCgiY29udHJvbGxlcnN1cGRhdGVkIiwgdW5kZWZpbmVkLCBmYWxzZSk7CiAgfSwgb25JbnB1dFNvdXJjZXNDaGFuZ2U6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLCB0MiA9IHRoaXMuZWwueHJTZXNzaW9uLCBuMiA9IHRoaXMuZWwuc2NlbmVFbC5zeXN0ZW1zLndlYnhyLnNlc3Npb25SZWZlcmVuY2VTcGFjZVR5cGU7CiAgICB0Mi5yZXF1ZXN0UmVmZXJlbmNlU3BhY2UobjIpLnRoZW4oZnVuY3Rpb24odDMpIHsKICAgICAgZS5yZWZlcmVuY2VTcGFjZSA9IHQzOwogICAgfSkuY2F0Y2goZnVuY3Rpb24odDMpIHsKICAgICAgdGhyb3cgZS5lbC5zY2VuZUVsLnN5c3RlbXMud2VieHIud2FybklmRmVhdHVyZU5vdFJlcXVlc3RlZChuMiwgJ3RyYWNrZWQtY29udHJvbHMgdXNlcyByZWZlcmVuY2Ugc3BhY2UgIicgKyBuMiArICciLicpLCB0MzsKICAgIH0pLCB0aGlzLmNvbnRyb2xsZXJzID0gdDIuaW5wdXRTb3VyY2VzLCB0aGlzLmVsLmVtaXQoImNvbnRyb2xsZXJzdXBkYXRlZCIsIHVuZGVmaW5lZCwgZmFsc2UpOwogIH0gfSk7CiAgU2MgPSBmaSgic3lzdGVtczp3ZWJ4cjp3YXJuIik7CiAgRGMgPSAoRXMoIndlYnhyIiwgeyBzY2hlbWE6IHsgcmVmZXJlbmNlU3BhY2VUeXBlOiB7IHR5cGU6ICJzdHJpbmciLCBkZWZhdWx0OiAibG9jYWwtZmxvb3IiIH0sIHJlcXVpcmVkRmVhdHVyZXM6IHsgdHlwZTogImFycmF5IiwgZGVmYXVsdDogWyJsb2NhbC1mbG9vciJdIH0sIG9wdGlvbmFsRmVhdHVyZXM6IHsgdHlwZTogImFycmF5IiwgZGVmYXVsdDogWyJib3VuZGVkLWZsb29yIl0gfSwgb3ZlcmxheUVsZW1lbnQ6IHsgdHlwZTogInNlbGVjdG9yIiB9IH0sIHVwZGF0ZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IHRoaXMuZGF0YTsKICAgIHRoaXMuc2Vzc2lvbkNvbmZpZ3VyYXRpb24gPSB7IHJlcXVpcmVkRmVhdHVyZXM6IGUucmVxdWlyZWRGZWF0dXJlcywgb3B0aW9uYWxGZWF0dXJlczogZS5vcHRpb25hbEZlYXR1cmVzIH0sIHRoaXMuc2Vzc2lvblJlZmVyZW5jZVNwYWNlVHlwZSA9IGUucmVmZXJlbmNlU3BhY2VUeXBlLCBlLm92ZXJsYXlFbGVtZW50ICYmIChlLm92ZXJsYXlFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoImEtZG9tLW92ZXJsYXkiKSwgZS5vcHRpb25hbEZlYXR1cmVzLmluY2x1ZGVzKCJkb20tb3ZlcmxheSIpIHx8IChlLm9wdGlvbmFsRmVhdHVyZXMucHVzaCgiZG9tLW92ZXJsYXkiKSwgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoIndlYnhyIiwgZSkpLCB0aGlzLndhcm5JZkZlYXR1cmVOb3RSZXF1ZXN0ZWQoImRvbS1vdmVybGF5IiksIHRoaXMuc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZG9tT3ZlcmxheSA9IHsgcm9vdDogZS5vdmVybGF5RWxlbWVudCB9LCBlLm92ZXJsYXlFbGVtZW50LmNsYXNzTGlzdC5hZGQoImEtZG9tLW92ZXJsYXkiKSk7CiAgfSwgd2FzRmVhdHVyZVJlcXVlc3RlZDogZnVuY3Rpb24oZSkgewogICAgcmV0dXJuIGUgPT09ICJ2aWV3ZXIiIHx8IGUgPT09ICJsb2NhbCIgfHwgISghdGhpcy5zZXNzaW9uQ29uZmlndXJhdGlvbi5yZXF1aXJlZEZlYXR1cmVzLmluY2x1ZGVzKGUpICYmICF0aGlzLnNlc3Npb25Db25maWd1cmF0aW9uLm9wdGlvbmFsRmVhdHVyZXMuaW5jbHVkZXMoZSkpOwogIH0sIHdhcm5JZkZlYXR1cmVOb3RSZXF1ZXN0ZWQ6IGZ1bmN0aW9uKGUsIHQyKSB7CiAgICB0aGlzLndhc0ZlYXR1cmVSZXF1ZXN0ZWQoZSkgfHwgU2MoKHQyID8gdDIgKyAiICIgOiAiIikgKyAnUGxlYXNlIGFkZCB0aGUgZmVhdHVyZSAiJyArIGUgKyBgIiB0byBhLXNjZW5lJ3Mgd2VieHIgc3lzdGVtIG9wdGlvbnMgaW4gcmVxdWlyZWRGZWF0dXJlcy9vcHRpb25hbEZlYXR1cmVzLmApOwogIH0gfSksIHt9KTsKICBPYmplY3Qua2V5cyhLby5tYXRlcmlhbC5zY2hlbWEpLmZvckVhY2goa2MpLCBPYmplY3Qua2V5cygkcy5zdGFuZGFyZC5zY2hlbWEpLmZvckVhY2goa2MpOwogIFJjID0gbmV3IFJlLlZlY3RvcjM7CiAgRmMgPSBuZXcgUmUuVmVjdG9yMzsKICBjcygicGl2b3QiLCB7IGRlcGVuZGVuY2llczogWyJwb3NpdGlvbiJdLCBzY2hlbWE6IHsgdHlwZTogInZlYzMiIH0sIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGUgPSB0aGlzLmRhdGEsIHQyID0gdGhpcy5lbCwgbjIgPSB0Mi5vYmplY3QzRC5wYXJlbnQsIGkyID0gdDIub2JqZWN0M0QsIHIyID0gbmV3IFJlLkdyb3VwOwogICAgUmMuY29weShpMi5wb3NpdGlvbiksIEZjLmNvcHkoaTIucm90YXRpb24pLCBuMi5yZW1vdmUoaTIpLCByMi5hZGQoaTIpLCBuMi5hZGQocjIpLCB0Mi5vYmplY3QzRCA9IHIyLCBpMi5wb3NpdGlvbi5zZXQoLTEgKiBlLngsIC0xICogZS55LCAtMSAqIGUueiksIHIyLnBvc2l0aW9uLnNldChlLnggKyBSYy54LCBlLnkgKyBSYy55LCBlLnogKyBSYy56KSwgcjIucm90YXRpb24uY29weShpMi5yb3RhdGlvbiksIGkyLnJvdGF0aW9uLnNldCgwLCAwLCAwKTsKICB9IH0pLCBYcygiYS1jYW1lcmEiLCB7IGRlZmF1bHRDb21wb25lbnRzOiB7IGNhbWVyYToge30sICJsb29rLWNvbnRyb2xzIjoge30sICJ3YXNkLWNvbnRyb2xzIjoge30sIHBvc2l0aW9uOiB7IHg6IDAsIHk6IDEuNiwgejogMCB9IH0sIG1hcHBpbmdzOiB7IGFjdGl2ZTogImNhbWVyYS5hY3RpdmUiLCBmYXI6ICJjYW1lcmEuZmFyIiwgZm92OiAiY2FtZXJhLmZvdiIsICJsb29rLWNvbnRyb2xzLWVuYWJsZWQiOiAibG9vay1jb250cm9scy5lbmFibGVkIiwgbmVhcjogImNhbWVyYS5uZWFyIiwgInBvaW50ZXItbG9jay1lbmFibGVkIjogImxvb2stY29udHJvbHMucG9pbnRlckxvY2tFbmFibGVkIiwgIndhc2QtY29udHJvbHMtZW5hYmxlZCI6ICJ3YXNkLWNvbnRyb2xzLmVuYWJsZWQiLCAicmV2ZXJzZS1tb3VzZS1kcmFnIjogImxvb2stY29udHJvbHMucmV2ZXJzZU1vdXNlRHJhZyIsIHpvb206ICJjYW1lcmEuem9vbSIgfSB9KSwgWHMoImEtY3Vyc29yIiwgWHIoe30sIFRjKCksIHsgZGVmYXVsdENvbXBvbmVudHM6IHsgY3Vyc29yOiB7fSwgZ2VvbWV0cnk6IHsgcHJpbWl0aXZlOiAicmluZyIsIHJhZGl1c091dGVyOiAwLjAxNiwgcmFkaXVzSW5uZXI6IDAuMDEsIHNlZ21lbnRzVGhldGE6IDMyIH0sIG1hdGVyaWFsOiB7IGNvbG9yOiAiIzAwMCIsIHNoYWRlcjogImZsYXQiLCBvcGFjaXR5OiAwLjggfSwgcG9zaXRpb246IHsgeDogMCwgeTogMCwgejogLTEgfSB9LCBtYXBwaW5nczogeyBmYXI6ICJyYXljYXN0ZXIuZmFyIiwgZnVzZTogImN1cnNvci5mdXNlIiwgImZ1c2UtdGltZW91dCI6ICJjdXJzb3IuZnVzZVRpbWVvdXQiLCBpbnRlcnZhbDogInJheWNhc3Rlci5pbnRlcnZhbCIsIG9iamVjdHM6ICJyYXljYXN0ZXIub2JqZWN0cyIgfSB9KSksIFhzKCJhLWN1cnZlZGltYWdlIiwgWHIoe30sIFRjKCksIHsgZGVmYXVsdENvbXBvbmVudHM6IHsgZ2VvbWV0cnk6IHsgaGVpZ2h0OiAxLCBwcmltaXRpdmU6ICJjeWxpbmRlciIsIHJhZGl1czogMiwgc2VnbWVudHNSYWRpYWw6IDQ4LCB0aGV0YUxlbmd0aDogMjcwLCBvcGVuRW5kZWQ6IHRydWUsIHRoZXRhU3RhcnQ6IDAgfSwgbWF0ZXJpYWw6IHsgY29sb3I6ICIjRkZGIiwgc2hhZGVyOiAiZmxhdCIsIHNpZGU6ICJkb3VibGUiLCB0cmFuc3BhcmVudDogdHJ1ZSwgcmVwZWF0OiAiLTEgMSIgfSB9LCBtYXBwaW5nczogeyBoZWlnaHQ6ICJnZW9tZXRyeS5oZWlnaHQiLCAib3Blbi1lbmRlZCI6ICJnZW9tZXRyeS5vcGVuRW5kZWQiLCByYWRpdXM6ICJnZW9tZXRyeS5yYWRpdXMiLCBzZWdtZW50czogImdlb21ldHJ5LnNlZ21lbnRzUmFkaWFsIiwgc3RhcnQ6ICJnZW9tZXRyeS50aGV0YVN0YXJ0IiwgInRoZXRhLWxlbmd0aCI6ICJnZW9tZXRyeS50aGV0YUxlbmd0aCIsICJ0aGV0YS1zdGFydCI6ICJnZW9tZXRyeS50aGV0YVN0YXJ0Iiwgd2lkdGg6ICJnZW9tZXRyeS50aGV0YUxlbmd0aCIgfSB9KSksIFhzKCJhLWdsdGYtbW9kZWwiLCB7IG1hcHBpbmdzOiB7IHNyYzogImdsdGYtbW9kZWwiIH0gfSksIFhzKCJhLWltYWdlIiwgWHIoe30sIFRjKCksIHsgZGVmYXVsdENvbXBvbmVudHM6IHsgZ2VvbWV0cnk6IHsgcHJpbWl0aXZlOiAicGxhbmUiIH0sIG1hdGVyaWFsOiB7IGNvbG9yOiAiI0ZGRiIsIHNoYWRlcjogImZsYXQiLCBzaWRlOiAiZG91YmxlIiwgdHJhbnNwYXJlbnQ6IHRydWUgfSB9LCBtYXBwaW5nczogeyBoZWlnaHQ6ICJnZW9tZXRyeS5oZWlnaHQiLCB3aWR0aDogImdlb21ldHJ5LndpZHRoIiB9IH0pKSwgWHMoImEtbGlnaHQiLCB7IGRlZmF1bHRDb21wb25lbnRzOiB7IGxpZ2h0OiB7fSB9LCBtYXBwaW5nczogeyBhbmdsZTogImxpZ2h0LmFuZ2xlIiwgY29sb3I6ICJsaWdodC5jb2xvciIsICJncm91bmQtY29sb3IiOiAibGlnaHQuZ3JvdW5kQ29sb3IiLCBkZWNheTogImxpZ2h0LmRlY2F5IiwgZGlzdGFuY2U6ICJsaWdodC5kaXN0YW5jZSIsIGludGVuc2l0eTogImxpZ2h0LmludGVuc2l0eSIsIHBlbnVtYnJhOiAibGlnaHQucGVudW1icmEiLCB0eXBlOiAibGlnaHQudHlwZSIsIHRhcmdldDogImxpZ2h0LnRhcmdldCIsIGVudm1hcDogImxpZ2h0LmVudk1hcCIsICJzaGFkb3ctY2FtZXJhLWF1dG9tYXRpYyI6ICJsaWdodC5zaGFkb3dDYW1lcmFBdXRvbWF0aWMiIH0gfSksIFhzKCJhLWxpbmsiLCB7IGRlZmF1bHRDb21wb25lbnRzOiB7IGxpbms6IHsgdmlzdWFsQXNwZWN0RW5hYmxlZDogdHJ1ZSB9IH0sIG1hcHBpbmdzOiB7IGhyZWY6ICJsaW5rLmhyZWYiLCBpbWFnZTogImxpbmsuaW1hZ2UiLCB0aXRsZTogImxpbmsudGl0bGUiIH0gfSksIFhzKCJhLW9iai1tb2RlbCIsIFhyKHt9LCBUYygpLCB7IGRlZmF1bHRDb21wb25lbnRzOiB7ICJvYmotbW9kZWwiOiB7fSB9LCBtYXBwaW5nczogeyBzcmM6ICJvYmotbW9kZWwub2JqIiwgbXRsOiAib2JqLW1vZGVsLm10bCIgfSB9KSk7CiAgVWMgPSB7fTsKICBPYyA9IFVjOwogIF9zLmZvckVhY2goZnVuY3Rpb24oZSkgewogICAgdmFyIHQyID0ganNbZV0sIG4yID0gUGMoZSksIGkyID0ge307CiAgICBPYmplY3Qua2V5cyh0Mi5zY2hlbWEpLmZvckVhY2goZnVuY3Rpb24oZTIpIHsKICAgICAgaTJbUGMoZTIpXSA9ICJnZW9tZXRyeS4iICsgZTI7CiAgICB9KTsKICAgIHZhciByMiA9ICJhLSIgKyBuMiwgbzIgPSBYcyhyMiwgWHIoe30sIFRjKCksIHsgZGVmYXVsdENvbXBvbmVudHM6IHsgZ2VvbWV0cnk6IHsgcHJpbWl0aXZlOiBlIH0gfSwgbWFwcGluZ3M6IGkyIH0pKTsKICAgIFVjW3IyXSA9IG8yOwogIH0pLCBYcygiYS1za3kiLCBYcih7fSwgVGMoKSwgeyBkZWZhdWx0Q29tcG9uZW50czogeyBnZW9tZXRyeTogeyBwcmltaXRpdmU6ICJzcGhlcmUiLCByYWRpdXM6IDUwMCwgc2VnbWVudHNXaWR0aDogNjQsIHNlZ21lbnRzSGVpZ2h0OiAzMiB9LCBtYXRlcmlhbDogeyBjb2xvcjogIiNGRkYiLCBzaWRlOiAiYmFjayIsIHNoYWRlcjogImZsYXQiLCBucG90OiB0cnVlIH0sIHNjYWxlOiAiLTEgMSAxIiB9LCBtYXBwaW5nczogWHIoe30sIE9jWyJhLXNwaGVyZSJdLm1hcHBpbmdzKSB9KSksIFhzKCJhLXNvdW5kIiwgeyBkZWZhdWx0Q29tcG9uZW50czogeyBzb3VuZDoge30gfSwgbWFwcGluZ3M6IHsgc3JjOiAic291bmQuc3JjIiwgb246ICJzb3VuZC5vbiIsIGF1dG9wbGF5OiAic291bmQuYXV0b3BsYXkiLCBsb29wOiAic291bmQubG9vcCIsIHZvbHVtZTogInNvdW5kLnZvbHVtZSIgfSB9KSwgR2MgPSB7IHRleHQ6IHsgYW5jaG9yOiAiYWxpZ24iLCB3aWR0aDogNSB9IH0sIE5jID0gTmMgfHwge30sIE9iamVjdC5rZXlzKEdjKS5mb3JFYWNoKGZ1bmN0aW9uKGUpIHsKICAgIChmdW5jdGlvbihlMiwgdDIpIHsKICAgICAgdmFyIG4yID0gS29bZTJdLnNjaGVtYTsKICAgICAgT2JqZWN0LmtleXMobjIpLmZvckVhY2goZnVuY3Rpb24objMpIHsKICAgICAgICB2YXIgaTIgPSBuMy5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAiJDEtJDIiKS50b0xvd2VyQ2FzZSgpOwogICAgICAgIHQyW2kyXSAhPT0gdW5kZWZpbmVkICYmIChpMiA9IGUyICsgIi0iICsgbjMpLCB0MltpMl0gPSBlMiArICIuIiArIG4zOwogICAgICB9KTsKICAgIH0pKGUsIE5jKTsKICB9KSwgWHMoImEtdGV4dCIsIFhyKHt9LCBudWxsLCB7IGRlZmF1bHRDb21wb25lbnRzOiBHYywgbWFwcGluZ3M6IE5jIH0pKSwgWHMoImEtdmlkZW8iLCBYcih7fSwgVGMoKSwgeyBkZWZhdWx0Q29tcG9uZW50czogeyBnZW9tZXRyeTogeyBwcmltaXRpdmU6ICJwbGFuZSIgfSwgbWF0ZXJpYWw6IHsgY29sb3I6ICIjRkZGIiwgc2hhZGVyOiAiZmxhdCIsIHNpZGU6ICJkb3VibGUiLCB0cmFuc3BhcmVudDogdHJ1ZSB9IH0sIG1hcHBpbmdzOiB7IGhlaWdodDogImdlb21ldHJ5LmhlaWdodCIsIHdpZHRoOiAiZ2VvbWV0cnkud2lkdGgiIH0gfSkpLCBYcygiYS12aWRlb3NwaGVyZSIsIFhyKHt9LCBUYygpLCB7IGRlZmF1bHRDb21wb25lbnRzOiB7IGdlb21ldHJ5OiB7IHByaW1pdGl2ZTogInNwaGVyZSIsIHJhZGl1czogNTAwLCBzZWdtZW50c1dpZHRoOiA2NCwgc2VnbWVudHNIZWlnaHQ6IDMyIH0sIG1hdGVyaWFsOiB7IGNvbG9yOiAiI0ZGRiIsIHNoYWRlcjogImZsYXQiLCBzaWRlOiAiYmFjayIsIG5wb3Q6IHRydWUgfSwgc2NhbGU6ICItMSAxIDEiIH0sIG1hcHBpbmdzOiB7IHJhZGl1czogImdlb21ldHJ5LnJhZGl1cyIsICJzZWdtZW50cy1oZWlnaHQiOiAiZ2VvbWV0cnkuc2VnbWVudHNIZWlnaHQiLCAic2VnbWVudHMtd2lkdGgiOiAiZ2VvbWV0cnkuc2VnbWVudHNXaWR0aCIgfSB9KSk7CiAgamMgPSBmaTsKICBfYyA9IGpjKCJBLUZyYW1lOmVycm9yIik7CiAgSGMgPSBqYygiQS1GcmFtZTp3YXJuIik7CiAgd2luZG93LmRvY3VtZW50LmN1cnJlbnRTY3JpcHQgJiYgd2luZG93LmRvY3VtZW50LmN1cnJlbnRTY3JpcHQucGFyZW50Tm9kZSAhPT0gd2luZG93LmRvY3VtZW50LmhlYWQgJiYgIXdpbmRvdy5kZWJ1ZyAmJiBIYygiUHV0IHRoZSBBLUZyYW1lIDxzY3JpcHQ+IHRhZyBpbiB0aGUgPGhlYWQ+IG9mIHRoZSBIVE1MICpiZWZvcmUqIHRoZSBzY2VuZSB0byBlbnN1cmUgZXZlcnl0aGluZyBmb3IgQS1GcmFtZSBpcyBwcm9wZXJseSByZWdpc3RlcmVkIGJlZm9yZSB0aGV5IGFyZSB1c2VkIGZyb20gSFRNTC4iKSwgd2luZG93LmNvcmRvdmEgfHwgd2luZG93LmxvY2F0aW9uLnByb3RvY29sICE9PSAiZmlsZToiIHx8IF9jKCJUaGlzIEhUTUwgZmlsZSBpcyBjdXJyZW50bHkgYmVpbmcgc2VydmVkIHZpYSB0aGUgZmlsZTovLyBwcm90b2NvbC4gQXNzZXRzLCB0ZXh0dXJlcywgYW5kIG1vZGVscyBXSUxMIE5PVCBXT1JLIGR1ZSB0byBjcm9zcy1vcmlnaW4gcG9saWN5ISBQbGVhc2UgdXNlIGEgbG9jYWwgb3IgaG9zdGVkIHNlcnZlcjogaHR0cHM6Ly9hZnJhbWUuaW8vZG9jcy8xLjQuMC9pbnRyb2R1Y3Rpb24vaW5zdGFsbGF0aW9uLmh0bWwjdXNlLWEtbG9jYWwtc2VydmVyLiIpLCBqaSAmJiAod2luZG93LmxvZ3MgPSBqYywgaSg3MTgwKSwgaSg5Mzc5KSksIGNvbnNvbGUubG9nKCJBLUZyYW1lIFZlcnNpb246IDEuNy4wIChEYXRlIDIwMjUtMDMtMTIsIENvbW1pdCAjMWI5NjUwZjEpIiksIGNvbnNvbGUubG9nKCJUSFJFRSBWZXJzaW9uIChodHRwczovL2dpdGh1Yi5jb20vc3VwZXJtZWRpdW0vdGhyZWUuanMpOiIsIGxpLlJFVklTSU9OKSwgd2luZG93LkFGUkFNRV9BU1lOQyB8fCAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gImNvbXBsZXRlIiA/IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbiBlKCkgewogICAgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiAmJiAoZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsIGUpLCBncygpKTsKICB9KSA6IGdzKCkpOwogIHFjID0gZ2xvYmFsVGhpcy5BRlJBTUUgPSB7IEFDb21wb25lbnQ6IEFzLCBBRW50aXR5OiBMcywgQU5vZGU6IGJzLCBBTklNRTogVGUsIEFTY2VuZTogVXMsIGNvbXBvbmVudHM6IEtvLCBjb3JlQ29tcG9uZW50czogT2JqZWN0LmtleXMoS28pLCBnZW9tZXRyaWVzOiBqcywgcmVnaXN0ZXJDb21wb25lbnQ6IGNzLCByZWdpc3Rlckdlb21ldHJ5OiBxcywgcmVnaXN0ZXJQcmltaXRpdmU6IFhzLCByZWdpc3RlclNoYWRlcjogaWEsIHJlZ2lzdGVyU3lzdGVtOiBFcywgcHJpbWl0aXZlczogeyBnZXRNZXNoTWl4aW46IFRjLCBwcmltaXRpdmVzOiBKcyB9LCBzY2VuZXM6IGJvLCBzY2hlbWE6IHAsIHNoYWRlcnM6ICRzLCBzeXN0ZW1zOiBmcywgZW1pdFJlYWR5OiBncywgVEhSRUU6IGxpLCB1dGlsczogZywgdmVyc2lvbjogY2EgfTsKICBWYyA9IHIuQTsKfSk7CgovLyBsaWIveHJmb3JnZS91dGlsLmpzCmFzeW5jIGZ1bmN0aW9uIGluZmVyU291cmNlKHNyYykgewogIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHNyYywgewogICAgbWV0aG9kOiAiSEVBRCIKICB9KTsKICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7CiAgfQogIGxldCBjb250ZW50RGlzcG9zaXRpb24gPSByZXNwb25zZS5oZWFkZXJzLmdldCgiQ29udGVudC1EaXNwb3NpdGlvbiIpOwogIGxldCBmaWxlID0gZXh0cmFjdEZpbGVuYW1lKGNvbnRlbnREaXNwb3NpdGlvbik7CiAgbGV0IHNyY1BhcnRzID0gc3JjLnNwbGl0KCIvIik7CiAgc3JjUGFydHMucG9wKCk7CiAgc3JjUGFydHMucHVzaChmaWxlKTsKICByZXR1cm4gc3JjUGFydHMuam9pbigiLyIpOwp9CmZ1bmN0aW9uIGV4dHJhY3RGaWxlbmFtZShjb250ZW50RGlzcG9zaXRpb25IZWFkZXIpIHsKICBpZiAoIWNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcikKICAgIHJldHVybiAiIjsKICBjb25zdCB1dGY4TWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb25IZWFkZXIubWF0Y2goL2ZpbGVuYW1lXCo9KD86dXRmLTh8VVRGLTgpJycoLis/KSg/Ojt8JCkvaSk7CiAgaWYgKHV0ZjhNYXRjaCAmJiB1dGY4TWF0Y2hbMV0pIHsKICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodXRmOE1hdGNoWzFdLnRyaW0oKSk7CiAgfQogIGNvbnN0IGJhc2ljTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb25IZWFkZXIubWF0Y2goL2ZpbGVuYW1lPSIoLis/KSIvaSk7CiAgaWYgKGJhc2ljTWF0Y2ggJiYgYmFzaWNNYXRjaFsxXSkgewogICAgcmV0dXJuIGJhc2ljTWF0Y2hbMV0udHJpbSgpOwogIH0KICByZXR1cm4gbnVsbDsKfQoKLy8gbGliL3hyZm9yZ2UvaW5kZXguanMKdmFyIGJ0bl9wbGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2J0bl9wbGF5Iik7CmJ0bl9wbGF5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogIGJ0bl9wbGF5LnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBpbml0X2FmcmFtZV9tYXN0ZXJfbW9kdWxlX21pbigpKTsKfSk7CnZhciBzcmMgPSBkb2N1bWVudC5sb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpOwp2YXIgY292ZXIyID0gc3JjOwp2YXIgaW1nID0gL1wuKHBuZ3xqcGd8d2VicCkvOwppZiAoc3JjLm1hdGNoKGltZykpIHsKICBjb3ZlcjIgPSBhd2FpdCBpbmZlclNvdXJjZShzcmMpOwogIHNyYyA9IGNvdmVyMi5yZXBsYWNlKGltZywgIi5nbGIiKTsKfQpjb25zb2xlLmRpcih7IGNvdmVyOiBjb3ZlcjIsIHNyYyB9KTsKZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NjZW5lIikuc2V0QXR0cmlidXRlKCJnbHRmLW1vZGVsIiwgYHVybCgke3NyY30pYCk7CmRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZCA9IGB1cmwoJHtjb3ZlcjJ9KSBuby1yZXBlYXQgY2VudGVyIC8gY292ZXJgOwo="></script><meta name="robots" content="none"></meta></head>
|
|
<body>
|
|
|
|
<img id="btn_play" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgNTguNzUyIDU4Ljc1MiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTguNzUyIDU4Ljc1MjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPHBhdGggc3Ryb2tlPSIjQ0NDIiBzdHJva2Utb3BhY2l0eT0iMC41IiBmaWxsPSJ3aGl0ZSIgZD0iTTUyLjUyNCwyMy45MjVMMTIuNTA3LDAuODI0Yy0xLjkwNy0xLjEtNC4zNzYtMS4wOTctNi4yNzYsMEM0LjI5MywxLjk0LDMuMDg4LDQuMDI1LDMuMDg4LDYuMjY0djQ2LjIwNQ0KCQljMCwyLjI0LDEuMjA0LDQuMzI1LDMuMTMxLDUuNDM1YzAuOTUzLDAuNTU1LDIuMDQyLDAuODQ4LDMuMTQ5LDAuODQ4YzEuMTA0LDAsMi4xOTItMC4yOTIsMy4xNDEtMC44NDNsNDAuMDE3LTIzLjEwMw0KCQljMS45MzYtMS4xMTksMy4xMzgtMy4yMDMsMy4xMzgtNS40MzlDNTUuNjYzLDI3LjEzNCw1NC40NjIsMjUuMDUsNTIuNTI0LDIzLjkyNXogTTQ5LjUyNCwyOS42MTJMOS41MDQsNTIuNzE2DQoJCWMtMC4wODIsMC4wNDctMC4xOCwwLjA1Mi0wLjI3OS0wLjAwNWMtMC4wODQtMC4wNDktMC4xMzctMC4xNDItMC4xMzctMC4yNDJWNi4yNjNjMC0wLjEsMC4wNTItMC4xOTIsMC4xNC0wLjI0Mw0KCQljMC4wNDItMC4wMjUsMC4wOS0wLjAzOCwwLjEzOS0wLjAzOGMwLjA1MSwwLDAuMDk5LDAuMDEzLDAuMTQyLDAuMDM4bDQwLjAxLDIzLjA5OGMwLjA4OSwwLjA1MiwwLjE0NSwwLjE0NywwLjE0NSwwLjI0OQ0KCQlDNDkuNjYzLDI5LjQ3LDQ5LjYxMSwyOS41NjEsNDkuNTI0LDI5LjYxMnoiLz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjwvc3ZnPg0K">
|
|
|
|
<a-scene>
|
|
<a-entity id="scene" animation-mixer_disabled="" gltf-model=""></a-entity>
|
|
|
|
<a-entity id="player" movement-controls="" touch-controls="axis:y" wasd-controls="fly:true" look-controls="magicWindowTrackingEnabled:true">
|
|
<a-entity camera="fov:90" position="0 1.6 0" id="camera"></a-entity>
|
|
<a-entity id="left-hand" hand-tracking-grab-controls="hand:left;modelColor:#cccccc" raycaster="objects:.ray" blink-controls="cameraRig:#player; teleportOrigin: #camera; collisionEntities: .floor"></a-entity>
|
|
<a-entity id="right-hand" hand-tracking-grab-controls="hand:right;modelColor:#cccccc" laser-controls="hand: right" raycaster="objects:.ray" blink-controls="cameraRig:#player; teleportOrigin: #camera; collisionEntities: .floor"></a-entity>
|
|
</a-entity>
|
|
|
|
</a-scene>
|
|
|
|
|
|
|
|
|
|
|
|
</body></html>
|