San Antonio Real Estate Market Dashboard
Data through April 2026
CihmdW5jdGlvbigpewogIC8vIFNhdmUgYW55IGV4aXN0aW5nIENoYXJ0IChXb3JkUHJlc3MncyAyLjcuMSkKICB2YXIgX3ByZXZDaGFydCA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgPyB3aW5kb3cuQ2hhcnQgOiB1bmRlZmluZWQ7CiAgLy8gTG9hZCBDaGFydC5qcyA0LjQuMSAtIGl0IHdpbGwgc2V0IHdpbmRvdy5DaGFydAovKiEKICogQ2hhcnQuanMgdjQuNC4xCiAqIGh0dHBzOi8vd3d3LmNoYXJ0anMub3JnCiAqIChjKSAyMDIzIENoYXJ0LmpzIENvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UKICovCiFmdW5jdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGUpOih0PSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOnR8fHNlbGYpLkNoYXJ0PWUoKX0odGhpcyxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXQgQ29sb3JzKCl7cmV0dXJuIEVvfSxnZXQgRGVjaW1hdGlvbigpe3JldHVybiB6b30sZ2V0IEZpbGxlcigpe3JldHVybiBRb30sZ2V0IExlZ2VuZCgpe3JldHVybiBzYX0sZ2V0IFN1YlRpdGxlKCl7cmV0dXJuIHJhfSxnZXQgVGl0bGUoKXtyZXR1cm4gb2F9LGdldCBUb29sdGlwKCl7cmV0dXJuIE1hfX0pO2Z1bmN0aW9uIGUoKXt9Y29uc3QgaT0oKCk9PntsZXQgdD0wO3JldHVybigpPT50Kyt9KSgpO2Z1bmN0aW9uIHModCl7cmV0dXJuIG51bGw9PXR9ZnVuY3Rpb24gbih0KXtpZihBcnJheS5pc0FycmF5JiZBcnJheS5pc0FycmF5KHQpKXJldHVybiEwO2NvbnN0IGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpO3JldHVybiJbb2JqZWN0Ij09PWUuc2xpY2UoMCw3KSYmIkFycmF5XSI9PT1lLnNsaWNlKC02KX1mdW5jdGlvbiBvKHQpe3JldHVybiBudWxsIT09dCYmIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gYSh0KXtyZXR1cm4oIm51bWJlciI9PXR5cGVvZiB0fHx0IGluc3RhbmNlb2YgTnVtYmVyKSYmaXNGaW5pdGUoK3QpfWZ1bmN0aW9uIHIodCxlKXtyZXR1cm4gYSh0KT90OmV9ZnVuY3Rpb24gbCh0LGUpe3JldHVybiB2b2lkIDA9PT10P2U6dH1jb25zdCBoPSh0LGUpPT4ic3RyaW5nIj09dHlwZW9mIHQmJnQuZW5kc1dpdGgoIiUiKT9wYXJzZUZsb2F0KHQpLzEwMDordC9lLGM9KHQsZSk9PiJzdHJpbmciPT10eXBlb2YgdCYmdC5lbmRzV2l0aCgiJSIpP3BhcnNlRmxvYXQodCkvMTAwKmU6K3Q7ZnVuY3Rpb24gZCh0LGUsaSl7aWYodCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY2FsbClyZXR1cm4gdC5hcHBseShpLGUpfWZ1bmN0aW9uIHUodCxlLGkscyl7bGV0IGEscixsO2lmKG4odCkpaWYocj10Lmxlbmd0aCxzKWZvcihhPXItMTthPj0wO2EtLSllLmNhbGwoaSx0W2FdLGEpO2Vsc2UgZm9yKGE9MDthPHI7YSsrKWUuY2FsbChpLHRbYV0sYSk7ZWxzZSBpZihvKHQpKWZvcihsPU9iamVjdC5rZXlzKHQpLHI9bC5sZW5ndGgsYT0wO2E8cjthKyspZS5jYWxsKGksdFtsW2FdXSxsW2FdKX1mdW5jdGlvbiBmKHQsZSl7bGV0IGkscyxuLG87aWYoIXR8fCFlfHx0Lmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2ZvcihpPTAscz10Lmxlbmd0aDtpPHM7KytpKWlmKG49dFtpXSxvPWVbaV0sbi5kYXRhc2V0SW5kZXghPT1vLmRhdGFzZXRJbmRleHx8bi5pbmRleCE9PW8uaW5kZXgpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZyh0KXtpZihuKHQpKXJldHVybiB0Lm1hcChnKTtpZihvKHQpKXtjb25zdCBlPU9iamVjdC5jcmVhdGUobnVsbCksaT1PYmplY3Qua2V5cyh0KSxzPWkubGVuZ3RoO2xldCBuPTA7Zm9yKDtuPHM7KytuKWVbaVtuXV09Zyh0W2lbbl1dKTtyZXR1cm4gZX1yZXR1cm4gdH1mdW5jdGlvbiBwKHQpe3JldHVybi0xPT09WyJfX3Byb3RvX18iLCJwcm90b3R5cGUiLCJjb25zdHJ1Y3RvciJdLmluZGV4T2YodCl9ZnVuY3Rpb24gbSh0LGUsaSxzKXtpZighcCh0KSlyZXR1cm47Y29uc3Qgbj1lW3RdLGE9aVt0XTtvKG4pJiZvKGEpP2IobixhLHMpOmVbdF09ZyhhKX1mdW5jdGlvbiBiKHQsZSxpKXtjb25zdCBzPW4oZSk/ZTpbZV0sYT1zLmxlbmd0aDtpZighbyh0KSlyZXR1cm4gdDtjb25zdCByPShpPWl8fHt9KS5tZXJnZXJ8fG07bGV0IGw7Zm9yKGxldCBlPTA7ZTxhOysrZSl7aWYobD1zW2VdLCFvKGwpKWNvbnRpbnVlO2NvbnN0IG49T2JqZWN0LmtleXMobCk7Zm9yKGxldCBlPTAscz1uLmxlbmd0aDtlPHM7KytlKXIobltlXSx0LGwsaSl9cmV0dXJuIHR9ZnVuY3Rpb24geCh0LGUpe3JldHVybiBiKHQsZSx7bWVyZ2VyOl99KX1mdW5jdGlvbiBfKHQsZSxpKXtpZighcCh0KSlyZXR1cm47Y29uc3Qgcz1lW3RdLG49aVt0XTtvKHMpJiZvKG4pP3gocyxuKTpPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KXx8KGVbdF09ZyhuKSl9Y29uc3QgeT17IiI6dD0+dCx4OnQ9PnQueCx5OnQ9PnQueX07ZnVuY3Rpb24gdih0KXtjb25zdCBlPXQuc3BsaXQoIi4iKSxpPVtdO2xldCBzPSIiO2Zvcihjb25zdCB0IG9mIGUpcys9dCxzLmVuZHNXaXRoKCJcXCIpP3M9cy5zbGljZSgwLC0xKSsiLiI6KGkucHVzaChzKSxzPSIiKTtyZXR1cm4gaX1mdW5jdGlvbiBNKHQsZSl7Y29uc3QgaT15W2VdfHwoeVtlXT1mdW5jdGlvbih0KXtjb25zdCBlPXYodCk7cmV0dXJuIHQ9Pntmb3IoY29uc3QgaSBvZiBlKXtpZigiIj09PWkpYnJlYWs7dD10JiZ0W2ldfXJldHVybiB0fX0oZSkpO3JldHVybiBpKHQpfWZ1bmN0aW9uIHcodCl7cmV0dXJuIHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKX1jb25zdCBrPXQ9PnZvaWQgMCE9PXQsUz10PT4iZnVuY3Rpb24iPT10eXBlb2YgdCxQPSh0LGUpPT57aWYodC5zaXplIT09ZS5zaXplKXJldHVybiExO2Zvcihjb25zdCBpIG9mIHQpaWYoIWUuaGFzKGkpKXJldHVybiExO3JldHVybiEwfTtmdW5jdGlvbiBEKHQpe3JldHVybiJtb3VzZXVwIj09PXQudHlwZXx8ImNsaWNrIj09PXQudHlwZXx8ImNvbnRleHRtZW51Ij09PXQudHlwZX1jb25zdCBDPU1hdGguUEksTz0yKkMsQT1PK0MsVD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksTD1DLzE4MCxFPUMvMixSPUMvNCxJPTIqQy8zLHo9TWF0aC5sb2cxMCxGPU1hdGguc2lnbjtmdW5jdGlvbiBWKHQsZSxpKXtyZXR1cm4gTWF0aC5hYnModC1lKTxpfWZ1bmN0aW9uIEIodCl7Y29uc3QgZT1NYXRoLnJvdW5kKHQpO3Q9Vih0LGUsdC8xZTMpP2U6dDtjb25zdCBpPU1hdGgucG93KDEwLE1hdGguZmxvb3Ioeih0KSkpLHM9dC9pO3JldHVybihzPD0xPzE6czw9Mj8yOnM8PTU/NToxMCkqaX1mdW5jdGlvbiBXKHQpe2NvbnN0IGU9W10saT1NYXRoLnNxcnQodCk7bGV0IHM7Zm9yKHM9MTtzPGk7cysrKXQlcz09MCYmKGUucHVzaChzKSxlLnB1c2godC9zKSk7cmV0dXJuIGk9PT0oMHxpKSYmZS5wdXNoKGkpLGUuc29ydCgodCxlKT0+dC1lKS5wb3AoKSxlfWZ1bmN0aW9uIE4odCl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQodCkpJiZpc0Zpbml0ZSh0KX1mdW5jdGlvbiBIKHQsZSl7Y29uc3QgaT1NYXRoLnJvdW5kKHQpO3JldHVybiBpLWU8PXQmJmkrZT49dH1mdW5jdGlvbiBqKHQsZSxpKXtsZXQgcyxuLG87Zm9yKHM9MCxuPXQubGVuZ3RoO3M8bjtzKyspbz10W3NdW2ldLGlzTmFOKG8pfHwoZS5taW49TWF0aC5taW4oZS5taW4sbyksZS5tYXg9TWF0aC5tYXgoZS5tYXgsbykpfWZ1bmN0aW9uICQodCl7cmV0dXJuIHQqKEMvMTgwKX1mdW5jdGlvbiBZKHQpe3JldHVybiB0KigxODAvQyl9ZnVuY3Rpb24gVSh0KXtpZighYSh0KSlyZXR1cm47bGV0IGU9MSxpPTA7Zm9yKDtNYXRoLnJvdW5kKHQqZSkvZSE9PXQ7KWUqPTEwLGkrKztyZXR1cm4gaX1mdW5jdGlvbiBYKHQsZSl7Y29uc3QgaT1lLngtdC54LHM9ZS55LXQueSxuPU1hdGguc3FydChpKmkrcypzKTtsZXQgbz1NYXRoLmF0YW4yKHMsaSk7cmV0dXJuIG88LS41KkMmJihvKz1PKSx7YW5nbGU6byxkaXN0YW5jZTpufX1mdW5jdGlvbiBxKHQsZSl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhlLngtdC54LDIpK01hdGgucG93KGUueS10LnksMikpfWZ1bmN0aW9uIEsodCxlKXtyZXR1cm4odC1lK0EpJU8tQ31mdW5jdGlvbiBHKHQpe3JldHVybih0JU8rTyklT31mdW5jdGlvbiBaKHQsZSxpLHMpe2NvbnN0IG49Ryh0KSxvPUcoZSksYT1HKGkpLHI9RyhvLW4pLGw9RyhhLW4pLGg9RyhuLW8pLGM9RyhuLWEpO3JldHVybiBuPT09b3x8bj09PWF8fHMmJm89PT1hfHxyPmwmJmg8Y31mdW5jdGlvbiBKKHQsZSxpKXtyZXR1cm4gTWF0aC5tYXgoZSxNYXRoLm1pbihpLHQpKX1mdW5jdGlvbiBRKHQpe3JldHVybiBKKHQsLTMyNzY4LDMyNzY3KX1mdW5jdGlvbiB0dCh0LGUsaSxzPTFlLTYpe3JldHVybiB0Pj1NYXRoLm1pbihlLGkpLXMmJnQ8PU1hdGgubWF4KGUsaSkrc31mdW5jdGlvbiBldCh0LGUsaSl7aT1pfHwoaT0+dFtpXTxlKTtsZXQgcyxuPXQubGVuZ3RoLTEsbz0wO2Zvcig7bi1vPjE7KXM9bytuPj4xLGkocyk/bz1zOm49cztyZXR1cm57bG86byxoaTpufX1jb25zdCBpdD0odCxlLGkscyk9PmV0KHQsaSxzP3M9Pntjb25zdCBuPXRbc11bZV07cmV0dXJuIG48aXx8bj09PWkmJnRbcysxXVtlXT09PWl9OnM9PnRbc11bZV08aSksc3Q9KHQsZSxpKT0+ZXQodCxpLHM9PnRbc11bZV0+PWkpO2Z1bmN0aW9uIG50KHQsZSxpKXtsZXQgcz0wLG49dC5sZW5ndGg7Zm9yKDtzPG4mJnRbc108ZTspcysrO2Zvcig7bj5zJiZ0W24tMV0+aTspbi0tO3JldHVybiBzPjB8fG48dC5sZW5ndGg/dC5zbGljZShzLG4pOnR9Y29uc3Qgb3Q9WyJwdXNoIiwicG9wIiwic2hpZnQiLCJzcGxpY2UiLCJ1bnNoaWZ0Il07ZnVuY3Rpb24gYXQodCxlKXt0Ll9jaGFydGpzP3QuX2NoYXJ0anMubGlzdGVuZXJzLnB1c2goZSk6KE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfY2hhcnRqcyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOntsaXN0ZW5lcnM6W2VdfX0pLG90LmZvckVhY2goZT0+e2NvbnN0IGk9Il9vbkRhdGEiK3coZSkscz10W2VdO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlKC4uLmUpe2NvbnN0IG49cy5hcHBseSh0aGlzLGUpO3JldHVybiB0Ll9jaGFydGpzLmxpc3RlbmVycy5mb3JFYWNoKHQ9PnsiZnVuY3Rpb24iPT10eXBlb2YgdFtpXSYmdFtpXSguLi5lKX0pLG59fSl9KSl9ZnVuY3Rpb24gcnQodCxlKXtjb25zdCBpPXQuX2NoYXJ0anM7aWYoIWkpcmV0dXJuO2NvbnN0IHM9aS5saXN0ZW5lcnMsbj1zLmluZGV4T2YoZSk7LTEhPT1uJiZzLnNwbGljZShuLDEpLHMubGVuZ3RoPjB8fChvdC5mb3JFYWNoKGU9PntkZWxldGUgdFtlXX0pLGRlbGV0ZSB0Ll9jaGFydGpzKX1mdW5jdGlvbiBsdCh0KXtjb25zdCBlPW5ldyBTZXQodCk7cmV0dXJuIGUuc2l6ZT09PXQubGVuZ3RoP3Q6QXJyYXkuZnJvbShlKX1jb25zdCBodD0idW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdz9mdW5jdGlvbih0KXtyZXR1cm4gdCgpfTp3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO2Z1bmN0aW9uIGN0KHQsZSl7bGV0IGk9W10scz0hMTtyZXR1cm4gZnVuY3Rpb24oLi4ubil7aT1uLHN8fChzPSEwLGh0LmNhbGwod2luZG93LCgpPT57cz0hMSx0LmFwcGx5KGUsaSl9KSl9fWZ1bmN0aW9uIGR0KHQsZSl7bGV0IGk7cmV0dXJuIGZ1bmN0aW9uKC4uLnMpe3JldHVybiBlPyhjbGVhclRpbWVvdXQoaSksaT1zZXRUaW1lb3V0KHQsZSxzKSk6dC5hcHBseSh0aGlzLHMpLGV9fWNvbnN0IHV0PXQ9PiJzdGFydCI9PT10PyJsZWZ0IjoiZW5kIj09PXQ/InJpZ2h0IjoiY2VudGVyIixmdD0odCxlLGkpPT4ic3RhcnQiPT09dD9lOiJlbmQiPT09dD9pOihlK2kpLzIsZ3Q9KHQsZSxpLHMpPT50PT09KHM/ImxlZnQiOiJyaWdodCIpP2k6ImNlbnRlciI9PT10PyhlK2kpLzI6ZTtmdW5jdGlvbiBwdCh0LGUsaSl7Y29uc3Qgcz1lLmxlbmd0aDtsZXQgbj0wLG89cztpZih0Ll9zb3J0ZWQpe2NvbnN0e2lTY2FsZTphLF9wYXJzZWQ6cn09dCxsPWEuYXhpcyx7bWluOmgsbWF4OmMsbWluRGVmaW5lZDpkLG1heERlZmluZWQ6dX09YS5nZXRVc2VyQm91bmRzKCk7ZCYmKG49SihNYXRoLm1pbihpdChyLGwsaCkubG8saT9zOml0KGUsbCxhLmdldFBpeGVsRm9yVmFsdWUoaCkpLmxvKSwwLHMtMSkpLG89dT9KKE1hdGgubWF4KGl0KHIsYS5heGlzLGMsITApLmhpKzEsaT8wOml0KGUsbCxhLmdldFBpeGVsRm9yVmFsdWUoYyksITApLmhpKzEpLG4scyktbjpzLW59cmV0dXJue3N0YXJ0Om4sY291bnQ6b319ZnVuY3Rpb24gbXQodCl7Y29uc3R7eFNjYWxlOmUseVNjYWxlOmksX3NjYWxlUmFuZ2VzOnN9PXQsbj17eG1pbjplLm1pbix4bWF4OmUubWF4LHltaW46aS5taW4seW1heDppLm1heH07aWYoIXMpcmV0dXJuIHQuX3NjYWxlUmFuZ2VzPW4sITA7Y29uc3Qgbz1zLnhtaW4hPT1lLm1pbnx8cy54bWF4IT09ZS5tYXh8fHMueW1pbiE9PWkubWlufHxzLnltYXghPT1pLm1heDtyZXR1cm4gT2JqZWN0LmFzc2lnbihzLG4pLG99dmFyIGJ0PW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3JlcXVlc3Q9bnVsbCx0aGlzLl9jaGFydHM9bmV3IE1hcCx0aGlzLl9ydW5uaW5nPSExLHRoaXMuX2xhc3REYXRlPXZvaWQgMH1fbm90aWZ5KHQsZSxpLHMpe2NvbnN0IG49ZS5saXN0ZW5lcnNbc10sbz1lLmR1cmF0aW9uO24uZm9yRWFjaChzPT5zKHtjaGFydDp0LGluaXRpYWw6ZS5pbml0aWFsLG51bVN0ZXBzOm8sY3VycmVudFN0ZXA6TWF0aC5taW4oaS1lLnN0YXJ0LG8pfSkpfV9yZWZyZXNoKCl7dGhpcy5fcmVxdWVzdHx8KHRoaXMuX3J1bm5pbmc9ITAsdGhpcy5fcmVxdWVzdD1odC5jYWxsKHdpbmRvdywoKT0+e3RoaXMuX3VwZGF0ZSgpLHRoaXMuX3JlcXVlc3Q9bnVsbCx0aGlzLl9ydW5uaW5nJiZ0aGlzLl9yZWZyZXNoKCl9KSl9X3VwZGF0ZSh0PURhdGUubm93KCkpe2xldCBlPTA7dGhpcy5fY2hhcnRzLmZvckVhY2goKGkscyk9PntpZighaS5ydW5uaW5nfHwhaS5pdGVtcy5sZW5ndGgpcmV0dXJuO2NvbnN0IG49aS5pdGVtcztsZXQgbyxhPW4ubGVuZ3RoLTEscj0hMTtmb3IoO2E+PTA7LS1hKW89blthXSxvLl9hY3RpdmU/KG8uX3RvdGFsPmkuZHVyYXRpb24mJihpLmR1cmF0aW9uPW8uX3RvdGFsKSxvLnRpY2sodCkscj0hMCk6KG5bYV09bltuLmxlbmd0aC0xXSxuLnBvcCgpKTtyJiYocy5kcmF3KCksdGhpcy5fbm90aWZ5KHMsaSx0LCJwcm9ncmVzcyIpKSxuLmxlbmd0aHx8KGkucnVubmluZz0hMSx0aGlzLl9ub3RpZnkocyxpLHQsImNvbXBsZXRlIiksaS5pbml0aWFsPSExKSxlKz1uLmxlbmd0aH0pLHRoaXMuX2xhc3REYXRlPXQsMD09PWUmJih0aGlzLl9ydW5uaW5nPSExKX1fZ2V0QW5pbXModCl7Y29uc3QgZT10aGlzLl9jaGFydHM7bGV0IGk9ZS5nZXQodCk7cmV0dXJuIGl8fChpPXtydW5uaW5nOiExLGluaXRpYWw6ITAsaXRlbXM6W10sbGlzdGVuZXJzOntjb21wbGV0ZTpbXSxwcm9ncmVzczpbXX19LGUuc2V0KHQsaSkpLGl9bGlzdGVuKHQsZSxpKXt0aGlzLl9nZXRBbmltcyh0KS5saXN0ZW5lcnNbZV0ucHVzaChpKX1hZGQodCxlKXtlJiZlLmxlbmd0aCYmdGhpcy5fZ2V0QW5pbXModCkuaXRlbXMucHVzaCguLi5lKX1oYXModCl7cmV0dXJuIHRoaXMuX2dldEFuaW1zKHQpLml0ZW1zLmxlbmd0aD4wfXN0YXJ0KHQpe2NvbnN0IGU9dGhpcy5fY2hhcnRzLmdldCh0KTtlJiYoZS5ydW5uaW5nPSEwLGUuc3RhcnQ9RGF0ZS5ub3coKSxlLmR1cmF0aW9uPWUuaXRlbXMucmVkdWNlKCh0LGUpPT5NYXRoLm1heCh0LGUuX2R1cmF0aW9uKSwwKSx0aGlzLl9yZWZyZXNoKCkpfXJ1bm5pbmcodCl7aWYoIXRoaXMuX3J1bm5pbmcpcmV0dXJuITE7Y29uc3QgZT10aGlzLl9jaGFydHMuZ2V0KHQpO3JldHVybiEhKGUmJmUucnVubmluZyYmZS5pdGVtcy5sZW5ndGgpfXN0b3AodCl7Y29uc3QgZT10aGlzLl9jaGFydHMuZ2V0KHQpO2lmKCFlfHwhZS5pdGVtcy5sZW5ndGgpcmV0dXJuO2NvbnN0IGk9ZS5pdGVtcztsZXQgcz1pLmxlbmd0aC0xO2Zvcig7cz49MDstLXMpaVtzXS5jYW5jZWwoKTtlLml0ZW1zPVtdLHRoaXMuX25vdGlmeSh0LGUsRGF0ZS5ub3coKSwiY29tcGxldGUiKX1yZW1vdmUodCl7cmV0dXJuIHRoaXMuX2NoYXJ0cy5kZWxldGUodCl9fTsKLyohCiAqIEBrdXJrbGUvY29sb3IgdjAuMy4yCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9rdXJrbGUvY29sb3IjcmVhZG1lCiAqIChjKSAyMDIzIEp1a2thIEt1cmtlbGEKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlCiAqL2Z1bmN0aW9uIHh0KHQpe3JldHVybiB0Ky41fDB9Y29uc3QgX3Q9KHQsZSxpKT0+TWF0aC5tYXgoTWF0aC5taW4odCxpKSxlKTtmdW5jdGlvbiB5dCh0KXtyZXR1cm4gX3QoeHQoMi41NSp0KSwwLDI1NSl9ZnVuY3Rpb24gdnQodCl7cmV0dXJuIF90KHh0KDI1NSp0KSwwLDI1NSl9ZnVuY3Rpb24gTXQodCl7cmV0dXJuIF90KHh0KHQvMi41NSkvMTAwLDAsMSl9ZnVuY3Rpb24gd3QodCl7cmV0dXJuIF90KHh0KDEwMCp0KSwwLDEwMCl9Y29uc3Qga3Q9ezA6MCwxOjEsMjoyLDM6Myw0OjQsNTo1LDY6Niw3OjcsODo4LDk6OSxBOjEwLEI6MTEsQzoxMixEOjEzLEU6MTQsRjoxNSxhOjEwLGI6MTEsYzoxMixkOjEzLGU6MTQsZjoxNX0sU3Q9Wy4uLiIwMTIzNDU2Nzg5QUJDREVGIl0sUHQ9dD0+U3RbMTUmdF0sRHQ9dD0+U3RbKDI0MCZ0KT4+NF0rU3RbMTUmdF0sQ3Q9dD0+KDI0MCZ0KT4+ND09KDE1JnQpO2NvbnN0IE90PS9eKGhzbGE/fGh3Ynxoc3YpXChccyooWy0rLmVcZF0rKSg/OmRlZyk/W1xzLF0rKFstKy5lXGRdKyklW1xzLF0rKFstKy5lXGRdKyklKD86W1xzLF0rKFstKy5lXGRdKykoJSk/KT9ccypcKSQvO2Z1bmN0aW9uIEF0KHQsZSxpKXtjb25zdCBzPWUqTWF0aC5taW4oaSwxLWkpLG49KGUsbj0oZSt0LzMwKSUxMik9PmktcypNYXRoLm1heChNYXRoLm1pbihuLTMsOS1uLDEpLC0xKTtyZXR1cm5bbigwKSxuKDgpLG4oNCldfWZ1bmN0aW9uIFR0KHQsZSxpKXtjb25zdCBzPShzLG49KHMrdC82MCklNik9PmktaSplKk1hdGgubWF4KE1hdGgubWluKG4sNC1uLDEpLDApO3JldHVybltzKDUpLHMoMykscygxKV19ZnVuY3Rpb24gTHQodCxlLGkpe2NvbnN0IHM9QXQodCwxLC41KTtsZXQgbjtmb3IoZStpPjEmJihuPTEvKGUraSksZSo9bixpKj1uKSxuPTA7bjwzO24rKylzW25dKj0xLWUtaSxzW25dKz1lO3JldHVybiBzfWZ1bmN0aW9uIEV0KHQpe2NvbnN0IGU9dC5yLzI1NSxpPXQuZy8yNTUscz10LmIvMjU1LG49TWF0aC5tYXgoZSxpLHMpLG89TWF0aC5taW4oZSxpLHMpLGE9KG4rbykvMjtsZXQgcixsLGg7cmV0dXJuIG4hPT1vJiYoaD1uLW8sbD1hPi41P2gvKDItbi1vKTpoLyhuK28pLHI9ZnVuY3Rpb24odCxlLGkscyxuKXtyZXR1cm4gdD09PW4/KGUtaSkvcysoZTxpPzY6MCk6ZT09PW4/KGktdCkvcysyOih0LWUpL3MrNH0oZSxpLHMsaCxuKSxyPTYwKnIrLjUpLFswfHIsbHx8MCxhXX1mdW5jdGlvbiBSdCh0LGUsaSxzKXtyZXR1cm4oQXJyYXkuaXNBcnJheShlKT90KGVbMF0sZVsxXSxlWzJdKTp0KGUsaSxzKSkubWFwKHZ0KX1mdW5jdGlvbiBJdCh0LGUsaSl7cmV0dXJuIFJ0KEF0LHQsZSxpKX1mdW5jdGlvbiB6dCh0KXtyZXR1cm4odCUzNjArMzYwKSUzNjB9Y29uc3QgRnQ9e3g6ImRhcmsiLFo6ImxpZ2h0IixZOiJyZSIsWDoiYmx1IixXOiJnciIsVjoibWVkaXVtIixVOiJzbGF0ZSIsQToiZWUiLFQ6Im9sIixTOiJvciIsQjoicmEiLEM6ImxhdGVnIixEOiJpZ2h0cyIsUjoiaW4iLFE6InR1cnF1b2lzIixFOiJoaSIsUDoicm8iLE86ImFsIixOOiJsZSIsTToiZGUiLEw6InllbGxvIixGOiJlbiIsSzoiY2giLEc6ImFya3MiLEg6ImVhIixJOiJpZ2h0ZyIsSjoid2gifSxWdD17T2ljZVhlOiJmMGY4ZmYiLGFudGlxdWV3RXRlOiJmYWViZDciLGFxdWE6ImZmZmYiLGFxdWFtYXJSZToiN2ZmZmQ0IixhenVZOiJmMGZmZmYiLGJlaWdlOiJmNWY1ZGMiLGJpc3F1ZToiZmZlNGM0IixibGFjazoiMCIsYmxhbktlZE9tb25kOiJmZmViY2QiLFhlOiJmZiIsWGV2aVRldDoiOGEyYmUyIixiUHduOiJhNTJhMmEiLGJ1cmx5d29vZDoiZGViODg3IixjYU10WGU6IjVmOWVhMCIsS2FydFl1c2U6IjdmZmYwMCIsS29jVGF0ZToiZDI2OTFlIixjU086ImZmN2Y1MCIsY1NuZmxvd2VyWGU6IjY0OTVlZCIsY1Nuc2lsazoiZmZmOGRjIixjcmltc29uOiJkYzE0M2MiLGN5YW46ImZmZmYiLHhYZToiOGIiLHhjeWFuOiI4YjhiIix4Z1RNblBkOiJiODg2MGIiLHhXYXk6ImE5YTlhOSIseGdZRjoiNjQwMCIseGdZeToiYTlhOWE5Iix4a2hha2k6ImJkYjc2YiIseG1hZ0Z0YToiOGIwMDhiIix4VGl2ZWdZRjoiNTU2YjJmIix4U2FuZ2U6ImZmOGMwMCIseFNjRWQ6Ijk5MzJjYyIseFlkOiI4YjAwMDAiLHhzT21vbjoiZTk5NjdhIix4c0hnWUY6IjhmYmM4ZiIseFVYZToiNDgzZDhiIix4VVdheToiMmY0ZjRmIix4VWdZeToiMmY0ZjRmIix4UWU6ImNlZDEiLHh2aVRldDoiOTQwMGQzIixkQXBwUms6ImZmMTQ5MyIsZEFwc2t5WGU6ImJmZmYiLGRpbVdheToiNjk2OTY5IixkaW1nWXk6IjY5Njk2OSIsZG9kZ2VyWGU6IjFlOTBmZiIsZmlZYnJpY2s6ImIyMjIyMiIsZmxTT3dFdGU6ImZmZmFmMCIsZm9Zc3RXQW46IjIyOGIyMiIsZnVLc2lhOiJmZjAwZmYiLGdhUnNiU286ImRjZGNkYyIsZ2hvc3R3RXRlOiJmOGY4ZmYiLGdUZDoiZmZkNzAwIixnVE1uUGQ6ImRhYTUyMCIsV2F5OiI4MDgwODAiLGdZRjoiODAwMCIsZ1lGTHc6ImFkZmYyZiIsZ1l5OiI4MDgwODAiLGhvbmV5TXc6ImYwZmZmMCIsaG90cFJrOiJmZjY5YjQiLFJkaWFuWWQ6ImNkNWM1YyIsUmRpZ286IjRiMDA4MiIsaXZTeToiZmZmZmYwIixraGFraToiZjBlNjhjIixsYXZGTXI6ImU2ZTZmYSIsbGF2Rk1yWHNoOiJmZmYwZjUiLGxhd25nWUY6IjdjZmMwMCIsTm1vbmNFZmZvbjoiZmZmYWNkIixaWGU6ImFkZDhlNiIsWmNTTzoiZjA4MDgwIixaY3lhbjoiZTBmZmZmIixaZ1RNblBkTHc6ImZhZmFkMiIsWldheToiZDNkM2QzIixaZ1lGOiI5MGVlOTAiLFpnWXk6ImQzZDNkMyIsWnBSazoiZmZiNmMxIixac09tb246ImZmYTA3YSIsWnNIZ1lGOiIyMGIyYWEiLFpza3lYZToiODdjZWZhIixaVVdheToiNzc4ODk5IixaVWdZeToiNzc4ODk5Iixac3RBbFhlOiJiMGM0ZGUiLFpMdzoiZmZmZmUwIixsaW1lOiJmZjAwIixsaW1lZ1lGOiIzMmNkMzIiLGxSRjoiZmFmMGU2IixtYWdGdGE6ImZmMDBmZiIsbWFQb246IjgwMDAwMCIsVmFxdWFtYXJSZToiNjZjZGFhIixWWGU6ImNkIixWU2NFZDoiYmE1NWQzIixWcHVycE46IjkzNzBkYiIsVnNIZ1lGOiIzY2IzNzEiLFZVWGU6IjdiNjhlZSIsVnNwclJnZ1lGOiJmYTlhIixWUWU6IjQ4ZDFjYyIsVnZpVGV0WWQ6ImM3MTU4NSIsbWlkbmlnaHRYZToiMTkxOTcwIixtUnRjWWFtOiJmNWZmZmEiLG1pc3R5UHNlOiJmZmU0ZTEiLG1vY2Nhc1I6ImZmZTRiNSIsbmF2YWpvd0V0ZToiZmZkZWFkIixuYXZ5OiI4MCIsVGRsYWNlOiJmZGY1ZTYiLFRpdmU6IjgwODAwMCIsVGl2ZWRCYjoiNmI4ZTIzIixTYW5nZToiZmZhNTAwIixTYW5nZVlkOiJmZjQ1MDAiLFNjRWQ6ImRhNzBkNiIscE9lZ1RNblBkOiJlZWU4YWEiLHBPZWdZRjoiOThmYjk4IixwT2VRZToiYWZlZWVlIixwT2V2aVRldFlkOiJkYjcwOTMiLHBhcGF5YXdFcDoiZmZlZmQ1IixwSEtwdWZmOiJmZmRhYjkiLHBlcnU6ImNkODUzZiIscFJrOiJmZmMwY2IiLHBsdW06ImRkYTBkZCIscG93TXJYZToiYjBlMGU2IixwdXJwTjoiODAwMDgwIixZYmVjY2FwdXJwTjoiNjYzMzk5IixZZDoiZmYwMDAwIixQc3licm93bjoiYmM4ZjhmIixQeU9YZToiNDE2OWUxIixzYWRkTmJQd246IjhiNDUxMyIsc09tb246ImZhODA3MiIsc2FuZHliUHduOiJmNGE0NjAiLHNIZ1lGOiIyZThiNTciLHNIc2hlbGw6ImZmZjVlZSIsc2lGbmE6ImEwNTIyZCIsc2lsdmVyOiJjMGMwYzAiLHNreVhlOiI4N2NlZWIiLFVYZToiNmE1YWNkIixVV2F5OiI3MDgwOTAiLFVnWXk6IjcwODA5MCIsc25vdzoiZmZmYWZhIixzcHJSZ2dZRjoiZmY3ZiIsc3RBbFhlOiI0NjgyYjQiLHRhbjoiZDJiNDhjIix0ZU86IjgwODAiLHRFc3ROOiJkOGJmZDgiLHRvbWF0bzoiZmY2MzQ3IixRZToiNDBlMGQwIix2aVRldDoiZWU4MmVlIixKSHQ6ImY1ZGViMyIsd0V0ZToiZmZmZmZmIix3RXRlc21va2U6ImY1ZjVmNSIsTHc6ImZmZmYwMCIsTHdnWUY6IjlhY2QzMiJ9O2xldCBCdDtjb25zdCBXdD0vXnJnYmE/XChccyooWy0rLlxkXSspKCUpP1tccyxdKyhbLSsuZVxkXSspKCUpP1tccyxdKyhbLSsuZVxkXSspKCUpPyg/OltccywvXSsoWy0rLmVcZF0rKSglKT8pP1xzKlwpJC8sTnQ9dD0+dDw9LjAwMzEzMDg/MTIuOTIqdDoxLjA1NSpNYXRoLnBvdyh0LDEvMi40KS0uMDU1LEh0PXQ9PnQ8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCk7ZnVuY3Rpb24ganQodCxlLGkpe2lmKHQpe2xldCBzPUV0KHQpO3NbZV09TWF0aC5tYXgoMCxNYXRoLm1pbihzW2VdK3NbZV0qaSwwPT09ZT8zNjA6MSkpLHM9SXQocyksdC5yPXNbMF0sdC5nPXNbMV0sdC5iPXNbMl19fWZ1bmN0aW9uICR0KHQsZSl7cmV0dXJuIHQ/T2JqZWN0LmFzc2lnbihlfHx7fSx0KTp0fWZ1bmN0aW9uIFl0KHQpe3ZhciBlPXtyOjAsZzowLGI6MCxhOjI1NX07cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dC5sZW5ndGg+PTMmJihlPXtyOnRbMF0sZzp0WzFdLGI6dFsyXSxhOjI1NX0sdC5sZW5ndGg+MyYmKGUuYT12dCh0WzNdKSkpOihlPSR0KHQse3I6MCxnOjAsYjowLGE6MX0pKS5hPXZ0KGUuYSksZX1mdW5jdGlvbiBVdCh0KXtyZXR1cm4iciI9PT10LmNoYXJBdCgwKT9mdW5jdGlvbih0KXtjb25zdCBlPVd0LmV4ZWModCk7bGV0IGkscyxuLG89MjU1O2lmKGUpe2lmKGVbN10hPT1pKXtjb25zdCB0PStlWzddO289ZVs4XT95dCh0KTpfdCgyNTUqdCwwLDI1NSl9cmV0dXJuIGk9K2VbMV0scz0rZVszXSxuPStlWzVdLGk9MjU1JihlWzJdP3l0KGkpOl90KGksMCwyNTUpKSxzPTI1NSYoZVs0XT95dChzKTpfdChzLDAsMjU1KSksbj0yNTUmKGVbNl0/eXQobik6X3QobiwwLDI1NSkpLHtyOmksZzpzLGI6bixhOm99fX0odCk6ZnVuY3Rpb24odCl7Y29uc3QgZT1PdC5leGVjKHQpO2xldCBpLHM9MjU1O2lmKCFlKXJldHVybjtlWzVdIT09aSYmKHM9ZVs2XT95dCgrZVs1XSk6dnQoK2VbNV0pKTtjb25zdCBuPXp0KCtlWzJdKSxvPStlWzNdLzEwMCxhPStlWzRdLzEwMDtyZXR1cm4gaT0iaHdiIj09PWVbMV0/ZnVuY3Rpb24odCxlLGkpe3JldHVybiBSdChMdCx0LGUsaSl9KG4sbyxhKToiaHN2Ij09PWVbMV0/ZnVuY3Rpb24odCxlLGkpe3JldHVybiBSdChUdCx0LGUsaSl9KG4sbyxhKTpJdChuLG8sYSkse3I6aVswXSxnOmlbMV0sYjppWzJdLGE6c319KHQpfWNsYXNzIFh0e2NvbnN0cnVjdG9yKHQpe2lmKHQgaW5zdGFuY2VvZiBYdClyZXR1cm4gdDtjb25zdCBlPXR5cGVvZiB0O2xldCBpO3ZhciBzLG4sbzsib2JqZWN0Ij09PWU/aT1ZdCh0KToic3RyaW5nIj09PWUmJihvPShzPXQpLmxlbmd0aCwiIyI9PT1zWzBdJiYoND09PW98fDU9PT1vP249e3I6MjU1JjE3Kmt0W3NbMV1dLGc6MjU1JjE3Kmt0W3NbMl1dLGI6MjU1JjE3Kmt0W3NbM11dLGE6NT09PW8/MTcqa3Rbc1s0XV06MjU1fTo3IT09byYmOSE9PW98fChuPXtyOmt0W3NbMV1dPDw0fGt0W3NbMl1dLGc6a3Rbc1szXV08PDR8a3Rbc1s0XV0sYjprdFtzWzVdXTw8NHxrdFtzWzZdXSxhOjk9PT1vP2t0W3NbN11dPDw0fGt0W3NbOF1dOjI1NX0pKSxpPW58fGZ1bmN0aW9uKHQpe0J0fHwoQnQ9ZnVuY3Rpb24oKXtjb25zdCB0PXt9LGU9T2JqZWN0LmtleXMoVnQpLGk9T2JqZWN0LmtleXMoRnQpO2xldCBzLG4sbyxhLHI7Zm9yKHM9MDtzPGUubGVuZ3RoO3MrKyl7Zm9yKGE9cj1lW3NdLG49MDtuPGkubGVuZ3RoO24rKylvPWlbbl0scj1yLnJlcGxhY2UobyxGdFtvXSk7bz1wYXJzZUludChWdFthXSwxNiksdFtyXT1bbz4+MTYmMjU1LG8+PjgmMjU1LDI1NSZvXX1yZXR1cm4gdH0oKSxCdC50cmFuc3BhcmVudD1bMCwwLDAsMF0pO2NvbnN0IGU9QnRbdC50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gZSYme3I6ZVswXSxnOmVbMV0sYjplWzJdLGE6ND09PWUubGVuZ3RoP2VbM106MjU1fX0odCl8fFV0KHQpKSx0aGlzLl9yZ2I9aSx0aGlzLl92YWxpZD0hIWl9Z2V0IHZhbGlkKCl7cmV0dXJuIHRoaXMuX3ZhbGlkfWdldCByZ2IoKXt2YXIgdD0kdCh0aGlzLl9yZ2IpO3JldHVybiB0JiYodC5hPU10KHQuYSkpLHR9c2V0IHJnYih0KXt0aGlzLl9yZ2I9WXQodCl9cmdiU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3ZhbGlkPyh0PXRoaXMuX3JnYikmJih0LmE8MjU1P2ByZ2JhKCR7dC5yfSwgJHt0Lmd9LCAke3QuYn0sICR7TXQodC5hKX0pYDpgcmdiKCR7dC5yfSwgJHt0Lmd9LCAke3QuYn0pYCk6dm9pZCAwO3ZhciB0fWhleFN0cmluZygpe3JldHVybiB0aGlzLl92YWxpZD9mdW5jdGlvbih0KXt2YXIgZT0odD0+Q3QodC5yKSYmQ3QodC5nKSYmQ3QodC5iKSYmQ3QodC5hKSkodCk/UHQ6RHQ7cmV0dXJuIHQ/IiMiK2UodC5yKStlKHQuZykrZSh0LmIpKygodCxlKT0+dDwyNTU/ZSh0KToiIikodC5hLGUpOnZvaWQgMH0odGhpcy5fcmdiKTp2b2lkIDB9aHNsU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3ZhbGlkP2Z1bmN0aW9uKHQpe2lmKCF0KXJldHVybjtjb25zdCBlPUV0KHQpLGk9ZVswXSxzPXd0KGVbMV0pLG49d3QoZVsyXSk7cmV0dXJuIHQuYTwyNTU/YGhzbGEoJHtpfSwgJHtzfSUsICR7bn0lLCAke010KHQuYSl9KWA6YGhzbCgke2l9LCAke3N9JSwgJHtufSUpYH0odGhpcy5fcmdiKTp2b2lkIDB9bWl4KHQsZSl7aWYodCl7Y29uc3QgaT10aGlzLnJnYixzPXQucmdiO2xldCBuO2NvbnN0IG89ZT09PW4/LjU6ZSxhPTIqby0xLHI9aS5hLXMuYSxsPSgoYSpyPT0tMT9hOihhK3IpLygxK2EqcikpKzEpLzI7bj0xLWwsaS5yPTI1NSZsKmkucituKnMucisuNSxpLmc9MjU1JmwqaS5nK24qcy5nKy41LGkuYj0yNTUmbCppLmIrbipzLmIrLjUsaS5hPW8qaS5hKygxLW8pKnMuYSx0aGlzLnJnYj1pfXJldHVybiB0aGlzfWludGVycG9sYXRlKHQsZSl7cmV0dXJuIHQmJih0aGlzLl9yZ2I9ZnVuY3Rpb24odCxlLGkpe2NvbnN0IHM9SHQoTXQodC5yKSksbj1IdChNdCh0LmcpKSxvPUh0KE10KHQuYikpO3JldHVybntyOnZ0KE50KHMraSooSHQoTXQoZS5yKSktcykpKSxnOnZ0KE50KG4raSooSHQoTXQoZS5nKSktbikpKSxiOnZ0KE50KG8raSooSHQoTXQoZS5iKSktbykpKSxhOnQuYStpKihlLmEtdC5hKX19KHRoaXMuX3JnYix0Ll9yZ2IsZSkpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IFh0KHRoaXMucmdiKX1hbHBoYSh0KXtyZXR1cm4gdGhpcy5fcmdiLmE9dnQodCksdGhpc31jbGVhcmVyKHQpe3JldHVybiB0aGlzLl9yZ2IuYSo9MS10LHRoaXN9Z3JleXNjYWxlKCl7Y29uc3QgdD10aGlzLl9yZ2IsZT14dCguMyp0LnIrLjU5KnQuZysuMTEqdC5iKTtyZXR1cm4gdC5yPXQuZz10LmI9ZSx0aGlzfW9wYXF1ZXIodCl7cmV0dXJuIHRoaXMuX3JnYi5hKj0xK3QsdGhpc31uZWdhdGUoKXtjb25zdCB0PXRoaXMuX3JnYjtyZXR1cm4gdC5yPTI1NS10LnIsdC5nPTI1NS10LmcsdC5iPTI1NS10LmIsdGhpc31saWdodGVuKHQpe3JldHVybiBqdCh0aGlzLl9yZ2IsMix0KSx0aGlzfWRhcmtlbih0KXtyZXR1cm4ganQodGhpcy5fcmdiLDIsLXQpLHRoaXN9c2F0dXJhdGUodCl7cmV0dXJuIGp0KHRoaXMuX3JnYiwxLHQpLHRoaXN9ZGVzYXR1cmF0ZSh0KXtyZXR1cm4ganQodGhpcy5fcmdiLDEsLXQpLHRoaXN9cm90YXRlKHQpe3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBpPUV0KHQpO2lbMF09enQoaVswXStlKSxpPUl0KGkpLHQucj1pWzBdLHQuZz1pWzFdLHQuYj1pWzJdfSh0aGlzLl9yZ2IsdCksdGhpc319ZnVuY3Rpb24gcXQodCl7aWYodCYmIm9iamVjdCI9PXR5cGVvZiB0KXtjb25zdCBlPXQudG9TdHJpbmcoKTtyZXR1cm4iW29iamVjdCBDYW52YXNQYXR0ZXJuXSI9PT1lfHwiW29iamVjdCBDYW52YXNHcmFkaWVudF0iPT09ZX1yZXR1cm4hMX1mdW5jdGlvbiBLdCh0KXtyZXR1cm4gcXQodCk/dDpuZXcgWHQodCl9ZnVuY3Rpb24gR3QodCl7cmV0dXJuIHF0KHQpP3Q6bmV3IFh0KHQpLnNhdHVyYXRlKC41KS5kYXJrZW4oLjEpLmhleFN0cmluZygpfWNvbnN0IFp0PVsieCIsInkiLCJib3JkZXJXaWR0aCIsInJhZGl1cyIsInRlbnNpb24iXSxKdD1bImNvbG9yIiwiYm9yZGVyQ29sb3IiLCJiYWNrZ3JvdW5kQ29sb3IiXSxRdD1uZXcgTWFwO2Z1bmN0aW9uIHRlKHQsZSxpKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtlPWV8fHt9O2NvbnN0IGk9dCtKU09OLnN0cmluZ2lmeShlKTtsZXQgcz1RdC5nZXQoaSk7cmV0dXJuIHN8fChzPW5ldyBJbnRsLk51bWJlckZvcm1hdCh0LGUpLFF0LnNldChpLHMpKSxzfShlLGkpLmZvcm1hdCh0KX1jb25zdCBlZT17dmFsdWVzOnQ9Pm4odCk/dDoiIit0LG51bWVyaWModCxlLGkpe2lmKDA9PT10KXJldHVybiIwIjtjb25zdCBzPXRoaXMuY2hhcnQub3B0aW9ucy5sb2NhbGU7bGV0IG4sbz10O2lmKGkubGVuZ3RoPjEpe2NvbnN0IGU9TWF0aC5tYXgoTWF0aC5hYnMoaVswXS52YWx1ZSksTWF0aC5hYnMoaVtpLmxlbmd0aC0xXS52YWx1ZSkpOyhlPDFlLTR8fGU+MWUxNSkmJihuPSJzY2llbnRpZmljIiksbz1mdW5jdGlvbih0LGUpe2xldCBpPWUubGVuZ3RoPjM/ZVsyXS52YWx1ZS1lWzFdLnZhbHVlOmVbMV0udmFsdWUtZVswXS52YWx1ZTtyZXR1cm4gTWF0aC5hYnMoaSk+PTEmJnQhPT1NYXRoLmZsb29yKHQpJiYoaT10LU1hdGguZmxvb3IodCkpLGl9KHQsaSl9Y29uc3QgYT16KE1hdGguYWJzKG8pKSxyPWlzTmFOKGEpPzE6TWF0aC5tYXgoTWF0aC5taW4oLTEqTWF0aC5mbG9vcihhKSwyMCksMCksbD17bm90YXRpb246bixtaW5pbXVtRnJhY3Rpb25EaWdpdHM6cixtYXhpbXVtRnJhY3Rpb25EaWdpdHM6cn07cmV0dXJuIE9iamVjdC5hc3NpZ24obCx0aGlzLm9wdGlvbnMudGlja3MuZm9ybWF0KSx0ZSh0LHMsbCl9LGxvZ2FyaXRobWljKHQsZSxpKXtpZigwPT09dClyZXR1cm4iMCI7Y29uc3Qgcz1pW2VdLnNpZ25pZmljYW5kfHx0L01hdGgucG93KDEwLE1hdGguZmxvb3Ioeih0KSkpO3JldHVyblsxLDIsMyw1LDEwLDE1XS5pbmNsdWRlcyhzKXx8ZT4uOCppLmxlbmd0aD9lZS5udW1lcmljLmNhbGwodGhpcyx0LGUsaSk6IiJ9fTt2YXIgaWU9e2Zvcm1hdHRlcnM6ZWV9O2NvbnN0IHNlPU9iamVjdC5jcmVhdGUobnVsbCksbmU9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBvZSh0LGUpe2lmKCFlKXJldHVybiB0O2NvbnN0IGk9ZS5zcGxpdCgiLiIpO2ZvcihsZXQgZT0wLHM9aS5sZW5ndGg7ZTxzOysrZSl7Y29uc3Qgcz1pW2VdO3Q9dFtzXXx8KHRbc109T2JqZWN0LmNyZWF0ZShudWxsKSl9cmV0dXJuIHR9ZnVuY3Rpb24gYWUodCxlLGkpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9iKG9lKHQsZSksaSk6YihvZSh0LCIiKSxlKX12YXIgcmU9bmV3IGNsYXNze2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5hbmltYXRpb249dm9pZCAwLHRoaXMuYmFja2dyb3VuZENvbG9yPSJyZ2JhKDAsMCwwLDAuMSkiLHRoaXMuYm9yZGVyQ29sb3I9InJnYmEoMCwwLDAsMC4xKSIsdGhpcy5jb2xvcj0iIzY2NiIsdGhpcy5kYXRhc2V0cz17fSx0aGlzLmRldmljZVBpeGVsUmF0aW89dD0+dC5jaGFydC5wbGF0Zm9ybS5nZXREZXZpY2VQaXhlbFJhdGlvKCksdGhpcy5lbGVtZW50cz17fSx0aGlzLmV2ZW50cz1bIm1vdXNlbW92ZSIsIm1vdXNlb3V0IiwiY2xpY2siLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIl0sdGhpcy5mb250PXtmYW1pbHk6IidIZWx2ZXRpY2EgTmV1ZScsICdIZWx2ZXRpY2EnLCAnQXJpYWwnLCBzYW5zLXNlcmlmIixzaXplOjEyLHN0eWxlOiJub3JtYWwiLGxpbmVIZWlnaHQ6MS4yLHdlaWdodDpudWxsfSx0aGlzLmhvdmVyPXt9LHRoaXMuaG92ZXJCYWNrZ3JvdW5kQ29sb3I9KHQsZSk9Pkd0KGUuYmFja2dyb3VuZENvbG9yKSx0aGlzLmhvdmVyQm9yZGVyQ29sb3I9KHQsZSk9Pkd0KGUuYm9yZGVyQ29sb3IpLHRoaXMuaG92ZXJDb2xvcj0odCxlKT0+R3QoZS5jb2xvciksdGhpcy5pbmRleEF4aXM9IngiLHRoaXMuaW50ZXJhY3Rpb249e21vZGU6Im5lYXJlc3QiLGludGVyc2VjdDohMCxpbmNsdWRlSW52aXNpYmxlOiExfSx0aGlzLm1haW50YWluQXNwZWN0UmF0aW89ITAsdGhpcy5vbkhvdmVyPW51bGwsdGhpcy5vbkNsaWNrPW51bGwsdGhpcy5wYXJzaW5nPSEwLHRoaXMucGx1Z2lucz17fSx0aGlzLnJlc3BvbnNpdmU9ITAsdGhpcy5zY2FsZT12b2lkIDAsdGhpcy5zY2FsZXM9e30sdGhpcy5zaG93TGluZT0hMCx0aGlzLmRyYXdBY3RpdmVFbGVtZW50c09uVG9wPSEwLHRoaXMuZGVzY3JpYmUodCksdGhpcy5hcHBseShlKX1zZXQodCxlKXtyZXR1cm4gYWUodGhpcyx0LGUpfWdldCh0KXtyZXR1cm4gb2UodGhpcyx0KX1kZXNjcmliZSh0LGUpe3JldHVybiBhZShuZSx0LGUpfW92ZXJyaWRlKHQsZSl7cmV0dXJuIGFlKHNlLHQsZSl9cm91dGUodCxlLGkscyl7Y29uc3Qgbj1vZSh0aGlzLHQpLGE9b2UodGhpcyxpKSxyPSJfIitlO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG4se1tyXTp7dmFsdWU6bltlXSx3cml0YWJsZTohMH0sW2VdOntlbnVtZXJhYmxlOiEwLGdldCgpe2NvbnN0IHQ9dGhpc1tyXSxlPWFbc107cmV0dXJuIG8odCk/T2JqZWN0LmFzc2lnbih7fSxlLHQpOmwodCxlKX0sc2V0KHQpe3RoaXNbcl09dH19fSl9YXBwbHkodCl7dC5mb3JFYWNoKHQ9PnQodGhpcykpfX0oe19zY3JpcHRhYmxlOnQ9PiF0LnN0YXJ0c1dpdGgoIm9uIiksX2luZGV4YWJsZTp0PT4iZXZlbnRzIiE9PXQsaG92ZXI6e19mYWxsYmFjazoiaW50ZXJhY3Rpb24ifSxpbnRlcmFjdGlvbjp7X3NjcmlwdGFibGU6ITEsX2luZGV4YWJsZTohMX19LFtmdW5jdGlvbih0KXt0LnNldCgiYW5pbWF0aW9uIix7ZGVsYXk6dm9pZCAwLGR1cmF0aW9uOjFlMyxlYXNpbmc6ImVhc2VPdXRRdWFydCIsZm46dm9pZCAwLGZyb206dm9pZCAwLGxvb3A6dm9pZCAwLHRvOnZvaWQgMCx0eXBlOnZvaWQgMH0pLHQuZGVzY3JpYmUoImFuaW1hdGlvbiIse19mYWxsYmFjazohMSxfaW5kZXhhYmxlOiExLF9zY3JpcHRhYmxlOnQ9PiJvblByb2dyZXNzIiE9PXQmJiJvbkNvbXBsZXRlIiE9PXQmJiJmbiIhPT10fSksdC5zZXQoImFuaW1hdGlvbnMiLHtjb2xvcnM6e3R5cGU6ImNvbG9yIixwcm9wZXJ0aWVzOkp0fSxudW1iZXJzOnt0eXBlOiJudW1iZXIiLHByb3BlcnRpZXM6WnR9fSksdC5kZXNjcmliZSgiYW5pbWF0aW9ucyIse19mYWxsYmFjazoiYW5pbWF0aW9uIn0pLHQuc2V0KCJ0cmFuc2l0aW9ucyIse2FjdGl2ZTp7YW5pbWF0aW9uOntkdXJhdGlvbjo0MDB9fSxyZXNpemU6e2FuaW1hdGlvbjp7ZHVyYXRpb246MH19LHNob3c6e2FuaW1hdGlvbnM6e2NvbG9yczp7ZnJvbToidHJhbnNwYXJlbnQifSx2aXNpYmxlOnt0eXBlOiJib29sZWFuIixkdXJhdGlvbjowfX19LGhpZGU6e2FuaW1hdGlvbnM6e2NvbG9yczp7dG86InRyYW5zcGFyZW50In0sdmlzaWJsZTp7dHlwZToiYm9vbGVhbiIsZWFzaW5nOiJsaW5lYXIiLGZuOnQ9PjB8dH19fX0pfSxmdW5jdGlvbih0KXt0LnNldCgibGF5b3V0Iix7YXV0b1BhZGRpbmc6ITAscGFkZGluZzp7dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9fSl9LGZ1bmN0aW9uKHQpe3Quc2V0KCJzY2FsZSIse2Rpc3BsYXk6ITAsb2Zmc2V0OiExLHJldmVyc2U6ITEsYmVnaW5BdFplcm86ITEsYm91bmRzOiJ0aWNrcyIsY2xpcDohMCxncmFjZTowLGdyaWQ6e2Rpc3BsYXk6ITAsbGluZVdpZHRoOjEsZHJhd09uQ2hhcnRBcmVhOiEwLGRyYXdUaWNrczohMCx0aWNrTGVuZ3RoOjgsdGlja1dpZHRoOih0LGUpPT5lLmxpbmVXaWR0aCx0aWNrQ29sb3I6KHQsZSk9PmUuY29sb3Isb2Zmc2V0OiExfSxib3JkZXI6e2Rpc3BsYXk6ITAsZGFzaDpbXSxkYXNoT2Zmc2V0OjAsd2lkdGg6MX0sdGl0bGU6e2Rpc3BsYXk6ITEsdGV4dDoiIixwYWRkaW5nOnt0b3A6NCxib3R0b206NH19LHRpY2tzOnttaW5Sb3RhdGlvbjowLG1heFJvdGF0aW9uOjUwLG1pcnJvcjohMSx0ZXh0U3Ryb2tlV2lkdGg6MCx0ZXh0U3Ryb2tlQ29sb3I6IiIscGFkZGluZzozLGRpc3BsYXk6ITAsYXV0b1NraXA6ITAsYXV0b1NraXBQYWRkaW5nOjMsbGFiZWxPZmZzZXQ6MCxjYWxsYmFjazppZS5mb3JtYXR0ZXJzLnZhbHVlcyxtaW5vcjp7fSxtYWpvcjp7fSxhbGlnbjoiY2VudGVyIixjcm9zc0FsaWduOiJuZWFyIixzaG93TGFiZWxCYWNrZHJvcDohMSxiYWNrZHJvcENvbG9yOiJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpIixiYWNrZHJvcFBhZGRpbmc6Mn19KSx0LnJvdXRlKCJzY2FsZS50aWNrcyIsImNvbG9yIiwiIiwiY29sb3IiKSx0LnJvdXRlKCJzY2FsZS5ncmlkIiwiY29sb3IiLCIiLCJib3JkZXJDb2xvciIpLHQucm91dGUoInNjYWxlLmJvcmRlciIsImNvbG9yIiwiIiwiYm9yZGVyQ29sb3IiKSx0LnJvdXRlKCJzY2FsZS50aXRsZSIsImNvbG9yIiwiIiwiY29sb3IiKSx0LmRlc2NyaWJlKCJzY2FsZSIse19mYWxsYmFjazohMSxfc2NyaXB0YWJsZTp0PT4hdC5zdGFydHNXaXRoKCJiZWZvcmUiKSYmIXQuc3RhcnRzV2l0aCgiYWZ0ZXIiKSYmImNhbGxiYWNrIiE9PXQmJiJwYXJzZXIiIT09dCxfaW5kZXhhYmxlOnQ9PiJib3JkZXJEYXNoIiE9PXQmJiJ0aWNrQm9yZGVyRGFzaCIhPT10JiYiZGFzaCIhPT10fSksdC5kZXNjcmliZSgic2NhbGVzIix7X2ZhbGxiYWNrOiJzY2FsZSJ9KSx0LmRlc2NyaWJlKCJzY2FsZS50aWNrcyIse19zY3JpcHRhYmxlOnQ9PiJiYWNrZHJvcFBhZGRpbmciIT09dCYmImNhbGxiYWNrIiE9PXQsX2luZGV4YWJsZTp0PT4iYmFja2Ryb3BQYWRkaW5nIiE9PXR9KX1dKTtmdW5jdGlvbiBsZSgpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50fWZ1bmN0aW9uIGhlKHQpe2xldCBlPXQucGFyZW50Tm9kZTtyZXR1cm4gZSYmIltvYmplY3QgU2hhZG93Um9vdF0iPT09ZS50b1N0cmluZygpJiYoZT1lLmhvc3QpLGV9ZnVuY3Rpb24gY2UodCxlLGkpe2xldCBzO3JldHVybiJzdHJpbmciPT10eXBlb2YgdD8ocz1wYXJzZUludCh0LDEwKSwtMSE9PXQuaW5kZXhPZigiJSIpJiYocz1zLzEwMCplLnBhcmVudE5vZGVbaV0pKTpzPXQsc31jb25zdCBkZT10PT50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpO2Z1bmN0aW9uIHVlKHQsZSl7cmV0dXJuIGRlKHQpLmdldFByb3BlcnR5VmFsdWUoZSl9Y29uc3QgZmU9WyJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXTtmdW5jdGlvbiBnZSh0LGUsaSl7Y29uc3Qgcz17fTtpPWk/Ii0iK2k6IiI7Zm9yKGxldCBuPTA7bjw0O24rKyl7Y29uc3Qgbz1mZVtuXTtzW29dPXBhcnNlRmxvYXQodFtlKyItIitvK2ldKXx8MH1yZXR1cm4gcy53aWR0aD1zLmxlZnQrcy5yaWdodCxzLmhlaWdodD1zLnRvcCtzLmJvdHRvbSxzfWZ1bmN0aW9uIHBlKHQsZSl7aWYoIm5hdGl2ZSJpbiB0KXJldHVybiB0O2NvbnN0e2NhbnZhczppLGN1cnJlbnREZXZpY2VQaXhlbFJhdGlvOnN9PWUsbj1kZShpKSxvPSJib3JkZXItYm94Ij09PW4uYm94U2l6aW5nLGE9Z2UobiwicGFkZGluZyIpLHI9Z2UobiwiYm9yZGVyIiwid2lkdGgiKSx7eDpsLHk6aCxib3g6Y309ZnVuY3Rpb24odCxlKXtjb25zdCBpPXQudG91Y2hlcyxzPWkmJmkubGVuZ3RoP2lbMF06dCx7b2Zmc2V0WDpuLG9mZnNldFk6b309cztsZXQgYSxyLGw9ITE7aWYoKCh0LGUsaSk9Pih0PjB8fGU+MCkmJighaXx8IWkuc2hhZG93Um9vdCkpKG4sbyx0LnRhcmdldCkpYT1uLHI9bztlbHNle2NvbnN0IHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTthPXMuY2xpZW50WC10LmxlZnQscj1zLmNsaWVudFktdC50b3AsbD0hMH1yZXR1cm57eDphLHk6cixib3g6bH19KHQsaSksZD1hLmxlZnQrKGMmJnIubGVmdCksdT1hLnRvcCsoYyYmci50b3ApO2xldHt3aWR0aDpmLGhlaWdodDpnfT1lO3JldHVybiBvJiYoZi09YS53aWR0aCtyLndpZHRoLGctPWEuaGVpZ2h0K3IuaGVpZ2h0KSx7eDpNYXRoLnJvdW5kKChsLWQpL2YqaS53aWR0aC9zKSx5Ok1hdGgucm91bmQoKGgtdSkvZyppLmhlaWdodC9zKX19Y29uc3QgbWU9dD0+TWF0aC5yb3VuZCgxMCp0KS8xMDtmdW5jdGlvbiBiZSh0LGUsaSxzKXtjb25zdCBuPWRlKHQpLG89Z2UobiwibWFyZ2luIiksYT1jZShuLm1heFdpZHRoLHQsImNsaWVudFdpZHRoIil8fFQscj1jZShuLm1heEhlaWdodCx0LCJjbGllbnRIZWlnaHQiKXx8VCxsPWZ1bmN0aW9uKHQsZSxpKXtsZXQgcyxuO2lmKHZvaWQgMD09PWV8fHZvaWQgMD09PWkpe2NvbnN0IG89aGUodCk7aWYobyl7Y29uc3QgdD1vLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGE9ZGUobykscj1nZShhLCJib3JkZXIiLCJ3aWR0aCIpLGw9Z2UoYSwicGFkZGluZyIpO2U9dC53aWR0aC1sLndpZHRoLXIud2lkdGgsaT10LmhlaWdodC1sLmhlaWdodC1yLmhlaWdodCxzPWNlKGEubWF4V2lkdGgsbywiY2xpZW50V2lkdGgiKSxuPWNlKGEubWF4SGVpZ2h0LG8sImNsaWVudEhlaWdodCIpfWVsc2UgZT10LmNsaWVudFdpZHRoLGk9dC5jbGllbnRIZWlnaHR9cmV0dXJue3dpZHRoOmUsaGVpZ2h0OmksbWF4V2lkdGg6c3x8VCxtYXhIZWlnaHQ6bnx8VH19KHQsZSxpKTtsZXR7d2lkdGg6aCxoZWlnaHQ6Y309bDtpZigiY29udGVudC1ib3giPT09bi5ib3hTaXppbmcpe2NvbnN0IHQ9Z2UobiwiYm9yZGVyIiwid2lkdGgiKSxlPWdlKG4sInBhZGRpbmciKTtoLT1lLndpZHRoK3Qud2lkdGgsYy09ZS5oZWlnaHQrdC5oZWlnaHR9cmV0dXJuIGg9TWF0aC5tYXgoMCxoLW8ud2lkdGgpLGM9TWF0aC5tYXgoMCxzP2gvczpjLW8uaGVpZ2h0KSxoPW1lKE1hdGgubWluKGgsYSxsLm1heFdpZHRoKSksYz1tZShNYXRoLm1pbihjLHIsbC5tYXhIZWlnaHQpKSxoJiYhYyYmKGM9bWUoaC8yKSksKHZvaWQgMCE9PWV8fHZvaWQgMCE9PWkpJiZzJiZsLmhlaWdodCYmYz5sLmhlaWdodCYmKGM9bC5oZWlnaHQsaD1tZShNYXRoLmZsb29yKGMqcykpKSx7d2lkdGg6aCxoZWlnaHQ6Y319ZnVuY3Rpb24geGUodCxlLGkpe2NvbnN0IHM9ZXx8MSxuPU1hdGguZmxvb3IodC5oZWlnaHQqcyksbz1NYXRoLmZsb29yKHQud2lkdGgqcyk7dC5oZWlnaHQ9TWF0aC5mbG9vcih0LmhlaWdodCksdC53aWR0aD1NYXRoLmZsb29yKHQud2lkdGgpO2NvbnN0IGE9dC5jYW52YXM7cmV0dXJuIGEuc3R5bGUmJihpfHwhYS5zdHlsZS5oZWlnaHQmJiFhLnN0eWxlLndpZHRoKSYmKGEuc3R5bGUuaGVpZ2h0PWAke3QuaGVpZ2h0fXB4YCxhLnN0eWxlLndpZHRoPWAke3Qud2lkdGh9cHhgKSwodC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyE9PXN8fGEuaGVpZ2h0IT09bnx8YS53aWR0aCE9PW8pJiYodC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbz1zLGEuaGVpZ2h0PW4sYS53aWR0aD1vLHQuY3R4LnNldFRyYW5zZm9ybShzLDAsMCxzLDAsMCksITApfWNvbnN0IF9lPWZ1bmN0aW9uKCl7bGV0IHQ9ITE7dHJ5e2NvbnN0IGU9e2dldCBwYXNzaXZlKCl7cmV0dXJuIHQ9ITAsITF9fTtsZSgpJiYod2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLG51bGwsZSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLG51bGwsZSkpfWNhdGNoKHQpe31yZXR1cm4gdH0oKTtmdW5jdGlvbiB5ZSh0LGUpe2NvbnN0IGk9dWUodCxlKSxzPWkmJmkubWF0Y2goL14oXGQrKShcLlxkKyk/cHgkLyk7cmV0dXJuIHM/K3NbMV06dm9pZCAwfWZ1bmN0aW9uIHZlKHQpe3JldHVybiF0fHxzKHQuc2l6ZSl8fHModC5mYW1pbHkpP251bGw6KHQuc3R5bGU/dC5zdHlsZSsiICI6IiIpKyh0LndlaWdodD90LndlaWdodCsiICI6IiIpK3Quc2l6ZSsicHggIit0LmZhbWlseX1mdW5jdGlvbiBNZSh0LGUsaSxzLG4pe2xldCBvPWVbbl07cmV0dXJuIG98fChvPWVbbl09dC5tZWFzdXJlVGV4dChuKS53aWR0aCxpLnB1c2gobikpLG8+cyYmKHM9byksc31mdW5jdGlvbiB3ZSh0LGUsaSxzKXtsZXQgbz0ocz1zfHx7fSkuZGF0YT1zLmRhdGF8fHt9LGE9cy5nYXJiYWdlQ29sbGVjdD1zLmdhcmJhZ2VDb2xsZWN0fHxbXTtzLmZvbnQhPT1lJiYobz1zLmRhdGE9e30sYT1zLmdhcmJhZ2VDb2xsZWN0PVtdLHMuZm9udD1lKSx0LnNhdmUoKSx0LmZvbnQ9ZTtsZXQgcj0wO2NvbnN0IGw9aS5sZW5ndGg7bGV0IGgsYyxkLHUsZjtmb3IoaD0wO2g8bDtoKyspaWYodT1pW2hdLG51bGw9PXV8fG4odSkpe2lmKG4odSkpZm9yKGM9MCxkPXUubGVuZ3RoO2M8ZDtjKyspZj11W2NdLG51bGw9PWZ8fG4oZil8fChyPU1lKHQsbyxhLHIsZikpfWVsc2Ugcj1NZSh0LG8sYSxyLHUpO3QucmVzdG9yZSgpO2NvbnN0IGc9YS5sZW5ndGgvMjtpZihnPmkubGVuZ3RoKXtmb3IoaD0wO2g8ZztoKyspZGVsZXRlIG9bYVtoXV07YS5zcGxpY2UoMCxnKX1yZXR1cm4gcn1mdW5jdGlvbiBrZSh0LGUsaSl7Y29uc3Qgcz10LmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvLG49MCE9PWk/TWF0aC5tYXgoaS8yLC41KTowO3JldHVybiBNYXRoLnJvdW5kKChlLW4pKnMpL3Mrbn1mdW5jdGlvbiBTZSh0LGUpeyhlPWV8fHQuZ2V0Q29udGV4dCgiMmQiKSkuc2F2ZSgpLGUucmVzZXRUcmFuc2Zvcm0oKSxlLmNsZWFyUmVjdCgwLDAsdC53aWR0aCx0LmhlaWdodCksZS5yZXN0b3JlKCl9ZnVuY3Rpb24gUGUodCxlLGkscyl7RGUodCxlLGkscyxudWxsKX1mdW5jdGlvbiBEZSh0LGUsaSxzLG4pe2xldCBvLGEscixsLGgsYyxkLHU7Y29uc3QgZj1lLnBvaW50U3R5bGUsZz1lLnJvdGF0aW9uLHA9ZS5yYWRpdXM7bGV0IG09KGd8fDApKkw7aWYoZiYmIm9iamVjdCI9PXR5cGVvZiBmJiYobz1mLnRvU3RyaW5nKCksIltvYmplY3QgSFRNTEltYWdlRWxlbWVudF0iPT09b3x8IltvYmplY3QgSFRNTENhbnZhc0VsZW1lbnRdIj09PW8pKXJldHVybiB0LnNhdmUoKSx0LnRyYW5zbGF0ZShpLHMpLHQucm90YXRlKG0pLHQuZHJhd0ltYWdlKGYsLWYud2lkdGgvMiwtZi5oZWlnaHQvMixmLndpZHRoLGYuaGVpZ2h0KSx2b2lkIHQucmVzdG9yZSgpO2lmKCEoaXNOYU4ocCl8fHA8PTApKXtzd2l0Y2godC5iZWdpblBhdGgoKSxmKXtkZWZhdWx0Om4/dC5lbGxpcHNlKGkscyxuLzIscCwwLDAsTyk6dC5hcmMoaSxzLHAsMCxPKSx0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UidHJpYW5nbGUiOmM9bj9uLzI6cCx0Lm1vdmVUbyhpK01hdGguc2luKG0pKmMscy1NYXRoLmNvcyhtKSpwKSxtKz1JLHQubGluZVRvKGkrTWF0aC5zaW4obSkqYyxzLU1hdGguY29zKG0pKnApLG0rPUksdC5saW5lVG8oaStNYXRoLnNpbihtKSpjLHMtTWF0aC5jb3MobSkqcCksdC5jbG9zZVBhdGgoKTticmVhaztjYXNlInJlY3RSb3VuZGVkIjpoPS41MTYqcCxsPXAtaCxhPU1hdGguY29zKG0rUikqbCxkPU1hdGguY29zKG0rUikqKG4/bi8yLWg6bCkscj1NYXRoLnNpbihtK1IpKmwsdT1NYXRoLnNpbihtK1IpKihuP24vMi1oOmwpLHQuYXJjKGktZCxzLXIsaCxtLUMsbS1FKSx0LmFyYyhpK3Uscy1hLGgsbS1FLG0pLHQuYXJjKGkrZCxzK3IsaCxtLG0rRSksdC5hcmMoaS11LHMrYSxoLG0rRSxtK0MpLHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSJyZWN0IjppZighZyl7bD1NYXRoLlNRUlQxXzIqcCxjPW4/bi8yOmwsdC5yZWN0KGktYyxzLWwsMipjLDIqbCk7YnJlYWt9bSs9UjtjYXNlInJlY3RSb3QiOmQ9TWF0aC5jb3MobSkqKG4/bi8yOnApLGE9TWF0aC5jb3MobSkqcCxyPU1hdGguc2luKG0pKnAsdT1NYXRoLnNpbihtKSoobj9uLzI6cCksdC5tb3ZlVG8oaS1kLHMtciksdC5saW5lVG8oaSt1LHMtYSksdC5saW5lVG8oaStkLHMrciksdC5saW5lVG8oaS11LHMrYSksdC5jbG9zZVBhdGgoKTticmVhaztjYXNlImNyb3NzUm90IjptKz1SO2Nhc2UiY3Jvc3MiOmQ9TWF0aC5jb3MobSkqKG4/bi8yOnApLGE9TWF0aC5jb3MobSkqcCxyPU1hdGguc2luKG0pKnAsdT1NYXRoLnNpbihtKSoobj9uLzI6cCksdC5tb3ZlVG8oaS1kLHMtciksdC5saW5lVG8oaStkLHMrciksdC5tb3ZlVG8oaSt1LHMtYSksdC5saW5lVG8oaS11LHMrYSk7YnJlYWs7Y2FzZSJzdGFyIjpkPU1hdGguY29zKG0pKihuP24vMjpwKSxhPU1hdGguY29zKG0pKnAscj1NYXRoLnNpbihtKSpwLHU9TWF0aC5zaW4obSkqKG4/bi8yOnApLHQubW92ZVRvKGktZCxzLXIpLHQubGluZVRvKGkrZCxzK3IpLHQubW92ZVRvKGkrdSxzLWEpLHQubGluZVRvKGktdSxzK2EpLG0rPVIsZD1NYXRoLmNvcyhtKSoobj9uLzI6cCksYT1NYXRoLmNvcyhtKSpwLHI9TWF0aC5zaW4obSkqcCx1PU1hdGguc2luKG0pKihuP24vMjpwKSx0Lm1vdmVUbyhpLWQscy1yKSx0LmxpbmVUbyhpK2QscytyKSx0Lm1vdmVUbyhpK3Uscy1hKSx0LmxpbmVUbyhpLXUscythKTticmVhaztjYXNlImxpbmUiOmE9bj9uLzI6TWF0aC5jb3MobSkqcCxyPU1hdGguc2luKG0pKnAsdC5tb3ZlVG8oaS1hLHMtciksdC5saW5lVG8oaSthLHMrcik7YnJlYWs7Y2FzZSJkYXNoIjp0Lm1vdmVUbyhpLHMpLHQubGluZVRvKGkrTWF0aC5jb3MobSkqKG4/bi8yOnApLHMrTWF0aC5zaW4obSkqcCk7YnJlYWs7Y2FzZSExOnQuY2xvc2VQYXRoKCl9dC5maWxsKCksZS5ib3JkZXJXaWR0aD4wJiZ0LnN0cm9rZSgpfX1mdW5jdGlvbiBDZSh0LGUsaSl7cmV0dXJuIGk9aXx8LjUsIWV8fHQmJnQueD5lLmxlZnQtaSYmdC54PGUucmlnaHQraSYmdC55PmUudG9wLWkmJnQueTxlLmJvdHRvbStpfWZ1bmN0aW9uIE9lKHQsZSl7dC5zYXZlKCksdC5iZWdpblBhdGgoKSx0LnJlY3QoZS5sZWZ0LGUudG9wLGUucmlnaHQtZS5sZWZ0LGUuYm90dG9tLWUudG9wKSx0LmNsaXAoKX1mdW5jdGlvbiBBZSh0KXt0LnJlc3RvcmUoKX1mdW5jdGlvbiBUZSh0LGUsaSxzLG4pe2lmKCFlKXJldHVybiB0LmxpbmVUbyhpLngsaS55KTtpZigibWlkZGxlIj09PW4pe2NvbnN0IHM9KGUueCtpLngpLzI7dC5saW5lVG8ocyxlLnkpLHQubGluZVRvKHMsaS55KX1lbHNlImFmdGVyIj09PW4hPSEhcz90LmxpbmVUbyhlLngsaS55KTp0LmxpbmVUbyhpLngsZS55KTt0LmxpbmVUbyhpLngsaS55KX1mdW5jdGlvbiBMZSh0LGUsaSxzKXtpZighZSlyZXR1cm4gdC5saW5lVG8oaS54LGkueSk7dC5iZXppZXJDdXJ2ZVRvKHM/ZS5jcDF4OmUuY3AyeCxzP2UuY3AxeTplLmNwMnkscz9pLmNwMng6aS5jcDF4LHM/aS5jcDJ5OmkuY3AxeSxpLngsaS55KX1mdW5jdGlvbiBFZSh0LGUsaSxzLG4pe2lmKG4uc3RyaWtldGhyb3VnaHx8bi51bmRlcmxpbmUpe2NvbnN0IG89dC5tZWFzdXJlVGV4dChzKSxhPWUtby5hY3R1YWxCb3VuZGluZ0JveExlZnQscj1lK28uYWN0dWFsQm91bmRpbmdCb3hSaWdodCxsPWktby5hY3R1YWxCb3VuZGluZ0JveEFzY2VudCxoPWkrby5hY3R1YWxCb3VuZGluZ0JveERlc2NlbnQsYz1uLnN0cmlrZXRocm91Z2g/KGwraCkvMjpoO3Quc3Ryb2tlU3R5bGU9dC5maWxsU3R5bGUsdC5iZWdpblBhdGgoKSx0LmxpbmVXaWR0aD1uLmRlY29yYXRpb25XaWR0aHx8Mix0Lm1vdmVUbyhhLGMpLHQubGluZVRvKHIsYyksdC5zdHJva2UoKX19ZnVuY3Rpb24gUmUodCxlKXtjb25zdCBpPXQuZmlsbFN0eWxlO3QuZmlsbFN0eWxlPWUuY29sb3IsdC5maWxsUmVjdChlLmxlZnQsZS50b3AsZS53aWR0aCxlLmhlaWdodCksdC5maWxsU3R5bGU9aX1mdW5jdGlvbiBJZSh0LGUsaSxvLGEscj17fSl7Y29uc3QgbD1uKGUpP2U6W2VdLGg9ci5zdHJva2VXaWR0aD4wJiYiIiE9PXIuc3Ryb2tlQ29sb3I7bGV0IGMsZDtmb3IodC5zYXZlKCksdC5mb250PWEuc3RyaW5nLGZ1bmN0aW9uKHQsZSl7ZS50cmFuc2xhdGlvbiYmdC50cmFuc2xhdGUoZS50cmFuc2xhdGlvblswXSxlLnRyYW5zbGF0aW9uWzFdKSxzKGUucm90YXRpb24pfHx0LnJvdGF0ZShlLnJvdGF0aW9uKSxlLmNvbG9yJiYodC5maWxsU3R5bGU9ZS5jb2xvciksZS50ZXh0QWxpZ24mJih0LnRleHRBbGlnbj1lLnRleHRBbGlnbiksZS50ZXh0QmFzZWxpbmUmJih0LnRleHRCYXNlbGluZT1lLnRleHRCYXNlbGluZSl9KHQsciksYz0wO2M8bC5sZW5ndGg7KytjKWQ9bFtjXSxyLmJhY2tkcm9wJiZSZSh0LHIuYmFja2Ryb3ApLGgmJihyLnN0cm9rZUNvbG9yJiYodC5zdHJva2VTdHlsZT1yLnN0cm9rZUNvbG9yKSxzKHIuc3Ryb2tlV2lkdGgpfHwodC5saW5lV2lkdGg9ci5zdHJva2VXaWR0aCksdC5zdHJva2VUZXh0KGQsaSxvLHIubWF4V2lkdGgpKSx0LmZpbGxUZXh0KGQsaSxvLHIubWF4V2lkdGgpLEVlKHQsaSxvLGQsciksbys9TnVtYmVyKGEubGluZUhlaWdodCk7dC5yZXN0b3JlKCl9ZnVuY3Rpb24gemUodCxlKXtjb25zdHt4OmkseTpzLHc6bixoOm8scmFkaXVzOmF9PWU7dC5hcmMoaSthLnRvcExlZnQscythLnRvcExlZnQsYS50b3BMZWZ0LDEuNSpDLEMsITApLHQubGluZVRvKGkscytvLWEuYm90dG9tTGVmdCksdC5hcmMoaSthLmJvdHRvbUxlZnQscytvLWEuYm90dG9tTGVmdCxhLmJvdHRvbUxlZnQsQyxFLCEwKSx0LmxpbmVUbyhpK24tYS5ib3R0b21SaWdodCxzK28pLHQuYXJjKGkrbi1hLmJvdHRvbVJpZ2h0LHMrby1hLmJvdHRvbVJpZ2h0LGEuYm90dG9tUmlnaHQsRSwwLCEwKSx0LmxpbmVUbyhpK24scythLnRvcFJpZ2h0KSx0LmFyYyhpK24tYS50b3BSaWdodCxzK2EudG9wUmlnaHQsYS50b3BSaWdodCwwLC1FLCEwKSx0LmxpbmVUbyhpK2EudG9wTGVmdCxzKX1mdW5jdGlvbiBGZSh0LGU9WyIiXSxpLHMsbj0oKT0+dFswXSl7Y29uc3Qgbz1pfHx0O3ZvaWQgMD09PXMmJihzPXFlKCJfZmFsbGJhY2siLHQpKTtjb25zdCBhPXtbU3ltYm9sLnRvU3RyaW5nVGFnXToiT2JqZWN0IixfY2FjaGVhYmxlOiEwLF9zY29wZXM6dCxfcm9vdFNjb3BlczpvLF9mYWxsYmFjazpzLF9nZXRUYXJnZXQ6bixvdmVycmlkZTppPT5GZShbaSwuLi50XSxlLG8scyl9O3JldHVybiBuZXcgUHJveHkoYSx7ZGVsZXRlUHJvcGVydHk6KGUsaSk9PihkZWxldGUgZVtpXSxkZWxldGUgZS5fa2V5cyxkZWxldGUgdFswXVtpXSwhMCksZ2V0OihpLHMpPT5IZShpLHMsKCk9PmZ1bmN0aW9uKHQsZSxpLHMpe2xldCBuO2Zvcihjb25zdCBvIG9mIGUpaWYobj1xZShXZShvLHQpLGkpLHZvaWQgMCE9PW4pcmV0dXJuIE5lKHQsbik/VWUoaSxzLHQsbik6bn0ocyxlLHQsaSkpLGdldE93blByb3BlcnR5RGVzY3JpcHRvcjoodCxlKT0+UmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodC5fc2NvcGVzWzBdLGUpLGdldFByb3RvdHlwZU9mOigpPT5SZWZsZWN0LmdldFByb3RvdHlwZU9mKHRbMF0pLGhhczoodCxlKT0+S2UodCkuaW5jbHVkZXMoZSksb3duS2V5czp0PT5LZSh0KSxzZXQodCxlLGkpe2NvbnN0IHM9dC5fc3RvcmFnZXx8KHQuX3N0b3JhZ2U9bigpKTtyZXR1cm4gdFtlXT1zW2VdPWksZGVsZXRlIHQuX2tleXMsITB9fSl9ZnVuY3Rpb24gVmUodCxlLGkscyl7Y29uc3QgYT17X2NhY2hlYWJsZTohMSxfcHJveHk6dCxfY29udGV4dDplLF9zdWJQcm94eTppLF9zdGFjazpuZXcgU2V0LF9kZXNjcmlwdG9yczpCZSh0LHMpLHNldENvbnRleHQ6ZT0+VmUodCxlLGkscyksb3ZlcnJpZGU6bj0+VmUodC5vdmVycmlkZShuKSxlLGkscyl9O3JldHVybiBuZXcgUHJveHkoYSx7ZGVsZXRlUHJvcGVydHk6KGUsaSk9PihkZWxldGUgZVtpXSxkZWxldGUgdFtpXSwhMCksZ2V0Oih0LGUsaSk9PkhlKHQsZSwoKT0+ZnVuY3Rpb24odCxlLGkpe2NvbnN0e19wcm94eTpzLF9jb250ZXh0OmEsX3N1YlByb3h5OnIsX2Rlc2NyaXB0b3JzOmx9PXQ7bGV0IGg9c1tlXTtyZXR1cm4gUyhoKSYmbC5pc1NjcmlwdGFibGUoZSkmJihoPWZ1bmN0aW9uKHQsZSxpLHMpe2NvbnN0e19wcm94eTpuLF9jb250ZXh0Om8sX3N1YlByb3h5OmEsX3N0YWNrOnJ9PWk7aWYoci5oYXModCkpdGhyb3cgbmV3IEVycm9yKCJSZWN1cnNpb24gZGV0ZWN0ZWQ6ICIrQXJyYXkuZnJvbShyKS5qb2luKCItPiIpKyItPiIrdCk7ci5hZGQodCk7bGV0IGw9ZShvLGF8fHMpO3JldHVybiByLmRlbGV0ZSh0KSxOZSh0LGwpJiYobD1VZShuLl9zY29wZXMsbix0LGwpKSxsfShlLGgsdCxpKSksbihoKSYmaC5sZW5ndGgmJihoPWZ1bmN0aW9uKHQsZSxpLHMpe2NvbnN0e19wcm94eTpuLF9jb250ZXh0OmEsX3N1YlByb3h5OnIsX2Rlc2NyaXB0b3JzOmx9PWk7aWYodm9pZCAwIT09YS5pbmRleCYmcyh0KSlyZXR1cm4gZVthLmluZGV4JWUubGVuZ3RoXTtpZihvKGVbMF0pKXtjb25zdCBpPWUscz1uLl9zY29wZXMuZmlsdGVyKHQ9PnQhPT1pKTtlPVtdO2Zvcihjb25zdCBvIG9mIGkpe2NvbnN0IGk9VWUocyxuLHQsbyk7ZS5wdXNoKFZlKGksYSxyJiZyW3RdLGwpKX19cmV0dXJuIGV9KGUsaCx0LGwuaXNJbmRleGFibGUpKSxOZShlLGgpJiYoaD1WZShoLGEsciYmcltlXSxsKSksaH0odCxlLGkpKSxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6KGUsaSk9PmUuX2Rlc2NyaXB0b3JzLmFsbEtleXM/UmVmbGVjdC5oYXModCxpKT97ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9OnZvaWQgMDpSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGkpLGdldFByb3RvdHlwZU9mOigpPT5SZWZsZWN0LmdldFByb3RvdHlwZU9mKHQpLGhhczooZSxpKT0+UmVmbGVjdC5oYXModCxpKSxvd25LZXlzOigpPT5SZWZsZWN0Lm93bktleXModCksc2V0OihlLGkscyk9Pih0W2ldPXMsZGVsZXRlIGVbaV0sITApfSl9ZnVuY3Rpb24gQmUodCxlPXtzY3JpcHRhYmxlOiEwLGluZGV4YWJsZTohMH0pe2NvbnN0e19zY3JpcHRhYmxlOmk9ZS5zY3JpcHRhYmxlLF9pbmRleGFibGU6cz1lLmluZGV4YWJsZSxfYWxsS2V5czpuPWUuYWxsS2V5c309dDtyZXR1cm57YWxsS2V5czpuLHNjcmlwdGFibGU6aSxpbmRleGFibGU6cyxpc1NjcmlwdGFibGU6UyhpKT9pOigpPT5pLGlzSW5kZXhhYmxlOlMocyk/czooKT0+c319Y29uc3QgV2U9KHQsZSk9PnQ/dCt3KGUpOmUsTmU9KHQsZSk9Pm8oZSkmJiJhZGFwdGVycyIhPT10JiYobnVsbD09PU9iamVjdC5nZXRQcm90b3R5cGVPZihlKXx8ZS5jb25zdHJ1Y3Rvcj09PU9iamVjdCk7ZnVuY3Rpb24gSGUodCxlLGkpe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpKXJldHVybiB0W2VdO2NvbnN0IHM9aSgpO3JldHVybiB0W2VdPXMsc31mdW5jdGlvbiBqZSh0LGUsaSl7cmV0dXJuIFModCk/dChlLGkpOnR9Y29uc3QgJGU9KHQsZSk9PiEwPT09dD9lOiJzdHJpbmciPT10eXBlb2YgdD9NKGUsdCk6dm9pZCAwO2Z1bmN0aW9uIFllKHQsZSxpLHMsbil7Zm9yKGNvbnN0IG8gb2YgZSl7Y29uc3QgZT0kZShpLG8pO2lmKGUpe3QuYWRkKGUpO2NvbnN0IG89amUoZS5fZmFsbGJhY2ssaSxuKTtpZih2b2lkIDAhPT1vJiZvIT09aSYmbyE9PXMpcmV0dXJuIG99ZWxzZSBpZighMT09PWUmJnZvaWQgMCE9PXMmJmkhPT1zKXJldHVybiBudWxsfXJldHVybiExfWZ1bmN0aW9uIFVlKHQsZSxpLHMpe2NvbnN0IGE9ZS5fcm9vdFNjb3BlcyxyPWplKGUuX2ZhbGxiYWNrLGkscyksbD1bLi4udCwuLi5hXSxoPW5ldyBTZXQ7aC5hZGQocyk7bGV0IGM9WGUoaCxsLGkscnx8aSxzKTtyZXR1cm4gbnVsbCE9PWMmJih2b2lkIDA9PT1yfHxyPT09aXx8KGM9WGUoaCxsLHIsYyxzKSxudWxsIT09YykpJiZGZShBcnJheS5mcm9tKGgpLFsiIl0sYSxyLCgpPT5mdW5jdGlvbih0LGUsaSl7Y29uc3Qgcz10Ll9nZXRUYXJnZXQoKTtlIGluIHN8fChzW2VdPXt9KTtjb25zdCBhPXNbZV07cmV0dXJuIG4oYSkmJm8oaSk/aTphfHx7fX0oZSxpLHMpKX1mdW5jdGlvbiBYZSh0LGUsaSxzLG4pe2Zvcig7aTspaT1ZZSh0LGUsaSxzLG4pO3JldHVybiBpfWZ1bmN0aW9uIHFlKHQsZSl7Zm9yKGNvbnN0IGkgb2YgZSl7aWYoIWkpY29udGludWU7Y29uc3QgZT1pW3RdO2lmKHZvaWQgMCE9PWUpcmV0dXJuIGV9fWZ1bmN0aW9uIEtlKHQpe2xldCBlPXQuX2tleXM7cmV0dXJuIGV8fChlPXQuX2tleXM9ZnVuY3Rpb24odCl7Y29uc3QgZT1uZXcgU2V0O2Zvcihjb25zdCBpIG9mIHQpZm9yKGNvbnN0IHQgb2YgT2JqZWN0LmtleXMoaSkuZmlsdGVyKHQ9PiF0LnN0YXJ0c1dpdGgoIl8iKSkpZS5hZGQodCk7cmV0dXJuIEFycmF5LmZyb20oZSl9KHQuX3Njb3BlcykpLGV9ZnVuY3Rpb24gR2UodCxlLGkscyl7Y29uc3R7aVNjYWxlOm59PXQse2tleTpvPSJyIn09dGhpcy5fcGFyc2luZyxhPW5ldyBBcnJheShzKTtsZXQgcixsLGgsYztmb3Iocj0wLGw9cztyPGw7KytyKWg9citpLGM9ZVtoXSxhW3JdPXtyOm4ucGFyc2UoTShjLG8pLGgpfTtyZXR1cm4gYX1jb25zdCBaZT1OdW1iZXIuRVBTSUxPTnx8MWUtMTQsSmU9KHQsZSk9PmU8dC5sZW5ndGgmJiF0W2VdLnNraXAmJnRbZV0sUWU9dD0+IngiPT09dD8ieSI6IngiO2Z1bmN0aW9uIHRpKHQsZSxpLHMpe2NvbnN0IG49dC5za2lwP2U6dCxvPWUsYT1pLnNraXA/ZTppLHI9cShvLG4pLGw9cShhLG8pO2xldCBoPXIvKHIrbCksYz1sLyhyK2wpO2g9aXNOYU4oaCk/MDpoLGM9aXNOYU4oYyk/MDpjO2NvbnN0IGQ9cypoLHU9cypjO3JldHVybntwcmV2aW91czp7eDpvLngtZCooYS54LW4ueCkseTpvLnktZCooYS55LW4ueSl9LG5leHQ6e3g6by54K3UqKGEueC1uLngpLHk6by55K3UqKGEueS1uLnkpfX19ZnVuY3Rpb24gZWkodCxlPSJ4Iil7Y29uc3QgaT1RZShlKSxzPXQubGVuZ3RoLG49QXJyYXkocykuZmlsbCgwKSxvPUFycmF5KHMpO2xldCBhLHIsbCxoPUplKHQsMCk7Zm9yKGE9MDthPHM7KythKWlmKHI9bCxsPWgsaD1KZSh0LGErMSksbCl7aWYoaCl7Y29uc3QgdD1oW2VdLWxbZV07blthXT0wIT09dD8oaFtpXS1sW2ldKS90OjB9b1thXT1yP2g/RihuW2EtMV0pIT09RihuW2FdKT8wOihuW2EtMV0rblthXSkvMjpuW2EtMV06blthXX0hZnVuY3Rpb24odCxlLGkpe2NvbnN0IHM9dC5sZW5ndGg7bGV0IG4sbyxhLHIsbCxoPUplKHQsMCk7Zm9yKGxldCBjPTA7YzxzLTE7KytjKWw9aCxoPUplKHQsYysxKSxsJiZoJiYoVihlW2NdLDAsWmUpP2lbY109aVtjKzFdPTA6KG49aVtjXS9lW2NdLG89aVtjKzFdL2VbY10scj1NYXRoLnBvdyhuLDIpK01hdGgucG93KG8sMikscjw9OXx8KGE9My9NYXRoLnNxcnQociksaVtjXT1uKmEqZVtjXSxpW2MrMV09byphKmVbY10pKSl9KHQsbixvKSxmdW5jdGlvbih0LGUsaT0ieCIpe2NvbnN0IHM9UWUoaSksbj10Lmxlbmd0aDtsZXQgbyxhLHIsbD1KZSh0LDApO2ZvcihsZXQgaD0wO2g8bjsrK2gpe2lmKGE9cixyPWwsbD1KZSh0LGgrMSksIXIpY29udGludWU7Y29uc3Qgbj1yW2ldLGM9cltzXTthJiYobz0obi1hW2ldKS8zLHJbYGNwMSR7aX1gXT1uLW8scltgY3AxJHtzfWBdPWMtbyplW2hdKSxsJiYobz0obFtpXS1uKS8zLHJbYGNwMiR7aX1gXT1uK28scltgY3AyJHtzfWBdPWMrbyplW2hdKX19KHQsbyxlKX1mdW5jdGlvbiBpaSh0LGUsaSl7cmV0dXJuIE1hdGgubWF4KE1hdGgubWluKHQsaSksZSl9ZnVuY3Rpb24gc2kodCxlLGkscyxuKXtsZXQgbyxhLHIsbDtpZihlLnNwYW5HYXBzJiYodD10LmZpbHRlcih0PT4hdC5za2lwKSksIm1vbm90b25lIj09PWUuY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSllaSh0LG4pO2Vsc2V7bGV0IGk9cz90W3QubGVuZ3RoLTFdOnRbMF07Zm9yKG89MCxhPXQubGVuZ3RoO288YTsrK28pcj10W29dLGw9dGkoaSxyLHRbTWF0aC5taW4obysxLGEtKHM/MDoxKSklYV0sZS50ZW5zaW9uKSxyLmNwMXg9bC5wcmV2aW91cy54LHIuY3AxeT1sLnByZXZpb3VzLnksci5jcDJ4PWwubmV4dC54LHIuY3AyeT1sLm5leHQueSxpPXJ9ZS5jYXBCZXppZXJQb2ludHMmJmZ1bmN0aW9uKHQsZSl7bGV0IGkscyxuLG8sYSxyPUNlKHRbMF0sZSk7Zm9yKGk9MCxzPXQubGVuZ3RoO2k8czsrK2kpYT1vLG89cixyPWk8cy0xJiZDZSh0W2krMV0sZSksbyYmKG49dFtpXSxhJiYobi5jcDF4PWlpKG4uY3AxeCxlLmxlZnQsZS5yaWdodCksbi5jcDF5PWlpKG4uY3AxeSxlLnRvcCxlLmJvdHRvbSkpLHImJihuLmNwMng9aWkobi5jcDJ4LGUubGVmdCxlLnJpZ2h0KSxuLmNwMnk9aWkobi5jcDJ5LGUudG9wLGUuYm90dG9tKSkpfSh0LGkpfWNvbnN0IG5pPXQ9PjA9PT10fHwxPT09dCxvaT0odCxlLGkpPT4tTWF0aC5wb3coMiwxMCoodC09MSkpKk1hdGguc2luKCh0LWUpKk8vaSksYWk9KHQsZSxpKT0+TWF0aC5wb3coMiwtMTAqdCkqTWF0aC5zaW4oKHQtZSkqTy9pKSsxLHJpPXtsaW5lYXI6dD0+dCxlYXNlSW5RdWFkOnQ9PnQqdCxlYXNlT3V0UXVhZDp0PT4tdCoodC0yKSxlYXNlSW5PdXRRdWFkOnQ9Pih0Lz0uNSk8MT8uNSp0KnQ6LS41KigtLXQqKHQtMiktMSksZWFzZUluQ3ViaWM6dD0+dCp0KnQsZWFzZU91dEN1YmljOnQ9Pih0LT0xKSp0KnQrMSxlYXNlSW5PdXRDdWJpYzp0PT4odC89LjUpPDE/LjUqdCp0KnQ6LjUqKCh0LT0yKSp0KnQrMiksZWFzZUluUXVhcnQ6dD0+dCp0KnQqdCxlYXNlT3V0UXVhcnQ6dD0+LSgodC09MSkqdCp0KnQtMSksZWFzZUluT3V0UXVhcnQ6dD0+KHQvPS41KTwxPy41KnQqdCp0KnQ6LS41KigodC09MikqdCp0KnQtMiksZWFzZUluUXVpbnQ6dD0+dCp0KnQqdCp0LGVhc2VPdXRRdWludDp0PT4odC09MSkqdCp0KnQqdCsxLGVhc2VJbk91dFF1aW50OnQ9Pih0Lz0uNSk8MT8uNSp0KnQqdCp0KnQ6LjUqKCh0LT0yKSp0KnQqdCp0KzIpLGVhc2VJblNpbmU6dD0+MS1NYXRoLmNvcyh0KkUpLGVhc2VPdXRTaW5lOnQ9Pk1hdGguc2luKHQqRSksZWFzZUluT3V0U2luZTp0PT4tLjUqKE1hdGguY29zKEMqdCktMSksZWFzZUluRXhwbzp0PT4wPT09dD8wOk1hdGgucG93KDIsMTAqKHQtMSkpLGVhc2VPdXRFeHBvOnQ9PjE9PT10PzE6MS1NYXRoLnBvdygyLC0xMCp0KSxlYXNlSW5PdXRFeHBvOnQ9Pm5pKHQpP3Q6dDwuNT8uNSpNYXRoLnBvdygyLDEwKigyKnQtMSkpOi41KigyLU1hdGgucG93KDIsLTEwKigyKnQtMSkpKSxlYXNlSW5DaXJjOnQ9PnQ+PTE/dDotKE1hdGguc3FydCgxLXQqdCktMSksZWFzZU91dENpcmM6dD0+TWF0aC5zcXJ0KDEtKHQtPTEpKnQpLGVhc2VJbk91dENpcmM6dD0+KHQvPS41KTwxPy0uNSooTWF0aC5zcXJ0KDEtdCp0KS0xKTouNSooTWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpLGVhc2VJbkVsYXN0aWM6dD0+bmkodCk/dDpvaSh0LC4wNzUsLjMpLGVhc2VPdXRFbGFzdGljOnQ9Pm5pKHQpP3Q6YWkodCwuMDc1LC4zKSxlYXNlSW5PdXRFbGFzdGljKHQpe2NvbnN0IGU9LjExMjU7cmV0dXJuIG5pKHQpP3Q6dDwuNT8uNSpvaSgyKnQsZSwuNDUpOi41Ky41KmFpKDIqdC0xLGUsLjQ1KX0sZWFzZUluQmFjayh0KXtjb25zdCBlPTEuNzAxNTg7cmV0dXJuIHQqdCooKGUrMSkqdC1lKX0sZWFzZU91dEJhY2sodCl7Y29uc3QgZT0xLjcwMTU4O3JldHVybih0LT0xKSp0KigoZSsxKSp0K2UpKzF9LGVhc2VJbk91dEJhY2sodCl7bGV0IGU9MS43MDE1ODtyZXR1cm4odC89LjUpPDE/dCp0KigoMSsoZSo9MS41MjUpKSp0LWUpKi41Oi41KigodC09MikqdCooKDErKGUqPTEuNTI1KSkqdCtlKSsyKX0sZWFzZUluQm91bmNlOnQ9PjEtcmkuZWFzZU91dEJvdW5jZSgxLXQpLGVhc2VPdXRCb3VuY2UodCl7Y29uc3QgZT03LjU2MjUsaT0yLjc1O3JldHVybiB0PDEvaT9lKnQqdDp0PDIvaT9lKih0LT0xLjUvaSkqdCsuNzU6dDwyLjUvaT9lKih0LT0yLjI1L2kpKnQrLjkzNzU6ZSoodC09Mi42MjUvaSkqdCsuOTg0Mzc1fSxlYXNlSW5PdXRCb3VuY2U6dD0+dDwuNT8uNSpyaS5lYXNlSW5Cb3VuY2UoMip0KTouNSpyaS5lYXNlT3V0Qm91bmNlKDIqdC0xKSsuNX07ZnVuY3Rpb24gbGkodCxlLGkscyl7cmV0dXJue3g6dC54K2kqKGUueC10LngpLHk6dC55K2kqKGUueS10LnkpfX1mdW5jdGlvbiBoaSh0LGUsaSxzKXtyZXR1cm57eDp0LngraSooZS54LXQueCkseToibWlkZGxlIj09PXM/aTwuNT90Lnk6ZS55OiJhZnRlciI9PT1zP2k8MT90Lnk6ZS55Omk+MD9lLnk6dC55fX1mdW5jdGlvbiBjaSh0LGUsaSxzKXtjb25zdCBuPXt4OnQuY3AyeCx5OnQuY3AyeX0sbz17eDplLmNwMXgseTplLmNwMXl9LGE9bGkodCxuLGkpLHI9bGkobixvLGkpLGw9bGkobyxlLGkpLGg9bGkoYSxyLGkpLGM9bGkocixsLGkpO3JldHVybiBsaShoLGMsaSl9Y29uc3QgZGk9L14obm9ybWFsfChcZCsoPzpcLlxkKyk/KShweHxlbXwlKT8pJC8sdWk9L14obm9ybWFsfGl0YWxpY3xpbml0aWFsfGluaGVyaXR8dW5zZXR8KG9ibGlxdWUoIC0/WzAtOV0/WzAtOV1kZWcpPykpJC87ZnVuY3Rpb24gZmkodCxlKXtjb25zdCBpPSgiIit0KS5tYXRjaChkaSk7aWYoIWl8fCJub3JtYWwiPT09aVsxXSlyZXR1cm4gMS4yKmU7c3dpdGNoKHQ9K2lbMl0saVszXSl7Y2FzZSJweCI6cmV0dXJuIHQ7Y2FzZSIlIjp0Lz0xMDB9cmV0dXJuIGUqdH1jb25zdCBnaT10PT4rdHx8MDtmdW5jdGlvbiBwaSh0LGUpe2NvbnN0IGk9e30scz1vKGUpLG49cz9PYmplY3Qua2V5cyhlKTplLGE9byh0KT9zP2k9PmwodFtpXSx0W2VbaV1dKTplPT50W2VdOigpPT50O2Zvcihjb25zdCB0IG9mIG4paVt0XT1naShhKHQpKTtyZXR1cm4gaX1mdW5jdGlvbiBtaSh0KXtyZXR1cm4gcGkodCx7dG9wOiJ5IixyaWdodDoieCIsYm90dG9tOiJ5IixsZWZ0OiJ4In0pfWZ1bmN0aW9uIGJpKHQpe3JldHVybiBwaSh0LFsidG9wTGVmdCIsInRvcFJpZ2h0IiwiYm90dG9tTGVmdCIsImJvdHRvbVJpZ2h0Il0pfWZ1bmN0aW9uIHhpKHQpe2NvbnN0IGU9bWkodCk7cmV0dXJuIGUud2lkdGg9ZS5sZWZ0K2UucmlnaHQsZS5oZWlnaHQ9ZS50b3ArZS5ib3R0b20sZX1mdW5jdGlvbiBfaSh0LGUpe3Q9dHx8e30sZT1lfHxyZS5mb250O2xldCBpPWwodC5zaXplLGUuc2l6ZSk7InN0cmluZyI9PXR5cGVvZiBpJiYoaT1wYXJzZUludChpLDEwKSk7bGV0IHM9bCh0LnN0eWxlLGUuc3R5bGUpO3MmJiEoIiIrcykubWF0Y2godWkpJiYoY29uc29sZS53YXJuKCdJbnZhbGlkIGZvbnQgc3R5bGUgc3BlY2lmaWVkOiAiJytzKyciJykscz12b2lkIDApO2NvbnN0IG49e2ZhbWlseTpsKHQuZmFtaWx5LGUuZmFtaWx5KSxsaW5lSGVpZ2h0OmZpKGwodC5saW5lSGVpZ2h0LGUubGluZUhlaWdodCksaSksc2l6ZTppLHN0eWxlOnMsd2VpZ2h0OmwodC53ZWlnaHQsZS53ZWlnaHQpLHN0cmluZzoiIn07cmV0dXJuIG4uc3RyaW5nPXZlKG4pLG59ZnVuY3Rpb24geWkodCxlLGkscyl7bGV0IG8sYSxyLGw9ITA7Zm9yKG89MCxhPXQubGVuZ3RoO288YTsrK28paWYocj10W29dLHZvaWQgMCE9PXImJih2b2lkIDAhPT1lJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKHI9cihlKSxsPSExKSx2b2lkIDAhPT1pJiZuKHIpJiYocj1yW2klci5sZW5ndGhdLGw9ITEpLHZvaWQgMCE9PXIpKXJldHVybiBzJiYhbCYmKHMuY2FjaGVhYmxlPSExKSxyfWZ1bmN0aW9uIHZpKHQsZSxpKXtjb25zdHttaW46cyxtYXg6bn09dCxvPWMoZSwobi1zKS8yKSxhPSh0LGUpPT5pJiYwPT09dD8wOnQrZTtyZXR1cm57bWluOmEocywtTWF0aC5hYnMobykpLG1heDphKG4sbyl9fWZ1bmN0aW9uIE1pKHQsZSl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh0KSxlKX1mdW5jdGlvbiB3aSh0LGUsaSl7cmV0dXJuIHQ/ZnVuY3Rpb24odCxlKXtyZXR1cm57eDppPT50K3QrZS1pLHNldFdpZHRoKHQpe2U9dH0sdGV4dEFsaWduOnQ9PiJjZW50ZXIiPT09dD90OiJyaWdodCI9PT10PyJsZWZ0IjoicmlnaHQiLHhQbHVzOih0LGUpPT50LWUsbGVmdEZvckx0cjoodCxlKT0+dC1lfX0oZSxpKTp7eDp0PT50LHNldFdpZHRoKHQpe30sdGV4dEFsaWduOnQ9PnQseFBsdXM6KHQsZSk9PnQrZSxsZWZ0Rm9yTHRyOih0LGUpPT50fX1mdW5jdGlvbiBraSh0LGUpe2xldCBpLHM7Imx0ciIhPT1lJiYicnRsIiE9PWV8fChpPXQuY2FudmFzLnN0eWxlLHM9W2kuZ2V0UHJvcGVydHlWYWx1ZSgiZGlyZWN0aW9uIiksaS5nZXRQcm9wZXJ0eVByaW9yaXR5KCJkaXJlY3Rpb24iKV0saS5zZXRQcm9wZXJ0eSgiZGlyZWN0aW9uIixlLCJpbXBvcnRhbnQiKSx0LnByZXZUZXh0RGlyZWN0aW9uPXMpfWZ1bmN0aW9uIFNpKHQsZSl7dm9pZCAwIT09ZSYmKGRlbGV0ZSB0LnByZXZUZXh0RGlyZWN0aW9uLHQuY2FudmFzLnN0eWxlLnNldFByb3BlcnR5KCJkaXJlY3Rpb24iLGVbMF0sZVsxXSkpfWZ1bmN0aW9uIFBpKHQpe3JldHVybiJhbmdsZSI9PT10P3tiZXR3ZWVuOlosY29tcGFyZTpLLG5vcm1hbGl6ZTpHfTp7YmV0d2Vlbjp0dCxjb21wYXJlOih0LGUpPT50LWUsbm9ybWFsaXplOnQ9PnR9fWZ1bmN0aW9uIERpKHtzdGFydDp0LGVuZDplLGNvdW50OmksbG9vcDpzLHN0eWxlOm59KXtyZXR1cm57c3RhcnQ6dCVpLGVuZDplJWksbG9vcDpzJiYoZS10KzEpJWk9PTAsc3R5bGU6bn19ZnVuY3Rpb24gQ2kodCxlLGkpe2lmKCFpKXJldHVyblt0XTtjb25zdHtwcm9wZXJ0eTpzLHN0YXJ0Om4sZW5kOm99PWksYT1lLmxlbmd0aCx7Y29tcGFyZTpyLGJldHdlZW46bCxub3JtYWxpemU6aH09UGkocykse3N0YXJ0OmMsZW5kOmQsbG9vcDp1LHN0eWxlOmZ9PWZ1bmN0aW9uKHQsZSxpKXtjb25zdHtwcm9wZXJ0eTpzLHN0YXJ0Om4sZW5kOm99PWkse2JldHdlZW46YSxub3JtYWxpemU6cn09UGkocyksbD1lLmxlbmd0aDtsZXQgaCxjLHtzdGFydDpkLGVuZDp1LGxvb3A6Zn09dDtpZihmKXtmb3IoZCs9bCx1Kz1sLGg9MCxjPWw7aDxjJiZhKHIoZVtkJWxdW3NdKSxuLG8pOysraClkLS0sdS0tO2QlPWwsdSU9bH1yZXR1cm4gdTxkJiYodSs9bCkse3N0YXJ0OmQsZW5kOnUsbG9vcDpmLHN0eWxlOnQuc3R5bGV9fSh0LGUsaSksZz1bXTtsZXQgcCxtLGIseD0hMSxfPW51bGw7Y29uc3QgeT0oKT0+eHx8bChuLGIscCkmJjAhPT1yKG4sYiksdj0oKT0+IXh8fDA9PT1yKG8scCl8fGwobyxiLHApO2ZvcihsZXQgdD1jLGk9Yzt0PD1kOysrdCltPWVbdCVhXSxtLnNraXB8fChwPWgobVtzXSkscCE9PWImJih4PWwocCxuLG8pLG51bGw9PT1fJiZ5KCkmJihfPTA9PT1yKHAsbik/dDppKSxudWxsIT09XyYmdigpJiYoZy5wdXNoKERpKHtzdGFydDpfLGVuZDp0LGxvb3A6dSxjb3VudDphLHN0eWxlOmZ9KSksXz1udWxsKSxpPXQsYj1wKSk7cmV0dXJuIG51bGwhPT1fJiZnLnB1c2goRGkoe3N0YXJ0Ol8sZW5kOmQsbG9vcDp1LGNvdW50OmEsc3R5bGU6Zn0pKSxnfWZ1bmN0aW9uIE9pKHQsZSl7Y29uc3QgaT1bXSxzPXQuc2VnbWVudHM7Zm9yKGxldCBuPTA7bjxzLmxlbmd0aDtuKyspe2NvbnN0IG89Q2koc1tuXSx0LnBvaW50cyxlKTtvLmxlbmd0aCYmaS5wdXNoKC4uLm8pfXJldHVybiBpfWZ1bmN0aW9uIEFpKHQsZSl7Y29uc3QgaT10LnBvaW50cyxzPXQub3B0aW9ucy5zcGFuR2FwcyxuPWkubGVuZ3RoO2lmKCFuKXJldHVybltdO2NvbnN0IG89ISF0Ll9sb29wLHtzdGFydDphLGVuZDpyfT1mdW5jdGlvbih0LGUsaSxzKXtsZXQgbj0wLG89ZS0xO2lmKGkmJiFzKWZvcig7bjxlJiYhdFtuXS5za2lwOyluKys7Zm9yKDtuPGUmJnRbbl0uc2tpcDspbisrO2ZvcihuJT1lLGkmJihvKz1uKTtvPm4mJnRbbyVlXS5za2lwOylvLS07cmV0dXJuIG8lPWUse3N0YXJ0Om4sZW5kOm99fShpLG4sbyxzKTtyZXR1cm4gVGkodCwhMD09PXM/W3tzdGFydDphLGVuZDpyLGxvb3A6b31dOmZ1bmN0aW9uKHQsZSxpLHMpe2NvbnN0IG49dC5sZW5ndGgsbz1bXTtsZXQgYSxyPWUsbD10W2VdO2ZvcihhPWUrMTthPD1pOysrYSl7Y29uc3QgaT10W2Elbl07aS5za2lwfHxpLnN0b3A/bC5za2lwfHwocz0hMSxvLnB1c2goe3N0YXJ0OmUlbixlbmQ6KGEtMSklbixsb29wOnN9KSxlPXI9aS5zdG9wP2E6bnVsbCk6KHI9YSxsLnNraXAmJihlPWEpKSxsPWl9cmV0dXJuIG51bGwhPT1yJiZvLnB1c2goe3N0YXJ0OmUlbixlbmQ6ciVuLGxvb3A6c30pLG99KGksYSxyPGE/cituOnIsISF0Ll9mdWxsTG9vcCYmMD09PWEmJnI9PT1uLTEpLGksZSl9ZnVuY3Rpb24gVGkodCxlLGkscyl7cmV0dXJuIHMmJnMuc2V0Q29udGV4dCYmaT9mdW5jdGlvbih0LGUsaSxzKXtjb25zdCBuPXQuX2NoYXJ0LmdldENvbnRleHQoKSxvPUxpKHQub3B0aW9ucykse19kYXRhc2V0SW5kZXg6YSxvcHRpb25zOntzcGFuR2FwczpyfX09dCxsPWkubGVuZ3RoLGg9W107bGV0IGM9byxkPWVbMF0uc3RhcnQsdT1kO2Z1bmN0aW9uIGYodCxlLHMsbil7Y29uc3Qgbz1yPy0xOjE7aWYodCE9PWUpe2Zvcih0Kz1sO2lbdCVsXS5za2lwOyl0LT1vO2Zvcig7aVtlJWxdLnNraXA7KWUrPW87dCVsIT1lJWwmJihoLnB1c2goe3N0YXJ0OnQlbCxlbmQ6ZSVsLGxvb3A6cyxzdHlsZTpufSksYz1uLGQ9ZSVsKX19Zm9yKGNvbnN0IHQgb2YgZSl7ZD1yP2Q6dC5zdGFydDtsZXQgZSxvPWlbZCVsXTtmb3IodT1kKzE7dTw9dC5lbmQ7dSsrKXtjb25zdCByPWlbdSVsXTtlPUxpKHMuc2V0Q29udGV4dChNaShuLHt0eXBlOiJzZWdtZW50IixwMDpvLHAxOnIscDBEYXRhSW5kZXg6KHUtMSklbCxwMURhdGFJbmRleDp1JWwsZGF0YXNldEluZGV4OmF9KSkpLEVpKGUsYykmJmYoZCx1LTEsdC5sb29wLGMpLG89cixjPWV9ZDx1LTEmJmYoZCx1LTEsdC5sb29wLGMpfXJldHVybiBofSh0LGUsaSxzKTplfWZ1bmN0aW9uIExpKHQpe3JldHVybntiYWNrZ3JvdW5kQ29sb3I6dC5iYWNrZ3JvdW5kQ29sb3IsYm9yZGVyQ2FwU3R5bGU6dC5ib3JkZXJDYXBTdHlsZSxib3JkZXJEYXNoOnQuYm9yZGVyRGFzaCxib3JkZXJEYXNoT2Zmc2V0OnQuYm9yZGVyRGFzaE9mZnNldCxib3JkZXJKb2luU3R5bGU6dC5ib3JkZXJKb2luU3R5bGUsYm9yZGVyV2lkdGg6dC5ib3JkZXJXaWR0aCxib3JkZXJDb2xvcjp0LmJvcmRlckNvbG9yfX1mdW5jdGlvbiBFaSh0LGUpe2lmKCFlKXJldHVybiExO2NvbnN0IGk9W10scz1mdW5jdGlvbih0LGUpe3JldHVybiBxdChlKT8oaS5pbmNsdWRlcyhlKXx8aS5wdXNoKGUpLGkuaW5kZXhPZihlKSk6ZX07cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQscykhPT1KU09OLnN0cmluZ2lmeShlLHMpfXZhciBSaT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxIQUxGX1BJOkUsSU5GSU5JVFk6VCxQSTpDLFBJVEFVOkEsUVVBUlRFUl9QSTpSLFJBRF9QRVJfREVHOkwsVEFVOk8sVFdPX1RISVJEU19QSTpJLF9hZGRHcmFjZTp2aSxfYWxpZ25QaXhlbDprZSxfYWxpZ25TdGFydEVuZDpmdCxfYW5nbGVCZXR3ZWVuOlosX2FuZ2xlRGlmZjpLLF9hcnJheVVuaXF1ZTpsdCxfYXR0YWNoQ29udGV4dDpWZSxfYmV6aWVyQ3VydmVUbzpMZSxfYmV6aWVySW50ZXJwb2xhdGlvbjpjaSxfYm91bmRTZWdtZW50OkNpLF9ib3VuZFNlZ21lbnRzOk9pLF9jYXBpdGFsaXplOncsX2NvbXB1dGVTZWdtZW50czpBaSxfY3JlYXRlUmVzb2x2ZXI6RmUsX2RlY2ltYWxQbGFjZXM6VSxfZGVwcmVjYXRlZDpmdW5jdGlvbih0LGUsaSxzKXt2b2lkIDAhPT1lJiZjb25zb2xlLndhcm4odCsnOiAiJytpKyciIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgIicrcysnIiBpbnN0ZWFkJyl9LF9kZXNjcmlwdG9yczpCZSxfZWxlbWVudHNFcXVhbDpmLF9mYWN0b3JpemU6VyxfZmlsdGVyQmV0d2VlbjpudCxfZ2V0UGFyZW50Tm9kZTpoZSxfZ2V0U3RhcnRBbmRDb3VudE9mVmlzaWJsZVBvaW50czpwdCxfaW50MTZSYW5nZTpRLF9pc0JldHdlZW46dHQsX2lzQ2xpY2tFdmVudDpELF9pc0RvbVN1cHBvcnRlZDpsZSxfaXNQb2ludEluQXJlYTpDZSxfbGltaXRWYWx1ZTpKLF9sb25nZXN0VGV4dDp3ZSxfbG9va3VwOmV0LF9sb29rdXBCeUtleTppdCxfbWVhc3VyZVRleHQ6TWUsX21lcmdlcjptLF9tZXJnZXJJZjpfLF9ub3JtYWxpemVBbmdsZTpHLF9wYXJzZU9iamVjdERhdGFSYWRpYWxTY2FsZTpHZSxfcG9pbnRJbkxpbmU6bGksX3JlYWRWYWx1ZVRvUHJvcHM6cGksX3Jsb29rdXBCeUtleTpzdCxfc2NhbGVSYW5nZXNDaGFuZ2VkOm10LF9zZXRNaW5BbmRNYXhCeUtleTpqLF9zcGxpdEtleTp2LF9zdGVwcGVkSW50ZXJwb2xhdGlvbjpoaSxfc3RlcHBlZExpbmVUbzpUZSxfdGV4dFg6Z3QsX3RvTGVmdFJpZ2h0Q2VudGVyOnV0LF91cGRhdGVCZXppZXJDb250cm9sUG9pbnRzOnNpLGFkZFJvdW5kZWRSZWN0UGF0aDp6ZSxhbG1vc3RFcXVhbHM6VixhbG1vc3RXaG9sZTpILGNhbGxiYWNrOmQsY2xlYXJDYW52YXM6U2UsY2xpcEFyZWE6T2UsY2xvbmU6Zyxjb2xvcjpLdCxjcmVhdGVDb250ZXh0Ok1pLGRlYm91bmNlOmR0LGRlZmluZWQ6ayxkaXN0YW5jZUJldHdlZW5Qb2ludHM6cSxkcmF3UG9pbnQ6UGUsZHJhd1BvaW50TGVnZW5kOkRlLGVhY2g6dSxlYXNpbmdFZmZlY3RzOnJpLGZpbml0ZU9yRGVmYXVsdDpyLGZvbnRTdHJpbmc6ZnVuY3Rpb24odCxlLGkpe3JldHVybiBlKyIgIit0KyJweCAiK2l9LGZvcm1hdE51bWJlcjp0ZSxnZXRBbmdsZUZyb21Qb2ludDpYLGdldEhvdmVyQ29sb3I6R3QsZ2V0TWF4aW11bVNpemU6YmUsZ2V0UmVsYXRpdmVQb3NpdGlvbjpwZSxnZXRSdGxBZGFwdGVyOndpLGdldFN0eWxlOnVlLGlzQXJyYXk6bixpc0Zpbml0ZTphLGlzRnVuY3Rpb246Uyxpc051bGxPclVuZGVmOnMsaXNOdW1iZXI6Tixpc09iamVjdDpvLGlzUGF0dGVybk9yR3JhZGllbnQ6cXQsbGlzdGVuQXJyYXlFdmVudHM6YXQsbG9nMTA6eixtZXJnZTpiLG1lcmdlSWY6eCxuaWNlTnVtOkIsbm9vcDplLG92ZXJyaWRlVGV4dERpcmVjdGlvbjpraSxyZWFkVXNlZFNpemU6eWUscmVuZGVyVGV4dDpJZSxyZXF1ZXN0QW5pbUZyYW1lOmh0LHJlc29sdmU6eWkscmVzb2x2ZU9iamVjdEtleTpNLHJlc3RvcmVUZXh0RGlyZWN0aW9uOlNpLHJldGluYVNjYWxlOnhlLHNldHNFcXVhbDpQLHNpZ246RixzcGxpbmVDdXJ2ZTp0aSxzcGxpbmVDdXJ2ZU1vbm90b25lOmVpLHN1cHBvcnRzRXZlbnRMaXN0ZW5lck9wdGlvbnM6X2UsdGhyb3R0bGVkOmN0LHRvRGVncmVlczpZLHRvRGltZW5zaW9uOmMsdG9Gb250Ol9pLHRvRm9udFN0cmluZzp2ZSx0b0xpbmVIZWlnaHQ6ZmksdG9QYWRkaW5nOnhpLHRvUGVyY2VudGFnZTpoLHRvUmFkaWFuczokLHRvVFJCTDptaSx0b1RSQkxDb3JuZXJzOmJpLHVpZDppLHVuY2xpcEFyZWE6QWUsdW5saXN0ZW5BcnJheUV2ZW50czpydCx2YWx1ZU9yRGVmYXVsdDpsfSk7ZnVuY3Rpb24gSWkodCxlLGkscyl7Y29uc3R7Y29udHJvbGxlcjpuLGRhdGE6byxfc29ydGVkOmF9PXQscj1uLl9jYWNoZWRNZXRhLmlTY2FsZTtpZihyJiZlPT09ci5heGlzJiYiciIhPT1lJiZhJiZvLmxlbmd0aCl7Y29uc3QgdD1yLl9yZXZlcnNlUGl4ZWxzP3N0Oml0O2lmKCFzKXJldHVybiB0KG8sZSxpKTtpZihuLl9zaGFyZWRPcHRpb25zKXtjb25zdCBzPW9bMF0sbj0iZnVuY3Rpb24iPT10eXBlb2Ygcy5nZXRSYW5nZSYmcy5nZXRSYW5nZShlKTtpZihuKXtjb25zdCBzPXQobyxlLGktbiksYT10KG8sZSxpK24pO3JldHVybntsbzpzLmxvLGhpOmEuaGl9fX19cmV0dXJue2xvOjAsaGk6by5sZW5ndGgtMX19ZnVuY3Rpb24gemkodCxlLGkscyxuKXtjb25zdCBvPXQuZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcygpLGE9aVtlXTtmb3IobGV0IHQ9MCxpPW8ubGVuZ3RoO3Q8aTsrK3Qpe2NvbnN0e2luZGV4OmksZGF0YTpyfT1vW3RdLHtsbzpsLGhpOmh9PUlpKG9bdF0sZSxhLG4pO2ZvcihsZXQgdD1sO3Q8PWg7Kyt0KXtjb25zdCBlPXJbdF07ZS5za2lwfHxzKGUsaSx0KX19fWZ1bmN0aW9uIEZpKHQsZSxpLHMsbil7Y29uc3Qgbz1bXTtyZXR1cm4gbnx8dC5pc1BvaW50SW5BcmVhKGUpPyh6aSh0LGksZSxmdW5jdGlvbihpLGEscil7KG58fENlKGksdC5jaGFydEFyZWEsMCkpJiZpLmluUmFuZ2UoZS54LGUueSxzKSYmby5wdXNoKHtlbGVtZW50OmksZGF0YXNldEluZGV4OmEsaW5kZXg6cn0pfSwhMCksbyk6b31mdW5jdGlvbiBWaSh0LGUsaSxzLG4sbyl7cmV0dXJuIG98fHQuaXNQb2ludEluQXJlYShlKT8iciIhPT1pfHxzP2Z1bmN0aW9uKHQsZSxpLHMsbixvKXtsZXQgYT1bXTtjb25zdCByPWZ1bmN0aW9uKHQpe2NvbnN0IGU9LTEhPT10LmluZGV4T2YoIngiKSxpPS0xIT09dC5pbmRleE9mKCJ5Iik7cmV0dXJuIGZ1bmN0aW9uKHQscyl7Y29uc3Qgbj1lP01hdGguYWJzKHQueC1zLngpOjAsbz1pP01hdGguYWJzKHQueS1zLnkpOjA7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhuLDIpK01hdGgucG93KG8sMikpfX0oaSk7bGV0IGw9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO3JldHVybiB6aSh0LGksZSxmdW5jdGlvbihpLGgsYyl7Y29uc3QgZD1pLmluUmFuZ2UoZS54LGUueSxuKTtpZihzJiYhZClyZXR1cm47Y29uc3QgdT1pLmdldENlbnRlclBvaW50KG4pO2lmKCFvJiYhdC5pc1BvaW50SW5BcmVhKHUpJiYhZClyZXR1cm47Y29uc3QgZj1yKGUsdSk7ZjxsPyhhPVt7ZWxlbWVudDppLGRhdGFzZXRJbmRleDpoLGluZGV4OmN9XSxsPWYpOmY9PT1sJiZhLnB1c2goe2VsZW1lbnQ6aSxkYXRhc2V0SW5kZXg6aCxpbmRleDpjfSl9KSxhfSh0LGUsaSxzLG4sbyk6ZnVuY3Rpb24odCxlLGkscyl7bGV0IG49W107cmV0dXJuIHppKHQsaSxlLGZ1bmN0aW9uKHQsaSxvKXtjb25zdHtzdGFydEFuZ2xlOmEsZW5kQW5nbGU6cn09dC5nZXRQcm9wcyhbInN0YXJ0QW5nbGUiLCJlbmRBbmdsZSJdLHMpLHthbmdsZTpsfT1YKHQse3g6ZS54LHk6ZS55fSk7WihsLGEscikmJm4ucHVzaCh7ZWxlbWVudDp0LGRhdGFzZXRJbmRleDppLGluZGV4Om99KX0pLG59KHQsZSxpLG4pOltdfWZ1bmN0aW9uIEJpKHQsZSxpLHMsbil7Y29uc3Qgbz1bXSxhPSJ4Ij09PWk/ImluWFJhbmdlIjoiaW5ZUmFuZ2UiO2xldCByPSExO3JldHVybiB6aSh0LGksZSwodCxzLGwpPT57dFthXShlW2ldLG4pJiYoby5wdXNoKHtlbGVtZW50OnQsZGF0YXNldEluZGV4OnMsaW5kZXg6bH0pLHI9cnx8dC5pblJhbmdlKGUueCxlLnksbikpfSkscyYmIXI/W106b312YXIgV2k9e2V2YWx1YXRlSW50ZXJhY3Rpb25JdGVtczp6aSxtb2Rlczp7aW5kZXgodCxlLGkscyl7Y29uc3Qgbj1wZShlLHQpLG89aS5heGlzfHwieCIsYT1pLmluY2x1ZGVJbnZpc2libGV8fCExLHI9aS5pbnRlcnNlY3Q/RmkodCxuLG8scyxhKTpWaSh0LG4sbywhMSxzLGEpLGw9W107cmV0dXJuIHIubGVuZ3RoPyh0LmdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKS5mb3JFYWNoKHQ9Pntjb25zdCBlPXJbMF0uaW5kZXgsaT10LmRhdGFbZV07aSYmIWkuc2tpcCYmbC5wdXNoKHtlbGVtZW50OmksZGF0YXNldEluZGV4OnQuaW5kZXgsaW5kZXg6ZX0pfSksbCk6W119LGRhdGFzZXQodCxlLGkscyl7Y29uc3Qgbj1wZShlLHQpLG89aS5heGlzfHwieHkiLGE9aS5pbmNsdWRlSW52aXNpYmxlfHwhMTtsZXQgcj1pLmludGVyc2VjdD9GaSh0LG4sbyxzLGEpOlZpKHQsbixvLCExLHMsYSk7aWYoci5sZW5ndGg+MCl7Y29uc3QgZT1yWzBdLmRhdGFzZXRJbmRleCxpPXQuZ2V0RGF0YXNldE1ldGEoZSkuZGF0YTtyPVtdO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7Kyt0KXIucHVzaCh7ZWxlbWVudDppW3RdLGRhdGFzZXRJbmRleDplLGluZGV4OnR9KX1yZXR1cm4gcn0scG9pbnQ6KHQsZSxpLHMpPT5GaSh0LHBlKGUsdCksaS5heGlzfHwieHkiLHMsaS5pbmNsdWRlSW52aXNpYmxlfHwhMSksbmVhcmVzdCh0LGUsaSxzKXtjb25zdCBuPXBlKGUsdCksbz1pLmF4aXN8fCJ4eSIsYT1pLmluY2x1ZGVJbnZpc2libGV8fCExO3JldHVybiBWaSh0LG4sbyxpLmludGVyc2VjdCxzLGEpfSx4Oih0LGUsaSxzKT0+QmkodCxwZShlLHQpLCJ4IixpLmludGVyc2VjdCxzKSx5Oih0LGUsaSxzKT0+QmkodCxwZShlLHQpLCJ5IixpLmludGVyc2VjdCxzKX19O2NvbnN0IE5pPVsibGVmdCIsInRvcCIsInJpZ2h0IiwiYm90dG9tIl07ZnVuY3Rpb24gSGkodCxlKXtyZXR1cm4gdC5maWx0ZXIodD0+dC5wb3M9PT1lKX1mdW5jdGlvbiBqaSh0LGUpe3JldHVybiB0LmZpbHRlcih0PT4tMT09PU5pLmluZGV4T2YodC5wb3MpJiZ0LmJveC5heGlzPT09ZSl9ZnVuY3Rpb24gJGkodCxlKXtyZXR1cm4gdC5zb3J0KCh0LGkpPT57Y29uc3Qgcz1lP2k6dCxuPWU/dDppO3JldHVybiBzLndlaWdodD09PW4ud2VpZ2h0P3MuaW5kZXgtbi5pbmRleDpzLndlaWdodC1uLndlaWdodH0pfWZ1bmN0aW9uIFlpKHQsZSxpLHMpe3JldHVybiBNYXRoLm1heCh0W2ldLGVbaV0pK01hdGgubWF4KHRbc10sZVtzXSl9ZnVuY3Rpb24gVWkodCxlKXt0LnRvcD1NYXRoLm1heCh0LnRvcCxlLnRvcCksdC5sZWZ0PU1hdGgubWF4KHQubGVmdCxlLmxlZnQpLHQuYm90dG9tPU1hdGgubWF4KHQuYm90dG9tLGUuYm90dG9tKSx0LnJpZ2h0PU1hdGgubWF4KHQucmlnaHQsZS5yaWdodCl9ZnVuY3Rpb24gWGkodCxlLGkscyl7Y29uc3R7cG9zOm4sYm94OmF9PWkscj10Lm1heFBhZGRpbmc7aWYoIW8obikpe2kuc2l6ZSYmKHRbbl0tPWkuc2l6ZSk7Y29uc3QgZT1zW2kuc3RhY2tdfHx7c2l6ZTowLGNvdW50OjF9O2Uuc2l6ZT1NYXRoLm1heChlLnNpemUsaS5ob3Jpem9udGFsP2EuaGVpZ2h0OmEud2lkdGgpLGkuc2l6ZT1lLnNpemUvZS5jb3VudCx0W25dKz1pLnNpemV9YS5nZXRQYWRkaW5nJiZVaShyLGEuZ2V0UGFkZGluZygpKTtjb25zdCBsPU1hdGgubWF4KDAsZS5vdXRlcldpZHRoLVlpKHIsdCwibGVmdCIsInJpZ2h0IikpLGg9TWF0aC5tYXgoMCxlLm91dGVySGVpZ2h0LVlpKHIsdCwidG9wIiwiYm90dG9tIikpLGM9bCE9PXQudyxkPWghPT10Lmg7cmV0dXJuIHQudz1sLHQuaD1oLGkuaG9yaXpvbnRhbD97c2FtZTpjLG90aGVyOmR9OntzYW1lOmQsb3RoZXI6Y319ZnVuY3Rpb24gcWkodCxlKXtjb25zdCBpPWUubWF4UGFkZGluZztyZXR1cm4gZnVuY3Rpb24odCl7Y29uc3Qgcz17bGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjB9O3JldHVybiB0LmZvckVhY2godD0+e3NbdF09TWF0aC5tYXgoZVt0XSxpW3RdKX0pLHN9KHQ/WyJsZWZ0IiwicmlnaHQiXTpbInRvcCIsImJvdHRvbSJdKX1mdW5jdGlvbiBLaSh0LGUsaSxzKXtjb25zdCBuPVtdO2xldCBvLGEscixsLGgsYztmb3Iobz0wLGE9dC5sZW5ndGgsaD0wO288YTsrK28pe3I9dFtvXSxsPXIuYm94LGwudXBkYXRlKHIud2lkdGh8fGUudyxyLmhlaWdodHx8ZS5oLHFpKHIuaG9yaXpvbnRhbCxlKSk7Y29uc3R7c2FtZTphLG90aGVyOmR9PVhpKGUsaSxyLHMpO2h8PWEmJm4ubGVuZ3RoLGM9Y3x8ZCxsLmZ1bGxTaXplfHxuLnB1c2gocil9cmV0dXJuIGgmJktpKG4sZSxpLHMpfHxjfWZ1bmN0aW9uIEdpKHQsZSxpLHMsbil7dC50b3A9aSx0LmxlZnQ9ZSx0LnJpZ2h0PWUrcyx0LmJvdHRvbT1pK24sdC53aWR0aD1zLHQuaGVpZ2h0PW59ZnVuY3Rpb24gWmkodCxlLGkscyl7Y29uc3Qgbj1pLnBhZGRpbmc7bGV0e3g6byx5OmF9PWU7Zm9yKGNvbnN0IHIgb2YgdCl7Y29uc3QgdD1yLmJveCxsPXNbci5zdGFja118fHtjb3VudDoxLHBsYWNlZDowLHdlaWdodDoxfSxoPXIuc3RhY2tXZWlnaHQvbC53ZWlnaHR8fDE7aWYoci5ob3Jpem9udGFsKXtjb25zdCBzPWUudypoLG89bC5zaXplfHx0LmhlaWdodDtrKGwuc3RhcnQpJiYoYT1sLnN0YXJ0KSx0LmZ1bGxTaXplP0dpKHQsbi5sZWZ0LGEsaS5vdXRlcldpZHRoLW4ucmlnaHQtbi5sZWZ0LG8pOkdpKHQsZS5sZWZ0K2wucGxhY2VkLGEscyxvKSxsLnN0YXJ0PWEsbC5wbGFjZWQrPXMsYT10LmJvdHRvbX1lbHNle2NvbnN0IHM9ZS5oKmgsYT1sLnNpemV8fHQud2lkdGg7ayhsLnN0YXJ0KSYmKG89bC5zdGFydCksdC5mdWxsU2l6ZT9HaSh0LG8sbi50b3AsYSxpLm91dGVySGVpZ2h0LW4uYm90dG9tLW4udG9wKTpHaSh0LG8sZS50b3ArbC5wbGFjZWQsYSxzKSxsLnN0YXJ0PW8sbC5wbGFjZWQrPXMsbz10LnJpZ2h0fX1lLng9byxlLnk9YX12YXIgSmk9e2FkZEJveCh0LGUpe3QuYm94ZXN8fCh0LmJveGVzPVtdKSxlLmZ1bGxTaXplPWUuZnVsbFNpemV8fCExLGUucG9zaXRpb249ZS5wb3NpdGlvbnx8InRvcCIsZS53ZWlnaHQ9ZS53ZWlnaHR8fDAsZS5fbGF5ZXJzPWUuX2xheWVyc3x8ZnVuY3Rpb24oKXtyZXR1cm5be3o6MCxkcmF3KHQpe2UuZHJhdyh0KX19XX0sdC5ib3hlcy5wdXNoKGUpfSxyZW1vdmVCb3godCxlKXtjb25zdCBpPXQuYm94ZXM/dC5ib3hlcy5pbmRleE9mKGUpOi0xOy0xIT09aSYmdC5ib3hlcy5zcGxpY2UoaSwxKX0sY29uZmlndXJlKHQsZSxpKXtlLmZ1bGxTaXplPWkuZnVsbFNpemUsZS5wb3NpdGlvbj1pLnBvc2l0aW9uLGUud2VpZ2h0PWkud2VpZ2h0fSx1cGRhdGUodCxlLGkscyl7aWYoIXQpcmV0dXJuO2NvbnN0IG49eGkodC5vcHRpb25zLmxheW91dC5wYWRkaW5nKSxvPU1hdGgubWF4KGUtbi53aWR0aCwwKSxhPU1hdGgubWF4KGktbi5oZWlnaHQsMCkscj1mdW5jdGlvbih0KXtjb25zdCBlPWZ1bmN0aW9uKHQpe2NvbnN0IGU9W107bGV0IGkscyxuLG8sYSxyO2ZvcihpPTAscz0odHx8W10pLmxlbmd0aDtpPHM7KytpKW49dFtpXSwoe3Bvc2l0aW9uOm8sb3B0aW9uczp7c3RhY2s6YSxzdGFja1dlaWdodDpyPTF9fT1uKSxlLnB1c2goe2luZGV4OmksYm94Om4scG9zOm8saG9yaXpvbnRhbDpuLmlzSG9yaXpvbnRhbCgpLHdlaWdodDpuLndlaWdodCxzdGFjazphJiZvK2Esc3RhY2tXZWlnaHQ6cn0pO3JldHVybiBlfSh0KSxpPSRpKGUuZmlsdGVyKHQ9PnQuYm94LmZ1bGxTaXplKSwhMCkscz0kaShIaShlLCJsZWZ0IiksITApLG49JGkoSGkoZSwicmlnaHQiKSksbz0kaShIaShlLCJ0b3AiKSwhMCksYT0kaShIaShlLCJib3R0b20iKSkscj1qaShlLCJ4IiksbD1qaShlLCJ5Iik7cmV0dXJue2Z1bGxTaXplOmksbGVmdEFuZFRvcDpzLmNvbmNhdChvKSxyaWdodEFuZEJvdHRvbTpuLmNvbmNhdChsKS5jb25jYXQoYSkuY29uY2F0KHIpLGNoYXJ0QXJlYTpIaShlLCJjaGFydEFyZWEiKSx2ZXJ0aWNhbDpzLmNvbmNhdChuKS5jb25jYXQobCksaG9yaXpvbnRhbDpvLmNvbmNhdChhKS5jb25jYXQocil9fSh0LmJveGVzKSxsPXIudmVydGljYWwsaD1yLmhvcml6b250YWw7dSh0LmJveGVzLHQ9PnsiZnVuY3Rpb24iPT10eXBlb2YgdC5iZWZvcmVMYXlvdXQmJnQuYmVmb3JlTGF5b3V0KCl9KTtjb25zdCBjPWwucmVkdWNlKCh0LGUpPT5lLmJveC5vcHRpb25zJiYhMT09PWUuYm94Lm9wdGlvbnMuZGlzcGxheT90OnQrMSwwKXx8MSxkPU9iamVjdC5mcmVlemUoe291dGVyV2lkdGg6ZSxvdXRlckhlaWdodDppLHBhZGRpbmc6bixhdmFpbGFibGVXaWR0aDpvLGF2YWlsYWJsZUhlaWdodDphLHZCb3hNYXhXaWR0aDpvLzIvYyxoQm94TWF4SGVpZ2h0OmEvMn0pLGY9T2JqZWN0LmFzc2lnbih7fSxuKTtVaShmLHhpKHMpKTtjb25zdCBnPU9iamVjdC5hc3NpZ24oe21heFBhZGRpbmc6Zix3Om8saDphLHg6bi5sZWZ0LHk6bi50b3B9LG4pLHA9ZnVuY3Rpb24odCxlKXtjb25zdCBpPWZ1bmN0aW9uKHQpe2NvbnN0IGU9e307Zm9yKGNvbnN0IGkgb2YgdCl7Y29uc3R7c3RhY2s6dCxwb3M6cyxzdGFja1dlaWdodDpufT1pO2lmKCF0fHwhTmkuaW5jbHVkZXMocykpY29udGludWU7Y29uc3Qgbz1lW3RdfHwoZVt0XT17Y291bnQ6MCxwbGFjZWQ6MCx3ZWlnaHQ6MCxzaXplOjB9KTtvLmNvdW50Kyssby53ZWlnaHQrPW59cmV0dXJuIGV9KHQpLHt2Qm94TWF4V2lkdGg6cyxoQm94TWF4SGVpZ2h0Om59PWU7bGV0IG8sYSxyO2ZvcihvPTAsYT10Lmxlbmd0aDtvPGE7KytvKXtyPXRbb107Y29uc3R7ZnVsbFNpemU6YX09ci5ib3gsbD1pW3Iuc3RhY2tdLGg9bCYmci5zdGFja1dlaWdodC9sLndlaWdodDtyLmhvcml6b250YWw/KHIud2lkdGg9aD9oKnM6YSYmZS5hdmFpbGFibGVXaWR0aCxyLmhlaWdodD1uKTooci53aWR0aD1zLHIuaGVpZ2h0PWg/aCpuOmEmJmUuYXZhaWxhYmxlSGVpZ2h0KX1yZXR1cm4gaX0obC5jb25jYXQoaCksZCk7S2koci5mdWxsU2l6ZSxnLGQscCksS2kobCxnLGQscCksS2koaCxnLGQscCkmJktpKGwsZyxkLHApLGZ1bmN0aW9uKHQpe2NvbnN0IGU9dC5tYXhQYWRkaW5nO2Z1bmN0aW9uIGkoaSl7Y29uc3Qgcz1NYXRoLm1heChlW2ldLXRbaV0sMCk7cmV0dXJuIHRbaV0rPXMsc310LnkrPWkoInRvcCIpLHQueCs9aSgibGVmdCIpLGkoInJpZ2h0IiksaSgiYm90dG9tIil9KGcpLFppKHIubGVmdEFuZFRvcCxnLGQscCksZy54Kz1nLncsZy55Kz1nLmgsWmkoci5yaWdodEFuZEJvdHRvbSxnLGQscCksdC5jaGFydEFyZWE9e2xlZnQ6Zy5sZWZ0LHRvcDpnLnRvcCxyaWdodDpnLmxlZnQrZy53LGJvdHRvbTpnLnRvcCtnLmgsaGVpZ2h0OmcuaCx3aWR0aDpnLnd9LHUoci5jaGFydEFyZWEsZT0+e2NvbnN0IGk9ZS5ib3g7T2JqZWN0LmFzc2lnbihpLHQuY2hhcnRBcmVhKSxpLnVwZGF0ZShnLncsZy5oLHtsZWZ0OjAsdG9wOjAscmlnaHQ6MCxib3R0b206MH0pfSl9fTtjbGFzcyBRaXthY3F1aXJlQ29udGV4dCh0LGUpe31yZWxlYXNlQ29udGV4dCh0KXtyZXR1cm4hMX1hZGRFdmVudExpc3RlbmVyKHQsZSxpKXt9cmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUsaSl7fWdldERldmljZVBpeGVsUmF0aW8oKXtyZXR1cm4gMX1nZXRNYXhpbXVtU2l6ZSh0LGUsaSxzKXtyZXR1cm4gZT1NYXRoLm1heCgwLGV8fHQud2lkdGgpLGk9aXx8dC5oZWlnaHQse3dpZHRoOmUsaGVpZ2h0Ok1hdGgubWF4KDAscz9NYXRoLmZsb29yKGUvcyk6aSl9fWlzQXR0YWNoZWQodCl7cmV0dXJuITB9dXBkYXRlQ29uZmlnKHQpe319Y2xhc3MgdHMgZXh0ZW5kcyBRaXthY3F1aXJlQ29udGV4dCh0KXtyZXR1cm4gdCYmdC5nZXRDb250ZXh0JiZ0LmdldENvbnRleHQoIjJkIil8fG51bGx9dXBkYXRlQ29uZmlnKHQpe3Qub3B0aW9ucy5hbmltYXRpb249ITF9fWNvbnN0IGVzPSIkY2hhcnRqcyIsaXM9e3RvdWNoc3RhcnQ6Im1vdXNlZG93biIsdG91Y2htb3ZlOiJtb3VzZW1vdmUiLHRvdWNoZW5kOiJtb3VzZXVwIixwb2ludGVyZW50ZXI6Im1vdXNlZW50ZXIiLHBvaW50ZXJkb3duOiJtb3VzZWRvd24iLHBvaW50ZXJtb3ZlOiJtb3VzZW1vdmUiLHBvaW50ZXJ1cDoibW91c2V1cCIscG9pbnRlcmxlYXZlOiJtb3VzZW91dCIscG9pbnRlcm91dDoibW91c2VvdXQifSxzcz10PT5udWxsPT09dHx8IiI9PT10LG5zPSEhX2UmJntwYXNzaXZlOiEwfTtmdW5jdGlvbiBvcyh0LGUsaSl7dC5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLGksbnMpfWZ1bmN0aW9uIGFzKHQsZSl7Zm9yKGNvbnN0IGkgb2YgdClpZihpPT09ZXx8aS5jb250YWlucyhlKSlyZXR1cm4hMH1mdW5jdGlvbiBycyh0LGUsaSl7Y29uc3Qgcz10LmNhbnZhcyxuPW5ldyBNdXRhdGlvbk9ic2VydmVyKHQ9PntsZXQgZT0hMTtmb3IoY29uc3QgaSBvZiB0KWU9ZXx8YXMoaS5hZGRlZE5vZGVzLHMpLGU9ZSYmIWFzKGkucmVtb3ZlZE5vZGVzLHMpO2UmJmkoKX0pO3JldHVybiBuLm9ic2VydmUoZG9jdW1lbnQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSksbn1mdW5jdGlvbiBscyh0LGUsaSl7Y29uc3Qgcz10LmNhbnZhcyxuPW5ldyBNdXRhdGlvbk9ic2VydmVyKHQ9PntsZXQgZT0hMTtmb3IoY29uc3QgaSBvZiB0KWU9ZXx8YXMoaS5yZW1vdmVkTm9kZXMscyksZT1lJiYhYXMoaS5hZGRlZE5vZGVzLHMpO2UmJmkoKX0pO3JldHVybiBuLm9ic2VydmUoZG9jdW1lbnQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSksbn1jb25zdCBocz1uZXcgTWFwO2xldCBjcz0wO2Z1bmN0aW9uIGRzKCl7Y29uc3QgdD13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzt0IT09Y3MmJihjcz10LGhzLmZvckVhY2goKGUsaSk9PntpLmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvIT09dCYmZSgpfSkpfWZ1bmN0aW9uIHVzKHQsZSxpKXtjb25zdCBzPXQuY2FudmFzLG49cyYmaGUocyk7aWYoIW4pcmV0dXJuO2NvbnN0IG89Y3QoKHQsZSk9Pntjb25zdCBzPW4uY2xpZW50V2lkdGg7aSh0LGUpLHM8bi5jbGllbnRXaWR0aCYmaSgpfSx3aW5kb3cpLGE9bmV3IFJlc2l6ZU9ic2VydmVyKHQ9Pntjb25zdCBlPXRbMF0saT1lLmNvbnRlbnRSZWN0LndpZHRoLHM9ZS5jb250ZW50UmVjdC5oZWlnaHQ7MD09PWkmJjA9PT1zfHxvKGkscyl9KTtyZXR1cm4gYS5vYnNlcnZlKG4pLGZ1bmN0aW9uKHQsZSl7aHMuc2l6ZXx8d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZHMpLGhzLnNldCh0LGUpfSh0LG8pLGF9ZnVuY3Rpb24gZnModCxlLGkpe2kmJmkuZGlzY29ubmVjdCgpLCJyZXNpemUiPT09ZSYmZnVuY3Rpb24odCl7aHMuZGVsZXRlKHQpLGhzLnNpemV8fHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLGRzKX0odCl9ZnVuY3Rpb24gZ3ModCxlLGkpe2NvbnN0IHM9dC5jYW52YXMsbj1jdChlPT57bnVsbCE9PXQuY3R4JiZpKGZ1bmN0aW9uKHQsZSl7Y29uc3QgaT1pc1t0LnR5cGVdfHx0LnR5cGUse3g6cyx5Om59PXBlKHQsZSk7cmV0dXJue3R5cGU6aSxjaGFydDplLG5hdGl2ZTp0LHg6dm9pZCAwIT09cz9zOm51bGwseTp2b2lkIDAhPT1uP246bnVsbH19KGUsdCkpfSx0KTtyZXR1cm4gZnVuY3Rpb24odCxlLGkpe3QuYWRkRXZlbnRMaXN0ZW5lcihlLGksbnMpfShzLGUsbiksbn1jbGFzcyBwcyBleHRlbmRzIFFpe2FjcXVpcmVDb250ZXh0KHQsZSl7Y29uc3QgaT10JiZ0LmdldENvbnRleHQmJnQuZ2V0Q29udGV4dCgiMmQiKTtyZXR1cm4gaSYmaS5jYW52YXM9PT10PyhmdW5jdGlvbih0LGUpe2NvbnN0IGk9dC5zdHlsZSxzPXQuZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxuPXQuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpO2lmKHRbZXNdPXtpbml0aWFsOntoZWlnaHQ6cyx3aWR0aDpuLHN0eWxlOntkaXNwbGF5OmkuZGlzcGxheSxoZWlnaHQ6aS5oZWlnaHQsd2lkdGg6aS53aWR0aH19fSxpLmRpc3BsYXk9aS5kaXNwbGF5fHwiYmxvY2siLGkuYm94U2l6aW5nPWkuYm94U2l6aW5nfHwiYm9yZGVyLWJveCIsc3Mobikpe2NvbnN0IGU9eWUodCwid2lkdGgiKTt2b2lkIDAhPT1lJiYodC53aWR0aD1lKX1pZihzcyhzKSlpZigiIj09PXQuc3R5bGUuaGVpZ2h0KXQuaGVpZ2h0PXQud2lkdGgvKGV8fDIpO2Vsc2V7Y29uc3QgZT15ZSh0LCJoZWlnaHQiKTt2b2lkIDAhPT1lJiYodC5oZWlnaHQ9ZSl9fSh0LGUpLGkpOm51bGx9cmVsZWFzZUNvbnRleHQodCl7Y29uc3QgZT10LmNhbnZhcztpZighZVtlc10pcmV0dXJuITE7Y29uc3QgaT1lW2VzXS5pbml0aWFsO1siaGVpZ2h0Iiwid2lkdGgiXS5mb3JFYWNoKHQ9Pntjb25zdCBuPWlbdF07cyhuKT9lLnJlbW92ZUF0dHJpYnV0ZSh0KTplLnNldEF0dHJpYnV0ZSh0LG4pfSk7Y29uc3Qgbj1pLnN0eWxlfHx7fTtyZXR1cm4gT2JqZWN0LmtleXMobikuZm9yRWFjaCh0PT57ZS5zdHlsZVt0XT1uW3RdfSksZS53aWR0aD1lLndpZHRoLGRlbGV0ZSBlW2VzXSwhMH1hZGRFdmVudExpc3RlbmVyKHQsZSxpKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxlKTtjb25zdCBzPXQuJHByb3hpZXN8fCh0LiRwcm94aWVzPXt9KSxuPXthdHRhY2g6cnMsZGV0YWNoOmxzLHJlc2l6ZTp1c31bZV18fGdzO3NbZV09bih0LGUsaSl9cmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUpe2NvbnN0IGk9dC4kcHJveGllc3x8KHQuJHByb3hpZXM9e30pLHM9aVtlXTtzJiYoKHthdHRhY2g6ZnMsZGV0YWNoOmZzLHJlc2l6ZTpmc31bZV18fG9zKSh0LGUscyksaVtlXT12b2lkIDApfWdldERldmljZVBpeGVsUmF0aW8oKXtyZXR1cm4gd2luZG93LmRldmljZVBpeGVsUmF0aW99Z2V0TWF4aW11bVNpemUodCxlLGkscyl7cmV0dXJuIGJlKHQsZSxpLHMpfWlzQXR0YWNoZWQodCl7Y29uc3QgZT1oZSh0KTtyZXR1cm4hKCFlfHwhZS5pc0Nvbm5lY3RlZCl9fWZ1bmN0aW9uIG1zKHQpe3JldHVybiFsZSgpfHwidW5kZWZpbmVkIiE9dHlwZW9mIE9mZnNjcmVlbkNhbnZhcyYmdCBpbnN0YW5jZW9mIE9mZnNjcmVlbkNhbnZhcz90czpwc312YXIgYnM9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQmFzZVBsYXRmb3JtOlFpLEJhc2ljUGxhdGZvcm06dHMsRG9tUGxhdGZvcm06cHMsX2RldGVjdFBsYXRmb3JtOm1zfSk7Y29uc3QgeHM9InRyYW5zcGFyZW50Iixfcz17Ym9vbGVhbjoodCxlLGkpPT5pPi41P2U6dCxjb2xvcih0LGUsaSl7Y29uc3Qgcz1LdCh0fHx4cyksbj1zLnZhbGlkJiZLdChlfHx4cyk7cmV0dXJuIG4mJm4udmFsaWQ/bi5taXgocyxpKS5oZXhTdHJpbmcoKTplfSxudW1iZXI6KHQsZSxpKT0+dCsoZS10KSppfTtjbGFzcyB5c3tjb25zdHJ1Y3Rvcih0LGUsaSxzKXtjb25zdCBuPWVbaV07cz15aShbdC50byxzLG4sdC5mcm9tXSk7Y29uc3Qgbz15aShbdC5mcm9tLG4sc10pO3RoaXMuX2FjdGl2ZT0hMCx0aGlzLl9mbj10LmZufHxfc1t0LnR5cGV8fHR5cGVvZiBvXSx0aGlzLl9lYXNpbmc9cmlbdC5lYXNpbmddfHxyaS5saW5lYXIsdGhpcy5fc3RhcnQ9TWF0aC5mbG9vcihEYXRlLm5vdygpKyh0LmRlbGF5fHwwKSksdGhpcy5fZHVyYXRpb249dGhpcy5fdG90YWw9TWF0aC5mbG9vcih0LmR1cmF0aW9uKSx0aGlzLl9sb29wPSEhdC5sb29wLHRoaXMuX3RhcmdldD1lLHRoaXMuX3Byb3A9aSx0aGlzLl9mcm9tPW8sdGhpcy5fdG89cyx0aGlzLl9wcm9taXNlcz12b2lkIDB9YWN0aXZlKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZX11cGRhdGUodCxlLGkpe2lmKHRoaXMuX2FjdGl2ZSl7dGhpcy5fbm90aWZ5KCExKTtjb25zdCBzPXRoaXMuX3RhcmdldFt0aGlzLl9wcm9wXSxuPWktdGhpcy5fc3RhcnQsbz10aGlzLl9kdXJhdGlvbi1uO3RoaXMuX3N0YXJ0PWksdGhpcy5fZHVyYXRpb249TWF0aC5mbG9vcihNYXRoLm1heChvLHQuZHVyYXRpb24pKSx0aGlzLl90b3RhbCs9bix0aGlzLl9sb29wPSEhdC5sb29wLHRoaXMuX3RvPXlpKFt0LnRvLGUscyx0LmZyb21dKSx0aGlzLl9mcm9tPXlpKFt0LmZyb20scyxlXSl9fWNhbmNlbCgpe3RoaXMuX2FjdGl2ZSYmKHRoaXMudGljayhEYXRlLm5vdygpKSx0aGlzLl9hY3RpdmU9ITEsdGhpcy5fbm90aWZ5KCExKSl9dGljayh0KXtjb25zdCBlPXQtdGhpcy5fc3RhcnQsaT10aGlzLl9kdXJhdGlvbixzPXRoaXMuX3Byb3Asbj10aGlzLl9mcm9tLG89dGhpcy5fbG9vcCxhPXRoaXMuX3RvO2xldCByO2lmKHRoaXMuX2FjdGl2ZT1uIT09YSYmKG98fGU8aSksIXRoaXMuX2FjdGl2ZSlyZXR1cm4gdGhpcy5fdGFyZ2V0W3NdPWEsdm9pZCB0aGlzLl9ub3RpZnkoITApO2U8MD90aGlzLl90YXJnZXRbc109bjoocj1lL2klMixyPW8mJnI+MT8yLXI6cixyPXRoaXMuX2Vhc2luZyhNYXRoLm1pbigxLE1hdGgubWF4KDAscikpKSx0aGlzLl90YXJnZXRbc109dGhpcy5fZm4obixhLHIpKX13YWl0KCl7Y29uc3QgdD10aGlzLl9wcm9taXNlc3x8KHRoaXMuX3Byb21pc2VzPVtdKTtyZXR1cm4gbmV3IFByb21pc2UoKGUsaSk9Pnt0LnB1c2goe3JlczplLHJlajppfSl9KX1fbm90aWZ5KHQpe2NvbnN0IGU9dD8icmVzIjoicmVqIixpPXRoaXMuX3Byb21pc2VzfHxbXTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKylpW3RdW2VdKCl9fWNsYXNzIHZze2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fY2hhcnQ9dCx0aGlzLl9wcm9wZXJ0aWVzPW5ldyBNYXAsdGhpcy5jb25maWd1cmUoZSl9Y29uZmlndXJlKHQpe2lmKCFvKHQpKXJldHVybjtjb25zdCBlPU9iamVjdC5rZXlzKHJlLmFuaW1hdGlvbiksaT10aGlzLl9wcm9wZXJ0aWVzO09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpLmZvckVhY2gocz0+e2NvbnN0IGE9dFtzXTtpZighbyhhKSlyZXR1cm47Y29uc3Qgcj17fTtmb3IoY29uc3QgdCBvZiBlKXJbdF09YVt0XTsobihhLnByb3BlcnRpZXMpJiZhLnByb3BlcnRpZXN8fFtzXSkuZm9yRWFjaCh0PT57dCE9PXMmJmkuaGFzKHQpfHxpLnNldCh0LHIpfSl9KX1fYW5pbWF0ZU9wdGlvbnModCxlKXtjb25zdCBpPWUub3B0aW9ucyxzPWZ1bmN0aW9uKHQsZSl7aWYoIWUpcmV0dXJuO2xldCBpPXQub3B0aW9ucztpZihpKXJldHVybiBpLiRzaGFyZWQmJih0Lm9wdGlvbnM9aT1PYmplY3QuYXNzaWduKHt9LGkseyRzaGFyZWQ6ITEsJGFuaW1hdGlvbnM6e319KSksaTt0Lm9wdGlvbnM9ZX0odCxpKTtpZighcylyZXR1cm5bXTtjb25zdCBuPXRoaXMuX2NyZWF0ZUFuaW1hdGlvbnMocyxpKTtyZXR1cm4gaS4kc2hhcmVkJiZmdW5jdGlvbih0LGUpe2NvbnN0IGk9W10scz1PYmplY3Qua2V5cyhlKTtmb3IobGV0IGU9MDtlPHMubGVuZ3RoO2UrKyl7Y29uc3Qgbj10W3NbZV1dO24mJm4uYWN0aXZlKCkmJmkucHVzaChuLndhaXQoKSl9cmV0dXJuIFByb21pc2UuYWxsKGkpfSh0Lm9wdGlvbnMuJGFuaW1hdGlvbnMsaSkudGhlbigoKT0+e3Qub3B0aW9ucz1pfSwoKT0+e30pLG59X2NyZWF0ZUFuaW1hdGlvbnModCxlKXtjb25zdCBpPXRoaXMuX3Byb3BlcnRpZXMscz1bXSxuPXQuJGFuaW1hdGlvbnN8fCh0LiRhbmltYXRpb25zPXt9KSxvPU9iamVjdC5rZXlzKGUpLGE9RGF0ZS5ub3coKTtsZXQgcjtmb3Iocj1vLmxlbmd0aC0xO3I+PTA7LS1yKXtjb25zdCBsPW9bcl07aWYoIiQiPT09bC5jaGFyQXQoMCkpY29udGludWU7aWYoIm9wdGlvbnMiPT09bCl7cy5wdXNoKC4uLnRoaXMuX2FuaW1hdGVPcHRpb25zKHQsZSkpO2NvbnRpbnVlfWNvbnN0IGg9ZVtsXTtsZXQgYz1uW2xdO2NvbnN0IGQ9aS5nZXQobCk7aWYoYyl7aWYoZCYmYy5hY3RpdmUoKSl7Yy51cGRhdGUoZCxoLGEpO2NvbnRpbnVlfWMuY2FuY2VsKCl9ZCYmZC5kdXJhdGlvbj8obltsXT1jPW5ldyB5cyhkLHQsbCxoKSxzLnB1c2goYykpOnRbbF09aH1yZXR1cm4gc311cGRhdGUodCxlKXtpZigwPT09dGhpcy5fcHJvcGVydGllcy5zaXplKXJldHVybiB2b2lkIE9iamVjdC5hc3NpZ24odCxlKTtjb25zdCBpPXRoaXMuX2NyZWF0ZUFuaW1hdGlvbnModCxlKTtyZXR1cm4gaS5sZW5ndGg/KGJ0LmFkZCh0aGlzLl9jaGFydCxpKSwhMCk6dm9pZCAwfX1mdW5jdGlvbiBNcyh0LGUpe2NvbnN0IGk9dCYmdC5vcHRpb25zfHx7fSxzPWkucmV2ZXJzZSxuPXZvaWQgMD09PWkubWluP2U6MCxvPXZvaWQgMD09PWkubWF4P2U6MDtyZXR1cm57c3RhcnQ6cz9vOm4sZW5kOnM/bjpvfX1mdW5jdGlvbiB3cyh0LGUpe2NvbnN0IGk9W10scz10Ll9nZXRTb3J0ZWREYXRhc2V0TWV0YXMoZSk7bGV0IG4sbztmb3Iobj0wLG89cy5sZW5ndGg7bjxvOysrbilpLnB1c2goc1tuXS5pbmRleCk7cmV0dXJuIGl9ZnVuY3Rpb24ga3ModCxlLGkscz17fSl7Y29uc3Qgbj10LmtleXMsbz0ic2luZ2xlIj09PXMubW9kZTtsZXQgcixsLGgsYztpZihudWxsIT09ZSl7Zm9yKHI9MCxsPW4ubGVuZ3RoO3I8bDsrK3Ipe2lmKGg9K25bcl0saD09PWkpe2lmKHMuYWxsKWNvbnRpbnVlO2JyZWFrfWM9dC52YWx1ZXNbaF0sYShjKSYmKG98fDA9PT1lfHxGKGUpPT09RihjKSkmJihlKz1jKX1yZXR1cm4gZX19ZnVuY3Rpb24gU3ModCxlKXtjb25zdCBpPXQmJnQub3B0aW9ucy5zdGFja2VkO3JldHVybiBpfHx2b2lkIDA9PT1pJiZ2b2lkIDAhPT1lLnN0YWNrfWZ1bmN0aW9uIFBzKHQsZSxpKXtjb25zdCBzPXRbZV18fCh0W2VdPXt9KTtyZXR1cm4gc1tpXXx8KHNbaV09e30pfWZ1bmN0aW9uIERzKHQsZSxpLHMpe2Zvcihjb25zdCBuIG9mIGUuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXMocykucmV2ZXJzZSgpKXtjb25zdCBlPXRbbi5pbmRleF07aWYoaSYmZT4wfHwhaSYmZTwwKXJldHVybiBuLmluZGV4fXJldHVybiBudWxsfWZ1bmN0aW9uIENzKHQsZSl7Y29uc3R7Y2hhcnQ6aSxfY2FjaGVkTWV0YTpzfT10LG49aS5fc3RhY2tzfHwoaS5fc3RhY2tzPXt9KSx7aVNjYWxlOm8sdlNjYWxlOmEsaW5kZXg6cn09cyxsPW8uYXhpcyxoPWEuYXhpcyxjPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm5gJHt0LmlkfS4ke2UuaWR9LiR7aS5zdGFja3x8aS50eXBlfWB9KG8sYSxzKSxkPWUubGVuZ3RoO2xldCB1O2ZvcihsZXQgdD0wO3Q8ZDsrK3Qpe2NvbnN0IGk9ZVt0XSx7W2xdOm8sW2hdOmR9PWk7dT0oaS5fc3RhY2tzfHwoaS5fc3RhY2tzPXt9KSlbaF09UHMobixjLG8pLHVbcl09ZCx1Ll90b3A9RHModSxhLCEwLHMudHlwZSksdS5fYm90dG9tPURzKHUsYSwhMSxzLnR5cGUpLCh1Ll92aXN1YWxWYWx1ZXN8fCh1Ll92aXN1YWxWYWx1ZXM9e30pKVtyXT1kfX1mdW5jdGlvbiBPcyh0LGUpe2NvbnN0IGk9dC5zY2FsZXM7cmV0dXJuIE9iamVjdC5rZXlzKGkpLmZpbHRlcih0PT5pW3RdLmF4aXM9PT1lKS5zaGlmdCgpfWZ1bmN0aW9uIEFzKHQsZSl7Y29uc3QgaT10LmNvbnRyb2xsZXIuaW5kZXgscz10LnZTY2FsZSYmdC52U2NhbGUuYXhpcztpZihzKXtlPWV8fHQuX3BhcnNlZDtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPXQuX3N0YWNrcztpZighZXx8dm9pZCAwPT09ZVtzXXx8dm9pZCAwPT09ZVtzXVtpXSlyZXR1cm47ZGVsZXRlIGVbc11baV0sdm9pZCAwIT09ZVtzXS5fdmlzdWFsVmFsdWVzJiZ2b2lkIDAhPT1lW3NdLl92aXN1YWxWYWx1ZXNbaV0mJmRlbGV0ZSBlW3NdLl92aXN1YWxWYWx1ZXNbaV19fX1jb25zdCBUcz10PT4icmVzZXQiPT09dHx8Im5vbmUiPT09dCxMcz0odCxlKT0+ZT90Ok9iamVjdC5hc3NpZ24oe30sdCk7Y2xhc3MgRXN7c3RhdGljIGRlZmF1bHRzPXt9O3N0YXRpYyBkYXRhc2V0RWxlbWVudFR5cGU9bnVsbDtzdGF0aWMgZGF0YUVsZW1lbnRUeXBlPW51bGw7Y29uc3RydWN0b3IodCxlKXt0aGlzLmNoYXJ0PXQsdGhpcy5fY3R4PXQuY3R4LHRoaXMuaW5kZXg9ZSx0aGlzLl9jYWNoZWREYXRhT3B0cz17fSx0aGlzLl9jYWNoZWRNZXRhPXRoaXMuZ2V0TWV0YSgpLHRoaXMuX3R5cGU9dGhpcy5fY2FjaGVkTWV0YS50eXBlLHRoaXMub3B0aW9ucz12b2lkIDAsdGhpcy5fcGFyc2luZz0hMSx0aGlzLl9kYXRhPXZvaWQgMCx0aGlzLl9vYmplY3REYXRhPXZvaWQgMCx0aGlzLl9zaGFyZWRPcHRpb25zPXZvaWQgMCx0aGlzLl9kcmF3U3RhcnQ9dm9pZCAwLHRoaXMuX2RyYXdDb3VudD12b2lkIDAsdGhpcy5lbmFibGVPcHRpb25TaGFyaW5nPSExLHRoaXMuc3VwcG9ydHNEZWNpbWF0aW9uPSExLHRoaXMuJGNvbnRleHQ9dm9pZCAwLHRoaXMuX3N5bmNMaXN0PVtdLHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlPW5ldy50YXJnZXQuZGF0YXNldEVsZW1lbnRUeXBlLHRoaXMuZGF0YUVsZW1lbnRUeXBlPW5ldy50YXJnZXQuZGF0YUVsZW1lbnRUeXBlLHRoaXMuaW5pdGlhbGl6ZSgpfWluaXRpYWxpemUoKXtjb25zdCB0PXRoaXMuX2NhY2hlZE1ldGE7dGhpcy5jb25maWd1cmUoKSx0aGlzLmxpbmtTY2FsZXMoKSx0Ll9zdGFja2VkPVNzKHQudlNjYWxlLHQpLHRoaXMuYWRkRWxlbWVudHMoKSx0aGlzLm9wdGlvbnMuZmlsbCYmIXRoaXMuY2hhcnQuaXNQbHVnaW5FbmFibGVkKCJmaWxsZXIiKSYmY29uc29sZS53YXJuKCJUcmllZCB0byB1c2UgdGhlICdmaWxsJyBvcHRpb24gd2l0aG91dCB0aGUgJ0ZpbGxlcicgcGx1Z2luIGVuYWJsZWQuIFBsZWFzZSBpbXBvcnQgYW5kIHJlZ2lzdGVyIHRoZSAnRmlsbGVyJyBwbHVnaW4gYW5kIG1ha2Ugc3VyZSBpdCBpcyBub3QgZGlzYWJsZWQgaW4gdGhlIG9wdGlvbnMiKX11cGRhdGVJbmRleCh0KXt0aGlzLmluZGV4IT09dCYmQXModGhpcy5fY2FjaGVkTWV0YSksdGhpcy5pbmRleD10fWxpbmtTY2FsZXMoKXtjb25zdCB0PXRoaXMuY2hhcnQsZT10aGlzLl9jYWNoZWRNZXRhLGk9dGhpcy5nZXREYXRhc2V0KCkscz0odCxlLGkscyk9PiJ4Ij09PXQ/ZToiciI9PT10P3M6aSxuPWUueEF4aXNJRD1sKGkueEF4aXNJRCxPcyh0LCJ4IikpLG89ZS55QXhpc0lEPWwoaS55QXhpc0lELE9zKHQsInkiKSksYT1lLnJBeGlzSUQ9bChpLnJBeGlzSUQsT3ModCwiciIpKSxyPWUuaW5kZXhBeGlzLGg9ZS5pQXhpc0lEPXMocixuLG8sYSksYz1lLnZBeGlzSUQ9cyhyLG8sbixhKTtlLnhTY2FsZT10aGlzLmdldFNjYWxlRm9ySWQobiksZS55U2NhbGU9dGhpcy5nZXRTY2FsZUZvcklkKG8pLGUuclNjYWxlPXRoaXMuZ2V0U2NhbGVGb3JJZChhKSxlLmlTY2FsZT10aGlzLmdldFNjYWxlRm9ySWQoaCksZS52U2NhbGU9dGhpcy5nZXRTY2FsZUZvcklkKGMpfWdldERhdGFzZXQoKXtyZXR1cm4gdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW3RoaXMuaW5kZXhdfWdldE1ldGEoKXtyZXR1cm4gdGhpcy5jaGFydC5nZXREYXRhc2V0TWV0YSh0aGlzLmluZGV4KX1nZXRTY2FsZUZvcklkKHQpe3JldHVybiB0aGlzLmNoYXJ0LnNjYWxlc1t0XX1fZ2V0T3RoZXJTY2FsZSh0KXtjb25zdCBlPXRoaXMuX2NhY2hlZE1ldGE7cmV0dXJuIHQ9PT1lLmlTY2FsZT9lLnZTY2FsZTplLmlTY2FsZX1yZXNldCgpe3RoaXMuX3VwZGF0ZSgicmVzZXQiKX1fZGVzdHJveSgpe2NvbnN0IHQ9dGhpcy5fY2FjaGVkTWV0YTt0aGlzLl9kYXRhJiZydCh0aGlzLl9kYXRhLHRoaXMpLHQuX3N0YWNrZWQmJkFzKHQpfV9kYXRhQ2hlY2soKXtjb25zdCB0PXRoaXMuZ2V0RGF0YXNldCgpLGU9dC5kYXRhfHwodC5kYXRhPVtdKSxpPXRoaXMuX2RhdGE7aWYobyhlKSl0aGlzLl9kYXRhPWZ1bmN0aW9uKHQpe2NvbnN0IGU9T2JqZWN0LmtleXModCksaT1uZXcgQXJyYXkoZS5sZW5ndGgpO2xldCBzLG4sbztmb3Iocz0wLG49ZS5sZW5ndGg7czxuOysrcylvPWVbc10saVtzXT17eDpvLHk6dFtvXX07cmV0dXJuIGl9KGUpO2Vsc2UgaWYoaSE9PWUpe2lmKGkpe3J0KGksdGhpcyk7Y29uc3QgdD10aGlzLl9jYWNoZWRNZXRhO0FzKHQpLHQuX3BhcnNlZD1bXX1lJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiZhdChlLHRoaXMpLHRoaXMuX3N5bmNMaXN0PVtdLHRoaXMuX2RhdGE9ZX19YWRkRWxlbWVudHMoKXtjb25zdCB0PXRoaXMuX2NhY2hlZE1ldGE7dGhpcy5fZGF0YUNoZWNrKCksdGhpcy5kYXRhc2V0RWxlbWVudFR5cGUmJih0LmRhdGFzZXQ9bmV3IHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlKX1idWlsZE9yVXBkYXRlRWxlbWVudHModCl7Y29uc3QgZT10aGlzLl9jYWNoZWRNZXRhLGk9dGhpcy5nZXREYXRhc2V0KCk7bGV0IHM9ITE7dGhpcy5fZGF0YUNoZWNrKCk7Y29uc3Qgbj1lLl9zdGFja2VkO2UuX3N0YWNrZWQ9U3MoZS52U2NhbGUsZSksZS5zdGFjayE9PWkuc3RhY2smJihzPSEwLEFzKGUpLGUuc3RhY2s9aS5zdGFjayksdGhpcy5fcmVzeW5jRWxlbWVudHModCksKHN8fG4hPT1lLl9zdGFja2VkKSYmQ3ModGhpcyxlLl9wYXJzZWQpfWNvbmZpZ3VyZSgpe2NvbnN0IHQ9dGhpcy5jaGFydC5jb25maWcsZT10LmRhdGFzZXRTY29wZUtleXModGhpcy5fdHlwZSksaT10LmdldE9wdGlvblNjb3Blcyh0aGlzLmdldERhdGFzZXQoKSxlLCEwKTt0aGlzLm9wdGlvbnM9dC5jcmVhdGVSZXNvbHZlcihpLHRoaXMuZ2V0Q29udGV4dCgpKSx0aGlzLl9wYXJzaW5nPXRoaXMub3B0aW9ucy5wYXJzaW5nLHRoaXMuX2NhY2hlZERhdGFPcHRzPXt9fXBhcnNlKHQsZSl7Y29uc3R7X2NhY2hlZE1ldGE6aSxfZGF0YTpzfT10aGlzLHtpU2NhbGU6YSxfc3RhY2tlZDpyfT1pLGw9YS5heGlzO2xldCBoLGMsZCx1PTA9PT10JiZlPT09cy5sZW5ndGh8fGkuX3NvcnRlZCxmPXQ+MCYmaS5fcGFyc2VkW3QtMV07aWYoITE9PT10aGlzLl9wYXJzaW5nKWkuX3BhcnNlZD1zLGkuX3NvcnRlZD0hMCxkPXM7ZWxzZXtkPW4oc1t0XSk/dGhpcy5wYXJzZUFycmF5RGF0YShpLHMsdCxlKTpvKHNbdF0pP3RoaXMucGFyc2VPYmplY3REYXRhKGkscyx0LGUpOnRoaXMucGFyc2VQcmltaXRpdmVEYXRhKGkscyx0LGUpO2NvbnN0IGE9KCk9Pm51bGw9PT1jW2xdfHxmJiZjW2xdPGZbbF07Zm9yKGg9MDtoPGU7KytoKWkuX3BhcnNlZFtoK3RdPWM9ZFtoXSx1JiYoYSgpJiYodT0hMSksZj1jKTtpLl9zb3J0ZWQ9dX1yJiZDcyh0aGlzLGQpfXBhcnNlUHJpbWl0aXZlRGF0YSh0LGUsaSxzKXtjb25zdHtpU2NhbGU6bix2U2NhbGU6b309dCxhPW4uYXhpcyxyPW8uYXhpcyxsPW4uZ2V0TGFiZWxzKCksaD1uPT09byxjPW5ldyBBcnJheShzKTtsZXQgZCx1LGY7Zm9yKGQ9MCx1PXM7ZDx1OysrZClmPWQraSxjW2RdPXtbYV06aHx8bi5wYXJzZShsW2ZdLGYpLFtyXTpvLnBhcnNlKGVbZl0sZil9O3JldHVybiBjfXBhcnNlQXJyYXlEYXRhKHQsZSxpLHMpe2NvbnN0e3hTY2FsZTpuLHlTY2FsZTpvfT10LGE9bmV3IEFycmF5KHMpO2xldCByLGwsaCxjO2ZvcihyPTAsbD1zO3I8bDsrK3IpaD1yK2ksYz1lW2hdLGFbcl09e3g6bi5wYXJzZShjWzBdLGgpLHk6by5wYXJzZShjWzFdLGgpfTtyZXR1cm4gYX1wYXJzZU9iamVjdERhdGEodCxlLGkscyl7Y29uc3R7eFNjYWxlOm4seVNjYWxlOm99PXQse3hBeGlzS2V5OmE9IngiLHlBeGlzS2V5OnI9InkifT10aGlzLl9wYXJzaW5nLGw9bmV3IEFycmF5KHMpO2xldCBoLGMsZCx1O2ZvcihoPTAsYz1zO2g8YzsrK2gpZD1oK2ksdT1lW2RdLGxbaF09e3g6bi5wYXJzZShNKHUsYSksZCkseTpvLnBhcnNlKE0odSxyKSxkKX07cmV0dXJuIGx9Z2V0UGFyc2VkKHQpe3JldHVybiB0aGlzLl9jYWNoZWRNZXRhLl9wYXJzZWRbdF19Z2V0RGF0YUVsZW1lbnQodCl7cmV0dXJuIHRoaXMuX2NhY2hlZE1ldGEuZGF0YVt0XX1hcHBseVN0YWNrKHQsZSxpKXtjb25zdCBzPXRoaXMuY2hhcnQsbj10aGlzLl9jYWNoZWRNZXRhLG89ZVt0LmF4aXNdO3JldHVybiBrcyh7a2V5czp3cyhzLCEwKSx2YWx1ZXM6ZS5fc3RhY2tzW3QuYXhpc10uX3Zpc3VhbFZhbHVlc30sbyxuLmluZGV4LHttb2RlOml9KX11cGRhdGVSYW5nZUZyb21QYXJzZWQodCxlLGkscyl7Y29uc3Qgbj1pW2UuYXhpc107bGV0IG89bnVsbD09PW4/TmFOOm47Y29uc3QgYT1zJiZpLl9zdGFja3NbZS5heGlzXTtzJiZhJiYocy52YWx1ZXM9YSxvPWtzKHMsbix0aGlzLl9jYWNoZWRNZXRhLmluZGV4KSksdC5taW49TWF0aC5taW4odC5taW4sbyksdC5tYXg9TWF0aC5tYXgodC5tYXgsbyl9Z2V0TWluTWF4KHQsZSl7Y29uc3QgaT10aGlzLl9jYWNoZWRNZXRhLHM9aS5fcGFyc2VkLG49aS5fc29ydGVkJiZ0PT09aS5pU2NhbGUsbz1zLmxlbmd0aCxyPXRoaXMuX2dldE90aGVyU2NhbGUodCksbD0oKHQsZSxpKT0+dCYmIWUuaGlkZGVuJiZlLl9zdGFja2VkJiZ7a2V5czp3cyhpLCEwKSx2YWx1ZXM6bnVsbH0pKGUsaSx0aGlzLmNoYXJ0KSxoPXttaW46TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG1heDpOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFl9LHttaW46YyxtYXg6ZH09ZnVuY3Rpb24odCl7Y29uc3R7bWluOmUsbWF4OmksbWluRGVmaW5lZDpzLG1heERlZmluZWQ6bn09dC5nZXRVc2VyQm91bmRzKCk7cmV0dXJue21pbjpzP2U6TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLG1heDpuP2k6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfX0ocik7bGV0IHUsZjtmdW5jdGlvbiBnKCl7Zj1zW3VdO2NvbnN0IGU9ZltyLmF4aXNdO3JldHVybiFhKGZbdC5heGlzXSl8fGM+ZXx8ZDxlfWZvcih1PTA7dTxvJiYoZygpfHwodGhpcy51cGRhdGVSYW5nZUZyb21QYXJzZWQoaCx0LGYsbCksIW4pKTsrK3UpO2lmKG4pZm9yKHU9by0xO3U+PTA7LS11KWlmKCFnKCkpe3RoaXMudXBkYXRlUmFuZ2VGcm9tUGFyc2VkKGgsdCxmLGwpO2JyZWFrfXJldHVybiBofWdldEFsbFBhcnNlZFZhbHVlcyh0KXtjb25zdCBlPXRoaXMuX2NhY2hlZE1ldGEuX3BhcnNlZCxpPVtdO2xldCBzLG4sbztmb3Iocz0wLG49ZS5sZW5ndGg7czxuOysrcylvPWVbc11bdC5heGlzXSxhKG8pJiZpLnB1c2gobyk7cmV0dXJuIGl9Z2V0TWF4T3ZlcmZsb3coKXtyZXR1cm4hMX1nZXRMYWJlbEFuZFZhbHVlKHQpe2NvbnN0IGU9dGhpcy5fY2FjaGVkTWV0YSxpPWUuaVNjYWxlLHM9ZS52U2NhbGUsbj10aGlzLmdldFBhcnNlZCh0KTtyZXR1cm57bGFiZWw6aT8iIitpLmdldExhYmVsRm9yVmFsdWUobltpLmF4aXNdKToiIix2YWx1ZTpzPyIiK3MuZ2V0TGFiZWxGb3JWYWx1ZShuW3MuYXhpc10pOiIifX1fdXBkYXRlKHQpe2NvbnN0IGU9dGhpcy5fY2FjaGVkTWV0YTt0aGlzLnVwZGF0ZSh0fHwiZGVmYXVsdCIpLGUuX2NsaXA9ZnVuY3Rpb24odCl7bGV0IGUsaSxzLG47cmV0dXJuIG8odCk/KGU9dC50b3AsaT10LnJpZ2h0LHM9dC5ib3R0b20sbj10LmxlZnQpOmU9aT1zPW49dCx7dG9wOmUscmlnaHQ6aSxib3R0b206cyxsZWZ0Om4sZGlzYWJsZWQ6ITE9PT10fX0obCh0aGlzLm9wdGlvbnMuY2xpcCxmdW5jdGlvbih0LGUsaSl7aWYoITE9PT1pKXJldHVybiExO2NvbnN0IHM9TXModCxpKSxuPU1zKGUsaSk7cmV0dXJue3RvcDpuLmVuZCxyaWdodDpzLmVuZCxib3R0b206bi5zdGFydCxsZWZ0OnMuc3RhcnR9fShlLnhTY2FsZSxlLnlTY2FsZSx0aGlzLmdldE1heE92ZXJmbG93KCkpKSl9dXBkYXRlKHQpe31kcmF3KCl7Y29uc3QgdD10aGlzLl9jdHgsZT10aGlzLmNoYXJ0LGk9dGhpcy5fY2FjaGVkTWV0YSxzPWkuZGF0YXx8W10sbj1lLmNoYXJ0QXJlYSxvPVtdLGE9dGhpcy5fZHJhd1N0YXJ0fHwwLHI9dGhpcy5fZHJhd0NvdW50fHxzLmxlbmd0aC1hLGw9dGhpcy5vcHRpb25zLmRyYXdBY3RpdmVFbGVtZW50c09uVG9wO2xldCBoO2ZvcihpLmRhdGFzZXQmJmkuZGF0YXNldC5kcmF3KHQsbixhLHIpLGg9YTtoPGErcjsrK2gpe2NvbnN0IGU9c1toXTtlLmhpZGRlbnx8KGUuYWN0aXZlJiZsP28ucHVzaChlKTplLmRyYXcodCxuKSl9Zm9yKGg9MDtoPG8ubGVuZ3RoOysraClvW2hdLmRyYXcodCxuKX1nZXRTdHlsZSh0LGUpe2NvbnN0IGk9ZT8iYWN0aXZlIjoiZGVmYXVsdCI7cmV0dXJuIHZvaWQgMD09PXQmJnRoaXMuX2NhY2hlZE1ldGEuZGF0YXNldD90aGlzLnJlc29sdmVEYXRhc2V0RWxlbWVudE9wdGlvbnMoaSk6dGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKHR8fDAsaSl9Z2V0Q29udGV4dCh0LGUsaSl7Y29uc3Qgcz10aGlzLmdldERhdGFzZXQoKTtsZXQgbjtpZih0Pj0wJiZ0PHRoaXMuX2NhY2hlZE1ldGEuZGF0YS5sZW5ndGgpe2NvbnN0IGU9dGhpcy5fY2FjaGVkTWV0YS5kYXRhW3RdO249ZS4kY29udGV4dHx8KGUuJGNvbnRleHQ9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBNaSh0LHthY3RpdmU6ITEsZGF0YUluZGV4OmUscGFyc2VkOnZvaWQgMCxyYXc6dm9pZCAwLGVsZW1lbnQ6aSxpbmRleDplLG1vZGU6ImRlZmF1bHQiLHR5cGU6ImRhdGEifSl9KHRoaXMuZ2V0Q29udGV4dCgpLHQsZSkpLG4ucGFyc2VkPXRoaXMuZ2V0UGFyc2VkKHQpLG4ucmF3PXMuZGF0YVt0XSxuLmluZGV4PW4uZGF0YUluZGV4PXR9ZWxzZSBuPXRoaXMuJGNvbnRleHR8fCh0aGlzLiRjb250ZXh0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1pKHQse2FjdGl2ZTohMSxkYXRhc2V0OnZvaWQgMCxkYXRhc2V0SW5kZXg6ZSxpbmRleDplLG1vZGU6ImRlZmF1bHQiLHR5cGU6ImRhdGFzZXQifSl9KHRoaXMuY2hhcnQuZ2V0Q29udGV4dCgpLHRoaXMuaW5kZXgpKSxuLmRhdGFzZXQ9cyxuLmluZGV4PW4uZGF0YXNldEluZGV4PXRoaXMuaW5kZXg7cmV0dXJuIG4uYWN0aXZlPSEhZSxuLm1vZGU9aSxufXJlc29sdmVEYXRhc2V0RWxlbWVudE9wdGlvbnModCl7cmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFzZXRFbGVtZW50VHlwZS5pZCx0KX1yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKHQsZSl7cmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFFbGVtZW50VHlwZS5pZCxlLHQpfV9yZXNvbHZlRWxlbWVudE9wdGlvbnModCxlPSJkZWZhdWx0IixpKXtjb25zdCBzPSJhY3RpdmUiPT09ZSxuPXRoaXMuX2NhY2hlZERhdGFPcHRzLG89dCsiLSIrZSxhPW5bb10scj10aGlzLmVuYWJsZU9wdGlvblNoYXJpbmcmJmsoaSk7aWYoYSlyZXR1cm4gTHMoYSxyKTtjb25zdCBsPXRoaXMuY2hhcnQuY29uZmlnLGg9bC5kYXRhc2V0RWxlbWVudFNjb3BlS2V5cyh0aGlzLl90eXBlLHQpLGM9cz9bYCR7dH1Ib3ZlcmAsImhvdmVyIix0LCIiXTpbdCwiIl0sZD1sLmdldE9wdGlvblNjb3Blcyh0aGlzLmdldERhdGFzZXQoKSxoKSx1PU9iamVjdC5rZXlzKHJlLmVsZW1lbnRzW3RdKSxmPWwucmVzb2x2ZU5hbWVkT3B0aW9ucyhkLHUsKCk9PnRoaXMuZ2V0Q29udGV4dChpLHMsZSksYyk7cmV0dXJuIGYuJHNoYXJlZCYmKGYuJHNoYXJlZD1yLG5bb109T2JqZWN0LmZyZWV6ZShMcyhmLHIpKSksZn1fcmVzb2x2ZUFuaW1hdGlvbnModCxlLGkpe2NvbnN0IHM9dGhpcy5jaGFydCxuPXRoaXMuX2NhY2hlZERhdGFPcHRzLG89YGFuaW1hdGlvbi0ke2V9YCxhPW5bb107aWYoYSlyZXR1cm4gYTtsZXQgcjtpZighMSE9PXMub3B0aW9ucy5hbmltYXRpb24pe2NvbnN0IHM9dGhpcy5jaGFydC5jb25maWcsbj1zLmRhdGFzZXRBbmltYXRpb25TY29wZUtleXModGhpcy5fdHlwZSxlKSxvPXMuZ2V0T3B0aW9uU2NvcGVzKHRoaXMuZ2V0RGF0YXNldCgpLG4pO3I9cy5jcmVhdGVSZXNvbHZlcihvLHRoaXMuZ2V0Q29udGV4dCh0LGksZSkpfWNvbnN0IGw9bmV3IHZzKHMsciYmci5hbmltYXRpb25zKTtyZXR1cm4gciYmci5fY2FjaGVhYmxlJiYobltvXT1PYmplY3QuZnJlZXplKGwpKSxsfWdldFNoYXJlZE9wdGlvbnModCl7aWYodC4kc2hhcmVkKXJldHVybiB0aGlzLl9zaGFyZWRPcHRpb25zfHwodGhpcy5fc2hhcmVkT3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LHQpKX1pbmNsdWRlT3B0aW9ucyh0LGUpe3JldHVybiFlfHxUcyh0KXx8dGhpcy5jaGFydC5fYW5pbWF0aW9uc0Rpc2FibGVkfV9nZXRTaGFyZWRPcHRpb25zKHQsZSl7Y29uc3QgaT10aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnModCxlKSxzPXRoaXMuX3NoYXJlZE9wdGlvbnMsbj10aGlzLmdldFNoYXJlZE9wdGlvbnMoaSksbz10aGlzLmluY2x1ZGVPcHRpb25zKGUsbil8fG4hPT1zO3JldHVybiB0aGlzLnVwZGF0ZVNoYXJlZE9wdGlvbnMobixlLGkpLHtzaGFyZWRPcHRpb25zOm4saW5jbHVkZU9wdGlvbnM6b319dXBkYXRlRWxlbWVudCh0LGUsaSxzKXtUcyhzKT9PYmplY3QuYXNzaWduKHQsaSk6dGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnMoZSxzKS51cGRhdGUodCxpKX11cGRhdGVTaGFyZWRPcHRpb25zKHQsZSxpKXt0JiYhVHMoZSkmJnRoaXMuX3Jlc29sdmVBbmltYXRpb25zKHZvaWQgMCxlKS51cGRhdGUodCxpKX1fc2V0U3R5bGUodCxlLGkscyl7dC5hY3RpdmU9cztjb25zdCBuPXRoaXMuZ2V0U3R5bGUoZSxzKTt0aGlzLl9yZXNvbHZlQW5pbWF0aW9ucyhlLGkscykudXBkYXRlKHQse29wdGlvbnM6IXMmJnRoaXMuZ2V0U2hhcmVkT3B0aW9ucyhuKXx8bn0pfXJlbW92ZUhvdmVyU3R5bGUodCxlLGkpe3RoaXMuX3NldFN0eWxlKHQsaSwiYWN0aXZlIiwhMSl9c2V0SG92ZXJTdHlsZSh0LGUsaSl7dGhpcy5fc2V0U3R5bGUodCxpLCJhY3RpdmUiLCEwKX1fcmVtb3ZlRGF0YXNldEhvdmVyU3R5bGUoKXtjb25zdCB0PXRoaXMuX2NhY2hlZE1ldGEuZGF0YXNldDt0JiZ0aGlzLl9zZXRTdHlsZSh0LHZvaWQgMCwiYWN0aXZlIiwhMSl9X3NldERhdGFzZXRIb3ZlclN0eWxlKCl7Y29uc3QgdD10aGlzLl9jYWNoZWRNZXRhLmRhdGFzZXQ7dCYmdGhpcy5fc2V0U3R5bGUodCx2b2lkIDAsImFjdGl2ZSIsITApfV9yZXN5bmNFbGVtZW50cyh0KXtjb25zdCBlPXRoaXMuX2RhdGEsaT10aGlzLl9jYWNoZWRNZXRhLmRhdGE7Zm9yKGNvbnN0W3QsZSxpXW9mIHRoaXMuX3N5bmNMaXN0KXRoaXNbdF0oZSxpKTt0aGlzLl9zeW5jTGlzdD1bXTtjb25zdCBzPWkubGVuZ3RoLG49ZS5sZW5ndGgsbz1NYXRoLm1pbihuLHMpO28mJnRoaXMucGFyc2UoMCxvKSxuPnM/dGhpcy5faW5zZXJ0RWxlbWVudHMocyxuLXMsdCk6bjxzJiZ0aGlzLl9yZW1vdmVFbGVtZW50cyhuLHMtbil9X2luc2VydEVsZW1lbnRzKHQsZSxpPSEwKXtjb25zdCBzPXRoaXMuX2NhY2hlZE1ldGEsbj1zLmRhdGEsbz10K2U7bGV0IGE7Y29uc3Qgcj10PT57Zm9yKHQubGVuZ3RoKz1lLGE9dC5sZW5ndGgtMTthPj1vO2EtLSl0W2FdPXRbYS1lXX07Zm9yKHIobiksYT10O2E8bzsrK2EpblthXT1uZXcgdGhpcy5kYXRhRWxlbWVudFR5cGU7dGhpcy5fcGFyc2luZyYmcihzLl9wYXJzZWQpLHRoaXMucGFyc2UodCxlKSxpJiZ0aGlzLnVwZGF0ZUVsZW1lbnRzKG4sdCxlLCJyZXNldCIpfXVwZGF0ZUVsZW1lbnRzKHQsZSxpLHMpe31fcmVtb3ZlRWxlbWVudHModCxlKXtjb25zdCBpPXRoaXMuX2NhY2hlZE1ldGE7aWYodGhpcy5fcGFyc2luZyl7Y29uc3Qgcz1pLl9wYXJzZWQuc3BsaWNlKHQsZSk7aS5fc3RhY2tlZCYmQXMoaSxzKX1pLmRhdGEuc3BsaWNlKHQsZSl9X3N5bmModCl7aWYodGhpcy5fcGFyc2luZyl0aGlzLl9zeW5jTGlzdC5wdXNoKHQpO2Vsc2V7Y29uc3RbZSxpLHNdPXQ7dGhpc1tlXShpLHMpfXRoaXMuY2hhcnQuX2RhdGFDaGFuZ2VzLnB1c2goW3RoaXMuaW5kZXgsLi4udF0pfV9vbkRhdGFQdXNoKCl7Y29uc3QgdD1hcmd1bWVudHMubGVuZ3RoO3RoaXMuX3N5bmMoWyJfaW5zZXJ0RWxlbWVudHMiLHRoaXMuZ2V0RGF0YXNldCgpLmRhdGEubGVuZ3RoLXQsdF0pfV9vbkRhdGFQb3AoKXt0aGlzLl9zeW5jKFsiX3JlbW92ZUVsZW1lbnRzIix0aGlzLl9jYWNoZWRNZXRhLmRhdGEubGVuZ3RoLTEsMV0pfV9vbkRhdGFTaGlmdCgpe3RoaXMuX3N5bmMoWyJfcmVtb3ZlRWxlbWVudHMiLDAsMV0pfV9vbkRhdGFTcGxpY2UodCxlKXtlJiZ0aGlzLl9zeW5jKFsiX3JlbW92ZUVsZW1lbnRzIix0LGVdKTtjb25zdCBpPWFyZ3VtZW50cy5sZW5ndGgtMjtpJiZ0aGlzLl9zeW5jKFsiX2luc2VydEVsZW1lbnRzIix0LGldKX1fb25EYXRhVW5zaGlmdCgpe3RoaXMuX3N5bmMoWyJfaW5zZXJ0RWxlbWVudHMiLDAsYXJndW1lbnRzLmxlbmd0aF0pfX1jbGFzcyBSc3tzdGF0aWMgZGVmYXVsdHM9e307c3RhdGljIGRlZmF1bHRSb3V0ZXM9dm9pZCAwO3g7eTthY3RpdmU9ITE7b3B0aW9uczskYW5pbWF0aW9uczt0b29sdGlwUG9zaXRpb24odCl7Y29uc3R7eDplLHk6aX09dGhpcy5nZXRQcm9wcyhbIngiLCJ5Il0sdCk7cmV0dXJue3g6ZSx5Oml9fWhhc1ZhbHVlKCl7cmV0dXJuIE4odGhpcy54KSYmTih0aGlzLnkpfWdldFByb3BzKHQsZSl7Y29uc3QgaT10aGlzLiRhbmltYXRpb25zO2lmKCFlfHwhaSlyZXR1cm4gdGhpcztjb25zdCBzPXt9O3JldHVybiB0LmZvckVhY2godD0+e3NbdF09aVt0XSYmaVt0XS5hY3RpdmUoKT9pW3RdLl90bzp0aGlzW3RdfSksc319ZnVuY3Rpb24gSXModCxlKXtjb25zdCBpPXQub3B0aW9ucy50aWNrcyxuPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dC5vcHRpb25zLm9mZnNldCxpPXQuX3RpY2tTaXplKCkscz10Ll9sZW5ndGgvaSsoZT8wOjEpLG49dC5fbWF4TGVuZ3RoL2k7cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5taW4ocyxuKSl9KHQpLG89TWF0aC5taW4oaS5tYXhUaWNrc0xpbWl0fHxuLG4pLGE9aS5tYWpvci5lbmFibGVkP2Z1bmN0aW9uKHQpe2NvbnN0IGU9W107bGV0IGkscztmb3IoaT0wLHM9dC5sZW5ndGg7aTxzO2krKyl0W2ldLm1ham9yJiZlLnB1c2goaSk7cmV0dXJuIGV9KGUpOltdLHI9YS5sZW5ndGgsbD1hWzBdLGg9YVtyLTFdLGM9W107aWYocj5vKXJldHVybiBmdW5jdGlvbih0LGUsaSxzKXtsZXQgbixvPTAsYT1pWzBdO2ZvcihzPU1hdGguY2VpbChzKSxuPTA7bjx0Lmxlbmd0aDtuKyspbj09PWEmJihlLnB1c2godFtuXSksbysrLGE9aVtvKnNdKX0oZSxjLGEsci9vKSxjO2NvbnN0IGQ9ZnVuY3Rpb24odCxlLGkpe2NvbnN0IHM9ZnVuY3Rpb24odCl7Y29uc3QgZT10Lmxlbmd0aDtsZXQgaSxzO2lmKGU8MilyZXR1cm4hMTtmb3Iocz10WzBdLGk9MTtpPGU7KytpKWlmKHRbaV0tdFtpLTFdIT09cylyZXR1cm4hMTtyZXR1cm4gc30odCksbj1lLmxlbmd0aC9pO2lmKCFzKXJldHVybiBNYXRoLm1heChuLDEpO2NvbnN0IG89VyhzKTtmb3IobGV0IHQ9MCxlPW8ubGVuZ3RoLTE7dDxlO3QrKyl7Y29uc3QgZT1vW3RdO2lmKGU+bilyZXR1cm4gZX1yZXR1cm4gTWF0aC5tYXgobiwxKX0oYSxlLG8pO2lmKHI+MCl7bGV0IHQsaTtjb25zdCBuPXI+MT9NYXRoLnJvdW5kKChoLWwpLyhyLTEpKTpudWxsO2Zvcih6cyhlLGMsZCxzKG4pPzA6bC1uLGwpLHQ9MCxpPXItMTt0PGk7dCsrKXpzKGUsYyxkLGFbdF0sYVt0KzFdKTtyZXR1cm4genMoZSxjLGQsaCxzKG4pP2UubGVuZ3RoOmgrbiksY31yZXR1cm4genMoZSxjLGQpLGN9ZnVuY3Rpb24genModCxlLGkscyxuKXtjb25zdCBvPWwocywwKSxhPU1hdGgubWluKGwobix0Lmxlbmd0aCksdC5sZW5ndGgpO2xldCByLGgsYyxkPTA7Zm9yKGk9TWF0aC5jZWlsKGkpLG4mJihyPW4tcyxpPXIvTWF0aC5mbG9vcihyL2kpKSxjPW87YzwwOylkKyssYz1NYXRoLnJvdW5kKG8rZCppKTtmb3IoaD1NYXRoLm1heChvLDApO2g8YTtoKyspaD09PWMmJihlLnB1c2godFtoXSksZCsrLGM9TWF0aC5yb3VuZChvK2QqaSkpfWNvbnN0IEZzPSh0LGUsaSk9PiJ0b3AiPT09ZXx8ImxlZnQiPT09ZT90W2VdK2k6dFtlXS1pLFZzPSh0LGUpPT5NYXRoLm1pbihlfHx0LHQpO2Z1bmN0aW9uIEJzKHQsZSl7Y29uc3QgaT1bXSxzPXQubGVuZ3RoL2Usbj10Lmxlbmd0aDtsZXQgbz0wO2Zvcig7bzxuO28rPXMpaS5wdXNoKHRbTWF0aC5mbG9vcihvKV0pO3JldHVybiBpfWZ1bmN0aW9uIFdzKHQsZSxpKXtjb25zdCBzPXQudGlja3MubGVuZ3RoLG49TWF0aC5taW4oZSxzLTEpLG89dC5fc3RhcnRQaXhlbCxhPXQuX2VuZFBpeGVsLHI9MWUtNjtsZXQgbCxoPXQuZ2V0UGl4ZWxGb3JUaWNrKG4pO2lmKCEoaSYmKGw9MT09PXM/TWF0aC5tYXgoaC1vLGEtaCk6MD09PWU/KHQuZ2V0UGl4ZWxGb3JUaWNrKDEpLWgpLzI6KGgtdC5nZXRQaXhlbEZvclRpY2sobi0xKSkvMixoKz1uPGU/bDotbCxoPG8tcnx8aD5hK3IpKSlyZXR1cm4gaH1mdW5jdGlvbiBOcyh0KXtyZXR1cm4gdC5kcmF3VGlja3M/dC50aWNrTGVuZ3RoOjB9ZnVuY3Rpb24gSHModCxlKXtpZighdC5kaXNwbGF5KXJldHVybiAwO2NvbnN0IGk9X2kodC5mb250LGUpLHM9eGkodC5wYWRkaW5nKTtyZXR1cm4obih0LnRleHQpP3QudGV4dC5sZW5ndGg6MSkqaS5saW5lSGVpZ2h0K3MuaGVpZ2h0fWZ1bmN0aW9uIGpzKHQsZSxpKXtsZXQgcz11dCh0KTtyZXR1cm4oaSYmInJpZ2h0IiE9PWV8fCFpJiYicmlnaHQiPT09ZSkmJihzPSh0PT4ibGVmdCI9PT10PyJyaWdodCI6InJpZ2h0Ij09PXQ/ImxlZnQiOnQpKHMpKSxzfWNsYXNzICRzIGV4dGVuZHMgUnN7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlkPXQuaWQsdGhpcy50eXBlPXQudHlwZSx0aGlzLm9wdGlvbnM9dm9pZCAwLHRoaXMuY3R4PXQuY3R4LHRoaXMuY2hhcnQ9dC5jaGFydCx0aGlzLnRvcD12b2lkIDAsdGhpcy5ib3R0b209dm9pZCAwLHRoaXMubGVmdD12b2lkIDAsdGhpcy5yaWdodD12b2lkIDAsdGhpcy53aWR0aD12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMuX21hcmdpbnM9e2xlZnQ6MCxyaWdodDowLHRvcDowLGJvdHRvbTowfSx0aGlzLm1heFdpZHRoPXZvaWQgMCx0aGlzLm1heEhlaWdodD12b2lkIDAsdGhpcy5wYWRkaW5nVG9wPXZvaWQgMCx0aGlzLnBhZGRpbmdCb3R0b209dm9pZCAwLHRoaXMucGFkZGluZ0xlZnQ9dm9pZCAwLHRoaXMucGFkZGluZ1JpZ2h0PXZvaWQgMCx0aGlzLmF4aXM9dm9pZCAwLHRoaXMubGFiZWxSb3RhdGlvbj12b2lkIDAsdGhpcy5taW49dm9pZCAwLHRoaXMubWF4PXZvaWQgMCx0aGlzLl9yYW5nZT12b2lkIDAsdGhpcy50aWNrcz1bXSx0aGlzLl9ncmlkTGluZUl0ZW1zPW51bGwsdGhpcy5fbGFiZWxJdGVtcz1udWxsLHRoaXMuX2xhYmVsU2l6ZXM9bnVsbCx0aGlzLl9sZW5ndGg9MCx0aGlzLl9tYXhMZW5ndGg9MCx0aGlzLl9sb25nZXN0VGV4dENhY2hlPXt9LHRoaXMuX3N0YXJ0UGl4ZWw9dm9pZCAwLHRoaXMuX2VuZFBpeGVsPXZvaWQgMCx0aGlzLl9yZXZlcnNlUGl4ZWxzPSExLHRoaXMuX3VzZXJNYXg9dm9pZCAwLHRoaXMuX3VzZXJNaW49dm9pZCAwLHRoaXMuX3N1Z2dlc3RlZE1heD12b2lkIDAsdGhpcy5fc3VnZ2VzdGVkTWluPXZvaWQgMCx0aGlzLl90aWNrc0xlbmd0aD0wLHRoaXMuX2JvcmRlclZhbHVlPTAsdGhpcy5fY2FjaGU9e30sdGhpcy5fZGF0YUxpbWl0c0NhY2hlZD0hMSx0aGlzLiRjb250ZXh0PXZvaWQgMH1pbml0KHQpe3RoaXMub3B0aW9ucz10LnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpLHRoaXMuYXhpcz10LmF4aXMsdGhpcy5fdXNlck1pbj10aGlzLnBhcnNlKHQubWluKSx0aGlzLl91c2VyTWF4PXRoaXMucGFyc2UodC5tYXgpLHRoaXMuX3N1Z2dlc3RlZE1pbj10aGlzLnBhcnNlKHQuc3VnZ2VzdGVkTWluKSx0aGlzLl9zdWdnZXN0ZWRNYXg9dGhpcy5wYXJzZSh0LnN1Z2dlc3RlZE1heCl9cGFyc2UodCxlKXtyZXR1cm4gdH1nZXRVc2VyQm91bmRzKCl7bGV0e191c2VyTWluOnQsX3VzZXJNYXg6ZSxfc3VnZ2VzdGVkTWluOmksX3N1Z2dlc3RlZE1heDpzfT10aGlzO3JldHVybiB0PXIodCxOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpLGU9cihlLE51bWJlci5ORUdBVElWRV9JTkZJTklUWSksaT1yKGksTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSxzPXIocyxOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpLHttaW46cih0LGkpLG1heDpyKGUscyksbWluRGVmaW5lZDphKHQpLG1heERlZmluZWQ6YShlKX19Z2V0TWluTWF4KHQpe2xldCBlLHttaW46aSxtYXg6cyxtaW5EZWZpbmVkOm4sbWF4RGVmaW5lZDpvfT10aGlzLmdldFVzZXJCb3VuZHMoKTtpZihuJiZvKXJldHVybnttaW46aSxtYXg6c307Y29uc3QgYT10aGlzLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKCk7Zm9yKGxldCByPTAsbD1hLmxlbmd0aDtyPGw7KytyKWU9YVtyXS5jb250cm9sbGVyLmdldE1pbk1heCh0aGlzLHQpLG58fChpPU1hdGgubWluKGksZS5taW4pKSxvfHwocz1NYXRoLm1heChzLGUubWF4KSk7cmV0dXJuIGk9byYmaT5zP3M6aSxzPW4mJmk+cz9pOnMse21pbjpyKGkscihzLGkpKSxtYXg6cihzLHIoaSxzKSl9fWdldFBhZGRpbmcoKXtyZXR1cm57bGVmdDp0aGlzLnBhZGRpbmdMZWZ0fHwwLHRvcDp0aGlzLnBhZGRpbmdUb3B8fDAscmlnaHQ6dGhpcy5wYWRkaW5nUmlnaHR8fDAsYm90dG9tOnRoaXMucGFkZGluZ0JvdHRvbXx8MH19Z2V0VGlja3MoKXtyZXR1cm4gdGhpcy50aWNrc31nZXRMYWJlbHMoKXtjb25zdCB0PXRoaXMuY2hhcnQuZGF0YTtyZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVsc3x8KHRoaXMuaXNIb3Jpem9udGFsKCk/dC54TGFiZWxzOnQueUxhYmVscyl8fHQubGFiZWxzfHxbXX1nZXRMYWJlbEl0ZW1zKHQ9dGhpcy5jaGFydC5jaGFydEFyZWEpe3JldHVybiB0aGlzLl9sYWJlbEl0ZW1zfHwodGhpcy5fbGFiZWxJdGVtcz10aGlzLl9jb21wdXRlTGFiZWxJdGVtcyh0KSl9YmVmb3JlTGF5b3V0KCl7dGhpcy5fY2FjaGU9e30sdGhpcy5fZGF0YUxpbWl0c0NhY2hlZD0hMX1iZWZvcmVVcGRhdGUoKXtkKHRoaXMub3B0aW9ucy5iZWZvcmVVcGRhdGUsW3RoaXNdKX11cGRhdGUodCxlLGkpe2NvbnN0e2JlZ2luQXRaZXJvOnMsZ3JhY2U6bix0aWNrczpvfT10aGlzLm9wdGlvbnMsYT1vLnNhbXBsZVNpemU7dGhpcy5iZWZvcmVVcGRhdGUoKSx0aGlzLm1heFdpZHRoPXQsdGhpcy5tYXhIZWlnaHQ9ZSx0aGlzLl9tYXJnaW5zPWk9T2JqZWN0LmFzc2lnbih7bGVmdDowLHJpZ2h0OjAsdG9wOjAsYm90dG9tOjB9LGkpLHRoaXMudGlja3M9bnVsbCx0aGlzLl9sYWJlbFNpemVzPW51bGwsdGhpcy5fZ3JpZExpbmVJdGVtcz1udWxsLHRoaXMuX2xhYmVsSXRlbXM9bnVsbCx0aGlzLmJlZm9yZVNldERpbWVuc2lvbnMoKSx0aGlzLnNldERpbWVuc2lvbnMoKSx0aGlzLmFmdGVyU2V0RGltZW5zaW9ucygpLHRoaXMuX21heExlbmd0aD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMud2lkdGgraS5sZWZ0K2kucmlnaHQ6dGhpcy5oZWlnaHQraS50b3AraS5ib3R0b20sdGhpcy5fZGF0YUxpbWl0c0NhY2hlZHx8KHRoaXMuYmVmb3JlRGF0YUxpbWl0cygpLHRoaXMuZGV0ZXJtaW5lRGF0YUxpbWl0cygpLHRoaXMuYWZ0ZXJEYXRhTGltaXRzKCksdGhpcy5fcmFuZ2U9dmkodGhpcyxuLHMpLHRoaXMuX2RhdGFMaW1pdHNDYWNoZWQ9ITApLHRoaXMuYmVmb3JlQnVpbGRUaWNrcygpLHRoaXMudGlja3M9dGhpcy5idWlsZFRpY2tzKCl8fFtdLHRoaXMuYWZ0ZXJCdWlsZFRpY2tzKCk7Y29uc3Qgcj1hPHRoaXMudGlja3MubGVuZ3RoO3RoaXMuX2NvbnZlcnRUaWNrc1RvTGFiZWxzKHI/QnModGhpcy50aWNrcyxhKTp0aGlzLnRpY2tzKSx0aGlzLmNvbmZpZ3VyZSgpLHRoaXMuYmVmb3JlQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpLHRoaXMuY2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpLHRoaXMuYWZ0ZXJDYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCksby5kaXNwbGF5JiYoby5hdXRvU2tpcHx8ImF1dG8iPT09by5zb3VyY2UpJiYodGhpcy50aWNrcz1Jcyh0aGlzLHRoaXMudGlja3MpLHRoaXMuX2xhYmVsU2l6ZXM9bnVsbCx0aGlzLmFmdGVyQXV0b1NraXAoKSksciYmdGhpcy5fY29udmVydFRpY2tzVG9MYWJlbHModGhpcy50aWNrcyksdGhpcy5iZWZvcmVGaXQoKSx0aGlzLmZpdCgpLHRoaXMuYWZ0ZXJGaXQoKSx0aGlzLmFmdGVyVXBkYXRlKCl9Y29uZmlndXJlKCl7bGV0IHQsZSxpPXRoaXMub3B0aW9ucy5yZXZlcnNlO3RoaXMuaXNIb3Jpem9udGFsKCk/KHQ9dGhpcy5sZWZ0LGU9dGhpcy5yaWdodCk6KHQ9dGhpcy50b3AsZT10aGlzLmJvdHRvbSxpPSFpKSx0aGlzLl9zdGFydFBpeGVsPXQsdGhpcy5fZW5kUGl4ZWw9ZSx0aGlzLl9yZXZlcnNlUGl4ZWxzPWksdGhpcy5fbGVuZ3RoPWUtdCx0aGlzLl9hbGlnblRvUGl4ZWxzPXRoaXMub3B0aW9ucy5hbGlnblRvUGl4ZWxzfWFmdGVyVXBkYXRlKCl7ZCh0aGlzLm9wdGlvbnMuYWZ0ZXJVcGRhdGUsW3RoaXNdKX1iZWZvcmVTZXREaW1lbnNpb25zKCl7ZCh0aGlzLm9wdGlvbnMuYmVmb3JlU2V0RGltZW5zaW9ucyxbdGhpc10pfXNldERpbWVuc2lvbnMoKXt0aGlzLmlzSG9yaXpvbnRhbCgpPyh0aGlzLndpZHRoPXRoaXMubWF4V2lkdGgsdGhpcy5sZWZ0PTAsdGhpcy5yaWdodD10aGlzLndpZHRoKToodGhpcy5oZWlnaHQ9dGhpcy5tYXhIZWlnaHQsdGhpcy50b3A9MCx0aGlzLmJvdHRvbT10aGlzLmhlaWdodCksdGhpcy5wYWRkaW5nTGVmdD0wLHRoaXMucGFkZGluZ1RvcD0wLHRoaXMucGFkZGluZ1JpZ2h0PTAsdGhpcy5wYWRkaW5nQm90dG9tPTB9YWZ0ZXJTZXREaW1lbnNpb25zKCl7ZCh0aGlzLm9wdGlvbnMuYWZ0ZXJTZXREaW1lbnNpb25zLFt0aGlzXSl9X2NhbGxIb29rcyh0KXt0aGlzLmNoYXJ0Lm5vdGlmeVBsdWdpbnModCx0aGlzLmdldENvbnRleHQoKSksZCh0aGlzLm9wdGlvbnNbdF0sW3RoaXNdKX1iZWZvcmVEYXRhTGltaXRzKCl7dGhpcy5fY2FsbEhvb2tzKCJiZWZvcmVEYXRhTGltaXRzIil9ZGV0ZXJtaW5lRGF0YUxpbWl0cygpe31hZnRlckRhdGFMaW1pdHMoKXt0aGlzLl9jYWxsSG9va3MoImFmdGVyRGF0YUxpbWl0cyIpfWJlZm9yZUJ1aWxkVGlja3MoKXt0aGlzLl9jYWxsSG9va3MoImJlZm9yZUJ1aWxkVGlja3MiKX1idWlsZFRpY2tzKCl7cmV0dXJuW119YWZ0ZXJCdWlsZFRpY2tzKCl7dGhpcy5fY2FsbEhvb2tzKCJhZnRlckJ1aWxkVGlja3MiKX1iZWZvcmVUaWNrVG9MYWJlbENvbnZlcnNpb24oKXtkKHRoaXMub3B0aW9ucy5iZWZvcmVUaWNrVG9MYWJlbENvbnZlcnNpb24sW3RoaXNdKX1nZW5lcmF0ZVRpY2tMYWJlbHModCl7Y29uc3QgZT10aGlzLm9wdGlvbnMudGlja3M7bGV0IGkscyxuO2ZvcihpPTAscz10Lmxlbmd0aDtpPHM7aSsrKW49dFtpXSxuLmxhYmVsPWQoZS5jYWxsYmFjayxbbi52YWx1ZSxpLHRdLHRoaXMpfWFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uKCl7ZCh0aGlzLm9wdGlvbnMuYWZ0ZXJUaWNrVG9MYWJlbENvbnZlcnNpb24sW3RoaXNdKX1iZWZvcmVDYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCl7ZCh0aGlzLm9wdGlvbnMuYmVmb3JlQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbixbdGhpc10pfWNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKXtjb25zdCB0PXRoaXMub3B0aW9ucyxlPXQudGlja3MsaT1Wcyh0aGlzLnRpY2tzLmxlbmd0aCx0LnRpY2tzLm1heFRpY2tzTGltaXQpLHM9ZS5taW5Sb3RhdGlvbnx8MCxuPWUubWF4Um90YXRpb247bGV0IG8sYSxyLGw9cztpZighdGhpcy5faXNWaXNpYmxlKCl8fCFlLmRpc3BsYXl8fHM+PW58fGk8PTF8fCF0aGlzLmlzSG9yaXpvbnRhbCgpKXJldHVybiB2b2lkKHRoaXMubGFiZWxSb3RhdGlvbj1zKTtjb25zdCBoPXRoaXMuX2dldExhYmVsU2l6ZXMoKSxjPWgud2lkZXN0LndpZHRoLGQ9aC5oaWdoZXN0LmhlaWdodCx1PUoodGhpcy5jaGFydC53aWR0aC1jLDAsdGhpcy5tYXhXaWR0aCk7bz10Lm9mZnNldD90aGlzLm1heFdpZHRoL2k6dS8oaS0xKSxjKzY+byYmKG89dS8oaS0odC5vZmZzZXQ/LjU6MSkpLGE9dGhpcy5tYXhIZWlnaHQtTnModC5ncmlkKS1lLnBhZGRpbmctSHModC50aXRsZSx0aGlzLmNoYXJ0Lm9wdGlvbnMuZm9udCkscj1NYXRoLnNxcnQoYypjK2QqZCksbD1ZKE1hdGgubWluKE1hdGguYXNpbihKKChoLmhpZ2hlc3QuaGVpZ2h0KzYpL28sLTEsMSkpLE1hdGguYXNpbihKKGEvciwtMSwxKSktTWF0aC5hc2luKEooZC9yLC0xLDEpKSkpLGw9TWF0aC5tYXgocyxNYXRoLm1pbihuLGwpKSksdGhpcy5sYWJlbFJvdGF0aW9uPWx9YWZ0ZXJDYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCl7ZCh0aGlzLm9wdGlvbnMuYWZ0ZXJDYWxjdWxhdGVMYWJlbFJvdGF0aW9uLFt0aGlzXSl9YWZ0ZXJBdXRvU2tpcCgpe31iZWZvcmVGaXQoKXtkKHRoaXMub3B0aW9ucy5iZWZvcmVGaXQsW3RoaXNdKX1maXQoKXtjb25zdCB0PXt3aWR0aDowLGhlaWdodDowfSx7Y2hhcnQ6ZSxvcHRpb25zOnt0aWNrczppLHRpdGxlOnMsZ3JpZDpufX09dGhpcyxvPXRoaXMuX2lzVmlzaWJsZSgpLGE9dGhpcy5pc0hvcml6b250YWwoKTtpZihvKXtjb25zdCBvPUhzKHMsZS5vcHRpb25zLmZvbnQpO2lmKGE/KHQud2lkdGg9dGhpcy5tYXhXaWR0aCx0LmhlaWdodD1OcyhuKStvKToodC5oZWlnaHQ9dGhpcy5tYXhIZWlnaHQsdC53aWR0aD1OcyhuKStvKSxpLmRpc3BsYXkmJnRoaXMudGlja3MubGVuZ3RoKXtjb25zdHtmaXJzdDplLGxhc3Q6cyx3aWRlc3Q6bixoaWdoZXN0Om99PXRoaXMuX2dldExhYmVsU2l6ZXMoKSxyPTIqaS5wYWRkaW5nLGw9JCh0aGlzLmxhYmVsUm90YXRpb24pLGg9TWF0aC5jb3MobCksYz1NYXRoLnNpbihsKTtpZihhKXtjb25zdCBlPWkubWlycm9yPzA6YypuLndpZHRoK2gqby5oZWlnaHQ7dC5oZWlnaHQ9TWF0aC5taW4odGhpcy5tYXhIZWlnaHQsdC5oZWlnaHQrZStyKX1lbHNle2NvbnN0IGU9aS5taXJyb3I/MDpoKm4ud2lkdGgrYypvLmhlaWdodDt0LndpZHRoPU1hdGgubWluKHRoaXMubWF4V2lkdGgsdC53aWR0aCtlK3IpfXRoaXMuX2NhbGN1bGF0ZVBhZGRpbmcoZSxzLGMsaCl9fXRoaXMuX2hhbmRsZU1hcmdpbnMoKSxhPyh0aGlzLndpZHRoPXRoaXMuX2xlbmd0aD1lLndpZHRoLXRoaXMuX21hcmdpbnMubGVmdC10aGlzLl9tYXJnaW5zLnJpZ2h0LHRoaXMuaGVpZ2h0PXQuaGVpZ2h0KToodGhpcy53aWR0aD10LndpZHRoLHRoaXMuaGVpZ2h0PXRoaXMuX2xlbmd0aD1lLmhlaWdodC10aGlzLl9tYXJnaW5zLnRvcC10aGlzLl9tYXJnaW5zLmJvdHRvbSl9X2NhbGN1bGF0ZVBhZGRpbmcodCxlLGkscyl7Y29uc3R7dGlja3M6e2FsaWduOm4scGFkZGluZzpvfSxwb3NpdGlvbjphfT10aGlzLm9wdGlvbnMscj0wIT09dGhpcy5sYWJlbFJvdGF0aW9uLGw9InRvcCIhPT1hJiYieCI9PT10aGlzLmF4aXM7aWYodGhpcy5pc0hvcml6b250YWwoKSl7Y29uc3QgYT10aGlzLmdldFBpeGVsRm9yVGljaygwKS10aGlzLmxlZnQsaD10aGlzLnJpZ2h0LXRoaXMuZ2V0UGl4ZWxGb3JUaWNrKHRoaXMudGlja3MubGVuZ3RoLTEpO2xldCBjPTAsZD0wO3I/bD8oYz1zKnQud2lkdGgsZD1pKmUuaGVpZ2h0KTooYz1pKnQuaGVpZ2h0LGQ9cyplLndpZHRoKToic3RhcnQiPT09bj9kPWUud2lkdGg6ImVuZCI9PT1uP2M9dC53aWR0aDoiaW5uZXIiIT09biYmKGM9dC53aWR0aC8yLGQ9ZS53aWR0aC8yKSx0aGlzLnBhZGRpbmdMZWZ0PU1hdGgubWF4KChjLWErbykqdGhpcy53aWR0aC8odGhpcy53aWR0aC1hKSwwKSx0aGlzLnBhZGRpbmdSaWdodD1NYXRoLm1heCgoZC1oK28pKnRoaXMud2lkdGgvKHRoaXMud2lkdGgtaCksMCl9ZWxzZXtsZXQgaT1lLmhlaWdodC8yLHM9dC5oZWlnaHQvMjsic3RhcnQiPT09bj8oaT0wLHM9dC5oZWlnaHQpOiJlbmQiPT09biYmKGk9ZS5oZWlnaHQscz0wKSx0aGlzLnBhZGRpbmdUb3A9aStvLHRoaXMucGFkZGluZ0JvdHRvbT1zK299fV9oYW5kbGVNYXJnaW5zKCl7dGhpcy5fbWFyZ2lucyYmKHRoaXMuX21hcmdpbnMubGVmdD1NYXRoLm1heCh0aGlzLnBhZGRpbmdMZWZ0LHRoaXMuX21hcmdpbnMubGVmdCksdGhpcy5fbWFyZ2lucy50b3A9TWF0aC5tYXgodGhpcy5wYWRkaW5nVG9wLHRoaXMuX21hcmdpbnMudG9wKSx0aGlzLl9tYXJnaW5zLnJpZ2h0PU1hdGgubWF4KHRoaXMucGFkZGluZ1JpZ2h0LHRoaXMuX21hcmdpbnMucmlnaHQpLHRoaXMuX21hcmdpbnMuYm90dG9tPU1hdGgubWF4KHRoaXMucGFkZGluZ0JvdHRvbSx0aGlzLl9tYXJnaW5zLmJvdHRvbSkpfWFmdGVyRml0KCl7ZCh0aGlzLm9wdGlvbnMuYWZ0ZXJGaXQsW3RoaXNdKX1pc0hvcml6b250YWwoKXtjb25zdHtheGlzOnQscG9zaXRpb246ZX09dGhpcy5vcHRpb25zO3JldHVybiJ0b3AiPT09ZXx8ImJvdHRvbSI9PT1lfHwieCI9PT10fWlzRnVsbFNpemUoKXtyZXR1cm4gdGhpcy5vcHRpb25zLmZ1bGxTaXplfV9jb252ZXJ0VGlja3NUb0xhYmVscyh0KXtsZXQgZSxpO2Zvcih0aGlzLmJlZm9yZVRpY2tUb0xhYmVsQ29udmVyc2lvbigpLHRoaXMuZ2VuZXJhdGVUaWNrTGFiZWxzKHQpLGU9MCxpPXQubGVuZ3RoO2U8aTtlKyspcyh0W2VdLmxhYmVsKSYmKHQuc3BsaWNlKGUsMSksaS0tLGUtLSk7dGhpcy5hZnRlclRpY2tUb0xhYmVsQ29udmVyc2lvbigpfV9nZXRMYWJlbFNpemVzKCl7bGV0IHQ9dGhpcy5fbGFiZWxTaXplcztpZighdCl7Y29uc3QgZT10aGlzLm9wdGlvbnMudGlja3Muc2FtcGxlU2l6ZTtsZXQgaT10aGlzLnRpY2tzO2U8aS5sZW5ndGgmJihpPUJzKGksZSkpLHRoaXMuX2xhYmVsU2l6ZXM9dD10aGlzLl9jb21wdXRlTGFiZWxTaXplcyhpLGkubGVuZ3RoLHRoaXMub3B0aW9ucy50aWNrcy5tYXhUaWNrc0xpbWl0KX1yZXR1cm4gdH1fY29tcHV0ZUxhYmVsU2l6ZXModCxlLGkpe2NvbnN0e2N0eDpvLF9sb25nZXN0VGV4dENhY2hlOmF9PXRoaXMscj1bXSxsPVtdLGg9TWF0aC5mbG9vcihlL1ZzKGUsaSkpO2xldCBjLGQsZixnLHAsbSxiLHgsXyx5LHYsTT0wLHc9MDtmb3IoYz0wO2M8ZTtjKz1oKXtpZihnPXRbY10ubGFiZWwscD10aGlzLl9yZXNvbHZlVGlja0ZvbnRPcHRpb25zKGMpLG8uZm9udD1tPXAuc3RyaW5nLGI9YVttXT1hW21dfHx7ZGF0YTp7fSxnYzpbXX0seD1wLmxpbmVIZWlnaHQsXz15PTAscyhnKXx8bihnKSl7aWYobihnKSlmb3IoZD0wLGY9Zy5sZW5ndGg7ZDxmOysrZCl2PWdbZF0scyh2KXx8bih2KXx8KF89TWUobyxiLmRhdGEsYi5nYyxfLHYpLHkrPXgpfWVsc2UgXz1NZShvLGIuZGF0YSxiLmdjLF8sZykseT14O3IucHVzaChfKSxsLnB1c2goeSksTT1NYXRoLm1heChfLE0pLHc9TWF0aC5tYXgoeSx3KX0hZnVuY3Rpb24odCxlKXt1KHQsdD0+e2NvbnN0IGk9dC5nYyxzPWkubGVuZ3RoLzI7bGV0IG47aWYocz5lKXtmb3Iobj0wO248czsrK24pZGVsZXRlIHQuZGF0YVtpW25dXTtpLnNwbGljZSgwLHMpfX0pfShhLGUpO2NvbnN0IGs9ci5pbmRleE9mKE0pLFM9bC5pbmRleE9mKHcpLFA9dD0+KHt3aWR0aDpyW3RdfHwwLGhlaWdodDpsW3RdfHwwfSk7cmV0dXJue2ZpcnN0OlAoMCksbGFzdDpQKGUtMSksd2lkZXN0OlAoayksaGlnaGVzdDpQKFMpLHdpZHRoczpyLGhlaWdodHM6bH19Z2V0TGFiZWxGb3JWYWx1ZSh0KXtyZXR1cm4gdH1nZXRQaXhlbEZvclZhbHVlKHQsZSl7cmV0dXJuIE5hTn1nZXRWYWx1ZUZvclBpeGVsKHQpe31nZXRQaXhlbEZvclRpY2sodCl7Y29uc3QgZT10aGlzLnRpY2tzO3JldHVybiB0PDB8fHQ+ZS5sZW5ndGgtMT9udWxsOnRoaXMuZ2V0UGl4ZWxGb3JWYWx1ZShlW3RdLnZhbHVlKX1nZXRQaXhlbEZvckRlY2ltYWwodCl7dGhpcy5fcmV2ZXJzZVBpeGVscyYmKHQ9MS10KTtjb25zdCBlPXRoaXMuX3N0YXJ0UGl4ZWwrdCp0aGlzLl9sZW5ndGg7cmV0dXJuIFEodGhpcy5fYWxpZ25Ub1BpeGVscz9rZSh0aGlzLmNoYXJ0LGUsMCk6ZSl9Z2V0RGVjaW1hbEZvclBpeGVsKHQpe2NvbnN0IGU9KHQtdGhpcy5fc3RhcnRQaXhlbCkvdGhpcy5fbGVuZ3RoO3JldHVybiB0aGlzLl9yZXZlcnNlUGl4ZWxzPzEtZTplfWdldEJhc2VQaXhlbCgpe3JldHVybiB0aGlzLmdldFBpeGVsRm9yVmFsdWUodGhpcy5nZXRCYXNlVmFsdWUoKSl9Z2V0QmFzZVZhbHVlKCl7Y29uc3R7bWluOnQsbWF4OmV9PXRoaXM7cmV0dXJuIHQ8MCYmZTwwP2U6dD4wJiZlPjA/dDowfWdldENvbnRleHQodCl7Y29uc3QgZT10aGlzLnRpY2tzfHxbXTtpZih0Pj0wJiZ0PGUubGVuZ3RoKXtjb25zdCBpPWVbdF07cmV0dXJuIGkuJGNvbnRleHR8fChpLiRjb250ZXh0PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gTWkodCx7dGljazppLGluZGV4OmUsdHlwZToidGljayJ9KX0odGhpcy5nZXRDb250ZXh0KCksdCxpKSl9cmV0dXJuIHRoaXMuJGNvbnRleHR8fCh0aGlzLiRjb250ZXh0PU1pKHRoaXMuY2hhcnQuZ2V0Q29udGV4dCgpLHtzY2FsZTp0aGlzLHR5cGU6InNjYWxlIn0pKX1fdGlja1NpemUoKXtjb25zdCB0PXRoaXMub3B0aW9ucy50aWNrcyxlPSQodGhpcy5sYWJlbFJvdGF0aW9uKSxpPU1hdGguYWJzKE1hdGguY29zKGUpKSxzPU1hdGguYWJzKE1hdGguc2luKGUpKSxuPXRoaXMuX2dldExhYmVsU2l6ZXMoKSxvPXQuYXV0b1NraXBQYWRkaW5nfHwwLGE9bj9uLndpZGVzdC53aWR0aCtvOjAscj1uP24uaGlnaGVzdC5oZWlnaHQrbzowO3JldHVybiB0aGlzLmlzSG9yaXpvbnRhbCgpP3IqaT5hKnM/YS9pOnIvczpyKnM8YSppP3IvaTphL3N9X2lzVmlzaWJsZSgpe2NvbnN0IHQ9dGhpcy5vcHRpb25zLmRpc3BsYXk7cmV0dXJuImF1dG8iIT09dD8hIXQ6dGhpcy5nZXRNYXRjaGluZ1Zpc2libGVNZXRhcygpLmxlbmd0aD4wfV9jb21wdXRlR3JpZExpbmVJdGVtcyh0KXtjb25zdCBlPXRoaXMuYXhpcyxpPXRoaXMuY2hhcnQscz10aGlzLm9wdGlvbnMse2dyaWQ6bixwb3NpdGlvbjphLGJvcmRlcjpyfT1zLGg9bi5vZmZzZXQsYz10aGlzLmlzSG9yaXpvbnRhbCgpLGQ9dGhpcy50aWNrcy5sZW5ndGgrKGg/MTowKSx1PU5zKG4pLGY9W10sZz1yLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpLHA9Zy5kaXNwbGF5P2cud2lkdGg6MCxtPXAvMixiPWZ1bmN0aW9uKHQpe3JldHVybiBrZShpLHQscCl9O2xldCB4LF8seSx2LE0sdyxrLFMsUCxELEMsTztpZigidG9wIj09PWEpeD1iKHRoaXMuYm90dG9tKSx3PXRoaXMuYm90dG9tLXUsUz14LW0sRD1iKHQudG9wKSttLE89dC5ib3R0b207ZWxzZSBpZigiYm90dG9tIj09PWEpeD1iKHRoaXMudG9wKSxEPXQudG9wLE89Yih0LmJvdHRvbSktbSx3PXgrbSxTPXRoaXMudG9wK3U7ZWxzZSBpZigibGVmdCI9PT1hKXg9Yih0aGlzLnJpZ2h0KSxNPXRoaXMucmlnaHQtdSxrPXgtbSxQPWIodC5sZWZ0KSttLEM9dC5yaWdodDtlbHNlIGlmKCJyaWdodCI9PT1hKXg9Yih0aGlzLmxlZnQpLFA9dC5sZWZ0LEM9Yih0LnJpZ2h0KS1tLE09eCttLGs9dGhpcy5sZWZ0K3U7ZWxzZSBpZigieCI9PT1lKXtpZigiY2VudGVyIj09PWEpeD1iKCh0LnRvcCt0LmJvdHRvbSkvMisuNSk7ZWxzZSBpZihvKGEpKXtjb25zdCB0PU9iamVjdC5rZXlzKGEpWzBdLGU9YVt0XTt4PWIodGhpcy5jaGFydC5zY2FsZXNbdF0uZ2V0UGl4ZWxGb3JWYWx1ZShlKSl9RD10LnRvcCxPPXQuYm90dG9tLHc9eCttLFM9dyt1fWVsc2UgaWYoInkiPT09ZSl7aWYoImNlbnRlciI9PT1hKXg9YigodC5sZWZ0K3QucmlnaHQpLzIpO2Vsc2UgaWYobyhhKSl7Y29uc3QgdD1PYmplY3Qua2V5cyhhKVswXSxlPWFbdF07eD1iKHRoaXMuY2hhcnQuc2NhbGVzW3RdLmdldFBpeGVsRm9yVmFsdWUoZSkpfU09eC1tLGs9TS11LFA9dC5sZWZ0LEM9dC5yaWdodH1jb25zdCBBPWwocy50aWNrcy5tYXhUaWNrc0xpbWl0LGQpLFQ9TWF0aC5tYXgoMSxNYXRoLmNlaWwoZC9BKSk7Zm9yKF89MDtfPGQ7Xys9VCl7Y29uc3QgdD10aGlzLmdldENvbnRleHQoXyksZT1uLnNldENvbnRleHQodCkscz1yLnNldENvbnRleHQodCksbz1lLmxpbmVXaWR0aCxhPWUuY29sb3IsbD1zLmRhc2h8fFtdLGQ9cy5kYXNoT2Zmc2V0LHU9ZS50aWNrV2lkdGgsZz1lLnRpY2tDb2xvcixwPWUudGlja0JvcmRlckRhc2h8fFtdLG09ZS50aWNrQm9yZGVyRGFzaE9mZnNldDt5PVdzKHRoaXMsXyxoKSx2b2lkIDAhPT15JiYodj1rZShpLHksbyksYz9NPWs9UD1DPXY6dz1TPUQ9Tz12LGYucHVzaCh7dHgxOk0sdHkxOncsdHgyOmssdHkyOlMseDE6UCx5MTpELHgyOkMseTI6Tyx3aWR0aDpvLGNvbG9yOmEsYm9yZGVyRGFzaDpsLGJvcmRlckRhc2hPZmZzZXQ6ZCx0aWNrV2lkdGg6dSx0aWNrQ29sb3I6Zyx0aWNrQm9yZGVyRGFzaDpwLHRpY2tCb3JkZXJEYXNoT2Zmc2V0Om19KSl9cmV0dXJuIHRoaXMuX3RpY2tzTGVuZ3RoPWQsdGhpcy5fYm9yZGVyVmFsdWU9eCxmfV9jb21wdXRlTGFiZWxJdGVtcyh0KXtjb25zdCBlPXRoaXMuYXhpcyxpPXRoaXMub3B0aW9ucyx7cG9zaXRpb246cyx0aWNrczphfT1pLHI9dGhpcy5pc0hvcml6b250YWwoKSxsPXRoaXMudGlja3Mse2FsaWduOmgsY3Jvc3NBbGlnbjpjLHBhZGRpbmc6ZCxtaXJyb3I6dX09YSxmPU5zKGkuZ3JpZCksZz1mK2QscD11Py1kOmcsbT0tJCh0aGlzLmxhYmVsUm90YXRpb24pLGI9W107bGV0IHgsXyx5LHYsTSx3LGssUyxQLEQsQyxPLEE9Im1pZGRsZSI7aWYoInRvcCI9PT1zKXc9dGhpcy5ib3R0b20tcCxrPXRoaXMuX2dldFhBeGlzTGFiZWxBbGlnbm1lbnQoKTtlbHNlIGlmKCJib3R0b20iPT09cyl3PXRoaXMudG9wK3Asaz10aGlzLl9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCk7ZWxzZSBpZigibGVmdCI9PT1zKXtjb25zdCB0PXRoaXMuX2dldFlBeGlzTGFiZWxBbGlnbm1lbnQoZik7az10LnRleHRBbGlnbixNPXQueH1lbHNlIGlmKCJyaWdodCI9PT1zKXtjb25zdCB0PXRoaXMuX2dldFlBeGlzTGFiZWxBbGlnbm1lbnQoZik7az10LnRleHRBbGlnbixNPXQueH1lbHNlIGlmKCJ4Ij09PWUpe2lmKCJjZW50ZXIiPT09cyl3PSh0LnRvcCt0LmJvdHRvbSkvMitnO2Vsc2UgaWYobyhzKSl7Y29uc3QgdD1PYmplY3Qua2V5cyhzKVswXSxlPXNbdF07dz10aGlzLmNoYXJ0LnNjYWxlc1t0XS5nZXRQaXhlbEZvclZhbHVlKGUpK2d9az10aGlzLl9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCl9ZWxzZSBpZigieSI9PT1lKXtpZigiY2VudGVyIj09PXMpTT0odC5sZWZ0K3QucmlnaHQpLzItZztlbHNlIGlmKG8ocykpe2NvbnN0IHQ9T2JqZWN0LmtleXMocylbMF0sZT1zW3RdO009dGhpcy5jaGFydC5zY2FsZXNbdF0uZ2V0UGl4ZWxGb3JWYWx1ZShlKX1rPXRoaXMuX2dldFlBeGlzTGFiZWxBbGlnbm1lbnQoZikudGV4dEFsaWdufSJ5Ij09PWUmJigic3RhcnQiPT09aD9BPSJ0b3AiOiJlbmQiPT09aCYmKEE9ImJvdHRvbSIpKTtjb25zdCBUPXRoaXMuX2dldExhYmVsU2l6ZXMoKTtmb3IoeD0wLF89bC5sZW5ndGg7eDxfOysreCl7eT1sW3hdLHY9eS5sYWJlbDtjb25zdCB0PWEuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoeCkpO1M9dGhpcy5nZXRQaXhlbEZvclRpY2soeCkrYS5sYWJlbE9mZnNldCxQPXRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoeCksRD1QLmxpbmVIZWlnaHQsQz1uKHYpP3YubGVuZ3RoOjE7Y29uc3QgZT1DLzIsaT10LmNvbG9yLG89dC50ZXh0U3Ryb2tlQ29sb3IsaD10LnRleHRTdHJva2VXaWR0aDtsZXQgZCxmPWs7aWYocj8oTT1TLCJpbm5lciI9PT1rJiYoZj14PT09Xy0xP3RoaXMub3B0aW9ucy5yZXZlcnNlPyJsZWZ0IjoicmlnaHQiOjA9PT14P3RoaXMub3B0aW9ucy5yZXZlcnNlPyJyaWdodCI6ImxlZnQiOiJjZW50ZXIiKSxPPSJ0b3AiPT09cz8ibmVhciI9PT1jfHwwIT09bT8tQypEK0QvMjoiY2VudGVyIj09PWM/LVQuaGlnaGVzdC5oZWlnaHQvMi1lKkQrRDotVC5oaWdoZXN0LmhlaWdodCtELzI6Im5lYXIiPT09Y3x8MCE9PW0/RC8yOiJjZW50ZXIiPT09Yz9ULmhpZ2hlc3QuaGVpZ2h0LzItZSpEOlQuaGlnaGVzdC5oZWlnaHQtQypELHUmJihPKj0tMSksMD09PW18fHQuc2hvd0xhYmVsQmFja2Ryb3B8fChNKz1ELzIqTWF0aC5zaW4obSkpKToodz1TLE89KDEtQykqRC8yKSx0LnNob3dMYWJlbEJhY2tkcm9wKXtjb25zdCBlPXhpKHQuYmFja2Ryb3BQYWRkaW5nKSxpPVQuaGVpZ2h0c1t4XSxzPVQud2lkdGhzW3hdO2xldCBuPU8tZS50b3Asbz0wLWUubGVmdDtzd2l0Y2goQSl7Y2FzZSJtaWRkbGUiOm4tPWkvMjticmVhaztjYXNlImJvdHRvbSI6bi09aX1zd2l0Y2goayl7Y2FzZSJjZW50ZXIiOm8tPXMvMjticmVhaztjYXNlInJpZ2h0IjpvLT1zO2JyZWFrO2Nhc2UiaW5uZXIiOng9PT1fLTE/by09czp4PjAmJihvLT1zLzIpfWQ9e2xlZnQ6byx0b3A6bix3aWR0aDpzK2Uud2lkdGgsaGVpZ2h0OmkrZS5oZWlnaHQsY29sb3I6dC5iYWNrZHJvcENvbG9yfX1iLnB1c2goe2xhYmVsOnYsZm9udDpQLHRleHRPZmZzZXQ6TyxvcHRpb25zOntyb3RhdGlvbjptLGNvbG9yOmksc3Ryb2tlQ29sb3I6byxzdHJva2VXaWR0aDpoLHRleHRBbGlnbjpmLHRleHRCYXNlbGluZTpBLHRyYW5zbGF0aW9uOltNLHddLGJhY2tkcm9wOmR9fSl9cmV0dXJuIGJ9X2dldFhBeGlzTGFiZWxBbGlnbm1lbnQoKXtjb25zdHtwb3NpdGlvbjp0LHRpY2tzOmV9PXRoaXMub3B0aW9ucztpZigtJCh0aGlzLmxhYmVsUm90YXRpb24pKXJldHVybiJ0b3AiPT09dD8ibGVmdCI6InJpZ2h0IjtsZXQgaT0iY2VudGVyIjtyZXR1cm4ic3RhcnQiPT09ZS5hbGlnbj9pPSJsZWZ0IjoiZW5kIj09PWUuYWxpZ24/aT0icmlnaHQiOiJpbm5lciI9PT1lLmFsaWduJiYoaT0iaW5uZXIiKSxpfV9nZXRZQXhpc0xhYmVsQWxpZ25tZW50KHQpe2NvbnN0e3Bvc2l0aW9uOmUsdGlja3M6e2Nyb3NzQWxpZ246aSxtaXJyb3I6cyxwYWRkaW5nOm59fT10aGlzLm9wdGlvbnMsbz10K24sYT10aGlzLl9nZXRMYWJlbFNpemVzKCkud2lkZXN0LndpZHRoO2xldCByLGw7cmV0dXJuImxlZnQiPT09ZT9zPyhsPXRoaXMucmlnaHQrbiwibmVhciI9PT1pP3I9ImxlZnQiOiJjZW50ZXIiPT09aT8ocj0iY2VudGVyIixsKz1hLzIpOihyPSJyaWdodCIsbCs9YSkpOihsPXRoaXMucmlnaHQtbywibmVhciI9PT1pP3I9InJpZ2h0IjoiY2VudGVyIj09PWk/KHI9ImNlbnRlciIsbC09YS8yKToocj0ibGVmdCIsbD10aGlzLmxlZnQpKToicmlnaHQiPT09ZT9zPyhsPXRoaXMubGVmdCtuLCJuZWFyIj09PWk/cj0icmlnaHQiOiJjZW50ZXIiPT09aT8ocj0iY2VudGVyIixsLT1hLzIpOihyPSJsZWZ0IixsLT1hKSk6KGw9dGhpcy5sZWZ0K28sIm5lYXIiPT09aT9yPSJsZWZ0IjoiY2VudGVyIj09PWk/KHI9ImNlbnRlciIsbCs9YS8yKToocj0icmlnaHQiLGw9dGhpcy5yaWdodCkpOnI9InJpZ2h0Iix7dGV4dEFsaWduOnIseDpsfX1fY29tcHV0ZUxhYmVsQXJlYSgpe2lmKHRoaXMub3B0aW9ucy50aWNrcy5taXJyb3IpcmV0dXJuO2NvbnN0IHQ9dGhpcy5jaGFydCxlPXRoaXMub3B0aW9ucy5wb3NpdGlvbjtyZXR1cm4ibGVmdCI9PT1lfHwicmlnaHQiPT09ZT97dG9wOjAsbGVmdDp0aGlzLmxlZnQsYm90dG9tOnQuaGVpZ2h0LHJpZ2h0OnRoaXMucmlnaHR9OiJ0b3AiPT09ZXx8ImJvdHRvbSI9PT1lP3t0b3A6dGhpcy50b3AsbGVmdDowLGJvdHRvbTp0aGlzLmJvdHRvbSxyaWdodDp0LndpZHRofTp2b2lkIDB9ZHJhd0JhY2tncm91bmQoKXtjb25zdHtjdHg6dCxvcHRpb25zOntiYWNrZ3JvdW5kQ29sb3I6ZX0sbGVmdDppLHRvcDpzLHdpZHRoOm4saGVpZ2h0Om99PXRoaXM7ZSYmKHQuc2F2ZSgpLHQuZmlsbFN0eWxlPWUsdC5maWxsUmVjdChpLHMsbixvKSx0LnJlc3RvcmUoKSl9Z2V0TGluZVdpZHRoRm9yVmFsdWUodCl7Y29uc3QgZT10aGlzLm9wdGlvbnMuZ3JpZDtpZighdGhpcy5faXNWaXNpYmxlKCl8fCFlLmRpc3BsYXkpcmV0dXJuIDA7Y29uc3QgaT10aGlzLnRpY2tzLmZpbmRJbmRleChlPT5lLnZhbHVlPT09dCk7cmV0dXJuIGk+PTA/ZS5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dChpKSkubGluZVdpZHRoOjB9ZHJhd0dyaWQodCl7Y29uc3QgZT10aGlzLm9wdGlvbnMuZ3JpZCxpPXRoaXMuY3R4LHM9dGhpcy5fZ3JpZExpbmVJdGVtc3x8KHRoaXMuX2dyaWRMaW5lSXRlbXM9dGhpcy5fY29tcHV0ZUdyaWRMaW5lSXRlbXModCkpO2xldCBuLG87Y29uc3QgYT0odCxlLHMpPT57cy53aWR0aCYmcy5jb2xvciYmKGkuc2F2ZSgpLGkubGluZVdpZHRoPXMud2lkdGgsaS5zdHJva2VTdHlsZT1zLmNvbG9yLGkuc2V0TGluZURhc2gocy5ib3JkZXJEYXNofHxbXSksaS5saW5lRGFzaE9mZnNldD1zLmJvcmRlckRhc2hPZmZzZXQsaS5iZWdpblBhdGgoKSxpLm1vdmVUbyh0LngsdC55KSxpLmxpbmVUbyhlLngsZS55KSxpLnN0cm9rZSgpLGkucmVzdG9yZSgpKX07aWYoZS5kaXNwbGF5KWZvcihuPTAsbz1zLmxlbmd0aDtuPG87KytuKXtjb25zdCB0PXNbbl07ZS5kcmF3T25DaGFydEFyZWEmJmEoe3g6dC54MSx5OnQueTF9LHt4OnQueDIseTp0LnkyfSx0KSxlLmRyYXdUaWNrcyYmYSh7eDp0LnR4MSx5OnQudHkxfSx7eDp0LnR4Mix5OnQudHkyfSx7Y29sb3I6dC50aWNrQ29sb3Isd2lkdGg6dC50aWNrV2lkdGgsYm9yZGVyRGFzaDp0LnRpY2tCb3JkZXJEYXNoLGJvcmRlckRhc2hPZmZzZXQ6dC50aWNrQm9yZGVyRGFzaE9mZnNldH0pfX1kcmF3Qm9yZGVyKCl7Y29uc3R7Y2hhcnQ6dCxjdHg6ZSxvcHRpb25zOntib3JkZXI6aSxncmlkOnN9fT10aGlzLG49aS5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpKSxvPWkuZGlzcGxheT9uLndpZHRoOjA7aWYoIW8pcmV0dXJuO2NvbnN0IGE9cy5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgwKSkubGluZVdpZHRoLHI9dGhpcy5fYm9yZGVyVmFsdWU7bGV0IGwsaCxjLGQ7dGhpcy5pc0hvcml6b250YWwoKT8obD1rZSh0LHRoaXMubGVmdCxvKS1vLzIsaD1rZSh0LHRoaXMucmlnaHQsYSkrYS8yLGM9ZD1yKTooYz1rZSh0LHRoaXMudG9wLG8pLW8vMixkPWtlKHQsdGhpcy5ib3R0b20sYSkrYS8yLGw9aD1yKSxlLnNhdmUoKSxlLmxpbmVXaWR0aD1uLndpZHRoLGUuc3Ryb2tlU3R5bGU9bi5jb2xvcixlLmJlZ2luUGF0aCgpLGUubW92ZVRvKGwsYyksZS5saW5lVG8oaCxkKSxlLnN0cm9rZSgpLGUucmVzdG9yZSgpfWRyYXdMYWJlbHModCl7aWYoIXRoaXMub3B0aW9ucy50aWNrcy5kaXNwbGF5KXJldHVybjtjb25zdCBlPXRoaXMuY3R4LGk9dGhpcy5fY29tcHV0ZUxhYmVsQXJlYSgpO2kmJk9lKGUsaSk7Y29uc3Qgcz10aGlzLmdldExhYmVsSXRlbXModCk7Zm9yKGNvbnN0IHQgb2Ygcyl7Y29uc3QgaT10Lm9wdGlvbnMscz10LmZvbnQ7SWUoZSx0LmxhYmVsLDAsdC50ZXh0T2Zmc2V0LHMsaSl9aSYmQWUoZSl9ZHJhd1RpdGxlKCl7Y29uc3R7Y3R4OnQsb3B0aW9uczp7cG9zaXRpb246ZSx0aXRsZTppLHJldmVyc2U6c319PXRoaXM7aWYoIWkuZGlzcGxheSlyZXR1cm47Y29uc3QgYT1faShpLmZvbnQpLHI9eGkoaS5wYWRkaW5nKSxsPWkuYWxpZ247bGV0IGg9YS5saW5lSGVpZ2h0LzI7ImJvdHRvbSI9PT1lfHwiY2VudGVyIj09PWV8fG8oZSk/KGgrPXIuYm90dG9tLG4oaS50ZXh0KSYmKGgrPWEubGluZUhlaWdodCooaS50ZXh0Lmxlbmd0aC0xKSkpOmgrPXIudG9wO2NvbnN0e3RpdGxlWDpjLHRpdGxlWTpkLG1heFdpZHRoOnUscm90YXRpb246Zn09ZnVuY3Rpb24odCxlLGkscyl7Y29uc3R7dG9wOm4sbGVmdDphLGJvdHRvbTpyLHJpZ2h0OmwsY2hhcnQ6aH09dCx7Y2hhcnRBcmVhOmMsc2NhbGVzOmR9PWg7bGV0IHUsZixnLHA9MDtjb25zdCBtPXItbixiPWwtYTtpZih0LmlzSG9yaXpvbnRhbCgpKXtpZihmPWZ0KHMsYSxsKSxvKGkpKXtjb25zdCB0PU9iamVjdC5rZXlzKGkpWzBdLHM9aVt0XTtnPWRbdF0uZ2V0UGl4ZWxGb3JWYWx1ZShzKSttLWV9ZWxzZSBnPSJjZW50ZXIiPT09aT8oYy5ib3R0b20rYy50b3ApLzIrbS1lOkZzKHQsaSxlKTt1PWwtYX1lbHNle2lmKG8oaSkpe2NvbnN0IHQ9T2JqZWN0LmtleXMoaSlbMF0scz1pW3RdO2Y9ZFt0XS5nZXRQaXhlbEZvclZhbHVlKHMpLWIrZX1lbHNlIGY9ImNlbnRlciI9PT1pPyhjLmxlZnQrYy5yaWdodCkvMi1iK2U6RnModCxpLGUpO2c9ZnQocyxyLG4pLHA9ImxlZnQiPT09aT8tRTpFfXJldHVybnt0aXRsZVg6Zix0aXRsZVk6ZyxtYXhXaWR0aDp1LHJvdGF0aW9uOnB9fSh0aGlzLGgsZSxsKTtJZSh0LGkudGV4dCwwLDAsYSx7Y29sb3I6aS5jb2xvcixtYXhXaWR0aDp1LHJvdGF0aW9uOmYsdGV4dEFsaWduOmpzKGwsZSxzKSx0ZXh0QmFzZWxpbmU6Im1pZGRsZSIsdHJhbnNsYXRpb246W2MsZF19KX1kcmF3KHQpe3RoaXMuX2lzVmlzaWJsZSgpJiYodGhpcy5kcmF3QmFja2dyb3VuZCgpLHRoaXMuZHJhd0dyaWQodCksdGhpcy5kcmF3Qm9yZGVyKCksdGhpcy5kcmF3VGl0bGUoKSx0aGlzLmRyYXdMYWJlbHModCkpfV9sYXllcnMoKXtjb25zdCB0PXRoaXMub3B0aW9ucyxlPXQudGlja3MmJnQudGlja3Muenx8MCxpPWwodC5ncmlkJiZ0LmdyaWQueiwtMSkscz1sKHQuYm9yZGVyJiZ0LmJvcmRlci56LDApO3JldHVybiB0aGlzLl9pc1Zpc2libGUoKSYmdGhpcy5kcmF3PT09JHMucHJvdG90eXBlLmRyYXc/W3t6OmksZHJhdzp0PT57dGhpcy5kcmF3QmFja2dyb3VuZCgpLHRoaXMuZHJhd0dyaWQodCksdGhpcy5kcmF3VGl0bGUoKX19LHt6OnMsZHJhdzooKT0+e3RoaXMuZHJhd0JvcmRlcigpfX0se3o6ZSxkcmF3OnQ9Pnt0aGlzLmRyYXdMYWJlbHModCl9fV06W3t6OmUsZHJhdzp0PT57dGhpcy5kcmF3KHQpfX1dfWdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKHQpe2NvbnN0IGU9dGhpcy5jaGFydC5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCksaT10aGlzLmF4aXMrIkF4aXNJRCIscz1bXTtsZXQgbixvO2ZvcihuPTAsbz1lLmxlbmd0aDtuPG87KytuKXtjb25zdCBvPWVbbl07b1tpXSE9PXRoaXMuaWR8fHQmJm8udHlwZSE9PXR8fHMucHVzaChvKX1yZXR1cm4gc31fcmVzb2x2ZVRpY2tGb250T3B0aW9ucyh0KXtyZXR1cm4gX2kodGhpcy5vcHRpb25zLnRpY2tzLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KHQpKS5mb250KX1fbWF4RGlnaXRzKCl7Y29uc3QgdD10aGlzLl9yZXNvbHZlVGlja0ZvbnRPcHRpb25zKDApLmxpbmVIZWlnaHQ7cmV0dXJuKHRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy53aWR0aDp0aGlzLmhlaWdodCkvdH19Y2xhc3MgWXN7Y29uc3RydWN0b3IodCxlLGkpe3RoaXMudHlwZT10LHRoaXMuc2NvcGU9ZSx0aGlzLm92ZXJyaWRlPWksdGhpcy5pdGVtcz1PYmplY3QuY3JlYXRlKG51bGwpfWlzRm9yVHlwZSh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mLmNhbGwodGhpcy50eXBlLnByb3RvdHlwZSx0LnByb3RvdHlwZSl9cmVnaXN0ZXIodCl7Y29uc3QgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCk7bGV0IGk7KGZ1bmN0aW9uKHQpe3JldHVybiJpZCJpbiB0JiYiZGVmYXVsdHMiaW4gdH0pKGUpJiYoaT10aGlzLnJlZ2lzdGVyKGUpKTtjb25zdCBzPXRoaXMuaXRlbXMsbj10LmlkLG89dGhpcy5zY29wZSsiLiIrbjtpZighbil0aHJvdyBuZXcgRXJyb3IoImNsYXNzIGRvZXMgbm90IGhhdmUgaWQ6ICIrdCk7cmV0dXJuIG4gaW4gc3x8KHNbbl09dCxmdW5jdGlvbih0LGUsaSl7Y29uc3Qgcz1iKE9iamVjdC5jcmVhdGUobnVsbCksW2k/cmUuZ2V0KGkpOnt9LHJlLmdldChlKSx0LmRlZmF1bHRzXSk7cmUuc2V0KGUscyksdC5kZWZhdWx0Um91dGVzJiZmdW5jdGlvbih0LGUpe09iamVjdC5rZXlzKGUpLmZvckVhY2goaT0+e2NvbnN0IHM9aS5zcGxpdCgiLiIpLG49cy5wb3AoKSxvPVt0XS5jb25jYXQocykuam9pbigiLiIpLGE9ZVtpXS5zcGxpdCgiLiIpLHI9YS5wb3AoKSxsPWEuam9pbigiLiIpO3JlLnJvdXRlKG8sbixsLHIpfSl9KGUsdC5kZWZhdWx0Um91dGVzKSx0LmRlc2NyaXB0b3JzJiZyZS5kZXNjcmliZShlLHQuZGVzY3JpcHRvcnMpfSh0LG8saSksdGhpcy5vdmVycmlkZSYmcmUub3ZlcnJpZGUodC5pZCx0Lm92ZXJyaWRlcykpLG99Z2V0KHQpe3JldHVybiB0aGlzLml0ZW1zW3RdfXVucmVnaXN0ZXIodCl7Y29uc3QgZT10aGlzLml0ZW1zLGk9dC5pZCxzPXRoaXMuc2NvcGU7aSBpbiBlJiZkZWxldGUgZVtpXSxzJiZpIGluIHJlW3NdJiYoZGVsZXRlIHJlW3NdW2ldLHRoaXMub3ZlcnJpZGUmJmRlbGV0ZSBzZVtpXSl9fXZhciBVcz1uZXcgY2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmNvbnRyb2xsZXJzPW5ldyBZcyhFcywiZGF0YXNldHMiLCEwKSx0aGlzLmVsZW1lbnRzPW5ldyBZcyhScywiZWxlbWVudHMiKSx0aGlzLnBsdWdpbnM9bmV3IFlzKE9iamVjdCwicGx1Z2lucyIpLHRoaXMuc2NhbGVzPW5ldyBZcygkcywic2NhbGVzIiksdGhpcy5fdHlwZWRSZWdpc3RyaWVzPVt0aGlzLmNvbnRyb2xsZXJzLHRoaXMuc2NhbGVzLHRoaXMuZWxlbWVudHNdfWFkZCguLi50KXt0aGlzLl9lYWNoKCJyZWdpc3RlciIsdCl9cmVtb3ZlKC4uLnQpe3RoaXMuX2VhY2goInVucmVnaXN0ZXIiLHQpfWFkZENvbnRyb2xsZXJzKC4uLnQpe3RoaXMuX2VhY2goInJlZ2lzdGVyIix0LHRoaXMuY29udHJvbGxlcnMpfWFkZEVsZW1lbnRzKC4uLnQpe3RoaXMuX2VhY2goInJlZ2lzdGVyIix0LHRoaXMuZWxlbWVudHMpfWFkZFBsdWdpbnMoLi4udCl7dGhpcy5fZWFjaCgicmVnaXN0ZXIiLHQsdGhpcy5wbHVnaW5zKX1hZGRTY2FsZXMoLi4udCl7dGhpcy5fZWFjaCgicmVnaXN0ZXIiLHQsdGhpcy5zY2FsZXMpfWdldENvbnRyb2xsZXIodCl7cmV0dXJuIHRoaXMuX2dldCh0LHRoaXMuY29udHJvbGxlcnMsImNvbnRyb2xsZXIiKX1nZXRFbGVtZW50KHQpe3JldHVybiB0aGlzLl9nZXQodCx0aGlzLmVsZW1lbnRzLCJlbGVtZW50Iil9Z2V0UGx1Z2luKHQpe3JldHVybiB0aGlzLl9nZXQodCx0aGlzLnBsdWdpbnMsInBsdWdpbiIpfWdldFNjYWxlKHQpe3JldHVybiB0aGlzLl9nZXQodCx0aGlzLnNjYWxlcywic2NhbGUiKX1yZW1vdmVDb250cm9sbGVycyguLi50KXt0aGlzLl9lYWNoKCJ1bnJlZ2lzdGVyIix0LHRoaXMuY29udHJvbGxlcnMpfXJlbW92ZUVsZW1lbnRzKC4uLnQpe3RoaXMuX2VhY2goInVucmVnaXN0ZXIiLHQsdGhpcy5lbGVtZW50cyl9cmVtb3ZlUGx1Z2lucyguLi50KXt0aGlzLl9lYWNoKCJ1bnJlZ2lzdGVyIix0LHRoaXMucGx1Z2lucyl9cmVtb3ZlU2NhbGVzKC4uLnQpe3RoaXMuX2VhY2goInVucmVnaXN0ZXIiLHQsdGhpcy5zY2FsZXMpfV9lYWNoKHQsZSxpKXtbLi4uZV0uZm9yRWFjaChlPT57Y29uc3Qgcz1pfHx0aGlzLl9nZXRSZWdpc3RyeUZvclR5cGUoZSk7aXx8cy5pc0ZvclR5cGUoZSl8fHM9PT10aGlzLnBsdWdpbnMmJmUuaWQ/dGhpcy5fZXhlYyh0LHMsZSk6dShlLGU9Pntjb25zdCBzPWl8fHRoaXMuX2dldFJlZ2lzdHJ5Rm9yVHlwZShlKTt0aGlzLl9leGVjKHQscyxlKX0pfSl9X2V4ZWModCxlLGkpe2NvbnN0IHM9dyh0KTtkKGlbImJlZm9yZSIrc10sW10saSksZVt0XShpKSxkKGlbImFmdGVyIitzXSxbXSxpKX1fZ2V0UmVnaXN0cnlGb3JUeXBlKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5fdHlwZWRSZWdpc3RyaWVzLmxlbmd0aDtlKyspe2NvbnN0IGk9dGhpcy5fdHlwZWRSZWdpc3RyaWVzW2VdO2lmKGkuaXNGb3JUeXBlKHQpKXJldHVybiBpfXJldHVybiB0aGlzLnBsdWdpbnN9X2dldCh0LGUsaSl7Y29uc3Qgcz1lLmdldCh0KTtpZih2b2lkIDA9PT1zKXRocm93IG5ldyBFcnJvcignIicrdCsnIiBpcyBub3QgYSByZWdpc3RlcmVkICcraSsiLiIpO3JldHVybiBzfX07Y2xhc3MgWHN7Y29uc3RydWN0b3IoKXt0aGlzLl9pbml0PVtdfW5vdGlmeSh0LGUsaSxzKXsiYmVmb3JlSW5pdCI9PT1lJiYodGhpcy5faW5pdD10aGlzLl9jcmVhdGVEZXNjcmlwdG9ycyh0LCEwKSx0aGlzLl9ub3RpZnkodGhpcy5faW5pdCx0LCJpbnN0YWxsIikpO2NvbnN0IG49cz90aGlzLl9kZXNjcmlwdG9ycyh0KS5maWx0ZXIocyk6dGhpcy5fZGVzY3JpcHRvcnModCksbz10aGlzLl9ub3RpZnkobix0LGUsaSk7cmV0dXJuImFmdGVyRGVzdHJveSI9PT1lJiYodGhpcy5fbm90aWZ5KG4sdCwic3RvcCIpLHRoaXMuX25vdGlmeSh0aGlzLl9pbml0LHQsInVuaW5zdGFsbCIpKSxvfV9ub3RpZnkodCxlLGkscyl7cz1zfHx7fTtmb3IoY29uc3QgbiBvZiB0KXtjb25zdCB0PW4ucGx1Z2luO2lmKCExPT09ZCh0W2ldLFtlLHMsbi5vcHRpb25zXSx0KSYmcy5jYW5jZWxhYmxlKXJldHVybiExfXJldHVybiEwfWludmFsaWRhdGUoKXtzKHRoaXMuX2NhY2hlKXx8KHRoaXMuX29sZENhY2hlPXRoaXMuX2NhY2hlLHRoaXMuX2NhY2hlPXZvaWQgMCl9X2Rlc2NyaXB0b3JzKHQpe2lmKHRoaXMuX2NhY2hlKXJldHVybiB0aGlzLl9jYWNoZTtjb25zdCBlPXRoaXMuX2NhY2hlPXRoaXMuX2NyZWF0ZURlc2NyaXB0b3JzKHQpO3JldHVybiB0aGlzLl9ub3RpZnlTdGF0ZUNoYW5nZXModCksZX1fY3JlYXRlRGVzY3JpcHRvcnModCxlKXtjb25zdCBpPXQmJnQuY29uZmlnLHM9bChpLm9wdGlvbnMmJmkub3B0aW9ucy5wbHVnaW5zLHt9KSxuPWZ1bmN0aW9uKHQpe2NvbnN0IGU9e30saT1bXSxzPU9iamVjdC5rZXlzKFVzLnBsdWdpbnMuaXRlbXMpO2ZvcihsZXQgdD0wO3Q8cy5sZW5ndGg7dCsrKWkucHVzaChVcy5nZXRQbHVnaW4oc1t0XSkpO2NvbnN0IG49dC5wbHVnaW5zfHxbXTtmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKyl7Y29uc3Qgcz1uW3RdOy0xPT09aS5pbmRleE9mKHMpJiYoaS5wdXNoKHMpLGVbcy5pZF09ITApfXJldHVybntwbHVnaW5zOmksbG9jYWxJZHM6ZX19KGkpO3JldHVybiExIT09c3x8ZT9mdW5jdGlvbih0LHtwbHVnaW5zOmUsbG9jYWxJZHM6aX0scyxuKXtjb25zdCBvPVtdLGE9dC5nZXRDb250ZXh0KCk7Zm9yKGNvbnN0IHIgb2YgZSl7Y29uc3QgZT1yLmlkLGw9cXMoc1tlXSxuKTtudWxsIT09bCYmby5wdXNoKHtwbHVnaW46cixvcHRpb25zOktzKHQuY29uZmlnLHtwbHVnaW46cixsb2NhbDppW2VdfSxsLGEpfSl9cmV0dXJuIG99KHQsbixzLGUpOltdfV9ub3RpZnlTdGF0ZUNoYW5nZXModCl7Y29uc3QgZT10aGlzLl9vbGRDYWNoZXx8W10saT10aGlzLl9jYWNoZSxzPSh0LGUpPT50LmZpbHRlcih0PT4hZS5zb21lKGU9PnQucGx1Z2luLmlkPT09ZS5wbHVnaW4uaWQpKTt0aGlzLl9ub3RpZnkocyhlLGkpLHQsInN0b3AiKSx0aGlzLl9ub3RpZnkocyhpLGUpLHQsInN0YXJ0Iil9fWZ1bmN0aW9uIHFzKHQsZSl7cmV0dXJuIGV8fCExIT09dD8hMD09PXQ/e306dDpudWxsfWZ1bmN0aW9uIEtzKHQse3BsdWdpbjplLGxvY2FsOml9LHMsbil7Y29uc3Qgbz10LnBsdWdpblNjb3BlS2V5cyhlKSxhPXQuZ2V0T3B0aW9uU2NvcGVzKHMsbyk7cmV0dXJuIGkmJmUuZGVmYXVsdHMmJmEucHVzaChlLmRlZmF1bHRzKSx0LmNyZWF0ZVJlc29sdmVyKGEsbixbIiJdLHtzY3JpcHRhYmxlOiExLGluZGV4YWJsZTohMSxhbGxLZXlzOiEwfSl9ZnVuY3Rpb24gR3ModCxlKXtjb25zdCBpPXJlLmRhdGFzZXRzW3RdfHx7fTtyZXR1cm4oKGUuZGF0YXNldHN8fHt9KVt0XXx8e30pLmluZGV4QXhpc3x8ZS5pbmRleEF4aXN8fGkuaW5kZXhBeGlzfHwieCJ9ZnVuY3Rpb24gWnModCl7aWYoIngiPT09dHx8InkiPT09dHx8InIiPT09dClyZXR1cm4gdH1mdW5jdGlvbiBKcyh0LC4uLmUpe2lmKFpzKHQpKXJldHVybiB0O2Zvcihjb25zdCBzIG9mIGUpe2NvbnN0IGU9cy5heGlzfHwoInRvcCI9PT0oaT1zLnBvc2l0aW9uKXx8ImJvdHRvbSI9PT1pPyJ4IjoibGVmdCI9PT1pfHwicmlnaHQiPT09aT8ieSI6dm9pZCAwKXx8dC5sZW5ndGg+MSYmWnModFswXS50b0xvd2VyQ2FzZSgpKTtpZihlKXJldHVybiBlfXZhciBpO3Rocm93IG5ldyBFcnJvcihgQ2Fubm90IGRldGVybWluZSB0eXBlIG9mICcke3R9JyBheGlzLiBQbGVhc2UgcHJvdmlkZSAnYXhpcycgb3IgJ3Bvc2l0aW9uJyBvcHRpb24uYCl9ZnVuY3Rpb24gUXModCxlLGkpe2lmKGlbZSsiQXhpc0lEIl09PT10KXJldHVybntheGlzOmV9fWZ1bmN0aW9uIHRuKHQpe2NvbnN0IGU9dC5vcHRpb25zfHwodC5vcHRpb25zPXt9KTtlLnBsdWdpbnM9bChlLnBsdWdpbnMse30pLGUuc2NhbGVzPWZ1bmN0aW9uKHQsZSl7Y29uc3QgaT1zZVt0LnR5cGVdfHx7c2NhbGVzOnt9fSxzPWUuc2NhbGVzfHx7fSxuPUdzKHQudHlwZSxlKSxhPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIE9iamVjdC5rZXlzKHMpLmZvckVhY2goZT0+e2NvbnN0IHI9c1tlXTtpZighbyhyKSlyZXR1cm4gY29uc29sZS5lcnJvcihgSW52YWxpZCBzY2FsZSBjb25maWd1cmF0aW9uIGZvciBzY2FsZTogJHtlfWApO2lmKHIuX3Byb3h5KXJldHVybiBjb25zb2xlLndhcm4oYElnbm9yaW5nIHJlc29sdmVyIHBhc3NlZCBhcyBvcHRpb25zIGZvciBzY2FsZTogJHtlfWApO2NvbnN0IGw9SnMoZSxyLGZ1bmN0aW9uKHQsZSl7aWYoZS5kYXRhJiZlLmRhdGEuZGF0YXNldHMpe2NvbnN0IGk9ZS5kYXRhLmRhdGFzZXRzLmZpbHRlcihlPT5lLnhBeGlzSUQ9PT10fHxlLnlBeGlzSUQ9PT10KTtpZihpLmxlbmd0aClyZXR1cm4gUXModCwieCIsaVswXSl8fFFzKHQsInkiLGlbMF0pfXJldHVybnt9fShlLHQpLHJlLnNjYWxlc1tyLnR5cGVdKSxoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lPyJfaW5kZXhfIjoiX3ZhbHVlXyJ9KGwsbiksYz1pLnNjYWxlc3x8e307YVtlXT14KE9iamVjdC5jcmVhdGUobnVsbCksW3theGlzOmx9LHIsY1tsXSxjW2hdXSl9KSx0LmRhdGEuZGF0YXNldHMuZm9yRWFjaChpPT57Y29uc3Qgbj1pLnR5cGV8fHQudHlwZSxvPWkuaW5kZXhBeGlzfHxHcyhuLGUpLHI9KHNlW25dfHx7fSkuc2NhbGVzfHx7fTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKHQ9Pntjb25zdCBlPWZ1bmN0aW9uKHQsZSl7bGV0IGk9dDtyZXR1cm4iX2luZGV4XyI9PT10P2k9ZToiX3ZhbHVlXyI9PT10JiYoaT0ieCI9PT1lPyJ5IjoieCIpLGl9KHQsbyksbj1pW2UrIkF4aXNJRCJdfHxlO2Fbbl09YVtuXXx8T2JqZWN0LmNyZWF0ZShudWxsKSx4KGFbbl0sW3theGlzOmV9LHNbbl0sclt0XV0pfSl9KSxPYmplY3Qua2V5cyhhKS5mb3JFYWNoKHQ9Pntjb25zdCBlPWFbdF07eChlLFtyZS5zY2FsZXNbZS50eXBlXSxyZS5zY2FsZV0pfSksYX0odCxlKX1mdW5jdGlvbiBlbih0KXtyZXR1cm4odD10fHx7fSkuZGF0YXNldHM9dC5kYXRhc2V0c3x8W10sdC5sYWJlbHM9dC5sYWJlbHN8fFtdLHR9Y29uc3Qgc249bmV3IE1hcCxubj1uZXcgU2V0O2Z1bmN0aW9uIG9uKHQsZSl7bGV0IGk9c24uZ2V0KHQpO3JldHVybiBpfHwoaT1lKCksc24uc2V0KHQsaSksbm4uYWRkKGkpKSxpfWNvbnN0IGFuPSh0LGUsaSk9Pntjb25zdCBzPU0oZSxpKTt2b2lkIDAhPT1zJiZ0LmFkZChzKX07Y2xhc3Mgcm57Y29uc3RydWN0b3IodCl7dGhpcy5fY29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybih0PXR8fHt9KS5kYXRhPWVuKHQuZGF0YSksdG4odCksdH0odCksdGhpcy5fc2NvcGVDYWNoZT1uZXcgTWFwLHRoaXMuX3Jlc29sdmVyQ2FjaGU9bmV3IE1hcH1nZXQgcGxhdGZvcm0oKXtyZXR1cm4gdGhpcy5fY29uZmlnLnBsYXRmb3JtfWdldCB0eXBlKCl7cmV0dXJuIHRoaXMuX2NvbmZpZy50eXBlfXNldCB0eXBlKHQpe3RoaXMuX2NvbmZpZy50eXBlPXR9Z2V0IGRhdGEoKXtyZXR1cm4gdGhpcy5fY29uZmlnLmRhdGF9c2V0IGRhdGEodCl7dGhpcy5fY29uZmlnLmRhdGE9ZW4odCl9Z2V0IG9wdGlvbnMoKXtyZXR1cm4gdGhpcy5fY29uZmlnLm9wdGlvbnN9c2V0IG9wdGlvbnModCl7dGhpcy5fY29uZmlnLm9wdGlvbnM9dH1nZXQgcGx1Z2lucygpe3JldHVybiB0aGlzLl9jb25maWcucGx1Z2luc311cGRhdGUoKXtjb25zdCB0PXRoaXMuX2NvbmZpZzt0aGlzLmNsZWFyQ2FjaGUoKSx0bih0KX1jbGVhckNhY2hlKCl7dGhpcy5fc2NvcGVDYWNoZS5jbGVhcigpLHRoaXMuX3Jlc29sdmVyQ2FjaGUuY2xlYXIoKX1kYXRhc2V0U2NvcGVLZXlzKHQpe3JldHVybiBvbih0LCgpPT5bW2BkYXRhc2V0cy4ke3R9YCwiIl1dKX1kYXRhc2V0QW5pbWF0aW9uU2NvcGVLZXlzKHQsZSl7cmV0dXJuIG9uKGAke3R9LnRyYW5zaXRpb24uJHtlfWAsKCk9PltbYGRhdGFzZXRzLiR7dH0udHJhbnNpdGlvbnMuJHtlfWAsYHRyYW5zaXRpb25zLiR7ZX1gXSxbYGRhdGFzZXRzLiR7dH1gLCIiXV0pfWRhdGFzZXRFbGVtZW50U2NvcGVLZXlzKHQsZSl7cmV0dXJuIG9uKGAke3R9LSR7ZX1gLCgpPT5bW2BkYXRhc2V0cy4ke3R9LmVsZW1lbnRzLiR7ZX1gLGBkYXRhc2V0cy4ke3R9YCxgZWxlbWVudHMuJHtlfWAsIiJdXSl9cGx1Z2luU2NvcGVLZXlzKHQpe2NvbnN0IGU9dC5pZDtyZXR1cm4gb24oYCR7dGhpcy50eXBlfS1wbHVnaW4tJHtlfWAsKCk9PltbYHBsdWdpbnMuJHtlfWAsLi4udC5hZGRpdGlvbmFsT3B0aW9uU2NvcGVzfHxbXV1dKX1fY2FjaGVkU2NvcGVzKHQsZSl7Y29uc3QgaT10aGlzLl9zY29wZUNhY2hlO2xldCBzPWkuZ2V0KHQpO3JldHVybiBzJiYhZXx8KHM9bmV3IE1hcCxpLnNldCh0LHMpKSxzfWdldE9wdGlvblNjb3Blcyh0LGUsaSl7Y29uc3R7b3B0aW9uczpzLHR5cGU6bn09dGhpcyxvPXRoaXMuX2NhY2hlZFNjb3Blcyh0LGkpLGE9by5nZXQoZSk7aWYoYSlyZXR1cm4gYTtjb25zdCByPW5ldyBTZXQ7ZS5mb3JFYWNoKGU9Pnt0JiYoci5hZGQodCksZS5mb3JFYWNoKGU9PmFuKHIsdCxlKSkpLGUuZm9yRWFjaCh0PT5hbihyLHMsdCkpLGUuZm9yRWFjaCh0PT5hbihyLHNlW25dfHx7fSx0KSksZS5mb3JFYWNoKHQ9PmFuKHIscmUsdCkpLGUuZm9yRWFjaCh0PT5hbihyLG5lLHQpKX0pO2NvbnN0IGw9QXJyYXkuZnJvbShyKTtyZXR1cm4gMD09PWwubGVuZ3RoJiZsLnB1c2goT2JqZWN0LmNyZWF0ZShudWxsKSksbm4uaGFzKGUpJiZvLnNldChlLGwpLGx9Y2hhcnRPcHRpb25TY29wZXMoKXtjb25zdHtvcHRpb25zOnQsdHlwZTplfT10aGlzO3JldHVyblt0LHNlW2VdfHx7fSxyZS5kYXRhc2V0c1tlXXx8e30se3R5cGU6ZX0scmUsbmVdfXJlc29sdmVOYW1lZE9wdGlvbnModCxlLGkscz1bIiJdKXtjb25zdCBvPXskc2hhcmVkOiEwfSx7cmVzb2x2ZXI6YSxzdWJQcmVmaXhlczpyfT1sbih0aGlzLl9yZXNvbHZlckNhY2hlLHQscyk7bGV0IGw9YTsoZnVuY3Rpb24odCxlKXtjb25zdHtpc1NjcmlwdGFibGU6aSxpc0luZGV4YWJsZTpzfT1CZSh0KTtmb3IoY29uc3QgbyBvZiBlKXtjb25zdCBlPWkobyksYT1zKG8pLHI9KGF8fGUpJiZ0W29dO2lmKGUmJihTKHIpfHxobihyKSl8fGEmJm4ocikpcmV0dXJuITB9cmV0dXJuITF9KShhLGUpJiYoby4kc2hhcmVkPSExLGw9VmUoYSxpPVMoaSk/aSgpOmksdGhpcy5jcmVhdGVSZXNvbHZlcih0LGkscikpKTtmb3IoY29uc3QgdCBvZiBlKW9bdF09bFt0XTtyZXR1cm4gb31jcmVhdGVSZXNvbHZlcih0LGUsaT1bIiJdLHMpe2NvbnN0e3Jlc29sdmVyOm59PWxuKHRoaXMuX3Jlc29sdmVyQ2FjaGUsdCxpKTtyZXR1cm4gbyhlKT9WZShuLGUsdm9pZCAwLHMpOm59fWZ1bmN0aW9uIGxuKHQsZSxpKXtsZXQgcz10LmdldChlKTtzfHwocz1uZXcgTWFwLHQuc2V0KGUscykpO2NvbnN0IG49aS5qb2luKCk7bGV0IG89cy5nZXQobik7cmV0dXJuIG98fChvPXtyZXNvbHZlcjpGZShlLGkpLHN1YlByZWZpeGVzOmkuZmlsdGVyKHQ9PiF0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoImhvdmVyIikpfSxzLnNldChuLG8pKSxvfWNvbnN0IGhuPXQ9Pm8odCkmJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpLnNvbWUoZT0+Uyh0W2VdKSksY249WyJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJjaGFydEFyZWEiXTtmdW5jdGlvbiBkbih0LGUpe3JldHVybiJ0b3AiPT09dHx8ImJvdHRvbSI9PT10fHwtMT09PWNuLmluZGV4T2YodCkmJiJ4Ij09PWV9ZnVuY3Rpb24gdW4odCxlKXtyZXR1cm4gZnVuY3Rpb24oaSxzKXtyZXR1cm4gaVt0XT09PXNbdF0/aVtlXS1zW2VdOmlbdF0tc1t0XX19ZnVuY3Rpb24gZm4odCl7Y29uc3QgZT10LmNoYXJ0LGk9ZS5vcHRpb25zLmFuaW1hdGlvbjtlLm5vdGlmeVBsdWdpbnMoImFmdGVyUmVuZGVyIiksZChpJiZpLm9uQ29tcGxldGUsW3RdLGUpfWZ1bmN0aW9uIGduKHQpe2NvbnN0IGU9dC5jaGFydCxpPWUub3B0aW9ucy5hbmltYXRpb247ZChpJiZpLm9uUHJvZ3Jlc3MsW3RdLGUpfWZ1bmN0aW9uIHBuKHQpe3JldHVybiBsZSgpJiYic3RyaW5nIj09dHlwZW9mIHQ/dD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTp0JiZ0Lmxlbmd0aCYmKHQ9dFswXSksdCYmdC5jYW52YXMmJih0PXQuY2FudmFzKSx0fWNvbnN0IG1uPXt9LGJuPXQ9Pntjb25zdCBlPXBuKHQpO3JldHVybiBPYmplY3QudmFsdWVzKG1uKS5maWx0ZXIodD0+dC5jYW52YXM9PT1lKS5wb3AoKX07ZnVuY3Rpb24geG4odCxlLGkpe2NvbnN0IHM9T2JqZWN0LmtleXModCk7Zm9yKGNvbnN0IG4gb2Ygcyl7Y29uc3Qgcz0rbjtpZihzPj1lKXtjb25zdCBvPXRbbl07ZGVsZXRlIHRbbl0sKGk+MHx8cz5lKSYmKHRbcytpXT1vKX19fWZ1bmN0aW9uIF9uKHQsZSxpKXtyZXR1cm4gdC5vcHRpb25zLmNsaXA/dFtpXTplW2ldfWNsYXNzIHlue3N0YXRpYyBkZWZhdWx0cz1yZTtzdGF0aWMgaW5zdGFuY2VzPW1uO3N0YXRpYyBvdmVycmlkZXM9c2U7c3RhdGljIHJlZ2lzdHJ5PVVzO3N0YXRpYyB2ZXJzaW9uPSI0LjQuMSI7c3RhdGljIGdldENoYXJ0PWJuO3N0YXRpYyByZWdpc3RlciguLi50KXtVcy5hZGQoLi4udCksdm4oKX1zdGF0aWMgdW5yZWdpc3RlciguLi50KXtVcy5yZW1vdmUoLi4udCksdm4oKX1jb25zdHJ1Y3Rvcih0LGUpe2NvbnN0IHM9dGhpcy5jb25maWc9bmV3IHJuKGUpLG49cG4odCksbz1ibihuKTtpZihvKXRocm93IG5ldyBFcnJvcigiQ2FudmFzIGlzIGFscmVhZHkgaW4gdXNlLiBDaGFydCB3aXRoIElEICciK28uaWQrIicgbXVzdCBiZSBkZXN0cm95ZWQgYmVmb3JlIHRoZSBjYW52YXMgd2l0aCBJRCAnIitvLmNhbnZhcy5pZCsiJyBjYW4gYmUgcmV1c2VkLiIpO2NvbnN0IGE9cy5jcmVhdGVSZXNvbHZlcihzLmNoYXJ0T3B0aW9uU2NvcGVzKCksdGhpcy5nZXRDb250ZXh0KCkpO3RoaXMucGxhdGZvcm09bmV3KHMucGxhdGZvcm18fG1zKG4pKSx0aGlzLnBsYXRmb3JtLnVwZGF0ZUNvbmZpZyhzKTtjb25zdCByPXRoaXMucGxhdGZvcm0uYWNxdWlyZUNvbnRleHQobixhLmFzcGVjdFJhdGlvKSxsPXImJnIuY2FudmFzLGg9bCYmbC5oZWlnaHQsYz1sJiZsLndpZHRoO3RoaXMuaWQ9aSgpLHRoaXMuY3R4PXIsdGhpcy5jYW52YXM9bCx0aGlzLndpZHRoPWMsdGhpcy5oZWlnaHQ9aCx0aGlzLl9vcHRpb25zPWEsdGhpcy5fYXNwZWN0UmF0aW89dGhpcy5hc3BlY3RSYXRpbyx0aGlzLl9sYXllcnM9W10sdGhpcy5fbWV0YXNldHM9W10sdGhpcy5fc3RhY2tzPXZvaWQgMCx0aGlzLmJveGVzPVtdLHRoaXMuY3VycmVudERldmljZVBpeGVsUmF0aW89dm9pZCAwLHRoaXMuY2hhcnRBcmVhPXZvaWQgMCx0aGlzLl9hY3RpdmU9W10sdGhpcy5fbGFzdEV2ZW50PXZvaWQgMCx0aGlzLl9saXN0ZW5lcnM9e30sdGhpcy5fcmVzcG9uc2l2ZUxpc3RlbmVycz12b2lkIDAsdGhpcy5fc29ydGVkTWV0YXNldHM9W10sdGhpcy5zY2FsZXM9e30sdGhpcy5fcGx1Z2lucz1uZXcgWHMsdGhpcy4kcHJveGllcz17fSx0aGlzLl9oaWRkZW5JbmRpY2VzPXt9LHRoaXMuYXR0YWNoZWQ9ITEsdGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkPXZvaWQgMCx0aGlzLiRjb250ZXh0PXZvaWQgMCx0aGlzLl9kb1Jlc2l6ZT1kdCh0PT50aGlzLnVwZGF0ZSh0KSxhLnJlc2l6ZURlbGF5fHwwKSx0aGlzLl9kYXRhQ2hhbmdlcz1bXSxtblt0aGlzLmlkXT10aGlzLHImJmw/KGJ0Lmxpc3Rlbih0aGlzLCJjb21wbGV0ZSIsZm4pLGJ0Lmxpc3Rlbih0aGlzLCJwcm9ncmVzcyIsZ24pLHRoaXMuX2luaXRpYWxpemUoKSx0aGlzLmF0dGFjaGVkJiZ0aGlzLnVwZGF0ZSgpKTpjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGNoYXJ0OiBjYW4ndCBhY3F1aXJlIGNvbnRleHQgZnJvbSB0aGUgZ2l2ZW4gaXRlbSIpfWdldCBhc3BlY3RSYXRpbygpe2NvbnN0e29wdGlvbnM6e2FzcGVjdFJhdGlvOnQsbWFpbnRhaW5Bc3BlY3RSYXRpbzplfSx3aWR0aDppLGhlaWdodDpuLF9hc3BlY3RSYXRpbzpvfT10aGlzO3JldHVybiBzKHQpP2UmJm8/bzpuP2kvbjpudWxsOnR9Z2V0IGRhdGEoKXtyZXR1cm4gdGhpcy5jb25maWcuZGF0YX1zZXQgZGF0YSh0KXt0aGlzLmNvbmZpZy5kYXRhPXR9Z2V0IG9wdGlvbnMoKXtyZXR1cm4gdGhpcy5fb3B0aW9uc31zZXQgb3B0aW9ucyh0KXt0aGlzLmNvbmZpZy5vcHRpb25zPXR9Z2V0IHJlZ2lzdHJ5KCl7cmV0dXJuIFVzfV9pbml0aWFsaXplKCl7cmV0dXJuIHRoaXMubm90aWZ5UGx1Z2lucygiYmVmb3JlSW5pdCIpLHRoaXMub3B0aW9ucy5yZXNwb25zaXZlP3RoaXMucmVzaXplKCk6eGUodGhpcyx0aGlzLm9wdGlvbnMuZGV2aWNlUGl4ZWxSYXRpbyksdGhpcy5iaW5kRXZlbnRzKCksdGhpcy5ub3RpZnlQbHVnaW5zKCJhZnRlckluaXQiKSx0aGlzfWNsZWFyKCl7cmV0dXJuIFNlKHRoaXMuY2FudmFzLHRoaXMuY3R4KSx0aGlzfXN0b3AoKXtyZXR1cm4gYnQuc3RvcCh0aGlzKSx0aGlzfXJlc2l6ZSh0LGUpe2J0LnJ1bm5pbmcodGhpcyk/dGhpcy5fcmVzaXplQmVmb3JlRHJhdz17d2lkdGg6dCxoZWlnaHQ6ZX06dGhpcy5fcmVzaXplKHQsZSl9X3Jlc2l6ZSh0LGUpe2NvbnN0IGk9dGhpcy5vcHRpb25zLHM9dGhpcy5jYW52YXMsbj1pLm1haW50YWluQXNwZWN0UmF0aW8mJnRoaXMuYXNwZWN0UmF0aW8sbz10aGlzLnBsYXRmb3JtLmdldE1heGltdW1TaXplKHMsdCxlLG4pLGE9aS5kZXZpY2VQaXhlbFJhdGlvfHx0aGlzLnBsYXRmb3JtLmdldERldmljZVBpeGVsUmF0aW8oKSxyPXRoaXMud2lkdGg/InJlc2l6ZSI6ImF0dGFjaCI7dGhpcy53aWR0aD1vLndpZHRoLHRoaXMuaGVpZ2h0PW8uaGVpZ2h0LHRoaXMuX2FzcGVjdFJhdGlvPXRoaXMuYXNwZWN0UmF0aW8seGUodGhpcyxhLCEwKSYmKHRoaXMubm90aWZ5UGx1Z2lucygicmVzaXplIix7c2l6ZTpvfSksZChpLm9uUmVzaXplLFt0aGlzLG9dLHRoaXMpLHRoaXMuYXR0YWNoZWQmJnRoaXMuX2RvUmVzaXplKHIpJiZ0aGlzLnJlbmRlcigpKX1lbnN1cmVTY2FsZXNIYXZlSURzKCl7dSh0aGlzLm9wdGlvbnMuc2NhbGVzfHx7fSwodCxlKT0+e3QuaWQ9ZX0pfWJ1aWxkT3JVcGRhdGVTY2FsZXMoKXtjb25zdCB0PXRoaXMub3B0aW9ucyxlPXQuc2NhbGVzLGk9dGhpcy5zY2FsZXMscz1PYmplY3Qua2V5cyhpKS5yZWR1Y2UoKHQsZSk9Pih0W2VdPSExLHQpLHt9KTtsZXQgbj1bXTtlJiYobj1uLmNvbmNhdChPYmplY3Qua2V5cyhlKS5tYXAodD0+e2NvbnN0IGk9ZVt0XSxzPUpzKHQsaSksbj0iciI9PT1zLG89IngiPT09cztyZXR1cm57b3B0aW9uczppLGRwb3NpdGlvbjpuPyJjaGFydEFyZWEiOm8/ImJvdHRvbSI6ImxlZnQiLGR0eXBlOm4/InJhZGlhbExpbmVhciI6bz8iY2F0ZWdvcnkiOiJsaW5lYXIifX0pKSksdShuLGU9Pntjb25zdCBuPWUub3B0aW9ucyxvPW4uaWQsYT1KcyhvLG4pLHI9bChuLnR5cGUsZS5kdHlwZSk7dm9pZCAwIT09bi5wb3NpdGlvbiYmZG4obi5wb3NpdGlvbixhKT09PWRuKGUuZHBvc2l0aW9uKXx8KG4ucG9zaXRpb249ZS5kcG9zaXRpb24pLHNbb109ITA7bGV0IGg9bnVsbDtvIGluIGkmJmlbb10udHlwZT09PXI/aD1pW29dOihoPW5ldyhVcy5nZXRTY2FsZShyKSkoe2lkOm8sdHlwZTpyLGN0eDp0aGlzLmN0eCxjaGFydDp0aGlzfSksaVtoLmlkXT1oKSxoLmluaXQobix0KX0pLHUocywodCxlKT0+e3R8fGRlbGV0ZSBpW2VdfSksdShpLHQ9PntKaS5jb25maWd1cmUodGhpcyx0LHQub3B0aW9ucyksSmkuYWRkQm94KHRoaXMsdCl9KX1fdXBkYXRlTWV0YXNldHMoKXtjb25zdCB0PXRoaXMuX21ldGFzZXRzLGU9dGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aCxpPXQubGVuZ3RoO2lmKHQuc29ydCgodCxlKT0+dC5pbmRleC1lLmluZGV4KSxpPmUpe2ZvcihsZXQgdD1lO3Q8aTsrK3QpdGhpcy5fZGVzdHJveURhdGFzZXRNZXRhKHQpO3Quc3BsaWNlKGUsaS1lKX10aGlzLl9zb3J0ZWRNZXRhc2V0cz10LnNsaWNlKDApLnNvcnQodW4oIm9yZGVyIiwiaW5kZXgiKSl9X3JlbW92ZVVucmVmZXJlbmNlZE1ldGFzZXRzKCl7Y29uc3R7X21ldGFzZXRzOnQsZGF0YTp7ZGF0YXNldHM6ZX19PXRoaXM7dC5sZW5ndGg+ZS5sZW5ndGgmJmRlbGV0ZSB0aGlzLl9zdGFja3MsdC5mb3JFYWNoKCh0LGkpPT57MD09PWUuZmlsdGVyKGU9PmU9PT10Ll9kYXRhc2V0KS5sZW5ndGgmJnRoaXMuX2Rlc3Ryb3lEYXRhc2V0TWV0YShpKX0pfWJ1aWxkT3JVcGRhdGVDb250cm9sbGVycygpe2NvbnN0IHQ9W10sZT10aGlzLmRhdGEuZGF0YXNldHM7bGV0IGkscztmb3IodGhpcy5fcmVtb3ZlVW5yZWZlcmVuY2VkTWV0YXNldHMoKSxpPTAscz1lLmxlbmd0aDtpPHM7aSsrKXtjb25zdCBzPWVbaV07bGV0IG49dGhpcy5nZXREYXRhc2V0TWV0YShpKTtjb25zdCBvPXMudHlwZXx8dGhpcy5jb25maWcudHlwZTtpZihuLnR5cGUmJm4udHlwZSE9PW8mJih0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEoaSksbj10aGlzLmdldERhdGFzZXRNZXRhKGkpKSxuLnR5cGU9byxuLmluZGV4QXhpcz1zLmluZGV4QXhpc3x8R3Mobyx0aGlzLm9wdGlvbnMpLG4ub3JkZXI9cy5vcmRlcnx8MCxuLmluZGV4PWksbi5sYWJlbD0iIitzLmxhYmVsLG4udmlzaWJsZT10aGlzLmlzRGF0YXNldFZpc2libGUoaSksbi5jb250cm9sbGVyKW4uY29udHJvbGxlci51cGRhdGVJbmRleChpKSxuLmNvbnRyb2xsZXIubGlua1NjYWxlcygpO2Vsc2V7Y29uc3QgZT1Vcy5nZXRDb250cm9sbGVyKG8pLHtkYXRhc2V0RWxlbWVudFR5cGU6cyxkYXRhRWxlbWVudFR5cGU6YX09cmUuZGF0YXNldHNbb107T2JqZWN0LmFzc2lnbihlLHtkYXRhRWxlbWVudFR5cGU6VXMuZ2V0RWxlbWVudChhKSxkYXRhc2V0RWxlbWVudFR5cGU6cyYmVXMuZ2V0RWxlbWVudChzKX0pLG4uY29udHJvbGxlcj1uZXcgZSh0aGlzLGkpLHQucHVzaChuLmNvbnRyb2xsZXIpfX1yZXR1cm4gdGhpcy5fdXBkYXRlTWV0YXNldHMoKSx0fV9yZXNldEVsZW1lbnRzKCl7dSh0aGlzLmRhdGEuZGF0YXNldHMsKHQsZSk9Pnt0aGlzLmdldERhdGFzZXRNZXRhKGUpLmNvbnRyb2xsZXIucmVzZXQoKX0sdGhpcyl9cmVzZXQoKXt0aGlzLl9yZXNldEVsZW1lbnRzKCksdGhpcy5ub3RpZnlQbHVnaW5zKCJyZXNldCIpfXVwZGF0ZSh0KXtjb25zdCBlPXRoaXMuY29uZmlnO2UudXBkYXRlKCk7Y29uc3QgaT10aGlzLl9vcHRpb25zPWUuY3JlYXRlUmVzb2x2ZXIoZS5jaGFydE9wdGlvblNjb3BlcygpLHRoaXMuZ2V0Q29udGV4dCgpKSxzPXRoaXMuX2FuaW1hdGlvbnNEaXNhYmxlZD0haS5hbmltYXRpb247aWYodGhpcy5fdXBkYXRlU2NhbGVzKCksdGhpcy5fY2hlY2tFdmVudEJpbmRpbmdzKCksdGhpcy5fdXBkYXRlSGlkZGVuSW5kaWNlcygpLHRoaXMuX3BsdWdpbnMuaW52YWxpZGF0ZSgpLCExPT09dGhpcy5ub3RpZnlQbHVnaW5zKCJiZWZvcmVVcGRhdGUiLHttb2RlOnQsY2FuY2VsYWJsZTohMH0pKXJldHVybjtjb25zdCBuPXRoaXMuYnVpbGRPclVwZGF0ZUNvbnRyb2xsZXJzKCk7dGhpcy5ub3RpZnlQbHVnaW5zKCJiZWZvcmVFbGVtZW50c1VwZGF0ZSIpO2xldCBvPTA7Zm9yKGxldCB0PTAsZT10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0e2NvbnRyb2xsZXI6ZX09dGhpcy5nZXREYXRhc2V0TWV0YSh0KSxpPSFzJiYtMT09PW4uaW5kZXhPZihlKTtlLmJ1aWxkT3JVcGRhdGVFbGVtZW50cyhpKSxvPU1hdGgubWF4KCtlLmdldE1heE92ZXJmbG93KCksbyl9bz10aGlzLl9taW5QYWRkaW5nPWkubGF5b3V0LmF1dG9QYWRkaW5nP286MCx0aGlzLl91cGRhdGVMYXlvdXQobyksc3x8dShuLHQ9Pnt0LnJlc2V0KCl9KSx0aGlzLl91cGRhdGVEYXRhc2V0cyh0KSx0aGlzLm5vdGlmeVBsdWdpbnMoImFmdGVyVXBkYXRlIix7bW9kZTp0fSksdGhpcy5fbGF5ZXJzLnNvcnQodW4oInoiLCJfaWR4IikpO2NvbnN0e19hY3RpdmU6YSxfbGFzdEV2ZW50OnJ9PXRoaXM7cj90aGlzLl9ldmVudEhhbmRsZXIociwhMCk6YS5sZW5ndGgmJnRoaXMuX3VwZGF0ZUhvdmVyU3R5bGVzKGEsYSwhMCksdGhpcy5yZW5kZXIoKX1fdXBkYXRlU2NhbGVzKCl7dSh0aGlzLnNjYWxlcyx0PT57SmkucmVtb3ZlQm94KHRoaXMsdCl9KSx0aGlzLmVuc3VyZVNjYWxlc0hhdmVJRHMoKSx0aGlzLmJ1aWxkT3JVcGRhdGVTY2FsZXMoKX1fY2hlY2tFdmVudEJpbmRpbmdzKCl7Y29uc3QgdD10aGlzLm9wdGlvbnMsZT1uZXcgU2V0KE9iamVjdC5rZXlzKHRoaXMuX2xpc3RlbmVycykpLGk9bmV3IFNldCh0LmV2ZW50cyk7UChlLGkpJiYhIXRoaXMuX3Jlc3BvbnNpdmVMaXN0ZW5lcnM9PT10LnJlc3BvbnNpdmV8fCh0aGlzLnVuYmluZEV2ZW50cygpLHRoaXMuYmluZEV2ZW50cygpKX1fdXBkYXRlSGlkZGVuSW5kaWNlcygpe2NvbnN0e19oaWRkZW5JbmRpY2VzOnR9PXRoaXMsZT10aGlzLl9nZXRVbmlmb3JtRGF0YUNoYW5nZXMoKXx8W107Zm9yKGNvbnN0e21ldGhvZDppLHN0YXJ0OnMsY291bnQ6bn1vZiBlKXhuKHQscywiX3JlbW92ZUVsZW1lbnRzIj09PWk/LW46bil9X2dldFVuaWZvcm1EYXRhQ2hhbmdlcygpe2NvbnN0IHQ9dGhpcy5fZGF0YUNoYW5nZXM7aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm47dGhpcy5fZGF0YUNoYW5nZXM9W107Y29uc3QgZT10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoLGk9ZT0+bmV3IFNldCh0LmZpbHRlcih0PT50WzBdPT09ZSkubWFwKCh0LGUpPT5lKyIsIit0LnNwbGljZSgxKS5qb2luKCIsIikpKSxzPWkoMCk7Zm9yKGxldCB0PTE7dDxlO3QrKylpZighUChzLGkodCkpKXJldHVybjtyZXR1cm4gQXJyYXkuZnJvbShzKS5tYXAodD0+dC5zcGxpdCgiLCIpKS5tYXAodD0+KHttZXRob2Q6dFsxXSxzdGFydDordFsyXSxjb3VudDordFszXX0pKX1fdXBkYXRlTGF5b3V0KHQpe2lmKCExPT09dGhpcy5ub3RpZnlQbHVnaW5zKCJiZWZvcmVMYXlvdXQiLHtjYW5jZWxhYmxlOiEwfSkpcmV0dXJuO0ppLnVwZGF0ZSh0aGlzLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQsdCk7Y29uc3QgZT10aGlzLmNoYXJ0QXJlYSxpPWUud2lkdGg8PTB8fGUuaGVpZ2h0PD0wO3RoaXMuX2xheWVycz1bXSx1KHRoaXMuYm94ZXMsdD0+e2kmJiJjaGFydEFyZWEiPT09dC5wb3NpdGlvbnx8KHQuY29uZmlndXJlJiZ0LmNvbmZpZ3VyZSgpLHRoaXMuX2xheWVycy5wdXNoKC4uLnQuX2xheWVycygpKSl9LHRoaXMpLHRoaXMuX2xheWVycy5mb3JFYWNoKCh0LGUpPT57dC5faWR4PWV9KSx0aGlzLm5vdGlmeVBsdWdpbnMoImFmdGVyTGF5b3V0Iil9X3VwZGF0ZURhdGFzZXRzKHQpe2lmKCExIT09dGhpcy5ub3RpZnlQbHVnaW5zKCJiZWZvcmVEYXRhc2V0c1VwZGF0ZSIse21vZGU6dCxjYW5jZWxhYmxlOiEwfSkpe2ZvcihsZXQgdD0wLGU9dGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDt0PGU7Kyt0KXRoaXMuZ2V0RGF0YXNldE1ldGEodCkuY29udHJvbGxlci5jb25maWd1cmUoKTtmb3IobGV0IGU9MCxpPXRoaXMuZGF0YS5kYXRhc2V0cy5sZW5ndGg7ZTxpOysrZSl0aGlzLl91cGRhdGVEYXRhc2V0KGUsUyh0KT90KHtkYXRhc2V0SW5kZXg6ZX0pOnQpO3RoaXMubm90aWZ5UGx1Z2lucygiYWZ0ZXJEYXRhc2V0c1VwZGF0ZSIse21vZGU6dH0pfX1fdXBkYXRlRGF0YXNldCh0LGUpe2NvbnN0IGk9dGhpcy5nZXREYXRhc2V0TWV0YSh0KSxzPXttZXRhOmksaW5kZXg6dCxtb2RlOmUsY2FuY2VsYWJsZTohMH07ITEhPT10aGlzLm5vdGlmeVBsdWdpbnMoImJlZm9yZURhdGFzZXRVcGRhdGUiLHMpJiYoaS5jb250cm9sbGVyLl91cGRhdGUoZSkscy5jYW5jZWxhYmxlPSExLHRoaXMubm90aWZ5UGx1Z2lucygiYWZ0ZXJEYXRhc2V0VXBkYXRlIixzKSl9cmVuZGVyKCl7ITEhPT10aGlzLm5vdGlmeVBsdWdpbnMoImJlZm9yZVJlbmRlciIse2NhbmNlbGFibGU6ITB9KSYmKGJ0Lmhhcyh0aGlzKT90aGlzLmF0dGFjaGVkJiYhYnQucnVubmluZyh0aGlzKSYmYnQuc3RhcnQodGhpcyk6KHRoaXMuZHJhdygpLGZuKHtjaGFydDp0aGlzfSkpKX1kcmF3KCl7bGV0IHQ7aWYodGhpcy5fcmVzaXplQmVmb3JlRHJhdyl7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6ZX09dGhpcy5fcmVzaXplQmVmb3JlRHJhdzt0aGlzLl9yZXNpemUodCxlKSx0aGlzLl9yZXNpemVCZWZvcmVEcmF3PW51bGx9aWYodGhpcy5jbGVhcigpLHRoaXMud2lkdGg8PTB8fHRoaXMuaGVpZ2h0PD0wKXJldHVybjtpZighMT09PXRoaXMubm90aWZ5UGx1Z2lucygiYmVmb3JlRHJhdyIse2NhbmNlbGFibGU6ITB9KSlyZXR1cm47Y29uc3QgZT10aGlzLl9sYXllcnM7Zm9yKHQ9MDt0PGUubGVuZ3RoJiZlW3RdLno8PTA7Kyt0KWVbdF0uZHJhdyh0aGlzLmNoYXJ0QXJlYSk7Zm9yKHRoaXMuX2RyYXdEYXRhc2V0cygpO3Q8ZS5sZW5ndGg7Kyt0KWVbdF0uZHJhdyh0aGlzLmNoYXJ0QXJlYSk7dGhpcy5ub3RpZnlQbHVnaW5zKCJhZnRlckRyYXciKX1fZ2V0U29ydGVkRGF0YXNldE1ldGFzKHQpe2NvbnN0IGU9dGhpcy5fc29ydGVkTWV0YXNldHMsaT1bXTtsZXQgcyxuO2ZvcihzPTAsbj1lLmxlbmd0aDtzPG47KytzKXtjb25zdCBuPWVbc107dCYmIW4udmlzaWJsZXx8aS5wdXNoKG4pfXJldHVybiBpfWdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKXtyZXR1cm4gdGhpcy5fZ2V0U29ydGVkRGF0YXNldE1ldGFzKCEwKX1fZHJhd0RhdGFzZXRzKCl7aWYoITE9PT10aGlzLm5vdGlmeVBsdWdpbnMoImJlZm9yZURhdGFzZXRzRHJhdyIse2NhbmNlbGFibGU6ITB9KSlyZXR1cm47Y29uc3QgdD10aGlzLmdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKTtmb3IobGV0IGU9dC5sZW5ndGgtMTtlPj0wOy0tZSl0aGlzLl9kcmF3RGF0YXNldCh0W2VdKTt0aGlzLm5vdGlmeVBsdWdpbnMoImFmdGVyRGF0YXNldHNEcmF3Iil9X2RyYXdEYXRhc2V0KHQpe2NvbnN0IGU9dGhpcy5jdHgsaT10Ll9jbGlwLHM9IWkuZGlzYWJsZWQsbj1mdW5jdGlvbih0LGUpe2NvbnN0e3hTY2FsZTppLHlTY2FsZTpzfT10O3JldHVybiBpJiZzP3tsZWZ0Ol9uKGksZSwibGVmdCIpLHJpZ2h0Ol9uKGksZSwicmlnaHQiKSx0b3A6X24ocyxlLCJ0b3AiKSxib3R0b206X24ocyxlLCJib3R0b20iKX06ZX0odCx0aGlzLmNoYXJ0QXJlYSksbz17bWV0YTp0LGluZGV4OnQuaW5kZXgsY2FuY2VsYWJsZTohMH07ITEhPT10aGlzLm5vdGlmeVBsdWdpbnMoImJlZm9yZURhdGFzZXREcmF3IixvKSYmKHMmJk9lKGUse2xlZnQ6ITE9PT1pLmxlZnQ/MDpuLmxlZnQtaS5sZWZ0LHJpZ2h0OiExPT09aS5yaWdodD90aGlzLndpZHRoOm4ucmlnaHQraS5yaWdodCx0b3A6ITE9PT1pLnRvcD8wOm4udG9wLWkudG9wLGJvdHRvbTohMT09PWkuYm90dG9tP3RoaXMuaGVpZ2h0Om4uYm90dG9tK2kuYm90dG9tfSksdC5jb250cm9sbGVyLmRyYXcoKSxzJiZBZShlKSxvLmNhbmNlbGFibGU9ITEsdGhpcy5ub3RpZnlQbHVnaW5zKCJhZnRlckRhdGFzZXREcmF3IixvKSl9aXNQb2ludEluQXJlYSh0KXtyZXR1cm4gQ2UodCx0aGlzLmNoYXJ0QXJlYSx0aGlzLl9taW5QYWRkaW5nKX1nZXRFbGVtZW50c0F0RXZlbnRGb3JNb2RlKHQsZSxpLHMpe2NvbnN0IG49V2kubW9kZXNbZV07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bih0aGlzLHQsaSxzKTpbXX1nZXREYXRhc2V0TWV0YSh0KXtjb25zdCBlPXRoaXMuZGF0YS5kYXRhc2V0c1t0XSxpPXRoaXMuX21ldGFzZXRzO2xldCBzPWkuZmlsdGVyKHQ9PnQmJnQuX2RhdGFzZXQ9PT1lKS5wb3AoKTtyZXR1cm4gc3x8KHM9e3R5cGU6bnVsbCxkYXRhOltdLGRhdGFzZXQ6bnVsbCxjb250cm9sbGVyOm51bGwsaGlkZGVuOm51bGwseEF4aXNJRDpudWxsLHlBeGlzSUQ6bnVsbCxvcmRlcjplJiZlLm9yZGVyfHwwLGluZGV4OnQsX2RhdGFzZXQ6ZSxfcGFyc2VkOltdLF9zb3J0ZWQ6ITF9LGkucHVzaChzKSksc31nZXRDb250ZXh0KCl7cmV0dXJuIHRoaXMuJGNvbnRleHR8fCh0aGlzLiRjb250ZXh0PU1pKG51bGwse2NoYXJ0OnRoaXMsdHlwZToiY2hhcnQifSkpfWdldFZpc2libGVEYXRhc2V0Q291bnQoKXtyZXR1cm4gdGhpcy5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCkubGVuZ3RofWlzRGF0YXNldFZpc2libGUodCl7Y29uc3QgZT10aGlzLmRhdGEuZGF0YXNldHNbdF07aWYoIWUpcmV0dXJuITE7Y29uc3QgaT10aGlzLmdldERhdGFzZXRNZXRhKHQpO3JldHVybiJib29sZWFuIj09dHlwZW9mIGkuaGlkZGVuPyFpLmhpZGRlbjohZS5oaWRkZW59c2V0RGF0YXNldFZpc2liaWxpdHkodCxlKXt0aGlzLmdldERhdGFzZXRNZXRhKHQpLmhpZGRlbj0hZX10b2dnbGVEYXRhVmlzaWJpbGl0eSh0KXt0aGlzLl9oaWRkZW5JbmRpY2VzW3RdPSF0aGlzLl9oaWRkZW5JbmRpY2VzW3RdfWdldERhdGFWaXNpYmlsaXR5KHQpe3JldHVybiF0aGlzLl9oaWRkZW5JbmRpY2VzW3RdfV91cGRhdGVWaXNpYmlsaXR5KHQsZSxpKXtjb25zdCBzPWk/InNob3ciOiJoaWRlIixuPXRoaXMuZ2V0RGF0YXNldE1ldGEodCksbz1uLmNvbnRyb2xsZXIuX3Jlc29sdmVBbmltYXRpb25zKHZvaWQgMCxzKTtrKGUpPyhuLmRhdGFbZV0uaGlkZGVuPSFpLHRoaXMudXBkYXRlKCkpOih0aGlzLnNldERhdGFzZXRWaXNpYmlsaXR5KHQsaSksby51cGRhdGUobix7dmlzaWJsZTppfSksdGhpcy51cGRhdGUoZT0+ZS5kYXRhc2V0SW5kZXg9PT10P3M6dm9pZCAwKSl9aGlkZSh0LGUpe3RoaXMuX3VwZGF0ZVZpc2liaWxpdHkodCxlLCExKX1zaG93KHQsZSl7dGhpcy5fdXBkYXRlVmlzaWJpbGl0eSh0LGUsITApfV9kZXN0cm95RGF0YXNldE1ldGEodCl7Y29uc3QgZT10aGlzLl9tZXRhc2V0c1t0XTtlJiZlLmNvbnRyb2xsZXImJmUuY29udHJvbGxlci5fZGVzdHJveSgpLGRlbGV0ZSB0aGlzLl9tZXRhc2V0c1t0XX1fc3RvcCgpe2xldCB0LGU7Zm9yKHRoaXMuc3RvcCgpLGJ0LnJlbW92ZSh0aGlzKSx0PTAsZT10aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoO3Q8ZTsrK3QpdGhpcy5fZGVzdHJveURhdGFzZXRNZXRhKHQpfWRlc3Ryb3koKXt0aGlzLm5vdGlmeVBsdWdpbnMoImJlZm9yZURlc3Ryb3kiKTtjb25zdHtjYW52YXM6dCxjdHg6ZX09dGhpczt0aGlzLl9zdG9wKCksdGhpcy5jb25maWcuY2xlYXJDYWNoZSgpLHQmJih0aGlzLnVuYmluZEV2ZW50cygpLFNlKHQsZSksdGhpcy5wbGF0Zm9ybS5yZWxlYXNlQ29udGV4dChlKSx0aGlzLmNhbnZhcz1udWxsLHRoaXMuY3R4PW51bGwpLGRlbGV0ZSBtblt0aGlzLmlkXSx0aGlzLm5vdGlmeVBsdWdpbnMoImFmdGVyRGVzdHJveSIpfXRvQmFzZTY0SW1hZ2UoLi4udCl7cmV0dXJuIHRoaXMuY2FudmFzLnRvRGF0YVVSTCguLi50KX1iaW5kRXZlbnRzKCl7dGhpcy5iaW5kVXNlckV2ZW50cygpLHRoaXMub3B0aW9ucy5yZXNwb25zaXZlP3RoaXMuYmluZFJlc3BvbnNpdmVFdmVudHMoKTp0aGlzLmF0dGFjaGVkPSEwfWJpbmRVc2VyRXZlbnRzKCl7Y29uc3QgdD10aGlzLl9saXN0ZW5lcnMsZT10aGlzLnBsYXRmb3JtLGk9KGkscyk9PntlLmFkZEV2ZW50TGlzdGVuZXIodGhpcyxpLHMpLHRbaV09c30scz0odCxlLGkpPT57dC5vZmZzZXRYPWUsdC5vZmZzZXRZPWksdGhpcy5fZXZlbnRIYW5kbGVyKHQpfTt1KHRoaXMub3B0aW9ucy5ldmVudHMsdD0+aSh0LHMpKX1iaW5kUmVzcG9uc2l2ZUV2ZW50cygpe3RoaXMuX3Jlc3BvbnNpdmVMaXN0ZW5lcnN8fCh0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzPXt9KTtjb25zdCB0PXRoaXMuX3Jlc3BvbnNpdmVMaXN0ZW5lcnMsZT10aGlzLnBsYXRmb3JtLGk9KGkscyk9PntlLmFkZEV2ZW50TGlzdGVuZXIodGhpcyxpLHMpLHRbaV09c30scz0oaSxzKT0+e3RbaV0mJihlLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcyxpLHMpLGRlbGV0ZSB0W2ldKX0sbj0odCxlKT0+e3RoaXMuY2FudmFzJiZ0aGlzLnJlc2l6ZSh0LGUpfTtsZXQgbztjb25zdCBhPSgpPT57cygiYXR0YWNoIixhKSx0aGlzLmF0dGFjaGVkPSEwLHRoaXMucmVzaXplKCksaSgicmVzaXplIixuKSxpKCJkZXRhY2giLG8pfTtvPSgpPT57dGhpcy5hdHRhY2hlZD0hMSxzKCJyZXNpemUiLG4pLHRoaXMuX3N0b3AoKSx0aGlzLl9yZXNpemUoMCwwKSxpKCJhdHRhY2giLGEpfSxlLmlzQXR0YWNoZWQodGhpcy5jYW52YXMpP2EoKTpvKCl9dW5iaW5kRXZlbnRzKCl7dSh0aGlzLl9saXN0ZW5lcnMsKHQsZSk9Pnt0aGlzLnBsYXRmb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcyxlLHQpfSksdGhpcy5fbGlzdGVuZXJzPXt9LHUodGhpcy5fcmVzcG9uc2l2ZUxpc3RlbmVycywodCxlKT0+e3RoaXMucGxhdGZvcm0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLGUsdCl9KSx0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzPXZvaWQgMH11cGRhdGVIb3ZlclN0eWxlKHQsZSxpKXtjb25zdCBzPWk/InNldCI6InJlbW92ZSI7bGV0IG4sbyxhLHI7Zm9yKCJkYXRhc2V0Ij09PWUmJihuPXRoaXMuZ2V0RGF0YXNldE1ldGEodFswXS5kYXRhc2V0SW5kZXgpLG4uY29udHJvbGxlclsiXyIrcysiRGF0YXNldEhvdmVyU3R5bGUiXSgpKSxhPTAscj10Lmxlbmd0aDthPHI7KythKXtvPXRbYV07Y29uc3QgZT1vJiZ0aGlzLmdldERhdGFzZXRNZXRhKG8uZGF0YXNldEluZGV4KS5jb250cm9sbGVyO2UmJmVbcysiSG92ZXJTdHlsZSJdKG8uZWxlbWVudCxvLmRhdGFzZXRJbmRleCxvLmluZGV4KX19Z2V0QWN0aXZlRWxlbWVudHMoKXtyZXR1cm4gdGhpcy5fYWN0aXZlfHxbXX1zZXRBY3RpdmVFbGVtZW50cyh0KXtjb25zdCBlPXRoaXMuX2FjdGl2ZXx8W10saT10Lm1hcCgoe2RhdGFzZXRJbmRleDp0LGluZGV4OmV9KT0+e2NvbnN0IGk9dGhpcy5nZXREYXRhc2V0TWV0YSh0KTtpZighaSl0aHJvdyBuZXcgRXJyb3IoIk5vIGRhdGFzZXQgZm91bmQgYXQgaW5kZXggIit0KTtyZXR1cm57ZGF0YXNldEluZGV4OnQsZWxlbWVudDppLmRhdGFbZV0saW5kZXg6ZX19KTshZihpLGUpJiYodGhpcy5fYWN0aXZlPWksdGhpcy5fbGFzdEV2ZW50PW51bGwsdGhpcy5fdXBkYXRlSG92ZXJTdHlsZXMoaSxlKSl9bm90aWZ5UGx1Z2lucyh0LGUsaSl7cmV0dXJuIHRoaXMuX3BsdWdpbnMubm90aWZ5KHRoaXMsdCxlLGkpfWlzUGx1Z2luRW5hYmxlZCh0KXtyZXR1cm4gMT09PXRoaXMuX3BsdWdpbnMuX2NhY2hlLmZpbHRlcihlPT5lLnBsdWdpbi5pZD09PXQpLmxlbmd0aH1fdXBkYXRlSG92ZXJTdHlsZXModCxlLGkpe2NvbnN0IHM9dGhpcy5vcHRpb25zLmhvdmVyLG49KHQsZSk9PnQuZmlsdGVyKHQ9PiFlLnNvbWUoZT0+dC5kYXRhc2V0SW5kZXg9PT1lLmRhdGFzZXRJbmRleCYmdC5pbmRleD09PWUuaW5kZXgpKSxvPW4oZSx0KSxhPWk/dDpuKHQsZSk7by5sZW5ndGgmJnRoaXMudXBkYXRlSG92ZXJTdHlsZShvLHMubW9kZSwhMSksYS5sZW5ndGgmJnMubW9kZSYmdGhpcy51cGRhdGVIb3ZlclN0eWxlKGEscy5tb2RlLCEwKX1fZXZlbnRIYW5kbGVyKHQsZSl7Y29uc3QgaT17ZXZlbnQ6dCxyZXBsYXk6ZSxjYW5jZWxhYmxlOiEwLGluQ2hhcnRBcmVhOnRoaXMuaXNQb2ludEluQXJlYSh0KX0scz1lPT4oZS5vcHRpb25zLmV2ZW50c3x8dGhpcy5vcHRpb25zLmV2ZW50cykuaW5jbHVkZXModC5uYXRpdmUudHlwZSk7aWYoITE9PT10aGlzLm5vdGlmeVBsdWdpbnMoImJlZm9yZUV2ZW50IixpLHMpKXJldHVybjtjb25zdCBuPXRoaXMuX2hhbmRsZUV2ZW50KHQsZSxpLmluQ2hhcnRBcmVhKTtyZXR1cm4gaS5jYW5jZWxhYmxlPSExLHRoaXMubm90aWZ5UGx1Z2lucygiYWZ0ZXJFdmVudCIsaSxzKSwobnx8aS5jaGFuZ2VkKSYmdGhpcy5yZW5kZXIoKSx0aGlzfV9oYW5kbGVFdmVudCh0LGUsaSl7Y29uc3R7X2FjdGl2ZTpzPVtdLG9wdGlvbnM6bn09dGhpcyxvPWUsYT10aGlzLl9nZXRBY3RpdmVFbGVtZW50cyh0LHMsaSxvKSxyPUQodCksbD1mdW5jdGlvbih0LGUsaSxzKXtyZXR1cm4gaSYmIm1vdXNlb3V0IiE9PXQudHlwZT9zP2U6dDpudWxsfSh0LHRoaXMuX2xhc3RFdmVudCxpLHIpO2kmJih0aGlzLl9sYXN0RXZlbnQ9bnVsbCxkKG4ub25Ib3ZlcixbdCxhLHRoaXNdLHRoaXMpLHImJmQobi5vbkNsaWNrLFt0LGEsdGhpc10sdGhpcykpO2NvbnN0IGg9IWYoYSxzKTtyZXR1cm4oaHx8ZSkmJih0aGlzLl9hY3RpdmU9YSx0aGlzLl91cGRhdGVIb3ZlclN0eWxlcyhhLHMsZSkpLHRoaXMuX2xhc3RFdmVudD1sLGh9X2dldEFjdGl2ZUVsZW1lbnRzKHQsZSxpLHMpe2lmKCJtb3VzZW91dCI9PT10LnR5cGUpcmV0dXJuW107aWYoIWkpcmV0dXJuIGU7Y29uc3Qgbj10aGlzLm9wdGlvbnMuaG92ZXI7cmV0dXJuIHRoaXMuZ2V0RWxlbWVudHNBdEV2ZW50Rm9yTW9kZSh0LG4ubW9kZSxuLHMpfX1mdW5jdGlvbiB2bigpe3JldHVybiB1KHluLmluc3RhbmNlcyx0PT50Ll9wbHVnaW5zLmludmFsaWRhdGUoKSl9ZnVuY3Rpb24gTW4oKXt0aHJvdyBuZXcgRXJyb3IoIlRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZDogQ2hlY2sgdGhhdCBhIGNvbXBsZXRlIGRhdGUgYWRhcHRlciBpcyBwcm92aWRlZC4iKX1jbGFzcyB3bntzdGF0aWMgb3ZlcnJpZGUodCl7T2JqZWN0LmFzc2lnbih3bi5wcm90b3R5cGUsdCl9b3B0aW9ucztjb25zdHJ1Y3Rvcih0KXt0aGlzLm9wdGlvbnM9dHx8e319aW5pdCgpe31mb3JtYXRzKCl7cmV0dXJuIE1uKCl9cGFyc2UoKXtyZXR1cm4gTW4oKX1mb3JtYXQoKXtyZXR1cm4gTW4oKX1hZGQoKXtyZXR1cm4gTW4oKX1kaWZmKCl7cmV0dXJuIE1uKCl9c3RhcnRPZigpe3JldHVybiBNbigpfWVuZE9mKCl7cmV0dXJuIE1uKCl9fXZhciBrbj17X2RhdGU6d259O2Z1bmN0aW9uIFNuKHQpe2NvbnN0IGU9dC5pU2NhbGUsaT1mdW5jdGlvbih0LGUpe2lmKCF0Ll9jYWNoZS4kYmFyKXtjb25zdCBpPXQuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXMoZSk7bGV0IHM9W107Zm9yKGxldCBlPTAsbj1pLmxlbmd0aDtlPG47ZSsrKXM9cy5jb25jYXQoaVtlXS5jb250cm9sbGVyLmdldEFsbFBhcnNlZFZhbHVlcyh0KSk7dC5fY2FjaGUuJGJhcj1sdChzLnNvcnQoKHQsZSk9PnQtZSkpfXJldHVybiB0Ll9jYWNoZS4kYmFyfShlLHQudHlwZSk7bGV0IHMsbixvLGEscj1lLl9sZW5ndGg7Y29uc3QgbD0oKT0+ezMyNzY3IT09byYmLTMyNzY4IT09byYmKGsoYSkmJihyPU1hdGgubWluKHIsTWF0aC5hYnMoby1hKXx8cikpLGE9byl9O2ZvcihzPTAsbj1pLmxlbmd0aDtzPG47KytzKW89ZS5nZXRQaXhlbEZvclZhbHVlKGlbc10pLGwoKTtmb3IoYT12b2lkIDAscz0wLG49ZS50aWNrcy5sZW5ndGg7czxuOysrcylvPWUuZ2V0UGl4ZWxGb3JUaWNrKHMpLGwoKTtyZXR1cm4gcn1mdW5jdGlvbiBQbih0LGUsaSxzKXtyZXR1cm4gbih0KT9mdW5jdGlvbih0LGUsaSxzKXtjb25zdCBuPWkucGFyc2UodFswXSxzKSxvPWkucGFyc2UodFsxXSxzKSxhPU1hdGgubWluKG4sbykscj1NYXRoLm1heChuLG8pO2xldCBsPWEsaD1yO01hdGguYWJzKGEpPk1hdGguYWJzKHIpJiYobD1yLGg9YSksZVtpLmF4aXNdPWgsZS5fY3VzdG9tPXtiYXJTdGFydDpsLGJhckVuZDpoLHN0YXJ0Om4sZW5kOm8sbWluOmEsbWF4OnJ9fSh0LGUsaSxzKTplW2kuYXhpc109aS5wYXJzZSh0LHMpLGV9ZnVuY3Rpb24gRG4odCxlLGkscyl7Y29uc3Qgbj10LmlTY2FsZSxvPXQudlNjYWxlLGE9bi5nZXRMYWJlbHMoKSxyPW49PT1vLGw9W107bGV0IGgsYyxkLHU7Zm9yKGg9aSxjPWkrcztoPGM7KytoKXU9ZVtoXSxkPXt9LGRbbi5heGlzXT1yfHxuLnBhcnNlKGFbaF0saCksbC5wdXNoKFBuKHUsZCxvLGgpKTtyZXR1cm4gbH1mdW5jdGlvbiBDbih0KXtyZXR1cm4gdCYmdm9pZCAwIT09dC5iYXJTdGFydCYmdm9pZCAwIT09dC5iYXJFbmR9ZnVuY3Rpb24gT24odCxlLGkscyl7bGV0IG49ZS5ib3JkZXJTa2lwcGVkO2NvbnN0IG89e307aWYoIW4pcmV0dXJuIHZvaWQodC5ib3JkZXJTa2lwcGVkPW8pO2lmKCEwPT09bilyZXR1cm4gdm9pZCh0LmJvcmRlclNraXBwZWQ9e3RvcDohMCxyaWdodDohMCxib3R0b206ITAsbGVmdDohMH0pO2NvbnN0e3N0YXJ0OmEsZW5kOnIscmV2ZXJzZTpsLHRvcDpoLGJvdHRvbTpjfT1mdW5jdGlvbih0KXtsZXQgZSxpLHMsbixvO3JldHVybiB0Lmhvcml6b250YWw/KGU9dC5iYXNlPnQueCxpPSJsZWZ0IixzPSJyaWdodCIpOihlPXQuYmFzZTx0LnksaT0iYm90dG9tIixzPSJ0b3AiKSxlPyhuPSJlbmQiLG89InN0YXJ0Iik6KG49InN0YXJ0IixvPSJlbmQiKSx7c3RhcnQ6aSxlbmQ6cyxyZXZlcnNlOmUsdG9wOm4sYm90dG9tOm99fSh0KTsibWlkZGxlIj09PW4mJmkmJih0LmVuYWJsZUJvcmRlclJhZGl1cz0hMCwoaS5fdG9wfHwwKT09PXM/bj1oOihpLl9ib3R0b218fDApPT09cz9uPWM6KG9bQW4oYyxhLHIsbCldPSEwLG49aCkpLG9bQW4obixhLHIsbCldPSEwLHQuYm9yZGVyU2tpcHBlZD1vfWZ1bmN0aW9uIEFuKHQsZSxpLHMpe3ZhciBuLG8sYTtyZXR1cm4gcz8oYT1pLHQ9VG4odD0obj10KT09PShvPWUpP2E6bj09PWE/bzpuLGksZSkpOnQ9VG4odCxlLGkpLHR9ZnVuY3Rpb24gVG4odCxlLGkpe3JldHVybiJzdGFydCI9PT10P2U6ImVuZCI9PT10P2k6dH1mdW5jdGlvbiBMbih0LHtpbmZsYXRlQW1vdW50OmV9LGkpe3QuaW5mbGF0ZUFtb3VudD0iYXV0byI9PT1lPzE9PT1pPy4zMzowOmV9Y2xhc3MgRW4gZXh0ZW5kcyBFc3tzdGF0aWMgaWQ9ImRvdWdobnV0IjtzdGF0aWMgZGVmYXVsdHM9e2RhdGFzZXRFbGVtZW50VHlwZTohMSxkYXRhRWxlbWVudFR5cGU6ImFyYyIsYW5pbWF0aW9uOnthbmltYXRlUm90YXRlOiEwLGFuaW1hdGVTY2FsZTohMX0sYW5pbWF0aW9uczp7bnVtYmVyczp7dHlwZToibnVtYmVyIixwcm9wZXJ0aWVzOlsiY2lyY3VtZmVyZW5jZSIsImVuZEFuZ2xlIiwiaW5uZXJSYWRpdXMiLCJvdXRlclJhZGl1cyIsInN0YXJ0QW5nbGUiLCJ4IiwieSIsIm9mZnNldCIsImJvcmRlcldpZHRoIiwic3BhY2luZyJdfX0sY3V0b3V0OiI1MCUiLHJvdGF0aW9uOjAsY2lyY3VtZmVyZW5jZTozNjAscmFkaXVzOiIxMDAlIixzcGFjaW5nOjAsaW5kZXhBeGlzOiJyIn07c3RhdGljIGRlc2NyaXB0b3JzPXtfc2NyaXB0YWJsZTp0PT4ic3BhY2luZyIhPT10LF9pbmRleGFibGU6dD0+InNwYWNpbmciIT09dCYmIXQuc3RhcnRzV2l0aCgiYm9yZGVyRGFzaCIpJiYhdC5zdGFydHNXaXRoKCJob3ZlckJvcmRlckRhc2giKX07c3RhdGljIG92ZXJyaWRlcz17YXNwZWN0UmF0aW86MSxwbHVnaW5zOntsZWdlbmQ6e2xhYmVsczp7Z2VuZXJhdGVMYWJlbHModCl7Y29uc3QgZT10LmRhdGE7aWYoZS5sYWJlbHMubGVuZ3RoJiZlLmRhdGFzZXRzLmxlbmd0aCl7Y29uc3R7bGFiZWxzOntwb2ludFN0eWxlOmksY29sb3I6c319PXQubGVnZW5kLm9wdGlvbnM7cmV0dXJuIGUubGFiZWxzLm1hcCgoZSxuKT0+e2NvbnN0IG89dC5nZXREYXRhc2V0TWV0YSgwKS5jb250cm9sbGVyLmdldFN0eWxlKG4pO3JldHVybnt0ZXh0OmUsZmlsbFN0eWxlOm8uYmFja2dyb3VuZENvbG9yLHN0cm9rZVN0eWxlOm8uYm9yZGVyQ29sb3IsZm9udENvbG9yOnMsbGluZVdpZHRoOm8uYm9yZGVyV2lkdGgscG9pbnRTdHlsZTppLGhpZGRlbjohdC5nZXREYXRhVmlzaWJpbGl0eShuKSxpbmRleDpufX0pfXJldHVybltdfX0sb25DbGljayh0LGUsaSl7aS5jaGFydC50b2dnbGVEYXRhVmlzaWJpbGl0eShlLmluZGV4KSxpLmNoYXJ0LnVwZGF0ZSgpfX19fTtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5lbmFibGVPcHRpb25TaGFyaW5nPSEwLHRoaXMuaW5uZXJSYWRpdXM9dm9pZCAwLHRoaXMub3V0ZXJSYWRpdXM9dm9pZCAwLHRoaXMub2Zmc2V0WD12b2lkIDAsdGhpcy5vZmZzZXRZPXZvaWQgMH1saW5rU2NhbGVzKCl7fXBhcnNlKHQsZSl7Y29uc3QgaT10aGlzLmdldERhdGFzZXQoKS5kYXRhLHM9dGhpcy5fY2FjaGVkTWV0YTtpZighMT09PXRoaXMuX3BhcnNpbmcpcy5fcGFyc2VkPWk7ZWxzZXtsZXQgbixhLHI9dD0+K2lbdF07aWYobyhpW3RdKSl7Y29uc3R7a2V5OnQ9InZhbHVlIn09dGhpcy5fcGFyc2luZztyPWU9PitNKGlbZV0sdCl9Zm9yKG49dCxhPXQrZTtuPGE7KytuKXMuX3BhcnNlZFtuXT1yKG4pfX1fZ2V0Um90YXRpb24oKXtyZXR1cm4gJCh0aGlzLm9wdGlvbnMucm90YXRpb24tOTApfV9nZXRDaXJjdW1mZXJlbmNlKCl7cmV0dXJuICQodGhpcy5vcHRpb25zLmNpcmN1bWZlcmVuY2UpfV9nZXRSb3RhdGlvbkV4dGVudHMoKXtsZXQgdD1PLGU9LU87Zm9yKGxldCBpPTA7aTx0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMubGVuZ3RoOysraSlpZih0aGlzLmNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSkmJnRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSkudHlwZT09PXRoaXMuX3R5cGUpe2NvbnN0IHM9dGhpcy5jaGFydC5nZXREYXRhc2V0TWV0YShpKS5jb250cm9sbGVyLG49cy5fZ2V0Um90YXRpb24oKSxvPXMuX2dldENpcmN1bWZlcmVuY2UoKTt0PU1hdGgubWluKHQsbiksZT1NYXRoLm1heChlLG4rbyl9cmV0dXJue3JvdGF0aW9uOnQsY2lyY3VtZmVyZW5jZTplLXR9fXVwZGF0ZSh0KXtjb25zdCBlPXRoaXMuY2hhcnQse2NoYXJ0QXJlYTppfT1lLHM9dGhpcy5fY2FjaGVkTWV0YSxuPXMuZGF0YSxvPXRoaXMuZ2V0TWF4Qm9yZGVyV2lkdGgoKSt0aGlzLmdldE1heE9mZnNldChuKSt0aGlzLm9wdGlvbnMuc3BhY2luZyxhPU1hdGgubWF4KChNYXRoLm1pbihpLndpZHRoLGkuaGVpZ2h0KS1vKS8yLDApLHI9TWF0aC5taW4oaCh0aGlzLm9wdGlvbnMuY3V0b3V0LGEpLDEpLGw9dGhpcy5fZ2V0UmluZ1dlaWdodCh0aGlzLmluZGV4KSx7Y2lyY3VtZmVyZW5jZTpkLHJvdGF0aW9uOnV9PXRoaXMuX2dldFJvdGF0aW9uRXh0ZW50cygpLHtyYXRpb1g6ZixyYXRpb1k6ZyxvZmZzZXRYOnAsb2Zmc2V0WTptfT1mdW5jdGlvbih0LGUsaSl7bGV0IHM9MSxuPTEsbz0wLGE9MDtpZihlPE8pe2NvbnN0IHI9dCxsPXIrZSxoPU1hdGguY29zKHIpLGM9TWF0aC5zaW4ociksZD1NYXRoLmNvcyhsKSx1PU1hdGguc2luKGwpLGY9KHQsZSxzKT0+Wih0LHIsbCwhMCk/MTpNYXRoLm1heChlLGUqaSxzLHMqaSksZz0odCxlLHMpPT5aKHQscixsLCEwKT8tMTpNYXRoLm1pbihlLGUqaSxzLHMqaSkscD1mKDAsaCxkKSxtPWYoRSxjLHUpLGI9ZyhDLGgsZCkseD1nKEMrRSxjLHUpO3M9KHAtYikvMixuPShtLXgpLzIsbz0tKHArYikvMixhPS0obSt4KS8yfXJldHVybntyYXRpb1g6cyxyYXRpb1k6bixvZmZzZXRYOm8sb2Zmc2V0WTphfX0odSxkLHIpLGI9KGkud2lkdGgtbykvZix4PShpLmhlaWdodC1vKS9nLF89TWF0aC5tYXgoTWF0aC5taW4oYix4KS8yLDApLHk9Yyh0aGlzLm9wdGlvbnMucmFkaXVzLF8pLHY9KHktTWF0aC5tYXgoeSpyLDApKS90aGlzLl9nZXRWaXNpYmxlRGF0YXNldFdlaWdodFRvdGFsKCk7dGhpcy5vZmZzZXRYPXAqeSx0aGlzLm9mZnNldFk9bSp5LHMudG90YWw9dGhpcy5jYWxjdWxhdGVUb3RhbCgpLHRoaXMub3V0ZXJSYWRpdXM9eS12KnRoaXMuX2dldFJpbmdXZWlnaHRPZmZzZXQodGhpcy5pbmRleCksdGhpcy5pbm5lclJhZGl1cz1NYXRoLm1heCh0aGlzLm91dGVyUmFkaXVzLXYqbCwwKSx0aGlzLnVwZGF0ZUVsZW1lbnRzKG4sMCxuLmxlbmd0aCx0KX1fY2lyY3VtZmVyZW5jZSh0LGUpe2NvbnN0IGk9dGhpcy5vcHRpb25zLHM9dGhpcy5fY2FjaGVkTWV0YSxuPXRoaXMuX2dldENpcmN1bWZlcmVuY2UoKTtyZXR1cm4gZSYmaS5hbmltYXRpb24uYW5pbWF0ZVJvdGF0ZXx8IXRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkodCl8fG51bGw9PT1zLl9wYXJzZWRbdF18fHMuZGF0YVt0XS5oaWRkZW4/MDp0aGlzLmNhbGN1bGF0ZUNpcmN1bWZlcmVuY2Uocy5fcGFyc2VkW3RdKm4vTyl9dXBkYXRlRWxlbWVudHModCxlLGkscyl7Y29uc3Qgbj0icmVzZXQiPT09cyxvPXRoaXMuY2hhcnQsYT1vLmNoYXJ0QXJlYSxyPW8ub3B0aW9ucy5hbmltYXRpb24sbD0oYS5sZWZ0K2EucmlnaHQpLzIsaD0oYS50b3ArYS5ib3R0b20pLzIsYz1uJiZyLmFuaW1hdGVTY2FsZSxkPWM/MDp0aGlzLmlubmVyUmFkaXVzLHU9Yz8wOnRoaXMub3V0ZXJSYWRpdXMse3NoYXJlZE9wdGlvbnM6ZixpbmNsdWRlT3B0aW9uczpnfT10aGlzLl9nZXRTaGFyZWRPcHRpb25zKGUscyk7bGV0IHAsbT10aGlzLl9nZXRSb3RhdGlvbigpO2ZvcihwPTA7cDxlOysrcCltKz10aGlzLl9jaXJjdW1mZXJlbmNlKHAsbik7Zm9yKHA9ZTtwPGUraTsrK3Ape2NvbnN0IGU9dGhpcy5fY2lyY3VtZmVyZW5jZShwLG4pLGk9dFtwXSxvPXt4OmwrdGhpcy5vZmZzZXRYLHk6aCt0aGlzLm9mZnNldFksc3RhcnRBbmdsZTptLGVuZEFuZ2xlOm0rZSxjaXJjdW1mZXJlbmNlOmUsb3V0ZXJSYWRpdXM6dSxpbm5lclJhZGl1czpkfTtnJiYoby5vcHRpb25zPWZ8fHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhwLGkuYWN0aXZlPyJhY3RpdmUiOnMpKSxtKz1lLHRoaXMudXBkYXRlRWxlbWVudChpLHAsbyxzKX19Y2FsY3VsYXRlVG90YWwoKXtjb25zdCB0PXRoaXMuX2NhY2hlZE1ldGEsZT10LmRhdGE7bGV0IGkscz0wO2ZvcihpPTA7aTxlLmxlbmd0aDtpKyspe2NvbnN0IG49dC5fcGFyc2VkW2ldO251bGw9PT1ufHxpc05hTihuKXx8IXRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaSl8fGVbaV0uaGlkZGVufHwocys9TWF0aC5hYnMobikpfXJldHVybiBzfWNhbGN1bGF0ZUNpcmN1bWZlcmVuY2UodCl7Y29uc3QgZT10aGlzLl9jYWNoZWRNZXRhLnRvdGFsO3JldHVybiBlPjAmJiFpc05hTih0KT9PKihNYXRoLmFicyh0KS9lKTowfWdldExhYmVsQW5kVmFsdWUodCl7Y29uc3QgZT10aGlzLl9jYWNoZWRNZXRhLGk9dGhpcy5jaGFydCxzPWkuZGF0YS5sYWJlbHN8fFtdLG49dGUoZS5fcGFyc2VkW3RdLGkub3B0aW9ucy5sb2NhbGUpO3JldHVybntsYWJlbDpzW3RdfHwiIix2YWx1ZTpufX1nZXRNYXhCb3JkZXJXaWR0aCh0KXtsZXQgZT0wO2NvbnN0IGk9dGhpcy5jaGFydDtsZXQgcyxuLG8sYSxyO2lmKCF0KWZvcihzPTAsbj1pLmRhdGEuZGF0YXNldHMubGVuZ3RoO3M8bjsrK3MpaWYoaS5pc0RhdGFzZXRWaXNpYmxlKHMpKXtvPWkuZ2V0RGF0YXNldE1ldGEocyksdD1vLmRhdGEsYT1vLmNvbnRyb2xsZXI7YnJlYWt9aWYoIXQpcmV0dXJuIDA7Zm9yKHM9MCxuPXQubGVuZ3RoO3M8bjsrK3Mpcj1hLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMocyksImlubmVyIiE9PXIuYm9yZGVyQWxpZ24mJihlPU1hdGgubWF4KGUsci5ib3JkZXJXaWR0aHx8MCxyLmhvdmVyQm9yZGVyV2lkdGh8fDApKTtyZXR1cm4gZX1nZXRNYXhPZmZzZXQodCl7bGV0IGU9MDtmb3IobGV0IGk9MCxzPXQubGVuZ3RoO2k8czsrK2kpe2NvbnN0IHQ9dGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGkpO2U9TWF0aC5tYXgoZSx0Lm9mZnNldHx8MCx0LmhvdmVyT2Zmc2V0fHwwKX1yZXR1cm4gZX1fZ2V0UmluZ1dlaWdodE9mZnNldCh0KXtsZXQgZT0wO2ZvcihsZXQgaT0wO2k8dDsrK2kpdGhpcy5jaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpJiYoZSs9dGhpcy5fZ2V0UmluZ1dlaWdodChpKSk7cmV0dXJuIGV9X2dldFJpbmdXZWlnaHQodCl7cmV0dXJuIE1hdGgubWF4KGwodGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW3RdLndlaWdodCwxKSwwKX1fZ2V0VmlzaWJsZURhdGFzZXRXZWlnaHRUb3RhbCgpe3JldHVybiB0aGlzLl9nZXRSaW5nV2VpZ2h0T2Zmc2V0KHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cy5sZW5ndGgpfHwxfX1jbGFzcyBSbiBleHRlbmRzIEVze3N0YXRpYyBpZD0icG9sYXJBcmVhIjtzdGF0aWMgZGVmYXVsdHM9e2RhdGFFbGVtZW50VHlwZToiYXJjIixhbmltYXRpb246e2FuaW1hdGVSb3RhdGU6ITAsYW5pbWF0ZVNjYWxlOiEwfSxhbmltYXRpb25zOntudW1iZXJzOnt0eXBlOiJudW1iZXIiLHByb3BlcnRpZXM6WyJ4IiwieSIsInN0YXJ0QW5nbGUiLCJlbmRBbmdsZSIsImlubmVyUmFkaXVzIiwib3V0ZXJSYWRpdXMiXX19LGluZGV4QXhpczoiciIsc3RhcnRBbmdsZTowfTtzdGF0aWMgb3ZlcnJpZGVzPXthc3BlY3RSYXRpbzoxLHBsdWdpbnM6e2xlZ2VuZDp7bGFiZWxzOntnZW5lcmF0ZUxhYmVscyh0KXtjb25zdCBlPXQuZGF0YTtpZihlLmxhYmVscy5sZW5ndGgmJmUuZGF0YXNldHMubGVuZ3RoKXtjb25zdHtsYWJlbHM6e3BvaW50U3R5bGU6aSxjb2xvcjpzfX09dC5sZWdlbmQub3B0aW9ucztyZXR1cm4gZS5sYWJlbHMubWFwKChlLG4pPT57Y29uc3Qgbz10LmdldERhdGFzZXRNZXRhKDApLmNvbnRyb2xsZXIuZ2V0U3R5bGUobik7cmV0dXJue3RleHQ6ZSxmaWxsU3R5bGU6by5iYWNrZ3JvdW5kQ29sb3Isc3Ryb2tlU3R5bGU6by5ib3JkZXJDb2xvcixmb250Q29sb3I6cyxsaW5lV2lkdGg6by5ib3JkZXJXaWR0aCxwb2ludFN0eWxlOmksaGlkZGVuOiF0LmdldERhdGFWaXNpYmlsaXR5KG4pLGluZGV4Om59fSl9cmV0dXJuW119fSxvbkNsaWNrKHQsZSxpKXtpLmNoYXJ0LnRvZ2dsZURhdGFWaXNpYmlsaXR5KGUuaW5kZXgpLGkuY2hhcnQudXBkYXRlKCl9fX0sc2NhbGVzOntyOnt0eXBlOiJyYWRpYWxMaW5lYXIiLGFuZ2xlTGluZXM6e2Rpc3BsYXk6ITF9LGJlZ2luQXRaZXJvOiEwLGdyaWQ6e2NpcmN1bGFyOiEwfSxwb2ludExhYmVsczp7ZGlzcGxheTohMX0sc3RhcnRBbmdsZTowfX19O2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLmlubmVyUmFkaXVzPXZvaWQgMCx0aGlzLm91dGVyUmFkaXVzPXZvaWQgMH1nZXRMYWJlbEFuZFZhbHVlKHQpe2NvbnN0IGU9dGhpcy5fY2FjaGVkTWV0YSxpPXRoaXMuY2hhcnQscz1pLmRhdGEubGFiZWxzfHxbXSxuPXRlKGUuX3BhcnNlZFt0XS5yLGkub3B0aW9ucy5sb2NhbGUpO3JldHVybntsYWJlbDpzW3RdfHwiIix2YWx1ZTpufX1wYXJzZU9iamVjdERhdGEodCxlLGkscyl7cmV0dXJuIEdlLmJpbmQodGhpcykodCxlLGkscyl9dXBkYXRlKHQpe2NvbnN0IGU9dGhpcy5fY2FjaGVkTWV0YS5kYXRhO3RoaXMuX3VwZGF0ZVJhZGl1cygpLHRoaXMudXBkYXRlRWxlbWVudHMoZSwwLGUubGVuZ3RoLHQpfWdldE1pbk1heCgpe2NvbnN0IHQ9dGhpcy5fY2FjaGVkTWV0YSxlPXttaW46TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG1heDpOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFl9O3JldHVybiB0LmRhdGEuZm9yRWFjaCgodCxpKT0+e2NvbnN0IHM9dGhpcy5nZXRQYXJzZWQoaSkucjshaXNOYU4ocykmJnRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaSkmJihzPGUubWluJiYoZS5taW49cykscz5lLm1heCYmKGUubWF4PXMpKX0pLGV9X3VwZGF0ZVJhZGl1cygpe2NvbnN0IHQ9dGhpcy5jaGFydCxlPXQuY2hhcnRBcmVhLGk9dC5vcHRpb25zLHM9TWF0aC5taW4oZS5yaWdodC1lLmxlZnQsZS5ib3R0b20tZS50b3ApLG49TWF0aC5tYXgocy8yLDApLG89KG4tTWF0aC5tYXgoaS5jdXRvdXRQZXJjZW50YWdlP24vMTAwKmkuY3V0b3V0UGVyY2VudGFnZToxLDApKS90LmdldFZpc2libGVEYXRhc2V0Q291bnQoKTt0aGlzLm91dGVyUmFkaXVzPW4tbyp0aGlzLmluZGV4LHRoaXMuaW5uZXJSYWRpdXM9dGhpcy5vdXRlclJhZGl1cy1vfXVwZGF0ZUVsZW1lbnRzKHQsZSxpLHMpe2NvbnN0IG49InJlc2V0Ij09PXMsbz10aGlzLmNoYXJ0LGE9by5vcHRpb25zLmFuaW1hdGlvbixyPXRoaXMuX2NhY2hlZE1ldGEuclNjYWxlLGw9ci54Q2VudGVyLGg9ci55Q2VudGVyLGM9ci5nZXRJbmRleEFuZ2xlKDApLS41KkM7bGV0IGQsdT1jO2NvbnN0IGY9MzYwL3RoaXMuY291bnRWaXNpYmxlRWxlbWVudHMoKTtmb3IoZD0wO2Q8ZTsrK2QpdSs9dGhpcy5fY29tcHV0ZUFuZ2xlKGQscyxmKTtmb3IoZD1lO2Q8ZStpO2QrKyl7Y29uc3QgZT10W2RdO2xldCBpPXUsZz11K3RoaXMuX2NvbXB1dGVBbmdsZShkLHMsZikscD1vLmdldERhdGFWaXNpYmlsaXR5KGQpP3IuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodGhpcy5nZXRQYXJzZWQoZCkucik6MDt1PWcsbiYmKGEuYW5pbWF0ZVNjYWxlJiYocD0wKSxhLmFuaW1hdGVSb3RhdGUmJihpPWc9YykpO2NvbnN0IG09e3g6bCx5OmgsaW5uZXJSYWRpdXM6MCxvdXRlclJhZGl1czpwLHN0YXJ0QW5nbGU6aSxlbmRBbmdsZTpnLG9wdGlvbnM6dGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGQsZS5hY3RpdmU/ImFjdGl2ZSI6cyl9O3RoaXMudXBkYXRlRWxlbWVudChlLGQsbSxzKX19Y291bnRWaXNpYmxlRWxlbWVudHMoKXtjb25zdCB0PXRoaXMuX2NhY2hlZE1ldGE7bGV0IGU9MDtyZXR1cm4gdC5kYXRhLmZvckVhY2goKHQsaSk9PnshaXNOYU4odGhpcy5nZXRQYXJzZWQoaSkucikmJnRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaSkmJmUrK30pLGV9X2NvbXB1dGVBbmdsZSh0LGUsaSl7cmV0dXJuIHRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkodCk/JCh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnModCxlKS5hbmdsZXx8aSk6MH19dmFyIEluPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJhckNvbnRyb2xsZXI6Y2xhc3MgZXh0ZW5kcyBFc3tzdGF0aWMgaWQ9ImJhciI7c3RhdGljIGRlZmF1bHRzPXtkYXRhc2V0RWxlbWVudFR5cGU6ITEsZGF0YUVsZW1lbnRUeXBlOiJiYXIiLGNhdGVnb3J5UGVyY2VudGFnZTouOCxiYXJQZXJjZW50YWdlOi45LGdyb3VwZWQ6ITAsYW5pbWF0aW9uczp7bnVtYmVyczp7dHlwZToibnVtYmVyIixwcm9wZXJ0aWVzOlsieCIsInkiLCJiYXNlIiwid2lkdGgiLCJoZWlnaHQiXX19fTtzdGF0aWMgb3ZlcnJpZGVzPXtzY2FsZXM6e19pbmRleF86e3R5cGU6ImNhdGVnb3J5IixvZmZzZXQ6ITAsZ3JpZDp7b2Zmc2V0OiEwfX0sX3ZhbHVlXzp7dHlwZToibGluZWFyIixiZWdpbkF0WmVybzohMH19fTtwYXJzZVByaW1pdGl2ZURhdGEodCxlLGkscyl7cmV0dXJuIERuKHQsZSxpLHMpfXBhcnNlQXJyYXlEYXRhKHQsZSxpLHMpe3JldHVybiBEbih0LGUsaSxzKX1wYXJzZU9iamVjdERhdGEodCxlLGkscyl7Y29uc3R7aVNjYWxlOm4sdlNjYWxlOm99PXQse3hBeGlzS2V5OmE9IngiLHlBeGlzS2V5OnI9InkifT10aGlzLl9wYXJzaW5nLGw9IngiPT09bi5heGlzP2E6cixoPSJ4Ij09PW8uYXhpcz9hOnIsYz1bXTtsZXQgZCx1LGYsZztmb3IoZD1pLHU9aStzO2Q8dTsrK2QpZz1lW2RdLGY9e30sZltuLmF4aXNdPW4ucGFyc2UoTShnLGwpLGQpLGMucHVzaChQbihNKGcsaCksZixvLGQpKTtyZXR1cm4gY311cGRhdGVSYW5nZUZyb21QYXJzZWQodCxlLGkscyl7c3VwZXIudXBkYXRlUmFuZ2VGcm9tUGFyc2VkKHQsZSxpLHMpO2NvbnN0IG49aS5fY3VzdG9tO24mJmU9PT10aGlzLl9jYWNoZWRNZXRhLnZTY2FsZSYmKHQubWluPU1hdGgubWluKHQubWluLG4ubWluKSx0Lm1heD1NYXRoLm1heCh0Lm1heCxuLm1heCkpfWdldE1heE92ZXJmbG93KCl7cmV0dXJuIDB9Z2V0TGFiZWxBbmRWYWx1ZSh0KXtjb25zdCBlPXRoaXMuX2NhY2hlZE1ldGEse2lTY2FsZTppLHZTY2FsZTpzfT1lLG49dGhpcy5nZXRQYXJzZWQodCksbz1uLl9jdXN0b20sYT1DbihvKT8iWyIrby5zdGFydCsiLCAiK28uZW5kKyJdIjoiIitzLmdldExhYmVsRm9yVmFsdWUobltzLmF4aXNdKTtyZXR1cm57bGFiZWw6IiIraS5nZXRMYWJlbEZvclZhbHVlKG5baS5heGlzXSksdmFsdWU6YX19aW5pdGlhbGl6ZSgpe3RoaXMuZW5hYmxlT3B0aW9uU2hhcmluZz0hMCxzdXBlci5pbml0aWFsaXplKCksdGhpcy5fY2FjaGVkTWV0YS5zdGFjaz10aGlzLmdldERhdGFzZXQoKS5zdGFja311cGRhdGUodCl7Y29uc3QgZT10aGlzLl9jYWNoZWRNZXRhO3RoaXMudXBkYXRlRWxlbWVudHMoZS5kYXRhLDAsZS5kYXRhLmxlbmd0aCx0KX11cGRhdGVFbGVtZW50cyh0LGUsaSxuKXtjb25zdCBvPSJyZXNldCI9PT1uLHtpbmRleDphLF9jYWNoZWRNZXRhOnt2U2NhbGU6cn19PXRoaXMsbD1yLmdldEJhc2VQaXhlbCgpLGg9ci5pc0hvcml6b250YWwoKSxjPXRoaXMuX2dldFJ1bGVyKCkse3NoYXJlZE9wdGlvbnM6ZCxpbmNsdWRlT3B0aW9uczp1fT10aGlzLl9nZXRTaGFyZWRPcHRpb25zKGUsbik7Zm9yKGxldCBmPWU7ZjxlK2k7ZisrKXtjb25zdCBlPXRoaXMuZ2V0UGFyc2VkKGYpLGk9b3x8cyhlW3IuYXhpc10pP3tiYXNlOmwsaGVhZDpsfTp0aGlzLl9jYWxjdWxhdGVCYXJWYWx1ZVBpeGVscyhmKSxnPXRoaXMuX2NhbGN1bGF0ZUJhckluZGV4UGl4ZWxzKGYsYykscD0oZS5fc3RhY2tzfHx7fSlbci5heGlzXSxtPXtob3Jpem9udGFsOmgsYmFzZTppLmJhc2UsZW5hYmxlQm9yZGVyUmFkaXVzOiFwfHxDbihlLl9jdXN0b20pfHxhPT09cC5fdG9wfHxhPT09cC5fYm90dG9tLHg6aD9pLmhlYWQ6Zy5jZW50ZXIseTpoP2cuY2VudGVyOmkuaGVhZCxoZWlnaHQ6aD9nLnNpemU6TWF0aC5hYnMoaS5zaXplKSx3aWR0aDpoP01hdGguYWJzKGkuc2l6ZSk6Zy5zaXplfTt1JiYobS5vcHRpb25zPWR8fHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhmLHRbZl0uYWN0aXZlPyJhY3RpdmUiOm4pKTtjb25zdCBiPW0ub3B0aW9uc3x8dFtmXS5vcHRpb25zO09uKG0sYixwLGEpLExuKG0sYixjLnJhdGlvKSx0aGlzLnVwZGF0ZUVsZW1lbnQodFtmXSxmLG0sbil9fV9nZXRTdGFja3ModCxlKXtjb25zdHtpU2NhbGU6aX09dGhpcy5fY2FjaGVkTWV0YSxuPWkuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXModGhpcy5fdHlwZSkuZmlsdGVyKHQ9PnQuY29udHJvbGxlci5vcHRpb25zLmdyb3VwZWQpLG89aS5vcHRpb25zLnN0YWNrZWQsYT1bXSxyPXQ9Pntjb25zdCBpPXQuY29udHJvbGxlci5nZXRQYXJzZWQoZSksbj1pJiZpW3QudlNjYWxlLmF4aXNdO2lmKHMobil8fGlzTmFOKG4pKXJldHVybiEwfTtmb3IoY29uc3QgaSBvZiBuKWlmKCh2b2lkIDA9PT1lfHwhcihpKSkmJigoITE9PT1vfHwtMT09PWEuaW5kZXhPZihpLnN0YWNrKXx8dm9pZCAwPT09byYmdm9pZCAwPT09aS5zdGFjaykmJmEucHVzaChpLnN0YWNrKSxpLmluZGV4PT09dCkpYnJlYWs7cmV0dXJuIGEubGVuZ3RofHxhLnB1c2godm9pZCAwKSxhfV9nZXRTdGFja0NvdW50KHQpe3JldHVybiB0aGlzLl9nZXRTdGFja3Modm9pZCAwLHQpLmxlbmd0aH1fZ2V0U3RhY2tJbmRleCh0LGUsaSl7Y29uc3Qgcz10aGlzLl9nZXRTdGFja3ModCxpKSxuPXZvaWQgMCE9PWU/cy5pbmRleE9mKGUpOi0xO3JldHVybi0xPT09bj9zLmxlbmd0aC0xOm59X2dldFJ1bGVyKCl7Y29uc3QgdD10aGlzLm9wdGlvbnMsZT10aGlzLl9jYWNoZWRNZXRhLGk9ZS5pU2NhbGUscz1bXTtsZXQgbixvO2ZvcihuPTAsbz1lLmRhdGEubGVuZ3RoO248bzsrK24pcy5wdXNoKGkuZ2V0UGl4ZWxGb3JWYWx1ZSh0aGlzLmdldFBhcnNlZChuKVtpLmF4aXNdLG4pKTtjb25zdCBhPXQuYmFyVGhpY2tuZXNzO3JldHVybnttaW46YXx8U24oZSkscGl4ZWxzOnMsc3RhcnQ6aS5fc3RhcnRQaXhlbCxlbmQ6aS5fZW5kUGl4ZWwsc3RhY2tDb3VudDp0aGlzLl9nZXRTdGFja0NvdW50KCksc2NhbGU6aSxncm91cGVkOnQuZ3JvdXBlZCxyYXRpbzphPzE6dC5jYXRlZ29yeVBlcmNlbnRhZ2UqdC5iYXJQZXJjZW50YWdlfX1fY2FsY3VsYXRlQmFyVmFsdWVQaXhlbHModCl7Y29uc3R7X2NhY2hlZE1ldGE6e3ZTY2FsZTplLF9zdGFja2VkOmksaW5kZXg6bn0sb3B0aW9uczp7YmFzZTpvLG1pbkJhckxlbmd0aDphfX09dGhpcyxyPW98fDAsbD10aGlzLmdldFBhcnNlZCh0KSxoPWwuX2N1c3RvbSxjPUNuKGgpO2xldCBkLHUsZj1sW2UuYXhpc10sZz0wLHA9aT90aGlzLmFwcGx5U3RhY2soZSxsLGkpOmY7cCE9PWYmJihnPXAtZixwPWYpLGMmJihmPWguYmFyU3RhcnQscD1oLmJhckVuZC1oLmJhclN0YXJ0LDAhPT1mJiZGKGYpIT09RihoLmJhckVuZCkmJihnPTApLGcrPWYpO2NvbnN0IG09cyhvKXx8Yz9nOm87bGV0IGI9ZS5nZXRQaXhlbEZvclZhbHVlKG0pO2lmKGQ9dGhpcy5jaGFydC5nZXREYXRhVmlzaWJpbGl0eSh0KT9lLmdldFBpeGVsRm9yVmFsdWUoZytwKTpiLHU9ZC1iLE1hdGguYWJzKHUpPGEpe3U9ZnVuY3Rpb24odCxlLGkpe3JldHVybiAwIT09dD9GKHQpOihlLmlzSG9yaXpvbnRhbCgpPzE6LTEpKihlLm1pbj49aT8xOi0xKX0odSxlLHIpKmEsZj09PXImJihiLT11LzIpO2NvbnN0IHQ9ZS5nZXRQaXhlbEZvckRlY2ltYWwoMCkscz1lLmdldFBpeGVsRm9yRGVjaW1hbCgxKSxvPU1hdGgubWluKHQscyksaD1NYXRoLm1heCh0LHMpO2I9TWF0aC5tYXgoTWF0aC5taW4oYixoKSxvKSxkPWIrdSxpJiYhYyYmKGwuX3N0YWNrc1tlLmF4aXNdLl92aXN1YWxWYWx1ZXNbbl09ZS5nZXRWYWx1ZUZvclBpeGVsKGQpLWUuZ2V0VmFsdWVGb3JQaXhlbChiKSl9aWYoYj09PWUuZ2V0UGl4ZWxGb3JWYWx1ZShyKSl7Y29uc3QgdD1GKHUpKmUuZ2V0TGluZVdpZHRoRm9yVmFsdWUocikvMjtiKz10LHUtPXR9cmV0dXJue3NpemU6dSxiYXNlOmIsaGVhZDpkLGNlbnRlcjpkK3UvMn19X2NhbGN1bGF0ZUJhckluZGV4UGl4ZWxzKHQsZSl7Y29uc3QgaT1lLnNjYWxlLG49dGhpcy5vcHRpb25zLG89bi5za2lwTnVsbCxhPWwobi5tYXhCYXJUaGlja25lc3MsMS8wKTtsZXQgcixoO2lmKGUuZ3JvdXBlZCl7Y29uc3QgaT1vP3RoaXMuX2dldFN0YWNrQ291bnQodCk6ZS5zdGFja0NvdW50LGw9ImZsZXgiPT09bi5iYXJUaGlja25lc3M/ZnVuY3Rpb24odCxlLGkscyl7Y29uc3Qgbj1lLnBpeGVscyxvPW5bdF07bGV0IGE9dD4wP25bdC0xXTpudWxsLHI9dDxuLmxlbmd0aC0xP25bdCsxXTpudWxsO2NvbnN0IGw9aS5jYXRlZ29yeVBlcmNlbnRhZ2U7bnVsbD09PWEmJihhPW8tKG51bGw9PT1yP2UuZW5kLWUuc3RhcnQ6ci1vKSksbnVsbD09PXImJihyPW8rby1hKTtjb25zdCBoPW8tKG8tTWF0aC5taW4oYSxyKSkvMipsO3JldHVybntjaHVuazpNYXRoLmFicyhyLWEpLzIqbC9zLHJhdGlvOmkuYmFyUGVyY2VudGFnZSxzdGFydDpofX0odCxlLG4saSk6ZnVuY3Rpb24odCxlLGksbil7Y29uc3Qgbz1pLmJhclRoaWNrbmVzcztsZXQgYSxyO3JldHVybiBzKG8pPyhhPWUubWluKmkuY2F0ZWdvcnlQZXJjZW50YWdlLHI9aS5iYXJQZXJjZW50YWdlKTooYT1vKm4scj0xKSx7Y2h1bms6YS9uLHJhdGlvOnIsc3RhcnQ6ZS5waXhlbHNbdF0tYS8yfX0odCxlLG4saSksYz10aGlzLl9nZXRTdGFja0luZGV4KHRoaXMuaW5kZXgsdGhpcy5fY2FjaGVkTWV0YS5zdGFjayxvP3Q6dm9pZCAwKTtyPWwuc3RhcnQrbC5jaHVuaypjK2wuY2h1bmsvMixoPU1hdGgubWluKGEsbC5jaHVuaypsLnJhdGlvKX1lbHNlIHI9aS5nZXRQaXhlbEZvclZhbHVlKHRoaXMuZ2V0UGFyc2VkKHQpW2kuYXhpc10sdCksaD1NYXRoLm1pbihhLGUubWluKmUucmF0aW8pO3JldHVybntiYXNlOnItaC8yLGhlYWQ6citoLzIsY2VudGVyOnIsc2l6ZTpofX1kcmF3KCl7Y29uc3QgdD10aGlzLl9jYWNoZWRNZXRhLGU9dC52U2NhbGUsaT10LmRhdGEscz1pLmxlbmd0aDtsZXQgbj0wO2Zvcig7bjxzOysrbiludWxsIT09dGhpcy5nZXRQYXJzZWQobilbZS5heGlzXSYmaVtuXS5kcmF3KHRoaXMuX2N0eCl9fSxCdWJibGVDb250cm9sbGVyOmNsYXNzIGV4dGVuZHMgRXN7c3RhdGljIGlkPSJidWJibGUiO3N0YXRpYyBkZWZhdWx0cz17ZGF0YXNldEVsZW1lbnRUeXBlOiExLGRhdGFFbGVtZW50VHlwZToicG9pbnQiLGFuaW1hdGlvbnM6e251bWJlcnM6e3R5cGU6Im51bWJlciIscHJvcGVydGllczpbIngiLCJ5IiwiYm9yZGVyV2lkdGgiLCJyYWRpdXMiXX19fTtzdGF0aWMgb3ZlcnJpZGVzPXtzY2FsZXM6e3g6e3R5cGU6ImxpbmVhciJ9LHk6e3R5cGU6ImxpbmVhciJ9fX07aW5pdGlhbGl6ZSgpe3RoaXMuZW5hYmxlT3B0aW9uU2hhcmluZz0hMCxzdXBlci5pbml0aWFsaXplKCl9cGFyc2VQcmltaXRpdmVEYXRhKHQsZSxpLHMpe2NvbnN0IG49c3VwZXIucGFyc2VQcmltaXRpdmVEYXRhKHQsZSxpLHMpO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKW5bdF0uX2N1c3RvbT10aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnModCtpKS5yYWRpdXM7cmV0dXJuIG59cGFyc2VBcnJheURhdGEodCxlLGkscyl7Y29uc3Qgbj1zdXBlci5wYXJzZUFycmF5RGF0YSh0LGUsaSxzKTtmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKyl7Y29uc3Qgcz1lW2krdF07blt0XS5fY3VzdG9tPWwoc1syXSx0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnModCtpKS5yYWRpdXMpfXJldHVybiBufXBhcnNlT2JqZWN0RGF0YSh0LGUsaSxzKXtjb25zdCBuPXN1cGVyLnBhcnNlT2JqZWN0RGF0YSh0LGUsaSxzKTtmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKyl7Y29uc3Qgcz1lW2krdF07blt0XS5fY3VzdG9tPWwocyYmcy5yJiYrcy5yLHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyh0K2kpLnJhZGl1cyl9cmV0dXJuIG59Z2V0TWF4T3ZlcmZsb3coKXtjb25zdCB0PXRoaXMuX2NhY2hlZE1ldGEuZGF0YTtsZXQgZT0wO2ZvcihsZXQgaT10Lmxlbmd0aC0xO2k+PTA7LS1pKWU9TWF0aC5tYXgoZSx0W2ldLnNpemUodGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGkpKS8yKTtyZXR1cm4gZT4wJiZlfWdldExhYmVsQW5kVmFsdWUodCl7Y29uc3QgZT10aGlzLl9jYWNoZWRNZXRhLGk9dGhpcy5jaGFydC5kYXRhLmxhYmVsc3x8W10se3hTY2FsZTpzLHlTY2FsZTpufT1lLG89dGhpcy5nZXRQYXJzZWQodCksYT1zLmdldExhYmVsRm9yVmFsdWUoby54KSxyPW4uZ2V0TGFiZWxGb3JWYWx1ZShvLnkpLGw9by5fY3VzdG9tO3JldHVybntsYWJlbDppW3RdfHwiIix2YWx1ZToiKCIrYSsiLCAiK3IrKGw/IiwgIitsOiIiKSsiKSJ9fXVwZGF0ZSh0KXtjb25zdCBlPXRoaXMuX2NhY2hlZE1ldGEuZGF0YTt0aGlzLnVwZGF0ZUVsZW1lbnRzKGUsMCxlLmxlbmd0aCx0KX11cGRhdGVFbGVtZW50cyh0LGUsaSxzKXtjb25zdCBuPSJyZXNldCI9PT1zLHtpU2NhbGU6byx2U2NhbGU6YX09dGhpcy5fY2FjaGVkTWV0YSx7c2hhcmVkT3B0aW9uczpyLGluY2x1ZGVPcHRpb25zOmx9PXRoaXMuX2dldFNoYXJlZE9wdGlvbnMoZSxzKSxoPW8uYXhpcyxjPWEuYXhpcztmb3IobGV0IGQ9ZTtkPGUraTtkKyspe2NvbnN0IGU9dFtkXSxpPSFuJiZ0aGlzLmdldFBhcnNlZChkKSx1PXt9LGY9dVtoXT1uP28uZ2V0UGl4ZWxGb3JEZWNpbWFsKC41KTpvLmdldFBpeGVsRm9yVmFsdWUoaVtoXSksZz11W2NdPW4/YS5nZXRCYXNlUGl4ZWwoKTphLmdldFBpeGVsRm9yVmFsdWUoaVtjXSk7dS5za2lwPWlzTmFOKGYpfHxpc05hTihnKSxsJiYodS5vcHRpb25zPXJ8fHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhkLGUuYWN0aXZlPyJhY3RpdmUiOnMpLG4mJih1Lm9wdGlvbnMucmFkaXVzPTApKSx0aGlzLnVwZGF0ZUVsZW1lbnQoZSxkLHUscyl9fXJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnModCxlKXtjb25zdCBpPXRoaXMuZ2V0UGFyc2VkKHQpO2xldCBzPXN1cGVyLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnModCxlKTtzLiRzaGFyZWQmJihzPU9iamVjdC5hc3NpZ24oe30scyx7JHNoYXJlZDohMX0pKTtjb25zdCBuPXMucmFkaXVzO3JldHVybiJhY3RpdmUiIT09ZSYmKHMucmFkaXVzPTApLHMucmFkaXVzKz1sKGkmJmkuX2N1c3RvbSxuKSxzfX0sRG91Z2hudXRDb250cm9sbGVyOkVuLExpbmVDb250cm9sbGVyOmNsYXNzIGV4dGVuZHMgRXN7c3RhdGljIGlkPSJsaW5lIjtzdGF0aWMgZGVmYXVsdHM9e2RhdGFzZXRFbGVtZW50VHlwZToibGluZSIsZGF0YUVsZW1lbnRUeXBlOiJwb2ludCIsc2hvd0xpbmU6ITAsc3BhbkdhcHM6ITF9O3N0YXRpYyBvdmVycmlkZXM9e3NjYWxlczp7X2luZGV4Xzp7dHlwZToiY2F0ZWdvcnkifSxfdmFsdWVfOnt0eXBlOiJsaW5lYXIifX19O2luaXRpYWxpemUoKXt0aGlzLmVuYWJsZU9wdGlvblNoYXJpbmc9ITAsdGhpcy5zdXBwb3J0c0RlY2ltYXRpb249ITAsc3VwZXIuaW5pdGlhbGl6ZSgpfXVwZGF0ZSh0KXtjb25zdCBlPXRoaXMuX2NhY2hlZE1ldGEse2RhdGFzZXQ6aSxkYXRhOnM9W10sX2RhdGFzZXQ6bn09ZSxvPXRoaXMuY2hhcnQuX2FuaW1hdGlvbnNEaXNhYmxlZDtsZXR7c3RhcnQ6YSxjb3VudDpyfT1wdChlLHMsbyk7dGhpcy5fZHJhd1N0YXJ0PWEsdGhpcy5fZHJhd0NvdW50PXIsbXQoZSkmJihhPTAscj1zLmxlbmd0aCksaS5fY2hhcnQ9dGhpcy5jaGFydCxpLl9kYXRhc2V0SW5kZXg9dGhpcy5pbmRleCxpLl9kZWNpbWF0ZWQ9ISFuLl9kZWNpbWF0ZWQsaS5wb2ludHM9cztjb25zdCBsPXRoaXMucmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyh0KTt0aGlzLm9wdGlvbnMuc2hvd0xpbmV8fChsLmJvcmRlcldpZHRoPTApLGwuc2VnbWVudD10aGlzLm9wdGlvbnMuc2VnbWVudCx0aGlzLnVwZGF0ZUVsZW1lbnQoaSx2b2lkIDAse2FuaW1hdGVkOiFvLG9wdGlvbnM6bH0sdCksdGhpcy51cGRhdGVFbGVtZW50cyhzLGEscix0KX11cGRhdGVFbGVtZW50cyh0LGUsaSxuKXtjb25zdCBvPSJyZXNldCI9PT1uLHtpU2NhbGU6YSx2U2NhbGU6cixfc3RhY2tlZDpsLF9kYXRhc2V0Omh9PXRoaXMuX2NhY2hlZE1ldGEse3NoYXJlZE9wdGlvbnM6YyxpbmNsdWRlT3B0aW9uczpkfT10aGlzLl9nZXRTaGFyZWRPcHRpb25zKGUsbiksdT1hLmF4aXMsZj1yLmF4aXMse3NwYW5HYXBzOmcsc2VnbWVudDpwfT10aGlzLm9wdGlvbnMsbT1OKGcpP2c6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGI9dGhpcy5jaGFydC5fYW5pbWF0aW9uc0Rpc2FibGVkfHxvfHwibm9uZSI9PT1uLHg9ZStpLF89dC5sZW5ndGg7bGV0IHk9ZT4wJiZ0aGlzLmdldFBhcnNlZChlLTEpO2ZvcihsZXQgaT0wO2k8XzsrK2kpe2NvbnN0IGc9dFtpXSxfPWI/Zzp7fTtpZihpPGV8fGk+PXgpe18uc2tpcD0hMDtjb250aW51ZX1jb25zdCB2PXRoaXMuZ2V0UGFyc2VkKGkpLE09cyh2W2ZdKSx3PV9bdV09YS5nZXRQaXhlbEZvclZhbHVlKHZbdV0saSksaz1fW2ZdPW98fE0/ci5nZXRCYXNlUGl4ZWwoKTpyLmdldFBpeGVsRm9yVmFsdWUobD90aGlzLmFwcGx5U3RhY2socix2LGwpOnZbZl0saSk7Xy5za2lwPWlzTmFOKHcpfHxpc05hTihrKXx8TSxfLnN0b3A9aT4wJiZNYXRoLmFicyh2W3VdLXlbdV0pPm0scCYmKF8ucGFyc2VkPXYsXy5yYXc9aC5kYXRhW2ldKSxkJiYoXy5vcHRpb25zPWN8fHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpLGcuYWN0aXZlPyJhY3RpdmUiOm4pKSxifHx0aGlzLnVwZGF0ZUVsZW1lbnQoZyxpLF8sbikseT12fX1nZXRNYXhPdmVyZmxvdygpe2NvbnN0IHQ9dGhpcy5fY2FjaGVkTWV0YSxlPXQuZGF0YXNldCxpPWUub3B0aW9ucyYmZS5vcHRpb25zLmJvcmRlcldpZHRofHwwLHM9dC5kYXRhfHxbXTtpZighcy5sZW5ndGgpcmV0dXJuIGk7Y29uc3Qgbj1zWzBdLnNpemUodGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKDApKSxvPXNbcy5sZW5ndGgtMV0uc2l6ZSh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMocy5sZW5ndGgtMSkpO3JldHVybiBNYXRoLm1heChpLG4sbykvMn1kcmF3KCl7Y29uc3QgdD10aGlzLl9jYWNoZWRNZXRhO3QuZGF0YXNldC51cGRhdGVDb250cm9sUG9pbnRzKHRoaXMuY2hhcnQuY2hhcnRBcmVhLHQuaVNjYWxlLmF4aXMpLHN1cGVyLmRyYXcoKX19LFBpZUNvbnRyb2xsZXI6Y2xhc3MgZXh0ZW5kcyBFbntzdGF0aWMgaWQ9InBpZSI7c3RhdGljIGRlZmF1bHRzPXtjdXRvdXQ6MCxyb3RhdGlvbjowLGNpcmN1bWZlcmVuY2U6MzYwLHJhZGl1czoiMTAwJSJ9fSxQb2xhckFyZWFDb250cm9sbGVyOlJuLFJhZGFyQ29udHJvbGxlcjpjbGFzcyBleHRlbmRzIEVze3N0YXRpYyBpZD0icmFkYXIiO3N0YXRpYyBkZWZhdWx0cz17ZGF0YXNldEVsZW1lbnRUeXBlOiJsaW5lIixkYXRhRWxlbWVudFR5cGU6InBvaW50IixpbmRleEF4aXM6InIiLHNob3dMaW5lOiEwLGVsZW1lbnRzOntsaW5lOntmaWxsOiJzdGFydCJ9fX07c3RhdGljIG92ZXJyaWRlcz17YXNwZWN0UmF0aW86MSxzY2FsZXM6e3I6e3R5cGU6InJhZGlhbExpbmVhciJ9fX07Z2V0TGFiZWxBbmRWYWx1ZSh0KXtjb25zdCBlPXRoaXMuX2NhY2hlZE1ldGEudlNjYWxlLGk9dGhpcy5nZXRQYXJzZWQodCk7cmV0dXJue2xhYmVsOmUuZ2V0TGFiZWxzKClbdF0sdmFsdWU6IiIrZS5nZXRMYWJlbEZvclZhbHVlKGlbZS5heGlzXSl9fXBhcnNlT2JqZWN0RGF0YSh0LGUsaSxzKXtyZXR1cm4gR2UuYmluZCh0aGlzKSh0LGUsaSxzKX11cGRhdGUodCl7Y29uc3QgZT10aGlzLl9jYWNoZWRNZXRhLGk9ZS5kYXRhc2V0LHM9ZS5kYXRhfHxbXSxuPWUuaVNjYWxlLmdldExhYmVscygpO2lmKGkucG9pbnRzPXMsInJlc2l6ZSIhPT10KXtjb25zdCBlPXRoaXMucmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyh0KTt0aGlzLm9wdGlvbnMuc2hvd0xpbmV8fChlLmJvcmRlcldpZHRoPTApO2NvbnN0IG89e19sb29wOiEwLF9mdWxsTG9vcDpuLmxlbmd0aD09PXMubGVuZ3RoLG9wdGlvbnM6ZX07dGhpcy51cGRhdGVFbGVtZW50KGksdm9pZCAwLG8sdCl9dGhpcy51cGRhdGVFbGVtZW50cyhzLDAscy5sZW5ndGgsdCl9dXBkYXRlRWxlbWVudHModCxlLGkscyl7Y29uc3Qgbj10aGlzLl9jYWNoZWRNZXRhLnJTY2FsZSxvPSJyZXNldCI9PT1zO2ZvcihsZXQgYT1lO2E8ZStpO2ErKyl7Y29uc3QgZT10W2FdLGk9dGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGEsZS5hY3RpdmU/ImFjdGl2ZSI6cykscj1uLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZShhLHRoaXMuZ2V0UGFyc2VkKGEpLnIpLGw9bz9uLnhDZW50ZXI6ci54LGg9bz9uLnlDZW50ZXI6ci55LGM9e3g6bCx5OmgsYW5nbGU6ci5hbmdsZSxza2lwOmlzTmFOKGwpfHxpc05hTihoKSxvcHRpb25zOml9O3RoaXMudXBkYXRlRWxlbWVudChlLGEsYyxzKX19fSxTY2F0dGVyQ29udHJvbGxlcjpjbGFzcyBleHRlbmRzIEVze3N0YXRpYyBpZD0ic2NhdHRlciI7c3RhdGljIGRlZmF1bHRzPXtkYXRhc2V0RWxlbWVudFR5cGU6ITEsZGF0YUVsZW1lbnRUeXBlOiJwb2ludCIsc2hvd0xpbmU6ITEsZmlsbDohMX07c3RhdGljIG92ZXJyaWRlcz17aW50ZXJhY3Rpb246e21vZGU6InBvaW50In0sc2NhbGVzOnt4Ont0eXBlOiJsaW5lYXIifSx5Ont0eXBlOiJsaW5lYXIifX19O2dldExhYmVsQW5kVmFsdWUodCl7Y29uc3QgZT10aGlzLl9jYWNoZWRNZXRhLGk9dGhpcy5jaGFydC5kYXRhLmxhYmVsc3x8W10se3hTY2FsZTpzLHlTY2FsZTpufT1lLG89dGhpcy5nZXRQYXJzZWQodCksYT1zLmdldExhYmVsRm9yVmFsdWUoby54KSxyPW4uZ2V0TGFiZWxGb3JWYWx1ZShvLnkpO3JldHVybntsYWJlbDppW3RdfHwiIix2YWx1ZToiKCIrYSsiLCAiK3IrIikifX11cGRhdGUodCl7Y29uc3QgZT10aGlzLl9jYWNoZWRNZXRhLHtkYXRhOmk9W119PWUscz10aGlzLmNoYXJ0Ll9hbmltYXRpb25zRGlzYWJsZWQ7bGV0e3N0YXJ0Om4sY291bnQ6b309cHQoZSxpLHMpO2lmKHRoaXMuX2RyYXdTdGFydD1uLHRoaXMuX2RyYXdDb3VudD1vLG10KGUpJiYobj0wLG89aS5sZW5ndGgpLHRoaXMub3B0aW9ucy5zaG93TGluZSl7dGhpcy5kYXRhc2V0RWxlbWVudFR5cGV8fHRoaXMuYWRkRWxlbWVudHMoKTtjb25zdHtkYXRhc2V0Om4sX2RhdGFzZXQ6b309ZTtuLl9jaGFydD10aGlzLmNoYXJ0LG4uX2RhdGFzZXRJbmRleD10aGlzLmluZGV4LG4uX2RlY2ltYXRlZD0hIW8uX2RlY2ltYXRlZCxuLnBvaW50cz1pO2NvbnN0IGE9dGhpcy5yZXNvbHZlRGF0YXNldEVsZW1lbnRPcHRpb25zKHQpO2Euc2VnbWVudD10aGlzLm9wdGlvbnMuc2VnbWVudCx0aGlzLnVwZGF0ZUVsZW1lbnQobix2b2lkIDAse2FuaW1hdGVkOiFzLG9wdGlvbnM6YX0sdCl9ZWxzZSB0aGlzLmRhdGFzZXRFbGVtZW50VHlwZSYmKGRlbGV0ZSBlLmRhdGFzZXQsdGhpcy5kYXRhc2V0RWxlbWVudFR5cGU9ITEpO3RoaXMudXBkYXRlRWxlbWVudHMoaSxuLG8sdCl9YWRkRWxlbWVudHMoKXtjb25zdHtzaG93TGluZTp0fT10aGlzLm9wdGlvbnM7IXRoaXMuZGF0YXNldEVsZW1lbnRUeXBlJiZ0JiYodGhpcy5kYXRhc2V0RWxlbWVudFR5cGU9dGhpcy5jaGFydC5yZWdpc3RyeS5nZXRFbGVtZW50KCJsaW5lIikpLHN1cGVyLmFkZEVsZW1lbnRzKCl9dXBkYXRlRWxlbWVudHModCxlLGksbil7Y29uc3Qgbz0icmVzZXQiPT09bix7aVNjYWxlOmEsdlNjYWxlOnIsX3N0YWNrZWQ6bCxfZGF0YXNldDpofT10aGlzLl9jYWNoZWRNZXRhLGM9dGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGUsbiksZD10aGlzLmdldFNoYXJlZE9wdGlvbnMoYyksdT10aGlzLmluY2x1ZGVPcHRpb25zKG4sZCksZj1hLmF4aXMsZz1yLmF4aXMse3NwYW5HYXBzOnAsc2VnbWVudDptfT10aGlzLm9wdGlvbnMsYj1OKHApP3A6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLHg9dGhpcy5jaGFydC5fYW5pbWF0aW9uc0Rpc2FibGVkfHxvfHwibm9uZSI9PT1uO2xldCBfPWU+MCYmdGhpcy5nZXRQYXJzZWQoZS0xKTtmb3IobGV0IGM9ZTtjPGUraTsrK2Mpe2NvbnN0IGU9dFtjXSxpPXRoaXMuZ2V0UGFyc2VkKGMpLHA9eD9lOnt9LHk9cyhpW2ddKSx2PXBbZl09YS5nZXRQaXhlbEZvclZhbHVlKGlbZl0sYyksTT1wW2ddPW98fHk/ci5nZXRCYXNlUGl4ZWwoKTpyLmdldFBpeGVsRm9yVmFsdWUobD90aGlzLmFwcGx5U3RhY2socixpLGwpOmlbZ10sYyk7cC5za2lwPWlzTmFOKHYpfHxpc05hTihNKXx8eSxwLnN0b3A9Yz4wJiZNYXRoLmFicyhpW2ZdLV9bZl0pPmIsbSYmKHAucGFyc2VkPWkscC5yYXc9aC5kYXRhW2NdKSx1JiYocC5vcHRpb25zPWR8fHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhjLGUuYWN0aXZlPyJhY3RpdmUiOm4pKSx4fHx0aGlzLnVwZGF0ZUVsZW1lbnQoZSxjLHAsbiksXz1pfXRoaXMudXBkYXRlU2hhcmVkT3B0aW9ucyhkLG4sYyl9Z2V0TWF4T3ZlcmZsb3coKXtjb25zdCB0PXRoaXMuX2NhY2hlZE1ldGEsZT10LmRhdGF8fFtdO2lmKCF0aGlzLm9wdGlvbnMuc2hvd0xpbmUpe2xldCB0PTA7Zm9yKGxldCBpPWUubGVuZ3RoLTE7aT49MDstLWkpdD1NYXRoLm1heCh0LGVbaV0uc2l6ZSh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaSkpLzIpO3JldHVybiB0PjAmJnR9Y29uc3QgaT10LmRhdGFzZXQscz1pLm9wdGlvbnMmJmkub3B0aW9ucy5ib3JkZXJXaWR0aHx8MDtpZighZS5sZW5ndGgpcmV0dXJuIHM7Y29uc3Qgbj1lWzBdLnNpemUodGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKDApKSxvPWVbZS5sZW5ndGgtMV0uc2l6ZSh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoZS5sZW5ndGgtMSkpO3JldHVybiBNYXRoLm1heChzLG4sbykvMn19fSk7ZnVuY3Rpb24gem4odCxlLGkscyl7cmV0dXJue3g6aSt0Kk1hdGguY29zKGUpLHk6cyt0Kk1hdGguc2luKGUpfX1mdW5jdGlvbiBGbih0LGUsaSxzLG4sbyl7Y29uc3R7eDphLHk6cixzdGFydEFuZ2xlOmwscGl4ZWxNYXJnaW46aCxpbm5lclJhZGl1czpjfT1lLGQ9TWF0aC5tYXgoZS5vdXRlclJhZGl1cytzK2ktaCwwKSx1PWM+MD9jK3MraStoOjA7bGV0IGY9MDtjb25zdCBnPW4tbDtpZihzKXtjb25zdCB0PSgoYz4wP2MtczowKSsoZD4wP2QtczowKSkvMjtmPShnLSgwIT09dD9nKnQvKHQrcyk6ZykpLzJ9Y29uc3QgcD0oZy1NYXRoLm1heCguMDAxLGcqZC1pL0MpL2QpLzIsbT1sK3ArZixiPW4tcC1mLHtvdXRlclN0YXJ0Ongsb3V0ZXJFbmQ6Xyxpbm5lclN0YXJ0OnksaW5uZXJFbmQ6dn09ZnVuY3Rpb24odCxlLGkscyl7Y29uc3Qgbj1waSh0Lm9wdGlvbnMuYm9yZGVyUmFkaXVzLFsib3V0ZXJTdGFydCIsIm91dGVyRW5kIiwiaW5uZXJTdGFydCIsImlubmVyRW5kIl0pLG89KGktZSkvMixhPU1hdGgubWluKG8scyplLzIpLHI9dD0+e2NvbnN0IGU9KGktTWF0aC5taW4obyx0KSkqcy8yO3JldHVybiBKKHQsMCxNYXRoLm1pbihvLGUpKX07cmV0dXJue291dGVyU3RhcnQ6cihuLm91dGVyU3RhcnQpLG91dGVyRW5kOnIobi5vdXRlckVuZCksaW5uZXJTdGFydDpKKG4uaW5uZXJTdGFydCwwLGEpLGlubmVyRW5kOkoobi5pbm5lckVuZCwwLGEpfX0oZSx1LGQsYi1tKSxNPWQteCx3PWQtXyxrPW0reC9NLFM9Yi1fL3csUD11K3ksRD11K3YsTz1tK3kvUCxBPWItdi9EO2lmKHQuYmVnaW5QYXRoKCksbyl7Y29uc3QgZT0oaytTKS8yO2lmKHQuYXJjKGEscixkLGssZSksdC5hcmMoYSxyLGQsZSxTKSxfPjApe2NvbnN0IGU9em4odyxTLGEscik7dC5hcmMoZS54LGUueSxfLFMsYitFKX1jb25zdCBpPXpuKEQsYixhLHIpO2lmKHQubGluZVRvKGkueCxpLnkpLHY+MCl7Y29uc3QgZT16bihELEEsYSxyKTt0LmFyYyhlLngsZS55LHYsYitFLEErTWF0aC5QSSl9Y29uc3Qgcz0oYi12L3UrKG0reS91KSkvMjtpZih0LmFyYyhhLHIsdSxiLXYvdSxzLCEwKSx0LmFyYyhhLHIsdSxzLG0reS91LCEwKSx5PjApe2NvbnN0IGU9em4oUCxPLGEscik7dC5hcmMoZS54LGUueSx5LE8rTWF0aC5QSSxtLUUpfWNvbnN0IG49em4oTSxtLGEscik7aWYodC5saW5lVG8obi54LG4ueSkseD4wKXtjb25zdCBlPXpuKE0sayxhLHIpO3QuYXJjKGUueCxlLnkseCxtLUUsayl9fWVsc2V7dC5tb3ZlVG8oYSxyKTtjb25zdCBlPU1hdGguY29zKGspKmQrYSxpPU1hdGguc2luKGspKmQrcjt0LmxpbmVUbyhlLGkpO2NvbnN0IHM9TWF0aC5jb3MoUykqZCthLG49TWF0aC5zaW4oUykqZCtyO3QubGluZVRvKHMsbil9dC5jbG9zZVBhdGgoKX1mdW5jdGlvbiBWbih0LGUsaT1lKXt0LmxpbmVDYXA9bChpLmJvcmRlckNhcFN0eWxlLGUuYm9yZGVyQ2FwU3R5bGUpLHQuc2V0TGluZURhc2gobChpLmJvcmRlckRhc2gsZS5ib3JkZXJEYXNoKSksdC5saW5lRGFzaE9mZnNldD1sKGkuYm9yZGVyRGFzaE9mZnNldCxlLmJvcmRlckRhc2hPZmZzZXQpLHQubGluZUpvaW49bChpLmJvcmRlckpvaW5TdHlsZSxlLmJvcmRlckpvaW5TdHlsZSksdC5saW5lV2lkdGg9bChpLmJvcmRlcldpZHRoLGUuYm9yZGVyV2lkdGgpLHQuc3Ryb2tlU3R5bGU9bChpLmJvcmRlckNvbG9yLGUuYm9yZGVyQ29sb3IpfWZ1bmN0aW9uIEJuKHQsZSxpKXt0LmxpbmVUbyhpLngsaS55KX1mdW5jdGlvbiBXbih0LGUsaT17fSl7Y29uc3Qgcz10Lmxlbmd0aCx7c3RhcnQ6bj0wLGVuZDpvPXMtMX09aSx7c3RhcnQ6YSxlbmQ6cn09ZSxsPU1hdGgubWF4KG4sYSksaD1NYXRoLm1pbihvLHIpLGM9bjxhJiZvPGF8fG4+ciYmbz5yO3JldHVybntjb3VudDpzLHN0YXJ0OmwsbG9vcDplLmxvb3AsaWxlbjpoPGwmJiFjP3MraC1sOmgtbH19ZnVuY3Rpb24gTm4odCxlLGkscyl7Y29uc3R7cG9pbnRzOm4sb3B0aW9uczpvfT1lLHtjb3VudDphLHN0YXJ0OnIsbG9vcDpsLGlsZW46aH09V24obixpLHMpLGM9ZnVuY3Rpb24odCl7cmV0dXJuIHQuc3RlcHBlZD9UZTp0LnRlbnNpb258fCJtb25vdG9uZSI9PT10LmN1YmljSW50ZXJwb2xhdGlvbk1vZGU/TGU6Qm59KG8pO2xldCBkLHUsZix7bW92ZTpnPSEwLHJldmVyc2U6cH09c3x8e307Zm9yKGQ9MDtkPD1oOysrZCl1PW5bKHIrKHA/aC1kOmQpKSVhXSx1LnNraXB8fChnPyh0Lm1vdmVUbyh1LngsdS55KSxnPSExKTpjKHQsZix1LHAsby5zdGVwcGVkKSxmPXUpO3JldHVybiBsJiYodT1uWyhyKyhwP2g6MCkpJWFdLGModCxmLHUscCxvLnN0ZXBwZWQpKSwhIWx9ZnVuY3Rpb24gSG4odCxlLGkscyl7Y29uc3Qgbj1lLnBvaW50cyx7Y291bnQ6byxzdGFydDphLGlsZW46cn09V24obixpLHMpLHttb3ZlOmw9ITAscmV2ZXJzZTpofT1zfHx7fTtsZXQgYyxkLHUsZixnLHAsbT0wLGI9MDtjb25zdCB4PXQ9PihhKyhoP3ItdDp0KSklbyxfPSgpPT57ZiE9PWcmJih0LmxpbmVUbyhtLGcpLHQubGluZVRvKG0sZiksdC5saW5lVG8obSxwKSl9O2ZvcihsJiYoZD1uW3goMCldLHQubW92ZVRvKGQueCxkLnkpKSxjPTA7Yzw9cjsrK2Mpe2lmKGQ9blt4KGMpXSxkLnNraXApY29udGludWU7Y29uc3QgZT1kLngsaT1kLnkscz0wfGU7cz09PXU/KGk8Zj9mPWk6aT5nJiYoZz1pKSxtPShiKm0rZSkvKytiKTooXygpLHQubGluZVRvKGUsaSksdT1zLGI9MCxmPWc9aSkscD1pfV8oKX1mdW5jdGlvbiBqbih0KXtjb25zdCBlPXQub3B0aW9ucyxpPWUuYm9yZGVyRGFzaCYmZS5ib3JkZXJEYXNoLmxlbmd0aDtyZXR1cm4gdC5fZGVjaW1hdGVkfHx0Ll9sb29wfHxlLnRlbnNpb258fCJtb25vdG9uZSI9PT1lLmN1YmljSW50ZXJwb2xhdGlvbk1vZGV8fGUuc3RlcHBlZHx8aT9ObjpIbn1jb25zdCAkbj0iZnVuY3Rpb24iPT10eXBlb2YgUGF0aDJEO2NsYXNzIFluIGV4dGVuZHMgUnN7c3RhdGljIGlkPSJsaW5lIjtzdGF0aWMgZGVmYXVsdHM9e2JvcmRlckNhcFN0eWxlOiJidXR0Iixib3JkZXJEYXNoOltdLGJvcmRlckRhc2hPZmZzZXQ6MCxib3JkZXJKb2luU3R5bGU6Im1pdGVyIixib3JkZXJXaWR0aDozLGNhcEJlemllclBvaW50czohMCxjdWJpY0ludGVycG9sYXRpb25Nb2RlOiJkZWZhdWx0IixmaWxsOiExLHNwYW5HYXBzOiExLHN0ZXBwZWQ6ITEsdGVuc2lvbjowfTtzdGF0aWMgZGVmYXVsdFJvdXRlcz17YmFja2dyb3VuZENvbG9yOiJiYWNrZ3JvdW5kQ29sb3IiLGJvcmRlckNvbG9yOiJib3JkZXJDb2xvciJ9O3N0YXRpYyBkZXNjcmlwdG9ycz17X3NjcmlwdGFibGU6ITAsX2luZGV4YWJsZTp0PT4iYm9yZGVyRGFzaCIhPT10JiYiZmlsbCIhPT10fTtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuYW5pbWF0ZWQ9ITAsdGhpcy5vcHRpb25zPXZvaWQgMCx0aGlzLl9jaGFydD12b2lkIDAsdGhpcy5fbG9vcD12b2lkIDAsdGhpcy5fZnVsbExvb3A9dm9pZCAwLHRoaXMuX3BhdGg9dm9pZCAwLHRoaXMuX3BvaW50cz12b2lkIDAsdGhpcy5fc2VnbWVudHM9dm9pZCAwLHRoaXMuX2RlY2ltYXRlZD0hMSx0aGlzLl9wb2ludHNVcGRhdGVkPSExLHRoaXMuX2RhdGFzZXRJbmRleD12b2lkIDAsdCYmT2JqZWN0LmFzc2lnbih0aGlzLHQpfXVwZGF0ZUNvbnRyb2xQb2ludHModCxlKXtjb25zdCBpPXRoaXMub3B0aW9ucztpZigoaS50ZW5zaW9ufHwibW9ub3RvbmUiPT09aS5jdWJpY0ludGVycG9sYXRpb25Nb2RlKSYmIWkuc3RlcHBlZCYmIXRoaXMuX3BvaW50c1VwZGF0ZWQpe2NvbnN0IHM9aS5zcGFuR2Fwcz90aGlzLl9sb29wOnRoaXMuX2Z1bGxMb29wO3NpKHRoaXMuX3BvaW50cyxpLHQscyxlKSx0aGlzLl9wb2ludHNVcGRhdGVkPSEwfX1zZXQgcG9pbnRzKHQpe3RoaXMuX3BvaW50cz10LGRlbGV0ZSB0aGlzLl9zZWdtZW50cyxkZWxldGUgdGhpcy5fcGF0aCx0aGlzLl9wb2ludHNVcGRhdGVkPSExfWdldCBwb2ludHMoKXtyZXR1cm4gdGhpcy5fcG9pbnRzfWdldCBzZWdtZW50cygpe3JldHVybiB0aGlzLl9zZWdtZW50c3x8KHRoaXMuX3NlZ21lbnRzPUFpKHRoaXMsdGhpcy5vcHRpb25zLnNlZ21lbnQpKX1maXJzdCgpe2NvbnN0IHQ9dGhpcy5zZWdtZW50cyxlPXRoaXMucG9pbnRzO3JldHVybiB0Lmxlbmd0aCYmZVt0WzBdLnN0YXJ0XX1sYXN0KCl7Y29uc3QgdD10aGlzLnNlZ21lbnRzLGU9dGhpcy5wb2ludHMsaT10Lmxlbmd0aDtyZXR1cm4gaSYmZVt0W2ktMV0uZW5kXX1pbnRlcnBvbGF0ZSh0LGUpe2NvbnN0IGk9dGhpcy5vcHRpb25zLHM9dFtlXSxuPXRoaXMucG9pbnRzLG89T2kodGhpcyx7cHJvcGVydHk6ZSxzdGFydDpzLGVuZDpzfSk7aWYoIW8ubGVuZ3RoKXJldHVybjtjb25zdCBhPVtdLHI9ZnVuY3Rpb24odCl7cmV0dXJuIHQuc3RlcHBlZD9oaTp0LnRlbnNpb258fCJtb25vdG9uZSI9PT10LmN1YmljSW50ZXJwb2xhdGlvbk1vZGU/Y2k6bGl9KGkpO2xldCBsLGg7Zm9yKGw9MCxoPW8ubGVuZ3RoO2w8aDsrK2wpe2NvbnN0e3N0YXJ0OmgsZW5kOmN9PW9bbF0sZD1uW2hdLHU9bltjXTtpZihkPT09dSl7YS5wdXNoKGQpO2NvbnRpbnVlfWNvbnN0IGY9cihkLHUsTWF0aC5hYnMoKHMtZFtlXSkvKHVbZV0tZFtlXSkpLGkuc3RlcHBlZCk7ZltlXT10W2VdLGEucHVzaChmKX1yZXR1cm4gMT09PWEubGVuZ3RoP2FbMF06YX1wYXRoU2VnbWVudCh0LGUsaSl7cmV0dXJuIGpuKHRoaXMpKHQsdGhpcyxlLGkpfXBhdGgodCxlLGkpe2NvbnN0IHM9dGhpcy5zZWdtZW50cyxuPWpuKHRoaXMpO2xldCBvPXRoaXMuX2xvb3A7ZT1lfHwwLGk9aXx8dGhpcy5wb2ludHMubGVuZ3RoLWU7Zm9yKGNvbnN0IGEgb2YgcylvJj1uKHQsdGhpcyxhLHtzdGFydDplLGVuZDplK2ktMX0pO3JldHVybiEhb31kcmF3KHQsZSxpLHMpe2NvbnN0IG49dGhpcy5vcHRpb25zfHx7fTsodGhpcy5wb2ludHN8fFtdKS5sZW5ndGgmJm4uYm9yZGVyV2lkdGgmJih0LnNhdmUoKSxmdW5jdGlvbih0LGUsaSxzKXskbiYmIWUub3B0aW9ucy5zZWdtZW50P2Z1bmN0aW9uKHQsZSxpLHMpe2xldCBuPWUuX3BhdGg7bnx8KG49ZS5fcGF0aD1uZXcgUGF0aDJELGUucGF0aChuLGkscykmJm4uY2xvc2VQYXRoKCkpLFZuKHQsZS5vcHRpb25zKSx0LnN0cm9rZShuKX0odCxlLGkscyk6ZnVuY3Rpb24odCxlLGkscyl7Y29uc3R7c2VnbWVudHM6bixvcHRpb25zOm99PWUsYT1qbihlKTtmb3IoY29uc3QgciBvZiBuKVZuKHQsbyxyLnN0eWxlKSx0LmJlZ2luUGF0aCgpLGEodCxlLHIse3N0YXJ0OmksZW5kOmkrcy0xfSkmJnQuY2xvc2VQYXRoKCksdC5zdHJva2UoKX0odCxlLGkscyl9KHQsdGhpcyxpLHMpLHQucmVzdG9yZSgpKSx0aGlzLmFuaW1hdGVkJiYodGhpcy5fcG9pbnRzVXBkYXRlZD0hMSx0aGlzLl9wYXRoPXZvaWQgMCl9fWZ1bmN0aW9uIFVuKHQsZSxpLHMpe2NvbnN0IG49dC5vcHRpb25zLHtbaV06b309dC5nZXRQcm9wcyhbaV0scyk7cmV0dXJuIE1hdGguYWJzKGUtbyk8bi5yYWRpdXMrbi5oaXRSYWRpdXN9ZnVuY3Rpb24gWG4odCxlKXtjb25zdHt4OmkseTpzLGJhc2U6bix3aWR0aDpvLGhlaWdodDphfT10LmdldFByb3BzKFsieCIsInkiLCJiYXNlIiwid2lkdGgiLCJoZWlnaHQiXSxlKTtsZXQgcixsLGgsYyxkO3JldHVybiB0Lmhvcml6b250YWw/KGQ9YS8yLHI9TWF0aC5taW4oaSxuKSxsPU1hdGgubWF4KGksbiksaD1zLWQsYz1zK2QpOihkPW8vMixyPWktZCxsPWkrZCxoPU1hdGgubWluKHMsbiksYz1NYXRoLm1heChzLG4pKSx7bGVmdDpyLHRvcDpoLHJpZ2h0OmwsYm90dG9tOmN9fWZ1bmN0aW9uIHFuKHQsZSxpLHMpe3JldHVybiB0PzA6SihlLGkscyl9ZnVuY3Rpb24gS24odCl7Y29uc3QgZT1Ybih0KSxpPWUucmlnaHQtZS5sZWZ0LHM9ZS5ib3R0b20tZS50b3Asbj1mdW5jdGlvbih0LGUsaSl7Y29uc3Qgcz10Lm9wdGlvbnMuYm9yZGVyV2lkdGgsbj10LmJvcmRlclNraXBwZWQsbz1taShzKTtyZXR1cm57dDpxbihuLnRvcCxvLnRvcCwwLGkpLHI6cW4obi5yaWdodCxvLnJpZ2h0LDAsZSksYjpxbihuLmJvdHRvbSxvLmJvdHRvbSwwLGkpLGw6cW4obi5sZWZ0LG8ubGVmdCwwLGUpfX0odCxpLzIscy8yKSxhPWZ1bmN0aW9uKHQsZSxpKXtjb25zdHtlbmFibGVCb3JkZXJSYWRpdXM6c309dC5nZXRQcm9wcyhbImVuYWJsZUJvcmRlclJhZGl1cyJdKSxuPXQub3B0aW9ucy5ib3JkZXJSYWRpdXMsYT1iaShuKSxyPU1hdGgubWluKGUsaSksbD10LmJvcmRlclNraXBwZWQsaD1zfHxvKG4pO3JldHVybnt0b3BMZWZ0OnFuKCFofHxsLnRvcHx8bC5sZWZ0LGEudG9wTGVmdCwwLHIpLHRvcFJpZ2h0OnFuKCFofHxsLnRvcHx8bC5yaWdodCxhLnRvcFJpZ2h0LDAsciksYm90dG9tTGVmdDpxbighaHx8bC5ib3R0b218fGwubGVmdCxhLmJvdHRvbUxlZnQsMCxyKSxib3R0b21SaWdodDpxbighaHx8bC5ib3R0b218fGwucmlnaHQsYS5ib3R0b21SaWdodCwwLHIpfX0odCxpLzIscy8yKTtyZXR1cm57b3V0ZXI6e3g6ZS5sZWZ0LHk6ZS50b3AsdzppLGg6cyxyYWRpdXM6YX0saW5uZXI6e3g6ZS5sZWZ0K24ubCx5OmUudG9wK24udCx3Omktbi5sLW4ucixoOnMtbi50LW4uYixyYWRpdXM6e3RvcExlZnQ6TWF0aC5tYXgoMCxhLnRvcExlZnQtTWF0aC5tYXgobi50LG4ubCkpLHRvcFJpZ2h0Ok1hdGgubWF4KDAsYS50b3BSaWdodC1NYXRoLm1heChuLnQsbi5yKSksYm90dG9tTGVmdDpNYXRoLm1heCgwLGEuYm90dG9tTGVmdC1NYXRoLm1heChuLmIsbi5sKSksYm90dG9tUmlnaHQ6TWF0aC5tYXgoMCxhLmJvdHRvbVJpZ2h0LU1hdGgubWF4KG4uYixuLnIpKX19fX1mdW5jdGlvbiBHbih0LGUsaSxzKXtjb25zdCBuPW51bGw9PT1lLG89bnVsbD09PWksYT10JiYhKG4mJm8pJiZYbih0LHMpO3JldHVybiBhJiYobnx8dHQoZSxhLmxlZnQsYS5yaWdodCkpJiYob3x8dHQoaSxhLnRvcCxhLmJvdHRvbSkpfWZ1bmN0aW9uIFpuKHQsZSl7dC5yZWN0KGUueCxlLnksZS53LGUuaCl9ZnVuY3Rpb24gSm4odCxlLGk9e30pe2NvbnN0IHM9dC54IT09aS54Py1lOjAsbj10LnkhPT1pLnk/LWU6MCxvPSh0LngrdC53IT09aS54K2kudz9lOjApLXMsYT0odC55K3QuaCE9PWkueStpLmg/ZTowKS1uO3JldHVybnt4OnQueCtzLHk6dC55K24sdzp0LncrbyxoOnQuaCthLHJhZGl1czp0LnJhZGl1c319dmFyIFFuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEFyY0VsZW1lbnQ6Y2xhc3MgZXh0ZW5kcyBSc3tzdGF0aWMgaWQ9ImFyYyI7c3RhdGljIGRlZmF1bHRzPXtib3JkZXJBbGlnbjoiY2VudGVyIixib3JkZXJDb2xvcjoiI2ZmZiIsYm9yZGVyRGFzaDpbXSxib3JkZXJEYXNoT2Zmc2V0OjAsYm9yZGVySm9pblN0eWxlOnZvaWQgMCxib3JkZXJSYWRpdXM6MCxib3JkZXJXaWR0aDoyLG9mZnNldDowLHNwYWNpbmc6MCxhbmdsZTp2b2lkIDAsY2lyY3VsYXI6ITB9O3N0YXRpYyBkZWZhdWx0Um91dGVzPXtiYWNrZ3JvdW5kQ29sb3I6ImJhY2tncm91bmRDb2xvciJ9O3N0YXRpYyBkZXNjcmlwdG9ycz17X3NjcmlwdGFibGU6ITAsX2luZGV4YWJsZTp0PT4iYm9yZGVyRGFzaCIhPT10fTtjaXJjdW1mZXJlbmNlO2VuZEFuZ2xlO2Z1bGxDaXJjbGVzO2lubmVyUmFkaXVzO291dGVyUmFkaXVzO3BpeGVsTWFyZ2luO3N0YXJ0QW5nbGU7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLm9wdGlvbnM9dm9pZCAwLHRoaXMuY2lyY3VtZmVyZW5jZT12b2lkIDAsdGhpcy5zdGFydEFuZ2xlPXZvaWQgMCx0aGlzLmVuZEFuZ2xlPXZvaWQgMCx0aGlzLmlubmVyUmFkaXVzPXZvaWQgMCx0aGlzLm91dGVyUmFkaXVzPXZvaWQgMCx0aGlzLnBpeGVsTWFyZ2luPTAsdGhpcy5mdWxsQ2lyY2xlcz0wLHQmJk9iamVjdC5hc3NpZ24odGhpcyx0KX1pblJhbmdlKHQsZSxpKXtjb25zdCBzPXRoaXMuZ2V0UHJvcHMoWyJ4IiwieSJdLGkpLHthbmdsZTpuLGRpc3RhbmNlOm99PVgocyx7eDp0LHk6ZX0pLHtzdGFydEFuZ2xlOmEsZW5kQW5nbGU6cixpbm5lclJhZGl1czpoLG91dGVyUmFkaXVzOmMsY2lyY3VtZmVyZW5jZTpkfT10aGlzLmdldFByb3BzKFsic3RhcnRBbmdsZSIsImVuZEFuZ2xlIiwiaW5uZXJSYWRpdXMiLCJvdXRlclJhZGl1cyIsImNpcmN1bWZlcmVuY2UiXSxpKSx1PSh0aGlzLm9wdGlvbnMuc3BhY2luZyt0aGlzLm9wdGlvbnMuYm9yZGVyV2lkdGgpLzIsZj1sKGQsci1hKT49T3x8WihuLGEsciksZz10dChvLGgrdSxjK3UpO3JldHVybiBmJiZnfWdldENlbnRlclBvaW50KHQpe2NvbnN0e3g6ZSx5Omksc3RhcnRBbmdsZTpzLGVuZEFuZ2xlOm4saW5uZXJSYWRpdXM6byxvdXRlclJhZGl1czphfT10aGlzLmdldFByb3BzKFsieCIsInkiLCJzdGFydEFuZ2xlIiwiZW5kQW5nbGUiLCJpbm5lclJhZGl1cyIsIm91dGVyUmFkaXVzIl0sdCkse29mZnNldDpyLHNwYWNpbmc6bH09dGhpcy5vcHRpb25zLGg9KHMrbikvMixjPShvK2ErbCtyKS8yO3JldHVybnt4OmUrTWF0aC5jb3MoaCkqYyx5OmkrTWF0aC5zaW4oaCkqY319dG9vbHRpcFBvc2l0aW9uKHQpe3JldHVybiB0aGlzLmdldENlbnRlclBvaW50KHQpfWRyYXcodCl7Y29uc3R7b3B0aW9uczplLGNpcmN1bWZlcmVuY2U6aX09dGhpcyxzPShlLm9mZnNldHx8MCkvNCxuPShlLnNwYWNpbmd8fDApLzIsbz1lLmNpcmN1bGFyO2lmKHRoaXMucGl4ZWxNYXJnaW49ImlubmVyIj09PWUuYm9yZGVyQWxpZ24/LjMzOjAsdGhpcy5mdWxsQ2lyY2xlcz1pPk8/TWF0aC5mbG9vcihpL08pOjAsMD09PWl8fHRoaXMuaW5uZXJSYWRpdXM8MHx8dGhpcy5vdXRlclJhZGl1czwwKXJldHVybjt0LnNhdmUoKTtjb25zdCBhPSh0aGlzLnN0YXJ0QW5nbGUrdGhpcy5lbmRBbmdsZSkvMjt0LnRyYW5zbGF0ZShNYXRoLmNvcyhhKSpzLE1hdGguc2luKGEpKnMpO2NvbnN0IHI9cyooMS1NYXRoLnNpbihNYXRoLm1pbihDLGl8fDApKSk7dC5maWxsU3R5bGU9ZS5iYWNrZ3JvdW5kQ29sb3IsdC5zdHJva2VTdHlsZT1lLmJvcmRlckNvbG9yLGZ1bmN0aW9uKHQsZSxpLHMsbil7Y29uc3R7ZnVsbENpcmNsZXM6byxzdGFydEFuZ2xlOmEsY2lyY3VtZmVyZW5jZTpyfT1lO2xldCBsPWUuZW5kQW5nbGU7aWYobyl7Rm4odCxlLGkscyxsLG4pO2ZvcihsZXQgZT0wO2U8bzsrK2UpdC5maWxsKCk7aXNOYU4ocil8fChsPWErKHIlT3x8TykpfUZuKHQsZSxpLHMsbCxuKSx0LmZpbGwoKX0odCx0aGlzLHIsbixvKSxmdW5jdGlvbih0LGUsaSxzLG4pe2NvbnN0e2Z1bGxDaXJjbGVzOm8sc3RhcnRBbmdsZTphLGNpcmN1bWZlcmVuY2U6cixvcHRpb25zOmx9PWUse2JvcmRlcldpZHRoOmgsYm9yZGVySm9pblN0eWxlOmMsYm9yZGVyRGFzaDpkLGJvcmRlckRhc2hPZmZzZXQ6dX09bCxmPSJpbm5lciI9PT1sLmJvcmRlckFsaWduO2lmKCFoKXJldHVybjt0LnNldExpbmVEYXNoKGR8fFtdKSx0LmxpbmVEYXNoT2Zmc2V0PXUsZj8odC5saW5lV2lkdGg9MipoLHQubGluZUpvaW49Y3x8InJvdW5kIik6KHQubGluZVdpZHRoPWgsdC5saW5lSm9pbj1jfHwiYmV2ZWwiKTtsZXQgZz1lLmVuZEFuZ2xlO2lmKG8pe0ZuKHQsZSxpLHMsZyxuKTtmb3IobGV0IGU9MDtlPG87KytlKXQuc3Ryb2tlKCk7aXNOYU4ocil8fChnPWErKHIlT3x8TykpfWYmJmZ1bmN0aW9uKHQsZSxpKXtjb25zdHtzdGFydEFuZ2xlOnMscGl4ZWxNYXJnaW46bix4Om8seTphLG91dGVyUmFkaXVzOnIsaW5uZXJSYWRpdXM6bH09ZTtsZXQgaD1uL3I7dC5iZWdpblBhdGgoKSx0LmFyYyhvLGEscixzLWgsaStoKSxsPm4/KGg9bi9sLHQuYXJjKG8sYSxsLGkraCxzLWgsITApKTp0LmFyYyhvLGEsbixpK0Uscy1FKSx0LmNsb3NlUGF0aCgpLHQuY2xpcCgpfSh0LGUsZyksb3x8KEZuKHQsZSxpLHMsZyxuKSx0LnN0cm9rZSgpKX0odCx0aGlzLHIsbixvKSx0LnJlc3RvcmUoKX19LEJhckVsZW1lbnQ6Y2xhc3MgZXh0ZW5kcyBSc3tzdGF0aWMgaWQ9ImJhciI7c3RhdGljIGRlZmF1bHRzPXtib3JkZXJTa2lwcGVkOiJzdGFydCIsYm9yZGVyV2lkdGg6MCxib3JkZXJSYWRpdXM6MCxpbmZsYXRlQW1vdW50OiJhdXRvIixwb2ludFN0eWxlOnZvaWQgMH07c3RhdGljIGRlZmF1bHRSb3V0ZXM9e2JhY2tncm91bmRDb2xvcjoiYmFja2dyb3VuZENvbG9yIixib3JkZXJDb2xvcjoiYm9yZGVyQ29sb3IifTtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMub3B0aW9ucz12b2lkIDAsdGhpcy5ob3Jpem9udGFsPXZvaWQgMCx0aGlzLmJhc2U9dm9pZCAwLHRoaXMud2lkdGg9dm9pZCAwLHRoaXMuaGVpZ2h0PXZvaWQgMCx0aGlzLmluZmxhdGVBbW91bnQ9dm9pZCAwLHQmJk9iamVjdC5hc3NpZ24odGhpcyx0KX1kcmF3KHQpe2NvbnN0e2luZmxhdGVBbW91bnQ6ZSxvcHRpb25zOntib3JkZXJDb2xvcjppLGJhY2tncm91bmRDb2xvcjpzfX09dGhpcyx7aW5uZXI6bixvdXRlcjpvfT1Lbih0aGlzKSxhPShyPW8ucmFkaXVzKS50b3BMZWZ0fHxyLnRvcFJpZ2h0fHxyLmJvdHRvbUxlZnR8fHIuYm90dG9tUmlnaHQ/emU6Wm47dmFyIHI7dC5zYXZlKCksby53PT09bi53JiZvLmg9PT1uLmh8fCh0LmJlZ2luUGF0aCgpLGEodCxKbihvLGUsbikpLHQuY2xpcCgpLGEodCxKbihuLC1lLG8pKSx0LmZpbGxTdHlsZT1pLHQuZmlsbCgiZXZlbm9kZCIpKSx0LmJlZ2luUGF0aCgpLGEodCxKbihuLGUpKSx0LmZpbGxTdHlsZT1zLHQuZmlsbCgpLHQucmVzdG9yZSgpfWluUmFuZ2UodCxlLGkpe3JldHVybiBHbih0aGlzLHQsZSxpKX1pblhSYW5nZSh0LGUpe3JldHVybiBHbih0aGlzLHQsbnVsbCxlKX1pbllSYW5nZSh0LGUpe3JldHVybiBHbih0aGlzLG51bGwsdCxlKX1nZXRDZW50ZXJQb2ludCh0KXtjb25zdHt4OmUseTppLGJhc2U6cyxob3Jpem9udGFsOm59PXRoaXMuZ2V0UHJvcHMoWyJ4IiwieSIsImJhc2UiLCJob3Jpem9udGFsIl0sdCk7cmV0dXJue3g6bj8oZStzKS8yOmUseTpuP2k6KGkrcykvMn19Z2V0UmFuZ2UodCl7cmV0dXJuIngiPT09dD90aGlzLndpZHRoLzI6dGhpcy5oZWlnaHQvMn19LExpbmVFbGVtZW50OlluLFBvaW50RWxlbWVudDpjbGFzcyBleHRlbmRzIFJze3N0YXRpYyBpZD0icG9pbnQiO3BhcnNlZDtza2lwO3N0b3A7c3RhdGljIGRlZmF1bHRzPXtib3JkZXJXaWR0aDoxLGhpdFJhZGl1czoxLGhvdmVyQm9yZGVyV2lkdGg6MSxob3ZlclJhZGl1czo0LHBvaW50U3R5bGU6ImNpcmNsZSIscmFkaXVzOjMscm90YXRpb246MH07c3RhdGljIGRlZmF1bHRSb3V0ZXM9e2JhY2tncm91bmRDb2xvcjoiYmFja2dyb3VuZENvbG9yIixib3JkZXJDb2xvcjoiYm9yZGVyQ29sb3IifTtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMub3B0aW9ucz12b2lkIDAsdGhpcy5wYXJzZWQ9dm9pZCAwLHRoaXMuc2tpcD12b2lkIDAsdGhpcy5zdG9wPXZvaWQgMCx0JiZPYmplY3QuYXNzaWduKHRoaXMsdCl9aW5SYW5nZSh0LGUsaSl7Y29uc3Qgcz10aGlzLm9wdGlvbnMse3g6bix5Om99PXRoaXMuZ2V0UHJvcHMoWyJ4IiwieSJdLGkpO3JldHVybiBNYXRoLnBvdyh0LW4sMikrTWF0aC5wb3coZS1vLDIpPE1hdGgucG93KHMuaGl0UmFkaXVzK3MucmFkaXVzLDIpfWluWFJhbmdlKHQsZSl7cmV0dXJuIFVuKHRoaXMsdCwieCIsZSl9aW5ZUmFuZ2UodCxlKXtyZXR1cm4gVW4odGhpcyx0LCJ5IixlKX1nZXRDZW50ZXJQb2ludCh0KXtjb25zdHt4OmUseTppfT10aGlzLmdldFByb3BzKFsieCIsInkiXSx0KTtyZXR1cm57eDplLHk6aX19c2l6ZSh0KXtsZXQgZT0odD10fHx0aGlzLm9wdGlvbnN8fHt9KS5yYWRpdXN8fDA7cmV0dXJuIGU9TWF0aC5tYXgoZSxlJiZ0LmhvdmVyUmFkaXVzfHwwKSwyKihlKyhlJiZ0LmJvcmRlcldpZHRofHwwKSl9ZHJhdyh0LGUpe2NvbnN0IGk9dGhpcy5vcHRpb25zO3RoaXMuc2tpcHx8aS5yYWRpdXM8LjF8fCFDZSh0aGlzLGUsdGhpcy5zaXplKGkpLzIpfHwodC5zdHJva2VTdHlsZT1pLmJvcmRlckNvbG9yLHQubGluZVdpZHRoPWkuYm9yZGVyV2lkdGgsdC5maWxsU3R5bGU9aS5iYWNrZ3JvdW5kQ29sb3IsUGUodCxpLHRoaXMueCx0aGlzLnkpKX1nZXRSYW5nZSgpe2NvbnN0IHQ9dGhpcy5vcHRpb25zfHx7fTtyZXR1cm4gdC5yYWRpdXMrdC5oaXRSYWRpdXN9fX0pO2Z1bmN0aW9uIHRvKHQpe2NvbnN0IGU9dGhpcy5nZXRMYWJlbHMoKTtyZXR1cm4gdD49MCYmdDxlLmxlbmd0aD9lW3RdOnR9ZnVuY3Rpb24gZW8odCxlLHtob3Jpem9udGFsOmksbWluUm90YXRpb246c30pe2NvbnN0IG49JChzKSxvPShpP01hdGguc2luKG4pOk1hdGguY29zKG4pKXx8LjAwMSxhPS43NSplKigiIit0KS5sZW5ndGg7cmV0dXJuIE1hdGgubWluKGUvbyxhKX1jbGFzcyBpbyBleHRlbmRzICRze2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuc3RhcnQ9dm9pZCAwLHRoaXMuZW5kPXZvaWQgMCx0aGlzLl9zdGFydFZhbHVlPXZvaWQgMCx0aGlzLl9lbmRWYWx1ZT12b2lkIDAsdGhpcy5fdmFsdWVSYW5nZT0wfXBhcnNlKHQsZSl7cmV0dXJuIHModCl8fCgibnVtYmVyIj09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBOdW1iZXIpJiYhaXNGaW5pdGUoK3QpP251bGw6K3R9aGFuZGxlVGlja1JhbmdlT3B0aW9ucygpe2NvbnN0e2JlZ2luQXRaZXJvOnR9PXRoaXMub3B0aW9ucyx7bWluRGVmaW5lZDplLG1heERlZmluZWQ6aX09dGhpcy5nZXRVc2VyQm91bmRzKCk7bGV0e21pbjpzLG1heDpufT10aGlzO2NvbnN0IG89dD0+cz1lP3M6dCxhPXQ9Pm49aT9uOnQ7aWYodCl7Y29uc3QgdD1GKHMpLGU9RihuKTt0PDAmJmU8MD9hKDApOnQ+MCYmZT4wJiZvKDApfWlmKHM9PT1uKXtsZXQgZT0wPT09bj8xOk1hdGguYWJzKC4wNSpuKTthKG4rZSksdHx8byhzLWUpfXRoaXMubWluPXMsdGhpcy5tYXg9bn1nZXRUaWNrTGltaXQoKXtjb25zdCB0PXRoaXMub3B0aW9ucy50aWNrcztsZXQgZSx7bWF4VGlja3NMaW1pdDppLHN0ZXBTaXplOnN9PXQ7cmV0dXJuIHM/KGU9TWF0aC5jZWlsKHRoaXMubWF4L3MpLU1hdGguZmxvb3IodGhpcy5taW4vcykrMSxlPjFlMyYmKGNvbnNvbGUud2Fybihgc2NhbGVzLiR7dGhpcy5pZH0udGlja3Muc3RlcFNpemU6ICR7c30gd291bGQgcmVzdWx0IGdlbmVyYXRpbmcgdXAgdG8gJHtlfSB0aWNrcy4gTGltaXRpbmcgdG8gMTAwMC5gKSxlPTFlMykpOihlPXRoaXMuY29tcHV0ZVRpY2tMaW1pdCgpLGk9aXx8MTEpLGkmJihlPU1hdGgubWluKGksZSkpLGV9Y29tcHV0ZVRpY2tMaW1pdCgpe3JldHVybiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFl9YnVpbGRUaWNrcygpe2NvbnN0IHQ9dGhpcy5vcHRpb25zLGU9dC50aWNrcztsZXQgaT10aGlzLmdldFRpY2tMaW1pdCgpO2k9TWF0aC5tYXgoMixpKTtjb25zdCBuPWZ1bmN0aW9uKHQsZSl7Y29uc3QgaT1bXSx7Ym91bmRzOm4sc3RlcDpvLG1pbjphLG1heDpyLHByZWNpc2lvbjpsLGNvdW50OmgsbWF4VGlja3M6YyxtYXhEaWdpdHM6ZCxpbmNsdWRlQm91bmRzOnV9PXQsZj1vfHwxLGc9Yy0xLHttaW46cCxtYXg6bX09ZSxiPSFzKGEpLHg9IXMociksXz0hcyhoKSx5PShtLXApLyhkKzEpO2xldCB2LE0sdyxrLFM9QigobS1wKS9nL2YpKmY7aWYoUzwxZS0xNCYmIWImJiF4KXJldHVyblt7dmFsdWU6cH0se3ZhbHVlOm19XTtrPU1hdGguY2VpbChtL1MpLU1hdGguZmxvb3IocC9TKSxrPmcmJihTPUIoaypTL2cvZikqZikscyhsKXx8KHY9TWF0aC5wb3coMTAsbCksUz1NYXRoLmNlaWwoUyp2KS92KSwidGlja3MiPT09bj8oTT1NYXRoLmZsb29yKHAvUykqUyx3PU1hdGguY2VpbChtL1MpKlMpOihNPXAsdz1tKSxiJiZ4JiZvJiZIKChyLWEpL28sUy8xZTMpPyhrPU1hdGgucm91bmQoTWF0aC5taW4oKHItYSkvUyxjKSksUz0oci1hKS9rLE09YSx3PXIpOl8/KE09Yj9hOk0sdz14P3I6dyxrPWgtMSxTPSh3LU0pL2spOihrPSh3LU0pL1Msaz1WKGssTWF0aC5yb3VuZChrKSxTLzFlMyk/TWF0aC5yb3VuZChrKTpNYXRoLmNlaWwoaykpO2NvbnN0IFA9TWF0aC5tYXgoVShTKSxVKE0pKTt2PU1hdGgucG93KDEwLHMobCk/UDpsKSxNPU1hdGgucm91bmQoTSp2KS92LHc9TWF0aC5yb3VuZCh3KnYpL3Y7bGV0IEQ9MDtmb3IoYiYmKHUmJk0hPT1hPyhpLnB1c2goe3ZhbHVlOmF9KSxNPGEmJkQrKyxWKE1hdGgucm91bmQoKE0rRCpTKSp2KS92LGEsZW8oYSx5LHQpKSYmRCsrKTpNPGEmJkQrKyk7RDxrOysrRCl7Y29uc3QgdD1NYXRoLnJvdW5kKChNK0QqUykqdikvdjtpZih4JiZ0PnIpYnJlYWs7aS5wdXNoKHt2YWx1ZTp0fSl9cmV0dXJuIHgmJnUmJnchPT1yP2kubGVuZ3RoJiZWKGlbaS5sZW5ndGgtMV0udmFsdWUscixlbyhyLHksdCkpP2lbaS5sZW5ndGgtMV0udmFsdWU9cjppLnB1c2goe3ZhbHVlOnJ9KTp4JiZ3IT09cnx8aS5wdXNoKHt2YWx1ZTp3fSksaX0oe21heFRpY2tzOmksYm91bmRzOnQuYm91bmRzLG1pbjp0Lm1pbixtYXg6dC5tYXgscHJlY2lzaW9uOmUucHJlY2lzaW9uLHN0ZXA6ZS5zdGVwU2l6ZSxjb3VudDplLmNvdW50LG1heERpZ2l0czp0aGlzLl9tYXhEaWdpdHMoKSxob3Jpem9udGFsOnRoaXMuaXNIb3Jpem9udGFsKCksbWluUm90YXRpb246ZS5taW5Sb3RhdGlvbnx8MCxpbmNsdWRlQm91bmRzOiExIT09ZS5pbmNsdWRlQm91bmRzfSx0aGlzLl9yYW5nZXx8dGhpcyk7cmV0dXJuInRpY2tzIj09PXQuYm91bmRzJiZqKG4sdGhpcywidmFsdWUiKSx0LnJldmVyc2U/KG4ucmV2ZXJzZSgpLHRoaXMuc3RhcnQ9dGhpcy5tYXgsdGhpcy5lbmQ9dGhpcy5taW4pOih0aGlzLnN0YXJ0PXRoaXMubWluLHRoaXMuZW5kPXRoaXMubWF4KSxufWNvbmZpZ3VyZSgpe2NvbnN0IHQ9dGhpcy50aWNrcztsZXQgZT10aGlzLm1pbixpPXRoaXMubWF4O2lmKHN1cGVyLmNvbmZpZ3VyZSgpLHRoaXMub3B0aW9ucy5vZmZzZXQmJnQubGVuZ3RoKXtjb25zdCBzPShpLWUpL01hdGgubWF4KHQubGVuZ3RoLTEsMSkvMjtlLT1zLGkrPXN9dGhpcy5fc3RhcnRWYWx1ZT1lLHRoaXMuX2VuZFZhbHVlPWksdGhpcy5fdmFsdWVSYW5nZT1pLWV9Z2V0TGFiZWxGb3JWYWx1ZSh0KXtyZXR1cm4gdGUodCx0aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlLHRoaXMub3B0aW9ucy50aWNrcy5mb3JtYXQpfX1jbGFzcyBzbyBleHRlbmRzIGlve3N0YXRpYyBpZD0ibGluZWFyIjtzdGF0aWMgZGVmYXVsdHM9e3RpY2tzOntjYWxsYmFjazppZS5mb3JtYXR0ZXJzLm51bWVyaWN9fTtkZXRlcm1pbmVEYXRhTGltaXRzKCl7Y29uc3R7bWluOnQsbWF4OmV9PXRoaXMuZ2V0TWluTWF4KCEwKTt0aGlzLm1pbj1hKHQpP3Q6MCx0aGlzLm1heD1hKGUpP2U6MSx0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKX1jb21wdXRlVGlja0xpbWl0KCl7Y29uc3QgdD10aGlzLmlzSG9yaXpvbnRhbCgpLGU9dD90aGlzLndpZHRoOnRoaXMuaGVpZ2h0LGk9JCh0aGlzLm9wdGlvbnMudGlja3MubWluUm90YXRpb24pLHM9KHQ/TWF0aC5zaW4oaSk6TWF0aC5jb3MoaSkpfHwuMDAxLG49dGhpcy5fcmVzb2x2ZVRpY2tGb250T3B0aW9ucygwKTtyZXR1cm4gTWF0aC5jZWlsKGUvTWF0aC5taW4oNDAsbi5saW5lSGVpZ2h0L3MpKX1nZXRQaXhlbEZvclZhbHVlKHQpe3JldHVybiBudWxsPT09dD9OYU46dGhpcy5nZXRQaXhlbEZvckRlY2ltYWwoKHQtdGhpcy5fc3RhcnRWYWx1ZSkvdGhpcy5fdmFsdWVSYW5nZSl9Z2V0VmFsdWVGb3JQaXhlbCh0KXtyZXR1cm4gdGhpcy5fc3RhcnRWYWx1ZSt0aGlzLmdldERlY2ltYWxGb3JQaXhlbCh0KSp0aGlzLl92YWx1ZVJhbmdlfX1jb25zdCBubz10PT5NYXRoLmZsb29yKHoodCkpLG9vPSh0LGUpPT5NYXRoLnBvdygxMCxubyh0KStlKTtmdW5jdGlvbiBhbyh0KXtyZXR1cm4gMT09PXQvTWF0aC5wb3coMTAsbm8odCkpfWZ1bmN0aW9uIHJvKHQsZSxpKXtjb25zdCBzPU1hdGgucG93KDEwLGkpLG49TWF0aC5mbG9vcih0L3MpO3JldHVybiBNYXRoLmNlaWwoZS9zKS1ufWNsYXNzIGxvIGV4dGVuZHMgJHN7c3RhdGljIGlkPSJsb2dhcml0aG1pYyI7c3RhdGljIGRlZmF1bHRzPXt0aWNrczp7Y2FsbGJhY2s6aWUuZm9ybWF0dGVycy5sb2dhcml0aG1pYyxtYWpvcjp7ZW5hYmxlZDohMH19fTtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnN0YXJ0PXZvaWQgMCx0aGlzLmVuZD12b2lkIDAsdGhpcy5fc3RhcnRWYWx1ZT12b2lkIDAsdGhpcy5fdmFsdWVSYW5nZT0wfXBhcnNlKHQsZSl7Y29uc3QgaT1pby5wcm90b3R5cGUucGFyc2UuYXBwbHkodGhpcyxbdCxlXSk7aWYoMCE9PWkpcmV0dXJuIGEoaSkmJmk+MD9pOm51bGw7dGhpcy5femVybz0hMH1kZXRlcm1pbmVEYXRhTGltaXRzKCl7Y29uc3R7bWluOnQsbWF4OmV9PXRoaXMuZ2V0TWluTWF4KCEwKTt0aGlzLm1pbj1hKHQpP01hdGgubWF4KDAsdCk6bnVsbCx0aGlzLm1heD1hKGUpP01hdGgubWF4KDAsZSk6bnVsbCx0aGlzLm9wdGlvbnMuYmVnaW5BdFplcm8mJih0aGlzLl96ZXJvPSEwKSx0aGlzLl96ZXJvJiZ0aGlzLm1pbiE9PXRoaXMuX3N1Z2dlc3RlZE1pbiYmIWEodGhpcy5fdXNlck1pbikmJih0aGlzLm1pbj10PT09b28odGhpcy5taW4sMCk/b28odGhpcy5taW4sLTEpOm9vKHRoaXMubWluLDApKSx0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKX1oYW5kbGVUaWNrUmFuZ2VPcHRpb25zKCl7Y29uc3R7bWluRGVmaW5lZDp0LG1heERlZmluZWQ6ZX09dGhpcy5nZXRVc2VyQm91bmRzKCk7bGV0IGk9dGhpcy5taW4scz10aGlzLm1heDtjb25zdCBuPWU9Pmk9dD9pOmUsbz10PT5zPWU/czp0O2k9PT1zJiYoaTw9MD8obigxKSxvKDEwKSk6KG4ob28oaSwtMSkpLG8ob28ocywxKSkpKSxpPD0wJiZuKG9vKHMsLTEpKSxzPD0wJiZvKG9vKGksMSkpLHRoaXMubWluPWksdGhpcy5tYXg9c31idWlsZFRpY2tzKCl7Y29uc3QgdD10aGlzLm9wdGlvbnMsZT1mdW5jdGlvbih0LHttaW46ZSxtYXg6aX0pe2U9cih0Lm1pbixlKTtjb25zdCBzPVtdLG49bm8oZSk7bGV0IG89ZnVuY3Rpb24odCxlKXtsZXQgaT1ubyhlLXQpO2Zvcig7cm8odCxlLGkpPjEwOylpKys7Zm9yKDtybyh0LGUsaSk8MTA7KWktLTtyZXR1cm4gTWF0aC5taW4oaSxubyh0KSl9KGUsaSksYT1vPDA/TWF0aC5wb3coMTAsTWF0aC5hYnMobykpOjE7Y29uc3QgbD1NYXRoLnBvdygxMCxvKSxoPW4+bz9NYXRoLnBvdygxMCxuKTowLGM9TWF0aC5yb3VuZCgoZS1oKSphKS9hLGQ9TWF0aC5mbG9vcigoZS1oKS9sLzEwKSpsKjEwO2xldCB1PU1hdGguZmxvb3IoKGMtZCkvTWF0aC5wb3coMTAsbykpLGY9cih0Lm1pbixNYXRoLnJvdW5kKChoK2QrdSpNYXRoLnBvdygxMCxvKSkqYSkvYSk7Zm9yKDtmPGk7KXMucHVzaCh7dmFsdWU6ZixtYWpvcjphbyhmKSxzaWduaWZpY2FuZDp1fSksdT49MTA/dT11PDE1PzE1OjIwOnUrKyx1Pj0yMCYmKG8rKyx1PTIsYT1vPj0wPzE6YSksZj1NYXRoLnJvdW5kKChoK2QrdSpNYXRoLnBvdygxMCxvKSkqYSkvYTtjb25zdCBnPXIodC5tYXgsZik7cmV0dXJuIHMucHVzaCh7dmFsdWU6ZyxtYWpvcjphbyhnKSxzaWduaWZpY2FuZDp1fSksc30oe21pbjp0aGlzLl91c2VyTWluLG1heDp0aGlzLl91c2VyTWF4fSx0aGlzKTtyZXR1cm4idGlja3MiPT09dC5ib3VuZHMmJmooZSx0aGlzLCJ2YWx1ZSIpLHQucmV2ZXJzZT8oZS5yZXZlcnNlKCksdGhpcy5zdGFydD10aGlzLm1heCx0aGlzLmVuZD10aGlzLm1pbik6KHRoaXMuc3RhcnQ9dGhpcy5taW4sdGhpcy5lbmQ9dGhpcy5tYXgpLGV9Z2V0TGFiZWxGb3JWYWx1ZSh0KXtyZXR1cm4gdm9pZCAwPT09dD8iMCI6dGUodCx0aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlLHRoaXMub3B0aW9ucy50aWNrcy5mb3JtYXQpfWNvbmZpZ3VyZSgpe2NvbnN0IHQ9dGhpcy5taW47c3VwZXIuY29uZmlndXJlKCksdGhpcy5fc3RhcnRWYWx1ZT16KHQpLHRoaXMuX3ZhbHVlUmFuZ2U9eih0aGlzLm1heCkteih0KX1nZXRQaXhlbEZvclZhbHVlKHQpe3JldHVybiB2b2lkIDAhPT10JiYwIT09dHx8KHQ9dGhpcy5taW4pLG51bGw9PT10fHxpc05hTih0KT9OYU46dGhpcy5nZXRQaXhlbEZvckRlY2ltYWwodD09PXRoaXMubWluPzA6KHoodCktdGhpcy5fc3RhcnRWYWx1ZSkvdGhpcy5fdmFsdWVSYW5nZSl9Z2V0VmFsdWVGb3JQaXhlbCh0KXtjb25zdCBlPXRoaXMuZ2V0RGVjaW1hbEZvclBpeGVsKHQpO3JldHVybiBNYXRoLnBvdygxMCx0aGlzLl9zdGFydFZhbHVlK2UqdGhpcy5fdmFsdWVSYW5nZSl9fWZ1bmN0aW9uIGhvKHQpe2NvbnN0IGU9dC50aWNrcztpZihlLmRpc3BsYXkmJnQuZGlzcGxheSl7Y29uc3QgdD14aShlLmJhY2tkcm9wUGFkZGluZyk7cmV0dXJuIGwoZS5mb250JiZlLmZvbnQuc2l6ZSxyZS5mb250LnNpemUpK3QuaGVpZ2h0fXJldHVybiAwfWZ1bmN0aW9uIGNvKHQsZSxpLHMsbil7cmV0dXJuIHQ9PT1zfHx0PT09bj97c3RhcnQ6ZS1pLzIsZW5kOmUraS8yfTp0PHN8fHQ+bj97c3RhcnQ6ZS1pLGVuZDplfTp7c3RhcnQ6ZSxlbmQ6ZStpfX1mdW5jdGlvbiB1byh0LGUsaSxzLG4pe2NvbnN0IG89TWF0aC5hYnMoTWF0aC5zaW4oaSkpLGE9TWF0aC5hYnMoTWF0aC5jb3MoaSkpO2xldCByPTAsbD0wO3Muc3RhcnQ8ZS5sPyhyPShlLmwtcy5zdGFydCkvbyx0Lmw9TWF0aC5taW4odC5sLGUubC1yKSk6cy5lbmQ+ZS5yJiYocj0ocy5lbmQtZS5yKS9vLHQucj1NYXRoLm1heCh0LnIsZS5yK3IpKSxuLnN0YXJ0PGUudD8obD0oZS50LW4uc3RhcnQpL2EsdC50PU1hdGgubWluKHQudCxlLnQtbCkpOm4uZW5kPmUuYiYmKGw9KG4uZW5kLWUuYikvYSx0LmI9TWF0aC5tYXgodC5iLGUuYitsKSl9ZnVuY3Rpb24gZm8odCxlLGkpe2NvbnN0IHM9dC5kcmF3aW5nQXJlYSx7ZXh0cmE6bixhZGRpdGlvbmFsQW5nbGU6byxwYWRkaW5nOmEsc2l6ZTpyfT1pLGw9dC5nZXRQb2ludFBvc2l0aW9uKGUscytuK2EsbyksaD1NYXRoLnJvdW5kKFkoRyhsLmFuZ2xlK0UpKSksYz1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIDkwPT09aXx8MjcwPT09aT90LT1lLzI6KGk+MjcwfHxpPDkwKSYmKHQtPWUpLHR9KGwueSxyLmgsaCksZD1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXR8fDE4MD09PXQ/ImNlbnRlciI6dDwxODA/ImxlZnQiOiJyaWdodCJ9KGgpLHU9ZnVuY3Rpb24odCxlLGkpe3JldHVybiJyaWdodCI9PT1pP3QtPWU6ImNlbnRlciI9PT1pJiYodC09ZS8yKSx0fShsLngsci53LGQpO3JldHVybnt2aXNpYmxlOiEwLHg6bC54LHk6Yyx0ZXh0QWxpZ246ZCxsZWZ0OnUsdG9wOmMscmlnaHQ6dStyLncsYm90dG9tOmMrci5ofX1mdW5jdGlvbiBnbyh0LGUpe2lmKCFlKXJldHVybiEwO2NvbnN0e2xlZnQ6aSx0b3A6cyxyaWdodDpuLGJvdHRvbTpvfT10O3JldHVybiEoQ2Uoe3g6aSx5OnN9LGUpfHxDZSh7eDppLHk6b30sZSl8fENlKHt4Om4seTpzfSxlKXx8Q2Uoe3g6bix5Om99LGUpKX1mdW5jdGlvbiBwbyh0LGUsaSl7Y29uc3R7bGVmdDpuLHRvcDpvLHJpZ2h0OmEsYm90dG9tOnJ9PWkse2JhY2tkcm9wQ29sb3I6bH09ZTtpZighcyhsKSl7Y29uc3QgaT1iaShlLmJvcmRlclJhZGl1cykscz14aShlLmJhY2tkcm9wUGFkZGluZyk7dC5maWxsU3R5bGU9bDtjb25zdCBoPW4tcy5sZWZ0LGM9by1zLnRvcCxkPWEtbitzLndpZHRoLHU9ci1vK3MuaGVpZ2h0O09iamVjdC52YWx1ZXMoaSkuc29tZSh0PT4wIT09dCk/KHQuYmVnaW5QYXRoKCksemUodCx7eDpoLHk6Yyx3OmQsaDp1LHJhZGl1czppfSksdC5maWxsKCkpOnQuZmlsbFJlY3QoaCxjLGQsdSl9fWZ1bmN0aW9uIG1vKHQsZSxpLHMpe2NvbnN0e2N0eDpufT10O2lmKGkpbi5hcmModC54Q2VudGVyLHQueUNlbnRlcixlLDAsTyk7ZWxzZXtsZXQgaT10LmdldFBvaW50UG9zaXRpb24oMCxlKTtuLm1vdmVUbyhpLngsaS55KTtmb3IobGV0IG89MTtvPHM7bysrKWk9dC5nZXRQb2ludFBvc2l0aW9uKG8sZSksbi5saW5lVG8oaS54LGkueSl9fWNsYXNzIGJvIGV4dGVuZHMgaW97c3RhdGljIGlkPSJyYWRpYWxMaW5lYXIiO3N0YXRpYyBkZWZhdWx0cz17ZGlzcGxheTohMCxhbmltYXRlOiEwLHBvc2l0aW9uOiJjaGFydEFyZWEiLGFuZ2xlTGluZXM6e2Rpc3BsYXk6ITAsbGluZVdpZHRoOjEsYm9yZGVyRGFzaDpbXSxib3JkZXJEYXNoT2Zmc2V0OjB9LGdyaWQ6e2NpcmN1bGFyOiExfSxzdGFydEFuZ2xlOjAsdGlja3M6e3Nob3dMYWJlbEJhY2tkcm9wOiEwLGNhbGxiYWNrOmllLmZvcm1hdHRlcnMubnVtZXJpY30scG9pbnRMYWJlbHM6e2JhY2tkcm9wQ29sb3I6dm9pZCAwLGJhY2tkcm9wUGFkZGluZzoyLGRpc3BsYXk6ITAsZm9udDp7c2l6ZToxMH0sY2FsbGJhY2s6dD0+dCxwYWRkaW5nOjUsY2VudGVyUG9pbnRMYWJlbHM6ITF9fTtzdGF0aWMgZGVmYXVsdFJvdXRlcz17ImFuZ2xlTGluZXMuY29sb3IiOiJib3JkZXJDb2xvciIsInBvaW50TGFiZWxzLmNvbG9yIjoiY29sb3IiLCJ0aWNrcy5jb2xvciI6ImNvbG9yIn07c3RhdGljIGRlc2NyaXB0b3JzPXthbmdsZUxpbmVzOntfZmFsbGJhY2s6ImdyaWQifX07Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy54Q2VudGVyPXZvaWQgMCx0aGlzLnlDZW50ZXI9dm9pZCAwLHRoaXMuZHJhd2luZ0FyZWE9dm9pZCAwLHRoaXMuX3BvaW50TGFiZWxzPVtdLHRoaXMuX3BvaW50TGFiZWxJdGVtcz1bXX1zZXREaW1lbnNpb25zKCl7Y29uc3QgdD10aGlzLl9wYWRkaW5nPXhpKGhvKHRoaXMub3B0aW9ucykvMiksZT10aGlzLndpZHRoPXRoaXMubWF4V2lkdGgtdC53aWR0aCxpPXRoaXMuaGVpZ2h0PXRoaXMubWF4SGVpZ2h0LXQuaGVpZ2h0O3RoaXMueENlbnRlcj1NYXRoLmZsb29yKHRoaXMubGVmdCtlLzIrdC5sZWZ0KSx0aGlzLnlDZW50ZXI9TWF0aC5mbG9vcih0aGlzLnRvcCtpLzIrdC50b3ApLHRoaXMuZHJhd2luZ0FyZWE9TWF0aC5mbG9vcihNYXRoLm1pbihlLGkpLzIpfWRldGVybWluZURhdGFMaW1pdHMoKXtjb25zdHttaW46dCxtYXg6ZX09dGhpcy5nZXRNaW5NYXgoITEpO3RoaXMubWluPWEodCkmJiFpc05hTih0KT90OjAsdGhpcy5tYXg9YShlKSYmIWlzTmFOKGUpP2U6MCx0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKX1jb21wdXRlVGlja0xpbWl0KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLmRyYXdpbmdBcmVhL2hvKHRoaXMub3B0aW9ucykpfWdlbmVyYXRlVGlja0xhYmVscyh0KXtpby5wcm90b3R5cGUuZ2VuZXJhdGVUaWNrTGFiZWxzLmNhbGwodGhpcyx0KSx0aGlzLl9wb2ludExhYmVscz10aGlzLmdldExhYmVscygpLm1hcCgodCxlKT0+e2NvbnN0IGk9ZCh0aGlzLm9wdGlvbnMucG9pbnRMYWJlbHMuY2FsbGJhY2ssW3QsZV0sdGhpcyk7cmV0dXJuIGl8fDA9PT1pP2k6IiJ9KS5maWx0ZXIoKHQsZSk9PnRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoZSkpfWZpdCgpe2NvbnN0IHQ9dGhpcy5vcHRpb25zO3QuZGlzcGxheSYmdC5wb2ludExhYmVscy5kaXNwbGF5P2Z1bmN0aW9uKHQpe2NvbnN0IGU9e2w6dC5sZWZ0K3QuX3BhZGRpbmcubGVmdCxyOnQucmlnaHQtdC5fcGFkZGluZy5yaWdodCx0OnQudG9wK3QuX3BhZGRpbmcudG9wLGI6dC5ib3R0b20tdC5fcGFkZGluZy5ib3R0b219LGk9T2JqZWN0LmFzc2lnbih7fSxlKSxzPVtdLG89W10sYT10Ll9wb2ludExhYmVscy5sZW5ndGgscj10Lm9wdGlvbnMucG9pbnRMYWJlbHMsbD1yLmNlbnRlclBvaW50TGFiZWxzP0MvYTowO2ZvcihsZXQgdT0wO3U8YTt1Kyspe2NvbnN0IGE9ci5zZXRDb250ZXh0KHQuZ2V0UG9pbnRMYWJlbENvbnRleHQodSkpO29bdV09YS5wYWRkaW5nO2NvbnN0IGY9dC5nZXRQb2ludFBvc2l0aW9uKHUsdC5kcmF3aW5nQXJlYStvW3VdLGwpLGc9X2koYS5mb250KSxwPShoPXQuY3R4LGM9ZyxkPW4oZD10Ll9wb2ludExhYmVsc1t1XSk/ZDpbZF0se3c6d2UoaCxjLnN0cmluZyxkKSxoOmQubGVuZ3RoKmMubGluZUhlaWdodH0pO3NbdV09cDtjb25zdCBtPUcodC5nZXRJbmRleEFuZ2xlKHUpK2wpLGI9TWF0aC5yb3VuZChZKG0pKTt1byhpLGUsbSxjbyhiLGYueCxwLncsMCwxODApLGNvKGIsZi55LHAuaCw5MCwyNzApKX12YXIgaCxjLGQ7dC5zZXRDZW50ZXJQb2ludChlLmwtaS5sLGkuci1lLnIsZS50LWkudCxpLmItZS5iKSx0Ll9wb2ludExhYmVsSXRlbXM9ZnVuY3Rpb24odCxlLGkpe2NvbnN0IHM9W10sbj10Ll9wb2ludExhYmVscy5sZW5ndGgsbz10Lm9wdGlvbnMse2NlbnRlclBvaW50TGFiZWxzOmEsZGlzcGxheTpyfT1vLnBvaW50TGFiZWxzLGw9e2V4dHJhOmhvKG8pLzIsYWRkaXRpb25hbEFuZ2xlOmE/Qy9uOjB9O2xldCBoO2ZvcihsZXQgbz0wO288bjtvKyspe2wucGFkZGluZz1pW29dLGwuc2l6ZT1lW29dO2NvbnN0IG49Zm8odCxvLGwpO3MucHVzaChuKSwiYXV0byI9PT1yJiYobi52aXNpYmxlPWdvKG4saCksbi52aXNpYmxlJiYoaD1uKSl9cmV0dXJuIHN9KHQscyxvKX0odGhpcyk6dGhpcy5zZXRDZW50ZXJQb2ludCgwLDAsMCwwKX1zZXRDZW50ZXJQb2ludCh0LGUsaSxzKXt0aGlzLnhDZW50ZXIrPU1hdGguZmxvb3IoKHQtZSkvMiksdGhpcy55Q2VudGVyKz1NYXRoLmZsb29yKChpLXMpLzIpLHRoaXMuZHJhd2luZ0FyZWEtPU1hdGgubWluKHRoaXMuZHJhd2luZ0FyZWEvMixNYXRoLm1heCh0LGUsaSxzKSl9Z2V0SW5kZXhBbmdsZSh0KXtyZXR1cm4gRyh0KihPLyh0aGlzLl9wb2ludExhYmVscy5sZW5ndGh8fDEpKSskKHRoaXMub3B0aW9ucy5zdGFydEFuZ2xlfHwwKSl9Z2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodCl7aWYocyh0KSlyZXR1cm4gTmFOO2NvbnN0IGU9dGhpcy5kcmF3aW5nQXJlYS8odGhpcy5tYXgtdGhpcy5taW4pO3JldHVybiB0aGlzLm9wdGlvbnMucmV2ZXJzZT8odGhpcy5tYXgtdCkqZToodC10aGlzLm1pbikqZX1nZXRWYWx1ZUZvckRpc3RhbmNlRnJvbUNlbnRlcih0KXtpZihzKHQpKXJldHVybiBOYU47Y29uc3QgZT10Lyh0aGlzLmRyYXdpbmdBcmVhLyh0aGlzLm1heC10aGlzLm1pbikpO3JldHVybiB0aGlzLm9wdGlvbnMucmV2ZXJzZT90aGlzLm1heC1lOnRoaXMubWluK2V9Z2V0UG9pbnRMYWJlbENvbnRleHQodCl7Y29uc3QgZT10aGlzLl9wb2ludExhYmVsc3x8W107aWYodD49MCYmdDxlLmxlbmd0aCl7Y29uc3QgaT1lW3RdO3JldHVybiBmdW5jdGlvbih0LGUsaSl7cmV0dXJuIE1pKHQse2xhYmVsOmksaW5kZXg6ZSx0eXBlOiJwb2ludExhYmVsIn0pfSh0aGlzLmdldENvbnRleHQoKSx0LGkpfX1nZXRQb2ludFBvc2l0aW9uKHQsZSxpPTApe2NvbnN0IHM9dGhpcy5nZXRJbmRleEFuZ2xlKHQpLUUraTtyZXR1cm57eDpNYXRoLmNvcyhzKSplK3RoaXMueENlbnRlcix5Ok1hdGguc2luKHMpKmUrdGhpcy55Q2VudGVyLGFuZ2xlOnN9fWdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZSh0LGUpe3JldHVybiB0aGlzLmdldFBvaW50UG9zaXRpb24odCx0aGlzLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKGUpKX1nZXRCYXNlUG9zaXRpb24odCl7cmV0dXJuIHRoaXMuZ2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlKHR8fDAsdGhpcy5nZXRCYXNlVmFsdWUoKSl9Z2V0UG9pbnRMYWJlbFBvc2l0aW9uKHQpe2NvbnN0e2xlZnQ6ZSx0b3A6aSxyaWdodDpzLGJvdHRvbTpufT10aGlzLl9wb2ludExhYmVsSXRlbXNbdF07cmV0dXJue2xlZnQ6ZSx0b3A6aSxyaWdodDpzLGJvdHRvbTpufX1kcmF3QmFja2dyb3VuZCgpe2NvbnN0e2JhY2tncm91bmRDb2xvcjp0LGdyaWQ6e2NpcmN1bGFyOmV9fT10aGlzLm9wdGlvbnM7aWYodCl7Y29uc3QgaT10aGlzLmN0eDtpLnNhdmUoKSxpLmJlZ2luUGF0aCgpLG1vKHRoaXMsdGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh0aGlzLl9lbmRWYWx1ZSksZSx0aGlzLl9wb2ludExhYmVscy5sZW5ndGgpLGkuY2xvc2VQYXRoKCksaS5maWxsU3R5bGU9dCxpLmZpbGwoKSxpLnJlc3RvcmUoKX19ZHJhd0dyaWQoKXtjb25zdCB0PXRoaXMuY3R4LGU9dGhpcy5vcHRpb25zLHthbmdsZUxpbmVzOmksZ3JpZDpzLGJvcmRlcjpufT1lLG89dGhpcy5fcG9pbnRMYWJlbHMubGVuZ3RoO2xldCBhLHIsbDtpZihlLnBvaW50TGFiZWxzLmRpc3BsYXkmJmZ1bmN0aW9uKHQsZSl7Y29uc3R7Y3R4Omksb3B0aW9uczp7cG9pbnRMYWJlbHM6c319PXQ7Zm9yKGxldCBuPWUtMTtuPj0wO24tLSl7Y29uc3QgZT10Ll9wb2ludExhYmVsSXRlbXNbbl07aWYoIWUudmlzaWJsZSljb250aW51ZTtjb25zdCBvPXMuc2V0Q29udGV4dCh0LmdldFBvaW50TGFiZWxDb250ZXh0KG4pKTtwbyhpLG8sZSk7Y29uc3QgYT1faShvLmZvbnQpLHt4OnIseTpsLHRleHRBbGlnbjpofT1lO0llKGksdC5fcG9pbnRMYWJlbHNbbl0scixsK2EubGluZUhlaWdodC8yLGEse2NvbG9yOm8uY29sb3IsdGV4dEFsaWduOmgsdGV4dEJhc2VsaW5lOiJtaWRkbGUifSl9fSh0aGlzLG8pLHMuZGlzcGxheSYmdGhpcy50aWNrcy5mb3JFYWNoKCh0LGUpPT57aWYoMCE9PWUpe3I9dGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh0LnZhbHVlKTtjb25zdCBpPXRoaXMuZ2V0Q29udGV4dChlKSxhPXMuc2V0Q29udGV4dChpKSxsPW4uc2V0Q29udGV4dChpKTshZnVuY3Rpb24odCxlLGkscyxuKXtjb25zdCBvPXQuY3R4LGE9ZS5jaXJjdWxhcix7Y29sb3I6cixsaW5lV2lkdGg6bH09ZTshYSYmIXN8fCFyfHwhbHx8aTwwfHwoby5zYXZlKCksby5zdHJva2VTdHlsZT1yLG8ubGluZVdpZHRoPWwsby5zZXRMaW5lRGFzaChuLmRhc2gpLG8ubGluZURhc2hPZmZzZXQ9bi5kYXNoT2Zmc2V0LG8uYmVnaW5QYXRoKCksbW8odCxpLGEscyksby5jbG9zZVBhdGgoKSxvLnN0cm9rZSgpLG8ucmVzdG9yZSgpKX0odGhpcyxhLHIsbyxsKX19KSxpLmRpc3BsYXkpe2Zvcih0LnNhdmUoKSxhPW8tMTthPj0wO2EtLSl7Y29uc3Qgcz1pLnNldENvbnRleHQodGhpcy5nZXRQb2ludExhYmVsQ29udGV4dChhKSkse2NvbG9yOm4sbGluZVdpZHRoOm99PXM7byYmbiYmKHQubGluZVdpZHRoPW8sdC5zdHJva2VTdHlsZT1uLHQuc2V0TGluZURhc2gocy5ib3JkZXJEYXNoKSx0LmxpbmVEYXNoT2Zmc2V0PXMuYm9yZGVyRGFzaE9mZnNldCxyPXRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUoZS50aWNrcy5yZXZlcnNlP3RoaXMubWluOnRoaXMubWF4KSxsPXRoaXMuZ2V0UG9pbnRQb3NpdGlvbihhLHIpLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8odGhpcy54Q2VudGVyLHRoaXMueUNlbnRlciksdC5saW5lVG8obC54LGwueSksdC5zdHJva2UoKSl9dC5yZXN0b3JlKCl9fWRyYXdCb3JkZXIoKXt9ZHJhd0xhYmVscygpe2NvbnN0IHQ9dGhpcy5jdHgsZT10aGlzLm9wdGlvbnMsaT1lLnRpY2tzO2lmKCFpLmRpc3BsYXkpcmV0dXJuO2NvbnN0IHM9dGhpcy5nZXRJbmRleEFuZ2xlKDApO2xldCBuLG87dC5zYXZlKCksdC50cmFuc2xhdGUodGhpcy54Q2VudGVyLHRoaXMueUNlbnRlciksdC5yb3RhdGUocyksdC50ZXh0QWxpZ249ImNlbnRlciIsdC50ZXh0QmFzZWxpbmU9Im1pZGRsZSIsdGhpcy50aWNrcy5mb3JFYWNoKChzLGEpPT57aWYoMD09PWEmJiFlLnJldmVyc2UpcmV0dXJuO2NvbnN0IHI9aS5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dChhKSksbD1faShyLmZvbnQpO2lmKG49dGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh0aGlzLnRpY2tzW2FdLnZhbHVlKSxyLnNob3dMYWJlbEJhY2tkcm9wKXt0LmZvbnQ9bC5zdHJpbmcsbz10Lm1lYXN1cmVUZXh0KHMubGFiZWwpLndpZHRoLHQuZmlsbFN0eWxlPXIuYmFja2Ryb3BDb2xvcjtjb25zdCBlPXhpKHIuYmFja2Ryb3BQYWRkaW5nKTt0LmZpbGxSZWN0KC1vLzItZS5sZWZ0LC1uLWwuc2l6ZS8yLWUudG9wLG8rZS53aWR0aCxsLnNpemUrZS5oZWlnaHQpfUllKHQscy5sYWJlbCwwLC1uLGwse2NvbG9yOnIuY29sb3Isc3Ryb2tlQ29sb3I6ci50ZXh0U3Ryb2tlQ29sb3Isc3Ryb2tlV2lkdGg6ci50ZXh0U3Ryb2tlV2lkdGh9KX0pLHQucmVzdG9yZSgpfWRyYXdUaXRsZSgpe319Y29uc3QgeG89e21pbGxpc2Vjb25kOntjb21tb246ITAsc2l6ZToxLHN0ZXBzOjFlM30sc2Vjb25kOntjb21tb246ITAsc2l6ZToxZTMsc3RlcHM6NjB9LG1pbnV0ZTp7Y29tbW9uOiEwLHNpemU6NmU0LHN0ZXBzOjYwfSxob3VyOntjb21tb246ITAsc2l6ZTozNmU1LHN0ZXBzOjI0fSxkYXk6e2NvbW1vbjohMCxzaXplOjg2NGU1LHN0ZXBzOjMwfSx3ZWVrOntjb21tb246ITEsc2l6ZTo2MDQ4ZTUsc3RlcHM6NH0sbW9udGg6e2NvbW1vbjohMCxzaXplOjI2MjhlNixzdGVwczoxMn0scXVhcnRlcjp7Y29tbW9uOiExLHNpemU6Nzg4NGU2LHN0ZXBzOjR9LHllYXI6e2NvbW1vbjohMCxzaXplOjMxNTRlN319LF9vPU9iamVjdC5rZXlzKHhvKTtmdW5jdGlvbiB5byh0LGUpe3JldHVybiB0LWV9ZnVuY3Rpb24gdm8odCxlKXtpZihzKGUpKXJldHVybiBudWxsO2NvbnN0IGk9dC5fYWRhcHRlcix7cGFyc2VyOm4scm91bmQ6byxpc29XZWVrZGF5OnJ9PXQuX3BhcnNlT3B0cztsZXQgbD1lO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuJiYobD1uKGwpKSxhKGwpfHwobD0ic3RyaW5nIj09dHlwZW9mIG4/aS5wYXJzZShsLG4pOmkucGFyc2UobCkpLG51bGw9PT1sP251bGw6KG8mJihsPSJ3ZWVrIiE9PW98fCFOKHIpJiYhMCE9PXI/aS5zdGFydE9mKGwsbyk6aS5zdGFydE9mKGwsImlzb1dlZWsiLHIpKSwrbCl9ZnVuY3Rpb24gTW8odCxlLGkscyl7Y29uc3Qgbj1fby5sZW5ndGg7Zm9yKGxldCBvPV9vLmluZGV4T2YodCk7bzxuLTE7KytvKXtjb25zdCB0PXhvW19vW29dXSxuPXQuc3RlcHM/dC5zdGVwczpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtpZih0LmNvbW1vbiYmTWF0aC5jZWlsKChpLWUpLyhuKnQuc2l6ZSkpPD1zKXJldHVybiBfb1tvXX1yZXR1cm4gX29bbi0xXX1mdW5jdGlvbiB3byh0LGUsaSl7aWYoaSl7aWYoaS5sZW5ndGgpe2NvbnN0e2xvOnMsaGk6bn09ZXQoaSxlKTt0W2lbc10+PWU/aVtzXTppW25dXT0hMH19ZWxzZSB0W2VdPSEwfWZ1bmN0aW9uIGtvKHQsZSxpKXtjb25zdCBzPVtdLG49e30sbz1lLmxlbmd0aDtsZXQgYSxyO2ZvcihhPTA7YTxvOysrYSlyPWVbYV0sbltyXT1hLHMucHVzaCh7dmFsdWU6cixtYWpvcjohMX0pO3JldHVybiAwIT09byYmaT9mdW5jdGlvbih0LGUsaSxzKXtjb25zdCBuPXQuX2FkYXB0ZXIsbz0rbi5zdGFydE9mKGVbMF0udmFsdWUscyksYT1lW2UubGVuZ3RoLTFdLnZhbHVlO2xldCByLGw7Zm9yKHI9bztyPD1hO3I9K24uYWRkKHIsMSxzKSlsPWlbcl0sbD49MCYmKGVbbF0ubWFqb3I9ITApO3JldHVybiBlfSh0LHMsbixpKTpzfWNsYXNzIFNvIGV4dGVuZHMgJHN7c3RhdGljIGlkPSJ0aW1lIjtzdGF0aWMgZGVmYXVsdHM9e2JvdW5kczoiZGF0YSIsYWRhcHRlcnM6e30sdGltZTp7cGFyc2VyOiExLHVuaXQ6ITEscm91bmQ6ITEsaXNvV2Vla2RheTohMSxtaW5Vbml0OiJtaWxsaXNlY29uZCIsZGlzcGxheUZvcm1hdHM6e319LHRpY2tzOntzb3VyY2U6ImF1dG8iLGNhbGxiYWNrOiExLG1ham9yOntlbmFibGVkOiExfX19O2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuX2NhY2hlPXtkYXRhOltdLGxhYmVsczpbXSxhbGw6W119LHRoaXMuX3VuaXQ9ImRheSIsdGhpcy5fbWFqb3JVbml0PXZvaWQgMCx0aGlzLl9vZmZzZXRzPXt9LHRoaXMuX25vcm1hbGl6ZWQ9ITEsdGhpcy5fcGFyc2VPcHRzPXZvaWQgMH1pbml0KHQsZT17fSl7Y29uc3QgaT10LnRpbWV8fCh0LnRpbWU9e30pLHM9dGhpcy5fYWRhcHRlcj1uZXcga24uX2RhdGUodC5hZGFwdGVycy5kYXRlKTtzLmluaXQoZSkseChpLmRpc3BsYXlGb3JtYXRzLHMuZm9ybWF0cygpKSx0aGlzLl9wYXJzZU9wdHM9e3BhcnNlcjppLnBhcnNlcixyb3VuZDppLnJvdW5kLGlzb1dlZWtkYXk6aS5pc29XZWVrZGF5fSxzdXBlci5pbml0KHQpLHRoaXMuX25vcm1hbGl6ZWQ9ZS5ub3JtYWxpemVkfXBhcnNlKHQsZSl7cmV0dXJuIHZvaWQgMD09PXQ/bnVsbDp2byh0aGlzLHQpfWJlZm9yZUxheW91dCgpe3N1cGVyLmJlZm9yZUxheW91dCgpLHRoaXMuX2NhY2hlPXtkYXRhOltdLGxhYmVsczpbXSxhbGw6W119fWRldGVybWluZURhdGFMaW1pdHMoKXtjb25zdCB0PXRoaXMub3B0aW9ucyxlPXRoaXMuX2FkYXB0ZXIsaT10LnRpbWUudW5pdHx8ImRheSI7bGV0e21pbjpzLG1heDpuLG1pbkRlZmluZWQ6byxtYXhEZWZpbmVkOnJ9PXRoaXMuZ2V0VXNlckJvdW5kcygpO2Z1bmN0aW9uIGwodCl7b3x8aXNOYU4odC5taW4pfHwocz1NYXRoLm1pbihzLHQubWluKSkscnx8aXNOYU4odC5tYXgpfHwobj1NYXRoLm1heChuLHQubWF4KSl9byYmcnx8KGwodGhpcy5fZ2V0TGFiZWxCb3VuZHMoKSksInRpY2tzIj09PXQuYm91bmRzJiYibGFiZWxzIj09PXQudGlja3Muc291cmNlfHxsKHRoaXMuZ2V0TWluTWF4KCExKSkpLHM9YShzKSYmIWlzTmFOKHMpP3M6K2Uuc3RhcnRPZihEYXRlLm5vdygpLGkpLG49YShuKSYmIWlzTmFOKG4pP246K2UuZW5kT2YoRGF0ZS5ub3coKSxpKSsxLHRoaXMubWluPU1hdGgubWluKHMsbi0xKSx0aGlzLm1heD1NYXRoLm1heChzKzEsbil9X2dldExhYmVsQm91bmRzKCl7Y29uc3QgdD10aGlzLmdldExhYmVsVGltZXN0YW1wcygpO2xldCBlPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxpPU51bWJlci5ORUdBVElWRV9JTkZJTklUWTtyZXR1cm4gdC5sZW5ndGgmJihlPXRbMF0saT10W3QubGVuZ3RoLTFdKSx7bWluOmUsbWF4Oml9fWJ1aWxkVGlja3MoKXtjb25zdCB0PXRoaXMub3B0aW9ucyxlPXQudGltZSxpPXQudGlja3Mscz0ibGFiZWxzIj09PWkuc291cmNlP3RoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCk6dGhpcy5fZ2VuZXJhdGUoKTsidGlja3MiPT09dC5ib3VuZHMmJnMubGVuZ3RoJiYodGhpcy5taW49dGhpcy5fdXNlck1pbnx8c1swXSx0aGlzLm1heD10aGlzLl91c2VyTWF4fHxzW3MubGVuZ3RoLTFdKTtjb25zdCBuPXRoaXMubWluLG89bnQocyxuLHRoaXMubWF4KTtyZXR1cm4gdGhpcy5fdW5pdD1lLnVuaXR8fChpLmF1dG9Ta2lwP01vKGUubWluVW5pdCx0aGlzLm1pbix0aGlzLm1heCx0aGlzLl9nZXRMYWJlbENhcGFjaXR5KG4pKTpmdW5jdGlvbih0LGUsaSxzLG4pe2ZvcihsZXQgbz1fby5sZW5ndGgtMTtvPj1fby5pbmRleE9mKGkpO28tLSl7Y29uc3QgaT1fb1tvXTtpZih4b1tpXS5jb21tb24mJnQuX2FkYXB0ZXIuZGlmZihuLHMsaSk+PWUtMSlyZXR1cm4gaX1yZXR1cm4gX29baT9fby5pbmRleE9mKGkpOjBdfSh0aGlzLG8ubGVuZ3RoLGUubWluVW5pdCx0aGlzLm1pbix0aGlzLm1heCkpLHRoaXMuX21ham9yVW5pdD1pLm1ham9yLmVuYWJsZWQmJiJ5ZWFyIiE9PXRoaXMuX3VuaXQ/ZnVuY3Rpb24odCl7Zm9yKGxldCBlPV9vLmluZGV4T2YodCkrMSxpPV9vLmxlbmd0aDtlPGk7KytlKWlmKHhvW19vW2VdXS5jb21tb24pcmV0dXJuIF9vW2VdfSh0aGlzLl91bml0KTp2b2lkIDAsdGhpcy5pbml0T2Zmc2V0cyhzKSx0LnJldmVyc2UmJm8ucmV2ZXJzZSgpLGtvKHRoaXMsbyx0aGlzLl9tYWpvclVuaXQpfWFmdGVyQXV0b1NraXAoKXt0aGlzLm9wdGlvbnMub2Zmc2V0QWZ0ZXJBdXRvc2tpcCYmdGhpcy5pbml0T2Zmc2V0cyh0aGlzLnRpY2tzLm1hcCh0PT4rdC52YWx1ZSkpfWluaXRPZmZzZXRzKHQ9W10pe2xldCBlLGkscz0wLG49MDt0aGlzLm9wdGlvbnMub2Zmc2V0JiZ0Lmxlbmd0aCYmKGU9dGhpcy5nZXREZWNpbWFsRm9yVmFsdWUodFswXSkscz0xPT09dC5sZW5ndGg/MS1lOih0aGlzLmdldERlY2ltYWxGb3JWYWx1ZSh0WzFdKS1lKS8yLGk9dGhpcy5nZXREZWNpbWFsRm9yVmFsdWUodFt0Lmxlbmd0aC0xXSksbj0xPT09dC5sZW5ndGg/aTooaS10aGlzLmdldERlY2ltYWxGb3JWYWx1ZSh0W3QubGVuZ3RoLTJdKSkvMik7Y29uc3Qgbz10Lmxlbmd0aDwzPy41Oi4yNTtzPUoocywwLG8pLG49SihuLDAsbyksdGhpcy5fb2Zmc2V0cz17c3RhcnQ6cyxlbmQ6bixmYWN0b3I6MS8ocysxK24pfX1fZ2VuZXJhdGUoKXtjb25zdCB0PXRoaXMuX2FkYXB0ZXIsZT10aGlzLm1pbixpPXRoaXMubWF4LHM9dGhpcy5vcHRpb25zLG49cy50aW1lLG89bi51bml0fHxNbyhuLm1pblVuaXQsZSxpLHRoaXMuX2dldExhYmVsQ2FwYWNpdHkoZSkpLGE9bChzLnRpY2tzLnN0ZXBTaXplLDEpLHI9IndlZWsiPT09byYmbi5pc29XZWVrZGF5LGg9TihyKXx8ITA9PT1yLGM9e307bGV0IGQsdSxmPWU7aWYoaCYmKGY9K3Quc3RhcnRPZihmLCJpc29XZWVrIixyKSksZj0rdC5zdGFydE9mKGYsaD8iZGF5IjpvKSx0LmRpZmYoaSxlLG8pPjFlNSphKXRocm93IG5ldyBFcnJvcihlKyIgYW5kICIraSsiIGFyZSB0b28gZmFyIGFwYXJ0IHdpdGggc3RlcFNpemUgb2YgIithKyIgIitvKTtjb25zdCBnPSJkYXRhIj09PXMudGlja3Muc291cmNlJiZ0aGlzLmdldERhdGFUaW1lc3RhbXBzKCk7Zm9yKGQ9Zix1PTA7ZDxpO2Q9K3QuYWRkKGQsYSxvKSx1Kyspd28oYyxkLGcpO3JldHVybiBkIT09aSYmInRpY2tzIiE9PXMuYm91bmRzJiYxIT09dXx8d28oYyxkLGcpLE9iamVjdC5rZXlzKGMpLnNvcnQoeW8pLm1hcCh0PT4rdCl9Z2V0TGFiZWxGb3JWYWx1ZSh0KXtjb25zdCBlPXRoaXMuX2FkYXB0ZXIsaT10aGlzLm9wdGlvbnMudGltZTtyZXR1cm4gaS50b29sdGlwRm9ybWF0P2UuZm9ybWF0KHQsaS50b29sdGlwRm9ybWF0KTplLmZvcm1hdCh0LGkuZGlzcGxheUZvcm1hdHMuZGF0ZXRpbWUpfWZvcm1hdCh0LGUpe2NvbnN0IGk9dGhpcy5vcHRpb25zLnRpbWUuZGlzcGxheUZvcm1hdHMscz10aGlzLl91bml0LG49ZXx8aVtzXTtyZXR1cm4gdGhpcy5fYWRhcHRlci5mb3JtYXQodCxuKX1fdGlja0Zvcm1hdEZ1bmN0aW9uKHQsZSxpLHMpe2NvbnN0IG49dGhpcy5vcHRpb25zLG89bi50aWNrcy5jYWxsYmFjaztpZihvKXJldHVybiBkKG8sW3QsZSxpXSx0aGlzKTtjb25zdCBhPW4udGltZS5kaXNwbGF5Rm9ybWF0cyxyPXRoaXMuX3VuaXQsbD10aGlzLl9tYWpvclVuaXQsaD1yJiZhW3JdLGM9bCYmYVtsXSx1PWlbZV0sZj1sJiZjJiZ1JiZ1Lm1ham9yO3JldHVybiB0aGlzLl9hZGFwdGVyLmZvcm1hdCh0LHN8fChmP2M6aCkpfWdlbmVyYXRlVGlja0xhYmVscyh0KXtsZXQgZSxpLHM7Zm9yKGU9MCxpPXQubGVuZ3RoO2U8aTsrK2Upcz10W2VdLHMubGFiZWw9dGhpcy5fdGlja0Zvcm1hdEZ1bmN0aW9uKHMudmFsdWUsZSx0KX1nZXREZWNpbWFsRm9yVmFsdWUodCl7cmV0dXJuIG51bGw9PT10P05hTjoodC10aGlzLm1pbikvKHRoaXMubWF4LXRoaXMubWluKX1nZXRQaXhlbEZvclZhbHVlKHQpe2NvbnN0IGU9dGhpcy5fb2Zmc2V0cyxpPXRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKHQpO3JldHVybiB0aGlzLmdldFBpeGVsRm9yRGVjaW1hbCgoZS5zdGFydCtpKSplLmZhY3Rvcil9Z2V0VmFsdWVGb3JQaXhlbCh0KXtjb25zdCBlPXRoaXMuX29mZnNldHMsaT10aGlzLmdldERlY2ltYWxGb3JQaXhlbCh0KS9lLmZhY3Rvci1lLmVuZDtyZXR1cm4gdGhpcy5taW4raSoodGhpcy5tYXgtdGhpcy5taW4pfV9nZXRMYWJlbFNpemUodCl7Y29uc3QgZT10aGlzLm9wdGlvbnMudGlja3MsaT10aGlzLmN0eC5tZWFzdXJlVGV4dCh0KS53aWR0aCxzPSQodGhpcy5pc0hvcml6b250YWwoKT9lLm1heFJvdGF0aW9uOmUubWluUm90YXRpb24pLG49TWF0aC5jb3Mocyksbz1NYXRoLnNpbihzKSxhPXRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoMCkuc2l6ZTtyZXR1cm57dzppKm4rYSpvLGg6aSpvK2Eqbn19X2dldExhYmVsQ2FwYWNpdHkodCl7Y29uc3QgZT10aGlzLm9wdGlvbnMudGltZSxpPWUuZGlzcGxheUZvcm1hdHMscz1pW2UudW5pdF18fGkubWlsbGlzZWNvbmQsbj10aGlzLl90aWNrRm9ybWF0RnVuY3Rpb24odCwwLGtvKHRoaXMsW3RdLHRoaXMuX21ham9yVW5pdCkscyksbz10aGlzLl9nZXRMYWJlbFNpemUobiksYT1NYXRoLmZsb29yKHRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy53aWR0aC9vLnc6dGhpcy5oZWlnaHQvby5oKS0xO3JldHVybiBhPjA/YToxfWdldERhdGFUaW1lc3RhbXBzKCl7bGV0IHQsZSxpPXRoaXMuX2NhY2hlLmRhdGF8fFtdO2lmKGkubGVuZ3RoKXJldHVybiBpO2NvbnN0IHM9dGhpcy5nZXRNYXRjaGluZ1Zpc2libGVNZXRhcygpO2lmKHRoaXMuX25vcm1hbGl6ZWQmJnMubGVuZ3RoKXJldHVybiB0aGlzLl9jYWNoZS5kYXRhPXNbMF0uY29udHJvbGxlci5nZXRBbGxQYXJzZWRWYWx1ZXModGhpcyk7Zm9yKHQ9MCxlPXMubGVuZ3RoO3Q8ZTsrK3QpaT1pLmNvbmNhdChzW3RdLmNvbnRyb2xsZXIuZ2V0QWxsUGFyc2VkVmFsdWVzKHRoaXMpKTtyZXR1cm4gdGhpcy5fY2FjaGUuZGF0YT10aGlzLm5vcm1hbGl6ZShpKX1nZXRMYWJlbFRpbWVzdGFtcHMoKXtjb25zdCB0PXRoaXMuX2NhY2hlLmxhYmVsc3x8W107bGV0IGUsaTtpZih0Lmxlbmd0aClyZXR1cm4gdDtjb25zdCBzPXRoaXMuZ2V0TGFiZWxzKCk7Zm9yKGU9MCxpPXMubGVuZ3RoO2U8aTsrK2UpdC5wdXNoKHZvKHRoaXMsc1tlXSkpO3JldHVybiB0aGlzLl9jYWNoZS5sYWJlbHM9dGhpcy5fbm9ybWFsaXplZD90OnRoaXMubm9ybWFsaXplKHQpfW5vcm1hbGl6ZSh0KXtyZXR1cm4gbHQodC5zb3J0KHlvKSl9fWZ1bmN0aW9uIFBvKHQsZSxpKXtsZXQgcyxuLG8sYSxyPTAsbD10Lmxlbmd0aC0xO2k/KGU+PXRbcl0ucG9zJiZlPD10W2xdLnBvcyYmKHtsbzpyLGhpOmx9PWl0KHQsInBvcyIsZSkpLCh7cG9zOnMsdGltZTpvfT10W3JdKSwoe3BvczpuLHRpbWU6YX09dFtsXSkpOihlPj10W3JdLnRpbWUmJmU8PXRbbF0udGltZSYmKHtsbzpyLGhpOmx9PWl0KHQsInRpbWUiLGUpKSwoe3RpbWU6cyxwb3M6b309dFtyXSksKHt0aW1lOm4scG9zOmF9PXRbbF0pKTtjb25zdCBoPW4tcztyZXR1cm4gaD9vKyhhLW8pKihlLXMpL2g6b312YXIgRG89T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQ2F0ZWdvcnlTY2FsZTpjbGFzcyBleHRlbmRzICRze3N0YXRpYyBpZD0iY2F0ZWdvcnkiO3N0YXRpYyBkZWZhdWx0cz17dGlja3M6e2NhbGxiYWNrOnRvfX07Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5fc3RhcnRWYWx1ZT12b2lkIDAsdGhpcy5fdmFsdWVSYW5nZT0wLHRoaXMuX2FkZGVkTGFiZWxzPVtdfWluaXQodCl7Y29uc3QgZT10aGlzLl9hZGRlZExhYmVscztpZihlLmxlbmd0aCl7Y29uc3QgdD10aGlzLmdldExhYmVscygpO2Zvcihjb25zdHtpbmRleDppLGxhYmVsOnN9b2YgZSl0W2ldPT09cyYmdC5zcGxpY2UoaSwxKTt0aGlzLl9hZGRlZExhYmVscz1bXX1zdXBlci5pbml0KHQpfXBhcnNlKHQsZSl7aWYocyh0KSlyZXR1cm4gbnVsbDtjb25zdCBpPXRoaXMuZ2V0TGFiZWxzKCk7cmV0dXJuKCh0LGUpPT5udWxsPT09dD9udWxsOkooTWF0aC5yb3VuZCh0KSwwLGUpKShlPWlzRmluaXRlKGUpJiZpW2VdPT09dD9lOmZ1bmN0aW9uKHQsZSxpLHMpe2NvbnN0IG49dC5pbmRleE9mKGUpO3JldHVybi0xPT09bj8oKHQsZSxpLHMpPT4oInN0cmluZyI9PXR5cGVvZiBlPyhpPXQucHVzaChlKS0xLHMudW5zaGlmdCh7aW5kZXg6aSxsYWJlbDplfSkpOmlzTmFOKGUpJiYoaT1udWxsKSxpKSkodCxlLGkscyk6biE9PXQubGFzdEluZGV4T2YoZSk/aTpufShpLHQsbChlLHQpLHRoaXMuX2FkZGVkTGFiZWxzKSxpLmxlbmd0aC0xKX1kZXRlcm1pbmVEYXRhTGltaXRzKCl7Y29uc3R7bWluRGVmaW5lZDp0LG1heERlZmluZWQ6ZX09dGhpcy5nZXRVc2VyQm91bmRzKCk7bGV0e21pbjppLG1heDpzfT10aGlzLmdldE1pbk1heCghMCk7InRpY2tzIj09PXRoaXMub3B0aW9ucy5ib3VuZHMmJih0fHwoaT0wKSxlfHwocz10aGlzLmdldExhYmVscygpLmxlbmd0aC0xKSksdGhpcy5taW49aSx0aGlzLm1heD1zfWJ1aWxkVGlja3MoKXtjb25zdCB0PXRoaXMubWluLGU9dGhpcy5tYXgsaT10aGlzLm9wdGlvbnMub2Zmc2V0LHM9W107bGV0IG49dGhpcy5nZXRMYWJlbHMoKTtuPTA9PT10JiZlPT09bi5sZW5ndGgtMT9uOm4uc2xpY2UodCxlKzEpLHRoaXMuX3ZhbHVlUmFuZ2U9TWF0aC5tYXgobi5sZW5ndGgtKGk/MDoxKSwxKSx0aGlzLl9zdGFydFZhbHVlPXRoaXMubWluLShpPy41OjApO2ZvcihsZXQgaT10O2k8PWU7aSsrKXMucHVzaCh7dmFsdWU6aX0pO3JldHVybiBzfWdldExhYmVsRm9yVmFsdWUodCl7cmV0dXJuIHRvLmNhbGwodGhpcyx0KX1jb25maWd1cmUoKXtzdXBlci5jb25maWd1cmUoKSx0aGlzLmlzSG9yaXpvbnRhbCgpfHwodGhpcy5fcmV2ZXJzZVBpeGVscz0hdGhpcy5fcmV2ZXJzZVBpeGVscyl9Z2V0UGl4ZWxGb3JWYWx1ZSh0KXtyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIHQmJih0PXRoaXMucGFyc2UodCkpLG51bGw9PT10P05hTjp0aGlzLmdldFBpeGVsRm9yRGVjaW1hbCgodC10aGlzLl9zdGFydFZhbHVlKS90aGlzLl92YWx1ZVJhbmdlKX1nZXRQaXhlbEZvclRpY2sodCl7Y29uc3QgZT10aGlzLnRpY2tzO3JldHVybiB0PDB8fHQ+ZS5sZW5ndGgtMT9udWxsOnRoaXMuZ2V0UGl4ZWxGb3JWYWx1ZShlW3RdLnZhbHVlKX1nZXRWYWx1ZUZvclBpeGVsKHQpe3JldHVybiBNYXRoLnJvdW5kKHRoaXMuX3N0YXJ0VmFsdWUrdGhpcy5nZXREZWNpbWFsRm9yUGl4ZWwodCkqdGhpcy5fdmFsdWVSYW5nZSl9Z2V0QmFzZVBpeGVsKCl7cmV0dXJuIHRoaXMuYm90dG9tfX0sTGluZWFyU2NhbGU6c28sTG9nYXJpdGhtaWNTY2FsZTpsbyxSYWRpYWxMaW5lYXJTY2FsZTpibyxUaW1lU2NhbGU6U28sVGltZVNlcmllc1NjYWxlOmNsYXNzIGV4dGVuZHMgU297c3RhdGljIGlkPSJ0aW1lc2VyaWVzIjtzdGF0aWMgZGVmYXVsdHM9U28uZGVmYXVsdHM7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5fdGFibGU9W10sdGhpcy5fbWluUG9zPXZvaWQgMCx0aGlzLl90YWJsZVJhbmdlPXZvaWQgMH1pbml0T2Zmc2V0cygpe2NvbnN0IHQ9dGhpcy5fZ2V0VGltZXN0YW1wc0ZvclRhYmxlKCksZT10aGlzLl90YWJsZT10aGlzLmJ1aWxkTG9va3VwVGFibGUodCk7dGhpcy5fbWluUG9zPVBvKGUsdGhpcy5taW4pLHRoaXMuX3RhYmxlUmFuZ2U9UG8oZSx0aGlzLm1heCktdGhpcy5fbWluUG9zLHN1cGVyLmluaXRPZmZzZXRzKHQpfWJ1aWxkTG9va3VwVGFibGUodCl7Y29uc3R7bWluOmUsbWF4Oml9PXRoaXMscz1bXSxuPVtdO2xldCBvLGEscixsLGg7Zm9yKG89MCxhPXQubGVuZ3RoO288YTsrK28pbD10W29dLGw+PWUmJmw8PWkmJnMucHVzaChsKTtpZihzLmxlbmd0aDwyKXJldHVyblt7dGltZTplLHBvczowfSx7dGltZTppLHBvczoxfV07Zm9yKG89MCxhPXMubGVuZ3RoO288YTsrK28paD1zW28rMV0scj1zW28tMV0sbD1zW29dLE1hdGgucm91bmQoKGgrcikvMikhPT1sJiZuLnB1c2goe3RpbWU6bCxwb3M6by8oYS0xKX0pO3JldHVybiBufV9nZW5lcmF0ZSgpe2NvbnN0IHQ9dGhpcy5taW4sZT10aGlzLm1heDtsZXQgaT1zdXBlci5nZXREYXRhVGltZXN0YW1wcygpO3JldHVybiBpLmluY2x1ZGVzKHQpJiZpLmxlbmd0aHx8aS5zcGxpY2UoMCwwLHQpLGkuaW5jbHVkZXMoZSkmJjEhPT1pLmxlbmd0aHx8aS5wdXNoKGUpLGkuc29ydCgodCxlKT0+dC1lKX1fZ2V0VGltZXN0YW1wc0ZvclRhYmxlKCl7bGV0IHQ9dGhpcy5fY2FjaGUuYWxsfHxbXTtpZih0Lmxlbmd0aClyZXR1cm4gdDtjb25zdCBlPXRoaXMuZ2V0RGF0YVRpbWVzdGFtcHMoKSxpPXRoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCk7cmV0dXJuIHQ9ZS5sZW5ndGgmJmkubGVuZ3RoP3RoaXMubm9ybWFsaXplKGUuY29uY2F0KGkpKTplLmxlbmd0aD9lOmksdD10aGlzLl9jYWNoZS5hbGw9dCx0fWdldERlY2ltYWxGb3JWYWx1ZSh0KXtyZXR1cm4oUG8odGhpcy5fdGFibGUsdCktdGhpcy5fbWluUG9zKS90aGlzLl90YWJsZVJhbmdlfWdldFZhbHVlRm9yUGl4ZWwodCl7Y29uc3QgZT10aGlzLl9vZmZzZXRzLGk9dGhpcy5nZXREZWNpbWFsRm9yUGl4ZWwodCkvZS5mYWN0b3ItZS5lbmQ7cmV0dXJuIFBvKHRoaXMuX3RhYmxlLGkqdGhpcy5fdGFibGVSYW5nZSt0aGlzLl9taW5Qb3MsITApfX19KTtjb25zdCBDbz1bInJnYig1NCwgMTYyLCAyMzUpIiwicmdiKDI1NSwgOTksIDEzMikiLCJyZ2IoMjU1LCAxNTksIDY0KSIsInJnYigyNTUsIDIwNSwgODYpIiwicmdiKDc1LCAxOTIsIDE5MikiLCJyZ2IoMTUzLCAxMDIsIDI1NSkiLCJyZ2IoMjAxLCAyMDMsIDIwNykiXSxPbz1Dby5tYXAodD0+dC5yZXBsYWNlKCJyZ2IoIiwicmdiYSgiKS5yZXBsYWNlKCIpIiwiLCAwLjUpIikpO2Z1bmN0aW9uIEFvKHQpe3JldHVybiBDb1t0JUNvLmxlbmd0aF19ZnVuY3Rpb24gVG8odCl7cmV0dXJuIE9vW3QlT28ubGVuZ3RoXX1mdW5jdGlvbiBMbyh0KXtsZXQgZTtmb3IoZSBpbiB0KWlmKHRbZV0uYm9yZGVyQ29sb3J8fHRbZV0uYmFja2dyb3VuZENvbG9yKXJldHVybiEwO3JldHVybiExfXZhciBFbz17aWQ6ImNvbG9ycyIsZGVmYXVsdHM6e2VuYWJsZWQ6ITAsZm9yY2VPdmVycmlkZTohMX0sYmVmb3JlTGF5b3V0KHQsZSxpKXtpZighaS5lbmFibGVkKXJldHVybjtjb25zdHtkYXRhOntkYXRhc2V0czpzfSxvcHRpb25zOm59PXQuY29uZmlnLHtlbGVtZW50czpvfT1uO2lmKCFpLmZvcmNlT3ZlcnJpZGUmJihMbyhzKXx8KGE9bikmJihhLmJvcmRlckNvbG9yfHxhLmJhY2tncm91bmRDb2xvcil8fG8mJkxvKG8pKSlyZXR1cm47dmFyIGE7Y29uc3Qgcj1mdW5jdGlvbih0KXtsZXQgZT0wO3JldHVybihpLHMpPT57Y29uc3Qgbj10LmdldERhdGFzZXRNZXRhKHMpLmNvbnRyb2xsZXI7biBpbnN0YW5jZW9mIEVuP2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5iYWNrZ3JvdW5kQ29sb3I9dC5kYXRhLm1hcCgoKT0+QW8oZSsrKSksZX0oaSxlKTpuIGluc3RhbmNlb2YgUm4/ZT1mdW5jdGlvbih0LGUpe3JldHVybiB0LmJhY2tncm91bmRDb2xvcj10LmRhdGEubWFwKCgpPT5UbyhlKyspKSxlfShpLGUpOm4mJihlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYm9yZGVyQ29sb3I9QW8oZSksdC5iYWNrZ3JvdW5kQ29sb3I9VG8oZSksKytlfShpLGUpKX19KHQpO3MuZm9yRWFjaChyKX19O2Z1bmN0aW9uIFJvKHQpe2lmKHQuX2RlY2ltYXRlZCl7Y29uc3QgZT10Ll9kYXRhO2RlbGV0ZSB0Ll9kZWNpbWF0ZWQsZGVsZXRlIHQuX2RhdGEsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImRhdGEiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9fWZ1bmN0aW9uIElvKHQpe3QuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKHQ9PntSbyh0KX0pfXZhciB6bz17aWQ6ImRlY2ltYXRpb24iLGRlZmF1bHRzOnthbGdvcml0aG06Im1pbi1tYXgiLGVuYWJsZWQ6ITF9LGJlZm9yZUVsZW1lbnRzVXBkYXRlOih0LGUsaSk9PntpZighaS5lbmFibGVkKXJldHVybiB2b2lkIElvKHQpO2NvbnN0IG49dC53aWR0aDt0LmRhdGEuZGF0YXNldHMuZm9yRWFjaCgoZSxvKT0+e2NvbnN0e19kYXRhOmEsaW5kZXhBeGlzOnJ9PWUsbD10LmdldERhdGFzZXRNZXRhKG8pLGg9YXx8ZS5kYXRhO2lmKCJ5Ij09PXlpKFtyLHQub3B0aW9ucy5pbmRleEF4aXNdKSlyZXR1cm47aWYoIWwuY29udHJvbGxlci5zdXBwb3J0c0RlY2ltYXRpb24pcmV0dXJuO2NvbnN0IGM9dC5zY2FsZXNbbC54QXhpc0lEXTtpZigibGluZWFyIiE9PWMudHlwZSYmInRpbWUiIT09Yy50eXBlKXJldHVybjtpZih0Lm9wdGlvbnMucGFyc2luZylyZXR1cm47bGV0IGQse3N0YXJ0OnUsY291bnQ6Zn09ZnVuY3Rpb24odCxlKXtjb25zdCBpPWUubGVuZ3RoO2xldCBzLG49MDtjb25zdHtpU2NhbGU6b309dCx7bWluOmEsbWF4OnIsbWluRGVmaW5lZDpsLG1heERlZmluZWQ6aH09by5nZXRVc2VyQm91bmRzKCk7cmV0dXJuIGwmJihuPUooaXQoZSxvLmF4aXMsYSkubG8sMCxpLTEpKSxzPWg/SihpdChlLG8uYXhpcyxyKS5oaSsxLG4saSktbjppLW4se3N0YXJ0Om4sY291bnQ6c319KGwsaCk7aWYoZjw9KGkudGhyZXNob2xkfHw0Km4pKVJvKGUpO2Vsc2V7c3dpdGNoKHMoYSkmJihlLl9kYXRhPWgsZGVsZXRlIGUuZGF0YSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiZGF0YSIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWNpbWF0ZWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9kYXRhPXR9fSkpLGkuYWxnb3JpdGhtKXtjYXNlImx0dGIiOmQ9ZnVuY3Rpb24odCxlLGkscyxuKXtjb25zdCBvPW4uc2FtcGxlc3x8cztpZihvPj1pKXJldHVybiB0LnNsaWNlKGUsZStpKTtjb25zdCBhPVtdLHI9KGktMikvKG8tMik7bGV0IGw9MDtjb25zdCBoPWUraS0xO2xldCBjLGQsdSxmLGcscD1lO2ZvcihhW2wrK109dFtwXSxjPTA7YzxvLTI7YysrKXtsZXQgcyxuPTAsbz0wO2NvbnN0IGg9TWF0aC5mbG9vcigoYysxKSpyKSsxK2UsbT1NYXRoLm1pbihNYXRoLmZsb29yKChjKzIpKnIpKzEsaSkrZSxiPW0taDtmb3Iocz1oO3M8bTtzKyspbis9dFtzXS54LG8rPXRbc10ueTtuLz1iLG8vPWI7Y29uc3QgeD1NYXRoLmZsb29yKGMqcikrMStlLF89TWF0aC5taW4oTWF0aC5mbG9vcigoYysxKSpyKSsxLGkpK2Use3g6eSx5OnZ9PXRbcF07Zm9yKHU9Zj0tMSxzPXg7czxfO3MrKylmPS41Kk1hdGguYWJzKCh5LW4pKih0W3NdLnktdiktKHktdFtzXS54KSooby12KSksZj51JiYodT1mLGQ9dFtzXSxnPXMpO2FbbCsrXT1kLHA9Z31yZXR1cm4gYVtsKytdPXRbaF0sYX0oaCx1LGYsbixpKTticmVhaztjYXNlIm1pbi1tYXgiOmQ9ZnVuY3Rpb24odCxlLGksbil7bGV0IG8sYSxyLGwsaCxjLGQsdSxmLGcscD0wLG09MDtjb25zdCBiPVtdLHg9ZStpLTEsXz10W2VdLngseT10W3hdLngtXztmb3Iobz1lO288ZStpOysrbyl7YT10W29dLHI9KGEueC1fKS95Km4sbD1hLnk7Y29uc3QgZT0wfHI7aWYoZT09PWgpbDxmPyhmPWwsYz1vKTpsPmcmJihnPWwsZD1vKSxwPShtKnArYS54KS8rK207ZWxzZXtjb25zdCBpPW8tMTtpZighcyhjKSYmIXMoZCkpe2NvbnN0IGU9TWF0aC5taW4oYyxkKSxzPU1hdGgubWF4KGMsZCk7ZSE9PXUmJmUhPT1pJiZiLnB1c2goey4uLnRbZV0seDpwfSkscyE9PXUmJnMhPT1pJiZiLnB1c2goey4uLnRbc10seDpwfSl9bz4wJiZpIT09dSYmYi5wdXNoKHRbaV0pLGIucHVzaChhKSxoPWUsbT0wLGY9Zz1sLGM9ZD11PW99fXJldHVybiBifShoLHUsZixuKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGVjaW1hdGlvbiBhbGdvcml0aG0gJyR7aS5hbGdvcml0aG19J2ApfWUuX2RlY2ltYXRlZD1kfX0pfSxkZXN0cm95KHQpe0lvKHQpfX07ZnVuY3Rpb24gRm8odCxlLGkscyl7aWYocylyZXR1cm47bGV0IG49ZVt0XSxvPWlbdF07cmV0dXJuImFuZ2xlIj09PXQmJihuPUcobiksbz1HKG8pKSx7cHJvcGVydHk6dCxzdGFydDpuLGVuZDpvfX1mdW5jdGlvbiBWbyh0LGUsaSl7Zm9yKDtlPnQ7ZS0tKXtjb25zdCB0PWlbZV07aWYoIWlzTmFOKHQueCkmJiFpc05hTih0LnkpKWJyZWFrfXJldHVybiBlfWZ1bmN0aW9uIEJvKHQsZSxpLHMpe3JldHVybiB0JiZlP3ModFtpXSxlW2ldKTp0P3RbaV06ZT9lW2ldOjB9ZnVuY3Rpb24gV28odCxlKXtsZXQgaT1bXSxzPSExO3JldHVybiBuKHQpPyhzPSEwLGk9dCk6aT1mdW5jdGlvbih0LGUpe2NvbnN0e3g6aT1udWxsLHk6cz1udWxsfT10fHx7fSxuPWUucG9pbnRzLG89W107cmV0dXJuIGUuc2VnbWVudHMuZm9yRWFjaCgoe3N0YXJ0OnQsZW5kOmV9KT0+e2U9Vm8odCxlLG4pO2NvbnN0IGE9blt0XSxyPW5bZV07bnVsbCE9PXM/KG8ucHVzaCh7eDphLngseTpzfSksby5wdXNoKHt4OnIueCx5OnN9KSk6bnVsbCE9PWkmJihvLnB1c2goe3g6aSx5OmEueX0pLG8ucHVzaCh7eDppLHk6ci55fSkpfSksb30odCxlKSxpLmxlbmd0aD9uZXcgWW4oe3BvaW50czppLG9wdGlvbnM6e3RlbnNpb246MH0sX2xvb3A6cyxfZnVsbExvb3A6c30pOm51bGx9ZnVuY3Rpb24gTm8odCl7cmV0dXJuIHQmJiExIT09dC5maWxsfWZ1bmN0aW9uIEhvKHQsZSxpKXtsZXQgcz10W2VdLmZpbGw7Y29uc3Qgbj1bZV07bGV0IG87aWYoIWkpcmV0dXJuIHM7Zm9yKDshMSE9PXMmJi0xPT09bi5pbmRleE9mKHMpOyl7aWYoIWEocykpcmV0dXJuIHM7aWYobz10W3NdLCFvKXJldHVybiExO2lmKG8udmlzaWJsZSlyZXR1cm4gcztuLnB1c2gocykscz1vLmZpbGx9cmV0dXJuITF9ZnVuY3Rpb24gam8odCxlLGkpe2NvbnN0IHM9ZnVuY3Rpb24odCl7Y29uc3QgZT10Lm9wdGlvbnMsaT1lLmZpbGw7bGV0IHM9bChpJiZpLnRhcmdldCxpKTtyZXR1cm4gdm9pZCAwPT09cyYmKHM9ISFlLmJhY2tncm91bmRDb2xvciksITEhPT1zJiZudWxsIT09cyYmKCEwPT09cz8ib3JpZ2luIjpzKX0odCk7aWYobyhzKSlyZXR1cm4haXNOYU4ocy52YWx1ZSkmJnM7bGV0IG49cGFyc2VGbG9hdChzKTtyZXR1cm4gYShuKSYmTWF0aC5mbG9vcihuKT09PW4/ZnVuY3Rpb24odCxlLGkscyl7cmV0dXJuIi0iIT09dCYmIisiIT09dHx8KGk9ZStpKSwhKGk9PT1lfHxpPDB8fGk+PXMpJiZpfShzWzBdLGUsbixpKTpbIm9yaWdpbiIsInN0YXJ0IiwiZW5kIiwic3RhY2siLCJzaGFwZSJdLmluZGV4T2Yocyk+PTAmJnN9ZnVuY3Rpb24gJG8odCxlLGkpe2NvbnN0IHM9W107Zm9yKGxldCBuPTA7bjxpLmxlbmd0aDtuKyspe2NvbnN0IG89aVtuXSx7Zmlyc3Q6YSxsYXN0OnIscG9pbnQ6bH09WW8obyxlLCJ4Iik7aWYoISghbHx8YSYmcikpaWYoYSlzLnVuc2hpZnQobCk7ZWxzZSBpZih0LnB1c2gobCksIXIpYnJlYWt9dC5wdXNoKC4uLnMpfWZ1bmN0aW9uIFlvKHQsZSxpKXtjb25zdCBzPXQuaW50ZXJwb2xhdGUoZSxpKTtpZighcylyZXR1cm57fTtjb25zdCBuPXNbaV0sbz10LnNlZ21lbnRzLGE9dC5wb2ludHM7bGV0IHI9ITEsbD0hMTtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrKyl7Y29uc3QgZT1vW3RdLHM9YVtlLnN0YXJ0XVtpXSxoPWFbZS5lbmRdW2ldO2lmKHR0KG4scyxoKSl7cj1uPT09cyxsPW49PT1oO2JyZWFrfX1yZXR1cm57Zmlyc3Q6cixsYXN0OmwscG9pbnQ6c319Y2xhc3MgVW97Y29uc3RydWN0b3IodCl7dGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMucmFkaXVzPXQucmFkaXVzfXBhdGhTZWdtZW50KHQsZSxpKXtjb25zdHt4OnMseTpuLHJhZGl1czpvfT10aGlzO3JldHVybiBlPWV8fHtzdGFydDowLGVuZDpPfSx0LmFyYyhzLG4sbyxlLmVuZCxlLnN0YXJ0LCEwKSwhaS5ib3VuZHN9aW50ZXJwb2xhdGUodCl7Y29uc3R7eDplLHk6aSxyYWRpdXM6c309dGhpcyxuPXQuYW5nbGU7cmV0dXJue3g6ZStNYXRoLmNvcyhuKSpzLHk6aStNYXRoLnNpbihuKSpzLGFuZ2xlOm59fX1mdW5jdGlvbiBYbyh0KXtjb25zdHtjaGFydDplLGZpbGw6aSxsaW5lOnN9PXQ7aWYoYShpKSlyZXR1cm4gZnVuY3Rpb24odCxlKXtjb25zdCBpPXQuZ2V0RGF0YXNldE1ldGEoZSk7cmV0dXJuIGkmJnQuaXNEYXRhc2V0VmlzaWJsZShlKT9pLmRhdGFzZXQ6bnVsbH0oZSxpKTtpZigic3RhY2siPT09aSlyZXR1cm4gZnVuY3Rpb24odCl7Y29uc3R7c2NhbGU6ZSxpbmRleDppLGxpbmU6c309dCxuPVtdLG89cy5zZWdtZW50cyxhPXMucG9pbnRzLHI9ZnVuY3Rpb24odCxlKXtjb25zdCBpPVtdLHM9dC5nZXRNYXRjaGluZ1Zpc2libGVNZXRhcygibGluZSIpO2ZvcihsZXQgdD0wO3Q8cy5sZW5ndGg7dCsrKXtjb25zdCBuPXNbdF07aWYobi5pbmRleD09PWUpYnJlYWs7bi5oaWRkZW58fGkudW5zaGlmdChuLmRhdGFzZXQpfXJldHVybiBpfShlLGkpO3IucHVzaChXbyh7eDpudWxsLHk6ZS5ib3R0b219LHMpKTtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrKyl7Y29uc3QgZT1vW3RdO2ZvcihsZXQgdD1lLnN0YXJ0O3Q8PWUuZW5kO3QrKykkbyhuLGFbdF0scil9cmV0dXJuIG5ldyBZbih7cG9pbnRzOm4sb3B0aW9uczp7fX0pfSh0KTtpZigic2hhcGUiPT09aSlyZXR1cm4hMDtjb25zdCBuPWZ1bmN0aW9uKHQpe3JldHVybih0LnNjYWxlfHx7fSkuZ2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlP2Z1bmN0aW9uKHQpe2NvbnN0e3NjYWxlOmUsZmlsbDppfT10LHM9ZS5vcHRpb25zLG49ZS5nZXRMYWJlbHMoKS5sZW5ndGgsYT1zLnJldmVyc2U/ZS5tYXg6ZS5taW4scj1mdW5jdGlvbih0LGUsaSl7bGV0IHM7cmV0dXJuIHM9InN0YXJ0Ij09PXQ/aToiZW5kIj09PXQ/ZS5vcHRpb25zLnJldmVyc2U/ZS5taW46ZS5tYXg6byh0KT90LnZhbHVlOmUuZ2V0QmFzZVZhbHVlKCksc30oaSxlLGEpLGw9W107aWYocy5ncmlkLmNpcmN1bGFyKXtjb25zdCB0PWUuZ2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlKDAsYSk7cmV0dXJuIG5ldyBVbyh7eDp0LngseTp0LnkscmFkaXVzOmUuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUocil9KX1mb3IobGV0IHQ9MDt0PG47Kyt0KWwucHVzaChlLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZSh0LHIpKTtyZXR1cm4gbH0odCk6ZnVuY3Rpb24odCl7Y29uc3R7c2NhbGU6ZT17fSxmaWxsOml9PXQscz1mdW5jdGlvbih0LGUpe2xldCBpPW51bGw7cmV0dXJuInN0YXJ0Ij09PXQ/aT1lLmJvdHRvbToiZW5kIj09PXQ/aT1lLnRvcDpvKHQpP2k9ZS5nZXRQaXhlbEZvclZhbHVlKHQudmFsdWUpOmUuZ2V0QmFzZVBpeGVsJiYoaT1lLmdldEJhc2VQaXhlbCgpKSxpfShpLGUpO2lmKGEocykpe2NvbnN0IHQ9ZS5pc0hvcml6b250YWwoKTtyZXR1cm57eDp0P3M6bnVsbCx5OnQ/bnVsbDpzfX1yZXR1cm4gbnVsbH0odCl9KHQpO3JldHVybiBuIGluc3RhbmNlb2YgVW8/bjpXbyhuLHMpfWZ1bmN0aW9uIHFvKHQsZSxpKXtjb25zdCBzPVhvKGUpLHtsaW5lOm4sc2NhbGU6byxheGlzOmF9PWUscj1uLm9wdGlvbnMsbD1yLmZpbGwsaD1yLmJhY2tncm91bmRDb2xvcix7YWJvdmU6Yz1oLGJlbG93OmQ9aH09bHx8e307cyYmbi5wb2ludHMubGVuZ3RoJiYoT2UodCxpKSxmdW5jdGlvbih0LGUpe2NvbnN0e2xpbmU6aSx0YXJnZXQ6cyxhYm92ZTpuLGJlbG93Om8sYXJlYTphLHNjYWxlOnJ9PWUsbD1pLl9sb29wPyJhbmdsZSI6ZS5heGlzO3Quc2F2ZSgpLCJ4Ij09PWwmJm8hPT1uJiYoS28odCxzLGEudG9wKSxHbyh0LHtsaW5lOmksdGFyZ2V0OnMsY29sb3I6bixzY2FsZTpyLHByb3BlcnR5Omx9KSx0LnJlc3RvcmUoKSx0LnNhdmUoKSxLbyh0LHMsYS5ib3R0b20pKSxHbyh0LHtsaW5lOmksdGFyZ2V0OnMsY29sb3I6byxzY2FsZTpyLHByb3BlcnR5Omx9KSx0LnJlc3RvcmUoKX0odCx7bGluZTpuLHRhcmdldDpzLGFib3ZlOmMsYmVsb3c6ZCxhcmVhOmksc2NhbGU6byxheGlzOmF9KSxBZSh0KSl9ZnVuY3Rpb24gS28odCxlLGkpe2NvbnN0e3NlZ21lbnRzOnMscG9pbnRzOm59PWU7bGV0IG89ITAsYT0hMTt0LmJlZ2luUGF0aCgpO2Zvcihjb25zdCByIG9mIHMpe2NvbnN0e3N0YXJ0OnMsZW5kOmx9PXIsaD1uW3NdLGM9bltWbyhzLGwsbildO28/KHQubW92ZVRvKGgueCxoLnkpLG89ITEpOih0LmxpbmVUbyhoLngsaSksdC5saW5lVG8oaC54LGgueSkpLGE9ISFlLnBhdGhTZWdtZW50KHQscix7bW92ZTphfSksYT90LmNsb3NlUGF0aCgpOnQubGluZVRvKGMueCxpKX10LmxpbmVUbyhlLmZpcnN0KCkueCxpKSx0LmNsb3NlUGF0aCgpLHQuY2xpcCgpfWZ1bmN0aW9uIEdvKHQsZSl7Y29uc3R7bGluZTppLHRhcmdldDpzLHByb3BlcnR5Om4sY29sb3I6byxzY2FsZTphfT1lLHI9ZnVuY3Rpb24odCxlLGkpe2NvbnN0IHM9dC5zZWdtZW50cyxuPXQucG9pbnRzLG89ZS5wb2ludHMsYT1bXTtmb3IoY29uc3QgdCBvZiBzKXtsZXR7c3RhcnQ6cyxlbmQ6cn09dDtyPVZvKHMscixuKTtjb25zdCBsPUZvKGksbltzXSxuW3JdLHQubG9vcCk7aWYoIWUuc2VnbWVudHMpe2EucHVzaCh7c291cmNlOnQsdGFyZ2V0Omwsc3RhcnQ6bltzXSxlbmQ6bltyXX0pO2NvbnRpbnVlfWNvbnN0IGg9T2koZSxsKTtmb3IoY29uc3QgZSBvZiBoKXtjb25zdCBzPUZvKGksb1tlLnN0YXJ0XSxvW2UuZW5kXSxlLmxvb3ApLHI9Q2kodCxuLHMpO2Zvcihjb25zdCB0IG9mIHIpYS5wdXNoKHtzb3VyY2U6dCx0YXJnZXQ6ZSxzdGFydDp7W2ldOkJvKGwscywic3RhcnQiLE1hdGgubWF4KX0sZW5kOntbaV06Qm8obCxzLCJlbmQiLE1hdGgubWluKX19KX19cmV0dXJuIGF9KGkscyxuKTtmb3IoY29uc3R7c291cmNlOmUsdGFyZ2V0Omwsc3RhcnQ6aCxlbmQ6Y31vZiByKXtjb25zdHtzdHlsZTp7YmFja2dyb3VuZENvbG9yOnI9b309e319PWUsZD0hMCE9PXM7dC5zYXZlKCksdC5maWxsU3R5bGU9cixabyh0LGEsZCYmRm8obixoLGMpKSx0LmJlZ2luUGF0aCgpO2NvbnN0IHU9ISFpLnBhdGhTZWdtZW50KHQsZSk7bGV0IGY7aWYoZCl7dT90LmNsb3NlUGF0aCgpOkpvKHQscyxjLG4pO2NvbnN0IGU9ISFzLnBhdGhTZWdtZW50KHQsbCx7bW92ZTp1LHJldmVyc2U6ITB9KTtmPXUmJmUsZnx8Sm8odCxzLGgsbil9dC5jbG9zZVBhdGgoKSx0LmZpbGwoZj8iZXZlbm9kZCI6Im5vbnplcm8iKSx0LnJlc3RvcmUoKX19ZnVuY3Rpb24gWm8odCxlLGkpe2NvbnN0e3RvcDpzLGJvdHRvbTpufT1lLmNoYXJ0LmNoYXJ0QXJlYSx7cHJvcGVydHk6byxzdGFydDphLGVuZDpyfT1pfHx7fTsieCI9PT1vJiYodC5iZWdpblBhdGgoKSx0LnJlY3QoYSxzLHItYSxuLXMpLHQuY2xpcCgpKX1mdW5jdGlvbiBKbyh0LGUsaSxzKXtjb25zdCBuPWUuaW50ZXJwb2xhdGUoaSxzKTtuJiZ0LmxpbmVUbyhuLngsbi55KX12YXIgUW89e2lkOiJmaWxsZXIiLGFmdGVyRGF0YXNldHNVcGRhdGUodCxlLGkpe2NvbnN0IHM9KHQuZGF0YS5kYXRhc2V0c3x8W10pLmxlbmd0aCxuPVtdO2xldCBvLGEscixsO2ZvcihhPTA7YTxzOysrYSlvPXQuZ2V0RGF0YXNldE1ldGEoYSkscj1vLmRhdGFzZXQsbD1udWxsLHImJnIub3B0aW9ucyYmciBpbnN0YW5jZW9mIFluJiYobD17dmlzaWJsZTp0LmlzRGF0YXNldFZpc2libGUoYSksaW5kZXg6YSxmaWxsOmpvKHIsYSxzKSxjaGFydDp0LGF4aXM6by5jb250cm9sbGVyLm9wdGlvbnMuaW5kZXhBeGlzLHNjYWxlOm8udlNjYWxlLGxpbmU6cn0pLG8uJGZpbGxlcj1sLG4ucHVzaChsKTtmb3IoYT0wO2E8czsrK2EpbD1uW2FdLGwmJiExIT09bC5maWxsJiYobC5maWxsPUhvKG4sYSxpLnByb3BhZ2F0ZSkpfSxiZWZvcmVEcmF3KHQsZSxpKXtjb25zdCBzPSJiZWZvcmVEcmF3Ij09PWkuZHJhd1RpbWUsbj10LmdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKSxvPXQuY2hhcnRBcmVhO2ZvcihsZXQgZT1uLmxlbmd0aC0xO2U+PTA7LS1lKXtjb25zdCBpPW5bZV0uJGZpbGxlcjtpJiYoaS5saW5lLnVwZGF0ZUNvbnRyb2xQb2ludHMobyxpLmF4aXMpLHMmJmkuZmlsbCYmcW8odC5jdHgsaSxvKSl9fSxiZWZvcmVEYXRhc2V0c0RyYXcodCxlLGkpe2lmKCJiZWZvcmVEYXRhc2V0c0RyYXciIT09aS5kcmF3VGltZSlyZXR1cm47Y29uc3Qgcz10LmdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKTtmb3IobGV0IGU9cy5sZW5ndGgtMTtlPj0wOy0tZSl7Y29uc3QgaT1zW2VdLiRmaWxsZXI7Tm8oaSkmJnFvKHQuY3R4LGksdC5jaGFydEFyZWEpfX0sYmVmb3JlRGF0YXNldERyYXcodCxlLGkpe2NvbnN0IHM9ZS5tZXRhLiRmaWxsZXI7Tm8ocykmJiJiZWZvcmVEYXRhc2V0RHJhdyI9PT1pLmRyYXdUaW1lJiZxbyh0LmN0eCxzLHQuY2hhcnRBcmVhKX0sZGVmYXVsdHM6e3Byb3BhZ2F0ZTohMCxkcmF3VGltZToiYmVmb3JlRGF0YXNldERyYXcifX07Y29uc3QgdGE9KHQsZSk9PntsZXR7Ym94SGVpZ2h0Omk9ZSxib3hXaWR0aDpzPWV9PXQ7cmV0dXJuIHQudXNlUG9pbnRTdHlsZSYmKGk9TWF0aC5taW4oaSxlKSxzPXQucG9pbnRTdHlsZVdpZHRofHxNYXRoLm1pbihzLGUpKSx7Ym94V2lkdGg6cyxib3hIZWlnaHQ6aSxpdGVtSGVpZ2h0Ok1hdGgubWF4KGUsaSl9fTtjbGFzcyBlYSBleHRlbmRzIFJze2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5fYWRkZWQ9ITEsdGhpcy5sZWdlbmRIaXRCb3hlcz1bXSx0aGlzLl9ob3ZlcmVkSXRlbT1udWxsLHRoaXMuZG91Z2hudXRNb2RlPSExLHRoaXMuY2hhcnQ9dC5jaGFydCx0aGlzLm9wdGlvbnM9dC5vcHRpb25zLHRoaXMuY3R4PXQuY3R4LHRoaXMubGVnZW5kSXRlbXM9dm9pZCAwLHRoaXMuY29sdW1uU2l6ZXM9dm9pZCAwLHRoaXMubGluZVdpZHRocz12b2lkIDAsdGhpcy5tYXhIZWlnaHQ9dm9pZCAwLHRoaXMubWF4V2lkdGg9dm9pZCAwLHRoaXMudG9wPXZvaWQgMCx0aGlzLmJvdHRvbT12b2lkIDAsdGhpcy5sZWZ0PXZvaWQgMCx0aGlzLnJpZ2h0PXZvaWQgMCx0aGlzLmhlaWdodD12b2lkIDAsdGhpcy53aWR0aD12b2lkIDAsdGhpcy5fbWFyZ2lucz12b2lkIDAsdGhpcy5wb3NpdGlvbj12b2lkIDAsdGhpcy53ZWlnaHQ9dm9pZCAwLHRoaXMuZnVsbFNpemU9dm9pZCAwfXVwZGF0ZSh0LGUsaSl7dGhpcy5tYXhXaWR0aD10LHRoaXMubWF4SGVpZ2h0PWUsdGhpcy5fbWFyZ2lucz1pLHRoaXMuc2V0RGltZW5zaW9ucygpLHRoaXMuYnVpbGRMYWJlbHMoKSx0aGlzLmZpdCgpfXNldERpbWVuc2lvbnMoKXt0aGlzLmlzSG9yaXpvbnRhbCgpPyh0aGlzLndpZHRoPXRoaXMubWF4V2lkdGgsdGhpcy5sZWZ0PXRoaXMuX21hcmdpbnMubGVmdCx0aGlzLnJpZ2h0PXRoaXMud2lkdGgpOih0aGlzLmhlaWdodD10aGlzLm1heEhlaWdodCx0aGlzLnRvcD10aGlzLl9tYXJnaW5zLnRvcCx0aGlzLmJvdHRvbT10aGlzLmhlaWdodCl9YnVpbGRMYWJlbHMoKXtjb25zdCB0PXRoaXMub3B0aW9ucy5sYWJlbHN8fHt9O2xldCBlPWQodC5nZW5lcmF0ZUxhYmVscyxbdGhpcy5jaGFydF0sdGhpcyl8fFtdO3QuZmlsdGVyJiYoZT1lLmZpbHRlcihlPT50LmZpbHRlcihlLHRoaXMuY2hhcnQuZGF0YSkpKSx0LnNvcnQmJihlPWUuc29ydCgoZSxpKT0+dC5zb3J0KGUsaSx0aGlzLmNoYXJ0LmRhdGEpKSksdGhpcy5vcHRpb25zLnJldmVyc2UmJmUucmV2ZXJzZSgpLHRoaXMubGVnZW5kSXRlbXM9ZX1maXQoKXtjb25zdHtvcHRpb25zOnQsY3R4OmV9PXRoaXM7aWYoIXQuZGlzcGxheSlyZXR1cm4gdm9pZCh0aGlzLndpZHRoPXRoaXMuaGVpZ2h0PTApO2NvbnN0IGk9dC5sYWJlbHMscz1faShpLmZvbnQpLG49cy5zaXplLG89dGhpcy5fY29tcHV0ZVRpdGxlSGVpZ2h0KCkse2JveFdpZHRoOmEsaXRlbUhlaWdodDpyfT10YShpLG4pO2xldCBsLGg7ZS5mb250PXMuc3RyaW5nLHRoaXMuaXNIb3Jpem9udGFsKCk/KGw9dGhpcy5tYXhXaWR0aCxoPXRoaXMuX2ZpdFJvd3MobyxuLGEscikrMTApOihoPXRoaXMubWF4SGVpZ2h0LGw9dGhpcy5fZml0Q29scyhvLHMsYSxyKSsxMCksdGhpcy53aWR0aD1NYXRoLm1pbihsLHQubWF4V2lkdGh8fHRoaXMubWF4V2lkdGgpLHRoaXMuaGVpZ2h0PU1hdGgubWluKGgsdC5tYXhIZWlnaHR8fHRoaXMubWF4SGVpZ2h0KX1fZml0Um93cyh0LGUsaSxzKXtjb25zdHtjdHg6bixtYXhXaWR0aDpvLG9wdGlvbnM6e2xhYmVsczp7cGFkZGluZzphfX19PXRoaXMscj10aGlzLmxlZ2VuZEhpdEJveGVzPVtdLGw9dGhpcy5saW5lV2lkdGhzPVswXSxoPXMrYTtsZXQgYz10O24udGV4dEFsaWduPSJsZWZ0IixuLnRleHRCYXNlbGluZT0ibWlkZGxlIjtsZXQgZD0tMSx1PS1oO3JldHVybiB0aGlzLmxlZ2VuZEl0ZW1zLmZvckVhY2goKHQsZik9Pntjb25zdCBnPWkrZS8yK24ubWVhc3VyZVRleHQodC50ZXh0KS53aWR0aDsoMD09PWZ8fGxbbC5sZW5ndGgtMV0rZysyKmE+bykmJihjKz1oLGxbbC5sZW5ndGgtKGY+MD8wOjEpXT0wLHUrPWgsZCsrKSxyW2ZdPXtsZWZ0OjAsdG9wOnUscm93OmQsd2lkdGg6ZyxoZWlnaHQ6c30sbFtsLmxlbmd0aC0xXSs9ZythfSksY31fZml0Q29scyh0LGUsaSxzKXtjb25zdHtjdHg6bixtYXhIZWlnaHQ6byxvcHRpb25zOntsYWJlbHM6e3BhZGRpbmc6YX19fT10aGlzLHI9dGhpcy5sZWdlbmRIaXRCb3hlcz1bXSxsPXRoaXMuY29sdW1uU2l6ZXM9W10saD1vLXQ7bGV0IGM9YSxkPTAsdT0wLGY9MCxnPTA7cmV0dXJuIHRoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgodCxvKT0+e2NvbnN0e2l0ZW1XaWR0aDpwLGl0ZW1IZWlnaHQ6bX09ZnVuY3Rpb24odCxlLGkscyxuKXtjb25zdCBvPWZ1bmN0aW9uKHQsZSxpLHMpe2xldCBuPXQudGV4dDtyZXR1cm4gbiYmInN0cmluZyIhPXR5cGVvZiBuJiYobj1uLnJlZHVjZSgodCxlKT0+dC5sZW5ndGg+ZS5sZW5ndGg/dDplKSksZStpLnNpemUvMitzLm1lYXN1cmVUZXh0KG4pLndpZHRofShzLHQsZSxpKSxhPWZ1bmN0aW9uKHQsZSxpKXtsZXQgcz10O3JldHVybiJzdHJpbmciIT10eXBlb2YgZS50ZXh0JiYocz1pYShlLGkpKSxzfShuLHMsZS5saW5lSGVpZ2h0KTtyZXR1cm57aXRlbVdpZHRoOm8saXRlbUhlaWdodDphfX0oaSxlLG4sdCxzKTtvPjAmJnUrbSsyKmE+aCYmKGMrPWQrYSxsLnB1c2goe3dpZHRoOmQsaGVpZ2h0OnV9KSxmKz1kK2EsZysrLGQ9dT0wKSxyW29dPXtsZWZ0OmYsdG9wOnUsY29sOmcsd2lkdGg6cCxoZWlnaHQ6bX0sZD1NYXRoLm1heChkLHApLHUrPW0rYX0pLGMrPWQsbC5wdXNoKHt3aWR0aDpkLGhlaWdodDp1fSksY31hZGp1c3RIaXRCb3hlcygpe2lmKCF0aGlzLm9wdGlvbnMuZGlzcGxheSlyZXR1cm47Y29uc3QgdD10aGlzLl9jb21wdXRlVGl0bGVIZWlnaHQoKSx7bGVnZW5kSGl0Qm94ZXM6ZSxvcHRpb25zOnthbGlnbjppLGxhYmVsczp7cGFkZGluZzpzfSxydGw6bn19PXRoaXMsbz13aShuLHRoaXMubGVmdCx0aGlzLndpZHRoKTtpZih0aGlzLmlzSG9yaXpvbnRhbCgpKXtsZXQgbj0wLGE9ZnQoaSx0aGlzLmxlZnQrcyx0aGlzLnJpZ2h0LXRoaXMubGluZVdpZHRoc1tuXSk7Zm9yKGNvbnN0IHIgb2YgZSluIT09ci5yb3cmJihuPXIucm93LGE9ZnQoaSx0aGlzLmxlZnQrcyx0aGlzLnJpZ2h0LXRoaXMubGluZVdpZHRoc1tuXSkpLHIudG9wKz10aGlzLnRvcCt0K3Msci5sZWZ0PW8ubGVmdEZvckx0cihvLngoYSksci53aWR0aCksYSs9ci53aWR0aCtzfWVsc2V7bGV0IG49MCxhPWZ0KGksdGhpcy50b3ArdCtzLHRoaXMuYm90dG9tLXRoaXMuY29sdW1uU2l6ZXNbbl0uaGVpZ2h0KTtmb3IoY29uc3QgciBvZiBlKXIuY29sIT09biYmKG49ci5jb2wsYT1mdChpLHRoaXMudG9wK3Qrcyx0aGlzLmJvdHRvbS10aGlzLmNvbHVtblNpemVzW25dLmhlaWdodCkpLHIudG9wPWEsci5sZWZ0Kz10aGlzLmxlZnQrcyxyLmxlZnQ9by5sZWZ0Rm9yTHRyKG8ueChyLmxlZnQpLHIud2lkdGgpLGErPXIuaGVpZ2h0K3N9fWlzSG9yaXpvbnRhbCgpe3JldHVybiJ0b3AiPT09dGhpcy5vcHRpb25zLnBvc2l0aW9ufHwiYm90dG9tIj09PXRoaXMub3B0aW9ucy5wb3NpdGlvbn1kcmF3KCl7aWYodGhpcy5vcHRpb25zLmRpc3BsYXkpe2NvbnN0IHQ9dGhpcy5jdHg7T2UodCx0aGlzKSx0aGlzLl9kcmF3KCksQWUodCl9fV9kcmF3KCl7Y29uc3R7b3B0aW9uczp0LGNvbHVtblNpemVzOmUsbGluZVdpZHRoczppLGN0eDpzfT10aGlzLHthbGlnbjpuLGxhYmVsczpvfT10LGE9cmUuY29sb3Iscj13aSh0LnJ0bCx0aGlzLmxlZnQsdGhpcy53aWR0aCksaD1faShvLmZvbnQpLHtwYWRkaW5nOmN9PW8sZD1oLnNpemUsdT1kLzI7bGV0IGY7dGhpcy5kcmF3VGl0bGUoKSxzLnRleHRBbGlnbj1yLnRleHRBbGlnbigibGVmdCIpLHMudGV4dEJhc2VsaW5lPSJtaWRkbGUiLHMubGluZVdpZHRoPS41LHMuZm9udD1oLnN0cmluZztjb25zdHtib3hXaWR0aDpnLGJveEhlaWdodDpwLGl0ZW1IZWlnaHQ6bX09dGEobyxkKSxiPXRoaXMuaXNIb3Jpem9udGFsKCkseD10aGlzLl9jb21wdXRlVGl0bGVIZWlnaHQoKTtmPWI/e3g6ZnQobix0aGlzLmxlZnQrYyx0aGlzLnJpZ2h0LWlbMF0pLHk6dGhpcy50b3ArYyt4LGxpbmU6MH06e3g6dGhpcy5sZWZ0K2MseTpmdChuLHRoaXMudG9wK3grYyx0aGlzLmJvdHRvbS1lWzBdLmhlaWdodCksbGluZTowfSxraSh0aGlzLmN0eCx0LnRleHREaXJlY3Rpb24pO2NvbnN0IF89bStjO3RoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgoeSx2KT0+e3Muc3Ryb2tlU3R5bGU9eS5mb250Q29sb3Iscy5maWxsU3R5bGU9eS5mb250Q29sb3I7Y29uc3QgTT1zLm1lYXN1cmVUZXh0KHkudGV4dCkud2lkdGgsdz1yLnRleHRBbGlnbih5LnRleHRBbGlnbnx8KHkudGV4dEFsaWduPW8udGV4dEFsaWduKSksaz1nK3UrTTtsZXQgUz1mLngsUD1mLnk7aWYoci5zZXRXaWR0aCh0aGlzLndpZHRoKSxiP3Y+MCYmUytrK2M+dGhpcy5yaWdodCYmKFA9Zi55Kz1fLGYubGluZSsrLFM9Zi54PWZ0KG4sdGhpcy5sZWZ0K2MsdGhpcy5yaWdodC1pW2YubGluZV0pKTp2PjAmJlArXz50aGlzLmJvdHRvbSYmKFM9Zi54PVMrZVtmLmxpbmVdLndpZHRoK2MsZi5saW5lKyssUD1mLnk9ZnQobix0aGlzLnRvcCt4K2MsdGhpcy5ib3R0b20tZVtmLmxpbmVdLmhlaWdodCkpLGZ1bmN0aW9uKHQsZSxpKXtpZihpc05hTihnKXx8Zzw9MHx8aXNOYU4ocCl8fHA8MClyZXR1cm47cy5zYXZlKCk7Y29uc3Qgbj1sKGkubGluZVdpZHRoLDEpO2lmKHMuZmlsbFN0eWxlPWwoaS5maWxsU3R5bGUsYSkscy5saW5lQ2FwPWwoaS5saW5lQ2FwLCJidXR0Iikscy5saW5lRGFzaE9mZnNldD1sKGkubGluZURhc2hPZmZzZXQsMCkscy5saW5lSm9pbj1sKGkubGluZUpvaW4sIm1pdGVyIikscy5saW5lV2lkdGg9bixzLnN0cm9rZVN0eWxlPWwoaS5zdHJva2VTdHlsZSxhKSxzLnNldExpbmVEYXNoKGwoaS5saW5lRGFzaCxbXSkpLG8udXNlUG9pbnRTdHlsZSl7Y29uc3QgYT17cmFkaXVzOnAqTWF0aC5TUVJUMi8yLHBvaW50U3R5bGU6aS5wb2ludFN0eWxlLHJvdGF0aW9uOmkucm90YXRpb24sYm9yZGVyV2lkdGg6bn0sbD1yLnhQbHVzKHQsZy8yKTtEZShzLGEsbCxlK3Usby5wb2ludFN0eWxlV2lkdGgmJmcpfWVsc2V7Y29uc3Qgbz1lK01hdGgubWF4KChkLXApLzIsMCksYT1yLmxlZnRGb3JMdHIodCxnKSxsPWJpKGkuYm9yZGVyUmFkaXVzKTtzLmJlZ2luUGF0aCgpLE9iamVjdC52YWx1ZXMobCkuc29tZSh0PT4wIT09dCk/emUocyx7eDphLHk6byx3OmcsaDpwLHJhZGl1czpsfSk6cy5yZWN0KGEsbyxnLHApLHMuZmlsbCgpLDAhPT1uJiZzLnN0cm9rZSgpfXMucmVzdG9yZSgpfShyLngoUyksUCx5KSxTPWd0KHcsUytnK3UsYj9TK2s6dGhpcy5yaWdodCx0LnJ0bCksZnVuY3Rpb24odCxlLGkpe0llKHMsaS50ZXh0LHQsZSttLzIsaCx7c3RyaWtldGhyb3VnaDppLmhpZGRlbix0ZXh0QWxpZ246ci50ZXh0QWxpZ24oaS50ZXh0QWxpZ24pfSl9KHIueChTKSxQLHkpLGIpZi54Kz1rK2M7ZWxzZSBpZigic3RyaW5nIiE9dHlwZW9mIHkudGV4dCl7Y29uc3QgdD1oLmxpbmVIZWlnaHQ7Zi55Kz1pYSh5LHQpK2N9ZWxzZSBmLnkrPV99KSxTaSh0aGlzLmN0eCx0LnRleHREaXJlY3Rpb24pfWRyYXdUaXRsZSgpe2NvbnN0IHQ9dGhpcy5vcHRpb25zLGU9dC50aXRsZSxpPV9pKGUuZm9udCkscz14aShlLnBhZGRpbmcpO2lmKCFlLmRpc3BsYXkpcmV0dXJuO2NvbnN0IG49d2kodC5ydGwsdGhpcy5sZWZ0LHRoaXMud2lkdGgpLG89dGhpcy5jdHgsYT1lLnBvc2l0aW9uLHI9aS5zaXplLzIsbD1zLnRvcCtyO2xldCBoLGM9dGhpcy5sZWZ0LGQ9dGhpcy53aWR0aDtpZih0aGlzLmlzSG9yaXpvbnRhbCgpKWQ9TWF0aC5tYXgoLi4udGhpcy5saW5lV2lkdGhzKSxoPXRoaXMudG9wK2wsYz1mdCh0LmFsaWduLGMsdGhpcy5yaWdodC1kKTtlbHNle2NvbnN0IGU9dGhpcy5jb2x1bW5TaXplcy5yZWR1Y2UoKHQsZSk9Pk1hdGgubWF4KHQsZS5oZWlnaHQpLDApO2g9bCtmdCh0LmFsaWduLHRoaXMudG9wLHRoaXMuYm90dG9tLWUtdC5sYWJlbHMucGFkZGluZy10aGlzLl9jb21wdXRlVGl0bGVIZWlnaHQoKSl9Y29uc3QgdT1mdChhLGMsYytkKTtvLnRleHRBbGlnbj1uLnRleHRBbGlnbih1dChhKSksby50ZXh0QmFzZWxpbmU9Im1pZGRsZSIsby5zdHJva2VTdHlsZT1lLmNvbG9yLG8uZmlsbFN0eWxlPWUuY29sb3Isby5mb250PWkuc3RyaW5nLEllKG8sZS50ZXh0LHUsaCxpKX1fY29tcHV0ZVRpdGxlSGVpZ2h0KCl7Y29uc3QgdD10aGlzLm9wdGlvbnMudGl0bGUsZT1faSh0LmZvbnQpLGk9eGkodC5wYWRkaW5nKTtyZXR1cm4gdC5kaXNwbGF5P2UubGluZUhlaWdodCtpLmhlaWdodDowfV9nZXRMZWdlbmRJdGVtQXQodCxlKXtsZXQgaSxzLG47aWYodHQodCx0aGlzLmxlZnQsdGhpcy5yaWdodCkmJnR0KGUsdGhpcy50b3AsdGhpcy5ib3R0b20pKWZvcihuPXRoaXMubGVnZW5kSGl0Qm94ZXMsaT0wO2k8bi5sZW5ndGg7KytpKWlmKHM9bltpXSx0dCh0LHMubGVmdCxzLmxlZnQrcy53aWR0aCkmJnR0KGUscy50b3Ascy50b3Arcy5oZWlnaHQpKXJldHVybiB0aGlzLmxlZ2VuZEl0ZW1zW2ldO3JldHVybiBudWxsfWhhbmRsZUV2ZW50KHQpe2NvbnN0IGU9dGhpcy5vcHRpb25zO2lmKCFmdW5jdGlvbih0LGUpe3JldHVybiEoIm1vdXNlbW92ZSIhPT10JiYibW91c2VvdXQiIT09dHx8IWUub25Ib3ZlciYmIWUub25MZWF2ZSl8fCEoIWUub25DbGlja3x8ImNsaWNrIiE9PXQmJiJtb3VzZXVwIiE9PXQpfSh0LnR5cGUsZSkpcmV0dXJuO2NvbnN0IGk9dGhpcy5fZ2V0TGVnZW5kSXRlbUF0KHQueCx0LnkpO2lmKCJtb3VzZW1vdmUiPT09dC50eXBlfHwibW91c2VvdXQiPT09dC50eXBlKXtjb25zdCBvPXRoaXMuX2hvdmVyZWRJdGVtLGE9KG49aSxudWxsIT09KHM9bykmJm51bGwhPT1uJiZzLmRhdGFzZXRJbmRleD09PW4uZGF0YXNldEluZGV4JiZzLmluZGV4PT09bi5pbmRleCk7byYmIWEmJmQoZS5vbkxlYXZlLFt0LG8sdGhpc10sdGhpcyksdGhpcy5faG92ZXJlZEl0ZW09aSxpJiYhYSYmZChlLm9uSG92ZXIsW3QsaSx0aGlzXSx0aGlzKX1lbHNlIGkmJmQoZS5vbkNsaWNrLFt0LGksdGhpc10sdGhpcyk7dmFyIHMsbn19ZnVuY3Rpb24gaWEodCxlKXtyZXR1cm4gZSoodC50ZXh0P3QudGV4dC5sZW5ndGg6MCl9dmFyIHNhPXtpZDoibGVnZW5kIixfZWxlbWVudDplYSxzdGFydCh0LGUsaSl7Y29uc3Qgcz10LmxlZ2VuZD1uZXcgZWEoe2N0eDp0LmN0eCxvcHRpb25zOmksY2hhcnQ6dH0pO0ppLmNvbmZpZ3VyZSh0LHMsaSksSmkuYWRkQm94KHQscyl9LHN0b3AodCl7SmkucmVtb3ZlQm94KHQsdC5sZWdlbmQpLGRlbGV0ZSB0LmxlZ2VuZH0sYmVmb3JlVXBkYXRlKHQsZSxpKXtjb25zdCBzPXQubGVnZW5kO0ppLmNvbmZpZ3VyZSh0LHMsaSkscy5vcHRpb25zPWl9LGFmdGVyVXBkYXRlKHQpe2NvbnN0IGU9dC5sZWdlbmQ7ZS5idWlsZExhYmVscygpLGUuYWRqdXN0SGl0Qm94ZXMoKX0sYWZ0ZXJFdmVudCh0LGUpe2UucmVwbGF5fHx0LmxlZ2VuZC5oYW5kbGVFdmVudChlLmV2ZW50KX0sZGVmYXVsdHM6e2Rpc3BsYXk6ITAscG9zaXRpb246InRvcCIsYWxpZ246ImNlbnRlciIsZnVsbFNpemU6ITAscmV2ZXJzZTohMSx3ZWlnaHQ6MWUzLG9uQ2xpY2sodCxlLGkpe2NvbnN0IHM9ZS5kYXRhc2V0SW5kZXgsbj1pLmNoYXJ0O24uaXNEYXRhc2V0VmlzaWJsZShzKT8obi5oaWRlKHMpLGUuaGlkZGVuPSEwKToobi5zaG93KHMpLGUuaGlkZGVuPSExKX0sb25Ib3ZlcjpudWxsLG9uTGVhdmU6bnVsbCxsYWJlbHM6e2NvbG9yOnQ9PnQuY2hhcnQub3B0aW9ucy5jb2xvcixib3hXaWR0aDo0MCxwYWRkaW5nOjEwLGdlbmVyYXRlTGFiZWxzKHQpe2NvbnN0IGU9dC5kYXRhLmRhdGFzZXRzLHtsYWJlbHM6e3VzZVBvaW50U3R5bGU6aSxwb2ludFN0eWxlOnMsdGV4dEFsaWduOm4sY29sb3I6byx1c2VCb3JkZXJSYWRpdXM6YSxib3JkZXJSYWRpdXM6cn19PXQubGVnZW5kLm9wdGlvbnM7cmV0dXJuIHQuX2dldFNvcnRlZERhdGFzZXRNZXRhcygpLm1hcCh0PT57Y29uc3QgbD10LmNvbnRyb2xsZXIuZ2V0U3R5bGUoaT8wOnZvaWQgMCksaD14aShsLmJvcmRlcldpZHRoKTtyZXR1cm57dGV4dDplW3QuaW5kZXhdLmxhYmVsLGZpbGxTdHlsZTpsLmJhY2tncm91bmRDb2xvcixmb250Q29sb3I6byxoaWRkZW46IXQudmlzaWJsZSxsaW5lQ2FwOmwuYm9yZGVyQ2FwU3R5bGUsbGluZURhc2g6bC5ib3JkZXJEYXNoLGxpbmVEYXNoT2Zmc2V0OmwuYm9yZGVyRGFzaE9mZnNldCxsaW5lSm9pbjpsLmJvcmRlckpvaW5TdHlsZSxsaW5lV2lkdGg6KGgud2lkdGgraC5oZWlnaHQpLzQsc3Ryb2tlU3R5bGU6bC5ib3JkZXJDb2xvcixwb2ludFN0eWxlOnN8fGwucG9pbnRTdHlsZSxyb3RhdGlvbjpsLnJvdGF0aW9uLHRleHRBbGlnbjpufHxsLnRleHRBbGlnbixib3JkZXJSYWRpdXM6YSYmKHJ8fGwuYm9yZGVyUmFkaXVzKSxkYXRhc2V0SW5kZXg6dC5pbmRleH19LHRoaXMpfX0sdGl0bGU6e2NvbG9yOnQ9PnQuY2hhcnQub3B0aW9ucy5jb2xvcixkaXNwbGF5OiExLHBvc2l0aW9uOiJjZW50ZXIiLHRleHQ6IiJ9fSxkZXNjcmlwdG9yczp7X3NjcmlwdGFibGU6dD0+IXQuc3RhcnRzV2l0aCgib24iKSxsYWJlbHM6e19zY3JpcHRhYmxlOnQ9PiFbImdlbmVyYXRlTGFiZWxzIiwiZmlsdGVyIiwic29ydCJdLmluY2x1ZGVzKHQpfX19O2NsYXNzIG5hIGV4dGVuZHMgUnN7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmNoYXJ0PXQuY2hhcnQsdGhpcy5vcHRpb25zPXQub3B0aW9ucyx0aGlzLmN0eD10LmN0eCx0aGlzLl9wYWRkaW5nPXZvaWQgMCx0aGlzLnRvcD12b2lkIDAsdGhpcy5ib3R0b209dm9pZCAwLHRoaXMubGVmdD12b2lkIDAsdGhpcy5yaWdodD12b2lkIDAsdGhpcy53aWR0aD12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMucG9zaXRpb249dm9pZCAwLHRoaXMud2VpZ2h0PXZvaWQgMCx0aGlzLmZ1bGxTaXplPXZvaWQgMH11cGRhdGUodCxlKXtjb25zdCBpPXRoaXMub3B0aW9ucztpZih0aGlzLmxlZnQ9MCx0aGlzLnRvcD0wLCFpLmRpc3BsYXkpcmV0dXJuIHZvaWQodGhpcy53aWR0aD10aGlzLmhlaWdodD10aGlzLnJpZ2h0PXRoaXMuYm90dG9tPTApO3RoaXMud2lkdGg9dGhpcy5yaWdodD10LHRoaXMuaGVpZ2h0PXRoaXMuYm90dG9tPWU7Y29uc3Qgcz1uKGkudGV4dCk/aS50ZXh0Lmxlbmd0aDoxO3RoaXMuX3BhZGRpbmc9eGkoaS5wYWRkaW5nKTtjb25zdCBvPXMqX2koaS5mb250KS5saW5lSGVpZ2h0K3RoaXMuX3BhZGRpbmcuaGVpZ2h0O3RoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQ9bzp0aGlzLndpZHRoPW99aXNIb3Jpem9udGFsKCl7Y29uc3QgdD10aGlzLm9wdGlvbnMucG9zaXRpb247cmV0dXJuInRvcCI9PT10fHwiYm90dG9tIj09PXR9X2RyYXdBcmdzKHQpe2NvbnN0e3RvcDplLGxlZnQ6aSxib3R0b206cyxyaWdodDpuLG9wdGlvbnM6b309dGhpcyxhPW8uYWxpZ247bGV0IHIsbCxoLGM9MDtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKT8obD1mdChhLGksbiksaD1lK3Qscj1uLWkpOigibGVmdCI9PT1vLnBvc2l0aW9uPyhsPWkrdCxoPWZ0KGEscyxlKSxjPS0uNSpDKToobD1uLXQsaD1mdChhLGUscyksYz0uNSpDKSxyPXMtZSkse3RpdGxlWDpsLHRpdGxlWTpoLG1heFdpZHRoOnIscm90YXRpb246Y319ZHJhdygpe2NvbnN0IHQ9dGhpcy5jdHgsZT10aGlzLm9wdGlvbnM7aWYoIWUuZGlzcGxheSlyZXR1cm47Y29uc3QgaT1faShlLmZvbnQpLHM9aS5saW5lSGVpZ2h0LzIrdGhpcy5fcGFkZGluZy50b3Ase3RpdGxlWDpuLHRpdGxlWTpvLG1heFdpZHRoOmEscm90YXRpb246cn09dGhpcy5fZHJhd0FyZ3Mocyk7SWUodCxlLnRleHQsMCwwLGkse2NvbG9yOmUuY29sb3IsbWF4V2lkdGg6YSxyb3RhdGlvbjpyLHRleHRBbGlnbjp1dChlLmFsaWduKSx0ZXh0QmFzZWxpbmU6Im1pZGRsZSIsdHJhbnNsYXRpb246W24sb119KX19dmFyIG9hPXtpZDoidGl0bGUiLF9lbGVtZW50Om5hLHN0YXJ0KHQsZSxpKXshZnVuY3Rpb24odCxlKXtjb25zdCBpPW5ldyBuYSh7Y3R4OnQuY3R4LG9wdGlvbnM6ZSxjaGFydDp0fSk7SmkuY29uZmlndXJlKHQsaSxlKSxKaS5hZGRCb3godCxpKSx0LnRpdGxlQmxvY2s9aX0odCxpKX0sc3RvcCh0KXtjb25zdCBlPXQudGl0bGVCbG9jaztKaS5yZW1vdmVCb3godCxlKSxkZWxldGUgdC50aXRsZUJsb2NrfSxiZWZvcmVVcGRhdGUodCxlLGkpe2NvbnN0IHM9dC50aXRsZUJsb2NrO0ppLmNvbmZpZ3VyZSh0LHMsaSkscy5vcHRpb25zPWl9LGRlZmF1bHRzOnthbGlnbjoiY2VudGVyIixkaXNwbGF5OiExLGZvbnQ6e3dlaWdodDoiYm9sZCJ9LGZ1bGxTaXplOiEwLHBhZGRpbmc6MTAscG9zaXRpb246InRvcCIsdGV4dDoiIix3ZWlnaHQ6MmUzfSxkZWZhdWx0Um91dGVzOntjb2xvcjoiY29sb3IifSxkZXNjcmlwdG9yczp7X3NjcmlwdGFibGU6ITAsX2luZGV4YWJsZTohMX19O2NvbnN0IGFhPW5ldyBXZWFrTWFwO3ZhciByYT17aWQ6InN1YnRpdGxlIixzdGFydCh0LGUsaSl7Y29uc3Qgcz1uZXcgbmEoe2N0eDp0LmN0eCxvcHRpb25zOmksY2hhcnQ6dH0pO0ppLmNvbmZpZ3VyZSh0LHMsaSksSmkuYWRkQm94KHQscyksYWEuc2V0KHQscyl9LHN0b3AodCl7SmkucmVtb3ZlQm94KHQsYWEuZ2V0KHQpKSxhYS5kZWxldGUodCl9LGJlZm9yZVVwZGF0ZSh0LGUsaSl7Y29uc3Qgcz1hYS5nZXQodCk7SmkuY29uZmlndXJlKHQscyxpKSxzLm9wdGlvbnM9aX0sZGVmYXVsdHM6e2FsaWduOiJjZW50ZXIiLGRpc3BsYXk6ITEsZm9udDp7d2VpZ2h0OiJub3JtYWwifSxmdWxsU2l6ZTohMCxwYWRkaW5nOjAscG9zaXRpb246InRvcCIsdGV4dDoiIix3ZWlnaHQ6MTUwMH0sZGVmYXVsdFJvdXRlczp7Y29sb3I6ImNvbG9yIn0sZGVzY3JpcHRvcnM6e19zY3JpcHRhYmxlOiEwLF9pbmRleGFibGU6ITF9fTtjb25zdCBsYT17YXZlcmFnZSh0KXtpZighdC5sZW5ndGgpcmV0dXJuITE7bGV0IGUsaSxzPTAsbj0wLG89MDtmb3IoZT0wLGk9dC5sZW5ndGg7ZTxpOysrZSl7Y29uc3QgaT10W2VdLmVsZW1lbnQ7aWYoaSYmaS5oYXNWYWx1ZSgpKXtjb25zdCB0PWkudG9vbHRpcFBvc2l0aW9uKCk7cys9dC54LG4rPXQueSwrK299fXJldHVybnt4OnMvbyx5Om4vb319LG5lYXJlc3QodCxlKXtpZighdC5sZW5ndGgpcmV0dXJuITE7bGV0IGkscyxuLG89ZS54LGE9ZS55LHI9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO2ZvcihpPTAscz10Lmxlbmd0aDtpPHM7KytpKXtjb25zdCBzPXRbaV0uZWxlbWVudDtpZihzJiZzLmhhc1ZhbHVlKCkpe2NvbnN0IHQ9cShlLHMuZ2V0Q2VudGVyUG9pbnQoKSk7dDxyJiYocj10LG49cyl9fWlmKG4pe2NvbnN0IHQ9bi50b29sdGlwUG9zaXRpb24oKTtvPXQueCxhPXQueX1yZXR1cm57eDpvLHk6YX19fTtmdW5jdGlvbiBoYSh0LGUpe3JldHVybiBlJiYobihlKT9BcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0LGUpOnQucHVzaChlKSksdH1mdW5jdGlvbiBjYSh0KXtyZXR1cm4oInN0cmluZyI9PXR5cGVvZiB0fHx0IGluc3RhbmNlb2YgU3RyaW5nKSYmdC5pbmRleE9mKCJcbiIpPi0xP3Quc3BsaXQoIlxuIik6dH1mdW5jdGlvbiBkYSh0LGUpe2NvbnN0e2VsZW1lbnQ6aSxkYXRhc2V0SW5kZXg6cyxpbmRleDpufT1lLG89dC5nZXREYXRhc2V0TWV0YShzKS5jb250cm9sbGVyLHtsYWJlbDphLHZhbHVlOnJ9PW8uZ2V0TGFiZWxBbmRWYWx1ZShuKTtyZXR1cm57Y2hhcnQ6dCxsYWJlbDphLHBhcnNlZDpvLmdldFBhcnNlZChuKSxyYXc6dC5kYXRhLmRhdGFzZXRzW3NdLmRhdGFbbl0sZm9ybWF0dGVkVmFsdWU6cixkYXRhc2V0Om8uZ2V0RGF0YXNldCgpLGRhdGFJbmRleDpuLGRhdGFzZXRJbmRleDpzLGVsZW1lbnQ6aX19ZnVuY3Rpb24gdWEodCxlKXtjb25zdCBpPXQuY2hhcnQuY3R4LHtib2R5OnMsZm9vdGVyOm4sdGl0bGU6b309dCx7Ym94V2lkdGg6YSxib3hIZWlnaHQ6cn09ZSxsPV9pKGUuYm9keUZvbnQpLGg9X2koZS50aXRsZUZvbnQpLGM9X2koZS5mb290ZXJGb250KSxkPW8ubGVuZ3RoLGY9bi5sZW5ndGgsZz1zLmxlbmd0aCxwPXhpKGUucGFkZGluZyk7bGV0IG09cC5oZWlnaHQsYj0wLHg9cy5yZWR1Y2UoKHQsZSk9PnQrZS5iZWZvcmUubGVuZ3RoK2UubGluZXMubGVuZ3RoK2UuYWZ0ZXIubGVuZ3RoLDApO3grPXQuYmVmb3JlQm9keS5sZW5ndGgrdC5hZnRlckJvZHkubGVuZ3RoLGQmJihtKz1kKmgubGluZUhlaWdodCsoZC0xKSplLnRpdGxlU3BhY2luZytlLnRpdGxlTWFyZ2luQm90dG9tKSx4JiYobSs9ZyooZS5kaXNwbGF5Q29sb3JzP01hdGgubWF4KHIsbC5saW5lSGVpZ2h0KTpsLmxpbmVIZWlnaHQpKyh4LWcpKmwubGluZUhlaWdodCsoeC0xKSplLmJvZHlTcGFjaW5nKSxmJiYobSs9ZS5mb290ZXJNYXJnaW5Ub3ArZipjLmxpbmVIZWlnaHQrKGYtMSkqZS5mb290ZXJTcGFjaW5nKTtsZXQgXz0wO2NvbnN0IHk9ZnVuY3Rpb24odCl7Yj1NYXRoLm1heChiLGkubWVhc3VyZVRleHQodCkud2lkdGgrXyl9O3JldHVybiBpLnNhdmUoKSxpLmZvbnQ9aC5zdHJpbmcsdSh0LnRpdGxlLHkpLGkuZm9udD1sLnN0cmluZyx1KHQuYmVmb3JlQm9keS5jb25jYXQodC5hZnRlckJvZHkpLHkpLF89ZS5kaXNwbGF5Q29sb3JzP2ErMitlLmJveFBhZGRpbmc6MCx1KHMsdD0+e3UodC5iZWZvcmUseSksdSh0LmxpbmVzLHkpLHUodC5hZnRlcix5KX0pLF89MCxpLmZvbnQ9Yy5zdHJpbmcsdSh0LmZvb3Rlcix5KSxpLnJlc3RvcmUoKSxiKz1wLndpZHRoLHt3aWR0aDpiLGhlaWdodDptfX1mdW5jdGlvbiBmYSh0LGUsaSxzKXtjb25zdHt4Om4sd2lkdGg6b309aSx7d2lkdGg6YSxjaGFydEFyZWE6e2xlZnQ6cixyaWdodDpsfX09dDtsZXQgaD0iY2VudGVyIjtyZXR1cm4iY2VudGVyIj09PXM/aD1uPD0ocitsKS8yPyJsZWZ0IjoicmlnaHQiOm48PW8vMj9oPSJsZWZ0IjpuPj1hLW8vMiYmKGg9InJpZ2h0IiksZnVuY3Rpb24odCxlLGkscyl7Y29uc3R7eDpuLHdpZHRoOm99PXMsYT1pLmNhcmV0U2l6ZStpLmNhcmV0UGFkZGluZztyZXR1cm4ibGVmdCI9PT10JiZuK28rYT5lLndpZHRofHwicmlnaHQiPT09dCYmbi1vLWE8MHx8dm9pZCAwfShoLHQsZSxpKSYmKGg9ImNlbnRlciIpLGh9ZnVuY3Rpb24gZ2EodCxlLGkpe2NvbnN0IHM9aS55QWxpZ258fGUueUFsaWdufHxmdW5jdGlvbih0LGUpe2NvbnN0e3k6aSxoZWlnaHQ6c309ZTtyZXR1cm4gaTxzLzI/InRvcCI6aT50LmhlaWdodC1zLzI/ImJvdHRvbSI6ImNlbnRlciJ9KHQsaSk7cmV0dXJue3hBbGlnbjppLnhBbGlnbnx8ZS54QWxpZ258fGZhKHQsZSxpLHMpLHlBbGlnbjpzfX1mdW5jdGlvbiBwYSh0LGUsaSxzKXtjb25zdHtjYXJldFNpemU6bixjYXJldFBhZGRpbmc6byxjb3JuZXJSYWRpdXM6YX09dCx7eEFsaWduOnIseUFsaWduOmx9PWksaD1uK28se3RvcExlZnQ6Yyx0b3BSaWdodDpkLGJvdHRvbUxlZnQ6dSxib3R0b21SaWdodDpmfT1iaShhKTtsZXQgZz1mdW5jdGlvbih0LGUpe2xldHt4Omksd2lkdGg6c309dDtyZXR1cm4icmlnaHQiPT09ZT9pLT1zOiJjZW50ZXIiPT09ZSYmKGktPXMvMiksaX0oZSxyKTtjb25zdCBwPWZ1bmN0aW9uKHQsZSxpKXtsZXR7eTpzLGhlaWdodDpufT10O3JldHVybiJ0b3AiPT09ZT9zKz1pOnMtPSJib3R0b20iPT09ZT9uK2k6bi8yLHN9KGUsbCxoKTtyZXR1cm4iY2VudGVyIj09PWw/ImxlZnQiPT09cj9nKz1oOiJyaWdodCI9PT1yJiYoZy09aCk6ImxlZnQiPT09cj9nLT1NYXRoLm1heChjLHUpK246InJpZ2h0Ij09PXImJihnKz1NYXRoLm1heChkLGYpK24pLHt4OkooZywwLHMud2lkdGgtZS53aWR0aCkseTpKKHAsMCxzLmhlaWdodC1lLmhlaWdodCl9fWZ1bmN0aW9uIG1hKHQsZSxpKXtjb25zdCBzPXhpKGkucGFkZGluZyk7cmV0dXJuImNlbnRlciI9PT1lP3QueCt0LndpZHRoLzI6InJpZ2h0Ij09PWU/dC54K3Qud2lkdGgtcy5yaWdodDp0Lngrcy5sZWZ0fWZ1bmN0aW9uIGJhKHQpe3JldHVybiBoYShbXSxjYSh0KSl9ZnVuY3Rpb24geGEodCxlKXtjb25zdCBpPWUmJmUuZGF0YXNldCYmZS5kYXRhc2V0LnRvb2x0aXAmJmUuZGF0YXNldC50b29sdGlwLmNhbGxiYWNrcztyZXR1cm4gaT90Lm92ZXJyaWRlKGkpOnR9Y29uc3QgX2E9e2JlZm9yZVRpdGxlOmUsdGl0bGUodCl7aWYodC5sZW5ndGg+MCl7Y29uc3QgZT10WzBdLGk9ZS5jaGFydC5kYXRhLmxhYmVscyxzPWk/aS5sZW5ndGg6MDtpZih0aGlzJiZ0aGlzLm9wdGlvbnMmJiJkYXRhc2V0Ij09PXRoaXMub3B0aW9ucy5tb2RlKXJldHVybiBlLmRhdGFzZXQubGFiZWx8fCIiO2lmKGUubGFiZWwpcmV0dXJuIGUubGFiZWw7aWYocz4wJiZlLmRhdGFJbmRleDxzKXJldHVybiBpW2UuZGF0YUluZGV4XX1yZXR1cm4iIn0sYWZ0ZXJUaXRsZTplLGJlZm9yZUJvZHk6ZSxiZWZvcmVMYWJlbDplLGxhYmVsKHQpe2lmKHRoaXMmJnRoaXMub3B0aW9ucyYmImRhdGFzZXQiPT09dGhpcy5vcHRpb25zLm1vZGUpcmV0dXJuIHQubGFiZWwrIjogIit0LmZvcm1hdHRlZFZhbHVlfHx0LmZvcm1hdHRlZFZhbHVlO2xldCBlPXQuZGF0YXNldC5sYWJlbHx8IiI7ZSYmKGUrPSI6ICIpO2NvbnN0IGk9dC5mb3JtYXR0ZWRWYWx1ZTtyZXR1cm4gcyhpKXx8KGUrPWkpLGV9LGxhYmVsQ29sb3IodCl7Y29uc3QgZT10LmNoYXJ0LmdldERhdGFzZXRNZXRhKHQuZGF0YXNldEluZGV4KS5jb250cm9sbGVyLmdldFN0eWxlKHQuZGF0YUluZGV4KTtyZXR1cm57Ym9yZGVyQ29sb3I6ZS5ib3JkZXJDb2xvcixiYWNrZ3JvdW5kQ29sb3I6ZS5iYWNrZ3JvdW5kQ29sb3IsYm9yZGVyV2lkdGg6ZS5ib3JkZXJXaWR0aCxib3JkZXJEYXNoOmUuYm9yZGVyRGFzaCxib3JkZXJEYXNoT2Zmc2V0OmUuYm9yZGVyRGFzaE9mZnNldCxib3JkZXJSYWRpdXM6MH19LGxhYmVsVGV4dENvbG9yKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5ib2R5Q29sb3J9LGxhYmVsUG9pbnRTdHlsZSh0KXtjb25zdCBlPXQuY2hhcnQuZ2V0RGF0YXNldE1ldGEodC5kYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXIuZ2V0U3R5bGUodC5kYXRhSW5kZXgpO3JldHVybntwb2ludFN0eWxlOmUucG9pbnRTdHlsZSxyb3RhdGlvbjplLnJvdGF0aW9ufX0sYWZ0ZXJMYWJlbDplLGFmdGVyQm9keTplLGJlZm9yZUZvb3RlcjplLGZvb3RlcjplLGFmdGVyRm9vdGVyOmV9O2Z1bmN0aW9uIHlhKHQsZSxpLHMpe2NvbnN0IG49dFtlXS5jYWxsKGkscyk7cmV0dXJuIHZvaWQgMD09PW4/X2FbZV0uY2FsbChpLHMpOm59Y2xhc3MgdmEgZXh0ZW5kcyBSc3tzdGF0aWMgcG9zaXRpb25lcnM9bGE7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLm9wYWNpdHk9MCx0aGlzLl9hY3RpdmU9W10sdGhpcy5fZXZlbnRQb3NpdGlvbj12b2lkIDAsdGhpcy5fc2l6ZT12b2lkIDAsdGhpcy5fY2FjaGVkQW5pbWF0aW9ucz12b2lkIDAsdGhpcy5fdG9vbHRpcEl0ZW1zPVtdLHRoaXMuJGFuaW1hdGlvbnM9dm9pZCAwLHRoaXMuJGNvbnRleHQ9dm9pZCAwLHRoaXMuY2hhcnQ9dC5jaGFydCx0aGlzLm9wdGlvbnM9dC5vcHRpb25zLHRoaXMuZGF0YVBvaW50cz12b2lkIDAsdGhpcy50aXRsZT12b2lkIDAsdGhpcy5iZWZvcmVCb2R5PXZvaWQgMCx0aGlzLmJvZHk9dm9pZCAwLHRoaXMuYWZ0ZXJCb2R5PXZvaWQgMCx0aGlzLmZvb3Rlcj12b2lkIDAsdGhpcy54QWxpZ249dm9pZCAwLHRoaXMueUFsaWduPXZvaWQgMCx0aGlzLng9dm9pZCAwLHRoaXMueT12b2lkIDAsdGhpcy5oZWlnaHQ9dm9pZCAwLHRoaXMud2lkdGg9dm9pZCAwLHRoaXMuY2FyZXRYPXZvaWQgMCx0aGlzLmNhcmV0WT12b2lkIDAsdGhpcy5sYWJlbENvbG9ycz12b2lkIDAsdGhpcy5sYWJlbFBvaW50U3R5bGVzPXZvaWQgMCx0aGlzLmxhYmVsVGV4dENvbG9ycz12b2lkIDB9aW5pdGlhbGl6ZSh0KXt0aGlzLm9wdGlvbnM9dCx0aGlzLl9jYWNoZWRBbmltYXRpb25zPXZvaWQgMCx0aGlzLiRjb250ZXh0PXZvaWQgMH1fcmVzb2x2ZUFuaW1hdGlvbnMoKXtjb25zdCB0PXRoaXMuX2NhY2hlZEFuaW1hdGlvbnM7aWYodClyZXR1cm4gdDtjb25zdCBlPXRoaXMuY2hhcnQsaT10aGlzLm9wdGlvbnMuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSkscz1pLmVuYWJsZWQmJmUub3B0aW9ucy5hbmltYXRpb24mJmkuYW5pbWF0aW9ucyxuPW5ldyB2cyh0aGlzLmNoYXJ0LHMpO3JldHVybiBzLl9jYWNoZWFibGUmJih0aGlzLl9jYWNoZWRBbmltYXRpb25zPU9iamVjdC5mcmVlemUobikpLG59Z2V0Q29udGV4dCgpe3JldHVybiB0aGlzLiRjb250ZXh0fHwodGhpcy4kY29udGV4dD1NaSh0aGlzLmNoYXJ0LmdldENvbnRleHQoKSx7dG9vbHRpcDp0aGlzLHRvb2x0aXBJdGVtczp0aGlzLl90b29sdGlwSXRlbXMsdHlwZToidG9vbHRpcCJ9KSl9Z2V0VGl0bGUodCxlKXtjb25zdHtjYWxsYmFja3M6aX09ZSxzPXlhKGksImJlZm9yZVRpdGxlIix0aGlzLHQpLG49eWEoaSwidGl0bGUiLHRoaXMsdCksbz15YShpLCJhZnRlclRpdGxlIix0aGlzLHQpO2xldCBhPVtdO3JldHVybiBhPWhhKGEsY2EocykpLGE9aGEoYSxjYShuKSksYT1oYShhLGNhKG8pKSxhfWdldEJlZm9yZUJvZHkodCxlKXtyZXR1cm4gYmEoeWEoZS5jYWxsYmFja3MsImJlZm9yZUJvZHkiLHRoaXMsdCkpfWdldEJvZHkodCxlKXtjb25zdHtjYWxsYmFja3M6aX09ZSxzPVtdO3JldHVybiB1KHQsdD0+e2NvbnN0IGU9e2JlZm9yZTpbXSxsaW5lczpbXSxhZnRlcjpbXX0sbj14YShpLHQpO2hhKGUuYmVmb3JlLGNhKHlhKG4sImJlZm9yZUxhYmVsIix0aGlzLHQpKSksaGEoZS5saW5lcyx5YShuLCJsYWJlbCIsdGhpcyx0KSksaGEoZS5hZnRlcixjYSh5YShuLCJhZnRlckxhYmVsIix0aGlzLHQpKSkscy5wdXNoKGUpfSksc31nZXRBZnRlckJvZHkodCxlKXtyZXR1cm4gYmEoeWEoZS5jYWxsYmFja3MsImFmdGVyQm9keSIsdGhpcyx0KSl9Z2V0Rm9vdGVyKHQsZSl7Y29uc3R7Y2FsbGJhY2tzOml9PWUscz15YShpLCJiZWZvcmVGb290ZXIiLHRoaXMsdCksbj15YShpLCJmb290ZXIiLHRoaXMsdCksbz15YShpLCJhZnRlckZvb3RlciIsdGhpcyx0KTtsZXQgYT1bXTtyZXR1cm4gYT1oYShhLGNhKHMpKSxhPWhhKGEsY2EobikpLGE9aGEoYSxjYShvKSksYX1fY3JlYXRlSXRlbXModCl7Y29uc3QgZT10aGlzLl9hY3RpdmUsaT10aGlzLmNoYXJ0LmRhdGEscz1bXSxuPVtdLG89W107bGV0IGEscixsPVtdO2ZvcihhPTAscj1lLmxlbmd0aDthPHI7KythKWwucHVzaChkYSh0aGlzLmNoYXJ0LGVbYV0pKTtyZXR1cm4gdC5maWx0ZXImJihsPWwuZmlsdGVyKChlLHMsbik9PnQuZmlsdGVyKGUscyxuLGkpKSksdC5pdGVtU29ydCYmKGw9bC5zb3J0KChlLHMpPT50Lml0ZW1Tb3J0KGUscyxpKSkpLHUobCxlPT57Y29uc3QgaT14YSh0LmNhbGxiYWNrcyxlKTtzLnB1c2goeWEoaSwibGFiZWxDb2xvciIsdGhpcyxlKSksbi5wdXNoKHlhKGksImxhYmVsUG9pbnRTdHlsZSIsdGhpcyxlKSksby5wdXNoKHlhKGksImxhYmVsVGV4dENvbG9yIix0aGlzLGUpKX0pLHRoaXMubGFiZWxDb2xvcnM9cyx0aGlzLmxhYmVsUG9pbnRTdHlsZXM9bix0aGlzLmxhYmVsVGV4dENvbG9ycz1vLHRoaXMuZGF0YVBvaW50cz1sLGx9dXBkYXRlKHQsZSl7Y29uc3QgaT10aGlzLm9wdGlvbnMuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSkscz10aGlzLl9hY3RpdmU7bGV0IG4sbz1bXTtpZihzLmxlbmd0aCl7Y29uc3QgdD1sYVtpLnBvc2l0aW9uXS5jYWxsKHRoaXMscyx0aGlzLl9ldmVudFBvc2l0aW9uKTtvPXRoaXMuX2NyZWF0ZUl0ZW1zKGkpLHRoaXMudGl0bGU9dGhpcy5nZXRUaXRsZShvLGkpLHRoaXMuYmVmb3JlQm9keT10aGlzLmdldEJlZm9yZUJvZHkobyxpKSx0aGlzLmJvZHk9dGhpcy5nZXRCb2R5KG8saSksdGhpcy5hZnRlckJvZHk9dGhpcy5nZXRBZnRlckJvZHkobyxpKSx0aGlzLmZvb3Rlcj10aGlzLmdldEZvb3RlcihvLGkpO2NvbnN0IGU9dGhpcy5fc2l6ZT11YSh0aGlzLGkpLGE9T2JqZWN0LmFzc2lnbih7fSx0LGUpLHI9Z2EodGhpcy5jaGFydCxpLGEpLGw9cGEoaSxhLHIsdGhpcy5jaGFydCk7dGhpcy54QWxpZ249ci54QWxpZ24sdGhpcy55QWxpZ249ci55QWxpZ24sbj17b3BhY2l0eToxLHg6bC54LHk6bC55LHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LGNhcmV0WDp0LngsY2FyZXRZOnQueX19ZWxzZSAwIT09dGhpcy5vcGFjaXR5JiYobj17b3BhY2l0eTowfSk7dGhpcy5fdG9vbHRpcEl0ZW1zPW8sdGhpcy4kY29udGV4dD12b2lkIDAsbiYmdGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnMoKS51cGRhdGUodGhpcyxuKSx0JiZpLmV4dGVybmFsJiZpLmV4dGVybmFsLmNhbGwodGhpcyx7Y2hhcnQ6dGhpcy5jaGFydCx0b29sdGlwOnRoaXMscmVwbGF5OmV9KX1kcmF3Q2FyZXQodCxlLGkscyl7Y29uc3Qgbj10aGlzLmdldENhcmV0UG9zaXRpb24odCxpLHMpO2UubGluZVRvKG4ueDEsbi55MSksZS5saW5lVG8obi54MixuLnkyKSxlLmxpbmVUbyhuLngzLG4ueTMpfWdldENhcmV0UG9zaXRpb24odCxlLGkpe2NvbnN0e3hBbGlnbjpzLHlBbGlnbjpufT10aGlzLHtjYXJldFNpemU6byxjb3JuZXJSYWRpdXM6YX09aSx7dG9wTGVmdDpyLHRvcFJpZ2h0OmwsYm90dG9tTGVmdDpoLGJvdHRvbVJpZ2h0OmN9PWJpKGEpLHt4OmQseTp1fT10LHt3aWR0aDpmLGhlaWdodDpnfT1lO2xldCBwLG0sYix4LF8seTtyZXR1cm4iY2VudGVyIj09PW4/KF89dStnLzIsImxlZnQiPT09cz8ocD1kLG09cC1vLHg9XytvLHk9Xy1vKToocD1kK2YsbT1wK28seD1fLW8seT1fK28pLGI9cCk6KG09ImxlZnQiPT09cz9kK01hdGgubWF4KHIsaCkrbzoicmlnaHQiPT09cz9kK2YtTWF0aC5tYXgobCxjKS1vOnRoaXMuY2FyZXRYLCJ0b3AiPT09bj8oeD11LF89eC1vLHA9bS1vLGI9bStvKTooeD11K2csXz14K28scD1tK28sYj1tLW8pLHk9eCkse3gxOnAseDI6bSx4MzpiLHkxOngseTI6Xyx5Mzp5fX1kcmF3VGl0bGUodCxlLGkpe2NvbnN0IHM9dGhpcy50aXRsZSxuPXMubGVuZ3RoO2xldCBvLGEscjtpZihuKXtjb25zdCBsPXdpKGkucnRsLHRoaXMueCx0aGlzLndpZHRoKTtmb3IodC54PW1hKHRoaXMsaS50aXRsZUFsaWduLGkpLGUudGV4dEFsaWduPWwudGV4dEFsaWduKGkudGl0bGVBbGlnbiksZS50ZXh0QmFzZWxpbmU9Im1pZGRsZSIsbz1faShpLnRpdGxlRm9udCksYT1pLnRpdGxlU3BhY2luZyxlLmZpbGxTdHlsZT1pLnRpdGxlQ29sb3IsZS5mb250PW8uc3RyaW5nLHI9MDtyPG47KytyKWUuZmlsbFRleHQoc1tyXSxsLngodC54KSx0Lnkrby5saW5lSGVpZ2h0LzIpLHQueSs9by5saW5lSGVpZ2h0K2EscisxPT09biYmKHQueSs9aS50aXRsZU1hcmdpbkJvdHRvbS1hKX19X2RyYXdDb2xvckJveCh0LGUsaSxzLG4pe2NvbnN0IGE9dGhpcy5sYWJlbENvbG9yc1tpXSxyPXRoaXMubGFiZWxQb2ludFN0eWxlc1tpXSx7Ym94SGVpZ2h0OmwsYm94V2lkdGg6aH09bixjPV9pKG4uYm9keUZvbnQpLGQ9bWEodGhpcywibGVmdCIsbiksdT1zLngoZCksZj1sPGMubGluZUhlaWdodD8oYy5saW5lSGVpZ2h0LWwpLzI6MCxnPWUueStmO2lmKG4udXNlUG9pbnRTdHlsZSl7Y29uc3QgZT17cmFkaXVzOk1hdGgubWluKGgsbCkvMixwb2ludFN0eWxlOnIucG9pbnRTdHlsZSxyb3RhdGlvbjpyLnJvdGF0aW9uLGJvcmRlcldpZHRoOjF9LGk9cy5sZWZ0Rm9yTHRyKHUsaCkraC8yLG89ZytsLzI7dC5zdHJva2VTdHlsZT1uLm11bHRpS2V5QmFja2dyb3VuZCx0LmZpbGxTdHlsZT1uLm11bHRpS2V5QmFja2dyb3VuZCxQZSh0LGUsaSxvKSx0LnN0cm9rZVN0eWxlPWEuYm9yZGVyQ29sb3IsdC5maWxsU3R5bGU9YS5iYWNrZ3JvdW5kQ29sb3IsUGUodCxlLGksbyl9ZWxzZXt0LmxpbmVXaWR0aD1vKGEuYm9yZGVyV2lkdGgpP01hdGgubWF4KC4uLk9iamVjdC52YWx1ZXMoYS5ib3JkZXJXaWR0aCkpOmEuYm9yZGVyV2lkdGh8fDEsdC5zdHJva2VTdHlsZT1hLmJvcmRlckNvbG9yLHQuc2V0TGluZURhc2goYS5ib3JkZXJEYXNofHxbXSksdC5saW5lRGFzaE9mZnNldD1hLmJvcmRlckRhc2hPZmZzZXR8fDA7Y29uc3QgZT1zLmxlZnRGb3JMdHIodSxoKSxpPXMubGVmdEZvckx0cihzLnhQbHVzKHUsMSksaC0yKSxyPWJpKGEuYm9yZGVyUmFkaXVzKTtPYmplY3QudmFsdWVzKHIpLnNvbWUodD0+MCE9PXQpPyh0LmJlZ2luUGF0aCgpLHQuZmlsbFN0eWxlPW4ubXVsdGlLZXlCYWNrZ3JvdW5kLHplKHQse3g6ZSx5OmcsdzpoLGg6bCxyYWRpdXM6cn0pLHQuZmlsbCgpLHQuc3Ryb2tlKCksdC5maWxsU3R5bGU9YS5iYWNrZ3JvdW5kQ29sb3IsdC5iZWdpblBhdGgoKSx6ZSh0LHt4OmkseTpnKzEsdzpoLTIsaDpsLTIscmFkaXVzOnJ9KSx0LmZpbGwoKSk6KHQuZmlsbFN0eWxlPW4ubXVsdGlLZXlCYWNrZ3JvdW5kLHQuZmlsbFJlY3QoZSxnLGgsbCksdC5zdHJva2VSZWN0KGUsZyxoLGwpLHQuZmlsbFN0eWxlPWEuYmFja2dyb3VuZENvbG9yLHQuZmlsbFJlY3QoaSxnKzEsaC0yLGwtMikpfXQuZmlsbFN0eWxlPXRoaXMubGFiZWxUZXh0Q29sb3JzW2ldfWRyYXdCb2R5KHQsZSxpKXtjb25zdHtib2R5OnN9PXRoaXMse2JvZHlTcGFjaW5nOm4sYm9keUFsaWduOm8sZGlzcGxheUNvbG9yczphLGJveEhlaWdodDpyLGJveFdpZHRoOmwsYm94UGFkZGluZzpofT1pLGM9X2koaS5ib2R5Rm9udCk7bGV0IGQ9Yy5saW5lSGVpZ2h0LGY9MDtjb25zdCBnPXdpKGkucnRsLHRoaXMueCx0aGlzLndpZHRoKSxwPWZ1bmN0aW9uKGkpe2UuZmlsbFRleHQoaSxnLngodC54K2YpLHQueStkLzIpLHQueSs9ZCtufSxtPWcudGV4dEFsaWduKG8pO2xldCBiLHgsXyx5LHYsTSx3O2ZvcihlLnRleHRBbGlnbj1vLGUudGV4dEJhc2VsaW5lPSJtaWRkbGUiLGUuZm9udD1jLnN0cmluZyx0Lng9bWEodGhpcyxtLGkpLGUuZmlsbFN0eWxlPWkuYm9keUNvbG9yLHUodGhpcy5iZWZvcmVCb2R5LHApLGY9YSYmInJpZ2h0IiE9PW0/ImNlbnRlciI9PT1vP2wvMitoOmwrMitoOjAseT0wLE09cy5sZW5ndGg7eTxNOysreSl7Zm9yKGI9c1t5XSx4PXRoaXMubGFiZWxUZXh0Q29sb3JzW3ldLGUuZmlsbFN0eWxlPXgsdShiLmJlZm9yZSxwKSxfPWIubGluZXMsYSYmXy5sZW5ndGgmJih0aGlzLl9kcmF3Q29sb3JCb3goZSx0LHksZyxpKSxkPU1hdGgubWF4KGMubGluZUhlaWdodCxyKSksdj0wLHc9Xy5sZW5ndGg7djx3OysrdilwKF9bdl0pLGQ9Yy5saW5lSGVpZ2h0O3UoYi5hZnRlcixwKX1mPTAsZD1jLmxpbmVIZWlnaHQsdSh0aGlzLmFmdGVyQm9keSxwKSx0LnktPW59ZHJhd0Zvb3Rlcih0LGUsaSl7Y29uc3Qgcz10aGlzLmZvb3RlcixuPXMubGVuZ3RoO2xldCBvLGE7aWYobil7Y29uc3Qgcj13aShpLnJ0bCx0aGlzLngsdGhpcy53aWR0aCk7Zm9yKHQueD1tYSh0aGlzLGkuZm9vdGVyQWxpZ24saSksdC55Kz1pLmZvb3Rlck1hcmdpblRvcCxlLnRleHRBbGlnbj1yLnRleHRBbGlnbihpLmZvb3RlckFsaWduKSxlLnRleHRCYXNlbGluZT0ibWlkZGxlIixvPV9pKGkuZm9vdGVyRm9udCksZS5maWxsU3R5bGU9aS5mb290ZXJDb2xvcixlLmZvbnQ9by5zdHJpbmcsYT0wO2E8bjsrK2EpZS5maWxsVGV4dChzW2FdLHIueCh0LngpLHQueStvLmxpbmVIZWlnaHQvMiksdC55Kz1vLmxpbmVIZWlnaHQraS5mb290ZXJTcGFjaW5nfX1kcmF3QmFja2dyb3VuZCh0LGUsaSxzKXtjb25zdHt4QWxpZ246bix5QWxpZ246b309dGhpcyx7eDphLHk6cn09dCx7d2lkdGg6bCxoZWlnaHQ6aH09aSx7dG9wTGVmdDpjLHRvcFJpZ2h0OmQsYm90dG9tTGVmdDp1LGJvdHRvbVJpZ2h0OmZ9PWJpKHMuY29ybmVyUmFkaXVzKTtlLmZpbGxTdHlsZT1zLmJhY2tncm91bmRDb2xvcixlLnN0cm9rZVN0eWxlPXMuYm9yZGVyQ29sb3IsZS5saW5lV2lkdGg9cy5ib3JkZXJXaWR0aCxlLmJlZ2luUGF0aCgpLGUubW92ZVRvKGErYyxyKSwidG9wIj09PW8mJnRoaXMuZHJhd0NhcmV0KHQsZSxpLHMpLGUubGluZVRvKGErbC1kLHIpLGUucXVhZHJhdGljQ3VydmVUbyhhK2wscixhK2wscitkKSwiY2VudGVyIj09PW8mJiJyaWdodCI9PT1uJiZ0aGlzLmRyYXdDYXJldCh0LGUsaSxzKSxlLmxpbmVUbyhhK2wscitoLWYpLGUucXVhZHJhdGljQ3VydmVUbyhhK2wscitoLGErbC1mLHIraCksImJvdHRvbSI9PT1vJiZ0aGlzLmRyYXdDYXJldCh0LGUsaSxzKSxlLmxpbmVUbyhhK3UscitoKSxlLnF1YWRyYXRpY0N1cnZlVG8oYSxyK2gsYSxyK2gtdSksImNlbnRlciI9PT1vJiYibGVmdCI9PT1uJiZ0aGlzLmRyYXdDYXJldCh0LGUsaSxzKSxlLmxpbmVUbyhhLHIrYyksZS5xdWFkcmF0aWNDdXJ2ZVRvKGEscixhK2MsciksZS5jbG9zZVBhdGgoKSxlLmZpbGwoKSxzLmJvcmRlcldpZHRoPjAmJmUuc3Ryb2tlKCl9X3VwZGF0ZUFuaW1hdGlvblRhcmdldCh0KXtjb25zdCBlPXRoaXMuY2hhcnQsaT10aGlzLiRhbmltYXRpb25zLHM9aSYmaS54LG49aSYmaS55O2lmKHN8fG4pe2NvbnN0IGk9bGFbdC5wb3NpdGlvbl0uY2FsbCh0aGlzLHRoaXMuX2FjdGl2ZSx0aGlzLl9ldmVudFBvc2l0aW9uKTtpZighaSlyZXR1cm47Y29uc3Qgbz10aGlzLl9zaXplPXVhKHRoaXMsdCksYT1PYmplY3QuYXNzaWduKHt9LGksdGhpcy5fc2l6ZSkscj1nYShlLHQsYSksbD1wYSh0LGEscixlKTtzLl90bz09PWwueCYmbi5fdG89PT1sLnl8fCh0aGlzLnhBbGlnbj1yLnhBbGlnbix0aGlzLnlBbGlnbj1yLnlBbGlnbix0aGlzLndpZHRoPW8ud2lkdGgsdGhpcy5oZWlnaHQ9by5oZWlnaHQsdGhpcy5jYXJldFg9aS54LHRoaXMuY2FyZXRZPWkueSx0aGlzLl9yZXNvbHZlQW5pbWF0aW9ucygpLnVwZGF0ZSh0aGlzLGwpKX19X3dpbGxSZW5kZXIoKXtyZXR1cm4hIXRoaXMub3BhY2l0eX1kcmF3KHQpe2NvbnN0IGU9dGhpcy5vcHRpb25zLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpO2xldCBpPXRoaXMub3BhY2l0eTtpZighaSlyZXR1cm47dGhpcy5fdXBkYXRlQW5pbWF0aW9uVGFyZ2V0KGUpO2NvbnN0IHM9e3dpZHRoOnRoaXMud2lkdGgsaGVpZ2h0OnRoaXMuaGVpZ2h0fSxuPXt4OnRoaXMueCx5OnRoaXMueX07aT1NYXRoLmFicyhpKTwuMDAxPzA6aTtjb25zdCBvPXhpKGUucGFkZGluZyksYT10aGlzLnRpdGxlLmxlbmd0aHx8dGhpcy5iZWZvcmVCb2R5Lmxlbmd0aHx8dGhpcy5ib2R5Lmxlbmd0aHx8dGhpcy5hZnRlckJvZHkubGVuZ3RofHx0aGlzLmZvb3Rlci5sZW5ndGg7ZS5lbmFibGVkJiZhJiYodC5zYXZlKCksdC5nbG9iYWxBbHBoYT1pLHRoaXMuZHJhd0JhY2tncm91bmQobix0LHMsZSksa2kodCxlLnRleHREaXJlY3Rpb24pLG4ueSs9by50b3AsdGhpcy5kcmF3VGl0bGUobix0LGUpLHRoaXMuZHJhd0JvZHkobix0LGUpLHRoaXMuZHJhd0Zvb3RlcihuLHQsZSksU2kodCxlLnRleHREaXJlY3Rpb24pLHQucmVzdG9yZSgpKX1nZXRBY3RpdmVFbGVtZW50cygpe3JldHVybiB0aGlzLl9hY3RpdmV8fFtdfXNldEFjdGl2ZUVsZW1lbnRzKHQsZSl7Y29uc3QgaT10aGlzLl9hY3RpdmUscz10Lm1hcCgoe2RhdGFzZXRJbmRleDp0LGluZGV4OmV9KT0+e2NvbnN0IGk9dGhpcy5jaGFydC5nZXREYXRhc2V0TWV0YSh0KTtpZighaSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIGEgZGF0YXNldCBhdCBpbmRleCAiK3QpO3JldHVybntkYXRhc2V0SW5kZXg6dCxlbGVtZW50OmkuZGF0YVtlXSxpbmRleDplfX0pLG49IWYoaSxzKSxvPXRoaXMuX3Bvc2l0aW9uQ2hhbmdlZChzLGUpOyhufHxvKSYmKHRoaXMuX2FjdGl2ZT1zLHRoaXMuX2V2ZW50UG9zaXRpb249ZSx0aGlzLl9pZ25vcmVSZXBsYXlFdmVudHM9ITAsdGhpcy51cGRhdGUoITApKX1oYW5kbGVFdmVudCh0LGUsaT0hMCl7aWYoZSYmdGhpcy5faWdub3JlUmVwbGF5RXZlbnRzKXJldHVybiExO3RoaXMuX2lnbm9yZVJlcGxheUV2ZW50cz0hMTtjb25zdCBzPXRoaXMub3B0aW9ucyxuPXRoaXMuX2FjdGl2ZXx8W10sbz10aGlzLl9nZXRBY3RpdmVFbGVtZW50cyh0LG4sZSxpKSxhPXRoaXMuX3Bvc2l0aW9uQ2hhbmdlZChvLHQpLHI9ZXx8IWYobyxuKXx8YTtyZXR1cm4gciYmKHRoaXMuX2FjdGl2ZT1vLChzLmVuYWJsZWR8fHMuZXh0ZXJuYWwpJiYodGhpcy5fZXZlbnRQb3NpdGlvbj17eDp0LngseTp0Lnl9LHRoaXMudXBkYXRlKCEwLGUpKSkscn1fZ2V0QWN0aXZlRWxlbWVudHModCxlLGkscyl7Y29uc3Qgbj10aGlzLm9wdGlvbnM7aWYoIm1vdXNlb3V0Ij09PXQudHlwZSlyZXR1cm5bXTtpZighcylyZXR1cm4gZS5maWx0ZXIodD0+dGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW3QuZGF0YXNldEluZGV4XSYmdm9pZCAwIT09dGhpcy5jaGFydC5nZXREYXRhc2V0TWV0YSh0LmRhdGFzZXRJbmRleCkuY29udHJvbGxlci5nZXRQYXJzZWQodC5pbmRleCkpO2NvbnN0IG89dGhpcy5jaGFydC5nZXRFbGVtZW50c0F0RXZlbnRGb3JNb2RlKHQsbi5tb2RlLG4saSk7cmV0dXJuIG4ucmV2ZXJzZSYmby5yZXZlcnNlKCksb31fcG9zaXRpb25DaGFuZ2VkKHQsZSl7Y29uc3R7Y2FyZXRYOmksY2FyZXRZOnMsb3B0aW9uczpufT10aGlzLG89bGFbbi5wb3NpdGlvbl0uY2FsbCh0aGlzLHQsZSk7cmV0dXJuITEhPT1vJiYoaSE9PW8ueHx8cyE9PW8ueSl9fXZhciBNYT17aWQ6InRvb2x0aXAiLF9lbGVtZW50OnZhLHBvc2l0aW9uZXJzOmxhLGFmdGVySW5pdCh0LGUsaSl7aSYmKHQudG9vbHRpcD1uZXcgdmEoe2NoYXJ0OnQsb3B0aW9uczppfSkpfSxiZWZvcmVVcGRhdGUodCxlLGkpe3QudG9vbHRpcCYmdC50b29sdGlwLmluaXRpYWxpemUoaSl9LHJlc2V0KHQsZSxpKXt0LnRvb2x0aXAmJnQudG9vbHRpcC5pbml0aWFsaXplKGkpfSxhZnRlckRyYXcodCl7Y29uc3QgZT10LnRvb2x0aXA7aWYoZSYmZS5fd2lsbFJlbmRlcigpKXtjb25zdCBpPXt0b29sdGlwOmV9O2lmKCExPT09dC5ub3RpZnlQbHVnaW5zKCJiZWZvcmVUb29sdGlwRHJhdyIsey4uLmksY2FuY2VsYWJsZTohMH0pKXJldHVybjtlLmRyYXcodC5jdHgpLHQubm90aWZ5UGx1Z2lucygiYWZ0ZXJUb29sdGlwRHJhdyIsaSl9fSxhZnRlckV2ZW50KHQsZSl7aWYodC50b29sdGlwKXtjb25zdCBpPWUucmVwbGF5O3QudG9vbHRpcC5oYW5kbGVFdmVudChlLmV2ZW50LGksZS5pbkNoYXJ0QXJlYSkmJihlLmNoYW5nZWQ9ITApfX0sZGVmYXVsdHM6e2VuYWJsZWQ6ITAsZXh0ZXJuYWw6bnVsbCxwb3NpdGlvbjoiYXZlcmFnZSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDAuOCkiLHRpdGxlQ29sb3I6IiNmZmYiLHRpdGxlRm9udDp7d2VpZ2h0OiJib2xkIn0sdGl0bGVTcGFjaW5nOjIsdGl0bGVNYXJnaW5Cb3R0b206Nix0aXRsZUFsaWduOiJsZWZ0Iixib2R5Q29sb3I6IiNmZmYiLGJvZHlTcGFjaW5nOjIsYm9keUZvbnQ6e30sYm9keUFsaWduOiJsZWZ0Iixmb290ZXJDb2xvcjoiI2ZmZiIsZm9vdGVyU3BhY2luZzoyLGZvb3Rlck1hcmdpblRvcDo2LGZvb3RlckZvbnQ6e3dlaWdodDoiYm9sZCJ9LGZvb3RlckFsaWduOiJsZWZ0IixwYWRkaW5nOjYsY2FyZXRQYWRkaW5nOjIsY2FyZXRTaXplOjUsY29ybmVyUmFkaXVzOjYsYm94SGVpZ2h0Oih0LGUpPT5lLmJvZHlGb250LnNpemUsYm94V2lkdGg6KHQsZSk9PmUuYm9keUZvbnQuc2l6ZSxtdWx0aUtleUJhY2tncm91bmQ6IiNmZmYiLGRpc3BsYXlDb2xvcnM6ITAsYm94UGFkZGluZzowLGJvcmRlckNvbG9yOiJyZ2JhKDAsMCwwLDApIixib3JkZXJXaWR0aDowLGFuaW1hdGlvbjp7ZHVyYXRpb246NDAwLGVhc2luZzoiZWFzZU91dFF1YXJ0In0sYW5pbWF0aW9uczp7bnVtYmVyczp7dHlwZToibnVtYmVyIixwcm9wZXJ0aWVzOlsieCIsInkiLCJ3aWR0aCIsImhlaWdodCIsImNhcmV0WCIsImNhcmV0WSJdfSxvcGFjaXR5OntlYXNpbmc6ImxpbmVhciIsZHVyYXRpb246MjAwfX0sY2FsbGJhY2tzOl9hfSxkZWZhdWx0Um91dGVzOntib2R5Rm9udDoiZm9udCIsZm9vdGVyRm9udDoiZm9udCIsdGl0bGVGb250OiJmb250In0sZGVzY3JpcHRvcnM6e19zY3JpcHRhYmxlOnQ9PiJmaWx0ZXIiIT09dCYmIml0ZW1Tb3J0IiE9PXQmJiJleHRlcm5hbCIhPT10LF9pbmRleGFibGU6ITEsY2FsbGJhY2tzOntfc2NyaXB0YWJsZTohMSxfaW5kZXhhYmxlOiExfSxhbmltYXRpb246e19mYWxsYmFjazohMX0sYW5pbWF0aW9uczp7X2ZhbGxiYWNrOiJhbmltYXRpb24ifX0sYWRkaXRpb25hbE9wdGlvblNjb3BlczpbImludGVyYWN0aW9uIl19O3JldHVybiB5bi5yZWdpc3RlcihJbixEbyxRbix0KSx5bi5oZWxwZXJzPXsuLi5SaX0seW4uX2FkYXB0ZXJzPWtuLHluLkFuaW1hdGlvbj15cyx5bi5BbmltYXRpb25zPXZzLHluLmFuaW1hdG9yPWJ0LHluLmNvbnRyb2xsZXJzPVVzLmNvbnRyb2xsZXJzLml0ZW1zLHluLkRhdGFzZXRDb250cm9sbGVyPUVzLHluLkVsZW1lbnQ9UnMseW4uZWxlbWVudHM9UW4seW4uSW50ZXJhY3Rpb249V2kseW4ubGF5b3V0cz1KaSx5bi5wbGF0Zm9ybXM9YnMseW4uU2NhbGU9JHMseW4uVGlja3M9aWUsT2JqZWN0LmFzc2lnbih5bixJbixEbyxRbix0LGJzKSx5bi5DaGFydD15biwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5DaGFydD15bikseW59KTsKICAvLyBDYXB0dXJlIDQuNC4xIGFzIENoYXJ0NDQxLCB0aGVuIHJlc3RvcmUgdGhlIG9sZCBDaGFydCBzbyBXUCBwbHVnaW5zIHN0aWxsIHdvcmsKICB3aW5kb3cuQ2hhcnQ0NDEgPSB3aW5kb3cuQ2hhcnQ7CiAgaWYoX3ByZXZDaGFydCAhPT0gdW5kZWZpbmVkKSB7IHdpbmRvdy5DaGFydCA9IF9wcmV2Q2hhcnQ7IH0KfSkoKTsKCihmdW5jdGlvbigpIHsKdmFyIENoYXJ0ID0gd2luZG93LkNoYXJ0NDQxIHx8IHdpbmRvdy5DaGFydDsKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBBTEwgREFUQSAtIHVzaW5nIGVzY2FwZSBzZXF1ZW5jZXMgdG8gcHJldmVudCBXb3JkUHJlc3Mgc21hcnQtcXVvdGUgbWFuZ2xpbmcKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CnZhciBNRCA9IFsKIHt5cjoyMDI1LG1vOiJKYW51YXJ5IiwgIGxhYjoiSmFuIFx4MjcyNSIsdHM6MTY1NSxvbHA6MzA5OTAwLGxwOjI5ODk1MCxtcDoyOTQwMDAsICBjZG9tOjY3LHJzOjkxOSwgbmM6NzM2LCBucGN0Oi40NDQ3LGNwT2xwOi45NDU5MixhY3Q6OTQ1MiwgbWk6NC45OTQsY2FzaDouMTY1ODcsY252Oi41NzMwMixmaGE6LjE1NTU2LHZhOi4wNTg3M30sCiB7eXI6MjAyNSxtbzoiRmVicnVhcnkiLCBsYWI6IkZlYiBceDI3MjUiLHRzOjE4NzUsb2xwOjI5OTg5NCxscDoyODk4MDAsbXA6Mjg0NDk1LCAgY2RvbTo2NSxyczoxMDQxLG5jOjgzNSwgbnBjdDouNDQ1MyxjcE9scDouOTQ1ODcsYWN0Ojk3MjQsIG1pOjQuODA4LGNhc2g6LjE5NTQ5LGNudjouNTg0MzAsZmhhOi4xMzk1NCx2YTouMDQyODh9LAoge3lyOjIwMjUsbW86Ik1hcmNoIiwgICAgbGFiOiJNYXIgXHgyNzI1Iix0czoyMDc5LG9scDozMTkwODAsbHA6MzA5OTAwLG1wOjMwNDAwMCwgIGNkb206NjMscnM6MTIzNixuYzo4NDIsIG5wY3Q6LjQwNTAsY3BPbHA6Ljk1MDQwLGFjdDo5OTc3LCBtaTo0LjE0OSxjYXNoOi4xNjkwMixjbnY6LjU4Njk2LGZoYTouMTUzMjYsdmE6LjA1NTQ0fSwKIHt5cjoyMDI1LG1vOiJBcHJpbCIsICAgIGxhYjoiQXByIFx4MjcyNSIsdHM6MjI1OCxvbHA6MzA5OTAwLGxwOjMwOTkwMCxtcDozMDE0ODkuNSxjZG9tOjUxLHJzOjEzMjUsbmM6OTMzLCBucGN0Oi40MTMzLGNwT2xwOi45Mzg3OSxhY3Q6MTAyODAsbWk6My43ODgsY2FzaDouMTgyMDAsY252Oi41NzIwMCxmaGE6LjE4MDAwLHZhOi4wNjAwMH0sCiB7eXI6MjAyNSxtbzoiTWF5IiwgICAgICBsYWI6Ik1heSBceDI3MjUiLHRzOjI1NTIsb2xwOjMxMTAwMCxscDozMDUwMDAsbXA6MzA4NjIyLjUsY2RvbTo0OSxyczoxNTEwLG5jOjEwNDIsbnBjdDouNDA4MyxjcE9scDouOTU1NzAsYWN0OjExMDU0LG1pOjMuNjAwLGNhc2g6LjE3NTAwLGNudjouNTkxMDAsZmhhOi4xNjUwMCx2YTouMDU5MDB9LAoge3lyOjIwMjUsbW86Ikp1bmUiLCAgICAgbGFiOiJKdW4gXHgyNzI1Iix0czoyMjczLG9scDozMTkwMDAsbHA6MzE1MDAwLG1wOjMxNDg0MCwgIGNkb206NTEscnM6MTM0MCxuYzo5MzMsIG5wY3Q6LjQxMDMsY3BPbHA6Ljk1NTAyLGFjdDoxMTI3NyxtaTo0LjIwMCxjYXNoOi4xNjgwMCxjbnY6LjYwMDAwLGZoYTouMTU4MDAsdmE6LjA1NTAwfSwKIHt5cjoyMDI1LG1vOiJKdWx5IiwgICAgIGxhYjoiSnVsIFx4MjcyNSIsdHM6MjMxMyxvbHA6MzEwMDAwLGxwOjMwNTAwMCxtcDozMDUwMDAsICBjZG9tOjU0LHJzOjEzODAsbmM6OTMzLCBucGN0Oi40MDM0LGNwT2xwOi45NTA4MixhY3Q6MTE1MTUsbWk6NC40MDAsY2FzaDouMTc0MDAsY252Oi41OTIwMCxmaGE6LjE2MjAwLHZhOi4wNTUwMH0sCiB7eXI6MjAyNSxtbzoiQXVndXN0IiwgICBsYWI6IkF1ZyBceDI3MjUiLHRzOjIxNTcsb2xwOjMwNTAwMCxscDozMDAwMDAsbXA6Mjk5MDAwLCAgY2RvbTo2MCxyczoxMjgwLG5jOjg3NywgbnBjdDouNDA2NSxjcE9scDouOTMzMTEsYWN0OjExNTM4LG1pOjQuNzAwLGNhc2g6LjE3MTAwLGNudjouNTg4MDAsZmhhOi4xNzAwMCx2YTouMDU2MDB9LAoge3lyOjIwMjUsbW86IlNlcHRlbWJlciIsbGFiOiJTZXAgXHgyNzI1Iix0czoxOTI4LG9scDozMDkwMDAsbHA6MzA0MDAwLG1wOjMwNTAwMCwgIGNkb206NjIscnM6MTE0NSxuYzo3ODMsIG5wY3Q6LjQwNjIsY3BPbHA6LjkzOTM2LGFjdDoxMTQxNCxtaTo0LjkwMCxjYXNoOi4xNjkwMCxjbnY6LjU5MTAwLGZoYTouMTYzMDAsdmE6LjA1NDAwfSwKIHt5cjoyMDI1LG1vOiJPY3RvYmVyIiwgIGxhYjoiT2N0IFx4MjcyNSIsdHM6MTg5OSxvbHA6MzAwMDAwLGxwOjI5NTAwMCxtcDoyOTQ4MDAsICBjZG9tOjY0LHJzOjExMjAsbmM6Nzc5LCBucGN0Oi40MTAyLGNwT2xwOi45MzE0OCxhY3Q6MTE0NjAsbWk6NS4xMDAsY2FzaDouMTcyMDAsY252Oi41ODkwMCxmaGE6LjE2MzAwLHZhOi4wNTQwMH0sCiB7eXI6MjAyNSxtbzoiTm92ZW1iZXIiLCBsYWI6Ik5vdiBceDI3MjUiLHRzOjE2OTQsb2xwOjMwMjAwMCxscDoyOTgwMDAsbXA6Mjk4NTAwLCAgY2RvbTo2OSxyczo5OTQsIG5jOjcwMCwgbnBjdDouNDEzMyxjcE9scDouOTQ0MzYsYWN0OjEwOTE1LG1pOjUuNTAwLGNhc2g6LjE3NzAwLGNudjouNTg2MDAsZmhhOi4xNjAwMCx2YTouMDUzMDB9LAoge3lyOjIwMjUsbW86IkRlY2VtYmVyIiwgbGFiOiJEZWMgXHgyNzI1Iix0czoyMDc4LG9scDozMDgwMDAsbHA6MzAyMDAwLG1wOjMwNTAwMCwgIGNkb206NzQscnM6MTIyNCxuYzo4NTQsIG5wY3Q6LjQxMTIsY3BPbHA6LjkzNDQzLGFjdDoxMDE4NixtaTo1LjIwMCxjYXNoOi4xNzgwMCxjbnY6LjU4ODAwLGZoYTouMTU4MDAsdmE6LjA1NDAwfSwKIHt5cjoyMDI2LG1vOiJKYW51YXJ5IiwgIGxhYjoiSmFuIFx4MjcyNiIsdHM6MTM5NixvbHA6MzA1MDAwLGxwOjI5OTAwMCxtcDoyODk5NDUsICBjZG9tOjgxLHJzOjgyNiwgbmM6NTcwLCBucGN0Oi40MDgzLGNwT2xwOi45NDgwOCxhY3Q6MTAxNDIsbWk6NS45MDAsY2FzaDouMTczMDAsY252Oi41ODMwMCxmaGE6LjE2NjAwLHZhOi4wNTIwMH0sCiB7eXI6MjAyNixtbzoiRmVicnVhcnkiLCBsYWI6IkZlYiBceDI3MjYiLHRzOjE2OTIsb2xwOjMwMDAwMCxscDoyOTUwMDAsbXA6Mjk0NzQwLCAgY2RvbTo4Nixyczo5ODgsIG5jOjcwNCwgbnBjdDouNDE2MCxjcE9scDouOTQzNTgsYWN0Ojk4NDUsIG1pOjUuNjAwLGNhc2g6LjE3ODAwLGNudjouNTc5MDAsZmhhOi4xNzAwMCx2YTouMDUwMDB9LAoge3lyOjIwMjYsbW86Ik1hcmNoIiwgICAgbGFiOiJNYXIgXHgyNzI2Iix0czoyMTg0LG9scDozMTcwMDAsbHA6MzEwMDAwLG1wOjMwNzc3My41LGNkb206NzYscnM6MTI4MyxuYzo5MDEsIG5wY3Q6LjQxMjUsY3BPbHA6Ljk1MzM5LGFjdDoxMDMzOSxtaTo1LjEwMCxjYXNoOi4xNzAwMCxjbnY6LjU4MDAwLGZoYTouMTcwMDAsdmE6LjA1MjAwfSwKIHt5cjoyMDI2LG1vOiJBcHJpbCIsICAgIGxhYjoiQXByIFx4MjcyNiIsdHM6MjExNixvbHA6MzA3MDAwLGxwOjMwMDAwMCxtcDoyOTUyOTUsICBjZG9tOjU2LHJzOjEyNDMsbmM6ODczLCBucGN0Oi40MTI2LGNwT2xwOi45NTM1OSxhY3Q6MTA5MDYsbWk6NS4xMDAsY2FzaDouMTc1MDAsY252Oi41NzYwMCxmaGE6LjE3NDAwLHZhOi4wNTIwMH0KXTsKCnZhciBNUiA9IHsKICIyMDI1LTEiOjYuOTU4LCIyMDI1LTIiOjYuODQyLCIyMDI1LTMiOjYuNjUwLCIyMDI1LTQiOjYuNzI1LCIyMDI1LTUiOjYuODE2LAogIjIwMjUtNiI6Ni44MTcsIjIwMjUtNyI6Ni43MjAsIjIwMjUtOCI6Ni41ODgsIjIwMjUtOSI6Ni4zNTMsIjIwMjUtMTAiOjYuMjU0LAogIjIwMjUtMTEiOjYuMjM3LCIyMDI1LTEyIjo2LjE5MCwiMjAyNi0xIjo2LjEwMywiMjAyNi0yIjo2LjA0OCwiMjAyNi0zIjo2LjE3OCwiMjAyNi00Ijo2LjMzMgp9OwoKdmFyIEJBTkRTID0gWwogIlx4M2MkMzAwLDAwMCIsCiAiJDMwMCwwMDFcdTIwMTMkNDk5LDk5OSIsCiAiJDUwMCwwMDBcdTIwMTMkNzQ5LDk5OSIsCiAiJDc1MCwwMDBcdTIwMTMkOTk5LDk5OSIsCiAiJDEsMDAwLDAwMFx1MjAxMyQxLDQ5OSw5OTkiLAogIiQxLDUwMCwwMDBcdTIwMTMkMSw5OTksOTk5IiwKICIkMiwwMDAsMDAwXHUyMDEzJDIsOTk5LDk5OSIsCiAiJDMsMDAwLDAwMFx1MjAxMyQ0LDk5OSw5OTkiLAogIiQ1LDAwMCwwMDArIgpdOwoKdmFyIFQyNSA9IFsKIFsxNjksMTQyLDE4MSwxNTgsMTk2LDIxMSwxODksMjAxLDIzOSwyMTYsMTU3LDIzMV0sCiBbNjA3LDY1Miw4MjIsODM5LDk3OSw5MDcsODMxLDgzNyw4MjMsNzM3LDY4OSw4MTBdLAogWzI3OSwzMjAsNDQ0LDQ2Miw0ODQsNTI0LDQ0Myw0MTUsNDAyLDM5MSwzNDQsNDQzXSwKIFsxMDEsMTM0LDE4OCwxNzQsMjM2LDIyNywxODksMjE4LDE3MiwxNjksMTQzLDE3NF0sCiBbIDU1LCA2NywxMjQsMTIzLDE2OSwxMjcsMTIzLDE1NCwxMDEsMTI4LCA3MSwxMTVdLAogWyAyNSwgMzUsIDMzLCA0NywgNDYsIDUxLCA0NywgNDYsIDQyLCAzMywgMzgsIDQ0XSwKIFsgMTQsIDE0LCAyOCwgMzAsIDMyLCAzNywgMzAsIDMzLCAyMCwgMjUsIDIzLCAzMF0sCiBbICA5LCAgOSwgMTgsIDE2LCAxMiwgMTEsIDExLCAgOSwgIDksIDE5LCAgNSwgMTldLAogWyAgMiwgIDQsICAzLCAgMiwgIDUsICA1LCAgMywgIDMsICAzLCAgMywgIDMsICAyXQpdOwoKdmFyIFQyNiA9IFsKIFs3NTUsODk4LDEwNDAsMTA4MSwwLDAsMCwwLDAsMCwwLDBdLAogWzQ2Niw1NzMsIDg0MiwgNzE4LDAsMCwwLDAsMCwwLDAsMF0sCiBbMTIxLDE1NywgMjExLCAyMjIsMCwwLDAsMCwwLDAsMCwwXSwKIFsgMjksIDMzLCAgNjAsICA3MCwwLDAsMCwwLDAsMCwwLDBdLAogWyAxMywgMjEsICAyNSwgIDE4LDAsMCwwLDAsMCwwLDAsMF0sCiBbIDExLCAgNywgICAzLCAgIDMsMCwwLDAsMCwwLDAsMCwwXSwKIFsgIDEsICAzLCAgIDIsICAgNCwwLDAsMCwwLDAsMCwwLDBdLAogWyAgMCwgIDAsICAgMiwgICAxLDAsMCwwLDAsMCwwLDAsMF0sCiBbICAwLCAgMCwgICAwLCAgIDAsMCwwLDAsMCwwLDAsMCwwXQpdOwoKdmFyIE1OQU1FUyA9IFsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXTsKdmFyIE1TSE9SVCA9IFsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl07CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gSEVMUEVSUwovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZnVuY3Rpb24gZm10RG9sbGFyKHYpeyByZXR1cm4gIiQiK01hdGgucm91bmQodikudG9Mb2NhbGVTdHJpbmcoKTsgfQpmdW5jdGlvbiBmbXRLKHYpeyByZXR1cm4gIiQiK01hdGgucm91bmQodi8xMDAwKSsiayI7IH0KZnVuY3Rpb24gZm10UGN0KHYpeyByZXR1cm4gKHYqMTAwKS50b0ZpeGVkKDEpKyIlIjsgfQpmdW5jdGlvbiBmbXROdW0odil7IHJldHVybiBNYXRoLnJvdW5kKHYpLnRvTG9jYWxlU3RyaW5nKCk7IH0KZnVuY3Rpb24gZm10UmF0aW9QY3Qodil7IHJldHVybiAodioxMDApLnRvRml4ZWQoMSkrIiUiOyB9CmZ1bmN0aW9uIHBjdENoYW5nZShjdXIscHJpb3IpeyByZXR1cm4gcHJpb3IgPyAoKGN1ci1wcmlvcikvTWF0aC5hYnMocHJpb3IpKSoxMDAgOiAwOyB9CgpmdW5jdGlvbiBkZWx0YUh0bWwocGN0LCBoaWdoZXJJc0JldHRlcil7CiAgdmFyIGdvb2QgPSAocGN0Pj0wICYmIGhpZ2hlcklzQmV0dGVyKXx8KHBjdDwwICYmICFoaWdoZXJJc0JldHRlcik7CiAgdmFyIGFycm93ID0gcGN0Pj0wID8gIlx1MjViMiIgOiAiXHUyNWJjIjsKICB2YXIgY2xzID0gZ29vZCA/ICJnb29kIiA6ICJiYWQiOwogIHJldHVybiAiPHNwYW4gY2xhc3M9XCJjYXJkLWRlbHRhICIrY2xzKyJcIj4iK2Fycm93KyIgIitNYXRoLmFicyhwY3QpLnRvRml4ZWQoMSkrIiU8L3NwYW4+IjsKfQoKZnVuY3Rpb24gbW92QXZnKGFycixuKXsKICByZXR1cm4gYXJyLm1hcChmdW5jdGlvbih2LGkpewogICAgaWYoaTxuLTEpIHJldHVybiBudWxsOwogICAgdmFyIHM9MDsgZm9yKHZhciBqPWktbisxO2o8PWk7aisrKSBzKz1hcnJbal07IHJldHVybiBzL247CiAgfSk7Cn0KCmZ1bmN0aW9uIGxlZ2VuZChpdGVtcyl7CiAgcmV0dXJuICI8ZGl2IGNsYXNzPVwibGVnXCI+IitpdGVtcy5tYXAoZnVuY3Rpb24oaXQpewogICAgcmV0dXJuICI8ZGl2IGNsYXNzPVwibGVnLWl0ZW1cIj48ZGl2IGNsYXNzPVwic3dhdGNoXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiIraXQuY29sb3IrIlwiPjwvZGl2PjxzcGFuPiIraXQubGFiZWwrIjwvc3Bhbj48L2Rpdj4iOwogIH0pLmpvaW4oIiIpKyI8L2Rpdj4iOwp9CgpmdW5jdGlvbiBiYXNlT3B0cygpewogIHJldHVybiB7CiAgICByZXNwb25zaXZlOnRydWUsIG1haW50YWluQXNwZWN0UmF0aW86ZmFsc2UsCiAgICBwbHVnaW5zOntsZWdlbmQ6e2Rpc3BsYXk6ZmFsc2V9LCB0b29sdGlwOnttb2RlOiJpbmRleCIsaW50ZXJzZWN0OmZhbHNlfX0sCiAgICBzY2FsZXM6ewogICAgICB4Ont0aWNrczp7Zm9udDp7c2l6ZToxMX0sY29sb3I6IiM4ODgiLGF1dG9Ta2lwOmZhbHNlLG1heFJvdGF0aW9uOjQ1fSxncmlkOntjb2xvcjoicmdiYSgxMjgsMTI4LDEyOCwwLjEyKSJ9fSwKICAgICAgeTp7dGlja3M6e2ZvbnQ6e3NpemU6MTF9LGNvbG9yOiIjODg4In0sZ3JpZDp7Y29sb3I6InJnYmEoMTI4LDEyOCwxMjgsMC4xMikifX0KICAgIH0KICB9Owp9Cgp2YXIgQz17CiAgYmx1ZToiIzM3OEFERCIscHVycGxlOiIjN0Y3N0REIix0ZWFsOiIjMUQ5RTc1IixhbWJlcjoiI0VGOUYyNyIsCiAgcGluazoiI0Q0NTM3RSIsZ3JlZW46IiM2Mzk5MjIiLGNvcmFsOiIjRDg1QTMwIixyZWQ6IiNFMjRCNEEiLGdyYXk6IiM4ODg3ODAiCn07CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gU0NPUEVEIFBMVUdJTjogZmluYW5jaW5nIHNlZ21lbnQgbGFiZWxzCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQp2YXIgZmluTGFiZWxQbHVnaW4gPSB7CiAgaWQ6ImZpbkxhYmVsIiwKICBhZnRlckRhdGFzZXRzRHJhdzogZnVuY3Rpb24oY2hhcnQpewogICAgaWYoIWNoYXJ0Lm9wdGlvbnMucGx1Z2luc3x8IWNoYXJ0Lm9wdGlvbnMucGx1Z2lucy5maW5MYWJlbHx8IWNoYXJ0Lm9wdGlvbnMucGx1Z2lucy5maW5MYWJlbC5lbmFibGVkKSByZXR1cm47CiAgICB2YXIgY3R4PWNoYXJ0LmN0eDsKICAgIFswLDEsMl0uZm9yRWFjaChmdW5jdGlvbihkc0lkeCl7CiAgICAgIHZhciBtZXRhPWNoYXJ0LmdldERhdGFzZXRNZXRhKGRzSWR4KTsKICAgICAgaWYoIW1ldGF8fCFtZXRhLmRhdGEpIHJldHVybjsKICAgICAgbWV0YS5kYXRhLmZvckVhY2goZnVuY3Rpb24oYmFyLGkpewogICAgICAgIHZhciBwPWJhci5nZXRQcm9wcyhbIngiLCJ5IiwiYmFzZSIsIndpZHRoIl0sdHJ1ZSk7CiAgICAgICAgdmFyIHNlZ0g9cC5iYXNlLXAueTsKICAgICAgICBpZihzZWdIPDE0KSByZXR1cm47CiAgICAgICAgdmFyIHBjdD1jaGFydC5kYXRhLmRhdGFzZXRzW2RzSWR4XS5kYXRhW2ldOwogICAgICAgIGlmKCFwY3R8fHBjdDwyKSByZXR1cm47CiAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICBjdHguZm9udD0iYm9sZCA5cHggc2Fucy1zZXJpZiI7CiAgICAgICAgY3R4LmZpbGxTdHlsZT0iI2ZmZiI7CiAgICAgICAgY3R4LnRleHRBbGlnbj0iY2VudGVyIjsKICAgICAgICBjdHgudGV4dEJhc2VsaW5lPSJtaWRkbGUiOwogICAgICAgIGN0eC5maWxsVGV4dChNYXRoLnJvdW5kKHBjdCkrIiUiLCBwLngsIHAueStzZWdILzIpOwogICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgIH0pOwogICAgfSk7CiAgfQp9OwpDaGFydC5yZWdpc3RlcihmaW5MYWJlbFBsdWdpbik7CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gREFTSEJPQVJEIDEg4oCUIEZVTEwgVFJFTkQgQ0hBUlRTCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpmdW5jdGlvbiBidWlsZERhc2gxKCl7CiAgdmFyIEQ9TUQsIGxhYnM9RC5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIGQubGFiO30pOwogIHZhciBsYXQ9RFtELmxlbmd0aC0xXTsKICB2YXIgcGVha1A9TWF0aC5tYXguYXBwbHkobnVsbCxELm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZC5tcDt9KSk7CgogIHZhciBjSHRtbD1bCiAgICB7bGFiZWw6IkxhdGVzdCBtZWRpYW4gcHJpY2UiLCAgICAgICB2YWx1ZTpmbXREb2xsYXIobGF0Lm1wKX0sCiAgICB7bGFiZWw6IlBlYWsgbWVkaWFuIHByaWNlIiwgICAgICAgICB2YWx1ZTpmbXREb2xsYXIocGVha1ApLCBzdWI6Ikp1biBceDI3MjUifSwKICAgIHtsYWJlbDoiQWN0aXZlIGxpc3RpbmdzIChBcHIgXHgyNzI2KSIsIHZhbHVlOmZtdE51bShsYXQuYWN0KX0sCiAgICB7bGFiZWw6IkRheXMgb24gbWFya2V0IChBcHIgXHgyNzI2KSIsICB2YWx1ZTpsYXQuY2RvbSsiIGRheXMifQogIF0ubWFwKGZ1bmN0aW9uKGMpewogICAgcmV0dXJuICI8ZGl2IGNsYXNzPVwiY2FyZFwiPjxkaXYgY2xhc3M9XCJjYXJkLWxhYmVsXCI+IitjLmxhYmVsKyI8L2Rpdj48ZGl2IGNsYXNzPVwiY2FyZC12YWx1ZVwiPiIrYy52YWx1ZSsiPC9kaXY+IisoYy5zdWI/IjxkaXYgY2xhc3M9XCJjYXJkLXN1YlwiPiIrYy5zdWIrIjwvZGl2PiI6IiIpKyI8L2Rpdj4iOwogIH0pLmpvaW4oIiIpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkMWNhcmRzIikuaW5uZXJIVE1MPWNIdG1sOwoKICAvLyBQcmljZSBsaW5lCiAgbmV3IENoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjMXByaWNlIiksewogICAgdHlwZToibGluZSIsCiAgICBkYXRhOntsYWJlbHM6bGFicyxkYXRhc2V0czpbe2xhYmVsOiJNZWRpYW4gc2FsZXMgcHJpY2UiLGRhdGE6RC5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIGQubXA7fSksCiAgICAgIGJvcmRlckNvbG9yOkMuYmx1ZSxiYWNrZ3JvdW5kQ29sb3I6InJnYmEoNTUsMTM4LDIyMSwwLjA3KSIsZmlsbDp0cnVlLHRlbnNpb246LjMscG9pbnRSYWRpdXM6Myxib3JkZXJXaWR0aDoyfV19LAogICAgb3B0aW9uczooZnVuY3Rpb24oKXt2YXIgbz1iYXNlT3B0cygpO28uc2NhbGVzLnkudGlja3MuY2FsbGJhY2s9ZnVuY3Rpb24odil7cmV0dXJuIGZtdEsodik7fTtyZXR1cm4gbzt9KSgpCiAgfSk7CgogIC8vIFNhbGVzIGJhciArIDNtbyBNQQogIHZhciBzYWxlc0Fycj1ELm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZC50czt9KTsKICBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImMxc2FsZXMiKSx7CiAgICB0eXBlOiJiYXIiLAogICAgZGF0YTp7bGFiZWxzOmxhYnMsZGF0YXNldHM6WwogICAgICB7dHlwZToiYmFyIiwgbGFiZWw6IlRvdGFsIHNhbGVzIiwgICAgZGF0YTpzYWxlc0FycixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoNTUsMTM4LDIyMSwwLjcyKSIsb3JkZXI6MX0sCiAgICAgIHt0eXBlOiJsaW5lIixsYWJlbDoiMy1tbyBtb3ZpbmcgYXZnIixkYXRhOm1vdkF2ZyhzYWxlc0FyciwzKSxib3JkZXJDb2xvcjpDLnJlZCxib3JkZXJXaWR0aDoyLHBvaW50UmFkaXVzOjAsdGVuc2lvbjouNCxvcmRlcjowfQogICAgXX0sCiAgICBvcHRpb25zOmJhc2VPcHRzKCkKICB9KTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYzFzYWxlc2xlZyIpLmlubmVySFRNTD1sZWdlbmQoWwogICAge2NvbG9yOiJyZ2JhKDU1LDEzOCwyMjEsMC43MikiLGxhYmVsOiJUb3RhbCBzYWxlcyJ9LAogICAge2NvbG9yOkMucmVkLGxhYmVsOiIzLW1vbnRoIG1vdmluZyBhdmVyYWdlIn0KICBdKTsKCiAgLy8gQWN0aXZlIGxpc3RpbmdzICsgbW9udGhzIGludiBkdWFsIGF4aXMKICBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImMxaW52IiksewogICAgdHlwZToiYmFyIiwKICAgIGRhdGE6e2xhYmVsczpsYWJzLGRhdGFzZXRzOlsKICAgICAge3R5cGU6ImJhciIsIGxhYmVsOiJBY3RpdmUgbGlzdGluZ3MiLCAgICBkYXRhOkQubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBkLmFjdDt9KSxiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMTI3LDExOSwyMjEsMC43KSIseUF4aXNJRDoieSIsb3JkZXI6MX0sCiAgICAgIHt0eXBlOiJsaW5lIixsYWJlbDoiTW9udGhzIG9mIGludmVudG9yeSIsZGF0YTpELm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZC5taTt9KSwgYm9yZGVyQ29sb3I6Qy5hbWJlcixib3JkZXJXaWR0aDoyLHBvaW50UmFkaXVzOjMsdGVuc2lvbjouMyx5QXhpc0lEOiJ5MiIsb3JkZXI6MH0KICAgIF19LAogICAgb3B0aW9uczp7CiAgICAgIHJlc3BvbnNpdmU6dHJ1ZSxtYWludGFpbkFzcGVjdFJhdGlvOmZhbHNlLAogICAgICBwbHVnaW5zOntsZWdlbmQ6e2Rpc3BsYXk6ZmFsc2V9LHRvb2x0aXA6e21vZGU6ImluZGV4IixpbnRlcnNlY3Q6ZmFsc2V9fSwKICAgICAgc2NhbGVzOnsKICAgICAgICB4Ont0aWNrczp7Zm9udDp7c2l6ZToxMX0sY29sb3I6IiM4ODgiLGF1dG9Ta2lwOmZhbHNlLG1heFJvdGF0aW9uOjQ1fSxncmlkOntjb2xvcjoicmdiYSgxMjgsMTI4LDEyOCwwLjEyKSJ9fSwKICAgICAgICB5Ontwb3NpdGlvbjoibGVmdCIsdGlja3M6e2ZvbnQ6e3NpemU6MTF9LGNvbG9yOiIjODg4In0sZ3JpZDp7Y29sb3I6InJnYmEoMTI4LDEyOCwxMjgsMC4xMikifSx0aXRsZTp7ZGlzcGxheTp0cnVlLHRleHQ6IkFjdGl2ZSBsaXN0aW5ncyIsZm9udDp7c2l6ZToxMX0sY29sb3I6IiM4ODgifX0sCiAgICAgICAgeTI6e3Bvc2l0aW9uOiJyaWdodCIsdGlja3M6e2ZvbnQ6e3NpemU6MTF9LGNvbG9yOiIjODg4In0sZ3JpZDp7ZGlzcGxheTpmYWxzZX0sdGl0bGU6e2Rpc3BsYXk6dHJ1ZSx0ZXh0OiJNb250aHMgb2YgaW52ZW50b3J5Iixmb250OntzaXplOjExfSxjb2xvcjoiIzg4OCJ9fQogICAgICB9CiAgICB9CiAgfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImMxaW52bGVnIikuaW5uZXJIVE1MPWxlZ2VuZChbCiAgICB7Y29sb3I6InJnYmEoMTI3LDExOSwyMjEsMC43KSIsbGFiZWw6IkFjdGl2ZSBsaXN0aW5ncyJ9LAogICAge2NvbG9yOkMuYW1iZXIsbGFiZWw6Ik1vbnRocyBvZiBpbnZlbnRvcnkifQogIF0pOwoKICAvLyBDRE9NIGNvbG91ci1jb2RlZAogIHZhciBkb21DbHI9RC5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIGQuY2RvbTw9NTU/Qy5ncmVlbjooZC5jZG9tPD03MD9DLmFtYmVyOkMucmVkKTt9KTsKICBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImMxZG9tIiksewogICAgdHlwZToiYmFyIiwKICAgIGRhdGE6e2xhYmVsczpsYWJzLGRhdGFzZXRzOlt7bGFiZWw6IkRheXMgb24gbWFya2V0IixkYXRhOkQubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBkLmNkb207fSksYmFja2dyb3VuZENvbG9yOmRvbUNscn1dfSwKICAgIG9wdGlvbnM6YmFzZU9wdHMoKQogIH0pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjMWRvbWxlZyIpLmlubmVySFRNTD1sZWdlbmQoWwogICAge2NvbG9yOkMuZ3JlZW4sbGFiZWw6Ilx1MjI2NDU1IGRheXMifSwKICAgIHtjb2xvcjpDLmFtYmVyLGxhYmVsOiI1Nlx1MjAxMzcwIGRheXMifSwKICAgIHtjb2xvcjpDLnJlZCwgIGxhYmVsOiI3MSsgZGF5cyJ9CiAgXSk7CgogIC8vIERvbnV0CiAgdmFyIG49RC5sZW5ndGg7CiAgdmFyIGF2Z0M9RC5yZWR1Y2UoZnVuY3Rpb24ocyxkKXtyZXR1cm4gcytkLmNhc2g7fSwwKS9uOwogIHZhciBhdmdWPUQucmVkdWNlKGZ1bmN0aW9uKHMsZCl7cmV0dXJuIHMrZC5jbnY7fSwwKS9uOwogIHZhciBhdmdGPUQucmVkdWNlKGZ1bmN0aW9uKHMsZCl7cmV0dXJuIHMrZC5maGE7fSwwKS9uOwogIHZhciBhdmdBPUQucmVkdWNlKGZ1bmN0aW9uKHMsZCl7cmV0dXJuIHMrZC52YTt9LDApL247CiAgbmV3IENoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjMWRvbnV0IiksewogICAgdHlwZToiZG91Z2hudXQiLAogICAgZGF0YTp7bGFiZWxzOlsiQ29udmVudGlvbmFsIiwiQ2FzaCIsIkZIQSIsIlZBIl0sZGF0YXNldHM6W3sKICAgICAgZGF0YTpbYXZnVioxMDAsYXZnQyoxMDAsYXZnRioxMDAsYXZnQSoxMDBdLAogICAgICBiYWNrZ3JvdW5kQ29sb3I6W0MuYmx1ZSxDLnRlYWwsQy5hbWJlcixDLnBpbmtdLGJvcmRlcldpZHRoOjIKICAgIH1dfSwKICAgIG9wdGlvbnM6e3Jlc3BvbnNpdmU6dHJ1ZSxtYWludGFpbkFzcGVjdFJhdGlvOmZhbHNlLHBsdWdpbnM6e2xlZ2VuZDp7ZGlzcGxheTpmYWxzZX0sdG9vbHRpcDp7bW9kZToicG9pbnQifX19CiAgfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImMxZG9udXRsZWciKS5pbm5lckhUTUw9bGVnZW5kKFsKICAgIHtjb2xvcjpDLmJsdWUsIGxhYmVsOiJDb252ZW50aW9uYWwgIisoYXZnVioxMDApLnRvRml4ZWQoMSkrIiUifSwKICAgIHtjb2xvcjpDLnRlYWwsIGxhYmVsOiJDYXNoICIrKGF2Z0MqMTAwKS50b0ZpeGVkKDEpKyIlIn0sCiAgICB7Y29sb3I6Qy5hbWJlcixsYWJlbDoiRkhBICIrKGF2Z0YqMTAwKS50b0ZpeGVkKDEpKyIlIn0sCiAgICB7Y29sb3I6Qy5waW5rLCBsYWJlbDoiVkEgIisoYXZnQSoxMDApLnRvRml4ZWQoMSkrIiUifQogIF0pOwoKICAvLyBSZXNhbGUgdnMgbmV3IHN0YWNrZWQKICBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImMxcmVzYWxlIiksewogICAgdHlwZToiYmFyIiwKICAgIGRhdGE6e2xhYmVsczpsYWJzLGRhdGFzZXRzOlsKICAgICAge2xhYmVsOiJSZXNhbGUiLCAgICAgICAgICBkYXRhOkQubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBkLnJzO30pLGJhY2tncm91bmRDb2xvcjpDLmJsdWUsIHN0YWNrOiJzIn0sCiAgICAgIHtsYWJlbDoiTmV3IGNvbnN0cnVjdGlvbiIsZGF0YTpELm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZC5uYzt9KSxiYWNrZ3JvdW5kQ29sb3I6Qy5hbWJlcixzdGFjazoicyJ9CiAgICBdfSwKICAgIG9wdGlvbnM6YmFzZU9wdHMoKQogIH0pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjMXJlc2FsZWxlZyIpLmlubmVySFRNTD1sZWdlbmQoWwogICAge2NvbG9yOkMuYmx1ZSxsYWJlbDoiUmVzYWxlIn0sCiAgICB7Y29sb3I6Qy5hbWJlcixsYWJlbDoiTmV3IGNvbnN0cnVjdGlvbiJ9CiAgXSk7CgogIC8vIEZpbmFuY2luZyBtaXggc3RhY2tlZCAlIHdpdGggaW5saW5lIGxhYmVscwogIG5ldyBDaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYzFmaW4iKSx7CiAgICB0eXBlOiJiYXIiLAogICAgZGF0YTp7bGFiZWxzOmxhYnMsZGF0YXNldHM6WwogICAgICB7bGFiZWw6IkNvbnZlbnRpb25hbCIsZGF0YTpELm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZC5jbnYqMTAwO30pLCBiYWNrZ3JvdW5kQ29sb3I6Qy5ibHVlLCBzdGFjazoicyJ9LAogICAgICB7bGFiZWw6IkNhc2giLCAgICAgICAgZGF0YTpELm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZC5jYXNoKjEwMDt9KSxiYWNrZ3JvdW5kQ29sb3I6Qy50ZWFsLCBzdGFjazoicyJ9LAogICAgICB7bGFiZWw6IkZIQSIsICAgICAgICAgZGF0YTpELm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZC5maGEqMTAwO30pLCBiYWNrZ3JvdW5kQ29sb3I6Qy5hbWJlcixzdGFjazoicyJ9LAogICAgICB7bGFiZWw6IlZBIiwgICAgICAgICAgZGF0YTpELm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZC52YSoxMDA7fSksICBiYWNrZ3JvdW5kQ29sb3I6Qy5waW5rLCBzdGFjazoicyJ9CiAgICBdfSwKICAgIG9wdGlvbnM6ewogICAgICByZXNwb25zaXZlOnRydWUsbWFpbnRhaW5Bc3BlY3RSYXRpbzpmYWxzZSwKICAgICAgcGx1Z2luczp7bGVnZW5kOntkaXNwbGF5OmZhbHNlfSx0b29sdGlwOnttb2RlOiJpbmRleCIsaW50ZXJzZWN0OmZhbHNlfSxmaW5MYWJlbDp7ZW5hYmxlZDp0cnVlfX0sCiAgICAgIHNjYWxlczp7CiAgICAgICAgeDp7c3RhY2tlZDp0cnVlLHRpY2tzOntmb250OntzaXplOjExfSxjb2xvcjoiIzg4OCIsYXV0b1NraXA6ZmFsc2UsbWF4Um90YXRpb246NDV9LGdyaWQ6e2NvbG9yOiJyZ2JhKDEyOCwxMjgsMTI4LDAuMTIpIn19LAogICAgICAgIHk6e3N0YWNrZWQ6dHJ1ZSxtYXg6MTAwLHRpY2tzOntmb250OntzaXplOjExfSxjb2xvcjoiIzg4OCIsY2FsbGJhY2s6ZnVuY3Rpb24odil7cmV0dXJuIHYrIiUiO319LGdyaWQ6e2NvbG9yOiJyZ2JhKDEyOCwxMjgsMTI4LDAuMTIpIn19CiAgICAgIH0KICAgIH0KICB9KTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYzFmaW5sZWciKS5pbm5lckhUTUw9bGVnZW5kKFsKICAgIHtjb2xvcjpDLmJsdWUsbGFiZWw6IkNvbnZlbnRpb25hbCJ9LHtjb2xvcjpDLnRlYWwsbGFiZWw6IkNhc2gifSwKICAgIHtjb2xvcjpDLmFtYmVyLGxhYmVsOiJGSEEifSx7Y29sb3I6Qy5waW5rLGxhYmVsOiJWQSJ9CiAgXSk7Cn0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBEQVNIQk9BUkQgMiDigJQgUEVSSU9EIENPTVBBUklTT05TCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpmdW5jdGlvbiBidWlsZENvbXAoY29udGFpbmVySWQsIGN1ciwgcHJpb3IsIHByaW9yTGFiZWwsIGNQcmlvciwgY0N1ciwgdGl0bGUpewogIHZhciBlbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250YWluZXJJZCk7CiAgdmFyIGg9IjxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRcIj4iK3RpdGxlKyI8L2Rpdj4iOwogIHZhciBkZWZzPVsKICAgIHtrOiJNZWRpYW4gc2FsZXMgcHJpY2UiLCAgIGN2OmZtdERvbGxhcihjdXIubXApLCAgICAgICBwY3Q6cGN0Q2hhbmdlKGN1ci5tcCwgICBwcmlvci5tcCksICAgIGhpYjp0cnVlfSwKICAgIHtrOiJUb3RhbCBzYWxlcyIsICAgICAgICAgIGN2OmZtdE51bShjdXIudHMpLCAgICAgICAgICAgcGN0OnBjdENoYW5nZShjdXIudHMsICAgcHJpb3IudHMpLCAgICBoaWI6dHJ1ZX0sCiAgICB7azoiRGF5cyBvbiBtYXJrZXQiLCAgICAgICBjdjpjdXIuY2RvbSsiIGRheXMiLCAgICAgICAgIHBjdDpwY3RDaGFuZ2UoY3VyLmNkb20sIHByaW9yLmNkb20pLCAgaGliOmZhbHNlfSwKICAgIHtrOiJBY3RpdmUgbGlzdGluZ3MiLCAgICAgIGN2OmZtdE51bShjdXIuYWN0KSwgICAgICAgICAgcGN0OnBjdENoYW5nZShjdXIuYWN0LCAgcHJpb3IuYWN0KSwgICBoaWI6ZmFsc2V9LAogICAge2s6Ik1vbnRocyBvZiBpbnZlbnRvcnkiLCAgY3Y6Y3VyLm1pLnRvRml4ZWQoMSksICAgICAgICBwY3Q6cGN0Q2hhbmdlKGN1ci5taSwgICBwcmlvci5taSksICAgIGhpYjpmYWxzZX0sCiAgICB7azoiQ1AvT0xQIHJhdGlvIiwgICAgICAgICBjdjpmbXRSYXRpb1BjdChjdXIuY3BPbHApLCAgIHBjdDpwY3RDaGFuZ2UoY3VyLmNwT2xwLHByaW9yLmNwT2xwKSwgaGliOnRydWV9LAogICAge2s6IlJlc2FsZSBjb3VudCIsICAgICAgICAgY3Y6Zm10TnVtKGN1ci5ycyksICAgICAgICAgICBwY3Q6cGN0Q2hhbmdlKGN1ci5ycywgICBwcmlvci5ycyksICAgIGhpYjp0cnVlfSwKICAgIHtrOiJOZXcgY29uc3RydWN0aW9uIiwgICAgIGN2OmZtdE51bShjdXIubmMpLCAgICAgICAgICAgcGN0OnBjdENoYW5nZShjdXIubmMsICAgcHJpb3IubmMpLCAgICBoaWI6dHJ1ZX0KICBdOwogIGgrPSI8ZGl2IGNsYXNzPVwiY2FyZHNcIj4iOwogIGRlZnMuZm9yRWFjaChmdW5jdGlvbihkLGkpewogICAgaWYoaT09PTQpIGgrPSI8L2Rpdj48ZGl2IGNsYXNzPVwiY2FyZHNcIj4iOwogICAgaCs9IjxkaXYgY2xhc3M9XCJjYXJkXCI+PGRpdiBjbGFzcz1cImNhcmQtbGFiZWxcIj4iK2QuaysiPC9kaXY+PGRpdiBjbGFzcz1cImNhcmQtdmFsdWVcIj4iK2QuY3YrIjwvZGl2PiIrZGVsdGFIdG1sKGQucGN0LGQuaGliKSsiPC9kaXY+IjsKICB9KTsKICBoKz0iPC9kaXY+IjsKICB2YXIgcD1jb250YWluZXJJZDsKICBoKz0iPGRpdiBjbGFzcz1cImNoYXJ0LWJveFwiPjxkaXYgY2xhc3M9XCJjaGFydC10aXRsZVwiPktleSB2b2x1bWUgbWV0cmljczwvZGl2PjxkaXYgY2xhc3M9XCJjaGFydC13cmFwXCIgc3R5bGU9XCJoZWlnaHQ6MjIwcHhcIj48Y2FudmFzIGlkPVwiIitwKyJnMVwiPjwvY2FudmFzPjwvZGl2PjxkaXYgaWQ9XCIiK3ArImcxbFwiPjwvZGl2PjwvZGl2PiI7CiAgaCs9IjxkaXYgY2xhc3M9XCJ0d28tY29sXCI+IjsKICBoKz0iPGRpdiBjbGFzcz1cImNoYXJ0LWJveFwiPjxkaXYgY2xhc3M9XCJjaGFydC10aXRsZVwiPk1lZGlhbiBzYWxlcyBwcmljZSAmYW1wOyBvcmlnLiBsaXN0IHByaWNlPC9kaXY+PGRpdiBjbGFzcz1cImNoYXJ0LXdyYXBcIiBzdHlsZT1cImhlaWdodDoyMTBweFwiPjxjYW52YXMgaWQ9XCIiK3ArImcyXCI+PC9jYW52YXM+PC9kaXY+PGRpdiBpZD1cIiIrcCsiZzJsXCI+PC9kaXY+PC9kaXY+IjsKICBoKz0iPGRpdiBjbGFzcz1cImNoYXJ0LWJveFwiPjxkaXYgY2xhc3M9XCJjaGFydC10aXRsZVwiPkNQL09MUCByYXRpbzwvZGl2PjxkaXYgY2xhc3M9XCJjaGFydC13cmFwXCIgc3R5bGU9XCJoZWlnaHQ6MjEwcHhcIj48Y2FudmFzIGlkPVwiIitwKyJnM1wiPjwvY2FudmFzPjwvZGl2PjxkaXYgaWQ9XCIiK3ArImczbFwiPjwvZGl2PjwvZGl2PiI7CiAgaCs9IjwvZGl2PiI7CiAgaCs9IjxkaXYgY2xhc3M9XCJ0d28tY29sXCI+IjsKICBoKz0iPGRpdiBjbGFzcz1cImNoYXJ0LWJveFwiPjxkaXYgY2xhc3M9XCJjaGFydC10aXRsZVwiPlJlc2FsZSB2cy4gbmV3IGNvbnN0cnVjdGlvbjwvZGl2PjxkaXYgY2xhc3M9XCJjaGFydC13cmFwXCIgc3R5bGU9XCJoZWlnaHQ6MjEwcHhcIj48Y2FudmFzIGlkPVwiIitwKyJnNFwiPjwvY2FudmFzPjwvZGl2PjxkaXYgaWQ9XCIiK3ArImc0bFwiPjwvZGl2PjwvZGl2PiI7CiAgaCs9IjxkaXYgY2xhc3M9XCJjaGFydC1ib3hcIj48ZGl2IGNsYXNzPVwiY2hhcnQtdGl0bGVcIj5GaW5hbmNpbmcgbWl4PC9kaXY+PGRpdiBjbGFzcz1cImNoYXJ0LXdyYXBcIiBzdHlsZT1cImhlaWdodDoyMTBweFwiPjxjYW52YXMgaWQ9XCIiK3ArImc1XCI+PC9jYW52YXM+PC9kaXY+PGRpdiBpZD1cIiIrcCsiZzVsXCI+PC9kaXY+PC9kaXY+IjsKICBoKz0iPC9kaXY+IjsKICBoKz0iPGRpdiBjbGFzcz1cImNoYXJ0LWJveFwiPjxkaXYgY2xhc3M9XCJjaGFydC10aXRsZVwiPlN1bW1hcnkgdGFibGU8L2Rpdj4iOwogIGgrPSI8dGFibGUgY2xhc3M9XCJzdFwiPjx0aGVhZD48dHI+PHRoPk1ldHJpYzwvdGg+PHRoPiIrcHJpb3JMYWJlbCsiPC90aD48dGg+IitjdXIubGFiKyI8L3RoPjx0aD5DaGFuZ2U8L3RoPjx0aD4lIGNoYW5nZTwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT4iOwogIHZhciByb3dzPVsKICAgIFsiVG90YWwgc2FsZXMiLCAgICAgICAgIGZtdE51bShwcmlvci50cyksICAgICAgICBmbXROdW0oY3VyLnRzKSwgICAgICAgIGZtdE51bShjdXIudHMtcHJpb3IudHMpLCAgICAgICAgICAgICAgICAgICAgICAgICBwY3RDaGFuZ2UoY3VyLnRzLHByaW9yLnRzKSwgICAgICAgICAgdHJ1ZV0sCiAgICBbIk1lZGlhbiBzYWxlcyBwcmljZSIsICBmbXREb2xsYXIocHJpb3IubXApLCAgICAgZm10RG9sbGFyKGN1ci5tcCksICAgICBmbXREb2xsYXIoY3VyLm1wLXByaW9yLm1wKSwgICAgICAgICAgICAgICAgICAgICAgcGN0Q2hhbmdlKGN1ci5tcCxwcmlvci5tcCksICAgICAgICAgIHRydWVdLAogICAgWyJPcmlnLiBsaXN0IHByaWNlIiwgICAgZm10RG9sbGFyKHByaW9yLm9scCksICAgIGZtdERvbGxhcihjdXIub2xwKSwgICAgZm10RG9sbGFyKGN1ci5vbHAtcHJpb3Iub2xwKSwgICAgICAgICAgICAgICAgICAgIHBjdENoYW5nZShjdXIub2xwLHByaW9yLm9scCksICAgICAgICB0cnVlXSwKICAgIFsiQ1AvT0xQIHJhdGlvIiwgICAgICAgIGZtdFJhdGlvUGN0KHByaW9yLmNwT2xwKSxmbXRSYXRpb1BjdChjdXIuY3BPbHApLCgoY3VyLmNwT2xwLXByaW9yLmNwT2xwKSoxMDApLnRvRml4ZWQoMikrInBwIiwgIHBjdENoYW5nZShjdXIuY3BPbHAscHJpb3IuY3BPbHApLCAgICB0cnVlXSwKICAgIFsiRGF5cyBvbiBtYXJrZXQiLCAgICAgIHByaW9yLmNkb20sICAgICAgICAgICAgICBjdXIuY2RvbSwgICAgICAgICAgICAgIGN1ci5jZG9tLXByaW9yLmNkb20rIiBkYXlzIiwgICAgICAgICAgICAgICAgICAgICBwY3RDaGFuZ2UoY3VyLmNkb20scHJpb3IuY2RvbSksICAgICAgZmFsc2VdLAogICAgWyJBY3RpdmUgbGlzdGluZ3MiLCAgICAgZm10TnVtKHByaW9yLmFjdCksICAgICAgIGZtdE51bShjdXIuYWN0KSwgICAgICAgZm10TnVtKGN1ci5hY3QtcHJpb3IuYWN0KSwgICAgICAgICAgICAgICAgICAgICAgIHBjdENoYW5nZShjdXIuYWN0LHByaW9yLmFjdCksICAgICAgICBmYWxzZV0sCiAgICBbIk1vbnRocyBvZiBpbnZlbnRvcnkiLCBwcmlvci5taS50b0ZpeGVkKDEpLCAgICAgY3VyLm1pLnRvRml4ZWQoMSksICAgICAoY3VyLm1pLXByaW9yLm1pKS50b0ZpeGVkKDEpLCAgICAgICAgICAgICAgICAgICAgcGN0Q2hhbmdlKGN1ci5taSxwcmlvci5taSksICAgICAgICAgIGZhbHNlXSwKICAgIFsiUmVzYWxlIGNvdW50IiwgICAgICAgIGZtdE51bShwcmlvci5ycyksICAgICAgICBmbXROdW0oY3VyLnJzKSwgICAgICAgIGZtdE51bShjdXIucnMtcHJpb3IucnMpLCAgICAgICAgICAgICAgICAgICAgICAgICBwY3RDaGFuZ2UoY3VyLnJzLHByaW9yLnJzKSwgICAgICAgICAgdHJ1ZV0sCiAgICBbIk5ldyBjb25zdHJ1Y3Rpb24iLCAgICBmbXROdW0ocHJpb3IubmMpLCAgICAgICAgZm10TnVtKGN1ci5uYyksICAgICAgICBmbXROdW0oY3VyLm5jLXByaW9yLm5jKSwgICAgICAgICAgICAgICAgICAgICAgICAgcGN0Q2hhbmdlKGN1ci5uYyxwcmlvci5uYyksICAgICAgICAgIHRydWVdLAogICAgWyJDYXNoICUiLCAgICAgICAgICAgICAgZm10UGN0KHByaW9yLmNhc2gpLCAgICAgIGZtdFBjdChjdXIuY2FzaCksICAgICAgKChjdXIuY2FzaC1wcmlvci5jYXNoKSoxMDApLnRvRml4ZWQoMikrInBwIiwgICAgIHBjdENoYW5nZShjdXIuY2FzaCxwcmlvci5jYXNoKSwgICAgICBmYWxzZV0sCiAgICBbIkNvbnZlbnRpb25hbCAlIiwgICAgICBmbXRQY3QocHJpb3IuY252KSwgICAgICAgZm10UGN0KGN1ci5jbnYpLCAgICAgICAoKGN1ci5jbnYtcHJpb3IuY252KSoxMDApLnRvRml4ZWQoMikrInBwIiwgICAgICAgcGN0Q2hhbmdlKGN1ci5jbnYscHJpb3IuY252KSwgICAgICAgIGZhbHNlXSwKICAgIFsiRkhBICUiLCAgICAgICAgICAgICAgIGZtdFBjdChwcmlvci5maGEpLCAgICAgICBmbXRQY3QoY3VyLmZoYSksICAgICAgICgoY3VyLmZoYS1wcmlvci5maGEpKjEwMCkudG9GaXhlZCgyKSsicHAiLCAgICAgICBwY3RDaGFuZ2UoY3VyLmZoYSxwcmlvci5maGEpLCAgICAgICAgZmFsc2VdLAogICAgWyJWQSAlIiwgICAgICAgICAgICAgICAgZm10UGN0KHByaW9yLnZhKSwgICAgICAgIGZtdFBjdChjdXIudmEpLCAgICAgICAgKChjdXIudmEtcHJpb3IudmEpKjEwMCkudG9GaXhlZCgyKSsicHAiLCAgICAgICAgIHBjdENoYW5nZShjdXIudmEscHJpb3IudmEpLCAgICAgICAgICBmYWxzZV0KICBdOwogIHJvd3MuZm9yRWFjaChmdW5jdGlvbihyKXsKICAgIHZhciBwY3Q9cls0XSwgaGliPXJbNV07CiAgICB2YXIgZ29vZD0ocGN0Pj0wJiZoaWIpfHwocGN0PDAmJiFoaWIpOwogICAgdmFyIGNscz1nb29kPyJnb29kIjoiYmFkIjsKICAgIGgrPSI8dHI+PHRkPiIrclswXSsiPC90ZD48dGQ+IityWzFdKyI8L3RkPjx0ZCBjbGFzcz1cImhsXCI+PHN0cm9uZz4iK3JbMl0rIjwvc3Ryb25nPjwvdGQ+PHRkIGNsYXNzPVwiIitjbHMrIlwiPiIrclszXSsiPC90ZD48dGQgY2xhc3M9XCIiK2NscysiXCI+IitwY3QudG9GaXhlZCgxKSsiJTwvdGQ+PC90cj4iOwogIH0pOwogIGgrPSI8L3Rib2R5PjwvdGFibGU+PC9kaXY+IjsKICBlbC5pbm5lckhUTUw9aDsKCiAgdmFyIGxlZz1be2NvbG9yOmNQcmlvcixsYWJlbDpwcmlvckxhYmVsfSx7Y29sb3I6Y0N1cixsYWJlbDpjdXIubGFifV07CiAgZnVuY3Rpb24gc2ltcGxlT3B0cygpewogICAgcmV0dXJuIHtyZXNwb25zaXZlOnRydWUsbWFpbnRhaW5Bc3BlY3RSYXRpbzpmYWxzZSxwbHVnaW5zOntsZWdlbmQ6e2Rpc3BsYXk6ZmFsc2V9LHRvb2x0aXA6e21vZGU6ImluZGV4IixpbnRlcnNlY3Q6ZmFsc2V9fSwKICAgICAgc2NhbGVzOnt4Ont0aWNrczp7Zm9udDp7c2l6ZToxMX0sY29sb3I6IiM4ODgifSxncmlkOntjb2xvcjoicmdiYSgxMjgsMTI4LDEyOCwwLjEyKSJ9fSx5Ont0aWNrczp7Zm9udDp7c2l6ZToxMX0sY29sb3I6IiM4ODgifSxncmlkOntjb2xvcjoicmdiYSgxMjgsMTI4LDEyOCwwLjEyKSJ9fX19OwogIH0KCiAgbmV3IENoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHArImcxIikse3R5cGU6ImJhciIsCiAgICBkYXRhOntsYWJlbHM6WyJUb3RhbCBzYWxlcyIsIkFjdGl2ZSBsaXN0aW5ncyIsIkRheXMgb24gbWFya2V0Il0sZGF0YXNldHM6WwogICAgICB7bGFiZWw6cHJpb3JMYWJlbCxkYXRhOltwcmlvci50cyxwcmlvci5hY3QscHJpb3IuY2RvbV0sYmFja2dyb3VuZENvbG9yOmNQcmlvcn0sCiAgICAgIHtsYWJlbDpjdXIubGFiLCAgIGRhdGE6W2N1ci50cywgIGN1ci5hY3QsICBjdXIuY2RvbV0sICBiYWNrZ3JvdW5kQ29sb3I6Y0N1cn0KICAgIF19LG9wdGlvbnM6c2ltcGxlT3B0cygpfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocCsiZzFsIikuaW5uZXJIVE1MPWxlZ2VuZChsZWcpOwoKICBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocCsiZzIiKSx7dHlwZToiYmFyIiwKICAgIGRhdGE6e2xhYmVsczpbIk1lZGlhbiBzYWxlcyBwcmljZSIsIk9yaWcuIGxpc3QgcHJpY2UiXSxkYXRhc2V0czpbCiAgICAgIHtsYWJlbDpwcmlvckxhYmVsLGRhdGE6W3ByaW9yLm1wLHByaW9yLm9scF0sYmFja2dyb3VuZENvbG9yOmNQcmlvcn0sCiAgICAgIHtsYWJlbDpjdXIubGFiLCAgIGRhdGE6W2N1ci5tcCwgIGN1ci5vbHBdLCAgYmFja2dyb3VuZENvbG9yOmNDdXJ9CiAgICBdfSxvcHRpb25zOihmdW5jdGlvbigpe3ZhciBvPXNpbXBsZU9wdHMoKTtvLnNjYWxlcy55LnRpY2tzLmNhbGxiYWNrPWZ1bmN0aW9uKHYpe3JldHVybiBmbXRLKHYpO307cmV0dXJuIG87fSkoKX0pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHArImcybCIpLmlubmVySFRNTD1sZWdlbmQobGVnKTsKCiAgbmV3IENoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHArImczIikse3R5cGU6ImJhciIsCiAgICBkYXRhOntsYWJlbHM6WyJDUC9PTFAgcmF0aW8iXSxkYXRhc2V0czpbCiAgICAgIHtsYWJlbDpwcmlvckxhYmVsLGRhdGE6W3ByaW9yLmNwT2xwKjEwMF0sYmFja2dyb3VuZENvbG9yOmNQcmlvcn0sCiAgICAgIHtsYWJlbDpjdXIubGFiLCAgIGRhdGE6W2N1ci5jcE9scCoxMDBdLCAgYmFja2dyb3VuZENvbG9yOmNDdXJ9CiAgICBdfSxvcHRpb25zOihmdW5jdGlvbigpe3ZhciBvPXNpbXBsZU9wdHMoKTtvLnNjYWxlcy55Lm1pbj05MDtvLnNjYWxlcy55LnRpY2tzLmNhbGxiYWNrPWZ1bmN0aW9uKHYpe3JldHVybiB2KyIlIjt9OwogICAgICBvLnBsdWdpbnMudG9vbHRpcC5jYWxsYmFja3M9e2xhYmVsOmZ1bmN0aW9uKGN0eCl7cmV0dXJuIGN0eC5kYXRhc2V0LmxhYmVsKyI6ICIrY3R4LnJhdy50b0ZpeGVkKDEpKyIlIjt9fTtyZXR1cm4gbzt9KSgpfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocCsiZzNsIikuaW5uZXJIVE1MPWxlZ2VuZChsZWcpOwoKICBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocCsiZzQiKSx7dHlwZToiYmFyIiwKICAgIGRhdGE6e2xhYmVsczpbIlJlc2FsZSIsIk5ldyBjb25zdHJ1Y3Rpb24iXSxkYXRhc2V0czpbCiAgICAgIHtsYWJlbDpwcmlvckxhYmVsLGRhdGE6W3ByaW9yLnJzLHByaW9yLm5jXSxiYWNrZ3JvdW5kQ29sb3I6Y1ByaW9yfSwKICAgICAge2xhYmVsOmN1ci5sYWIsICAgZGF0YTpbY3VyLnJzLCAgY3VyLm5jXSwgIGJhY2tncm91bmRDb2xvcjpjQ3VyfQogICAgXX0sb3B0aW9uczpzaW1wbGVPcHRzKCl9KTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwKyJnNGwiKS5pbm5lckhUTUw9bGVnZW5kKGxlZyk7CgogIG5ldyBDaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwKyJnNSIpLHt0eXBlOiJiYXIiLAogICAgZGF0YTp7bGFiZWxzOlsiQ29udmVudGlvbmFsIiwiQ2FzaCIsIkZIQSIsIlZBIl0sZGF0YXNldHM6WwogICAgICB7bGFiZWw6cHJpb3JMYWJlbCxkYXRhOltwcmlvci5jbnYqMTAwLHByaW9yLmNhc2gqMTAwLHByaW9yLmZoYSoxMDAscHJpb3IudmEqMTAwXSxiYWNrZ3JvdW5kQ29sb3I6Y1ByaW9yfSwKICAgICAge2xhYmVsOmN1ci5sYWIsICAgZGF0YTpbY3VyLmNudioxMDAsICBjdXIuY2FzaCoxMDAsICBjdXIuZmhhKjEwMCwgIGN1ci52YSoxMDBdLCAgYmFja2dyb3VuZENvbG9yOmNDdXJ9CiAgICBdfSxvcHRpb25zOihmdW5jdGlvbigpe3ZhciBvPXNpbXBsZU9wdHMoKTtvLnNjYWxlcy55LnRpY2tzLmNhbGxiYWNrPWZ1bmN0aW9uKHYpe3JldHVybiB2KyIlIjt9OwogICAgICBvLnBsdWdpbnMudG9vbHRpcC5jYWxsYmFja3M9e2xhYmVsOmZ1bmN0aW9uKGN0eCl7cmV0dXJuIGN0eC5kYXRhc2V0LmxhYmVsKyI6ICIrY3R4LnJhdy50b0ZpeGVkKDEpKyIlIjt9fTtyZXR1cm4gbzt9KSgpfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocCsiZzVsIikuaW5uZXJIVE1MPWxlZ2VuZChsZWcpOwp9CgpmdW5jdGlvbiBidWlsZERhc2gyKCl7CiAgdmFyIENVUj1NRFtNRC5sZW5ndGgtMV07CiAgdmFyIFBSRVY9TURbTUQubGVuZ3RoLTJdOwogIHZhciBQUllSPW51bGw7CiAgZm9yKHZhciBpPTA7aTxNRC5sZW5ndGg7aSsrKXsKICAgIGlmKE1EW2ldLnlyPT09Q1VSLnlyLTEgJiYgTURbaV0ubW89PT1DVVIubW8peyBQUllSPU1EW2ldOyBicmVhazsgfQogIH0KICBpZighUFJZUil7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZDJ5b3kiKS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9XCJub3RlLWJveFwiPlByaW9yLXllYXIgZGF0YSBmb3IgIitDVVIubW8rIiBpcyBub3QgeWV0IGF2YWlsYWJsZS48L2Rpdj4iOwogIH0gZWxzZSB7CiAgICBidWlsZENvbXAoImQyeW95IixDVVIsUFJZUixQUllSLmxhYixDLmJsdWUsQy50ZWFsLCJZZWFyLW92ZXIteWVhcjogIitQUllSLmxhYisiIHZzLiAiK0NVUi5sYWIpOwogIH0KICBidWlsZENvbXAoImQybW9tIixDVVIsUFJFVixQUkVWLmxhYixDLnB1cnBsZSxDLmNvcmFsLCJNb250aC1vdmVyLW1vbnRoOiAiK1BSRVYubGFiKyIgdnMuICIrQ1VSLmxhYik7CgogIC8vIFRocmVlLXdheSB0YWJsZQogIHZhciBoYXNQWT1QUllSIT09bnVsbDsKICBmdW5jdGlvbiBwY3RGbXQocGN0LGhpYil7CiAgICB2YXIgZ29vZD0ocGN0Pj0wJiZoaWIpfHwocGN0PDAmJiFoaWIpOwogICAgdmFyIGNscz1nb29kPyJnb29kIjoiYmFkIjsKICAgIHJldHVybiAiPHNwYW4gY2xhc3M9XCIiK2NscysiXCI+IisocGN0Pj0wPyIrIjoiIikrcGN0LnRvRml4ZWQoMSkrIiU8L3NwYW4+IjsKICB9CiAgdmFyIHRoQ29scyA9IGhhc1BZCiAgICA/ICI8dGg+IitQUllSLmxhYisiPC90aD48dGg+IitQUkVWLmxhYisiPC90aD48dGg+IitDVVIubGFiKyI8L3RoPjx0aD52cy4gIitQUllSLmxhYisiPC90aD48dGg+dnMuICIrUFJFVi5sYWIrIjwvdGg+IgogICAgOiAiPHRoPiIrUFJFVi5sYWIrIjwvdGg+PHRoPiIrQ1VSLmxhYisiPC90aD48dGg+dnMuICIrUFJFVi5sYWIrIjwvdGg+IjsKCiAgZnVuY3Rpb24gdFJvdyhsYWJlbCxmbixmbXQsaGliKXsKICAgIHZhciB2YWxzPShoYXNQWT9bUFJZUixQUkVWLENVUl06W1BSRVYsQ1VSXSkubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBmbihkKTt9KTsKICAgIHZhciBjdj12YWxzW3ZhbHMubGVuZ3RoLTFdLCBwdj12YWxzW3ZhbHMubGVuZ3RoLTJdLCBweT1oYXNQWT92YWxzWzBdOm51bGw7CiAgICB2YXIgaD0iPHRyPjx0ZD4iK2xhYmVsKyI8L3RkPiI7CiAgICB2YWxzLmZvckVhY2goZnVuY3Rpb24odixpKXsKICAgICAgdmFyIGlzTGFzdD1pPT09dmFscy5sZW5ndGgtMTsKICAgICAgaCs9Ijx0ZCIrKGlzTGFzdD8iIGNsYXNzPVwiaGxcIiI6IiIpKyI+IisoaXNMYXN0PyI8c3Ryb25nPiI6IiIpK2ZtdCh2KSsoaXNMYXN0PyI8L3N0cm9uZz4iOiIiKSsiPC90ZD4iOwogICAgfSk7CiAgICBpZihoYXNQWSkgaCs9Ijx0ZD4iK3BjdEZtdChwY3RDaGFuZ2UoY3YscHkpLGhpYikrIjwvdGQ+IjsKICAgIGgrPSI8dGQ+IitwY3RGbXQocGN0Q2hhbmdlKGN2LHB2KSxoaWIpKyI8L3RkPjwvdHI+IjsKICAgIHJldHVybiBoOwogIH0KCiAgdmFyIGJvZHk9WwogICAgdFJvdygiVG90YWwgc2FsZXMiLCAgICAgICAgICAgZnVuY3Rpb24oZCl7cmV0dXJuIGQudHM7fSwgICAgICAgICAgZm10TnVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpLAogICAgdFJvdygiTWVkaWFuIHNhbGVzIHByaWNlIiwgICAgZnVuY3Rpb24oZCl7cmV0dXJuIGQubXA7fSwgICAgICAgICAgZm10RG9sbGFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpLAogICAgdFJvdygiT3JpZy4gbGlzdCBwcmljZSIsICAgICAgZnVuY3Rpb24oZCl7cmV0dXJuIGQub2xwO30sICAgICAgICAgZm10RG9sbGFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpLAogICAgdFJvdygiQ1AvT0xQIHJhdGlvIiwgICAgICAgICAgZnVuY3Rpb24oZCl7cmV0dXJuIGQuY3BPbHAqMTAwO30sICAgZnVuY3Rpb24odil7cmV0dXJuIHYudG9GaXhlZCgxKSsiJSI7fSwgdHJ1ZSksCiAgICB0Um93KCJEYXlzIG9uIG1hcmtldCIsICAgICAgICBmdW5jdGlvbihkKXtyZXR1cm4gZC5jZG9tO30sICAgICAgICBmdW5jdGlvbih2KXtyZXR1cm4gdisiIGRheXMiO30sICAgICAgZmFsc2UpLAogICAgdFJvdygiQWN0aXZlIGxpc3RpbmdzIiwgICAgICAgZnVuY3Rpb24oZCl7cmV0dXJuIGQuYWN0O30sICAgICAgICAgZm10TnVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSwKICAgIHRSb3coIk1vbnRocyBvZiBpbnZlbnRvcnkiLCAgIGZ1bmN0aW9uKGQpe3JldHVybiBkLm1pO30sICAgICAgICAgIGZ1bmN0aW9uKHYpe3JldHVybiB2LnRvRml4ZWQoMSk7fSwgICBmYWxzZSksCiAgICB0Um93KCJSZXNhbGUgY291bnQiLCAgICAgICAgICBmdW5jdGlvbihkKXtyZXR1cm4gZC5yczt9LCAgICAgICAgICBmbXROdW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSksCiAgICB0Um93KCJSZXNhbGUgJSIsICAgICAgICAgICAgICBmdW5jdGlvbihkKXtyZXR1cm4gKDEtZC5ucGN0KSoxMDA7fSxmdW5jdGlvbih2KXtyZXR1cm4gdi50b0ZpeGVkKDEpKyIlIjt9LCBmYWxzZSksCiAgICB0Um93KCJOZXcgY29uc3RydWN0aW9uIGNvdW50IixmdW5jdGlvbihkKXtyZXR1cm4gZC5uYzt9LCAgICAgICAgICBmbXROdW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSksCiAgICB0Um93KCJOZXcgY29uc3RydWN0aW9uICUiLCAgICBmdW5jdGlvbihkKXtyZXR1cm4gZC5ucGN0KjEwMDt9LCAgICBmdW5jdGlvbih2KXtyZXR1cm4gdi50b0ZpeGVkKDEpKyIlIjt9LCBmYWxzZSksCiAgICB0Um93KCJDYXNoICUiLCAgICAgICAgICAgICAgICBmdW5jdGlvbihkKXtyZXR1cm4gZC5jYXNoKjEwMDt9LCAgICBmdW5jdGlvbih2KXtyZXR1cm4gdi50b0ZpeGVkKDEpKyIlIjt9LCBmYWxzZSksCiAgICB0Um93KCJDb252ZW50aW9uYWwgJSIsICAgICAgICBmdW5jdGlvbihkKXtyZXR1cm4gZC5jbnYqMTAwO30sICAgICBmdW5jdGlvbih2KXtyZXR1cm4gdi50b0ZpeGVkKDEpKyIlIjt9LCBmYWxzZSksCiAgICB0Um93KCJGSEEgJSIsICAgICAgICAgICAgICAgICBmdW5jdGlvbihkKXtyZXR1cm4gZC5maGEqMTAwO30sICAgICBmdW5jdGlvbih2KXtyZXR1cm4gdi50b0ZpeGVkKDEpKyIlIjt9LCBmYWxzZSksCiAgICB0Um93KCJWQSAlIiwgICAgICAgICAgICAgICAgICBmdW5jdGlvbihkKXtyZXR1cm4gZC52YSoxMDA7fSwgICAgICBmdW5jdGlvbih2KXtyZXR1cm4gdi50b0ZpeGVkKDEpKyIlIjt9LCBmYWxzZSkKICBdLmpvaW4oIiIpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkMnRocmVlIikuaW5uZXJIVE1MPQogICAgIjx0YWJsZSBjbGFzcz1cInN0XCI+PHRoZWFkPjx0cj48dGg+TWV0cmljPC90aD4iK3RoQ29scysiPC90cj48L3RoZWFkPjx0Ym9keT4iK2JvZHkrIjwvdGJvZHk+PC90YWJsZT4iOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gREFTSEJPQVJEIDMg4oCUIFlvWSBPVkVSTEFZCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpmdW5jdGlvbiBidWlsZERhc2gzKCl7CiAgdmFyIEQyNT1NRC5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIGQueXI9PT0yMDI1O30pOwogIHZhciBEMjY9TUQuZmlsdGVyKGZ1bmN0aW9uKGQpe3JldHVybiBkLnlyPT09MjAyNjt9KTsKCiAgZnVuY3Rpb24geXIyNShmbil7IHJldHVybiBNTkFNRVMubWFwKGZ1bmN0aW9uKG0pe3ZhciBkPUQyNS5maW5kKGZ1bmN0aW9uKHgpe3JldHVybiB4Lm1vPT09bTt9KTtyZXR1cm4gZD9mbihkKTpudWxsO30pOyB9CiAgZnVuY3Rpb24geXIyNihmbil7IHJldHVybiBNTkFNRVMubWFwKGZ1bmN0aW9uKG0pe3ZhciBkPUQyNi5maW5kKGZ1bmN0aW9uKHgpe3JldHVybiB4Lm1vPT09bTt9KTtyZXR1cm4gZD9mbihkKTpudWxsO30pOyB9CiAgZnVuY3Rpb24gcmF0ZTI1KCl7IHJldHVybiBNTkFNRVMubWFwKGZ1bmN0aW9uKG0saSl7cmV0dXJuIE1SWyIyMDI1LSIrKGkrMSldfHxudWxsO30pOyB9CiAgZnVuY3Rpb24gcmF0ZTI2KCl7IHJldHVybiBNTkFNRVMubWFwKGZ1bmN0aW9uKG0saSl7cmV0dXJuIE1SWyIyMDI2LSIrKGkrMSldfHxudWxsO30pOyB9CgogIGZ1bmN0aW9uIGxkczI1KGxhYmVsLGRhdGEsY29sb3IpewogICAgcmV0dXJuIHt0eXBlOiJsaW5lIixsYWJlbDpsYWJlbCxkYXRhOmRhdGEsYm9yZGVyQ29sb3I6Y29sb3IsYmFja2dyb3VuZENvbG9yOiJ0cmFuc3BhcmVudCIsYm9yZGVyV2lkdGg6Mixwb2ludFJhZGl1czozLHRlbnNpb246LjMsc3BhbkdhcHM6ZmFsc2V9OwogIH0KICBmdW5jdGlvbiBsZHMyNihsYWJlbCxkYXRhLGNvbG9yKXsKICAgIHJldHVybiB7dHlwZToibGluZSIsbGFiZWw6bGFiZWwsZGF0YTpkYXRhLGJvcmRlckNvbG9yOmNvbG9yLGJhY2tncm91bmRDb2xvcjoidHJhbnNwYXJlbnQiLGJvcmRlcldpZHRoOjIscG9pbnRSYWRpdXM6Myx0ZW5zaW9uOi4zLHNwYW5HYXBzOmZhbHNlLGJvcmRlckRhc2g6WzYsNF19OwogIH0KCiAgdmFyIGxhYnM9TVNIT1JUOwogIHZhciBibz1iYXNlT3B0cygpOwoKICBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImMzc2FsZXMiKSx7dHlwZToiYmFyIiwKICAgIGRhdGE6e2xhYmVsczpsYWJzLGRhdGFzZXRzOlsKICAgICAge2xhYmVsOiIyMDI1IixkYXRhOnlyMjUoZnVuY3Rpb24oZCl7cmV0dXJuIGQudHM7fSksYmFja2dyb3VuZENvbG9yOiJyZ2JhKDU1LDEzOCwyMjEsMC43NSkifSwKICAgICAge2xhYmVsOiIyMDI2IixkYXRhOnlyMjYoZnVuY3Rpb24oZCl7cmV0dXJuIGQudHM7fSksYmFja2dyb3VuZENvbG9yOiJyZ2JhKDI5LDE1OCwxMTcsMC43NSkifQogICAgXX0sb3B0aW9uczpib30pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjM3NhbGVzbGVnIikuaW5uZXJIVE1MPWxlZ2VuZChbe2NvbG9yOkMuYmx1ZSxsYWJlbDoiMjAyNSJ9LHtjb2xvcjpDLnRlYWwsbGFiZWw6IjIwMjYifV0pOwoKICB2YXIgcHJpY2VPcHRzPWJhc2VPcHRzKCk7CiAgcHJpY2VPcHRzLnNjYWxlcy55LnRpY2tzLmNhbGxiYWNrPWZ1bmN0aW9uKHYpe3JldHVybiBmbXRLKHYpO307CiAgbmV3IENoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjM3ByaWNlIikse3R5cGU6ImxpbmUiLAogICAgZGF0YTp7bGFiZWxzOmxhYnMsZGF0YXNldHM6WwogICAgICBsZHMyNSgiMjAyNSIseXIyNShmdW5jdGlvbihkKXtyZXR1cm4gZC5tcDt9KSxDLmJsdWUpLAogICAgICBsZHMyNigiMjAyNiIseXIyNihmdW5jdGlvbihkKXtyZXR1cm4gZC5tcDt9KSxDLnRlYWwpCiAgICBdfSxvcHRpb25zOnByaWNlT3B0c30pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjM3ByaWNlbGVnIikuaW5uZXJIVE1MPWxlZ2VuZChbe2NvbG9yOkMuYmx1ZSxsYWJlbDoiMjAyNSJ9LHtjb2xvcjpDLnRlYWwsbGFiZWw6IjIwMjYgKGRhc2hlZCkifV0pOwoKICBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImMzYWN0Iikse3R5cGU6ImxpbmUiLAogICAgZGF0YTp7bGFiZWxzOmxhYnMsZGF0YXNldHM6W2xkczI1KCIyMDI1Iix5cjI1KGZ1bmN0aW9uKGQpe3JldHVybiBkLmFjdDt9KSxDLmJsdWUpLGxkczI2KCIyMDI2Iix5cjI2KGZ1bmN0aW9uKGQpe3JldHVybiBkLmFjdDt9KSxDLnRlYWwpXX0sCiAgICBvcHRpb25zOmJhc2VPcHRzKCl9KTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYzNhY3RsZWciKS5pbm5lckhUTUw9bGVnZW5kKFt7Y29sb3I6Qy5ibHVlLGxhYmVsOiIyMDI1In0se2NvbG9yOkMudGVhbCxsYWJlbDoiMjAyNiAoZGFzaGVkKSJ9XSk7CgogIG5ldyBDaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYzNtb2kiKSx7dHlwZToibGluZSIsCiAgICBkYXRhOntsYWJlbHM6bGFicyxkYXRhc2V0czpbbGRzMjUoIjIwMjUiLHlyMjUoZnVuY3Rpb24oZCl7cmV0dXJuIGQubWk7fSksQy5ibHVlKSxsZHMyNigiMjAyNiIseXIyNihmdW5jdGlvbihkKXtyZXR1cm4gZC5taTt9KSxDLnRlYWwpXX0sCiAgICBvcHRpb25zOmJhc2VPcHRzKCl9KTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYzNtb2lsZWciKS5pbm5lckhUTUw9bGVnZW5kKFt7Y29sb3I6Qy5ibHVlLGxhYmVsOiIyMDI1In0se2NvbG9yOkMudGVhbCxsYWJlbDoiMjAyNiAoZGFzaGVkKSJ9XSk7CgogIG5ldyBDaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYzNkb20iKSx7dHlwZToibGluZSIsCiAgICBkYXRhOntsYWJlbHM6bGFicyxkYXRhc2V0czpbbGRzMjUoIjIwMjUiLHlyMjUoZnVuY3Rpb24oZCl7cmV0dXJuIGQuY2RvbTt9KSxDLmJsdWUpLGxkczI2KCIyMDI2Iix5cjI2KGZ1bmN0aW9uKGQpe3JldHVybiBkLmNkb207fSksQy50ZWFsKV19LAogICAgb3B0aW9uczpiYXNlT3B0cygpfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImMzZG9tbGVnIikuaW5uZXJIVE1MPWxlZ2VuZChbe2NvbG9yOkMuYmx1ZSxsYWJlbDoiMjAyNSJ9LHtjb2xvcjpDLnRlYWwsbGFiZWw6IjIwMjYgKGRhc2hlZCkifV0pOwoKICBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImMzcmF0ZSIpLHt0eXBlOiJiYXIiLAogICAgZGF0YTp7bGFiZWxzOmxhYnMsZGF0YXNldHM6WwogICAgICB7dHlwZToiYmFyIiwgbGFiZWw6IlNhbGVzIDIwMjUiLGRhdGE6eXIyNShmdW5jdGlvbihkKXtyZXR1cm4gZC50czt9KSxiYWNrZ3JvdW5kQ29sb3I6InJnYmEoNTUsMTM4LDIyMSwwLjYpIix5QXhpc0lEOiJ5IixvcmRlcjoxfSwKICAgICAge3R5cGU6ImJhciIsIGxhYmVsOiJTYWxlcyAyMDI2IixkYXRhOnlyMjYoZnVuY3Rpb24oZCl7cmV0dXJuIGQudHM7fSksYmFja2dyb3VuZENvbG9yOiJyZ2JhKDI5LDE1OCwxMTcsMC42KSIseUF4aXNJRDoieSIsb3JkZXI6MX0sCiAgICAgIHt0eXBlOiJsaW5lIixsYWJlbDoiUmF0ZSAyMDI1IiwgZGF0YTpyYXRlMjUoKSxib3JkZXJDb2xvcjpDLnJlZCwgIGJvcmRlcldpZHRoOjIscG9pbnRSYWRpdXM6Mix0ZW5zaW9uOi4zLHlBeGlzSUQ6InkyIixvcmRlcjowfSwKICAgICAge3R5cGU6ImxpbmUiLGxhYmVsOiJSYXRlIDIwMjYiLCBkYXRhOnJhdGUyNigpLGJvcmRlckNvbG9yOkMuYW1iZXIsYm9yZGVyV2lkdGg6Mixwb2ludFJhZGl1czoyLHRlbnNpb246LjMseUF4aXNJRDoieTIiLG9yZGVyOjAsYm9yZGVyRGFzaDpbNSwzXX0KICAgIF19LAogICAgb3B0aW9uczp7cmVzcG9uc2l2ZTp0cnVlLG1haW50YWluQXNwZWN0UmF0aW86ZmFsc2UscGx1Z2luczp7bGVnZW5kOntkaXNwbGF5OmZhbHNlfSx0b29sdGlwOnttb2RlOiJpbmRleCIsaW50ZXJzZWN0OmZhbHNlfX0sCiAgICAgIHNjYWxlczp7CiAgICAgICAgeDp7dGlja3M6e2ZvbnQ6e3NpemU6MTF9LGNvbG9yOiIjODg4IixhdXRvU2tpcDpmYWxzZSxtYXhSb3RhdGlvbjo0NX0sZ3JpZDp7Y29sb3I6InJnYmEoMTI4LDEyOCwxMjgsMC4xMikifX0sCiAgICAgICAgeTp7cG9zaXRpb246ImxlZnQiLHRpY2tzOntmb250OntzaXplOjExfSxjb2xvcjoiIzg4OCJ9LGdyaWQ6e2NvbG9yOiJyZ2JhKDEyOCwxMjgsMTI4LDAuMTIpIn19LAogICAgICAgIHkyOntwb3NpdGlvbjoicmlnaHQiLG1pbjo1LjUsbWF4OjcuNSx0aWNrczp7Zm9udDp7c2l6ZToxMX0sY29sb3I6IiM4ODgiLGNhbGxiYWNrOmZ1bmN0aW9uKHYpe3JldHVybiB2LnRvRml4ZWQoMSkrIiUiO319LGdyaWQ6e2Rpc3BsYXk6ZmFsc2V9fQogICAgICB9fX0pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjM3JhdGxlZyIpLmlubmVySFRNTD1sZWdlbmQoWwogICAge2NvbG9yOiJyZ2JhKDU1LDEzOCwyMjEsMC42KSIsbGFiZWw6IlNhbGVzIDIwMjUifSx7Y29sb3I6InJnYmEoMjksMTU4LDExNywwLjYpIixsYWJlbDoiU2FsZXMgMjAyNiJ9LAogICAge2NvbG9yOkMucmVkLGxhYmVsOiJSYXRlIDIwMjUifSx7Y29sb3I6Qy5hbWJlcixsYWJlbDoiUmF0ZSAyMDI2IChkYXNoZWQpIn0KICBdKTsKCiAgbmV3IENoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjM3Jlc2FsZSIpLHt0eXBlOiJiYXIiLAogICAgZGF0YTp7bGFiZWxzOmxhYnMsZGF0YXNldHM6WwogICAgICB7bGFiZWw6IlJlc2FsZSAyMDI1IiwgICAgZGF0YTp5cjI1KGZ1bmN0aW9uKGQpe3JldHVybiBkLnJzO30pLGJhY2tncm91bmRDb2xvcjpDLmJsdWV9LAogICAgICB7bGFiZWw6IlJlc2FsZSAyMDI2IiwgICAgZGF0YTp5cjI2KGZ1bmN0aW9uKGQpe3JldHVybiBkLnJzO30pLGJhY2tncm91bmRDb2xvcjpDLnB1cnBsZX0sCiAgICAgIHtsYWJlbDoiTmV3IGNvbnN0LiAyMDI1IixkYXRhOnlyMjUoZnVuY3Rpb24oZCl7cmV0dXJuIGQubmM7fSksYmFja2dyb3VuZENvbG9yOkMuYW1iZXJ9LAogICAgICB7bGFiZWw6Ik5ldyBjb25zdC4gMjAyNiIsZGF0YTp5cjI2KGZ1bmN0aW9uKGQpe3JldHVybiBkLm5jO30pLGJhY2tncm91bmRDb2xvcjpDLmNvcmFsfQogICAgXX0sb3B0aW9uczpiYXNlT3B0cygpfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImMzcmVzYWxlbGVnIikuaW5uZXJIVE1MPWxlZ2VuZChbCiAgICB7Y29sb3I6Qy5ibHVlLGxhYmVsOiJSZXNhbGUgMjAyNSJ9LHtjb2xvcjpDLnB1cnBsZSxsYWJlbDoiUmVzYWxlIDIwMjYifSwKICAgIHtjb2xvcjpDLmFtYmVyLGxhYmVsOiJOZXcgY29uc3QuIDIwMjUifSx7Y29sb3I6Qy5jb3JhbCxsYWJlbDoiTmV3IGNvbnN0LiAyMDI2In0KICBdKTsKCiAgdmFyIGZpbk9wdHM9YmFzZU9wdHMoKTsKICBmaW5PcHRzLnNjYWxlcy55LnRpY2tzLmNhbGxiYWNrPWZ1bmN0aW9uKHYpe3JldHVybiB2KyIlIjt9OwogIG5ldyBDaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYzNmaW4iKSx7dHlwZToibGluZSIsCiAgICBkYXRhOntsYWJlbHM6bGFicyxkYXRhc2V0czpbCiAgICAgIGxkczI1KCJDb252ZW50aW9uYWwgMjAyNSIseXIyNShmdW5jdGlvbihkKXtyZXR1cm4gZC5jbnYqMTAwO30pLEMuYmx1ZSksCiAgICAgIGxkczI2KCJDb252ZW50aW9uYWwgMjAyNiIseXIyNihmdW5jdGlvbihkKXtyZXR1cm4gZC5jbnYqMTAwO30pLEMucHVycGxlKSwKICAgICAgbGRzMjUoIkNhc2ggMjAyNSIsICAgICAgICB5cjI1KGZ1bmN0aW9uKGQpe3JldHVybiBkLmNhc2gqMTAwO30pLEMudGVhbCksCiAgICAgIGxkczI2KCJDYXNoIDIwMjYiLCAgICAgICAgeXIyNihmdW5jdGlvbihkKXtyZXR1cm4gZC5jYXNoKjEwMDt9KSxDLmNvcmFsKQogICAgXX0sb3B0aW9uczpmaW5PcHRzfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImMzZmlubGVnIikuaW5uZXJIVE1MPWxlZ2VuZChbCiAgICB7Y29sb3I6Qy5ibHVlLGxhYmVsOiJDb252ZW50aW9uYWwgMjAyNSJ9LHtjb2xvcjpDLnB1cnBsZSxsYWJlbDoiQ29udmVudGlvbmFsIDIwMjYgKGRhc2hlZCkifSwKICAgIHtjb2xvcjpDLnRlYWwsbGFiZWw6IkNhc2ggMjAyNSJ9LHtjb2xvcjpDLmNvcmFsLGxhYmVsOiJDYXNoIDIwMjYgKGRhc2hlZCkifQogIF0pOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gREFTSEJPQVJEIDQg4oCUIFNBTEVTIEJZIFBSSUNFIFRSQU5DSEUKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmZ1bmN0aW9uIGJ1aWxkRGFzaDQoKXsKICB2YXIgVENMUj1bIiMzNzhBREQiLCIjNEJBM0UzIiwiIzFEOUU3NSIsIiM3Rjc3REQiLCIjRUY5RjI3IiwiI0Q0NTM3RSIsIiNEODVBMzAiLCIjRTI0QjRBIiwiIzYzOTkyMiJdOwoKICBmdW5jdGlvbiBjb2xUb3RhbHMoVCxuKXsKICAgIHZhciBvdXQ9W107CiAgICBmb3IodmFyIG1pPTA7bWk8bjttaSsrKXt2YXIgcz0wO2Zvcih2YXIgYmk9MDtiaTw5O2JpKyspIHMrPVRbYmldW21pXTtvdXQucHVzaChzKTt9CiAgICByZXR1cm4gb3V0OwogIH0KICB2YXIgdG90MjU9Y29sVG90YWxzKFQyNSwxMik7CiAgdmFyIHRvdDI2PWNvbFRvdGFscyhUMjYsNCk7CiAgdmFyIHRvdDI1ZnVsbD10b3QyNS5yZWR1Y2UoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYStiO30sMCk7CiAgdmFyIHRvdDI2eXRkID10b3QyNi5yZWR1Y2UoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYStiO30sMCk7CiAgdmFyIHRvdDI1Y29tcD10b3QyNS5zbGljZSgwLDQpLnJlZHVjZShmdW5jdGlvbihhLGIpe3JldHVybiBhK2I7fSwwKTsKICB2YXIgY2hnUGN0PSgodG90MjZ5dGQtdG90MjVjb21wKS90b3QyNWNvbXAqMTAwKTsKCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImQ0YzI1ZnVsbCIpLnRleHRDb250ZW50PWZtdE51bSh0b3QyNWZ1bGwpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkNGMyNnl0ZCIpLnRleHRDb250ZW50ID1mbXROdW0odG90MjZ5dGQpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkNGMyNWNvbXAiKS50ZXh0Q29udGVudCA9Zm10TnVtKHRvdDI1Y29tcCk7CiAgdmFyIGNoZ0VsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkNGNjaGciKTsKICBjaGdFbC50ZXh0Q29udGVudD0oY2hnUGN0Pj0wPyIrIjoiIikrY2hnUGN0LnRvRml4ZWQoMSkrIiUiOwogIGNoZ0VsLnN0eWxlLmNvbG9yPWNoZ1BjdD49MD8iIzJhN2QyZSI6IiNjMDM5MmIiOwoKICBmdW5jdGlvbiB0b29sdGlwRm9vdGVyKGl0ZW1zKXsKICAgIHZhciB0b3RhbD1pdGVtcy5yZWR1Y2UoZnVuY3Rpb24ocyxpdCl7cmV0dXJuIHMrKGl0LnJhd3x8MCk7fSwwKTsKICAgIHJldHVybiAiTW9udGhseSB0b3RhbDogIitmbXROdW0odG90YWwpOwogIH0KICB2YXIgc3RhY2tPcHRzPXsKICAgIHJlc3BvbnNpdmU6dHJ1ZSxtYWludGFpbkFzcGVjdFJhdGlvOmZhbHNlLAogICAgcGx1Z2luczp7bGVnZW5kOntkaXNwbGF5OmZhbHNlfSx0b29sdGlwOnttb2RlOiJpbmRleCIsaW50ZXJzZWN0OmZhbHNlLGNhbGxiYWNrczp7Zm9vdGVyOnRvb2x0aXBGb290ZXJ9fX0sCiAgICBzY2FsZXM6ewogICAgICB4OntzdGFja2VkOnRydWUsdGlja3M6e2ZvbnQ6e3NpemU6MTF9LGNvbG9yOiIjODg4IixhdXRvU2tpcDpmYWxzZSxtYXhSb3RhdGlvbjo0NX0sZ3JpZDp7Y29sb3I6InJnYmEoMTI4LDEyOCwxMjgsMC4xMikifX0sCiAgICAgIHk6e3N0YWNrZWQ6dHJ1ZSx0aWNrczp7Zm9udDp7c2l6ZToxMX0sY29sb3I6IiM4ODgifSxncmlkOntjb2xvcjoicmdiYSgxMjgsMTI4LDEyOCwwLjEyKSJ9fQogICAgfQogIH07CgogIGZ1bmN0aW9uIG1rRHMyNShuKXtyZXR1cm4gQkFORFMubWFwKGZ1bmN0aW9uKGIsYmkpe3JldHVybiB7bGFiZWw6YixkYXRhOlQyNVtiaV0uc2xpY2UoMCxuKSxiYWNrZ3JvdW5kQ29sb3I6VENMUltiaV0sc3RhY2s6InMifTt9KTt9CiAgZnVuY3Rpb24gbWtEczI2KG4pe3JldHVybiBCQU5EUy5tYXAoZnVuY3Rpb24oYixiaSl7cmV0dXJuIHtsYWJlbDpiLGRhdGE6VDI2W2JpXS5zbGljZSgwLG4pLGJhY2tncm91bmRDb2xvcjpUQ0xSW2JpXSxzdGFjazoicyJ9O30pO30KCiAgZnVuY3Rpb24gbWFrZVRyYW5jaGVMZWdlbmQoZWxJZCl7CiAgICB2YXIgaD0iPGRpdiBjbGFzcz1cImxlZ1wiPiI7CiAgICBCQU5EUy5mb3JFYWNoKGZ1bmN0aW9uKGIsYmkpe2grPSI8ZGl2IGNsYXNzPVwibGVnLWl0ZW1cIj48ZGl2IGNsYXNzPVwic3dhdGNoXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiIrVENMUltiaV0rIlwiPjwvZGl2PjxzcGFuPiIrYisiPC9zcGFuPjwvZGl2PiI7fSk7CiAgICBoKz0iPC9kaXY+IjsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsSWQpLmlubmVySFRNTD1oOwogIH0KCiAgbmV3IENoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjaDI1Iikse3R5cGU6ImJhciIsZGF0YTp7bGFiZWxzOk1TSE9SVCxkYXRhc2V0czpta0RzMjUoMTIpfSxvcHRpb25zOnN0YWNrT3B0c30pOwogIG1ha2VUcmFuY2hlTGVnZW5kKCJsZWcyNSIpOwoKICBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoMjYiKSx7dHlwZToiYmFyIixkYXRhOntsYWJlbHM6TVNIT1JULnNsaWNlKDAsNCksZGF0YXNldHM6bWtEczI2KDQpfSxvcHRpb25zOnN0YWNrT3B0c30pOwogIG1ha2VUcmFuY2hlTGVnZW5kKCJsZWcyNiIpOwoKICAvLyBTaWRlLWJ5LXNpZGUgY29tcGFyaXNvbgogIHZhciBjb21wTGFiZWxzPU1TSE9SVC5zbGljZSgwLDQpLm1hcChmdW5jdGlvbihtKXtyZXR1cm4gbSsiIFx4MjcyNSAvICIrbSsiIFx4MjcyNiI7fSk7CiAgdmFyIGNvbXBEcz1bXTsKICBCQU5EUy5mb3JFYWNoKGZ1bmN0aW9uKGIsYmkpewogICAgY29tcERzLnB1c2goe2xhYmVsOmIrIiAyMDI1IixkYXRhOlQyNVtiaV0uc2xpY2UoMCw0KSxiYWNrZ3JvdW5kQ29sb3I6VENMUltiaV0sc3RhY2s6InMyNSIsY2F0ZWdvcnlQZXJjZW50YWdlOi44NSxiYXJQZXJjZW50YWdlOi40OH0pOwogICAgY29tcERzLnB1c2goe2xhYmVsOmIrIiAyMDI2IixkYXRhOlQyNltiaV0uc2xpY2UoMCw0KSxiYWNrZ3JvdW5kQ29sb3I6VENMUltiaV0rIkJCIixib3JkZXJDb2xvcjpUQ0xSW2JpXSxib3JkZXJXaWR0aDoxLHN0YWNrOiJzMjYiLGNhdGVnb3J5UGVyY2VudGFnZTouODUsYmFyUGVyY2VudGFnZTouNDh9KTsKICB9KTsKICBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoQ29tcCIpLHsKICAgIHR5cGU6ImJhciIsCiAgICBkYXRhOntsYWJlbHM6Y29tcExhYmVscyxkYXRhc2V0czpjb21wRHN9LAogICAgb3B0aW9uczp7CiAgICAgIHJlc3BvbnNpdmU6dHJ1ZSxtYWludGFpbkFzcGVjdFJhdGlvOmZhbHNlLAogICAgICBwbHVnaW5zOntsZWdlbmQ6e2Rpc3BsYXk6ZmFsc2V9LHRvb2x0aXA6e21vZGU6ImluZGV4IixpbnRlcnNlY3Q6ZmFsc2UsY2FsbGJhY2tzOnsKICAgICAgICBsYWJlbDpmdW5jdGlvbihjdHgpewogICAgICAgICAgdmFyIGxibD1jdHguZGF0YXNldC5sYWJlbHx8IiI7CiAgICAgICAgICB2YXIgeXI9bGJsLmluZGV4T2YoIjIwMjYiKT4tMT8iMjAyNiI6IjIwMjUiOwogICAgICAgICAgdmFyIGJhbmQ9bGJsLnJlcGxhY2UoIiAyMDI1IiwiIikucmVwbGFjZSgiIDIwMjYiLCIiKTsKICAgICAgICAgIHJldHVybiB5cisiICIrYmFuZCsiOiAiK2ZtdE51bShjdHgucmF3KTsKICAgICAgICB9LAogICAgICAgIGZvb3RlcjpmdW5jdGlvbihpdGVtcyl7CiAgICAgICAgICB2YXIgczI1PTAsczI2PTA7CiAgICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGl0KXtpZihpdC5kYXRhc2V0LmxhYmVsLmluZGV4T2YoIjIwMjUiKT4tMSkgczI1Kz1pdC5yYXd8fDA7IGVsc2UgczI2Kz1pdC5yYXd8fDA7fSk7CiAgICAgICAgICByZXR1cm4gIjIwMjUgdG90YWw6ICIrZm10TnVtKHMyNSkrIiAgfCAgMjAyNiB0b3RhbDogIitmbXROdW0oczI2KTsKICAgICAgICB9CiAgICAgIH19fSwKICAgICAgc2NhbGVzOnsKICAgICAgICB4Ont0aWNrczp7Zm9udDp7c2l6ZToxMH0sY29sb3I6IiM4ODgiLGF1dG9Ta2lwOmZhbHNlLG1heFJvdGF0aW9uOjMwfSxncmlkOntjb2xvcjoicmdiYSgxMjgsMTI4LDEyOCwwLjEyKSJ9fSwKICAgICAgICB5OntzdGFja2VkOnRydWUsdGlja3M6e2ZvbnQ6e3NpemU6MTF9LGNvbG9yOiIjODg4In0sZ3JpZDp7Y29sb3I6InJnYmEoMTI4LDEyOCwxMjgsMC4xMikifX0KICAgICAgfQogICAgfQogIH0pOwogIHZhciBjTGVnSHRtbD0iPGRpdiBjbGFzcz1cImxlZ1wiIHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4XCI+IjsKICBCQU5EUy5mb3JFYWNoKGZ1bmN0aW9uKGIsYmkpe2NMZWdIdG1sKz0iPGRpdiBjbGFzcz1cImxlZy1pdGVtXCI+PGRpdiBjbGFzcz1cInN3YXRjaFwiIHN0eWxlPVwiYmFja2dyb3VuZDoiK1RDTFJbYmldKyJcIj48L2Rpdj48c3Bhbj4iK2IrIjwvc3Bhbj48L2Rpdj4iO30pOwogIGNMZWdIdG1sKz0iPC9kaXY+PGRpdiBzdHlsZT1cImZvbnQtc2l6ZToxMXB4O2NvbG9yOiM4ODg7bWFyZ2luLXRvcDo2cHhcIj5Tb2xpZCBmaWxsID0gMjAyNSAmbmJzcDsmbWlkZG90OyZuYnNwOyBMaWdodGVyIGZpbGwgPSAyMDI2PC9kaXY+IjsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibGVnQ29tcCIpLmlubmVySFRNTD1jTGVnSHRtbDsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIEJPT1Qg4oCUIHJ1biBhbGwgZGFzaGJvYXJkcyBhZnRlciBET00gaXMgcmVhZHkKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpewogIGJ1aWxkRGFzaDEoKTsKICBidWlsZERhc2gyKCk7CiAgYnVpbGREYXNoMygpOwogIGJ1aWxkRGFzaDQoKTsKfSk7Cgp9KSgpOyAvLyBlbmQgSUlGRQ==
Dashboard 1 — Full trend charts
Median sales price
Total sales volume by month
Active listings & months of inventory
Days on market (CDOM)
Average financing mix — all months
Resale vs. new construction by month
Financing mix by month
Dashboard 2 — Period comparisons
Section 1 — Year-over-year
Section 2 — Month-over-month
Section 3 — Three-way summary
Dashboard 3 — 2025 vs. 2026 overlay
Total sales volume — 2025 vs. 2026
Median sales price — 2025 vs. 2026
Active listings — 2025 vs. 2026
Months of inventory — 2025 vs. 2026
Days on market — 2025 vs. 2026
Sales vs. 30-yr mortgage rate
Resale vs. new construction — 2025 vs. 2026
Conventional & cash % — 2025 vs. 2026
Dashboard 4 — Sales by price tranche
Tranche counts reflect single-family residential sales and may differ slightly from overall MLS monthly totals.
2025 full-year total
Jan–Dec 2025
2026 year-to-date
Jan–Apr 2026
2025 comparable period
Jan–Apr 2025
YTD change vs. 2025
Jan–Apr comparison
2025 — Full year (Jan–Dec)
2026 — Year to date (Jan–Apr)
Side-by-side comparison — Jan through Apr